From b691c43c44ff180d10e7d4a9afc83b98551ff586 Mon Sep 17 00:00:00 2001 From: daoge_cmd <3523206925@qq.com> Date: Sun, 1 Mar 2026 12:16:08 +0800 Subject: Initial commit --- Minecraft.Client/Common/App_Defines.h | 130 + Minecraft.Client/Common/App_enums.h | 913 + Minecraft.Client/Common/App_structs.h | 227 + .../Common/Audio/Consoles_SoundEngine.cpp | 38 + .../Common/Audio/Consoles_SoundEngine.h | 81 + Minecraft.Client/Common/Audio/SoundEngine.cpp | 1668 + Minecraft.Client/Common/Audio/SoundEngine.h | 168 + Minecraft.Client/Common/Audio/SoundNames.cpp | 165 + Minecraft.Client/Common/BuildVer.h | 57 + Minecraft.Client/Common/C4JMemoryPool.h | 176 + Minecraft.Client/Common/C4JMemoryPoolAllocator.h | 113 + Minecraft.Client/Common/Colours/ColourTable.cpp | 366 + Minecraft.Client/Common/Colours/ColourTable.h | 23 + Minecraft.Client/Common/CommonMedia.sln | 28 + Minecraft.Client/Common/CommonMedia.vcxproj | 115 + .../Common/CommonMedia.vcxproj.filters | 136 + Minecraft.Client/Common/ConsoleGameMode.cpp | 9 + Minecraft.Client/Common/ConsoleGameMode.h | 10 + Minecraft.Client/Common/Console_Awards_enum.h | 72 + Minecraft.Client/Common/Console_Debug_enum.h | 42 + Minecraft.Client/Common/Console_Utils.cpp | 40 + Minecraft.Client/Common/Consoles_App.cpp | 9535 +++++ Minecraft.Client/Common/Consoles_App.h | 911 + Minecraft.Client/Common/DLC/DLCAudioFile.cpp | 216 + Minecraft.Client/Common/DLC/DLCAudioFile.h | 54 + Minecraft.Client/Common/DLC/DLCCapeFile.cpp | 12 + Minecraft.Client/Common/DLC/DLCCapeFile.h | 10 + Minecraft.Client/Common/DLC/DLCColourTableFile.cpp | 26 + Minecraft.Client/Common/DLC/DLCColourTableFile.h | 18 + Minecraft.Client/Common/DLC/DLCFile.cpp | 26 + Minecraft.Client/Common/DLC/DLCFile.h | 25 + Minecraft.Client/Common/DLC/DLCGameRules.h | 10 + Minecraft.Client/Common/DLC/DLCGameRulesFile.cpp | 21 + Minecraft.Client/Common/DLC/DLCGameRulesFile.h | 15 + Minecraft.Client/Common/DLC/DLCGameRulesHeader.cpp | 92 + Minecraft.Client/Common/DLC/DLCGameRulesHeader.h | 42 + .../Common/DLC/DLCLocalisationFile.cpp | 14 + Minecraft.Client/Common/DLC/DLCLocalisationFile.h | 18 + Minecraft.Client/Common/DLC/DLCManager.cpp | 671 + Minecraft.Client/Common/DLC/DLCManager.h | 99 + Minecraft.Client/Common/DLC/DLCPack.cpp | 410 + Minecraft.Client/Common/DLC/DLCPack.h | 93 + Minecraft.Client/Common/DLC/DLCSkinFile.cpp | 212 + Minecraft.Client/Common/DLC/DLCSkinFile.h | 29 + Minecraft.Client/Common/DLC/DLCTextureFile.cpp | 59 + Minecraft.Client/Common/DLC/DLCTextureFile.h | 24 + Minecraft.Client/Common/DLC/DLCUIDataFile.cpp | 32 + Minecraft.Client/Common/DLC/DLCUIDataFile.h | 20 + .../Common/DummyTexturePack/res/TFSHOLDER.txt | 1 + .../GameRules/AddEnchantmentRuleDefinition.cpp | 70 + .../GameRules/AddEnchantmentRuleDefinition.h | 23 + .../Common/GameRules/AddItemRuleDefinition.cpp | 127 + .../Common/GameRules/AddItemRuleDefinition.h | 30 + .../GameRules/ApplySchematicRuleDefinition.cpp | 249 + .../GameRules/ApplySchematicRuleDefinition.h | 51 + .../Common/GameRules/BiomeOverride.cpp | 59 + Minecraft.Client/Common/GameRules/BiomeOverride.h | 23 + .../Common/GameRules/CollectItemRuleDefinition.cpp | 117 + .../Common/GameRules/CollectItemRuleDefinition.h | 40 + .../Common/GameRules/CompleteAllRuleDefinition.cpp | 66 + .../Common/GameRules/CompleteAllRuleDefinition.h | 26 + .../GameRules/CompoundGameRuleDefinition.cpp | 118 + .../Common/GameRules/CompoundGameRuleDefinition.h | 23 + .../Common/GameRules/ConsoleGameRules.h | 32 + .../Common/GameRules/ConsoleGameRulesConstants.h | 119 + .../Common/GameRules/ConsoleGenerateStructure.cpp | 181 + .../Common/GameRules/ConsoleGenerateStructure.h | 38 + .../GameRules/ConsoleGenerateStructureAction.h | 11 + .../Common/GameRules/ConsoleSchematicFile.cpp | 1020 + .../Common/GameRules/ConsoleSchematicFile.h | 90 + Minecraft.Client/Common/GameRules/GameRule.cpp | 97 + Minecraft.Client/Common/GameRules/GameRule.h | 62 + .../Common/GameRules/GameRuleDefinition.cpp | 151 + .../Common/GameRules/GameRuleDefinition.h | 66 + .../Common/GameRules/GameRuleManager.cpp | 767 + .../Common/GameRules/GameRuleManager.h | 80 + .../Common/GameRules/GameRulesInstance.h | 24 + .../Common/GameRules/LevelGenerationOptions.cpp | 514 + .../Common/GameRules/LevelGenerationOptions.h | 216 + .../Common/GameRules/LevelGenerators.cpp | 26 + .../Common/GameRules/LevelGenerators.h | 19 + Minecraft.Client/Common/GameRules/LevelRules.cpp | 20 + Minecraft.Client/Common/GameRules/LevelRules.h | 14 + Minecraft.Client/Common/GameRules/LevelRuleset.cpp | 71 + Minecraft.Client/Common/GameRules/LevelRuleset.h | 27 + .../Common/GameRules/NamedAreaRuleDefinition.cpp | 84 + .../Common/GameRules/NamedAreaRuleDefinition.h | 23 + Minecraft.Client/Common/GameRules/StartFeature.cpp | 53 + Minecraft.Client/Common/GameRules/StartFeature.h | 22 + .../GameRules/UpdatePlayerRuleDefinition.cpp | 171 + .../Common/GameRules/UpdatePlayerRuleDefinition.h | 33 + .../Common/GameRules/UseTileRuleDefinition.cpp | 82 + .../Common/GameRules/UseTileRuleDefinition.h | 24 + .../GameRules/XboxStructureActionGenerateBox.cpp | 104 + .../GameRules/XboxStructureActionGenerateBox.h | 26 + .../GameRules/XboxStructureActionPlaceBlock.cpp | 72 + .../GameRules/XboxStructureActionPlaceBlock.h | 25 + .../XboxStructureActionPlaceContainer.cpp | 99 + .../GameRules/XboxStructureActionPlaceContainer.h | 29 + .../GameRules/XboxStructureActionPlaceSpawner.cpp | 69 + .../GameRules/XboxStructureActionPlaceSpawner.h | 24 + .../Common/Leaderboards/LeaderboardManager.cpp | 106 + .../Common/Leaderboards/LeaderboardManager.h | 268 + Minecraft.Client/Common/Media/4J_strings.resx | 171 + Minecraft.Client/Common/Media/AnvilMenu1080.swf | Bin 0 -> 18668 bytes Minecraft.Client/Common/Media/AnvilMenu480.swf | Bin 0 -> 18667 bytes Minecraft.Client/Common/Media/AnvilMenu720.swf | Bin 0 -> 18679 bytes .../Common/Media/AnvilMenuSplit1080.swf | Bin 0 -> 18675 bytes .../Common/Media/AnvilMenuSplit720.swf | Bin 0 -> 18656 bytes Minecraft.Client/Common/Media/AnvilMenuVita.swf | Bin 0 -> 18761 bytes .../Common/Media/BrewingStandMenu1080.swf | Bin 0 -> 17644 bytes .../Common/Media/BrewingStandMenu480.swf | Bin 0 -> 17697 bytes .../Common/Media/BrewingStandMenu720.swf | Bin 0 -> 17628 bytes .../Common/Media/BrewingStandMenuSplit1080.swf | Bin 0 -> 17711 bytes .../Common/Media/BrewingStandMenuSplit720.swf | Bin 0 -> 17695 bytes .../Common/Media/BrewingStandMenuVita.swf | Bin 0 -> 17704 bytes .../Common/Media/ChestLargeMenu1080.swf | Bin 0 -> 16642 bytes .../Common/Media/ChestLargeMenu480.swf | Bin 0 -> 16634 bytes .../Common/Media/ChestLargeMenu720.swf | Bin 0 -> 16630 bytes .../Common/Media/ChestLargeMenuSplit1080.swf | Bin 0 -> 16635 bytes .../Common/Media/ChestLargeMenuSplit720.swf | Bin 0 -> 16633 bytes .../Common/Media/ChestLargeMenuVita.swf | Bin 0 -> 16650 bytes Minecraft.Client/Common/Media/ChestMenu1080.swf | Bin 0 -> 16636 bytes Minecraft.Client/Common/Media/ChestMenu480.swf | Bin 0 -> 16629 bytes Minecraft.Client/Common/Media/ChestMenu720.swf | Bin 0 -> 16627 bytes .../Common/Media/ChestMenuSplit1080.swf | Bin 0 -> 16627 bytes .../Common/Media/ChestMenuSplit720.swf | Bin 0 -> 16615 bytes Minecraft.Client/Common/Media/ChestMenuVita.swf | Bin 0 -> 16631 bytes .../Common/Media/ComponentLogo1080.swf | Bin 0 -> 447 bytes Minecraft.Client/Common/Media/ComponentLogo480.swf | Bin 0 -> 105 bytes Minecraft.Client/Common/Media/ComponentLogo720.swf | Bin 0 -> 445 bytes .../Common/Media/ComponentLogoSplit1080.swf | Bin 0 -> 514 bytes .../Common/Media/ComponentLogoSplit720.swf | Bin 0 -> 115 bytes .../Common/Media/ComponentLogoVita.swf | Bin 0 -> 125 bytes Minecraft.Client/Common/Media/Controls1080.swf | Bin 0 -> 17511 bytes Minecraft.Client/Common/Media/Controls480.swf | Bin 0 -> 17374 bytes Minecraft.Client/Common/Media/Controls720.swf | Bin 0 -> 17496 bytes .../Common/Media/ControlsRemotePlay1080.swf | Bin 0 -> 16976 bytes .../Common/Media/ControlsSplit1080.swf | Bin 0 -> 17250 bytes Minecraft.Client/Common/Media/ControlsSplit720.swf | Bin 0 -> 17294 bytes Minecraft.Client/Common/Media/ControlsTVVita.swf | Bin 0 -> 19833 bytes Minecraft.Client/Common/Media/ControlsVita.swf | Bin 0 -> 16613 bytes .../Common/Media/Crafting2x2Menu1080.swf | Bin 0 -> 18508 bytes .../Common/Media/Crafting2x2Menu480.swf | Bin 0 -> 18725 bytes .../Common/Media/Crafting2x2Menu720.swf | Bin 0 -> 18577 bytes .../Common/Media/Crafting2x2MenuSplit1080.swf | Bin 0 -> 17816 bytes .../Common/Media/Crafting2x2MenuSplit720.swf | Bin 0 -> 17863 bytes .../Common/Media/Crafting2x2MenuVita.swf | Bin 0 -> 19461 bytes .../Common/Media/Crafting3x3Menu1080.swf | Bin 0 -> 18616 bytes .../Common/Media/Crafting3x3Menu480.swf | Bin 0 -> 17939 bytes .../Common/Media/Crafting3x3Menu720.swf | Bin 0 -> 18657 bytes .../Common/Media/Crafting3x3MenuSplit1080.swf | Bin 0 -> 18310 bytes .../Common/Media/Crafting3x3MenuSplit720.swf | Bin 0 -> 17973 bytes .../Common/Media/Crafting3x3MenuVita.swf | Bin 0 -> 19591 bytes .../Common/Media/CreateWorldMenu1080.swf | Bin 0 -> 22989 bytes .../Common/Media/CreateWorldMenu480.swf | Bin 0 -> 19894 bytes .../Common/Media/CreateWorldMenu720.swf | Bin 0 -> 20545 bytes .../Common/Media/CreateWorldMenuVita.swf | Bin 0 -> 22081 bytes Minecraft.Client/Common/Media/CreativeMenu1080.swf | Bin 0 -> 18805 bytes Minecraft.Client/Common/Media/CreativeMenu480.swf | Bin 0 -> 18733 bytes Minecraft.Client/Common/Media/CreativeMenu720.swf | Bin 0 -> 18794 bytes .../Common/Media/CreativeMenuSplit1080.swf | Bin 0 -> 18760 bytes .../Common/Media/CreativeMenuSplit720.swf | Bin 0 -> 18733 bytes Minecraft.Client/Common/Media/CreativeMenuVita.swf | Bin 0 -> 18748 bytes Minecraft.Client/Common/Media/Credits1080.swf | Bin 0 -> 15033 bytes Minecraft.Client/Common/Media/Credits480.swf | Bin 0 -> 14660 bytes Minecraft.Client/Common/Media/Credits720.swf | Bin 0 -> 14606 bytes Minecraft.Client/Common/Media/CreditsVita.swf | Bin 0 -> 16185 bytes Minecraft.Client/Common/Media/DLCMainMenu1080.swf | Bin 0 -> 14114 bytes Minecraft.Client/Common/Media/DLCMainMenu480.swf | Bin 0 -> 13421 bytes Minecraft.Client/Common/Media/DLCMainMenu720.swf | Bin 0 -> 12985 bytes Minecraft.Client/Common/Media/DLCMainMenuVita.swf | Bin 0 -> 15125 bytes .../Common/Media/DLCOffersMenu1080.swf | Bin 0 -> 17197 bytes Minecraft.Client/Common/Media/DLCOffersMenu480.swf | Bin 0 -> 17636 bytes Minecraft.Client/Common/Media/DLCOffersMenu720.swf | Bin 0 -> 17616 bytes .../Common/Media/DLCOffersMenuVita.swf | Bin 0 -> 35451 bytes Minecraft.Client/Common/Media/DeathMenu1080.swf | Bin 0 -> 13833 bytes Minecraft.Client/Common/Media/DeathMenu480.swf | Bin 0 -> 13838 bytes Minecraft.Client/Common/Media/DeathMenu720.swf | Bin 0 -> 13833 bytes .../Common/Media/DeathMenuSplit1080.swf | Bin 0 -> 13834 bytes .../Common/Media/DeathMenuSplit720.swf | Bin 0 -> 13836 bytes Minecraft.Client/Common/Media/DeathMenuVita.swf | Bin 0 -> 13838 bytes .../Common/Media/DebugCreateSchematic1080.swf | Bin 0 -> 15890 bytes .../Common/Media/DebugCreateSchematic720.swf | Bin 0 -> 15893 bytes Minecraft.Client/Common/Media/DebugMenu1080.swf | Bin 0 -> 13320 bytes Minecraft.Client/Common/Media/DebugMenu720.swf | Bin 0 -> 13462 bytes .../Common/Media/DebugOptionsMenu1080.swf | Bin 0 -> 15172 bytes .../Common/Media/DebugOptionsMenu720.swf | Bin 0 -> 15260 bytes .../Common/Media/DebugSetCamera1080.swf | Bin 0 -> 15158 bytes .../Common/Media/DebugSetCamera720.swf | Bin 0 -> 15053 bytes .../Common/Media/DebugUIConsoleComponent1080.swf | Bin 0 -> 2988 bytes .../Common/Media/DebugUIConsoleComponent720.swf | Bin 0 -> 2561 bytes .../Common/Media/DebugUIMarketingGuide1080.swf | Bin 0 -> 14010 bytes .../Common/Media/DebugUIMarketingGuide720.swf | Bin 0 -> 14242 bytes .../Common/Media/DispenserMenu1080.swf | Bin 0 -> 16712 bytes Minecraft.Client/Common/Media/DispenserMenu480.swf | Bin 0 -> 16710 bytes Minecraft.Client/Common/Media/DispenserMenu720.swf | Bin 0 -> 16706 bytes .../Common/Media/DispenserMenuSplit1080.swf | Bin 0 -> 16729 bytes .../Common/Media/DispenserMenuSplit720.swf | Bin 0 -> 16702 bytes .../Common/Media/DispenserMenuVita.swf | Bin 0 -> 16716 bytes Minecraft.Client/Common/Media/EULA1080.swf | Bin 0 -> 13907 bytes Minecraft.Client/Common/Media/EULA480.swf | Bin 0 -> 13774 bytes Minecraft.Client/Common/Media/EULA720.swf | Bin 0 -> 13907 bytes Minecraft.Client/Common/Media/EULAVita.swf | Bin 0 -> 15840 bytes .../Common/Media/EnchantingMenu1080.swf | Bin 0 -> 17314 bytes .../Common/Media/EnchantingMenu480.swf | Bin 0 -> 17316 bytes .../Common/Media/EnchantingMenu720.swf | Bin 0 -> 17288 bytes .../Common/Media/EnchantingMenuSplit1080.swf | Bin 0 -> 17315 bytes .../Common/Media/EnchantingMenuSplit720.swf | Bin 0 -> 17315 bytes .../Common/Media/EnchantingMenuVita.swf | Bin 0 -> 17315 bytes Minecraft.Client/Common/Media/EndPoem1080.swf | Bin 0 -> 15447 bytes Minecraft.Client/Common/Media/EndPoem480.swf | Bin 0 -> 14640 bytes Minecraft.Client/Common/Media/EndPoem720.swf | Bin 0 -> 15025 bytes Minecraft.Client/Common/Media/EndPoemVita.swf | Bin 0 -> 21343 bytes .../Common/Media/FullscreenProgress1080.swf | Bin 0 -> 14799 bytes .../Common/Media/FullscreenProgress480.swf | Bin 0 -> 13561 bytes .../Common/Media/FullscreenProgress720.swf | Bin 0 -> 19781 bytes .../Common/Media/FullscreenProgressSplit1080.swf | Bin 0 -> 13882 bytes .../Common/Media/FullscreenProgressSplit720.swf | Bin 0 -> 13560 bytes .../Common/Media/FullscreenProgressVita.swf | Bin 0 -> 15454 bytes Minecraft.Client/Common/Media/FurnaceMenu1080.swf | Bin 0 -> 17657 bytes Minecraft.Client/Common/Media/FurnaceMenu480.swf | Bin 0 -> 17643 bytes Minecraft.Client/Common/Media/FurnaceMenu720.swf | Bin 0 -> 17640 bytes .../Common/Media/FurnaceMenuSplit1080.swf | Bin 0 -> 17638 bytes .../Common/Media/FurnaceMenuSplit720.swf | Bin 0 -> 17637 bytes Minecraft.Client/Common/Media/FurnaceMenuVita.swf | Bin 0 -> 17661 bytes Minecraft.Client/Common/Media/GamertagSplit720.swf | Bin 0 -> 9060 bytes .../Common/Media/Graphics/AnvilCross.png | Bin 0 -> 1090 bytes .../Common/Media/Graphics/AnvilHammer.png | Bin 0 -> 1132 bytes .../Common/Media/Graphics/AnvilPlus.png | Bin 0 -> 950 bytes .../Common/Media/Graphics/Armour_Slot_Body.png | Bin 0 -> 275 bytes .../Common/Media/Graphics/Armour_Slot_Feet.png | Bin 0 -> 240 bytes .../Common/Media/Graphics/Armour_Slot_Head.png | Bin 0 -> 255 bytes .../Common/Media/Graphics/Armour_Slot_Legs.png | Bin 0 -> 217 bytes .../Common/Media/Graphics/Arrow_Off.png | Bin 0 -> 287 bytes .../Common/Media/Graphics/Arrow_On.png | Bin 0 -> 295 bytes .../Common/Media/Graphics/Arrow_Small_Off.png | Bin 0 -> 249 bytes .../Common/Media/Graphics/Arrow_Small_On.png | Bin 0 -> 262 bytes .../Common/Media/Graphics/BrewingArrow_Off.png | Bin 0 -> 210 bytes .../Common/Media/Graphics/BrewingArrow_On.png | Bin 0 -> 199 bytes .../Media/Graphics/BrewingArrow_Small_Off.png | Bin 0 -> 536 bytes .../Media/Graphics/BrewingArrow_Small_On.png | Bin 0 -> 174 bytes .../Common/Media/Graphics/BrewingBubbles_Off.png | Bin 0 -> 308 bytes .../Common/Media/Graphics/BrewingBubbles_On.png | Bin 0 -> 325 bytes .../Media/Graphics/BrewingBubbles_Small_Off.png | Bin 0 -> 267 bytes .../Media/Graphics/BrewingBubbles_Small_On.png | Bin 0 -> 276 bytes .../Common/Media/Graphics/BrewingStand.png | Bin 0 -> 841 bytes .../Common/Media/Graphics/BrewingStand_small.png | Bin 0 -> 622 bytes .../Media/Graphics/Controller_Message_Frame_L.png | Bin 0 -> 244 bytes .../Graphics/Controller_Quadrant_Icon_Empty.png | Bin 0 -> 460 bytes .../Graphics/Controller_Quadrant_Icon_Segment.png | Bin 0 -> 324 bytes .../Media/Graphics/CraftIcons/icon_Materials.png | Bin 0 -> 9344 bytes .../CraftIcons/icon_Redstone_and_Transport.png | Bin 0 -> 9344 bytes .../Media/Graphics/CraftIcons/icon_armour.png | Bin 0 -> 852 bytes .../Media/Graphics/CraftIcons/icon_brewing.png | Bin 0 -> 546 bytes .../Media/Graphics/CraftIcons/icon_decoration.png | Bin 0 -> 672 bytes .../Common/Media/Graphics/CraftIcons/icon_food.png | Bin 0 -> 598 bytes .../Media/Graphics/CraftIcons/icon_mechanisms.png | Bin 0 -> 562 bytes .../Common/Media/Graphics/CraftIcons/icon_misc.png | Bin 0 -> 9365 bytes .../Media/Graphics/CraftIcons/icon_structures.png | Bin 0 -> 1169 bytes .../Media/Graphics/CraftIcons/icon_tools.png | Bin 0 -> 961 bytes .../Media/Graphics/CraftIcons/icon_transport.png | Bin 0 -> 810 bytes .../CraftScene/Craft_Highlight_L_ExtraSmall.png | Bin 0 -> 282 bytes .../CraftScene/Craft_Highlight_L_Small.png | Bin 0 -> 386 bytes .../Graphics/CraftScene/Crafting_2SlotLargeV.png | Bin 0 -> 684 bytes .../Graphics/CraftScene/Crafting_2SlotSmallV.png | Bin 0 -> 313 bytes .../Graphics/CraftScene/Crafting_3SlotLargeV.png | Bin 0 -> 807 bytes .../Common/Media/Graphics/CreditBackground.png | Bin 0 -> 614352 bytes .../Common/Media/Graphics/DLCBackground.png | Bin 0 -> 82359 bytes .../Common/Media/Graphics/DLC_Tick.png | Bin 0 -> 1264 bytes .../Common/Media/Graphics/DLC_TickSmall.png | Bin 0 -> 415 bytes .../Media/Graphics/DefaultPack_Comparison.png | Bin 0 -> 70385 bytes .../Common/Media/Graphics/Dirt_Tile.png | Bin 0 -> 844 bytes .../Common/Media/Graphics/Enchant_Slot.png | Bin 0 -> 627 bytes .../Common/Media/Graphics/Enchant_Slot_Small.png | Bin 0 -> 774 bytes .../Media/Graphics/EnchantmentButtonActive.png | Bin 0 -> 197 bytes .../Graphics/EnchantmentButtonActive_small.png | Bin 0 -> 164 bytes .../Media/Graphics/EnchantmentButtonEmpty.png | Bin 0 -> 197 bytes .../Graphics/EnchantmentButtonEmpty_small.png | Bin 0 -> 161 bytes .../Media/Graphics/EnchantmentButtonSelected.png | Bin 0 -> 197 bytes .../Graphics/EnchantmentButtonSelected_small.png | Bin 0 -> 164 bytes .../Common/Media/Graphics/Flame_Off.png | Bin 0 -> 278 bytes .../Common/Media/Graphics/Flame_Off_Small.png | Bin 0 -> 253 bytes .../Common/Media/Graphics/Flame_On.png | Bin 0 -> 537 bytes .../Common/Media/Graphics/Flame_On_Small.png | Bin 0 -> 497 bytes .../Media/Graphics/HUD/DragonHealth_Empty.png | Bin 0 -> 158 bytes .../Media/Graphics/HUD/DragonHealth_Empty2.png | Bin 0 -> 203 bytes .../Media/Graphics/HUD/DragonHealth_Empty3.png | Bin 0 -> 15462 bytes .../Media/Graphics/HUD/DragonHealth_Empty4.png | Bin 0 -> 280 bytes .../Media/Graphics/HUD/DragonHealth_Empty6.png | Bin 0 -> 15147 bytes .../Media/Graphics/HUD/DragonHealth_Full.png | Bin 0 -> 164 bytes .../Media/Graphics/HUD/DragonHealth_Full2.png | Bin 0 -> 208 bytes .../Media/Graphics/HUD/DragonHealth_Full3.png | Bin 0 -> 15453 bytes .../Media/Graphics/HUD/DragonHealth_Full4.png | Bin 0 -> 295 bytes .../Media/Graphics/HUD/DragonHealth_Full6.png | Bin 0 -> 15168 bytes .../Common/Media/Graphics/HUD/HUD_Air_Bubble.png | Bin 0 -> 185 bytes .../Common/Media/Graphics/HUD/HUD_Air_Pop.png | Bin 0 -> 151 bytes .../Common/Media/Graphics/HUD/HUD_Armour_Empty.png | Bin 0 -> 159 bytes .../Common/Media/Graphics/HUD/HUD_Armour_Full.png | Bin 0 -> 190 bytes .../Common/Media/Graphics/HUD/HUD_Armour_Half.png | Bin 0 -> 196 bytes .../Common/Media/Graphics/HUD/HUD_Crosshair.png | Bin 0 -> 118 bytes .../Media/Graphics/HUD/HUD_Food_Background.png | Bin 0 -> 169 bytes .../Graphics/HUD/HUD_Food_Background_Flash.png | Bin 0 -> 176 bytes .../Graphics/HUD/HUD_Food_Background_Poison.png | Bin 0 -> 192 bytes .../Common/Media/Graphics/HUD/HUD_Food_Full.png | Bin 0 -> 214 bytes .../Media/Graphics/HUD/HUD_Food_Full_Flash.png | Bin 0 -> 219 bytes .../Media/Graphics/HUD/HUD_Food_Full_Poison.png | Bin 0 -> 226 bytes .../Graphics/HUD/HUD_Food_Full_Poison_Flash.png | Bin 0 -> 218 bytes .../Common/Media/Graphics/HUD/HUD_Food_Half.png | Bin 0 -> 191 bytes .../Media/Graphics/HUD/HUD_Food_Half_Flash.png | Bin 0 -> 195 bytes .../Media/Graphics/HUD/HUD_Food_Half_Poison.png | Bin 0 -> 190 bytes .../Graphics/HUD/HUD_Food_Half_Poison_Flash.png | Bin 0 -> 191 bytes .../Media/Graphics/HUD/Health_Background.png | Bin 0 -> 167 bytes .../Media/Graphics/HUD/Health_Background_Flash.png | Bin 0 -> 170 bytes .../Common/Media/Graphics/HUD/Health_Full.png | Bin 0 -> 168 bytes .../Media/Graphics/HUD/Health_Full_Flash.png | Bin 0 -> 179 bytes .../Media/Graphics/HUD/Health_Full_Poison.png | Bin 0 -> 232 bytes .../Graphics/HUD/Health_Full_Poison_Flash.png | Bin 0 -> 189 bytes .../Common/Media/Graphics/HUD/Health_Half.png | Bin 0 -> 163 bytes .../Media/Graphics/HUD/Health_Half_Flash.png | Bin 0 -> 166 bytes .../Media/Graphics/HUD/Health_Half_Poison.png | Bin 0 -> 186 bytes .../Graphics/HUD/Health_Half_Poison_Flash.png | Bin 0 -> 174 bytes .../Media/Graphics/HUD/experience_bar_empty.png | Bin 0 -> 253 bytes .../Media/Graphics/HUD/experience_bar_full.png | Bin 0 -> 1830 bytes .../Common/Media/Graphics/HUD/hotbar_item_back.png | Bin 0 -> 4390 bytes .../Media/Graphics/HUD/hotbar_item_selected.png | Bin 0 -> 662 bytes .../Media/Graphics/HowToPlay/HowToPlay_Anvil.png | Bin 0 -> 19872 bytes .../Graphics/HowToPlay/HowToPlay_Anvil_Small.png | Bin 0 -> 10782 bytes .../Graphics/HowToPlay/HowToPlay_Breeding.png | Bin 0 -> 143882 bytes .../HowToPlay/HowToPlay_Breeding_Small.png | Bin 0 -> 74625 bytes .../Media/Graphics/HowToPlay/HowToPlay_Brewing.png | Bin 0 -> 13263 bytes .../Graphics/HowToPlay/HowToPlay_Brewing_Small.png | Bin 0 -> 7532 bytes .../Media/Graphics/HowToPlay/HowToPlay_Chest.png | Bin 0 -> 23375 bytes .../Graphics/HowToPlay/HowToPlay_Chest_Small.png | Bin 0 -> 13250 bytes .../Graphics/HowToPlay/HowToPlay_CraftTable.png | Bin 0 -> 46075 bytes .../HowToPlay/HowToPlay_CraftTable_Small.png | Bin 0 -> 25560 bytes .../Graphics/HowToPlay/HowToPlay_Crafting.png | Bin 0 -> 50247 bytes .../HowToPlay/HowToPlay_Crafting_Small.png | Bin 0 -> 27916 bytes .../Graphics/HowToPlay/HowToPlay_Creative.png | Bin 0 -> 129236 bytes .../HowToPlay/HowToPlay_Creative_Small.png | Bin 0 -> 30278 bytes .../Graphics/HowToPlay/HowToPlay_Dispenser.png | Bin 0 -> 18869 bytes .../HowToPlay/HowToPlay_Dispenser_Small.png | Bin 0 -> 12580 bytes .../Graphics/HowToPlay/HowToPlay_Enchantment.png | Bin 0 -> 19552 bytes .../HowToPlay/HowToPlay_Enchantment_Small.png | Bin 0 -> 9161 bytes .../Graphics/HowToPlay/HowToPlay_Enderchest.png | Bin 0 -> 61667 bytes .../HowToPlay/HowToPlay_Enderchest_small.png | Bin 0 -> 65104 bytes .../HowToPlay/HowToPlay_FarmingAnimals.png | Bin 0 -> 302028 bytes .../HowToPlay/HowToPlay_FarmingAnimals_Small.png | Bin 0 -> 142896 bytes .../Media/Graphics/HowToPlay/HowToPlay_Furnace.png | Bin 0 -> 17707 bytes .../Graphics/HowToPlay/HowToPlay_Furnace_Small.png | Bin 0 -> 13897 bytes .../Media/Graphics/HowToPlay/HowToPlay_HUD.png | Bin 0 -> 14244 bytes .../Graphics/HowToPlay/HowToPlay_HUD_Small.png | Bin 0 -> 11260 bytes .../Graphics/HowToPlay/HowToPlay_Inventory.png | Bin 0 -> 20564 bytes .../HowToPlay/HowToPlay_Inventory_Small.png | Bin 0 -> 15824 bytes .../Graphics/HowToPlay/HowToPlay_LargeChest.png | Bin 0 -> 26154 bytes .../HowToPlay/HowToPlay_LargeChest_Small.png | Bin 0 -> 6125 bytes .../Graphics/HowToPlay/HowToPlay_NetherPortal.png | Bin 0 -> 217357 bytes .../HowToPlay/HowToPlay_NetherPortal_Small.png | Bin 0 -> 42860 bytes .../Media/Graphics/HowToPlay/HowToPlay_TheEnd.png | Bin 0 -> 420108 bytes .../Graphics/HowToPlay/HowToPlay_TheEnd_Small.png | Bin 0 -> 48749 bytes .../Media/Graphics/HowToPlay/HowToPlay_Trading.png | Bin 0 -> 25848 bytes .../Graphics/HowToPlay/HowToPlay_Trading_Small.png | Bin 0 -> 10740 bytes .../Common/Media/Graphics/IconHolder.png | Bin 0 -> 219 bytes .../Common/Media/Graphics/IconHolderRed.png | Bin 0 -> 224 bytes .../Common/Media/Graphics/IconHolderRed_Small.png | Bin 0 -> 206 bytes .../Common/Media/Graphics/IconHolder_Small.png | Bin 0 -> 211 bytes .../Common/Media/Graphics/InGameInfo/MapIcon_0.png | Bin 0 -> 505 bytes .../Common/Media/Graphics/InGameInfo/MapIcon_1.png | Bin 0 -> 506 bytes .../Media/Graphics/InGameInfo/MapIcon_10.png | Bin 0 -> 511 bytes .../Media/Graphics/InGameInfo/MapIcon_11.png | Bin 0 -> 510 bytes .../Media/Graphics/InGameInfo/MapIcon_12.png | Bin 0 -> 515 bytes .../Media/Graphics/InGameInfo/MapIcon_13.png | Bin 0 -> 509 bytes .../Media/Graphics/InGameInfo/MapIcon_14.png | Bin 0 -> 518 bytes .../Media/Graphics/InGameInfo/MapIcon_15.png | Bin 0 -> 518 bytes .../Common/Media/Graphics/InGameInfo/MapIcon_2.png | Bin 0 -> 511 bytes .../Common/Media/Graphics/InGameInfo/MapIcon_3.png | Bin 0 -> 510 bytes .../Common/Media/Graphics/InGameInfo/MapIcon_4.png | Bin 0 -> 515 bytes .../Common/Media/Graphics/InGameInfo/MapIcon_5.png | Bin 0 -> 509 bytes .../Common/Media/Graphics/InGameInfo/MapIcon_6.png | Bin 0 -> 518 bytes .../Common/Media/Graphics/InGameInfo/MapIcon_7.png | Bin 0 -> 518 bytes .../Common/Media/Graphics/InGameInfo/MapIcon_8.png | Bin 0 -> 505 bytes .../Common/Media/Graphics/InGameInfo/MapIcon_9.png | Bin 0 -> 506 bytes .../Media/Graphics/InGameInfo/voiceMuted.png | Bin 0 -> 825 bytes .../Media/Graphics/InGameInfo/voiceNotSpeaking.png | Bin 0 -> 468 bytes .../Media/Graphics/InGameInfo/voiceSpeaking.png | Bin 0 -> 459 bytes .../Common/Media/Graphics/LayoutButton_Norm.png | Bin 0 -> 781 bytes .../Common/Media/Graphics/LayoutButton_Over.png | Bin 0 -> 931 bytes .../Leaderboard/LeaderBoard_Icon_Climbed.png | Bin 0 -> 3047 bytes .../Leaderboard/LeaderBoard_Icon_Creeper.png | Bin 0 -> 3592 bytes .../Leaderboard/LeaderBoard_Icon_Fallen.png | Bin 0 -> 6962 bytes .../Leaderboard/LeaderBoard_Icon_Ghast.png | Bin 0 -> 4209 bytes .../Leaderboard/LeaderBoard_Icon_Portal.png | Bin 0 -> 3772 bytes .../Leaderboard/LeaderBoard_Icon_Skeleton.png | Bin 0 -> 3487 bytes .../Leaderboard/LeaderBoard_Icon_Slime.png | Bin 0 -> 4882 bytes .../Leaderboard/LeaderBoard_Icon_Spider.png | Bin 0 -> 4597 bytes .../Leaderboard/LeaderBoard_Icon_SpiderJockey.png | Bin 0 -> 4846 bytes .../Graphics/Leaderboard/LeaderBoard_Icon_Swam.png | Bin 0 -> 4346 bytes .../Leaderboard/LeaderBoard_Icon_Walked.png | Bin 0 -> 3725 bytes .../Leaderboard/LeaderBoard_Icon_Zombie.png | Bin 0 -> 3418 bytes .../Leaderboard/LeaderBoard_Icon_ZombiePigman.png | Bin 0 -> 3885 bytes .../Media/Graphics/LeaderboardButton_Norm.png | Bin 0 -> 2833 bytes .../Media/Graphics/LeaderboardButton_Over.png | Bin 0 -> 4161 bytes .../Common/Media/Graphics/ListButton_Norm.png | Bin 0 -> 4158 bytes .../Common/Media/Graphics/ListButton_Over.png | Bin 0 -> 6046 bytes .../Common/Media/Graphics/Logos/4JStudios_logo.png | Bin 0 -> 6546 bytes .../Common/Media/Graphics/Logos/ESRB_10_Large.png | Bin 0 -> 86442 bytes .../Common/Media/Graphics/Logos/MS_Studios_MC.png | Bin 0 -> 7003 bytes .../Common/Media/Graphics/Logos/XBLA_MC.png | Bin 0 -> 7379 bytes .../Common/Media/Graphics/Logos/mojang.png | Bin 0 -> 10824 bytes .../Common/Media/Graphics/MSPoints.png | Bin 0 -> 214 bytes .../Common/Media/Graphics/MainMenuButton_Norm.png | Bin 0 -> 2796 bytes .../Common/Media/Graphics/MainMenuButton_Over.png | Bin 0 -> 4017 bytes .../Common/Media/Graphics/MenuTitle.png | Bin 0 -> 28341 bytes .../Common/Media/Graphics/MinecraftBrokenIcon.png | Bin 0 -> 2204 bytes .../Common/Media/Graphics/MinecraftIcon.png | Bin 0 -> 5092 bytes .../Common/Media/Graphics/Padlock_Small.png | Bin 0 -> 392 bytes .../Graphics/PanelsAndTabs/Crafting_Panel.png | Bin 0 -> 2891 bytes .../Graphics/PanelsAndTabs/Crafting_Panel2x2.png | Bin 0 -> 2689 bytes .../PanelsAndTabs/Crafting_Panel_Small.png | Bin 0 -> 1674 bytes .../PanelsAndTabs/Crafting_Panel_Small_2x2.png | Bin 0 -> 1664 bytes .../Graphics/PanelsAndTabs/Creative_Panel_8.png | Bin 0 -> 2498 bytes .../PanelsAndTabs/Creative_Panel_8_Small.png | Bin 0 -> 1363 bytes .../Media/Graphics/PanelsAndTabs/Panel_BL.png | Bin 0 -> 224 bytes .../Media/Graphics/PanelsAndTabs/Panel_BM.png | Bin 0 -> 188 bytes .../Media/Graphics/PanelsAndTabs/Panel_BR.png | Bin 0 -> 220 bytes .../Media/Graphics/PanelsAndTabs/Panel_Bot_L.png | Bin 0 -> 200 bytes .../Media/Graphics/PanelsAndTabs/Panel_Bot_M.png | Bin 0 -> 161 bytes .../Media/Graphics/PanelsAndTabs/Panel_Bot_R.png | Bin 0 -> 200 bytes .../Media/Graphics/PanelsAndTabs/Panel_ML.png | Bin 0 -> 186 bytes .../Media/Graphics/PanelsAndTabs/Panel_MM.png | Bin 0 -> 174 bytes .../Media/Graphics/PanelsAndTabs/Panel_MR.png | Bin 0 -> 189 bytes .../Media/Graphics/PanelsAndTabs/Panel_Mid_L.png | Bin 0 -> 166 bytes .../Media/Graphics/PanelsAndTabs/Panel_Mid_M.png | Bin 0 -> 154 bytes .../Media/Graphics/PanelsAndTabs/Panel_Mid_R.png | Bin 0 -> 165 bytes .../Graphics/PanelsAndTabs/Panel_Recess_Bot_L.png | Bin 0 -> 195 bytes .../Graphics/PanelsAndTabs/Panel_Recess_Bot_M.png | Bin 0 -> 172 bytes .../Graphics/PanelsAndTabs/Panel_Recess_Bot_R.png | Bin 0 -> 190 bytes .../Graphics/PanelsAndTabs/Panel_Recess_Mid_L.png | Bin 0 -> 171 bytes .../Graphics/PanelsAndTabs/Panel_Recess_Mid_M.png | Bin 0 -> 154 bytes .../Graphics/PanelsAndTabs/Panel_Recess_Mid_R.png | Bin 0 -> 168 bytes .../Graphics/PanelsAndTabs/Panel_Recess_Top_L.png | Bin 0 -> 183 bytes .../Graphics/PanelsAndTabs/Panel_Recess_Top_M.png | Bin 0 -> 171 bytes .../Graphics/PanelsAndTabs/Panel_Recess_Top_R.png | Bin 0 -> 198 bytes .../Media/Graphics/PanelsAndTabs/Panel_TL.png | Bin 0 -> 217 bytes .../Media/Graphics/PanelsAndTabs/Panel_TM.png | Bin 0 -> 187 bytes .../Media/Graphics/PanelsAndTabs/Panel_TR.png | Bin 0 -> 220 bytes .../Media/Graphics/PanelsAndTabs/Panel_Top_L.png | Bin 0 -> 197 bytes .../Media/Graphics/PanelsAndTabs/Panel_Top_M.png | Bin 0 -> 164 bytes .../Media/Graphics/PanelsAndTabs/Panel_Top_R.png | Bin 0 -> 204 bytes .../Graphics/PanelsAndTabs/PointerTextPanel_BL.png | Bin 0 -> 223 bytes .../Graphics/PanelsAndTabs/PointerTextPanel_BM.png | Bin 0 -> 176 bytes .../Graphics/PanelsAndTabs/PointerTextPanel_BR.png | Bin 0 -> 227 bytes .../Graphics/PanelsAndTabs/PointerTextPanel_ML.png | Bin 0 -> 171 bytes .../Graphics/PanelsAndTabs/PointerTextPanel_MM.png | Bin 0 -> 150 bytes .../Graphics/PanelsAndTabs/PointerTextPanel_MR.png | Bin 0 -> 171 bytes .../Graphics/PanelsAndTabs/PointerTextPanel_TL.png | Bin 0 -> 202 bytes .../Graphics/PanelsAndTabs/PointerTextPanel_TM.png | Bin 0 -> 177 bytes .../Graphics/PanelsAndTabs/PointerTextPanel_TR.png | Bin 0 -> 225 bytes .../Graphics/PanelsAndTabs/SkinSelect_TabBar.png | Bin 0 -> 699 bytes .../PanelsAndTabs/SkinSelect_TabBarSmall.png | Bin 0 -> 430 bytes .../PanelsAndTabs/SkinSelect_TabBarSmallPanel.png | Bin 0 -> 1592 bytes .../SkinSelect_TabBarSmallPanel_Selected.png | Bin 0 -> 1586 bytes .../SkinSelect_TabBarSmall_Selected.png | Bin 0 -> 460 bytes .../PanelsAndTabs/SkinSelect_TabBar_Selected.png | Bin 0 -> 780 bytes .../PanelsAndTabs/SkinSelect_TabNormal.png | Bin 0 -> 368 bytes .../PanelsAndTabs/SkinSelect_TabNormalSmall.png | Bin 0 -> 275 bytes .../SkinSelect_TabNormalSmall_Selected.png | Bin 0 -> 275 bytes .../SkinSelect_TabNormal_Selected.png | Bin 0 -> 336 bytes .../Graphics/PanelsAndTabs/SkinSelect_TabOver.png | Bin 0 -> 433 bytes .../PanelsAndTabs/SkinSelect_TabOverSmall.png | Bin 0 -> 307 bytes .../SkinSelect_TabOverSmall_Selected.png | Bin 0 -> 298 bytes .../PanelsAndTabs/SkinSelect_TabOver_Selected.png | Bin 0 -> 401 bytes .../Graphics/PanelsAndTabs/Square_Recess_Bot_L.png | Bin 0 -> 173 bytes .../Graphics/PanelsAndTabs/Square_Recess_Bot_M.png | Bin 0 -> 163 bytes .../Graphics/PanelsAndTabs/Square_Recess_Bot_R.png | Bin 0 -> 169 bytes .../Graphics/PanelsAndTabs/Square_Recess_Mid_L.png | Bin 0 -> 163 bytes .../Graphics/PanelsAndTabs/Square_Recess_Mid_M.png | Bin 0 -> 154 bytes .../Graphics/PanelsAndTabs/Square_Recess_Mid_R.png | Bin 0 -> 163 bytes .../Graphics/PanelsAndTabs/Square_Recess_Top_L.png | Bin 0 -> 167 bytes .../Graphics/PanelsAndTabs/Square_Recess_Top_M.png | Bin 0 -> 165 bytes .../Graphics/PanelsAndTabs/Square_Recess_Top_R.png | Bin 0 -> 176 bytes .../Graphics/PanelsAndTabs/Tab_Creative8_L.png | Bin 0 -> 379 bytes .../Graphics/PanelsAndTabs/Tab_Creative8_M.png | Bin 0 -> 376 bytes .../Graphics/PanelsAndTabs/Tab_Creative8_R.png | Bin 0 -> 371 bytes .../PanelsAndTabs/Tab_Creative8_Small_L.png | Bin 0 -> 321 bytes .../PanelsAndTabs/Tab_Creative8_Small_M.png | Bin 0 -> 321 bytes .../PanelsAndTabs/Tab_Creative8_Small_R.png | Bin 0 -> 315 bytes .../Media/Graphics/PanelsAndTabs/Tab_Left.png | Bin 0 -> 468 bytes .../Media/Graphics/PanelsAndTabs/Tab_Middle.png | Bin 0 -> 488 bytes .../Media/Graphics/PanelsAndTabs/Tab_Right.png | Bin 0 -> 457 bytes .../Graphics/PanelsAndTabs/Tab_Small_Left.png | Bin 0 -> 328 bytes .../Graphics/PanelsAndTabs/Tab_Small_Middle.png | Bin 0 -> 331 bytes .../Graphics/PanelsAndTabs/Tab_Small_Right.png | Bin 0 -> 319 bytes .../Media/Graphics/Panorama_Background_N.png | Bin 0 -> 84742 bytes .../Media/Graphics/Panorama_Background_S.png | Bin 0 -> 118105 bytes Minecraft.Client/Common/Media/Graphics/Pointer.png | Bin 0 -> 745 bytes .../PotionEffect/Potion_Effect_Icon_Blindness.png | Bin 0 -> 15256 bytes .../Potion_Effect_Icon_Fire_Resistance.png | Bin 0 -> 15480 bytes .../PotionEffect/Potion_Effect_Icon_Haste.png | Bin 0 -> 15446 bytes .../PotionEffect/Potion_Effect_Icon_Hunger.png | Bin 0 -> 15472 bytes .../Potion_Effect_Icon_Invisibility.png | Bin 0 -> 15312 bytes .../PotionEffect/Potion_Effect_Icon_Jump_Boost.png | Bin 0 -> 15255 bytes .../Potion_Effect_Icon_Mining_Fatigue.png | Bin 0 -> 15414 bytes .../PotionEffect/Potion_Effect_Icon_Nausea.png | Bin 0 -> 15422 bytes .../Potion_Effect_Icon_Night_Vision.png | Bin 0 -> 15244 bytes .../PotionEffect/Potion_Effect_Icon_Poison.png | Bin 0 -> 15542 bytes .../Potion_Effect_Icon_Regeneration.png | Bin 0 -> 15237 bytes .../PotionEffect/Potion_Effect_Icon_Resistance.png | Bin 0 -> 15423 bytes .../PotionEffect/Potion_Effect_Icon_Slowness.png | Bin 0 -> 15334 bytes .../PotionEffect/Potion_Effect_Icon_Speed.png | Bin 0 -> 15259 bytes .../PotionEffect/Potion_Effect_Icon_Strength.png | Bin 0 -> 15302 bytes .../Potion_Effect_Icon_Water_Breathing.png | Bin 0 -> 15372 bytes .../PotionEffect/Potion_Effect_Icon_Weakness.png | Bin 0 -> 15296 bytes .../Common/Media/Graphics/SaveArrow.png | Bin 0 -> 346 bytes .../Common/Media/Graphics/SaveChest.png | Bin 0 -> 2694 bytes .../Common/Media/Graphics/SignEditBackground.png | Bin 0 -> 1875 bytes .../Common/Media/Graphics/Slider_Button.png | Bin 0 -> 317 bytes .../Common/Media/Graphics/Slider_Track.png | Bin 0 -> 2157 bytes .../Common/Media/Graphics/TexturePackIcon.png | Bin 0 -> 767 bytes Minecraft.Client/Common/Media/Graphics/Tick.png | Bin 0 -> 519 bytes .../Common/Media/Graphics/Tickbox_Norm.png | Bin 0 -> 204 bytes .../Common/Media/Graphics/Tickbox_Over.png | Bin 0 -> 205 bytes .../Media/Graphics/TutorialExitScreenshot.png | Bin 0 -> 75532 bytes .../Graphics/UpsellScreenshots/Screenshot1.png | Bin 0 -> 645378 bytes .../Graphics/UpsellScreenshots/Screenshot10.png | Bin 0 -> 212659 bytes .../Graphics/UpsellScreenshots/Screenshot2.png | Bin 0 -> 1094032 bytes .../Graphics/UpsellScreenshots/Screenshot3.png | Bin 0 -> 490472 bytes .../Graphics/UpsellScreenshots/Screenshot4.png | Bin 0 -> 786063 bytes .../Graphics/UpsellScreenshots/Screenshot5.png | Bin 0 -> 402378 bytes .../Graphics/UpsellScreenshots/Screenshot6.png | Bin 0 -> 705136 bytes .../Graphics/UpsellScreenshots/Screenshot7.png | Bin 0 -> 687590 bytes .../Graphics/UpsellScreenshots/Screenshot8.png | Bin 0 -> 421682 bytes .../Graphics/UpsellScreenshots/Screenshot9.png | Bin 0 -> 643884 bytes Minecraft.Client/Common/Media/Graphics/Warning.png | Bin 0 -> 220 bytes .../Media/Graphics/X360ControllerIcons/360ctrl.png | Bin 0 -> 2428 bytes .../Media/Graphics/X360ControllerIcons/ButtonA.png | Bin 0 -> 607 bytes .../Media/Graphics/X360ControllerIcons/ButtonB.png | Bin 0 -> 604 bytes .../Graphics/X360ControllerIcons/ButtonBack.png | Bin 0 -> 689 bytes .../Graphics/X360ControllerIcons/ButtonDpadD.png | Bin 0 -> 633 bytes .../Graphics/X360ControllerIcons/ButtonDpadL.png | Bin 0 -> 668 bytes .../Graphics/X360ControllerIcons/ButtonDpadR.png | Bin 0 -> 800 bytes .../Graphics/X360ControllerIcons/ButtonDpadU.png | Bin 0 -> 649 bytes .../Graphics/X360ControllerIcons/ButtonLS.png | Bin 0 -> 1107 bytes .../X360ControllerIcons/ButtonLeftBumper.png | Bin 0 -> 632 bytes .../X360ControllerIcons/ButtonLeftBumper_TT.png | Bin 0 -> 621 bytes .../X360ControllerIcons/ButtonLeftStick.png | Bin 0 -> 752 bytes .../ButtonLeftStick_Navigate.png | Bin 0 -> 1293 bytes .../X360ControllerIcons/ButtonLeftStick_sides.png | Bin 0 -> 1625 bytes .../X360ControllerIcons/ButtonLeftTrigger.png | Bin 0 -> 619 bytes .../X360ControllerIcons/ButtonLeftTrigger_TT.png | Bin 0 -> 660 bytes .../Graphics/X360ControllerIcons/ButtonRS.png | Bin 0 -> 1117 bytes .../X360ControllerIcons/ButtonRightBumper.png | Bin 0 -> 671 bytes .../X360ControllerIcons/ButtonRightBumper_TT.png | Bin 0 -> 692 bytes .../X360ControllerIcons/ButtonRightStick.png | Bin 0 -> 760 bytes .../X360ControllerIcons/ButtonRightTrigger.png | Bin 0 -> 581 bytes .../X360ControllerIcons/ButtonRightTrigger_TT.png | Bin 0 -> 605 bytes .../Graphics/X360ControllerIcons/ButtonStart.png | Bin 0 -> 837 bytes .../Media/Graphics/X360ControllerIcons/ButtonX.png | Bin 0 -> 617 bytes .../Media/Graphics/X360ControllerIcons/ButtonY.png | Bin 0 -> 611 bytes .../Legend_Button_Blu_Focus.png | Bin 0 -> 306 bytes .../Legend_Button_Blu_Normal.png | Bin 0 -> 311 bytes .../X360ControllerIcons/Legend_Button_Disable.png | Bin 0 -> 306 bytes .../Legend_Button_Green_Focus.png | Bin 0 -> 313 bytes .../Legend_Button_Green_Normal.png | Bin 0 -> 311 bytes .../Legend_Button_Red_Focus.png | Bin 0 -> 307 bytes .../Legend_Button_Red_Normal.png | Bin 0 -> 282 bytes .../Legend_Button_Yello_Focus.png | Bin 0 -> 307 bytes .../Legend_Button_Yello_Normal.png | Bin 0 -> 309 bytes .../Graphics/X360ControllerIcons/a_graphic.png | Bin 0 -> 207 bytes .../Graphics/X360ControllerIcons/b_graphic.png | Bin 0 -> 202 bytes .../Graphics/X360ControllerIcons/x_graphic.png | Bin 0 -> 206 bytes .../Graphics/X360ControllerIcons/y_graphic.png | Bin 0 -> 239 bytes .../Common/Media/Graphics/icon_shank.png | Bin 0 -> 242 bytes .../Common/Media/Graphics/scrollDown.png | Bin 0 -> 239 bytes .../Common/Media/Graphics/scrollLeft.png | Bin 0 -> 256 bytes .../Common/Media/Graphics/scrollRight.png | Bin 0 -> 255 bytes .../Common/Media/Graphics/scrollUp.png | Bin 0 -> 244 bytes Minecraft.Client/Common/Media/HTMLColours.col | Bin 0 -> 838 bytes Minecraft.Client/Common/Media/HTMLColours.xml | 63 + Minecraft.Client/Common/Media/HUD1080.swf | Bin 0 -> 10512 bytes Minecraft.Client/Common/Media/HUD480.swf | Bin 0 -> 10508 bytes Minecraft.Client/Common/Media/HUD720.swf | Bin 0 -> 10507 bytes Minecraft.Client/Common/Media/HUDSplit1080.swf | Bin 0 -> 11055 bytes Minecraft.Client/Common/Media/HUDSplit720.swf | Bin 0 -> 11018 bytes Minecraft.Client/Common/Media/HUDVita.swf | Bin 0 -> 10947 bytes .../Common/Media/HelpAndOptionsMenu1080.swf | Bin 0 -> 13638 bytes .../Common/Media/HelpAndOptionsMenu480.swf | Bin 0 -> 13639 bytes .../Common/Media/HelpAndOptionsMenu720.swf | Bin 0 -> 13634 bytes .../Common/Media/HelpAndOptionsMenuSplit1080.swf | Bin 0 -> 13611 bytes .../Common/Media/HelpAndOptionsMenuSplit720.swf | Bin 0 -> 13605 bytes .../Common/Media/HelpAndOptionsMenuVita.swf | Bin 0 -> 13971 bytes .../Common/Media/HorseInventoryMenu1080.swf | Bin 0 -> 15454 bytes .../Common/Media/HorseInventoryMenu480.swf | Bin 0 -> 15456 bytes .../Common/Media/HorseInventoryMenu720.swf | Bin 0 -> 15427 bytes .../Common/Media/HorseInventoryMenuSplit1080.swf | Bin 0 -> 15471 bytes .../Common/Media/HorseInventoryMenuSplit720.swf | Bin 0 -> 15454 bytes Minecraft.Client/Common/Media/HowToPlay1080.swf | Bin 0 -> 10489 bytes Minecraft.Client/Common/Media/HowToPlay480.swf | Bin 0 -> 10604 bytes Minecraft.Client/Common/Media/HowToPlay720.swf | Bin 0 -> 10536 bytes .../Common/Media/HowToPlayMenu1080.swf | Bin 0 -> 12764 bytes Minecraft.Client/Common/Media/HowToPlayMenu480.swf | Bin 0 -> 12331 bytes Minecraft.Client/Common/Media/HowToPlayMenu720.swf | Bin 0 -> 12444 bytes .../Common/Media/HowToPlayMenuSplit1080.swf | Bin 0 -> 12372 bytes .../Common/Media/HowToPlayMenuSplit720.swf | Bin 0 -> 12338 bytes .../Common/Media/HowToPlayMenuVita.swf | Bin 0 -> 13919 bytes .../Common/Media/HowToPlaySplit1080.swf | Bin 0 -> 10465 bytes .../Common/Media/HowToPlaySplit720.swf | Bin 0 -> 9931 bytes Minecraft.Client/Common/Media/HowToPlayVita.swf | Bin 0 -> 10782 bytes .../Common/Media/InGameHostOptions1080.swf | Bin 0 -> 14384 bytes .../Common/Media/InGameHostOptions480.swf | Bin 0 -> 14490 bytes .../Common/Media/InGameHostOptions720.swf | Bin 0 -> 14486 bytes .../Common/Media/InGameHostOptionsSplit1080.swf | Bin 0 -> 14382 bytes .../Common/Media/InGameHostOptionsSplit720.swf | Bin 0 -> 14492 bytes .../Common/Media/InGameHostOptionsVita.swf | Bin 0 -> 14493 bytes .../Common/Media/InGameInfoMenu1080.swf | Bin 0 -> 14353 bytes .../Common/Media/InGameInfoMenu480.swf | Bin 0 -> 14345 bytes .../Common/Media/InGameInfoMenu720.swf | Bin 0 -> 14348 bytes .../Common/Media/InGameInfoMenuSplit1080.swf | Bin 0 -> 14431 bytes .../Common/Media/InGameInfoMenuSplit720.swf | Bin 0 -> 14420 bytes .../Common/Media/InGameInfoMenuVita.swf | Bin 0 -> 14339 bytes .../Common/Media/InGamePlayerOptions1080.swf | Bin 0 -> 15224 bytes .../Common/Media/InGamePlayerOptions480.swf | Bin 0 -> 15570 bytes .../Common/Media/InGamePlayerOptions720.swf | Bin 0 -> 15336 bytes .../Common/Media/InGamePlayerOptionsSplit1080.swf | Bin 0 -> 15538 bytes .../Common/Media/InGamePlayerOptionsSplit720.swf | Bin 0 -> 15349 bytes .../Common/Media/InGamePlayerOptionsVita.swf | Bin 0 -> 15575 bytes .../Common/Media/InGameTeleportMenu1080.swf | Bin 0 -> 20559 bytes .../Common/Media/InGameTeleportMenu480.swf | Bin 0 -> 13311 bytes .../Common/Media/InGameTeleportMenu720.swf | Bin 0 -> 13312 bytes .../Common/Media/InGameTeleportMenuSplit1080.swf | Bin 0 -> 20666 bytes .../Common/Media/InGameTeleportMenuSplit720.swf | Bin 0 -> 13393 bytes .../Common/Media/InGameTeleportMenuVita.swf | Bin 0 -> 13309 bytes Minecraft.Client/Common/Media/Intro1080.swf | Bin 0 -> 207241 bytes Minecraft.Client/Common/Media/Intro480.swf | Bin 0 -> 89823 bytes Minecraft.Client/Common/Media/Intro720.swf | Bin 0 -> 88977 bytes Minecraft.Client/Common/Media/IntroVita.swf | Bin 0 -> 79876 bytes .../Common/Media/InventoryMenu1080.swf | Bin 0 -> 18495 bytes Minecraft.Client/Common/Media/InventoryMenu480.swf | Bin 0 -> 18456 bytes Minecraft.Client/Common/Media/InventoryMenu720.swf | Bin 0 -> 18452 bytes .../Common/Media/InventoryMenuSplit1080.swf | Bin 0 -> 18459 bytes .../Common/Media/InventoryMenuSplit720.swf | Bin 0 -> 18452 bytes .../Common/Media/InventoryMenuVita.swf | Bin 0 -> 18461 bytes Minecraft.Client/Common/Media/JoinMenu1080.swf | Bin 0 -> 14998 bytes Minecraft.Client/Common/Media/JoinMenu480.swf | Bin 0 -> 14978 bytes Minecraft.Client/Common/Media/JoinMenu720.swf | Bin 0 -> 14991 bytes Minecraft.Client/Common/Media/JoinMenuVita.swf | Bin 0 -> 14980 bytes Minecraft.Client/Common/Media/Keyboard1080.swf | Bin 0 -> 21252 bytes .../Common/Media/KeyboardSplit1080.swf | Bin 0 -> 20931 bytes .../Common/Media/LaunchMoreOptionsMenu1080.swf | Bin 0 -> 18592 bytes .../Common/Media/LaunchMoreOptionsMenu480.swf | Bin 0 -> 16682 bytes .../Common/Media/LaunchMoreOptionsMenu720.swf | Bin 0 -> 16212 bytes .../Common/Media/LaunchMoreOptionsMenuVita.swf | Bin 0 -> 16674 bytes .../Common/Media/LeaderboardMenu1080.swf | Bin 0 -> 97132 bytes .../Common/Media/LeaderboardMenu480.swf | Bin 0 -> 63167 bytes .../Common/Media/LeaderboardMenu720.swf | Bin 0 -> 85731 bytes .../Common/Media/LeaderboardMenuVita.swf | Bin 0 -> 65080 bytes Minecraft.Client/Common/Media/LoadMenu1080.swf | Bin 0 -> 21745 bytes Minecraft.Client/Common/Media/LoadMenu480.swf | Bin 0 -> 19169 bytes Minecraft.Client/Common/Media/LoadMenu720.swf | Bin 0 -> 18616 bytes Minecraft.Client/Common/Media/LoadMenuVita.swf | Bin 0 -> 20837 bytes .../Common/Media/LoadOrJoinMenu1080.swf | Bin 0 -> 18227 bytes .../Common/Media/LoadOrJoinMenu480.swf | Bin 0 -> 17763 bytes .../Common/Media/LoadOrJoinMenu720.swf | Bin 0 -> 16152 bytes .../Common/Media/LoadOrJoinMenuVita.swf | Bin 0 -> 17759 bytes Minecraft.Client/Common/Media/MainMenu1080.swf | Bin 0 -> 13730 bytes Minecraft.Client/Common/Media/MainMenu480.swf | Bin 0 -> 13732 bytes Minecraft.Client/Common/Media/MainMenu720.swf | Bin 0 -> 13731 bytes Minecraft.Client/Common/Media/MainMenuVita.swf | Bin 0 -> 14077 bytes Minecraft.Client/Common/Media/MediaDurango.arc | Bin 0 -> 19606036 bytes Minecraft.Client/Common/Media/MediaOrbis.arc | Bin 0 -> 14344887 bytes Minecraft.Client/Common/Media/MediaPS3.arc | Bin 0 -> 10951528 bytes Minecraft.Client/Common/Media/MediaPSVita.arc | Bin 0 -> 8137376 bytes Minecraft.Client/Common/Media/MediaWindows64.arc | Bin 0 -> 22628631 bytes .../Common/Media/MenuBackground1080.swf | Bin 0 -> 157 bytes .../Common/Media/MenuBackground480.swf | Bin 0 -> 345 bytes .../Common/Media/MenuBackground720.swf | Bin 0 -> 162 bytes .../Common/Media/MenuBackgroundVita.swf | Bin 0 -> 158 bytes Minecraft.Client/Common/Media/MessageBox1080.swf | Bin 0 -> 14710 bytes Minecraft.Client/Common/Media/MessageBox480.swf | Bin 0 -> 14666 bytes Minecraft.Client/Common/Media/MessageBox720.swf | Bin 0 -> 14691 bytes .../Common/Media/MessageBoxSplit1080.swf | Bin 0 -> 14659 bytes .../Common/Media/MessageBoxSplit720.swf | Bin 0 -> 14914 bytes Minecraft.Client/Common/Media/MessageBoxVita.swf | Bin 0 -> 14650 bytes .../Common/Media/NewUpdateMessage1080.swf | Bin 0 -> 212 bytes .../Common/Media/NewUpdateMessage480.swf | Bin 0 -> 221 bytes .../Common/Media/NewUpdateMessage720.swf | Bin 0 -> 206 bytes .../Common/Media/NewUpdateMessageVita.swf | Bin 0 -> 213 bytes Minecraft.Client/Common/Media/Panorama1080.swf | Bin 0 -> 12365 bytes Minecraft.Client/Common/Media/Panorama480.swf | Bin 0 -> 12370 bytes Minecraft.Client/Common/Media/Panorama720.swf | Bin 0 -> 12363 bytes .../Common/Media/PanoramaSplit1080.swf | Bin 0 -> 12364 bytes Minecraft.Client/Common/Media/PanoramaSplit720.swf | Bin 0 -> 12365 bytes Minecraft.Client/Common/Media/PanoramaVita.swf | Bin 0 -> 36580 bytes Minecraft.Client/Common/Media/PauseMenu1080.swf | Bin 0 -> 13567 bytes Minecraft.Client/Common/Media/PauseMenu480.swf | Bin 0 -> 13570 bytes Minecraft.Client/Common/Media/PauseMenu720.swf | Bin 0 -> 13565 bytes .../Common/Media/PauseMenuSplit1080.swf | Bin 0 -> 13534 bytes .../Common/Media/PauseMenuSplit720.swf | Bin 0 -> 13535 bytes Minecraft.Client/Common/Media/PauseMenuVita.swf | Bin 0 -> 13906 bytes .../Common/Media/PressStartToPlay1080.swf | Bin 0 -> 14283 bytes .../Common/Media/PressStartToPlay480.swf | Bin 0 -> 3284 bytes .../Common/Media/PressStartToPlay720.swf | Bin 0 -> 13585 bytes .../Common/Media/PressStartToPlayVita.swf | Bin 0 -> 3287 bytes .../Common/Media/QuadrantSignin1080.swf | Bin 0 -> 18748 bytes .../Common/Media/QuadrantSignin720.swf | Bin 0 -> 26510 bytes .../Common/Media/ReinstallMenu1080.swf | Bin 0 -> 13722 bytes Minecraft.Client/Common/Media/ReinstallMenu480.swf | Bin 0 -> 13688 bytes Minecraft.Client/Common/Media/ReinstallMenu720.swf | Bin 0 -> 13631 bytes .../Common/Media/ReinstallMenuSplit1080.swf | Bin 0 -> 13696 bytes .../Common/Media/ReinstallMenuSplit720.swf | Bin 0 -> 13693 bytes .../Common/Media/ReinstallMenuVita.swf | Bin 0 -> 13686 bytes Minecraft.Client/Common/Media/SaveMenu1080.swf | Bin 0 -> 17740 bytes Minecraft.Client/Common/Media/SaveMessage1080.swf | Bin 0 -> 12395 bytes Minecraft.Client/Common/Media/SaveMessage480.swf | Bin 0 -> 12343 bytes Minecraft.Client/Common/Media/SaveMessage720.swf | Bin 0 -> 12346 bytes Minecraft.Client/Common/Media/SaveMessageVita.swf | Bin 0 -> 13052 bytes .../Common/Media/SettingsAudioMenu1080.swf | Bin 0 -> 13530 bytes .../Common/Media/SettingsAudioMenu480.swf | Bin 0 -> 13648 bytes .../Common/Media/SettingsAudioMenu720.swf | Bin 0 -> 13649 bytes .../Common/Media/SettingsAudioMenuSplit1080.swf | Bin 0 -> 13525 bytes .../Common/Media/SettingsAudioMenuSplit720.swf | Bin 0 -> 13646 bytes .../Common/Media/SettingsAudioMenuVita.swf | Bin 0 -> 13726 bytes .../Common/Media/SettingsControlMenu1080.swf | Bin 0 -> 13544 bytes .../Common/Media/SettingsControlMenu480.swf | Bin 0 -> 13674 bytes .../Common/Media/SettingsControlMenu720.swf | Bin 0 -> 13666 bytes .../Common/Media/SettingsControlMenuSplit1080.swf | Bin 0 -> 13545 bytes .../Common/Media/SettingsControlMenuSplit720.swf | Bin 0 -> 13670 bytes .../Common/Media/SettingsControlMenuVita.swf | Bin 0 -> 13672 bytes .../Common/Media/SettingsGraphicsMenu1080.swf | Bin 0 -> 14679 bytes .../Common/Media/SettingsGraphicsMenu480.swf | Bin 0 -> 14902 bytes .../Common/Media/SettingsGraphicsMenu720.swf | Bin 0 -> 14896 bytes .../Common/Media/SettingsGraphicsMenuSplit1080.swf | Bin 0 -> 14745 bytes .../Common/Media/SettingsGraphicsMenuSplit720.swf | Bin 0 -> 14903 bytes .../Common/Media/SettingsGraphicsMenuVita.swf | Bin 0 -> 14898 bytes Minecraft.Client/Common/Media/SettingsMenu1080.swf | Bin 0 -> 13567 bytes Minecraft.Client/Common/Media/SettingsMenu480.swf | Bin 0 -> 13569 bytes Minecraft.Client/Common/Media/SettingsMenu720.swf | Bin 0 -> 13564 bytes .../Common/Media/SettingsMenuSplit1080.swf | Bin 0 -> 13534 bytes .../Common/Media/SettingsMenuSplit720.swf | Bin 0 -> 13534 bytes Minecraft.Client/Common/Media/SettingsMenuVita.swf | Bin 0 -> 13906 bytes .../Common/Media/SettingsOptionsMenu1080.swf | Bin 0 -> 15424 bytes .../Common/Media/SettingsOptionsMenu480.swf | Bin 0 -> 15617 bytes .../Common/Media/SettingsOptionsMenu720.swf | Bin 0 -> 15614 bytes .../Common/Media/SettingsOptionsMenuSplit1080.swf | Bin 0 -> 15468 bytes .../Common/Media/SettingsOptionsMenuSplit720.swf | Bin 0 -> 15616 bytes .../Common/Media/SettingsOptionsMenuVita.swf | Bin 0 -> 15692 bytes .../Common/Media/SettingsUIMenu1080.swf | Bin 0 -> 14919 bytes .../Common/Media/SettingsUIMenu480.swf | Bin 0 -> 15126 bytes .../Common/Media/SettingsUIMenu720.swf | Bin 0 -> 15133 bytes .../Common/Media/SettingsUIMenuSplit1080.swf | Bin 0 -> 14983 bytes .../Common/Media/SettingsUIMenuSplit720.swf | Bin 0 -> 15122 bytes .../Common/Media/SettingsUIMenuVita.swf | Bin 0 -> 14984 bytes .../Common/Media/SignEntryMenu1080.swf | Bin 0 -> 13122 bytes Minecraft.Client/Common/Media/SignEntryMenu480.swf | Bin 0 -> 13153 bytes Minecraft.Client/Common/Media/SignEntryMenu720.swf | Bin 0 -> 13100 bytes .../Common/Media/SignEntryMenuSplit1080.swf | Bin 0 -> 13166 bytes .../Common/Media/SignEntryMenuSplit720.swf | Bin 0 -> 13110 bytes .../Common/Media/SignEntryMenuVita.swf | Bin 0 -> 13398 bytes .../Common/Media/SkinSelectMenu1080.swf | Bin 0 -> 18198 bytes .../Common/Media/SkinSelectMenu480.swf | Bin 0 -> 17888 bytes .../Common/Media/SkinSelectMenu720.swf | Bin 0 -> 18106 bytes .../Common/Media/SkinSelectMenuSplit1080.swf | Bin 0 -> 17924 bytes .../Common/Media/SkinSelectMenuSplit720.swf | Bin 0 -> 17560 bytes .../Common/Media/SkinSelectMenuVita.swf | Bin 0 -> 17806 bytes Minecraft.Client/Common/Media/SocialPost1080.swf | Bin 0 -> 14014 bytes Minecraft.Client/Common/Media/SocialPost480.swf | Bin 0 -> 13619 bytes Minecraft.Client/Common/Media/SocialPost720.swf | Bin 0 -> 13606 bytes .../Common/Media/SocialPostSplit1080.swf | Bin 0 -> 14015 bytes .../Common/Media/SocialPostSplit720.swf | Bin 0 -> 13521 bytes Minecraft.Client/Common/Media/SocialPostVita.swf | Bin 0 -> 14193 bytes Minecraft.Client/Common/Media/Sound/MenuSounds.xap | 808 + .../Common/Media/Sound/Xbox/MenuSounds.xgs | Bin 0 -> 440 bytes .../Common/Media/Sound/Xbox/MenuSounds.xsb | Bin 0 -> 490 bytes .../Common/Media/Sound/Xbox/MenuSounds.xwb | Bin 0 -> 18432 bytes Minecraft.Client/Common/Media/Sound/btn_Back.wav | Bin 0 -> 47412 bytes Minecraft.Client/Common/Media/Sound/click.wav | Bin 0 -> 49372 bytes Minecraft.Client/Common/Media/Sound/pop.wav | Bin 0 -> 15384 bytes Minecraft.Client/Common/Media/Sound/wood click.wav | Bin 0 -> 13912 bytes Minecraft.Client/Common/Media/Timer1080.swf | Bin 0 -> 1025 bytes Minecraft.Client/Common/Media/Timer480.swf | Bin 0 -> 967 bytes Minecraft.Client/Common/Media/Timer720.swf | Bin 0 -> 967 bytes Minecraft.Client/Common/Media/TimerSplit1080.swf | Bin 0 -> 1026 bytes Minecraft.Client/Common/Media/TimerSplit720.swf | Bin 0 -> 966 bytes Minecraft.Client/Common/Media/TimerVita.swf | Bin 0 -> 976 bytes Minecraft.Client/Common/Media/ToolTips1080.swf | Bin 0 -> 13932 bytes Minecraft.Client/Common/Media/ToolTips480.swf | Bin 0 -> 13933 bytes Minecraft.Client/Common/Media/ToolTips720.swf | Bin 0 -> 13929 bytes .../Common/Media/ToolTipsSplit1080.swf | Bin 0 -> 13930 bytes Minecraft.Client/Common/Media/ToolTipsSplit720.swf | Bin 0 -> 13929 bytes Minecraft.Client/Common/Media/ToolTipsVita.swf | Bin 0 -> 14881 bytes Minecraft.Client/Common/Media/TradingMenu1080.swf | Bin 0 -> 16835 bytes Minecraft.Client/Common/Media/TradingMenu480.swf | Bin 0 -> 16821 bytes Minecraft.Client/Common/Media/TradingMenu720.swf | Bin 0 -> 17622 bytes .../Common/Media/TradingMenuSplit1080.swf | Bin 0 -> 16840 bytes .../Common/Media/TradingMenuSplit720.swf | Bin 0 -> 16828 bytes Minecraft.Client/Common/Media/TradingMenuVita.swf | Bin 0 -> 18165 bytes .../Common/Media/TrialExitUpsell480.swf | Bin 0 -> 647 bytes .../Common/Media/TrialExitUpsell720.swf | Bin 0 -> 634 bytes .../Common/Media/TutorialPopup1080.swf | Bin 0 -> 14136 bytes Minecraft.Client/Common/Media/TutorialPopup480.swf | Bin 0 -> 14143 bytes Minecraft.Client/Common/Media/TutorialPopup720.swf | Bin 0 -> 14131 bytes .../Common/Media/TutorialPopupSplit1080.swf | Bin 0 -> 14714 bytes .../Common/Media/TutorialPopupSplit720.swf | Bin 0 -> 14138 bytes .../Common/Media/TutorialPopupVita.swf | Bin 0 -> 14142 bytes .../Common/Media/de-DE/4J_strings.resx | 108 + Minecraft.Client/Common/Media/de-DE/strings.resx | 4471 ++ Minecraft.Client/Common/Media/en-EN.lang | 5772 +++ .../Common/Media/es-ES/4J_strings.resx | 108 + Minecraft.Client/Common/Media/es-ES/strings.resx | 4473 ++ .../Common/Media/font/CHT/DFHeiMedium-B5.ttf | Bin 0 -> 8132620 bytes Minecraft.Client/Common/Media/font/CHT/DFTT_R5.TTC | Bin 0 -> 6405540 bytes .../Common/Media/font/JPN/DF-DotDotGothic16.ttf | Bin 0 -> 4041932 bytes .../Common/Media/font/JPN/DFGMaruGothic-Md.ttf | Bin 0 -> 3433848 bytes Minecraft.Client/Common/Media/font/KOR/BOKMSD.ttf | Bin 0 -> 1100020 bytes .../Common/Media/font/KOR/candadite2.ttf | Bin 0 -> 4871702 bytes .../Common/Media/font/Mojang Font_11.ttf | Bin 0 -> 69116 bytes .../Common/Media/font/Mojang Font_7.ttf | Bin 0 -> 69100 bytes Minecraft.Client/Common/Media/font/Mojangles.ttf | Bin 0 -> 71900 bytes .../Common/Media/font/Mojangles_11.abc | Bin 0 -> 21504 bytes Minecraft.Client/Common/Media/font/Mojangles_7.abc | Bin 0 -> 21504 bytes .../Common/Media/font/RU/SpaceMace.ttf | Bin 0 -> 109392 bytes Minecraft.Client/Common/Media/font/chars.txt | Bin 0 -> 564 bytes .../Common/Media/fr-FR/4J_strings.resx | 108 + Minecraft.Client/Common/Media/fr-FR/strings.resx | 4467 ++ .../Common/Media/it-IT/4J_strings.resx | 108 + Minecraft.Client/Common/Media/it-IT/strings.resx | 4461 ++ .../Common/Media/ja-JP/4J_strings.resx | 108 + Minecraft.Client/Common/Media/ja-JP/strings.resx | 4464 ++ .../Common/Media/ko-KR/4J_strings.resx | 108 + Minecraft.Client/Common/Media/ko-KR/strings.resx | 4465 ++ Minecraft.Client/Common/Media/languages.loc | Bin 0 -> 470490 bytes Minecraft.Client/Common/Media/media.txt | 5 + Minecraft.Client/Common/Media/movies1080.txt | 113 + Minecraft.Client/Common/Media/movies480.txt | 56 + Minecraft.Client/Common/Media/movies720.txt | 110 + Minecraft.Client/Common/Media/moviesVita.txt | 70 + .../Common/Media/pt-BR/4J_strings.resx | 108 + Minecraft.Client/Common/Media/pt-BR/strings.resx | 4455 ++ .../Common/Media/pt-PT/4J_strings.resx | 108 + Minecraft.Client/Common/Media/pt-PT/strings.resx | 4461 ++ Minecraft.Client/Common/Media/skin.swf | Bin 0 -> 145819 bytes Minecraft.Client/Common/Media/skinGraphics.swf | Bin 0 -> 1828637 bytes Minecraft.Client/Common/Media/skinGraphicsHud.swf | Bin 0 -> 11637 bytes .../Common/Media/skinGraphicsInGame.swf | Bin 0 -> 90765 bytes .../Common/Media/skinGraphicsLabels.swf | Bin 0 -> 3902 bytes Minecraft.Client/Common/Media/skinHD.swf | Bin 0 -> 152571 bytes Minecraft.Client/Common/Media/skinHDGraphics.swf | Bin 0 -> 3930937 bytes .../Common/Media/skinHDGraphicsHud.swf | Bin 0 -> 11926 bytes .../Common/Media/skinHDGraphicsInGame.swf | Bin 0 -> 111299 bytes .../Common/Media/skinHDGraphicsLabels.swf | Bin 0 -> 3899 bytes Minecraft.Client/Common/Media/skinHDHud.swf | Bin 0 -> 7688 bytes Minecraft.Client/Common/Media/skinHDInGame.swf | Bin 0 -> 23251 bytes Minecraft.Client/Common/Media/skinHDLabels.swf | Bin 0 -> 5780 bytes Minecraft.Client/Common/Media/skinHud.swf | Bin 0 -> 7799 bytes Minecraft.Client/Common/Media/skinInGame.swf | Bin 0 -> 23315 bytes Minecraft.Client/Common/Media/skinLabels.swf | Bin 0 -> 6264 bytes Minecraft.Client/Common/Media/skin_Minecraft.xui | 42772 +++++++++++++++++++ Minecraft.Client/Common/Media/splashes.txt | 312 + Minecraft.Client/Common/Media/strings.resx | 6587 +++ Minecraft.Client/Common/Media/xuiscene_DLCMain.h | 37 + Minecraft.Client/Common/Media/xuiscene_DLCMain.xui | 1092 + .../Common/Media/xuiscene_DLCMain_480.h | 32 + .../Common/Media/xuiscene_DLCMain_480.xui | 1021 + Minecraft.Client/Common/Media/xuiscene_DLCOffers.h | 61 + .../Common/Media/xuiscene_DLCOffers.xui | 1355 + .../Common/Media/xuiscene_DLCOffers_480.h | 50 + .../Common/Media/xuiscene_DLCOffers_480.xui | 1211 + .../Common/Media/xuiscene_NewUpdateMessage.h | 2 + .../Common/Media/xuiscene_NewUpdateMessage.xui | 36 + .../Common/Media/xuiscene_NewUpdateMessage_480.h | 2 + .../Common/Media/xuiscene_NewUpdateMessage_480.xui | 37 + Minecraft.Client/Common/Media/xuiscene_anvil.h | 312 + Minecraft.Client/Common/Media/xuiscene_anvil.xui | 4396 ++ .../Common/Media/xuiscene_anvil_480.xui | 4907 +++ .../Common/Media/xuiscene_anvil_small.xui | 5183 +++ Minecraft.Client/Common/Media/xuiscene_base.h | 176 + Minecraft.Client/Common/Media/xuiscene_base.xui | 2017 + Minecraft.Client/Common/Media/xuiscene_base_480.h | 172 + .../Common/Media/xuiscene_base_480.xui | 1994 + .../Common/Media/xuiscene_base_small.h | 80 + .../Common/Media/xuiscene_base_small.xui | 1021 + .../Common/Media/xuiscene_brewingstand.h | 204 + .../Common/Media/xuiscene_brewingstand.xui | 2899 ++ .../Common/Media/xuiscene_brewingstand_480.h | 232 + .../Common/Media/xuiscene_brewingstand_480.xui | 3144 ++ .../Common/Media/xuiscene_brewingstand_Small.h | 170 + .../Common/Media/xuiscene_brewingstand_Small.xui | 2321 + Minecraft.Client/Common/Media/xuiscene_chat.h | 22 + Minecraft.Client/Common/Media/xuiscene_chat.xui | 226 + Minecraft.Client/Common/Media/xuiscene_chat_480.h | 22 + .../Common/Media/xuiscene_chat_480.xui | 247 + .../Common/Media/xuiscene_chat_small.h | 22 + .../Common/Media/xuiscene_chat_small.xui | 247 + .../Common/Media/xuiscene_connectingprogress.h | 22 + .../Common/Media/xuiscene_connectingprogress.xui | 923 + .../Common/Media/xuiscene_connectingprogress_480.h | 22 + .../Media/xuiscene_connectingprogress_480.xui | 923 + .../Media/xuiscene_connectingprogress_small.h | 22 + .../Media/xuiscene_connectingprogress_small.xui | 923 + Minecraft.Client/Common/Media/xuiscene_container.h | 65 + .../Common/Media/xuiscene_container.xui | 961 + .../Common/Media/xuiscene_container_480.h | 119 + .../Common/Media/xuiscene_container_480.xui | 1610 + .../Common/Media/xuiscene_container_large_480.h | 173 + .../Common/Media/xuiscene_container_large_480.xui | 2474 ++ .../Common/Media/xuiscene_container_large_Small.h | 65 + .../Media/xuiscene_container_large_Small.xui | 962 + .../Common/Media/xuiscene_container_small.h | 65 + .../Common/Media/xuiscene_container_small.xui | 907 + Minecraft.Client/Common/Media/xuiscene_controls.h | 65 + .../Common/Media/xuiscene_controls.xui | 1272 + .../Common/Media/xuiscene_controls_480.h | 67 + .../Common/Media/xuiscene_controls_480.xui | 1254 + .../Common/Media/xuiscene_controls_small.h | 65 + .../Common/Media/xuiscene_controls_small.xui | 1230 + .../Common/Media/xuiscene_craftingpanel_2x2.h | 197 + .../Common/Media/xuiscene_craftingpanel_2x2.xui | 2605 ++ .../Common/Media/xuiscene_craftingpanel_2x2_480.h | 211 + .../Media/xuiscene_craftingpanel_2x2_480.xui | 2772 ++ .../Media/xuiscene_craftingpanel_2x2_small.h | 193 + .../Media/xuiscene_craftingpanel_2x2_small.xui | 2557 ++ .../Common/Media/xuiscene_craftingpanel_3x3.h | 213 + .../Common/Media/xuiscene_craftingpanel_3x3.xui | 2828 ++ .../Common/Media/xuiscene_craftingpanel_3x3_480.h | 211 + .../Media/xuiscene_craftingpanel_3x3_480.xui | 2767 ++ .../Media/xuiscene_craftingpanel_3x3_small.h | 211 + .../Media/xuiscene_craftingpanel_3x3_small.xui | 2804 ++ Minecraft.Client/Common/Media/xuiscene_credits.h | 31 + Minecraft.Client/Common/Media/xuiscene_credits.xui | 285 + .../Common/Media/xuiscene_credits_480.h | 31 + .../Common/Media/xuiscene_credits_480.xui | 286 + Minecraft.Client/Common/Media/xuiscene_death.h | 4 + Minecraft.Client/Common/Media/xuiscene_death.xui | 49 + Minecraft.Client/Common/Media/xuiscene_death_480.h | 4 + .../Common/Media/xuiscene_death_480.xui | 49 + .../Common/Media/xuiscene_death_small.h | 4 + .../Common/Media/xuiscene_death_small.xui | 49 + Minecraft.Client/Common/Media/xuiscene_debug.h | 6 + Minecraft.Client/Common/Media/xuiscene_debug.xui | 60 + Minecraft.Client/Common/Media/xuiscene_debug_480.h | 5 + .../Common/Media/xuiscene_debug_480.xui | 51 + .../Common/Media/xuiscene_debug_item_editor.h | 12 + .../Common/Media/xuiscene_debug_item_editor.xui | 132 + .../Common/Media/xuiscene_debug_schematic_create.h | 19 + .../Media/xuiscene_debug_schematic_create.xui | 220 + .../Common/Media/xuiscene_debug_set_camera.h | 13 + .../Common/Media/xuiscene_debug_set_camera.xui | 160 + .../Common/Media/xuiscene_debug_small.h | 2 + .../Common/Media/xuiscene_debug_small.xui | 24 + .../Common/Media/xuiscene_debugoverlay.h | 25 + .../Common/Media/xuiscene_debugoverlay.xui | 323 + .../Common/Media/xuiscene_debugoverlay_480.h | 13 + .../Common/Media/xuiscene_debugoverlay_480.xui | 161 + Minecraft.Client/Common/Media/xuiscene_debugtips.h | 2 + .../Common/Media/xuiscene_debugtips.xui | 39 + .../Common/Media/xuiscene_debugtips_480.h | 2 + .../Common/Media/xuiscene_debugtips_480.xui | 39 + .../Common/Media/xuiscene_debugtips_small.h | 2 + .../Common/Media/xuiscene_debugtips_small.xui | 39 + Minecraft.Client/Common/Media/xuiscene_enchant.h | 203 + Minecraft.Client/Common/Media/xuiscene_enchant.xui | 3155 ++ .../Common/Media/xuiscene_enchant_480.h | 199 + .../Common/Media/xuiscene_enchant_480.xui | 2650 ++ .../Common/Media/xuiscene_enchant_small.h | 216 + .../Common/Media/xuiscene_enchant_small.xui | 2870 ++ .../Common/Media/xuiscene_fullscreenprogress.h | 23 + .../Common/Media/xuiscene_fullscreenprogress.xui | 932 + .../Common/Media/xuiscene_fullscreenprogress_480.h | 23 + .../Media/xuiscene_fullscreenprogress_480.xui | 931 + .../Media/xuiscene_fullscreenprogress_small.h | 23 + .../Media/xuiscene_fullscreenprogress_small.xui | 931 + Minecraft.Client/Common/Media/xuiscene_furnace.h | 45 + Minecraft.Client/Common/Media/xuiscene_furnace.xui | 650 + .../Common/Media/xuiscene_furnace_480.h | 103 + .../Common/Media/xuiscene_furnace_480.xui | 1399 + .../Common/Media/xuiscene_furnace_Small.h | 61 + .../Common/Media/xuiscene_furnace_Small.xui | 847 + .../Common/Media/xuiscene_helpandoptions.h | 25 + .../Common/Media/xuiscene_helpandoptions.xui | 949 + .../Common/Media/xuiscene_helpandoptions_480.h | 25 + .../Common/Media/xuiscene_helpandoptions_480.xui | 950 + .../Common/Media/xuiscene_helpandoptions_small.h | 25 + .../Common/Media/xuiscene_helpandoptions_small.xui | 950 + Minecraft.Client/Common/Media/xuiscene_howtoplay.h | 73 + .../Common/Media/xuiscene_howtoplay.xui | 665 + .../Common/Media/xuiscene_howtoplay_480.h | 72 + .../Common/Media/xuiscene_howtoplay_480.xui | 668 + .../Common/Media/xuiscene_howtoplay_menu.h | 9 + .../Common/Media/xuiscene_howtoplay_menu.xui | 115 + .../Common/Media/xuiscene_howtoplay_menu_480.h | 5 + .../Common/Media/xuiscene_howtoplay_menu_480.xui | 63 + .../Common/Media/xuiscene_howtoplay_menu_small.h | 4 + .../Common/Media/xuiscene_howtoplay_menu_small.xui | 50 + .../Common/Media/xuiscene_howtoplay_small.h | 72 + .../Common/Media/xuiscene_howtoplay_small.xui | 669 + Minecraft.Client/Common/Media/xuiscene_hud.h | 62 + Minecraft.Client/Common/Media/xuiscene_hud.xui | 653 + Minecraft.Client/Common/Media/xuiscene_hud_480.h | 62 + Minecraft.Client/Common/Media/xuiscene_hud_480.xui | 653 + Minecraft.Client/Common/Media/xuiscene_hud_small.h | 62 + .../Common/Media/xuiscene_hud_small.xui | 672 + .../Common/Media/xuiscene_ingame_host_options.h | 6 + .../Common/Media/xuiscene_ingame_host_options.xui | 69 + .../Media/xuiscene_ingame_host_options_480.h | 6 + .../Media/xuiscene_ingame_host_options_480.xui | 71 + .../Media/xuiscene_ingame_host_options_small.h | 6 + .../Media/xuiscene_ingame_host_options_small.xui | 71 + .../Common/Media/xuiscene_ingame_player_options.h | 14 + .../Media/xuiscene_ingame_player_options.xui | 163 + .../Media/xuiscene_ingame_player_options_480.h | 14 + .../Media/xuiscene_ingame_player_options_480.xui | 164 + .../Media/xuiscene_ingame_player_options_small.h | 14 + .../Media/xuiscene_ingame_player_options_small.xui | 164 + .../Common/Media/xuiscene_ingameinfo.h | 7 + .../Common/Media/xuiscene_ingameinfo.xui | 78 + .../Common/Media/xuiscene_ingameinfo_480.h | 7 + .../Common/Media/xuiscene_ingameinfo_480.xui | 79 + .../Common/Media/xuiscene_ingameinfo_small.h | 8 + .../Common/Media/xuiscene_ingameinfo_small.xui | 90 + Minecraft.Client/Common/Media/xuiscene_intro.h | 6 + Minecraft.Client/Common/Media/xuiscene_intro.xui | 382 + Minecraft.Client/Common/Media/xuiscene_intro_480.h | 6 + .../Common/Media/xuiscene_intro_480.xui | 389 + Minecraft.Client/Common/Media/xuiscene_inventory.h | 99 + .../Common/Media/xuiscene_inventory.xui | 1431 + .../Common/Media/xuiscene_inventory_480.h | 137 + .../Common/Media/xuiscene_inventory_480.xui | 1856 + .../Common/Media/xuiscene_inventory_creative.h | 518 + .../Common/Media/xuiscene_inventory_creative.xui | 7197 ++++ .../Common/Media/xuiscene_inventory_creative_480.h | 508 + .../Media/xuiscene_inventory_creative_480.xui | 7020 +++ .../Media/xuiscene_inventory_creative_small.h | 447 + .../Media/xuiscene_inventory_creative_small.xui | 6166 +++ .../Common/Media/xuiscene_inventory_small.h | 121 + .../Common/Media/xuiscene_inventory_small.xui | 1643 + .../Common/Media/xuiscene_leaderboards.h | 17 + .../Common/Media/xuiscene_leaderboards.xui | 176 + .../Common/Media/xuiscene_leaderboards_480.h | 17 + .../Common/Media/xuiscene_leaderboards_480.xui | 180 + .../Common/Media/xuiscene_load_settings.h | 37 + .../Common/Media/xuiscene_load_settings.xui | 477 + .../Common/Media/xuiscene_load_settings_480.h | 37 + .../Common/Media/xuiscene_load_settings_480.xui | 481 + Minecraft.Client/Common/Media/xuiscene_main.h | 26 + Minecraft.Client/Common/Media/xuiscene_main.xui | 956 + Minecraft.Client/Common/Media/xuiscene_main_480.h | 26 + .../Common/Media/xuiscene_main_480.xui | 956 + .../Common/Media/xuiscene_multi_create.h | 35 + .../Common/Media/xuiscene_multi_create.xui | 460 + .../Common/Media/xuiscene_multi_create_480.h | 38 + .../Common/Media/xuiscene_multi_create_480.xui | 497 + .../Common/Media/xuiscene_multi_gameinfo.h | 29 + .../Common/Media/xuiscene_multi_gameinfo.xui | 285 + .../Common/Media/xuiscene_multi_gameinfo_480.h | 28 + .../Common/Media/xuiscene_multi_gameinfo_480.xui | 292 + .../Common/Media/xuiscene_multi_joinload.h | 46 + .../Common/Media/xuiscene_multi_joinload.xui | 1851 + .../Common/Media/xuiscene_multi_joinload_480.h | 52 + .../Common/Media/xuiscene_multi_joinload_480.xui | 1917 + .../Media/xuiscene_multi_launch_more_options.h | 18 + .../Media/xuiscene_multi_launch_more_options.xui | 282 + .../Media/xuiscene_multi_launch_more_options_480.h | 18 + .../xuiscene_multi_launch_more_options_480.xui | 278 + .../Common/Media/xuiscene_partnernetpassword.h | 4 + .../Common/Media/xuiscene_partnernetpassword.xui | 50 + .../Common/Media/xuiscene_partnernetpassword_480.h | 4 + .../Media/xuiscene_partnernetpassword_480.xui | 49 + Minecraft.Client/Common/Media/xuiscene_pause.h | 7 + Minecraft.Client/Common/Media/xuiscene_pause.xui | 88 + Minecraft.Client/Common/Media/xuiscene_pause_480.h | 7 + .../Common/Media/xuiscene_pause_480.xui | 88 + .../Common/Media/xuiscene_pause_small.h | 7 + .../Common/Media/xuiscene_pause_small.xui | 88 + Minecraft.Client/Common/Media/xuiscene_reinstall.h | 8 + .../Common/Media/xuiscene_reinstall.xui | 89 + .../Common/Media/xuiscene_reinstall_480.h | 8 + .../Common/Media/xuiscene_reinstall_480.xui | 95 + .../Common/Media/xuiscene_reinstall_small.h | 8 + .../Common/Media/xuiscene_reinstall_small.xui | 95 + .../Common/Media/xuiscene_savemessage.h | 4 + .../Common/Media/xuiscene_savemessage.xui | 44 + .../Common/Media/xuiscene_savemessage_480.h | 4 + .../Common/Media/xuiscene_savemessage_480.xui | 44 + .../Common/Media/xuiscene_settings_All.h | 7 + .../Common/Media/xuiscene_settings_All.xui | 91 + .../Common/Media/xuiscene_settings_All_480.h | 7 + .../Common/Media/xuiscene_settings_All_480.xui | 90 + .../Common/Media/xuiscene_settings_All_small.h | 7 + .../Common/Media/xuiscene_settings_All_small.xui | 82 + .../Common/Media/xuiscene_settings_Audio.h | 7 + .../Common/Media/xuiscene_settings_Audio.xui | 81 + .../Common/Media/xuiscene_settings_Audio_480.h | 7 + .../Common/Media/xuiscene_settings_Audio_480.xui | 76 + .../Common/Media/xuiscene_settings_Audio_small.h | 7 + .../Common/Media/xuiscene_settings_Audio_small.xui | 79 + .../Common/Media/xuiscene_settings_Control.h | 7 + .../Common/Media/xuiscene_settings_Control.xui | 78 + .../Common/Media/xuiscene_settings_Control_480.h | 7 + .../Common/Media/xuiscene_settings_Control_480.xui | 75 + .../Common/Media/xuiscene_settings_Control_small.h | 7 + .../Media/xuiscene_settings_Control_small.xui | 76 + .../Common/Media/xuiscene_settings_Graphics.h | 10 + .../Common/Media/xuiscene_settings_Graphics.xui | 112 + .../Common/Media/xuiscene_settings_Graphics_480.h | 10 + .../Media/xuiscene_settings_Graphics_480.xui | 111 + .../Media/xuiscene_settings_Graphics_small.h | 10 + .../Media/xuiscene_settings_Graphics_small.xui | 112 + .../Common/Media/xuiscene_settings_UI.h | 13 + .../Common/Media/xuiscene_settings_UI.xui | 152 + .../Common/Media/xuiscene_settings_UI_480.h | 13 + .../Common/Media/xuiscene_settings_UI_480.xui | 157 + .../Common/Media/xuiscene_settings_UI_small.h | 13 + .../Common/Media/xuiscene_settings_UI_small.xui | 157 + .../Common/Media/xuiscene_settings_options.h | 13 + .../Common/Media/xuiscene_settings_options.xui | 144 + .../Common/Media/xuiscene_settings_options_480.h | 13 + .../Common/Media/xuiscene_settings_options_480.xui | 146 + .../Common/Media/xuiscene_settings_options_small.h | 13 + .../Media/xuiscene_settings_options_small.xui | 148 + Minecraft.Client/Common/Media/xuiscene_signentry.h | 8 + .../Common/Media/xuiscene_signentry.xui | 110 + .../Common/Media/xuiscene_signentry_480.h | 8 + .../Common/Media/xuiscene_signentry_480.xui | 110 + .../Common/Media/xuiscene_signentry_small.h | 8 + .../Common/Media/xuiscene_signentry_small.xui | 109 + .../Common/Media/xuiscene_skinselect.h | 45 + .../Common/Media/xuiscene_skinselect.xui | 1575 + .../Common/Media/xuiscene_skinselect_480.h | 45 + .../Common/Media/xuiscene_skinselect_480.xui | 1574 + .../Common/Media/xuiscene_skinselect_small.h | 42 + .../Common/Media/xuiscene_skinselect_small.xui | 1656 + .../Common/Media/xuiscene_socialpost.h | 7 + .../Common/Media/xuiscene_socialpost.xui | 88 + .../Common/Media/xuiscene_socialpost_480.h | 7 + .../Common/Media/xuiscene_socialpost_480.xui | 87 + .../Common/Media/xuiscene_socialpost_small.h | 7 + .../Common/Media/xuiscene_socialpost_small.xui | 88 + .../Common/Media/xuiscene_teleportmenu.h | 9 + .../Common/Media/xuiscene_teleportmenu.xui | 100 + .../Common/Media/xuiscene_teleportmenu_480.h | 9 + .../Common/Media/xuiscene_teleportmenu_480.xui | 101 + .../Common/Media/xuiscene_teleportmenu_small.h | 9 + .../Common/Media/xuiscene_teleportmenu_small.xui | 101 + .../Common/Media/xuiscene_text_entry.h | 2 + .../Common/Media/xuiscene_text_entry.xui | 29 + Minecraft.Client/Common/Media/xuiscene_trading.h | 485 + Minecraft.Client/Common/Media/xuiscene_trading.xui | 6765 +++ .../Common/Media/xuiscene_trading_480.xui | 6457 +++ .../Common/Media/xuiscene_trading_small.xui | 6205 +++ Minecraft.Client/Common/Media/xuiscene_trap.h | 53 + Minecraft.Client/Common/Media/xuiscene_trap.xui | 790 + Minecraft.Client/Common/Media/xuiscene_trap_480.h | 95 + .../Common/Media/xuiscene_trap_480.xui | 1295 + .../Common/Media/xuiscene_trap_small.h | 53 + .../Common/Media/xuiscene_trap_small.xui | 749 + .../Common/Media/xuiscene_trialexitupsell.h | 3 + .../Common/Media/xuiscene_trialexitupsell.xui | 127 + .../Common/Media/xuiscene_trialexitupsell_480.h | 3 + .../Common/Media/xuiscene_trialexitupsell_480.xui | 131 + .../Common/Media/xuiscene_tutorialpopup.h | 6 + .../Common/Media/xuiscene_tutorialpopup.xui | 83 + .../Common/Media/xuiscene_tutorialpopup_480.h | 6 + .../Common/Media/xuiscene_tutorialpopup_480.xui | 83 + .../Common/Media/xuiscene_tutorialpopup_small.h | 6 + .../Common/Media/xuiscene_tutorialpopup_small.xui | 84 + Minecraft.Client/Common/Media/xuiscene_win.h | 4 + Minecraft.Client/Common/Media/xuiscene_win.xui | 68 + Minecraft.Client/Common/Media/xuiscene_win_480.h | 4 + Minecraft.Client/Common/Media/xuiscene_win_480.xui | 69 + .../Common/Media/zh-CHT/4J_strings.resx | 108 + Minecraft.Client/Common/Media/zh-CHT/strings.resx | 4464 ++ Minecraft.Client/Common/Minecraft_Macros.h | 42 + .../Common/Network/GameNetworkManager.cpp | 2000 + .../Common/Network/GameNetworkManager.h | 236 + .../Common/Network/NetworkPlayerInterface.h | 31 + .../Network/PlatformNetworkManagerInterface.h | 126 + .../Common/Network/PlatformNetworkManagerStub.cpp | 646 + .../Common/Network/PlatformNetworkManagerStub.h | 170 + Minecraft.Client/Common/Network/SessionInfo.h | 113 + .../Common/Network/Sony/NetworkPlayerSony.cpp | 114 + .../Common/Network/Sony/NetworkPlayerSony.h | 39 + .../Network/Sony/PlatformNetworkManagerSony.cpp | 1462 + .../Network/Sony/PlatformNetworkManagerSony.h | 187 + .../Common/Network/Sony/SQRNetworkManager.cpp | 10 + .../Common/Network/Sony/SQRNetworkManager.h | 313 + .../Common/Network/Sony/SQRNetworkPlayer.cpp | 399 + .../Common/Network/Sony/SQRNetworkPlayer.h | 103 + .../Common/Network/Sony/SonyCommerce.cpp | 1492 + .../Common/Network/Sony/SonyCommerce.h | 173 + Minecraft.Client/Common/Network/Sony/SonyHttp.cpp | 34 + Minecraft.Client/Common/Network/Sony/SonyHttp.h | 11 + .../Common/Network/Sony/SonyRemoteStorage.cpp | 340 + .../Common/Network/Sony/SonyRemoteStorage.h | 120 + .../sceRemoteStorage/header/sceRemoteStorage.h | 137 + .../header/sceRemoteStorageDefines.h | 167 + .../sceRemoteStorage/ps3/lib/sceRemoteStorage.a | Bin 0 -> 239054 bytes .../sceRemoteStorage/ps4/lib/sceRemoteStorage.a | Bin 0 -> 267032 bytes .../sceRemoteStorage/psvita/lib/sceRemoteStorage.a | Bin 0 -> 170130 bytes Minecraft.Client/Common/Potion_Macros.h | 54 + .../Common/Telemetry/TelemetryManager.cpp | 450 + .../Common/Telemetry/TelemetryManager.h | 65 + Minecraft.Client/Common/Trial/TrialLevel.mcs | Bin 0 -> 3354946 bytes Minecraft.Client/Common/Trial/TrialMode.cpp | 9 + Minecraft.Client/Common/Trial/TrialMode.h | 10 + .../Common/Tutorial/AreaConstraint.cpp | 52 + Minecraft.Client/Common/Tutorial/AreaConstraint.h | 24 + Minecraft.Client/Common/Tutorial/AreaHint.cpp | 49 + Minecraft.Client/Common/Tutorial/AreaHint.h | 25 + Minecraft.Client/Common/Tutorial/AreaTask.cpp | 69 + Minecraft.Client/Common/Tutorial/AreaTask.h | 24 + .../Common/Tutorial/ChangeStateConstraint.cpp | 136 + .../Common/Tutorial/ChangeStateConstraint.h | 37 + Minecraft.Client/Common/Tutorial/ChoiceTask.cpp | 135 + Minecraft.Client/Common/Tutorial/ChoiceTask.h | 27 + .../Common/Tutorial/CompleteUsingItemTask.cpp | 37 + .../Common/Tutorial/CompleteUsingItemTask.h | 20 + .../Common/Tutorial/ControllerTask.cpp | 123 + Minecraft.Client/Common/Tutorial/ControllerTask.h | 24 + Minecraft.Client/Common/Tutorial/CraftTask.cpp | 66 + Minecraft.Client/Common/Tutorial/CraftTask.h | 25 + .../Common/Tutorial/DiggerItemHint.cpp | 76 + Minecraft.Client/Common/Tutorial/DiggerItemHint.h | 18 + .../Common/Tutorial/EffectChangedTask.cpp | 31 + .../Common/Tutorial/EffectChangedTask.h | 19 + Minecraft.Client/Common/Tutorial/FullTutorial.cpp | 653 + Minecraft.Client/Common/Tutorial/FullTutorial.h | 21 + .../Common/Tutorial/FullTutorialActiveTask.cpp | 26 + .../Common/Tutorial/FullTutorialActiveTask.h | 18 + .../Common/Tutorial/FullTutorialMode.cpp | 16 + .../Common/Tutorial/FullTutorialMode.h | 12 + Minecraft.Client/Common/Tutorial/InfoTask.cpp | 137 + Minecraft.Client/Common/Tutorial/InfoTask.h | 25 + .../Common/Tutorial/InputConstraint.cpp | 18 + Minecraft.Client/Common/Tutorial/InputConstraint.h | 15 + .../Common/Tutorial/LookAtEntityHint.cpp | 25 + .../Common/Tutorial/LookAtEntityHint.h | 20 + .../Common/Tutorial/LookAtTileHint.cpp | 68 + Minecraft.Client/Common/Tutorial/LookAtTileHint.h | 22 + Minecraft.Client/Common/Tutorial/PickupTask.cpp | 17 + Minecraft.Client/Common/Tutorial/PickupTask.h | 26 + .../Common/Tutorial/ProcedureCompoundTask.cpp | 263 + .../Common/Tutorial/ProcedureCompoundTask.h | 36 + .../Common/Tutorial/ProgressFlagTask.cpp | 17 + .../Common/Tutorial/ProgressFlagTask.h | 25 + Minecraft.Client/Common/Tutorial/StatTask.cpp | 25 + Minecraft.Client/Common/Tutorial/StatTask.h | 18 + Minecraft.Client/Common/Tutorial/StateChangeTask.h | 27 + Minecraft.Client/Common/Tutorial/TakeItemHint.cpp | 45 + Minecraft.Client/Common/Tutorial/TakeItemHint.h | 19 + Minecraft.Client/Common/Tutorial/Tutorial | Bin 0 -> 8973500 bytes Minecraft.Client/Common/Tutorial/Tutorial.cpp | 2160 + Minecraft.Client/Common/Tutorial/Tutorial.h | 199 + .../Common/Tutorial/TutorialConstraint.h | 41 + .../Common/Tutorial/TutorialConstraints.h | 4 + Minecraft.Client/Common/Tutorial/TutorialEnum.h | 329 + Minecraft.Client/Common/Tutorial/TutorialHint.cpp | 128 + Minecraft.Client/Common/Tutorial/TutorialHint.h | 53 + Minecraft.Client/Common/Tutorial/TutorialHints.h | 7 + .../Common/Tutorial/TutorialMessage.cpp | 23 + Minecraft.Client/Common/Tutorial/TutorialMessage.h | 20 + Minecraft.Client/Common/Tutorial/TutorialMode.cpp | 124 + Minecraft.Client/Common/Tutorial/TutorialMode.h | 28 + Minecraft.Client/Common/Tutorial/TutorialTask.cpp | 78 + Minecraft.Client/Common/Tutorial/TutorialTask.h | 63 + Minecraft.Client/Common/Tutorial/TutorialTasks.h | 16 + Minecraft.Client/Common/Tutorial/UseItemTask.cpp | 25 + Minecraft.Client/Common/Tutorial/UseItemTask.h | 20 + Minecraft.Client/Common/Tutorial/UseTileTask.cpp | 40 + Minecraft.Client/Common/Tutorial/UseTileTask.h | 24 + .../Common/Tutorial/XuiCraftingTask.cpp | 42 + Minecraft.Client/Common/Tutorial/XuiCraftingTask.h | 36 + Minecraft.Client/Common/UI/IUIController.h | 77 + .../Common/UI/IUIScene_AbstractContainerMenu.cpp | 1635 + .../Common/UI/IUIScene_AbstractContainerMenu.h | 223 + Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp | 272 + Minecraft.Client/Common/UI/IUIScene_AnvilMenu.h | 45 + .../Common/UI/IUIScene_BrewingMenu.cpp | 151 + Minecraft.Client/Common/UI/IUIScene_BrewingMenu.h | 19 + .../Common/UI/IUIScene_ContainerMenu.cpp | 71 + .../Common/UI/IUIScene_ContainerMenu.h | 10 + .../Common/UI/IUIScene_CraftingMenu.cpp | 1400 + Minecraft.Client/Common/UI/IUIScene_CraftingMenu.h | 119 + .../Common/UI/IUIScene_CreativeMenu.cpp | 1053 + Minecraft.Client/Common/UI/IUIScene_CreativeMenu.h | 122 + .../Common/UI/IUIScene_DispenserMenu.cpp | 77 + .../Common/UI/IUIScene_DispenserMenu.h | 12 + .../Common/UI/IUIScene_EnchantingMenu.cpp | 185 + .../Common/UI/IUIScene_EnchantingMenu.h | 23 + .../Common/UI/IUIScene_FurnaceMenu.cpp | 141 + Minecraft.Client/Common/UI/IUIScene_FurnaceMenu.h | 15 + .../Common/UI/IUIScene_InventoryMenu.cpp | 72 + .../Common/UI/IUIScene_InventoryMenu.h | 10 + Minecraft.Client/Common/UI/IUIScene_PauseMenu.cpp | 691 + Minecraft.Client/Common/UI/IUIScene_PauseMenu.h | 25 + Minecraft.Client/Common/UI/IUIScene_StartGame.cpp | 379 + Minecraft.Client/Common/UI/IUIScene_StartGame.h | 48 + .../Common/UI/IUIScene_TradingMenu.cpp | 387 + Minecraft.Client/Common/UI/IUIScene_TradingMenu.h | 58 + Minecraft.Client/Common/UI/UI.h | 118 + Minecraft.Client/Common/UI/UIBitmapFont.cpp | 364 + Minecraft.Client/Common/UI/UIBitmapFont.h | 75 + Minecraft.Client/Common/UI/UIComponent_Chat.cpp | 157 + Minecraft.Client/Common/UI/UIComponent_Chat.h | 66 + .../Common/UI/UIComponent_DebugUIConsole.cpp | 39 + .../Common/UI/UIComponent_DebugUIConsole.h | 49 + .../UI/UIComponent_DebugUIMarketingGuide.cpp | 33 + .../Common/UI/UIComponent_DebugUIMarketingGuide.h | 34 + Minecraft.Client/Common/UI/UIComponent_Logo.cpp | 30 + Minecraft.Client/Common/UI/UIComponent_Logo.h | 25 + .../Common/UI/UIComponent_MenuBackground.cpp | 103 + .../Common/UI/UIComponent_MenuBackground.h | 30 + .../Common/UI/UIComponent_Panorama.cpp | 144 + Minecraft.Client/Common/UI/UIComponent_Panorama.h | 40 + .../Common/UI/UIComponent_PressStartToPlay.cpp | 167 + .../Common/UI/UIComponent_PressStartToPlay.h | 60 + .../Common/UI/UIComponent_Tooltips.cpp | 501 + Minecraft.Client/Common/UI/UIComponent_Tooltips.h | 110 + .../Common/UI/UIComponent_TutorialPopup.cpp | 539 + .../Common/UI/UIComponent_TutorialPopup.h | 101 + Minecraft.Client/Common/UI/UIControl.cpp | 153 + Minecraft.Client/Common/UI/UIControl.h | 92 + Minecraft.Client/Common/UI/UIControl_Base.cpp | 112 + Minecraft.Client/Common/UI/UIControl_Base.h | 30 + .../Common/UI/UIControl_BitmapIcon.cpp | 27 + Minecraft.Client/Common/UI/UIControl_BitmapIcon.h | 14 + Minecraft.Client/Common/UI/UIControl_Button.cpp | 68 + Minecraft.Client/Common/UI/UIControl_Button.h | 19 + .../Common/UI/UIControl_ButtonList.cpp | 197 + Minecraft.Client/Common/UI/UIControl_ButtonList.h | 44 + Minecraft.Client/Common/UI/UIControl_CheckBox.cpp | 109 + Minecraft.Client/Common/UI/UIControl_CheckBox.h | 27 + Minecraft.Client/Common/UI/UIControl_Cursor.cpp | 17 + Minecraft.Client/Common/UI/UIControl_Cursor.h | 11 + Minecraft.Client/Common/UI/UIControl_DLCList.cpp | 69 + Minecraft.Client/Common/UI/UIControl_DLCList.h | 17 + .../Common/UI/UIControl_DynamicLabel.cpp | 98 + .../Common/UI/UIControl_DynamicLabel.h | 25 + .../Common/UI/UIControl_EnchantmentBook.cpp | 140 + .../Common/UI/UIControl_EnchantmentBook.h | 33 + .../Common/UI/UIControl_EnchantmentButton.cpp | 205 + .../Common/UI/UIControl_EnchantmentButton.h | 55 + Minecraft.Client/Common/UI/UIControl_HTMLLabel.cpp | 103 + Minecraft.Client/Common/UI/UIControl_HTMLLabel.h | 27 + Minecraft.Client/Common/UI/UIControl_Label.cpp | 53 + Minecraft.Client/Common/UI/UIControl_Label.h | 15 + .../Common/UI/UIControl_LeaderboardList.cpp | 238 + .../Common/UI/UIControl_LeaderboardList.h | 50 + .../Common/UI/UIControl_MinecraftPlayer.cpp | 93 + .../Common/UI/UIControl_MinecraftPlayer.h | 15 + .../Common/UI/UIControl_PlayerList.cpp | 65 + Minecraft.Client/Common/UI/UIControl_PlayerList.h | 17 + .../Common/UI/UIControl_PlayerSkinPreview.cpp | 514 + .../Common/UI/UIControl_PlayerSkinPreview.h | 90 + Minecraft.Client/Common/UI/UIControl_Progress.cpp | 84 + Minecraft.Client/Common/UI/UIControl_Progress.h | 25 + Minecraft.Client/Common/UI/UIControl_SaveList.cpp | 106 + Minecraft.Client/Common/UI/UIControl_SaveList.h | 29 + Minecraft.Client/Common/UI/UIControl_Slider.cpp | 119 + Minecraft.Client/Common/UI/UIControl_Slider.h | 32 + Minecraft.Client/Common/UI/UIControl_SlotList.cpp | 93 + Minecraft.Client/Common/UI/UIControl_SlotList.h | 28 + .../Common/UI/UIControl_SpaceIndicatorBar.cpp | 122 + .../Common/UI/UIControl_SpaceIndicatorBar.h | 33 + Minecraft.Client/Common/UI/UIControl_TextInput.cpp | 83 + Minecraft.Client/Common/UI/UIControl_TextInput.h | 22 + .../Common/UI/UIControl_TexturePackList.cpp | 145 + .../Common/UI/UIControl_TexturePackList.h | 27 + Minecraft.Client/Common/UI/UIControl_Touch.cpp | 38 + Minecraft.Client/Common/UI/UIControl_Touch.h | 16 + Minecraft.Client/Common/UI/UIController.cpp | 3015 ++ Minecraft.Client/Common/UI/UIController.h | 369 + Minecraft.Client/Common/UI/UIEnums.h | 234 + Minecraft.Client/Common/UI/UIFontData.cpp | 341 + Minecraft.Client/Common/UI/UIFontData.h | 133 + Minecraft.Client/Common/UI/UIGroup.cpp | 421 + Minecraft.Client/Common/UI/UIGroup.h | 113 + Minecraft.Client/Common/UI/UILayer.cpp | 870 + Minecraft.Client/Common/UI/UILayer.h | 91 + Minecraft.Client/Common/UI/UIScene.cpp | 1248 + Minecraft.Client/Common/UI/UIScene.h | 270 + .../Common/UI/UIScene_AbstractContainerMenu.cpp | 307 + .../Common/UI/UIScene_AbstractContainerMenu.h | 63 + Minecraft.Client/Common/UI/UIScene_AnvilMenu.cpp | 400 + Minecraft.Client/Common/UI/UIScene_AnvilMenu.h | 66 + .../Common/UI/UIScene_BrewingStandMenu.cpp | 309 + .../Common/UI/UIScene_BrewingStandMenu.h | 49 + .../Common/UI/UIScene_ConnectingProgress.cpp | 267 + .../Common/UI/UIScene_ConnectingProgress.h | 61 + .../Common/UI/UIScene_ContainerMenu.cpp | 223 + Minecraft.Client/Common/UI/UIScene_ContainerMenu.h | 40 + .../Common/UI/UIScene_ControlsMenu.cpp | 336 + Minecraft.Client/Common/UI/UIScene_ControlsMenu.h | 141 + .../Common/UI/UIScene_CraftingMenu.cpp | 769 + Minecraft.Client/Common/UI/UIScene_CraftingMenu.h | 205 + .../Common/UI/UIScene_CreateWorldMenu.cpp | 1457 + .../Common/UI/UIScene_CreateWorldMenu.h | 115 + .../Common/UI/UIScene_CreativeMenu.cpp | 493 + Minecraft.Client/Common/UI/UIScene_CreativeMenu.h | 90 + Minecraft.Client/Common/UI/UIScene_Credits.cpp | 677 + Minecraft.Client/Common/UI/UIScene_Credits.h | 71 + Minecraft.Client/Common/UI/UIScene_DLCMainMenu.cpp | 243 + Minecraft.Client/Common/UI/UIScene_DLCMainMenu.h | 50 + .../Common/UI/UIScene_DLCOffersMenu.cpp | 923 + Minecraft.Client/Common/UI/UIScene_DLCOffersMenu.h | 96 + Minecraft.Client/Common/UI/UIScene_DeathMenu.cpp | 191 + Minecraft.Client/Common/UI/UIScene_DeathMenu.h | 44 + .../Common/UI/UIScene_DebugCreateSchematic.cpp | 216 + .../Common/UI/UIScene_DebugCreateSchematic.h | 73 + .../Common/UI/UIScene_DebugOptions.cpp | 96 + Minecraft.Client/Common/UI/UIScene_DebugOptions.h | 49 + .../Common/UI/UIScene_DebugOverlay.cpp | 265 + Minecraft.Client/Common/UI/UIScene_DebugOverlay.h | 65 + .../Common/UI/UIScene_DebugSetCamera.cpp | 158 + .../Common/UI/UIScene_DebugSetCamera.h | 69 + .../Common/UI/UIScene_DispenserMenu.cpp | 197 + Minecraft.Client/Common/UI/UIScene_DispenserMenu.h | 40 + Minecraft.Client/Common/UI/UIScene_EULA.cpp | 145 + Minecraft.Client/Common/UI/UIScene_EULA.h | 45 + .../Common/UI/UIScene_EnchantingMenu.cpp | 284 + .../Common/UI/UIScene_EnchantingMenu.h | 54 + Minecraft.Client/Common/UI/UIScene_EndPoem.cpp | 271 + Minecraft.Client/Common/UI/UIScene_EndPoem.h | 41 + .../Common/UI/UIScene_FullscreenProgress.cpp | 374 + .../Common/UI/UIScene_FullscreenProgress.h | 69 + Minecraft.Client/Common/UI/UIScene_FurnaceMenu.cpp | 256 + Minecraft.Client/Common/UI/UIScene_FurnaceMenu.h | 50 + Minecraft.Client/Common/UI/UIScene_HUD.cpp | 997 + Minecraft.Client/Common/UI/UIScene_HUD.h | 183 + .../Common/UI/UIScene_HelpAndOptionsMenu.cpp | 233 + .../Common/UI/UIScene_HelpAndOptionsMenu.h | 50 + Minecraft.Client/Common/UI/UIScene_HowToPlay.cpp | 328 + Minecraft.Client/Common/UI/UIScene_HowToPlay.h | 123 + .../Common/UI/UIScene_HowToPlayMenu.cpp | 205 + Minecraft.Client/Common/UI/UIScene_HowToPlayMenu.h | 68 + .../Common/UI/UIScene_InGameHostOptionsMenu.cpp | 104 + .../Common/UI/UIScene_InGameHostOptionsMenu.h | 38 + .../Common/UI/UIScene_InGameInfoMenu.cpp | 605 + .../Common/UI/UIScene_InGameInfoMenu.h | 62 + .../Common/UI/UIScene_InGamePlayerOptionsMenu.cpp | 438 + .../Common/UI/UIScene_InGamePlayerOptionsMenu.h | 90 + .../Common/UI/UIScene_InGameSaveManagementMenu.cpp | 497 + .../Common/UI/UIScene_InGameSaveManagementMenu.h | 104 + Minecraft.Client/Common/UI/UIScene_Intro.cpp | 166 + Minecraft.Client/Common/UI/UIScene_Intro.h | 52 + .../Common/UI/UIScene_InventoryMenu.cpp | 334 + Minecraft.Client/Common/UI/UIScene_InventoryMenu.h | 51 + Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp | 586 + Minecraft.Client/Common/UI/UIScene_JoinMenu.h | 98 + Minecraft.Client/Common/UI/UIScene_Keyboard.cpp | 181 + Minecraft.Client/Common/UI/UIScene_Keyboard.h | 79 + .../Common/UI/UIScene_LaunchMoreOptionsMenu.cpp | 462 + .../Common/UI/UIScene_LaunchMoreOptionsMenu.h | 125 + .../Common/UI/UIScene_LeaderboardsMenu.cpp | 1045 + .../Common/UI/UIScene_LeaderboardsMenu.h | 143 + Minecraft.Client/Common/UI/UIScene_LoadMenu.cpp | 1804 + Minecraft.Client/Common/UI/UIScene_LoadMenu.h | 131 + .../Common/UI/UIScene_LoadOrJoinMenu.cpp | 3536 ++ .../Common/UI/UIScene_LoadOrJoinMenu.h | 300 + Minecraft.Client/Common/UI/UIScene_MainMenu.cpp | 2043 + Minecraft.Client/Common/UI/UIScene_MainMenu.h | 175 + Minecraft.Client/Common/UI/UIScene_MessageBox.cpp | 161 + Minecraft.Client/Common/UI/UIScene_MessageBox.h | 59 + Minecraft.Client/Common/UI/UIScene_PauseMenu.cpp | 1483 + Minecraft.Client/Common/UI/UIScene_PauseMenu.h | 112 + .../Common/UI/UIScene_QuadrantSignin.cpp | 291 + .../Common/UI/UIScene_QuadrantSignin.h | 110 + .../Common/UI/UIScene_ReinstallMenu.cpp | 110 + Minecraft.Client/Common/UI/UIScene_ReinstallMenu.h | 47 + Minecraft.Client/Common/UI/UIScene_SaveMessage.cpp | 182 + Minecraft.Client/Common/UI/UIScene_SaveMessage.h | 51 + .../Common/UI/UIScene_SettingsAudioMenu.cpp | 116 + .../Common/UI/UIScene_SettingsAudioMenu.h | 38 + .../Common/UI/UIScene_SettingsControlMenu.cpp | 116 + .../Common/UI/UIScene_SettingsControlMenu.h | 37 + .../Common/UI/UIScene_SettingsGraphicsMenu.cpp | 153 + .../Common/UI/UIScene_SettingsGraphicsMenu.h | 46 + .../Common/UI/UIScene_SettingsMenu.cpp | 168 + Minecraft.Client/Common/UI/UIScene_SettingsMenu.h | 47 + .../Common/UI/UIScene_SettingsOptionsMenu.cpp | 253 + .../Common/UI/UIScene_SettingsOptionsMenu.h | 57 + .../Common/UI/UIScene_SettingsUIMenu.cpp | 183 + .../Common/UI/UIScene_SettingsUIMenu.h | 53 + .../Common/UI/UIScene_SignEntryMenu.cpp | 206 + Minecraft.Client/Common/UI/UIScene_SignEntryMenu.h | 58 + .../Common/UI/UIScene_SkinSelectMenu.cpp | 1798 + .../Common/UI/UIScene_SkinSelectMenu.h | 189 + .../Common/UI/UIScene_TeleportMenu.cpp | 344 + Minecraft.Client/Common/UI/UIScene_TeleportMenu.h | 51 + Minecraft.Client/Common/UI/UIScene_Timer.cpp | 32 + Minecraft.Client/Common/UI/UIScene_Timer.h | 28 + Minecraft.Client/Common/UI/UIScene_TradingMenu.cpp | 268 + Minecraft.Client/Common/UI/UIScene_TradingMenu.h | 78 + .../Common/UI/UIScene_TrialExitUpsell.cpp | 75 + .../Common/UI/UIScene_TrialExitUpsell.h | 31 + Minecraft.Client/Common/UI/UIStructs.h | 409 + Minecraft.Client/Common/UI/UITTFFont.cpp | 51 + Minecraft.Client/Common/UI/UITTFFont.h | 12 + .../Common/XUI/SlotProgressControl.cpp | 88 + Minecraft.Client/Common/XUI/SlotProgressControl.h | 18 + Minecraft.Client/Common/XUI/XUI_BasePlayer.cpp | 9 + Minecraft.Client/Common/XUI/XUI_BasePlayer.h | 13 + Minecraft.Client/Common/XUI/XUI_Chat.cpp | 71 + Minecraft.Client/Common/XUI/XUI_Chat.h | 59 + .../Common/XUI/XUI_ConnectingProgress.cpp | 216 + .../Common/XUI/XUI_ConnectingProgress.h | 55 + .../Common/XUI/XUI_Control_ComboBox.cpp | 98 + Minecraft.Client/Common/XUI/XUI_Control_ComboBox.h | 53 + Minecraft.Client/Common/XUI/XUI_Controls.h | 26 + Minecraft.Client/Common/XUI/XUI_Ctrl_4JEdit.cpp | 200 + Minecraft.Client/Common/XUI/XUI_Ctrl_4JEdit.h | 44 + Minecraft.Client/Common/XUI/XUI_Ctrl_4JIcon.cpp | 61 + Minecraft.Client/Common/XUI/XUI_Ctrl_4JIcon.h | 25 + Minecraft.Client/Common/XUI/XUI_Ctrl_4JList.cpp | 405 + Minecraft.Client/Common/XUI/XUI_Ctrl_4JList.h | 78 + .../Common/XUI/XUI_Ctrl_BrewProgress.cpp | 27 + .../Common/XUI/XUI_Ctrl_BrewProgress.h | 19 + .../Common/XUI/XUI_Ctrl_BubblesProgress.cpp | 52 + .../Common/XUI/XUI_Ctrl_BubblesProgress.h | 19 + .../Common/XUI/XUI_Ctrl_BurnProgress.cpp | 29 + .../Common/XUI/XUI_Ctrl_BurnProgress.h | 19 + .../Common/XUI/XUI_Ctrl_CraftIngredientSlot.cpp | 123 + .../Common/XUI/XUI_Ctrl_CraftIngredientSlot.h | 45 + .../Common/XUI/XUI_Ctrl_EnchantButton.cpp | 90 + .../Common/XUI/XUI_Ctrl_EnchantButton.h | 33 + .../Common/XUI/XUI_Ctrl_EnchantmentBook.cpp | 346 + .../Common/XUI/XUI_Ctrl_EnchantmentBook.h | 51 + .../Common/XUI/XUI_Ctrl_EnchantmentButtonText.cpp | 185 + .../Common/XUI/XUI_Ctrl_EnchantmentButtonText.h | 45 + .../Common/XUI/XUI_Ctrl_FireProgress.cpp | 29 + .../Common/XUI/XUI_Ctrl_FireProgress.h | 19 + .../Common/XUI/XUI_Ctrl_LoadingProgress.cpp | 21 + .../Common/XUI/XUI_Ctrl_LoadingProgress.h | 18 + .../Common/XUI/XUI_Ctrl_MinecraftPlayer.cpp | 190 + .../Common/XUI/XUI_Ctrl_MinecraftPlayer.h | 42 + .../Common/XUI/XUI_Ctrl_MinecraftSkinPreview.cpp | 551 + .../Common/XUI/XUI_Ctrl_MinecraftSkinPreview.h | 106 + .../Common/XUI/XUI_Ctrl_MinecraftSlot.cpp | 356 + .../Common/XUI/XUI_Ctrl_MinecraftSlot.h | 59 + Minecraft.Client/Common/XUI/XUI_Ctrl_MobEffect.cpp | 71 + Minecraft.Client/Common/XUI/XUI_Ctrl_MobEffect.h | 31 + .../Common/XUI/XUI_Ctrl_PassThroughList.cpp | 109 + .../Common/XUI/XUI_Ctrl_PassthroughList.h | 28 + .../Common/XUI/XUI_Ctrl_ProgressCtrlBase.cpp | 22 + .../Common/XUI/XUI_Ctrl_ProgressCtrlBase.h | 11 + .../Common/XUI/XUI_Ctrl_SliderWrapper.cpp | 174 + .../Common/XUI/XUI_Ctrl_SliderWrapper.h | 38 + Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItem.h | 37 + .../Common/XUI/XUI_Ctrl_SlotItemCtrlBase.cpp | 392 + .../Common/XUI/XUI_Ctrl_SlotItemCtrlBase.h | 78 + .../Common/XUI/XUI_Ctrl_SlotItemListItem.h | 38 + Minecraft.Client/Common/XUI/XUI_Ctrl_SlotList.cpp | 231 + Minecraft.Client/Common/XUI/XUI_Ctrl_SlotList.h | 73 + .../Common/XUI/XUI_Ctrl_SplashPulser.cpp | 94 + .../Common/XUI/XUI_Ctrl_SplashPulser.h | 36 + Minecraft.Client/Common/XUI/XUI_CustomMessages.h | 193 + Minecraft.Client/Common/XUI/XUI_DLCOffers.cpp | 886 + Minecraft.Client/Common/XUI/XUI_DLCOffers.h | 136 + Minecraft.Client/Common/XUI/XUI_Death.cpp | 242 + Minecraft.Client/Common/XUI/XUI_Death.h | 52 + Minecraft.Client/Common/XUI/XUI_Debug.h | 53 + .../Common/XUI/XUI_DebugItemEditor.cpp | 118 + Minecraft.Client/Common/XUI/XUI_DebugItemEditor.h | 57 + Minecraft.Client/Common/XUI/XUI_DebugOverlay.cpp | 391 + Minecraft.Client/Common/XUI/XUI_DebugOverlay.h | 72 + .../Common/XUI/XUI_DebugSchematicCreator.cpp | 178 + .../Common/XUI/XUI_DebugSchematicCreator.h | 49 + Minecraft.Client/Common/XUI/XUI_DebugSetCamera.cpp | 152 + Minecraft.Client/Common/XUI/XUI_DebugSetCamera.h | 54 + Minecraft.Client/Common/XUI/XUI_DebugTips.cpp | 73 + Minecraft.Client/Common/XUI/XUI_DebugTips.h | 38 + .../Common/XUI/XUI_FullscreenProgress.cpp | 375 + .../Common/XUI/XUI_FullscreenProgress.h | 68 + Minecraft.Client/Common/XUI/XUI_HUD.cpp | 464 + Minecraft.Client/Common/XUI/XUI_HUD.h | 129 + Minecraft.Client/Common/XUI/XUI_HelpAndOptions.cpp | 462 + Minecraft.Client/Common/XUI/XUI_HelpAndOptions.h | 70 + Minecraft.Client/Common/XUI/XUI_HelpControls.cpp | 566 + Minecraft.Client/Common/XUI/XUI_HelpControls.h | 115 + Minecraft.Client/Common/XUI/XUI_HelpCredits.cpp | 688 + Minecraft.Client/Common/XUI/XUI_HelpCredits.h | 73 + Minecraft.Client/Common/XUI/XUI_HelpHowToPlay.cpp | 238 + Minecraft.Client/Common/XUI/XUI_HelpHowToPlay.h | 217 + Minecraft.Client/Common/XUI/XUI_Helper.h | 38 + Minecraft.Client/Common/XUI/XUI_HowToPlayMenu.cpp | 232 + Minecraft.Client/Common/XUI/XUI_HowToPlayMenu.h | 76 + .../Common/XUI/XUI_InGameHostOptions.cpp | 150 + .../Common/XUI/XUI_InGameHostOptions.h | 45 + Minecraft.Client/Common/XUI/XUI_InGameInfo.cpp | 537 + Minecraft.Client/Common/XUI/XUI_InGameInfo.h | 84 + .../Common/XUI/XUI_InGamePlayerOptions.cpp | 499 + .../Common/XUI/XUI_InGamePlayerOptions.h | 96 + Minecraft.Client/Common/XUI/XUI_Intro.cpp | 153 + Minecraft.Client/Common/XUI/XUI_Intro.h | 44 + Minecraft.Client/Common/XUI/XUI_Leaderboards.cpp | 1202 + Minecraft.Client/Common/XUI/XUI_Leaderboards.h | 169 + Minecraft.Client/Common/XUI/XUI_LoadSettings.cpp | 1686 + Minecraft.Client/Common/XUI/XUI_LoadSettings.h | 154 + Minecraft.Client/Common/XUI/XUI_MainMenu.cpp | 1288 + Minecraft.Client/Common/XUI/XUI_MainMenu.h | 128 + .../Common/XUI/XUI_MultiGameCreate.cpp | 1397 + Minecraft.Client/Common/XUI/XUI_MultiGameCreate.h | 118 + Minecraft.Client/Common/XUI/XUI_MultiGameInfo.cpp | 392 + Minecraft.Client/Common/XUI/XUI_MultiGameInfo.h | 85 + .../Common/XUI/XUI_MultiGameJoinLoad.cpp | 2767 ++ .../Common/XUI/XUI_MultiGameJoinLoad.h | 168 + .../Common/XUI/XUI_MultiGameLaunchMoreOptions.cpp | 306 + .../Common/XUI/XUI_MultiGameLaunchMoreOptions.h | 75 + .../Common/XUI/XUI_NewUpdateMessage.cpp | 90 + Minecraft.Client/Common/XUI/XUI_NewUpdateMessage.h | 31 + .../Common/XUI/XUI_PartnernetPassword.cpp | 70 + .../Common/XUI/XUI_PartnernetPassword.h | 40 + Minecraft.Client/Common/XUI/XUI_PauseMenu.cpp | 1219 + Minecraft.Client/Common/XUI/XUI_PauseMenu.h | 89 + Minecraft.Client/Common/XUI/XUI_Reinstall.cpp | 339 + Minecraft.Client/Common/XUI/XUI_Reinstall.h | 63 + Minecraft.Client/Common/XUI/XUI_SaveMessage.cpp | 76 + Minecraft.Client/Common/XUI/XUI_SaveMessage.h | 36 + .../Common/XUI/XUI_Scene_AbstractContainer.cpp | 475 + .../Common/XUI/XUI_Scene_AbstractContainer.h | 83 + Minecraft.Client/Common/XUI/XUI_Scene_Anvil.cpp | 242 + Minecraft.Client/Common/XUI/XUI_Scene_Anvil.h | 88 + Minecraft.Client/Common/XUI/XUI_Scene_Base.cpp | 2243 + Minecraft.Client/Common/XUI/XUI_Scene_Base.h | 432 + .../Common/XUI/XUI_Scene_BrewingStand.cpp | 156 + .../Common/XUI/XUI_Scene_BrewingStand.h | 75 + .../Common/XUI/XUI_Scene_Container.cpp | 162 + Minecraft.Client/Common/XUI/XUI_Scene_Container.h | 57 + .../Common/XUI/XUI_Scene_CraftingPanel.cpp | 636 + .../Common/XUI/XUI_Scene_CraftingPanel.h | 205 + Minecraft.Client/Common/XUI/XUI_Scene_Enchant.cpp | 144 + Minecraft.Client/Common/XUI/XUI_Scene_Enchant.h | 78 + Minecraft.Client/Common/XUI/XUI_Scene_Furnace.cpp | 153 + Minecraft.Client/Common/XUI/XUI_Scene_Furnace.h | 79 + .../Common/XUI/XUI_Scene_Inventory.cpp | 234 + Minecraft.Client/Common/XUI/XUI_Scene_Inventory.h | 89 + .../Common/XUI/XUI_Scene_Inventory_Creative.cpp | 209 + .../Common/XUI/XUI_Scene_Inventory_Creative.h | 104 + Minecraft.Client/Common/XUI/XUI_Scene_Trading.cpp | 320 + Minecraft.Client/Common/XUI/XUI_Scene_Trading.h | 128 + Minecraft.Client/Common/XUI/XUI_Scene_Trap.cpp | 122 + Minecraft.Client/Common/XUI/XUI_Scene_Trap.h | 62 + Minecraft.Client/Common/XUI/XUI_Scene_Win.cpp | 302 + Minecraft.Client/Common/XUI/XUI_Scene_Win.h | 58 + Minecraft.Client/Common/XUI/XUI_SettingsAll.cpp | 227 + Minecraft.Client/Common/XUI/XUI_SettingsAll.h | 59 + Minecraft.Client/Common/XUI/XUI_SettingsAudio.cpp | 263 + Minecraft.Client/Common/XUI/XUI_SettingsAudio.h | 53 + .../Common/XUI/XUI_SettingsControl.cpp | 241 + Minecraft.Client/Common/XUI/XUI_SettingsControl.h | 52 + .../Common/XUI/XUI_SettingsGraphics.cpp | 333 + Minecraft.Client/Common/XUI/XUI_SettingsGraphics.h | 60 + .../Common/XUI/XUI_SettingsOptions.cpp | 508 + Minecraft.Client/Common/XUI/XUI_SettingsOptions.h | 67 + Minecraft.Client/Common/XUI/XUI_SettingsUI.cpp | 376 + Minecraft.Client/Common/XUI/XUI_SettingsUI.h | 65 + Minecraft.Client/Common/XUI/XUI_SignEntry.cpp | 113 + Minecraft.Client/Common/XUI/XUI_SignEntry.h | 49 + Minecraft.Client/Common/XUI/XUI_SkinSelect.cpp | 1444 + Minecraft.Client/Common/XUI/XUI_SkinSelect.h | 150 + Minecraft.Client/Common/XUI/XUI_SocialPost.cpp | 147 + Minecraft.Client/Common/XUI/XUI_SocialPost.h | 59 + Minecraft.Client/Common/XUI/XUI_Teleport.cpp | 312 + Minecraft.Client/Common/XUI/XUI_Teleport.h | 64 + Minecraft.Client/Common/XUI/XUI_TextEntry.cpp | 172 + Minecraft.Client/Common/XUI/XUI_TextEntry.h | 64 + .../Common/XUI/XUI_TransferToXboxOne.cpp | 569 + .../Common/XUI/XUI_TransferToXboxOne.h | 88 + .../Common/XUI/XUI_TrialExitUpsell.cpp | 136 + Minecraft.Client/Common/XUI/XUI_TrialExitUpsell.h | 46 + Minecraft.Client/Common/XUI/XUI_TutorialPopup.cpp | 603 + Minecraft.Client/Common/XUI/XUI_TutorialPopup.h | 78 + Minecraft.Client/Common/XUI/XUI_XZP_Icons.h | 20 + Minecraft.Client/Common/XUI/XUI_debug.cpp | 391 + .../Common/res/1_2_2/achievement/bg.png | Bin 0 -> 3636 bytes .../Common/res/1_2_2/achievement/icons.png | Bin 0 -> 1489 bytes .../Common/res/1_2_2/armor/chain_1.png | Bin 0 -> 964 bytes .../Common/res/1_2_2/armor/chain_2.png | Bin 0 -> 523 bytes .../Common/res/1_2_2/armor/cloth_1.png | Bin 0 -> 1139 bytes .../Common/res/1_2_2/armor/cloth_2.png | Bin 0 -> 710 bytes .../Common/res/1_2_2/armor/diamond_1.png | Bin 0 -> 1218 bytes .../Common/res/1_2_2/armor/diamond_2.png | Bin 0 -> 724 bytes Minecraft.Client/Common/res/1_2_2/armor/gold_1.png | Bin 0 -> 1198 bytes Minecraft.Client/Common/res/1_2_2/armor/gold_2.png | Bin 0 -> 708 bytes Minecraft.Client/Common/res/1_2_2/armor/iron_1.png | Bin 0 -> 1133 bytes Minecraft.Client/Common/res/1_2_2/armor/iron_2.png | Bin 0 -> 686 bytes Minecraft.Client/Common/res/1_2_2/armor/power.png | Bin 0 -> 1800 bytes Minecraft.Client/Common/res/1_2_2/art/kz.png | Bin 0 -> 78021 bytes .../Common/res/1_2_2/environment/clouds.png | Bin 0 -> 13711 bytes .../Common/res/1_2_2/environment/light_normal.png | Bin 0 -> 1207 bytes .../Common/res/1_2_2/environment/rain.png | Bin 0 -> 2540 bytes .../Common/res/1_2_2/environment/snow.png | Bin 0 -> 818 bytes .../Common/res/1_2_2/font/alternate.png | Bin 0 -> 1189 bytes Minecraft.Client/Common/res/1_2_2/font/default.png | Bin 0 -> 2817 bytes .../Common/res/1_2_2/font/glyph_00.png | Bin 0 -> 2509 bytes .../Common/res/1_2_2/font/glyph_01.png | Bin 0 -> 2417 bytes .../Common/res/1_2_2/font/glyph_02.png | Bin 0 -> 2240 bytes .../Common/res/1_2_2/font/glyph_03.png | Bin 0 -> 1996 bytes .../Common/res/1_2_2/font/glyph_04.png | Bin 0 -> 2395 bytes .../Common/res/1_2_2/font/glyph_05.png | Bin 0 -> 1924 bytes .../Common/res/1_2_2/font/glyph_06.png | Bin 0 -> 2583 bytes .../Common/res/1_2_2/font/glyph_07.png | Bin 0 -> 2515 bytes .../Common/res/1_2_2/font/glyph_09.png | Bin 0 -> 3694 bytes .../Common/res/1_2_2/font/glyph_0A.png | Bin 0 -> 2485 bytes .../Common/res/1_2_2/font/glyph_0B.png | Bin 0 -> 2610 bytes .../Common/res/1_2_2/font/glyph_0C.png | Bin 0 -> 2720 bytes .../Common/res/1_2_2/font/glyph_0D.png | Bin 0 -> 2954 bytes .../Common/res/1_2_2/font/glyph_0E.png | Bin 0 -> 1562 bytes .../Common/res/1_2_2/font/glyph_0F.png | Bin 0 -> 2513 bytes .../Common/res/1_2_2/font/glyph_10.png | Bin 0 -> 2799 bytes .../Common/res/1_2_2/font/glyph_11.png | Bin 0 -> 2108 bytes .../Common/res/1_2_2/font/glyph_12.png | Bin 0 -> 3095 bytes .../Common/res/1_2_2/font/glyph_13.png | Bin 0 -> 3034 bytes .../Common/res/1_2_2/font/glyph_14.png | Bin 0 -> 1741 bytes .../Common/res/1_2_2/font/glyph_15.png | Bin 0 -> 2291 bytes .../Common/res/1_2_2/font/glyph_16.png | Bin 0 -> 2510 bytes .../Common/res/1_2_2/font/glyph_17.png | Bin 0 -> 2875 bytes .../Common/res/1_2_2/font/glyph_18.png | Bin 0 -> 2099 bytes .../Common/res/1_2_2/font/glyph_19.png | Bin 0 -> 2723 bytes .../Common/res/1_2_2/font/glyph_1A.png | Bin 0 -> 635 bytes .../Common/res/1_2_2/font/glyph_1B.png | Bin 0 -> 2322 bytes .../Common/res/1_2_2/font/glyph_1C.png | Bin 0 -> 1593 bytes .../Common/res/1_2_2/font/glyph_1D.png | Bin 0 -> 2185 bytes .../Common/res/1_2_2/font/glyph_1E.png | Bin 0 -> 2114 bytes .../Common/res/1_2_2/font/glyph_1F.png | Bin 0 -> 1313 bytes .../Common/res/1_2_2/font/glyph_20.png | Bin 0 -> 2263 bytes .../Common/res/1_2_2/font/glyph_21.png | Bin 0 -> 2535 bytes .../Common/res/1_2_2/font/glyph_22.png | Bin 0 -> 2010 bytes .../Common/res/1_2_2/font/glyph_23.png | Bin 0 -> 2405 bytes .../Common/res/1_2_2/font/glyph_24.png | Bin 0 -> 2742 bytes .../Common/res/1_2_2/font/glyph_25.png | Bin 0 -> 1352 bytes .../Common/res/1_2_2/font/glyph_26.png | Bin 0 -> 2801 bytes .../Common/res/1_2_2/font/glyph_27.png | Bin 0 -> 3641 bytes .../Common/res/1_2_2/font/glyph_28.png | Bin 0 -> 425 bytes .../Common/res/1_2_2/font/glyph_29.png | Bin 0 -> 2906 bytes .../Common/res/1_2_2/font/glyph_2A.png | Bin 0 -> 2821 bytes .../Common/res/1_2_2/font/glyph_2B.png | Bin 0 -> 1163 bytes .../Common/res/1_2_2/font/glyph_2C.png | Bin 0 -> 2626 bytes .../Common/res/1_2_2/font/glyph_2D.png | Bin 0 -> 2480 bytes .../Common/res/1_2_2/font/glyph_2E.png | Bin 0 -> 2685 bytes .../Common/res/1_2_2/font/glyph_2F.png | Bin 0 -> 4446 bytes .../Common/res/1_2_2/font/glyph_30.png | Bin 0 -> 3802 bytes .../Common/res/1_2_2/font/glyph_31.png | Bin 0 -> 3254 bytes .../Common/res/1_2_2/font/glyph_32.png | Bin 0 -> 3493 bytes .../Common/res/1_2_2/font/glyph_33.png | Bin 0 -> 4617 bytes .../Common/res/1_2_2/font/glyph_34.png | Bin 0 -> 6178 bytes .../Common/res/1_2_2/font/glyph_35.png | Bin 0 -> 6340 bytes .../Common/res/1_2_2/font/glyph_36.png | Bin 0 -> 6506 bytes .../Common/res/1_2_2/font/glyph_37.png | Bin 0 -> 6238 bytes .../Common/res/1_2_2/font/glyph_38.png | Bin 0 -> 6370 bytes .../Common/res/1_2_2/font/glyph_39.png | Bin 0 -> 6495 bytes .../Common/res/1_2_2/font/glyph_3A.png | Bin 0 -> 6534 bytes .../Common/res/1_2_2/font/glyph_3B.png | Bin 0 -> 6650 bytes .../Common/res/1_2_2/font/glyph_3C.png | Bin 0 -> 6594 bytes .../Common/res/1_2_2/font/glyph_3D.png | Bin 0 -> 6921 bytes .../Common/res/1_2_2/font/glyph_3E.png | Bin 0 -> 6538 bytes .../Common/res/1_2_2/font/glyph_3F.png | Bin 0 -> 6413 bytes .../Common/res/1_2_2/font/glyph_40.png | Bin 0 -> 6468 bytes .../Common/res/1_2_2/font/glyph_41.png | Bin 0 -> 6031 bytes .../Common/res/1_2_2/font/glyph_42.png | Bin 0 -> 6266 bytes .../Common/res/1_2_2/font/glyph_43.png | Bin 0 -> 6509 bytes .../Common/res/1_2_2/font/glyph_44.png | Bin 0 -> 6004 bytes .../Common/res/1_2_2/font/glyph_45.png | Bin 0 -> 6425 bytes .../Common/res/1_2_2/font/glyph_46.png | Bin 0 -> 6487 bytes .../Common/res/1_2_2/font/glyph_47.png | Bin 0 -> 6561 bytes .../Common/res/1_2_2/font/glyph_48.png | Bin 0 -> 6524 bytes .../Common/res/1_2_2/font/glyph_49.png | Bin 0 -> 6514 bytes .../Common/res/1_2_2/font/glyph_4A.png | Bin 0 -> 6209 bytes .../Common/res/1_2_2/font/glyph_4B.png | Bin 0 -> 6356 bytes .../Common/res/1_2_2/font/glyph_4C.png | Bin 0 -> 6490 bytes .../Common/res/1_2_2/font/glyph_4D.png | Bin 0 -> 5119 bytes .../Common/res/1_2_2/font/glyph_4E.png | Bin 0 -> 4894 bytes .../Common/res/1_2_2/font/glyph_4F.png | Bin 0 -> 5773 bytes .../Common/res/1_2_2/font/glyph_50.png | Bin 0 -> 6337 bytes .../Common/res/1_2_2/font/glyph_51.png | Bin 0 -> 5876 bytes .../Common/res/1_2_2/font/glyph_52.png | Bin 0 -> 5773 bytes .../Common/res/1_2_2/font/glyph_53.png | Bin 0 -> 5295 bytes .../Common/res/1_2_2/font/glyph_54.png | Bin 0 -> 5572 bytes .../Common/res/1_2_2/font/glyph_55.png | Bin 0 -> 6268 bytes .../Common/res/1_2_2/font/glyph_56.png | Bin 0 -> 6551 bytes .../Common/res/1_2_2/font/glyph_57.png | Bin 0 -> 5636 bytes .../Common/res/1_2_2/font/glyph_58.png | Bin 0 -> 6327 bytes .../Common/res/1_2_2/font/glyph_59.png | Bin 0 -> 5634 bytes .../Common/res/1_2_2/font/glyph_5A.png | Bin 0 -> 6375 bytes .../Common/res/1_2_2/font/glyph_5B.png | Bin 0 -> 5943 bytes .../Common/res/1_2_2/font/glyph_5C.png | Bin 0 -> 5649 bytes .../Common/res/1_2_2/font/glyph_5D.png | Bin 0 -> 6364 bytes .../Common/res/1_2_2/font/glyph_5E.png | Bin 0 -> 5705 bytes .../Common/res/1_2_2/font/glyph_5F.png | Bin 0 -> 6033 bytes .../Common/res/1_2_2/font/glyph_60.png | Bin 0 -> 5920 bytes .../Common/res/1_2_2/font/glyph_61.png | Bin 0 -> 6706 bytes .../Common/res/1_2_2/font/glyph_62.png | Bin 0 -> 5846 bytes .../Common/res/1_2_2/font/glyph_63.png | Bin 0 -> 6196 bytes .../Common/res/1_2_2/font/glyph_64.png | Bin 0 -> 6741 bytes .../Common/res/1_2_2/font/glyph_65.png | Bin 0 -> 6402 bytes .../Common/res/1_2_2/font/glyph_66.png | Bin 0 -> 5994 bytes .../Common/res/1_2_2/font/glyph_67.png | Bin 0 -> 5757 bytes .../Common/res/1_2_2/font/glyph_68.png | Bin 0 -> 6117 bytes .../Common/res/1_2_2/font/glyph_69.png | Bin 0 -> 6431 bytes .../Common/res/1_2_2/font/glyph_6A.png | Bin 0 -> 6793 bytes .../Common/res/1_2_2/font/glyph_6B.png | Bin 0 -> 6556 bytes .../Common/res/1_2_2/font/glyph_6C.png | Bin 0 -> 5670 bytes .../Common/res/1_2_2/font/glyph_6D.png | Bin 0 -> 6029 bytes .../Common/res/1_2_2/font/glyph_6E.png | Bin 0 -> 6350 bytes .../Common/res/1_2_2/font/glyph_6F.png | Bin 0 -> 6621 bytes .../Common/res/1_2_2/font/glyph_70.png | Bin 0 -> 6667 bytes .../Common/res/1_2_2/font/glyph_71.png | Bin 0 -> 6597 bytes .../Common/res/1_2_2/font/glyph_72.png | Bin 0 -> 6518 bytes .../Common/res/1_2_2/font/glyph_73.png | Bin 0 -> 6385 bytes .../Common/res/1_2_2/font/glyph_74.png | Bin 0 -> 6435 bytes .../Common/res/1_2_2/font/glyph_75.png | Bin 0 -> 5731 bytes .../Common/res/1_2_2/font/glyph_76.png | Bin 0 -> 6109 bytes .../Common/res/1_2_2/font/glyph_77.png | Bin 0 -> 6110 bytes .../Common/res/1_2_2/font/glyph_78.png | Bin 0 -> 6167 bytes .../Common/res/1_2_2/font/glyph_79.png | Bin 0 -> 6278 bytes .../Common/res/1_2_2/font/glyph_7A.png | Bin 0 -> 6089 bytes .../Common/res/1_2_2/font/glyph_7B.png | Bin 0 -> 5345 bytes .../Common/res/1_2_2/font/glyph_7C.png | Bin 0 -> 6298 bytes .../Common/res/1_2_2/font/glyph_7D.png | Bin 0 -> 6087 bytes .../Common/res/1_2_2/font/glyph_7E.png | Bin 0 -> 6601 bytes .../Common/res/1_2_2/font/glyph_7F.png | Bin 0 -> 6291 bytes .../Common/res/1_2_2/font/glyph_80.png | Bin 0 -> 6020 bytes .../Common/res/1_2_2/font/glyph_81.png | Bin 0 -> 6199 bytes .../Common/res/1_2_2/font/glyph_82.png | Bin 0 -> 5367 bytes .../Common/res/1_2_2/font/glyph_83.png | Bin 0 -> 5187 bytes .../Common/res/1_2_2/font/glyph_84.png | Bin 0 -> 5717 bytes .../Common/res/1_2_2/font/glyph_85.png | Bin 0 -> 6038 bytes .../Common/res/1_2_2/font/glyph_86.png | Bin 0 -> 6176 bytes .../Common/res/1_2_2/font/glyph_87.png | Bin 0 -> 6657 bytes .../Common/res/1_2_2/font/glyph_88.png | Bin 0 -> 6436 bytes .../Common/res/1_2_2/font/glyph_89.png | Bin 0 -> 6725 bytes .../Common/res/1_2_2/font/glyph_8A.png | Bin 0 -> 5676 bytes .../Common/res/1_2_2/font/glyph_8B.png | Bin 0 -> 6352 bytes .../Common/res/1_2_2/font/glyph_8C.png | Bin 0 -> 6533 bytes .../Common/res/1_2_2/font/glyph_8D.png | Bin 0 -> 5974 bytes .../Common/res/1_2_2/font/glyph_8E.png | Bin 0 -> 6502 bytes .../Common/res/1_2_2/font/glyph_8F.png | Bin 0 -> 5825 bytes .../Common/res/1_2_2/font/glyph_90.png | Bin 0 -> 5943 bytes .../Common/res/1_2_2/font/glyph_91.png | Bin 0 -> 6168 bytes .../Common/res/1_2_2/font/glyph_92.png | Bin 0 -> 6046 bytes .../Common/res/1_2_2/font/glyph_93.png | Bin 0 -> 6711 bytes .../Common/res/1_2_2/font/glyph_94.png | Bin 0 -> 6631 bytes .../Common/res/1_2_2/font/glyph_95.png | Bin 0 -> 5482 bytes .../Common/res/1_2_2/font/glyph_96.png | Bin 0 -> 5947 bytes .../Common/res/1_2_2/font/glyph_97.png | Bin 0 -> 5926 bytes .../Common/res/1_2_2/font/glyph_98.png | Bin 0 -> 6146 bytes .../Common/res/1_2_2/font/glyph_99.png | Bin 0 -> 6394 bytes .../Common/res/1_2_2/font/glyph_9A.png | Bin 0 -> 6208 bytes .../Common/res/1_2_2/font/glyph_9B.png | Bin 0 -> 5985 bytes .../Common/res/1_2_2/font/glyph_9C.png | Bin 0 -> 6336 bytes .../Common/res/1_2_2/font/glyph_9D.png | Bin 0 -> 6131 bytes .../Common/res/1_2_2/font/glyph_9E.png | Bin 0 -> 6534 bytes .../Common/res/1_2_2/font/glyph_9F.png | Bin 0 -> 4898 bytes .../Common/res/1_2_2/font/glyph_A0.png | Bin 0 -> 3412 bytes .../Common/res/1_2_2/font/glyph_A1.png | Bin 0 -> 3702 bytes .../Common/res/1_2_2/font/glyph_A2.png | Bin 0 -> 3557 bytes .../Common/res/1_2_2/font/glyph_A3.png | Bin 0 -> 3569 bytes .../Common/res/1_2_2/font/glyph_A4.png | Bin 0 -> 2689 bytes .../Common/res/1_2_2/font/glyph_A5.png | Bin 0 -> 3346 bytes .../Common/res/1_2_2/font/glyph_A6.png | Bin 0 -> 1811 bytes .../Common/res/1_2_2/font/glyph_A7.png | Bin 0 -> 1639 bytes .../Common/res/1_2_2/font/glyph_A8.png | Bin 0 -> 2698 bytes .../Common/res/1_2_2/font/glyph_A9.png | Bin 0 -> 1209 bytes .../Common/res/1_2_2/font/glyph_AA.png | Bin 0 -> 1463 bytes .../Common/res/1_2_2/font/glyph_AB.png | Bin 0 -> 319 bytes .../Common/res/1_2_2/font/glyph_AC.png | Bin 0 -> 1411 bytes .../Common/res/1_2_2/font/glyph_AD.png | Bin 0 -> 1625 bytes .../Common/res/1_2_2/font/glyph_AE.png | Bin 0 -> 1472 bytes .../Common/res/1_2_2/font/glyph_AF.png | Bin 0 -> 1716 bytes .../Common/res/1_2_2/font/glyph_B0.png | Bin 0 -> 1604 bytes .../Common/res/1_2_2/font/glyph_B1.png | Bin 0 -> 1514 bytes .../Common/res/1_2_2/font/glyph_B2.png | Bin 0 -> 1522 bytes .../Common/res/1_2_2/font/glyph_B3.png | Bin 0 -> 1500 bytes .../Common/res/1_2_2/font/glyph_B4.png | Bin 0 -> 1583 bytes .../Common/res/1_2_2/font/glyph_B5.png | Bin 0 -> 1453 bytes .../Common/res/1_2_2/font/glyph_B6.png | Bin 0 -> 1685 bytes .../Common/res/1_2_2/font/glyph_B7.png | Bin 0 -> 1522 bytes .../Common/res/1_2_2/font/glyph_B8.png | Bin 0 -> 1765 bytes .../Common/res/1_2_2/font/glyph_B9.png | Bin 0 -> 1722 bytes .../Common/res/1_2_2/font/glyph_BA.png | Bin 0 -> 1603 bytes .../Common/res/1_2_2/font/glyph_BB.png | Bin 0 -> 1519 bytes .../Common/res/1_2_2/font/glyph_BC.png | Bin 0 -> 1359 bytes .../Common/res/1_2_2/font/glyph_BD.png | Bin 0 -> 1567 bytes .../Common/res/1_2_2/font/glyph_BE.png | Bin 0 -> 1536 bytes .../Common/res/1_2_2/font/glyph_BF.png | Bin 0 -> 1710 bytes .../Common/res/1_2_2/font/glyph_C0.png | Bin 0 -> 1768 bytes .../Common/res/1_2_2/font/glyph_C1.png | Bin 0 -> 1760 bytes .../Common/res/1_2_2/font/glyph_C2.png | Bin 0 -> 1638 bytes .../Common/res/1_2_2/font/glyph_C3.png | Bin 0 -> 1548 bytes .../Common/res/1_2_2/font/glyph_C4.png | Bin 0 -> 1628 bytes .../Common/res/1_2_2/font/glyph_C5.png | Bin 0 -> 1466 bytes .../Common/res/1_2_2/font/glyph_C6.png | Bin 0 -> 1647 bytes .../Common/res/1_2_2/font/glyph_C7.png | Bin 0 -> 1715 bytes .../Common/res/1_2_2/font/glyph_C8.png | Bin 0 -> 1734 bytes .../Common/res/1_2_2/font/glyph_C9.png | Bin 0 -> 1724 bytes .../Common/res/1_2_2/font/glyph_CA.png | Bin 0 -> 1784 bytes .../Common/res/1_2_2/font/glyph_CB.png | Bin 0 -> 1600 bytes .../Common/res/1_2_2/font/glyph_CC.png | Bin 0 -> 1585 bytes .../Common/res/1_2_2/font/glyph_CD.png | Bin 0 -> 1792 bytes .../Common/res/1_2_2/font/glyph_CE.png | Bin 0 -> 1711 bytes .../Common/res/1_2_2/font/glyph_CF.png | Bin 0 -> 1701 bytes .../Common/res/1_2_2/font/glyph_D0.png | Bin 0 -> 1646 bytes .../Common/res/1_2_2/font/glyph_D1.png | Bin 0 -> 1615 bytes .../Common/res/1_2_2/font/glyph_D2.png | Bin 0 -> 1535 bytes .../Common/res/1_2_2/font/glyph_D3.png | Bin 0 -> 1424 bytes .../Common/res/1_2_2/font/glyph_D4.png | Bin 0 -> 1643 bytes .../Common/res/1_2_2/font/glyph_D5.png | Bin 0 -> 1641 bytes .../Common/res/1_2_2/font/glyph_D6.png | Bin 0 -> 1910 bytes .../Common/res/1_2_2/font/glyph_D7.png | Bin 0 -> 1439 bytes .../Common/res/1_2_2/font/glyph_F9.png | Bin 0 -> 6766 bytes .../Common/res/1_2_2/font/glyph_FA.png | Bin 0 -> 5604 bytes .../Common/res/1_2_2/font/glyph_FB.png | Bin 0 -> 1713 bytes .../Common/res/1_2_2/font/glyph_FC.png | Bin 0 -> 2445 bytes .../Common/res/1_2_2/font/glyph_FD.png | Bin 0 -> 2730 bytes .../Common/res/1_2_2/font/glyph_FE.png | Bin 0 -> 1884 bytes .../Common/res/1_2_2/font/glyph_FF.png | Bin 0 -> 2822 bytes .../Common/res/1_2_2/font/glyph_sizes.bin | Bin 0 -> 65536 bytes Minecraft.Client/Common/res/1_2_2/gui/alchemy.png | Bin 0 -> 1682 bytes Minecraft.Client/Common/res/1_2_2/gui/allitems.png | Bin 0 -> 2055 bytes .../Common/res/1_2_2/gui/background.png | Bin 0 -> 1011 bytes .../Common/res/1_2_2/gui/container.png | Bin 0 -> 2795 bytes Minecraft.Client/Common/res/1_2_2/gui/crafting.png | Bin 0 -> 2756 bytes .../Common/res/1_2_2/gui/crash_logo.png | Bin 0 -> 4981 bytes Minecraft.Client/Common/res/1_2_2/gui/enchant.png | Bin 0 -> 3010 bytes Minecraft.Client/Common/res/1_2_2/gui/furnace.png | Bin 0 -> 1520 bytes Minecraft.Client/Common/res/1_2_2/gui/gui.png | Bin 0 -> 17421 bytes Minecraft.Client/Common/res/1_2_2/gui/icons.png | Bin 0 -> 6311 bytes .../Common/res/1_2_2/gui/inventory.png | Bin 0 -> 7211 bytes Minecraft.Client/Common/res/1_2_2/gui/items.png | Bin 0 -> 29730 bytes .../Common/res/1_2_2/gui/particles.png | Bin 0 -> 1992 bytes Minecraft.Client/Common/res/1_2_2/gui/slot.png | Bin 0 -> 2699 bytes Minecraft.Client/Common/res/1_2_2/gui/trap.png | Bin 0 -> 2121 bytes .../Common/res/1_2_2/gui/unknown_pack.png | Bin 0 -> 13013 bytes Minecraft.Client/Common/res/1_2_2/item/arrows.png | Bin 0 -> 322 bytes Minecraft.Client/Common/res/1_2_2/item/boat.png | Bin 0 -> 2389 bytes Minecraft.Client/Common/res/1_2_2/item/book.png | Bin 0 -> 1105 bytes Minecraft.Client/Common/res/1_2_2/item/cart.png | Bin 0 -> 2945 bytes Minecraft.Client/Common/res/1_2_2/item/chest.png | Bin 0 -> 1339 bytes Minecraft.Client/Common/res/1_2_2/item/door.png | Bin 0 -> 1029 bytes .../Common/res/1_2_2/item/largechest.png | Bin 0 -> 1865 bytes Minecraft.Client/Common/res/1_2_2/item/sign.png | Bin 0 -> 1260 bytes Minecraft.Client/Common/res/1_2_2/item/xporb.png | Bin 0 -> 1096 bytes Minecraft.Client/Common/res/1_2_2/misc/dial.png | Bin 0 -> 231 bytes .../Common/res/1_2_2/misc/explosion.png | Bin 0 -> 2105 bytes .../Common/res/1_2_2/misc/foliagecolor.png | Bin 0 -> 17693 bytes .../Common/res/1_2_2/misc/footprint.png | Bin 0 -> 946 bytes Minecraft.Client/Common/res/1_2_2/misc/glint.png | Bin 0 -> 1042 bytes .../Common/res/1_2_2/misc/grasscolor.png | Bin 0 -> 25237 bytes Minecraft.Client/Common/res/1_2_2/misc/mapbg.png | Bin 0 -> 1538 bytes .../Common/res/1_2_2/misc/mapicons.png | Bin 0 -> 1062 bytes .../Common/res/1_2_2/misc/particlefield.png | Bin 0 -> 12227 bytes .../Common/res/1_2_2/misc/pumpkinblur.png | Bin 0 -> 42123 bytes Minecraft.Client/Common/res/1_2_2/misc/shadow.png | Bin 0 -> 868 bytes Minecraft.Client/Common/res/1_2_2/misc/tunnel.png | Bin 0 -> 44404 bytes .../Common/res/1_2_2/misc/vignette.png | Bin 0 -> 24157 bytes Minecraft.Client/Common/res/1_2_2/misc/water.png | Bin 0 -> 306 bytes .../Common/res/1_2_2/misc/watercolor.png | Bin 0 -> 5446 bytes .../Common/res/1_2_2/mob/cat_black.png | Bin 0 -> 1399 bytes Minecraft.Client/Common/res/1_2_2/mob/cat_red.png | Bin 0 -> 2043 bytes .../Common/res/1_2_2/mob/cat_siamese.png | Bin 0 -> 2717 bytes .../Common/res/1_2_2/mob/cavespider.png | Bin 0 -> 3396 bytes Minecraft.Client/Common/res/1_2_2/mob/char.png | Bin 0 -> 1360 bytes Minecraft.Client/Common/res/1_2_2/mob/chicken.png | Bin 0 -> 492 bytes Minecraft.Client/Common/res/1_2_2/mob/cow.png | Bin 0 -> 1954 bytes Minecraft.Client/Common/res/1_2_2/mob/creeper.png | Bin 0 -> 3000 bytes .../Common/res/1_2_2/mob/enderdragon/beam.png | Bin 0 -> 2116 bytes .../Common/res/1_2_2/mob/enderdragon/body.png | Bin 0 -> 7720 bytes .../Common/res/1_2_2/mob/enderdragon/crystal.png | Bin 0 -> 3321 bytes .../Common/res/1_2_2/mob/enderdragon/dragon.png | Bin 0 -> 10791 bytes .../Common/res/1_2_2/mob/enderdragon/ender.png | Bin 0 -> 7956 bytes .../res/1_2_2/mob/enderdragon/ender_eyes.png | Bin 0 -> 1964 bytes .../Common/res/1_2_2/mob/enderdragon/shuffle.png | Bin 0 -> 50180 bytes Minecraft.Client/Common/res/1_2_2/mob/enderman.png | Bin 0 -> 737 bytes .../Common/res/1_2_2/mob/enderman_eyes.png | Bin 0 -> 1242 bytes Minecraft.Client/Common/res/1_2_2/mob/fire.png | Bin 0 -> 3328 bytes Minecraft.Client/Common/res/1_2_2/mob/ghast.png | Bin 0 -> 896 bytes .../Common/res/1_2_2/mob/ghast_fire.png | Bin 0 -> 943 bytes Minecraft.Client/Common/res/1_2_2/mob/lava.png | Bin 0 -> 1457 bytes Minecraft.Client/Common/res/1_2_2/mob/ozelot.png | Bin 0 -> 3121 bytes Minecraft.Client/Common/res/1_2_2/mob/pig.png | Bin 0 -> 3305 bytes Minecraft.Client/Common/res/1_2_2/mob/pigman.png | Bin 0 -> 2662 bytes .../Common/res/1_2_2/mob/pigzombie.png | Bin 0 -> 3013 bytes Minecraft.Client/Common/res/1_2_2/mob/redcow.png | Bin 0 -> 1605 bytes Minecraft.Client/Common/res/1_2_2/mob/saddle.png | Bin 0 -> 379 bytes Minecraft.Client/Common/res/1_2_2/mob/sheep.png | Bin 0 -> 3119 bytes .../Common/res/1_2_2/mob/sheep_fur.png | Bin 0 -> 1661 bytes .../Common/res/1_2_2/mob/silverfish.png | Bin 0 -> 1782 bytes Minecraft.Client/Common/res/1_2_2/mob/skeleton.png | Bin 0 -> 894 bytes Minecraft.Client/Common/res/1_2_2/mob/slime.png | Bin 0 -> 633 bytes Minecraft.Client/Common/res/1_2_2/mob/snowman.png | Bin 0 -> 1799 bytes Minecraft.Client/Common/res/1_2_2/mob/spider.png | Bin 0 -> 2554 bytes .../Common/res/1_2_2/mob/spider_eyes.png | Bin 0 -> 255 bytes Minecraft.Client/Common/res/1_2_2/mob/squid.png | Bin 0 -> 918 bytes Minecraft.Client/Common/res/1_2_2/mob/villager.png | Bin 0 -> 2092 bytes .../Common/res/1_2_2/mob/villager/butcher.png | Bin 0 -> 1877 bytes .../Common/res/1_2_2/mob/villager/farmer.png | Bin 0 -> 1971 bytes .../Common/res/1_2_2/mob/villager/librarian.png | Bin 0 -> 2093 bytes .../Common/res/1_2_2/mob/villager/priest.png | Bin 0 -> 2093 bytes .../Common/res/1_2_2/mob/villager/smith.png | Bin 0 -> 1877 bytes .../Common/res/1_2_2/mob/villager/villager.png | Bin 0 -> 2093 bytes .../Common/res/1_2_2/mob/villager_golem.png | Bin 0 -> 7871 bytes Minecraft.Client/Common/res/1_2_2/mob/wolf.png | Bin 0 -> 4365 bytes .../Common/res/1_2_2/mob/wolf_angry.png | Bin 0 -> 3223 bytes .../Common/res/1_2_2/mob/wolf_tame.png | Bin 0 -> 4391 bytes Minecraft.Client/Common/res/1_2_2/mob/zombie.png | Bin 0 -> 1847 bytes Minecraft.Client/Common/res/1_2_2/pack.png | Bin 0 -> 27267 bytes Minecraft.Client/Common/res/1_2_2/pack.txt | 2 + Minecraft.Client/Common/res/1_2_2/particles.png | Bin 0 -> 1913 bytes Minecraft.Client/Common/res/1_2_2/terrain.png | Bin 0 -> 86269 bytes Minecraft.Client/Common/res/1_2_2/terrain/moon.png | Bin 0 -> 910 bytes .../Common/res/1_2_2/terrain/moon_phases.png | Bin 0 -> 1569 bytes Minecraft.Client/Common/res/1_2_2/terrain/sun.png | Bin 0 -> 713 bytes .../Common/res/1_2_2/title/bg/panorama0.png | Bin 0 -> 64756 bytes .../Common/res/1_2_2/title/bg/panorama1.png | Bin 0 -> 67021 bytes .../Common/res/1_2_2/title/bg/panorama2.png | Bin 0 -> 49292 bytes .../Common/res/1_2_2/title/bg/panorama3.png | Bin 0 -> 71279 bytes .../Common/res/1_2_2/title/bg/panorama4.png | Bin 0 -> 2514 bytes .../Common/res/1_2_2/title/bg/panorama5.png | Bin 0 -> 52916 bytes Minecraft.Client/Common/res/1_2_2/title/black.png | Bin 0 -> 174 bytes .../Common/res/1_2_2/title/credits.txt | 57 + .../Common/res/1_2_2/title/earlyplayers.txt | 722 + Minecraft.Client/Common/res/1_2_2/title/mclogo.png | Bin 0 -> 5213 bytes Minecraft.Client/Common/res/1_2_2/title/mojang.png | Bin 0 -> 7706 bytes .../Common/res/1_2_2/title/splashes.txt | 304 + Minecraft.Client/Common/res/1_2_2/title/win.txt | 151 + .../res/TitleUpdate/DLC/Candy/Data/TexturePack.xzp | Bin 0 -> 3590769 bytes .../res/TitleUpdate/DLC/Candy/Data/x16Data.pck | Bin 0 -> 869992 bytes .../res/TitleUpdate/DLC/City/Data/TexturePack.xzp | Bin 0 -> 4060458 bytes .../res/TitleUpdate/DLC/City/Data/x32Data.pck | Bin 0 -> 2636993 bytes .../TitleUpdate/DLC/Fantasy/Data/TexturePack.xzp | Bin 0 -> 4777159 bytes .../res/TitleUpdate/DLC/Fantasy/Data/x32Data.pck | Bin 0 -> 2527182 bytes .../TitleUpdate/DLC/Halloween/Data/TexturePack.xzp | Bin 0 -> 3705530 bytes .../res/TitleUpdate/DLC/Halloween/Data/x16Data.pck | Bin 0 -> 786598 bytes .../res/TitleUpdate/DLC/Halo/Data/GameRules.grf | Bin 0 -> 503 bytes .../res/TitleUpdate/DLC/Halo/Data/TexturePack.xzp | Bin 0 -> 4123875 bytes .../res/TitleUpdate/DLC/Halo/Data/x16Data.pck | Bin 0 -> 967988 bytes .../res/TitleUpdate/DLC/Halo/TexturePack.pck | Bin 0 -> 217553 bytes .../TitleUpdate/DLC/MassEffect/Data/GameRules.grf | Bin 0 -> 343 bytes .../DLC/MassEffect/Data/TexturePack.xzp | Bin 0 -> 3022739 bytes .../TitleUpdate/DLC/MassEffect/Data/masseffect.mcs | Bin 0 -> 3485486 bytes .../TitleUpdate/DLC/MassEffect/Data/x16Data.pck | Bin 0 -> 733891 bytes .../res/TitleUpdate/DLC/MassEffect/TexturePack.pck | Bin 0 -> 176514 bytes .../TitleUpdate/DLC/Natural/Data/TexturePack.xzp | Bin 0 -> 4166364 bytes .../res/TitleUpdate/DLC/Natural/Data/x32Data.pck | Bin 0 -> 2894225 bytes .../TitleUpdate/DLC/Plastic/Data/TexturePack.xzp | Bin 0 -> 2607406 bytes .../res/TitleUpdate/DLC/Plastic/Data/x16Data.pck | Bin 0 -> 567845 bytes .../res/TitleUpdate/DLC/Skyrim/Data/GameRules.grf | Bin 0 -> 505 bytes .../TitleUpdate/DLC/Skyrim/Data/TexturePack.xzp | Bin 0 -> 3413075 bytes .../res/TitleUpdate/DLC/Skyrim/Data/x16Data.pck | Bin 0 -> 996979 bytes .../res/TitleUpdate/DLC/Skyrim/TexturePack.pck | Bin 0 -> 181667 bytes .../TitleUpdate/GameRules/BuildOnly/BuildAll.cmd | 10 + .../GameRules/BuildOnly/BuildGameRule.cmd | 19 + .../GameRules/BuildOnly/BuildGameRule_Durango.cmd | 28 + .../GameRules/BuildOnly/BuildGameRule_Orbis.cmd | 28 + .../GameRules/BuildOnly/BuildGameRule_PS3.cmd | 28 + .../GameRules/BuildOnly/BuildGameRule_PSVita.cmd | 28 + .../BuildOnly/BuildGameRule_Windows64.cmd | 28 + .../GameRules/BuildOnly/BuildGameRule_Xbox.cmd | 28 + .../TitleUpdate/GameRules/BuildOnly/GameRules.sln | 30 + .../GameRules/BuildOnly/GameRules.vcxproj | 103 + .../GameRules/BuildOnly/GameRules.vcxproj.filters | 114 + .../GameRules/BuildOnly/GameRules.vcxproj.vspscc | 10 + .../GameRules/BuildOnly/GameRulesDefinition.xsd | 2848 ++ .../GameRules/BuildOnly/Tutorial/GameRules.grf | Bin 0 -> 97468 bytes .../GameRules/BuildOnly/Tutorial/GameRules.grh | Bin 0 -> 267 bytes .../GameRules/BuildOnly/Tutorial/GameRules.xml | Bin 0 -> 45442 bytes .../Tutorial/Strings/Microsoft/de-DE.lang | 4 + .../Tutorial/Strings/Microsoft/es-ES.lang | 5 + .../Tutorial/Strings/Microsoft/fr-FR.lang | 4 + .../Tutorial/Strings/Microsoft/it-IT.lang | 4 + .../Tutorial/Strings/Microsoft/ja-JP.lang | 4 + .../Tutorial/Strings/Microsoft/ko-KR.lang | 4 + .../Tutorial/Strings/Microsoft/pt-BR.lang | 4 + .../Tutorial/Strings/Microsoft/pt-PT.lang | 4 + .../Tutorial/Strings/Microsoft/zh-CHT.lang | 4 + .../BuildOnly/Tutorial/Strings/en-EN.lang | 5 + .../Tutorial/Strings_Durango/Microsoft/de-DE.lang | 4 + .../Tutorial/Strings_Durango/Microsoft/es-ES.lang | 5 + .../Tutorial/Strings_Durango/Microsoft/fr-FR.lang | 4 + .../Tutorial/Strings_Durango/Microsoft/it-IT.lang | 4 + .../Tutorial/Strings_Durango/Microsoft/ja-JP.lang | 4 + .../Tutorial/Strings_Durango/Microsoft/ko-KR.lang | 4 + .../Tutorial/Strings_Durango/Microsoft/pt-BR.lang | 4 + .../Tutorial/Strings_Durango/Microsoft/pt-PT.lang | 4 + .../Tutorial/Strings_Durango/Microsoft/zh-CHT.lang | 4 + .../BuildOnly/Tutorial/Strings_Durango/en-EN.lang | 5 + .../Tutorial/Strings_Orbis/Sony/da-DA.lang | 6 + .../Tutorial/Strings_Orbis/Sony/de-DE.lang | 4 + .../Tutorial/Strings_Orbis/Sony/es-ES.lang | 5 + .../Tutorial/Strings_Orbis/Sony/fi-FI.lang | 6 + .../Tutorial/Strings_Orbis/Sony/fr-FR.lang | 4 + .../Tutorial/Strings_Orbis/Sony/it-IT.lang | 4 + .../Tutorial/Strings_Orbis/Sony/ja-JP.lang | 4 + .../Tutorial/Strings_Orbis/Sony/ko-KR.lang | 4 + .../Tutorial/Strings_Orbis/Sony/la-LAS.lang | 6 + .../Tutorial/Strings_Orbis/Sony/nl-NL.lang | 6 + .../Tutorial/Strings_Orbis/Sony/no-NO.lang | 6 + .../Tutorial/Strings_Orbis/Sony/pl-PL.lang | 6 + .../Tutorial/Strings_Orbis/Sony/pt-BR.lang | 4 + .../Tutorial/Strings_Orbis/Sony/pt-PT.lang | 4 + .../Tutorial/Strings_Orbis/Sony/ru-RU.lang | 5 + .../Tutorial/Strings_Orbis/Sony/sv-SV.lang | 6 + .../Tutorial/Strings_Orbis/Sony/tr-TR.lang | 6 + .../Tutorial/Strings_Orbis/Sony/zh-CHT.lang | 4 + .../BuildOnly/Tutorial/Strings_Orbis/en-EN.lang | 5 + .../BuildOnly/Tutorial/Strings_PS3/Sony/da-DA.lang | 6 + .../BuildOnly/Tutorial/Strings_PS3/Sony/de-DE.lang | 4 + .../BuildOnly/Tutorial/Strings_PS3/Sony/es-ES.lang | 5 + .../BuildOnly/Tutorial/Strings_PS3/Sony/fi-FI.lang | 6 + .../BuildOnly/Tutorial/Strings_PS3/Sony/fr-FR.lang | 4 + .../BuildOnly/Tutorial/Strings_PS3/Sony/it-IT.lang | 4 + .../BuildOnly/Tutorial/Strings_PS3/Sony/ja-JP.lang | 4 + .../BuildOnly/Tutorial/Strings_PS3/Sony/ko-KR.lang | 4 + .../Tutorial/Strings_PS3/Sony/la-LAS.lang | 6 + .../BuildOnly/Tutorial/Strings_PS3/Sony/nl-NL.lang | 6 + .../BuildOnly/Tutorial/Strings_PS3/Sony/no-NO.lang | 6 + .../BuildOnly/Tutorial/Strings_PS3/Sony/pl-PL.lang | 6 + .../BuildOnly/Tutorial/Strings_PS3/Sony/pt-BR.lang | 4 + .../BuildOnly/Tutorial/Strings_PS3/Sony/pt-PT.lang | 4 + .../BuildOnly/Tutorial/Strings_PS3/Sony/ru-RU.lang | 5 + .../BuildOnly/Tutorial/Strings_PS3/Sony/sv-SV.lang | 6 + .../BuildOnly/Tutorial/Strings_PS3/Sony/tr-TR.lang | 6 + .../Tutorial/Strings_PS3/Sony/zh-CHT.lang | 4 + .../BuildOnly/Tutorial/Strings_PS3/en-EN.lang | 5 + .../Tutorial/Strings_PSVita/Sony/da-DA.lang | 6 + .../Tutorial/Strings_PSVita/Sony/de-DE.lang | 4 + .../Tutorial/Strings_PSVita/Sony/es-ES.lang | 5 + .../Tutorial/Strings_PSVita/Sony/fi-FI.lang | 6 + .../Tutorial/Strings_PSVita/Sony/fr-FR.lang | 4 + .../Tutorial/Strings_PSVita/Sony/it-IT.lang | 4 + .../Tutorial/Strings_PSVita/Sony/ja-JP.lang | 4 + .../Tutorial/Strings_PSVita/Sony/ko-KR.lang | 4 + .../Tutorial/Strings_PSVita/Sony/la-LAS.lang | 6 + .../Tutorial/Strings_PSVita/Sony/nl-NL.lang | 6 + .../Tutorial/Strings_PSVita/Sony/no-NO.lang | 6 + .../Tutorial/Strings_PSVita/Sony/pl-PL.lang | 6 + .../Tutorial/Strings_PSVita/Sony/pt-BR.lang | 4 + .../Tutorial/Strings_PSVita/Sony/pt-PT.lang | 4 + .../Tutorial/Strings_PSVita/Sony/ru-RU.lang | 5 + .../Tutorial/Strings_PSVita/Sony/sv-SV.lang | 6 + .../Tutorial/Strings_PSVita/Sony/tr-TR.lang | 6 + .../Tutorial/Strings_PSVita/Sony/zh-CHT.lang | 4 + .../BuildOnly/Tutorial/Strings_PSVita/en-EN.lang | 5 + .../Tutorial/Strings_Win64/Microsoft/de-DE.lang | 4 + .../Tutorial/Strings_Win64/Microsoft/es-ES.lang | 5 + .../Tutorial/Strings_Win64/Microsoft/fr-FR.lang | 4 + .../Tutorial/Strings_Win64/Microsoft/it-IT.lang | 4 + .../Tutorial/Strings_Win64/Microsoft/ja-JP.lang | 4 + .../Tutorial/Strings_Win64/Microsoft/ko-KR.lang | 4 + .../Tutorial/Strings_Win64/Microsoft/pt-BR.lang | 4 + .../Tutorial/Strings_Win64/Microsoft/pt-PT.lang | 4 + .../Tutorial/Strings_Win64/Microsoft/zh-CHT.lang | 4 + .../BuildOnly/Tutorial/Strings_Win64/en-EN.lang | 5 + .../Tutorial/Strings_Xbox360/Microsoft/de-DE.lang | 4 + .../Tutorial/Strings_Xbox360/Microsoft/es-ES.lang | 5 + .../Tutorial/Strings_Xbox360/Microsoft/fr-FR.lang | 4 + .../Tutorial/Strings_Xbox360/Microsoft/it-IT.lang | 4 + .../Tutorial/Strings_Xbox360/Microsoft/ja-JP.lang | 4 + .../Tutorial/Strings_Xbox360/Microsoft/ko-KR.lang | 4 + .../Tutorial/Strings_Xbox360/Microsoft/pt-BR.lang | 4 + .../Tutorial/Strings_Xbox360/Microsoft/pt-PT.lang | 4 + .../Tutorial/Strings_Xbox360/Microsoft/zh-CHT.lang | 4 + .../BuildOnly/Tutorial/Strings_Xbox360/en-EN.lang | 5 + .../GameRules/BuildOnly/Tutorial/Tutorial.pck | Bin 0 -> 99710 bytes .../GameRules/BuildOnly/Tutorial/Tutorial.xml | Bin 0 -> 1304 bytes .../GameRules/BuildOnly/Tutorial/languages.loc | Bin 0 -> 2138 bytes .../BuildOnly/Tutorial/schematics/Boat.sch | Bin 0 -> 2099 bytes .../BuildOnly/Tutorial/schematics/CasTes1.sch | Bin 0 -> 37085 bytes .../BuildOnly/Tutorial/schematics/CasTes2.sch | Bin 0 -> 49504 bytes .../BuildOnly/Tutorial/schematics/JungleTemp.sch | Bin 0 -> 1836 bytes .../BuildOnly/Tutorial/schematics/Lava.sch | Bin 0 -> 732 bytes .../Tutorial/schematics/MinecraftSign.sch | Bin 0 -> 711 bytes .../BuildOnly/Tutorial/schematics/Mushroom.sch | Bin 0 -> 1272 bytes .../BuildOnly/Tutorial/schematics/PillarHouse.sch | Bin 0 -> 1831 bytes .../BuildOnly/Tutorial/schematics/Pyramid.sch | Bin 0 -> 2327 bytes .../BuildOnly/Tutorial/schematics/RuinedHouse.sch | Bin 0 -> 1391 bytes .../BuildOnly/Tutorial/schematics/Ship.sch | Bin 0 -> 784 bytes .../BuildOnly/Tutorial/schematics/Smithy.sch | Bin 0 -> 571 bytes .../BuildOnly/Tutorial/schematics/SnowHouse.sch | Bin 0 -> 603 bytes .../BuildOnly/Tutorial/schematics/Spider.sch | Bin 0 -> 946 bytes .../BuildOnly/Tutorial/schematics/Stairs.sch | Bin 0 -> 246 bytes .../BuildOnly/Tutorial/schematics/StoneCircle.sch | Bin 0 -> 738 bytes .../BuildOnly/Tutorial/schematics/StoneTemp.sch | Bin 0 -> 2857 bytes .../BuildOnly/Tutorial/schematics/Tower.sch | Bin 0 -> 832 bytes .../BuildOnly/Tutorial/schematics/UWChamber.sch | Bin 0 -> 659 bytes .../TitleUpdate/GameRules/BuildOnly/launchCMD.cmd | 1 + .../Common/res/TitleUpdate/GameRules/Tutorial.pck | Bin 0 -> 90648 bytes .../res/TitleUpdate/GameRules/Tutorial_Durango.pck | Bin 0 -> 98687 bytes .../res/TitleUpdate/GameRules/Tutorial_Orbis.pck | Bin 0 -> 99710 bytes .../res/TitleUpdate/audio/AdditionalMusic.xwb | Bin 0 -> 30693376 bytes .../Common/res/TitleUpdate/audio/Minecraft.xgs | Bin 0 -> 488 bytes .../Common/res/TitleUpdate/audio/additional.xsb | Bin 0 -> 3047 bytes .../Common/res/TitleUpdate/audio/additional.xwb | Bin 0 -> 1226752 bytes .../Common/res/TitleUpdate/audio/minecraft.xsb | Bin 0 -> 9468 bytes .../Common/res/TitleUpdate/res/armor/cloth_1.png | Bin 0 -> 1712 bytes .../Common/res/TitleUpdate/res/armor/cloth_1_b.png | Bin 0 -> 1688 bytes .../Common/res/TitleUpdate/res/armor/cloth_2.png | Bin 0 -> 868 bytes .../Common/res/TitleUpdate/res/armor/cloth_2_b.png | Bin 0 -> 835 bytes .../Common/res/TitleUpdate/res/armor/power.png | Bin 0 -> 1800 bytes .../Common/res/TitleUpdate/res/art/kz.png | Bin 0 -> 80612 bytes .../Common/res/TitleUpdate/res/colours.col | Bin 0 -> 5258 bytes .../Common/res/TitleUpdate/res/colours.xml | 283 + .../Common/res/TitleUpdate/res/font/Default.png | Bin 0 -> 4343 bytes .../res/TitleUpdate/res/font/Mojangles_11.png | Bin 0 -> 7024 bytes .../res/TitleUpdate/res/font/Mojangles_7.png | Bin 0 -> 5322 bytes .../Common/res/TitleUpdate/res/item/book.png | Bin 0 -> 571 bytes .../Common/res/TitleUpdate/res/item/enderchest.png | Bin 0 -> 2526 bytes .../Common/res/TitleUpdate/res/items.png | Bin 0 -> 121590 bytes .../TitleUpdate/res/misc/additionalmapicons.png | Bin 0 -> 352 bytes .../Common/res/TitleUpdate/res/misc/explosion.png | Bin 0 -> 1614 bytes .../Common/res/TitleUpdate/res/misc/footprint.png | Bin 0 -> 151 bytes .../Common/res/TitleUpdate/res/misc/glint.png | Bin 0 -> 418 bytes .../Common/res/TitleUpdate/res/misc/mapicons.png | Bin 0 -> 723 bytes .../res/TitleUpdate/res/misc/particlefield.png | Bin 0 -> 23124 bytes .../Common/res/TitleUpdate/res/misc/tunnel.png | Bin 0 -> 43306 bytes .../res/TitleUpdate/res/mob/enderdragon/beam.png | Bin 0 -> 3542 bytes .../res/TitleUpdate/res/mob/enderdragon/ender.png | Bin 0 -> 10990 bytes .../TitleUpdate/res/mob/enderdragon/ender_eyes.png | Bin 0 -> 541 bytes .../res/TitleUpdate/res/mob/enderman_eyes.png | Bin 0 -> 213 bytes .../Common/res/TitleUpdate/res/mob/redcow.png | Bin 0 -> 1956 bytes .../res/TitleUpdate/res/mob/skeleton_wither.png | Bin 0 -> 1403 bytes .../Common/res/TitleUpdate/res/mob/snowman.png | Bin 0 -> 1081 bytes .../res/TitleUpdate/res/mob/villager/butcher.png | Bin 0 -> 1390 bytes .../res/TitleUpdate/res/mob/villager/farmer.png | Bin 0 -> 1655 bytes .../res/TitleUpdate/res/mob/villager/librarian.png | Bin 0 -> 1935 bytes .../res/TitleUpdate/res/mob/villager/priest.png | Bin 0 -> 1933 bytes .../res/TitleUpdate/res/mob/villager/smith.png | Bin 0 -> 1383 bytes .../res/TitleUpdate/res/mob/villager/villager.png | Bin 0 -> 1947 bytes .../Common/res/TitleUpdate/res/mob/wolf_collar.png | Bin 0 -> 4327 bytes .../Common/res/TitleUpdate/res/mob/wolf_tame.png | Bin 0 -> 4379 bytes .../Common/res/TitleUpdate/res/mob/zombie.png | Bin 0 -> 1618 bytes .../res/TitleUpdate/res/mob/zombie_villager.png | Bin 0 -> 2409 bytes .../Common/res/TitleUpdate/res/particles.png | Bin 0 -> 3645 bytes .../Common/res/TitleUpdate/res/terrain.png | Bin 0 -> 122236 bytes .../res/TitleUpdate/res/terrainMipMapLevel2.png | Bin 0 -> 30830 bytes .../res/TitleUpdate/res/terrainMipMapLevel3.png | Bin 0 -> 10551 bytes .../res/TitleUpdate/res/textures/blocks/fire_0.png | Bin 0 -> 16576 bytes .../res/TitleUpdate/res/textures/blocks/fire_0.txt | 16 + .../res/TitleUpdate/res/textures/blocks/fire_1.png | Bin 0 -> 16723 bytes .../res/TitleUpdate/res/textures/blocks/fire_1.txt | 1 + .../res/TitleUpdate/res/textures/blocks/lava.png | Bin 0 -> 10420 bytes .../res/TitleUpdate/res/textures/blocks/lava.txt | 38 + .../TitleUpdate/res/textures/blocks/lava_flow.png | Bin 0 -> 9931 bytes .../TitleUpdate/res/textures/blocks/lava_flow.txt | 16 + .../res/TitleUpdate/res/textures/blocks/portal.png | Bin 0 -> 14166 bytes .../res/TitleUpdate/res/textures/blocks/portal.txt | 1 + .../res/TitleUpdate/res/textures/blocks/water.png | Bin 0 -> 14567 bytes .../res/TitleUpdate/res/textures/blocks/water.txt | 32 + .../TitleUpdate/res/textures/blocks/water_flow.png | Bin 0 -> 10198 bytes .../TitleUpdate/res/textures/blocks/water_flow.txt | 1 + .../res/TitleUpdate/res/textures/items/clock.png | Bin 0 -> 3217 bytes .../res/TitleUpdate/res/textures/items/clock.txt | 1 + .../res/TitleUpdate/res/textures/items/compass.png | Bin 0 -> 1205 bytes .../res/TitleUpdate/res/textures/items/compass.txt | 1 + .../Common/res/TitleUpdate/tutorialDiff | Bin 0 -> 89396 bytes Minecraft.Client/Common/res/achievement/bg.png | Bin 0 -> 3636 bytes Minecraft.Client/Common/res/achievement/icons.png | Bin 0 -> 1489 bytes Minecraft.Client/Common/res/armor/chain_1.png | Bin 0 -> 964 bytes Minecraft.Client/Common/res/armor/chain_2.png | Bin 0 -> 523 bytes Minecraft.Client/Common/res/armor/cloth_1.png | Bin 0 -> 1139 bytes Minecraft.Client/Common/res/armor/cloth_2.png | Bin 0 -> 710 bytes Minecraft.Client/Common/res/armor/diamond_1.png | Bin 0 -> 1218 bytes Minecraft.Client/Common/res/armor/diamond_2.png | Bin 0 -> 724 bytes Minecraft.Client/Common/res/armor/gold_1.png | Bin 0 -> 1198 bytes Minecraft.Client/Common/res/armor/gold_2.png | Bin 0 -> 708 bytes Minecraft.Client/Common/res/armor/iron_1.png | Bin 0 -> 1133 bytes Minecraft.Client/Common/res/armor/iron_2.png | Bin 0 -> 686 bytes Minecraft.Client/Common/res/armor/power.png | Bin 0 -> 1800 bytes Minecraft.Client/Common/res/art/kz.png | Bin 0 -> 78021 bytes Minecraft.Client/Common/res/audio/Minecraft.xgs | Bin 0 -> 488 bytes Minecraft.Client/Common/res/audio/minecraft.xsb | Bin 0 -> 9088 bytes Minecraft.Client/Common/res/audio/resident.xwb | Bin 0 -> 7647232 bytes Minecraft.Client/Common/res/audio/streamed.xwb | Bin 0 -> 60653568 bytes Minecraft.Client/Common/res/environment/clouds.png | Bin 0 -> 13711 bytes Minecraft.Client/Common/res/environment/rain.png | Bin 0 -> 2540 bytes Minecraft.Client/Common/res/environment/snow.png | Bin 0 -> 818 bytes Minecraft.Client/Common/res/font/Mojangles_11.png | Bin 0 -> 4078 bytes Minecraft.Client/Common/res/font/Mojangles_7.png | Bin 0 -> 3018 bytes Minecraft.Client/Common/res/font/default.png | Bin 0 -> 2817 bytes Minecraft.Client/Common/res/gui/background.png | Bin 0 -> 1011 bytes Minecraft.Client/Common/res/gui/container.png | Bin 0 -> 2795 bytes Minecraft.Client/Common/res/gui/crafting.png | Bin 0 -> 2756 bytes Minecraft.Client/Common/res/gui/furnace.png | Bin 0 -> 3153 bytes Minecraft.Client/Common/res/gui/gui.png | Bin 0 -> 14210 bytes Minecraft.Client/Common/res/gui/icons.png | Bin 0 -> 2423 bytes Minecraft.Client/Common/res/gui/inventory.png | Bin 0 -> 2761 bytes Minecraft.Client/Common/res/gui/items.png | Bin 0 -> 21381 bytes Minecraft.Client/Common/res/gui/logo.png | Bin 0 -> 12925 bytes Minecraft.Client/Common/res/gui/particles.png | Bin 0 -> 1992 bytes Minecraft.Client/Common/res/gui/slot.png | Bin 0 -> 1829 bytes Minecraft.Client/Common/res/gui/trap.png | Bin 0 -> 2121 bytes Minecraft.Client/Common/res/gui/unknown_pack.png | Bin 0 -> 13013 bytes Minecraft.Client/Common/res/item/arrows.png | Bin 0 -> 322 bytes Minecraft.Client/Common/res/item/boat.png | Bin 0 -> 2389 bytes Minecraft.Client/Common/res/item/cart.png | Bin 0 -> 2254 bytes Minecraft.Client/Common/res/item/door.png | Bin 0 -> 1029 bytes Minecraft.Client/Common/res/item/sign.png | Bin 0 -> 1260 bytes Minecraft.Client/Common/res/misc/dial.png | Bin 0 -> 231 bytes Minecraft.Client/Common/res/misc/foliagecolor.png | Bin 0 -> 17693 bytes Minecraft.Client/Common/res/misc/footprint.png | Bin 0 -> 946 bytes Minecraft.Client/Common/res/misc/grasscolor.png | Bin 0 -> 25237 bytes Minecraft.Client/Common/res/misc/mapbg.png | Bin 0 -> 597 bytes Minecraft.Client/Common/res/misc/mapicons.png | Bin 0 -> 3170 bytes Minecraft.Client/Common/res/misc/pumpkinblur.png | Bin 0 -> 42123 bytes Minecraft.Client/Common/res/misc/shadow.png | Bin 0 -> 868 bytes Minecraft.Client/Common/res/misc/vignette.png | Bin 0 -> 24157 bytes Minecraft.Client/Common/res/misc/water.png | Bin 0 -> 306 bytes Minecraft.Client/Common/res/misc/watercolor.png | Bin 0 -> 3474 bytes Minecraft.Client/Common/res/mob/char.png | Bin 0 -> 1360 bytes Minecraft.Client/Common/res/mob/char1.png | Bin 0 -> 1755 bytes Minecraft.Client/Common/res/mob/char2.png | Bin 0 -> 4339 bytes Minecraft.Client/Common/res/mob/char3.png | Bin 0 -> 4234 bytes Minecraft.Client/Common/res/mob/char4.png | Bin 0 -> 4647 bytes Minecraft.Client/Common/res/mob/char5.png | Bin 0 -> 4251 bytes Minecraft.Client/Common/res/mob/char6.png | Bin 0 -> 4541 bytes Minecraft.Client/Common/res/mob/char7.png | Bin 0 -> 2347 bytes Minecraft.Client/Common/res/mob/chicken.png | Bin 0 -> 492 bytes Minecraft.Client/Common/res/mob/cow.png | Bin 0 -> 1338 bytes Minecraft.Client/Common/res/mob/creeper.png | Bin 0 -> 3000 bytes Minecraft.Client/Common/res/mob/ghast.png | Bin 0 -> 896 bytes Minecraft.Client/Common/res/mob/ghast_fire.png | Bin 0 -> 943 bytes Minecraft.Client/Common/res/mob/pig.png | Bin 0 -> 3791 bytes Minecraft.Client/Common/res/mob/pigman.png | Bin 0 -> 2662 bytes Minecraft.Client/Common/res/mob/pigzombie.png | Bin 0 -> 3013 bytes Minecraft.Client/Common/res/mob/saddle.png | Bin 0 -> 379 bytes Minecraft.Client/Common/res/mob/sheep.png | Bin 0 -> 2434 bytes Minecraft.Client/Common/res/mob/sheep_fur.png | Bin 0 -> 1661 bytes Minecraft.Client/Common/res/mob/skeleton.png | Bin 0 -> 894 bytes Minecraft.Client/Common/res/mob/slime.png | Bin 0 -> 633 bytes Minecraft.Client/Common/res/mob/spider.png | Bin 0 -> 2554 bytes Minecraft.Client/Common/res/mob/spider_eyes.png | Bin 0 -> 255 bytes Minecraft.Client/Common/res/mob/squid.png | Bin 0 -> 918 bytes Minecraft.Client/Common/res/mob/wolf.png | Bin 0 -> 4352 bytes Minecraft.Client/Common/res/mob/wolf_angry.png | Bin 0 -> 3223 bytes Minecraft.Client/Common/res/mob/wolf_tame.png | Bin 0 -> 4367 bytes Minecraft.Client/Common/res/mob/zombie.png | Bin 0 -> 1343 bytes Minecraft.Client/Common/res/pack.png | Bin 0 -> 27267 bytes Minecraft.Client/Common/res/particles.png | Bin 0 -> 844 bytes Minecraft.Client/Common/res/terrain.png | Bin 0 -> 65050 bytes Minecraft.Client/Common/res/terrain/moon.png | Bin 0 -> 910 bytes Minecraft.Client/Common/res/terrain/sun.png | Bin 0 -> 799 bytes Minecraft.Client/Common/res/title/black.png | Bin 0 -> 174 bytes Minecraft.Client/Common/res/title/mclogo.png | Bin 0 -> 5410 bytes Minecraft.Client/Common/res/title/mojang.png | Bin 0 -> 1905 bytes Minecraft.Client/Common/xuiscene_base.h | 176 + Minecraft.Client/Common/zlib/adler32.c | 178 + Minecraft.Client/Common/zlib/compress.c | 81 + Minecraft.Client/Common/zlib/crc32.c | 425 + Minecraft.Client/Common/zlib/crc32.h | 441 + Minecraft.Client/Common/zlib/deflate.c | 1967 + Minecraft.Client/Common/zlib/deflate.h | 346 + Minecraft.Client/Common/zlib/gzclose.c | 25 + Minecraft.Client/Common/zlib/gzguts.h | 209 + Minecraft.Client/Common/zlib/gzlib.c | 634 + Minecraft.Client/Common/zlib/gzread.c | 594 + Minecraft.Client/Common/zlib/gzwrite.c | 577 + Minecraft.Client/Common/zlib/infback.c | 640 + Minecraft.Client/Common/zlib/inffast.c | 340 + Minecraft.Client/Common/zlib/inffast.h | 11 + Minecraft.Client/Common/zlib/inffixed.h | 94 + Minecraft.Client/Common/zlib/inflate.c | 1512 + Minecraft.Client/Common/zlib/inflate.h | 122 + Minecraft.Client/Common/zlib/inftrees.c | 306 + Minecraft.Client/Common/zlib/inftrees.h | 62 + Minecraft.Client/Common/zlib/trees.c | 1226 + Minecraft.Client/Common/zlib/trees.h | 128 + Minecraft.Client/Common/zlib/uncompr.c | 59 + Minecraft.Client/Common/zlib/zconf.h | 511 + Minecraft.Client/Common/zlib/zlib.h | 1768 + Minecraft.Client/Common/zlib/zutil.c | 324 + Minecraft.Client/Common/zlib/zutil.h | 253 + 2370 files changed, 411227 insertions(+) create mode 100644 Minecraft.Client/Common/App_Defines.h create mode 100644 Minecraft.Client/Common/App_enums.h create mode 100644 Minecraft.Client/Common/App_structs.h create mode 100644 Minecraft.Client/Common/Audio/Consoles_SoundEngine.cpp create mode 100644 Minecraft.Client/Common/Audio/Consoles_SoundEngine.h create mode 100644 Minecraft.Client/Common/Audio/SoundEngine.cpp create mode 100644 Minecraft.Client/Common/Audio/SoundEngine.h create mode 100644 Minecraft.Client/Common/Audio/SoundNames.cpp create mode 100644 Minecraft.Client/Common/BuildVer.h create mode 100644 Minecraft.Client/Common/C4JMemoryPool.h create mode 100644 Minecraft.Client/Common/C4JMemoryPoolAllocator.h create mode 100644 Minecraft.Client/Common/Colours/ColourTable.cpp create mode 100644 Minecraft.Client/Common/Colours/ColourTable.h create mode 100644 Minecraft.Client/Common/CommonMedia.sln create mode 100644 Minecraft.Client/Common/CommonMedia.vcxproj create mode 100644 Minecraft.Client/Common/CommonMedia.vcxproj.filters create mode 100644 Minecraft.Client/Common/ConsoleGameMode.cpp create mode 100644 Minecraft.Client/Common/ConsoleGameMode.h create mode 100644 Minecraft.Client/Common/Console_Awards_enum.h create mode 100644 Minecraft.Client/Common/Console_Debug_enum.h create mode 100644 Minecraft.Client/Common/Console_Utils.cpp create mode 100644 Minecraft.Client/Common/Consoles_App.cpp create mode 100644 Minecraft.Client/Common/Consoles_App.h create mode 100644 Minecraft.Client/Common/DLC/DLCAudioFile.cpp create mode 100644 Minecraft.Client/Common/DLC/DLCAudioFile.h create mode 100644 Minecraft.Client/Common/DLC/DLCCapeFile.cpp create mode 100644 Minecraft.Client/Common/DLC/DLCCapeFile.h create mode 100644 Minecraft.Client/Common/DLC/DLCColourTableFile.cpp create mode 100644 Minecraft.Client/Common/DLC/DLCColourTableFile.h create mode 100644 Minecraft.Client/Common/DLC/DLCFile.cpp create mode 100644 Minecraft.Client/Common/DLC/DLCFile.h create mode 100644 Minecraft.Client/Common/DLC/DLCGameRules.h create mode 100644 Minecraft.Client/Common/DLC/DLCGameRulesFile.cpp create mode 100644 Minecraft.Client/Common/DLC/DLCGameRulesFile.h create mode 100644 Minecraft.Client/Common/DLC/DLCGameRulesHeader.cpp create mode 100644 Minecraft.Client/Common/DLC/DLCGameRulesHeader.h create mode 100644 Minecraft.Client/Common/DLC/DLCLocalisationFile.cpp create mode 100644 Minecraft.Client/Common/DLC/DLCLocalisationFile.h create mode 100644 Minecraft.Client/Common/DLC/DLCManager.cpp create mode 100644 Minecraft.Client/Common/DLC/DLCManager.h create mode 100644 Minecraft.Client/Common/DLC/DLCPack.cpp create mode 100644 Minecraft.Client/Common/DLC/DLCPack.h create mode 100644 Minecraft.Client/Common/DLC/DLCSkinFile.cpp create mode 100644 Minecraft.Client/Common/DLC/DLCSkinFile.h create mode 100644 Minecraft.Client/Common/DLC/DLCTextureFile.cpp create mode 100644 Minecraft.Client/Common/DLC/DLCTextureFile.h create mode 100644 Minecraft.Client/Common/DLC/DLCUIDataFile.cpp create mode 100644 Minecraft.Client/Common/DLC/DLCUIDataFile.h create mode 100644 Minecraft.Client/Common/DummyTexturePack/res/TFSHOLDER.txt create mode 100644 Minecraft.Client/Common/GameRules/AddEnchantmentRuleDefinition.cpp create mode 100644 Minecraft.Client/Common/GameRules/AddEnchantmentRuleDefinition.h create mode 100644 Minecraft.Client/Common/GameRules/AddItemRuleDefinition.cpp create mode 100644 Minecraft.Client/Common/GameRules/AddItemRuleDefinition.h create mode 100644 Minecraft.Client/Common/GameRules/ApplySchematicRuleDefinition.cpp create mode 100644 Minecraft.Client/Common/GameRules/ApplySchematicRuleDefinition.h create mode 100644 Minecraft.Client/Common/GameRules/BiomeOverride.cpp create mode 100644 Minecraft.Client/Common/GameRules/BiomeOverride.h create mode 100644 Minecraft.Client/Common/GameRules/CollectItemRuleDefinition.cpp create mode 100644 Minecraft.Client/Common/GameRules/CollectItemRuleDefinition.h create mode 100644 Minecraft.Client/Common/GameRules/CompleteAllRuleDefinition.cpp create mode 100644 Minecraft.Client/Common/GameRules/CompleteAllRuleDefinition.h create mode 100644 Minecraft.Client/Common/GameRules/CompoundGameRuleDefinition.cpp create mode 100644 Minecraft.Client/Common/GameRules/CompoundGameRuleDefinition.h create mode 100644 Minecraft.Client/Common/GameRules/ConsoleGameRules.h create mode 100644 Minecraft.Client/Common/GameRules/ConsoleGameRulesConstants.h create mode 100644 Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.cpp create mode 100644 Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.h create mode 100644 Minecraft.Client/Common/GameRules/ConsoleGenerateStructureAction.h create mode 100644 Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp create mode 100644 Minecraft.Client/Common/GameRules/ConsoleSchematicFile.h create mode 100644 Minecraft.Client/Common/GameRules/GameRule.cpp create mode 100644 Minecraft.Client/Common/GameRules/GameRule.h create mode 100644 Minecraft.Client/Common/GameRules/GameRuleDefinition.cpp create mode 100644 Minecraft.Client/Common/GameRules/GameRuleDefinition.h create mode 100644 Minecraft.Client/Common/GameRules/GameRuleManager.cpp create mode 100644 Minecraft.Client/Common/GameRules/GameRuleManager.h create mode 100644 Minecraft.Client/Common/GameRules/GameRulesInstance.h create mode 100644 Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp create mode 100644 Minecraft.Client/Common/GameRules/LevelGenerationOptions.h create mode 100644 Minecraft.Client/Common/GameRules/LevelGenerators.cpp create mode 100644 Minecraft.Client/Common/GameRules/LevelGenerators.h create mode 100644 Minecraft.Client/Common/GameRules/LevelRules.cpp create mode 100644 Minecraft.Client/Common/GameRules/LevelRules.h create mode 100644 Minecraft.Client/Common/GameRules/LevelRuleset.cpp create mode 100644 Minecraft.Client/Common/GameRules/LevelRuleset.h create mode 100644 Minecraft.Client/Common/GameRules/NamedAreaRuleDefinition.cpp create mode 100644 Minecraft.Client/Common/GameRules/NamedAreaRuleDefinition.h create mode 100644 Minecraft.Client/Common/GameRules/StartFeature.cpp create mode 100644 Minecraft.Client/Common/GameRules/StartFeature.h create mode 100644 Minecraft.Client/Common/GameRules/UpdatePlayerRuleDefinition.cpp create mode 100644 Minecraft.Client/Common/GameRules/UpdatePlayerRuleDefinition.h create mode 100644 Minecraft.Client/Common/GameRules/UseTileRuleDefinition.cpp create mode 100644 Minecraft.Client/Common/GameRules/UseTileRuleDefinition.h create mode 100644 Minecraft.Client/Common/GameRules/XboxStructureActionGenerateBox.cpp create mode 100644 Minecraft.Client/Common/GameRules/XboxStructureActionGenerateBox.h create mode 100644 Minecraft.Client/Common/GameRules/XboxStructureActionPlaceBlock.cpp create mode 100644 Minecraft.Client/Common/GameRules/XboxStructureActionPlaceBlock.h create mode 100644 Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.cpp create mode 100644 Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.h create mode 100644 Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.cpp create mode 100644 Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.h create mode 100644 Minecraft.Client/Common/Leaderboards/LeaderboardManager.cpp create mode 100644 Minecraft.Client/Common/Leaderboards/LeaderboardManager.h create mode 100644 Minecraft.Client/Common/Media/4J_strings.resx create mode 100644 Minecraft.Client/Common/Media/AnvilMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/AnvilMenu480.swf create mode 100644 Minecraft.Client/Common/Media/AnvilMenu720.swf create mode 100644 Minecraft.Client/Common/Media/AnvilMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/AnvilMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/AnvilMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/BrewingStandMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/BrewingStandMenu480.swf create mode 100644 Minecraft.Client/Common/Media/BrewingStandMenu720.swf create mode 100644 Minecraft.Client/Common/Media/BrewingStandMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/BrewingStandMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/BrewingStandMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/ChestLargeMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/ChestLargeMenu480.swf create mode 100644 Minecraft.Client/Common/Media/ChestLargeMenu720.swf create mode 100644 Minecraft.Client/Common/Media/ChestLargeMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/ChestLargeMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/ChestLargeMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/ChestMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/ChestMenu480.swf create mode 100644 Minecraft.Client/Common/Media/ChestMenu720.swf create mode 100644 Minecraft.Client/Common/Media/ChestMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/ChestMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/ChestMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/ComponentLogo1080.swf create mode 100644 Minecraft.Client/Common/Media/ComponentLogo480.swf create mode 100644 Minecraft.Client/Common/Media/ComponentLogo720.swf create mode 100644 Minecraft.Client/Common/Media/ComponentLogoSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/ComponentLogoSplit720.swf create mode 100644 Minecraft.Client/Common/Media/ComponentLogoVita.swf create mode 100644 Minecraft.Client/Common/Media/Controls1080.swf create mode 100644 Minecraft.Client/Common/Media/Controls480.swf create mode 100644 Minecraft.Client/Common/Media/Controls720.swf create mode 100644 Minecraft.Client/Common/Media/ControlsRemotePlay1080.swf create mode 100644 Minecraft.Client/Common/Media/ControlsSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/ControlsSplit720.swf create mode 100644 Minecraft.Client/Common/Media/ControlsTVVita.swf create mode 100644 Minecraft.Client/Common/Media/ControlsVita.swf create mode 100644 Minecraft.Client/Common/Media/Crafting2x2Menu1080.swf create mode 100644 Minecraft.Client/Common/Media/Crafting2x2Menu480.swf create mode 100644 Minecraft.Client/Common/Media/Crafting2x2Menu720.swf create mode 100644 Minecraft.Client/Common/Media/Crafting2x2MenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/Crafting2x2MenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/Crafting2x2MenuVita.swf create mode 100644 Minecraft.Client/Common/Media/Crafting3x3Menu1080.swf create mode 100644 Minecraft.Client/Common/Media/Crafting3x3Menu480.swf create mode 100644 Minecraft.Client/Common/Media/Crafting3x3Menu720.swf create mode 100644 Minecraft.Client/Common/Media/Crafting3x3MenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/Crafting3x3MenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/Crafting3x3MenuVita.swf create mode 100644 Minecraft.Client/Common/Media/CreateWorldMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/CreateWorldMenu480.swf create mode 100644 Minecraft.Client/Common/Media/CreateWorldMenu720.swf create mode 100644 Minecraft.Client/Common/Media/CreateWorldMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/CreativeMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/CreativeMenu480.swf create mode 100644 Minecraft.Client/Common/Media/CreativeMenu720.swf create mode 100644 Minecraft.Client/Common/Media/CreativeMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/CreativeMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/CreativeMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/Credits1080.swf create mode 100644 Minecraft.Client/Common/Media/Credits480.swf create mode 100644 Minecraft.Client/Common/Media/Credits720.swf create mode 100644 Minecraft.Client/Common/Media/CreditsVita.swf create mode 100644 Minecraft.Client/Common/Media/DLCMainMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/DLCMainMenu480.swf create mode 100644 Minecraft.Client/Common/Media/DLCMainMenu720.swf create mode 100644 Minecraft.Client/Common/Media/DLCMainMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/DLCOffersMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/DLCOffersMenu480.swf create mode 100644 Minecraft.Client/Common/Media/DLCOffersMenu720.swf create mode 100644 Minecraft.Client/Common/Media/DLCOffersMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/DeathMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/DeathMenu480.swf create mode 100644 Minecraft.Client/Common/Media/DeathMenu720.swf create mode 100644 Minecraft.Client/Common/Media/DeathMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/DeathMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/DeathMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/DebugCreateSchematic1080.swf create mode 100644 Minecraft.Client/Common/Media/DebugCreateSchematic720.swf create mode 100644 Minecraft.Client/Common/Media/DebugMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/DebugMenu720.swf create mode 100644 Minecraft.Client/Common/Media/DebugOptionsMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/DebugOptionsMenu720.swf create mode 100644 Minecraft.Client/Common/Media/DebugSetCamera1080.swf create mode 100644 Minecraft.Client/Common/Media/DebugSetCamera720.swf create mode 100644 Minecraft.Client/Common/Media/DebugUIConsoleComponent1080.swf create mode 100644 Minecraft.Client/Common/Media/DebugUIConsoleComponent720.swf create mode 100644 Minecraft.Client/Common/Media/DebugUIMarketingGuide1080.swf create mode 100644 Minecraft.Client/Common/Media/DebugUIMarketingGuide720.swf create mode 100644 Minecraft.Client/Common/Media/DispenserMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/DispenserMenu480.swf create mode 100644 Minecraft.Client/Common/Media/DispenserMenu720.swf create mode 100644 Minecraft.Client/Common/Media/DispenserMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/DispenserMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/DispenserMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/EULA1080.swf create mode 100644 Minecraft.Client/Common/Media/EULA480.swf create mode 100644 Minecraft.Client/Common/Media/EULA720.swf create mode 100644 Minecraft.Client/Common/Media/EULAVita.swf create mode 100644 Minecraft.Client/Common/Media/EnchantingMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/EnchantingMenu480.swf create mode 100644 Minecraft.Client/Common/Media/EnchantingMenu720.swf create mode 100644 Minecraft.Client/Common/Media/EnchantingMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/EnchantingMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/EnchantingMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/EndPoem1080.swf create mode 100644 Minecraft.Client/Common/Media/EndPoem480.swf create mode 100644 Minecraft.Client/Common/Media/EndPoem720.swf create mode 100644 Minecraft.Client/Common/Media/EndPoemVita.swf create mode 100644 Minecraft.Client/Common/Media/FullscreenProgress1080.swf create mode 100644 Minecraft.Client/Common/Media/FullscreenProgress480.swf create mode 100644 Minecraft.Client/Common/Media/FullscreenProgress720.swf create mode 100644 Minecraft.Client/Common/Media/FullscreenProgressSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/FullscreenProgressSplit720.swf create mode 100644 Minecraft.Client/Common/Media/FullscreenProgressVita.swf create mode 100644 Minecraft.Client/Common/Media/FurnaceMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/FurnaceMenu480.swf create mode 100644 Minecraft.Client/Common/Media/FurnaceMenu720.swf create mode 100644 Minecraft.Client/Common/Media/FurnaceMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/FurnaceMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/FurnaceMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/GamertagSplit720.swf create mode 100644 Minecraft.Client/Common/Media/Graphics/AnvilCross.png create mode 100644 Minecraft.Client/Common/Media/Graphics/AnvilHammer.png create mode 100644 Minecraft.Client/Common/Media/Graphics/AnvilPlus.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Armour_Slot_Body.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Armour_Slot_Feet.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Armour_Slot_Head.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Armour_Slot_Legs.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Arrow_Off.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Arrow_On.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Arrow_Small_Off.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Arrow_Small_On.png create mode 100644 Minecraft.Client/Common/Media/Graphics/BrewingArrow_Off.png create mode 100644 Minecraft.Client/Common/Media/Graphics/BrewingArrow_On.png create mode 100644 Minecraft.Client/Common/Media/Graphics/BrewingArrow_Small_Off.png create mode 100644 Minecraft.Client/Common/Media/Graphics/BrewingArrow_Small_On.png create mode 100644 Minecraft.Client/Common/Media/Graphics/BrewingBubbles_Off.png create mode 100644 Minecraft.Client/Common/Media/Graphics/BrewingBubbles_On.png create mode 100644 Minecraft.Client/Common/Media/Graphics/BrewingBubbles_Small_Off.png create mode 100644 Minecraft.Client/Common/Media/Graphics/BrewingBubbles_Small_On.png create mode 100644 Minecraft.Client/Common/Media/Graphics/BrewingStand.png create mode 100644 Minecraft.Client/Common/Media/Graphics/BrewingStand_small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Controller_Message_Frame_L.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Controller_Quadrant_Icon_Empty.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Controller_Quadrant_Icon_Segment.png create mode 100644 Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_Materials.png create mode 100644 Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_Redstone_and_Transport.png create mode 100644 Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_armour.png create mode 100644 Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_brewing.png create mode 100644 Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_decoration.png create mode 100644 Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_food.png create mode 100644 Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_mechanisms.png create mode 100644 Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_misc.png create mode 100644 Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_structures.png create mode 100644 Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_tools.png create mode 100644 Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_transport.png create mode 100644 Minecraft.Client/Common/Media/Graphics/CraftScene/Craft_Highlight_L_ExtraSmall.png create mode 100644 Minecraft.Client/Common/Media/Graphics/CraftScene/Craft_Highlight_L_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/CraftScene/Crafting_2SlotLargeV.png create mode 100644 Minecraft.Client/Common/Media/Graphics/CraftScene/Crafting_2SlotSmallV.png create mode 100644 Minecraft.Client/Common/Media/Graphics/CraftScene/Crafting_3SlotLargeV.png create mode 100644 Minecraft.Client/Common/Media/Graphics/CreditBackground.png create mode 100644 Minecraft.Client/Common/Media/Graphics/DLCBackground.png create mode 100644 Minecraft.Client/Common/Media/Graphics/DLC_Tick.png create mode 100644 Minecraft.Client/Common/Media/Graphics/DLC_TickSmall.png create mode 100644 Minecraft.Client/Common/Media/Graphics/DefaultPack_Comparison.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Dirt_Tile.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Enchant_Slot.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Enchant_Slot_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/EnchantmentButtonActive.png create mode 100644 Minecraft.Client/Common/Media/Graphics/EnchantmentButtonActive_small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/EnchantmentButtonEmpty.png create mode 100644 Minecraft.Client/Common/Media/Graphics/EnchantmentButtonEmpty_small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/EnchantmentButtonSelected.png create mode 100644 Minecraft.Client/Common/Media/Graphics/EnchantmentButtonSelected_small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Flame_Off.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Flame_Off_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Flame_On.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Flame_On_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty2.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty3.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty4.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty6.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full2.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full3.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full4.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full6.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/HUD_Air_Bubble.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/HUD_Air_Pop.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/HUD_Armour_Empty.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/HUD_Armour_Full.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/HUD_Armour_Half.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/HUD_Crosshair.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Background.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Background_Flash.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Background_Poison.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full_Flash.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full_Poison.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full_Poison_Flash.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half_Flash.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half_Poison.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half_Poison_Flash.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/Health_Background.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/Health_Background_Flash.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/Health_Full.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Flash.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Poison.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Poison_Flash.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/Health_Half.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Flash.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Poison.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Poison_Flash.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/experience_bar_empty.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/experience_bar_full.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/hotbar_item_back.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HUD/hotbar_item_selected.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Anvil.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Anvil_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Breeding.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Breeding_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Brewing.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Brewing_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Chest.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Chest_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_CraftTable.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_CraftTable_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Crafting.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Crafting_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Creative.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Creative_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Dispenser.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Dispenser_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enchantment.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enchantment_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enderchest.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enderchest_small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_FarmingAnimals.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_FarmingAnimals_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Furnace.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Furnace_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_HUD.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_HUD_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Inventory.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Inventory_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_LargeChest.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_LargeChest_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_NetherPortal.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_NetherPortal_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_TheEnd.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_TheEnd_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Trading.png create mode 100644 Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Trading_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/IconHolder.png create mode 100644 Minecraft.Client/Common/Media/Graphics/IconHolderRed.png create mode 100644 Minecraft.Client/Common/Media/Graphics/IconHolderRed_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/IconHolder_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_0.png create mode 100644 Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_1.png create mode 100644 Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_10.png create mode 100644 Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_11.png create mode 100644 Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_12.png create mode 100644 Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_13.png create mode 100644 Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_14.png create mode 100644 Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_15.png create mode 100644 Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_2.png create mode 100644 Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_3.png create mode 100644 Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_4.png create mode 100644 Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_5.png create mode 100644 Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_6.png create mode 100644 Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_7.png create mode 100644 Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_8.png create mode 100644 Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_9.png create mode 100644 Minecraft.Client/Common/Media/Graphics/InGameInfo/voiceMuted.png create mode 100644 Minecraft.Client/Common/Media/Graphics/InGameInfo/voiceNotSpeaking.png create mode 100644 Minecraft.Client/Common/Media/Graphics/InGameInfo/voiceSpeaking.png create mode 100644 Minecraft.Client/Common/Media/Graphics/LayoutButton_Norm.png create mode 100644 Minecraft.Client/Common/Media/Graphics/LayoutButton_Over.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Climbed.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Creeper.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Fallen.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Ghast.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Portal.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Skeleton.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Slime.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Spider.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_SpiderJockey.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Swam.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Walked.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Zombie.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_ZombiePigman.png create mode 100644 Minecraft.Client/Common/Media/Graphics/LeaderboardButton_Norm.png create mode 100644 Minecraft.Client/Common/Media/Graphics/LeaderboardButton_Over.png create mode 100644 Minecraft.Client/Common/Media/Graphics/ListButton_Norm.png create mode 100644 Minecraft.Client/Common/Media/Graphics/ListButton_Over.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Logos/4JStudios_logo.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Logos/ESRB_10_Large.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Logos/MS_Studios_MC.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Logos/XBLA_MC.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Logos/mojang.png create mode 100644 Minecraft.Client/Common/Media/Graphics/MSPoints.png create mode 100644 Minecraft.Client/Common/Media/Graphics/MainMenuButton_Norm.png create mode 100644 Minecraft.Client/Common/Media/Graphics/MainMenuButton_Over.png create mode 100644 Minecraft.Client/Common/Media/Graphics/MenuTitle.png create mode 100644 Minecraft.Client/Common/Media/Graphics/MinecraftBrokenIcon.png create mode 100644 Minecraft.Client/Common/Media/Graphics/MinecraftIcon.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Padlock_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel2x2.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel_Small_2x2.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Creative_Panel_8.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Creative_Panel_8_Small.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_BL.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_BM.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_BR.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Bot_L.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Bot_M.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Bot_R.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_ML.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_MM.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_MR.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Mid_L.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Mid_M.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Mid_R.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Bot_L.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Bot_M.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Bot_R.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Mid_L.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Mid_M.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Mid_R.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Top_L.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Top_M.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Top_R.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_TL.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_TM.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_TR.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Top_L.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Top_M.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Top_R.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_BL.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_BM.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_BR.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_ML.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_MM.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_MR.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_TL.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_TM.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_TR.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBar.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmall.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmallPanel.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmallPanel_Selected.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmall_Selected.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBar_Selected.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormal.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormalSmall.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormalSmall_Selected.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormal_Selected.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOver.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOverSmall.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOverSmall_Selected.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOver_Selected.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Bot_L.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Bot_M.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Bot_R.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Mid_L.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Mid_M.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Mid_R.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Top_L.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Top_M.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Top_R.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_L.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_M.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_R.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_Small_L.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_Small_M.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_Small_R.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Left.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Middle.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Right.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Small_Left.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Small_Middle.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Small_Right.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Panorama_Background_N.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Panorama_Background_S.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Pointer.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Blindness.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Fire_Resistance.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Haste.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Hunger.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Invisibility.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Jump_Boost.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Mining_Fatigue.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Nausea.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Night_Vision.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Poison.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Regeneration.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Resistance.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Slowness.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Speed.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Strength.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Water_Breathing.png create mode 100644 Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Weakness.png create mode 100644 Minecraft.Client/Common/Media/Graphics/SaveArrow.png create mode 100644 Minecraft.Client/Common/Media/Graphics/SaveChest.png create mode 100644 Minecraft.Client/Common/Media/Graphics/SignEditBackground.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Slider_Button.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Slider_Track.png create mode 100644 Minecraft.Client/Common/Media/Graphics/TexturePackIcon.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Tick.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Tickbox_Norm.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Tickbox_Over.png create mode 100644 Minecraft.Client/Common/Media/Graphics/TutorialExitScreenshot.png create mode 100644 Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot1.png create mode 100644 Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot10.png create mode 100644 Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot2.png create mode 100644 Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot3.png create mode 100644 Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot4.png create mode 100644 Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot5.png create mode 100644 Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot6.png create mode 100644 Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot7.png create mode 100644 Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot8.png create mode 100644 Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot9.png create mode 100644 Minecraft.Client/Common/Media/Graphics/Warning.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/360ctrl.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonA.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonB.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonBack.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadD.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadL.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadR.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadU.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLS.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftBumper.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftBumper_TT.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftStick.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftStick_Navigate.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftStick_sides.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftTrigger.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftTrigger_TT.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRS.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightBumper.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightBumper_TT.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightStick.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightTrigger.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightTrigger_TT.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonStart.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonX.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonY.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Blu_Focus.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Blu_Normal.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Disable.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Green_Focus.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Green_Normal.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Red_Focus.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Red_Normal.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Yello_Focus.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Yello_Normal.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/a_graphic.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/b_graphic.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/x_graphic.png create mode 100644 Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/y_graphic.png create mode 100644 Minecraft.Client/Common/Media/Graphics/icon_shank.png create mode 100644 Minecraft.Client/Common/Media/Graphics/scrollDown.png create mode 100644 Minecraft.Client/Common/Media/Graphics/scrollLeft.png create mode 100644 Minecraft.Client/Common/Media/Graphics/scrollRight.png create mode 100644 Minecraft.Client/Common/Media/Graphics/scrollUp.png create mode 100644 Minecraft.Client/Common/Media/HTMLColours.col create mode 100644 Minecraft.Client/Common/Media/HTMLColours.xml create mode 100644 Minecraft.Client/Common/Media/HUD1080.swf create mode 100644 Minecraft.Client/Common/Media/HUD480.swf create mode 100644 Minecraft.Client/Common/Media/HUD720.swf create mode 100644 Minecraft.Client/Common/Media/HUDSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/HUDSplit720.swf create mode 100644 Minecraft.Client/Common/Media/HUDVita.swf create mode 100644 Minecraft.Client/Common/Media/HelpAndOptionsMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/HelpAndOptionsMenu480.swf create mode 100644 Minecraft.Client/Common/Media/HelpAndOptionsMenu720.swf create mode 100644 Minecraft.Client/Common/Media/HelpAndOptionsMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/HelpAndOptionsMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/HelpAndOptionsMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/HorseInventoryMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/HorseInventoryMenu480.swf create mode 100644 Minecraft.Client/Common/Media/HorseInventoryMenu720.swf create mode 100644 Minecraft.Client/Common/Media/HorseInventoryMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/HorseInventoryMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/HowToPlay1080.swf create mode 100644 Minecraft.Client/Common/Media/HowToPlay480.swf create mode 100644 Minecraft.Client/Common/Media/HowToPlay720.swf create mode 100644 Minecraft.Client/Common/Media/HowToPlayMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/HowToPlayMenu480.swf create mode 100644 Minecraft.Client/Common/Media/HowToPlayMenu720.swf create mode 100644 Minecraft.Client/Common/Media/HowToPlayMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/HowToPlayMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/HowToPlayMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/HowToPlaySplit1080.swf create mode 100644 Minecraft.Client/Common/Media/HowToPlaySplit720.swf create mode 100644 Minecraft.Client/Common/Media/HowToPlayVita.swf create mode 100644 Minecraft.Client/Common/Media/InGameHostOptions1080.swf create mode 100644 Minecraft.Client/Common/Media/InGameHostOptions480.swf create mode 100644 Minecraft.Client/Common/Media/InGameHostOptions720.swf create mode 100644 Minecraft.Client/Common/Media/InGameHostOptionsSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/InGameHostOptionsSplit720.swf create mode 100644 Minecraft.Client/Common/Media/InGameHostOptionsVita.swf create mode 100644 Minecraft.Client/Common/Media/InGameInfoMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/InGameInfoMenu480.swf create mode 100644 Minecraft.Client/Common/Media/InGameInfoMenu720.swf create mode 100644 Minecraft.Client/Common/Media/InGameInfoMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/InGameInfoMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/InGameInfoMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/InGamePlayerOptions1080.swf create mode 100644 Minecraft.Client/Common/Media/InGamePlayerOptions480.swf create mode 100644 Minecraft.Client/Common/Media/InGamePlayerOptions720.swf create mode 100644 Minecraft.Client/Common/Media/InGamePlayerOptionsSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/InGamePlayerOptionsSplit720.swf create mode 100644 Minecraft.Client/Common/Media/InGamePlayerOptionsVita.swf create mode 100644 Minecraft.Client/Common/Media/InGameTeleportMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/InGameTeleportMenu480.swf create mode 100644 Minecraft.Client/Common/Media/InGameTeleportMenu720.swf create mode 100644 Minecraft.Client/Common/Media/InGameTeleportMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/InGameTeleportMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/InGameTeleportMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/Intro1080.swf create mode 100644 Minecraft.Client/Common/Media/Intro480.swf create mode 100644 Minecraft.Client/Common/Media/Intro720.swf create mode 100644 Minecraft.Client/Common/Media/IntroVita.swf create mode 100644 Minecraft.Client/Common/Media/InventoryMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/InventoryMenu480.swf create mode 100644 Minecraft.Client/Common/Media/InventoryMenu720.swf create mode 100644 Minecraft.Client/Common/Media/InventoryMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/InventoryMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/InventoryMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/JoinMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/JoinMenu480.swf create mode 100644 Minecraft.Client/Common/Media/JoinMenu720.swf create mode 100644 Minecraft.Client/Common/Media/JoinMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/Keyboard1080.swf create mode 100644 Minecraft.Client/Common/Media/KeyboardSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/LaunchMoreOptionsMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/LaunchMoreOptionsMenu480.swf create mode 100644 Minecraft.Client/Common/Media/LaunchMoreOptionsMenu720.swf create mode 100644 Minecraft.Client/Common/Media/LaunchMoreOptionsMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/LeaderboardMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/LeaderboardMenu480.swf create mode 100644 Minecraft.Client/Common/Media/LeaderboardMenu720.swf create mode 100644 Minecraft.Client/Common/Media/LeaderboardMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/LoadMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/LoadMenu480.swf create mode 100644 Minecraft.Client/Common/Media/LoadMenu720.swf create mode 100644 Minecraft.Client/Common/Media/LoadMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/LoadOrJoinMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/LoadOrJoinMenu480.swf create mode 100644 Minecraft.Client/Common/Media/LoadOrJoinMenu720.swf create mode 100644 Minecraft.Client/Common/Media/LoadOrJoinMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/MainMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/MainMenu480.swf create mode 100644 Minecraft.Client/Common/Media/MainMenu720.swf create mode 100644 Minecraft.Client/Common/Media/MainMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/MediaDurango.arc create mode 100644 Minecraft.Client/Common/Media/MediaOrbis.arc create mode 100644 Minecraft.Client/Common/Media/MediaPS3.arc create mode 100644 Minecraft.Client/Common/Media/MediaPSVita.arc create mode 100644 Minecraft.Client/Common/Media/MediaWindows64.arc create mode 100644 Minecraft.Client/Common/Media/MenuBackground1080.swf create mode 100644 Minecraft.Client/Common/Media/MenuBackground480.swf create mode 100644 Minecraft.Client/Common/Media/MenuBackground720.swf create mode 100644 Minecraft.Client/Common/Media/MenuBackgroundVita.swf create mode 100644 Minecraft.Client/Common/Media/MessageBox1080.swf create mode 100644 Minecraft.Client/Common/Media/MessageBox480.swf create mode 100644 Minecraft.Client/Common/Media/MessageBox720.swf create mode 100644 Minecraft.Client/Common/Media/MessageBoxSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/MessageBoxSplit720.swf create mode 100644 Minecraft.Client/Common/Media/MessageBoxVita.swf create mode 100644 Minecraft.Client/Common/Media/NewUpdateMessage1080.swf create mode 100644 Minecraft.Client/Common/Media/NewUpdateMessage480.swf create mode 100644 Minecraft.Client/Common/Media/NewUpdateMessage720.swf create mode 100644 Minecraft.Client/Common/Media/NewUpdateMessageVita.swf create mode 100644 Minecraft.Client/Common/Media/Panorama1080.swf create mode 100644 Minecraft.Client/Common/Media/Panorama480.swf create mode 100644 Minecraft.Client/Common/Media/Panorama720.swf create mode 100644 Minecraft.Client/Common/Media/PanoramaSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/PanoramaSplit720.swf create mode 100644 Minecraft.Client/Common/Media/PanoramaVita.swf create mode 100644 Minecraft.Client/Common/Media/PauseMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/PauseMenu480.swf create mode 100644 Minecraft.Client/Common/Media/PauseMenu720.swf create mode 100644 Minecraft.Client/Common/Media/PauseMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/PauseMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/PauseMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/PressStartToPlay1080.swf create mode 100644 Minecraft.Client/Common/Media/PressStartToPlay480.swf create mode 100644 Minecraft.Client/Common/Media/PressStartToPlay720.swf create mode 100644 Minecraft.Client/Common/Media/PressStartToPlayVita.swf create mode 100644 Minecraft.Client/Common/Media/QuadrantSignin1080.swf create mode 100644 Minecraft.Client/Common/Media/QuadrantSignin720.swf create mode 100644 Minecraft.Client/Common/Media/ReinstallMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/ReinstallMenu480.swf create mode 100644 Minecraft.Client/Common/Media/ReinstallMenu720.swf create mode 100644 Minecraft.Client/Common/Media/ReinstallMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/ReinstallMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/ReinstallMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/SaveMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/SaveMessage1080.swf create mode 100644 Minecraft.Client/Common/Media/SaveMessage480.swf create mode 100644 Minecraft.Client/Common/Media/SaveMessage720.swf create mode 100644 Minecraft.Client/Common/Media/SaveMessageVita.swf create mode 100644 Minecraft.Client/Common/Media/SettingsAudioMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/SettingsAudioMenu480.swf create mode 100644 Minecraft.Client/Common/Media/SettingsAudioMenu720.swf create mode 100644 Minecraft.Client/Common/Media/SettingsAudioMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/SettingsAudioMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/SettingsAudioMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/SettingsControlMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/SettingsControlMenu480.swf create mode 100644 Minecraft.Client/Common/Media/SettingsControlMenu720.swf create mode 100644 Minecraft.Client/Common/Media/SettingsControlMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/SettingsControlMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/SettingsControlMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/SettingsGraphicsMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/SettingsGraphicsMenu480.swf create mode 100644 Minecraft.Client/Common/Media/SettingsGraphicsMenu720.swf create mode 100644 Minecraft.Client/Common/Media/SettingsGraphicsMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/SettingsGraphicsMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/SettingsGraphicsMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/SettingsMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/SettingsMenu480.swf create mode 100644 Minecraft.Client/Common/Media/SettingsMenu720.swf create mode 100644 Minecraft.Client/Common/Media/SettingsMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/SettingsMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/SettingsMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/SettingsOptionsMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/SettingsOptionsMenu480.swf create mode 100644 Minecraft.Client/Common/Media/SettingsOptionsMenu720.swf create mode 100644 Minecraft.Client/Common/Media/SettingsOptionsMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/SettingsOptionsMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/SettingsOptionsMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/SettingsUIMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/SettingsUIMenu480.swf create mode 100644 Minecraft.Client/Common/Media/SettingsUIMenu720.swf create mode 100644 Minecraft.Client/Common/Media/SettingsUIMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/SettingsUIMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/SettingsUIMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/SignEntryMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/SignEntryMenu480.swf create mode 100644 Minecraft.Client/Common/Media/SignEntryMenu720.swf create mode 100644 Minecraft.Client/Common/Media/SignEntryMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/SignEntryMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/SignEntryMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/SkinSelectMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/SkinSelectMenu480.swf create mode 100644 Minecraft.Client/Common/Media/SkinSelectMenu720.swf create mode 100644 Minecraft.Client/Common/Media/SkinSelectMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/SkinSelectMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/SkinSelectMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/SocialPost1080.swf create mode 100644 Minecraft.Client/Common/Media/SocialPost480.swf create mode 100644 Minecraft.Client/Common/Media/SocialPost720.swf create mode 100644 Minecraft.Client/Common/Media/SocialPostSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/SocialPostSplit720.swf create mode 100644 Minecraft.Client/Common/Media/SocialPostVita.swf create mode 100644 Minecraft.Client/Common/Media/Sound/MenuSounds.xap create mode 100644 Minecraft.Client/Common/Media/Sound/Xbox/MenuSounds.xgs create mode 100644 Minecraft.Client/Common/Media/Sound/Xbox/MenuSounds.xsb create mode 100644 Minecraft.Client/Common/Media/Sound/Xbox/MenuSounds.xwb create mode 100644 Minecraft.Client/Common/Media/Sound/btn_Back.wav create mode 100644 Minecraft.Client/Common/Media/Sound/click.wav create mode 100644 Minecraft.Client/Common/Media/Sound/pop.wav create mode 100644 Minecraft.Client/Common/Media/Sound/wood click.wav create mode 100644 Minecraft.Client/Common/Media/Timer1080.swf create mode 100644 Minecraft.Client/Common/Media/Timer480.swf create mode 100644 Minecraft.Client/Common/Media/Timer720.swf create mode 100644 Minecraft.Client/Common/Media/TimerSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/TimerSplit720.swf create mode 100644 Minecraft.Client/Common/Media/TimerVita.swf create mode 100644 Minecraft.Client/Common/Media/ToolTips1080.swf create mode 100644 Minecraft.Client/Common/Media/ToolTips480.swf create mode 100644 Minecraft.Client/Common/Media/ToolTips720.swf create mode 100644 Minecraft.Client/Common/Media/ToolTipsSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/ToolTipsSplit720.swf create mode 100644 Minecraft.Client/Common/Media/ToolTipsVita.swf create mode 100644 Minecraft.Client/Common/Media/TradingMenu1080.swf create mode 100644 Minecraft.Client/Common/Media/TradingMenu480.swf create mode 100644 Minecraft.Client/Common/Media/TradingMenu720.swf create mode 100644 Minecraft.Client/Common/Media/TradingMenuSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/TradingMenuSplit720.swf create mode 100644 Minecraft.Client/Common/Media/TradingMenuVita.swf create mode 100644 Minecraft.Client/Common/Media/TrialExitUpsell480.swf create mode 100644 Minecraft.Client/Common/Media/TrialExitUpsell720.swf create mode 100644 Minecraft.Client/Common/Media/TutorialPopup1080.swf create mode 100644 Minecraft.Client/Common/Media/TutorialPopup480.swf create mode 100644 Minecraft.Client/Common/Media/TutorialPopup720.swf create mode 100644 Minecraft.Client/Common/Media/TutorialPopupSplit1080.swf create mode 100644 Minecraft.Client/Common/Media/TutorialPopupSplit720.swf create mode 100644 Minecraft.Client/Common/Media/TutorialPopupVita.swf create mode 100644 Minecraft.Client/Common/Media/de-DE/4J_strings.resx create mode 100644 Minecraft.Client/Common/Media/de-DE/strings.resx create mode 100644 Minecraft.Client/Common/Media/en-EN.lang create mode 100644 Minecraft.Client/Common/Media/es-ES/4J_strings.resx create mode 100644 Minecraft.Client/Common/Media/es-ES/strings.resx create mode 100644 Minecraft.Client/Common/Media/font/CHT/DFHeiMedium-B5.ttf create mode 100644 Minecraft.Client/Common/Media/font/CHT/DFTT_R5.TTC create mode 100644 Minecraft.Client/Common/Media/font/JPN/DF-DotDotGothic16.ttf create mode 100644 Minecraft.Client/Common/Media/font/JPN/DFGMaruGothic-Md.ttf create mode 100644 Minecraft.Client/Common/Media/font/KOR/BOKMSD.ttf create mode 100644 Minecraft.Client/Common/Media/font/KOR/candadite2.ttf create mode 100644 Minecraft.Client/Common/Media/font/Mojang Font_11.ttf create mode 100644 Minecraft.Client/Common/Media/font/Mojang Font_7.ttf create mode 100644 Minecraft.Client/Common/Media/font/Mojangles.ttf create mode 100644 Minecraft.Client/Common/Media/font/Mojangles_11.abc create mode 100644 Minecraft.Client/Common/Media/font/Mojangles_7.abc create mode 100644 Minecraft.Client/Common/Media/font/RU/SpaceMace.ttf create mode 100644 Minecraft.Client/Common/Media/font/chars.txt create mode 100644 Minecraft.Client/Common/Media/fr-FR/4J_strings.resx create mode 100644 Minecraft.Client/Common/Media/fr-FR/strings.resx create mode 100644 Minecraft.Client/Common/Media/it-IT/4J_strings.resx create mode 100644 Minecraft.Client/Common/Media/it-IT/strings.resx create mode 100644 Minecraft.Client/Common/Media/ja-JP/4J_strings.resx create mode 100644 Minecraft.Client/Common/Media/ja-JP/strings.resx create mode 100644 Minecraft.Client/Common/Media/ko-KR/4J_strings.resx create mode 100644 Minecraft.Client/Common/Media/ko-KR/strings.resx create mode 100644 Minecraft.Client/Common/Media/languages.loc create mode 100644 Minecraft.Client/Common/Media/media.txt create mode 100644 Minecraft.Client/Common/Media/movies1080.txt create mode 100644 Minecraft.Client/Common/Media/movies480.txt create mode 100644 Minecraft.Client/Common/Media/movies720.txt create mode 100644 Minecraft.Client/Common/Media/moviesVita.txt create mode 100644 Minecraft.Client/Common/Media/pt-BR/4J_strings.resx create mode 100644 Minecraft.Client/Common/Media/pt-BR/strings.resx create mode 100644 Minecraft.Client/Common/Media/pt-PT/4J_strings.resx create mode 100644 Minecraft.Client/Common/Media/pt-PT/strings.resx create mode 100644 Minecraft.Client/Common/Media/skin.swf create mode 100644 Minecraft.Client/Common/Media/skinGraphics.swf create mode 100644 Minecraft.Client/Common/Media/skinGraphicsHud.swf create mode 100644 Minecraft.Client/Common/Media/skinGraphicsInGame.swf create mode 100644 Minecraft.Client/Common/Media/skinGraphicsLabels.swf create mode 100644 Minecraft.Client/Common/Media/skinHD.swf create mode 100644 Minecraft.Client/Common/Media/skinHDGraphics.swf create mode 100644 Minecraft.Client/Common/Media/skinHDGraphicsHud.swf create mode 100644 Minecraft.Client/Common/Media/skinHDGraphicsInGame.swf create mode 100644 Minecraft.Client/Common/Media/skinHDGraphicsLabels.swf create mode 100644 Minecraft.Client/Common/Media/skinHDHud.swf create mode 100644 Minecraft.Client/Common/Media/skinHDInGame.swf create mode 100644 Minecraft.Client/Common/Media/skinHDLabels.swf create mode 100644 Minecraft.Client/Common/Media/skinHud.swf create mode 100644 Minecraft.Client/Common/Media/skinInGame.swf create mode 100644 Minecraft.Client/Common/Media/skinLabels.swf create mode 100644 Minecraft.Client/Common/Media/skin_Minecraft.xui create mode 100644 Minecraft.Client/Common/Media/splashes.txt create mode 100644 Minecraft.Client/Common/Media/strings.resx create mode 100644 Minecraft.Client/Common/Media/xuiscene_DLCMain.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_DLCMain.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_DLCMain_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_DLCMain_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_DLCOffers.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_DLCOffers.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_DLCOffers_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_DLCOffers_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_anvil.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_anvil.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_anvil_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_anvil_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_base.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_base.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_base_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_base_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_base_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_base_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_brewingstand.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_brewingstand.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_brewingstand_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_brewingstand_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_brewingstand_Small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_brewingstand_Small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_chat.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_chat.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_chat_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_chat_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_chat_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_chat_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_connectingprogress.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_connectingprogress.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_connectingprogress_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_connectingprogress_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_connectingprogress_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_connectingprogress_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_container.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_container.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_container_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_container_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_container_large_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_container_large_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_container_large_Small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_container_large_Small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_container_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_container_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_controls.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_controls.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_controls_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_controls_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_controls_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_controls_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_credits.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_credits.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_credits_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_credits_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_death.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_death.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_death_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_death_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_death_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_death_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_debug.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_debug.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_debug_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_debug_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_debug_item_editor.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_debug_item_editor.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_debug_schematic_create.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_debug_schematic_create.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_debug_set_camera.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_debug_set_camera.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_debug_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_debug_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_debugoverlay.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_debugoverlay.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_debugoverlay_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_debugoverlay_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_debugtips.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_debugtips.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_debugtips_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_debugtips_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_debugtips_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_debugtips_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_enchant.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_enchant.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_enchant_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_enchant_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_enchant_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_enchant_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_fullscreenprogress.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_fullscreenprogress.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_furnace.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_furnace.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_furnace_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_furnace_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_furnace_Small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_furnace_Small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_helpandoptions.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_helpandoptions.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_helpandoptions_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_helpandoptions_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_helpandoptions_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_helpandoptions_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_howtoplay.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_howtoplay.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_howtoplay_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_howtoplay_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_howtoplay_menu.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_howtoplay_menu.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_howtoplay_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_howtoplay_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_hud.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_hud.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_hud_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_hud_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_hud_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_hud_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_ingame_host_options.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_ingame_host_options.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_ingame_host_options_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_ingame_host_options_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_ingame_host_options_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_ingame_host_options_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_ingame_player_options.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_ingame_player_options.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_ingame_player_options_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_ingame_player_options_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_ingame_player_options_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_ingame_player_options_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_ingameinfo.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_ingameinfo.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_ingameinfo_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_ingameinfo_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_ingameinfo_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_ingameinfo_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_intro.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_intro.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_intro_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_intro_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_inventory.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_inventory.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_inventory_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_inventory_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_inventory_creative.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_inventory_creative.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_inventory_creative_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_inventory_creative_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_inventory_creative_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_inventory_creative_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_inventory_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_inventory_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_leaderboards.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_leaderboards.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_leaderboards_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_leaderboards_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_load_settings.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_load_settings.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_load_settings_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_load_settings_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_main.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_main.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_main_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_main_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_multi_create.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_multi_create.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_multi_create_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_multi_create_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_multi_gameinfo.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_multi_gameinfo.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_multi_gameinfo_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_multi_gameinfo_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_multi_joinload.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_multi_joinload.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_multi_joinload_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_multi_joinload_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_partnernetpassword.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_partnernetpassword.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_partnernetpassword_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_partnernetpassword_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_pause.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_pause.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_pause_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_pause_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_pause_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_pause_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_reinstall.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_reinstall.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_reinstall_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_reinstall_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_reinstall_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_reinstall_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_savemessage.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_savemessage.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_savemessage_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_savemessage_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_All.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_All.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_All_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_All_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_All_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_All_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_Audio.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_Audio.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_Audio_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_Audio_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_Audio_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_Audio_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_Control.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_Control.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_Control_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_Control_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_Control_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_Control_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_Graphics.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_Graphics.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_Graphics_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_Graphics_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_Graphics_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_Graphics_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_UI.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_UI.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_UI_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_UI_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_UI_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_UI_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_options.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_options.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_options_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_options_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_options_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_settings_options_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_signentry.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_signentry.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_signentry_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_signentry_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_signentry_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_signentry_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_skinselect.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_skinselect.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_skinselect_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_skinselect_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_skinselect_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_skinselect_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_socialpost.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_socialpost.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_socialpost_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_socialpost_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_socialpost_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_socialpost_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_teleportmenu.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_teleportmenu.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_teleportmenu_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_teleportmenu_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_teleportmenu_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_teleportmenu_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_text_entry.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_text_entry.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_trading.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_trading.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_trading_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_trading_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_trap.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_trap.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_trap_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_trap_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_trap_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_trap_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_trialexitupsell.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_trialexitupsell.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_trialexitupsell_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_trialexitupsell_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_tutorialpopup.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_tutorialpopup.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_tutorialpopup_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_tutorialpopup_480.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_tutorialpopup_small.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_tutorialpopup_small.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_win.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_win.xui create mode 100644 Minecraft.Client/Common/Media/xuiscene_win_480.h create mode 100644 Minecraft.Client/Common/Media/xuiscene_win_480.xui create mode 100644 Minecraft.Client/Common/Media/zh-CHT/4J_strings.resx create mode 100644 Minecraft.Client/Common/Media/zh-CHT/strings.resx create mode 100644 Minecraft.Client/Common/Minecraft_Macros.h create mode 100644 Minecraft.Client/Common/Network/GameNetworkManager.cpp create mode 100644 Minecraft.Client/Common/Network/GameNetworkManager.h create mode 100644 Minecraft.Client/Common/Network/NetworkPlayerInterface.h create mode 100644 Minecraft.Client/Common/Network/PlatformNetworkManagerInterface.h create mode 100644 Minecraft.Client/Common/Network/PlatformNetworkManagerStub.cpp create mode 100644 Minecraft.Client/Common/Network/PlatformNetworkManagerStub.h create mode 100644 Minecraft.Client/Common/Network/SessionInfo.h create mode 100644 Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.cpp create mode 100644 Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.h create mode 100644 Minecraft.Client/Common/Network/Sony/PlatformNetworkManagerSony.cpp create mode 100644 Minecraft.Client/Common/Network/Sony/PlatformNetworkManagerSony.h create mode 100644 Minecraft.Client/Common/Network/Sony/SQRNetworkManager.cpp create mode 100644 Minecraft.Client/Common/Network/Sony/SQRNetworkManager.h create mode 100644 Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.cpp create mode 100644 Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.h create mode 100644 Minecraft.Client/Common/Network/Sony/SonyCommerce.cpp create mode 100644 Minecraft.Client/Common/Network/Sony/SonyCommerce.h create mode 100644 Minecraft.Client/Common/Network/Sony/SonyHttp.cpp create mode 100644 Minecraft.Client/Common/Network/Sony/SonyHttp.h create mode 100644 Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.cpp create mode 100644 Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.h create mode 100644 Minecraft.Client/Common/Network/Sony/sceRemoteStorage/header/sceRemoteStorage.h create mode 100644 Minecraft.Client/Common/Network/Sony/sceRemoteStorage/header/sceRemoteStorageDefines.h create mode 100644 Minecraft.Client/Common/Network/Sony/sceRemoteStorage/ps3/lib/sceRemoteStorage.a create mode 100644 Minecraft.Client/Common/Network/Sony/sceRemoteStorage/ps4/lib/sceRemoteStorage.a create mode 100644 Minecraft.Client/Common/Network/Sony/sceRemoteStorage/psvita/lib/sceRemoteStorage.a create mode 100644 Minecraft.Client/Common/Potion_Macros.h create mode 100644 Minecraft.Client/Common/Telemetry/TelemetryManager.cpp create mode 100644 Minecraft.Client/Common/Telemetry/TelemetryManager.h create mode 100644 Minecraft.Client/Common/Trial/TrialLevel.mcs create mode 100644 Minecraft.Client/Common/Trial/TrialMode.cpp create mode 100644 Minecraft.Client/Common/Trial/TrialMode.h create mode 100644 Minecraft.Client/Common/Tutorial/AreaConstraint.cpp create mode 100644 Minecraft.Client/Common/Tutorial/AreaConstraint.h create mode 100644 Minecraft.Client/Common/Tutorial/AreaHint.cpp create mode 100644 Minecraft.Client/Common/Tutorial/AreaHint.h create mode 100644 Minecraft.Client/Common/Tutorial/AreaTask.cpp create mode 100644 Minecraft.Client/Common/Tutorial/AreaTask.h create mode 100644 Minecraft.Client/Common/Tutorial/ChangeStateConstraint.cpp create mode 100644 Minecraft.Client/Common/Tutorial/ChangeStateConstraint.h create mode 100644 Minecraft.Client/Common/Tutorial/ChoiceTask.cpp create mode 100644 Minecraft.Client/Common/Tutorial/ChoiceTask.h create mode 100644 Minecraft.Client/Common/Tutorial/CompleteUsingItemTask.cpp create mode 100644 Minecraft.Client/Common/Tutorial/CompleteUsingItemTask.h create mode 100644 Minecraft.Client/Common/Tutorial/ControllerTask.cpp create mode 100644 Minecraft.Client/Common/Tutorial/ControllerTask.h create mode 100644 Minecraft.Client/Common/Tutorial/CraftTask.cpp create mode 100644 Minecraft.Client/Common/Tutorial/CraftTask.h create mode 100644 Minecraft.Client/Common/Tutorial/DiggerItemHint.cpp create mode 100644 Minecraft.Client/Common/Tutorial/DiggerItemHint.h create mode 100644 Minecraft.Client/Common/Tutorial/EffectChangedTask.cpp create mode 100644 Minecraft.Client/Common/Tutorial/EffectChangedTask.h create mode 100644 Minecraft.Client/Common/Tutorial/FullTutorial.cpp create mode 100644 Minecraft.Client/Common/Tutorial/FullTutorial.h create mode 100644 Minecraft.Client/Common/Tutorial/FullTutorialActiveTask.cpp create mode 100644 Minecraft.Client/Common/Tutorial/FullTutorialActiveTask.h create mode 100644 Minecraft.Client/Common/Tutorial/FullTutorialMode.cpp create mode 100644 Minecraft.Client/Common/Tutorial/FullTutorialMode.h create mode 100644 Minecraft.Client/Common/Tutorial/InfoTask.cpp create mode 100644 Minecraft.Client/Common/Tutorial/InfoTask.h create mode 100644 Minecraft.Client/Common/Tutorial/InputConstraint.cpp create mode 100644 Minecraft.Client/Common/Tutorial/InputConstraint.h create mode 100644 Minecraft.Client/Common/Tutorial/LookAtEntityHint.cpp create mode 100644 Minecraft.Client/Common/Tutorial/LookAtEntityHint.h create mode 100644 Minecraft.Client/Common/Tutorial/LookAtTileHint.cpp create mode 100644 Minecraft.Client/Common/Tutorial/LookAtTileHint.h create mode 100644 Minecraft.Client/Common/Tutorial/PickupTask.cpp create mode 100644 Minecraft.Client/Common/Tutorial/PickupTask.h create mode 100644 Minecraft.Client/Common/Tutorial/ProcedureCompoundTask.cpp create mode 100644 Minecraft.Client/Common/Tutorial/ProcedureCompoundTask.h create mode 100644 Minecraft.Client/Common/Tutorial/ProgressFlagTask.cpp create mode 100644 Minecraft.Client/Common/Tutorial/ProgressFlagTask.h create mode 100644 Minecraft.Client/Common/Tutorial/StatTask.cpp create mode 100644 Minecraft.Client/Common/Tutorial/StatTask.h create mode 100644 Minecraft.Client/Common/Tutorial/StateChangeTask.h create mode 100644 Minecraft.Client/Common/Tutorial/TakeItemHint.cpp create mode 100644 Minecraft.Client/Common/Tutorial/TakeItemHint.h create mode 100644 Minecraft.Client/Common/Tutorial/Tutorial create mode 100644 Minecraft.Client/Common/Tutorial/Tutorial.cpp create mode 100644 Minecraft.Client/Common/Tutorial/Tutorial.h create mode 100644 Minecraft.Client/Common/Tutorial/TutorialConstraint.h create mode 100644 Minecraft.Client/Common/Tutorial/TutorialConstraints.h create mode 100644 Minecraft.Client/Common/Tutorial/TutorialEnum.h create mode 100644 Minecraft.Client/Common/Tutorial/TutorialHint.cpp create mode 100644 Minecraft.Client/Common/Tutorial/TutorialHint.h create mode 100644 Minecraft.Client/Common/Tutorial/TutorialHints.h create mode 100644 Minecraft.Client/Common/Tutorial/TutorialMessage.cpp create mode 100644 Minecraft.Client/Common/Tutorial/TutorialMessage.h create mode 100644 Minecraft.Client/Common/Tutorial/TutorialMode.cpp create mode 100644 Minecraft.Client/Common/Tutorial/TutorialMode.h create mode 100644 Minecraft.Client/Common/Tutorial/TutorialTask.cpp create mode 100644 Minecraft.Client/Common/Tutorial/TutorialTask.h create mode 100644 Minecraft.Client/Common/Tutorial/TutorialTasks.h create mode 100644 Minecraft.Client/Common/Tutorial/UseItemTask.cpp create mode 100644 Minecraft.Client/Common/Tutorial/UseItemTask.h create mode 100644 Minecraft.Client/Common/Tutorial/UseTileTask.cpp create mode 100644 Minecraft.Client/Common/Tutorial/UseTileTask.h create mode 100644 Minecraft.Client/Common/Tutorial/XuiCraftingTask.cpp create mode 100644 Minecraft.Client/Common/Tutorial/XuiCraftingTask.h create mode 100644 Minecraft.Client/Common/UI/IUIController.h create mode 100644 Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp create mode 100644 Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.h create mode 100644 Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp create mode 100644 Minecraft.Client/Common/UI/IUIScene_AnvilMenu.h create mode 100644 Minecraft.Client/Common/UI/IUIScene_BrewingMenu.cpp create mode 100644 Minecraft.Client/Common/UI/IUIScene_BrewingMenu.h create mode 100644 Minecraft.Client/Common/UI/IUIScene_ContainerMenu.cpp create mode 100644 Minecraft.Client/Common/UI/IUIScene_ContainerMenu.h create mode 100644 Minecraft.Client/Common/UI/IUIScene_CraftingMenu.cpp create mode 100644 Minecraft.Client/Common/UI/IUIScene_CraftingMenu.h create mode 100644 Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp create mode 100644 Minecraft.Client/Common/UI/IUIScene_CreativeMenu.h create mode 100644 Minecraft.Client/Common/UI/IUIScene_DispenserMenu.cpp create mode 100644 Minecraft.Client/Common/UI/IUIScene_DispenserMenu.h create mode 100644 Minecraft.Client/Common/UI/IUIScene_EnchantingMenu.cpp create mode 100644 Minecraft.Client/Common/UI/IUIScene_EnchantingMenu.h create mode 100644 Minecraft.Client/Common/UI/IUIScene_FurnaceMenu.cpp create mode 100644 Minecraft.Client/Common/UI/IUIScene_FurnaceMenu.h create mode 100644 Minecraft.Client/Common/UI/IUIScene_InventoryMenu.cpp create mode 100644 Minecraft.Client/Common/UI/IUIScene_InventoryMenu.h create mode 100644 Minecraft.Client/Common/UI/IUIScene_PauseMenu.cpp create mode 100644 Minecraft.Client/Common/UI/IUIScene_PauseMenu.h create mode 100644 Minecraft.Client/Common/UI/IUIScene_StartGame.cpp create mode 100644 Minecraft.Client/Common/UI/IUIScene_StartGame.h create mode 100644 Minecraft.Client/Common/UI/IUIScene_TradingMenu.cpp create mode 100644 Minecraft.Client/Common/UI/IUIScene_TradingMenu.h create mode 100644 Minecraft.Client/Common/UI/UI.h create mode 100644 Minecraft.Client/Common/UI/UIBitmapFont.cpp create mode 100644 Minecraft.Client/Common/UI/UIBitmapFont.h create mode 100644 Minecraft.Client/Common/UI/UIComponent_Chat.cpp create mode 100644 Minecraft.Client/Common/UI/UIComponent_Chat.h create mode 100644 Minecraft.Client/Common/UI/UIComponent_DebugUIConsole.cpp create mode 100644 Minecraft.Client/Common/UI/UIComponent_DebugUIConsole.h create mode 100644 Minecraft.Client/Common/UI/UIComponent_DebugUIMarketingGuide.cpp create mode 100644 Minecraft.Client/Common/UI/UIComponent_DebugUIMarketingGuide.h create mode 100644 Minecraft.Client/Common/UI/UIComponent_Logo.cpp create mode 100644 Minecraft.Client/Common/UI/UIComponent_Logo.h create mode 100644 Minecraft.Client/Common/UI/UIComponent_MenuBackground.cpp create mode 100644 Minecraft.Client/Common/UI/UIComponent_MenuBackground.h create mode 100644 Minecraft.Client/Common/UI/UIComponent_Panorama.cpp create mode 100644 Minecraft.Client/Common/UI/UIComponent_Panorama.h create mode 100644 Minecraft.Client/Common/UI/UIComponent_PressStartToPlay.cpp create mode 100644 Minecraft.Client/Common/UI/UIComponent_PressStartToPlay.h create mode 100644 Minecraft.Client/Common/UI/UIComponent_Tooltips.cpp create mode 100644 Minecraft.Client/Common/UI/UIComponent_Tooltips.h create mode 100644 Minecraft.Client/Common/UI/UIComponent_TutorialPopup.cpp create mode 100644 Minecraft.Client/Common/UI/UIComponent_TutorialPopup.h create mode 100644 Minecraft.Client/Common/UI/UIControl.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl.h create mode 100644 Minecraft.Client/Common/UI/UIControl_Base.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl_Base.h create mode 100644 Minecraft.Client/Common/UI/UIControl_BitmapIcon.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl_BitmapIcon.h create mode 100644 Minecraft.Client/Common/UI/UIControl_Button.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl_Button.h create mode 100644 Minecraft.Client/Common/UI/UIControl_ButtonList.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl_ButtonList.h create mode 100644 Minecraft.Client/Common/UI/UIControl_CheckBox.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl_CheckBox.h create mode 100644 Minecraft.Client/Common/UI/UIControl_Cursor.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl_Cursor.h create mode 100644 Minecraft.Client/Common/UI/UIControl_DLCList.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl_DLCList.h create mode 100644 Minecraft.Client/Common/UI/UIControl_DynamicLabel.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl_DynamicLabel.h create mode 100644 Minecraft.Client/Common/UI/UIControl_EnchantmentBook.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl_EnchantmentBook.h create mode 100644 Minecraft.Client/Common/UI/UIControl_EnchantmentButton.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl_EnchantmentButton.h create mode 100644 Minecraft.Client/Common/UI/UIControl_HTMLLabel.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl_HTMLLabel.h create mode 100644 Minecraft.Client/Common/UI/UIControl_Label.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl_Label.h create mode 100644 Minecraft.Client/Common/UI/UIControl_LeaderboardList.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl_LeaderboardList.h create mode 100644 Minecraft.Client/Common/UI/UIControl_MinecraftPlayer.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl_MinecraftPlayer.h create mode 100644 Minecraft.Client/Common/UI/UIControl_PlayerList.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl_PlayerList.h create mode 100644 Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.h create mode 100644 Minecraft.Client/Common/UI/UIControl_Progress.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl_Progress.h create mode 100644 Minecraft.Client/Common/UI/UIControl_SaveList.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl_SaveList.h create mode 100644 Minecraft.Client/Common/UI/UIControl_Slider.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl_Slider.h create mode 100644 Minecraft.Client/Common/UI/UIControl_SlotList.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl_SlotList.h create mode 100644 Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.h create mode 100644 Minecraft.Client/Common/UI/UIControl_TextInput.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl_TextInput.h create mode 100644 Minecraft.Client/Common/UI/UIControl_TexturePackList.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl_TexturePackList.h create mode 100644 Minecraft.Client/Common/UI/UIControl_Touch.cpp create mode 100644 Minecraft.Client/Common/UI/UIControl_Touch.h create mode 100644 Minecraft.Client/Common/UI/UIController.cpp create mode 100644 Minecraft.Client/Common/UI/UIController.h create mode 100644 Minecraft.Client/Common/UI/UIEnums.h create mode 100644 Minecraft.Client/Common/UI/UIFontData.cpp create mode 100644 Minecraft.Client/Common/UI/UIFontData.h create mode 100644 Minecraft.Client/Common/UI/UIGroup.cpp create mode 100644 Minecraft.Client/Common/UI/UIGroup.h create mode 100644 Minecraft.Client/Common/UI/UILayer.cpp create mode 100644 Minecraft.Client/Common/UI/UILayer.h create mode 100644 Minecraft.Client/Common/UI/UIScene.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene.h create mode 100644 Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_AnvilMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_AnvilMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_BrewingStandMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_BrewingStandMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_ConnectingProgress.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_ConnectingProgress.h create mode 100644 Minecraft.Client/Common/UI/UIScene_ContainerMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_ContainerMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_ControlsMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_ControlsMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_CraftingMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_CraftingMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_CreativeMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_CreativeMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_Credits.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_Credits.h create mode 100644 Minecraft.Client/Common/UI/UIScene_DLCMainMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_DLCMainMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_DLCOffersMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_DLCOffersMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_DeathMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_DeathMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_DebugCreateSchematic.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_DebugCreateSchematic.h create mode 100644 Minecraft.Client/Common/UI/UIScene_DebugOptions.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_DebugOptions.h create mode 100644 Minecraft.Client/Common/UI/UIScene_DebugOverlay.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_DebugOverlay.h create mode 100644 Minecraft.Client/Common/UI/UIScene_DebugSetCamera.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_DebugSetCamera.h create mode 100644 Minecraft.Client/Common/UI/UIScene_DispenserMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_DispenserMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_EULA.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_EULA.h create mode 100644 Minecraft.Client/Common/UI/UIScene_EnchantingMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_EnchantingMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_EndPoem.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_EndPoem.h create mode 100644 Minecraft.Client/Common/UI/UIScene_FullscreenProgress.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_FullscreenProgress.h create mode 100644 Minecraft.Client/Common/UI/UIScene_FurnaceMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_FurnaceMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_HUD.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_HUD.h create mode 100644 Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_HowToPlay.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_HowToPlay.h create mode 100644 Minecraft.Client/Common/UI/UIScene_HowToPlayMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_HowToPlayMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_InGameSaveManagementMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_InGameSaveManagementMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_Intro.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_Intro.h create mode 100644 Minecraft.Client/Common/UI/UIScene_InventoryMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_InventoryMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_JoinMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_Keyboard.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_Keyboard.h create mode 100644 Minecraft.Client/Common/UI/UIScene_LaunchMoreOptionsMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_LaunchMoreOptionsMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_LoadMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_LoadMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_MainMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_MainMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_MessageBox.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_MessageBox.h create mode 100644 Minecraft.Client/Common/UI/UIScene_PauseMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_PauseMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_QuadrantSignin.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_QuadrantSignin.h create mode 100644 Minecraft.Client/Common/UI/UIScene_ReinstallMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_ReinstallMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_SaveMessage.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_SaveMessage.h create mode 100644 Minecraft.Client/Common/UI/UIScene_SettingsAudioMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_SettingsAudioMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_SettingsControlMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_SettingsControlMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_SettingsMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_SettingsMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_SettingsUIMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_SettingsUIMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_SignEntryMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_SignEntryMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_TeleportMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_TeleportMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_Timer.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_Timer.h create mode 100644 Minecraft.Client/Common/UI/UIScene_TradingMenu.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_TradingMenu.h create mode 100644 Minecraft.Client/Common/UI/UIScene_TrialExitUpsell.cpp create mode 100644 Minecraft.Client/Common/UI/UIScene_TrialExitUpsell.h create mode 100644 Minecraft.Client/Common/UI/UIStructs.h create mode 100644 Minecraft.Client/Common/UI/UITTFFont.cpp create mode 100644 Minecraft.Client/Common/UI/UITTFFont.h create mode 100644 Minecraft.Client/Common/XUI/SlotProgressControl.cpp create mode 100644 Minecraft.Client/Common/XUI/SlotProgressControl.h create mode 100644 Minecraft.Client/Common/XUI/XUI_BasePlayer.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_BasePlayer.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Chat.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Chat.h create mode 100644 Minecraft.Client/Common/XUI/XUI_ConnectingProgress.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_ConnectingProgress.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Control_ComboBox.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Control_ComboBox.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Controls.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_4JEdit.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_4JEdit.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_4JIcon.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_4JIcon.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_4JList.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_4JList.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_BrewProgress.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_BrewProgress.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_BubblesProgress.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_BubblesProgress.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_BurnProgress.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_BurnProgress.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_CraftIngredientSlot.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_CraftIngredientSlot.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantButton.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantButton.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantmentBook.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantmentBook.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantmentButtonText.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantmentButtonText.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_FireProgress.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_FireProgress.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_LoadingProgress.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_LoadingProgress.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftPlayer.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftPlayer.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSkinPreview.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSkinPreview.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSlot.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSlot.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_MobEffect.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_MobEffect.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_PassThroughList.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_PassthroughList.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_ProgressCtrlBase.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_ProgressCtrlBase.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_SliderWrapper.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_SliderWrapper.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItem.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItemCtrlBase.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItemCtrlBase.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItemListItem.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_SlotList.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_SlotList.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_SplashPulser.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Ctrl_SplashPulser.h create mode 100644 Minecraft.Client/Common/XUI/XUI_CustomMessages.h create mode 100644 Minecraft.Client/Common/XUI/XUI_DLCOffers.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_DLCOffers.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Death.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Death.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Debug.h create mode 100644 Minecraft.Client/Common/XUI/XUI_DebugItemEditor.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_DebugItemEditor.h create mode 100644 Minecraft.Client/Common/XUI/XUI_DebugOverlay.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_DebugOverlay.h create mode 100644 Minecraft.Client/Common/XUI/XUI_DebugSchematicCreator.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_DebugSchematicCreator.h create mode 100644 Minecraft.Client/Common/XUI/XUI_DebugSetCamera.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_DebugSetCamera.h create mode 100644 Minecraft.Client/Common/XUI/XUI_DebugTips.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_DebugTips.h create mode 100644 Minecraft.Client/Common/XUI/XUI_FullscreenProgress.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_FullscreenProgress.h create mode 100644 Minecraft.Client/Common/XUI/XUI_HUD.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_HUD.h create mode 100644 Minecraft.Client/Common/XUI/XUI_HelpAndOptions.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_HelpAndOptions.h create mode 100644 Minecraft.Client/Common/XUI/XUI_HelpControls.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_HelpControls.h create mode 100644 Minecraft.Client/Common/XUI/XUI_HelpCredits.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_HelpCredits.h create mode 100644 Minecraft.Client/Common/XUI/XUI_HelpHowToPlay.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_HelpHowToPlay.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Helper.h create mode 100644 Minecraft.Client/Common/XUI/XUI_HowToPlayMenu.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_HowToPlayMenu.h create mode 100644 Minecraft.Client/Common/XUI/XUI_InGameHostOptions.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_InGameHostOptions.h create mode 100644 Minecraft.Client/Common/XUI/XUI_InGameInfo.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_InGameInfo.h create mode 100644 Minecraft.Client/Common/XUI/XUI_InGamePlayerOptions.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_InGamePlayerOptions.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Intro.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Intro.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Leaderboards.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Leaderboards.h create mode 100644 Minecraft.Client/Common/XUI/XUI_LoadSettings.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_LoadSettings.h create mode 100644 Minecraft.Client/Common/XUI/XUI_MainMenu.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_MainMenu.h create mode 100644 Minecraft.Client/Common/XUI/XUI_MultiGameCreate.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_MultiGameCreate.h create mode 100644 Minecraft.Client/Common/XUI/XUI_MultiGameInfo.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_MultiGameInfo.h create mode 100644 Minecraft.Client/Common/XUI/XUI_MultiGameJoinLoad.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_MultiGameJoinLoad.h create mode 100644 Minecraft.Client/Common/XUI/XUI_MultiGameLaunchMoreOptions.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_MultiGameLaunchMoreOptions.h create mode 100644 Minecraft.Client/Common/XUI/XUI_NewUpdateMessage.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_NewUpdateMessage.h create mode 100644 Minecraft.Client/Common/XUI/XUI_PartnernetPassword.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_PartnernetPassword.h create mode 100644 Minecraft.Client/Common/XUI/XUI_PauseMenu.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_PauseMenu.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Reinstall.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Reinstall.h create mode 100644 Minecraft.Client/Common/XUI/XUI_SaveMessage.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_SaveMessage.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Scene_AbstractContainer.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Scene_AbstractContainer.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Scene_Anvil.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Scene_Anvil.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Scene_Base.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Scene_Base.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Scene_BrewingStand.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Scene_BrewingStand.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Scene_Container.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Scene_Container.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Scene_CraftingPanel.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Scene_CraftingPanel.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Scene_Enchant.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Scene_Enchant.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Scene_Furnace.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Scene_Furnace.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Scene_Inventory.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Scene_Inventory.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Scene_Inventory_Creative.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Scene_Inventory_Creative.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Scene_Trading.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Scene_Trading.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Scene_Trap.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Scene_Trap.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Scene_Win.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Scene_Win.h create mode 100644 Minecraft.Client/Common/XUI/XUI_SettingsAll.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_SettingsAll.h create mode 100644 Minecraft.Client/Common/XUI/XUI_SettingsAudio.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_SettingsAudio.h create mode 100644 Minecraft.Client/Common/XUI/XUI_SettingsControl.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_SettingsControl.h create mode 100644 Minecraft.Client/Common/XUI/XUI_SettingsGraphics.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_SettingsGraphics.h create mode 100644 Minecraft.Client/Common/XUI/XUI_SettingsOptions.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_SettingsOptions.h create mode 100644 Minecraft.Client/Common/XUI/XUI_SettingsUI.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_SettingsUI.h create mode 100644 Minecraft.Client/Common/XUI/XUI_SignEntry.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_SignEntry.h create mode 100644 Minecraft.Client/Common/XUI/XUI_SkinSelect.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_SkinSelect.h create mode 100644 Minecraft.Client/Common/XUI/XUI_SocialPost.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_SocialPost.h create mode 100644 Minecraft.Client/Common/XUI/XUI_Teleport.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_Teleport.h create mode 100644 Minecraft.Client/Common/XUI/XUI_TextEntry.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_TextEntry.h create mode 100644 Minecraft.Client/Common/XUI/XUI_TransferToXboxOne.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_TransferToXboxOne.h create mode 100644 Minecraft.Client/Common/XUI/XUI_TrialExitUpsell.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_TrialExitUpsell.h create mode 100644 Minecraft.Client/Common/XUI/XUI_TutorialPopup.cpp create mode 100644 Minecraft.Client/Common/XUI/XUI_TutorialPopup.h create mode 100644 Minecraft.Client/Common/XUI/XUI_XZP_Icons.h create mode 100644 Minecraft.Client/Common/XUI/XUI_debug.cpp create mode 100644 Minecraft.Client/Common/res/1_2_2/achievement/bg.png create mode 100644 Minecraft.Client/Common/res/1_2_2/achievement/icons.png create mode 100644 Minecraft.Client/Common/res/1_2_2/armor/chain_1.png create mode 100644 Minecraft.Client/Common/res/1_2_2/armor/chain_2.png create mode 100644 Minecraft.Client/Common/res/1_2_2/armor/cloth_1.png create mode 100644 Minecraft.Client/Common/res/1_2_2/armor/cloth_2.png create mode 100644 Minecraft.Client/Common/res/1_2_2/armor/diamond_1.png create mode 100644 Minecraft.Client/Common/res/1_2_2/armor/diamond_2.png create mode 100644 Minecraft.Client/Common/res/1_2_2/armor/gold_1.png create mode 100644 Minecraft.Client/Common/res/1_2_2/armor/gold_2.png create mode 100644 Minecraft.Client/Common/res/1_2_2/armor/iron_1.png create mode 100644 Minecraft.Client/Common/res/1_2_2/armor/iron_2.png create mode 100644 Minecraft.Client/Common/res/1_2_2/armor/power.png create mode 100644 Minecraft.Client/Common/res/1_2_2/art/kz.png create mode 100644 Minecraft.Client/Common/res/1_2_2/environment/clouds.png create mode 100644 Minecraft.Client/Common/res/1_2_2/environment/light_normal.png create mode 100644 Minecraft.Client/Common/res/1_2_2/environment/rain.png create mode 100644 Minecraft.Client/Common/res/1_2_2/environment/snow.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/alternate.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/default.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_00.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_01.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_02.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_03.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_04.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_05.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_06.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_07.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_09.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_0A.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_0B.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_0C.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_0D.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_0E.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_0F.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_10.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_11.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_12.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_13.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_14.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_15.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_16.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_17.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_18.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_19.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_1A.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_1B.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_1C.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_1D.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_1E.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_1F.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_20.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_21.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_22.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_23.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_24.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_25.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_26.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_27.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_28.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_29.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_2A.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_2B.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_2C.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_2D.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_2E.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_2F.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_30.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_31.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_32.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_33.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_34.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_35.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_36.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_37.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_38.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_39.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_3A.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_3B.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_3C.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_3D.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_3E.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_3F.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_40.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_41.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_42.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_43.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_44.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_45.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_46.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_47.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_48.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_49.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_4A.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_4B.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_4C.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_4D.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_4E.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_4F.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_50.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_51.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_52.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_53.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_54.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_55.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_56.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_57.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_58.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_59.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_5A.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_5B.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_5C.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_5D.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_5E.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_5F.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_60.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_61.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_62.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_63.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_64.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_65.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_66.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_67.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_68.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_69.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_6A.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_6B.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_6C.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_6D.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_6E.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_6F.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_70.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_71.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_72.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_73.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_74.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_75.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_76.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_77.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_78.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_79.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_7A.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_7B.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_7C.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_7D.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_7E.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_7F.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_80.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_81.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_82.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_83.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_84.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_85.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_86.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_87.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_88.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_89.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_8A.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_8B.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_8C.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_8D.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_8E.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_8F.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_90.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_91.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_92.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_93.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_94.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_95.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_96.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_97.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_98.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_99.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_9A.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_9B.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_9C.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_9D.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_9E.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_9F.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_A0.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_A1.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_A2.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_A3.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_A4.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_A5.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_A6.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_A7.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_A8.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_A9.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_AA.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_AB.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_AC.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_AD.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_AE.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_AF.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_B0.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_B1.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_B2.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_B3.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_B4.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_B5.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_B6.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_B7.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_B8.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_B9.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_BA.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_BB.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_BC.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_BD.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_BE.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_BF.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_C0.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_C1.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_C2.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_C3.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_C4.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_C5.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_C6.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_C7.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_C8.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_C9.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_CA.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_CB.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_CC.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_CD.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_CE.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_CF.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_D0.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_D1.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_D2.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_D3.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_D4.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_D5.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_D6.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_D7.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_F9.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_FA.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_FB.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_FC.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_FD.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_FE.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_FF.png create mode 100644 Minecraft.Client/Common/res/1_2_2/font/glyph_sizes.bin create mode 100644 Minecraft.Client/Common/res/1_2_2/gui/alchemy.png create mode 100644 Minecraft.Client/Common/res/1_2_2/gui/allitems.png create mode 100644 Minecraft.Client/Common/res/1_2_2/gui/background.png create mode 100644 Minecraft.Client/Common/res/1_2_2/gui/container.png create mode 100644 Minecraft.Client/Common/res/1_2_2/gui/crafting.png create mode 100644 Minecraft.Client/Common/res/1_2_2/gui/crash_logo.png create mode 100644 Minecraft.Client/Common/res/1_2_2/gui/enchant.png create mode 100644 Minecraft.Client/Common/res/1_2_2/gui/furnace.png create mode 100644 Minecraft.Client/Common/res/1_2_2/gui/gui.png create mode 100644 Minecraft.Client/Common/res/1_2_2/gui/icons.png create mode 100644 Minecraft.Client/Common/res/1_2_2/gui/inventory.png create mode 100644 Minecraft.Client/Common/res/1_2_2/gui/items.png create mode 100644 Minecraft.Client/Common/res/1_2_2/gui/particles.png create mode 100644 Minecraft.Client/Common/res/1_2_2/gui/slot.png create mode 100644 Minecraft.Client/Common/res/1_2_2/gui/trap.png create mode 100644 Minecraft.Client/Common/res/1_2_2/gui/unknown_pack.png create mode 100644 Minecraft.Client/Common/res/1_2_2/item/arrows.png create mode 100644 Minecraft.Client/Common/res/1_2_2/item/boat.png create mode 100644 Minecraft.Client/Common/res/1_2_2/item/book.png create mode 100644 Minecraft.Client/Common/res/1_2_2/item/cart.png create mode 100644 Minecraft.Client/Common/res/1_2_2/item/chest.png create mode 100644 Minecraft.Client/Common/res/1_2_2/item/door.png create mode 100644 Minecraft.Client/Common/res/1_2_2/item/largechest.png create mode 100644 Minecraft.Client/Common/res/1_2_2/item/sign.png create mode 100644 Minecraft.Client/Common/res/1_2_2/item/xporb.png create mode 100644 Minecraft.Client/Common/res/1_2_2/misc/dial.png create mode 100644 Minecraft.Client/Common/res/1_2_2/misc/explosion.png create mode 100644 Minecraft.Client/Common/res/1_2_2/misc/foliagecolor.png create mode 100644 Minecraft.Client/Common/res/1_2_2/misc/footprint.png create mode 100644 Minecraft.Client/Common/res/1_2_2/misc/glint.png create mode 100644 Minecraft.Client/Common/res/1_2_2/misc/grasscolor.png create mode 100644 Minecraft.Client/Common/res/1_2_2/misc/mapbg.png create mode 100644 Minecraft.Client/Common/res/1_2_2/misc/mapicons.png create mode 100644 Minecraft.Client/Common/res/1_2_2/misc/particlefield.png create mode 100644 Minecraft.Client/Common/res/1_2_2/misc/pumpkinblur.png create mode 100644 Minecraft.Client/Common/res/1_2_2/misc/shadow.png create mode 100644 Minecraft.Client/Common/res/1_2_2/misc/tunnel.png create mode 100644 Minecraft.Client/Common/res/1_2_2/misc/vignette.png create mode 100644 Minecraft.Client/Common/res/1_2_2/misc/water.png create mode 100644 Minecraft.Client/Common/res/1_2_2/misc/watercolor.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/cat_black.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/cat_red.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/cat_siamese.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/cavespider.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/char.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/chicken.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/cow.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/creeper.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/enderdragon/beam.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/enderdragon/body.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/enderdragon/crystal.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/enderdragon/dragon.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/enderdragon/ender.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/enderdragon/ender_eyes.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/enderdragon/shuffle.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/enderman.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/enderman_eyes.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/fire.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/ghast.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/ghast_fire.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/lava.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/ozelot.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/pig.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/pigman.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/pigzombie.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/redcow.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/saddle.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/sheep.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/sheep_fur.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/silverfish.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/skeleton.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/slime.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/snowman.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/spider.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/spider_eyes.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/squid.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/villager.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/villager/butcher.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/villager/farmer.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/villager/librarian.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/villager/priest.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/villager/smith.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/villager/villager.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/villager_golem.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/wolf.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/wolf_angry.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/wolf_tame.png create mode 100644 Minecraft.Client/Common/res/1_2_2/mob/zombie.png create mode 100644 Minecraft.Client/Common/res/1_2_2/pack.png create mode 100644 Minecraft.Client/Common/res/1_2_2/pack.txt create mode 100644 Minecraft.Client/Common/res/1_2_2/particles.png create mode 100644 Minecraft.Client/Common/res/1_2_2/terrain.png create mode 100644 Minecraft.Client/Common/res/1_2_2/terrain/moon.png create mode 100644 Minecraft.Client/Common/res/1_2_2/terrain/moon_phases.png create mode 100644 Minecraft.Client/Common/res/1_2_2/terrain/sun.png create mode 100644 Minecraft.Client/Common/res/1_2_2/title/bg/panorama0.png create mode 100644 Minecraft.Client/Common/res/1_2_2/title/bg/panorama1.png create mode 100644 Minecraft.Client/Common/res/1_2_2/title/bg/panorama2.png create mode 100644 Minecraft.Client/Common/res/1_2_2/title/bg/panorama3.png create mode 100644 Minecraft.Client/Common/res/1_2_2/title/bg/panorama4.png create mode 100644 Minecraft.Client/Common/res/1_2_2/title/bg/panorama5.png create mode 100644 Minecraft.Client/Common/res/1_2_2/title/black.png create mode 100644 Minecraft.Client/Common/res/1_2_2/title/credits.txt create mode 100644 Minecraft.Client/Common/res/1_2_2/title/earlyplayers.txt create mode 100644 Minecraft.Client/Common/res/1_2_2/title/mclogo.png create mode 100644 Minecraft.Client/Common/res/1_2_2/title/mojang.png create mode 100644 Minecraft.Client/Common/res/1_2_2/title/splashes.txt create mode 100644 Minecraft.Client/Common/res/1_2_2/title/win.txt create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Candy/Data/TexturePack.xzp create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Candy/Data/x16Data.pck create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/City/Data/TexturePack.xzp create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/City/Data/x32Data.pck create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Fantasy/Data/TexturePack.xzp create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Fantasy/Data/x32Data.pck create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Halloween/Data/TexturePack.xzp create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Halloween/Data/x16Data.pck create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/Data/GameRules.grf create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/Data/TexturePack.xzp create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/Data/x16Data.pck create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/TexturePack.pck create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/GameRules.grf create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/TexturePack.xzp create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/masseffect.mcs create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/x16Data.pck create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/TexturePack.pck create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Natural/Data/TexturePack.xzp create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Natural/Data/x32Data.pck create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Plastic/Data/TexturePack.xzp create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Plastic/Data/x16Data.pck create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/Data/GameRules.grf create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/Data/TexturePack.xzp create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/Data/x16Data.pck create mode 100644 Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/TexturePack.pck create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildAll.cmd create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule.cmd create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule_Durango.cmd create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule_Orbis.cmd create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule_PS3.cmd create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule_PSVita.cmd create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule_Windows64.cmd create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule_Xbox.cmd create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.sln create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj.filters create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj.vspscc create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRulesDefinition.xsd create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/GameRules.grf create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/GameRules.grh create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/GameRules.xml create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/de-DE.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/es-ES.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/fr-FR.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/it-IT.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/ja-JP.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/ko-KR.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/pt-BR.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/pt-PT.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/zh-CHT.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/en-EN.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/de-DE.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/es-ES.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/fr-FR.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/it-IT.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/ja-JP.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/ko-KR.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/pt-BR.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/pt-PT.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/zh-CHT.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/en-EN.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/da-DA.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/de-DE.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/es-ES.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/fi-FI.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/fr-FR.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/it-IT.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/ja-JP.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/ko-KR.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/la-LAS.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/nl-NL.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/no-NO.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/pl-PL.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/pt-BR.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/pt-PT.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/ru-RU.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/sv-SV.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/tr-TR.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/zh-CHT.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/en-EN.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/da-DA.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/de-DE.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/es-ES.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/fi-FI.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/fr-FR.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/it-IT.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/ja-JP.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/ko-KR.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/la-LAS.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/nl-NL.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/no-NO.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/pl-PL.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/pt-BR.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/pt-PT.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/ru-RU.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/sv-SV.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/tr-TR.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/zh-CHT.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/en-EN.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/da-DA.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/de-DE.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/es-ES.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/fi-FI.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/fr-FR.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/it-IT.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/ja-JP.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/ko-KR.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/la-LAS.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/nl-NL.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/no-NO.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/pl-PL.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/pt-BR.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/pt-PT.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/ru-RU.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/sv-SV.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/tr-TR.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/zh-CHT.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/en-EN.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/de-DE.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/es-ES.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/fr-FR.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/it-IT.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/ja-JP.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/ko-KR.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/pt-BR.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/pt-PT.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/zh-CHT.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/en-EN.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/de-DE.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/es-ES.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/fr-FR.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/it-IT.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/ja-JP.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/ko-KR.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/pt-BR.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/pt-PT.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/zh-CHT.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/en-EN.lang create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Tutorial.pck create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Tutorial.xml create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/languages.loc create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Boat.sch create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/CasTes1.sch create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/CasTes2.sch create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/JungleTemp.sch create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Lava.sch create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/MinecraftSign.sch create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Mushroom.sch create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/PillarHouse.sch create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Pyramid.sch create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/RuinedHouse.sch create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Ship.sch create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Smithy.sch create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/SnowHouse.sch create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Spider.sch create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Stairs.sch create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/StoneCircle.sch create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/StoneTemp.sch create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Tower.sch create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/UWChamber.sch create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/launchCMD.cmd create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/Tutorial.pck create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/Tutorial_Durango.pck create mode 100644 Minecraft.Client/Common/res/TitleUpdate/GameRules/Tutorial_Orbis.pck create mode 100644 Minecraft.Client/Common/res/TitleUpdate/audio/AdditionalMusic.xwb create mode 100644 Minecraft.Client/Common/res/TitleUpdate/audio/Minecraft.xgs create mode 100644 Minecraft.Client/Common/res/TitleUpdate/audio/additional.xsb create mode 100644 Minecraft.Client/Common/res/TitleUpdate/audio/additional.xwb create mode 100644 Minecraft.Client/Common/res/TitleUpdate/audio/minecraft.xsb create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_1.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_1_b.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_2.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_2_b.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/armor/power.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/art/kz.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/colours.col create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/colours.xml create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/font/Default.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/font/Mojangles_11.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/font/Mojangles_7.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/item/book.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/item/enderchest.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/items.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/misc/additionalmapicons.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/misc/explosion.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/misc/footprint.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/misc/glint.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/misc/mapicons.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/misc/particlefield.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/misc/tunnel.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/enderdragon/beam.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/enderdragon/ender.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/enderdragon/ender_eyes.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/enderman_eyes.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/redcow.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/skeleton_wither.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/snowman.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/butcher.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/farmer.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/librarian.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/priest.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/smith.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/villager.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/wolf_collar.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/wolf_tame.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/zombie.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/mob/zombie_villager.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/particles.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/terrain.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/terrainMipMapLevel2.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/terrainMipMapLevel3.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_0.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_0.txt create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_1.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_1.txt create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava.txt create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava_flow.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava_flow.txt create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/portal.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/portal.txt create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water.txt create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water_flow.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water_flow.txt create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/textures/items/clock.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/textures/items/clock.txt create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/textures/items/compass.png create mode 100644 Minecraft.Client/Common/res/TitleUpdate/res/textures/items/compass.txt create mode 100644 Minecraft.Client/Common/res/TitleUpdate/tutorialDiff create mode 100644 Minecraft.Client/Common/res/achievement/bg.png create mode 100644 Minecraft.Client/Common/res/achievement/icons.png create mode 100644 Minecraft.Client/Common/res/armor/chain_1.png create mode 100644 Minecraft.Client/Common/res/armor/chain_2.png create mode 100644 Minecraft.Client/Common/res/armor/cloth_1.png create mode 100644 Minecraft.Client/Common/res/armor/cloth_2.png create mode 100644 Minecraft.Client/Common/res/armor/diamond_1.png create mode 100644 Minecraft.Client/Common/res/armor/diamond_2.png create mode 100644 Minecraft.Client/Common/res/armor/gold_1.png create mode 100644 Minecraft.Client/Common/res/armor/gold_2.png create mode 100644 Minecraft.Client/Common/res/armor/iron_1.png create mode 100644 Minecraft.Client/Common/res/armor/iron_2.png create mode 100644 Minecraft.Client/Common/res/armor/power.png create mode 100644 Minecraft.Client/Common/res/art/kz.png create mode 100644 Minecraft.Client/Common/res/audio/Minecraft.xgs create mode 100644 Minecraft.Client/Common/res/audio/minecraft.xsb create mode 100644 Minecraft.Client/Common/res/audio/resident.xwb create mode 100644 Minecraft.Client/Common/res/audio/streamed.xwb create mode 100644 Minecraft.Client/Common/res/environment/clouds.png create mode 100644 Minecraft.Client/Common/res/environment/rain.png create mode 100644 Minecraft.Client/Common/res/environment/snow.png create mode 100644 Minecraft.Client/Common/res/font/Mojangles_11.png create mode 100644 Minecraft.Client/Common/res/font/Mojangles_7.png create mode 100644 Minecraft.Client/Common/res/font/default.png create mode 100644 Minecraft.Client/Common/res/gui/background.png create mode 100644 Minecraft.Client/Common/res/gui/container.png create mode 100644 Minecraft.Client/Common/res/gui/crafting.png create mode 100644 Minecraft.Client/Common/res/gui/furnace.png create mode 100644 Minecraft.Client/Common/res/gui/gui.png create mode 100644 Minecraft.Client/Common/res/gui/icons.png create mode 100644 Minecraft.Client/Common/res/gui/inventory.png create mode 100644 Minecraft.Client/Common/res/gui/items.png create mode 100644 Minecraft.Client/Common/res/gui/logo.png create mode 100644 Minecraft.Client/Common/res/gui/particles.png create mode 100644 Minecraft.Client/Common/res/gui/slot.png create mode 100644 Minecraft.Client/Common/res/gui/trap.png create mode 100644 Minecraft.Client/Common/res/gui/unknown_pack.png create mode 100644 Minecraft.Client/Common/res/item/arrows.png create mode 100644 Minecraft.Client/Common/res/item/boat.png create mode 100644 Minecraft.Client/Common/res/item/cart.png create mode 100644 Minecraft.Client/Common/res/item/door.png create mode 100644 Minecraft.Client/Common/res/item/sign.png create mode 100644 Minecraft.Client/Common/res/misc/dial.png create mode 100644 Minecraft.Client/Common/res/misc/foliagecolor.png create mode 100644 Minecraft.Client/Common/res/misc/footprint.png create mode 100644 Minecraft.Client/Common/res/misc/grasscolor.png create mode 100644 Minecraft.Client/Common/res/misc/mapbg.png create mode 100644 Minecraft.Client/Common/res/misc/mapicons.png create mode 100644 Minecraft.Client/Common/res/misc/pumpkinblur.png create mode 100644 Minecraft.Client/Common/res/misc/shadow.png create mode 100644 Minecraft.Client/Common/res/misc/vignette.png create mode 100644 Minecraft.Client/Common/res/misc/water.png create mode 100644 Minecraft.Client/Common/res/misc/watercolor.png create mode 100644 Minecraft.Client/Common/res/mob/char.png create mode 100644 Minecraft.Client/Common/res/mob/char1.png create mode 100644 Minecraft.Client/Common/res/mob/char2.png create mode 100644 Minecraft.Client/Common/res/mob/char3.png create mode 100644 Minecraft.Client/Common/res/mob/char4.png create mode 100644 Minecraft.Client/Common/res/mob/char5.png create mode 100644 Minecraft.Client/Common/res/mob/char6.png create mode 100644 Minecraft.Client/Common/res/mob/char7.png create mode 100644 Minecraft.Client/Common/res/mob/chicken.png create mode 100644 Minecraft.Client/Common/res/mob/cow.png create mode 100644 Minecraft.Client/Common/res/mob/creeper.png create mode 100644 Minecraft.Client/Common/res/mob/ghast.png create mode 100644 Minecraft.Client/Common/res/mob/ghast_fire.png create mode 100644 Minecraft.Client/Common/res/mob/pig.png create mode 100644 Minecraft.Client/Common/res/mob/pigman.png create mode 100644 Minecraft.Client/Common/res/mob/pigzombie.png create mode 100644 Minecraft.Client/Common/res/mob/saddle.png create mode 100644 Minecraft.Client/Common/res/mob/sheep.png create mode 100644 Minecraft.Client/Common/res/mob/sheep_fur.png create mode 100644 Minecraft.Client/Common/res/mob/skeleton.png create mode 100644 Minecraft.Client/Common/res/mob/slime.png create mode 100644 Minecraft.Client/Common/res/mob/spider.png create mode 100644 Minecraft.Client/Common/res/mob/spider_eyes.png create mode 100644 Minecraft.Client/Common/res/mob/squid.png create mode 100644 Minecraft.Client/Common/res/mob/wolf.png create mode 100644 Minecraft.Client/Common/res/mob/wolf_angry.png create mode 100644 Minecraft.Client/Common/res/mob/wolf_tame.png create mode 100644 Minecraft.Client/Common/res/mob/zombie.png create mode 100644 Minecraft.Client/Common/res/pack.png create mode 100644 Minecraft.Client/Common/res/particles.png create mode 100644 Minecraft.Client/Common/res/terrain.png create mode 100644 Minecraft.Client/Common/res/terrain/moon.png create mode 100644 Minecraft.Client/Common/res/terrain/sun.png create mode 100644 Minecraft.Client/Common/res/title/black.png create mode 100644 Minecraft.Client/Common/res/title/mclogo.png create mode 100644 Minecraft.Client/Common/res/title/mojang.png create mode 100644 Minecraft.Client/Common/xuiscene_base.h create mode 100644 Minecraft.Client/Common/zlib/adler32.c create mode 100644 Minecraft.Client/Common/zlib/compress.c create mode 100644 Minecraft.Client/Common/zlib/crc32.c create mode 100644 Minecraft.Client/Common/zlib/crc32.h create mode 100644 Minecraft.Client/Common/zlib/deflate.c create mode 100644 Minecraft.Client/Common/zlib/deflate.h create mode 100644 Minecraft.Client/Common/zlib/gzclose.c create mode 100644 Minecraft.Client/Common/zlib/gzguts.h create mode 100644 Minecraft.Client/Common/zlib/gzlib.c create mode 100644 Minecraft.Client/Common/zlib/gzread.c create mode 100644 Minecraft.Client/Common/zlib/gzwrite.c create mode 100644 Minecraft.Client/Common/zlib/infback.c create mode 100644 Minecraft.Client/Common/zlib/inffast.c create mode 100644 Minecraft.Client/Common/zlib/inffast.h create mode 100644 Minecraft.Client/Common/zlib/inffixed.h create mode 100644 Minecraft.Client/Common/zlib/inflate.c create mode 100644 Minecraft.Client/Common/zlib/inflate.h create mode 100644 Minecraft.Client/Common/zlib/inftrees.c create mode 100644 Minecraft.Client/Common/zlib/inftrees.h create mode 100644 Minecraft.Client/Common/zlib/trees.c create mode 100644 Minecraft.Client/Common/zlib/trees.h create mode 100644 Minecraft.Client/Common/zlib/uncompr.c create mode 100644 Minecraft.Client/Common/zlib/zconf.h create mode 100644 Minecraft.Client/Common/zlib/zlib.h create mode 100644 Minecraft.Client/Common/zlib/zutil.c create mode 100644 Minecraft.Client/Common/zlib/zutil.h (limited to 'Minecraft.Client/Common') diff --git a/Minecraft.Client/Common/App_Defines.h b/Minecraft.Client/Common/App_Defines.h new file mode 100644 index 00000000..de1d1bdc --- /dev/null +++ b/Minecraft.Client/Common/App_Defines.h @@ -0,0 +1,130 @@ +#pragma once + + +// 4J Stu - For non-splitscreen menus, default to this screen +#define DEFAULT_XUI_MENU_USER 0 +#define MULTITHREAD_ENABLE +#define MAX_CAPENAME_SIZE 32 +#define MAX_BANNERNAME_SIZE 32 +#define MAX_TMSFILENAME_SIZE 40 +#define MAX_TYPE_SIZE 32 +#define MAX_EXTENSION_TYPES 3 + +#ifdef __PSVITA__ +#define MAX_LOCAL_PLAYERS 1 +#else +#define MAX_LOCAL_PLAYERS 4 +#endif + +// 4J Stu - Required for sentient reporting of whether the volume level has been changed or not +#define DEFAULT_VOLUME_LEVEL 100 + +#define GAME_HOST_OPTION_BITMASK_DIFFICULTY 0x00000003 // 0 - 3 +#define GAME_HOST_OPTION_BITMASK_FRIENDSOFFRIENDS 0x00000004 +#define GAME_HOST_OPTION_BITMASK_GAMERTAGS 0x00000008 +#define GAME_HOST_OPTION_BITMASK_GAMETYPE 0x00000030 +#define GAME_HOST_OPTION_BITMASK_LEVELTYPE 0x00000040 +#define GAME_HOST_OPTION_BITMASK_STRUCTURES 0x00000080 +#define GAME_HOST_OPTION_BITMASK_BONUSCHEST 0x00000100 +#define GAME_HOST_OPTION_BITMASK_BEENINCREATIVE 0x00000200 +#define GAME_HOST_OPTION_BITMASK_PVP 0x00000400 +#define GAME_HOST_OPTION_BITMASK_TRUSTPLAYERS 0x00000800 +#define GAME_HOST_OPTION_BITMASK_TNT 0x00001000 +#define GAME_HOST_OPTION_BITMASK_FIRESPREADS 0x00002000 +#define GAME_HOST_OPTION_BITMASK_HOSTFLY 0x00004000 +#define GAME_HOST_OPTION_BITMASK_HOSTHUNGER 0x00008000 +#define GAME_HOST_OPTION_BITMASK_HOSTINVISIBLE 0x00010000 +#define GAME_HOST_OPTION_BITMASK_BEDROCKFOG 0x00020000 +#define GAME_HOST_OPTION_BITMASK_DISABLESAVE 0x00040000 +#define GAME_HOST_OPTION_BITMASK_ALL 0xFFFFFFFF + +#ifdef _XBOX +#define PROFILE_VERSION_1 1 +#define PROFILE_VERSION_2 2 +#define PROFILE_VERSION_3 3 +#define PROFILE_VERSION_4 4 +#define PROFILE_VERSION_5 6 +#define PROFILE_VERSION_6 7 +#define PROFILE_VERSION_7 8 +#endif +#define PROFILE_VERSION_8 10 +#define PROFILE_VERSION_9 11 + +#define PROFILE_VERSION_10 12 + +// 4J-JEV: New Statistics and Achievements for 'NexGen' platforms. +#define PROFILE_VERSION_BUILD_JUNE14 13 + +#define MAX_FAVORITE_SKINS 10 // these are stored in the profile data so keep it small + + + + + +// defines for game settings - uiBitmaskValues + +#define GAMESETTING_CLOUDS 0x00000001 +#define GAMESETTING_ONLINE 0x00000002 +#define GAMESETTING_INVITEONLY 0x00000004 +#define GAMESETTING_FRIENDSOFFRIENDS 0x00000008 +#define GAMESETTING_DISPLAYUPDATEMSG 0x00000030 +#define GAMESETTING_BEDROCKFOG 0x00000040 +#define GAMESETTING_DISPLAYHUD 0x00000080 +#define GAMESETTING_DISPLAYHAND 0x00000100 +#define GAMESETTING_CUSTOMSKINANIM 0x00000200 +#define GAMESETTING_DEATHMESSAGES 0x00000400 +#define GAMESETTING_UISIZE 0x00001800 +#define GAMESETTING_UISIZE_SPLITSCREEN 0x00006000 +#define GAMESETTING_ANIMATEDCHARACTER 0x00008000 +#define GAMESETTING_PS3EULAREAD 0x00010000 +#define GAMESETTING_PSVITANETWORKMODEADHOC 0x00020000 + + +// defines for languages + +#define MINECRAFT_LANGUAGE_DEFAULT 0x00 +#define MINECRAFT_LANGUAGE_ENGLISH 0x01 +#define MINECRAFT_LANGUAGE_JAPANESE 0x02 +#define MINECRAFT_LANGUAGE_GERMAN 0x03 +#define MINECRAFT_LANGUAGE_FRENCH 0x04 +#define MINECRAFT_LANGUAGE_SPANISH 0x05 +#define MINECRAFT_LANGUAGE_ITALIAN 0x06 +#define MINECRAFT_LANGUAGE_KOREAN 0x07 +#define MINECRAFT_LANGUAGE_TCHINESE 0x08 +#define MINECRAFT_LANGUAGE_PORTUGUESE 0x09 +#define MINECRAFT_LANGUAGE_BRAZILIAN 0x0A +#define MINECRAFT_LANGUAGE_RUSSIAN 0x0B +#define MINECRAFT_LANGUAGE_DUTCH 0x0C +#define MINECRAFT_LANGUAGE_FINISH 0x0D +#define MINECRAFT_LANGUAGE_SWEDISH 0x0E +#define MINECRAFT_LANGUAGE_DANISH 0x0F +#define MINECRAFT_LANGUAGE_NORWEGIAN 0x10 +#define MINECRAFT_LANGUAGE_POLISH 0x11 +#define MINECRAFT_LANGUAGE_TURKISH 0x12 +#define MINECRAFT_LANGUAGE_LATINAMERICANSPANISH 0x13 +#define MINECRAFT_LANGUAGE_GREEK 0x14 + + + /* Match these + + const int XC_LANGUAGE_ENGLISH =1; + const int XC_LANGUAGE_JAPANESE =2; + const int XC_LANGUAGE_GERMAN =3; + const int XC_LANGUAGE_FRENCH =4; + const int XC_LANGUAGE_SPANISH =5; + const int XC_LANGUAGE_ITALIAN =6; + const int XC_LANGUAGE_KOREAN =7; + const int XC_LANGUAGE_TCHINESE =8; + const int XC_LANGUAGE_PORTUGUESE =9; + const int XC_LANGUAGE_BRAZILIAN =10; + const int XC_LANGUAGE_RUSSIAN =11; + const int XC_LANGUAGE_DUTCH =12; + const int XC_LANGUAGE_FINISH =13; + const int XC_LANGUAGE_SWEDISH =14; + const int XC_LANGUAGE_DANISH =15; + const int XC_LANGUAGE_NORWEGIAN =16; + const int XC_LANGUAGE_POLISH =17; + const int XC_LANGUAGE_TURKISH =18; + const int XC_LANGUAGE_LATINAMERICANSPANISH =19; + const int XC_LANGUAGE_GREEK =20; + */ diff --git a/Minecraft.Client/Common/App_enums.h b/Minecraft.Client/Common/App_enums.h new file mode 100644 index 00000000..b6c484dc --- /dev/null +++ b/Minecraft.Client/Common/App_enums.h @@ -0,0 +1,913 @@ +#pragma once + +enum eFileExtensionType +{ + eFileExtensionType_PNG=0, + eFileExtensionType_INF, + eFileExtensionType_DAT, +}; + +enum eTMSFileType +{ + eTMSFileType_MinecraftStore=0, + eTMSFileType_TexturePack, + eTMSFileType_All +}; + +enum eTPDFileType +{ + eTPDFileType_Loc=0, + eTPDFileType_Icon, +// eTPDFileType_Banner, + eTPDFileType_Comparison, +}; + +enum eFont +{ + eFont_European=0, + eFont_Korean, + eFont_Japanese, + eFont_Chinese, + eFont_None, // to fallback to nothing +}; + +enum eXuiAction +{ + eAppAction_Idle=0, + eAppAction_SaveGame, + eAppAction_SaveGameCapturedThumbnail, + eAppAction_ExitWorld, + eAppAction_ExitWorldCapturedThumbnail, + eAppAction_ExitWorldTrial, + //eAppAction_ExitGameFatalLoadError, + eAppAction_Respawn, + eAppAction_WaitForRespawnComplete, + eAppAction_PrimaryPlayerSignedOut, + eAppAction_PrimaryPlayerSignedOutReturned, + eAppAction_PrimaryPlayerSignedOutReturned_Menus, + eAppAction_ExitPlayer, // secondary player + eAppAction_ExitPlayerPreLogin, + eAppAction_TrialOver, + eAppAction_ExitTrial, + eAppAction_WaitForDimensionChangeComplete, + eAppAction_SocialPost, + eAppAction_SocialPostScreenshot, + eAppAction_EthernetDisconnected, + eAppAction_EthernetDisconnectedReturned, + eAppAction_EthernetDisconnectedReturned_Menus, + eAppAction_ExitAndJoinFromInvite, + eAppAction_DashboardTrialJoinFromInvite, + eAppAction_ExitAndJoinFromInviteConfirmed, + eAppAction_JoinFromInvite, + eAppAction_ChangeSessionType, + eAppAction_SetDefaultOptions, + eAppAction_LocalPlayerJoined, + eAppAction_RemoteServerSave, + eAppAction_WaitRemoteServerSaveComplete, + eAppAction_FailedToJoinNoPrivileges, + eAppAction_AutosaveSaveGame, + eAppAction_AutosaveSaveGameCapturedThumbnail, + eAppAction_ProfileReadError, + eAppAction_DisplayLavaMessage, + eAppAction_BanLevel, + eAppAction_LevelInBanLevelList, + + eAppAction_ReloadTexturePack, + eAppAction_TexturePackRequired, // when the user has joined from invite, but doesn't have the texture pack + +#ifdef __ORBIS__ + eAppAction_OptionsSaveNoSpace, +#endif + eAppAction_DebugText, + +}; + + + +enum eTMSAction +{ + eTMSAction_Idle=0, + eTMSAction_TMS_RetrieveFiles_Complete, + eTMSAction_TMSPP_RetrieveFiles_CreateLoad_SignInReturned, + eTMSAction_TMSPP_RetrieveFiles_RunPlayGame, + eTMSAction_TMSPP_RetrieveFiles_HelpAndOptions, + eTMSAction_TMSPP_RetrieveFiles_DLCMain, + eTMSAction_TMSPP_GlobalFileList, + eTMSAction_TMSPP_GlobalFileList_Waiting, +// eTMSAction_TMSPP_ConfigFile, +// eTMSAction_TMSPP_ConfigFile_Waiting, + eTMSAction_TMSPP_UserFileList, + eTMSAction_TMSPP_UserFileList_Waiting, + eTMSAction_TMSPP_XUIDSFile, + eTMSAction_TMSPP_XUIDSFile_Waiting, + eTMSAction_TMSPP_DLCFile, + eTMSAction_TMSPP_DLCFile_Waiting, + eTMSAction_TMSPP_BannedListFile, + eTMSAction_TMSPP_BannedListFile_Waiting, + eTMSAction_TMSPP_RetrieveFiles_Complete, + eTMSAction_TMSPP_DLCFileOnly, + eTMSAction_TMSPP_RetrieveUserFilelist_DLCFileOnly, +}; + +// The server runs on its own thread, so we need to call its actions there rather than where all other Xui actions are performed +// In general these are debugging options +enum eXuiServerAction +{ + eXuiServerAction_Idle=0, + eXuiServerAction_DropItem, // Debug + eXuiServerAction_SaveGame, + eXuiServerAction_AutoSaveGame, + eXuiServerAction_SpawnMob, // Debug + eXuiServerAction_PauseServer, + eXuiServerAction_ToggleRain, // Debug + eXuiServerAction_ToggleThunder, // Debug + eXuiServerAction_ServerSettingChanged_Gamertags, + eXuiServerAction_ServerSettingChanged_Difficulty, + eXuiServerAction_ExportSchematic, //Debug + eXuiServerAction_ServerSettingChanged_BedrockFog, + eXuiServerAction_SetCameraLocation, //Debug +}; + +enum eGameSetting +{ + eGameSetting_MusicVolume=0, + eGameSetting_SoundFXVolume, + eGameSetting_Gamma, + eGameSetting_Difficulty, + eGameSetting_Sensitivity_InGame, + eGameSetting_Sensitivity_InMenu, + eGameSetting_ViewBob, + eGameSetting_ControlScheme, + eGameSetting_ControlInvertLook, + eGameSetting_ControlSouthPaw, + eGameSetting_SplitScreenVertical, + eGameSetting_GamertagsVisible, + // Interim TU 1.6.6 + eGameSetting_Autosave, + eGameSetting_DisplaySplitscreenGamertags, + eGameSetting_Hints, + eGameSetting_InterfaceOpacity, + eGameSetting_Tooltips, + // TU5 + eGameSetting_Clouds, + eGameSetting_Online, + eGameSetting_InviteOnly, + eGameSetting_FriendsOfFriends, + eGameSetting_DisplayUpdateMessage, + + // TU6 + eGameSetting_BedrockFog, + eGameSetting_DisplayHUD, + eGameSetting_DisplayHand, + + // TU7 + eGameSetting_CustomSkinAnim, + + // TU9 + eGameSetting_DeathMessages, + eGameSetting_UISize, + eGameSetting_UISizeSplitscreen, + eGameSetting_AnimatedCharacter, + + // PS3 + eGameSetting_PS3_EULA_Read, + + // PSVita + eGameSetting_PSVita_NetworkModeAdhoc, + + +}; + + + +enum eGameMode +{ + eMode_Singleplayer, + eMode_Multiplayer +}; + + +enum eMinecraftColour +{ + eMinecraftColour_NOT_SET, + + eMinecraftColour_Foliage_Evergreen, + eMinecraftColour_Foliage_Birch, + eMinecraftColour_Foliage_Default, + eMinecraftColour_Foliage_Common, + eMinecraftColour_Foliage_Ocean, + eMinecraftColour_Foliage_Plains, + eMinecraftColour_Foliage_Desert, + eMinecraftColour_Foliage_ExtremeHills, + eMinecraftColour_Foliage_Forest, + eMinecraftColour_Foliage_Taiga, + eMinecraftColour_Foliage_Swampland, + eMinecraftColour_Foliage_River, + eMinecraftColour_Foliage_Hell, + eMinecraftColour_Foliage_Sky, + eMinecraftColour_Foliage_FrozenOcean, + eMinecraftColour_Foliage_FrozenRiver, + eMinecraftColour_Foliage_IcePlains, + eMinecraftColour_Foliage_IceMountains, + eMinecraftColour_Foliage_MushroomIsland, + eMinecraftColour_Foliage_MushroomIslandShore, + eMinecraftColour_Foliage_Beach, + eMinecraftColour_Foliage_DesertHills, + eMinecraftColour_Foliage_ForestHills, + eMinecraftColour_Foliage_TaigaHills, + eMinecraftColour_Foliage_ExtremeHillsEdge, + eMinecraftColour_Foliage_Jungle, + eMinecraftColour_Foliage_JungleHills, + + eMinecraftColour_Grass_Common, + eMinecraftColour_Grass_Ocean, + eMinecraftColour_Grass_Plains, + eMinecraftColour_Grass_Desert, + eMinecraftColour_Grass_ExtremeHills, + eMinecraftColour_Grass_Forest, + eMinecraftColour_Grass_Taiga, + eMinecraftColour_Grass_Swampland, + eMinecraftColour_Grass_River, + eMinecraftColour_Grass_Hell, + eMinecraftColour_Grass_Sky, + eMinecraftColour_Grass_FrozenOcean, + eMinecraftColour_Grass_FrozenRiver, + eMinecraftColour_Grass_IcePlains, + eMinecraftColour_Grass_IceMountains, + eMinecraftColour_Grass_MushroomIsland, + eMinecraftColour_Grass_MushroomIslandShore, + eMinecraftColour_Grass_Beach, + eMinecraftColour_Grass_DesertHills, + eMinecraftColour_Grass_ForestHills, + eMinecraftColour_Grass_TaigaHills, + eMinecraftColour_Grass_ExtremeHillsEdge, + eMinecraftColour_Grass_Jungle, + eMinecraftColour_Grass_JungleHills, + + eMinecraftColour_Water_Ocean, + eMinecraftColour_Water_Plains, + eMinecraftColour_Water_Desert, + eMinecraftColour_Water_ExtremeHills, + eMinecraftColour_Water_Forest, + eMinecraftColour_Water_Taiga, + eMinecraftColour_Water_Swampland, + eMinecraftColour_Water_River, + eMinecraftColour_Water_Hell, + eMinecraftColour_Water_Sky, + eMinecraftColour_Water_FrozenOcean, + eMinecraftColour_Water_FrozenRiver, + eMinecraftColour_Water_IcePlains, + eMinecraftColour_Water_IceMountains, + eMinecraftColour_Water_MushroomIsland, + eMinecraftColour_Water_MushroomIslandShore, + eMinecraftColour_Water_Beach, + eMinecraftColour_Water_DesertHills, + eMinecraftColour_Water_ForestHills, + eMinecraftColour_Water_TaigaHills, + eMinecraftColour_Water_ExtremeHillsEdge, + eMinecraftColour_Water_Jungle, + eMinecraftColour_Water_JungleHills, + + eMinecraftColour_Sky_Ocean, + eMinecraftColour_Sky_Plains, + eMinecraftColour_Sky_Desert, + eMinecraftColour_Sky_ExtremeHills, + eMinecraftColour_Sky_Forest, + eMinecraftColour_Sky_Taiga, + eMinecraftColour_Sky_Swampland, + eMinecraftColour_Sky_River, + eMinecraftColour_Sky_Hell, + eMinecraftColour_Sky_Sky, + eMinecraftColour_Sky_FrozenOcean, + eMinecraftColour_Sky_FrozenRiver, + eMinecraftColour_Sky_IcePlains, + eMinecraftColour_Sky_IceMountains, + eMinecraftColour_Sky_MushroomIsland, + eMinecraftColour_Sky_MushroomIslandShore, + eMinecraftColour_Sky_Beach, + eMinecraftColour_Sky_DesertHills, + eMinecraftColour_Sky_ForestHills, + eMinecraftColour_Sky_TaigaHills, + eMinecraftColour_Sky_ExtremeHillsEdge, + eMinecraftColour_Sky_Jungle, + eMinecraftColour_Sky_JungleHills, + + eMinecraftColour_Tile_RedstoneDust, + eMinecraftColour_Tile_RedstoneDustUnlit, + eMinecraftColour_Tile_RedstoneDustLitMin, + eMinecraftColour_Tile_RedstoneDustLitMax, + eMinecraftColour_Tile_StemMin, + eMinecraftColour_Tile_StemMax, + eMinecraftColour_Tile_WaterLily, + + eMinecraftColour_Sky_Dawn_Dark, + eMinecraftColour_Sky_Dawn_Bright, + + eMinecraftColour_Material_None, + eMinecraftColour_Material_Grass, + eMinecraftColour_Material_Sand, + eMinecraftColour_Material_Cloth, + eMinecraftColour_Material_Fire, + eMinecraftColour_Material_Ice, + eMinecraftColour_Material_Metal, + eMinecraftColour_Material_Plant, + eMinecraftColour_Material_Snow, + eMinecraftColour_Material_Clay, + eMinecraftColour_Material_Dirt, + eMinecraftColour_Material_Stone, + eMinecraftColour_Material_Water, + eMinecraftColour_Material_Wood, + eMinecraftColour_Material_Emerald, + + eMinecraftColour_Particle_Note_00, + eMinecraftColour_Particle_Note_01, + eMinecraftColour_Particle_Note_02, + eMinecraftColour_Particle_Note_03, + eMinecraftColour_Particle_Note_04, + eMinecraftColour_Particle_Note_05, + eMinecraftColour_Particle_Note_06, + eMinecraftColour_Particle_Note_07, + eMinecraftColour_Particle_Note_08, + eMinecraftColour_Particle_Note_09, + eMinecraftColour_Particle_Note_10, + eMinecraftColour_Particle_Note_11, + eMinecraftColour_Particle_Note_12, + eMinecraftColour_Particle_Note_13, + eMinecraftColour_Particle_Note_14, + eMinecraftColour_Particle_Note_15, + eMinecraftColour_Particle_Note_16, + eMinecraftColour_Particle_Note_17, + eMinecraftColour_Particle_Note_18, + eMinecraftColour_Particle_Note_19, + eMinecraftColour_Particle_Note_20, + eMinecraftColour_Particle_Note_21, + eMinecraftColour_Particle_Note_22, + eMinecraftColour_Particle_Note_23, + eMinecraftColour_Particle_Note_24, + + eMinecraftColour_Particle_NetherPortal, + eMinecraftColour_Particle_EnderPortal, + eMinecraftColour_Particle_Smoke, + eMinecraftColour_Particle_Ender, + eMinecraftColour_Particle_Explode, + eMinecraftColour_Particle_HugeExplosion, + eMinecraftColour_Particle_DripWater, + eMinecraftColour_Particle_DripLavaStart, + eMinecraftColour_Particle_DripLavaEnd, + eMinecraftColour_Particle_EnchantmentTable, + eMinecraftColour_Particle_DragonBreathMin, + eMinecraftColour_Particle_DragonBreathMax, + eMinecraftColour_Particle_Suspend, + eMinecraftColour_Particle_CritStart, + eMinecraftColour_Particle_CritEnd, + + eMinecraftColour_Effect_MovementSpeed, + eMinecraftColour_Effect_MovementSlowDown, + eMinecraftColour_Effect_DigSpeed, + eMinecraftColour_Effect_DigSlowdown, + eMinecraftColour_Effect_DamageBoost, + eMinecraftColour_Effect_Heal, + eMinecraftColour_Effect_Harm, + eMinecraftColour_Effect_Jump, + eMinecraftColour_Effect_Confusion, + eMinecraftColour_Effect_Regeneration, + eMinecraftColour_Effect_DamageResistance, + eMinecraftColour_Effect_FireResistance, + eMinecraftColour_Effect_WaterBreathing, + eMinecraftColour_Effect_Invisiblity, + eMinecraftColour_Effect_Blindness, + eMinecraftColour_Effect_NightVision, + eMinecraftColour_Effect_Hunger, + eMinecraftColour_Effect_Weakness, + eMinecraftColour_Effect_Poison, + + eMinecraftColour_Potion_BaseColour, + + eMinecraftColour_Mob_Creeper_Colour1, + eMinecraftColour_Mob_Creeper_Colour2, + eMinecraftColour_Mob_Skeleton_Colour1, + eMinecraftColour_Mob_Skeleton_Colour2, + eMinecraftColour_Mob_Spider_Colour1, + eMinecraftColour_Mob_Spider_Colour2, + eMinecraftColour_Mob_Zombie_Colour1, + eMinecraftColour_Mob_Zombie_Colour2, + eMinecraftColour_Mob_Slime_Colour1, + eMinecraftColour_Mob_Slime_Colour2, + eMinecraftColour_Mob_Ghast_Colour1, + eMinecraftColour_Mob_Ghast_Colour2, + eMinecraftColour_Mob_PigZombie_Colour1, + eMinecraftColour_Mob_PigZombie_Colour2, + eMinecraftColour_Mob_Enderman_Colour1, + eMinecraftColour_Mob_Enderman_Colour2, + eMinecraftColour_Mob_CaveSpider_Colour1, + eMinecraftColour_Mob_CaveSpider_Colour2, + eMinecraftColour_Mob_Silverfish_Colour1, + eMinecraftColour_Mob_Silverfish_Colour2, + eMinecraftColour_Mob_Blaze_Colour1, + eMinecraftColour_Mob_Blaze_Colour2, + eMinecraftColour_Mob_LavaSlime_Colour1, + eMinecraftColour_Mob_LavaSlime_Colour2, + eMinecraftColour_Mob_Pig_Colour1, + eMinecraftColour_Mob_Pig_Colour2, + eMinecraftColour_Mob_Sheep_Colour1, + eMinecraftColour_Mob_Sheep_Colour2, + eMinecraftColour_Mob_Cow_Colour1, + eMinecraftColour_Mob_Cow_Colour2, + eMinecraftColour_Mob_Chicken_Colour1, + eMinecraftColour_Mob_Chicken_Colour2, + eMinecraftColour_Mob_Squid_Colour1, + eMinecraftColour_Mob_Squid_Colour2, + eMinecraftColour_Mob_Wolf_Colour1, + eMinecraftColour_Mob_Wolf_Colour2, + eMinecraftColour_Mob_MushroomCow_Colour1, + eMinecraftColour_Mob_MushroomCow_Colour2, + eMinecraftColour_Mob_Ocelot_Colour1, + eMinecraftColour_Mob_Ocelot_Colour2, + eMinecraftColour_Mob_Villager_Colour1, + eMinecraftColour_Mob_Villager_Colour2, + + eMinecraftColour_Armour_Default_Leather_Colour, + + eMinecraftColour_Under_Water_Clear_Colour, + eMinecraftColour_Under_Lava_Clear_Colour, + eMinecraftColour_In_Cloud_Base_Colour, + + eMinecraftColour_Under_Water_Fog_Colour, + eMinecraftColour_Under_Lava_Fog_Colour, + eMinecraftColour_In_Cloud_Fog_Colour, + + eMinecraftColour_Default_Fog_Colour, + eMinecraftColour_Nether_Fog_Colour, + eMinecraftColour_End_Fog_Colour, + + eMinecraftColour_Sign_Text, + eMinecraftColour_Map_Text, + + eHTMLColor_0, + eHTMLColor_1, + eHTMLColor_2, + eHTMLColor_3, + eHTMLColor_4, + eHTMLColor_5, + eHTMLColor_6, + eHTMLColor_7, + eHTMLColor_8, + eHTMLColor_9, + eHTMLColor_a, + eHTMLColor_b, + eHTMLColor_c, + eHTMLColor_d, + eHTMLColor_e, + eHTMLColor_f, + eHTMLColor_0_dark, + eHTMLColor_1_dark, + eHTMLColor_2_dark, + eHTMLColor_3_dark, + eHTMLColor_4_dark, + eHTMLColor_5_dark, + eHTMLColor_6_dark, + eHTMLColor_7_dark, + eHTMLColor_8_dark, + eHTMLColor_9_dark, + eHTMLColor_a_dark, + eHTMLColor_b_dark, + eHTMLColor_c_dark, + eHTMLColor_d_dark, + eHTMLColor_e_dark, + eHTMLColor_f_dark, + eHTMLColor_T1, + eHTMLColor_T2, + eHTMLColor_T3, + eHTMLColor_Black, + eHTMLColor_White, + + eTextColor_Enchant, + eTextColor_EnchantFocus, + eTextColor_EnchantDisabled, + eTextColor_RenamedItemTitle, + + //eHTMLColor_0 = 0x000000, //r:0 , g: 0, b: 0, i: 0 + //eHTMLColor_1 = 0x0000aa, //r:0 , g: 0, b: aa, i: 1 + //eHTMLColor_2 = 0x109e10, // Changed by request of Dave //0x00aa00, //r:0 , g: aa, b: 0, i: 2 + //eHTMLColor_3 = 0x109e9e, // Changed by request of Dave //0x00aaaa, //r:0 , g: aa, b: aa, i: 3 + //eHTMLColor_4 = 0xaa0000, //r:aa , g: 0, b: 0, i: 4 + //eHTMLColor_5 = 0xaa00aa, //r:aa , g: 0, b: aa, i: 5 + //eHTMLColor_6 = 0xffaa00, //r:ff , g: aa, b: 0, i: 6 + //eHTMLColor_7 = 0xaaaaaa, //r:aa , g: aa, b: aa, i: 7 + //eHTMLColor_8 = 0x555555, //r:55 , g: 55, b: 55, i: 8 + //eHTMLColor_9 = 0x5555ff, //r:55 , g: 55, b: ff, i: 9 + //eHTMLColor_a = 0x55ff55, //r:55 , g: ff, b: 55, i: a + //eHTMLColor_b = 0x55ffff, //r:55 , g: ff, b: ff, i: b + //eHTMLColor_c = 0xff5555, //r:ff , g: 55, b: 55, i: c + //eHTMLColor_d = 0xff55ff, //r:ff , g: 55, b: ff, i: d + //eHTMLColor_e = 0xffff55, //r:ff , g: ff, b: 55, i: e + //eHTMLColor_f = 0xffffff, //r:ff , g: ff, b: ff, i: f + //eHTMLColor_0_dark = 0x000000, //r:0 , g: 0, b: 0, i: 10 + //eHTMLColor_1_dark = 0x00002a, //r:0 , g: 0, b: 2a, i: 11 + //eHTMLColor_2_dark = 0x002a00, //r:0 , g: 2a, b: 0, i: 12 + //eHTMLColor_3_dark = 0x002a2a, //r:0 , g: 2a, b: 2a, i: 13 + //eHTMLColor_4_dark = 0x2a0000, //r:2a , g: 0, b: 0, i: 14 + //eHTMLColor_5_dark = 0x2a002a, //r:2a , g: 0, b: 2a, i: 15 + //eHTMLColor_6_dark = 0x2a2a00, //r:2a , g: 2a, b: 0, i: 16 + //eHTMLColor_7_dark = 0x2a2a2a, //r:2a , g: 2a, b: 2a, i: 17 + //eHTMLColor_8_dark = 0x151515, //r:15 , g: 15, b: 15, i: 18 + //eHTMLColor_9_dark = 0x15153f, //r:15 , g: 15, b: 3f, i: 19 + //eHTMLColor_a_dark = 0x153f15, //r:15 , g: 3f, b: 15, i: 1a + //eHTMLColor_b_dark = 0x153f3f, //r:15 , g: 3f, b: 3f, i: 1b + //eHTMLColor_c_dark = 0x3f1515, //r:3f , g: 15, b: 15, i: 1c + //eHTMLColor_d_dark = 0x3f153f, //r:3f , g: 15, b: 3f, i: 1d + //eHTMLColor_e_dark = 0x3f3f15, //r:3f , g: 3f, b: 15, i: 1e + //eHTMLColor_f_dark = 0x3f3f3f, //r:3f , g: 3f, b: 3f, i: 1f + + eMinecraftColour_COUNT, +}; + +enum eDLCContentType +{ + e_DLC_SkinPack=0, + e_DLC_TexturePacks, + e_DLC_MashupPacks, + e_DLC_Themes, + e_DLC_AvatarItems, + e_DLC_Gamerpics, + e_DLC_MAX_MinecraftStore, + e_DLC_TexturePackData, // for the icon, banner and text + e_DLC_MAX, + e_DLC_NotDefined, +}; + +enum eDLCMarketplaceType +{ + e_Marketplace_Content=0, // skins, texture packs and mashup packs + e_Marketplace_Themes, + e_Marketplace_AvatarItems, + e_Marketplace_Gamerpics, + e_Marketplace_MAX, + e_Marketplace_NotDefined, +}; + +enum eDLCContentState +{ + e_DLC_ContentState_Idle = 0, + e_DLC_ContentState_Retrieving, + e_DLC_ContentState_Retrieved +}; + +enum eTMSContentState +{ + e_TMS_ContentState_Idle = 0, + e_TMS_ContentState_Queued, + e_TMS_ContentState_Retrieving, + e_TMS_ContentState_Retrieved +}; + +enum eXUID +{ + eXUID_Undefined=0, + eXUID_NoName, // name not needed + eXUID_Notch, + eXUID_Carl, + eXUID_Daniel, + eXUID_Deadmau5, + eXUID_DannyBStyle, + eXUID_JulianClark, + eXUID_Millionth, + eXUID_4JPaddy, + eXUID_4JStuart, + eXUID_4JDavid, + eXUID_4JRichard, + eXUID_4JSteven, +}; + + +enum _eTerrainFeatureType +{ + eTerrainFeature_None=0, + eTerrainFeature_Stronghold, + eTerrainFeature_Mineshaft, + eTerrainFeature_Village, + eTerrainFeature_Ravine, + eTerrainFeature_NetherFortress, + eTerrainFeature_StrongholdEndPortal, + eTerrainFeature_Count +}; + +// 4J Stu - Whend adding new options you should consider whether having them on should disable achievements, and if so add them to the CanRecordStatsAndAchievements function +// 4J Stu - These options are now saved in save data, so new options can ONLY be added to the end +enum eGameHostOption +{ + eGameHostOption_Difficulty=0, + eGameHostOption_OnlineGame, // Unused + eGameHostOption_InviteOnly, // Unused + eGameHostOption_FriendsOfFriends, + eGameHostOption_Gamertags, + eGameHostOption_Tutorial, // special case + eGameHostOption_GameType, + eGameHostOption_LevelType, // flat or default + eGameHostOption_Structures, + eGameHostOption_BonusChest, + eGameHostOption_HasBeenInCreative, + eGameHostOption_PvP, + eGameHostOption_TrustPlayers, + eGameHostOption_TNT, + eGameHostOption_FireSpreads, + eGameHostOption_CheatsEnabled, // special case + eGameHostOption_HostCanFly, + eGameHostOption_HostCanChangeHunger, + eGameHostOption_HostCanBeInvisible, + eGameHostOption_BedrockFog, + eGameHostOption_NoHUD, + eGameHostOption_All, + + eGameHostOption_DisableSaving, +}; + +// 4J-PB - If any new DLC items are added to the TMSFiles, this array needs updated +#ifdef _XBOX +enum _TMSFILES +{ + TMS_SP1=0, + TMS_SP2, + TMS_SP3, + TMS_SP4, + TMS_SP5, + TMS_SP6, + TMS_SPF, + TMS_SPB, + TMS_SPC, + TMS_SPZ, + TMS_SPM, + TMS_SPI, + TMS_SPG, + + TMS_THST, + TMS_THIR, + TMS_THGO, + TMS_THDI, + TMS_THAW, + + TMS_GPAN, + TMS_GPCO, + TMS_GPEN, + TMS_GPFO, + TMS_GPTO, + TMS_GPBA, + TMS_GPFA, + TMS_GPME, + TMS_GPMF, + TMS_GPMM, + TMS_GPSE, + TMS_GPOr, + TMS_GPMi, + TMS_GPMB, + TMS_GPBr, + TMS_GPM1, + TMS_GPM2, + TMS_GPM3, + + TMS_AH_0001, + TMS_AH_0002, + TMS_AH_0003, + TMS_AH_0004, + TMS_AH_0005, + TMS_AH_0006, + TMS_AH_0007, + TMS_AH_0008, + TMS_AH_0009, + TMS_AH_0010, + TMS_AH_0011, + TMS_AH_0012, + TMS_AH_0013, + + TMS_AT_0001, + TMS_AT_0002, + TMS_AT_0003, + TMS_AT_0004, + TMS_AT_0005, + TMS_AT_0006, + TMS_AT_0007, + TMS_AT_0008, + TMS_AT_0009, + TMS_AT_0010, + TMS_AT_0011, + TMS_AT_0012, + TMS_AT_0013, + TMS_AT_0014, + TMS_AT_0015, + TMS_AT_0016, + TMS_AT_0017, + TMS_AT_0018, + TMS_AT_0019, + TMS_AT_0020, + TMS_AT_0021, + TMS_AT_0022, + TMS_AT_0023, + TMS_AT_0024, + TMS_AT_0025, + TMS_AT_0026, + + TMS_AP_0001, + TMS_AP_0002, + TMS_AP_0003, + TMS_AP_0004, + TMS_AP_0005, + TMS_AP_0006, + TMS_AP_0007, + TMS_AP_0009, + TMS_AP_0010, + TMS_AP_0011, + TMS_AP_0012, + TMS_AP_0013, + TMS_AP_0014, + TMS_AP_0015, + TMS_AP_0016, + TMS_AP_0017, + TMS_AP_0018, + + TMS_AP_0019, + TMS_AP_0020, + TMS_AP_0021, + TMS_AP_0022, + TMS_AP_0023, + TMS_AP_0024, + TMS_AP_0025, + TMS_AP_0026, + TMS_AP_0027, + TMS_AP_0028, + TMS_AP_0029, + TMS_AP_0030, + TMS_AP_0031, + TMS_AP_0032, + TMS_AP_0033, + + TMS_AA_0001, + + TMS_MPMA, + TMS_MPMA_DAT, + TMS_MPSR, + TMS_MPSR_DAT, + TMS_MPHA, + TMS_MPHA_DAT, + + TMS_TP01, + TMS_TP01_DAT, + TMS_TP02, + TMS_TP02_DAT, + TMS_TP04, + TMS_TP04_DAT, + TMS_TP05, + TMS_TP05_DAT, + TMS_TP06, + TMS_TP06_DAT, + TMS_TP07, + TMS_TP07_DAT, + + TMS_COUNT +}; +#endif + +enum EHTMLFontSize +{ + eHTMLSize_Normal, + eHTMLSize_Splitscreen, + eHTMLSize_Tutorial, + eHTMLSize_EndPoem, + + eHTMLSize_COUNT, +}; + +enum EControllerActions +{ + ACTION_MENU_A, + ACTION_MENU_B, + ACTION_MENU_X, + ACTION_MENU_Y, + ACTION_MENU_UP, + ACTION_MENU_DOWN, + ACTION_MENU_RIGHT, + ACTION_MENU_LEFT, + ACTION_MENU_PAGEUP, + ACTION_MENU_PAGEDOWN, + ACTION_MENU_RIGHT_SCROLL, + ACTION_MENU_LEFT_SCROLL, + ACTION_MENU_STICK_PRESS, + ACTION_MENU_OTHER_STICK_PRESS, + ACTION_MENU_OTHER_STICK_UP, + ACTION_MENU_OTHER_STICK_DOWN, + ACTION_MENU_OTHER_STICK_LEFT, + ACTION_MENU_OTHER_STICK_RIGHT, + ACTION_MENU_PAUSEMENU, + +#ifdef _DURANGO + ACTION_MENU_GTC_PAUSE, + ACTION_MENU_GTC_RESUME, +#endif + +#ifdef __ORBIS__ + ACTION_MENU_TOUCHPAD_PRESS, +#endif + + ACTION_MENU_OK, + ACTION_MENU_CANCEL, + ACTION_MAX_MENU = ACTION_MENU_CANCEL, + + MINECRAFT_ACTION_JUMP, + MINECRAFT_ACTION_FORWARD, + MINECRAFT_ACTION_BACKWARD, + MINECRAFT_ACTION_LEFT, + MINECRAFT_ACTION_RIGHT, + MINECRAFT_ACTION_LOOK_LEFT, + MINECRAFT_ACTION_LOOK_RIGHT, + MINECRAFT_ACTION_LOOK_UP, + MINECRAFT_ACTION_LOOK_DOWN, + MINECRAFT_ACTION_USE, + MINECRAFT_ACTION_ACTION, + MINECRAFT_ACTION_LEFT_SCROLL, + MINECRAFT_ACTION_RIGHT_SCROLL, + MINECRAFT_ACTION_INVENTORY, + MINECRAFT_ACTION_PAUSEMENU, + MINECRAFT_ACTION_DROP, + MINECRAFT_ACTION_SNEAK_TOGGLE, + MINECRAFT_ACTION_CRAFTING, + MINECRAFT_ACTION_RENDER_THIRD_PERSON, + MINECRAFT_ACTION_GAME_INFO, + MINECRAFT_ACTION_DPAD_LEFT, + MINECRAFT_ACTION_DPAD_RIGHT, + MINECRAFT_ACTION_DPAD_UP, + MINECRAFT_ACTION_DPAD_DOWN, + + MINECRAFT_ACTION_MAX, + + // These 4 aren't mapped to the input manager directly but are created from the dpad controls if required in Minecraft::run_middle + // Don't use them with the input manager directly, just through LocalPlayer::ullButtonsPressed + MINECRAFT_ACTION_SPAWN_CREEPER, + MINECRAFT_ACTION_CHANGE_SKIN, + MINECRAFT_ACTION_FLY_TOGGLE, + MINECRAFT_ACTION_RENDER_DEBUG +}; + +enum eMCLang +{ + eMCLang_null=0, + eMCLang_enUS, + eMCLang_enGB, + eMCLang_enIE, + eMCLang_enAU, + eMCLang_enNZ, + eMCLang_enCA, + eMCLang_jaJP, + eMCLang_deDE, + eMCLang_deAT, + eMCLang_frFR, + eMCLang_frCA, + eMCLang_esES, + eMCLang_esMX, + eMCLang_itIT, + eMCLang_koKR, + eMCLang_ptPT, + eMCLang_ptBR, + eMCLang_ruRU, + eMCLang_nlNL, + eMCLang_fiFI, + eMCLang_svSV, + eMCLang_daDA, + eMCLang_noNO, + eMCLang_plPL, + eMCLang_trTR, + eMCLang_elEL, + eMCLang_zhCHS, + eMCLang_zhCHT, + eMCLang_laLAS, + + eMCLang_zhSG, + eMCLang_zhCN, + eMCLang_zhHK, + eMCLang_zhTW, + eMCLang_nlBE, + eMCLang_daDK, + eMCLang_frBE, + eMCLang_frCH, + eMCLang_deCH, + eMCLang_nbNO, + eMCLang_enGR, + eMCLang_enHK, + eMCLang_enSA, + eMCLang_enHU, + eMCLang_enIN, + eMCLang_enIL, + eMCLang_enSG, + eMCLang_enSK, + eMCLang_enZA, + eMCLang_enCZ, + eMCLang_enAE, + eMCLang_esAR, + eMCLang_esCL, + eMCLang_esCO, + eMCLang_esUS, + eMCLang_svSE, + + eMCLang_csCZ, + eMCLang_elGR, + eMCLang_nnNO, + eMCLang_skSK, +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/App_structs.h b/Minecraft.Client/Common/App_structs.h new file mode 100644 index 00000000..ed321b5f --- /dev/null +++ b/Minecraft.Client/Common/App_structs.h @@ -0,0 +1,227 @@ +#pragma once + +typedef struct +{ + wchar_t *wchFilename; + eFileExtensionType eEXT; + eTMSFileType eTMSType; + PBYTE pbData; + UINT uiSize; + int iConfig; // used for texture pack data files +} +TMS_FILE; + +typedef struct +{ + PBYTE pbData; + DWORD dwBytes; + BYTE ucRefCount; +} +MEMDATA,*PMEMDATA; + +typedef struct +{ + DWORD dwNotification; + UINT uiParam; +} +NOTIFICATION,*PNOTIFICATION; + +typedef struct +{ + bool bSettingsChanged; + unsigned char ucMusicVolume; + unsigned char ucSoundFXVolume; + unsigned char ucSensitivity; + unsigned char ucGamma; + unsigned char ucPad01; // 1 byte of padding inserted here + unsigned short usBitmaskValues; // bit 0,1 - difficulty + // bit 2 - view bob + // bit 3 - player visible in a map + // bit 4,5 - control scheme + // bit 6 - invert look + // bit 7 - southpaw + // bit 8 - splitscreen vertical + + // 4J-PB - Adding new values for interim TU for 1.6.6 + // bit 9 - Display gamertags in splitscreen + // bit 10 - Disable/Enable hints + // bit 11,12,13,14 - Autosave frequency - 0 = Off, 8 = (8*15 minutes) = 2 hours + // bit 15 Tooltips + + // debug values + unsigned int uiDebugBitmask; + + // block off space to use for whatever we want (e.g bitflags for storing things the player has done in the game, so we can flag the first time they do things, such as sleep) + union + { + struct + { + unsigned char ucTutorialCompletion[TUTORIAL_PROFILE_STORAGE_BYTES]; + // adding new flags for interim TU to 1.6.6 + + // A value that encodes the skin that the player has set as their default + DWORD dwSelectedSkin; + + // In-Menu sensitivity + unsigned char ucMenuSensitivity; + unsigned char ucInterfaceOpacity; + unsigned char ucPad02;//2 bytes of padding added here + unsigned char usPad03; + + // Adding another bitmask flag for more settings for 1.8.2 + unsigned int uiBitmaskValues; // 0x00000001 - eGameSetting_Clouds - on + // 0x00000002 - eGameSetting_GameSetting_Online - on + // 0x00000004 - eGameSetting_GameSetting_Invite - off + // 0x00000008 - eGameSetting_GameSetting_FriendsOfFriends - on + // 0x00000010 - eGameSetting_PSVita_NetworkModeAdhoc - on + + // TU 5 + // 0x00000030 - eGameSetting_DisplayUpdateMessage - 3 - counts down to zero + // TU 6 + // 0x00000040 - eGameSetting_BedrockFog - off + // 0x00000080 - eGameSetting_DisplayHUD - on + // 0x00000100 - eGameSetting_DisplayHand - on + // TU 7 + // 0x00000200 - eGameSetting_CustomSkinAnim - on + + // TU9 // 0x00000400 - eGameSetting_DeathMessages - on + + // Adding another bitmask to store "special" completion tasks for the tutorial + unsigned int uiSpecialTutorialBitmask; + + // A value that encodes the cape that the player has set + DWORD dwSelectedCape; + + unsigned int uiFavoriteSkinA[MAX_FAVORITE_SKINS]; + unsigned char ucCurrentFavoriteSkinPos; + + // TU13 + unsigned int uiMashUpPackWorldsDisplay; // bitmask to enable/disable the display of the individual mash-up pack worlds + + // PS3 1.05 - Adding Greek, so need a language + unsigned char ucLanguage; + // 4J Stu - See comment for GAME_SETTINGS_PROFILE_DATA_BYTES below + // was 192 + //unsigned char ucUnused[192-TUTORIAL_PROFILE_STORAGE_BYTES-sizeof(DWORD)-sizeof(char)-sizeof(char)-sizeof(char)-sizeof(char)-sizeof(LONG)-sizeof(LONG)-sizeof(DWORD)]; + // 4J-PB - don't need to define the padded space, the union with ucReservedSpace will make the sizeof GAME_SETTINGS correct + }; + + unsigned char ucReservedSpace[192]; + + + }; +} +GAME_SETTINGS; + +#ifdef _XBOX_ONE +typedef struct +{ + WCHAR wchPlayerUID[64]; + char pszLevelName[14]; +} +BANNEDLISTDATA,*PBANNEDLISTDATA; +#else +typedef struct +{ + PlayerUID xuid; + char pszLevelName[14]; +} +BANNEDLISTDATA,*PBANNEDLISTDATA; +#endif + +typedef std::vector VBANNEDLIST; + +typedef struct +{ + int iPad; + eXuiAction action; +} +XuiActionParam; + +// tips +typedef struct +{ + int iSortValue; + UINT uiStringID; +} +TIPSTRUCT; + + +typedef struct +{ + eXUID eXuid; + WCHAR wchCape[MAX_CAPENAME_SIZE]; + WCHAR wchSkin[MAX_CAPENAME_SIZE]; +} +MOJANG_DATA; + +typedef struct +{ + eDLCContentType eDLCType; +#if defined( __PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + char chImageURL[256];//SCE_NP_COMMERCE2_URL_LEN +#else + +#ifdef _XBOX_ONE + + wstring wsProductId; + wstring wsDisplayName; + + // add a store for the local DLC image + PBYTE pbImageData; + DWORD dwImageBytes; +#else + ULONGLONG ullOfferID_Full; + ULONGLONG ullOfferID_Trial; +#endif + WCHAR wchBanner[MAX_BANNERNAME_SIZE]; + WCHAR wchDataFile[MAX_BANNERNAME_SIZE]; + int iGender; +#endif + int iConfig; + unsigned int uiSortIndex; +} +DLC_INFO; + + +typedef struct +{ + int x,z; + _eTerrainFeatureType eTerrainFeature; +} +FEATURE_DATA; + +// banned list +typedef struct +{ + BYTE *pBannedList; + DWORD dwBytes; +} +BANNEDLIST; + +typedef struct _DLCRequest +{ + DWORD dwType; + eDLCContentState eState; +} +DLCRequest; + +typedef struct _TMSPPRequest +{ + eTMSContentState eState; + eDLCContentType eType; + C4JStorage::eGlobalStorage eStorageFacility; + C4JStorage::eTMS_FILETYPEVAL eFileTypeVal; + //char szFilename[MAX_TMSFILENAME_SIZE]; +#ifdef _XBOX_ONE + int( *CallbackFunc)(LPVOID,int,int,LPVOID, WCHAR *); +#else + int( *CallbackFunc)(LPVOID,int,int,C4JStorage::PTMSPP_FILEDATA, LPCSTR szFilename); +#endif + WCHAR wchFilename[MAX_TMSFILENAME_SIZE]; + + LPVOID lpCallbackParam; +} +TMSPPRequest; + +typedef pair SceneStackPair; diff --git a/Minecraft.Client/Common/Audio/Consoles_SoundEngine.cpp b/Minecraft.Client/Common/Audio/Consoles_SoundEngine.cpp new file mode 100644 index 00000000..269b605b --- /dev/null +++ b/Minecraft.Client/Common/Audio/Consoles_SoundEngine.cpp @@ -0,0 +1,38 @@ +#include "stdafx.h" +#include "Consoles_SoundEngine.h" + + +bool ConsoleSoundEngine::GetIsPlayingStreamingCDMusic() +{ + return m_bIsPlayingStreamingCDMusic; +} +bool ConsoleSoundEngine::GetIsPlayingStreamingGameMusic() +{ + return m_bIsPlayingStreamingGameMusic; +} +void ConsoleSoundEngine::SetIsPlayingStreamingCDMusic(bool bVal) +{ + m_bIsPlayingStreamingCDMusic=bVal; +} +void ConsoleSoundEngine::SetIsPlayingStreamingGameMusic(bool bVal) +{ + m_bIsPlayingStreamingGameMusic=bVal; +} +bool ConsoleSoundEngine::GetIsPlayingEndMusic() +{ + return m_bIsPlayingEndMusic; +} +bool ConsoleSoundEngine::GetIsPlayingNetherMusic() +{ + return m_bIsPlayingNetherMusic; +} +void ConsoleSoundEngine::SetIsPlayingEndMusic(bool bVal) +{ + m_bIsPlayingEndMusic=bVal; +} +void ConsoleSoundEngine::SetIsPlayingNetherMusic(bool bVal) +{ + m_bIsPlayingNetherMusic=bVal; +} + + diff --git a/Minecraft.Client/Common/Audio/Consoles_SoundEngine.h b/Minecraft.Client/Common/Audio/Consoles_SoundEngine.h new file mode 100644 index 00000000..4ec76036 --- /dev/null +++ b/Minecraft.Client/Common/Audio/Consoles_SoundEngine.h @@ -0,0 +1,81 @@ +#pragma once + +#include "..\..\..\Minecraft.World\SoundTypes.h" + +#ifdef _XBOX + +#elif defined (__PS3__) +#undef __in +#undef __out +#include "..\..\PS3\Miles\include\mss.h" +#elif defined (__PSVITA__) +#include "..\..\PSVITA\Miles\include\mss.h" +#elif defined _DURANGO +// 4J Stu - Temp define to get Miles to link, can likely be removed when we get a new version of Miles +#define _SEKRIT +#include "..\..\Durango\Miles\include\mss.h" +#elif defined _WINDOWS64 +#include "..\..\windows64\Miles\include\mss.h" +#else // PS4 +// 4J Stu - Temp define to get Miles to link, can likely be removed when we get a new version of Miles +#define _SEKRIT2 +#include "..\..\Orbis\Miles\include\mss.h" +#endif + +typedef struct +{ + float x,y,z; +} +AUDIO_VECTOR; + +typedef struct +{ + bool bValid; + AUDIO_VECTOR vPosition; + AUDIO_VECTOR vOrientFront; +} +AUDIO_LISTENER; + +class Options; + +class ConsoleSoundEngine +{ +public: + + ConsoleSoundEngine() : m_bIsPlayingStreamingCDMusic(false),m_bIsPlayingStreamingGameMusic(false), m_bIsPlayingEndMusic(false),m_bIsPlayingNetherMusic(false){}; + virtual void tick(shared_ptr *players, float a) =0; + virtual void destroy()=0; + virtual void play(int iSound, float x, float y, float z, float volume, float pitch) =0; + virtual void playStreaming(const wstring& name, float x, float y , float z, float volume, float pitch, bool bMusicDelay=true) =0; + virtual void playUI(int iSound, float volume, float pitch) =0; + virtual void updateMusicVolume(float fVal) =0; + virtual void updateSystemMusicPlaying(bool isPlaying) = 0; + virtual void updateSoundEffectVolume(float fVal) =0; + virtual void init(Options *) =0 ; + virtual void add(const wstring& name, File *file) =0; + virtual void addMusic(const wstring& name, File *file) =0; + virtual void addStreaming(const wstring& name, File *file) =0; + virtual char *ConvertSoundPathToName(const wstring& name, bool bConvertSpaces) =0; + virtual void playMusicTick() =0; + + virtual bool GetIsPlayingStreamingCDMusic() ; + virtual bool GetIsPlayingStreamingGameMusic() ; + virtual void SetIsPlayingStreamingCDMusic(bool bVal) ; + virtual void SetIsPlayingStreamingGameMusic(bool bVal) ; + virtual bool GetIsPlayingEndMusic() ; + virtual bool GetIsPlayingNetherMusic() ; + virtual void SetIsPlayingEndMusic(bool bVal) ; + virtual void SetIsPlayingNetherMusic(bool bVal) ; + static const WCHAR *wchSoundNames[eSoundType_MAX]; + static const WCHAR *wchUISoundNames[eSFX_MAX]; + +private: + // platform specific functions + + virtual int initAudioHardware(int iMinSpeakers)=0; + + bool m_bIsPlayingStreamingCDMusic; + bool m_bIsPlayingStreamingGameMusic; + bool m_bIsPlayingEndMusic; + bool m_bIsPlayingNetherMusic; +}; diff --git a/Minecraft.Client/Common/Audio/SoundEngine.cpp b/Minecraft.Client/Common/Audio/SoundEngine.cpp new file mode 100644 index 00000000..4eaf7df7 --- /dev/null +++ b/Minecraft.Client/Common/Audio/SoundEngine.cpp @@ -0,0 +1,1668 @@ +#include "stdafx.h" + +#include "SoundEngine.h" +#include "..\Consoles_App.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\Minecraft.World\leveldata.h" +#include "..\..\Minecraft.World\mth.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\DLCTexturePack.h" +#include "Common\DLC\DLCAudioFile.h" + +#ifdef __PSVITA__ +#include +#endif + +#ifdef _WINDOWS64 +#include "..\..\Minecraft.Client\Windows64\Windows64_App.h" +#include "..\..\Minecraft.Client\Windows64\Miles\include\imssapi.h" +#endif + +#ifdef __ORBIS__ +#include +//#define __DISABLE_MILES__ // MGH disabled for now as it crashes if we call sceNpMatching2Initialize +#endif + +// take out Orbis until they are done +#if defined _XBOX + +SoundEngine::SoundEngine() {} +void SoundEngine::init(Options *pOptions) +{ +} + +void SoundEngine::tick(shared_ptr *players, float a) +{ +} +void SoundEngine::destroy() {} +void SoundEngine::play(int iSound, float x, float y, float z, float volume, float pitch) +{ + app.DebugPrintf("PlaySound - %d\n",iSound); +} +void SoundEngine::playStreaming(const wstring& name, float x, float y , float z, float volume, float pitch, bool bMusicDelay) {} +void SoundEngine::playUI(int iSound, float volume, float pitch) {} + +void SoundEngine::updateMusicVolume(float fVal) {} +void SoundEngine::updateSoundEffectVolume(float fVal) {} + +void SoundEngine::add(const wstring& name, File *file) {} +void SoundEngine::addMusic(const wstring& name, File *file) {} +void SoundEngine::addStreaming(const wstring& name, File *file) {} +char *SoundEngine::ConvertSoundPathToName(const wstring& name, bool bConvertSpaces) { return NULL; } +bool SoundEngine::isStreamingWavebankReady() { return true; } +void SoundEngine::playMusicTick() {}; + +#else + +#ifdef _WINDOWS64 +char SoundEngine::m_szSoundPath[]={"Durango\\Sound\\"}; +char SoundEngine::m_szMusicPath[]={"music\\"}; +char SoundEngine::m_szRedistName[]={"redist64"}; +#elif defined _DURANGO +char SoundEngine::m_szSoundPath[]={"Sound\\"}; +char SoundEngine::m_szMusicPath[]={"music\\"}; +char SoundEngine::m_szRedistName[]={"redist64"}; +#elif defined __ORBIS__ + +#ifdef _CONTENT_PACKAGE +char SoundEngine::m_szSoundPath[]={"Sound/"}; +#elif defined _ART_BUILD +char SoundEngine::m_szSoundPath[]={"Sound/"}; +#else +// just use the host Durango folder for the sound. In the content package, we'll have moved this in the .gp4 file +char SoundEngine::m_szSoundPath[]={"Durango/Sound/"}; +#endif +char SoundEngine::m_szMusicPath[]={"music/"}; +char SoundEngine::m_szRedistName[]={"redist64"}; +#elif defined __PSVITA__ +char SoundEngine::m_szSoundPath[]={"PSVita/Sound/"}; +char SoundEngine::m_szMusicPath[]={"music/"}; +char SoundEngine::m_szRedistName[]={"redist"}; +#elif defined __PS3__ +//extern const char* getPS3HomePath(); +char SoundEngine::m_szSoundPath[]={"PS3/Sound/"}; +char SoundEngine::m_szMusicPath[]={"music/"}; +char SoundEngine::m_szRedistName[]={"redist"}; + +#define USE_SPURS + +#ifdef USE_SPURS +#include +#else +#include +#endif + +#endif + +F32 AILCALLBACK custom_falloff_function (HSAMPLE S, + F32 distance, + F32 rolloff_factor, + F32 min_dist, + F32 max_dist); + +char *SoundEngine::m_szStreamFileA[eStream_Max]= +{ + "calm1", + "calm2", + "calm3", + "hal1", + "hal2", + "hal3", + "hal4", + "nuance1", + "nuance2", +#ifndef _XBOX + // add the new music tracks + "creative1", + "creative2", + "creative3", + "creative4", + "creative5", + "creative6", + "menu1", + "menu2", + "menu3", + "menu4", +#endif + "piano1", + "piano2", + "piano3", + + // Nether + "nether1", + "nether2", + "nether3", + "nether4", + // The End + "the_end_dragon_alive", + "the_end_end", + // CDs + "11", + "13", + "blocks", + "cat", + "chirp", + "far", + "mall", + "mellohi", + "stal", + "strad", + "ward", + "where_are_we_now" +}; + +///////////////////////////////////////////// +// +// ErrorCallback +// +///////////////////////////////////////////// +void AILCALL ErrorCallback(S64 i_Id, char const* i_Details) +{ + char *pchLastError=AIL_last_error(); + + if(pchLastError[0]!=0) + { + app.DebugPrintf("\rErrorCallback Error Category: %s\n", pchLastError); + } + + if (i_Details) + { + app.DebugPrintf("ErrorCallback - Details: %s\n", i_Details); + } +} + +#ifdef __PSVITA__ +// AP - this is the callback when the driver is about to mix. At this point the mutex is locked by Miles so we can now call all Miles functions without +// the possibility of incurring a stall. +static bool SoundEngine_Change = false; // has tick been called? +static CRITICAL_SECTION SoundEngine_MixerMutex; + +void AILCALL MilesMixerCB(HDIGDRIVER dig) +{ + // has the tick function been called since the last callback + if( SoundEngine_Change ) + { + SoundEngine_Change = false; + + EnterCriticalSection(&SoundEngine_MixerMutex); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->soundEngine->updateMiles(); + pMinecraft->soundEngine->playMusicUpdate(); + + LeaveCriticalSection(&SoundEngine_MixerMutex); + } +} +#endif + +///////////////////////////////////////////// +// +// init +// +///////////////////////////////////////////// +void SoundEngine::init(Options *pOptions) +{ + app.DebugPrintf("---SoundEngine::init\n"); +#ifdef __DISABLE_MILES__ + return; +#endif +#ifdef __ORBIS__ + C4JThread::PushAffinityAllCores(); +#endif +#if defined _DURANGO || defined __ORBIS__ || defined __PS3__ || defined __PSVITA__ + Register_RIB(BinkADec); +#endif + + char *redistpath; + +#if (defined _WINDOWS64 || defined __PSVITA__)// || defined _DURANGO || defined __ORBIS__ ) + redistpath=AIL_set_redist_directory(m_szRedistName); +#endif + + app.DebugPrintf("---SoundEngine::init - AIL_startup\n"); + S32 ret = AIL_startup(); + + int iNumberOfChannels=initAudioHardware(8); + + // Create a driver to render our audio - 44khz, 16 bit, +#ifdef __PS3__ + // On the Sony PS3, the driver is always opened in 48 kHz, 32-bit floating point. The only meaningful configurations are MSS_MC_STEREO, MSS_MC_51_DISCRETE, and MSS_MC_71_DISCRETE. + m_hDriver = AIL_open_digital_driver( 48000, 16, iNumberOfChannels, AIL_OPEN_DIGITAL_USE_SPU0 ); +#elif defined __PSVITA__ + + // maximum of 16 samples + AIL_set_preference(DIG_MIXER_CHANNELS, 16); + + m_hDriver = AIL_open_digital_driver( 48000, 16, MSS_MC_STEREO, 0 ); + + // AP - For some reason the submit thread defaults to a priority of zero (invalid). Make sure it has the highest priority to avoid audio breakup. + SceUID threadID; + AIL_platform_property( m_hDriver, PSP2_SUBMIT_THREAD, &threadID, 0, 0); + S32 g_DefaultCPU = sceKernelGetThreadCpuAffinityMask(threadID); + S32 Old = sceKernelChangeThreadPriority(threadID, 64); + + // AP - register a callback when the mixer starts + AILMIXERCB temp = AIL_register_mix_callback(m_hDriver, MilesMixerCB); + + InitializeCriticalSection(&SoundEngine_MixerMutex); + +#elif defined(__ORBIS__) + m_hDriver = AIL_open_digital_driver( 48000, 16, 2, 0 ); + app.DebugPrintf("---SoundEngine::init - AIL_open_digital_driver\n"); + +#else + m_hDriver = AIL_open_digital_driver(44100, 16, MSS_MC_USE_SYSTEM_CONFIG, 0); +#endif + if (m_hDriver == 0) + { + app.DebugPrintf("Couldn't open digital sound driver. (%s)\n", AIL_last_error()); + AIL_shutdown(); +#ifdef __ORBIS__ + C4JThread::PopAffinity(); +#endif + return; + } + app.DebugPrintf("---SoundEngine::init - driver opened\n"); + +#ifdef __PSVITA__ + + // set high falloff power for maximum spatial effect in software mode + AIL_set_speaker_configuration( m_hDriver, 0, 0, 4.0F ); + +#endif + + AIL_set_event_error_callback(ErrorCallback); + + AIL_set_3D_rolloff_factor(m_hDriver,1.0); + + // Create an event system tied to that driver - let Miles choose memory defaults. + //if (AIL_startup_event_system(m_hDriver, 0, 0, 0) == 0) + // 4J-PB - Durango complains that the default memory (64k)isn't enough + // Error: MilesEvent: Out of event system memory (pool passed to event system startup exhausted). + // AP - increased command buffer from the default 5K to 20K for Vita + + if (AIL_startup_event_system(m_hDriver, 1024*20, 0, 1024*128) == 0) + { + app.DebugPrintf("Couldn't init event system (%s).\n", AIL_last_error()); + AIL_close_digital_driver(m_hDriver); + AIL_shutdown(); +#ifdef __ORBIS__ + C4JThread::PopAffinity(); +#endif + app.DebugPrintf("---SoundEngine::init - AIL_startup_event_system failed\n"); + return; + } + char szBankName[255]; +#if defined __PS3__ + if(app.GetBootedFromDiscPatch()) + { + char szTempSoundFilename[255]; + sprintf(szTempSoundFilename,"%s%s",m_szSoundPath, "Minecraft.msscmp" ); + + app.DebugPrintf("SoundEngine::playMusicUpdate - (booted from disc patch) looking for %s\n",szTempSoundFilename); + sprintf(szBankName,"%s/%s",app.GetBDUsrDirPath(szTempSoundFilename), m_szSoundPath ); + app.DebugPrintf("SoundEngine::playMusicUpdate - (booted from disc patch) music path - %s\n",szBankName); + } + else + { + sprintf(szBankName,"%s/%s",getUsrDirPath(), m_szSoundPath ); + } + +#elif defined __PSVITA__ + sprintf(szBankName,"%s/%s",getUsrDirPath(), m_szSoundPath ); +#elif defined __ORBIS__ + sprintf(szBankName,"%s/%s",getUsrDirPath(), m_szSoundPath ); +#else + strcpy((char *)szBankName,m_szSoundPath); +#endif + + strcat((char *)szBankName,"Minecraft.msscmp"); + + m_hBank=AIL_add_soundbank(szBankName, 0); + + if(m_hBank == NULL) + { + char *Error=AIL_last_error(); + app.DebugPrintf("Couldn't open soundbank: %s (%s)\n", szBankName, Error); + AIL_close_digital_driver(m_hDriver); + AIL_shutdown(); +#ifdef __ORBIS__ + C4JThread::PopAffinity(); +#endif + return; + } + + //#ifdef _DEBUG + HMSSENUM token = MSS_FIRST; + char const* Events[1] = {0}; + S32 EventCount = 0; + while (AIL_enumerate_events(m_hBank, &token, 0, &Events[0])) + { + app.DebugPrintf(4,"%d - %s\n", EventCount, Events[0]); + + EventCount++; + } + //#endif + + U64 u64Result; + u64Result=AIL_enqueue_event_by_name("Minecraft/CacheSounds"); + + m_MasterMusicVolume=1.0f; + m_MasterEffectsVolume=1.0f; + + //AIL_set_variable_float(0,"UserEffectVol",1); + + m_bSystemMusicPlaying = false; + + m_openStreamThread = NULL; + +#ifdef __ORBIS__ + C4JThread::PopAffinity(); +#endif + +#ifdef __PSVITA__ + // AP - By default the mixer won't start up and nothing will process. Kick off a blank sample to force the mixer to start up. + HSAMPLE Sample = AIL_allocate_sample_handle(m_hDriver); + AIL_init_sample(Sample, DIG_F_STEREO_16); + static U64 silence = 0; + AIL_set_sample_address(Sample, &silence, sizeof(U64)); + AIL_start_sample(Sample); + + // wait for 1 mix... + AIL_release_sample_handle(Sample); +#endif +} + +#ifdef __ORBIS__ +// void SoundEngine::SetHandle(int32_t hAudio) +// { +// //m_hAudio=hAudio; +// } +#endif + +void SoundEngine::SetStreamingSounds(int iOverworldMin, int iOverWorldMax, int iNetherMin, int iNetherMax, int iEndMin, int iEndMax, int iCD1) +{ + m_iStream_Overworld_Min=iOverworldMin; + m_iStream_Overworld_Max=iOverWorldMax; + m_iStream_Nether_Min=iNetherMin; + m_iStream_Nether_Max=iNetherMax; + m_iStream_End_Min=iEndMin; + m_iStream_End_Max=iEndMax; + m_iStream_CD_1=iCD1; + + // array to monitor recently played tracks + if(m_bHeardTrackA) + { + delete [] m_bHeardTrackA; + } + m_bHeardTrackA = new bool[iEndMax+1]; + memset(m_bHeardTrackA,0,sizeof(bool)*iEndMax+1); +} + +// AP - moved to a separate function so it can be called from the mixer callback on Vita +void SoundEngine::updateMiles() +{ +#ifdef __PSVITA__ + //CD - We must check for Background Music [BGM] at any point + //If it's playing disable our audio, otherwise enable + int NoBGMPlaying = sceAudioOutGetAdopt(SCE_AUDIO_OUT_PORT_TYPE_BGM); + updateSystemMusicPlaying( !NoBGMPlaying ); +#elif defined __ORBIS__ + // is the system playing background music? + SceAudioOutPortState outPortState; + sceAudioOutGetPortState(m_hBGMAudio,&outPortState); + updateSystemMusicPlaying( outPortState.output==SCE_AUDIO_OUT_STATE_OUTPUT_UNKNOWN ); +#endif + + if( m_validListenerCount == 1 ) + { + for( int i = 0; i < MAX_LOCAL_PLAYERS; i++ ) + { + // set the listener as the first player we find + if( m_ListenerA[i].bValid ) + { + AIL_set_listener_3D_position(m_hDriver,m_ListenerA[i].vPosition.x,m_ListenerA[i].vPosition.y,-m_ListenerA[i].vPosition.z); // Flipped sign of z as Miles is expecting left handed coord system + AIL_set_listener_3D_orientation(m_hDriver,-m_ListenerA[i].vOrientFront.x,m_ListenerA[i].vOrientFront.y,m_ListenerA[i].vOrientFront.z,0,1,0); // Flipped sign of z as Miles is expecting left handed coord system + break; + } + } + } + else + { + // 4J-PB - special case for splitscreen + // the shortest distance between any listener and a sound will be used to play a sound a set distance away down the z axis. + // The listener position will be set to 0,0,0, and the orientation will be facing down the z axis + + AIL_set_listener_3D_position(m_hDriver,0,0,0); + AIL_set_listener_3D_orientation(m_hDriver,0,0,1,0,1,0); + } + + AIL_begin_event_queue_processing(); + + // Iterate over the sounds + S32 StartedCount = 0, CompletedCount = 0, TotalCount = 0; + HMSSENUM token = MSS_FIRST; + MILESEVENTSOUNDINFO SoundInfo; + int Playing = 0; + while (AIL_enumerate_sound_instances(0, &token, 0, 0, 0, &SoundInfo)) + { + AUDIO_INFO* game_data= (AUDIO_INFO*)( SoundInfo.UserBuffer ); + + if( SoundInfo.Status == MILESEVENT_SOUND_STATUS_PLAYING ) + { + Playing += 1; + } + + if ( SoundInfo.Status != MILESEVENT_SOUND_STATUS_COMPLETE ) + { + // apply the master volume + // watch for the 'special' volume levels + bool isThunder = false; + if( game_data->volume == 10000.0f ) + { + isThunder = true; + } + if(game_data->volume>1) + { + game_data->volume=1; + } + AIL_set_sample_volume_levels( SoundInfo.Sample, game_data->volume*m_MasterEffectsVolume, game_data->volume*m_MasterEffectsVolume); + + float distanceScaler = 16.0f; + switch(SoundInfo.Status) + { + case MILESEVENT_SOUND_STATUS_PENDING: + // 4J-PB - causes the falloff to be calculated on the PPU instead of the SPU, and seems to resolve our distorted sound issue + AIL_register_falloff_function_callback(SoundInfo.Sample,&custom_falloff_function); + + if(game_data->bIs3D) + { + AIL_set_sample_is_3D( SoundInfo.Sample, 1 ); + + int iSound = game_data->iSound - eSFX_MAX; + switch(iSound) + { + // Is this the Dragon? + case eSoundType_MOB_ENDERDRAGON_GROWL: + case eSoundType_MOB_ENDERDRAGON_MOVE: + case eSoundType_MOB_ENDERDRAGON_END: + case eSoundType_MOB_ENDERDRAGON_HIT: + distanceScaler=100.0f; + break; + case eSoundType_MOB_GHAST_MOAN: + case eSoundType_MOB_GHAST_SCREAM: + case eSoundType_MOB_GHAST_DEATH: + case eSoundType_MOB_GHAST_CHARGE: + case eSoundType_MOB_GHAST_FIREBALL: + distanceScaler=30.0f; + break; + } + + // Set a special distance scaler for thunder, which we respond to by having no attenutation + if( isThunder ) + { + distanceScaler = 10000.0f; + } + } + else + { + AIL_set_sample_is_3D( SoundInfo.Sample, 0 ); + } + + AIL_set_sample_3D_distances(SoundInfo.Sample,distanceScaler,1,0); + // set the pitch + if(!game_data->bUseSoundsPitchVal) + { + AIL_set_sample_playback_rate_factor(SoundInfo.Sample,game_data->pitch); + } + + if(game_data->bIs3D) + { + if(m_validListenerCount>1) + { + float fClosest=10000.0f; + int iClosestListener=0; + float fClosestX=0.0f,fClosestY=0.0f,fClosestZ=0.0f,fDist; + // need to calculate the distance from the sound to the nearest listener - use Manhattan Distance as the decision + for( int i = 0; i < MAX_LOCAL_PLAYERS; i++ ) + { + if( m_ListenerA[i].bValid ) + { + float x,y,z; + + x=fabs(m_ListenerA[i].vPosition.x-game_data->x); + y=fabs(m_ListenerA[i].vPosition.y-game_data->y); + z=fabs(m_ListenerA[i].vPosition.z-game_data->z); + fDist=x+y+z; + + if(fDistx, game_data->y, -game_data->z ); // Flipped sign of z as Miles is expecting left handed coord system + } + } + break; + + default: + if(game_data->bIs3D) + { + if(m_validListenerCount>1) + { + float fClosest=10000.0f; + int iClosestListener=0; + float fClosestX=0.0f,fClosestY=0.0f,fClosestZ=0.0f,fDist; + // need to calculate the distance from the sound to the nearest listener - use Manhattan Distance as the decision + for( int i = 0; i < MAX_LOCAL_PLAYERS; i++ ) + { + if( m_ListenerA[i].bValid ) + { + float x,y,z; + + x=fabs(m_ListenerA[i].vPosition.x-game_data->x); + y=fabs(m_ListenerA[i].vPosition.y-game_data->y); + z=fabs(m_ListenerA[i].vPosition.z-game_data->z); + fDist=x+y+z; + + if(fDistx, game_data->y, -game_data->z ); // Flipped sign of z as Miles is expecting left handed coord system + } + } + break; + } + } + } + AIL_complete_event_queue_processing(); +} + +//#define DISTORTION_TEST +#ifdef DISTORTION_TEST +static float fVal=0.0f; +#endif +///////////////////////////////////////////// +// +// tick +// +///////////////////////////////////////////// + +#ifdef __PSVITA__ +static S32 running = AIL_ms_count(); +#endif + +void SoundEngine::tick(shared_ptr *players, float a) +{ +#ifdef __DISABLE_MILES__ + return; +#endif + +#ifdef __PSVITA__ + EnterCriticalSection(&SoundEngine_MixerMutex); +#endif + + // update the listener positions + int listenerCount = 0; +#ifdef DISTORTION_TEST + float fX,fY,fZ; +#endif + if( players ) + { + bool bListenerPostionSet=false; + for( int i = 0; i < MAX_LOCAL_PLAYERS; i++ ) + { + if( players[i] != NULL ) + { + m_ListenerA[i].bValid=true; + F32 x,y,z; + x=players[i]->xo + (players[i]->x - players[i]->xo) * a; + y=players[i]->yo + (players[i]->y - players[i]->yo) * a; + z=players[i]->zo + (players[i]->z - players[i]->zo) * a; + + float yRot = players[i]->yRotO + (players[i]->yRot - players[i]->yRotO) * a; + float yCos = (float)cos(-yRot * Mth::RAD_TO_GRAD - PI); + float ySin = (float)sin(-yRot * Mth::RAD_TO_GRAD - PI); + + // store the listener positions for splitscreen + m_ListenerA[i].vPosition.x = x; + m_ListenerA[i].vPosition.y = y; + m_ListenerA[i].vPosition.z = z; + + m_ListenerA[i].vOrientFront.x = ySin; + m_ListenerA[i].vOrientFront.y = 0; + m_ListenerA[i].vOrientFront.z = yCos; + + listenerCount++; + } + else + { + m_ListenerA[i].bValid=false; + } + } + } + + + // If there were no valid players set, make up a default listener + if( listenerCount == 0 ) + { + m_ListenerA[0].vPosition.x = 0; + m_ListenerA[0].vPosition.y = 0; + m_ListenerA[0].vPosition.z = 0; + m_ListenerA[0].vOrientFront.x = 0; + m_ListenerA[0].vOrientFront.y = 0; + m_ListenerA[0].vOrientFront.z = 1.0f; + listenerCount++; + } + m_validListenerCount = listenerCount; + +#ifdef __PSVITA__ + // AP - Show that a change has occurred so we know to update the values at the next Mixer callback + SoundEngine_Change = true; + + LeaveCriticalSection(&SoundEngine_MixerMutex); +#else + updateMiles(); +#endif +} + +///////////////////////////////////////////// +// +// SoundEngine +// +///////////////////////////////////////////// +SoundEngine::SoundEngine() +{ + random = new Random(); + m_hStream=0; + m_StreamState=eMusicStreamState_Idle; + m_iMusicDelay=0; + m_validListenerCount=0; + + m_bHeardTrackA=NULL; + + // Start the streaming music playing some music from the overworld + SetStreamingSounds(eStream_Overworld_Calm1,eStream_Overworld_piano3, + eStream_Nether1,eStream_Nether4, + eStream_end_dragon,eStream_end_end, + eStream_CD_1); + + m_musicID=getMusicID(LevelData::DIMENSION_OVERWORLD); + + m_StreamingAudioInfo.bIs3D=false; + m_StreamingAudioInfo.x=0; + m_StreamingAudioInfo.y=0; + m_StreamingAudioInfo.z=0; + m_StreamingAudioInfo.volume=1; + m_StreamingAudioInfo.pitch=1; + + memset(CurrentSoundsPlaying,0,sizeof(int)*(eSoundType_MAX+eSFX_MAX)); + memset(m_ListenerA,0,sizeof(AUDIO_LISTENER)*XUSER_MAX_COUNT); + +#ifdef __ORBIS__ + m_hBGMAudio=GetAudioBGMHandle(); +#endif +} + +void SoundEngine::destroy() {} + +#ifdef _DEBUG +void SoundEngine::GetSoundName(char *szSoundName,int iSound) +{ + strcpy((char *)szSoundName,"Minecraft/"); + wstring name = wchSoundNames[iSound]; + char *SoundName = (char *)ConvertSoundPathToName(name); + strcat((char *)szSoundName,SoundName); +} +#endif + +///////////////////////////////////////////// +// +// play +// +///////////////////////////////////////////// +void SoundEngine::play(int iSound, float x, float y, float z, float volume, float pitch) +{ + U8 szSoundName[256]; + + if(iSound==-1) + { + app.DebugPrintf(6,"PlaySound with sound of -1 !!!!!!!!!!!!!!!\n"); + return; + } + + // AP removed old counting system. Now relying on Miles' Play Count Limit + /* // if we are already playing loads of this sounds ignore this one + if(CurrentSoundsPlaying[iSound+eSFX_MAX]>MAX_SAME_SOUNDS_PLAYING) + { + // wstring name = wchSoundNames[iSound]; + // char *SoundName = (char *)ConvertSoundPathToName(name); + // app.DebugPrintf("Too many %s sounds playing!\n",SoundName); + return; + }*/ + + //if (iSound != eSoundType_MOB_IRONGOLEM_WALK) return; + + // build the name + strcpy((char *)szSoundName,"Minecraft/"); + +#ifdef DISTORTION_TEST + wstring name = wchSoundNames[eSoundType_MOB_ENDERDRAGON_GROWL]; +#else + wstring name = wchSoundNames[iSound]; +#endif + + char *SoundName = (char *)ConvertSoundPathToName(name); + strcat((char *)szSoundName,SoundName); + +// app.DebugPrintf(6,"PlaySound - %d - %s - %s (%f %f %f, vol %f, pitch %f)\n",iSound, SoundName, szSoundName,x,y,z,volume,pitch); + + AUDIO_INFO AudioInfo; + AudioInfo.x=x; + AudioInfo.y=y; + AudioInfo.z=z; + AudioInfo.volume=volume; + AudioInfo.pitch=pitch; + AudioInfo.bIs3D=true; + AudioInfo.bUseSoundsPitchVal=false; + AudioInfo.iSound=iSound+eSFX_MAX; +#ifdef _DEBUG + strncpy(AudioInfo.chName,(char *)szSoundName,64); +#endif + + S32 token = AIL_enqueue_event_start(); + AIL_enqueue_event_buffer(&token, &AudioInfo, sizeof(AUDIO_INFO), 0); + AIL_enqueue_event_end_named(token, (char *)szSoundName); +} + +///////////////////////////////////////////// +// +// playUI +// +///////////////////////////////////////////// +void SoundEngine::playUI(int iSound, float volume, float pitch) +{ + U8 szSoundName[256]; + wstring name; + // we have some game sounds played as UI sounds... + // Not the best way to do this, but it seems to only be the portal sounds + + if(iSound>=eSFX_MAX) + { + // AP removed old counting system. Now relying on Miles' Play Count Limit + /* // if we are already playing loads of this sounds ignore this one + if(CurrentSoundsPlaying[iSound+eSFX_MAX]>MAX_SAME_SOUNDS_PLAYING) return;*/ + + // build the name + strcpy((char *)szSoundName,"Minecraft/"); + name = wchSoundNames[iSound]; + } + else + { + // AP removed old counting system. Now relying on Miles' Play Count Limit + /* // if we are already playing loads of this sounds ignore this one + if(CurrentSoundsPlaying[iSound]>MAX_SAME_SOUNDS_PLAYING) return;*/ + + // build the name + strcpy((char *)szSoundName,"Minecraft/UI/"); + name = wchUISoundNames[iSound]; + } + + char *SoundName = (char *)ConvertSoundPathToName(name); + strcat((char *)szSoundName,SoundName); +// app.DebugPrintf("UI: Playing %s, volume %f, pitch %f\n",SoundName,volume,pitch); + + //app.DebugPrintf("PlaySound - %d - %s\n",iSound, SoundName); + + AUDIO_INFO AudioInfo; + memset(&AudioInfo,0,sizeof(AUDIO_INFO)); + AudioInfo.volume=volume; // will be multiplied by the master volume + AudioInfo.pitch=pitch; + AudioInfo.bUseSoundsPitchVal=true; + if(iSound>=eSFX_MAX) + { + AudioInfo.iSound=iSound+eSFX_MAX; + } + else + { + AudioInfo.iSound=iSound; + } +#ifdef _DEBUG + strncpy(AudioInfo.chName,(char *)szSoundName,64); +#endif + + // 4J-PB - not going to stop UI events happening based on the number of currently playing sounds + S32 token = AIL_enqueue_event_start(); + AIL_enqueue_event_buffer(&token, &AudioInfo, sizeof(AUDIO_INFO), 0); + AIL_enqueue_event_end_named(token, (char *)szSoundName); +} + +///////////////////////////////////////////// +// +// playStreaming +// +///////////////////////////////////////////// +void SoundEngine::playStreaming(const wstring& name, float x, float y , float z, float volume, float pitch, bool bMusicDelay) +{ + // This function doesn't actually play a streaming sound, just sets states and an id for the music tick to play it + // Level audio will be played when a play with an empty name comes in + // CD audio will be played when a named stream comes in + + m_StreamingAudioInfo.x=x; + m_StreamingAudioInfo.y=y; + m_StreamingAudioInfo.z=z; + m_StreamingAudioInfo.volume=volume; + m_StreamingAudioInfo.pitch=pitch; + + if(m_StreamState==eMusicStreamState_Playing) + { + m_StreamState=eMusicStreamState_Stop; + } + else if(m_StreamState==eMusicStreamState_Opening) + { + m_StreamState=eMusicStreamState_OpeningCancel; + } + + if(name.empty()) + { + // music, or stop CD + m_StreamingAudioInfo.bIs3D=false; + + // we need a music id + // random delay of up to 3 minutes for music + m_iMusicDelay = random->nextInt(20 * 60 * 3);//random->nextInt(20 * 60 * 10) + 20 * 60 * 10; + +#ifdef _DEBUG + m_iMusicDelay=0; +#endif + Minecraft *pMinecraft=Minecraft::GetInstance(); + + bool playerInEnd=false; + bool playerInNether=false; + + for(unsigned int i=0;ilocalplayers[i]!=NULL) + { + if(pMinecraft->localplayers[i]->dimension==LevelData::DIMENSION_END) + { + playerInEnd=true; + } + else if(pMinecraft->localplayers[i]->dimension==LevelData::DIMENSION_NETHER) + { + playerInNether=true; + } + } + } + if(playerInEnd) + { + m_musicID = getMusicID(LevelData::DIMENSION_END); + } + else if(playerInNether) + { + m_musicID = getMusicID(LevelData::DIMENSION_NETHER); + } + else + { + m_musicID = getMusicID(LevelData::DIMENSION_OVERWORLD); + } + } + else + { + // jukebox + m_StreamingAudioInfo.bIs3D=true; + m_musicID=getMusicID(name); + m_iMusicDelay=0; + } +} + + +int SoundEngine::GetRandomishTrack(int iStart,int iEnd) +{ + // 4J-PB - make it more likely that we'll get a track we've not heard for a while, although repeating tracks sometimes is fine + + // if all tracks have been heard, clear the flags + bool bAllTracksHeard=true; + int iVal=iStart; + for(int i=iStart;i<=iEnd;i++) + { + if(m_bHeardTrackA[i]==false) + { + bAllTracksHeard=false; + app.DebugPrintf("Not heard all tracks yet\n"); + break; + } + } + + if(bAllTracksHeard) + { + app.DebugPrintf("Heard all tracks - resetting the tracking array\n"); + + for(int i=iStart;i<=iEnd;i++) + { + m_bHeardTrackA[i]=false; + } + } + + // trying to get a track we haven't heard, but not too hard + for(int i=0;i<=((iEnd-iStart)/2);i++) + { + // random->nextInt(1) will always return 0 + iVal=random->nextInt((iEnd-iStart)+1)+iStart; + if(m_bHeardTrackA[iVal]==false) + { + // not heard this + app.DebugPrintf("(%d) Not heard track %d yet, so playing it now\n",i,iVal); + m_bHeardTrackA[iVal]=true; + break; + } + else + { + app.DebugPrintf("(%d) Skipping track %d already heard it recently\n",i,iVal); + } + } + + app.DebugPrintf("Select track %d\n",iVal); + return iVal; +} +///////////////////////////////////////////// +// +// getMusicID +// +///////////////////////////////////////////// +int SoundEngine::getMusicID(int iDomain) +{ + int iRandomVal=0; + Minecraft *pMinecraft=Minecraft::GetInstance(); + + // Before the game has started? + if(pMinecraft==NULL) + { + // any track from the overworld + return GetRandomishTrack(m_iStream_Overworld_Min,m_iStream_Overworld_Max); + } + + if(pMinecraft->skins->isUsingDefaultSkin()) + { + switch(iDomain) + { + case LevelData::DIMENSION_END: + // the end isn't random - it has different music depending on whether the dragon is alive or not, but we've not added the dead dragon music yet + return m_iStream_End_Min; + case LevelData::DIMENSION_NETHER: + return GetRandomishTrack(m_iStream_Nether_Min,m_iStream_Nether_Max); + //return m_iStream_Nether_Min + random->nextInt(m_iStream_Nether_Max-m_iStream_Nether_Min); + default: //overworld + //return m_iStream_Overworld_Min + random->nextInt(m_iStream_Overworld_Max-m_iStream_Overworld_Min); + return GetRandomishTrack(m_iStream_Overworld_Min,m_iStream_Overworld_Max); + } + } + else + { + // using a texture pack - may have multiple End music tracks + switch(iDomain) + { + case LevelData::DIMENSION_END: + return GetRandomishTrack(m_iStream_End_Min,m_iStream_End_Max); + case LevelData::DIMENSION_NETHER: + //return m_iStream_Nether_Min + random->nextInt(m_iStream_Nether_Max-m_iStream_Nether_Min); + return GetRandomishTrack(m_iStream_Nether_Min,m_iStream_Nether_Max); + default: //overworld + //return m_iStream_Overworld_Min + random->nextInt(m_iStream_Overworld_Max-m_iStream_Overworld_Min); + return GetRandomishTrack(m_iStream_Overworld_Min,m_iStream_Overworld_Max); + } + } +} + +///////////////////////////////////////////// +// +// getMusicID +// +///////////////////////////////////////////// +// check what the CD is +int SoundEngine::getMusicID(const wstring& name) +{ + int iCD=0; + char *SoundName = (char *)ConvertSoundPathToName(name,true); + + // 4J-PB - these will always be the game cds, so use the m_szStreamFileA for this + for(int i=0;i<12;i++) + { + if(strcmp(SoundName,m_szStreamFileA[i+eStream_CD_1])==0) + { + iCD=i; + break; + } + } + + // adjust for cd start position on normal or mash-up pack + return iCD+m_iStream_CD_1; +} + +///////////////////////////////////////////// +// +// getMasterMusicVolume +// +///////////////////////////////////////////// +float SoundEngine::getMasterMusicVolume() +{ + if( m_bSystemMusicPlaying ) + { + return 0.0f; + } + else + { + return m_MasterMusicVolume; + } +} + +///////////////////////////////////////////// +// +// updateMusicVolume +// +///////////////////////////////////////////// +void SoundEngine::updateMusicVolume(float fVal) +{ + m_MasterMusicVolume=fVal; +} + +///////////////////////////////////////////// +// +// updateSystemMusicPlaying +// +///////////////////////////////////////////// +void SoundEngine::updateSystemMusicPlaying(bool isPlaying) +{ + m_bSystemMusicPlaying = isPlaying; +} + +///////////////////////////////////////////// +// +// updateSoundEffectVolume +// +///////////////////////////////////////////// +void SoundEngine::updateSoundEffectVolume(float fVal) +{ + m_MasterEffectsVolume=fVal; + //AIL_set_variable_float(0,"UserEffectVol",fVal); +} + +void SoundEngine::add(const wstring& name, File *file) {} +void SoundEngine::addMusic(const wstring& name, File *file) {} +void SoundEngine::addStreaming(const wstring& name, File *file) {} +bool SoundEngine::isStreamingWavebankReady() { return true; } + +int SoundEngine::OpenStreamThreadProc( void* lpParameter ) +{ +#ifdef __DISABLE_MILES__ + return 0; +#endif + SoundEngine *soundEngine = (SoundEngine *)lpParameter; + soundEngine->m_hStream = AIL_open_stream(soundEngine->m_hDriver,soundEngine->m_szStreamName,0); + return 0; +} + +///////////////////////////////////////////// +// +// playMusicTick +// +///////////////////////////////////////////// +void SoundEngine::playMusicTick() +{ +// AP - vita will update the music during the mixer callback +#ifndef __PSVITA__ + playMusicUpdate(); +#endif +} + +// AP - moved to a separate function so it can be called from the mixer callback on Vita +void SoundEngine::playMusicUpdate() +{ + //return; + static bool firstCall = true; + static float fMusicVol = 0.0f; + if( firstCall ) + { + fMusicVol = getMasterMusicVolume(); + firstCall = false; + } + + switch(m_StreamState) + { + case eMusicStreamState_Idle: + + // start a stream playing + if (m_iMusicDelay > 0) + { + m_iMusicDelay--; + return; + } + + if(m_musicID!=-1) + { + // start playing it + + +#if ( defined __PS3__ || defined __PSVITA__ || defined __ORBIS__ ) + +#ifdef __PS3__ + // 4J-PB - Need to check if we are a patched BD build + if(app.GetBootedFromDiscPatch()) + { + sprintf(m_szStreamName,"%s/%s",app.GetBDUsrDirPath(m_szMusicPath), m_szMusicPath ); + app.DebugPrintf("SoundEngine::playMusicUpdate - (booted from disc patch) music path - %s",m_szStreamName); + } + else + { + sprintf(m_szStreamName,"%s/%s",getUsrDirPath(), m_szMusicPath ); + } +#else + sprintf(m_szStreamName,"%s/%s",getUsrDirPath(), m_szMusicPath ); +#endif + +#else + strcpy((char *)m_szStreamName,m_szMusicPath); +#endif + // are we using a mash-up pack? + //if(pMinecraft && !pMinecraft->skins->isUsingDefaultSkin() && pMinecraft->skins->getSelected()->hasAudio()) + if(Minecraft::GetInstance()->skins->getSelected()->hasAudio()) + { + // It's a mash-up - need to use the DLC path for the music + TexturePack *pTexPack=Minecraft::GetInstance()->skins->getSelected(); + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)pTexPack; + DLCPack *pack = pDLCTexPack->getDLCInfoParentPack(); + DLCAudioFile *dlcAudioFile = (DLCAudioFile *) pack->getFile(DLCManager::e_DLCType_Audio, 0); + + app.DebugPrintf("Mashup pack \n"); + + // build the name + + // if the music ID is beyond the end of the texture pack music files, then it's a CD + if(m_musicIDGetSoundName(m_musicID); + wstring wstrFile=L"TPACK:\\Data\\" + wstrSoundName +L".binka"; + std::wstring mountedPath = StorageManager.GetMountedPath(wstrFile); + wcstombs(m_szStreamName,mountedPath.c_str(),255); +#else + wstring &wstrSoundName=dlcAudioFile->GetSoundName(m_musicID); + char szName[255]; + wcstombs(szName,wstrSoundName.c_str(),255); + + string strFile="TPACK:\\Data\\" + string(szName) + ".binka"; + std::string mountedPath = StorageManager.GetMountedPath(strFile); + strcpy(m_szStreamName,mountedPath.c_str()); +#endif + } + else + { + SetIsPlayingStreamingGameMusic(false); + SetIsPlayingStreamingCDMusic(true); + m_MusicType=eMusicType_CD; + m_StreamingAudioInfo.bIs3D=true; + + // Need to adjust to index into the cds in the game's m_szStreamFileA + strcat((char *)m_szStreamName,"cds/"); + strcat((char *)m_szStreamName,m_szStreamFileA[m_musicID-m_iStream_CD_1+eStream_CD_1]); + strcat((char *)m_szStreamName,".binka"); + } + } + else + { + // 4J-PB - if this is a PS3 disc patch, we have to check if the music file is in the patch data +#ifdef __PS3__ + if(app.GetBootedFromDiscPatch() && (m_musicIDRun(); + m_StreamState = eMusicStreamState_Opening; + } + break; + + case eMusicStreamState_Opening: + // If the open stream thread is complete, then we are ready to proceed to actually playing + if( !m_openStreamThread->isRunning() ) + { + delete m_openStreamThread; + m_openStreamThread = NULL; + + HSAMPLE hSample = AIL_stream_sample_handle( m_hStream); + + // 4J-PB - causes the falloff to be calculated on the PPU instead of the SPU, and seems to resolve our distorted sound issue + AIL_register_falloff_function_callback(hSample,&custom_falloff_function); + + if(m_StreamingAudioInfo.bIs3D) + { + AIL_set_sample_3D_distances(hSample,64.0f,1,0); // Larger distance scaler for music discs + if(m_validListenerCount>1) + { + float fClosest=10000.0f; + int iClosestListener=0; + float fClosestX=0.0f,fClosestY=0.0f,fClosestZ=0.0f,fDist; + // need to calculate the distance from the sound to the nearest listener - use Manhattan Distance as the decision + for( int i = 0; i < MAX_LOCAL_PLAYERS; i++ ) + { + if( m_ListenerA[i].bValid ) + { + float x,y,z; + + x=fabs(m_ListenerA[i].vPosition.x-m_StreamingAudioInfo.x); + y=fabs(m_ListenerA[i].vPosition.y-m_StreamingAudioInfo.y); + z=fabs(m_ListenerA[i].vPosition.z-m_StreamingAudioInfo.z); + fDist=x+y+z; + + if(fDistisRunning() ) + { + delete m_openStreamThread; + m_openStreamThread = NULL; + m_StreamState = eMusicStreamState_Stop; + } + break; + case eMusicStreamState_Stop: + // should gradually take the volume down in steps + AIL_pause_stream(m_hStream,1); + AIL_close_stream(m_hStream); + m_hStream=0; + SetIsPlayingStreamingCDMusic(false); + SetIsPlayingStreamingGameMusic(false); + m_StreamState=eMusicStreamState_Idle; + break; + case eMusicStreamState_Stopping: + break; + case eMusicStreamState_Play: + break; + case eMusicStreamState_Playing: + if(GetIsPlayingStreamingGameMusic()) + { + //if(m_MusicInfo.pCue!=NULL) + { + bool playerInEnd = false; + bool playerInNether=false; + Minecraft *pMinecraft = Minecraft::GetInstance(); + for(unsigned int i = 0; i < MAX_LOCAL_PLAYERS; ++i) + { + if(pMinecraft->localplayers[i]!=NULL) + { + if(pMinecraft->localplayers[i]->dimension==LevelData::DIMENSION_END) + { + playerInEnd=true; + } + else if(pMinecraft->localplayers[i]->dimension==LevelData::DIMENSION_NETHER) + { + playerInNether=true; + } + } + } + + if(playerInEnd && !GetIsPlayingEndMusic()) + { + m_StreamState=eMusicStreamState_Stop; + + // Set the end track + m_musicID = getMusicID(LevelData::DIMENSION_END); + SetIsPlayingEndMusic(true); + SetIsPlayingNetherMusic(false); + } + else if(!playerInEnd && GetIsPlayingEndMusic()) + { + if(playerInNether) + { + m_StreamState=eMusicStreamState_Stop; + + // Set the end track + m_musicID = getMusicID(LevelData::DIMENSION_NETHER); + SetIsPlayingEndMusic(false); + SetIsPlayingNetherMusic(true); + } + else + { + m_StreamState=eMusicStreamState_Stop; + + // Set the end track + m_musicID = getMusicID(LevelData::DIMENSION_OVERWORLD); + SetIsPlayingEndMusic(false); + SetIsPlayingNetherMusic(false); + } + } + else if (playerInNether && !GetIsPlayingNetherMusic()) + { + m_StreamState=eMusicStreamState_Stop; + // set the Nether track + m_musicID = getMusicID(LevelData::DIMENSION_NETHER); + SetIsPlayingNetherMusic(true); + SetIsPlayingEndMusic(false); + } + else if(!playerInNether && GetIsPlayingNetherMusic()) + { + if(playerInEnd) + { + m_StreamState=eMusicStreamState_Stop; + // set the Nether track + m_musicID = getMusicID(LevelData::DIMENSION_END); + SetIsPlayingNetherMusic(false); + SetIsPlayingEndMusic(true); + } + else + { + m_StreamState=eMusicStreamState_Stop; + // set the Nether track + m_musicID = getMusicID(LevelData::DIMENSION_OVERWORLD); + SetIsPlayingNetherMusic(false); + SetIsPlayingEndMusic(false); + } + } + + // volume change required? + if(fMusicVol!=getMasterMusicVolume()) + { + fMusicVol=getMasterMusicVolume(); + HSAMPLE hSample = AIL_stream_sample_handle( m_hStream); + //AIL_set_sample_3D_position( hSample, m_StreamingAudioInfo.x, m_StreamingAudioInfo.y, m_StreamingAudioInfo.z ); + AIL_set_sample_volume_levels( hSample, fMusicVol, fMusicVol); + } + } + } + else + { + // Music disc playing - if it's a 3D stream, then set the position - we don't have any streaming audio in the world that moves, so this isn't + // required unless we have more than one listener, and are setting the listening position to the origin and setting a fake position + // for the sound down the z axis + if(m_StreamingAudioInfo.bIs3D) + { + if(m_validListenerCount>1) + { + float fClosest=10000.0f; + int iClosestListener=0; + float fClosestX=0.0f,fClosestY=0.0f,fClosestZ=0.0f,fDist; + + // need to calculate the distance from the sound to the nearest listener - use Manhattan Distance as the decision + for( int i = 0; i < MAX_LOCAL_PLAYERS; i++ ) + { + if( m_ListenerA[i].bValid ) + { + float x,y,z; + + x=fabs(m_ListenerA[i].vPosition.x-m_StreamingAudioInfo.x); + y=fabs(m_ListenerA[i].vPosition.y-m_StreamingAudioInfo.y); + z=fabs(m_ListenerA[i].vPosition.z-m_StreamingAudioInfo.z); + fDist=x+y+z; + + if(fDistnextInt(20 * 60 * 3);//random->nextInt(20 * 60 * 10) + 20 * 60 * 10; + // Check if we have a local player in The Nether or in The End, and play that music if they are + Minecraft *pMinecraft=Minecraft::GetInstance(); + bool playerInEnd=false; + bool playerInNether=false; + + for(unsigned int i=0;ilocalplayers[i]!=NULL) + { + if(pMinecraft->localplayers[i]->dimension==LevelData::DIMENSION_END) + { + playerInEnd=true; + } + else if(pMinecraft->localplayers[i]->dimension==LevelData::DIMENSION_NETHER) + { + playerInNether=true; + } + } + } + if(playerInEnd) + { + m_musicID = getMusicID(LevelData::DIMENSION_END); + SetIsPlayingEndMusic(true); + SetIsPlayingNetherMusic(false); + } + else if(playerInNether) + { + m_musicID = getMusicID(LevelData::DIMENSION_NETHER); + SetIsPlayingNetherMusic(true); + SetIsPlayingEndMusic(false); + } + else + { + m_musicID = getMusicID(LevelData::DIMENSION_OVERWORLD); + SetIsPlayingNetherMusic(false); + SetIsPlayingEndMusic(false); + } + + m_StreamState=eMusicStreamState_Idle; + } + break; + } + + // check the status of the stream - this is for when a track completes rather than is stopped by the user action + + if(m_hStream!=0) + { + if(AIL_stream_status(m_hStream)==SMP_DONE ) // SMP_DONE + { + AIL_close_stream(m_hStream); + m_hStream=0; + SetIsPlayingStreamingCDMusic(false); + SetIsPlayingStreamingGameMusic(false); + + m_StreamState=eMusicStreamState_Completed; + } + } +} + + +///////////////////////////////////////////// +// +// ConvertSoundPathToName +// +///////////////////////////////////////////// +char *SoundEngine::ConvertSoundPathToName(const wstring& name, bool bConvertSpaces) +{ + static char buf[256]; + assert(name.length()<256); + for(unsigned int i = 0; i < name.length(); i++ ) + { + wchar_t c = name[i]; + if(c=='.') c='/'; + if(bConvertSpaces) + { + if(c==' ') c='_'; + } + buf[i] = (char)c; + } + buf[name.length()] = 0; + return buf; +} + +#endif + + +F32 AILCALLBACK custom_falloff_function (HSAMPLE S, + F32 distance, + F32 rolloff_factor, + F32 min_dist, + F32 max_dist) +{ + F32 result; + + // This is now emulating the linear fall-off function that we used on the Xbox 360. The parameter which is passed as "max_dist" is the only one actually used, + // and is generally used as CurveDistanceScaler is used on XACT on the Xbox. A special value of 10000.0f is passed for thunder, which has no attenuation + + if( max_dist == 10000.0f ) + { + return 1.0f; + } + + result = 1.0f - ( distance / max_dist ); + if( result < 0.0f ) result = 0.0f; + if( result > 1.0f ) result = 1.0f; + + return result; +} diff --git a/Minecraft.Client/Common/Audio/SoundEngine.h b/Minecraft.Client/Common/Audio/SoundEngine.h new file mode 100644 index 00000000..92c99d23 --- /dev/null +++ b/Minecraft.Client/Common/Audio/SoundEngine.h @@ -0,0 +1,168 @@ +#pragma once +class Mob; +class Options; +using namespace std; +#include "..\..\Minecraft.World\SoundTypes.h" + +enum eMUSICFILES +{ + eStream_Overworld_Calm1 = 0, + eStream_Overworld_Calm2, + eStream_Overworld_Calm3, + eStream_Overworld_hal1, + eStream_Overworld_hal2, + eStream_Overworld_hal3, + eStream_Overworld_hal4, + eStream_Overworld_nuance1, + eStream_Overworld_nuance2, +#ifndef _XBOX + // Add the new music tracks + eStream_Overworld_Creative1, + eStream_Overworld_Creative2, + eStream_Overworld_Creative3, + eStream_Overworld_Creative4, + eStream_Overworld_Creative5, + eStream_Overworld_Creative6, + eStream_Overworld_Menu1, + eStream_Overworld_Menu2, + eStream_Overworld_Menu3, + eStream_Overworld_Menu4, +#endif + eStream_Overworld_piano1, + eStream_Overworld_piano2, + eStream_Overworld_piano3, // <-- make piano3 the last overworld one + // Nether + eStream_Nether1, + eStream_Nether2, + eStream_Nether3, + eStream_Nether4, + // The End + eStream_end_dragon, + eStream_end_end, + eStream_CD_1, + eStream_CD_2, + eStream_CD_3, + eStream_CD_4, + eStream_CD_5, + eStream_CD_6, + eStream_CD_7, + eStream_CD_8, + eStream_CD_9, + eStream_CD_10, + eStream_CD_11, + eStream_CD_12, + eStream_Max, +}; + +enum eMUSICTYPE +{ + eMusicType_None, + eMusicType_Game, + eMusicType_CD, +}; + + +enum MUSIC_STREAMSTATE +{ + eMusicStreamState_Idle=0, + eMusicStreamState_Stop, + eMusicStreamState_Stopping, + eMusicStreamState_Opening, + eMusicStreamState_OpeningCancel, + eMusicStreamState_Play, + eMusicStreamState_Playing, + eMusicStreamState_Completed +}; + +typedef struct +{ + F32 x,y,z,volume,pitch; + int iSound; + bool bIs3D; + bool bUseSoundsPitchVal; +#ifdef _DEBUG + char chName[64]; +#endif +} +AUDIO_INFO; + +class SoundEngine : public ConsoleSoundEngine +{ + static const int MAX_SAME_SOUNDS_PLAYING = 8; // 4J added +public: + SoundEngine(); + virtual void destroy(); +#ifdef _DEBUG + void GetSoundName(char *szSoundName,int iSound); +#endif + virtual void play(int iSound, float x, float y, float z, float volume, float pitch); + virtual void playStreaming(const wstring& name, float x, float y , float z, float volume, float pitch, bool bMusicDelay=true); + virtual void playUI(int iSound, float volume, float pitch); + virtual void playMusicTick(); + virtual void updateMusicVolume(float fVal); + virtual void updateSystemMusicPlaying(bool isPlaying); + virtual void updateSoundEffectVolume(float fVal); + virtual void init(Options *); + virtual void tick(shared_ptr *players, float a); // 4J - updated to take array of local players rather than single one + virtual void add(const wstring& name, File *file); + virtual void addMusic(const wstring& name, File *file); + virtual void addStreaming(const wstring& name, File *file); + virtual char *ConvertSoundPathToName(const wstring& name, bool bConvertSpaces=false); + bool isStreamingWavebankReady(); // 4J Added + int getMusicID(int iDomain); + int getMusicID(const wstring& name); + void SetStreamingSounds(int iOverworldMin, int iOverWorldMax, int iNetherMin, int iNetherMax, int iEndMin, int iEndMax, int iCD1); + void updateMiles(); // AP added so Vita can update all the Miles functions during the mixer callback + void playMusicUpdate(); + +private: + float getMasterMusicVolume(); + // platform specific functions +#ifdef __PS3__ + int initAudioHardware(int iMinSpeakers); +#else + int initAudioHardware(int iMinSpeakers) { return iMinSpeakers;} +#endif + + int GetRandomishTrack(int iStart,int iEnd); + + HMSOUNDBANK m_hBank; + HDIGDRIVER m_hDriver; + HSTREAM m_hStream; + + static char m_szSoundPath[]; + static char m_szMusicPath[]; + static char m_szRedistName[]; + static char *m_szStreamFileA[eStream_Max]; + + AUDIO_LISTENER m_ListenerA[MAX_LOCAL_PLAYERS]; + int m_validListenerCount; + + + Random *random; + int m_musicID; + int m_iMusicDelay; + int m_StreamState; + int m_MusicType; + AUDIO_INFO m_StreamingAudioInfo; + wstring m_CDMusic; + BOOL m_bSystemMusicPlaying; + float m_MasterMusicVolume; + float m_MasterEffectsVolume; + + C4JThread *m_openStreamThread; + static int OpenStreamThreadProc( void* lpParameter ); + char m_szStreamName[255]; + int CurrentSoundsPlaying[eSoundType_MAX+eSFX_MAX]; + + // streaming music files - will be different for mash-up packs + int m_iStream_Overworld_Min,m_iStream_Overworld_Max; + int m_iStream_Nether_Min,m_iStream_Nether_Max; + int m_iStream_End_Min,m_iStream_End_Max; + int m_iStream_CD_1; + bool *m_bHeardTrackA; + +#ifdef __ORBIS__ + int32_t m_hBGMAudio; +#endif +}; diff --git a/Minecraft.Client/Common/Audio/SoundNames.cpp b/Minecraft.Client/Common/Audio/SoundNames.cpp new file mode 100644 index 00000000..170c87a0 --- /dev/null +++ b/Minecraft.Client/Common/Audio/SoundNames.cpp @@ -0,0 +1,165 @@ +#include "stdafx.h" + +#include "Consoles_SoundEngine.h" + + + +const WCHAR *ConsoleSoundEngine::wchSoundNames[eSoundType_MAX]= +{ + L"mob.chicken", // eSoundType_MOB_CHICKEN_AMBIENT + L"mob.chickenhurt", // eSoundType_MOB_CHICKEN_HURT + L"mob.chickenplop", // eSoundType_MOB_CHICKENPLOP + L"mob.cow", // eSoundType_MOB_COW_AMBIENT + L"mob.cowhurt", // eSoundType_MOB_COW_HURT + L"mob.pig", // eSoundType_MOB_PIG_AMBIENT + L"mob.pigdeath", // eSoundType_MOB_PIG_DEATH + L"mob.sheep", // eSoundType_MOB_SHEEP_AMBIENT + L"mob.wolf.growl", // eSoundType_MOB_WOLF_GROWL + L"mob.wolf.whine", // eSoundType_MOB_WOLF_WHINE + L"mob.wolf.panting", // eSoundType_MOB_WOLF_PANTING + L"mob.wolf.bark", // eSoundType_MOB_WOLF_BARK + L"mob.wolf.hurt", // eSoundType_MOB_WOLF_HURT + L"mob.wolf.death", // eSoundType_MOB_WOLF_DEATH + L"mob.wolf.shake", // eSoundType_MOB_WOLF_SHAKE + L"mob.blaze.breathe", // eSoundType_MOB_BLAZE_BREATHE + L"mob.blaze.hit", // eSoundType_MOB_BLAZE_HURT + L"mob.blaze.death", // eSoundType_MOB_BLAZE_DEATH + L"mob.ghast.moan", // eSoundType_MOB_GHAST_MOAN + L"mob.ghast.scream", // eSoundType_MOB_GHAST_SCREAM + L"mob.ghast.death", // eSoundType_MOB_GHAST_DEATH + L"mob.ghast.fireball", // eSoundType_MOB_GHAST_FIREBALL + L"mob.ghast.charge", // eSoundType_MOB_GHAST_CHARGE + L"mob.endermen.idle", // eSoundType_MOB_ENDERMEN_IDLE + L"mob.endermen.hit", // eSoundType_MOB_ENDERMEN_HIT + L"mob.endermen.death", // eSoundType_MOB_ENDERMEN_DEATH + L"mob.endermen.portal", // eSoundType_MOB_ENDERMEN_PORTAL + L"mob.zombiepig.zpig", // eSoundType_MOB_ZOMBIEPIG_AMBIENT + L"mob.zombiepig.zpighurt", // eSoundType_MOB_ZOMBIEPIG_HURT + L"mob.zombiepig.zpigdeath", // eSoundType_MOB_ZOMBIEPIG_DEATH + L"mob.zombiepig.zpigangry", // eSoundType_MOB_ZOMBIEPIG_ZPIGANGRY + L"mob.silverfish.say", // eSoundType_MOB_SILVERFISH_AMBIENT, + L"mob.silverfish.hit", // eSoundType_MOB_SILVERFISH_HURT + L"mob.silverfish.kill", // eSoundType_MOB_SILVERFISH_DEATH, + L"mob.silverfish.step", // eSoundType_MOB_SILVERFISH_STEP, + L"mob.skeleton", // eSoundType_MOB_SKELETON_AMBIENT, + L"mob.skeletonhurt", // eSoundType_MOB_SKELETON_HURT, + L"mob.spider", // eSoundType_MOB_SPIDER_AMBIENT, + L"mob.spiderdeath", // eSoundType_MOB_SPIDER_DEATH, + L"mob.slime", // eSoundType_MOB_SLIME, + L"mob.slimeattack", // eSoundType_MOB_SLIME_ATTACK, + L"mob.creeper", // eSoundType_MOB_CREEPER_HURT, + L"mob.creeperdeath", // eSoundType_MOB_CREEPER_DEATH, + L"mob.zombie", // eSoundType_MOB_ZOMBIE_AMBIENT, + L"mob.zombiehurt", // eSoundType_MOB_ZOMBIE_HURT, + L"mob.zombiedeath", // eSoundType_MOB_ZOMBIE_DEATH, + L"mob.zombie.wood", // eSoundType_MOB_ZOMBIE_WOOD, + L"mob.zombie.woodbreak", // eSoundType_MOB_ZOMBIE_WOOD_BREAK, + L"mob.zombie.metal", // eSoundType_MOB_ZOMBIE_METAL, + L"mob.magmacube.big", // eSoundType_MOB_MAGMACUBE_BIG, + L"mob.magmacube.small", // eSoundType_MOB_MAGMACUBE_SMALL, + L"mob.cat.purr", // eSoundType_MOB_CAT_PURR + L"mob.cat.purreow", // eSoundType_MOB_CAT_PURREOW + L"mob.cat.meow", // eSoundType_MOB_CAT_MEOW + // 4J-PB - correct the name of the event for hitting ocelots + L"mob.cat.hit", // eSoundType_MOB_CAT_HITT +// L"mob.irongolem.throw", // eSoundType_MOB_IRONGOLEM_THROW +// L"mob.irongolem.hit", // eSoundType_MOB_IRONGOLEM_HIT +// L"mob.irongolem.death", // eSoundType_MOB_IRONGOLEM_DEATH +// L"mob.irongolem.walk", // eSoundType_MOB_IRONGOLEM_WALK + L"random.bow", // eSoundType_RANDOM_BOW, + L"random.bowhit", // eSoundType_RANDOM_BOW_HIT, + L"random.explode", // eSoundType_RANDOM_EXPLODE, + L"random.fizz", // eSoundType_RANDOM_FIZZ, + L"random.pop", // eSoundType_RANDOM_POP, + L"random.fuse", // eSoundType_RANDOM_FUSE, + L"random.drink", // eSoundType_RANDOM_DRINK, + L"random.eat", // eSoundType_RANDOM_EAT, + L"random.burp", // eSoundType_RANDOM_BURP, + L"random.splash", // eSoundType_RANDOM_SPLASH, + L"random.click", // eSoundType_RANDOM_CLICK, + L"random.glass", // eSoundType_RANDOM_GLASS, + L"random.orb", // eSoundType_RANDOM_ORB, + L"random.break", // eSoundType_RANDOM_BREAK, + L"random.chestopen", // eSoundType_RANDOM_CHEST_OPEN, + L"random.chestclosed", // eSoundType_RANDOM_CHEST_CLOSE, + L"random.door_open", // eSoundType_RANDOM_DOOR_OPEN, + L"random.door_close", // eSoundType_RANDOM_DOOR_CLOSE, + L"ambient.weather.rain", // eSoundType_AMBIENT_WEATHER_RAIN, + L"ambient.weather.thunder", // eSoundType_AMBIENT_WEATHER_THUNDER, + L"ambient.cave.cave", // eSoundType_CAVE_CAVE, DON'T USE FOR XBOX 360!!! +#ifdef _XBOX + L"ambient.cave.cave2", // eSoundType_CAVE_CAVE2 - removed the two sounds that were at 192k in the first ambient cave event +#endif + L"portal.portal", // eSoundType_PORTAL_PORTAL, + // 4J-PB - added a couple that were still using wstring + L"portal.trigger", // eSoundType_PORTAL_TRIGGER + L"portal.travel", // eSoundType_PORTAL_TRAVEL + + L"fire.ignite", // eSoundType_FIRE_IGNITE, + L"fire.fire", // eSoundType_FIRE_FIRE, + L"damage.hurtflesh", // eSoundType_DAMAGE_HURT, + L"damage.fallsmall", // eSoundType_DAMAGE_FALL_SMALL, + L"damage.fallbig", // eSoundType_DAMAGE_FALL_BIG, + L"note.harp", // eSoundType_NOTE_HARP, + L"note.bd", // eSoundType_NOTE_BD, + L"note.snare", // eSoundType_NOTE_SNARE, + L"note.hat", // eSoundType_NOTE_HAT, + L"note.bassattack", // eSoundType_NOTE_BASSATTACK, + L"tile.piston.in", // eSoundType_TILE_PISTON_IN, + L"tile.piston.out", // eSoundType_TILE_PISTON_OUT, + L"liquid.water", // eSoundType_LIQUID_WATER, + L"liquid.lavapop", // eSoundType_LIQUID_LAVA_POP, + L"liquid.lava", // eSoundType_LIQUID_LAVA, + L"step.stone", // eSoundType_STEP_STONE, + L"step.wood", // eSoundType_STEP_WOOD, + L"step.gravel", // eSoundType_STEP_GRAVEL, + L"step.grass", // eSoundType_STEP_GRASS, + L"step.metal", // eSoundType_STEP_METAL, + L"step.cloth", // eSoundType_STEP_CLOTH, + L"step.sand", // eSoundType_STEP_SAND, + + // below this are the additional sounds from the second soundbank + L"mob.enderdragon.end", // eSoundType_MOB_ENDERDRAGON_END + L"mob.enderdragon.growl", // eSoundType_MOB_ENDERDRAGON_GROWL + L"mob.enderdragon.hit", // eSoundType_MOB_ENDERDRAGON_HIT + L"mob.enderdragon.wings", // eSoundType_MOB_ENDERDRAGON_MOVE + L"mob.irongolem.throw", // eSoundType_MOB_IRONGOLEM_THROW + L"mob.irongolem.hit", // eSoundType_MOB_IRONGOLEM_HIT + L"mob.irongolem.death", // eSoundType_MOB_IRONGOLEM_DEATH + L"mob.irongolem.walk", // eSoundType_MOB_IRONGOLEM_WALK + + // TU14 + L"damage.thorns", // eSoundType_DAMAGE_THORNS + L"random.anvil_break", // eSoundType_RANDOM_ANVIL_BREAK + L"random.anvil_land", // eSoundType_RANDOM_ANVIL_LAND + L"random.anvil_use", // eSoundType_RANDOM_ANVIL_USE + L"mob.villager.haggle", // eSoundType_MOB_VILLAGER_HAGGLE + L"mob.villager.idle", // eSoundType_MOB_VILLAGER_IDLE + L"mob.villager.hit", // eSoundType_MOB_VILLAGER_HIT + L"mob.villager.death", // eSoundType_MOB_VILLAGER_DEATH + L"mob.villager.yes", // eSoundType_MOB_VILLAGER_YES + L"mob.villager.no", // eSoundType_MOB_VILLAGER_NO + L"mob.zombie.infect", // eSoundType_MOB_ZOMBIE_INFECT + L"mob.zombie.unfect", // eSoundType_MOB_ZOMBIE_UNFECT + L"mob.zombie.remedy", // eSoundType_MOB_ZOMBIE_REMEDY + L"step.snow", // eSoundType_STEP_SNOW + L"step.ladder", // eSoundType_STEP_LADDER + L"dig.cloth", // eSoundType_DIG_CLOTH + L"dig.grass", // eSoundType_DIG_GRASS + L"dig.gravel", // eSoundType_DIG_GRAVEL + L"dig.sand", // eSoundType_DIG_SAND + L"dig.snow", // eSoundType_DIG_SNOW + L"dig.stone", // eSoundType_DIG_STONE + L"dig.wood", // eSoundType_DIG_WOOD +}; + + +const WCHAR *ConsoleSoundEngine::wchUISoundNames[eSFX_MAX]= +{ + L"back", + L"craft", + L"craftfail", + L"focus", + L"press", + L"scroll", +}; diff --git a/Minecraft.Client/Common/BuildVer.h b/Minecraft.Client/Common/BuildVer.h new file mode 100644 index 00000000..ee558b03 --- /dev/null +++ b/Minecraft.Client/Common/BuildVer.h @@ -0,0 +1,57 @@ + +#pragma once + + +#define VER_PRODUCTMAJORVERSION 0 +#define VER_PRODUCTMINORVERSION 0 + +// This goes up with each build +// 4J-JEV: This value is extracted with a regex so it can be placed as the version in the AppX manifest on Durango. +#define VER_PRODUCTBUILD 495 +// This goes up if there is any change to network traffic or code in a build +#define VER_NETWORK 495 +#define VER_PRODUCTBUILD_QFE 0 + +#define VER_FILEVERSION_STRING "1.3" +#define VER_PRODUCTVERSION_STRING VER_FILEVERSION_STRING +#define VER_FILEVERSION_STRING_W L"1.3" +#define VER_PRODUCTVERSION_STRING_W VER_FILEVERSION_STRING_W +#define VER_FILEBETA_STR "" +#undef VER_FILEVERSION +#define VER_FILEVERSION VER_PRODUCTMAJORVERSION, VER_PRODUCTMINORVERSION, VER_PRODUCTBUILD, VER_PRODUCTBUILD_QFE +#define VER_PRODUCTVERSION VER_PRODUCTMAJORVERSION, VER_PRODUCTMINORVERSION, VER_PRODUCTBUILD, VER_PRODUCTBUILD_QFE + +#if (VER_PRODUCTBUILD < 10) +#define VER_FILEBPAD "000" +#define VER_FILEBPAD_W L"000" +#elif (VER_PRODUCTBUILD < 100) +#define VER_FILEBPAD "00" +#define VER_FILEBPAD_W L"00" +#elif (VER_PRODUCTBUILD < 1000) +#define VER_FILEBPAD "0" +#define VER_FILEBPAD_W L"0" +#else +#define VER_FILEBPAD +#define VER_FILEBPAD_W +#endif + +#define VER_WIDE_PREFIX(x) L##x + +#define VER_FILEVERSION_STR2(x,y) VER_FILEVERSION_STRING "." VER_FILEBPAD #x "." #y +#define VER_FILEVERSION_STR2_W(x,y) VER_FILEVERSION_STRING_W L"." VER_FILEBPAD_W VER_WIDE_PREFIX(#x) L"." VER_WIDE_PREFIX(#y) +#define VER_FILEVERSION_STR1(x,y) VER_FILEVERSION_STR2(x, y) +#define VER_FILEVERSION_STR1_W(x,y) VER_FILEVERSION_STR2_W(x, y) + +#undef VER_FILEVERSION_STR +#define VER_FILEVERSION_STR VER_FILEVERSION_STR1(VER_PRODUCTBUILD, VER_PRODUCTBUILD_QFE) +#define VER_PRODUCTVERSION_STR VER_FILEVERSION_STR1(VER_PRODUCTBUILD, VER_PRODUCTBUILD_QFE) + +#define VER_FILEVERSION_STR_W VER_FILEVERSION_STR1_W(VER_PRODUCTBUILD, VER_PRODUCTBUILD_QFE) +#define VER_PRODUCTVERSION_STR_W VER_FILEVERSION_STR1_W(VER_PRODUCTBUILD, VER_PRODUCTBUILD_QFE) + +#if (VER_PRODUCTBUILD_QFE >= 256) +#error "QFE number cannot exceed 255" +#endif + + + diff --git a/Minecraft.Client/Common/C4JMemoryPool.h b/Minecraft.Client/Common/C4JMemoryPool.h new file mode 100644 index 00000000..e1e795ec --- /dev/null +++ b/Minecraft.Client/Common/C4JMemoryPool.h @@ -0,0 +1,176 @@ + +#pragma once + + +#include + +class C4JMemoryPool +{ +public: + unsigned int Align(unsigned int val, unsigned int align) { return int((val+(align-1))/align) * align; } + virtual void* Alloc(size_t size) = 0; + virtual void Free(void* ptr) = 0; +}; + + + +// Fast Efficient Fixed-Size Memory Pool : No Loops and No Overhead +// http://www.alogicalmind.com/memory_pools/index.htm +class C4JMemoryPoolFixed : public C4JMemoryPool +{ + // Basic type define + typedef unsigned int uint; + typedef unsigned char uchar; + uint m_numOfBlocks; // Num of blocks + uint m_sizeOfEachBlock; // Size of each block + uint m_numFreeBlocks; // Num of remaining blocks + uint m_numInitialized; // Num of initialized blocks + uchar* m_memStart; // Beginning of memory pool + uchar* m_memEnd; // End of memory pool + uchar* m_next; // Num of next free block +// CRITICAL_SECTION m_CS; +public: + C4JMemoryPoolFixed() + { + m_numOfBlocks = 0; + m_sizeOfEachBlock = 0; + m_numFreeBlocks = 0; + m_numInitialized = 0; + m_memStart = NULL; + m_memEnd = NULL; + m_next = 0; + } + + C4JMemoryPoolFixed(uint sizeOfEachBlock, uint numOfBlocks) + { + CreatePool(sizeOfEachBlock, numOfBlocks); + } + + ~C4JMemoryPoolFixed() { DestroyPool(); } + + void CreatePool(uint sizeOfEachBlock, uint numOfBlocks) + { + assert(sizeOfEachBlock >= 4); // has to be at least the size of an int, for book keeping + m_numOfBlocks = numOfBlocks; + m_sizeOfEachBlock = sizeOfEachBlock; + m_numFreeBlocks = numOfBlocks; + m_numInitialized = 0; + m_memStart = new uchar[ m_sizeOfEachBlock * + m_numOfBlocks ]; + m_memEnd = m_memStart + (m_sizeOfEachBlock * m_numOfBlocks); + m_next = m_memStart; +// InitializeCriticalSection(&m_CS); + } + + void DestroyPool() + { + delete[] m_memStart; + m_memStart = NULL; + } + + uchar* AddrFromIndex(uint i) const + { + return m_memStart + ( i * m_sizeOfEachBlock ); + } + + uint IndexFromAddr(const uchar* p) const + { + return (((uint)(p - m_memStart)) / m_sizeOfEachBlock); + } + + virtual void* Alloc(size_t size) + { + if(size > m_sizeOfEachBlock) + return ::malloc(size); +// EnterCriticalSection(&m_CS); + if (m_numInitialized < m_numOfBlocks ) + { + uint* p = (uint*)AddrFromIndex( m_numInitialized ); + *p = m_numInitialized + 1; + m_numInitialized++; + } + void* ret = NULL; + if ( m_numFreeBlocks > 0 ) + { + ret = (void*)m_next; + --m_numFreeBlocks; + if (m_numFreeBlocks!=0) + { + m_next = AddrFromIndex( *((uint*)m_next) ); + } + else + { + m_next = NULL; + } + } +// LeaveCriticalSection(&m_CS); + return ret; + } + + virtual void Free(void* ptr) + { + if(ptr < m_memStart || ptr > m_memEnd) + { + ::free(ptr); + return; + } +// EnterCriticalSection(&m_CS); + if (m_next != NULL) + { + (*(uint*)ptr) = IndexFromAddr( m_next ); + m_next = (uchar*)ptr; + } + else + { + *((uint*)ptr) = m_numOfBlocks; + m_next = (uchar*)ptr; + } + ++m_numFreeBlocks; +// LeaveCriticalSection(&m_CS); + } +}; // End pool class + + +// this pool will constantly grow until it is reset (automatically when all allocs have been "freed") +class C4JMemoryPoolGrow : public C4JMemoryPool +{ + uint32_t m_totalSize; + uint32_t m_memUsed; + uint32_t m_numAllocations; + uint8_t* m_pMemory; + uint32_t m_currentOffset; + +public: + C4JMemoryPoolGrow(uint32_t size = 64*1024) + { + size = Align(size, 4); + m_totalSize = size; + m_pMemory = new uint8_t[size]; + m_currentOffset = 0; + m_memUsed = 0; + m_numAllocations = 0; + } + + virtual void* Alloc(size_t size) + { + size = Align(size, 4); // 4 byte align the memory + assert((m_currentOffset + size) < m_totalSize); // make sure we haven't ran out of space + void* returnMem = &m_pMemory[m_currentOffset]; // grab the return memory + m_currentOffset += size; + m_numAllocations++; + return returnMem; + } + virtual void Free(void* ptr) + { + m_numAllocations--; + if(m_numAllocations == 0) + m_currentOffset = 0; // reset the pool when we reach zero allocations + } +}; + + + + + + + diff --git a/Minecraft.Client/Common/C4JMemoryPoolAllocator.h b/Minecraft.Client/Common/C4JMemoryPoolAllocator.h new file mode 100644 index 00000000..a46cc76d --- /dev/null +++ b/Minecraft.Client/Common/C4JMemoryPoolAllocator.h @@ -0,0 +1,113 @@ + + +#pragma once +#include "..\Minecraft.Client\Common\C4JMemoryPool.h" + +// Custom allocator, takes a C4JMemoryPool class, which can be one of a number of pool implementations. + +template +class C4JPoolAllocator +{ +public: + typedef T value_type; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + + typedef T* pointer; + typedef const T* const_pointer; + + typedef T& reference; + typedef const T& const_reference; + + //! A struct to construct an allocator for a different type. + template + struct rebind { typedef C4JPoolAllocator other; }; + + + C4JMemoryPool* m_pPool; + bool m_selfAllocated; + + C4JPoolAllocator( C4JMemoryPool* pool = new C4JMemoryPoolFixed(32, 4096 )) : m_pPool( pool ), m_selfAllocated(true) + { + printf("allocated mempool\n"); + } + + template + C4JPoolAllocator(C4JPoolAllocator const& obj) : m_pPool( obj.m_pPool ), m_selfAllocated(false) // copy constructor + { + printf("C4JPoolAllocator constructed from 0x%08x\n", &obj); + assert(obj.m_pPool); + } +private: + +public: + + ~C4JPoolAllocator() + { + if(m_selfAllocated) + delete m_pPool; + } + + pointer address( reference r ) const { return &r; } + const_pointer address( const_reference r ) const { return &r; } + + pointer allocate( size_type n, const void* /*hint*/=0 ) + { + assert(m_pPool); + return (pointer)m_pPool->Alloc(n * sizeof(T)); + } + + void deallocate( pointer p, size_type /*n*/ ) + { + assert(m_pPool); + m_pPool->Free(p); + } + + void construct( pointer p, const T& val ) + { + new (p) T(val); + } + + void destroy( pointer p ) + { + p->~T(); + } + + size_type max_size() const + { + return ULONG_MAX / sizeof(T); + } + +}; + + +template +bool +operator==( const C4JPoolAllocator& left, const C4JPoolAllocator& right ) +{ + if (left.m_pPool == right.m_pPool) + { + return true; + } + return false; +} + +template +bool +operator!=( const C4JPoolAllocator& left, const C4JPoolAllocator& right) +{ + if (left.m_pPool != right.m_pPool) + { + return true; + } + return false; +} + + + + + + + + + diff --git a/Minecraft.Client/Common/Colours/ColourTable.cpp b/Minecraft.Client/Common/Colours/ColourTable.cpp new file mode 100644 index 00000000..dc58cfb1 --- /dev/null +++ b/Minecraft.Client/Common/Colours/ColourTable.cpp @@ -0,0 +1,366 @@ +#include "stdafx.h" +#include "ColourTable.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" + +unordered_map ColourTable::s_colourNamesMap; + +wchar_t *ColourTable::ColourTableElements[eMinecraftColour_COUNT] = +{ + L"NOTSET", + + L"Foliage_Evergreen", + L"Foliage_Birch", + L"Foliage_Default", + L"Foliage_Common", + L"Foliage_Ocean", + L"Foliage_Plains", + L"Foliage_Desert", + L"Foliage_ExtremeHills", + L"Foliage_Forest", + L"Foliage_Taiga", + L"Foliage_Swampland", + L"Foliage_River", + L"Foliage_Hell", + L"Foliage_Sky", + L"Foliage_FrozenOcean", + L"Foliage_FrozenRiver", + L"Foliage_IcePlains", + L"Foliage_IceMountains", + L"Foliage_MushroomIsland", + L"Foliage_MushroomIslandShore", + L"Foliage_Beach", + L"Foliage_DesertHills", + L"Foliage_ForestHills", + L"Foliage_TaigaHills", + L"Foliage_ExtremeHillsEdge", + L"Foliage_Jungle", + L"Foliage_JungleHills", + + L"Grass_Common", + L"Grass_Ocean", + L"Grass_Plains", + L"Grass_Desert", + L"Grass_ExtremeHills", + L"Grass_Forest", + L"Grass_Taiga", + L"Grass_Swampland", + L"Grass_River", + L"Grass_Hell", + L"Grass_Sky", + L"Grass_FrozenOcean", + L"Grass_FrozenRiver", + L"Grass_IcePlains", + L"Grass_IceMountains", + L"Grass_MushroomIsland", + L"Grass_MushroomIslandShore", + L"Grass_Beach", + L"Grass_DesertHills", + L"Grass_ForestHills", + L"Grass_TaigaHills", + L"Grass_ExtremeHillsEdge", + L"Grass_Jungle", + L"Grass_JungleHills", + + L"Water_Ocean", + L"Water_Plains", + L"Water_Desert", + L"Water_ExtremeHills", + L"Water_Forest", + L"Water_Taiga", + L"Water_Swampland", + L"Water_River", + L"Water_Hell", + L"Water_Sky", + L"Water_FrozenOcean", + L"Water_FrozenRiver", + L"Water_IcePlains", + L"Water_IceMountains", + L"Water_MushroomIsland", + L"Water_MushroomIslandShore", + L"Water_Beach", + L"Water_DesertHills", + L"Water_ForestHills", + L"Water_TaigaHills", + L"Water_ExtremeHillsEdge", + L"Water_Jungle", + L"Water_JungleHills", + + L"Sky_Ocean", + L"Sky_Plains", + L"Sky_Desert", + L"Sky_ExtremeHills", + L"Sky_Forest", + L"Sky_Taiga", + L"Sky_Swampland", + L"Sky_River", + L"Sky_Hell", + L"Sky_Sky", + L"Sky_FrozenOcean", + L"Sky_FrozenRiver", + L"Sky_IcePlains", + L"Sky_IceMountains", + L"Sky_MushroomIsland", + L"Sky_MushroomIslandShore", + L"Sky_Beach", + L"Sky_DesertHills", + L"Sky_ForestHills", + L"Sky_TaigaHills", + L"Sky_ExtremeHillsEdge", + L"Sky_Jungle", + L"Sky_JungleHills", + + L"Tile_RedstoneDust", + L"Tile_RedstoneDustUnlit", + L"Tile_RedstoneDustLitMin", + L"Tile_RedstoneDustLitMax", + L"Tile_StemMin", + L"Tile_StemMax", + L"Tile_WaterLily", + + L"Sky_Dawn_Dark", + L"Sky_Dawn_Bright", + + L"Material_None", + L"Material_Grass", + L"Material_Sand", + L"Material_Cloth", + L"Material_Fire", + L"Material_Ice", + L"Material_Metal", + L"Material_Plant", + L"Material_Snow", + L"Material_Clay", + L"Material_Dirt", + L"Material_Stone", + L"Material_Water", + L"Material_Wood", + L"Material_Emerald", + + L"Particle_Note_00", + L"Particle_Note_01", + L"Particle_Note_02", + L"Particle_Note_03", + L"Particle_Note_04", + L"Particle_Note_05", + L"Particle_Note_06", + L"Particle_Note_07", + L"Particle_Note_08", + L"Particle_Note_09", + L"Particle_Note_10", + L"Particle_Note_11", + L"Particle_Note_12", + L"Particle_Note_13", + L"Particle_Note_14", + L"Particle_Note_15", + L"Particle_Note_16", + L"Particle_Note_17", + L"Particle_Note_18", + L"Particle_Note_19", + L"Particle_Note_20", + L"Particle_Note_21", + L"Particle_Note_22", + L"Particle_Note_23", + L"Particle_Note_24", + + L"Particle_NetherPortal", + L"Particle_EnderPortal", + L"Particle_Smoke", + L"Particle_Ender", + + L"Particle_Explode", + L"Particle_HugeExplosion", + + L"Particle_DripWater", + L"Particle_DripLavaStart", + L"Particle_DripLavaEnd", + + L"Particle_EnchantmentTable", + L"Particle_DragonBreathMin", + L"Particle_DragonBreathMax", + L"Particle_Suspend", + + L"Particle_CritStart", // arrow in air + L"Particle_CritEnd", // arrow in air + + L"Effect_MovementSpeed", + L"Effect_MovementSlowDown", + L"Effect_DigSpeed", + L"Effect_DigSlowdown", + L"Effect_DamageBoost", + L"Effect_Heal", + L"Effect_Harm", + L"Effect_Jump", + L"Effect_Confusion", + L"Effect_Regeneration", + L"Effect_DamageResistance", + L"Effect_FireResistance", + L"Effect_WaterBreathing", + L"Effect_Invisiblity", + L"Effect_Blindness", + L"Effect_NightVision", + L"Effect_Hunger", + L"Effect_Weakness", + L"Effect_Poison", + + L"Potion_BaseColour", + + L"Mob_Creeper_Colour1", + L"Mob_Creeper_Colour2", + L"Mob_Skeleton_Colour1", + L"Mob_Skeleton_Colour2", + L"Mob_Spider_Colour1", + L"Mob_Spider_Colour2", + L"Mob_Zombie_Colour1", + L"Mob_Zombie_Colour2", + L"Mob_Slime_Colour1", + L"Mob_Slime_Colour2", + L"Mob_Ghast_Colour1", + L"Mob_Ghast_Colour2", + L"Mob_PigZombie_Colour1", + L"Mob_PigZombie_Colour2", + L"Mob_Enderman_Colour1", + L"Mob_Enderman_Colour2", + L"Mob_CaveSpider_Colour1", + L"Mob_CaveSpider_Colour2", + L"Mob_Silverfish_Colour1", + L"Mob_Silverfish_Colour2", + L"Mob_Blaze_Colour1", + L"Mob_Blaze_Colour2", + L"Mob_LavaSlime_Colour1", + L"Mob_LavaSlime_Colour2", + L"Mob_Pig_Colour1", + L"Mob_Pig_Colour2", + L"Mob_Sheep_Colour1", + L"Mob_Sheep_Colour2", + L"Mob_Cow_Colour1", + L"Mob_Cow_Colour2", + L"Mob_Chicken_Colour1", + L"Mob_Chicken_Colour2", + L"Mob_Squid_Colour1", + L"Mob_Squid_Colour2", + L"Mob_Wolf_Colour1", + L"Mob_Wolf_Colour2", + L"Mob_MushroomCow_Colour1", + L"Mob_MushroomCow_Colour2", + L"Mob_Ocelot_Colour1", + L"Mob_Ocelot_Colour2", + L"Mob_Villager_Colour1", + L"Mob_Villager_Colour2", + + L"Armour_Default_Leather_Colour", + L"Under_Water_Clear_Colour", + L"Under_Lava_Clear_Colour", + L"In_Cloud_Base_Colour", + + L"Under_Water_Fog_Colour", + L"Under_Lava_Fog_Colour", + L"In_Cloud_Fog_Colour", + + L"Default_Fog_Colour", + L"Nether_Fog_Colour", + L"End_Fog_Colour", + + L"Sign_Text", + L"Map_Text", + + L"HTMLColor_0", + L"HTMLColor_1", + L"HTMLColor_2", + L"HTMLColor_3", + L"HTMLColor_4", + L"HTMLColor_5", + L"HTMLColor_6", + L"HTMLColor_7", + L"HTMLColor_8", + L"HTMLColor_9", + L"HTMLColor_a", + L"HTMLColor_b", + L"HTMLColor_c", + L"HTMLColor_d", + L"HTMLColor_e", + L"HTMLColor_f", + L"HTMLColor_dark_0", + L"HTMLColor_dark_1", + L"HTMLColor_dark_2", + L"HTMLColor_dark_3", + L"HTMLColor_dark_4", + L"HTMLColor_dark_5", + L"HTMLColor_dark_6", + L"HTMLColor_dark_7", + L"HTMLColor_dark_8", + L"HTMLColor_dark_9", + L"HTMLColor_dark_a", + L"HTMLColor_dark_b", + L"HTMLColor_dark_c", + L"HTMLColor_dark_d", + L"HTMLColor_dark_e", + L"HTMLColor_dark_f", + L"HTMLColor_T1", + L"HTMLColor_T2", + L"HTMLColor_T3", + L"HTMLColor_Black", + L"HTMLColor_White", + L"Color_EnchantText", + L"Color_EnchantTextFocus", + L"Color_EnchantTextDisabled", + L"Color_RenamedItemTitle", +}; + +void ColourTable::staticCtor() +{ + for(unsigned int i = eMinecraftColour_NOT_SET; i < eMinecraftColour_COUNT; ++i) + { + s_colourNamesMap.insert( unordered_map::value_type( ColourTableElements[i], (eMinecraftColour)i) ); + } +} + +ColourTable::ColourTable(PBYTE pbData, DWORD dwLength) +{ + loadColoursFromData(pbData, dwLength); +} + +ColourTable::ColourTable(ColourTable *defaultColours, PBYTE pbData, DWORD dwLength) +{ + // 4J Stu - Default the colours that of the table passed in + XMemCpy( (void *)m_colourValues, (void *)defaultColours->m_colourValues, sizeof(int) * eMinecraftColour_COUNT); + loadColoursFromData(pbData, dwLength); +} +void ColourTable::loadColoursFromData(PBYTE pbData, DWORD dwLength) +{ + byteArray src(pbData, dwLength); + + ByteArrayInputStream bais(src); + DataInputStream dis(&bais); + + int versionNumber = dis.readInt(); + int coloursCount = dis.readInt(); + + for(int i = 0; i < coloursCount; ++i) + { + wstring colourId = dis.readUTF(); + int colourValue = dis.readInt(); + setColour(colourId, colourValue); + AUTO_VAR(it,s_colourNamesMap.find(colourId)); + } + + bais.reset(); +} + +void ColourTable::setColour(const wstring &colourName, int value) +{ + AUTO_VAR(it,s_colourNamesMap.find(colourName)); + if(it != s_colourNamesMap.end()) + { + m_colourValues[(int)it->second] = value; + } +} + +void ColourTable::setColour(const wstring &colourName, const wstring &value) +{ + setColour(colourName, _fromHEXString(value)); +} + +unsigned int ColourTable::getColour(eMinecraftColour id) +{ + return m_colourValues[(int)id]; +} diff --git a/Minecraft.Client/Common/Colours/ColourTable.h b/Minecraft.Client/Common/Colours/ColourTable.h new file mode 100644 index 00000000..8e0a348c --- /dev/null +++ b/Minecraft.Client/Common/Colours/ColourTable.h @@ -0,0 +1,23 @@ +#pragma once + +class ColourTable +{ +private: + unsigned int m_colourValues[eMinecraftColour_COUNT]; + + static wchar_t *ColourTableElements[eMinecraftColour_COUNT]; + static unordered_map s_colourNamesMap; + +public: + static void staticCtor(); + + ColourTable(PBYTE pbData, DWORD dwLength); + ColourTable(ColourTable *defaultColours, PBYTE pbData, DWORD dwLength); + + unsigned int getColour(eMinecraftColour id); + unsigned int getColor(eMinecraftColour id) { return getColour(id); } + + void loadColoursFromData(PBYTE pbData, DWORD dwLength); + void setColour(const wstring &colourName, int value); + void setColour(const wstring &colourName, const wstring &value); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/CommonMedia.sln b/Minecraft.Client/Common/CommonMedia.sln new file mode 100644 index 00000000..9f83988e --- /dev/null +++ b/Minecraft.Client/Common/CommonMedia.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CommonMedia", "CommonMedia.vcxproj", "{21BBD32C-AF5E-4741-8B80-3B73FC0D0F27}" +EndProject +Global + GlobalSection(TeamFoundationVersionControl) = preSolution + SccNumberOfProjects = 2 + SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C} + SccTeamFoundationServer = http://tfs_server:8080/tfs/storiespark + SccProjectUniqueName0 = CommonMedia.vcxproj + SccLocalPath0 = . + SccLocalPath1 = . + EndGlobalSection + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {21BBD32C-AF5E-4741-8B80-3B73FC0D0F27}.Debug|Win32.ActiveCfg = Debug|Win32 + {21BBD32C-AF5E-4741-8B80-3B73FC0D0F27}.Debug|Win32.Build.0 = Debug|Win32 + {21BBD32C-AF5E-4741-8B80-3B73FC0D0F27}.Release|Win32.ActiveCfg = Release|Win32 + {21BBD32C-AF5E-4741-8B80-3B73FC0D0F27}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Minecraft.Client/Common/CommonMedia.vcxproj b/Minecraft.Client/Common/CommonMedia.vcxproj new file mode 100644 index 00000000..5a472e0b --- /dev/null +++ b/Minecraft.Client/Common/CommonMedia.vcxproj @@ -0,0 +1,115 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {21BBD32C-AF5E-4741-8B80-3B73FC0D0F27} + MakeFileProj + SAK + SAK + SAK + SAK + + + + Makefile + true + v110 + + + Makefile + false + v110 + + + + + + + + + + + + + WIN32;_DEBUG;$(NMakePreprocessorDefinitions) + echo Creating languages.loc +copy .\Media\strings.resx .\Media\en-EN.lang +copy .\Media\fr-FR\strings.resx .\Media\fr-FR\fr-FR.lang +copy .\Media\ja-JP\strings.resx .\Media\ja-JP\ja-JP.lang +..\..\..\Tools\NewLocalisationPacker.exe --static .\Media .\Media\languages.loc + +echo Making archive +..\..\..\Tools\ArchiveFilePacker.exe -cd $(ProjectDir)\Media media.arc media.txt + +echo Copying Durango strings.h +copy .\Media\strings.h ..\Durango\strings.h + +echo Copying PS3 strings.h +copy .\Media\strings.h ..\PS3\strings.h + +echo Copying PS4 strings.h +copy .\Media\strings.h ..\Orbis\strings.h + +echo Copying Win strings.h +copy .\Media\strings.h ..\Windows64\strings.h + + + WIN32;NDEBUG;$(NMakePreprocessorDefinitions) + + + + + + + \ No newline at end of file diff --git a/Minecraft.Client/Common/CommonMedia.vcxproj.filters b/Minecraft.Client/Common/CommonMedia.vcxproj.filters new file mode 100644 index 00000000..9fb0927d --- /dev/null +++ b/Minecraft.Client/Common/CommonMedia.vcxproj.filters @@ -0,0 +1,136 @@ + + + + + {55c7ab2e-b3e5-4aed-9ffe-3308591d9c34} + + + {eaa0eb72-0b27-4080-ad53-f68e42f37ba8} + + + {711ad95b-eb56-4e18-b001-34ad7b8075a3} + + + {1432ec3d-c5d0-46da-91b6-e7737095a97e} + + + {4b2aeaf1-04d7-454d-b2d9-08364799831c} + + + {4b0eaef6-fa2f-4605-b0da-a81ffb5659bc} + + + {bf1c74da-21f1-4bdd-98ed-83457946e4cc} + + + + + IggyMedia + + + IggyMedia + + + IggyMedia + + + IggyMedia + + + IggyMedia + + + IggyMedia + + + IggyMedia + + + Archive + + + Archive + + + IggyMedia + + + IggyMedia + + + IggyMedia + + + IggyMedia + + + IggyMedia + + + IggyMedia + + + IggyMedia + + + + + Strings + + + + + Strings + + + Strings + + + Strings + + + Strings + + + Strings + + + Strings + + + Strings + + + Strings + + + Strings + + + Strings + + + Strings + + + Strings + + + Archive + + + + + Archive\Durango + + + Archive\PS3 + + + Archive\PS4 + + + Archive\Win64 + + + \ No newline at end of file diff --git a/Minecraft.Client/Common/ConsoleGameMode.cpp b/Minecraft.Client/Common/ConsoleGameMode.cpp new file mode 100644 index 00000000..b080e628 --- /dev/null +++ b/Minecraft.Client/Common/ConsoleGameMode.cpp @@ -0,0 +1,9 @@ +#include "stdafx.h" +#include "ConsoleGameMode.h" +#include "..\Common\Tutorial\Tutorial.h" + +ConsoleGameMode::ConsoleGameMode(int iPad, Minecraft *minecraft, ClientConnection *connection) + : TutorialMode(iPad, minecraft, connection) +{ + tutorial = new Tutorial(iPad); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/ConsoleGameMode.h b/Minecraft.Client/Common/ConsoleGameMode.h new file mode 100644 index 00000000..3e486cbf --- /dev/null +++ b/Minecraft.Client/Common/ConsoleGameMode.h @@ -0,0 +1,10 @@ +#pragma once +#include "..\Common\Tutorial\TutorialMode.h" + +class ConsoleGameMode : public TutorialMode +{ +public: + ConsoleGameMode(int iPad, Minecraft *minecraft, ClientConnection *connection); + + virtual bool isImplemented() { return true; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Console_Awards_enum.h b/Minecraft.Client/Common/Console_Awards_enum.h new file mode 100644 index 00000000..9597c717 --- /dev/null +++ b/Minecraft.Client/Common/Console_Awards_enum.h @@ -0,0 +1,72 @@ +#pragma once + +enum eAward +{ + eAward_TakingInventory=0, + eAward_GettingWood, + eAward_Benchmarking, + eAward_TimeToMine, + eAward_HotTopic, + eAward_AquireHardware, + eAward_TimeToFarm, + eAward_BakeBread, + eAward_TheLie, + eAward_GettingAnUpgrade, + eAward_DeliciousFish, + eAward_OnARail, + eAward_TimeToStrike, + eAward_MonsterHunter, + eAward_CowTipper, + eAward_WhenPigsFly, + eAward_LeaderOfThePack, + eAward_MOARTools, + eAward_DispenseWithThis, + eAward_InToTheNether, + + eAward_mine100Blocks, + eAward_kill10Creepers, + eAward_eatPorkChop, + eAward_play100Days, + eAward_arrowKillCreeper, + eAward_socialPost, + +#ifndef _XBOX + // 4J Stu - Does not map to any Xbox achievements + eAward_snipeSkeleton, + eAward_diamonds, + eAward_portal, + eAward_ghast, + eAward_blazeRod, + eAward_potion, + eAward_theEnd, + eAward_winGame, + eAward_enchantments, + eAward_overkill, + eAward_bookcase, +#endif + +#ifdef _EXTENDED_ACHIEVEMENTS + eAward_adventuringTime, + eAward_repopulation, + //eAward_porkChop, + eAward_diamondsToYou, + //eAward_passingTheTime, + //eAward_archer, + eAward_theHaggler, + eAward_potPlanter, + eAward_itsASign, + eAward_ironBelly, + eAward_haveAShearfulDay, + eAward_rainbowCollection, + eAward_stayinFrosty, + eAward_chestfulOfCobblestone, + eAward_renewableEnergy, + eAward_musicToMyEars, + eAward_bodyGuard, + eAward_ironMan, + eAward_zombieDoctor, + eAward_lionTamer, +#endif + + eAward_Max, +}; diff --git a/Minecraft.Client/Common/Console_Debug_enum.h b/Minecraft.Client/Common/Console_Debug_enum.h new file mode 100644 index 00000000..4e6c2b14 --- /dev/null +++ b/Minecraft.Client/Common/Console_Debug_enum.h @@ -0,0 +1,42 @@ +#pragma once + +enum eDebugSetting +{ + eDebugSetting_LoadSavesFromDisk, + eDebugSetting_WriteSavesToDisk, + eDebugSetting_FreezePlayers, //eDebugSetting_InterfaceOff, + eDebugSetting_Safearea, + eDebugSetting_MobsDontAttack, + eDebugSetting_FreezeTime, + eDebugSetting_DisableWeather, + eDebugSetting_CraftAnything, + eDebugSetting_UseDpadForDebug, + eDebugSetting_MobsDontTick, + eDebugSetting_InstantDestroy, + eDebugSetting_ShowUIConsole, + eDebugSetting_DistributableSave, + eDebugSetting_DebugLeaderboards, + eDebugSetting_EnableHeightWaterBiomeOverride, //eDebugSetting_TipsAlwaysOn, + eDebugSetting_SuperflatNether, + //eDebugSetting_LightDarkBackground, + eDebugSetting_RegularLightning, + eDebugSetting_GoToNether, + //eDebugSetting_GoToEnd, + eDebugSetting_GoToOverworld, + eDebugSetting_UnlockAllDLC, // eDebugSetting_ToggleFont, + eDebugSetting_ShowUIMarketingGuide, + eDebugSetting_Max, +}; + +enum eDebugButton +{ + eDebugButton_Theme=0, + eDebugButton_Avatar_Item_1, + eDebugButton_Avatar_Item_2, + eDebugButton_Avatar_Item_3, + eDebugButton_Gamerpic_1, + eDebugButton_Gamerpic_2, + eDebugButton_CheckTips, + eDebugButton_WipeLeaderboards, + eDebugButton_Max, +}; diff --git a/Minecraft.Client/Common/Console_Utils.cpp b/Minecraft.Client/Common/Console_Utils.cpp new file mode 100644 index 00000000..cb0f1b58 --- /dev/null +++ b/Minecraft.Client/Common/Console_Utils.cpp @@ -0,0 +1,40 @@ +#include "stdafx.h" + +//-------------------------------------------------------------------------------------- +// Name: DebugSpewV() +// Desc: Internal helper function +//-------------------------------------------------------------------------------------- +#ifndef _CONTENT_PACKAGE +static VOID DebugSpewV( const CHAR* strFormat, const va_list pArgList ) +{ +#if defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ + assert(0); +#else + CHAR str[2048]; + // Use the secure CRT to avoid buffer overruns. Specify a count of + // _TRUNCATE so that too long strings will be silently truncated + // rather than triggering an error. + _vsnprintf_s( str, _TRUNCATE, strFormat, pArgList ); + OutputDebugStringA( str ); +#endif +} +#endif + +//-------------------------------------------------------------------------------------- +// Name: DebugSpew() +// Desc: Prints formatted debug spew +//-------------------------------------------------------------------------------------- +#ifdef _Printf_format_string_ // VC++ 2008 and later support this annotation +VOID CDECL DebugSpew( _In_z_ _Printf_format_string_ const CHAR* strFormat, ... ) +#else +VOID CDECL DebugPrintf( const CHAR* strFormat, ... ) +#endif +{ +#ifndef _CONTENT_PACKAGE + va_list pArgList; + va_start( pArgList, strFormat ); + DebugSpewV( strFormat, pArgList ); + va_end( pArgList ); +#endif +} + diff --git a/Minecraft.Client/Common/Consoles_App.cpp b/Minecraft.Client/Common/Consoles_App.cpp new file mode 100644 index 00000000..12aecb3d --- /dev/null +++ b/Minecraft.Client/Common/Consoles_App.cpp @@ -0,0 +1,9535 @@ + +#include "stdafx.h" + +#include "..\..\Minecraft.World\Recipy.h" +#include "..\..\Minecraft.Client\Options.h" +#include "..\..\Minecraft.World\AABB.h" +#include "..\..\Minecraft.World\Vec3.h" +#include "..\MinecraftServer.h" +#include "..\MultiPlayerLevel.h" +#include "..\GameRenderer.h" +#include "..\ProgressRenderer.h" +#include "..\..\Minecraft.Client\LevelRenderer.h" +#include "..\..\Minecraft.Client\MobSkinMemTextureProcessor.h" +#include "..\..\Minecraft.Client\Minecraft.h" +#include "..\ClientConnection.h" +#include "..\MultiPlayerLocalPlayer.h" +#include "..\..\Minecraft.Client\LocalPlayer.h" +#include "..\..\Minecraft.World\Player.h" +#include "..\..\Minecraft.World\Inventory.h" +#include "..\..\Minecraft.World\Level.h" +#include "..\..\Minecraft.World\FurnaceTileEntity.h" +#include "..\..\Minecraft.World\Container.h" +#include "..\..\Minecraft.World\DispenserTileEntity.h" +#include "..\..\Minecraft.World\SignTileEntity.h" +#include "..\..\Minecraft.Client\StatsCounter.h" +#include "..\GameMode.h" +#include "..\Xbox\Social\SocialManager.h" +#include "Tutorial\TutorialMode.h" +#if defined _XBOX || defined _WINDOWS64 +#include "..\..\Minecraft.Client\Xbox\XML\ATGXmlParser.h" +#include "..\..\Minecraft.Client\Xbox\XML\xmlFilesCallback.h" +#endif +#include "Minecraft_Macros.h" +#include "..\..\Minecraft.Client\PlayerList.h" +#include "..\..\Minecraft.Client\ServerPlayer.h" +#include "GameRules\ConsoleGameRules.h" +#include "GameRules\ConsoleSchematicFile.h" +#include "..\..\Minecraft.World\InputOutputStream.h" +#include "..\..\Minecraft.World\LevelSettings.h" +#include "..\User.h" +#include "..\..\Minecraft.World\LevelData.h" +#include "..\..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\..\Minecraft.Client\EntityRenderDispatcher.h" +#include "..\..\Minecraft.World\compression.h" +#include "..\TexturePackRepository.h" +#include "..\DLCTexturePack.h" +#include "DLC\DLCPack.h" +#include "..\StringTable.h" +#ifndef _XBOX +#include "..\ArchiveFile.h" +#endif +#include "..\Minecraft.h" +#ifdef _XBOX +#include "..\Xbox\GameConfig\Minecraft.spa.h" +#include "..\Xbox\Network\NetworkPlayerXbox.h" +#include "XUI\XUI_TextEntry.h" +#include "XUI\XUI_XZP_Icons.h" +#include "XUI\XUI_PauseMenu.h" +#else +#include "UI\UI.h" +#include "UI\UIScene_PauseMenu.h" +#endif +#ifdef __PS3__ +#include +#endif +#ifdef __ORBIS__ +#include +#endif + +#include "..\Common\Leaderboards\LeaderboardManager.h" + +//CMinecraftApp app; +unsigned int CMinecraftApp::m_uiLastSignInData = 0; + +const float CMinecraftApp::fSafeZoneX = 64.0f; // 5% of 1280 +const float CMinecraftApp::fSafeZoneY = 36.0f; // 5% of 720 + +int CMinecraftApp::s_iHTMLFontSizesA[eHTMLSize_COUNT] = +{ +#ifdef _XBOX + 14,12,14,24 +#else + //20,15,20,24 + 20,13,20,26 +#endif +}; + + +CMinecraftApp::CMinecraftApp() +{ + if(GAME_SETTINGS_PROFILE_DATA_BYTES != sizeof(GAME_SETTINGS)) + { + // 4J Stu - See comment for GAME_SETTINGS_PROFILE_DATA_BYTES in Xbox_App.h + DebugPrintf("WARNING: The size of the profile GAME_SETTINGS struct has changed, so all stat data is likely incorrect. Is: %d, Should be: %d\n",sizeof(GAME_SETTINGS),GAME_SETTINGS_PROFILE_DATA_BYTES); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + } + + for(int i=0;i; + } + + LocaleAndLanguageInit(); + +#ifdef _XBOX_ONE + m_hasReachedMainMenu = false; +#endif +} + + + +void CMinecraftApp::DebugPrintf(const char *szFormat, ...) +{ + +#ifndef _FINAL_BUILD + char buf[1024]; + va_list ap; + va_start(ap, szFormat); + vsnprintf(buf, sizeof(buf), szFormat, ap); + va_end(ap); + OutputDebugStringA(buf); +#endif + +} + +void CMinecraftApp::DebugPrintf(int user, const char *szFormat, ...) +{ +#ifndef _FINAL_BUILD + if(user == USER_NONE) + return; + char buf[1024]; + va_list ap; + va_start(ap, szFormat); + vsnprintf(buf, sizeof(buf), szFormat, ap); + va_end(ap); +#ifdef __PS3__ + unsigned int writelen; + sys_tty_write(SYS_TTYP_USER1 + ( user - 1 ), buf, strlen(buf), &writelen ); +#elif defined __PSVITA__ + switch(user) + { + case 0: + { + SceUID tty2 = sceIoOpen("tty2:", SCE_O_WRONLY, 0); + if(tty2>=0) + { + std::string string1(buf); + sceIoWrite(tty2, string1.c_str(), string1.length()); + sceIoClose(tty2); + } + } + break; + case 1: + { + SceUID tty3 = sceIoOpen("tty3:", SCE_O_WRONLY, 0); + if(tty3>=0) + { + std::string string1(buf); + sceIoWrite(tty3, string1.c_str(), string1.length()); + sceIoClose(tty3); + } + } + break; + default: + OutputDebugStringA(buf); + break; + } +#else + OutputDebugStringA(buf); +#endif +#ifndef _XBOX + if(user == USER_UI) + { + ui.logDebugString(buf); + } +#endif +#endif +} + +LPCWSTR CMinecraftApp::GetString(int iID) +{ + //return L"DeÄŸiÅŸiklikler ve Yenilikler"; + //return L"ÕÕÕÕÖÖÖÖ"; + return app.m_stringTable->getString(iID); +} + +void CMinecraftApp::SetAction(int iPad, eXuiAction action, LPVOID param) +{ + if(m_eXuiAction[iPad] == eAppAction_ExitWorldCapturedThumbnail && action != eAppAction_Idle) + { + app.DebugPrintf("Invalid change of App action for pad %d from %d to %d, ignoring\n", iPad, m_eXuiAction[iPad], action); + } + else + { + app.DebugPrintf("Changing App action for pad %d from %d to %d\n", iPad, m_eXuiAction[iPad], action); + m_eXuiAction[iPad]=action; + m_eXuiActionParam[iPad] = param; + } +} + +bool CMinecraftApp::IsAppPaused() +{ +#if defined(_XBOX_ONE) || defined(__ORBIS__) + bool paused = m_bIsAppPaused; + EnterCriticalSection(&m_saveNotificationCriticalSection); + if( g_NetworkManager.IsLocalGame() && g_NetworkManager.GetPlayerCount() == 1 ) + { + paused |= m_saveNotificationDepth > 0; + } + LeaveCriticalSection(&m_saveNotificationCriticalSection); + return paused; +#else + return m_bIsAppPaused; +#endif +} + +void CMinecraftApp::SetAppPaused(bool val) +{ + m_bIsAppPaused = val; +} + +void CMinecraftApp::HandleButtonPresses() +{ + for(int i=0;i<4;i++) + { + HandleButtonPresses(i); + } +} + +void CMinecraftApp::HandleButtonPresses(int iPad) +{ + +// // test an update of the profile data +// void *pData=ProfileManager.GetGameDefinedProfileData(iPad); +// +// unsigned char *pchData= (unsigned char *)pData; +// int iCount=0; +// for(int i=0;i player,bool bNavigateBack) +{ + bool success = true; + + InventoryScreenInput* initData = new InventoryScreenInput(); + initData->player = player; + initData->bNavigateBack=bNavigateBack; + initData->iPad = iPad; + + if(app.GetLocalPlayerCount()>1) + { + initData->bSplitscreen=true; + success = ui.NavigateToScene(iPad,eUIScene_InventoryMenu,initData); + } + else + { + initData->bSplitscreen=false; + success = ui.NavigateToScene(iPad,eUIScene_InventoryMenu,initData); + } + + return success; +} + +bool CMinecraftApp::LoadCreativeMenu(int iPad,shared_ptr player,bool bNavigateBack) +{ + bool success = true; + + InventoryScreenInput* initData = new InventoryScreenInput(); + initData->player = player; + initData->bNavigateBack=bNavigateBack; + initData->iPad = iPad; + + if(app.GetLocalPlayerCount()>1) + { + initData->bSplitscreen=true; + success = ui.NavigateToScene(iPad,eUIScene_CreativeMenu,initData); + } + else + { + initData->bSplitscreen=false; + success = ui.NavigateToScene(iPad,eUIScene_CreativeMenu,initData); + } + + return success; +} + +bool CMinecraftApp::LoadCrafting2x2Menu(int iPad,shared_ptr player) +{ + bool success = true; + + CraftingPanelScreenInput* initData = new CraftingPanelScreenInput(); + initData->player = player; + initData->iContainerType=RECIPE_TYPE_2x2; + initData->iPad = iPad; + initData->x = 0; + initData->y = 0; + initData->z = 0; + + if(app.GetLocalPlayerCount()>1) + { + initData->bSplitscreen=true; + success = ui.NavigateToScene(iPad,eUIScene_Crafting2x2Menu, initData); + } + else + { + initData->bSplitscreen=false; + success = ui.NavigateToScene(iPad,eUIScene_Crafting2x2Menu, initData); + } + + return success; +} + +bool CMinecraftApp::LoadCrafting3x3Menu(int iPad,shared_ptr player, int x, int y, int z) +{ + bool success = true; + + CraftingPanelScreenInput* initData = new CraftingPanelScreenInput(); + initData->player = player; + initData->iContainerType=RECIPE_TYPE_3x3; + initData->iPad = iPad; + initData->x = x; + initData->y = y; + initData->z = z; + + if(app.GetLocalPlayerCount()>1) + { + initData->bSplitscreen=true; + success = ui.NavigateToScene(iPad,eUIScene_Crafting3x3Menu, initData); + } + else + { + initData->bSplitscreen=false; + success = ui.NavigateToScene(iPad,eUIScene_Crafting3x3Menu, initData); + } + + return success; +} + +bool CMinecraftApp::LoadEnchantingMenu(int iPad,shared_ptr inventory, int x, int y, int z, Level *level) +{ + bool success = true; + + EnchantingScreenInput* initData = new EnchantingScreenInput(); + initData->inventory = inventory; + initData->level = level; + initData->x = x; + initData->y = y; + initData->z = z; + initData->iPad = iPad; + + if(app.GetLocalPlayerCount()>1) + { + initData->bSplitscreen=true; + success = ui.NavigateToScene(iPad,eUIScene_EnchantingMenu, initData); + } + else + { + initData->bSplitscreen=false; + success = ui.NavigateToScene(iPad,eUIScene_EnchantingMenu, initData); + } + + return success; +} + +bool CMinecraftApp::LoadFurnaceMenu(int iPad,shared_ptr inventory, shared_ptr furnace) +{ + bool success = true; + + FurnaceScreenInput* initData = new FurnaceScreenInput(); + + initData->furnace = furnace; + initData->inventory = inventory; + initData->iPad = iPad; + + // Load the scene. + if(app.GetLocalPlayerCount()>1) + { + initData->bSplitscreen=true; + success = ui.NavigateToScene(iPad,eUIScene_FurnaceMenu, initData); + } + else + { + initData->bSplitscreen=false; + success = ui.NavigateToScene(iPad,eUIScene_FurnaceMenu, initData); + } + + return success; +} + +bool CMinecraftApp::LoadBrewingStandMenu(int iPad,shared_ptr inventory, shared_ptr brewingStand) +{ + bool success = true; + + BrewingScreenInput* initData = new BrewingScreenInput(); + + initData->brewingStand = brewingStand; + initData->inventory = inventory; + initData->iPad = iPad; + + // Load the scene. + if(app.GetLocalPlayerCount()>1) + { + initData->bSplitscreen=true; + success = ui.NavigateToScene(iPad,eUIScene_BrewingStandMenu, initData); + } + else + { + initData->bSplitscreen=false; + success = ui.NavigateToScene(iPad,eUIScene_BrewingStandMenu, initData); + } + + return success; +} + + +bool CMinecraftApp::LoadContainerMenu(int iPad,shared_ptr inventory, shared_ptr container) +{ + bool success = true; + + ContainerScreenInput* initData = new ContainerScreenInput(); + + initData->inventory = inventory; + initData->container = container; + initData->iPad = iPad; + + // Load the scene. + if(app.GetLocalPlayerCount()>1) + { + initData->bSplitscreen=true; + + bool bLargeChest = (initData->container->getContainerSize() > 3*9)?true:false; + if(bLargeChest) + { + success = ui.NavigateToScene(iPad,eUIScene_LargeContainerMenu,initData); + } + else + { + success = ui.NavigateToScene(iPad,eUIScene_ContainerMenu,initData); + } + } + else + { + initData->bSplitscreen=false; + success = ui.NavigateToScene(iPad,eUIScene_ContainerMenu,initData); + } + + return success; +} + +bool CMinecraftApp::LoadTrapMenu(int iPad,shared_ptr inventory, shared_ptr trap) +{ + bool success = true; + + TrapScreenInput* initData = new TrapScreenInput(); + + initData->inventory = inventory; + initData->trap = trap; + initData->iPad = iPad; + + // Load the scene. + if(app.GetLocalPlayerCount()>1) + { + initData->bSplitscreen=true; + success = ui.NavigateToScene(iPad,eUIScene_DispenserMenu, initData); + } + else + { + initData->bSplitscreen=false; + success = ui.NavigateToScene(iPad,eUIScene_DispenserMenu, initData); + } + + return success; +} + +bool CMinecraftApp::LoadSignEntryMenu(int iPad,shared_ptr sign) +{ + bool success = true; + + SignEntryScreenInput* initData = new SignEntryScreenInput(); + + initData->sign = sign; + initData->iPad = iPad; + + success = ui.NavigateToScene(iPad,eUIScene_SignEntryMenu, initData); + + delete initData; + + return success; +} + +bool CMinecraftApp::LoadRepairingMenu(int iPad,shared_ptr inventory, Level *level, int x, int y, int z) +{ + bool success = true; + + AnvilScreenInput *initData = new AnvilScreenInput(); + initData->inventory = inventory; + initData->level = level; + initData->x = x; + initData->y = y; + initData->z = z; + initData->iPad = iPad; + if(app.GetLocalPlayerCount()>1) initData->bSplitscreen=true; + else initData->bSplitscreen=false; + + success = ui.NavigateToScene(iPad,eUIScene_AnvilMenu, initData); + + return success; +} + +bool CMinecraftApp::LoadTradingMenu(int iPad, shared_ptr inventory, shared_ptr trader, Level *level) +{ + bool success = true; + + TradingScreenInput *initData = new TradingScreenInput(); + initData->inventory = inventory; + initData->trader = trader; + initData->level = level; + initData->iPad = iPad; + if(app.GetLocalPlayerCount()>1) initData->bSplitscreen=true; + else initData->bSplitscreen=false; + + success = ui.NavigateToScene(iPad,eUIScene_TradingMenu, initData); + + return success; +} + + +////////////////////////////////////////////// +// GAME SETTINGS +////////////////////////////////////////////// +void CMinecraftApp::InitGameSettings() +{ + for(int i=0;ibSettingsChanged=false; + + //SetDefaultGameSettings(i); - done on a callback from the profile manager + + // 4J-PB - adding in for Windows & PS3 to set the defaults for the joypad +#if defined _WINDOWS64// || defined __PSVITA__ + C_4JProfile::PROFILESETTINGS *pProfileSettings=ProfileManager.GetDashboardProfileSettings(i); + // clear this for now - it will come from reading the system values + memset(pProfileSettings,0,sizeof(C_4JProfile::PROFILESETTINGS)); + SetDefaultOptions(pProfileSettings,i); +#elif defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__ + C4JStorage::PROFILESETTINGS *pProfileSettings=StorageManager.GetDashboardProfileSettings(i); + // 4J-PB - don't cause an options write to happen here + SetDefaultOptions(pProfileSettings,i,false); + +#endif + } +} + +#if (defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) +int CMinecraftApp::SetDefaultOptions(C4JStorage::PROFILESETTINGS *pSettings,const int iPad,bool bWriteProfile) +#else +int CMinecraftApp::SetDefaultOptions(C_4JProfile::PROFILESETTINGS *pSettings,const int iPad) +#endif +{ + SetGameSettings(iPad,eGameSetting_MusicVolume,DEFAULT_VOLUME_LEVEL); + SetGameSettings(iPad,eGameSetting_SoundFXVolume,DEFAULT_VOLUME_LEVEL); + SetGameSettings(iPad,eGameSetting_Gamma,50); + + // 4J-PB - Don't reset the difficult level if we're in-game + if(Minecraft::GetInstance()->level==NULL) + { + app.DebugPrintf("SetDefaultOptions - Difficulty = 1\n"); + SetGameSettings(iPad,eGameSetting_Difficulty,1); + } + SetGameSettings(iPad,eGameSetting_Sensitivity_InGame,100); + SetGameSettings(iPad,eGameSetting_ViewBob,1); + SetGameSettings(iPad,eGameSetting_ControlScheme,0); + SetGameSettings(iPad,eGameSetting_ControlInvertLook,(pSettings->iYAxisInversion!=0)?1:0); + SetGameSettings(iPad,eGameSetting_ControlSouthPaw,pSettings->bSwapSticks?1:0); + SetGameSettings(iPad,eGameSetting_SplitScreenVertical,0); + SetGameSettings(iPad,eGameSetting_GamertagsVisible,1); + + // Interim TU 1.6.6 + SetGameSettings(iPad,eGameSetting_Sensitivity_InMenu,100); + SetGameSettings(iPad,eGameSetting_DisplaySplitscreenGamertags,1); + SetGameSettings(iPad,eGameSetting_Hints,1); + SetGameSettings(iPad,eGameSetting_Autosave,2); + SetGameSettings(iPad,eGameSetting_Tooltips,1); + SetGameSettings(iPad,eGameSetting_InterfaceOpacity,80); + + // TU 5 + SetGameSettings(iPad,eGameSetting_Clouds,1); + SetGameSettings(iPad,eGameSetting_Online,1); + SetGameSettings(iPad,eGameSetting_InviteOnly,0); + SetGameSettings(iPad,eGameSetting_FriendsOfFriends,1); + + // default the update changes message to zero + // 4J-PB - We'll only display the message if the profile is pre-TU5 + //SetGameSettings(iPad,eGameSetting_DisplayUpdateMessage,0); + + // TU 6 + SetGameSettings(iPad,eGameSetting_BedrockFog,0); + SetGameSettings(iPad,eGameSetting_DisplayHUD,1); + SetGameSettings(iPad,eGameSetting_DisplayHand,1); + + // TU 7 + SetGameSettings(iPad,eGameSetting_CustomSkinAnim,1); + + // TU 9 + SetGameSettings(iPad,eGameSetting_DeathMessages,1); + SetGameSettings(iPad,eGameSetting_UISize,1); + SetGameSettings(iPad,eGameSetting_UISizeSplitscreen,2); + SetGameSettings(iPad,eGameSetting_AnimatedCharacter,1); + + // TU 12 + GameSettingsA[iPad]->ucCurrentFavoriteSkinPos=0; + for(int i=0;iuiFavoriteSkinA[i]=0xFFFFFFFF; + } + + // TU 13 + GameSettingsA[iPad]->uiMashUpPackWorldsDisplay=0xFFFFFFFF; + + // 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 +//#ifdef __PS3__ + // PS3DEC13 + SetGameSettings(iPad,eGameSetting_PS3_EULA_Read,0); // EULA not read + + // PS3 1.05 - added Greek + GameSettingsA[iPad]->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language +//#endif + +#if (defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) + GameSettingsA[iPad]->bSettingsChanged=bWriteProfile; +#endif + + return 0; +} + +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) +int CMinecraftApp::DefaultOptionsCallback(LPVOID pParam,C4JStorage::PROFILESETTINGS *pSettings, const int iPad) +#else +int CMinecraftApp::DefaultOptionsCallback(LPVOID pParam,C_4JProfile::PROFILESETTINGS *pSettings, const int iPad) +#endif +{ + CMinecraftApp *pApp=(CMinecraftApp *)pParam; + + // flag the default options to be set + + pApp->DebugPrintf("Setting default options for player %d", iPad); + pApp->SetAction(iPad,eAppAction_SetDefaultOptions, (LPVOID)pSettings); + //pApp->SetDefaultOptions(pSettings,iPad); + + // if the profile data has been changed, then force a profile write + // It seems we're allowed to break the 5 minute rule if it's the result of a user action + //pApp->CheckGameSettingsChanged(); + + return 0; +} + +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) + +#ifdef __ORBIS__ +int CMinecraftApp::OptionsDataCallback(LPVOID pParam,int iPad,unsigned short usVersion,C4JStorage::eOptionsCallback eStatus,int iBlocksRequired) +{ + CMinecraftApp *pApp=(CMinecraftApp *)pParam; + pApp->m_eOptionsStatusA[iPad]=eStatus; + pApp->m_eOptionsBlocksRequiredA[iPad]=iBlocksRequired; + return 0; +} + +int CMinecraftApp::GetOptionsBlocksRequired(int iPad) +{ + return m_eOptionsBlocksRequiredA[iPad]; +} + +#else +int CMinecraftApp::OptionsDataCallback(LPVOID pParam,int iPad,unsigned short usVersion,C4JStorage::eOptionsCallback eStatus) +{ + CMinecraftApp *pApp=(CMinecraftApp *)pParam; + pApp->m_eOptionsStatusA[iPad]=eStatus; + return 0; +} +#endif + +C4JStorage::eOptionsCallback CMinecraftApp::GetOptionsCallbackStatus(int iPad) +{ + return m_eOptionsStatusA[iPad]; +} + +void CMinecraftApp::SetOptionsCallbackStatus(int iPad, C4JStorage::eOptionsCallback eStatus) +{ + m_eOptionsStatusA[iPad]=eStatus; +} +#endif + +int CMinecraftApp::OldProfileVersionCallback(LPVOID pParam,unsigned char *pucData, const unsigned short usVersion, const int iPad) +{ + // check what needs to be done with this version to update to the current one + + switch(usVersion) + { +#ifdef _XBOX + case PROFILE_VERSION_1: + case PROFILE_VERSION_2: + // need to fill in values for the new profile data. No need to save the profile - that'll happen if they get changed, or if the auto save for the profile kicks in + { + GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; + pGameSettings->ucMenuSensitivity=100; //eGameSetting_Sensitivity_InMenu + pGameSettings->ucInterfaceOpacity=80; //eGameSetting_Sensitivity_InMenu + pGameSettings->usBitmaskValues|=0x0200; //eGameSetting_DisplaySplitscreenGamertags - on + pGameSettings->usBitmaskValues|=0x0400; //eGameSetting_Hints - on + pGameSettings->usBitmaskValues|=0x1000; //eGameSetting_Autosave - 2 + pGameSettings->usBitmaskValues|=0x8000; //eGameSetting_Tooltips - on + + // 4J-PB - Let's also award all the achievements they have again because of the profile bug that seemed to stop the awards of some + // Changing this to check the system achievements at sign-in and award any that the game says we have and the system says we haven't + //ProfileManager.ReAwardAchievements(iPad); + + pGameSettings->uiBitmaskValues=0L; // reset + pGameSettings->uiBitmaskValues|=GAMESETTING_CLOUDS; //eGameSetting_Clouds - on + pGameSettings->uiBitmaskValues|=GAMESETTING_ONLINE; //eGameSetting_GameSetting_Online - on + //eGameSetting_GameSetting_Invite - off + pGameSettings->uiBitmaskValues|=GAMESETTING_FRIENDSOFFRIENDS; //eGameSetting_GameSetting_FriendsOfFriends - on + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) + // TU6 + pGameSettings->uiBitmaskValues&=~GAMESETTING_BEDROCKFOG; //eGameSetting_BedrockFog - off + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYHUD; //eGameSetting_DisplayHUD - on + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYHAND; //eGameSetting_DisplayHand - on + // TU7 + pGameSettings->uiBitmaskValues|=GAMESETTING_CUSTOMSKINANIM; //eGameSetting_CustomSkinAnim - on + // TU9 + pGameSettings->uiBitmaskValues|=GAMESETTING_DEATHMESSAGES; //eGameSetting_DeathMessages - on + pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE&0x00000800); // uisize 2 + pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE_SPLITSCREEN&0x00004000); // splitscreen ui size 3 + pGameSettings->uiBitmaskValues|=GAMESETTING_ANIMATEDCHARACTER; //eGameSetting_AnimatedCharacter - on + // TU12 + // favorite skins added, but only set in TU12 - set to FFs + for(int i=0;iuiFavoriteSkinA[i]=0xFFFFFFFF; + } + pGameSettings->ucCurrentFavoriteSkinPos=0; + // Added a bitmask in TU13 to enable/disable display of the Mash-up pack worlds in the saves list + pGameSettings->uiMashUpPackWorldsDisplay = 0xFFFFFFFF; + + // PS3 1.05 - added Greek + pGameSettings->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language + } + break; + case PROFILE_VERSION_3: + + { + GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; + pGameSettings->uiBitmaskValues=0L; // reset + pGameSettings->uiBitmaskValues|=GAMESETTING_CLOUDS; //eGameSetting_Clouds - on + pGameSettings->uiBitmaskValues|=GAMESETTING_ONLINE; //eGameSetting_GameSetting_Online - on + //eGameSetting_GameSetting_Invite - off + pGameSettings->uiBitmaskValues|=GAMESETTING_FRIENDSOFFRIENDS; //eGameSetting_GameSetting_FriendsOfFriends - on + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) + // TU6 + pGameSettings->uiBitmaskValues&=~GAMESETTING_BEDROCKFOG; //eGameSetting_BedrockFog - off + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYHUD; //eGameSetting_DisplayHUD - on + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYHAND; //eGameSetting_DisplayHand - on + // TU7 + pGameSettings->uiBitmaskValues|=GAMESETTING_CUSTOMSKINANIM; //eGameSetting_CustomSkinAnim - on + // TU9 + pGameSettings->uiBitmaskValues|=GAMESETTING_DEATHMESSAGES; //eGameSetting_DeathMessages - on + pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE&0x00000800); // uisize 2 + pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE_SPLITSCREEN&0x00004000); // splitscreen ui size 3 + pGameSettings->uiBitmaskValues|=GAMESETTING_ANIMATEDCHARACTER; //eGameSetting_AnimatedCharacter - on + // TU12 + // favorite skins added, but only set in TU12 - set to FFs + for(int i=0;iuiFavoriteSkinA[i]=0xFFFFFFFF; + } + pGameSettings->ucCurrentFavoriteSkinPos=0; + // Added a bitmask in TU13 to enable/disable display of the Mash-up pack worlds in the saves list + pGameSettings->uiMashUpPackWorldsDisplay = 0xFFFFFFFF; + + // PS3 1.05 - added Greek + pGameSettings->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language + + } + break; + case PROFILE_VERSION_4: + { + GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; + + pGameSettings->uiBitmaskValues&=~GAMESETTING_BEDROCKFOG; //eGameSetting_BedrockFog - off + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYHUD; //eGameSetting_DisplayHUD - on + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYHAND; //eGameSetting_DisplayHand - on + // TU7 + pGameSettings->uiBitmaskValues|=GAMESETTING_CUSTOMSKINANIM; //eGameSetting_CustomSkinAnim - on + // TU9 + pGameSettings->uiBitmaskValues|=GAMESETTING_DEATHMESSAGES; //eGameSetting_DeathMessages - on + pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE&0x00000800); // uisize 2 + pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE_SPLITSCREEN&0x00004000); // splitscreen ui size 3 + pGameSettings->uiBitmaskValues|=GAMESETTING_ANIMATEDCHARACTER; //eGameSetting_AnimatedCharacter - on + + // Set the online flag to on, so it's not saved if a game starts offline when the user didn't change it to be offline (xbox disconnected from LIVE) + pGameSettings->uiBitmaskValues|=GAMESETTING_ONLINE; //eGameSetting_GameSetting_Online - on + // TU12 + // favorite skins added, but only set in TU12 - set to FFs + for(int i=0;iuiFavoriteSkinA[i]=0xFFFFFFFF; + } + pGameSettings->ucCurrentFavoriteSkinPos=0; + // Added a bitmask in TU13 to enable/disable display of the Mash-up pack worlds in the saves list + pGameSettings->uiMashUpPackWorldsDisplay = 0xFFFFFFFF; + + // PS3 1.05 - added Greek + pGameSettings->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language + + } + + break; + case PROFILE_VERSION_5: + { + GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; + + // reset the display new message counter + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) + // TU7 + pGameSettings->uiBitmaskValues|=GAMESETTING_CUSTOMSKINANIM; //eGameSetting_CustomSkinAnim - on + // TU9 + pGameSettings->uiBitmaskValues|=GAMESETTING_DEATHMESSAGES; //eGameSetting_DeathMessages - on + pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE&0x00000800); // uisize 2 + pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE_SPLITSCREEN&0x00004000); // splitscreen ui size 3 + pGameSettings->uiBitmaskValues|=GAMESETTING_ANIMATEDCHARACTER; //eGameSetting_AnimatedCharacter - on + // Set the online flag to on, so it's not saved if a game starts offline when the user didn't change it to be offline (xbox disconnected from LIVE) + pGameSettings->uiBitmaskValues|=GAMESETTING_ONLINE; //eGameSetting_GameSetting_Online - on + // TU12 + // favorite skins added, but only set in TU12 - set to FFs + for(int i=0;iuiFavoriteSkinA[i]=0xFFFFFFFF; + } + pGameSettings->ucCurrentFavoriteSkinPos=0; + // Added a bitmask in TU13 to enable/disable display of the Mash-up pack worlds in the saves list + pGameSettings->uiMashUpPackWorldsDisplay = 0xFFFFFFFF; + + // PS3 1.05 - added Greek + pGameSettings->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language + + + } + + break; + case PROFILE_VERSION_6: + { + GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; + + // Added gui size for splitscreen and fullscreen + // Added death messages toggle + + // reset the display new message counter + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) + // TU9 + pGameSettings->uiBitmaskValues|=GAMESETTING_DEATHMESSAGES; //eGameSetting_DeathMessages - on + pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE&0x00000800); // uisize 2 + pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE_SPLITSCREEN&0x00004000); // splitscreen ui size 3 + pGameSettings->uiBitmaskValues|=GAMESETTING_ANIMATEDCHARACTER; //eGameSetting_AnimatedCharacter - on + // Set the online flag to on, so it's not saved if a game starts offline when the user didn't change it to be offline (xbox disconnected from LIVE) + pGameSettings->uiBitmaskValues|=GAMESETTING_ONLINE; //eGameSetting_GameSetting_Online - on + // TU12 + // favorite skins added, but only set in TU12 - set to FFs + for(int i=0;iuiFavoriteSkinA[i]=0xFFFFFFFF; + } + pGameSettings->ucCurrentFavoriteSkinPos=0; + // Added a bitmask in TU13 to enable/disable display of the Mash-up pack worlds in the saves list + pGameSettings->uiMashUpPackWorldsDisplay = 0xFFFFFFFF; + + // PS3 1.05 - added Greek + pGameSettings->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language + + + } + + break; + + case PROFILE_VERSION_7: + { + GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; + // reset the display new message counter + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) + + // TU12 + // favorite skins added, but only set in TU12 - set to FFs + for(int i=0;iuiFavoriteSkinA[i]=0xFFFFFFFF; + } + pGameSettings->ucCurrentFavoriteSkinPos=0; + // Added a bitmask in TU13 to enable/disable display of the Mash-up pack worlds in the saves list + pGameSettings->uiMashUpPackWorldsDisplay = 0xFFFFFFFF; + + // PS3 1.05 - added Greek + pGameSettings->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language + + + } + break; +#endif + case PROFILE_VERSION_8: + { + GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; + // reset the display new message counter + //pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) + + // Added a bitmask in TU13 to enable/disable display of the Mash-up pack worlds in the saves list + pGameSettings->uiMashUpPackWorldsDisplay = 0xFFFFFFFF; + + // PS3DEC13 + pGameSettings->uiBitmaskValues&=~GAMESETTING_PS3EULAREAD; //eGameSetting_PS3_EULA_Read - off + + // PS3 1.05 - added Greek + pGameSettings->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language + + } + break; + case PROFILE_VERSION_9: + // PS3DEC13 + { + GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; + pGameSettings->uiBitmaskValues&=~GAMESETTING_PS3EULAREAD; //eGameSetting_PS3_EULA_Read - off + + // PS3 1.05 - added Greek + pGameSettings->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language + + } + break; + case PROFILE_VERSION_10: + { + GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; + + pGameSettings->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language + } + break; + + default: + { + // This might be from a version during testing of new profile updates + app.DebugPrintf("Don't know what to do with this profile version!\n"); + #ifndef _CONTENT_PACKAGE + // __debugbreak(); + #endif + + GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; + pGameSettings->ucMenuSensitivity=100; //eGameSetting_Sensitivity_InMenu + pGameSettings->ucInterfaceOpacity=80; //eGameSetting_Sensitivity_InMenu + pGameSettings->usBitmaskValues|=0x0200; //eGameSetting_DisplaySplitscreenGamertags - on + pGameSettings->usBitmaskValues|=0x0400; //eGameSetting_Hints - on + pGameSettings->usBitmaskValues|=0x1000; //eGameSetting_Autosave - 2 + pGameSettings->usBitmaskValues|=0x8000; //eGameSetting_Tooltips - on + + pGameSettings->uiBitmaskValues=0L; // reset + pGameSettings->uiBitmaskValues|=GAMESETTING_CLOUDS; //eGameSetting_Clouds - on + pGameSettings->uiBitmaskValues|=GAMESETTING_ONLINE; //eGameSetting_GameSetting_Online - on + //eGameSetting_GameSetting_Invite - off + pGameSettings->uiBitmaskValues|=GAMESETTING_FRIENDSOFFRIENDS; //eGameSetting_GameSetting_FriendsOfFriends - on + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) + pGameSettings->uiBitmaskValues&=~GAMESETTING_BEDROCKFOG; //eGameSetting_BedrockFog - off + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYHUD; //eGameSetting_DisplayHUD - on + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYHAND; //eGameSetting_DisplayHand - on + pGameSettings->uiBitmaskValues|=GAMESETTING_CUSTOMSKINANIM; //eGameSetting_CustomSkinAnim - on + pGameSettings->uiBitmaskValues|=GAMESETTING_DEATHMESSAGES; //eGameSetting_DeathMessages - on + pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE&0x00000800); // uisize 2 + pGameSettings->uiBitmaskValues|=(GAMESETTING_UISIZE_SPLITSCREEN&0x00004000); // splitscreen ui size 3 + pGameSettings->uiBitmaskValues|=GAMESETTING_ANIMATEDCHARACTER; //eGameSetting_AnimatedCharacter - on + // TU12 + // favorite skins added, but only set in TU12 - set to FFs + for(int i=0;iuiFavoriteSkinA[i]=0xFFFFFFFF; + } + pGameSettings->ucCurrentFavoriteSkinPos=0; + // Added a bitmask in TU13 to enable/disable display of the Mash-up pack worlds in the saves list + pGameSettings->uiMashUpPackWorldsDisplay = 0xFFFFFFFF; + + // PS3DEC13 + pGameSettings->uiBitmaskValues&=~GAMESETTING_PS3EULAREAD; //eGameSetting_PS3_EULA_Read - off + + // PS3 1.05 - added Greek + pGameSettings->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language + + } + break; + } + + return 0; +} + +void CMinecraftApp::ApplyGameSettingsChanged(int iPad) +{ + ActionGameSettings(iPad,eGameSetting_MusicVolume ); + ActionGameSettings(iPad,eGameSetting_SoundFXVolume ); + ActionGameSettings(iPad,eGameSetting_Gamma ); + ActionGameSettings(iPad,eGameSetting_Difficulty ); + ActionGameSettings(iPad,eGameSetting_Sensitivity_InGame ); + ActionGameSettings(iPad,eGameSetting_ViewBob ); + ActionGameSettings(iPad,eGameSetting_ControlScheme ); + ActionGameSettings(iPad,eGameSetting_ControlInvertLook); + ActionGameSettings(iPad,eGameSetting_ControlSouthPaw); + ActionGameSettings(iPad,eGameSetting_SplitScreenVertical); + ActionGameSettings(iPad,eGameSetting_GamertagsVisible); + + // Interim TU 1.6.6 + ActionGameSettings(iPad,eGameSetting_Sensitivity_InMenu ); + ActionGameSettings(iPad,eGameSetting_DisplaySplitscreenGamertags); + ActionGameSettings(iPad,eGameSetting_Hints); + ActionGameSettings(iPad,eGameSetting_InterfaceOpacity); + ActionGameSettings(iPad,eGameSetting_Tooltips); + + ActionGameSettings(iPad,eGameSetting_Clouds); + ActionGameSettings(iPad,eGameSetting_BedrockFog); + ActionGameSettings(iPad,eGameSetting_DisplayHUD); + ActionGameSettings(iPad,eGameSetting_DisplayHand); + ActionGameSettings(iPad,eGameSetting_CustomSkinAnim); + ActionGameSettings(iPad,eGameSetting_DeathMessages); + ActionGameSettings(iPad,eGameSetting_UISize); + ActionGameSettings(iPad,eGameSetting_UISizeSplitscreen); + ActionGameSettings(iPad,eGameSetting_AnimatedCharacter); + + ActionGameSettings(iPad,eGameSetting_PS3_EULA_Read); + +} + +void CMinecraftApp::ActionGameSettings(int iPad,eGameSetting eVal) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + switch(eVal) + { + case eGameSetting_MusicVolume: + if(iPad==ProfileManager.GetPrimaryPad()) + { + pMinecraft->options->set(Options::Option::MUSIC,((float)GameSettingsA[iPad]->ucMusicVolume)/100.0f); + } + break; + case eGameSetting_SoundFXVolume: + if(iPad==ProfileManager.GetPrimaryPad()) + { + pMinecraft->options->set(Options::Option::SOUND,((float)GameSettingsA[iPad]->ucSoundFXVolume)/100.0f); + } + break; + case eGameSetting_Gamma: + if(iPad==ProfileManager.GetPrimaryPad()) + { + // ucGamma range is 0-100, UpdateGamma is 0 - 32768 + float fVal=((float)GameSettingsA[iPad]->ucGamma)*327.68f; + RenderManager.UpdateGamma((unsigned short)fVal); + } + + break; + case eGameSetting_Difficulty: + if(iPad==ProfileManager.GetPrimaryPad()) + { + pMinecraft->options->toggle(Options::Option::DIFFICULTY,GameSettingsA[iPad]->usBitmaskValues&0x03); + app.DebugPrintf("Difficulty toggle to %d\n",GameSettingsA[iPad]->usBitmaskValues&0x03); + + // Update the Game Host setting + app.SetGameHostOption(eGameHostOption_Difficulty,pMinecraft->options->difficulty); + + // send this to the other players if we are in-game + bool bInGame=pMinecraft->level!=NULL; + + // Game Host only (and for now we can't change the diff while in game, so this shouldn't happen) + if(bInGame && g_NetworkManager.IsHost() && (iPad==ProfileManager.GetPrimaryPad())) + { + app.SetXuiServerAction(iPad,eXuiServerAction_ServerSettingChanged_Difficulty); + } + } + else + { + app.DebugPrintf("NOT ACTIONING DIFFICULTY - Primary pad is %d, This pad is %d\n",ProfileManager.GetPrimaryPad(),iPad); + } + + break; + case eGameSetting_Sensitivity_InGame: + // 4J-PB - we don't use the options value + // tell the input that we've changed the sensitivity - range of the slider is 0 to 200, default is 100 + pMinecraft->options->set(Options::Option::SENSITIVITY,((float)GameSettingsA[iPad]->ucSensitivity)/100.0f); + //InputManager.SetJoypadSensitivity(iPad,((float)GameSettingsA[iPad]->ucSensitivity)/100.0f); + + break; + case eGameSetting_ViewBob: + // 4J-PB - not handled here any more - it's read from the gamesettings per player + //pMinecraft->options->toggle(Options::Option::VIEW_BOBBING,GameSettingsA[iPad]->usBitmaskValues&0x04); + break; + case eGameSetting_ControlScheme: + InputManager.SetJoypadMapVal(iPad,(GameSettingsA[iPad]->usBitmaskValues&0x30)>>4); + break; + + case eGameSetting_ControlInvertLook: + // Nothing specific to do for this setting. + break; + + case eGameSetting_ControlSouthPaw: + // What is the setting? + if ( GameSettingsA[iPad]->usBitmaskValues & 0x80 ) + { + // Southpaw. + InputManager.SetJoypadStickAxisMap( iPad, AXIS_MAP_LX, AXIS_MAP_RX ); + InputManager.SetJoypadStickAxisMap( iPad, AXIS_MAP_LY, AXIS_MAP_RY ); + InputManager.SetJoypadStickAxisMap( iPad, AXIS_MAP_RX, AXIS_MAP_LX ); + InputManager.SetJoypadStickAxisMap( iPad, AXIS_MAP_RY, AXIS_MAP_LY ); + InputManager.SetJoypadStickTriggerMap( iPad, TRIGGER_MAP_0, TRIGGER_MAP_1 ); + InputManager.SetJoypadStickTriggerMap( iPad, TRIGGER_MAP_1, TRIGGER_MAP_0 ); + } + else + { + // Right handed. + InputManager.SetJoypadStickAxisMap( iPad, AXIS_MAP_LX, AXIS_MAP_LX ); + InputManager.SetJoypadStickAxisMap( iPad, AXIS_MAP_LY, AXIS_MAP_LY ); + InputManager.SetJoypadStickAxisMap( iPad, AXIS_MAP_RX, AXIS_MAP_RX ); + InputManager.SetJoypadStickAxisMap( iPad, AXIS_MAP_RY, AXIS_MAP_RY ); + InputManager.SetJoypadStickTriggerMap( iPad, TRIGGER_MAP_0, TRIGGER_MAP_0 ); + InputManager.SetJoypadStickTriggerMap( iPad, TRIGGER_MAP_1, TRIGGER_MAP_1 ); + } + break; + case eGameSetting_SplitScreenVertical: + if(iPad==ProfileManager.GetPrimaryPad()) + { + pMinecraft->updatePlayerViewportAssignments(); + } + break; + case eGameSetting_GamertagsVisible: + { + bool bInGame=pMinecraft->level!=NULL; + + // Game Host only + if(bInGame && g_NetworkManager.IsHost() && (iPad==ProfileManager.GetPrimaryPad())) + { + // Update the Game Host setting if you are the host and you are in-game + app.SetGameHostOption(eGameHostOption_Gamertags,((GameSettingsA[iPad]->usBitmaskValues&0x0008)!=0)?1:0); + app.SetXuiServerAction(iPad,eXuiServerAction_ServerSettingChanged_Gamertags); + + PlayerList *players = MinecraftServer::getInstance()->getPlayerList(); + for(AUTO_VAR(it3, players->players.begin()); it3 != players->players.end(); ++it3) + { + shared_ptr decorationPlayer = *it3; + decorationPlayer->setShowOnMaps((app.GetGameHostOption(eGameHostOption_Gamertags)!=0)?true:false); + } + } + } + break; +// Interim TU 1.6.6 + case eGameSetting_Sensitivity_InMenu: + // 4J-PB - we don't use the options value + // tell the input that we've changed the sensitivity - range of the slider is 0 to 200, default is 100 + //pMinecraft->options->set(Options::Option::SENSITIVITY,((float)GameSettingsA[iPad]->ucSensitivity)/100.0f); + //InputManager.SetJoypadSensitivity(iPad,((float)GameSettingsA[iPad]->ucSensitivity)/100.0f); + + break; + + case eGameSetting_DisplaySplitscreenGamertags: + for( BYTE idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if(pMinecraft->localplayers[idx] != NULL) + { + if(pMinecraft->localplayers[idx]->m_iScreenSection==C4JRender::VIEWPORT_TYPE_FULLSCREEN) + { + ui.DisplayGamertag(idx,false); + } + else + { + ui.DisplayGamertag(idx,true); + } + } + } + + break; + case eGameSetting_InterfaceOpacity: + // update the tooltips display + ui.RefreshTooltips( iPad); + + break; + case eGameSetting_Hints: + //nothing to do here + break; + case eGameSetting_Tooltips: + if((GameSettingsA[iPad]->usBitmaskValues&0x8000)!=0) + { + ui.SetEnableTooltips(iPad,TRUE); + } + else + { + ui.SetEnableTooltips(iPad,FALSE); + } + break; + case eGameSetting_Clouds: + //nothing to do here + break; + case eGameSetting_Online: + //nothing to do here + break; + case eGameSetting_InviteOnly: + //nothing to do here + break; + case eGameSetting_FriendsOfFriends: + //nothing to do here + break; + case eGameSetting_BedrockFog: + { + bool bInGame=pMinecraft->level!=NULL; + + // Game Host only + if(bInGame && g_NetworkManager.IsHost() && (iPad==ProfileManager.GetPrimaryPad())) + { + // Update the Game Host setting if you are the host and you are in-game + app.SetGameHostOption(eGameHostOption_BedrockFog,GetGameSettings(iPad,eGameSetting_BedrockFog)?1:0); + app.SetXuiServerAction(iPad,eXuiServerAction_ServerSettingChanged_BedrockFog); + } + } + break; + case eGameSetting_DisplayHUD: + //nothing to do here + break; + case eGameSetting_DisplayHand: + //nothing to do here + break; + case eGameSetting_CustomSkinAnim: + //nothing to do here + break; + case eGameSetting_DeathMessages: + //nothing to do here + break; + case eGameSetting_UISize: + //nothing to do here + break; + case eGameSetting_UISizeSplitscreen: + //nothing to do here + break; + case eGameSetting_AnimatedCharacter: + //nothing to do here + break; + case eGameSetting_PS3_EULA_Read: + //nothing to do here + break; + case eGameSetting_PSVita_NetworkModeAdhoc: + //nothing to do here + break; + } +} + +void CMinecraftApp::SetPlayerSkin(int iPad,const wstring &name) +{ + DWORD skinId = app.getSkinIdFromPath(name); + + SetPlayerSkin(iPad,skinId); +} + +void CMinecraftApp::SetPlayerSkin(int iPad,DWORD dwSkinId) +{ + DebugPrintf("Setting skin for %d to %08X\n", iPad, dwSkinId); + + GameSettingsA[iPad]->dwSelectedSkin = dwSkinId; + GameSettingsA[iPad]->bSettingsChanged = true; + + TelemetryManager->RecordSkinChanged(iPad, GameSettingsA[iPad]->dwSelectedSkin); + + if(Minecraft::GetInstance()->localplayers[iPad]!=NULL) Minecraft::GetInstance()->localplayers[iPad]->setAndBroadcastCustomSkin(dwSkinId); +} + + +wstring CMinecraftApp::GetPlayerSkinName(int iPad) +{ + return app.getSkinPathFromId(GameSettingsA[iPad]->dwSelectedSkin); +} + +DWORD CMinecraftApp::GetPlayerSkinId(int iPad) +{ + // 4J-PB -check the user has rights to use this skin - they may have had at some point but the entitlement has been removed. + DLCPack *Pack=NULL; + DLCSkinFile *skinFile=NULL; + DWORD dwSkin=GameSettingsA[iPad]->dwSelectedSkin; + wchar_t chars[256]; + + if( GET_IS_DLC_SKIN_FROM_BITMASK(dwSkin) ) + { + // 4J Stu - DLC skins are numbered using decimal rather than hex to make it easier to number manually + swprintf(chars, 256, L"dlcskin%08d.png", GET_DLC_SKIN_ID_FROM_BITMASK(dwSkin)); + + Pack=app.m_dlcManager.getPackContainingSkin(chars); + + if(Pack) + { + skinFile = Pack->getSkinFile(chars); + + bool bSkinIsFree = skinFile->getParameterAsBool( DLCManager::e_DLCParamType_Free ); + bool bLicensed = Pack->hasPurchasedFile( DLCManager::e_DLCType_Skin, skinFile->getPath() ); + + if(bSkinIsFree || bLicensed) + { + return dwSkin; + } + else + { + return 0; + } + } + } + + + return dwSkin; +} + + DWORD CMinecraftApp::GetAdditionalModelParts(int iPad) + { + return m_dwAdditionalModelParts[iPad]; + } + + +void CMinecraftApp::SetPlayerCape(int iPad,const wstring &name) +{ + DWORD capeId = Player::getCapeIdFromPath(name); + + SetPlayerCape(iPad,capeId); +} + +void CMinecraftApp::SetPlayerCape(int iPad,DWORD dwCapeId) +{ + DebugPrintf("Setting cape for %d to %08X\n", iPad, dwCapeId); + + GameSettingsA[iPad]->dwSelectedCape = dwCapeId; + GameSettingsA[iPad]->bSettingsChanged = true; + + //SentientManager.RecordSkinChanged(iPad, GameSettingsA[iPad]->dwSelectedSkin); + + if(Minecraft::GetInstance()->localplayers[iPad]!=NULL) Minecraft::GetInstance()->localplayers[iPad]->setAndBroadcastCustomCape(dwCapeId); +} + +wstring CMinecraftApp::GetPlayerCapeName(int iPad) +{ + return Player::getCapePathFromId(GameSettingsA[iPad]->dwSelectedCape); +} + +DWORD CMinecraftApp::GetPlayerCapeId(int iPad) +{ + return GameSettingsA[iPad]->dwSelectedCape; +} + +void CMinecraftApp::SetPlayerFavoriteSkin(int iPad, int iIndex,unsigned int uiSkinID) +{ + DebugPrintf("Setting favorite skin for %d to %08X\n", iPad, uiSkinID); + + GameSettingsA[iPad]->uiFavoriteSkinA[iIndex] = uiSkinID; + GameSettingsA[iPad]->bSettingsChanged = true; +} + +unsigned int CMinecraftApp::GetPlayerFavoriteSkin(int iPad,int iIndex) +{ + return GameSettingsA[iPad]->uiFavoriteSkinA[iIndex]; +} + +unsigned char CMinecraftApp::GetPlayerFavoriteSkinsPos(int iPad) +{ + return GameSettingsA[iPad]->ucCurrentFavoriteSkinPos; +} + +void CMinecraftApp::SetPlayerFavoriteSkinsPos(int iPad, int iPos) +{ + GameSettingsA[iPad]->ucCurrentFavoriteSkinPos=(unsigned char)iPos; + GameSettingsA[iPad]->bSettingsChanged = true; +} + +unsigned int CMinecraftApp::GetPlayerFavoriteSkinsCount(int iPad) +{ + unsigned int uiCount=0; + for(int i=0;iuiFavoriteSkinA[i]!=0xFFFFFFFF) + { + uiCount++; + } + else + { + break; + } + } + return uiCount; +} + +void CMinecraftApp::ValidateFavoriteSkins(int iPad) +{ + unsigned int uiCount=GetPlayerFavoriteSkinsCount(iPad); + + // remove invalid skins + unsigned int uiValidSkin=0; + wchar_t chars[256]; + + for(unsigned int i=0;igetFile(DLCManager::e_DLCType_Skin,chars); + DLCSkinFile *pSkinFile = pDLCPack->getSkinFile(chars); + + if( pDLCPack->hasPurchasedFile(DLCManager::e_DLCType_Skin, L"") || (pSkinFile && pSkinFile->isFree())) + { + GameSettingsA[iPad]->uiFavoriteSkinA[uiValidSkin++]=GameSettingsA[iPad]->uiFavoriteSkinA[i]; + } + } + } + + for(unsigned int i=uiValidSkin;iuiFavoriteSkinA[i]=0xFFFFFFFF; + } +} + +// Mash-up pack worlds +void CMinecraftApp::HideMashupPackWorld(int iPad, unsigned int iMashupPackID) +{ + unsigned int uiPackID=iMashupPackID - 1024; // mash-up ids start at 1024 + GameSettingsA[iPad]->uiMashUpPackWorldsDisplay&=~(1<bSettingsChanged = true; +} + +void CMinecraftApp::SetMinecraftLanguage(int iPad, unsigned char ucLanguage) +{ + GameSettingsA[iPad]->ucLanguage = ucLanguage; + GameSettingsA[iPad]->bSettingsChanged = true; +} + +void CMinecraftApp::EnableMashupPackWorlds(int iPad) +{ + GameSettingsA[iPad]->uiMashUpPackWorldsDisplay=0xFFFFFFFF; + GameSettingsA[iPad]->bSettingsChanged = true; +} + +unsigned int CMinecraftApp::GetMashupPackWorlds(int iPad) +{ + return GameSettingsA[iPad]->uiMashUpPackWorldsDisplay; +} + +unsigned char CMinecraftApp::GetMinecraftLanguage(int iPad) +{ + // if there are no game settings read yet, return the default language + if(GameSettingsA[iPad]==NULL) + { + return 0; + } + else + { + return GameSettingsA[iPad]->ucLanguage; + } +} + +void CMinecraftApp::SetGameSettings(int iPad,eGameSetting eVal,unsigned char ucVal) +{ + //Minecraft *pMinecraft=Minecraft::GetInstance(); + + switch(eVal) + { + case eGameSetting_MusicVolume: + if(GameSettingsA[iPad]->ucMusicVolume!=ucVal) + { + GameSettingsA[iPad]->ucMusicVolume=ucVal; + if(iPad==ProfileManager.GetPrimaryPad()) + { + ActionGameSettings(iPad,eVal); + } + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_SoundFXVolume: + if(GameSettingsA[iPad]->ucSoundFXVolume!=ucVal) + { + GameSettingsA[iPad]->ucSoundFXVolume=ucVal; + if(iPad==ProfileManager.GetPrimaryPad()) + { + ActionGameSettings(iPad,eVal); + } + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_Gamma: + if(GameSettingsA[iPad]->ucGamma!=ucVal) + { + GameSettingsA[iPad]->ucGamma=ucVal; + if(iPad==ProfileManager.GetPrimaryPad()) + { + ActionGameSettings(iPad,eVal); + } + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_Difficulty: + if((GameSettingsA[iPad]->usBitmaskValues&0x03)!=(ucVal&0x03)) + { + GameSettingsA[iPad]->usBitmaskValues&=~0x03; + GameSettingsA[iPad]->usBitmaskValues|=ucVal&0x03; + if(iPad==ProfileManager.GetPrimaryPad()) + { + ActionGameSettings(iPad,eVal); + } + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_Sensitivity_InGame: + if(GameSettingsA[iPad]->ucSensitivity!=ucVal) + { + GameSettingsA[iPad]->ucSensitivity=ucVal; + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_ViewBob: + if((GameSettingsA[iPad]->usBitmaskValues&0x0004)!=((ucVal&0x01)<<2)) + { + if(ucVal!=0) + { + GameSettingsA[iPad]->usBitmaskValues|=0x0004; + } + else + { + GameSettingsA[iPad]->usBitmaskValues&=~0x0004; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_ControlScheme: // bits 5 and 6 + if((GameSettingsA[iPad]->usBitmaskValues&0x30)!=((ucVal&0x03)<<4)) + { + GameSettingsA[iPad]->usBitmaskValues&=~0x0030; + if(ucVal!=0) + { + GameSettingsA[iPad]->usBitmaskValues|=(ucVal&0x03)<<4; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + + case eGameSetting_ControlInvertLook: + if((GameSettingsA[iPad]->usBitmaskValues&0x0040)!=((ucVal&0x01)<<6)) + { + if(ucVal!=0) + { + GameSettingsA[iPad]->usBitmaskValues|=0x0040; + } + else + { + GameSettingsA[iPad]->usBitmaskValues&=~0x0040; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + + case eGameSetting_ControlSouthPaw: + if((GameSettingsA[iPad]->usBitmaskValues&0x0080)!=((ucVal&0x01)<<7)) + { + if(ucVal!=0) + { + GameSettingsA[iPad]->usBitmaskValues|=0x0080; + } + else + { + GameSettingsA[iPad]->usBitmaskValues&=~0x0080; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_SplitScreenVertical: + if((GameSettingsA[iPad]->usBitmaskValues&0x0100)!=((ucVal&0x01)<<8)) + { + if(ucVal!=0) + { + GameSettingsA[iPad]->usBitmaskValues|=0x0100; + } + else + { + GameSettingsA[iPad]->usBitmaskValues&=~0x0100; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_GamertagsVisible: + if((GameSettingsA[iPad]->usBitmaskValues&0x0008)!=((ucVal&0x01)<<3)) + { + if(ucVal!=0) + { + GameSettingsA[iPad]->usBitmaskValues|=0x0008; + } + else + { + GameSettingsA[iPad]->usBitmaskValues&=~0x0008; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + + // 4J-PB - Added for Interim TU for 1.6.6 + case eGameSetting_Sensitivity_InMenu: + if(GameSettingsA[iPad]->ucMenuSensitivity!=ucVal) + { + GameSettingsA[iPad]->ucMenuSensitivity=ucVal; + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_DisplaySplitscreenGamertags: + if((GameSettingsA[iPad]->usBitmaskValues&0x0200)!=((ucVal&0x01)<<9)) + { + if(ucVal!=0) + { + GameSettingsA[iPad]->usBitmaskValues|=0x0200; + } + else + { + GameSettingsA[iPad]->usBitmaskValues&=~0x0200; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_Hints: + if((GameSettingsA[iPad]->usBitmaskValues&0x0400)!=((ucVal&0x01)<<10)) + { + if(ucVal!=0) + { + GameSettingsA[iPad]->usBitmaskValues|=0x0400; + } + else + { + GameSettingsA[iPad]->usBitmaskValues&=~0x0400; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_Autosave: + if((GameSettingsA[iPad]->usBitmaskValues&0x7800)!=((ucVal&0x0F)<<11)) + { + GameSettingsA[iPad]->usBitmaskValues&=~0x7800; + if(ucVal!=0) + { + GameSettingsA[iPad]->usBitmaskValues|=(ucVal&0x0F)<<11; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + + case eGameSetting_Tooltips: + if((GameSettingsA[iPad]->usBitmaskValues&0x8000)!=((ucVal&0x01)<<15)) + { + if(ucVal!=0) + { + GameSettingsA[iPad]->usBitmaskValues|=0x8000; + } + else + { + GameSettingsA[iPad]->usBitmaskValues&=~0x8000; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_InterfaceOpacity: + if(GameSettingsA[iPad]->ucInterfaceOpacity!=ucVal) + { + GameSettingsA[iPad]->ucInterfaceOpacity=ucVal; + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + + break; + case eGameSetting_Clouds: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_CLOUDS)!=(ucVal&0x01)) + { + if(ucVal==1) + { + GameSettingsA[iPad]->uiBitmaskValues|=GAMESETTING_CLOUDS; + } + else + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_CLOUDS; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + + break; + + case eGameSetting_Online: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_ONLINE)!=(ucVal&0x01)<<1) + { + if(ucVal==1) + { + GameSettingsA[iPad]->uiBitmaskValues|=GAMESETTING_ONLINE; + } + else + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_ONLINE; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + + break; + case eGameSetting_InviteOnly: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_INVITEONLY)!=(ucVal&0x01)<<2) + { + if(ucVal==1) + { + GameSettingsA[iPad]->uiBitmaskValues|=GAMESETTING_INVITEONLY; + } + else + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_INVITEONLY; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + + break; + case eGameSetting_FriendsOfFriends: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_FRIENDSOFFRIENDS)!=(ucVal&0x01)<<3) + { + if(ucVal==1) + { + GameSettingsA[iPad]->uiBitmaskValues|=GAMESETTING_FRIENDSOFFRIENDS; + } + else + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_FRIENDSOFFRIENDS; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + + break; + case eGameSetting_DisplayUpdateMessage: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_DISPLAYUPDATEMSG)!=(ucVal&0x03)<<4) + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_DISPLAYUPDATEMSG; + if(ucVal>0) + { + GameSettingsA[iPad]->uiBitmaskValues|=(ucVal&0x03)<<4; + } + + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + + break; + + case eGameSetting_BedrockFog: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_BEDROCKFOG)!=(ucVal&0x01)<<6) + { + if(ucVal==1) + { + GameSettingsA[iPad]->uiBitmaskValues|=GAMESETTING_BEDROCKFOG; + } + else + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_BEDROCKFOG; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + + break; + case eGameSetting_DisplayHUD: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_DISPLAYHUD)!=(ucVal&0x01)<<7) + { + if(ucVal==1) + { + GameSettingsA[iPad]->uiBitmaskValues|=GAMESETTING_DISPLAYHUD; + } + else + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_DISPLAYHUD; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + + break; + case eGameSetting_DisplayHand: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_DISPLAYHAND)!=(ucVal&0x01)<<8) + { + if(ucVal==1) + { + GameSettingsA[iPad]->uiBitmaskValues|=GAMESETTING_DISPLAYHAND; + } + else + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_DISPLAYHAND; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + + break; + + case eGameSetting_CustomSkinAnim: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_CUSTOMSKINANIM)!=(ucVal&0x01)<<9) + { + if(ucVal==1) + { + GameSettingsA[iPad]->uiBitmaskValues|=GAMESETTING_CUSTOMSKINANIM; + } + else + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_CUSTOMSKINANIM; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + + break; + // TU9 + case eGameSetting_DeathMessages: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_DEATHMESSAGES)!=(ucVal&0x01)<<10) + { + if(ucVal==1) + { + GameSettingsA[iPad]->uiBitmaskValues|=GAMESETTING_DEATHMESSAGES; + } + else + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_DEATHMESSAGES; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_UISize: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_UISIZE)!=((ucVal&0x03)<<11)) + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_UISIZE; + if(ucVal!=0) + { + GameSettingsA[iPad]->uiBitmaskValues|=(ucVal&0x03)<<11; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_UISizeSplitscreen: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_UISIZE_SPLITSCREEN)!=((ucVal&0x03)<<13)) + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_UISIZE_SPLITSCREEN; + if(ucVal!=0) + { + GameSettingsA[iPad]->uiBitmaskValues|=(ucVal&0x03)<<13; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_AnimatedCharacter: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_ANIMATEDCHARACTER)!=(ucVal&0x01)<<15) + { + if(ucVal==1) + { + GameSettingsA[iPad]->uiBitmaskValues|=GAMESETTING_ANIMATEDCHARACTER; + } + else + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_ANIMATEDCHARACTER; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_PS3_EULA_Read: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_PS3EULAREAD)!=(ucVal&0x01)<<16) + { + if(ucVal==1) + { + GameSettingsA[iPad]->uiBitmaskValues|=GAMESETTING_PS3EULAREAD; + } + else + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_PS3EULAREAD; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + case eGameSetting_PSVita_NetworkModeAdhoc: + if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_PSVITANETWORKMODEADHOC)!=(ucVal&0x01)<<17) + { + if(ucVal==1) + { + GameSettingsA[iPad]->uiBitmaskValues|=GAMESETTING_PSVITANETWORKMODEADHOC; + } + else + { + GameSettingsA[iPad]->uiBitmaskValues&=~GAMESETTING_PSVITANETWORKMODEADHOC; + } + ActionGameSettings(iPad,eVal); + GameSettingsA[iPad]->bSettingsChanged=true; + } + break; + + } +} + +unsigned char CMinecraftApp::GetGameSettings(eGameSetting eVal) +{ + int iPad=ProfileManager.GetPrimaryPad(); + + return GetGameSettings(iPad,eVal); +} + +unsigned char CMinecraftApp::GetGameSettings(int iPad,eGameSetting eVal) +{ + switch(eVal) + { + case eGameSetting_MusicVolume: + return GameSettingsA[iPad]->ucMusicVolume; + break; + case eGameSetting_SoundFXVolume: + return GameSettingsA[iPad]->ucSoundFXVolume; + break; + case eGameSetting_Gamma: + return GameSettingsA[iPad]->ucGamma; + break; + case eGameSetting_Difficulty: + return GameSettingsA[iPad]->usBitmaskValues&0x0003; + break; + case eGameSetting_Sensitivity_InGame: + return GameSettingsA[iPad]->ucSensitivity; + break; + case eGameSetting_ViewBob: + return ((GameSettingsA[iPad]->usBitmaskValues&0x0004)>>2); + break; + case eGameSetting_GamertagsVisible: + return ((GameSettingsA[iPad]->usBitmaskValues&0x0008)>>3); + break; + case eGameSetting_ControlScheme: + return ((GameSettingsA[iPad]->usBitmaskValues&0x0030)>>4); // 2 bits + break; + case eGameSetting_ControlInvertLook: + return ((GameSettingsA[iPad]->usBitmaskValues&0x0040)>>6); + break; + case eGameSetting_ControlSouthPaw: + return ((GameSettingsA[iPad]->usBitmaskValues&0x0080)>>7); + break; + case eGameSetting_SplitScreenVertical: + return ((GameSettingsA[iPad]->usBitmaskValues&0x0100)>>8); + break; + // 4J-PB - Added for Interim TU for 1.6.6 + case eGameSetting_Sensitivity_InMenu: + return GameSettingsA[iPad]->ucMenuSensitivity; + break; + + case eGameSetting_DisplaySplitscreenGamertags: + return ((GameSettingsA[iPad]->usBitmaskValues&0x0200)>>9); + break; + + case eGameSetting_Hints: + return ((GameSettingsA[iPad]->usBitmaskValues&0x0400)>>10); + break; + case eGameSetting_Autosave: + { + unsigned char ucVal=(GameSettingsA[iPad]->usBitmaskValues&0x7800)>>11; + return ucVal; + } + break; + case eGameSetting_Tooltips: + return ((GameSettingsA[iPad]->usBitmaskValues&0x8000)>>15); + break; + + case eGameSetting_InterfaceOpacity: + return GameSettingsA[iPad]->ucInterfaceOpacity; + break; + + case eGameSetting_Clouds: + return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_CLOUDS); + break; + case eGameSetting_Online: + return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_ONLINE)>>1; + break; + case eGameSetting_InviteOnly: + return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_INVITEONLY)>>2; + break; + case eGameSetting_FriendsOfFriends: + return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_FRIENDSOFFRIENDS)>>3; + break; + case eGameSetting_DisplayUpdateMessage: + return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_DISPLAYUPDATEMSG)>>4; + break; + case eGameSetting_BedrockFog: + return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_BEDROCKFOG)>>6; + break; + case eGameSetting_DisplayHUD: + return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_DISPLAYHUD)>>7; + break; + case eGameSetting_DisplayHand: + return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_DISPLAYHAND)>>8; + break; + case eGameSetting_CustomSkinAnim: + return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_CUSTOMSKINANIM)>>9; + break; + // TU9 + case eGameSetting_DeathMessages: + return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_DEATHMESSAGES)>>10; + break; + case eGameSetting_UISize: + { + unsigned char ucVal=(GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_UISIZE)>>11; + return ucVal; + } + break; + case eGameSetting_UISizeSplitscreen: + { + unsigned char ucVal=(GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_UISIZE_SPLITSCREEN)>>13; + return ucVal; + } + break; + case eGameSetting_AnimatedCharacter: + return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_ANIMATEDCHARACTER)>>15; + + case eGameSetting_PS3_EULA_Read: + return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_PS3EULAREAD)>>16; + + case eGameSetting_PSVita_NetworkModeAdhoc: + return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_PSVITANETWORKMODEADHOC)>>17; + + } + return 0; +} + +void CMinecraftApp::CheckGameSettingsChanged(bool bOverride5MinuteTimer, int iPad) +{ + // If the settings have changed, write them to the profile + + if(iPad==XUSER_INDEX_ANY) + { + for(int i=0;ibSettingsChanged) + { +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__ ) + StorageManager.WriteToProfile(i,true, bOverride5MinuteTimer); +#else + ProfileManager.WriteToProfile(i,true, bOverride5MinuteTimer); +#endif + GameSettingsA[i]->bSettingsChanged=false; + } + } + } + else + { + if(GameSettingsA[iPad]->bSettingsChanged) + { +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) + StorageManager.WriteToProfile(iPad,true, bOverride5MinuteTimer); +#else + ProfileManager.WriteToProfile(iPad,true, bOverride5MinuteTimer); +#endif + GameSettingsA[iPad]->bSettingsChanged=false; + } + } +} + +void CMinecraftApp::ClearGameSettingsChangedFlag(int iPad) +{ + GameSettingsA[iPad]->bSettingsChanged=false; +} + +/////////////////////////// +// +// Remove the debug settings in the content package build +// +//////////////////////////// +#ifndef _DEBUG_MENUS_ENABLED +unsigned int CMinecraftApp::GetGameSettingsDebugMask(int iPad,bool bOverridePlayer) //bOverridePlayer is to force the send for the server to get the read options +{ + return 0; +} + +void CMinecraftApp::SetGameSettingsDebugMask(int iPad, unsigned int uiVal) +{ +} + +void CMinecraftApp::ActionDebugMask(int iPad,bool bSetAllClear) +{ +} + +#else + +unsigned int CMinecraftApp::GetGameSettingsDebugMask(int iPad,bool bOverridePlayer) //bOverridePlayer is to force the send for the server to get the read options +{ + if(iPad==-1) + { + iPad=ProfileManager.GetPrimaryPad(); + } + if(iPad < 0) iPad = 0; + + shared_ptr player = Minecraft::GetInstance()->localplayers[iPad]; + + if(bOverridePlayer || player==NULL) + { + return GameSettingsA[iPad]->uiDebugBitmask; + } + else + { + return player->GetDebugOptions(); + } +} + + +void CMinecraftApp::SetGameSettingsDebugMask(int iPad, unsigned int uiVal) +{ +#ifndef _CONTENT_PACKAGE + GameSettingsA[iPad]->bSettingsChanged=true; + GameSettingsA[iPad]->uiDebugBitmask=uiVal; + + // update the value so the network server can use it + shared_ptr player = Minecraft::GetInstance()->localplayers[iPad]; + + if(player) + { + Minecraft::GetInstance()->localgameModes[iPad]->handleDebugOptions(uiVal,player); + } +#endif +} + +void CMinecraftApp::ActionDebugMask(int iPad,bool bSetAllClear) +{ + unsigned int ulBitmask=app.GetGameSettingsDebugMask(iPad); + + if(bSetAllClear) ulBitmask=0L; + + + + // these settings should only be actioned for the primary player + if(ProfileManager.GetPrimaryPad()!=iPad) return; + + for(int i=0;iiPad, actionInfo->action); +} + + +void CMinecraftApp::HandleXuiActions(void) +{ + eXuiAction eAction; + eTMSAction eTMS; + LPVOID param; + Minecraft *pMinecraft=Minecraft::GetInstance(); + shared_ptr player; + + // are there any global actions to deal with? + eAction = app.GetGlobalXuiAction(); + if(eAction!=eAppAction_Idle) + { + switch(eAction) + { + case eAppAction_DisplayLavaMessage: + // Display a warning about placing lava in the spawn area + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_CANT_PLACE_NEAR_SPAWN_TITLE, IDS_CANT_PLACE_NEAR_SPAWN_TEXT, uiIDA,1,XUSER_INDEX_ANY,NULL,NULL, app.GetStringTable()); + if(result != C4JStorage::EMessage_Busy) SetGlobalXuiAction(eAppAction_Idle); + + } + break; + default: + break; + } + } + + // are there any app actions to deal with? + for(int i=0;iIsTitleAllowedToPostImages() && CSocialManager::Instance()->AreAllUsersAllowedToPostImages() ) + { + // disable character name tags for the shot + //m_bwasHidingGui = pMinecraft->options->hideGui; // 4J Stu - Removed 1.8.2 bug fix (TU6) as don't need this + pMinecraft->options->hideGui = true; + + SetAction(i,eAppAction_SocialPostScreenshot); + } + else + { + SetAction(i,eAppAction_Idle); + } + } + else + { + SetAction(i,eAppAction_Idle); + } + break; + case eAppAction_SocialPostScreenshot: + { + SetAction(i,eAppAction_Idle); + bool bKeepHiding = false; + for(int j=0; j < XUSER_MAX_COUNT;++j) + { + if(app.GetXuiAction(j) == eAppAction_SocialPostScreenshot) + { + bKeepHiding = true; + break; + } + } + pMinecraft->options->hideGui=bKeepHiding; + + // Facebook Share + + if(app.GetLocalPlayerCount()>1) + { + ui.NavigateToScene(i,eUIScene_SocialPost); + } + else + { + ui.NavigateToScene(i,eUIScene_SocialPost); + } + } + break; + case eAppAction_SaveGame: + SetAction(i,eAppAction_Idle); + if(!GetChangingSessionType()) + { + // If this is the trial game, do an upsell + if(ProfileManager.IsFullVersion()) + { + + // flag the render to capture the screenshot for the save + SetAction(i,eAppAction_SaveGameCapturedThumbnail); + } + else + { + // ask the player if they would like to upgrade, or they'll lose the level + + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + ui.RequestMessageBox(IDS_UNLOCK_TITLE, IDS_UNLOCK_TOSAVE_TEXT, uiIDA, 2,i,&CMinecraftApp::UnlockFullSaveReturned,this,app.GetStringTable()); + } + } + + break; + case eAppAction_AutosaveSaveGame: + { + // Need to run a check to see if the save exists in order to stop the dialog asking if we want to overwrite it coming up on an autosave + bool bSaveExists; + StorageManager.DoesSaveExist(&bSaveExists); + + SetAction(i,eAppAction_Idle); + if(!GetChangingSessionType()) + { + + // flag the render to capture the screenshot for the save + SetAction(i,eAppAction_AutosaveSaveGameCapturedThumbnail); + } + } + + break; + + case eAppAction_SaveGameCapturedThumbnail: + // reset the autosave timer + app.SetAutosaveTimerTime(); + SetAction(i,eAppAction_Idle); + // Check that there is a name for the save - if we're saving from the tutorial and this is the first save from the tutorial, we'll not have a name + /*if(StorageManager.GetSaveName()==NULL) + { + app.NavigateToScene(i,eUIScene_SaveWorld); + } + else*/ + { + // turn off the gamertags in splitscreen for the primary player, since they are about to be made fullscreen + ui.HideAllGameUIElements(); + + // Hide the other players scenes + ui.ShowOtherPlayersBaseScene(ProfileManager.GetPrimaryPad(), false); + + //INT saveOrCheckpointId = 0; + //bool validSave = StorageManager.GetSaveUniqueNumber(&saveOrCheckpointId); + //SentientManager.RecordLevelSaveOrCheckpoint(ProfileManager.GetPrimaryPad(), saveOrCheckpointId); + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &UIScene_PauseMenu::SaveWorldThreadProc; + loadingParams->lpParam = (LPVOID)false; + + // 4J-JEV - PS4: Fix for #5708 - [ONLINE] - If the user pulls their network cable out while saving the title will hang. + loadingParams->waitForThreadToDelete = true; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_NavigateBackToScene; + completionData->iPad = ProfileManager.GetPrimaryPad(); + + if( ui.IsSceneInStack( ProfileManager.GetPrimaryPad(), eUIScene_EndPoem ) ) + { + completionData->scene = eUIScene_EndPoem; + } + else + { + completionData->scene = eUIScene_PauseMenu; + } + + loadingParams->completionData = completionData; + + // 4J Stu - Xbox only +#ifdef _XBOX + // Temporarily make this scene fullscreen + CXuiSceneBase::SetPlayerBaseScenePosition( ProfileManager.GetPrimaryPad(), CXuiSceneBase::e_BaseScene_Fullscreen ); +#endif + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams , eUILayer_Fullscreen, eUIGroup_Fullscreen); + + } + break; + case eAppAction_AutosaveSaveGameCapturedThumbnail: + + { + app.SetAutosaveTimerTime(); + SetAction(i,eAppAction_Idle); + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_AutoSaveGame); + + if(app.GetGameHostOption(eGameHostOption_DisableSaving)) StorageManager.SetSaveDisabled(true); +#else + // turn off the gamertags in splitscreen for the primary player, since they are about to be made fullscreen + ui.HideAllGameUIElements(); + + //app.CloseAllPlayersXuiScenes(); + // Hide the other players scenes + ui.ShowOtherPlayersBaseScene(ProfileManager.GetPrimaryPad(), false); + + // This just allows it to be shown + if(pMinecraft->localgameModes[ProfileManager.GetPrimaryPad()] != NULL) pMinecraft->localgameModes[ProfileManager.GetPrimaryPad()]->getTutorial()->showTutorialPopup(false); + + //INT saveOrCheckpointId = 0; + //bool validSave = StorageManager.GetSaveUniqueNumber(&saveOrCheckpointId); + //SentientManager.RecordLevelSaveOrCheckpoint(ProfileManager.GetPrimaryPad(), saveOrCheckpointId); + + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &UIScene_PauseMenu::SaveWorldThreadProc; + + loadingParams->lpParam = (LPVOID)true; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_AutosaveNavigateBack; + completionData->iPad = ProfileManager.GetPrimaryPad(); + //completionData->bAutosaveWasMenuDisplayed=ui.GetMenuDisplayed(ProfileManager.GetPrimaryPad()); + loadingParams->completionData = completionData; + + // 4J Stu - Xbox only +#ifdef _XBOX + // Temporarily make this scene fullscreen + CXuiSceneBase::SetPlayerBaseScenePosition( ProfileManager.GetPrimaryPad(), CXuiSceneBase::e_BaseScene_Fullscreen ); +#endif + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams , eUILayer_Fullscreen, eUIGroup_Fullscreen); +#endif + } + break; + case eAppAction_ExitPlayer: + // a secondary player has chosen to quit + { + int iPlayerC=g_NetworkManager.GetPlayerCount(); + + // Since the player is exiting, let's flush any profile writes for them, and hope we're not breaking TCR 136... +#if (defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) + StorageManager.ForceQueuedProfileWrites(i); + LeaderboardManager::Instance()->OpenSession(); + for (int j = 0; j < XUSER_MAX_COUNT; j++) + { + if( ProfileManager.IsSignedIn(j) ) + { + app.DebugPrintf("Stats save for an offline game for the player at index %d\n", 0); + Minecraft::GetInstance()->forceStatsSave(j); + } + } + LeaderboardManager::Instance()->CloseSession(); +#else + ProfileManager.ForceQueuedProfileWrites(i); +#endif + + // not required - it's done within the removeLocalPlayerIdx + // if(pMinecraft->level->isClientSide) + // { + // // we need to remove the qnetplayer, or this player won't be able to get back into the game until qnet times out and removes them + // g_NetworkManager.NotifyPlayerLeaving(g_NetworkManager.GetLocalPlayerByUserIndex(i)); + // } + + // if there are any tips showing, we need to close them + + pMinecraft->gui->clearMessages(i); + + // Make sure we've not got this player selected as current - this shouldn't be the case anyway + pMinecraft->setLocalPlayerIdx(ProfileManager.GetPrimaryPad()); + pMinecraft->removeLocalPlayerIdx(i); + +#ifdef _XBOX + // tell the xui scenes a splitscreen player left - has to come after removeLocalPlayerIdx which calls updatePlayerViewportAssignments + XUIMessage xuiMsg; + CustomMessage_Splitscreenplayer_Struct myMsgData; + CustomMessage_Splitscreenplayer( &xuiMsg, &myMsgData, false); + + // send the message + for(int idx=0;idxlocalplayers[idx]!=NULL)) + { + XuiBroadcastMessage( CXuiSceneBase::GetPlayerBaseScene(idx), &xuiMsg ); + } + } +#endif + +#ifndef _XBOX + // Wipe out the tooltips + ui.SetTooltips(i, -1); +#endif + + // Change the presence info + // Are we offline or online, and how many players are there + if(iPlayerC>2) // one player is about to leave here - they'll be set to idle in the qnet manager player leave + { + for(int iPlayer=0;iPlayerlocalplayers[iPlayer]) + { + if(g_NetworkManager.IsLocalGame()) + { + ProfileManager.SetCurrentGameActivity(iPlayer,CONTEXT_PRESENCE_MULTIPLAYEROFFLINE,false); + } + else + { + ProfileManager.SetCurrentGameActivity(iPlayer,CONTEXT_PRESENCE_MULTIPLAYER,false); + } + } + } + } + else + { + for(int iPlayer=0;iPlayerlocalplayers[iPlayer]) + { + if(g_NetworkManager.IsLocalGame()) + { + ProfileManager.SetCurrentGameActivity(iPlayer,CONTEXT_PRESENCE_MULTIPLAYER_1POFFLINE,false); + } + else + { + ProfileManager.SetCurrentGameActivity(iPlayer,CONTEXT_PRESENCE_MULTIPLAYER_1P,false); + } + } + } + } + +#ifdef _DURANGO + ProfileManager.RemoveGamepadFromGame(i); +#endif + + SetAction(i,eAppAction_Idle); + } + break; + case eAppAction_ExitPlayerPreLogin: + { + int iPlayerC=g_NetworkManager.GetPlayerCount(); + // Since the player is exiting, let's flush any profile writes for them, and hope we're not breaking TCR 136... +#if (defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) + StorageManager.ForceQueuedProfileWrites(i); +#else + ProfileManager.ForceQueuedProfileWrites(i); +#endif + // if there are any tips showing, we need to close them + + pMinecraft->gui->clearMessages(i); + + // Make sure we've not got this player selected as current - this shouldn't be the case anyway + pMinecraft->setLocalPlayerIdx(ProfileManager.GetPrimaryPad()); + pMinecraft->removeLocalPlayerIdx(i); + +#ifdef _XBOX + // tell the xui scenes a splitscreen player left - has to come after removeLocalPlayerIdx which calls updatePlayerViewportAssignments + XUIMessage xuiMsg; + CustomMessage_Splitscreenplayer_Struct myMsgData; + CustomMessage_Splitscreenplayer( &xuiMsg, &myMsgData, false); + + // send the message + for(int idx=0;idxlocalplayers[idx]!=NULL)) + { + XuiBroadcastMessage( CXuiSceneBase::GetPlayerBaseScene(idx), &xuiMsg ); + } + } +#endif + +#ifndef _XBOX + // Wipe out the tooltips + ui.SetTooltips(i, -1); +#endif + + // Change the presence info + // Are we offline or online, and how many players are there + if(iPlayerC>2) // one player is about to leave here - they'll be set to idle in the qnet manager player leave + { + for(int iPlayer=0;iPlayerlocalplayers[iPlayer]) + { + if(g_NetworkManager.IsLocalGame()) + { + ProfileManager.SetCurrentGameActivity(iPlayer,CONTEXT_PRESENCE_MULTIPLAYEROFFLINE,false); + } + else + { + ProfileManager.SetCurrentGameActivity(iPlayer,CONTEXT_PRESENCE_MULTIPLAYER,false); + } + } + } + } + else + { + for(int iPlayer=0;iPlayerlocalplayers[iPlayer]) + { + if(g_NetworkManager.IsLocalGame()) + { + ProfileManager.SetCurrentGameActivity(iPlayer,CONTEXT_PRESENCE_MULTIPLAYER_1POFFLINE,false); + } + else + { + ProfileManager.SetCurrentGameActivity(iPlayer,CONTEXT_PRESENCE_MULTIPLAYER_1P,false); + } + } + } + } + SetAction(i,eAppAction_Idle); + } + break; + +#ifdef __ORBIS__ + case eAppAction_OptionsSaveNoSpace: + { + SetAction(i,eAppAction_Idle); + + SceSaveDataDialogParam param; + SceSaveDataDialogSystemMessageParam sysParam; + SceSaveDataDialogItems items; + SceSaveDataDirName dirName; + + sceSaveDataDialogParamInitialize(¶m); + param.mode = SCE_SAVE_DATA_DIALOG_MODE_SYSTEM_MSG; + param.dispType = SCE_SAVE_DATA_DIALOG_TYPE_SAVE; + memset(&sysParam,0,sizeof(sysParam)); + param.sysMsgParam = &sysParam; + param.sysMsgParam->sysMsgType = SCE_SAVE_DATA_DIALOG_SYSMSG_TYPE_NOSPACE_CONTINUABLE; + param.sysMsgParam->value = app.GetOptionsBlocksRequired(i); + memset(&items, 0, sizeof(items)); + param.items = &items; + param.items->userId = ProfileManager.getUserID(i); + + int ret = sceSaveDataDialogInitialize(); + ret = sceSaveDataDialogOpen(¶m); + + app.SetOptionsSaveDataDialogRunning(true);//m_bOptionsSaveDataDialogRunning = true; + //pClass->m_eSaveIncompleteType = saveIncompleteType; + + //StorageManager.SetSaveDisabled(true); + //pClass->EnterSaveNotificationSection(); + + } + break; +#endif + + case eAppAction_ExitWorld: + + SetAction(i,eAppAction_Idle); + + // If we're already leaving don't exit + if (g_NetworkManager.IsLeavingGame()) + { + break; + } + + pMinecraft->gui->clearMessages(); + + // turn off the gamertags in splitscreen for the primary player, since they are about to be made fullscreen + ui.HideAllGameUIElements(); + + // reset the flag stopping new dlc message being shown if you've seen the message before + DisplayNewDLCTipAgain(); + + // clear the autosave timer that might be on screen + ui.ShowAutosaveCountdownTimer(false); + + // Hide the selected item text + ui.HideAllGameUIElements(); + + // Since the player forced the exit, let's flush any profile writes, and hope we're not breaking TCR 136... +#if (defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) + StorageManager.ForceQueuedProfileWrites(); + LeaderboardManager::Instance()->OpenSession(); + for (int j = 0; j < XUSER_MAX_COUNT; j++) + { + if( ProfileManager.IsSignedIn(j) ) + { + app.DebugPrintf("Stats save for an offline game for the player at index %d\n", 0); + Minecraft::GetInstance()->forceStatsSave(j); + } + } + LeaderboardManager::Instance()->CloseSession(); +#elif (defined _XBOX) + ProfileManager.ForceQueuedProfileWrites(); +#endif + + // 4J-PB - cancel any possible string verifications queued with LIVE + //InputManager.CancelAllVerifyInProgress(); + + if(ProfileManager.IsFullVersion()) + { + + // In a split screen, only the primary player actually quits the game, others just remove their players + if( i != ProfileManager.GetPrimaryPad() ) + { + // Make sure we've not got this player selected as current - this shouldn't be the case anyway + pMinecraft->setLocalPlayerIdx(ProfileManager.GetPrimaryPad()); + pMinecraft->removeLocalPlayerIdx(i); + +#ifdef _DURANGO + ProfileManager.RemoveGamepadFromGame(i); +#endif + SetAction(i,eAppAction_Idle); + return; + } + // flag to capture the save thumbnail + SetAction(i,eAppAction_ExitWorldCapturedThumbnail, param); + } + else + { + // ask the player if they would like to upgrade, or they'll lose the level + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + ui.RequestMessageBox(IDS_UNLOCK_TITLE, IDS_UNLOCK_TOSAVE_TEXT, uiIDA, 2, i,&CMinecraftApp::UnlockFullExitReturned,this,app.GetStringTable()); + } + + // Change the presence info + // Are we offline or online, and how many players are there + + if(g_NetworkManager.GetPlayerCount()>1) + { + for(int j=0;jlocalplayers[j]) + { + if(g_NetworkManager.IsLocalGame()) + { + app.SetRichPresenceContext(j,CONTEXT_GAME_STATE_BLANK); + ProfileManager.SetCurrentGameActivity(j,CONTEXT_PRESENCE_MULTIPLAYEROFFLINE,false); + } + else + { + app.SetRichPresenceContext(j,CONTEXT_GAME_STATE_BLANK); + ProfileManager.SetCurrentGameActivity(j,CONTEXT_PRESENCE_MULTIPLAYER,false); + } + TelemetryManager->RecordLevelExit(j, eSen_LevelExitStatus_Exited); + } + } + } + else + { + app.SetRichPresenceContext(i,CONTEXT_GAME_STATE_BLANK); + if(g_NetworkManager.IsLocalGame()) + { + ProfileManager.SetCurrentGameActivity(i,CONTEXT_PRESENCE_MULTIPLAYER_1POFFLINE,false); + } + else + { + ProfileManager.SetCurrentGameActivity(i,CONTEXT_PRESENCE_MULTIPLAYER_1P,false); + } + TelemetryManager->RecordLevelExit(i, eSen_LevelExitStatus_Exited); + } + break; + case eAppAction_ExitWorldCapturedThumbnail: + { + SetAction(i,eAppAction_Idle); + // Stop app running + SetGameStarted(false); + SetChangingSessionType(true); // Added to stop handling ethernet disconnects + + ui.CloseAllPlayersScenes(); + + // turn off the gamertags in splitscreen for the primary player, since they are about to be made fullscreen + ui.HideAllGameUIElements(); + + // 4J Stu - Fix for #12368 - Crash: Game crashes when saving then exiting and selecting to save + for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { +#ifdef _XBOX + app.TutorialSceneNavigateBack(idx,true); +#endif + + // 4J Stu - Fix for #13257 - CRASH: Gameplay: Title crashed after exiting the tutorial + // It doesn't matter if they were in the tutorial already + pMinecraft->playerLeftTutorial( idx ); + } + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &UIScene_PauseMenu::ExitWorldThreadProc; + loadingParams->lpParam = param; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + // If param is non-null then this is a forced exit by the server, so make sure the player knows why + // 4J Stu - Changed - Don't use the FullScreenProgressScreen for action, use a dialog instead + completionData->bRequiresUserAction = FALSE;//(param != NULL) ? TRUE : FALSE; + completionData->bShowTips = (param != NULL) ? FALSE : TRUE; + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_NavigateToHomeMenu; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); + } + break; + case eAppAction_ExitWorldTrial: + { + SetAction(i,eAppAction_Idle); + + pMinecraft->gui->clearMessages(); + + // turn off the gamertags in splitscreen for the primary player, since they are about to be made fullscreen + ui.HideAllGameUIElements(); + + // Stop app running + SetGameStarted(false); + + ui.CloseAllPlayersScenes(); + + // 4J Stu - Fix for #12368 - Crash: Game crashes when saving then exiting and selecting to save + for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { +#ifdef _XBOX + app.TutorialSceneNavigateBack(idx,true); +#endif + + // 4J Stu - Fix for #13257 - CRASH: Gameplay: Title crashed after exiting the tutorial + // It doesn't matter if they were in the tutorial already + pMinecraft->playerLeftTutorial( idx ); + } + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &UIScene_PauseMenu::ExitWorldThreadProc; + loadingParams->lpParam = param; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_NavigateToHomeMenu; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); + } + + break; + case eAppAction_ExitTrial: + //XLaunchNewImage(XLAUNCH_KEYWORD_DASH_ARCADE, 0); + ExitGame(); + break; + + case eAppAction_Respawn: + { + ConnectionProgressParams *param = new ConnectionProgressParams(); + param->iPad = i; + param->stringId = IDS_PROGRESS_RESPAWNING; + param->showTooltips = false; + param->setFailTimer = false; + ui.NavigateToScene(i,eUIScene_ConnectingProgress, param); + + // Need to reset this incase the player has already died and respawned + pMinecraft->localplayers[i]->SetPlayerRespawned(false); + + SetAction(i,eAppAction_WaitForRespawnComplete); + if( app.GetLocalPlayerCount()>1 ) + { + // In split screen mode, we don't want to do any async loading or flushing of the cache, just a simple respawn + pMinecraft->localplayers[i]->respawn(); + + // If the respawn requires a dimension change then the action will have changed + //if(app.GetXuiAction(i) == eAppAction_Respawn) + //{ + // SetAction(i,eAppAction_Idle); + // CloseXuiScenes(i); + //} + } + else + { + //SetAction(i,eAppAction_WaitForRespawnComplete); + + //LoadingInputParams *loadingParams = new LoadingInputParams(); + //loadingParams->func = &CScene_Death::RespawnThreadProc; + //loadingParams->lpParam = (LPVOID)i; + + // Disable game & update thread whilst we do any of this + //app.SetGameStarted(false); + pMinecraft->gameRenderer->DisableUpdateThread(); + + // 4J Stu - We don't need this on a thread in multiplayer as respawning is asynchronous. + pMinecraft->localplayers[i]->respawn(); + + //app.SetGameStarted(true); + pMinecraft->gameRenderer->EnableUpdateThread(); + + //UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + //completionData->bShowBackground=TRUE; + //completionData->bShowLogo=TRUE; + //completionData->type = e_ProgressCompletion_CloseUIScenes; + //completionData->iPad = i; + //loadingParams->completionData = completionData; + + //app.NavigateToScene(i,eUIScene_FullscreenProgress, loadingParams, true); + } + } + break; + case eAppAction_WaitForRespawnComplete: + player = pMinecraft->localplayers[i]; + if(player != NULL && player->GetPlayerRespawned()) + { + SetAction(i,eAppAction_Idle); + + if(ui.IsSceneInStack(i, eUIScene_EndPoem)) + { + ui.NavigateBack(i,false,eUIScene_EndPoem); + } + else + { + ui.CloseUIScenes(i); + } + + // clear the progress messages + +// pMinecraft->progressRenderer->progressStart(-1); +// pMinecraft->progressRenderer->progressStage(-1); + } + else if(!g_NetworkManager.IsInGameplay()) + { + SetAction(i,eAppAction_Idle); + } + break; + case eAppAction_WaitForDimensionChangeComplete: + player = pMinecraft->localplayers[i]; + if(player != NULL && player->connection && player->connection->isStarted()) + { + SetAction(i,eAppAction_Idle); + ui.CloseUIScenes(i); + } + else if(!g_NetworkManager.IsInGameplay()) + { + SetAction(i,eAppAction_Idle); + } + break; + case eAppAction_PrimaryPlayerSignedOut: + { + //SetAction(i,eAppAction_Idle); + + // clear the autosavetimer that might be displayed + ui.ShowAutosaveCountdownTimer(false); + + // If the player signs out before the game started the server can be killed a bit earlier to stop + // the loading or saving of a new game continuing running while the UI/Guide is up + if(!app.GetGameStarted()) MinecraftServer::HaltServer(true); + + // inform the player they are being returned to the menus because they signed out + StorageManager.SetSaveDeviceSelected(i,false); + // need to clear the player stats - can't assume it'll be done in setlevel - we may not be in the game + StatsCounter* pStats = Minecraft::GetInstance()->stats[ i ]; + pStats->clear(); + + // 4J-PB - the libs will display the Returned to Title screen +// UINT uiIDA[1]; +// uiIDA[0]=IDS_CONFIRM_OK; +// +// ui.RequestMessageBox(IDS_RETURNEDTOMENU_TITLE, IDS_RETURNEDTOTITLESCREEN_TEXT, uiIDA, 1, i,&CMinecraftApp::PrimaryPlayerSignedOutReturned,this,app.GetStringTable()); + if( g_NetworkManager.IsInSession() ) + { + app.SetAction(i,eAppAction_PrimaryPlayerSignedOutReturned); + } + else + { + app.SetAction(i,eAppAction_PrimaryPlayerSignedOutReturned_Menus); + MinecraftServer::resetFlags(); + } + } + break; + case eAppAction_EthernetDisconnected: + { + app.DebugPrintf("Handling eAppAction_EthernetDisconnected\n"); + SetAction(i,eAppAction_Idle); + + // 4J Stu - Fix for #12530 -TCR 001 BAS Game Stability: Title will crash if the player disconnects while starting a new world and then opts to play the tutorial once they have been returned to the Main Menu. + if(!g_NetworkManager.IsLeavingGame()) + { + app.DebugPrintf("Handling eAppAction_EthernetDisconnected - Not leaving game\n"); + // 4J-PB - not the same as a signout. We should only leave the game if this machine is not the host. We shouldn't get rid of the save device either. + if( g_NetworkManager.IsHost() ) + { + app.DebugPrintf("Handling eAppAction_EthernetDisconnected - Is Host\n"); + // If it's already a local game, then an ethernet disconnect should have no effect + if( !g_NetworkManager.IsLocalGame() && g_NetworkManager.IsInGameplay() ) + { + // Change the session to an offline session + SetAction(i,eAppAction_ChangeSessionType); + } + else if(!g_NetworkManager.IsLocalGame() && !g_NetworkManager.IsInGameplay() ) + { + // There are two cases here, either: + // 1. We're early enough in the create/load game that we can do a really minimal shutdown or + // 2. We're far enough in (game has started but the actual game started flag hasn't been set) that we should just wait until we're in the game and switch to offline mode + + // If there's a non-null level then, for our purposes, the game has started + bool gameStarted = false; + for(int i = 0; i < pMinecraft->levels.length; i++) + { + if (pMinecraft->levels.data[i] != nullptr) + { + gameStarted = true; + break; + } + } + + if (!gameStarted) + { + // 1. Exit + MinecraftServer::HaltServer(); + + // Fix for #12530 - TCR 001 BAS Game Stability: Title will crash if the player disconnects while starting a new world and then opts to play the tutorial once they have been returned to the Main Menu. + // 4J Stu - Leave the session + g_NetworkManager.LeaveGame(FALSE); + + // need to clear the player stats - can't assume it'll be done in setlevel - we may not be in the game + StatsCounter* pStats = Minecraft::GetInstance()->stats[ i ]; + pStats->clear(); + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + + ui.RequestMessageBox(g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST), g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE), uiIDA, 1, i,&CMinecraftApp::EthernetDisconnectReturned,this, app.GetStringTable()); + } + else + { + // 2. Switch to offline + SetAction(i,eAppAction_ChangeSessionType); + } + } + } + else + { + app.DebugPrintf("Handling eAppAction_EthernetDisconnected - Not host\n"); + // need to clear the player stats - can't assume it'll be done in setlevel - we may not be in the game + StatsCounter* pStats = Minecraft::GetInstance()->stats[ i ]; + pStats->clear(); + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + + ui.RequestMessageBox(g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST), g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE), uiIDA, 1, i,&CMinecraftApp::EthernetDisconnectReturned,this, app.GetStringTable()); + } + } + } + break; + // We currently handle both these returns the same way. + case eAppAction_EthernetDisconnectedReturned: + case eAppAction_PrimaryPlayerSignedOutReturned: + { + SetAction(i,eAppAction_Idle); + + pMinecraft->gui->clearMessages(); + + // turn off the gamertags in splitscreen for the primary player, since they are about to be made fullscreen + ui.HideAllGameUIElements(); + + // set the state back to pre-game + ProfileManager.ResetProfileProcessState(); + + + if( g_NetworkManager.IsLeavingGame() ) + { + // 4J Stu - If we are already leaving the game, then we just need to signal that the player signed out to stop saves + pMinecraft->progressRenderer->progressStartNoAbort( IDS_EXITING_GAME ); + pMinecraft->progressRenderer->progressStage(-1); + // This has no effect on client machines + MinecraftServer::HaltServer(true); + } + else + { + // Stop app running + SetGameStarted(false); + + // turn off the gamertags in splitscreen for the primary player, since they are about to be made fullscreen + ui.HideAllGameUIElements(); + + ui.CloseAllPlayersScenes(); + + // 4J Stu - Fix for #12368 - Crash: Game crashes when saving then exiting and selecting to save + for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { +#ifdef _XBOX + app.TutorialSceneNavigateBack(idx,true); +#endif + + // 4J Stu - Fix for #13257 - CRASH: Gameplay: Title crashed after exiting the tutorial + // It doesn't matter if they were in the tutorial already + pMinecraft->playerLeftTutorial( idx ); + } + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CMinecraftApp::SignoutExitWorldThreadProc; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->iPad=DEFAULT_XUI_MENU_USER; + completionData->type = e_ProgressCompletion_NavigateToHomeMenu; + loadingParams->completionData = completionData; + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); + } + } + break; + case eAppAction_PrimaryPlayerSignedOutReturned_Menus: + SetAction(i,eAppAction_Idle); + // set the state back to pre-game + ProfileManager.ResetProfileProcessState(); + // clear the save device + StorageManager.SetSaveDeviceSelected(i,false); + + ui.UpdatePlayerBasePositions(); + // there are multiple layers in the help menu, so a navigate back isn't enough + ui.NavigateToHomeMenu(); + + break; + case eAppAction_EthernetDisconnectedReturned_Menus: + SetAction(i,eAppAction_Idle); + // set the state back to pre-game + ProfileManager.ResetProfileProcessState(); + + ui.UpdatePlayerBasePositions(); + + // there are multiple layers in the help menu, so a navigate back isn't enough + ui.NavigateToHomeMenu(); + + break; + + case eAppAction_TrialOver: + { + SetAction(i,eAppAction_Idle); + UINT uiIDA[2]; + uiIDA[0]=IDS_UNLOCK_TITLE; + uiIDA[1]=IDS_EXIT_GAME; + + ui.RequestMessageBox(IDS_TRIALOVER_TITLE, IDS_TRIALOVER_TEXT, uiIDA, 2, i,&CMinecraftApp::TrialOverReturned,this,app.GetStringTable()); + } + break; + + // INVITES + case eAppAction_DashboardTrialJoinFromInvite: + { + TelemetryManager->RecordUpsellPresented(i, eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID); + + SetAction(i,eAppAction_Idle); + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + ui.RequestMessageBox(IDS_UNLOCK_TITLE, IDS_UNLOCK_ACCEPT_INVITE, uiIDA, 2, i,&CMinecraftApp::UnlockFullInviteReturned,this,app.GetStringTable()); + } + break; + case eAppAction_ExitAndJoinFromInvite: + { + UINT uiIDA[3]; + + SetAction(i,eAppAction_Idle); + // Check the player really wants to do this + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + // Show save option is saves ARE disabled + if(ProfileManager.IsFullVersion() && StorageManager.GetSaveDisabled() && i==ProfileManager.GetPrimaryPad() && g_NetworkManager.IsHost() && GetGameStarted() ) + { + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_EXIT_GAME_SAVE; + uiIDA[2]=IDS_EXIT_GAME_NO_SAVE; + + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_LEAVE_VIA_INVITE, uiIDA, 3, i,&CMinecraftApp::ExitAndJoinFromInviteSaveDialogReturned,this, app.GetStringTable(), 0, 0, false); + } + else +#else + if(ProfileManager.IsFullVersion() && !StorageManager.GetSaveDisabled() && i==ProfileManager.GetPrimaryPad() && g_NetworkManager.IsHost() && GetGameStarted() ) + { + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_EXIT_GAME_SAVE; + uiIDA[2]=IDS_EXIT_GAME_NO_SAVE; + + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_LEAVE_VIA_INVITE, uiIDA, 3, i,&CMinecraftApp::ExitAndJoinFromInviteSaveDialogReturned,this, app.GetStringTable(), 0, 0, false); + } + else +#endif + { + if(!ProfileManager.IsFullVersion()) + { + TelemetryManager->RecordUpsellPresented(i, eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID); + + // upsell + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + ui.RequestMessageBox(IDS_UNLOCK_TITLE, IDS_UNLOCK_ACCEPT_INVITE, uiIDA, 2, i,&CMinecraftApp::UnlockFullInviteReturned,this,app.GetStringTable()); + } + else + { + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_LEAVE_VIA_INVITE, uiIDA, 2,i,&CMinecraftApp::ExitAndJoinFromInvite,this,app.GetStringTable(), 0, 0, false); + } + } + } + break; + case eAppAction_ExitAndJoinFromInviteConfirmed: + { + SetAction(i,eAppAction_Idle); + + pMinecraft->gui->clearMessages(); + + // turn off the gamertags in splitscreen for the primary player, since they are about to be made fullscreen + ui.HideAllGameUIElements(); + + // Stop app running + SetGameStarted(false); + + ui.CloseAllPlayersScenes(); + + // 4J Stu - Fix for #12368 - Crash: Game crashes when saving then exiting and selecting to save + for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { +#ifdef _XBOX + app.TutorialSceneNavigateBack(idx,true); +#endif + + // 4J Stu - Fix for #13257 - CRASH: Gameplay: Title crashed after exiting the tutorial + // It doesn't matter if they were in the tutorial already + pMinecraft->playerLeftTutorial( idx ); + } + + // 4J-PB - may have been using a texture pack with audio , so clean up anything texture pack related here + + // unload any texture pack audio + // if there is audio in use, clear out the audio, and unmount the pack + TexturePack *pTexPack=Minecraft::GetInstance()->skins->getSelected(); + DLCTexturePack *pDLCTexPack=NULL; + + if(pTexPack->hasAudio()) + { + // get the dlc texture pack, and store it + pDLCTexPack=(DLCTexturePack *)pTexPack; + } + + // change to the default texture pack + pMinecraft->skins->selectTexturePackById(TexturePackRepository::DEFAULT_TEXTURE_PACK_ID); + + if(pTexPack->hasAudio()) + { + // need to stop the streaming audio - by playing streaming audio from the default texture pack now + // reset the streaming sounds back to the normal ones +#ifndef _XBOX + pMinecraft->soundEngine->SetStreamingSounds(eStream_Overworld_Calm1,eStream_Overworld_piano3, + eStream_Nether1,eStream_Nether4, + eStream_end_dragon,eStream_end_end, + eStream_CD_1); +#endif + pMinecraft->soundEngine->playStreaming(L"", 0, 0, 0, 1, 1); + +#ifdef _XBOX + if(pDLCTexPack->m_pStreamedWaveBank!=NULL) + { + pDLCTexPack->m_pStreamedWaveBank->Destroy(); + } + if(pDLCTexPack->m_pSoundBank!=NULL) + { + pDLCTexPack->m_pSoundBank->Destroy(); + } +#endif +#ifdef _DURANGO + DWORD result = StorageManager.UnmountInstalledDLC(L"TPACK"); +#else + DWORD result = StorageManager.UnmountInstalledDLC("TPACK"); +#endif + app.DebugPrintf("Unmount result is %d\n",result); + } + +#ifdef _XBOX_ONE + // 4J Stu - It's possible that we can sign in/remove players between the mask initially being set and this point + m_InviteData.dwLocalUsersMask = 0; + for(unsigned int index = 0; index < XUSER_MAX_COUNT; ++index) + { + if(ProfileManager.IsSignedIn(index) ) + { + if(index==i || pMinecraft->localplayers[index]!=NULL ) + { + m_InviteData.dwLocalUsersMask |= g_NetworkManager.GetLocalPlayerMask( index ); + } + } + } +#endif + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::ExitAndJoinFromInviteThreadProc; + loadingParams->lpParam = (LPVOID)&m_InviteData; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->iPad=DEFAULT_XUI_MENU_USER; + completionData->type = e_ProgressCompletion_NoAction; + loadingParams->completionData = completionData; + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); + } + + break; + case eAppAction_JoinFromInvite: + { + SetAction(i,eAppAction_Idle); + + // 4J Stu - Move this state block from CPlatformNetworkManager::ExitAndJoinFromInviteThreadProc, as g_NetworkManager.JoinGameFromInviteInfo ultimately can call NavigateToScene, + /// and we should only be calling that from the main thread + app.SetTutorialMode( false ); + + g_NetworkManager.SetLocalGame(false); + + JoinFromInviteData *inviteData = (JoinFromInviteData *)param; + // 4J-PB - clear any previous connection errors + Minecraft::GetInstance()->clearConnectionFailed(); + + app.DebugPrintf( "Changing Primary Pad on an invite accept - pad was %d, and is now %d\n", ProfileManager.GetPrimaryPad(), inviteData->dwUserIndex ); + ProfileManager.SetLockedProfile(inviteData->dwUserIndex); + ProfileManager.SetPrimaryPad(inviteData->dwUserIndex); + +#ifdef _XBOX_ONE + // 4J Stu - If a player is signed in (i.e. locked) but not in the mask, unlock them + for(unsigned int index = 0; index < XUSER_MAX_COUNT; ++index) + { + if( index != inviteData->dwUserIndex && ProfileManager.IsSignedIn(index) ) + { + if( (m_InviteData.dwLocalUsersMask & g_NetworkManager.GetLocalPlayerMask( index ) ) == 0 ) + { + ProfileManager.RemoveGamepadFromGame(index); + } + } + } +#endif + + // change the minecraft player name + Minecraft::GetInstance()->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); + + bool success = g_NetworkManager.JoinGameFromInviteInfo( + inviteData->dwUserIndex, // dwUserIndex + inviteData->dwLocalUsersMask, // dwUserMask + inviteData->pInviteInfo ); // pInviteInfo + + if( !success ) + { + app.DebugPrintf( "Failed joining game from invite\n" ); + //return hr; + + // 4J Stu - Copied this from XUI_FullScreenProgress to properly handle the fail case, as the thread will no longer be failing + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox( IDS_CONNECTION_FAILED, IDS_CONNECTION_LOST_SERVER, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + + ui.NavigateToHomeMenu(); + ui.UpdatePlayerBasePositions(); + } + } + break; + case eAppAction_ChangeSessionType: + { + // If we are not in gameplay yet, then wait until the server is setup before changing the session type + if( g_NetworkManager.IsInGameplay() ) + { + // This kicks off a thread that waits for the server to end, then closes the current session, starts a new one and joins the local players into it + + SetAction(i,eAppAction_Idle); + + if( !GetChangingSessionType() && !g_NetworkManager.IsLocalGame() ) + { + SetGameStarted(false); + SetChangingSessionType(true); + SetReallyChangingSessionType(true); + + // turn off the gamertags in splitscreen for the primary player, since they are about to be made fullscreen + ui.HideAllGameUIElements(); + + if( !ui.IsSceneInStack( ProfileManager.GetPrimaryPad(), eUIScene_EndPoem ) ) + { + ui.CloseAllPlayersScenes(); + } + ui.ShowOtherPlayersBaseScene(ProfileManager.GetPrimaryPad(), true); + + // Remove this line to fix: + // #49084 - TU5: Code: Gameplay: The title crashes every time client navigates to 'Play game' menu and loads/creates new game after a "Connection to Xbox LIVE was lost" message has appeared. + //app.NavigateToScene(0,eUIScene_Main); + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::ChangeSessionTypeThreadProc; + loadingParams->lpParam = NULL; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); +#ifdef __PS3__ + completionData->bRequiresUserAction=FALSE; +#else + completionData->bRequiresUserAction=TRUE; +#endif + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->iPad=DEFAULT_XUI_MENU_USER; + if( ui.IsSceneInStack( ProfileManager.GetPrimaryPad(), eUIScene_EndPoem ) ) + { + completionData->type = e_ProgressCompletion_NavigateBackToScene; + completionData->scene = eUIScene_EndPoem; + } + else + { + completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; + } + loadingParams->completionData = completionData; + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); + } + } + else if( g_NetworkManager.IsLeavingGame() ) + { + // If we are leaving the game, then ignore the state change + SetAction(i,eAppAction_Idle); + } +#if 0 + // 4J-HG - Took this out since ChangeSessionType is only set in two places (both in EthernetDisconnected) and this case is handled there, plus this breaks + // this if statements original purpose (to allow us to wait for IsInGameplay before actioning switching to offline + + // QNet must do this kind of thing automatically by itself, but on PS3 at least, we need the disconnection to definitely end up with us out of the game one way or another, + // and the other two cases above don't catch the case where we are just starting the game and get a disconnection during the loading/creation + else + { + if( g_NetworkManager.IsInSession() ) + { + g_NetworkManager._LeaveGame(); + } + } +#endif + } + break; + case eAppAction_SetDefaultOptions: + SetAction(i,eAppAction_Idle); +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) + SetDefaultOptions((C4JStorage::PROFILESETTINGS *)param,i); +#else + SetDefaultOptions((C_4JProfile::PROFILESETTINGS *)param,i); +#endif + + // if the profile data has been changed, then force a profile write + // It seems we're allowed to break the 5 minute rule if it's the result of a user action + CheckGameSettingsChanged(true,i); + + break; + + case eAppAction_RemoteServerSave: + { + // If the remote server save has already finished, don't complete the action + if (GetGameStarted()) + { + SetAction(ProfileManager.GetPrimaryPad(), eAppAction_Idle); + break; + } + + SetAction(i,eAppAction_WaitRemoteServerSaveComplete); + + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + ui.CloseUIScenes(i, true); + } + + // turn off the gamertags in splitscreen for the primary player, since they are about to be made fullscreen + ui.HideAllGameUIElements(); + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CMinecraftApp::RemoteSaveThreadProc; + loadingParams->lpParam = NULL; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bRequiresUserAction=FALSE; + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->iPad=DEFAULT_XUI_MENU_USER; + if( ui.IsSceneInStack( ProfileManager.GetPrimaryPad(), eUIScene_EndPoem ) ) + { + completionData->type = e_ProgressCompletion_NavigateBackToScene; + completionData->scene = eUIScene_EndPoem; + } + else + { + completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; + } + loadingParams->completionData = completionData; + + loadingParams->cancelFunc = &CMinecraftApp::ExitGameFromRemoteSave; + loadingParams->cancelText = IDS_TOOLTIPS_EXIT; + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); + } + break; + case eAppAction_WaitRemoteServerSaveComplete: + // Do nothing + break; + case eAppAction_FailedToJoinNoPrivileges: + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + if(result != C4JStorage::EMessage_Busy) SetAction(i,eAppAction_Idle); + } + break; + case eAppAction_ProfileReadError: + // Return player to the main menu - code largely copied from that for handling + // eAppAction_PrimaryPlayerSignedOut, although I don't think we should have got as + // far as needing to halt the server, or running the game, before returning to the menu + if(!app.GetGameStarted()) MinecraftServer::HaltServer(true); + + if( g_NetworkManager.IsInSession() ) + { + app.SetAction(i,eAppAction_PrimaryPlayerSignedOutReturned); + } + else + { + app.SetAction(i,eAppAction_PrimaryPlayerSignedOutReturned_Menus); + MinecraftServer::resetFlags(); + } + break; + + case eAppAction_BanLevel: + { + // It's possible that this state can get set after the game has been exited (e.g. by network disconnection) so we can't ban the level at that point + if(g_NetworkManager.IsInGameplay() && !g_NetworkManager.IsLeavingGame()) + { + TelemetryManager->RecordBanLevel(i); + +#if defined _XBOX + INetworkPlayer *pHost=g_NetworkManager.GetHostPlayer(); + // write the level to the banned level list, and exit the world + AddLevelToBannedLevelList(i,((NetworkPlayerXbox *)pHost)->GetUID(),GetUniqueMapName(),true); +#elif defined _XBOX_ONE + INetworkPlayer *pHost=g_NetworkManager.GetHostPlayer(); + AddLevelToBannedLevelList(i,pHost->GetUID(),GetUniqueMapName(),true); +#endif + // primary player would exit the world, secondary would exit the player + if(ProfileManager.GetPrimaryPad()==i) + { + SetAction(i,eAppAction_ExitWorld); + } + else + { + SetAction(i,eAppAction_ExitPlayer); + } + } + } + break; + case eAppAction_LevelInBanLevelList: + { + UINT uiIDA[2]; + uiIDA[0]=IDS_BUTTON_REMOVE_FROM_BAN_LIST; + uiIDA[1]=IDS_EXIT_GAME; + + // pass in the gamertag format string + WCHAR wchFormat[40]; + INetworkPlayer *player = g_NetworkManager.GetLocalPlayerByUserIndex(i); + + // If not the primary player, but the primary player has banned this level and decided not to unban + // then we may have left the game by now + if(player) + { + swprintf(wchFormat, 40, L"%ls\n\n%%ls",player->GetOnlineName()); + + C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_BANNED_LEVEL_TITLE, IDS_PLAYER_BANNED_LEVEL, uiIDA,2,i,&CMinecraftApp::BannedLevelDialogReturned,this, app.GetStringTable(),wchFormat); + if(result != C4JStorage::EMessage_Busy) SetAction(i,eAppAction_Idle); + } + else + { + SetAction(i,eAppAction_Idle); + } + } + break; + case eAppAction_DebugText: + // launch the xui for text entry + { +#ifdef _XBOX + CScene_TextEntry::XuiTextInputParams *pDebugTextParams= new CScene_TextEntry::XuiTextInputParams; + pDebugTextParams->iPad=i; + pDebugTextParams->wch=(WCHAR)param; + + app.NavigateToScene(i,eUIScene_TextEntry,pDebugTextParams); +#endif + SetAction(i,eAppAction_Idle); + } + break; + + case eAppAction_ReloadTexturePack: + { + SetAction(i,eAppAction_Idle); + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->textures->reloadAll(); + pMinecraft->skins->updateUI(); + + if(!pMinecraft->skins->isUsingDefaultSkin()) + { + TexturePack *pTexturePack = pMinecraft->skins->getSelected(); + + DLCPack *pDLCPack=pTexturePack->getDLCPack(); + + bool purchased = false; + // do we have a license? + if(pDLCPack && pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) + { + purchased = true; + } +#ifdef _XBOX + TelemetryManager->RecordTexturePackLoaded(i, pTexturePack->getId(), purchased?1:0); +#endif + } + + // 4J-PB - If the texture pack has audio, we need to switch to this + if(pMinecraft->skins->getSelected()->hasAudio()) + { + Minecraft::GetInstance()->soundEngine->playStreaming(L"", 0, 0, 0, 1, 1); + } + } + + break; + + case eAppAction_TexturePackRequired: + { +#ifdef _XBOX + ULONGLONG ullOfferID_Full; + app.GetDLCFullOfferIDForPackID(app.GetRequiredTexturePackID(),&ullOfferID_Full); + + TelemetryManager->RecordUpsellPresented(ProfileManager.GetPrimaryPad(), eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); +#endif + UINT uiIDA[2]; + + uiIDA[0]=IDS_TEXTUREPACK_FULLVERSION; + uiIDA[1]=IDS_TEXTURE_PACK_TRIALVERSION; + + // Give the player a warning about the texture pack missing + ui.RequestMessageBox(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::TexturePackDialogReturned,this,app.GetStringTable()); + SetAction(i,eAppAction_Idle); + } + + break; + } + } + + // Any TMS actions? + + eTMS = app.GetTMSAction(i); + + if(eTMS!=eTMSAction_Idle) + { + switch(eTMS) + { + // TMS++ actions + case eTMSAction_TMSPP_RetrieveFiles_CreateLoad_SignInReturned: + case eTMSAction_TMSPP_RetrieveFiles_RunPlayGame: +#ifdef _XBOX + app.TMSPP_SetTitleGroupID(GROUP_ID); + SetTMSAction(i,eTMSAction_TMSPP_GlobalFileList); +#elif defined _XBOX_ONE + SetTMSAction(i,eTMSAction_TMSPP_GlobalFileList_Waiting); + app.TMSPP_RetrieveFileList(i,C4JStorage::eGlobalStorage_Title,eTMSAction_TMSPP_UserFileList); +#else + SetTMSAction(i,eTMSAction_TMSPP_UserFileList); + #endif + break; + +#ifdef _XBOX + case eTMSAction_TMSPP_GlobalFileList: + SetTMSAction(i,eTMSAction_TMSPP_GlobalFileList_Waiting); + app.TMSPP_RetrieveFileList(i,C4JStorage::eGlobalStorage_Title,"\\",eTMSAction_TMSPP_UserFileList); + break; +#endif + case eTMSAction_TMSPP_UserFileList: + // retrieve the file list first +#if defined _XBOX + SetTMSAction(i,eTMSAction_TMSPP_UserFileList_Waiting); + app.TMSPP_RetrieveFileList(i,C4JStorage::eGlobalStorage_TitleUser,"\\",eTMSAction_TMSPP_XUIDSFile); +#elif defined _XBOX_ONE + SetTMSAction(i,eTMSAction_TMSPP_UserFileList_Waiting); + app.TMSPP_RetrieveFileList(i,C4JStorage::eGlobalStorage_TitleUser,eTMSAction_TMSPP_DLCFile); +#else + SetTMSAction(i,eTMSAction_TMSPP_XUIDSFile); +#endif + break; + case eTMSAction_TMSPP_XUIDSFile: +#ifdef _XBOX + SetTMSAction(i,eTMSAction_TMSPP_XUIDSFile_Waiting); + // pass in the next app action on the call or callback completing + app.TMSPP_ReadXuidsFile(i,eTMSAction_TMSPP_DLCFile); +#else + SetTMSAction(i,eTMSAction_TMSPP_DLCFile); +#endif + + break; + case eTMSAction_TMSPP_DLCFile: +#if defined _XBOX || defined _XBOX_ONE + SetTMSAction(i,eTMSAction_TMSPP_DLCFile_Waiting); + // pass in the next app action on the call or callback completing + app.TMSPP_ReadDLCFile(i,eTMSAction_TMSPP_BannedListFile); +#else + SetTMSAction(i,eTMSAction_TMSPP_BannedListFile); +#endif + break; + case eTMSAction_TMSPP_BannedListFile: + // If we have one in TMSPP, then we can assume we can ignore TMS +#if defined _XBOX + SetTMSAction(i,eTMSAction_TMSPP_BannedListFile_Waiting); + // pass in the next app action on the call or callback completing + if(app.TMSPP_ReadBannedList(i,eTMSAction_TMS_RetrieveFiles_Complete)==false) + { + // we don't have a banned list in TMSPP, so we should check TMS + app.ReadBannedList(i, eTMSAction_TMS_RetrieveFiles_Complete,true); + } +#elif defined _XBOX_ONE + SetTMSAction(i,eTMSAction_TMSPP_BannedListFile_Waiting); + // pass in the next app action on the call or callback completing + app.TMSPP_ReadBannedList(i,eTMSAction_TMS_RetrieveFiles_Complete); + +#else + SetTMSAction(i,eTMSAction_TMS_RetrieveFiles_Complete); +#endif + break; + + // SPECIAL CASE - where the user goes directly in to Help & Options from the main menu + case eTMSAction_TMSPP_RetrieveFiles_HelpAndOptions: + case eTMSAction_TMSPP_RetrieveFiles_DLCMain: + // retrieve the file list first +#if defined _XBOX + // pass in the next app action on the call or callback completing + SetTMSAction(i,eTMSAction_TMSPP_XUIDSFile_Waiting); + app.TMSPP_RetrieveFileList(i,C4JStorage::eGlobalStorage_Title,"\\",eTMSAction_TMSPP_DLCFileOnly); +#elif defined _XBOX_ONE + SetTMSAction(i,eTMSAction_TMSPP_GlobalFileList_Waiting); + app.TMSPP_RetrieveFileList(i,C4JStorage::eGlobalStorage_Title,eTMSAction_TMSPP_RetrieveUserFilelist_DLCFileOnly); +#else + SetTMSAction(i,eTMSAction_TMSPP_DLCFileOnly); +#endif + break; + case eTMSAction_TMSPP_RetrieveUserFilelist_DLCFileOnly: +#if defined _XBOX + SetTMSAction(i,eTMSAction_TMSPP_UserFileList_Waiting); + app.TMSPP_RetrieveFileList(i,C4JStorage::eGlobalStorage_TitleUser,"\\",eTMSAction_TMSPP_XUIDSFile); +#elif defined _XBOX_ONE + //StorageManager.TMSPP_DeleteFile(i,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,L"TP06.png",NULL,NULL, 0); + SetTMSAction(i,eTMSAction_TMSPP_UserFileList_Waiting); + app.TMSPP_RetrieveFileList(i,C4JStorage::eGlobalStorage_TitleUser,eTMSAction_TMSPP_DLCFileOnly); +#else + SetTMSAction(i,eTMSAction_TMSPP_DLCFileOnly); +#endif + + break; + + case eTMSAction_TMSPP_DLCFileOnly: +#if defined _XBOX || defined _XBOX_ONE + SetTMSAction(i,eTMSAction_TMSPP_DLCFile_Waiting); + // pass in the next app action on the call or callback completing + app.TMSPP_ReadDLCFile(i,eTMSAction_TMSPP_RetrieveFiles_Complete); +#else + SetTMSAction(i,eTMSAction_TMSPP_RetrieveFiles_Complete); +#endif + break; + + + case eTMSAction_TMSPP_RetrieveFiles_Complete: + SetTMSAction(i,eTMSAction_Idle); + break; + + + // TMS files +/* case eTMSAction_TMS_RetrieveFiles_CreateLoad_SignInReturned: + case eTMSAction_TMS_RetrieveFiles_RunPlayGame: +#ifdef _XBOX + SetTMSAction(i,eTMSAction_TMS_XUIDSFile_Waiting); + // pass in the next app action on the call or callback completing + app.ReadXuidsFileFromTMS(i,eTMSAction_TMS_DLCFile,true); +#else + SetTMSAction(i,eTMSAction_TMS_DLCFile); +#endif + break; + + case eTMSAction_TMS_DLCFile: +#ifdef _XBOX + SetTMSAction(i,eTMSAction_TMS_DLCFile_Waiting); + // pass in the next app action on the call or callback completing + app.ReadDLCFileFromTMS(i,eTMSAction_TMS_BannedListFile,true); +#else + SetTMSAction(i,eTMSAction_TMS_BannedListFile); +#endif + + break; + + case eTMSAction_TMS_RetrieveFiles_HelpAndOptions: + case eTMSAction_TMS_RetrieveFiles_DLCMain: +#ifdef _XBOX + SetTMSAction(i,eTMSAction_TMS_DLCFile_Waiting); + // pass in the next app action on the call or callback completing + app.ReadDLCFileFromTMS(i,eTMSAction_Idle,true); +#else + SetTMSAction(i,eTMSAction_Idle); +#endif + + break; + case eTMSAction_TMS_BannedListFile: +#ifdef _XBOX + SetTMSAction(i,eTMSAction_TMS_BannedListFile_Waiting); + // pass in the next app action on the call or callback completing + app.ReadBannedList(i, eTMSAction_TMS_RetrieveFiles_Complete,true); +#else + SetTMSAction(i,eTMSAction_TMS_RetrieveFiles_Complete); +#endif + + break; + + */ + case eTMSAction_TMS_RetrieveFiles_Complete: + SetTMSAction(i,eTMSAction_Idle); + // if(StorageManager.SetSaveDevice(&CScene_Main::DeviceSelectReturned,pClass)) + // { + // // save device already selected + // // ensure we've applied this player's settings + // app.ApplyGameSettingsChanged(ProfileManager.GetPrimaryPad()); + // app.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_MultiGameJoinLoad); + // } + break; + } + } + + } +} + +int CMinecraftApp::BannedLevelDialogReturned(void *pParam,int iPad,const C4JStorage::EMessageResult result) +{ + CMinecraftApp* pApp = (CMinecraftApp*)pParam; + //Minecraft *pMinecraft=Minecraft::GetInstance(); + + if(result==C4JStorage::EMessage_ResultAccept) + { +#if defined _XBOX || defined _XBOX_ONE + INetworkPlayer *pHost = g_NetworkManager.GetHostPlayer(); + // unban the level + if (pHost != NULL) + { +#if defined _XBOX + pApp->RemoveLevelFromBannedLevelList(iPad,((NetworkPlayerXbox *)pHost)->GetUID(),pApp->GetUniqueMapName()); +#else + pApp->RemoveLevelFromBannedLevelList(iPad,pHost->GetUID(),pApp->GetUniqueMapName()); +#endif + } +#endif + } + else + { + if( iPad == ProfileManager.GetPrimaryPad() ) + { + pApp->SetAction(iPad,eAppAction_ExitWorld); + } + else + { + pApp->SetAction(iPad,eAppAction_ExitPlayer); + } + } + + return 0; +} + +void CMinecraftApp::loadMediaArchive() +{ + wstring mediapath = L""; + +#ifdef __PS3__ + mediapath = L"Common\\Media\\MediaPS3.arc"; +#elif _WINDOWS64 + mediapath = L"Common\\Media\\MediaWindows64.arc"; +#elif __ORBIS__ + mediapath = L"Common\\Media\\MediaOrbis.arc"; +#elif _DURANGO + mediapath = L"Common\\Media\\MediaDurango.arc"; +#elif __PSVITA__ + mediapath = L"Common\\Media\\MediaPSVita.arc"; +#endif + + if (!mediapath.empty()) + { + m_mediaArchive = new ArchiveFile( File(mediapath) ); + } +#if 0 + string path = "Common\\media.arc"; + HANDLE hFile = CreateFile( path.c_str(), + GENERIC_READ, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_FLAG_SEQUENTIAL_SCAN, + NULL ); + + if( hFile != INVALID_HANDLE_VALUE ) + { + File fileHelper(convStringToWstring(path)); + DWORD dwFileSize = fileHelper.length(); + + // Initialize memory. + PBYTE m_fBody = new BYTE[ dwFileSize ]; + ZeroMemory(m_fBody, dwFileSize); + + DWORD m_fSize = 0; + BOOL hr = ReadFile( hFile, + m_fBody, + dwFileSize, + &m_fSize, + NULL ); + + assert( m_fSize == dwFileSize ); + + CloseHandle( hFile ); + + m_mediaArchive = new ArchiveFile(m_fBody, m_fSize); + } + else + { + assert( false ); + // AHHHHHHHHHHHH + m_mediaArchive = NULL; + } +#endif +} + +void CMinecraftApp::loadStringTable() +{ +#ifndef _XBOX + + if(m_stringTable!=NULL) + { + // we need to unload the current string table, this is a reload + delete m_stringTable; + } + wstring localisationFile = L"languages.loc"; + if (m_mediaArchive->hasFile(localisationFile)) + { + byteArray locFile = m_mediaArchive->getFile(localisationFile); + m_stringTable = new StringTable(locFile.data, locFile.length); + delete locFile.data; + } + else + { + m_stringTable = NULL; + assert(false); + // AHHHHHHHHH. + } +#endif +} + +int CMinecraftApp::PrimaryPlayerSignedOutReturned(void *pParam,int iPad,const C4JStorage::EMessageResult) +{ + //CMinecraftApp* pApp = (CMinecraftApp*)pParam; + //Minecraft *pMinecraft=Minecraft::GetInstance(); + + // if the player is null, we're in the menus + //if(Minecraft::GetInstance()->player!=NULL) + + // We always create a session before kicking of any of the game code, so even though we may still be joining/creating a game + // at this point we want to handle it differently from just being in a menu + if( g_NetworkManager.IsInSession() ) + { + app.SetAction(iPad,eAppAction_PrimaryPlayerSignedOutReturned); + } + else + { + app.SetAction(iPad,eAppAction_PrimaryPlayerSignedOutReturned_Menus); + } + return 0; +} + +int CMinecraftApp::EthernetDisconnectReturned(void *pParam,int iPad,const C4JStorage::EMessageResult) +{ + //CMinecraftApp* pApp = (CMinecraftApp*)pParam; + Minecraft *pMinecraft=Minecraft::GetInstance(); + + // if the player is null, we're in the menus + if(Minecraft::GetInstance()->player!=NULL) + { + app.SetAction(pMinecraft->player->GetXboxPad(),eAppAction_EthernetDisconnectedReturned); + } + else + { + // 4J-PB - turn off the PSN store icon just in case this happened when we were in one of the DLC menus +#ifdef __ORBIS__ + sceNpCommerceHidePsStoreIcon(); +#elif defined __PSVITA__ + sceNpCommerce2HidePsStoreIcon(); +#endif + app.SetAction(iPad,eAppAction_EthernetDisconnectedReturned_Menus); + } + return 0; +} + +int CMinecraftApp::SignoutExitWorldThreadProc( void* lpParameter ) +{ + + // Share AABB & Vec3 pools with default (main thread) - should be ok as long as we don't tick the main thread whilst this thread is running + AABB::UseDefaultThreadStorage(); + Vec3::UseDefaultThreadStorage(); + Compression::UseDefaultThreadStorage(); + + //app.SetGameStarted(false); + + Minecraft *pMinecraft=Minecraft::GetInstance(); + + int exitReasonStringId = -1; + + bool saveStats = false; + if (pMinecraft->isClientSide() || g_NetworkManager.IsInSession() ) + { + if(lpParameter != NULL ) + { + switch( app.GetDisconnectReason() ) + { + case DisconnectPacket::eDisconnect_Kicked: + exitReasonStringId = IDS_DISCONNECTED_KICKED; + break; + case DisconnectPacket::eDisconnect_NoUGC_AllLocal: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL; + break; + case DisconnectPacket::eDisconnect_NoUGC_Single_Local: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL; + break; +#ifdef _XBOX + case DisconnectPacket::eDisconnect_NoUGC_Remote: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_REMOTE; + break; +#endif + case DisconnectPacket::eDisconnect_NoFlying: + exitReasonStringId = IDS_DISCONNECTED_FLYING; + break; + case DisconnectPacket::eDisconnect_OutdatedServer: + exitReasonStringId = IDS_DISCONNECTED_SERVER_OLD; + break; + case DisconnectPacket::eDisconnect_OutdatedClient: + exitReasonStringId = IDS_DISCONNECTED_CLIENT_OLD; + break; + default: + exitReasonStringId = IDS_DISCONNECTED; + } + pMinecraft->progressRenderer->progressStartNoAbort( exitReasonStringId ); + // 4J - Force a disconnection, this handles the situation that the server has already disconnected + if( pMinecraft->levels[0] != NULL ) pMinecraft->levels[0]->disconnect(false); + if( pMinecraft->levels[1] != NULL ) pMinecraft->levels[1]->disconnect(false); + } + else + { + exitReasonStringId = IDS_EXITING_GAME; + pMinecraft->progressRenderer->progressStartNoAbort( IDS_EXITING_GAME ); + + if( pMinecraft->levels[0] != NULL ) pMinecraft->levels[0]->disconnect(); + if( pMinecraft->levels[1] != NULL ) pMinecraft->levels[1]->disconnect(); + } + + // 4J Stu - This only does something if we actually have a server, so don't need to do any other checks + MinecraftServer::HaltServer(true); + + // We need to call the stats & leaderboards save before we exit the session + //pMinecraft->forceStatsSave(); + saveStats = false; + + // 4J Stu - Leave the session once the disconnect packet has been sent + g_NetworkManager.LeaveGame(FALSE); + } + else + { + if(lpParameter != NULL ) + { + switch( app.GetDisconnectReason() ) + { + case DisconnectPacket::eDisconnect_Kicked: + exitReasonStringId = IDS_DISCONNECTED_KICKED; + break; + case DisconnectPacket::eDisconnect_NoUGC_AllLocal: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL; + break; + case DisconnectPacket::eDisconnect_NoUGC_Single_Local: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL; + break; +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + case DisconnectPacket::eDisconnect_ContentRestricted_AllLocal: + exitReasonStringId = IDS_CONTENT_RESTRICTION_MULTIPLAYER; + break; + case DisconnectPacket::eDisconnect_ContentRestricted_Single_Local: + exitReasonStringId = IDS_CONTENT_RESTRICTION; + break; +#endif +#ifdef _XBOX + case DisconnectPacket::eDisconnect_NoUGC_Remote: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_REMOTE; + break; +#endif + case DisconnectPacket::eDisconnect_OutdatedServer: + exitReasonStringId = IDS_DISCONNECTED_SERVER_OLD; + break; + case DisconnectPacket::eDisconnect_OutdatedClient: + exitReasonStringId = IDS_DISCONNECTED_CLIENT_OLD; + default: + exitReasonStringId = IDS_DISCONNECTED; + } + pMinecraft->progressRenderer->progressStartNoAbort( exitReasonStringId ); + } + } + pMinecraft->setLevel(NULL,exitReasonStringId,nullptr,saveStats,true); + + // 4J-JEV: Fix for #106402 - TCR #014 BAS Debug Output: + // TU12: Mass Effect Mash-UP: Save file "Default_DisplayName" is created on all storage devices after signing out from a re-launched pre-generated world + app.m_gameRules.unloadCurrentGameRules(); // + + MinecraftServer::resetFlags(); + + // We can't start/join a new game until the session is destroyed, so wait for it to be idle again + while( g_NetworkManager.IsInSession() ) + { + Sleep(1); + } + + return S_OK; +} + +int CMinecraftApp::UnlockFullInviteReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + //CMinecraftApp* pApp = (CMinecraftApp*)pParam; + Minecraft *pMinecraft=Minecraft::GetInstance(); + bool bNoPlayer; + + // bug 11285 - TCR 001: BAS Game Stability: CRASH - When trying to join a full version game with a trial version, the trial crashes + // 4J-PB - we may be in the main menus here, and we don't have a pMinecraft->player + + if(pMinecraft->player==NULL) + { + bNoPlayer=true; + } + + if(result==C4JStorage::EMessage_ResultAccept) + { + if(ProfileManager.IsSignedInLive(iPad)) + { + // 4J-PB - need to check this user can access the store +#if defined(__PS3__) || defined(__PSVITA__) + bool bContentRestricted; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),true,NULL,&bContentRestricted,NULL); + if(bContentRestricted) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,&app, app.GetStringTable()); + } + else +#endif + { + ProfileManager.DisplayFullVersionPurchase(false,iPad,eSen_UpsellID_Full_Version_Of_Game); + } + } +#if defined(__PS3__) + else + { + // you're not signed in to PSN! + UINT uiIDA[2]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::MustSignInFullVersionPurchaseReturned,&app, app.GetStringTable()); + + } +#endif + } + else + { + TelemetryManager->RecordUpsellResponded(iPad, eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID, eSen_UpsellOutcome_Declined); + } + + return 0; +} + +int CMinecraftApp::UnlockFullSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + //CMinecraftApp* pApp = (CMinecraftApp*)pParam; + Minecraft *pMinecraft=Minecraft::GetInstance(); + + if(result==C4JStorage::EMessage_ResultAccept) + { + if(ProfileManager.IsSignedInLive(pMinecraft->player->GetXboxPad())) + { + // 4J-PB - need to check this user can access the store +#if defined(__PS3__) || defined(__PSVITA__) + bool bContentRestricted; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),true,NULL,&bContentRestricted,NULL); + if(bContentRestricted) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,&app, app.GetStringTable()); + } + else +#endif + { + ProfileManager.DisplayFullVersionPurchase(false,pMinecraft->player->GetXboxPad(),eSen_UpsellID_Full_Version_Of_Game); + } + } +#if defined(__PS3__) + else + { + // you're not signed in to PSN! + UINT uiIDA[2]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::MustSignInFullVersionPurchaseReturned,&app, app.GetStringTable()); + } +#elif defined(__ORBIS__) + else + { + // Determine why they're not "signed in live" + if (ProfileManager.isSignedInPSN(iPad)) + { + // Signed in to PSN but not connected (no internet access) + assert(!ProfileManager.isConnectedToPSN(iPad)); + + UINT uiIDA[1]; + uiIDA[0] = IDS_OK; + ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + } + else + { + // Not signed in to PSN + UINT uiIDA[1]; + uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; + ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, iPad, &CMinecraftApp::MustSignInFullVersionPurchaseReturned,&app, app.GetStringTable(), NULL, 0, false); + } + } +#endif + } + else + { + TelemetryManager->RecordUpsellResponded(iPad, eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID, eSen_UpsellOutcome_Declined); + } + + return 0; +} + +int CMinecraftApp::UnlockFullExitReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + CMinecraftApp* pApp = (CMinecraftApp*)pParam; + Minecraft *pMinecraft=Minecraft::GetInstance(); + + if(result==C4JStorage::EMessage_ResultAccept) + { + if(ProfileManager.IsSignedInLive(pMinecraft->player->GetXboxPad())) + { + // 4J-PB - need to check this user can access the store +#if defined(__PS3__) || defined(__PSVITA__) + bool bContentRestricted; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),true,NULL,&bContentRestricted,NULL); + if(bContentRestricted) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,&app, app.GetStringTable()); + } + else +#endif + { + ProfileManager.DisplayFullVersionPurchase(false,pMinecraft->player->GetXboxPad(),eSen_UpsellID_Full_Version_Of_Game); +#if defined __ORBIS__ || defined __PS3__ || defined __PSVITA__ + // still need to exit the trial or we'll be in the Pause menu with input ignored + pApp->SetAction(pMinecraft->player->GetXboxPad(),eAppAction_ExitWorldTrial); +#endif + } + } +#if defined(__PS3__) || defined __PSVITA__ + else + { + // you're not signed in to PSN! + UINT uiIDA[2]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::MustSignInFullVersionPurchaseReturnedExitTrial,&app, app.GetStringTable()); + } +#elif defined(__ORBIS__) + else + { + // Determine why they're not "signed in live" + if (ProfileManager.isSignedInPSN(iPad)) + { + // Signed in to PSN but not connected (no internet access) + assert(!ProfileManager.isConnectedToPSN(iPad)); + + UINT uiIDA[1]; + uiIDA[0] = IDS_OK; + ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + // still need to exit the trial or we'll be in the Pause menu with input ignored + pApp->SetAction(pMinecraft->player->GetXboxPad(),eAppAction_ExitWorldTrial); + } + else + { + // Not signed in to PSN + UINT uiIDA[1]; + uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; + ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, iPad, &CMinecraftApp::MustSignInFullVersionPurchaseReturnedExitTrial,&app, app.GetStringTable(), NULL, 0, false); + } + } +#endif + } + else + { + TelemetryManager->RecordUpsellResponded(iPad, eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID, eSen_UpsellOutcome_Declined); + pApp->SetAction(pMinecraft->player->GetXboxPad(),eAppAction_ExitWorldTrial); + } + + return 0; +} + +int CMinecraftApp::TrialOverReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + CMinecraftApp* pApp = (CMinecraftApp*)pParam; + Minecraft *pMinecraft=Minecraft::GetInstance(); + + if(result==C4JStorage::EMessage_ResultAccept) + { + // we need a signed in user for the unlock + if(ProfileManager.IsSignedInLive(pMinecraft->player->GetXboxPad())) + { + // 4J-PB - need to check this user can access the store +#if defined(__PS3__) || defined(__PSVITA__) + bool bContentRestricted; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),true,NULL,&bContentRestricted,NULL); + if(bContentRestricted) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,&app, app.GetStringTable()); + } + else +#endif + { + ProfileManager.DisplayFullVersionPurchase(false,pMinecraft->player->GetXboxPad(),eSen_UpsellID_Full_Version_Of_Game); + } + } + else + { +#if defined(__PS3__) + + // you're not signed in to PSN! + UINT uiIDA[2]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::MustSignInFullVersionPurchaseReturned,&app, app.GetStringTable()); + + // 4J Stu - We can't actually exit the game, so just exit back to the main menu + //pApp->SetAction(pMinecraft->player->GetXboxPad(),eAppAction_ExitWorldTrial); +#else + pApp->SetAction(pMinecraft->player->GetXboxPad(),eAppAction_ExitTrial); +#endif + } + } + else + { + TelemetryManager->RecordUpsellResponded(iPad, eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID, eSen_UpsellOutcome_Declined); + +#if defined(__PS3__) || defined(__ORBIS__) + // 4J Stu - We can't actually exit the game, so just exit back to the main menu + pApp->SetAction(pMinecraft->player->GetXboxPad(),eAppAction_ExitWorldTrial); +#else + pApp->SetAction(pMinecraft->player->GetXboxPad(),eAppAction_ExitTrial); +#endif + } + + return 0; +} + +void CMinecraftApp::ProfileReadErrorCallback(void *pParam) +{ + CMinecraftApp *pApp=(CMinecraftApp *)pParam; + int iPrimaryPlayer=ProfileManager.GetPrimaryPad(); + pApp->SetAction(iPrimaryPlayer, eAppAction_ProfileReadError); +} + +void CMinecraftApp::ClearSignInChangeUsersMask() +{ + // 4J-PB - When in the main menu, the user is on pad 0, and any change they make to their profile will be to pad 0 data + // If they then go in as a secondary player to a splitscreen game, their profile will not be read again on pad 1 if they were previously in a splitscreen game + // This is because m_uiLastSignInData remembers they were in previously, and doesn't read the profile data for them again + // Fix this by resetting the m_uiLastSignInData on pressing play game for secondary users. The Primary user does a read profile on play game anyway + int iPrimaryPlayer=ProfileManager.GetPrimaryPad(); + + if(m_uiLastSignInData!=0) + { + if(iPrimaryPlayer>=0) + { + m_uiLastSignInData=1<user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); +#endif + + CMinecraftApp *pApp=(CMinecraftApp *)pParam; + // check if the primary player signed out + int iPrimaryPlayer=ProfileManager.GetPrimaryPad(); + + if((ProfileManager.GetLockedProfile()!=-1) && iPrimaryPlayer!=-1) + { + if ( ((uiSignInData & (1<SetAction(iPrimaryPlayer,eAppAction_PrimaryPlayerSignedOut); + + // 4J-PB - invalidate their banned level list + pApp->InvalidateBannedList(iPrimaryPlayer); + + // need to ditch any DLCOffers info + StorageManager.ClearDLCOffers(); + pApp->ClearAndResetDLCDownloadQueue(); + pApp->ClearDLCInstalled(); + } + else + { + unsigned int uiChangedPlayers = uiSignInData ^ m_uiLastSignInData; + + if( g_NetworkManager.IsInSession() ) + { + bool hasGuestIdChanged = false; + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + DWORD guestNumber = 0; + if(ProfileManager.IsSignedIn(i)) + { + XUSER_SIGNIN_INFO info; + XUserGetSigninInfo(i,XUSER_GET_SIGNIN_INFO_OFFLINE_XUID_ONLY ,&info); + pApp->DebugPrintf("Player at index %d has guest number %d\n", i,info.dwGuestNumber ); + guestNumber = info.dwGuestNumber; + } + if( pApp->m_currentSigninInfo[i].dwGuestNumber != 0 && guestNumber != 0 && pApp->m_currentSigninInfo[i].dwGuestNumber != guestNumber ) + { + hasGuestIdChanged = true; + } + } + + if( hasGuestIdChanged ) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_GUEST_ORDER_CHANGED_TITLE, IDS_GUEST_ORDER_CHANGED_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,NULL,app.GetStringTable()); + } + + // 4J Stu - On PS4 we can also cause to exit players if they are signed out here, but we shouldn't do that if + // we are going to switch to an offline game as it will likely crash due to incompatible parallel processes + bool switchToOffline = false; + // If it's an online game, and the primary profile is no longer signed into LIVE then we act as if disconnected + if( !ProfileManager.IsSignedInLive( ProfileManager.GetLockedProfile() ) && !g_NetworkManager.IsLocalGame() ) + { + switchToOffline = true; + } + + //printf("Old: %x, New: %x, Changed: %x\n", m_ulLastSignInData, ulSignInData, changedPlayers); + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + // Primary player shouldn't be subjected to these checks, and shouldn't call ExitPlayer + if(i == iPrimaryPlayer) continue; + + // A guest a signed in or out, out of order which invalidates all the guest players we have in the game + if(hasGuestIdChanged && pApp->m_currentSigninInfo[i].dwGuestNumber != 0 && g_NetworkManager.GetLocalPlayerByUserIndex(i)!=NULL) + { + pApp->DebugPrintf("Recommending removal of player at index %d because their guest id changed\n",i); + pApp->SetAction(i,eAppAction_ExitPlayer); + } + else + { + XUSER_SIGNIN_INFO info; + XUserGetSigninInfo(i,XUSER_GET_SIGNIN_INFO_OFFLINE_XUID_ONLY ,&info); + // 4J Stu - Also need to detect the case where the sign in mask is the same, but the player has swapped users (eg still signed in but xuid different) + // Fix for #48451 - TU5: Code: UI: Splitscreen: Title crashes when switching to a profile previously signed out via splitscreen profile selection + + // 4J-PB - compiler complained about if below ('&&' within '||') - making it easier to read + bool bPlayerChanged=(uiChangedPlayers&(1<m_currentSigninInfo[i].xuid, info.xuid) ) )) + { + // 4J-PB - invalidate their banned level list + pApp->DebugPrintf("Player at index %d Left - invalidating their banned list\n",i); + pApp->InvalidateBannedList(i); + + if(g_NetworkManager.GetLocalPlayerByUserIndex(i)!=NULL) + { + pApp->DebugPrintf("Player %d signed out\n", i); + pApp->SetAction(i,eAppAction_ExitPlayer); + } + } + } +#ifdef __ORBIS__ + // check if any of the addition players have signed out of PSN (primary player is handled below) + if(!switchToOffline && i != ProfileManager.GetLockedProfile() && !g_NetworkManager.IsLocalGame()) + { + if(g_NetworkManager.GetLocalPlayerByUserIndex(i)!=NULL) + { + if(ProfileManager.IsSignedInLive(i) == false) + { + pApp->DebugPrintf("Recommending removal of player at index %d because they're no longer signed into PSNd\n",i); + pApp->SetAction(i,eAppAction_ExitPlayer); + } + } + } +#endif + } + + // If it's an online game, and the primary profile is no longer signed into LIVE then we act as if disconnected + if( switchToOffline ) + { + pApp->SetAction(iPrimaryPlayer,eAppAction_EthernetDisconnected); + } + + + g_NetworkManager.HandleSignInChange(); + } + // Some menus require the player to be signed in to live, so if this callback happens and the primary player is + // no longer signed in then nav back + else if ( pApp->GetLiveLinkRequired() && !ProfileManager.IsSignedInLive( ProfileManager.GetLockedProfile() ) ) + { + pApp->SetAction(iPrimaryPlayer,eAppAction_EthernetDisconnected); + } + +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__ ) + // 4J-JEV: Need to kick of loading of profile data for sub-sign in players. + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if( i != iPrimaryPlayer + && ( uiChangedPlayers & (1<InvalidateBannedList(iPrimaryPlayer); + + // need to ditch any DLCOffers info + StorageManager.ClearDLCOffers(); + pApp->ClearAndResetDLCDownloadQueue(); + pApp->ClearDLCInstalled(); + + } + + // Update the guest numbers to the current state + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if(FAILED(XUserGetSigninInfo(i,XUSER_GET_SIGNIN_INFO_OFFLINE_XUID_ONLY,&pApp->m_currentSigninInfo[i]))) + { + pApp->m_currentSigninInfo[i].xuid = INVALID_XUID; + pApp->m_currentSigninInfo[i].dwGuestNumber = 0; + } + app.DebugPrintf("Player at index %d has guest number %d\n", i,pApp->m_currentSigninInfo[i].dwGuestNumber ); + } +} + +void CMinecraftApp::NotificationsCallback(LPVOID pParam,DWORD dwNotification, unsigned int uiParam) +{ + CMinecraftApp* pClass = (CMinecraftApp*)pParam; + + // push these on to the notifications to be handled in qnet's dowork + + PNOTIFICATION pNotification = new NOTIFICATION; + + pNotification->dwNotification=dwNotification; + pNotification->uiParam=uiParam; + + switch( dwNotification ) + { + case XN_SYS_SIGNINCHANGED: + { + pClass->DebugPrintf("Signing changed - %d\n", uiParam ); + } + break; + case XN_SYS_INPUTDEVICESCHANGED: + if(app.GetGameStarted() && g_NetworkManager.IsInSession()) + { + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if(!InputManager.IsPadConnected(i) && + Minecraft::GetInstance()->localplayers[i] != NULL && + !ui.IsPauseMenuDisplayed(i) && !ui.IsSceneInStack(i, eUIScene_EndPoem) ) + { + ui.CloseUIScenes(i); + ui.NavigateToScene(i,eUIScene_PauseMenu); + } + } + } + break; + case XN_LIVE_CONTENT_INSTALLED: + // Need to inform xuis that we've possibly had DLC installed + { + //app.m_dlcManager.SetNeedsUpdated(true); + // Clear the DLC installed flag to cause a GetDLC to run if it's called + app.ClearDLCInstalled(); + + ui.HandleDLCInstalled(ProfileManager.GetPrimaryPad()); + } + break; + case XN_SYS_STORAGEDEVICESCHANGED: + { +#ifdef _XBOX + // If the devices have changed, and we've got a dlc pack with audio selected, and that pack's content device is no longer valid... then pull the plug on + // audio streaming, as if we leave this until later xact gets locked up attempting to destroy the streamed wave bank. + TexturePack *pTexPack=Minecraft::GetInstance()->skins->getSelected(); + if(pTexPack->hasAudio()) + { + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)pTexPack; + XCONTENTDEVICEID deviceID = pDLCTexPack->GetDLCDeviceID(); + if( XContentGetDeviceState( deviceID, NULL ) != ERROR_SUCCESS ) + { + // Set texture pack flag so that it is now considered as not having audio - this is critical so that the next playStreaming does what it is meant to do, + // and also so that we don't try and unmount this again, or play any sounds from it in the future + pTexPack->setHasAudio(false); + // need to stop the streaming audio - by playing streaming audio from the default texture pack now + Minecraft::GetInstance()->soundEngine->playStreaming(L"", 0, 0, 0, 0, 0); + + if(pDLCTexPack->m_pStreamedWaveBank!=NULL) + { + pDLCTexPack->m_pStreamedWaveBank->Destroy(); + } + if(pDLCTexPack->m_pSoundBank!=NULL) + { + pDLCTexPack->m_pSoundBank->Destroy(); + } + DWORD result = StorageManager.UnmountInstalledDLC("TPACK"); + app.DebugPrintf("Unmount result is %d\n",result); + } + } +#endif + } + break; + } + + pClass->m_vNotifications.push_back(pNotification); +} + +#if defined __PS3__ || defined __PSVITA__ || defined __ORBIS__ +int CMinecraftApp::MustSignInFullVersionPurchaseReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + if(result==C4JStorage::EMessage_ResultAccept) + { +#ifdef __PS3__ + SQRNetworkManager_PS3::AttemptPSNSignIn(&CMinecraftApp::NowDisplayFullVersionPurchase, &app,true); +#elif defined __PSVITA__ + SQRNetworkManager_Vita::AttemptPSNSignIn(&CMinecraftApp::NowDisplayFullVersionPurchase, &app,true); +#else // __PS4__ + SQRNetworkManager_Orbis::AttemptPSNSignIn(&CMinecraftApp::NowDisplayFullVersionPurchase, &app,true); +#endif + } + + return 0; +} + +#if defined __PS3__ || defined __PSVITA__ || defined __ORBIS__ +int CMinecraftApp::MustSignInFullVersionPurchaseReturnedExitTrial(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + if(result==C4JStorage::EMessage_ResultAccept) + { +#ifdef __PS3__ + SQRNetworkManager_PS3::AttemptPSNSignIn(&CMinecraftApp::NowDisplayFullVersionPurchase, &app,true); +#elif defined __PSVITA__ + SQRNetworkManager_Vita::AttemptPSNSignIn(&CMinecraftApp::NowDisplayFullVersionPurchase, &app,true); +#else // __PS4__ + SQRNetworkManager_Orbis::AttemptPSNSignIn(&CMinecraftApp::NowDisplayFullVersionPurchase, &app,true); +#endif + } + + //4J-PB - we need to exit the trial, or we'll be in the pause menu with ignore input true + app.SetAction(iPad,eAppAction_ExitWorldTrial); + + return 0; +} +#endif + +int CMinecraftApp::NowDisplayFullVersionPurchase(void *pParam, bool bContinue, int iPad) +{ + app.m_bDisplayFullVersionPurchase=true; + return 0; +} +#endif +void CMinecraftApp::UpsellReturnedCallback(LPVOID pParam, eUpsellType type, eUpsellResponse result, int iUserData) +{ + ESen_UpsellID senType; + ESen_UpsellOutcome senResponse; +#ifdef __PS3__ + UINT uiIDA[2]; +#endif + + // Map the eUpsellResponse to the enum we use for sentient + switch(result) + { + case eUpsellResponse_Accepted_NoPurchase: + senResponse = eSen_UpsellOutcome_Went_To_Guide; + break; + case eUpsellResponse_Accepted_Purchase: + senResponse = eSen_UpsellOutcome_Accepted; + break; +#ifdef __PS3__ + // special case for people who are not signed in to the PSN while playing the trial game + case eUpsellResponse_UserNotSignedInPSN: + + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::MustSignInFullVersionPurchaseReturned,&app, app.GetStringTable()); + + return; + + case eUpsellResponse_NotAllowedOnline: // On earning a trophy in the trial version, where the user is underage and can't go online to buy the game, but they selected to buy the game on the trophy upsell + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,&app, app.GetStringTable()); + break; +#endif + case eUpsellResponse_Declined: + default: + senResponse = eSen_UpsellOutcome_Declined; + break; + }; + + // Map the eUpsellType to the enum we use for sentient + switch(type) + { + case eUpsellType_Custom: + senType = eSen_UpsellID_Full_Version_Of_Game; + break; + default: + senType = eSen_UpsellID_Undefined; + break; + }; + + // Always the primary pad that gets an upsell + TelemetryManager->RecordUpsellResponded(ProfileManager.GetPrimaryPad(), eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID, senResponse); +} + +void CMinecraftApp::SetDebugSequence(const char *pchSeq) +{ + InputManager.SetDebugSequence(pchSeq,&CMinecraftApp::DebugInputCallback,this); +} +int CMinecraftApp::DebugInputCallback(LPVOID pParam) +{ + CMinecraftApp* pClass = (CMinecraftApp*)pParam; + //printf("sequence matched\n"); + pClass->m_bDebugOptions=!pClass->m_bDebugOptions; + + for(int i=0;ilocalplayers[i] != NULL) + { + iPlayerC++; + } + } + + return iPlayerC; +} + +int CMinecraftApp::MarketplaceCountsCallback(LPVOID pParam,C4JStorage::DLC_TMS_DETAILS *pTMSDetails, int iPad) +{ + app.DebugPrintf("Marketplace Counts= New - %d Total - %d\n",pTMSDetails->dwNewOffers,pTMSDetails->dwTotalOffers); + + if(pTMSDetails->dwNewOffers>0) + { + app.m_bNewDLCAvailable=true; + app.m_bSeenNewDLCTip=false; + } + else + { + app.m_bNewDLCAvailable=false; + app.m_bSeenNewDLCTip=true; + } + + return 0; +} + +bool CMinecraftApp::StartInstallDLCProcess(int iPad) +{ + app.DebugPrintf("--- CMinecraftApp::StartInstallDLCProcess: pad=%i.\n", iPad); + + // If there is already a call to this in progress, then do nothing + // If the app says dlc is installed, then there has been no new system message to tell us there's new DLC since the last call to StartInstallDLCProcess + if((app.DLCInstallProcessCompleted()==false) && (m_bDLCInstallPending==false)) + { + app.m_dlcManager.resetUnnamedCorruptCount(); + m_bDLCInstallPending = true; + m_iTotalDLC = 0; + m_iTotalDLCInstalled = 0; + app.DebugPrintf("--- CMinecraftApp::StartInstallDLCProcess - StorageManager.GetInstalledDLC\n"); + + StorageManager.GetInstalledDLC(iPad,&CMinecraftApp::DLCInstalledCallback,this); + return true; + } + else + { + app.DebugPrintf("--- CMinecraftApp::StartInstallDLCProcess - nothing to do\n"); + + return false; + } + +} + +// Installed DLC callback +int CMinecraftApp::DLCInstalledCallback(LPVOID pParam,int iInstalledC,int iPad) +{ + app.DebugPrintf("--- CMinecraftApp::DLCInstalledCallback: totalDLC=%i, pad=%i.\n", iInstalledC, iPad); + app.m_iTotalDLC = iInstalledC; + app.MountNextDLC(iPad); + return 0; +} + +void CMinecraftApp::MountNextDLC(int iPad) +{ + app.DebugPrintf("--- CMinecraftApp::MountNextDLC: pad=%i.\n", iPad); + if(m_iTotalDLCInstalled < m_iTotalDLC) + { + // Mount it + // We also need to match the ones the user wants to mount with the installed DLC + // We're supposed to use a generic save game as a cache of these to do this, with XUSER_ANY + + if(StorageManager.MountInstalledDLC(iPad,m_iTotalDLCInstalled,&CMinecraftApp::DLCMountedCallback,this)!=ERROR_IO_PENDING ) + { + // corrupt DLC + app.DebugPrintf("Failed to mount DLC %d for pad %d\n",m_iTotalDLCInstalled,iPad); + ++m_iTotalDLCInstalled; + app.MountNextDLC(iPad); + } + else + { + app.DebugPrintf("StorageManager.MountInstalledDLC ok\n"); + } + } + else + { + /* Removed - now loading these on demand instead of as each pack is mounted + if(m_iTotalDLCInstalled > 0) + { + Minecraft *pMinecraft=Minecraft::GetInstance(); + pMinecraft->levelRenderer->AddDLCSkinsToMemTextures(); + } + */ + + m_bDLCInstallPending = false; + m_bDLCInstallProcessCompleted=true; + + ui.HandleDLCMountingComplete(); + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + // Check if the current texture pack is now installed + if(!Minecraft::GetInstance()->skins->isUsingDefaultSkin()) + { + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + DLCPack *pParentPack=pDLCTexPack->getDLCInfoParentPack();//tPack->getDLCPack(); + + if(pParentPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) + { + StorageManager.SetSaveDisabled(false); + } + } +#endif + } +} + +// 4J-JEV: For the sake of clarity in DLCMountedCallback. +#if defined(_XBOX) || defined(__PS3__) || defined(_WINDOWS64) +#define CONTENT_DATA_DISPLAY_NAME(a) (a.szDisplayName) +#else +#define CONTENT_DATA_DISPLAY_NAME(a) (a.wszDisplayName) +#endif + +int CMinecraftApp::DLCMountedCallback(LPVOID pParam,int iPad,DWORD dwErr,DWORD dwLicenceMask) +{ +#if defined(_XBOX) || defined(_DURANGO) || defined(__PS3__) || defined(__ORBIS__) || defined(_WINDOWS64) || defined (__PSVITA__) //Chris TODO + app.DebugPrintf("--- CMinecraftApp::DLCMountedCallback\n"); + + if(dwErr!=ERROR_SUCCESS) + { + // corrupt DLC + app.DebugPrintf("Failed to mount DLC for pad %d: %d\n",iPad,dwErr); + app.m_dlcManager.incrementUnnamedCorruptCount(); + } + else + { + XCONTENT_DATA ContentData = StorageManager.GetDLC(app.m_iTotalDLCInstalled); + + DLCPack *pack = app.m_dlcManager.getPack( CONTENT_DATA_DISPLAY_NAME(ContentData) ); + + if( pack != NULL && pack->IsCorrupt() ) + { + app.DebugPrintf("Pack '%ls' is corrupt, removing it from the DLC Manager.\n", CONTENT_DATA_DISPLAY_NAME(ContentData)); + + app.m_dlcManager.removePack(pack); + pack = NULL; + } + + if(pack == NULL) + { + app.DebugPrintf("Pack \"%ls\" is not installed, so adding it\n", CONTENT_DATA_DISPLAY_NAME(ContentData)); + +#if defined(_XBOX) || defined(__PS3__) || defined(_WINDOWS64) + pack = new DLCPack(ContentData.szDisplayName,dwLicenceMask); +#elif defined _XBOX_ONE + pack = new DLCPack(ContentData.wszDisplayName,ContentData.wszProductID,dwLicenceMask); +#else + pack = new DLCPack(ContentData.wszDisplayName,dwLicenceMask); +#endif + pack->SetDLCMountIndex(app.m_iTotalDLCInstalled); + pack->SetDLCDeviceID(ContentData.DeviceID); + app.m_dlcManager.addPack(pack); + + app.HandleDLC(pack); + + if(pack->getDLCItemsCount(DLCManager::e_DLCType_Texture) > 0) + { + Minecraft::GetInstance()->skins->addTexturePackFromDLC(pack, pack->GetPackId() ); + } + } + else + { + app.DebugPrintf("Pack \"%ls\" is already installed. Updating license to %d\n", CONTENT_DATA_DISPLAY_NAME(ContentData), dwLicenceMask); + + pack->SetDLCMountIndex(app.m_iTotalDLCInstalled); + pack->SetDLCDeviceID(ContentData.DeviceID); + pack->updateLicenseMask(dwLicenceMask); + } + + StorageManager.UnmountInstalledDLC(); + } + ++app.m_iTotalDLCInstalled; + app.MountNextDLC(iPad); + +#endif // __PSVITA__ + return 0; +} +#undef CONTENT_DATA_DISPLAY_NAME + +// void CMinecraftApp::InstallDefaultCape() +// { +// if(!m_bDefaultCapeInstallAttempted) +// { +// // we only attempt to install the cape once per launch of the game +// m_bDefaultCapeInstallAttempted=true; +// +// wstring wTemp=L"Default_Cape.png"; +// bool bRes=app.IsFileInMemoryTextures(wTemp); +// // if the file is not already in the memory textures, then read it from TMS +// if(!bRes) +// { +// BYTE *pBuffer=NULL; +// DWORD dwSize=0; +// // 4J-PB - out for now for DaveK so he doesn't get the birthday cape +// #ifdef _CONTENT_PACKAGE +// C4JStorage::ETMSStatus eTMSStatus; +// eTMSStatus=StorageManager.ReadTMSFile(ProfileManager.GetPrimaryPad(),C4JStorage::eGlobalStorage_Title,C4JStorage::eTMS_FileType_Graphic, L"Default_Cape.png",&pBuffer, &dwSize); +// if(eTMSStatus==C4JStorage::ETMSStatus_Idle) +// { +// app.AddMemoryTextureFile(wTemp,pBuffer,dwSize); +// } +// #endif +// } +// } +// } + + void CMinecraftApp::HandleDLC(DLCPack *pack) + { + DWORD dwFilesProcessed = 0; +#ifndef _XBOX +#if defined(__PS3__) || defined(__ORBIS__) || defined(_WINDOWS64) || defined (__PSVITA__) + std::vector dlcFilenames; +#elif defined _DURANGO + std::vector dlcFilenames; +#endif + StorageManager.GetMountedDLCFileList("DLCDrive", dlcFilenames); + for(int i=0; ieXuid==eXUID_Deadmau5) + { + return true; + } + } + + return false; +} + +void CMinecraftApp::AddMemoryTextureFile(const wstring &wName,PBYTE pbData,DWORD dwBytes) +{ + EnterCriticalSection(&csMemFilesLock); + // check it's not already in + PMEMDATA pData=NULL; + AUTO_VAR(it, m_MEM_Files.find(wName)); + if(it != m_MEM_Files.end()) + { +#ifndef _CONTENT_PACKAGE + wprintf(L"Incrementing the memory texture file count for %ls\n", wName.c_str()); +#endif + pData = (*it).second; + + if(pData->dwBytes == 0 && dwBytes != 0) + { + // This should never be NULL if dwBytes is 0 + if(pData->pbData!=NULL) delete [] pData->pbData; + + pData->pbData=pbData; + pData->dwBytes=dwBytes; + } + + ++pData->ucRefCount; + LeaveCriticalSection(&csMemFilesLock); + return; + } + +#ifndef _CONTENT_PACKAGE + //wprintf(L"Adding the memory texture file data for %ls\n", wName.c_str()); +#endif + // this is a texture (png) file + + // add this texture to the list of memory texture files - it will then be picked up by the level renderer's AddEntity + + pData = (PMEMDATA)new BYTE[sizeof(MEMDATA)]; + ZeroMemory( pData, sizeof(MEMDATA) ); + pData->pbData=pbData; + pData->dwBytes=dwBytes; + pData->ucRefCount = 1; + + // use the xuid to access the skin data + m_MEM_Files[wName]=pData; + + LeaveCriticalSection(&csMemFilesLock); +} + +void CMinecraftApp::RemoveMemoryTextureFile(const wstring &wName) +{ + EnterCriticalSection(&csMemFilesLock); + + AUTO_VAR(it, m_MEM_Files.find(wName)); + if(it != m_MEM_Files.end()) + { +#ifndef _CONTENT_PACKAGE + wprintf(L"Decrementing the memory texture file count for %ls\n", wName.c_str()); +#endif + PMEMDATA pData = (*it).second; + --pData->ucRefCount; + if(pData->ucRefCount <= 0) + { +#ifndef _CONTENT_PACKAGE + wprintf(L"Erasing the memory texture file data for %ls\n", wName.c_str()); +#endif + delete [] pData; + m_MEM_Files.erase(wName); + } + } + LeaveCriticalSection(&csMemFilesLock); +} + +bool CMinecraftApp::DefaultCapeExists() +{ + wstring wTex=L"Special_Cape.png"; + bool val = false; + + EnterCriticalSection(&csMemFilesLock); + AUTO_VAR(it, m_MEM_Files.find(wTex)); + if(it != m_MEM_Files.end()) val = true; + LeaveCriticalSection(&csMemFilesLock); + + return val; +} + +bool CMinecraftApp::IsFileInMemoryTextures(const wstring &wName) +{ + bool val = false; + + EnterCriticalSection(&csMemFilesLock); + AUTO_VAR(it, m_MEM_Files.find(wName)); + if(it != m_MEM_Files.end()) val = true; + LeaveCriticalSection(&csMemFilesLock); + + return val; +} + +void CMinecraftApp::GetMemFileDetails(const wstring &wName,PBYTE *ppbData,DWORD *pdwBytes) +{ + EnterCriticalSection(&csMemFilesLock); + AUTO_VAR(it, m_MEM_Files.find(wName)); + if(it != m_MEM_Files.end()) + { + PMEMDATA pData = (*it).second; + *ppbData=pData->pbData; + *pdwBytes=pData->dwBytes; + } + LeaveCriticalSection(&csMemFilesLock); +} + +void CMinecraftApp::AddMemoryTPDFile(int iConfig,PBYTE pbData,DWORD dwBytes) +{ + EnterCriticalSection(&csMemTPDLock); + // check it's not already in + PMEMDATA pData=NULL; + AUTO_VAR(it, m_MEM_TPD.find(iConfig)); + if(it == m_MEM_TPD.end()) + { + pData = (PMEMDATA)new BYTE[sizeof(MEMDATA)]; + ZeroMemory( pData, sizeof(MEMDATA) ); + pData->pbData=pbData; + pData->dwBytes=dwBytes; + pData->ucRefCount = 1; + + m_MEM_TPD[iConfig]=pData; + } + + LeaveCriticalSection(&csMemTPDLock); +} + +void CMinecraftApp::RemoveMemoryTPDFile(int iConfig) +{ + EnterCriticalSection(&csMemTPDLock); + // check it's not already in + PMEMDATA pData=NULL; + AUTO_VAR(it, m_MEM_TPD.find(iConfig)); + if(it != m_MEM_TPD.end()) + { + pData=m_MEM_TPD[iConfig]; + delete [] pData; + m_MEM_TPD.erase(iConfig); + } + + LeaveCriticalSection(&csMemTPDLock); +} + +#ifdef _XBOX +int CMinecraftApp::GetTPConfigVal(WCHAR *pwchDataFile) +{ + DLC_INFO *pDLCInfo=NULL; + // run through the DLC info to find the right texture pack/mash-up pack + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); + + if(wcscmp(pwchDataFile,pDLCInfo->wchDataFile)==0) + { + return pDLCInfo->iConfig; + } + } + + return -1; +} +#elif defined _XBOX_ONE +int CMinecraftApp::GetTPConfigVal(WCHAR *pwchDataFile) +{ + DLC_INFO *pDLCInfo=NULL; + // run through the DLC info to find the right texture pack/mash-up pack + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + pDLCInfo=app.GetDLCInfoForFullOfferID((WCHAR *)app.GetDLCInfoTexturesFullOffer(i).c_str()); + + if(wcscmp(pwchDataFile,pDLCInfo->wchDataFile)==0) + { + return pDLCInfo->iConfig; + } + } + + return -1; +} +#elif defined _WINDOWS64 +int CMinecraftApp::GetTPConfigVal(WCHAR *pwchDataFile) +{ + return -1; +} +#endif +bool CMinecraftApp::IsFileInTPD(int iConfig) +{ + bool val = false; + + EnterCriticalSection(&csMemTPDLock); + AUTO_VAR(it, m_MEM_TPD.find(iConfig)); + if(it != m_MEM_TPD.end()) val = true; + LeaveCriticalSection(&csMemTPDLock); + + return val; +} + +void CMinecraftApp::GetTPD(int iConfig,PBYTE *ppbData,DWORD *pdwBytes) +{ + EnterCriticalSection(&csMemTPDLock); + AUTO_VAR(it, m_MEM_TPD.find(iConfig)); + if(it != m_MEM_TPD.end()) + { + PMEMDATA pData = (*it).second; + *ppbData=pData->pbData; + *pdwBytes=pData->dwBytes; + } + LeaveCriticalSection(&csMemTPDLock); +} + + +// bool CMinecraftApp::UploadFileToGlobalStorage(int iQuadrant, C4JStorage::eGlobalStorage eStorageFacility, wstring *wsFile ) +// { +// bool bRes=false; +// #ifndef _CONTENT_PACKAGE +// // read the local file +// File gtsFile( wsFile->c_str() ); +// +// __int64 fileSize = gtsFile.length(); +// +// if(fileSize!=0) +// { +// FileInputStream fis(gtsFile); +// byteArray ba((int)fileSize); +// fis.read(ba); +// fis.close(); +// +// bRes=StorageManager.WriteTMSFile(iQuadrant,eStorageFacility,(WCHAR *)wsFile->c_str(),ba.data, ba.length); +// +// } +// #endif +// return bRes; +// } + + + + + + +void CMinecraftApp::StoreLaunchData() +{ + +} + +void CMinecraftApp::ExitGame() +{ +} + +// Invites + +void CMinecraftApp::ProcessInvite(DWORD dwUserIndex, DWORD dwLocalUsersMask, const INVITE_INFO * pInviteInfo) +{ + m_InviteData.dwUserIndex=dwUserIndex; + m_InviteData.dwLocalUsersMask=dwLocalUsersMask; + m_InviteData.pInviteInfo=pInviteInfo; + //memcpy(&m_InviteData,pJoinData,sizeof(JoinFromInviteData)); + SetAction(dwUserIndex,eAppAction_ExitAndJoinFromInvite); +} + +int CMinecraftApp::ExitAndJoinFromInvite(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + CMinecraftApp* pApp = (CMinecraftApp*)pParam; + //Minecraft *pMinecraft=Minecraft::GetInstance(); + + // buttons are swapped on this menu + if(result==C4JStorage::EMessage_ResultDecline) + { + pApp->SetAction(iPad,eAppAction_ExitAndJoinFromInviteConfirmed); + } + + return 0; +} + +int CMinecraftApp::ExitAndJoinFromInviteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + CMinecraftApp *pClass = (CMinecraftApp *)pParam; + // Exit with or without saving + // Decline means save in this dialog + if(result==C4JStorage::EMessage_ResultDecline || result==C4JStorage::EMessage_ResultThirdOption) + { + if( result==C4JStorage::EMessage_ResultDecline ) // Save + { + // Check they have the full texture pack if they are using one + // 4J-PB - Is the player trying to save but they are using a trial texturepack ? + if(!Minecraft::GetInstance()->skins->isUsingDefaultSkin()) + { + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + + DLCPack * pDLCPack=tPack->getDLCPack(); + if(!pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) + { + // upsell + // get the dlc texture pack + +#ifdef _XBOX + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + ULONGLONG ullOfferID_Full; + app.GetDLCFullOfferIDForPackID(pDLCTexPack->getDLCParentPackId(),&ullOfferID_Full); + + // tell sentient about the upsell of the full version of the skin pack + TelemetryManager->RecordUpsellPresented(iPad, eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); +#endif + + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + // Give the player a warning about the trial version of the texture pack + ui.RequestMessageBox(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, iPad,&CMinecraftApp::WarningTrialTexturePackReturned,pClass,app.GetStringTable()); + + return S_OK; + } + } +#ifndef _XBOX_ONE + // does the save exist? + bool bSaveExists; + StorageManager.DoesSaveExist(&bSaveExists); + // 4J-PB - we check if the save exists inside the libs + // we need to ask if they are sure they want to overwrite the existing game + if(bSaveExists) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::ExitAndJoinFromInviteAndSaveReturned,pClass, app.GetStringTable()); + return 0; + } + else +#endif + { +#if defined(_XBOX_ONE) || defined(__ORBIS__) + StorageManager.SetSaveDisabled(false); +#endif + MinecraftServer::getInstance()->setSaveOnExit( true ); + } + } + else + { + // been a few requests for a confirm on exit without saving + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_TITLE_DECLINE_SAVE_GAME, IDS_CONFIRM_DECLINE_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::ExitAndJoinFromInviteDeclineSaveReturned,pClass, app.GetStringTable()); + return 0; + } + + app.SetAction(ProfileManager.GetPrimaryPad(),eAppAction_ExitAndJoinFromInviteConfirmed); + } + return 0; +} + +int CMinecraftApp::WarningTrialTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ +#ifdef _XBOX + + CMinecraftApp* pClass = (CMinecraftApp*)pParam; + + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + // get the dlc texture pack + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + ULONGLONG ullIndexA[1]; + + // Need to get the parent packs id, since this may be one of many child packs with their own ids + app.GetDLCFullOfferIDForPackID(pDLCTexPack->getDLCParentPackId(),&ullIndexA[0]); + + if(result==C4JStorage::EMessage_ResultAccept) + { + if(ProfileManager.IsSignedIn(iPad)) + { + // need to allow downloads here, or the player would need to quit the game to let the download of a texture pack happen. This might affect the network traffic, since the download could take all the bandwidth... + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); + + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + } + } + else + { + TelemetryManager->RecordUpsellResponded(iPad, eSet_UpsellID_Texture_DLC, ( ullIndexA[0] & 0xFFFFFFFF ), eSen_UpsellOutcome_Declined); + } +#endif + return 0; +} + +int CMinecraftApp::ExitAndJoinFromInviteAndSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + //CMinecraftApp* pClass = (CMinecraftApp*)pParam; + + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { + INT saveOrCheckpointId = 0; + + // Check they have the full texture pack if they are using one + // 4J-PB - Is the player trying to save but they are using a trial texturepack ? + if(!Minecraft::GetInstance()->skins->isUsingDefaultSkin()) + { + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + + DLCPack * pDLCPack=tPack->getDLCPack(); + if(!pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) + { + // upsell + // get the dlc texture pack + +#ifdef _XBOX + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + ULONGLONG ullOfferID_Full; + app.GetDLCFullOfferIDForPackID(pDLCTexPack->getDLCParentPackId(),&ullOfferID_Full); + + // tell sentient about the upsell of the full version of the skin pack + TelemetryManager->RecordUpsellPresented(iPad, eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); +#endif + + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + // Give the player a warning about the trial version of the texture pack + ui.RequestMessageBox(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, iPad,&CMinecraftApp::WarningTrialTexturePackReturned,NULL,app.GetStringTable()); + + return S_OK; + } + } + //bool validSave = StorageManager.GetSaveUniqueNumber(&saveOrCheckpointId); + //SentientManager.RecordLevelSaveOrCheckpoint(ProfileManager.GetPrimaryPad(), saveOrCheckpointId); + MinecraftServer::getInstance()->setSaveOnExit( true ); + // flag a app action of exit and join game from invite + app.SetAction(iPad,eAppAction_ExitAndJoinFromInviteConfirmed); + } + return 0; +} + +int CMinecraftApp::ExitAndJoinFromInviteDeclineSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { +#if defined(_XBOX_ONE) || defined(__ORBIS__) + StorageManager.SetSaveDisabled(false); +#endif + MinecraftServer::getInstance()->setSaveOnExit( false ); + // flag a app action of exit and join game from invite + app.SetAction(iPad,eAppAction_ExitAndJoinFromInviteConfirmed); + } + return 0; +} + +////////////////////////////////////////////////////////////////////////// +// +// FatalLoadError +// +// This is called when we can't load one of the required files at startup +// It tends to mean the files have been corrupted. +// We have to assume that we've not been able to load the text for the game. +// +////////////////////////////////////////////////////////////////////////// +void CMinecraftApp::FatalLoadError() +{ + +} + +TIPSTRUCT CMinecraftApp::m_GameTipA[MAX_TIPS_GAMETIP]= +{ + { 0, IDS_TIPS_GAMETIP_1}, + { 0, IDS_TIPS_GAMETIP_2}, + { 0, IDS_TIPS_GAMETIP_3}, + { 0, IDS_TIPS_GAMETIP_4}, + { 0, IDS_TIPS_GAMETIP_5}, + { 0, IDS_TIPS_GAMETIP_6}, + { 0, IDS_TIPS_GAMETIP_7}, + { 0, IDS_TIPS_GAMETIP_8}, + { 0, IDS_TIPS_GAMETIP_9}, + { 0, IDS_TIPS_GAMETIP_10}, + { 0, IDS_TIPS_GAMETIP_11}, + { 0, IDS_TIPS_GAMETIP_12}, + { 0, IDS_TIPS_GAMETIP_13}, + { 0, IDS_TIPS_GAMETIP_14}, + { 0, IDS_TIPS_GAMETIP_15}, + { 0, IDS_TIPS_GAMETIP_16}, + { 0, IDS_TIPS_GAMETIP_17}, + { 0, IDS_TIPS_GAMETIP_18}, + { 0, IDS_TIPS_GAMETIP_19}, + { 0, IDS_TIPS_GAMETIP_20}, + { 0, IDS_TIPS_GAMETIP_21}, + { 0, IDS_TIPS_GAMETIP_22}, + { 0, IDS_TIPS_GAMETIP_23}, + { 0, IDS_TIPS_GAMETIP_24}, + { 0, IDS_TIPS_GAMETIP_25}, + { 0, IDS_TIPS_GAMETIP_26}, + { 0, IDS_TIPS_GAMETIP_27}, + { 0, IDS_TIPS_GAMETIP_28}, + { 0, IDS_TIPS_GAMETIP_29}, + { 0, IDS_TIPS_GAMETIP_30}, + { 0, IDS_TIPS_GAMETIP_31}, + { 0, IDS_TIPS_GAMETIP_32}, + { 0, IDS_TIPS_GAMETIP_33}, + { 0, IDS_TIPS_GAMETIP_34}, + { 0, IDS_TIPS_GAMETIP_35}, + { 0, IDS_TIPS_GAMETIP_36}, + { 0, IDS_TIPS_GAMETIP_37}, + { 0, IDS_TIPS_GAMETIP_38}, + { 0, IDS_TIPS_GAMETIP_39}, + { 0, IDS_TIPS_GAMETIP_40}, + { 0, IDS_TIPS_GAMETIP_41}, + { 0, IDS_TIPS_GAMETIP_42}, + { 0, IDS_TIPS_GAMETIP_43}, + { 0, IDS_TIPS_GAMETIP_44}, + { 0, IDS_TIPS_GAMETIP_45}, + { 0, IDS_TIPS_GAMETIP_46}, + { 0, IDS_TIPS_GAMETIP_47}, + { 0, IDS_TIPS_GAMETIP_48}, + { 0, IDS_TIPS_GAMETIP_49}, + { 0, IDS_TIPS_GAMETIP_50}, +}; + +TIPSTRUCT CMinecraftApp::m_TriviaTipA[MAX_TIPS_TRIVIATIP]= +{ + { 0, IDS_TIPS_TRIVIA_1}, + { 0, IDS_TIPS_TRIVIA_2}, + { 0, IDS_TIPS_TRIVIA_3}, + { 0, IDS_TIPS_TRIVIA_4}, + { 0, IDS_TIPS_TRIVIA_5}, + { 0, IDS_TIPS_TRIVIA_6}, + { 0, IDS_TIPS_TRIVIA_7}, + { 0, IDS_TIPS_TRIVIA_8}, + { 0, IDS_TIPS_TRIVIA_9}, + { 0, IDS_TIPS_TRIVIA_10}, + { 0, IDS_TIPS_TRIVIA_11}, + { 0, IDS_TIPS_TRIVIA_12}, + { 0, IDS_TIPS_TRIVIA_13}, + { 0, IDS_TIPS_TRIVIA_14}, + { 0, IDS_TIPS_TRIVIA_15}, + { 0, IDS_TIPS_TRIVIA_16}, + { 0, IDS_TIPS_TRIVIA_17}, + { 0, IDS_TIPS_TRIVIA_18}, + { 0, IDS_TIPS_TRIVIA_19}, + { 0, IDS_TIPS_TRIVIA_20}, +}; + +Random *CMinecraftApp::TipRandom = new Random(); + +int CMinecraftApp::TipsSortFunction(const void* a, const void* b) +{ + return ((TIPSTRUCT*)a)->iSortValue - ((TIPSTRUCT*)b)->iSortValue; +} + +void CMinecraftApp::InitialiseTips() +{ + // We'll randomise the tips at start up based on their priority + + ZeroMemory(m_TipIDA,sizeof(UINT)*MAX_TIPS_GAMETIP+MAX_TIPS_TRIVIATIP); + + // Make the first tip tell you that you can play splitscreen in HD modes if you are in SD + if(!RenderManager.IsHiDef()) + { + m_GameTipA[0].uiStringID=IDS_TIPS_GAMETIP_0; + } + // randomise then quicksort + // going to leave the multiplayer tip so it is always first + +// Only randomise the content package build +#ifdef _CONTENT_PACKAGE + + for(int i=1;inextInt(); + } + qsort( &m_GameTipA[1], MAX_TIPS_GAMETIP-1, sizeof(TIPSTRUCT), TipsSortFunction ); +#endif + + for(int i=0;inextInt(); + } + qsort( m_TriviaTipA, MAX_TIPS_TRIVIATIP, sizeof(TIPSTRUCT), TipsSortFunction ); + + + int iCurrentGameTip=0; + int iCurrentTriviaTip=0; + + for(int i=0;iskins->getSelected()->getColourTable()->getColour(colour); +} + +int CMinecraftApp::GetHTMLFontSize(EHTMLFontSize size) +{ + return s_iHTMLFontSizesA[size]; +} + +wstring CMinecraftApp::FormatHTMLString(int iPad, const wstring &desc, int shadowColour /*= 0xFFFFFFFF*/) +{ + wstring text(desc); + + wchar_t replacements[64]; + // We will also insert line breaks here as couldn't figure out how to get them to come through from strings.resx ! + text = replaceAll(text, L"{*B*}", L"
" ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_T1)); + text = replaceAll(text, L"{*T1*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_T2)); + text = replaceAll(text, L"{*T2*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_T3)); + text = replaceAll(text, L"{*T3*}", replacements ); // for How To Play + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_Black)); + text = replaceAll(text, L"{*ETB*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_White)); + text = replaceAll(text, L"{*ETW*}", replacements ); + text = replaceAll(text, L"{*EF*}", L"" ); + + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_0), shadowColour); + text = replaceAll(text, L"{*C0*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_1), shadowColour); + text = replaceAll(text, L"{*C1*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_2), shadowColour); + text = replaceAll(text, L"{*C2*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_3), shadowColour); + text = replaceAll(text, L"{*C3*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_4), shadowColour); + text = replaceAll(text, L"{*C4*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_5), shadowColour); + text = replaceAll(text, L"{*C5*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_6), shadowColour); + text = replaceAll(text, L"{*C6*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_7), shadowColour); + text = replaceAll(text, L"{*C7*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_8), shadowColour); + text = replaceAll(text, L"{*C8*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_9), shadowColour); + text = replaceAll(text, L"{*C9*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_a), shadowColour); + text = replaceAll(text, L"{*CA*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_b), shadowColour); + text = replaceAll(text, L"{*CB*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_c), shadowColour); + text = replaceAll(text, L"{*CC*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_d), shadowColour); + text = replaceAll(text, L"{*CD*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_e), shadowColour); + text = replaceAll(text, L"{*CE*}", replacements ); + swprintf(replacements,64,L"", GetHTMLColour(eHTMLColor_f), shadowColour); + text = replaceAll(text, L"{*CF*}", replacements ); + + // Swap for southpaw. + if ( app.GetGameSettings(iPad,eGameSetting_ControlSouthPaw) ) + { + text = replaceAll(text, L"{*CONTROLLER_ACTION_MOVE*}", GetActionReplacement(iPad,MINECRAFT_ACTION_LOOK_RIGHT ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_LOOK*}", GetActionReplacement(iPad,MINECRAFT_ACTION_RIGHT ) ); + + text = replaceAll(text, L"{*CONTROLLER_MENU_NAVIGATE*}", GetVKReplacement(VK_PAD_RTHUMB_LEFT) ); + } + else // Normal right handed. + { + text = replaceAll(text, L"{*CONTROLLER_ACTION_MOVE*}", GetActionReplacement(iPad,MINECRAFT_ACTION_RIGHT ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_LOOK*}", GetActionReplacement(iPad,MINECRAFT_ACTION_LOOK_RIGHT ) ); + + text = replaceAll(text, L"{*CONTROLLER_MENU_NAVIGATE*}", GetVKReplacement(VK_PAD_LTHUMB_LEFT) ); + } + + text = replaceAll(text, L"{*CONTROLLER_ACTION_JUMP*}", GetActionReplacement(iPad,MINECRAFT_ACTION_JUMP ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_SNEAK*}", GetActionReplacement(iPad,MINECRAFT_ACTION_SNEAK_TOGGLE ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_USE*}", GetActionReplacement(iPad,MINECRAFT_ACTION_USE ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_ACTION*}", GetActionReplacement(iPad,MINECRAFT_ACTION_ACTION ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_LEFT_SCROLL*}", GetActionReplacement(iPad,MINECRAFT_ACTION_LEFT_SCROLL ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_RIGHT_SCROLL*}", GetActionReplacement(iPad,MINECRAFT_ACTION_RIGHT_SCROLL ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_INVENTORY*}", GetActionReplacement(iPad,MINECRAFT_ACTION_INVENTORY ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_CRAFTING*}", GetActionReplacement(iPad,MINECRAFT_ACTION_CRAFTING ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_DROP*}", GetActionReplacement(iPad,MINECRAFT_ACTION_DROP ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_CAMERA*}", GetActionReplacement(iPad,MINECRAFT_ACTION_RENDER_THIRD_PERSON ) ); + text = replaceAll(text, L"{*CONTROLLER_VK_A*}", GetVKReplacement(VK_PAD_A) ); + text = replaceAll(text, L"{*CONTROLLER_VK_B*}", GetVKReplacement(VK_PAD_B) ); + text = replaceAll(text, L"{*CONTROLLER_VK_X*}", GetVKReplacement(VK_PAD_X) ); + text = replaceAll(text, L"{*CONTROLLER_VK_Y*}", GetVKReplacement(VK_PAD_Y) ); + text = replaceAll(text, L"{*CONTROLLER_VK_LB*}", GetVKReplacement(VK_PAD_LSHOULDER) ); + text = replaceAll(text, L"{*CONTROLLER_VK_RB*}", GetVKReplacement(VK_PAD_RSHOULDER) ); + text = replaceAll(text, L"{*CONTROLLER_VK_LS*}", GetVKReplacement(VK_PAD_LTHUMB_UP) ); + text = replaceAll(text, L"{*CONTROLLER_VK_RS*}", GetVKReplacement(VK_PAD_RTHUMB_UP) ); + text = replaceAll(text, L"{*CONTROLLER_VK_LT*}", GetVKReplacement(VK_PAD_LTRIGGER) ); + text = replaceAll(text, L"{*CONTROLLER_VK_RT*}", GetVKReplacement(VK_PAD_RTRIGGER) ); + text = replaceAll(text, L"{*ICON_SHANK_01*}", GetIconReplacement(XZP_ICON_SHANK_01) ); + text = replaceAll(text, L"{*ICON_SHANK_03*}", GetIconReplacement(XZP_ICON_SHANK_03) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_DPAD_UP*}", GetActionReplacement(iPad,MINECRAFT_ACTION_DPAD_UP ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_DPAD_DOWN*}", GetActionReplacement(iPad,MINECRAFT_ACTION_DPAD_DOWN ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_DPAD_RIGHT*}", GetActionReplacement(iPad,MINECRAFT_ACTION_DPAD_RIGHT ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_DPAD_LEFT*}", GetActionReplacement(iPad,MINECRAFT_ACTION_DPAD_LEFT ) ); +#if defined _XBOX_ONE || defined __PSVITA__ + text = replaceAll(text, L"{*CONTROLLER_VK_START*}", GetVKReplacement(VK_PAD_START ) ); + text = replaceAll(text, L"{*CONTROLLER_VK_BACK*}", GetVKReplacement(VK_PAD_BACK ) ); +#endif + +#ifdef _XBOX + wstring imageRoot = L""; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + imageRoot = pMinecraft->skins->getSelected()->getXuiRootPath(); + + text = replaceAll(text, L"{*IMAGEROOT*}", imageRoot); +#endif // _XBOX + + // Fix for #8903 - UI: Localization: KOR/JPN/CHT: Button Icons are rendered with padding space, which looks no good + DWORD dwLanguage = XGetLanguage( ); + switch(dwLanguage) + { + case XC_LANGUAGE_KOREAN: + case XC_LANGUAGE_JAPANESE: + case XC_LANGUAGE_TCHINESE: + text = replaceAll(text, L" ", L"" ); + break; + } + + return text; +} + +wstring CMinecraftApp::GetActionReplacement(int iPad, unsigned char ucAction) +{ + unsigned int input = InputManager.GetGameJoypadMaps(InputManager.GetJoypadMapVal(iPad) ,ucAction); + +#ifdef _XBOX + switch(input) + { + case _360_JOY_BUTTON_A: + return app.GetString( IDS_CONTROLLER_A ); + case _360_JOY_BUTTON_B: + return app.GetString( IDS_CONTROLLER_B ); + case _360_JOY_BUTTON_X: + return app.GetString( IDS_CONTROLLER_X ); + case _360_JOY_BUTTON_Y: + return app.GetString( IDS_CONTROLLER_Y ); + case _360_JOY_BUTTON_LSTICK_UP: + case _360_JOY_BUTTON_LSTICK_DOWN: + case _360_JOY_BUTTON_LSTICK_LEFT: + case _360_JOY_BUTTON_LSTICK_RIGHT: + return app.GetString( IDS_CONTROLLER_LEFT_STICK ); + case _360_JOY_BUTTON_RSTICK_LEFT: + case _360_JOY_BUTTON_RSTICK_RIGHT: + case _360_JOY_BUTTON_RSTICK_UP: + case _360_JOY_BUTTON_RSTICK_DOWN: + return app.GetString( IDS_CONTROLLER_RIGHT_STICK ); + case _360_JOY_BUTTON_LT: + return app.GetString( IDS_CONTROLLER_LEFT_TRIGGER ); + case _360_JOY_BUTTON_RT: + return app.GetString( IDS_CONTROLLER_RIGHT_TRIGGER ); + case _360_JOY_BUTTON_RB: + return app.GetString( IDS_CONTROLLER_RIGHT_BUMPER ); + case _360_JOY_BUTTON_LB: + return app.GetString( IDS_CONTROLLER_LEFT_BUMPER ); + case _360_JOY_BUTTON_BACK: + return app.GetString( IDS_CONTROLLER_BACK ); + case _360_JOY_BUTTON_START: + return app.GetString( IDS_CONTROLLER_START ); + case _360_JOY_BUTTON_RTHUMB: + return app.GetString( IDS_CONTROLLER_RIGHT_THUMBSTICK ); + case _360_JOY_BUTTON_LTHUMB: + return app.GetString( IDS_CONTROLLER_LEFT_THUMBSTICK ); + case _360_JOY_BUTTON_DPAD_LEFT: + return app.GetString( IDS_CONTROLLER_DPAD_L ); + case _360_JOY_BUTTON_DPAD_RIGHT: + return app.GetString( IDS_CONTROLLER_DPAD_R ); + case _360_JOY_BUTTON_DPAD_UP: + return app.GetString( IDS_CONTROLLER_DPAD_U ); + case _360_JOY_BUTTON_DPAD_DOWN: + return app.GetString( IDS_CONTROLLER_DPAD_D ); + }; + return L""; +#else + wstring replacement = L""; + + // 4J Stu - Some of our actions can be mapped to multiple physical buttons, so replaces the switch that was here + if (input & _360_JOY_BUTTON_A) replacement = L"ButtonA"; + else if(input &_360_JOY_BUTTON_B) replacement = L"ButtonB"; + else if(input &_360_JOY_BUTTON_X) replacement = L"ButtonX"; + else if(input &_360_JOY_BUTTON_Y) replacement = L"ButtonY"; + else if( + (input &_360_JOY_BUTTON_LSTICK_UP) || + (input &_360_JOY_BUTTON_LSTICK_DOWN) || + (input &_360_JOY_BUTTON_LSTICK_LEFT) || + (input &_360_JOY_BUTTON_LSTICK_RIGHT) + ) + { + replacement = L"ButtonLeftStick"; + } + else if( + (input &_360_JOY_BUTTON_RSTICK_LEFT) || + (input &_360_JOY_BUTTON_RSTICK_RIGHT) || + (input &_360_JOY_BUTTON_RSTICK_UP) || + (input &_360_JOY_BUTTON_RSTICK_DOWN) + ) + { + replacement = L"ButtonRightStick"; + } + else if(input &_360_JOY_BUTTON_DPAD_LEFT) replacement = L"ButtonDpadL"; + else if(input &_360_JOY_BUTTON_DPAD_RIGHT) replacement = L"ButtonDpadR"; + else if(input &_360_JOY_BUTTON_DPAD_UP) replacement = L"ButtonDpadU"; + else if(input &_360_JOY_BUTTON_DPAD_DOWN) replacement = L"ButtonDpadD"; + else if(input &_360_JOY_BUTTON_LT) replacement = L"ButtonLeftTrigger"; + else if(input &_360_JOY_BUTTON_RT) replacement = L"ButtonRightTrigger"; + else if(input &_360_JOY_BUTTON_RB) replacement = L"ButtonRightBumper"; + else if(input &_360_JOY_BUTTON_LB) replacement = L"ButtonLeftBumper"; + else if(input &_360_JOY_BUTTON_BACK) replacement = L"ButtonBack"; + else if(input &_360_JOY_BUTTON_START) replacement = L"ButtonStart"; + else if(input &_360_JOY_BUTTON_RTHUMB) replacement = L"ButtonRS"; + else if(input &_360_JOY_BUTTON_LTHUMB) replacement = L"ButtonLS"; + + wchar_t string[128]; + +#ifdef __PS3__ + int size = 30; +#elif defined _WIN64 + int size = 45; + if(ui.getScreenWidth() < 1920) size = 30; +#else + int size = 45; +#endif + + swprintf(string,128,L"", replacement.c_str(), size, size); + + return string; +#endif +} + +wstring CMinecraftApp::GetVKReplacement(unsigned int uiVKey) +{ +#ifdef _XBOX + switch(uiVKey) + { + case VK_PAD_A: + return app.GetString( IDS_CONTROLLER_A ); + case VK_PAD_B: + return app.GetString( IDS_CONTROLLER_B ); + case VK_PAD_X: + return app.GetString( IDS_CONTROLLER_X ); + case VK_PAD_Y: + return app.GetString( IDS_CONTROLLER_Y ); + case VK_PAD_LSHOULDER: + return app.GetString( IDS_CONTROLLER_LEFT_BUMPER ); + case VK_PAD_RSHOULDER: + return app.GetString( IDS_CONTROLLER_RIGHT_BUMPER ); + case VK_PAD_LTRIGGER: + return app.GetString( IDS_CONTROLLER_LEFT_TRIGGER ); + case VK_PAD_RTRIGGER: + return app.GetString( IDS_CONTROLLER_RIGHT_TRIGGER ); + case VK_PAD_LTHUMB_UP : + case VK_PAD_LTHUMB_DOWN : + case VK_PAD_LTHUMB_RIGHT : + case VK_PAD_LTHUMB_LEFT : + case VK_PAD_LTHUMB_UPLEFT : + case VK_PAD_LTHUMB_UPRIGHT : + case VK_PAD_LTHUMB_DOWNRIGHT: + case VK_PAD_LTHUMB_DOWNLEFT : + return app.GetString( IDS_CONTROLLER_LEFT_STICK ); + case VK_PAD_RTHUMB_UP : + case VK_PAD_RTHUMB_DOWN : + case VK_PAD_RTHUMB_RIGHT : + case VK_PAD_RTHUMB_LEFT : + case VK_PAD_RTHUMB_UPLEFT : + case VK_PAD_RTHUMB_UPRIGHT : + case VK_PAD_RTHUMB_DOWNRIGHT: + case VK_PAD_RTHUMB_DOWNLEFT : + return app.GetString( IDS_CONTROLLER_RIGHT_STICK ); + default: + break; + } + return NULL; +#else + wstring replacement = L""; + switch(uiVKey) + { + case VK_PAD_A: +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + if( InputManager.IsCircleCrossSwapped() ) replacement = L"ButtonB"; + else replacement = L"ButtonA"; +#else + replacement = L"ButtonA"; +#endif + break; + case VK_PAD_B: +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + if( InputManager.IsCircleCrossSwapped() ) replacement = L"ButtonA"; + else replacement = L"ButtonB"; +#else + replacement = L"ButtonB"; +#endif + break; + case VK_PAD_X: + replacement = L"ButtonX"; + break; + case VK_PAD_Y: + replacement = L"ButtonY"; + break; + case VK_PAD_LSHOULDER: + replacement = L"ButtonLeftBumper"; + break; + case VK_PAD_RSHOULDER: + replacement = L"ButtonRightBumper"; + break; + case VK_PAD_LTRIGGER: + replacement = L"ButtonLeftTrigger"; + break; + case VK_PAD_RTRIGGER: + replacement = L"ButtonRightTrigger"; + break; + case VK_PAD_LTHUMB_UP : + case VK_PAD_LTHUMB_DOWN : + case VK_PAD_LTHUMB_RIGHT : + case VK_PAD_LTHUMB_LEFT : + case VK_PAD_LTHUMB_UPLEFT : + case VK_PAD_LTHUMB_UPRIGHT : + case VK_PAD_LTHUMB_DOWNRIGHT: + case VK_PAD_LTHUMB_DOWNLEFT : + replacement = L"ButtonLeftStick"; + break; + case VK_PAD_RTHUMB_UP : + case VK_PAD_RTHUMB_DOWN : + case VK_PAD_RTHUMB_RIGHT : + case VK_PAD_RTHUMB_LEFT : + case VK_PAD_RTHUMB_UPLEFT : + case VK_PAD_RTHUMB_UPRIGHT : + case VK_PAD_RTHUMB_DOWNRIGHT: + case VK_PAD_RTHUMB_DOWNLEFT : + replacement = L"ButtonRightStick"; + break; +#if defined _XBOX_ONE || defined __PSVITA__ + case VK_PAD_START: + replacement = L"ButtonStart"; + break; + case VK_PAD_BACK: + replacement = L"ButtonBack"; + break; +#endif + default: + break; + } + wchar_t string[128]; + +#ifdef __PS3__ + int size = 30; +#elif defined _WIN64 + int size = 45; + if(ui.getScreenWidth() < 1920) size = 30; +#else + int size = 45; +#endif + + swprintf(string,128,L"", replacement.c_str(), size, size); + + return string; +#endif +} + +wstring CMinecraftApp::GetIconReplacement(unsigned int uiIcon) +{ +#ifdef _XBOX + switch(uiIcon) + { + case XZP_ICON_SHANK_01: + return app.GetString( IDS_ICON_SHANK_01 ); + case XZP_ICON_SHANK_03: + return app.GetString( IDS_ICON_SHANK_03 ); + default: + break; + } + return NULL; +#else + wchar_t string[128]; + +#ifdef __PS3__ + int size = 22; +#elif defined _WIN64 + int size = 33; + if(ui.getScreenWidth() < 1920) size = 22; +#else + int size = 33; +#endif + + swprintf(string,128,L"", size, size); + wstring result = L""; + switch(uiIcon) + { + case XZP_ICON_SHANK_01: + result = string; + break; + case XZP_ICON_SHANK_03: + result.append(string).append(string).append(string); + break; + default: + break; + } + return result; +#endif +} + +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) +unordered_map CMinecraftApp::MojangData; +unordered_map CMinecraftApp::DLCTextures_PackID; +unordered_map CMinecraftApp::DLCInfo; +unordered_map CMinecraftApp::DLCInfo_SkinName; +#elif defined(_DURANGO) +unordered_map CMinecraftApp::MojangData; +unordered_map CMinecraftApp::DLCTextures_PackID; // for mash-up packs & texture packs +//unordered_map CMinecraftApp::DLCInfo_Trial; // full offerid, dlc_info +unordered_map CMinecraftApp::DLCInfo_Full; // full offerid, dlc_info +unordered_map CMinecraftApp::DLCInfo_SkinName; // skin name, full offer id +#else +unordered_map CMinecraftApp::MojangData; +unordered_map CMinecraftApp::DLCTextures_PackID; +unordered_map CMinecraftApp::DLCInfo_Trial; +unordered_map CMinecraftApp::DLCInfo_Full; +unordered_map CMinecraftApp::DLCInfo_SkinName; +#endif + + + +HRESULT CMinecraftApp::RegisterMojangData(WCHAR *pXuidName, PlayerUID xuid, WCHAR *pSkin, WCHAR *pCape) +{ + HRESULT hr=S_OK; + eXUID eTempXuid=eXUID_Undefined; + MOJANG_DATA *pMojangData=NULL; + + // ignore the names if we don't recognize them + if(pXuidName!=NULL) + { + if( wcscmp( pXuidName, L"XUID_NOTCH" ) == 0 ) + { + eTempXuid = eXUID_Notch; // might be needed for the apple at some point + } + else if( wcscmp( pXuidName, L"XUID_DEADMAU5" ) == 0 ) + { + eTempXuid = eXUID_Deadmau5; // Needed for the deadmau5 ears + } + else + { + eTempXuid=eXUID_NoName; + } + } + + if(eTempXuid!=eXUID_Undefined) + { + pMojangData = new MOJANG_DATA; + ZeroMemory(pMojangData,sizeof(MOJANG_DATA)); + pMojangData->eXuid=eTempXuid; + + wcsncpy( pMojangData->wchSkin, pSkin, MAX_CAPENAME_SIZE); + wcsncpy( pMojangData->wchCape, pCape, MAX_CAPENAME_SIZE); + MojangData[xuid]=pMojangData; + } + + return hr; +} + +MOJANG_DATA *CMinecraftApp::GetMojangDataForXuid(PlayerUID xuid) +{ + return MojangData[xuid]; +} + +HRESULT CMinecraftApp::RegisterConfigValues(WCHAR *pType, int iValue) +{ + HRESULT hr=S_OK; + +// #ifdef _XBOX +// if(pType!=NULL) +// { +// if(wcscmp(pType,L"XboxOneTransfer")==0) +// { +// if(iValue>0) +// { +// app.m_bTransferSavesToXboxOne=true; +// } +// else +// { +// app.m_bTransferSavesToXboxOne=false; +// } +// } +// else if(wcscmp(pType,L"TransferSlotCount")==0) +// { +// app.m_uiTransferSlotC=iValue; +// } +// +// } +// #endif + + + return hr; +} + +#if (defined _XBOX || defined _WINDOWS64) +HRESULT CMinecraftApp::RegisterDLCData(WCHAR *pType, WCHAR *pBannerName, int iGender, __uint64 ullOfferID_Full, __uint64 ullOfferID_Trial, WCHAR *pFirstSkin, unsigned int uiSortIndex, int iConfig, WCHAR *pDataFile) +{ + HRESULT hr=S_OK; + DLC_INFO *pDLCData=new DLC_INFO; + ZeroMemory(pDLCData,sizeof(DLC_INFO)); + pDLCData->ullOfferID_Full=ullOfferID_Full; + pDLCData->ullOfferID_Trial=ullOfferID_Trial; + pDLCData->eDLCType=e_DLC_NotDefined; + pDLCData->iGender=iGender; + pDLCData->uiSortIndex=uiSortIndex; + pDLCData->iConfig=iConfig; + +#ifndef __ORBIS__ + // ignore the names if we don't recognize them + if(pBannerName!=L"") + { + wcsncpy_s( pDLCData->wchBanner, pBannerName, MAX_BANNERNAME_SIZE); + } + + if(pDataFile[0]!=0) + { + wcsncpy_s( pDLCData->wchDataFile, pDataFile, MAX_BANNERNAME_SIZE); + } +#endif + + if(pType!=NULL) + { + if(wcscmp(pType,L"Skin")==0) + { + pDLCData->eDLCType=e_DLC_SkinPack; + } + else if(wcscmp(pType,L"Gamerpic")==0) + { + pDLCData->eDLCType=e_DLC_Gamerpics; + } + else if(wcscmp(pType,L"Theme")==0) + { + pDLCData->eDLCType=e_DLC_Themes; + } + else if(wcscmp(pType,L"Avatar")==0) + { + pDLCData->eDLCType=e_DLC_AvatarItems; + } + else if(wcscmp(pType,L"MashUpPack")==0) + { + pDLCData->eDLCType=e_DLC_MashupPacks; + DLCTextures_PackID[pDLCData->iConfig]=ullOfferID_Full; + } + else if(wcscmp(pType,L"TexturePack")==0) + { + pDLCData->eDLCType=e_DLC_TexturePacks; + DLCTextures_PackID[pDLCData->iConfig]=ullOfferID_Full; + } + + + } + + if(ullOfferID_Trial!=0ll) DLCInfo_Trial[ullOfferID_Trial]=pDLCData; + if(ullOfferID_Full!=0ll) DLCInfo_Full[ullOfferID_Full]=pDLCData; + if(pFirstSkin[0]!=0) DLCInfo_SkinName[pFirstSkin]=ullOfferID_Full; + + return hr; +} +#elif defined _XBOX_ONE + +unordered_map *CMinecraftApp::GetDLCInfo() +{ + return &DLCInfo_Full; +} + +HRESULT CMinecraftApp::RegisterDLCData(eDLCContentType eType, WCHAR *pwchBannerName,WCHAR *pwchProductId, WCHAR *pwchProductName, WCHAR *pwchFirstSkin, int iConfig, unsigned int uiSortIndex) +{ + HRESULT hr=S_OK; + // 4J-PB - need to convert the product id to uppercase because the catalog calls come back with upper case + WCHAR wchUppercaseProductID[64]; + if(pwchProductId[0]!=0) + { + for(int i=0;i<64;i++) + { + wchUppercaseProductID[i]=towupper((wchar_t)pwchProductId[i]); + } + } + + // check if we already have this info from the local DLC file + wstring wsTemp=wchUppercaseProductID; + + AUTO_VAR(it, DLCInfo_Full.find(wsTemp)); + if( it == DLCInfo_Full.end() ) + { + // Not found + + DLC_INFO *pDLCData=new DLC_INFO; + ZeroMemory(pDLCData,sizeof(DLC_INFO)); + + pDLCData->eDLCType=e_DLC_NotDefined; + pDLCData->uiSortIndex=uiSortIndex; + pDLCData->iConfig=iConfig; + + if(pwchProductId[0]!=0) + { + pDLCData->wsProductId=wchUppercaseProductID; + } + + // ignore the names if we don't recognize them + if(pwchBannerName!=L"") + { + wcsncpy_s( pDLCData->wchBanner, pwchBannerName, MAX_BANNERNAME_SIZE); + } + + if(pwchProductName[0]!=0) + { + pDLCData->wsDisplayName=pwchProductName; + } + + pDLCData->eDLCType=eType; + + switch(eType) + { + case e_DLC_MashupPacks: + case e_DLC_TexturePacks: + DLCTextures_PackID[iConfig]=pDLCData->wsProductId; + break; + } + + if(pwchFirstSkin[0]!=0) DLCInfo_SkinName[pwchFirstSkin]=pDLCData->wsProductId; + + #ifdef _XBOX_ONE + // ignore the names, and use the product id instead + DLCInfo_Full[pDLCData->wsProductId]=pDLCData; + #else + DLCInfo_Full[pDLCData->wsDisplayName]=pDLCData; + #endif + } + app.DebugPrintf("DLCInfo - type - %d, productID - %ls, name - %ls , banner - %ls, iconfig - %d, sort index - %d\n",eType,pwchProductId, pwchProductName,pwchBannerName, iConfig, uiSortIndex); + return hr; +} +#else + +HRESULT CMinecraftApp::RegisterDLCData(char *pchDLCName, unsigned int uiSortIndex,char *pchImageURL) +{ + // on PS3 we get all the required info from the name + char chDLCType[3]; + HRESULT hr=S_OK; + DLC_INFO *pDLCData=new DLC_INFO; + ZeroMemory(pDLCData,sizeof(DLC_INFO)); + + chDLCType[0]=pchDLCName[0]; + chDLCType[1]=pchDLCName[1]; + chDLCType[2]=0; + + pDLCData->iConfig = app.GetiConfigFromName(pchDLCName); + pDLCData->uiSortIndex=uiSortIndex; + pDLCData->eDLCType = app.GetDLCTypeFromName(pchDLCName); + strcpy(pDLCData->chImageURL,pchImageURL); + //bool bIsTrialDLC = app.GetTrialFromName(pchDLCName); + + switch(pDLCData->eDLCType) + { + case e_DLC_TexturePacks: + { + char *pchName=(char *)malloc(strlen(pchDLCName)+1); + strcpy(pchName,pchDLCName); + DLCTextures_PackID[pDLCData->iConfig]=pchName; + } + break; + case e_DLC_MashupPacks: + { + char *pchName=(char *)malloc(strlen(pchDLCName)+1); + strcpy(pchName,pchDLCName); + DLCTextures_PackID[pDLCData->iConfig]=pchName; + } + break; + default: + break; + } + + app.DebugPrintf(5,"Adding DLC - %s\n",pchDLCName); + DLCInfo[pchDLCName]=pDLCData; + +// if(ullOfferID_Trial!=0ll) DLCInfo_Trial[ullOfferID_Trial]=pDLCData; +// if(ullOfferID_Full!=0ll) DLCInfo_Full[ullOfferID_Full]=pDLCData; +// if(pFirstSkin[0]!=0) DLCInfo_SkinName[pFirstSkin]=ullOfferID_Full; + +// DLCInfo[ullOfferID_Trial]=pDLCData; + + return hr; +} +#endif + + + +#if defined( __PS3__) || defined(__ORBIS__) || defined(__PSVITA__) +bool CMinecraftApp::GetDLCFullOfferIDForSkinID(const wstring &FirstSkin,ULONGLONG *pullVal) +{ + AUTO_VAR(it, DLCInfo_SkinName.find(FirstSkin)); + if( it == DLCInfo_SkinName.end() ) + { + return false; + } + else + { + *pullVal=(ULONGLONG)it->second; + return true; + } +} +bool CMinecraftApp::GetDLCNameForPackID(const int iPackID,char **ppchKeyID) +{ + AUTO_VAR(it, DLCTextures_PackID.find(iPackID)); + if( it == DLCTextures_PackID.end() ) + { + *ppchKeyID=NULL; + return false; + } + else + { + *ppchKeyID=(char *)it->second; + return true; + } +} +DLC_INFO *CMinecraftApp::GetDLCInfo(char *pchDLCName) +{ + string tempString=pchDLCName; + + if(DLCInfo.size()>0) + { + AUTO_VAR(it, DLCInfo.find(tempString)); + + if( it == DLCInfo.end() ) + { + // nothing for this + return NULL; + } + else + { + return it->second; + } + } + else return NULL; +} + +DLC_INFO *CMinecraftApp::GetDLCInfoFromTPackID(int iTPID) +{ + unordered_map::iterator it= DLCInfo.begin(); + + for(int i=0;isecond)->iConfig==iTPID) + { + return it->second; + } + ++it; + } + return NULL; +} + +DLC_INFO *CMinecraftApp::GetDLCInfo(int iIndex) +{ + unordered_map::iterator it= DLCInfo.begin(); + + for(int i=0;isecond; +} + +char *CMinecraftApp::GetDLCInfoTextures(int iIndex) +{ + unordered_map::iterator it= DLCTextures_PackID.begin(); + + for(int i=0;isecond; +} + +#elif defined _XBOX_ONE +bool CMinecraftApp::GetDLCFullOfferIDForSkinID(const wstring &FirstSkin,wstring &ProductId) +{ + AUTO_VAR(it, DLCInfo_SkinName.find(FirstSkin)); + if( it == DLCInfo_SkinName.end() ) + { + return false; + } + else + { + ProductId=it->second; + return true; + } +} +bool CMinecraftApp::GetDLCFullOfferIDForPackID(const int iPackID,wstring &ProductId) +{ + AUTO_VAR(it, DLCTextures_PackID.find(iPackID)); + if( it == DLCTextures_PackID.end() ) + { + return false; + } + else + { + ProductId=it->second; + return true; + } +} +// DLC_INFO *CMinecraftApp::GetDLCInfoForTrialOfferID(wstring &ProductId) +// { +// return NULL; +// } + +DLC_INFO *CMinecraftApp::GetDLCInfoTrialOffer(int iIndex) +{ + return NULL; +} +DLC_INFO *CMinecraftApp::GetDLCInfoFullOffer(int iIndex) +{ + unordered_map::iterator it= DLCInfo_Full.begin(); + + for(int i=0;isecond; +} +wstring CMinecraftApp::GetDLCInfoTexturesFullOffer(int iIndex) +{ + unordered_map::iterator it= DLCTextures_PackID.begin(); + + for(int i=0;isecond; +} +#else +bool CMinecraftApp::GetDLCFullOfferIDForSkinID(const wstring &FirstSkin,ULONGLONG *pullVal) +{ + AUTO_VAR(it, DLCInfo_SkinName.find(FirstSkin)); + if( it == DLCInfo_SkinName.end() ) + { + return false; + } + else + { + *pullVal=(ULONGLONG)it->second; + return true; + } +} +bool CMinecraftApp::GetDLCFullOfferIDForPackID(const int iPackID,ULONGLONG *pullVal) +{ + AUTO_VAR(it, DLCTextures_PackID.find(iPackID)); + if( it == DLCTextures_PackID.end() ) + { + *pullVal=(ULONGLONG)0; + return false; + } + else + { + *pullVal=(ULONGLONG)it->second; + return true; + } +} +DLC_INFO *CMinecraftApp::GetDLCInfoForTrialOfferID(ULONGLONG ullOfferID_Trial) +{ + //DLC_INFO *pDLCInfo=NULL; + if(DLCInfo_Trial.size()>0) + { + AUTO_VAR(it, DLCInfo_Trial.find(ullOfferID_Trial)); + + if( it == DLCInfo_Trial.end() ) + { + // nothing for this + return NULL; + } + else + { + return it->second; + } + } + else return NULL; +} + +DLC_INFO *CMinecraftApp::GetDLCInfoTrialOffer(int iIndex) +{ + unordered_map::iterator it= DLCInfo_Trial.begin(); + + for(int i=0;isecond; +} +DLC_INFO *CMinecraftApp::GetDLCInfoFullOffer(int iIndex) +{ + unordered_map::iterator it= DLCInfo_Full.begin(); + + for(int i=0;isecond; +} +ULONGLONG CMinecraftApp::GetDLCInfoTexturesFullOffer(int iIndex) +{ + unordered_map::iterator it= DLCTextures_PackID.begin(); + + for(int i=0;isecond; +} +#endif + +#ifdef _XBOX_ONE + +DLC_INFO *CMinecraftApp::GetDLCInfoForFullOfferID(WCHAR *pwchProductID) +{ + wstring wsTemp = pwchProductID; + if(DLCInfo_Full.size()>0) + { + AUTO_VAR(it, DLCInfo_Full.find(wsTemp)); + + if( it == DLCInfo_Full.end() ) + { + // nothing for this + return NULL; + } + else + { + return it->second; + } + } + else return NULL; +} +DLC_INFO *CMinecraftApp::GetDLCInfoForProductName(WCHAR *pwchProductName) +{ + unordered_map::iterator it= DLCInfo_Full.begin(); + wstring wsProductName=pwchProductName; + + for(int i=0;isecond; + if(wsProductName==pDLCInfo->wsDisplayName) + { + return pDLCInfo; + } + ++it; + } + + return NULL; +} + +#elif defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) +#else + +DLC_INFO *CMinecraftApp::GetDLCInfoForFullOfferID(ULONGLONG ullOfferID_Full) +{ + + if(DLCInfo_Full.size()>0) + { + AUTO_VAR(it, DLCInfo_Full.find(ullOfferID_Full)); + + if( it == DLCInfo_Full.end() ) + { + // nothing for this + return NULL; + } + else + { + return it->second; + } + } + else return NULL; +} +#endif + +void CMinecraftApp::EnterSaveNotificationSection() +{ + EnterCriticalSection(&m_saveNotificationCriticalSection); + if( m_saveNotificationDepth++ == 0 ) + { + MinecraftServer::getInstance()->broadcastStartSavingPacket(); + + if( g_NetworkManager.IsLocalGame() && g_NetworkManager.GetPlayerCount() == 1 ) + { + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)TRUE); + } + } + LeaveCriticalSection(&m_saveNotificationCriticalSection); +} + +void CMinecraftApp::LeaveSaveNotificationSection() +{ + EnterCriticalSection(&m_saveNotificationCriticalSection); + if( --m_saveNotificationDepth == 0 ) + { + MinecraftServer::getInstance()->broadcastStopSavingPacket(); + + if( g_NetworkManager.IsLocalGame() && g_NetworkManager.GetPlayerCount() == 1 ) + { + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)FALSE); + } + } + LeaveCriticalSection(&m_saveNotificationCriticalSection); +} + + +int CMinecraftApp::RemoteSaveThreadProc( void* lpParameter ) +{ + // The game should be stopped while we are doing this, but the connections ticks may try to create some AABB's or Vec3's + AABB::UseDefaultThreadStorage(); + Vec3::UseDefaultThreadStorage(); + Compression::UseDefaultThreadStorage(); + + // 4J-PB - Xbox 360 - 163153 - [CRASH] TU17: Code: Multiplayer: During the Autosave in an online Multiplayer session, the game occasionally crashes for one or more Clients + // callstack - > if(tls->tileId != this->id) updateDefaultShape(); + // callstack - > default.exe!WaterlilyTile::getAABB(Level * level, int x, int y, int z) line 38 + 8 bytes C++ + // ... + // default.exe!CMinecraftApp::RemoteSaveThreadProc(void * lpParameter) line 6694 C++ + // host autosave, and the clients can crash on receiving handleMoveEntity when it's a tile within this thread, so need to do the tls for tiles + Tile::CreateNewThreadStorage(); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + pMinecraft->progressRenderer->progressStartNoAbort( IDS_PROGRESS_HOST_SAVING ); + pMinecraft->progressRenderer->progressStage( -1 ); + pMinecraft->progressRenderer->progressStagePercentage(0); + + while( !app.GetGameStarted() && app.GetXuiAction( ProfileManager.GetPrimaryPad() ) == eAppAction_WaitRemoteServerSaveComplete ) + { + // Tick all the games connections + pMinecraft->tickAllConnections(); + Sleep( 100 ); + } + + if( app.GetXuiAction( ProfileManager.GetPrimaryPad() ) != eAppAction_WaitRemoteServerSaveComplete ) + { + // Something cancelled us? + return ERROR_CANCELLED; + } + app.SetAction(ProfileManager.GetPrimaryPad(),eAppAction_Idle); + + ui.UpdatePlayerBasePositions(); + + Tile::ReleaseThreadStorage(); + + return S_OK; +} + +void CMinecraftApp::ExitGameFromRemoteSave( LPVOID lpParameter ) +{ + int primaryPad = ProfileManager.GetPrimaryPad(); + + UINT uiIDA[3]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 2, primaryPad,&CMinecraftApp::ExitGameFromRemoteSaveDialogReturned,NULL, app.GetStringTable(), 0, 0, false); +} + +int CMinecraftApp::ExitGameFromRemoteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + //CScene_Pause* pClass = (CScene_Pause*)pParam; + + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { + app.SetAction(iPad,eAppAction_ExitWorld); + } + else + { +#ifndef _XBOX + // Inform fullscreen progress scene that it's not being cancelled after all + UIScene_FullscreenProgress *pScene = (UIScene_FullscreenProgress *)ui.FindScene(eUIScene_FullscreenProgress); +#ifdef __PS3__ + if(pScene!=NULL) +#else + if (pScene != nullptr) +#endif + { + pScene->SetWasCancelled(false); + } +#else + // Don't have to worry about this on Xbox +#endif + } + return 0; +} + +void CMinecraftApp::SetSpecialTutorialCompletionFlag(int iPad, int index) +{ + if(index >= 0 && index < 32 && GameSettingsA[iPad] != NULL) + { + GameSettingsA[iPad]->uiSpecialTutorialBitmask |= (1<clear(); + + if(BannedListA[iPad].pBannedList) + { + delete [] BannedListA[iPad].pBannedList; + BannedListA[iPad].pBannedList=NULL; + } + } +} + +#ifdef _XBOX_ONE +void CMinecraftApp::AddLevelToBannedLevelList(int iPad, PBANNEDLISTDATA pBannedListData, bool bWriteToTMS) +{ + PlayerUID xuid= pBannedListData->wchPlayerUID; + + AddLevelToBannedLevelList(iPad,xuid,pBannedListData->pszLevelName,bWriteToTMS); +} +#endif + +void CMinecraftApp::AddLevelToBannedLevelList(int iPad, PlayerUID xuid, char *pszLevelName, bool bWriteToTMS) +{ + // we will have retrieved the banned level list from TMS, so add this one to it and write it back to TMS + + BANNEDLISTDATA *pBannedListData = new BANNEDLISTDATA; + memset(pBannedListData,0,sizeof(BANNEDLISTDATA)); + +#ifdef _DURANGO + memcpy(&pBannedListData->wchPlayerUID, xuid.toString().c_str(), sizeof(WCHAR)*64); +#else + memcpy(&pBannedListData->xuid, &xuid, sizeof(PlayerUID)); +#endif + strcpy(pBannedListData->pszLevelName,pszLevelName); + m_vBannedListA[iPad]->push_back(pBannedListData); + + if(bWriteToTMS) + { + DWORD dwDataBytes=(DWORD)(sizeof(BANNEDLISTDATA)*m_vBannedListA[iPad]->size()); + PBANNEDLISTDATA pBannedList = (BANNEDLISTDATA *)(new CHAR [dwDataBytes]); + int iCount=0; + for(AUTO_VAR(it, m_vBannedListA[iPad]->begin()); it != m_vBannedListA[iPad]->end(); ++it) + { + PBANNEDLISTDATA pData=*it; + memcpy(&pBannedList[iCount++],pData,sizeof(BANNEDLISTDATA)); + } + + // 4J-PB - write to TMS++ now + + //bool bRes=StorageManager.WriteTMSFile(iPad,C4JStorage::eGlobalStorage_TitleUser,L"BannedList",(PBYTE)pBannedList, dwDataBytes); +#ifdef _XBOX + StorageManager.TMSPP_WriteFile(iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,C4JStorage::TMS_UGCTYPE_NONE,"BannedList",(PCHAR) pBannedList, dwDataBytes,NULL,NULL, 0); +#elif defined _XBOX_ONE + StorageManager.TMSPP_WriteFile(iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,L"BannedList",(PBYTE) pBannedList, dwDataBytes,NULL,NULL, 0); +#endif + } + // update telemetry too +} + +bool CMinecraftApp::IsInBannedLevelList(int iPad, PlayerUID xuid, char *pszLevelName) +{ + for(AUTO_VAR(it, m_vBannedListA[iPad]->begin()); it != m_vBannedListA[iPad]->end(); ++it) + { + PBANNEDLISTDATA pData=*it; +#ifdef _XBOX_ONE + PlayerUID bannedPlayerUID = pData->wchPlayerUID; + if(IsEqualXUID (bannedPlayerUID,xuid) && (strcmp(pData->pszLevelName,pszLevelName)==0)) +#else + if(IsEqualXUID (pData->xuid,xuid) && (strcmp(pData->pszLevelName,pszLevelName)==0)) +#endif + { + return true; + } + } + + return false; +} + +void CMinecraftApp::RemoveLevelFromBannedLevelList(int iPad, PlayerUID xuid, char *pszLevelName) +{ + //bool bFound=false; + //bool bRes; + + // we will have retrieved the banned level list from TMS, so remove this one from it and write it back to TMS + for(AUTO_VAR(it, m_vBannedListA[iPad]->begin()); it != m_vBannedListA[iPad]->end(); ) + { + PBANNEDLISTDATA pBannedListData = *it; + + if(pBannedListData!=NULL) + { +#ifdef _XBOX_ONE + PlayerUID bannedPlayerUID = pBannedListData->wchPlayerUID; + if(IsEqualXUID (bannedPlayerUID,xuid) && (strcmp(pBannedListData->pszLevelName,pszLevelName)==0)) +#else + if(IsEqualXUID (pBannedListData->xuid,xuid) && (strcmp(pBannedListData->pszLevelName,pszLevelName)==0)) +#endif + { + TelemetryManager->RecordUnBanLevel(iPad); + + // match found, so remove this entry + it = m_vBannedListA[iPad]->erase(it); + } + else + { + ++it; + } + } + else + { + ++it; + } + } + + DWORD dwDataBytes=(DWORD)(sizeof(BANNEDLISTDATA)*m_vBannedListA[iPad]->size()); + if(dwDataBytes==0) + { + // wipe the file +#ifdef _XBOX + StorageManager.DeleteTMSFile(iPad,C4JStorage::eGlobalStorage_TitleUser,L"BannedList"); +#elif defined _XBOX_ONE + StorageManager.TMSPP_DeleteFile(iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,L"BannedList",NULL,NULL, 0); +#endif + } + else + { + PBANNEDLISTDATA pBannedList = (BANNEDLISTDATA *)(new BYTE [dwDataBytes]); + + int iSize=(int)m_vBannedListA[iPad]->size(); + for(int i=0;iat(i); + + memcpy(&pBannedList[i],pBannedListData,sizeof(BANNEDLISTDATA)); + } +#ifdef _XBOX + StorageManager.WriteTMSFile(iPad,C4JStorage::eGlobalStorage_TitleUser,L"BannedList",(PBYTE)pBannedList, dwDataBytes); +#elif defined _XBOX_ONE + StorageManager.TMSPP_WriteFile(iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,L"BannedList",(PBYTE) pBannedList, dwDataBytes,NULL,NULL, 0); +#endif + delete [] pBannedList; + } + + // update telemetry too +} + +// function to add credits for the DLC packs +void CMinecraftApp::AddCreditText(LPCWSTR lpStr) +{ + DebugPrintf("ADDING CREDIT - %ls\n",lpStr); + // add a string from the DLC to a credits vector + SCreditTextItemDef *pCreditStruct = new SCreditTextItemDef; + pCreditStruct->m_eType=eSmallText; + pCreditStruct->m_iStringID[0]=NO_TRANSLATED_STRING; + pCreditStruct->m_iStringID[1]=NO_TRANSLATED_STRING; + pCreditStruct->m_Text=new WCHAR [wcslen(lpStr)+1]; + wcscpy((WCHAR *)pCreditStruct->m_Text,lpStr); + + vDLCCredits.push_back(pCreditStruct); +} + +bool CMinecraftApp::AlreadySeenCreditText(const wstring &wstemp) +{ + + for(unsigned int i=0;i>4; + break; + case eGameHostOption_All: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_ALL); + break; + case eGameHostOption_Tutorial: + // special case - tutorial is offline, but we want the gamertag option, and set Easy mode, structures on, fire on, tnt on, pvp on, trust players on + return ((uiHostSettings&GAME_HOST_OPTION_BITMASK_GAMERTAGS)|GAME_HOST_OPTION_BITMASK_TRUSTPLAYERS|GAME_HOST_OPTION_BITMASK_FIRESPREADS|GAME_HOST_OPTION_BITMASK_TNT|GAME_HOST_OPTION_BITMASK_PVP|GAME_HOST_OPTION_BITMASK_STRUCTURES|1); + break; + case eGameHostOption_LevelType: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_LEVELTYPE); + break; + case eGameHostOption_Structures: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_STRUCTURES); + break; + case eGameHostOption_BonusChest: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_BONUSCHEST); + break; + case eGameHostOption_HasBeenInCreative: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_BEENINCREATIVE); + break; + case eGameHostOption_PvP: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_PVP); + break; + case eGameHostOption_TrustPlayers: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_TRUSTPLAYERS); + break; + case eGameHostOption_TNT: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_TNT); + break; + case eGameHostOption_FireSpreads: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_FIRESPREADS); + break; + case eGameHostOption_CheatsEnabled: + return (uiHostSettings&(GAME_HOST_OPTION_BITMASK_HOSTFLY|GAME_HOST_OPTION_BITMASK_HOSTHUNGER|GAME_HOST_OPTION_BITMASK_HOSTINVISIBLE)); + break; + case eGameHostOption_HostCanFly: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_HOSTFLY); + break; + case eGameHostOption_HostCanChangeHunger: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_HOSTHUNGER); + break; + case eGameHostOption_HostCanBeInvisible: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_HOSTINVISIBLE); + break; + case eGameHostOption_BedrockFog: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_BEDROCKFOG); + break; + case eGameHostOption_DisableSaving: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_DISABLESAVE); + break; + } + + return false; +} + +bool CMinecraftApp::CanRecordStatsAndAchievements() +{ + // 4J Stu - All of these options give the host player some advantage, so should not allow achievements + return !(app.GetGameHostOption(eGameHostOption_HasBeenInCreative) || + app.GetGameHostOption(eGameHostOption_HostCanBeInvisible) || + app.GetGameHostOption(eGameHostOption_HostCanChangeHunger) || + app.GetGameHostOption(eGameHostOption_HostCanFly)); +} + +void CMinecraftApp::processSchematics(LevelChunk *levelChunk) +{ + m_gameRules.processSchematics(levelChunk); +} + +void CMinecraftApp::processSchematicsLighting(LevelChunk *levelChunk) +{ + m_gameRules.processSchematicsLighting(levelChunk); +} + +void CMinecraftApp::loadDefaultGameRules() +{ + m_gameRules.loadDefaultGameRules(); +} + +void CMinecraftApp::setLevelGenerationOptions(LevelGenerationOptions *levelGen) +{ + m_gameRules.setLevelGenerationOptions(levelGen); +} + +LPCWSTR CMinecraftApp::GetGameRulesString(const wstring &key) +{ + return m_gameRules.GetGameRulesString(key); +} + +unsigned char CMinecraftApp::m_szPNG[8]= +{ + 137,80,78,71,13,10,26,10 +}; + +#define PNG_TAG_tEXt 0x74455874 + +unsigned int CMinecraftApp::FromBigEndian(unsigned int uiValue) +{ +#if defined(__PS3__) || defined(_XBOX) + // Keep it in big endian + return uiValue; +#else + unsigned int uiReturn = ( ( uiValue >> 24 ) & 0x000000ff ) | + ( ( uiValue >> 8 ) & 0x0000ff00 ) | + ( ( uiValue << 8 ) & 0x00ff0000 ) | + ( ( uiValue << 24 ) & 0xff000000 ); + return uiReturn; +#endif +} + +void CMinecraftApp::GetImageTextData(PBYTE pbImageData, DWORD dwImageBytes,unsigned char *pszSeed,unsigned int &uiHostOptions,bool &bHostOptionsRead,DWORD &uiTexturePack) +{ + unsigned char *ucPtr=pbImageData; + unsigned int uiCount=0; + unsigned int uiChunkLen; + unsigned int uiChunkType; + unsigned int uiCRC; + char szKeyword[80]; + + // check it's a png + for(int i=0;i<8;i++) + { + if(m_szPNG[i]!=ucPtr[i]) return; + } + + uiCount+=8; + + while(uiCount> std::hex >> uiHostOptions; + } + else if(strcmp(szKeyword,"4J_TEXTUREPACK")==0) + { + // read the texture pack value + unsigned int uiValueC=0; + unsigned char pszTexturePack[8]; // Hex representation of unsigned int + ZeroMemory(&pszTexturePack,8); + while(*pszKeyword!=0 && (pszKeyword < ucPtr + uiCount + uiChunkLen) && uiValueC < 8) + { + pszTexturePack[uiValueC++]=*pszKeyword; + pszKeyword++; + } + + std::stringstream ss; + ss << pszTexturePack; + ss >> std::hex >> uiTexturePack; + } + } + } + uiCount+=uiChunkLen; + uiCRC=*(unsigned int*)&ucPtr[uiCount]; + uiCRC=FromBigEndian(uiCRC); + uiCount+=sizeof(int); + } + + return; +} + +unsigned int CMinecraftApp::CreateImageTextData(PBYTE bTextMetadata, __int64 seed, bool hasSeed, unsigned int uiHostOptions, unsigned int uiTexturePackId) +{ + int iTextMetadataBytes = 0; + if(hasSeed) + { + strcpy((char *)bTextMetadata,"4J_SEED"); + _i64toa_s(seed,(char *)&bTextMetadata[8],42,10); + + // get the length + iTextMetadataBytes+=8; + while(bTextMetadata[iTextMetadataBytes]!=0) iTextMetadataBytes++; + ++iTextMetadataBytes; // Add a null terminator at the end of the seed value + } + + // Save the host options that this world was last played with + strcpy((char *)&bTextMetadata[iTextMetadataBytes],"4J_HOSTOPTIONS"); + _itoa_s(uiHostOptions,(char *)&bTextMetadata[iTextMetadataBytes+15],9,16); + + iTextMetadataBytes += 15; + while(bTextMetadata[iTextMetadataBytes]!=0) iTextMetadataBytes++; + ++iTextMetadataBytes; // Add a null terminator at the end of the host options value + + // Save the texture pack id + strcpy((char *)&bTextMetadata[iTextMetadataBytes],"4J_TEXTUREPACK"); + _itoa_s(uiTexturePackId,(char *)&bTextMetadata[iTextMetadataBytes+15],9,16); + + iTextMetadataBytes += 15; + while(bTextMetadata[iTextMetadataBytes]!=0) iTextMetadataBytes++; + + return iTextMetadataBytes; +} + +void CMinecraftApp::AddTerrainFeaturePosition(_eTerrainFeatureType eFeatureType,int x,int z) +{ + // check we don't already have this in + for(AUTO_VAR(it, m_vTerrainFeatures.begin()); it < m_vTerrainFeatures.end(); ++it) + { + FEATURE_DATA *pFeatureData=*it; + + if((pFeatureData->eTerrainFeature==eFeatureType) &&(pFeatureData->x==x) && (pFeatureData->z==z)) return; + } + + FEATURE_DATA *pFeatureData= new FEATURE_DATA; + pFeatureData->eTerrainFeature=eFeatureType; + pFeatureData->x=x; + pFeatureData->z=z; + + m_vTerrainFeatures.push_back(pFeatureData); +} + +_eTerrainFeatureType CMinecraftApp::IsTerrainFeature(int x,int z) +{ + for(AUTO_VAR(it, m_vTerrainFeatures.begin()); it < m_vTerrainFeatures.end(); ++it) + { + FEATURE_DATA *pFeatureData=*it; + + if((pFeatureData->x==x) && (pFeatureData->z==z)) return pFeatureData->eTerrainFeature; + } + + return eTerrainFeature_None; +} + +bool CMinecraftApp::GetTerrainFeaturePosition(_eTerrainFeatureType eType,int *pX, int *pZ) +{ + for(AUTO_VAR(it, m_vTerrainFeatures.begin()); it < m_vTerrainFeatures.end(); ++it) + { + FEATURE_DATA *pFeatureData=*it; + + if(pFeatureData->eTerrainFeature==eType) + { + *pX=pFeatureData->x; + *pZ=pFeatureData->z; + return true; + } + } + + return false; +} + +void CMinecraftApp::ClearTerrainFeaturePosition() +{ + FEATURE_DATA *pFeatureData; + while(m_vTerrainFeatures.size()>0) + { + pFeatureData = m_vTerrainFeatures.back(); + m_vTerrainFeatures.pop_back(); + delete pFeatureData; + } +} + +void CMinecraftApp::UpdatePlayerInfo(BYTE networkSmallId, SHORT playerColourIndex, unsigned int playerGamePrivileges) +{ + for(unsigned int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++i) + { + if(m_playerColours[i]==networkSmallId) + { + m_playerColours[i] = 0; + m_playerGamePrivileges[i] = 0; + } + } + if(playerColourIndex >=0 && playerColourIndex < MINECRAFT_NET_MAX_PLAYERS) + { + m_playerColours[playerColourIndex] = networkSmallId; + m_playerGamePrivileges[playerColourIndex] = playerGamePrivileges; + } +} + +short CMinecraftApp::GetPlayerColour(BYTE networkSmallId) +{ + short index = -1; + for(unsigned int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++i) + { + if(m_playerColours[i]==networkSmallId) + { + index = i; + break; + } + } + return index; +} + + +unsigned int CMinecraftApp::GetPlayerPrivileges(BYTE networkSmallId) +{ + unsigned int privileges = 0; + for(unsigned int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++i) + { + if(m_playerColours[i]==networkSmallId) + { + privileges = m_playerGamePrivileges[i]; + break; + } + } + return privileges; +} + +wstring CMinecraftApp::getEntityName(eINSTANCEOF type) +{ + switch(type) + { + case eTYPE_WOLF: + return app.GetString(IDS_WOLF); + case eTYPE_CREEPER: + return app.GetString(IDS_CREEPER); + case eTYPE_SKELETON: + return app.GetString(IDS_SKELETON); + case eTYPE_SPIDER: + return app.GetString(IDS_SPIDER); + case eTYPE_ZOMBIE: + return app.GetString(IDS_ZOMBIE); + case eTYPE_PIGZOMBIE: + return app.GetString(IDS_PIGZOMBIE); + case eTYPE_ENDERMAN: + return app.GetString(IDS_ENDERMAN); + case eTYPE_SILVERFISH: + return app.GetString(IDS_SILVERFISH); + case eTYPE_CAVESPIDER: + return app.GetString(IDS_CAVE_SPIDER); + case eTYPE_GHAST: + return app.GetString(IDS_GHAST); + case eTYPE_SLIME: + return app.GetString(IDS_SLIME); + case eTYPE_ARROW: + return app.GetString(IDS_ITEM_ARROW); + case eTYPE_ENDERDRAGON: + return app.GetString(IDS_ENDERDRAGON); + case eTYPE_BLAZE: + return app.GetString(IDS_BLAZE); + case eTYPE_LAVASLIME: + return app.GetString(IDS_LAVA_SLIME); + // 4J-PB - fix for #107167 - Customer Encountered: TU12: Content: UI: There is no information what killed Player after being slain by Iron Golem. + case eTYPE_VILLAGERGOLEM: + return app.GetString(IDS_IRONGOLEM); + + }; + + return L""; +} + +DWORD CMinecraftApp::m_dwContentTypeA[e_Marketplace_MAX]= +{ + XMARKETPLACE_OFFERING_TYPE_CONTENT, // e_DLC_SkinPack, e_DLC_TexturePacks, e_DLC_MashupPacks +#ifndef _XBOX_ONE + XMARKETPLACE_OFFERING_TYPE_THEME, // e_DLC_Themes + XMARKETPLACE_OFFERING_TYPE_AVATARITEM, // e_DLC_AvatarItems + XMARKETPLACE_OFFERING_TYPE_TILE, // e_DLC_Gamerpics +#endif +}; + +unsigned int CMinecraftApp::AddDLCRequest(eDLCMarketplaceType eType, bool bPromote) +{ + // lock access + EnterCriticalSection(&csDLCDownloadQueue); + + // If it's already in there, promote it to the top of the list + int iPosition=0; + for(AUTO_VAR(it, m_DLCDownloadQueue.begin()); it != m_DLCDownloadQueue.end(); ++it) + { + DLCRequest *pCurrent = *it; + + if(pCurrent->dwType==m_dwContentTypeA[eType]) + { + // already got this in the list + if(pCurrent->eState == e_DLC_ContentState_Retrieving || pCurrent->eState == e_DLC_ContentState_Retrieved) + { + // already retrieved this + LeaveCriticalSection(&csDLCDownloadQueue); + return 0; + } + else + { + // promote + if(bPromote) + { + m_DLCDownloadQueue.erase(m_DLCDownloadQueue.begin()+iPosition); + m_DLCDownloadQueue.insert(m_DLCDownloadQueue.begin(),pCurrent); + } + LeaveCriticalSection(&csDLCDownloadQueue); + return 0; + } + } + iPosition++; + } + + DLCRequest *pDLCreq = new DLCRequest; + pDLCreq->dwType=m_dwContentTypeA[eType]; + pDLCreq->eState=e_DLC_ContentState_Idle; + + m_DLCDownloadQueue.push_back(pDLCreq); + + m_bAllDLCContentRetrieved=false; + LeaveCriticalSection(&csDLCDownloadQueue); + + app.DebugPrintf("[Consoles_App] Added DLC request.\n"); + return 1; +} + +unsigned int CMinecraftApp::AddTMSPPFileTypeRequest(eDLCContentType eType, bool bPromote) +{ +#if !defined(__PS3__) && !defined(__ORBIS__) && !defined(__PSVITA__) + // lock access + EnterCriticalSection(&csTMSPPDownloadQueue); + + // If it's already in there, promote it to the top of the list + int iPosition=0; + //ignore promoting for now + /* + bool bPromoted=false; + + + for(AUTO_VAR(it, m_TMSPPDownloadQueue.begin()); it != m_TMSPPDownloadQueue.end(); ++it) + { + TMSPPRequest *pCurrent = *it; + + if(pCurrent->eType==eType) + { + if(!(pCurrent->eState == e_TMS_ContentState_Retrieving || pCurrent->eState == e_TMS_ContentState_Retrieved)) + { + // promote + if(bPromote) + { + m_TMSPPDownloadQueue.erase(m_TMSPPDownloadQueue.begin()+iPosition); + m_TMSPPDownloadQueue.insert(m_TMSPPDownloadQueue.begin(),pCurrent); + bPromoted=true; + } + } + } + iPosition++; + } + + if(bPromoted) + { + // re-ordered the list, so leave now + LeaveCriticalSection(&csTMSPPDownloadQueue); + return 0; + } + */ + + // special case for data files (not image files) + if(eType==e_DLC_TexturePackData) + { + + + int iCount=GetDLCInfoFullOffersCount(); + + for(int i=0;ieDLCType==e_DLC_TexturePacks) || (pDLC->eDLCType==e_DLC_MashupPacks)) + { + // first check if the image is already in the memory textures, since we might be loading some from the Title Update partition + if(pDLC->wchDataFile[0]!=0) + { + //WCHAR *cString = pDLC->wchDataFile; + // 4J-PB - shouldn't check this here - let the TMS files override it, so if they are on TMS, we'll take them first + //int iIndex = app.GetLocalTMSFileIndex(pDLC->wchDataFile,true); + + //if(iIndex!=-1) + { + bool bPresent = app.IsFileInTPD(pDLC->iConfig); + + if(!bPresent) + { + // this may already be present in the vector because of a previous trial/full offer + + bool bAlreadyInQueue=false; + for(AUTO_VAR(it, m_TMSPPDownloadQueue.begin()); it != m_TMSPPDownloadQueue.end(); ++it) + { + TMSPPRequest *pCurrent = *it; + + if(wcscmp(pDLC->wchDataFile,pCurrent->wchFilename)==0) + { + bAlreadyInQueue=true; + break; + } + } + + if(!bAlreadyInQueue) + { + TMSPPRequest *pTMSPPreq = new TMSPPRequest; + + pTMSPPreq->CallbackFunc=&CMinecraftApp::TMSPPFileReturned; + pTMSPPreq->lpCallbackParam=this; + pTMSPPreq->eStorageFacility=C4JStorage::eGlobalStorage_Title; + pTMSPPreq->eFileTypeVal=C4JStorage::TMS_FILETYPE_BINARY; + memcpy(pTMSPPreq->wchFilename,pDLC->wchDataFile,sizeof(WCHAR)*MAX_BANNERNAME_SIZE); + pTMSPPreq->eType=e_DLC_TexturePackData; + pTMSPPreq->eState=e_TMS_ContentState_Queued; + m_bAllTMSContentRetrieved=false; + m_TMSPPDownloadQueue.push_back(pTMSPPreq); + } + } + else + { + app.DebugPrintf("Texture data already present in the TPD\n"); + } + } + } + } + } + } + else + { // for all the files of type eType, add them to the download list + + // run through the trial offers first, then the full offers. Any duplicates won't be added to the download queue + int iCount; +#ifdef _XBOX // Only trial offers on Xbox 360 + iCount=GetDLCInfoTrialOffersCount(); + for(int i=0;ieDLCType==eType) + { + + WCHAR *cString = pDLC->wchBanner; + + // 4J-PB - shouldn't check this here - let the TMS files override it, so if they are on TMS, we'll take them first + // is the file in the TMS XZP? + //int iIndex = app.GetLocalTMSFileIndex(cString,true); + + //if(iIndex!=-1) + { + bool bPresent = app.IsFileInMemoryTextures(cString); + + if(!bPresent) // retrieve it from TMSPP + { + bool bAlreadyInQueue=false; + for(AUTO_VAR(it, m_TMSPPDownloadQueue.begin()); it != m_TMSPPDownloadQueue.end(); ++it) + { + TMSPPRequest *pCurrent = *it; + + if(wcscmp(pDLC->wchBanner,pCurrent->wchFilename)==0) + { + bAlreadyInQueue=true; + break; + } + } + + if(!bAlreadyInQueue) + { + TMSPPRequest *pTMSPPreq = new TMSPPRequest; + + pTMSPPreq->CallbackFunc=&CMinecraftApp::TMSPPFileReturned; + pTMSPPreq->lpCallbackParam=this; + pTMSPPreq->eStorageFacility=C4JStorage::eGlobalStorage_Title; + pTMSPPreq->eFileTypeVal=C4JStorage::TMS_FILETYPE_BINARY; + //wcstombs(pTMSPPreq->szFilename,pDLC->wchBanner,MAX_TMSFILENAME_SIZE); + memcpy(pTMSPPreq->wchFilename,pDLC->wchBanner,sizeof(WCHAR)*MAX_BANNERNAME_SIZE); + pTMSPPreq->eType=eType; + pTMSPPreq->eState=e_TMS_ContentState_Queued; + + m_bAllTMSContentRetrieved=false; + m_TMSPPDownloadQueue.push_back(pTMSPPreq); + app.DebugPrintf("===m_TMSPPDownloadQueue Adding %ls, q size is %d\n",pTMSPPreq->wchFilename,m_TMSPPDownloadQueue.size()); + } + } + } + } + } +#endif + // and the full offers + + iCount=GetDLCInfoFullOffersCount(); + for(int i=0;iwchType,wchDLCTypeNames[eType])==0) + if(pDLC->eDLCType==eType) + { + // first check if the image is already in the memory textures, since we might be loading some from the Title Update partition + + WCHAR *cString = pDLC->wchBanner; + // 4J-PB - shouldn't check this here - let the TMS files override it, so if they are on TMS, we'll take them first + //int iIndex = app.GetLocalTMSFileIndex(cString,true); + + //if(iIndex!=-1) + { + bool bPresent = app.IsFileInMemoryTextures(cString); + + if(!bPresent) + { + // this may already be present in the vector because of a previous trial/full offer + + bool bAlreadyInQueue=false; + for(AUTO_VAR(it, m_TMSPPDownloadQueue.begin()); it != m_TMSPPDownloadQueue.end(); ++it) + { + TMSPPRequest *pCurrent = *it; + + if(wcscmp(pDLC->wchBanner,pCurrent->wchFilename)==0) + { + bAlreadyInQueue=true; + break; + } + } + + if(!bAlreadyInQueue) + { + //app.DebugPrintf("Adding a request to the TMSPP download queue - %ls\n",pDLC->wchBanner); + TMSPPRequest *pTMSPPreq = new TMSPPRequest; + ZeroMemory(pTMSPPreq,sizeof(TMSPPRequest)); + + pTMSPPreq->CallbackFunc=&CMinecraftApp::TMSPPFileReturned; + pTMSPPreq->lpCallbackParam=this; + // 4J-PB - testing for now + //pTMSPPreq->eStorageFacility=C4JStorage::eGlobalStorage_TitleUser; + pTMSPPreq->eStorageFacility=C4JStorage::eGlobalStorage_Title; + pTMSPPreq->eFileTypeVal=C4JStorage::TMS_FILETYPE_BINARY; + //wcstombs(pTMSPPreq->szFilename,pDLC->wchBanner,MAX_TMSFILENAME_SIZE); + + memcpy(pTMSPPreq->wchFilename,pDLC->wchBanner,sizeof(WCHAR)*MAX_BANNERNAME_SIZE); + pTMSPPreq->eType=eType; + pTMSPPreq->eState=e_TMS_ContentState_Queued; + m_bAllTMSContentRetrieved=false; + m_TMSPPDownloadQueue.push_back(pTMSPPreq); + app.DebugPrintf("===m_TMSPPDownloadQueue Adding %ls, q size is %d\n",pTMSPPreq->wchFilename,m_TMSPPDownloadQueue.size()); + } + } + } + } + } + } + + LeaveCriticalSection(&csTMSPPDownloadQueue); +#endif + return 1; +} + +bool CMinecraftApp::CheckTMSDLCCanStop() +{ + EnterCriticalSection(&csTMSPPDownloadQueue); + for(AUTO_VAR(it, m_TMSPPDownloadQueue.begin()); it != m_TMSPPDownloadQueue.end(); ++it) + { + TMSPPRequest *pCurrent = *it; + + if(pCurrent->eState==e_TMS_ContentState_Retrieving) + { + LeaveCriticalSection(&csTMSPPDownloadQueue); + return false; + } + } + LeaveCriticalSection(&csTMSPPDownloadQueue); + + return true; +} + + +bool CMinecraftApp::RetrieveNextDLCContent() +{ + // If there's already a retrieve in progress, quit + // we may have re-ordered the list, so need to check every item + + // is there a primary player and a network connection? + int primPad = ProfileManager.GetPrimaryPad(); + if ( primPad == -1 || !ProfileManager.IsSignedInLive(primPad) ) + { + return true; // 4J-JEV: We need to wait until the primary player is online. + } + + EnterCriticalSection(&csDLCDownloadQueue); + for(AUTO_VAR(it, m_DLCDownloadQueue.begin()); it != m_DLCDownloadQueue.end(); ++it) + { + DLCRequest *pCurrent = *it; + + if(pCurrent->eState==e_DLC_ContentState_Retrieving) + { + LeaveCriticalSection(&csDLCDownloadQueue); + return true; + } + } + + // Now look for the next retrieval + for(AUTO_VAR(it, m_DLCDownloadQueue.begin()); it != m_DLCDownloadQueue.end(); ++it) + { + DLCRequest *pCurrent = *it; + + if(pCurrent->eState==e_DLC_ContentState_Idle) + { +#ifdef _DEBUG + app.DebugPrintf("RetrieveNextDLCContent - type = %d\n",pCurrent->dwType); +#endif + + C4JStorage::EDLCStatus status = StorageManager.GetDLCOffers(ProfileManager.GetPrimaryPad(), &CMinecraftApp::DLCOffersReturned, this, pCurrent->dwType); + if(status==C4JStorage::EDLC_Pending) + { + pCurrent->eState=e_DLC_ContentState_Retrieving; + } + else + { + // no content of this type, or some other problem + app.DebugPrintf("RetrieveNextDLCContent - PROBLEM\n"); + pCurrent->eState=e_DLC_ContentState_Retrieved; + } + LeaveCriticalSection(&csDLCDownloadQueue); + return true; + } + } + LeaveCriticalSection(&csDLCDownloadQueue); + + app.DebugPrintf("[Consoles_App] Finished downloading dlc content.\n"); + return false; +} + +#if !defined(__PS3__) && !defined(__ORBIS__) && !defined(__PSVITA__) +#ifdef _XBOX_ONE +int CMinecraftApp::TMSPPFileReturned(LPVOID pParam,int iPad,int iUserData,LPVOID lpvData, WCHAR* wchFilename) +{ + C4JStorage::PTMSPP_FILEDATA pFileData=(C4JStorage::PTMSPP_FILEDATA)lpvData; +#else +int CMinecraftApp::TMSPPFileReturned(LPVOID pParam,int iPad,int iUserData,C4JStorage::PTMSPP_FILEDATA pFileData, LPCSTR szFilename) +{ +#endif + + CMinecraftApp* pClass = (CMinecraftApp *) pParam; + + // find the right one in the vector + EnterCriticalSection(&pClass->csTMSPPDownloadQueue); + for(AUTO_VAR(it, pClass->m_TMSPPDownloadQueue.begin()); it != pClass->m_TMSPPDownloadQueue.end(); ++it) + { + TMSPPRequest *pCurrent = *it; +#if defined(_XBOX) || defined(_WINDOWS64) + char szFile[MAX_TMSFILENAME_SIZE]; + wcstombs(szFile,pCurrent->wchFilename,MAX_TMSFILENAME_SIZE); + + + if(strcmp(szFilename,szFile)==0) +#elif _XBOX_ONE + if(wcscmp(wchFilename,pCurrent->wchFilename)==0) +#endif + { + // set this to retrieved whether it found it or not + pCurrent->eState=e_TMS_ContentState_Retrieved; + + if(pFileData!=NULL) + { + +#ifdef _XBOX_ONE + + + switch(pCurrent->eType) + { + case e_DLC_TexturePackData: + { + // 4J-PB - we need to allocate memory for the file data and copy into it, since the current data is a reference into the blob download memory + PBYTE pbData = new BYTE [pFileData->dwSize]; + memcpy(pbData,pFileData->pbData,pFileData->dwSize); + + pClass->m_vTMSPPData.push_back(pbData); + app.DebugPrintf("Got texturepack data\n"); + // get the config value for the texture pack + int iConfig=app.GetTPConfigVal(pCurrent->wchFilename); + app.AddMemoryTPDFile(iConfig, pbData, pFileData->dwSize); + } + break; + default: + // 4J-PB - check the data is an image + if(pFileData->pbData[0]==0x89) + { + // 4J-PB - we need to allocate memory for the file data and copy into it, since the current data is a reference into the blob download memory + PBYTE pbData = new BYTE [pFileData->dwSize]; + memcpy(pbData,pFileData->pbData,pFileData->dwSize); + + pClass->m_vTMSPPData.push_back(pbData); + app.DebugPrintf("Got image data - %ls\n",pCurrent->wchFilename); + app.AddMemoryTextureFile(pCurrent->wchFilename, pbData, pFileData->dwSize); + } + else + { + app.DebugPrintf("Got image data, but it's not a png - %ls\n",pCurrent->wchFilename); + } + break; + } + +#else + switch(pCurrent->eType) + { + case e_DLC_TexturePackData: + { + app.DebugPrintf("--- Got texturepack data %ls\n",pCurrent->wchFilename); + // get the config value for the texture pack + int iConfig=app.GetTPConfigVal(pCurrent->wchFilename); + app.AddMemoryTPDFile(iConfig, pFileData->pbData, pFileData->dwSize); + } + break; + default: + app.DebugPrintf("--- Got image data - %ls\n",pCurrent->wchFilename); + app.AddMemoryTextureFile(pCurrent->wchFilename, pFileData->pbData, pFileData->dwSize); + break; + } +#endif + } + else + { +#ifdef _XBOX_ONE + app.DebugPrintf("TMSImageReturned failed (%ls)...\n",wchFilename); +#else + app.DebugPrintf("TMSImageReturned failed (%s)...\n",szFilename); +#endif + } + break; + } + + } + LeaveCriticalSection(&pClass->csTMSPPDownloadQueue); + + return 0; +} +#endif + +bool CMinecraftApp::RetrieveNextTMSPPContent() +{ +#if defined _XBOX || defined _XBOX_ONE + // If there's already a retrieve in progress, quit + // we may have re-ordered the list, so need to check every item + + // is there a primary player and a network connection? + if(ProfileManager.GetPrimaryPad()==-1) return false; + + if(ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())==false) return false; + + EnterCriticalSection(&csTMSPPDownloadQueue); + for(AUTO_VAR(it, m_TMSPPDownloadQueue.begin()); it != m_TMSPPDownloadQueue.end(); ++it) + { + TMSPPRequest *pCurrent = *it; + + if(pCurrent->eState==e_TMS_ContentState_Retrieving) + { + app.DebugPrintf("."); + LeaveCriticalSection(&csTMSPPDownloadQueue); + return true; + } + } + + // Now look for the next retrieval + for(AUTO_VAR(it, m_TMSPPDownloadQueue.begin()); it != m_TMSPPDownloadQueue.end(); ++it) + { + TMSPPRequest *pCurrent = *it; + + if(pCurrent->eState==e_TMS_ContentState_Queued) + { + // 4J-PB - the file may be in the local TMS files, but try to retrieve it from the remote TMS in case it's been changed. If it's not in the list of TMS files, this will + // return right away with a ETMSStatus_Fail_ReadDetailsNotRetrieved +#ifdef _XBOX + char szFilename[MAX_TMSFILENAME_SIZE]; + wcstombs(szFilename,pCurrent->wchFilename,MAX_TMSFILENAME_SIZE); + + app.DebugPrintf("\nRetrieveNextTMSPPContent - type = %d, %s\n",pCurrent->eType,szFilename); + + C4JStorage::ETMSStatus status=StorageManager.TMSPP_ReadFile(ProfileManager.GetPrimaryPad(),pCurrent->eStorageFacility,pCurrent->eFileTypeVal,szFilename,pCurrent->CallbackFunc,this); + switch(status) + { + case C4JStorage::ETMSStatus_Pending: + pCurrent->eState=e_TMS_ContentState_Retrieving; + break; + case C4JStorage::ETMSStatus_Idle: + pCurrent->eState=e_TMS_ContentState_Retrieved; + break; + case C4JStorage::ETMSStatus_Fail_ReadInProgress: + case C4JStorage::ETMSStatus_ReadInProgress: + pCurrent->eState=e_TMS_ContentState_Retrieving; + if(pCurrent->eState==C4JStorage::ETMSStatus_Fail_ReadInProgress) + { + app.DebugPrintf("TMSPP_ReadFile failed - read in progress\n"); + Sleep(50); + LeaveCriticalSection(&csTMSPPDownloadQueue); + return false; + } + break; + default: + pCurrent->eState=e_TMS_ContentState_Retrieved; + break; + } +#else + eTitleStorageState status; + app.DebugPrintf("RetrieveNextTMSPPContent - type = %d, %ls\n",pCurrent->eType,pCurrent->wchFilename); + //eTitleStorageState status=StorageManager.TMSPP_ReadFile(ProfileManager.GetPrimaryPad(),pCurrent->eStorageFacility,pCurrent->eFileTypeVal,pCurrent->wchFilename,pCurrent->CallbackFunc,this,0); + if(0)//wcscmp(pCurrent->wchFilename,L"TP01.png")==0) + { + // TP01 fails because the blob size returned is bigger than the global metadata says it should be + status=eTitleStorage_readerror; + } + else + { + status=StorageManager.TMSPP_ReadFile(ProfileManager.GetPrimaryPad(),pCurrent->eStorageFacility,pCurrent->eFileTypeVal,pCurrent->wchFilename,pCurrent->CallbackFunc,this,0); + } + switch(status) + { + case eTitleStorage_pending: + pCurrent->eState=e_TMS_ContentState_Retrieving; + break; + case eTitleStorage_idle: + pCurrent->eState=e_TMS_ContentState_Retrieved; + break; + case eTitleStorage_busy: + // try again next time + { + app.DebugPrintf("@@@@@@@@@@@@@@@@@ TMSPP_ReadFile failed - busy (probably reading already)\n"); + Sleep(50); + LeaveCriticalSection(&csTMSPPDownloadQueue); + return false; + } + break; + default: + pCurrent->eState=e_TMS_ContentState_Retrieved; + break; + } +#endif + + + + LeaveCriticalSection(&csTMSPPDownloadQueue); + return true; + } + } + + LeaveCriticalSection(&csTMSPPDownloadQueue); + +#endif + return false; +} + +void CMinecraftApp::TickDLCOffersRetrieved() +{ + if(!m_bAllDLCContentRetrieved) + { + if (!app.RetrieveNextDLCContent()) + { + app.DebugPrintf("[Consoles_App] All content retrieved.\n"); + m_bAllDLCContentRetrieved=true; + } + } +} +void CMinecraftApp::ClearAndResetDLCDownloadQueue() +{ + app.DebugPrintf("[Consoles_App] Clear and reset download queue.\n"); + + int iPosition=0; + EnterCriticalSection(&csTMSPPDownloadQueue); + for(AUTO_VAR(it, m_DLCDownloadQueue.begin()); it != m_DLCDownloadQueue.end(); ++it) + { + DLCRequest *pCurrent = *it; + + delete pCurrent; + iPosition++; + } + m_DLCDownloadQueue.clear(); + m_bAllDLCContentRetrieved=true; + LeaveCriticalSection(&csTMSPPDownloadQueue); +} + +void CMinecraftApp::TickTMSPPFilesRetrieved() +{ + if(m_bTickTMSDLCFiles && !m_bAllTMSContentRetrieved) + { + if(app.RetrieveNextTMSPPContent()==false) + { + m_bAllTMSContentRetrieved=true; + } + } +} +void CMinecraftApp::ClearTMSPPFilesRetrieved() +{ + int iPosition=0; + EnterCriticalSection(&csTMSPPDownloadQueue); + for(AUTO_VAR(it, m_TMSPPDownloadQueue.begin()); it != m_TMSPPDownloadQueue.end(); ++it) + { + TMSPPRequest *pCurrent = *it; + + delete pCurrent; + iPosition++; + } + m_TMSPPDownloadQueue.clear(); + m_bAllTMSContentRetrieved=true; + LeaveCriticalSection(&csTMSPPDownloadQueue); +} + +int CMinecraftApp::DLCOffersReturned(void *pParam, int iOfferC, DWORD dwType, int iPad) +{ + CMinecraftApp* pClass = (CMinecraftApp *) pParam; + + // find the right one in the vector + EnterCriticalSection(&pClass->csTMSPPDownloadQueue); + for(AUTO_VAR(it, pClass->m_DLCDownloadQueue.begin()); it != pClass->m_DLCDownloadQueue.end(); ++it) + { + DLCRequest *pCurrent = *it; + + // avatar items are coming back as type Content, so we can't trust the type setting + if(pCurrent->dwType==dwType) + { + pClass->m_iDLCOfferC = iOfferC; + app.DebugPrintf("DLCOffersReturned - type %d, count %d - setting to retrieved\n",dwType,iOfferC); + pCurrent->eState=e_DLC_ContentState_Retrieved; + break; + } + } + LeaveCriticalSection(&pClass->csTMSPPDownloadQueue); + return 0; +} + +eDLCContentType CMinecraftApp::Find_eDLCContentType(DWORD dwType) +{ + for(int i=0;idwType==m_dwContentTypeA[eType]) && (pCurrent->eState==e_DLC_ContentState_Retrieved)) + { + LeaveCriticalSection(&csDLCDownloadQueue); + return true; + } + } + LeaveCriticalSection(&csDLCDownloadQueue); + return false; +} + +void CMinecraftApp::SetAdditionalSkinBoxes(DWORD dwSkinID, SKIN_BOX *SkinBoxA, DWORD dwSkinBoxC) +{ + EntityRenderer *renderer = EntityRenderDispatcher::instance->getRenderer(eTYPE_PLAYER); + Model *pModel = renderer->getModel(); + vector *pvModelPart = new vector; + vector *pvSkinBoxes = new vector; + + EnterCriticalSection( &csAdditionalModelParts ); + EnterCriticalSection( &csAdditionalSkinBoxes ); + + app.DebugPrintf("*** SetAdditionalSkinBoxes - Inserting model parts for skin %d from array of Skin Boxes\n",dwSkinID&0x0FFFFFFF); + + // convert the skin boxes into model parts, and add to the humanoid model + for(unsigned int i=0;iAddOrRetrievePart(&SkinBoxA[i]); + pvModelPart->push_back(pModelPart); + pvSkinBoxes->push_back(&SkinBoxA[i]); + } + } + + + m_AdditionalModelParts.insert( std::pair *>(dwSkinID, pvModelPart) ); + m_AdditionalSkinBoxes.insert( std::pair *>(dwSkinID, pvSkinBoxes) ); + + LeaveCriticalSection( &csAdditionalSkinBoxes ); + LeaveCriticalSection( &csAdditionalModelParts ); + +} + +vector * CMinecraftApp::SetAdditionalSkinBoxes(DWORD dwSkinID, vector *pvSkinBoxA) +{ + EntityRenderer *renderer = EntityRenderDispatcher::instance->getRenderer(eTYPE_PLAYER); + Model *pModel = renderer->getModel(); + vector *pvModelPart = new vector; + + EnterCriticalSection( &csAdditionalModelParts ); + EnterCriticalSection( &csAdditionalSkinBoxes ); + app.DebugPrintf("*** SetAdditionalSkinBoxes - Inserting model parts for skin %d from array of Skin Boxes\n",dwSkinID&0x0FFFFFFF); + + // convert the skin boxes into model parts, and add to the humanoid model + for(AUTO_VAR(it, pvSkinBoxA->begin());it != pvSkinBoxA->end(); ++it) + { + if(pModel) + { + ModelPart *pModelPart=pModel->AddOrRetrievePart(*it); + pvModelPart->push_back(pModelPart); + } + } + + m_AdditionalModelParts.insert( std::pair *>(dwSkinID, pvModelPart) ); + m_AdditionalSkinBoxes.insert( std::pair *>(dwSkinID, pvSkinBoxA) ); + + LeaveCriticalSection( &csAdditionalSkinBoxes ); + LeaveCriticalSection( &csAdditionalModelParts ); + return pvModelPart; +} + + +vector *CMinecraftApp::GetAdditionalModelParts(DWORD dwSkinID) +{ + EnterCriticalSection( &csAdditionalModelParts ); + vector *pvModelParts=NULL; + if(m_AdditionalModelParts.size()>0) + { + AUTO_VAR(it, m_AdditionalModelParts.find(dwSkinID)); + if(it!=m_AdditionalModelParts.end()) + { + pvModelParts = (*it).second; + } + } + + LeaveCriticalSection( &csAdditionalModelParts ); + return pvModelParts; +} + +vector *CMinecraftApp::GetAdditionalSkinBoxes(DWORD dwSkinID) +{ + EnterCriticalSection( &csAdditionalSkinBoxes ); + vector *pvSkinBoxes=NULL; + if(m_AdditionalSkinBoxes.size()>0) + { + AUTO_VAR(it,m_AdditionalSkinBoxes.find(dwSkinID)); + if(it!=m_AdditionalSkinBoxes.end()) + { + pvSkinBoxes = (*it).second; + } + } + + LeaveCriticalSection( &csAdditionalSkinBoxes ); + return pvSkinBoxes; +} + +unsigned int CMinecraftApp::GetAnimOverrideBitmask(DWORD dwSkinID) +{ + EnterCriticalSection( &csAnimOverrideBitmask ); + unsigned int uiAnimOverrideBitmask=0L; + + if(m_AnimOverrides.size()>0) + { + AUTO_VAR(it, m_AnimOverrides.find(dwSkinID)); + if(it!=m_AnimOverrides.end()) + { + uiAnimOverrideBitmask = (*it).second; + } + } + + LeaveCriticalSection( &csAnimOverrideBitmask ); + return uiAnimOverrideBitmask; +} + +void CMinecraftApp::SetAnimOverrideBitmask(DWORD dwSkinID,unsigned int uiAnimOverrideBitmask) +{ + // Make thread safe + EnterCriticalSection( &csAnimOverrideBitmask ); + + if(m_AnimOverrides.size()>0) + { + AUTO_VAR(it, m_AnimOverrides.find(dwSkinID)); + if(it!=m_AnimOverrides.end()) + { + LeaveCriticalSection( &csAnimOverrideBitmask ); + return; // already in here + } + } + m_AnimOverrides.insert( std::pair(dwSkinID, uiAnimOverrideBitmask) ); + LeaveCriticalSection( &csAnimOverrideBitmask ); +} + +DWORD CMinecraftApp::getSkinIdFromPath(const wstring &skin) +{ + bool dlcSkin = false; + unsigned int skinId = 0; + + if(skin.size() >= 14) + { + dlcSkin = skin.substr(0,3).compare(L"dlc") == 0; + + wstring skinValue = skin.substr(7,skin.size()); + skinValue = skinValue.substr(0,skinValue.find_first_of(L'.')); + + std::wstringstream ss; + // 4J Stu - dlc skins are numbered using decimal to make it easier for artists/people to number manually + // Everything else is numbered using hex + if(dlcSkin) + ss << std::dec << skinValue.c_str(); + else + ss << std::hex << skinValue.c_str(); + ss >> skinId; + + skinId = MAKE_SKIN_BITMASK(dlcSkin, skinId); + } + return skinId; +} + +wstring CMinecraftApp::getSkinPathFromId(DWORD skinId) +{ + // 4J Stu - This function maps the encoded DWORD we store in the player profile + // to a filename that is stored as a memory texture and shared between systems in game + wchar_t chars[256]; + if( GET_IS_DLC_SKIN_FROM_BITMASK(skinId) ) + { + // 4J Stu - DLC skins are numbered using decimal rather than hex to make it easier to number manually + swprintf(chars, 256, L"dlcskin%08d.png", GET_DLC_SKIN_ID_FROM_BITMASK(skinId)); + + } + else + { + DWORD ugcSkinIndex = GET_UGC_SKIN_ID_FROM_BITMASK(skinId); + DWORD defaultSkinIndex = GET_DEFAULT_SKIN_ID_FROM_BITMASK(skinId); + if( ugcSkinIndex == 0 ) + { + swprintf(chars, 256, L"defskin%08X.png",defaultSkinIndex); + } + else + { + swprintf(chars, 256, L"ugcskin%08X.png",ugcSkinIndex); + } + } + return chars; +} + + +int CMinecraftApp::TexturePackDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ +#ifdef _XBOX + if(result!=C4JStorage::EMessage_Cancelled) + { + if(app.GetRequiredTexturePackID()!=0) + { + // we need to enable background downloading for the DLC + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); + + ULONGLONG ullOfferID_Full; + ULONGLONG ullIndexA[1]; + app.GetDLCFullOfferIDForPackID(app.GetRequiredTexturePackID(),&ullOfferID_Full); + + if( result==C4JStorage::EMessage_ResultAccept ) // Full version + { + ullIndexA[0]=ullOfferID_Full; + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + } + else // trial version + { + DLC_INFO *pDLCInfo=app.GetDLCInfoForFullOfferID(ullOfferID_Full); + ullIndexA[0]=pDLCInfo->ullOfferID_Trial; + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + } + } + } +#endif + return 0; +} + +int CMinecraftApp::getArchiveFileSize(const wstring &filename) +{ + TexturePack *tPack = NULL; + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft && pMinecraft->skins) tPack = pMinecraft->skins->getSelected(); + if(tPack && tPack->hasData() && tPack->getArchiveFile() && tPack->getArchiveFile()->hasFile(filename)) + { + return tPack->getArchiveFile()->getFileSize(filename); + } + else return m_mediaArchive->getFileSize(filename); +} + +bool CMinecraftApp::hasArchiveFile(const wstring &filename) +{ + TexturePack *tPack = NULL; + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft && pMinecraft->skins) tPack = pMinecraft->skins->getSelected(); + if(tPack && tPack->hasData() && tPack->getArchiveFile() && tPack->getArchiveFile()->hasFile(filename)) return true; + else return m_mediaArchive->hasFile(filename); +} + +byteArray CMinecraftApp::getArchiveFile(const wstring &filename) +{ + TexturePack *tPack = NULL; + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft && pMinecraft->skins) tPack = pMinecraft->skins->getSelected(); + if(tPack && tPack->hasData() && tPack->getArchiveFile() && tPack->getArchiveFile()->hasFile(filename)) + { + return tPack->getArchiveFile()->getFile(filename); + } + else return m_mediaArchive->getFile(filename); +} + +// DLC + +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) +int CMinecraftApp::GetDLCInfoCount() +{ + return (int)DLCInfo.size(); +} +#elif defined _XBOX_ONE +int CMinecraftApp::GetDLCInfoTrialOffersCount() +{ + return 0; +} + +int CMinecraftApp::GetDLCInfoFullOffersCount() +{ + return (int)DLCInfo_Full.size(); +} +#else +int CMinecraftApp::GetDLCInfoTrialOffersCount() +{ + return (int)DLCInfo_Trial.size(); +} + +int CMinecraftApp::GetDLCInfoFullOffersCount() +{ + return (int)DLCInfo_Full.size(); +} +#endif + +int CMinecraftApp::GetDLCInfoTexturesOffersCount() +{ + return (int)DLCTextures_PackID.size(); +} + +// AUTOSAVE +void CMinecraftApp::SetAutosaveTimerTime(void) +{ +#if defined(_XBOX_ONE) || defined(__ORBIS__) + m_uiAutosaveTimer= GetTickCount()+1000*60; +#else + m_uiAutosaveTimer= GetTickCount()+GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_Autosave)*1000*60*15; +#endif +}// value x 15 to get mins, x60 for secs + +bool CMinecraftApp::AutosaveDue(void) +{ + return (GetTickCount()>m_uiAutosaveTimer); +} + +unsigned int CMinecraftApp::SecondsToAutosave() +{ + return (m_uiAutosaveTimer - GetTickCount() ) / 1000; +} + +void CMinecraftApp::SetTrialTimerStart(void) +{ + m_fTrialTimerStart=m_Time.fAppTime; mfTrialPausedTime=0.0f; +} + +float CMinecraftApp::getTrialTimer(void) +{ + return m_Time.fAppTime-m_fTrialTimerStart-mfTrialPausedTime; +} + +bool CMinecraftApp::IsLocalMultiplayerAvailable() +{ + DWORD connectedControllers = 0; + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if( InputManager.IsPadConnected(i) || ProfileManager.IsSignedIn(i) ) ++connectedControllers; + } + + bool available = RenderManager.IsHiDef() && connectedControllers > 1; + +#ifdef __ORBIS__ + // Check for remote play + available = available && InputManager.IsLocalMultiplayerAvailable(); +#endif + + return available; + + // Found this in GameNetworkManager? + //#ifdef _DURANGO + // iOtherConnectedControllers = InputManager.GetConnectedGamepadCount(); + // if((InputManager.IsPadConnected(userIndex) || ProfileManager.IsSignedIn(userIndex))) + // { + // --iOtherConnectedControllers; + // } + //#else + // for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + // { + // if( (i!=userIndex) && (InputManager.IsPadConnected(i) || ProfileManager.IsSignedIn(i)) ) + // { + // iOtherConnectedControllers++; + // } + // } + //#endif +} + + +// 4J-PB - language and locale function + +void CMinecraftApp::getLocale(vector &vecWstrLocales) +{ + vector locales; + + DWORD dwSystemLanguage = XGetLanguage( ); + + // 4J-PB - restrict the 360 language until we're ready to have them in + +#ifdef _XBOX + switch(dwSystemLanguage) + { + case XC_LANGUAGE_FRENCH : + locales.push_back(eMCLang_frFR); + break; + case XC_LANGUAGE_ITALIAN : + locales.push_back(eMCLang_itIT); + break; + case XC_LANGUAGE_GERMAN : + locales.push_back(eMCLang_deDE); + break; + case XC_LANGUAGE_SPANISH : + locales.push_back(eMCLang_esES); + break; + case XC_LANGUAGE_PORTUGUESE : + if(XGetLocale()==XC_LOCALE_BRAZIL) + { + locales.push_back(eMCLang_ptBR); + } + locales.push_back(eMCLang_ptPT); + break; + case XC_LANGUAGE_JAPANESE : + locales.push_back(eMCLang_jaJP); + break; + case XC_LANGUAGE_KOREAN : + locales.push_back(eMCLang_koKR); + break; + case XC_LANGUAGE_TCHINESE : + locales.push_back(eMCLang_zhCHT); + break; + } +#else + switch(dwSystemLanguage) + { + + case XC_LANGUAGE_ENGLISH: + switch(XGetLocale()) + { + case XC_LOCALE_AUSTRALIA: + case XC_LOCALE_CANADA: + case XC_LOCALE_CZECH_REPUBLIC: + case XC_LOCALE_GREECE: + case XC_LOCALE_HONG_KONG: + case XC_LOCALE_HUNGARY: + case XC_LOCALE_INDIA: + case XC_LOCALE_IRELAND: + case XC_LOCALE_ISRAEL: + case XC_LOCALE_NEW_ZEALAND: + case XC_LOCALE_SAUDI_ARABIA: + case XC_LOCALE_SINGAPORE: + case XC_LOCALE_SLOVAK_REPUBLIC: + case XC_LOCALE_SOUTH_AFRICA: + case XC_LOCALE_UNITED_ARAB_EMIRATES: + case XC_LOCALE_GREAT_BRITAIN: + locales.push_back(eMCLang_enGB); + break; + default: //XC_LOCALE_UNITED_STATES + break; + } + break; + case XC_LANGUAGE_JAPANESE : + locales.push_back(eMCLang_jaJP); + break; + case XC_LANGUAGE_GERMAN : + switch(XGetLocale()) + { + case XC_LOCALE_AUSTRIA: + locales.push_back(eMCLang_deAT); + break; + case XC_LOCALE_SWITZERLAND: + locales.push_back(eMCLang_deCH); + break; + default:// XC_LOCALE_GERMANY: + break; + } + locales.push_back(eMCLang_deDE); + break; + case XC_LANGUAGE_FRENCH : + switch(XGetLocale()) + { + case XC_LOCALE_BELGIUM: + locales.push_back(eMCLang_frBE); + break; + case XC_LOCALE_CANADA: + locales.push_back(eMCLang_frCA); + break; + case XC_LOCALE_SWITZERLAND: + locales.push_back(eMCLang_frCH); + break; + default:// XC_LOCALE_FRANCE: + break; + } + locales.push_back(eMCLang_frFR); + break; + case XC_LANGUAGE_SPANISH : + switch(XGetLocale()) + { + case XC_LOCALE_MEXICO: + case XC_LOCALE_ARGENTINA: + case XC_LOCALE_CHILE: + case XC_LOCALE_COLOMBIA: + case XC_LOCALE_UNITED_STATES: + locales.push_back(eMCLang_esMX); + break; + default://XC_LOCALE_SPAIN + break; + } + locales.push_back(eMCLang_esES); + break; + case XC_LANGUAGE_ITALIAN : + locales.push_back(eMCLang_itIT); + break; + case XC_LANGUAGE_KOREAN : + locales.push_back(eMCLang_koKR); + break; + case XC_LANGUAGE_TCHINESE : + switch(XGetLocale()) + { + case XC_LOCALE_HONG_KONG: + locales.push_back(eMCLang_zhHK); + locales.push_back(eMCLang_zhTW); + break; + case XC_LOCALE_TAIWAN: + locales.push_back(eMCLang_zhTW); + locales.push_back(eMCLang_zhHK); + default: + break; + } + locales.push_back(eMCLang_zhCHT); + break; + case XC_LANGUAGE_PORTUGUESE : + if(XGetLocale()==XC_LOCALE_BRAZIL) + { + locales.push_back(eMCLang_ptBR); + } + locales.push_back(eMCLang_ptPT); + break; + case XC_LANGUAGE_POLISH : + locales.push_back(eMCLang_plPL); + break; + case XC_LANGUAGE_RUSSIAN : + locales.push_back(eMCLang_ruRU); + break; + case XC_LANGUAGE_SWEDISH : + locales.push_back(eMCLang_svSV); + locales.push_back(eMCLang_svSE); + break; + case XC_LANGUAGE_TURKISH : + locales.push_back(eMCLang_trTR); + break; + case XC_LANGUAGE_BNORWEGIAN : + locales.push_back(eMCLang_nbNO); + locales.push_back(eMCLang_noNO); + locales.push_back(eMCLang_nnNO); + break; + case XC_LANGUAGE_DUTCH : + switch(XGetLocale()) + { + case XC_LOCALE_BELGIUM: + locales.push_back(eMCLang_nlBE); + break; + default: + break; + } + locales.push_back(eMCLang_nlNL); + break; + case XC_LANGUAGE_SCHINESE : + switch(XGetLocale()) + { + case XC_LOCALE_SINGAPORE: + locales.push_back(eMCLang_zhSG); + break; + default: + break; + } + locales.push_back(eMCLang_zhCHS); + locales.push_back(eMCLang_zhCN); + break; + + +#if defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ || defined _DURANGO + case XC_LANGUAGE_DANISH: + locales.push_back(eMCLang_daDA); + locales.push_back(eMCLang_daDK); + break; + + case XC_LANGUAGE_LATINAMERICANSPANISH: + locales.push_back(eMCLang_laLAS); + locales.push_back(eMCLang_esES); + break; + + case XC_LANGUAGE_FINISH : + locales.push_back(eMCLang_fiFI); + break; + + case XC_LANGUAGE_CZECH : + locales.push_back(eMCLang_csCZ); + locales.push_back(eMCLang_enCZ); + break; + + case XC_LANGUAGE_SLOVAK : + locales.push_back(eMCLang_skSK); + locales.push_back(eMCLang_enSK); + break; + + case XC_LANGUAGE_GREEK : + locales.push_back(eMCLang_elEL); + locales.push_back(eMCLang_elGR); + locales.push_back(eMCLang_enGR); + locales.push_back(eMCLang_enGB); + break; +#endif + } +#endif + + locales.push_back(eMCLang_enUS); + locales.push_back(eMCLang_null); + + for (int i=0; i +#include "..\Common\Tutorial\TutorialEnum.h" + +#ifdef _XBOX +#include "..\Common\XUI\XUI_Helper.h" +#include "..\Common\XUI\XUI_HelpCredits.h" +#endif +#include "UI\UIStructs.h" + +#include "..\..\Minecraft.World\DisconnectPacket.h" +#include + +#include "..\StringTable.h" +#include "..\Common\DLC\DLCManager.h" +#include "..\Common\GameRules\ConsoleGameRulesConstants.h" +#include "..\Common\GameRules\GameRuleManager.h" +#include "..\SkinBox.h" +#include "..\ArchiveFile.h" + +typedef struct _JoinFromInviteData +{ + DWORD dwUserIndex; // dwUserIndex + DWORD dwLocalUsersMask; // dwUserMask + const INVITE_INFO *pInviteInfo; // pInviteInfo +} +JoinFromInviteData; + +class Player; +class Inventory; +class Level; +class FurnaceTileEntity; +class Container; +class DispenserTileEntity; +class SignTileEntity; +class BrewingStandTileEntity; +class LocalPlayer; +class DLCPack; +class LevelRuleset; +class ConsoleSchematicFile; +class Model; +class ModelPart; +class StringTable; +class Merchant; + +class CMinecraftAudio; + +class CMinecraftApp + +#ifdef _XBOX + : public CXuiModule +#endif +{ +private: + static int s_iHTMLFontSizesA[eHTMLSize_COUNT]; + +public: + + CMinecraftApp(); + + static const float fSafeZoneX; // 5% of 1280 + static const float fSafeZoneY; // 5% of 720 + + typedef std::vector VMEMFILES; + typedef std::vector VNOTIFICATIONS; + + // storing skin files + std::vector vSkinNames; + DLCManager m_dlcManager; + + // storing credits text from the DLC + std::vector m_vCreditText; // hold the credit text lines so we can avoid duplicating them + + + // In builds prior to TU5, the size of the GAME_SETTINGS struct was 204 bytes. We added a few new values to the internal struct in TU5, and even though we + // changed the size of the ucUnused array to be decreased by the size of the values we added, the packing of the struct has introduced some extra + // padding that resulted in the GAME_SETTINGS struct being 208 bytes. The knock-on effect from this was that all the stats, which come after the game settings + // in the profile data, we being read offset by 4 bytes. We need to ensure that the GAME_SETTINGS struct does not grow larger than 204 bytes or if we need it + // to then we need to rebuild the profile data completely and increase the profile version. There should be enough free space to grow larger for a few more updates + // as long as we take into account the padding issues and check that settings are still stored at the same positions when we read them + static const int GAME_SETTINGS_PROFILE_DATA_BYTES = 204; + +#ifdef _EXTENDED_ACHIEVEMENTS + /* 4J-JEV: + * We need more space in the profile data because of the new achievements and statistics + * necessary for the new expanded achievement set. + */ + static const int GAME_DEFINED_PROFILE_DATA_BYTES = 2*972; // per user +#else + static const int GAME_DEFINED_PROFILE_DATA_BYTES = 972; // per user +#endif + unsigned int uiGameDefinedDataChangedBitmask; + + void DebugPrintf(const char *szFormat, ...); + void DebugPrintfVerbose(bool bVerbose, const char *szFormat, ...); // Conditional printf + void DebugPrintf(int user, const char *szFormat, ...); + + static const int USER_NONE = 0; // disables printf + static const int USER_GENERAL = 1; + static const int USER_JV = 2; + static const int USER_MH = 3; + static const int USER_PB = 4; + static const int USER_RR = 5; + static const int USER_SR = 6; + static const int USER_UI = 7; // 4J Stu - This also makes it appear on the UI console + + void HandleButtonPresses(); + bool IntroRunning() { return m_bIntroRunning;} + void SetIntroRunning(bool bSet) {m_bIntroRunning=bSet;} +#ifdef _CONTENT_PACKAGE +#ifndef _FINAL_BUILD + bool PartnernetPasswordRunning() { return m_bPartnernetPasswordRunning;} + void SetPartnernetPasswordRunning(bool bSet) {m_bPartnernetPasswordRunning=bSet;} +#endif +#endif + + bool IsAppPaused(); + void SetAppPaused(bool val); + static int DisplaySavingMessage(LPVOID pParam,const C4JStorage::ESavingMessage eMsg, int iPad); + bool GetGameStarted() {return m_bGameStarted;} + void SetGameStarted(bool bVal) { if(bVal) DebugPrintf("SetGameStarted - true\n"); else DebugPrintf("SetGameStarted - false\n"); m_bGameStarted = bVal; m_bIsAppPaused = !bVal;} + int GetLocalPlayerCount(void); + bool LoadInventoryMenu(int iPad,shared_ptr player, bool bNavigateBack=false); + bool LoadCreativeMenu(int iPad,shared_ptr player,bool bNavigateBack=false); + bool LoadEnchantingMenu(int iPad,shared_ptr inventory, int x, int y, int z, Level *level); + bool LoadFurnaceMenu(int iPad,shared_ptr inventory, shared_ptr furnace); + bool LoadBrewingStandMenu(int iPad,shared_ptr inventory, shared_ptr brewingStand); + bool LoadContainerMenu(int iPad,shared_ptr inventory, shared_ptr container); + bool LoadTrapMenu(int iPad,shared_ptr inventory, shared_ptr trap); + bool LoadCrafting2x2Menu(int iPad,shared_ptr player); + bool LoadCrafting3x3Menu(int iPad,shared_ptr player, int x, int y, int z); + bool LoadSignEntryMenu(int iPad,shared_ptr sign); + bool LoadRepairingMenu(int iPad,shared_ptr inventory, Level *level, int x, int y, int z); + bool LoadTradingMenu(int iPad, shared_ptr inventory, shared_ptr trader, Level *level); + + bool GetTutorialMode() { return m_bTutorialMode;} + void SetTutorialMode(bool bSet) {m_bTutorialMode=bSet;} + + void SetSpecialTutorialCompletionFlag(int iPad, int index); + + static LPCWSTR GetString(int iID); + + eGameMode GetGameMode() { return m_eGameMode;} + void SetGameMode(eGameMode eMode) { m_eGameMode=eMode;} + + eXuiAction GetGlobalXuiAction() {return m_eGlobalXuiAction;} + void SetGlobalXuiAction(eXuiAction action) {m_eGlobalXuiAction=action;} + eXuiAction GetXuiAction(int iPad) {return m_eXuiAction[iPad];} + void SetAction(int iPad, eXuiAction action, LPVOID param = NULL); + void SetTMSAction(int iPad, eTMSAction action) {m_eTMSAction[iPad]=action; } + eTMSAction GetTMSAction(int iPad) {return m_eTMSAction[iPad];} + eXuiServerAction GetXuiServerAction(int iPad) {return m_eXuiServerAction[iPad];} + LPVOID GetXuiServerActionParam(int iPad) {return m_eXuiServerActionParam[iPad];} + void SetXuiServerAction(int iPad, eXuiServerAction action, LPVOID param = NULL) {m_eXuiServerAction[iPad]=action; m_eXuiServerActionParam[iPad] = param;} + eXuiServerAction GetGlobalXuiServerAction() {return m_eGlobalXuiServerAction;} + void SetGlobalXuiServerAction(eXuiServerAction action) {m_eGlobalXuiServerAction=action;} + + DisconnectPacket::eDisconnectReason GetDisconnectReason() { return m_disconnectReason; } + void SetDisconnectReason(DisconnectPacket::eDisconnectReason bVal) { m_disconnectReason = bVal; } + + bool GetChangingSessionType() { return m_bChangingSessionType; } + void SetChangingSessionType(bool bVal) { m_bChangingSessionType = bVal; } + + bool GetReallyChangingSessionType() { return m_bReallyChangingSessionType; } + void SetReallyChangingSessionType(bool bVal) { m_bReallyChangingSessionType = bVal; } + + + // 4J Stu - Added so that we can call this when a confirmation box is selected + static void SetActionConfirmed(LPVOID param); + void HandleXuiActions(void); + + // 4J Stu - Functions used for Minecon and other promo work + bool GetLoadSavesFromFolderEnabled() { return m_bLoadSavesFromFolderEnabled; } + void SetLoadSavesFromFolderEnabled(bool bVal) { m_bLoadSavesFromFolderEnabled = bVal; } + + // 4J Stu - Useful for debugging + bool GetWriteSavesToFolderEnabled() { return m_bWriteSavesToFolderEnabled; } + void SetWriteSavesToFolderEnabled(bool bVal) { m_bWriteSavesToFolderEnabled = bVal; } + bool GetMobsDontAttackEnabled() { return m_bMobsDontAttack; } + void SetMobsDontAttackEnabled(bool bVal) { m_bMobsDontAttack = bVal; } + bool GetUseDPadForDebug() { return m_bUseDPadForDebug; } + void SetUseDPadForDebug(bool bVal) { m_bUseDPadForDebug = bVal; } + bool GetMobsDontTickEnabled() { return m_bMobsDontTick; } + void SetMobsDontTickEnabled(bool bVal) { m_bMobsDontTick = bVal; } + + bool GetFreezePlayers() { return m_bFreezePlayers; } + void SetFreezePlayers(bool bVal) { m_bFreezePlayers = bVal; } + + // debug -0 show safe area + void ShowSafeArea(BOOL bShow) + { +#ifdef _XBOX + CXuiSceneBase::ShowSafeArea( bShow ); +#endif + } + // 4J-PB - to capture the social post screenshot + virtual void CaptureScreenshot(int iPad) {}; + //void GetPreviewImage(int iPad,XSOCIAL_PREVIEWIMAGE *preview); + + void InitGameSettings(); + static int OldProfileVersionCallback(LPVOID pParam,unsigned char *pucData, const unsigned short usVersion, const int iPad); + +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__ ) + static int DefaultOptionsCallback(LPVOID pParam,C4JStorage::PROFILESETTINGS *pSettings, const int iPad); + int SetDefaultOptions(C4JStorage::PROFILESETTINGS *pSettings,const int iPad,bool bWriteProfile=true); +#ifdef __ORBIS__ + static int OptionsDataCallback(LPVOID pParam,int iPad,unsigned short usVersion,C4JStorage::eOptionsCallback eStatus,int iBlocksRequired); + int GetOptionsBlocksRequired(int iPad); +#else + static int OptionsDataCallback(LPVOID pParam,int iPad,unsigned short usVersion,C4JStorage::eOptionsCallback eStatus); +#endif + + C4JStorage::eOptionsCallback GetOptionsCallbackStatus(int iPad); + + void SetOptionsCallbackStatus(int iPad, C4JStorage::eOptionsCallback eStatus); +#else + static int DefaultOptionsCallback(LPVOID pParam,C_4JProfile::PROFILESETTINGS *pSettings, const int iPad); + int SetDefaultOptions(C_4JProfile::PROFILESETTINGS *pSettings,const int iPad); +#endif + virtual void SetRichPresenceContext(int iPad, int contextId) = 0; + + + void SetGameSettings(int iPad,eGameSetting eVal,unsigned char ucVal); + unsigned char GetGameSettings(int iPad,eGameSetting eVal); + unsigned char GetGameSettings(eGameSetting eVal); // for the primary pad + void SetPlayerSkin(int iPad,const wstring &name); + void SetPlayerSkin(int iPad,DWORD dwSkinId); + void SetPlayerCape(int iPad,const wstring &name); + void SetPlayerCape(int iPad,DWORD dwCapeId); + void SetPlayerFavoriteSkin(int iPad, int iIndex,unsigned int uiSkinID); + unsigned int GetPlayerFavoriteSkin(int iPad,int iIndex); + unsigned char GetPlayerFavoriteSkinsPos(int iPad); + void SetPlayerFavoriteSkinsPos(int iPad,int iPos); + unsigned int GetPlayerFavoriteSkinsCount(int iPad); + void ValidateFavoriteSkins(int iPad); // check the DLC is available for the skins + + // Mash-up pack worlds hide/display + void HideMashupPackWorld(int iPad, unsigned int iMashupPackID); + void EnableMashupPackWorlds(int iPad); + unsigned int GetMashupPackWorlds(int iPad); + + // Minecraft language select + void SetMinecraftLanguage(int iPad, unsigned char ucLanguage); + unsigned char GetMinecraftLanguage(int iPad); + + + // 4J-PB - set a timer when the user navigates the quickselect, so we can bring the opacity back to defaults for a short time + unsigned int GetOpacityTimer(int iPad) { return m_uiOpacityCountDown[iPad]; } + void SetOpacityTimer(int iPad) { m_uiOpacityCountDown[iPad]=120; } // 6 seconds + void TickOpacityTimer(int iPad) { if(m_uiOpacityCountDown[iPad]>0) m_uiOpacityCountDown[iPad]--;} + +public: + wstring GetPlayerSkinName(int iPad); + DWORD GetPlayerSkinId(int iPad); + wstring GetPlayerCapeName(int iPad); + DWORD GetPlayerCapeId(int iPad); + DWORD GetAdditionalModelParts(int iPad); + void CheckGameSettingsChanged(bool bOverride5MinuteTimer=false, int iPad=XUSER_INDEX_ANY); + void ApplyGameSettingsChanged(int iPad); + void ClearGameSettingsChangedFlag(int iPad); + void ActionGameSettings(int iPad,eGameSetting eVal); + unsigned int GetGameSettingsDebugMask(int iPad=-1,bool bOverridePlayer=false); + void SetGameSettingsDebugMask(int iPad, unsigned int uiVal); + void ActionDebugMask(int iPad, bool bSetAllClear=false); + + // + bool IsLocalMultiplayerAvailable(); + + // for sign in change monitoring + static void SignInChangeCallback(LPVOID pParam, bool bVal, unsigned int uiSignInData); + static void ClearSignInChangeUsersMask(); + static int SignoutExitWorldThreadProc( void* lpParameter ); + static int PrimaryPlayerSignedOutReturned(void *pParam, int iPad, const C4JStorage::EMessageResult); + static int EthernetDisconnectReturned(void *pParam, int iPad, const C4JStorage::EMessageResult); + static void ProfileReadErrorCallback(void *pParam); + + // FATAL LOAD ERRORS + virtual void FatalLoadError(); + + // Notifications from the game listener to be passed to the qnet listener + static void NotificationsCallback(LPVOID pParam,DWORD dwNotification, unsigned int uiParam); + + // for the ethernet being disconnected + static void LiveLinkChangeCallback(LPVOID pParam,BOOL bConnected); + bool GetLiveLinkRequired() {return m_bLiveLinkRequired;} + void SetLiveLinkRequired(bool required) {m_bLiveLinkRequired=required;} + + static void UpsellReturnedCallback(LPVOID pParam, eUpsellType type, eUpsellResponse result, int iUserData); + +#if defined __PS3__ || defined __PSVITA__ || defined __ORBIS__ + static int NowDisplayFullVersionPurchase(void *pParam, bool bContinue, int iPad); + static int MustSignInFullVersionPurchaseReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); +#endif +#if defined __PS3__ || defined __PSVITA__ || defined __ORBIS__ + static int MustSignInFullVersionPurchaseReturnedExitTrial(void *pParam,int iPad,C4JStorage::EMessageResult result); +#endif + +#ifdef _DEBUG_MENUS_ENABLED + bool DebugSettingsOn() { return m_bDebugOptions;} +#else + bool DebugSettingsOn() { return false;} +#endif + void SetDebugSequence(const char *pchSeq); + static int DebugInputCallback(LPVOID pParam); + //bool UploadFileToGlobalStorage(int iQuadrant, C4JStorage::eGlobalStorage eStorageFacility, wstring *wsFile ); + + // Installed DLC + bool StartInstallDLCProcess(int iPad); + static int DLCInstalledCallback(LPVOID pParam,int iOfferC,int iPad); + void HandleDLCLicenseChange(); + static int DLCMountedCallback(LPVOID pParam,int iPad,DWORD dwErr,DWORD dwLicenceMask); + void MountNextDLC(int iPad); + //static int DLCReadCallback(LPVOID pParam,C4JStorage::DLC_FILE_DETAILS *pDLCData); + void HandleDLC(DLCPack *pack); + bool DLCInstallPending() {return m_bDLCInstallPending;} + bool DLCInstallProcessCompleted() {return m_bDLCInstallProcessCompleted;} + void ClearDLCInstalled() { m_bDLCInstallProcessCompleted=false;} + static int MarketplaceCountsCallback(LPVOID pParam,C4JStorage::DLC_TMS_DETAILS *,int iPad); + + bool AlreadySeenCreditText(const wstring &wstemp); + + void ClearNewDLCAvailable(void) { m_bNewDLCAvailable=false; m_bSeenNewDLCTip=true;} + bool GetNewDLCAvailable() { return m_bNewDLCAvailable;} + void DisplayNewDLCTipAgain() { m_bSeenNewDLCTip=false;} + bool DisplayNewDLCTip() { if(!m_bSeenNewDLCTip) { m_bSeenNewDLCTip=true; return true;} else return false;} + + // functions to store launch data, and to exit the game - required due to possibly being on a demo disc + virtual void StoreLaunchData(); + virtual void ExitGame(); + + bool isXuidNotch(PlayerUID xuid); + bool isXuidDeadmau5(PlayerUID xuid); + + void AddMemoryTextureFile(const wstring &wName, PBYTE pbData, DWORD dwBytes); + void RemoveMemoryTextureFile(const wstring &wName); + void GetMemFileDetails(const wstring &wName,PBYTE *ppbData,DWORD *pdwBytes); + bool IsFileInMemoryTextures(const wstring &wName); + + // Texture Pack Data files (icon, banner, comparison shot & text) + void AddMemoryTPDFile(int iConfig,PBYTE pbData,DWORD dwBytes); + void RemoveMemoryTPDFile(int iConfig); + bool IsFileInTPD(int iConfig); + void GetTPD(int iConfig,PBYTE *ppbData,DWORD *pdwBytes); + int GetTPDSize() {return m_MEM_TPD.size();} +#ifndef __PS3__ + int GetTPConfigVal(WCHAR *pwchDataFile); +#endif + + bool DefaultCapeExists(); + //void InstallDefaultCape(); // attempt to install the default cape once per game launch + + // invites + //void ProcessInvite(JoinFromInviteData *pJoinData); + void ProcessInvite(DWORD dwUserIndex, DWORD dwLocalUsersMask, const INVITE_INFO * pInviteInfo); + + // Add credits for DLC installed + void AddCreditText(LPCWSTR lpStr); + +private: + PlayerUID m_xuidNotch; +#ifdef _DURANGO + unordered_map m_GTS_Files; +#else + unordered_map m_GTS_Files; +#endif + + // for storing memory textures - player skin + unordered_map m_MEM_Files; + // for storing texture pack data files + unordered_map m_MEM_TPD; + CRITICAL_SECTION csMemFilesLock; // For locking access to the above map + CRITICAL_SECTION csMemTPDLock; // For locking access to the above map + + VNOTIFICATIONS m_vNotifications; + +public: + // launch data + BYTE* m_pLaunchData; + DWORD m_dwLaunchDataSize; + +public: + // BAN LIST + void AddLevelToBannedLevelList(int iPad,PlayerUID xuid, char *pszLevelName, bool bWriteToTMS); + bool IsInBannedLevelList(int iPad, PlayerUID xuid, char *pszLevelName); + void RemoveLevelFromBannedLevelList(int iPad, PlayerUID xuid, char *pszLevelName); + void InvalidateBannedList(int iPad); + void SetUniqueMapName(char *pszUniqueMapName); + char *GetUniqueMapName(void); +#ifdef _XBOX_ONE + void AddLevelToBannedLevelList(int iPad, PBANNEDLISTDATA pBannedListData, bool bWriteToTMS); +#endif + + +public: + bool GetResourcesLoaded() {return m_bResourcesLoaded;} + void SetResourcesLoaded(bool bVal) {m_bResourcesLoaded=bVal;} + +public: + bool m_bGameStarted; + bool m_bIntroRunning; + bool m_bTutorialMode; + bool m_bIsAppPaused; + + bool m_bChangingSessionType; + bool m_bReallyChangingSessionType; + + bool m_bDisplayFullVersionPurchase; // for after signing in during the trial, and trying to unlock full version on an upsell + + void loadMediaArchive(); + void loadStringTable(); + +protected: + ArchiveFile *m_mediaArchive; + StringTable *m_stringTable; + +public: + int getArchiveFileSize(const wstring &filename); + bool hasArchiveFile(const wstring &filename); + byteArray getArchiveFile(const wstring &filename); + +private: + + static int BannedLevelDialogReturned(void *pParam,int iPad,const C4JStorage::EMessageResult); + static int TexturePackDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + + VBANNEDLIST *m_vBannedListA[XUSER_MAX_COUNT]; + + void HandleButtonPresses(int iPad); + + bool m_bResourcesLoaded; + + // Global string table for this application. + //CXuiStringTable StringTable; + + + // Container scene for some menu + +// CXuiScene debugContainerScene; + + + //bool m_bSplitScreenEnabled; + + +#ifdef _CONTENT_PACKAGE +#ifndef _FINAL_BUILD + bool m_bPartnernetPasswordRunning; +#endif +#endif + + eGameMode m_eGameMode; // single or multiplayer + + static unsigned int m_uiLastSignInData; + + // We've got sizeof(GAME_SETTINGS) bytes reserved at the start of the gamedefined data per player for settings + GAME_SETTINGS *GameSettingsA[XUSER_MAX_COUNT]; + + // For promo work + bool m_bLoadSavesFromFolderEnabled; + + // For debugging + bool m_bWriteSavesToFolderEnabled; + bool m_bMobsDontAttack; + bool m_bUseDPadForDebug; + bool m_bMobsDontTick; + bool m_bFreezePlayers; + + // 4J : WESTY : For taking screen shots. + //bool m_bInterfaceRenderingOff; + //bool m_bHandRenderingOff; + + DisconnectPacket::eDisconnectReason m_disconnectReason; + +public: + virtual void RunFrame() {}; + + + + static const DWORD m_dwOfferID = 0x00000001; + +// timer + void InitTime(); + void UpdateTime(); + + // trial timer + void SetTrialTimerStart(void); + float getTrialTimer(void); + + // notifications from the game for qnet + VNOTIFICATIONS *GetNotifications() {return &m_vNotifications;} + +private: + + + // To avoid problems with threads being kicked off from xuis that alter things that may be in progress within the run_middle, + // we'll action these at the end of the game loop + eXuiAction m_eXuiAction[XUSER_MAX_COUNT]; + eTMSAction m_eTMSAction[XUSER_MAX_COUNT]; + LPVOID m_eXuiActionParam[XUSER_MAX_COUNT]; + eXuiAction m_eGlobalXuiAction; + eXuiServerAction m_eXuiServerAction[XUSER_MAX_COUNT]; + LPVOID m_eXuiServerActionParam[XUSER_MAX_COUNT]; + eXuiServerAction m_eGlobalXuiServerAction; + + bool m_bLiveLinkRequired; + + static int UnlockFullExitReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int UnlockFullSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int UnlockFullInviteReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int TrialOverReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ExitAndJoinFromInvite(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ExitAndJoinFromInviteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ExitAndJoinFromInviteAndSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ExitAndJoinFromInviteDeclineSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int FatalErrorDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int WarningTrialTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + + JoinFromInviteData m_InviteData; + bool m_bDebugOptions; // toggle debug things on or off + + // Trial timer + float m_fTrialTimerStart,mfTrialPausedTime; + typedef struct TimeInfo + { + LARGE_INTEGER qwTime; + LARGE_INTEGER qwAppTime; + + float fAppTime; + float fElapsedTime; + float fSecsPerTick; + } TIMEINFO; + + TimeInfo m_Time; + +protected: + static const int MAX_TIPS_GAMETIP = 50; + static const int MAX_TIPS_TRIVIATIP = 20; + static TIPSTRUCT m_GameTipA[MAX_TIPS_GAMETIP]; + static TIPSTRUCT m_TriviaTipA[MAX_TIPS_TRIVIATIP]; + static Random *TipRandom; +public: + void InitialiseTips(); + UINT GetNextTip(); + int GetHTMLColour(eMinecraftColour colour); + int GetHTMLColor(eMinecraftColour colour) { return GetHTMLColour(colour); } + int GetHTMLFontSize(EHTMLFontSize size); + wstring FormatHTMLString(int iPad, const wstring &desc, int shadowColour = 0xFFFFFFFF); + wstring GetActionReplacement(int iPad, unsigned char ucAction); + wstring GetVKReplacement(unsigned int uiVKey); + wstring GetIconReplacement(unsigned int uiIcon); + + float getAppTime() { return m_Time.fAppTime; } + void UpdateTrialPausedTimer() { mfTrialPausedTime+= m_Time.fElapsedTime;} + + static int RemoteSaveThreadProc( void* lpParameter ); + static void ExitGameFromRemoteSave( LPVOID lpParameter ); + static int ExitGameFromRemoteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); +private: + UINT m_TipIDA[MAX_TIPS_GAMETIP+MAX_TIPS_TRIVIATIP]; + UINT m_uiCurrentTip; + static int TipsSortFunction(const void* a, const void* b); + + // XML +public: + + // Hold a vector of terrain feature positions + void AddTerrainFeaturePosition(_eTerrainFeatureType,int,int); + void ClearTerrainFeaturePosition(); + _eTerrainFeatureType IsTerrainFeature(int x,int z); + bool GetTerrainFeaturePosition(_eTerrainFeatureType eType, int *pX, int *pZ); + std::vector m_vTerrainFeatures; + + static HRESULT RegisterMojangData(WCHAR *, PlayerUID, WCHAR *, WCHAR *); + MOJANG_DATA *GetMojangDataForXuid(PlayerUID xuid); + static HRESULT RegisterConfigValues(WCHAR *pType, int iValue); + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + HRESULT RegisterDLCData(char *pchDLCName, unsigned int uiSortIndex, char *pchImageURL); + bool GetDLCFullOfferIDForSkinID(const wstring &FirstSkin,ULONGLONG *pullVal); + DLC_INFO *GetDLCInfoForTrialOfferID(ULONGLONG ullOfferID_Trial); + DLC_INFO *GetDLCInfoForFullOfferID(ULONGLONG ullOfferID_Full); +#elif defined(_XBOX_ONE) + static HRESULT RegisterDLCData(eDLCContentType, WCHAR *, WCHAR *, WCHAR *, WCHAR *, int, unsigned int); + //bool GetDLCFullOfferIDForSkinID(const wstring &FirstSkin,WCHAR *pwchProductId); + bool GetDLCFullOfferIDForSkinID(const wstring &FirstSkin,wstring &wsProductId); + DLC_INFO *GetDLCInfoForFullOfferID(WCHAR *pwchProductId); + DLC_INFO *GetDLCInfoForProductName(WCHAR *pwchProductName); +#else + static HRESULT RegisterDLCData(WCHAR *, WCHAR *, int, __uint64, __uint64, WCHAR *, unsigned int, int, WCHAR *pDataFile); + bool GetDLCFullOfferIDForSkinID(const wstring &FirstSkin,ULONGLONG *pullVal); + DLC_INFO *GetDLCInfoForTrialOfferID(ULONGLONG ullOfferID_Trial); + DLC_INFO *GetDLCInfoForFullOfferID(ULONGLONG ullOfferID_Full); +#endif + + unsigned int GetDLCCreditsCount(); + SCreditTextItemDef * GetDLCCredits(int iIndex); + +// TMS + void ReadDLCFileFromTMS(int iPad,eTMSAction action, bool bCallback=false); + void ReadXuidsFileFromTMS(int iPad,eTMSAction action,bool bCallback=false); + + // images for save thumbnail/social post + virtual void CaptureSaveThumbnail() =0; + virtual void GetSaveThumbnail(PBYTE*,DWORD*)=0; + virtual void ReleaseSaveThumbnail()=0; + virtual void GetScreenshot(int iPad,PBYTE *pbData,DWORD *pdwSize)=0; + + virtual void ReadBannedList(int iPad, eTMSAction action=(eTMSAction)0, bool bCallback=false)=0; + +private: + + std::vector vDLCCredits; + +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + static unordered_map MojangData; + static unordered_map DLCTextures_PackID; // for mash-up packs & texture packs + static unordered_map DLCInfo; + static unordered_map DLCInfo_SkinName; // skin name, full offer id +#elif defined(_DURANGO) + static unordered_map MojangData; + static unordered_map DLCTextures_PackID; // for mash-up packs & texture packs + //static unordered_map DLCInfo_Trial; // full offerid, dlc_info + static unordered_map DLCInfo_Full; // full offerid, dlc_info + static unordered_map DLCInfo_SkinName; // skin name, full offer id +#else + static unordered_map MojangData; + static unordered_map DLCTextures_PackID; // for mash-up packs & texture packs + static unordered_map DLCInfo_Trial; // full offerid, dlc_info + static unordered_map DLCInfo_Full; // full offerid, dlc_info + static unordered_map DLCInfo_SkinName; // skin name, full offer id +#endif +// bool m_bRead_TMS_XUIDS_XML; // track whether we have already read the TMS xuids.xml file +// bool m_bRead_TMS_DLCINFO_XML; // track whether we have already read the TMS DLC.xml file + + bool m_bDefaultCapeInstallAttempted; // have we attempted to install the default cape from tms + + //bool m_bwasHidingGui; // 4J Stu - Removed 1.8.2 bug fix (TU6) as not needed + bool m_bDLCInstallProcessCompleted; + bool m_bDLCInstallPending; + int m_iTotalDLC; + int m_iTotalDLCInstalled; + +public: + // 4J Stu - We need to be able to detect when a guest player signs in or out causing other guest players to change their xuid + // The simplest way to do this is to check if their guest number has changed, so store the last known one here + // 4J Stu - Now storing the whole XUSER_SIGNIN_INFO so we can detect xuid changes + XUSER_SIGNIN_INFO m_currentSigninInfo[XUSER_MAX_COUNT]; + + //void OverrideFontRenderer(bool set, bool immediate = true); +// void ToggleFontRenderer() { OverrideFontRenderer(!m_bFontRendererOverridden,false); } + BANNEDLIST BannedListA[XUSER_MAX_COUNT]; + +private: +// XUI_FontRenderer *m_fontRenderer; +// bool m_bFontRendererOverridden; +// bool m_bOverrideFontRenderer; + + + bool m_bRead_BannedListA[XUSER_MAX_COUNT]; + char m_pszUniqueMapName[14]; + bool m_BanListCheck[XUSER_MAX_COUNT]; + +public: + void SetBanListCheck(int iPad,bool bVal) {m_BanListCheck[iPad]=bVal;} + bool GetBanListCheck(int iPad) { return m_BanListCheck[iPad];} +// AUTOSAVE +public: + void SetAutosaveTimerTime(void); + bool AutosaveDue(void); + unsigned int SecondsToAutosave(); +private: + unsigned int m_uiAutosaveTimer; + unsigned int m_uiOpacityCountDown[XUSER_MAX_COUNT]; + + // DLC + bool m_bNewDLCAvailable; + bool m_bSeenNewDLCTip; + + // Host options +private: + unsigned int m_uiGameHostSettings; + static unsigned char m_szPNG[8]; + + unsigned int FromBigEndian(unsigned int uiValue); + +public: + + + void SetGameHostOption(eGameHostOption eVal,unsigned int uiVal); + void SetGameHostOption(unsigned int &uiHostSettings, eGameHostOption eVal,unsigned int uiVal); + unsigned int GetGameHostOption(eGameHostOption eVal); + unsigned int GetGameHostOption(unsigned int uiHostSettings, eGameHostOption eVal); + + void SetResetNether(bool bResetNether) {m_bResetNether=bResetNether;} + bool GetResetNether() {return m_bResetNether;} + bool CanRecordStatsAndAchievements(); + + // World seed from png image + void GetImageTextData(PBYTE pbImageData, DWORD dwImageBytes,unsigned char *pszSeed,unsigned int &uiHostOptions,bool &bHostOptionsRead,DWORD &uiTexturePack); + unsigned int CreateImageTextData(PBYTE bTextMetadata, __int64 seed, bool hasSeed, unsigned int uiHostOptions, unsigned int uiTexturePackId); + + // Game rules + GameRuleManager m_gameRules; + +public: + void processSchematics(LevelChunk *levelChunk); + void processSchematicsLighting(LevelChunk *levelChunk); + void loadDefaultGameRules(); + vector *getLevelGenerators() { return m_gameRules.getLevelGenerators(); } + void setLevelGenerationOptions(LevelGenerationOptions *levelGen); + LevelRuleset *getGameRuleDefinitions() { return m_gameRules.getGameRuleDefinitions(); } + LevelGenerationOptions *getLevelGenerationOptions() { return m_gameRules.getLevelGenerationOptions(); } + LPCWSTR GetGameRulesString(const wstring &key); + +private: + BYTE m_playerColours[MINECRAFT_NET_MAX_PLAYERS]; // An array of QNet small-id's + unsigned int m_playerGamePrivileges[MINECRAFT_NET_MAX_PLAYERS]; + +public: + void UpdatePlayerInfo(BYTE networkSmallId, SHORT playerColourIndex, unsigned int playerGamePrivileges); + short GetPlayerColour(BYTE networkSmallId); + unsigned int GetPlayerPrivileges(BYTE networkSmallId); + + wstring getEntityName(eINSTANCEOF type); + + + + unsigned int AddDLCRequest(eDLCMarketplaceType eContentType, bool bPromote=false); + bool RetrieveNextDLCContent(); + bool CheckTMSDLCCanStop(); + static int DLCOffersReturned(void *pParam, int iOfferC, DWORD dwType, int iPad); + DWORD GetDLCContentType(eDLCContentType eType) { return m_dwContentTypeA[eType];} + eDLCContentType Find_eDLCContentType(DWORD dwType); + int GetDLCOffersCount() { return m_iDLCOfferC;} + bool DLCContentRetrieved(eDLCMarketplaceType eType); + void TickDLCOffersRetrieved(); + void ClearAndResetDLCDownloadQueue(); + bool RetrieveNextTMSPPContent(); + void TickTMSPPFilesRetrieved(); + void ClearTMSPPFilesRetrieved(); + unsigned int AddTMSPPFileTypeRequest(eDLCContentType eType, bool bPromote=false); + int GetDLCInfoTexturesOffersCount(); +#if defined( __PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + DLC_INFO *GetDLCInfo(int iIndex); + DLC_INFO *GetDLCInfo(char *); + DLC_INFO *GetDLCInfoFromTPackID(int iTPID); + bool GetDLCNameForPackID(const int iPackID,char **ppchKeyID); + char * GetDLCInfoTextures(int iIndex); + int GetDLCInfoCount(); +#else + +#ifdef _XBOX_ONE + static int TMSPPFileReturned(LPVOID pParam,int iPad,int iUserData,LPVOID, WCHAR *wchFilename); + unordered_map *GetDLCInfo(); +#else + static int TMSPPFileReturned(LPVOID pParam,int iPad,int iUserData,C4JStorage::PTMSPP_FILEDATA pFileData, LPCSTR szFilename); +#endif + DLC_INFO *GetDLCInfoTrialOffer(int iIndex); + DLC_INFO *GetDLCInfoFullOffer(int iIndex); + + int GetDLCInfoTrialOffersCount(); + int GetDLCInfoFullOffersCount(); +#ifdef _XBOX_ONE + bool GetDLCFullOfferIDForPackID(const int iPackID,wstring &wsProductId); + wstring GetDLCInfoTexturesFullOffer(int iIndex); + +#else + bool GetDLCFullOfferIDForPackID(const int iPackID,ULONGLONG *pullVal); + ULONGLONG GetDLCInfoTexturesFullOffer(int iIndex); +#endif +#endif + + void SetCorruptSaveDeleted(bool bVal) {m_bCorruptSaveDeleted=bVal;} + bool GetCorruptSaveDeleted(void) {return m_bCorruptSaveDeleted;} + + void EnterSaveNotificationSection(); + void LeaveSaveNotificationSection(); +private: + CRITICAL_SECTION m_saveNotificationCriticalSection; + int m_saveNotificationDepth; + // Download Status + + //Request current_download; + vector m_DLCDownloadQueue; + vector m_TMSPPDownloadQueue; + static DWORD m_dwContentTypeA[e_Marketplace_MAX]; + int m_iDLCOfferC; + bool m_bAllDLCContentRetrieved; + bool m_bAllTMSContentRetrieved; + bool m_bTickTMSDLCFiles; + CRITICAL_SECTION csDLCDownloadQueue; + CRITICAL_SECTION csTMSPPDownloadQueue; + CRITICAL_SECTION csAdditionalModelParts; + CRITICAL_SECTION csAdditionalSkinBoxes; + CRITICAL_SECTION csAnimOverrideBitmask; + bool m_bCorruptSaveDeleted; + + DWORD m_dwAdditionalModelParts[XUSER_MAX_COUNT]; + + BYTE *m_pBannedListFileBuffer; + DWORD m_dwBannedListFileSize; + +public: + DWORD m_dwDLCFileSize; + BYTE *m_pDLCFileBuffer; + +// static int CallbackReadXuidsFileFromTMS(LPVOID lpParam, WCHAR *wchFilename, int iPad, bool bResult, int iAction); +// static int CallbackDLCFileFromTMS(LPVOID lpParam, WCHAR *wchFilename, int iPad, bool bResult, int iAction); +// static int CallbackBannedListFileFromTMS(LPVOID lpParam, WCHAR *wchFilename, int iPad, bool bResult, int iAction); + + // Storing additional model parts per skin texture + void SetAdditionalSkinBoxes(DWORD dwSkinID, SKIN_BOX *SkinBoxA, DWORD dwSkinBoxC); + vector * SetAdditionalSkinBoxes(DWORD dwSkinID, vector *pvSkinBoxA); + vector *GetAdditionalModelParts(DWORD dwSkinID); + vector *GetAdditionalSkinBoxes(DWORD dwSkinID); + void SetAnimOverrideBitmask(DWORD dwSkinID,unsigned int uiAnimOverrideBitmask); + unsigned int GetAnimOverrideBitmask(DWORD dwSkinID); + + static DWORD getSkinIdFromPath(const wstring &skin); + static wstring getSkinPathFromId(DWORD skinId); + + virtual int LoadLocalTMSFile(WCHAR *wchTMSFile)=0; + virtual int LoadLocalTMSFile(WCHAR *wchTMSFile, eFileExtensionType eExt)=0; + virtual void FreeLocalTMSFiles(eTMSFileType eType)=0; + virtual int GetLocalTMSFileIndex(WCHAR *wchTMSFile,bool bFilenameIncludesExtension,eFileExtensionType eEXT)=0; + + virtual bool GetTMSGlobalFileListRead() { return true;} + virtual bool GetTMSDLCInfoRead() { return true;} + virtual bool GetTMSXUIDsFileRead() { return true;} + + bool GetBanListRead(int iPad) { return m_bRead_BannedListA[iPad];} + void SetBanListRead(int iPad,bool bVal) { m_bRead_BannedListA[iPad]=bVal;} + void ClearBanList(int iPad) { BannedListA[iPad].pBannedList=NULL;BannedListA[iPad].dwBytes=0;} + + DWORD GetRequiredTexturePackID() {return m_dwRequiredTexturePackID;} + void SetRequiredTexturePackID(DWORD dwID) {m_dwRequiredTexturePackID=dwID;} + + virtual void GetFileFromTPD(eTPDFileType eType,PBYTE pbData,DWORD dwBytes,PBYTE *ppbData,DWORD *pdwBytes ) {*ppbData = NULL; *pdwBytes = 0;} + + //XTITLE_DEPLOYMENT_TYPE getDeploymentType() { return m_titleDeploymentType; } + +private: + // vector of additional skin model parts, indexed by the skin texture id + unordered_map *> m_AdditionalModelParts; + unordered_map *> m_AdditionalSkinBoxes; + unordered_map m_AnimOverrides; + + + bool m_bResetNether; + DWORD m_dwRequiredTexturePackID; +#ifdef _XBOX_ONE + vector m_vTMSPPData; +#endif + +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) + C4JStorage::eOptionsCallback m_eOptionsStatusA[XUSER_MAX_COUNT]; + +#ifdef __ORBIS__ + int m_eOptionsBlocksRequiredA[XUSER_MAX_COUNT]; +#endif +#endif + + + // 4J-PB - language and locale functions +public: + + void LocaleAndLanguageInit(); + void getLocale(vector &vecWstrLocales); + DWORD get_eMCLang(WCHAR *pwchLocale); + DWORD get_xcLang(WCHAR *pwchLocale); + + void SetTickTMSDLCFiles(bool bVal); + + wstring getFilePath(DWORD packId, wstring filename, bool bAddDataFolder); + +private: + unordered_mapm_localeA; + unordered_mapm_eMCLangA; + unordered_mapm_xcLangA; + wstring getRootPath(DWORD packId, bool allowOverride, bool bAddDataFolder); +public: + +#ifdef _XBOX +// bool m_bTransferSavesToXboxOne; +// unsigned int m_uiTransferSlotC; + +#elif defined (__PS3__) + +#elif defined _DURANGO + +#elif defined _WINDOWS64 + //CMinecraftAudio audio; +#else // PS4 + +#endif + +#ifdef _XBOX_ONE +public: + void SetReachedMainMenu(); + bool HasReachedMainMenu(); +private: + bool m_hasReachedMainMenu; +#endif +}; + +//singleton +//extern CMinecraftApp app; diff --git a/Minecraft.Client/Common/DLC/DLCAudioFile.cpp b/Minecraft.Client/Common/DLC/DLCAudioFile.cpp new file mode 100644 index 00000000..49ba52cd --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCAudioFile.cpp @@ -0,0 +1,216 @@ +#include "stdafx.h" +#include "DLCManager.h" +#include "DLCAudioFile.h" +#if defined _XBOX || defined _WINDOWS64 +#include "..\..\Xbox\XML\ATGXmlParser.h" +#include "..\..\Xbox\XML\xmlFilesCallback.h" +#endif + +DLCAudioFile::DLCAudioFile(const wstring &path) : DLCFile(DLCManager::e_DLCType_Audio,path) +{ + m_pbData = NULL; + m_dwBytes = 0; +} + +void DLCAudioFile::addData(PBYTE pbData, DWORD dwBytes) +{ + m_pbData = pbData; + m_dwBytes = dwBytes; + + processDLCDataFile(pbData,dwBytes); +} + +PBYTE DLCAudioFile::getData(DWORD &dwBytes) +{ + dwBytes = m_dwBytes; + return m_pbData; +} + +WCHAR *DLCAudioFile::wchTypeNamesA[]= +{ + L"CUENAME", + L"CREDIT", +}; + +DLCAudioFile::EAudioParameterType DLCAudioFile::getParameterType(const wstring ¶mName) +{ + EAudioParameterType type = e_AudioParamType_Invalid; + + for(DWORD i = 0; i < e_AudioParamType_Max; ++i) + { + if(paramName.compare(wchTypeNamesA[i]) == 0) + { + type = (EAudioParameterType)i; + break; + } + } + + return type; +} + +void DLCAudioFile::addParameter(EAudioType type, EAudioParameterType ptype, const wstring &value) +{ + switch(ptype) + { + + case e_AudioParamType_Credit: // If this parameter exists, then mark this as free + //add it to the DLC credits list + + // we'll need to justify this text since we don't have a lot of room for lines of credits + { + // don't look for duplicate in the music credits + + //if(app.AlreadySeenCreditText(value)) break; + + int maximumChars = 55; + + bool bIsSDMode=!RenderManager.IsHiDef() && !RenderManager.IsWidescreen(); + + if(bIsSDMode) + { + maximumChars = 45; + } + + switch(XGetLanguage()) + { + case XC_LANGUAGE_JAPANESE: + case XC_LANGUAGE_TCHINESE: + case XC_LANGUAGE_KOREAN: + maximumChars = 35; + break; + } + wstring creditValue = value; + while (creditValue.length() > maximumChars) + { + unsigned int i = 1; + while (i < creditValue.length() && (i + 1) <= maximumChars) + { + i++; + } + int iLast=(int)creditValue.find_last_of(L" ",i); + switch(XGetLanguage()) + { + case XC_LANGUAGE_JAPANESE: + case XC_LANGUAGE_TCHINESE: + case XC_LANGUAGE_KOREAN: + iLast = maximumChars; + break; + default: + iLast=(int)creditValue.find_last_of(L" ",i); + break; + } + + // if a space was found, include the space on this line + if(iLast!=i) + { + iLast++; + } + + app.AddCreditText((creditValue.substr(0, iLast)).c_str()); + creditValue = creditValue.substr(iLast); + } + app.AddCreditText(creditValue.c_str()); + + } + break; + case e_AudioParamType_Cuename: + m_parameters[type].push_back(value); + //m_parameters[(int)type] = value; + break; + } +} + +bool DLCAudioFile::processDLCDataFile(PBYTE pbData, DWORD dwLength) +{ + unordered_map parameterMapping; + unsigned int uiCurrentByte=0; + + // File format defined in the AudioPacker + // File format: Version 1 + + unsigned int uiVersion=*(unsigned int *)pbData; + uiCurrentByte+=sizeof(int); + + if(uiVersion < CURRENT_AUDIO_VERSION_NUM) + { + if(pbData!=NULL) delete [] pbData; + app.DebugPrintf("DLC version of %d is too old to be read\n", uiVersion); + return false; + } + + unsigned int uiParameterTypeCount=*(unsigned int *)&pbData[uiCurrentByte]; + uiCurrentByte+=sizeof(int); + C4JStorage::DLC_FILE_PARAM *pParams = (C4JStorage::DLC_FILE_PARAM *)&pbData[uiCurrentByte]; + + for(unsigned int i=0;iwchData); + EAudioParameterType type = getParameterType(parameterName); + if( type != e_AudioParamType_Invalid ) + { + parameterMapping[pParams->dwType] = type; + } + uiCurrentByte+= sizeof(C4JStorage::DLC_FILE_PARAM)+(pParams->dwWchCount*sizeof(WCHAR)); + pParams = (C4JStorage::DLC_FILE_PARAM *)&pbData[uiCurrentByte]; + } + unsigned int uiFileCount=*(unsigned int *)&pbData[uiCurrentByte]; + uiCurrentByte+=sizeof(int); + C4JStorage::DLC_FILE_DETAILS *pFile = (C4JStorage::DLC_FILE_DETAILS *)&pbData[uiCurrentByte]; + + DWORD dwTemp=uiCurrentByte; + for(unsigned int i=0;idwWchCount*sizeof(WCHAR); + pFile = (C4JStorage::DLC_FILE_DETAILS *)&pbData[dwTemp]; + } + PBYTE pbTemp=((PBYTE )pFile); + pFile = (C4JStorage::DLC_FILE_DETAILS *)&pbData[uiCurrentByte]; + + for(unsigned int i=0;idwType; + // Params + unsigned int uiParameterCount=*(unsigned int *)pbTemp; + pbTemp+=sizeof(int); + pParams = (C4JStorage::DLC_FILE_PARAM *)pbTemp; + for(unsigned int j=0;jdwType )); + + if(it != parameterMapping.end() ) + { + addParameter(type,(EAudioParameterType)pParams->dwType,(WCHAR *)pParams->wchData); + } + pbTemp+=sizeof(C4JStorage::DLC_FILE_PARAM)+(sizeof(WCHAR)*pParams->dwWchCount); + pParams = (C4JStorage::DLC_FILE_PARAM *)pbTemp; + } + // Move the pointer to the start of the next files data; + pbTemp+=pFile->uiFileSize; + uiCurrentByte+=sizeof(C4JStorage::DLC_FILE_DETAILS)+pFile->dwWchCount*sizeof(WCHAR); + + pFile=(C4JStorage::DLC_FILE_DETAILS *)&pbData[uiCurrentByte]; + + } + + return true; +} + +int DLCAudioFile::GetCountofType(DLCAudioFile::EAudioType eType) +{ + return m_parameters[eType].size(); +} + + +wstring &DLCAudioFile::GetSoundName(int iIndex) +{ + int iWorldType=e_AudioType_Overworld; + while(iIndex>=m_parameters[iWorldType].size()) + { + iIndex-=m_parameters[iWorldType].size(); + iWorldType++; + } + return m_parameters[iWorldType].at(iIndex); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCAudioFile.h b/Minecraft.Client/Common/DLC/DLCAudioFile.h new file mode 100644 index 00000000..728512d7 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCAudioFile.h @@ -0,0 +1,54 @@ +#pragma once +#include "DLCFile.h" + +class DLCAudioFile : public DLCFile +{ + +public: + + // If you add to the Enum,then you need to add the array of type names + // These are the names used in the XML for the parameters + enum EAudioType + { + e_AudioType_Invalid = -1, + + e_AudioType_Overworld = 0, + e_AudioType_Nether, + e_AudioType_End, + + e_AudioType_Max, + }; + enum EAudioParameterType + { + e_AudioParamType_Invalid = -1, + + e_AudioParamType_Cuename = 0, + e_AudioParamType_Credit, + + e_AudioParamType_Max, + + }; + static WCHAR *wchTypeNamesA[e_AudioParamType_Max]; + + DLCAudioFile(const wstring &path); + + virtual void addData(PBYTE pbData, DWORD dwBytes); + virtual PBYTE getData(DWORD &dwBytes); + + bool processDLCDataFile(PBYTE pbData, DWORD dwLength); + int GetCountofType(DLCAudioFile::EAudioType ptype); + wstring &GetSoundName(int iIndex); + +private: + using DLCFile::addParameter; + + PBYTE m_pbData; + DWORD m_dwBytes; + static const int CURRENT_AUDIO_VERSION_NUM=1; + //unordered_map m_parameters; + vector m_parameters[e_AudioType_Max]; + + // use the EAudioType to order these + void addParameter(DLCAudioFile::EAudioType type, DLCAudioFile::EAudioParameterType ptype, const wstring &value); + DLCAudioFile::EAudioParameterType getParameterType(const wstring ¶mName); +}; diff --git a/Minecraft.Client/Common/DLC/DLCCapeFile.cpp b/Minecraft.Client/Common/DLC/DLCCapeFile.cpp new file mode 100644 index 00000000..29a50ad4 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCCapeFile.cpp @@ -0,0 +1,12 @@ +#include "stdafx.h" +#include "DLCManager.h" +#include "DLCCapeFile.h" + +DLCCapeFile::DLCCapeFile(const wstring &path) : DLCFile(DLCManager::e_DLCType_Cape,path) +{ +} + +void DLCCapeFile::addData(PBYTE pbData, DWORD dwBytes) +{ + app.AddMemoryTextureFile(m_path,pbData,dwBytes); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCCapeFile.h b/Minecraft.Client/Common/DLC/DLCCapeFile.h new file mode 100644 index 00000000..8373d340 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCCapeFile.h @@ -0,0 +1,10 @@ +#pragma once +#include "DLCFile.h" + +class DLCCapeFile : public DLCFile +{ +public: + DLCCapeFile(const wstring &path); + + virtual void addData(PBYTE pbData, DWORD dwBytes); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCColourTableFile.cpp b/Minecraft.Client/Common/DLC/DLCColourTableFile.cpp new file mode 100644 index 00000000..ec800dac --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCColourTableFile.cpp @@ -0,0 +1,26 @@ +#include "stdafx.h" +#include "DLCManager.h" +#include "DLCColourTableFile.h" +#include "..\..\Minecraft.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\TexturePack.h" + +DLCColourTableFile::DLCColourTableFile(const wstring &path) : DLCFile(DLCManager::e_DLCType_ColourTable,path) +{ + m_colourTable = NULL; +} + +DLCColourTableFile::~DLCColourTableFile() +{ + if(m_colourTable != NULL) + { + app.DebugPrintf("Deleting DLCColourTableFile data\n"); + delete m_colourTable; + } +} + +void DLCColourTableFile::addData(PBYTE pbData, DWORD dwBytes) +{ + ColourTable *defaultColourTable = Minecraft::GetInstance()->skins->getDefault()->getColourTable(); + m_colourTable = new ColourTable(defaultColourTable, pbData, dwBytes); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCColourTableFile.h b/Minecraft.Client/Common/DLC/DLCColourTableFile.h new file mode 100644 index 00000000..84269739 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCColourTableFile.h @@ -0,0 +1,18 @@ +#pragma once +#include "DLCFile.h" + +class ColourTable; + +class DLCColourTableFile : public DLCFile +{ +private: + ColourTable *m_colourTable; + +public: + DLCColourTableFile(const wstring &path); + ~DLCColourTableFile(); + + virtual void addData(PBYTE pbData, DWORD dwBytes); + + ColourTable *getColourTable() { return m_colourTable; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCFile.cpp b/Minecraft.Client/Common/DLC/DLCFile.cpp new file mode 100644 index 00000000..e7bbace0 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCFile.cpp @@ -0,0 +1,26 @@ +#include "stdafx.h" +#include "DLCFile.h" + +DLCFile::DLCFile(DLCManager::EDLCType type, const wstring &path) +{ + m_type = type; + m_path = path; + + // store the id + bool dlcSkin = path.substr(0,3).compare(L"dlc") == 0; + + if(dlcSkin) + { + wstring skinValue = path.substr(7,path.size()); + skinValue = skinValue.substr(0,skinValue.find_first_of(L'.')); + std::wstringstream ss; + ss << std::dec << skinValue.c_str(); + ss >> m_dwSkinId; + m_dwSkinId = MAKE_SKIN_BITMASK(true, m_dwSkinId); + + } + else + { + m_dwSkinId=0; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCFile.h b/Minecraft.Client/Common/DLC/DLCFile.h new file mode 100644 index 00000000..3a40dbc7 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCFile.h @@ -0,0 +1,25 @@ +#pragma once +#include "DLCManager.h" + +class DLCFile +{ +protected: + DLCManager::EDLCType m_type; + wstring m_path; + DWORD m_dwSkinId; + +public: + DLCFile(DLCManager::EDLCType type, const wstring &path); + virtual ~DLCFile() {} + + DLCManager::EDLCType getType() { return m_type; } + wstring getPath() { return m_path; } + DWORD getSkinID() { return m_dwSkinId; } + + virtual void addData(PBYTE pbData, DWORD dwBytes) {} + virtual PBYTE getData(DWORD &dwBytes) { dwBytes = 0; return NULL; } + virtual void addParameter(DLCManager::EDLCParameterType type, const wstring &value) {} + + virtual wstring getParameterAsString(DLCManager::EDLCParameterType type) { return L""; } + virtual bool getParameterAsBool(DLCManager::EDLCParameterType type) { return false;} +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCGameRules.h b/Minecraft.Client/Common/DLC/DLCGameRules.h new file mode 100644 index 00000000..9d3bbaad --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCGameRules.h @@ -0,0 +1,10 @@ +#pragma once + +#include "DLCFile.h" +#include "..\GameRules\LevelGenerationOptions.h" + +class DLCGameRules : public DLCFile +{ +public: + DLCGameRules(DLCManager::EDLCType type, const wstring &path) : DLCFile(type,path) {} +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCGameRulesFile.cpp b/Minecraft.Client/Common/DLC/DLCGameRulesFile.cpp new file mode 100644 index 00000000..8ca520d6 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCGameRulesFile.cpp @@ -0,0 +1,21 @@ +#include "stdafx.h" +#include "DLCManager.h" +#include "DLCGameRulesFile.h" + +DLCGameRulesFile::DLCGameRulesFile(const wstring &path) : DLCGameRules(DLCManager::e_DLCType_GameRules,path) +{ + m_pbData = NULL; + m_dwBytes = 0; +} + +void DLCGameRulesFile::addData(PBYTE pbData, DWORD dwBytes) +{ + m_pbData = pbData; + m_dwBytes = dwBytes; +} + +PBYTE DLCGameRulesFile::getData(DWORD &dwBytes) +{ + dwBytes = m_dwBytes; + return m_pbData; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCGameRulesFile.h b/Minecraft.Client/Common/DLC/DLCGameRulesFile.h new file mode 100644 index 00000000..e6456d73 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCGameRulesFile.h @@ -0,0 +1,15 @@ +#pragma once +#include "DLCGameRules.h" + +class DLCGameRulesFile : public DLCGameRules +{ +private: + PBYTE m_pbData; + DWORD m_dwBytes; + +public: + DLCGameRulesFile(const wstring &path); + + virtual void addData(PBYTE pbData, DWORD dwBytes); + virtual PBYTE getData(DWORD &dwBytes); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCGameRulesHeader.cpp b/Minecraft.Client/Common/DLC/DLCGameRulesHeader.cpp new file mode 100644 index 00000000..39b85219 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCGameRulesHeader.cpp @@ -0,0 +1,92 @@ +#include "stdafx.h" + +#include + +#include "..\..\..\Minecraft.World\File.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\InputOutputStream.h" + +#include "DLCManager.h" +#include "DLCGameRulesHeader.h" + +DLCGameRulesHeader::DLCGameRulesHeader(const wstring &path) : DLCGameRules(DLCManager::e_DLCType_GameRulesHeader,path) +{ + m_pbData = NULL; + m_dwBytes = 0; + + m_hasData = false; + + m_grfPath = path.substr(0, path.length() - 4) + L".grf"; + + lgo = NULL; +} + +void DLCGameRulesHeader::addData(PBYTE pbData, DWORD dwBytes) +{ + m_pbData = pbData; + m_dwBytes = dwBytes; + + +#if 0 + byteArray data(m_pbData, m_dwBytes); + ByteArrayInputStream bais(data); + DataInputStream dis(&bais); + + // Init values. + int version_number; + byte compression_type; + wstring texturepackid; + + // Read Datastream. + version_number = dis.readInt(); + compression_type = dis.readByte(); + m_defaultSaveName = dis.readUTF(); + m_displayName = dis.readUTF(); + texturepackid = dis.readUTF(); + m_grfPath = dis.readUTF(); + + // Debug printout. + app.DebugPrintf ( + "DLCGameRulesHeader::readHeader:\n" + "\tversion_number = '%d',\n" + "\tcompression_type = '%d',\n" + "\tdefault_savename = '%s',\n" + "\tdisplayname = '%s',\n" + "\ttexturepackid = '%s',\n" + "\tgrf_path = '%s',\n", + + version_number, compression_type, + + wstringtofilename(m_defaultSaveName), + wstringtofilename(m_displayName), + wstringtofilename(texturepackid), + wstringtofilename(m_grfPath) + ); + + // Texture Pack. + m_requiredTexturePackId = _fromString(texturepackid); + m_bRequiresTexturePack = m_requiredTexturePackId > 0; + + dis.close(); + bais.close(); + bais.reset(); +#endif +} + +PBYTE DLCGameRulesHeader::getData(DWORD &dwBytes) +{ + dwBytes = m_dwBytes; + return m_pbData; +} + +void DLCGameRulesHeader::setGrfData(PBYTE fData, DWORD fSize, StringTable *st) +{ + if (!m_hasData) + { + m_hasData = true; + + //app.m_gameRules.loadGameRules(lgo, fData, fSize); + + app.m_gameRules.readRuleFile(lgo, fData, fSize, st); + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCGameRulesHeader.h b/Minecraft.Client/Common/DLC/DLCGameRulesHeader.h new file mode 100644 index 00000000..4521ae11 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCGameRulesHeader.h @@ -0,0 +1,42 @@ +#pragma once + +#include "DLCGameRules.h" +#include "..\GameRules\LevelGenerationOptions.h" + +class DLCGameRulesHeader : public DLCGameRules, public JustGrSource +{ +private: + + // GR-Header + PBYTE m_pbData; + DWORD m_dwBytes; + + bool m_hasData; + +public: + virtual bool requiresTexturePack() {return m_bRequiresTexturePack;} + virtual UINT getRequiredTexturePackId() {return m_requiredTexturePackId;} + virtual wstring getDefaultSaveName() {return m_defaultSaveName;} + virtual LPCWSTR getWorldName() {return m_worldName.c_str();} + virtual LPCWSTR getDisplayName() {return m_displayName.c_str();} + virtual wstring getGrfPath() {return L"GameRules.grf";} + + virtual void setRequiresTexturePack(bool x) {m_bRequiresTexturePack = x;} + virtual void setRequiredTexturePackId(UINT x) {m_requiredTexturePackId = x;} + virtual void setDefaultSaveName(const wstring &x) {m_defaultSaveName = x;} + virtual void setWorldName(const wstring & x) {m_worldName = x;} + virtual void setDisplayName(const wstring & x) {m_displayName = x;} + virtual void setGrfPath(const wstring & x) {m_grfPath = x;} + + LevelGenerationOptions *lgo; + +public: + DLCGameRulesHeader(const wstring &path); + + virtual void addData(PBYTE pbData, DWORD dwBytes); + virtual PBYTE getData(DWORD &dwBytes); + + void setGrfData(PBYTE fData, DWORD fSize, StringTable *); + + virtual bool ready() { return m_hasData; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCLocalisationFile.cpp b/Minecraft.Client/Common/DLC/DLCLocalisationFile.cpp new file mode 100644 index 00000000..358a93e5 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCLocalisationFile.cpp @@ -0,0 +1,14 @@ +#include "stdafx.h" +#include "DLCManager.h" +#include "DLCLocalisationFile.h" +#include "..\..\StringTable.h" + +DLCLocalisationFile::DLCLocalisationFile(const wstring &path) : DLCFile(DLCManager::e_DLCType_LocalisationData,path) +{ + m_strings = NULL; +} + +void DLCLocalisationFile::addData(PBYTE pbData, DWORD dwBytes) +{ + m_strings = new StringTable(pbData, dwBytes); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCLocalisationFile.h b/Minecraft.Client/Common/DLC/DLCLocalisationFile.h new file mode 100644 index 00000000..083e60d8 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCLocalisationFile.h @@ -0,0 +1,18 @@ +#pragma once +#include "DLCFile.h" + +class StringTable; + +class DLCLocalisationFile : public DLCFile +{ +private: + StringTable *m_strings; + +public: + DLCLocalisationFile(const wstring &path); + DLCLocalisationFile(PBYTE pbData, DWORD dwBytes); // when we load in a texture pack details file from TMS++ + + virtual void addData(PBYTE pbData, DWORD dwBytes); + + StringTable *getStringTable() { return m_strings; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCManager.cpp b/Minecraft.Client/Common/DLC/DLCManager.cpp new file mode 100644 index 00000000..123e4266 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCManager.cpp @@ -0,0 +1,671 @@ +#include "stdafx.h" +#include +#include "DLCManager.h" +#include "DLCPack.h" +#include "DLCFile.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\Minecraft.h" +#include "..\..\TexturePackRepository.h" + +WCHAR *DLCManager::wchTypeNamesA[]= +{ + L"DISPLAYNAME", + L"THEMENAME", + L"FREE", + L"CREDIT", + L"CAPEPATH", + L"BOX", + L"ANIM", + L"PACKID", + L"NETHERPARTICLECOLOUR", + L"ENCHANTTEXTCOLOUR", + L"ENCHANTTEXTFOCUSCOLOUR", + L"DATAPATH", + L"PACKVERSION", +}; + +DLCManager::DLCManager() +{ + //m_bNeedsUpdated = true; + m_bNeedsCorruptCheck = true; +} + +DLCManager::~DLCManager() +{ + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + DLCPack *pack = *it; + delete pack; + } +} + +DLCManager::EDLCParameterType DLCManager::getParameterType(const wstring ¶mName) +{ + EDLCParameterType type = e_DLCParamType_Invalid; + + for(DWORD i = 0; i < e_DLCParamType_Max; ++i) + { + if(paramName.compare(wchTypeNamesA[i]) == 0) + { + type = (EDLCParameterType)i; + break; + } + } + + return type; +} + +DWORD DLCManager::getPackCount(EDLCType type /*= e_DLCType_All*/) +{ + DWORD packCount = 0; + if( type != e_DLCType_All ) + { + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + DLCPack *pack = *it; + if( pack->getDLCItemsCount(type) > 0 ) + { + ++packCount; + } + } + } + else + { + packCount = (DWORD)m_packs.size(); + } + return packCount; +} + +void DLCManager::addPack(DLCPack *pack) +{ + m_packs.push_back(pack); +} + +void DLCManager::removePack(DLCPack *pack) +{ + if(pack != NULL) + { + AUTO_VAR(it, find(m_packs.begin(),m_packs.end(),pack)); + if(it != m_packs.end() ) m_packs.erase(it); + delete pack; + } +} + +DLCPack *DLCManager::getPack(const wstring &name) +{ + DLCPack *pack = NULL; + //DWORD currentIndex = 0; + DLCPack *currentPack = NULL; + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + currentPack = *it; + wstring wsName=currentPack->getName(); + + if(wsName.compare(name) == 0) + { + pack = currentPack; + break; + } + } + return pack; +} + +#ifdef _XBOX_ONE +DLCPack *DLCManager::getPackFromProductID(const wstring &productID) +{ + DLCPack *pack = NULL; + //DWORD currentIndex = 0; + DLCPack *currentPack = NULL; + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + currentPack = *it; + wstring wsName=currentPack->getPurchaseOfferId(); + + if(wsName.compare(productID) == 0) + { + pack = currentPack; + break; + } + } + return pack; +} +#endif + +DLCPack *DLCManager::getPack(DWORD index, EDLCType type /*= e_DLCType_All*/) +{ + DLCPack *pack = NULL; + if( type != e_DLCType_All ) + { + DWORD currentIndex = 0; + DLCPack *currentPack = NULL; + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + currentPack = *it; + if(currentPack->getDLCItemsCount(type)>0) + { + if(currentIndex == index) + { + pack = currentPack; + break; + } + ++currentIndex; + } + } + } + else + { + if(index >= m_packs.size()) + { + app.DebugPrintf("DLCManager: Trying to access a DLC pack beyond the range of valid packs\n"); + __debugbreak(); + } + pack = m_packs[index]; + } + + return pack; +} + +DWORD DLCManager::getPackIndex(DLCPack *pack, bool &found, EDLCType type /*= e_DLCType_All*/) +{ + DWORD foundIndex = 0; + found = false; + if(pack == NULL) + { + app.DebugPrintf("DLCManager: Attempting to find the index for a NULL pack\n"); + //__debugbreak(); + return foundIndex; + } + if( type != e_DLCType_All ) + { + DWORD index = 0; + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + DLCPack *thisPack = *it; + if(thisPack->getDLCItemsCount(type)>0) + { + if(thisPack == pack) + { + found = true; + foundIndex = index; + break; + } + ++index; + } + } + } + else + { + DWORD index = 0; + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + DLCPack *thisPack = *it; + if(thisPack == pack) + { + found = true; + foundIndex = index; + break; + } + ++index; + } + } + return foundIndex; +} + +DWORD DLCManager::getPackIndexContainingSkin(const wstring &path, bool &found) +{ + DWORD foundIndex = 0; + found = false; + DWORD index = 0; + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + DLCPack *pack = *it; + if(pack->getDLCItemsCount(e_DLCType_Skin)>0) + { + if(pack->doesPackContainSkin(path)) + { + foundIndex = index; + found = true; + break; + } + ++index; + } + } + return foundIndex; +} + +DLCPack *DLCManager::getPackContainingSkin(const wstring &path) +{ + DLCPack *foundPack = NULL; + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + DLCPack *pack = *it; + if(pack->getDLCItemsCount(e_DLCType_Skin)>0) + { + if(pack->doesPackContainSkin(path)) + { + foundPack = pack; + break; + } + } + } + return foundPack; +} + +DLCSkinFile *DLCManager::getSkinFile(const wstring &path) +{ + DLCSkinFile *foundSkinfile = NULL; + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + DLCPack *pack = *it; + foundSkinfile=pack->getSkinFile(path); + if(foundSkinfile!=NULL) + { + break; + } + } + return foundSkinfile; +} + +DWORD DLCManager::checkForCorruptDLCAndAlert(bool showMessage /*= true*/) +{ + DWORD corruptDLCCount = m_dwUnnamedCorruptDLCCount; + DLCPack *pack = NULL; + DLCPack *firstCorruptPack = NULL; + + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + pack = *it; + if( pack->IsCorrupt() ) + { + ++corruptDLCCount; + if(firstCorruptPack == NULL) firstCorruptPack = pack; + } + } + + if(corruptDLCCount > 0 && showMessage) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + if(corruptDLCCount == 1 && firstCorruptPack != NULL) + { + // pass in the pack format string + WCHAR wchFormat[132]; + swprintf(wchFormat, 132, L"%ls\n\n%%ls", firstCorruptPack->getName().c_str()); + + C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_CORRUPT_DLC_TITLE, IDS_CORRUPT_DLC, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(),wchFormat); + + } + else + { + C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_CORRUPT_DLC_TITLE, IDS_CORRUPT_DLC_MULTIPLE, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + } + } + + SetNeedsCorruptCheck(false); + + return corruptDLCCount; +} + +bool DLCManager::readDLCDataFile(DWORD &dwFilesProcessed, const wstring &path, DLCPack *pack, bool fromArchive) +{ + return readDLCDataFile( dwFilesProcessed, wstringtofilename(path), pack, fromArchive); +} + + +bool DLCManager::readDLCDataFile(DWORD &dwFilesProcessed, const string &path, DLCPack *pack, bool fromArchive) +{ + wstring wPath = convStringToWstring(path); + if (fromArchive && app.getArchiveFileSize(wPath) >= 0) + { + byteArray bytes = app.getArchiveFile(wPath); + return processDLCDataFile(dwFilesProcessed, bytes.data, bytes.length, pack); + } + else if (fromArchive) return false; + +#ifdef _WINDOWS64 + string finalPath = StorageManager.GetMountedPath(path.c_str()); + if(finalPath.size() == 0) finalPath = path; + HANDLE file = CreateFile(finalPath.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); +#elif defined(_DURANGO) + wstring finalPath = StorageManager.GetMountedPath(wPath.c_str()); + if(finalPath.size() == 0) finalPath = wPath; + HANDLE file = CreateFile(finalPath.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); +#else + HANDLE file = CreateFile(path.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); +#endif + if( file == INVALID_HANDLE_VALUE ) + { + DWORD error = GetLastError(); + app.DebugPrintf("Failed to open DLC data file with error code %d (%x)\n", error, error); + if( dwFilesProcessed == 0 ) removePack(pack); + assert(false); + return false; + } + + DWORD bytesRead,dwFileSize = GetFileSize(file,NULL); + PBYTE pbData = (PBYTE) new BYTE[dwFileSize]; + BOOL bSuccess = ReadFile(file,pbData,dwFileSize,&bytesRead,NULL); + if(bSuccess==FALSE) + { + // need to treat the file as corrupt, and flag it, so can't call fatal error + //app.FatalLoadError(); + } + else + { + CloseHandle(file); + } + if(bSuccess==FALSE) + { + // Corrupt or some other error. In any case treat as corrupt + app.DebugPrintf("Failed to read %s from DLC content package\n", path.c_str()); + pack->SetIsCorrupt( true ); + SetNeedsCorruptCheck(true); + return false; + } + return processDLCDataFile(dwFilesProcessed, pbData, bytesRead, pack); +} + +bool DLCManager::processDLCDataFile(DWORD &dwFilesProcessed, PBYTE pbData, DWORD dwLength, DLCPack *pack) +{ + unordered_map parameterMapping; + unsigned int uiCurrentByte=0; + + // File format defined in the DLC_Creator + // File format: Version 2 + // unsigned long, version number + // unsigned long, t = number of parameter types + // t * DLC_FILE_PARAM structs mapping strings to id's + // unsigned long, n = number of files + // n * DLC_FILE_DETAILS describing each file in the pack + // n * files of the form + // // unsigned long, p = number of parameters + // // p * DLC_FILE_PARAM describing each parameter for this file + // // ulFileSize bytes of data blob of the file added + unsigned int uiVersion=*(unsigned int *)pbData; + uiCurrentByte+=sizeof(int); + + if(uiVersion < CURRENT_DLC_VERSION_NUM) + { + if(pbData!=NULL) delete [] pbData; + app.DebugPrintf("DLC version of %d is too old to be read\n", uiVersion); + return false; + } + pack->SetDataPointer(pbData); + unsigned int uiParameterCount=*(unsigned int *)&pbData[uiCurrentByte]; + uiCurrentByte+=sizeof(int); + C4JStorage::DLC_FILE_PARAM *pParams = (C4JStorage::DLC_FILE_PARAM *)&pbData[uiCurrentByte]; + //DWORD dwwchCount=0; + for(unsigned int i=0;iwchData); + DLCManager::EDLCParameterType type = DLCManager::getParameterType(parameterName); + if( type != DLCManager::e_DLCParamType_Invalid ) + { + parameterMapping[pParams->dwType] = type; + } + uiCurrentByte+= sizeof(C4JStorage::DLC_FILE_PARAM)+(pParams->dwWchCount*sizeof(WCHAR)); + pParams = (C4JStorage::DLC_FILE_PARAM *)&pbData[uiCurrentByte]; + } + //ulCurrentByte+=ulParameterCount * sizeof(C4JStorage::DLC_FILE_PARAM); + + unsigned int uiFileCount=*(unsigned int *)&pbData[uiCurrentByte]; + uiCurrentByte+=sizeof(int); + C4JStorage::DLC_FILE_DETAILS *pFile = (C4JStorage::DLC_FILE_DETAILS *)&pbData[uiCurrentByte]; + + DWORD dwTemp=uiCurrentByte; + for(unsigned int i=0;idwWchCount*sizeof(WCHAR); + pFile = (C4JStorage::DLC_FILE_DETAILS *)&pbData[dwTemp]; + } + PBYTE pbTemp=((PBYTE )pFile);//+ sizeof(C4JStorage::DLC_FILE_DETAILS)*ulFileCount; + pFile = (C4JStorage::DLC_FILE_DETAILS *)&pbData[uiCurrentByte]; + + for(unsigned int i=0;idwType; + + DLCFile *dlcFile = NULL; + DLCPack *dlcTexturePack = NULL; + + if(type == e_DLCType_TexturePack) + { + dlcTexturePack = new DLCPack(pack->getName(), pack->getLicenseMask()); + } + else if(type != e_DLCType_PackConfig) + { + dlcFile = pack->addFile(type,(WCHAR *)pFile->wchFile); + } + + // Params + uiParameterCount=*(unsigned int *)pbTemp; + pbTemp+=sizeof(int); + pParams = (C4JStorage::DLC_FILE_PARAM *)pbTemp; + for(unsigned int j=0;jdwType )); + + if(it != parameterMapping.end() ) + { + if(type == e_DLCType_PackConfig) + { + pack->addParameter(it->second,(WCHAR *)pParams->wchData); + } + else + { + if(dlcFile != NULL) dlcFile->addParameter(it->second,(WCHAR *)pParams->wchData); + else if(dlcTexturePack != NULL) dlcTexturePack->addParameter(it->second, (WCHAR *)pParams->wchData); + } + } + pbTemp+=sizeof(C4JStorage::DLC_FILE_PARAM)+(sizeof(WCHAR)*pParams->dwWchCount); + pParams = (C4JStorage::DLC_FILE_PARAM *)pbTemp; + } + //pbTemp+=ulParameterCount * sizeof(C4JStorage::DLC_FILE_PARAM); + + if(dlcTexturePack != NULL) + { + DWORD texturePackFilesProcessed = 0; + bool validPack = processDLCDataFile(texturePackFilesProcessed,pbTemp,pFile->uiFileSize,dlcTexturePack); + pack->SetDataPointer(NULL); // If it's a child pack, it doesn't own the data + if(!validPack || texturePackFilesProcessed == 0) + { + delete dlcTexturePack; + dlcTexturePack = NULL; + } + else + { + pack->addChildPack(dlcTexturePack); + + if(dlcTexturePack->getDLCItemsCount(DLCManager::e_DLCType_Texture) > 0) + { + Minecraft::GetInstance()->skins->addTexturePackFromDLC(dlcTexturePack, dlcTexturePack->GetPackId() ); + } + } + ++dwFilesProcessed; + } + else if(dlcFile != NULL) + { + // Data + dlcFile->addData(pbTemp,pFile->uiFileSize); + + // TODO - 4J Stu Remove the need for this vSkinNames vector, or manage it differently + switch(pFile->dwType) + { + case DLCManager::e_DLCType_Skin: + app.vSkinNames.push_back((WCHAR *)pFile->wchFile); + break; + } + + ++dwFilesProcessed; + } + + // Move the pointer to the start of the next files data; + pbTemp+=pFile->uiFileSize; + uiCurrentByte+=sizeof(C4JStorage::DLC_FILE_DETAILS)+pFile->dwWchCount*sizeof(WCHAR); + + pFile=(C4JStorage::DLC_FILE_DETAILS *)&pbData[uiCurrentByte]; + } + + if( pack->getDLCItemsCount(DLCManager::e_DLCType_GameRules) > 0 + || pack->getDLCItemsCount(DLCManager::e_DLCType_GameRulesHeader) > 0) + { + app.m_gameRules.loadGameRules(pack); + } + + if(pack->getDLCItemsCount(DLCManager::e_DLCType_Audio) > 0) + { + //app.m_Audio.loadAudioDetails(pack); + } + // TODO Should be able to delete this data, but we can't yet due to how it is added to the Memory textures (MEM_file) + + return true; +} + +DWORD DLCManager::retrievePackIDFromDLCDataFile(const string &path, DLCPack *pack) +{ + DWORD packId = 0; + wstring wPath = convStringToWstring(path); + +#ifdef _WINDOWS64 + string finalPath = StorageManager.GetMountedPath(path.c_str()); + if(finalPath.size() == 0) finalPath = path; + HANDLE file = CreateFile(finalPath.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); +#elif defined(_DURANGO) + wstring finalPath = StorageManager.GetMountedPath(wPath.c_str()); + if(finalPath.size() == 0) finalPath = wPath; + HANDLE file = CreateFile(finalPath.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); +#else + HANDLE file = CreateFile(path.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); +#endif + if( file == INVALID_HANDLE_VALUE ) + { + return 0; + } + + DWORD bytesRead,dwFileSize = GetFileSize(file,NULL); + PBYTE pbData = (PBYTE) new BYTE[dwFileSize]; + BOOL bSuccess = ReadFile(file,pbData,dwFileSize,&bytesRead,NULL); + if(bSuccess==FALSE) + { + // need to treat the file as corrupt, and flag it, so can't call fatal error + //app.FatalLoadError(); + } + else + { + CloseHandle(file); + } + if(bSuccess==FALSE) + { + // Corrupt or some other error. In any case treat as corrupt + app.DebugPrintf("Failed to read %s from DLC content package\n", path.c_str()); + delete [] pbData; + return 0; + } + packId=retrievePackID(pbData, bytesRead, pack); + delete [] pbData; + + return packId; +} + +DWORD DLCManager::retrievePackID(PBYTE pbData, DWORD dwLength, DLCPack *pack) +{ + DWORD packId=0; + bool bPackIDSet=false; + unordered_map parameterMapping; + unsigned int uiCurrentByte=0; + + // File format defined in the DLC_Creator + // File format: Version 2 + // unsigned long, version number + // unsigned long, t = number of parameter types + // t * DLC_FILE_PARAM structs mapping strings to id's + // unsigned long, n = number of files + // n * DLC_FILE_DETAILS describing each file in the pack + // n * files of the form + // // unsigned long, p = number of parameters + // // p * DLC_FILE_PARAM describing each parameter for this file + // // ulFileSize bytes of data blob of the file added + unsigned int uiVersion=*(unsigned int *)pbData; + uiCurrentByte+=sizeof(int); + + if(uiVersion < CURRENT_DLC_VERSION_NUM) + { + app.DebugPrintf("DLC version of %d is too old to be read\n", uiVersion); + return 0; + } + pack->SetDataPointer(pbData); + unsigned int uiParameterCount=*(unsigned int *)&pbData[uiCurrentByte]; + uiCurrentByte+=sizeof(int); + C4JStorage::DLC_FILE_PARAM *pParams = (C4JStorage::DLC_FILE_PARAM *)&pbData[uiCurrentByte]; + for(unsigned int i=0;iwchData); + DLCManager::EDLCParameterType type = DLCManager::getParameterType(parameterName); + if( type != DLCManager::e_DLCParamType_Invalid ) + { + parameterMapping[pParams->dwType] = type; + } + uiCurrentByte+= sizeof(C4JStorage::DLC_FILE_PARAM)+(pParams->dwWchCount*sizeof(WCHAR)); + pParams = (C4JStorage::DLC_FILE_PARAM *)&pbData[uiCurrentByte]; + } + + unsigned int uiFileCount=*(unsigned int *)&pbData[uiCurrentByte]; + uiCurrentByte+=sizeof(int); + C4JStorage::DLC_FILE_DETAILS *pFile = (C4JStorage::DLC_FILE_DETAILS *)&pbData[uiCurrentByte]; + + DWORD dwTemp=uiCurrentByte; + for(unsigned int i=0;idwWchCount*sizeof(WCHAR); + pFile = (C4JStorage::DLC_FILE_DETAILS *)&pbData[dwTemp]; + } + PBYTE pbTemp=((PBYTE )pFile); + pFile = (C4JStorage::DLC_FILE_DETAILS *)&pbData[uiCurrentByte]; + + for(unsigned int i=0;idwType; + + // Params + uiParameterCount=*(unsigned int *)pbTemp; + pbTemp+=sizeof(int); + pParams = (C4JStorage::DLC_FILE_PARAM *)pbTemp; + for(unsigned int j=0;jdwType )); + + if(it != parameterMapping.end() ) + { + if(type==e_DLCType_PackConfig) + { + if(it->second==e_DLCParamType_PackId) + { + wstring wsTemp=(WCHAR *)pParams->wchData; + std::wstringstream ss; + // 4J Stu - numbered using decimal to make it easier for artists/people to number manually + ss << std::dec << wsTemp.c_str(); + ss >> packId; + bPackIDSet=true; + break; + } + } + } + pbTemp+=sizeof(C4JStorage::DLC_FILE_PARAM)+(sizeof(WCHAR)*pParams->dwWchCount); + pParams = (C4JStorage::DLC_FILE_PARAM *)pbTemp; + } + + if(bPackIDSet) break; + // Move the pointer to the start of the next files data; + pbTemp+=pFile->uiFileSize; + uiCurrentByte+=sizeof(C4JStorage::DLC_FILE_DETAILS)+pFile->dwWchCount*sizeof(WCHAR); + + pFile=(C4JStorage::DLC_FILE_DETAILS *)&pbData[uiCurrentByte]; + } + + parameterMapping.clear(); + return packId; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCManager.h b/Minecraft.Client/Common/DLC/DLCManager.h new file mode 100644 index 00000000..55a62312 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCManager.h @@ -0,0 +1,99 @@ +#pragma once +using namespace std; +#include +class DLCPack; +class DLCSkinFile; + +class DLCManager +{ +public: + enum EDLCType + { + e_DLCType_Skin = 0, + e_DLCType_Cape, + e_DLCType_Texture, + e_DLCType_UIData, + e_DLCType_PackConfig, + e_DLCType_TexturePack, + e_DLCType_LocalisationData, + e_DLCType_GameRules, + e_DLCType_Audio, + e_DLCType_ColourTable, + e_DLCType_GameRulesHeader, + + e_DLCType_Max, + e_DLCType_All, + }; + + // If you add to the Enum,then you need to add the array of type names + // These are the names used in the XML for the parameters + enum EDLCParameterType + { + e_DLCParamType_Invalid = -1, + + e_DLCParamType_DisplayName = 0, + e_DLCParamType_ThemeName, + e_DLCParamType_Free, // identify free skins + e_DLCParamType_Credit, // legal credits for DLC + e_DLCParamType_Cape, + e_DLCParamType_Box, + e_DLCParamType_Anim, + e_DLCParamType_PackId, + e_DLCParamType_NetherParticleColour, + e_DLCParamType_EnchantmentTextColour, + e_DLCParamType_EnchantmentTextFocusColour, + e_DLCParamType_DataPath, + e_DLCParamType_PackVersion, + + e_DLCParamType_Max, + + }; + static WCHAR *wchTypeNamesA[e_DLCParamType_Max]; + +private: + vector m_packs; + //bool m_bNeedsUpdated; + bool m_bNeedsCorruptCheck; + DWORD m_dwUnnamedCorruptDLCCount; +public: + DLCManager(); + ~DLCManager(); + + static EDLCParameterType getParameterType(const wstring ¶mName); + + DWORD getPackCount(EDLCType type = e_DLCType_All); + + //bool NeedsUpdated() { return m_bNeedsUpdated; } + //void SetNeedsUpdated(bool val) { m_bNeedsUpdated = val; } + + bool NeedsCorruptCheck() { return m_bNeedsCorruptCheck; } + void SetNeedsCorruptCheck(bool val) { m_bNeedsCorruptCheck = val; } + + void resetUnnamedCorruptCount() { m_dwUnnamedCorruptDLCCount = 0; } + void incrementUnnamedCorruptCount() { ++m_dwUnnamedCorruptDLCCount; } + + void addPack(DLCPack *pack); + void removePack(DLCPack *pack); + + DLCPack *getPack(const wstring &name); +#ifdef _XBOX_ONE + DLCPack *DLCManager::getPackFromProductID(const wstring &productID); +#endif + DLCPack *getPack(DWORD index, EDLCType type = e_DLCType_All); + DWORD getPackIndex(DLCPack *pack, bool &found, EDLCType type = e_DLCType_All); + DLCSkinFile *getSkinFile(const wstring &path); // Will hunt all packs of type skin to find the right skinfile + + DLCPack *getPackContainingSkin(const wstring &path); + DWORD getPackIndexContainingSkin(const wstring &path, bool &found); + + DWORD checkForCorruptDLCAndAlert(bool showMessage = true); + + bool readDLCDataFile(DWORD &dwFilesProcessed, const wstring &path, DLCPack *pack, bool fromArchive = false); + bool readDLCDataFile(DWORD &dwFilesProcessed, const string &path, DLCPack *pack, bool fromArchive = false); + DWORD retrievePackIDFromDLCDataFile(const string &path, DLCPack *pack); + +private: + bool processDLCDataFile(DWORD &dwFilesProcessed, PBYTE pbData, DWORD dwLength, DLCPack *pack); + + DWORD retrievePackID(PBYTE pbData, DWORD dwLength, DLCPack *pack); +}; diff --git a/Minecraft.Client/Common/DLC/DLCPack.cpp b/Minecraft.Client/Common/DLC/DLCPack.cpp new file mode 100644 index 00000000..23a2e44a --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCPack.cpp @@ -0,0 +1,410 @@ +#include "stdafx.h" +#include "DLCPack.h" +#include "DLCSkinFile.h" +#include "DLCCapeFile.h" +#include "DLCTextureFile.h" +#include "DLCUIDataFile.h" +#include "DLCLocalisationFile.h" +#include "DLCGameRulesFile.h" +#include "DLCGameRulesHeader.h" +#include "DLCAudioFile.h" +#include "DLCColourTableFile.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" + +DLCPack::DLCPack(const wstring &name,DWORD dwLicenseMask) +{ + m_dataPath = L""; + m_packName = name; + m_dwLicenseMask=dwLicenseMask; +#ifdef _XBOX_ONE + m_wsProductId = L""; +#else + m_ullFullOfferId = 0LL; +#endif + m_isCorrupt = false; + m_packId = 0; + m_packVersion = 0; + m_parentPack = NULL; + m_dlcMountIndex = -1; +#ifdef _XBOX + m_dlcDeviceID = XCONTENTDEVICE_ANY; +#endif + + // This pointer is for all the data used for this pack, so deleting it invalidates ALL of it's children. + m_data = NULL; +} + +#ifdef _XBOX_ONE +DLCPack::DLCPack(const wstring &name,const wstring &productID,DWORD dwLicenseMask) +{ + m_dataPath = L""; + m_packName = name; + m_dwLicenseMask=dwLicenseMask; + m_wsProductId = productID; + m_isCorrupt = false; + m_packId = 0; + m_packVersion = 0; + m_parentPack = NULL; + m_dlcMountIndex = -1; + + // This pointer is for all the data used for this pack, so deleting it invalidates ALL of it's children. + m_data = NULL; +} +#endif + +DLCPack::~DLCPack() +{ + for(AUTO_VAR(it, m_childPacks.begin()); it != m_childPacks.end(); ++it) + { + delete *it; + } + + for(unsigned int i = 0; i < DLCManager::e_DLCType_Max; ++i) + { + for(AUTO_VAR(it,m_files[i].begin()); it != m_files[i].end(); ++it) + { + delete *it; + } + } + + // This pointer is for all the data used for this pack, so deleting it invalidates ALL of it's children. + if(m_data) + { +#ifndef _CONTENT_PACKAGE + wprintf(L"Deleting data for DLC pack %ls\n", m_packName.c_str()); +#endif + // For the same reason, don't delete data pointer for any child pack as it just points to a region within the parent pack that has already been freed + if( m_parentPack == NULL ) + { + delete [] m_data; + } + } +} + +DWORD DLCPack::GetDLCMountIndex() +{ + if(m_parentPack != NULL) + { + return m_parentPack->GetDLCMountIndex(); + } + return m_dlcMountIndex; +} + +XCONTENTDEVICEID DLCPack::GetDLCDeviceID() +{ + if(m_parentPack != NULL ) + { + return m_parentPack->GetDLCDeviceID(); + } + return m_dlcDeviceID; +} + +void DLCPack::addChildPack(DLCPack *childPack) +{ + int packId = childPack->GetPackId(); +#ifndef _CONTENT_PACKAGE + if(packId < 0 || packId > 15) + { + __debugbreak(); + } +#endif + childPack->SetPackId( (packId<<24) | m_packId ); + m_childPacks.push_back(childPack); + childPack->setParentPack(this); + childPack->m_packName = m_packName + childPack->getName(); +} + +void DLCPack::setParentPack(DLCPack *parentPack) +{ + m_parentPack = parentPack; +} + +void DLCPack::addParameter(DLCManager::EDLCParameterType type, const wstring &value) +{ + switch(type) + { + case DLCManager::e_DLCParamType_PackId: + { + DWORD packId = 0; + + std::wstringstream ss; + // 4J Stu - numbered using decimal to make it easier for artists/people to number manually + ss << std::dec << value.c_str(); + ss >> packId; + + SetPackId(packId); + } + break; + case DLCManager::e_DLCParamType_PackVersion: + { + DWORD version = 0; + + std::wstringstream ss; + // 4J Stu - numbered using decimal to make it easier for artists/people to number manually + ss << std::dec << value.c_str(); + ss >> version; + + SetPackVersion(version); + } + break; + case DLCManager::e_DLCParamType_DisplayName: + m_packName = value; + break; + case DLCManager::e_DLCParamType_DataPath: + m_dataPath = value; + break; + default: + m_parameters[(int)type] = value; + break; + } +} + +bool DLCPack::getParameterAsUInt(DLCManager::EDLCParameterType type, unsigned int ¶m) +{ + AUTO_VAR(it,m_parameters.find((int)type)); + if(it != m_parameters.end()) + { + switch(type) + { + case DLCManager::e_DLCParamType_NetherParticleColour: + case DLCManager::e_DLCParamType_EnchantmentTextColour: + case DLCManager::e_DLCParamType_EnchantmentTextFocusColour: + { + std::wstringstream ss; + ss << std::hex << it->second.c_str(); + ss >> param; + } + break; + default: + param = _fromString(it->second); + } + return true; + } + return false; +} + +DLCFile *DLCPack::addFile(DLCManager::EDLCType type, const wstring &path) +{ + DLCFile *newFile = NULL; + + switch(type) + { + case DLCManager::e_DLCType_Skin: + { + std::vector splitPath = stringSplit(path,L'/'); + wstring strippedPath = splitPath.back(); + + newFile = new DLCSkinFile(strippedPath); + + // check to see if we can get the full offer id using this skin name +#ifdef _XBOX_ONE + app.GetDLCFullOfferIDForSkinID(strippedPath,m_wsProductId); +#else + ULONGLONG ullVal=0LL; + + if(app.GetDLCFullOfferIDForSkinID(strippedPath,&ullVal)) + { + m_ullFullOfferId=ullVal; + } +#endif + } + break; + case DLCManager::e_DLCType_Cape: + { + std::vector splitPath = stringSplit(path,L'/'); + wstring strippedPath = splitPath.back(); + newFile = new DLCCapeFile(strippedPath); + } + break; + case DLCManager::e_DLCType_Texture: + newFile = new DLCTextureFile(path); + break; + case DLCManager::e_DLCType_UIData: + newFile = new DLCUIDataFile(path); + break; + case DLCManager::e_DLCType_LocalisationData: + newFile = new DLCLocalisationFile(path); + break; + case DLCManager::e_DLCType_GameRules: + newFile = new DLCGameRulesFile(path); + break; + case DLCManager::e_DLCType_Audio: + newFile = new DLCAudioFile(path); + break; + case DLCManager::e_DLCType_ColourTable: + newFile = new DLCColourTableFile(path); + break; + case DLCManager::e_DLCType_GameRulesHeader: + newFile = new DLCGameRulesHeader(path); + break; + }; + + if( newFile != NULL ) + { + m_files[newFile->getType()].push_back(newFile); + } + + return newFile; +} + +// MGH - added this comp func, as the embedded func in find_if was confusing the PS3 compiler +static const wstring *g_pathCmpString = NULL; +static bool pathCmp(DLCFile *val) +{ + return (g_pathCmpString->compare(val->getPath()) == 0); +} + +bool DLCPack::doesPackContainFile(DLCManager::EDLCType type, const wstring &path) +{ + bool hasFile = false; + if(type == DLCManager::e_DLCType_All) + { + for(DLCManager::EDLCType currentType = (DLCManager::EDLCType)0; currentType < DLCManager::e_DLCType_Max; currentType = (DLCManager::EDLCType)(currentType + 1)) + { + hasFile = doesPackContainFile(currentType,path); + if(hasFile) break; + } + } + else + { + g_pathCmpString = &path; + AUTO_VAR(it, find_if( m_files[type].begin(), m_files[type].end(), pathCmp )); + hasFile = it != m_files[type].end(); + if(!hasFile && m_parentPack ) + { + hasFile = m_parentPack->doesPackContainFile(type,path); + } + } + return hasFile; +} + +DLCFile *DLCPack::getFile(DLCManager::EDLCType type, DWORD index) +{ + DLCFile *file = NULL; + if(type == DLCManager::e_DLCType_All) + { + for(DLCManager::EDLCType currentType = (DLCManager::EDLCType)0; currentType < DLCManager::e_DLCType_Max; currentType = (DLCManager::EDLCType)(currentType + 1)) + { + file = getFile(currentType,index); + if(file != NULL) break; + } + } + else + { + if(m_files[type].size() > index) file = m_files[type][index]; + if(!file && m_parentPack) + { + file = m_parentPack->getFile(type,index); + } + } + return file; +} + +DLCFile *DLCPack::getFile(DLCManager::EDLCType type, const wstring &path) +{ + DLCFile *file = NULL; + if(type == DLCManager::e_DLCType_All) + { + for(DLCManager::EDLCType currentType = (DLCManager::EDLCType)0; currentType < DLCManager::e_DLCType_Max; currentType = (DLCManager::EDLCType)(currentType + 1)) + { + file = getFile(currentType,path); + if(file != NULL) break; + } + } + else + { + g_pathCmpString = &path; + AUTO_VAR(it, find_if( m_files[type].begin(), m_files[type].end(), pathCmp )); + + if(it == m_files[type].end()) + { + // Not found + file = NULL; + } + else + { + file = *it; + } + if(!file && m_parentPack) + { + file = m_parentPack->getFile(type,path); + } + } + return file; +} + +DWORD DLCPack::getDLCItemsCount(DLCManager::EDLCType type /*= DLCManager::e_DLCType_All*/) +{ + DWORD count = 0; + + switch(type) + { + case DLCManager::e_DLCType_All: + for(int i = 0; i < DLCManager::e_DLCType_Max; ++i) + { + count += getDLCItemsCount((DLCManager::EDLCType)i); + } + break; + default: + count = (DWORD)m_files[(int)type].size(); + break; + }; + return count; +}; + +DWORD DLCPack::getFileIndexAt(DLCManager::EDLCType type, const wstring &path, bool &found) +{ + if(type == DLCManager::e_DLCType_All) + { + app.DebugPrintf("Unimplemented\n"); +#ifndef __CONTENT_PACKAGE + __debugbreak(); +#endif + return 0; + } + + DWORD foundIndex = 0; + found = false; + DWORD index = 0; + for(AUTO_VAR(it, m_files[type].begin()); it != m_files[type].end(); ++it) + { + if(path.compare((*it)->getPath()) == 0) + { + foundIndex = index; + found = true; + break; + } + ++index; + } + + return foundIndex; +} + +bool DLCPack::hasPurchasedFile(DLCManager::EDLCType type, const wstring &path) +{ + if(type == DLCManager::e_DLCType_All) + { + app.DebugPrintf("Unimplemented\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return false; + } +#ifndef _CONTENT_PACKAGE + if( app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L< m_files[DLCManager::e_DLCType_Max]; + vector m_childPacks; + DLCPack *m_parentPack; + + unordered_map m_parameters; + + wstring m_packName; + wstring m_dataPath; + DWORD m_dwLicenseMask; + int m_dlcMountIndex; + XCONTENTDEVICEID m_dlcDeviceID; +#ifdef _XBOX_ONE + wstring m_wsProductId; +#else + ULONGLONG m_ullFullOfferId; +#endif + bool m_isCorrupt; + DWORD m_packId; + DWORD m_packVersion; + + PBYTE m_data; // This pointer is for all the data used for this pack, so deleting it invalidates ALL of it's children. +public: + + DLCPack(const wstring &name,DWORD dwLicenseMask); +#ifdef _XBOX_ONE + DLCPack(const wstring &name,const wstring &productID,DWORD dwLicenseMask); +#endif + ~DLCPack(); + + wstring getFullDataPath() { return m_dataPath; } + + void SetDataPointer(PBYTE pbData) { m_data = pbData; } + + bool IsCorrupt() { return m_isCorrupt; } + void SetIsCorrupt(bool val) { m_isCorrupt = val; } + + void SetPackId(DWORD id) { m_packId = id; } + DWORD GetPackId() { return m_packId; } + + void SetPackVersion(DWORD version) { m_packVersion = version; } + DWORD GetPackVersion() { return m_packVersion; } + + DLCPack * GetParentPack() { return m_parentPack; } + DWORD GetParentPackId() { return m_parentPack->m_packId; } + + void SetDLCMountIndex(DWORD id) { m_dlcMountIndex = id; } + DWORD GetDLCMountIndex(); + void SetDLCDeviceID(XCONTENTDEVICEID deviceId) { m_dlcDeviceID = deviceId; } + XCONTENTDEVICEID GetDLCDeviceID(); + + void addChildPack(DLCPack *childPack); + void setParentPack(DLCPack *parentPack); + + void addParameter(DLCManager::EDLCParameterType type, const wstring &value); + bool getParameterAsUInt(DLCManager::EDLCParameterType type, unsigned int ¶m); + + void updateLicenseMask( DWORD dwLicenseMask ) { m_dwLicenseMask = dwLicenseMask; } + DWORD getLicenseMask( ) { return m_dwLicenseMask; } + + wstring getName() { return m_packName; } +#ifdef _XBOX_ONE + wstring getPurchaseOfferId() { return m_wsProductId; } +#else + ULONGLONG getPurchaseOfferId() { return m_ullFullOfferId; } +#endif + + DLCFile *addFile(DLCManager::EDLCType type, const wstring &path); + DLCFile *getFile(DLCManager::EDLCType type, DWORD index); + DLCFile *getFile(DLCManager::EDLCType type, const wstring &path); + + DWORD getDLCItemsCount(DLCManager::EDLCType type = DLCManager::e_DLCType_All); + DWORD getFileIndexAt(DLCManager::EDLCType type, const wstring &path, bool &found); + bool doesPackContainFile(DLCManager::EDLCType type, const wstring &path); + DWORD GetPackID() {return m_packId;} + + DWORD getSkinCount() { return getDLCItemsCount(DLCManager::e_DLCType_Skin); } + DWORD getSkinIndexAt(const wstring &path, bool &found) { return getFileIndexAt(DLCManager::e_DLCType_Skin, path, found); } + DLCSkinFile *getSkinFile(const wstring &path) { return (DLCSkinFile *)getFile(DLCManager::e_DLCType_Skin, path); } + DLCSkinFile *getSkinFile(DWORD index) { return (DLCSkinFile *)getFile(DLCManager::e_DLCType_Skin, index); } + bool doesPackContainSkin(const wstring &path) { return doesPackContainFile(DLCManager::e_DLCType_Skin, path); } + + bool hasPurchasedFile(DLCManager::EDLCType type, const wstring &path); +}; diff --git a/Minecraft.Client/Common/DLC/DLCSkinFile.cpp b/Minecraft.Client/Common/DLC/DLCSkinFile.cpp new file mode 100644 index 00000000..f3768a34 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCSkinFile.cpp @@ -0,0 +1,212 @@ +#include "stdafx.h" +#include "DLCManager.h" +#include "DLCSkinFile.h" +#include "..\..\ModelPart.h" +#include "..\..\EntityRenderer.h" +#include "..\..\EntityRenderDispatcher.h" +#include "..\..\..\Minecraft.World\Player.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" + +DLCSkinFile::DLCSkinFile(const wstring &path) : DLCFile(DLCManager::e_DLCType_Skin,path) +{ + m_displayName = L""; + m_themeName = L""; + m_cape = L""; + m_bIsFree = false; + m_uiAnimOverrideBitmask=0L; +} + +void DLCSkinFile::addData(PBYTE pbData, DWORD dwBytes) +{ + app.AddMemoryTextureFile(m_path,pbData,dwBytes); +} + +void DLCSkinFile::addParameter(DLCManager::EDLCParameterType type, const wstring &value) +{ + switch(type) + { + case DLCManager::e_DLCParamType_DisplayName: + { + // 4J Stu - In skin pack 2, the name for Zap is mis-spelt with two p's as Zapp + // dlcskin00000109.png + if( m_path.compare(L"dlcskin00000109.png") == 0) + { + m_displayName = L"Zap"; + } + else + { + m_displayName = value; + } + } + break; + case DLCManager::e_DLCParamType_ThemeName: + m_themeName = value; + break; + case DLCManager::e_DLCParamType_Free: // If this parameter exists, then mark this as free + m_bIsFree = true; + break; + case DLCManager::e_DLCParamType_Credit: // If this parameter exists, then mark this as free + //add it to the DLC credits list + + // we'll need to justify this text since we don't have a lot of room for lines of credits + { + if(app.AlreadySeenCreditText(value)) break; + // first add a blank string for spacing + app.AddCreditText(L""); + + int maximumChars = 55; + + bool bIsSDMode=!RenderManager.IsHiDef() && !RenderManager.IsWidescreen(); + + if(bIsSDMode) + { + maximumChars = 45; + } + + switch(XGetLanguage()) + { + case XC_LANGUAGE_JAPANESE: + case XC_LANGUAGE_TCHINESE: + case XC_LANGUAGE_KOREAN: + maximumChars = 35; + break; + } + wstring creditValue = value; + while (creditValue.length() > maximumChars) + { + unsigned int i = 1; + while (i < creditValue.length() && (i + 1) <= maximumChars) + { + i++; + } + int iLast=(int)creditValue.find_last_of(L" ",i); + switch(XGetLanguage()) + { + case XC_LANGUAGE_JAPANESE: + case XC_LANGUAGE_TCHINESE: + case XC_LANGUAGE_KOREAN: + iLast = maximumChars; + break; + default: + iLast=(int)creditValue.find_last_of(L" ",i); + break; + } + + // if a space was found, include the space on this line + if(iLast!=i) + { + iLast++; + } + + app.AddCreditText((creditValue.substr(0, iLast)).c_str()); + creditValue = creditValue.substr(iLast); + } + app.AddCreditText(creditValue.c_str()); + + } + break; + case DLCManager::e_DLCParamType_Cape: + m_cape = value; + break; + case DLCManager::e_DLCParamType_Box: + { + WCHAR wchBodyPart[10]; + SKIN_BOX *pSkinBox = new SKIN_BOX; + ZeroMemory(pSkinBox,sizeof(SKIN_BOX)); + +#ifdef __PS3__ + // 4J Stu - The Xbox version used swscanf_s which isn't available in GCC. + swscanf(value.c_str(), L"%10ls%f%f%f%f%f%f%f%f", wchBodyPart, +#else + swscanf_s(value.c_str(), L"%9ls%f%f%f%f%f%f%f%f", wchBodyPart,10, +#endif + &pSkinBox->fX, + &pSkinBox->fY, + &pSkinBox->fZ, + &pSkinBox->fW, + &pSkinBox->fH, + &pSkinBox->fD, + &pSkinBox->fU, + &pSkinBox->fV); + + if(wcscmp(wchBodyPart,L"HEAD")==0) + { + pSkinBox->ePart=eBodyPart_Head; + } + else if(wcscmp(wchBodyPart,L"BODY")==0) + { + pSkinBox->ePart=eBodyPart_Body; + } + else if(wcscmp(wchBodyPart,L"ARM0")==0) + { + pSkinBox->ePart=eBodyPart_Arm0; + } + else if(wcscmp(wchBodyPart,L"ARM1")==0) + { + pSkinBox->ePart=eBodyPart_Arm1; + } + else if(wcscmp(wchBodyPart,L"LEG0")==0) + { + pSkinBox->ePart=eBodyPart_Leg0; + } + else if(wcscmp(wchBodyPart,L"LEG1")==0) + { + pSkinBox->ePart=eBodyPart_Leg1; + } + + // add this to the skin's vector of parts + m_AdditionalBoxes.push_back(pSkinBox); + } + break; + case DLCManager::e_DLCParamType_Anim: +#ifdef __PS3__ + // 4J Stu - The Xbox version used swscanf_s which isn't available in GCC. + swscanf(value.c_str(), L"%X", &m_uiAnimOverrideBitmask); +#else + swscanf_s(value.c_str(), L"%X", &m_uiAnimOverrideBitmask,sizeof(unsigned int)); +#endif + DWORD skinId = app.getSkinIdFromPath(m_path); + app.SetAnimOverrideBitmask(skinId, m_uiAnimOverrideBitmask); + break; + } +} + +// vector *DLCSkinFile::getAdditionalModelParts() +// { +// return &m_AdditionalModelParts; +// } + +int DLCSkinFile::getAdditionalBoxesCount() +{ + return (int)m_AdditionalBoxes.size(); +} +vector *DLCSkinFile::getAdditionalBoxes() +{ + return &m_AdditionalBoxes; +} + +wstring DLCSkinFile::getParameterAsString(DLCManager::EDLCParameterType type) +{ + switch(type) + { + case DLCManager::e_DLCParamType_DisplayName: + return m_displayName; + case DLCManager::e_DLCParamType_ThemeName: + return m_themeName; + case DLCManager::e_DLCParamType_Cape: + return m_cape; + default: + return L""; + } +} + +bool DLCSkinFile::getParameterAsBool(DLCManager::EDLCParameterType type) +{ + switch(type) + { + case DLCManager::e_DLCParamType_Free: + return m_bIsFree; + default: + return false; + } +} diff --git a/Minecraft.Client/Common/DLC/DLCSkinFile.h b/Minecraft.Client/Common/DLC/DLCSkinFile.h new file mode 100644 index 00000000..c8dcf0e9 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCSkinFile.h @@ -0,0 +1,29 @@ +#pragma once +#include "DLCFile.h" +#include "..\..\..\Minecraft.Client\HumanoidModel.h" + +class DLCSkinFile : public DLCFile +{ + +private: + wstring m_displayName; + wstring m_themeName; + wstring m_cape; + unsigned int m_uiAnimOverrideBitmask; + bool m_bIsFree; + vector m_AdditionalBoxes; + +public: + + DLCSkinFile(const wstring &path); + + virtual void addData(PBYTE pbData, DWORD dwBytes); + virtual void addParameter(DLCManager::EDLCParameterType type, const wstring &value); + + virtual wstring getParameterAsString(DLCManager::EDLCParameterType type); + virtual bool getParameterAsBool(DLCManager::EDLCParameterType type); + vector *getAdditionalBoxes(); + int getAdditionalBoxesCount(); + unsigned int getAnimOverrideBitmask() { return m_uiAnimOverrideBitmask;} + bool isFree() {return m_bIsFree;} +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCTextureFile.cpp b/Minecraft.Client/Common/DLC/DLCTextureFile.cpp new file mode 100644 index 00000000..cf99465a --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCTextureFile.cpp @@ -0,0 +1,59 @@ +#include "stdafx.h" +#include "DLCManager.h" +#include "DLCTextureFile.h" + +DLCTextureFile::DLCTextureFile(const wstring &path) : DLCFile(DLCManager::e_DLCType_Texture,path) +{ + m_bIsAnim = false; + m_animString = L""; + + m_pbData = NULL; + m_dwBytes = 0; +} + +void DLCTextureFile::addData(PBYTE pbData, DWORD dwBytes) +{ + //app.AddMemoryTextureFile(m_path,pbData,dwBytes); + m_pbData = pbData; + m_dwBytes = dwBytes; +} + +PBYTE DLCTextureFile::getData(DWORD &dwBytes) +{ + dwBytes = m_dwBytes; + return m_pbData; +} + +void DLCTextureFile::addParameter(DLCManager::EDLCParameterType type, const wstring &value) +{ + switch(type) + { + case DLCManager::e_DLCParamType_Anim: + m_animString = value; + m_bIsAnim = true; + + break; + } +} + +wstring DLCTextureFile::getParameterAsString(DLCManager::EDLCParameterType type) +{ + switch(type) + { + case DLCManager::e_DLCParamType_Anim: + return m_animString; + default: + return L""; + } +} + +bool DLCTextureFile::getParameterAsBool(DLCManager::EDLCParameterType type) +{ + switch(type) + { + case DLCManager::e_DLCParamType_Anim: + return m_bIsAnim; + default: + return false; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCTextureFile.h b/Minecraft.Client/Common/DLC/DLCTextureFile.h new file mode 100644 index 00000000..bc791686 --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCTextureFile.h @@ -0,0 +1,24 @@ +#pragma once +#include "DLCFile.h" + +class DLCTextureFile : public DLCFile +{ + +private: + bool m_bIsAnim; + wstring m_animString; + + PBYTE m_pbData; + DWORD m_dwBytes; + +public: + DLCTextureFile(const wstring &path); + + virtual void addData(PBYTE pbData, DWORD dwBytes); + virtual PBYTE getData(DWORD &dwBytes); + + virtual void addParameter(DLCManager::EDLCParameterType type, const wstring &value); + + virtual wstring getParameterAsString(DLCManager::EDLCParameterType type); + virtual bool getParameterAsBool(DLCManager::EDLCParameterType type); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCUIDataFile.cpp b/Minecraft.Client/Common/DLC/DLCUIDataFile.cpp new file mode 100644 index 00000000..a2a56bca --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCUIDataFile.cpp @@ -0,0 +1,32 @@ +#include "stdafx.h" +#include "DLCManager.h" +#include "DLCUIDataFile.h" + +DLCUIDataFile::DLCUIDataFile(const wstring &path) : DLCFile(DLCManager::e_DLCType_UIData,path) +{ + m_pbData = NULL; + m_dwBytes = 0; + m_canDeleteData = false; +} + +DLCUIDataFile::~DLCUIDataFile() +{ + if(m_canDeleteData && m_pbData != NULL) + { + app.DebugPrintf("Deleting DLCUIDataFile data\n"); + delete [] m_pbData; + } +} + +void DLCUIDataFile::addData(PBYTE pbData, DWORD dwBytes,bool canDeleteData) +{ + m_pbData = pbData; + m_dwBytes = dwBytes; + m_canDeleteData = canDeleteData; +} + +PBYTE DLCUIDataFile::getData(DWORD &dwBytes) +{ + dwBytes = m_dwBytes; + return m_pbData; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCUIDataFile.h b/Minecraft.Client/Common/DLC/DLCUIDataFile.h new file mode 100644 index 00000000..105ad0df --- /dev/null +++ b/Minecraft.Client/Common/DLC/DLCUIDataFile.h @@ -0,0 +1,20 @@ +#pragma once +#include "DLCFile.h" + +class DLCUIDataFile : public DLCFile +{ +private: + PBYTE m_pbData; + DWORD m_dwBytes; + bool m_canDeleteData; + +public: + DLCUIDataFile(const wstring &path); + ~DLCUIDataFile(); + + using DLCFile::addData; + using DLCFile::addParameter; + + virtual void addData(PBYTE pbData, DWORD dwBytes,bool canDeleteData = false); + virtual PBYTE getData(DWORD &dwBytes); +}; diff --git a/Minecraft.Client/Common/DummyTexturePack/res/TFSHOLDER.txt b/Minecraft.Client/Common/DummyTexturePack/res/TFSHOLDER.txt new file mode 100644 index 00000000..b5868f16 --- /dev/null +++ b/Minecraft.Client/Common/DummyTexturePack/res/TFSHOLDER.txt @@ -0,0 +1 @@ +This file only exists so that I can add this folder to TFS. I am not ready to add the contents. Stu \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/AddEnchantmentRuleDefinition.cpp b/Minecraft.Client/Common/GameRules/AddEnchantmentRuleDefinition.cpp new file mode 100644 index 00000000..eabc1401 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/AddEnchantmentRuleDefinition.cpp @@ -0,0 +1,70 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.enchantment.h" +#include "AddEnchantmentRuleDefinition.h" + +AddEnchantmentRuleDefinition::AddEnchantmentRuleDefinition() +{ + m_enchantmentId = m_enchantmentLevel = 0; +} + +void AddEnchantmentRuleDefinition::writeAttributes(DataOutputStream *dos, UINT numAttributes) +{ + GameRuleDefinition::writeAttributes(dos, numAttributes + 2); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_enchantmentId); + dos->writeUTF( _toString( m_enchantmentId ) ); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_enchantmentLevel); + dos->writeUTF( _toString( m_enchantmentLevel ) ); +} + +void AddEnchantmentRuleDefinition::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"enchantmentId") == 0) + { + int value = _fromString(attributeValue); + if(value < 0) value = 0; + if(value >= 256) value = 255; + m_enchantmentId = value; + app.DebugPrintf("AddEnchantmentRuleDefinition: Adding parameter enchantmentId=%d\n",m_enchantmentId); + } + else if(attributeName.compare(L"enchantmentLevel") == 0) + { + int value = _fromString(attributeValue); + if(value < 0) value = 0; + m_enchantmentLevel = value; + app.DebugPrintf("AddEnchantmentRuleDefinition: Adding parameter enchantmentLevel=%d\n",m_enchantmentLevel); + } + else + { + GameRuleDefinition::addAttribute(attributeName, attributeValue); + } +} + +bool AddEnchantmentRuleDefinition::enchantItem(shared_ptr item) +{ + bool enchanted = false; + if (item != NULL) + { + // 4J-JEV: Ripped code from enchantmenthelpers + // Maybe we want to add an addEnchantment method to EnchantmentHelpers + if (item->id == Item::enchantedBook_Id) + { + Item::enchantedBook->addEnchantment( item, new EnchantmentInstance(m_enchantmentId, m_enchantmentLevel) ); + } + else if (item->isEnchantable()) + { + Enchantment *e = Enchantment::enchantments[m_enchantmentId]; + + if(e != NULL && e->category->canEnchant(item->getItem())) + { + int level = min(e->getMaxLevel(), m_enchantmentLevel); + item->enchant(e, m_enchantmentLevel); + enchanted = true; + } + } + } + return enchanted; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/AddEnchantmentRuleDefinition.h b/Minecraft.Client/Common/GameRules/AddEnchantmentRuleDefinition.h new file mode 100644 index 00000000..3beece10 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/AddEnchantmentRuleDefinition.h @@ -0,0 +1,23 @@ +#pragma once + +#include "GameRuleDefinition.h" + +class ItemInstance; + +class AddEnchantmentRuleDefinition : public GameRuleDefinition +{ +private: + int m_enchantmentId; + int m_enchantmentLevel; + +public: + AddEnchantmentRuleDefinition(); + + virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_AddEnchantment; } + + virtual void writeAttributes(DataOutputStream *, UINT numAttrs); + + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + bool enchantItem(shared_ptr item); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/AddItemRuleDefinition.cpp b/Minecraft.Client/Common/GameRules/AddItemRuleDefinition.cpp new file mode 100644 index 00000000..0d14884a --- /dev/null +++ b/Minecraft.Client/Common/GameRules/AddItemRuleDefinition.cpp @@ -0,0 +1,127 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "AddItemRuleDefinition.h" +#include "AddEnchantmentRuleDefinition.h" + +AddItemRuleDefinition::AddItemRuleDefinition() +{ + m_itemId = m_quantity = m_auxValue = m_dataTag = 0; + m_slot = -1; +} + +void AddItemRuleDefinition::writeAttributes(DataOutputStream *dos, UINT numAttrs) +{ + GameRuleDefinition::writeAttributes(dos, numAttrs + 5); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_itemId); + dos->writeUTF( _toString( m_itemId ) ); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_quantity); + dos->writeUTF( _toString( m_quantity ) ); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_auxValue); + dos->writeUTF( _toString( m_auxValue ) ); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_dataTag); + dos->writeUTF( _toString( m_dataTag ) ); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_slot); + dos->writeUTF( _toString( m_slot ) ); +} + +void AddItemRuleDefinition::getChildren(vector *children) +{ + GameRuleDefinition::getChildren( children ); + for (AUTO_VAR(it, m_enchantments.begin()); it != m_enchantments.end(); it++) + children->push_back( *it ); +} + +GameRuleDefinition *AddItemRuleDefinition::addChild(ConsoleGameRules::EGameRuleType ruleType) +{ + GameRuleDefinition *rule = NULL; + if(ruleType == ConsoleGameRules::eGameRuleType_AddEnchantment) + { + rule = new AddEnchantmentRuleDefinition(); + m_enchantments.push_back((AddEnchantmentRuleDefinition *)rule); + } + else + { +#ifndef _CONTENT_PACKAGE + //wprintf(L"AddItemRuleDefinition: Attempted to add invalid child rule - %d\n", ruleType ); +#endif + } + return rule; +} + +void AddItemRuleDefinition::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"itemId") == 0) + { + int value = _fromString(attributeValue); + m_itemId = value; + //app.DebugPrintf(2,"AddItemRuleDefinition: Adding parameter itemId=%d\n",m_itemId); + } + else if(attributeName.compare(L"quantity") == 0) + { + int value = _fromString(attributeValue); + m_quantity = value; + //app.DebugPrintf(2,"AddItemRuleDefinition: Adding parameter quantity=%d\n",m_quantity); + } + else if(attributeName.compare(L"auxValue") == 0) + { + int value = _fromString(attributeValue); + m_auxValue = value; + //app.DebugPrintf(2,"AddItemRuleDefinition: Adding parameter auxValue=%d\n",m_auxValue); + } + else if(attributeName.compare(L"dataTag") == 0) + { + int value = _fromString(attributeValue); + m_dataTag = value; + //app.DebugPrintf(2,"AddItemRuleDefinition: Adding parameter dataTag=%d\n",m_dataTag); + } + else if(attributeName.compare(L"slot") == 0) + { + int value = _fromString(attributeValue); + m_slot = value; + //app.DebugPrintf(2,"AddItemRuleDefinition: Adding parameter slot=%d\n",m_slot); + } + else + { + GameRuleDefinition::addAttribute(attributeName, attributeValue); + } +} + +bool AddItemRuleDefinition::addItemToContainer(shared_ptr container, int slotId) +{ + bool added = false; + if(Item::items[m_itemId] != NULL) + { + int quantity = min(m_quantity, Item::items[m_itemId]->getMaxStackSize()); + shared_ptr newItem = shared_ptr(new ItemInstance(m_itemId,quantity,m_auxValue) ); + newItem->set4JData(m_dataTag); + + for(AUTO_VAR(it, m_enchantments.begin()); it != m_enchantments.end(); ++it) + { + (*it)->enchantItem(newItem); + } + + if(m_slot >= 0 && m_slot < container->getContainerSize() ) + { + container->setItem( m_slot, newItem ); + added = true; + } + else if(slotId >= 0 && slotId < container->getContainerSize() ) + { + container->setItem( slotId, newItem ); + added = true; + } + else if(dynamic_pointer_cast(container) != NULL) + { + added = dynamic_pointer_cast(container)->add(newItem); + } + } + return added; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/AddItemRuleDefinition.h b/Minecraft.Client/Common/GameRules/AddItemRuleDefinition.h new file mode 100644 index 00000000..602f2d82 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/AddItemRuleDefinition.h @@ -0,0 +1,30 @@ +#pragma once + +#include "GameRuleDefinition.h" + +class Container; +class AddEnchantmentRuleDefinition; + +class AddItemRuleDefinition : public GameRuleDefinition +{ +private: + int m_itemId; + int m_quantity; + int m_auxValue; + int m_dataTag; + int m_slot; + vector m_enchantments; + +public: + AddItemRuleDefinition(); + + virtual void writeAttributes(DataOutputStream *, UINT numAttributes); + virtual void getChildren(vector *children); + + virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_AddItem; } + + virtual GameRuleDefinition *addChild(ConsoleGameRules::EGameRuleType ruleType); + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + bool addItemToContainer(shared_ptr container, int slotId); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/ApplySchematicRuleDefinition.cpp b/Minecraft.Client/Common/GameRules/ApplySchematicRuleDefinition.cpp new file mode 100644 index 00000000..aa4a8fb2 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/ApplySchematicRuleDefinition.cpp @@ -0,0 +1,249 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.phys.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.dimension.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.chunk.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "ApplySchematicRuleDefinition.h" +#include "LevelGenerationOptions.h" +#include "ConsoleSchematicFile.h" + +ApplySchematicRuleDefinition::ApplySchematicRuleDefinition(LevelGenerationOptions *levelGenOptions) +{ + m_levelGenOptions = levelGenOptions; + m_location = Vec3::newPermanent(0,0,0); + m_locationBox = NULL; + m_totalBlocksChanged = 0; + m_totalBlocksChangedLighting = 0; + m_rotation = ConsoleSchematicFile::eSchematicRot_0; + m_completed = false; + m_dimension = 0; + m_schematic = NULL; +} + +ApplySchematicRuleDefinition::~ApplySchematicRuleDefinition() +{ + app.DebugPrintf("Deleting ApplySchematicRuleDefinition.\n"); + if(!m_completed) m_levelGenOptions->releaseSchematicFile(m_schematicName); + m_schematic = NULL; + delete m_location; +} + +void ApplySchematicRuleDefinition::writeAttributes(DataOutputStream *dos, UINT numAttrs) +{ + GameRuleDefinition::writeAttributes(dos, numAttrs + 5); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_filename); + dos->writeUTF(m_schematicName); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_x); + dos->writeUTF(_toString(m_location->x)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_y); + dos->writeUTF(_toString(m_location->y)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_z); + dos->writeUTF(_toString(m_location->z)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_rot); + + switch (m_rotation) + { + case ConsoleSchematicFile::eSchematicRot_0: dos->writeUTF(_toString( 0 )); break; + case ConsoleSchematicFile::eSchematicRot_90: dos->writeUTF(_toString( 90 )); break; + case ConsoleSchematicFile::eSchematicRot_180: dos->writeUTF(_toString( 180 )); break; + case ConsoleSchematicFile::eSchematicRot_270: dos->writeUTF(_toString( 270 )); break; + } +} + +void ApplySchematicRuleDefinition::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"filename") == 0) + { + m_schematicName = attributeValue; + //app.DebugPrintf("ApplySchematicRuleDefinition: Adding parameter filename=%s\n",m_schematicName.c_str()); + + if(!m_schematicName.empty()) + { + if(m_schematicName.substr( m_schematicName.length() - 4, m_schematicName.length()).compare(L".sch") != 0) + { + m_schematicName.append(L".sch"); + } + m_schematic = m_levelGenOptions->getSchematicFile(m_schematicName); + } + } + else if(attributeName.compare(L"x") == 0) + { + m_location->x = _fromString(attributeValue); + if( ((int)abs(m_location->x))%2 != 0) m_location->x -=1; + //app.DebugPrintf("ApplySchematicRuleDefinition: Adding parameter x=%f\n",m_location->x); + } + else if(attributeName.compare(L"y") == 0) + { + m_location->y = _fromString(attributeValue); + if( ((int)abs(m_location->y))%2 != 0) m_location->y -= 1; + if(m_location->y < 0) m_location->y = 0; + //app.DebugPrintf("ApplySchematicRuleDefinition: Adding parameter y=%f\n",m_location->y); + } + else if(attributeName.compare(L"z") == 0) + { + m_location->z = _fromString(attributeValue); + if(((int)abs(m_location->z))%2 != 0) m_location->z -= 1; + //app.DebugPrintf("ApplySchematicRuleDefinition: Adding parameter z=%f\n",m_location->z); + } + else if(attributeName.compare(L"rot") == 0) + { + int degrees = _fromString(attributeValue); + + while(degrees < 0) degrees += 360; + while(degrees >= 360) degrees -= 360; + float quad = degrees/90; + degrees = (int)(quad + 0.5f); + switch(degrees) + { + case 1: + m_rotation = ConsoleSchematicFile::eSchematicRot_90; + break; + case 2: + m_rotation = ConsoleSchematicFile::eSchematicRot_180; + break; + case 3: + case 4: + m_rotation = ConsoleSchematicFile::eSchematicRot_270; + break; + case 0: + default: + m_rotation = ConsoleSchematicFile::eSchematicRot_0; + break; + }; + + //app.DebugPrintf("ApplySchematicRuleDefinition: Adding parameter rot=%d\n",m_rotation); + } + else if(attributeName.compare(L"dim") == 0) + { + m_dimension = _fromString(attributeValue); + if(m_dimension > 1 || m_dimension < -1) m_dimension = 0; + //app.DebugPrintf("ApplySchematicRuleDefinition: Adding parameter dimension=%d\n",m_dimension); + } + else + { + GameRuleDefinition::addAttribute(attributeName, attributeValue); + } +} + +void ApplySchematicRuleDefinition::updateLocationBox() +{ + if(m_schematic == NULL) m_schematic = m_levelGenOptions->getSchematicFile(m_schematicName); + + m_locationBox = AABB::newPermanent(0,0,0,0,0,0); + + m_locationBox->x0 = m_location->x; + m_locationBox->y0 = m_location->y; + m_locationBox->z0 = m_location->z; + + m_locationBox->y1 = m_location->y + m_schematic->getYSize(); + + switch(m_rotation) + { + case ConsoleSchematicFile::eSchematicRot_90: + case ConsoleSchematicFile::eSchematicRot_270: + m_locationBox->x1 = m_location->x + m_schematic->getZSize(); + m_locationBox->z1 = m_location->z + m_schematic->getXSize(); + break; + case ConsoleSchematicFile::eSchematicRot_0: + case ConsoleSchematicFile::eSchematicRot_180: + default: + m_locationBox->x1 = m_location->x + m_schematic->getXSize(); + m_locationBox->z1 = m_location->z + m_schematic->getZSize(); + break; + }; +} + +void ApplySchematicRuleDefinition::processSchematic(AABB *chunkBox, LevelChunk *chunk) +{ + if( m_completed ) return; + if(chunk->level->dimension->id != m_dimension) return; + + PIXBeginNamedEvent(0, "Processing ApplySchematicRuleDefinition"); + if(m_schematic == NULL) m_schematic = m_levelGenOptions->getSchematicFile(m_schematicName); + + if(m_locationBox == NULL) updateLocationBox(); + if(chunkBox->intersects( m_locationBox )) + { + m_locationBox->y1 = min((double)Level::maxBuildHeight, m_locationBox->y1 ); + +#ifdef _DEBUG + app.DebugPrintf("Applying schematic %ls to chunk (%d,%d)\n",m_schematicName.c_str(),chunk->x, chunk->z); +#endif + PIXBeginNamedEvent(0,"Applying blocks and data"); + m_totalBlocksChanged += m_schematic->applyBlocksAndData(chunk, chunkBox, m_locationBox, m_rotation); + PIXEndNamedEvent(); + + // Add the tileEntities + PIXBeginNamedEvent(0,"Applying tile entities"); + m_schematic->applyTileEntities(chunk, chunkBox, m_locationBox, m_rotation); + PIXEndNamedEvent(); + + // TODO This does not take into account things that go outside the bounds of the world + int targetBlocks = (m_locationBox->x1 - m_locationBox->x0) + * (m_locationBox->y1 - m_locationBox->y0) + * (m_locationBox->z1 - m_locationBox->z0); + if( (m_totalBlocksChanged == targetBlocks) && (m_totalBlocksChangedLighting == targetBlocks) ) + { + m_completed = true; + //m_levelGenOptions->releaseSchematicFile(m_schematicName); + //m_schematic = NULL; + } + } + PIXEndNamedEvent(); +} + +void ApplySchematicRuleDefinition::processSchematicLighting(AABB *chunkBox, LevelChunk *chunk) +{ + if( m_completed ) return; + if(chunk->level->dimension->id != m_dimension) return; + + PIXBeginNamedEvent(0, "Processing ApplySchematicRuleDefinition (lighting)"); + if(m_schematic == NULL) m_schematic = m_levelGenOptions->getSchematicFile(m_schematicName); + + if(m_locationBox == NULL) updateLocationBox(); + if(chunkBox->intersects( m_locationBox )) + { + m_locationBox->y1 = min((double)Level::maxBuildHeight, m_locationBox->y1 ); + +#ifdef _DEBUG + app.DebugPrintf("Applying schematic %ls to chunk (%d,%d)\n",m_schematicName.c_str(),chunk->x, chunk->z); +#endif + PIXBeginNamedEvent(0,"Patching lighting"); + m_totalBlocksChangedLighting += m_schematic->applyLighting(chunk, chunkBox, m_locationBox, m_rotation); + PIXEndNamedEvent(); + + // TODO This does not take into account things that go outside the bounds of the world + int targetBlocks = (m_locationBox->x1 - m_locationBox->x0) + * (m_locationBox->y1 - m_locationBox->y0) + * (m_locationBox->z1 - m_locationBox->z0); + if( (m_totalBlocksChanged == targetBlocks) && (m_totalBlocksChangedLighting == targetBlocks) ) + { + m_completed = true; + //m_levelGenOptions->releaseSchematicFile(m_schematicName); + //m_schematic = NULL; + } + } + PIXEndNamedEvent(); +} + +bool ApplySchematicRuleDefinition::checkIntersects(int x0, int y0, int z0, int x1, int y1, int z1) +{ + if( m_locationBox == NULL ) updateLocationBox(); + return m_locationBox->intersects(x0,y0,z0,x1,y1,z1); +} + +int ApplySchematicRuleDefinition::getMinY() +{ + if( m_locationBox == NULL ) updateLocationBox(); + return m_locationBox->y0; +} + +void ApplySchematicRuleDefinition::reset() +{ + m_totalBlocksChanged = 0; + m_totalBlocksChangedLighting = 0; + m_completed = false; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/ApplySchematicRuleDefinition.h b/Minecraft.Client/Common/GameRules/ApplySchematicRuleDefinition.h new file mode 100644 index 00000000..21c42dea --- /dev/null +++ b/Minecraft.Client/Common/GameRules/ApplySchematicRuleDefinition.h @@ -0,0 +1,51 @@ +#pragma once +#include "GameRuleDefinition.h" +#include "ConsoleSchematicFile.h" + +class AABB; +class Vec3; +class LevelChunk; +class LevelGenerationOptions; +class GRFObject; + +class ApplySchematicRuleDefinition : public GameRuleDefinition +{ +private: + LevelGenerationOptions *m_levelGenOptions; + wstring m_schematicName; + ConsoleSchematicFile *m_schematic; + Vec3 *m_location; + AABB *m_locationBox; + ConsoleSchematicFile::ESchematicRotation m_rotation; + int m_dimension; + + __int64 m_totalBlocksChanged; + __int64 m_totalBlocksChangedLighting; + bool m_completed; + + void updateLocationBox(); +public: + ApplySchematicRuleDefinition(LevelGenerationOptions *levelGenOptions); + ~ApplySchematicRuleDefinition(); + + virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_ApplySchematic; } + + virtual void writeAttributes(DataOutputStream *dos, UINT numAttrs); + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + void processSchematic(AABB *chunkBox, LevelChunk *chunk); + void processSchematicLighting(AABB *chunkBox, LevelChunk *chunk); + + bool checkIntersects(int x0, int y0, int z0, int x1, int y1, int z1); + int getMinY(); + + bool isComplete() { return m_completed; } + + wstring getSchematicName() { return m_schematicName; } + + /** 4J-JEV: + * This GameRuleDefinition contains limited game state. + * Reset any state to how it should be before a new game. + */ + void reset(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/BiomeOverride.cpp b/Minecraft.Client/Common/GameRules/BiomeOverride.cpp new file mode 100644 index 00000000..22cc0c7a --- /dev/null +++ b/Minecraft.Client/Common/GameRules/BiomeOverride.cpp @@ -0,0 +1,59 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "BiomeOverride.h" + +BiomeOverride::BiomeOverride() +{ + m_tile = 0; + m_topTile = 0; + m_biomeId = 0; +} + +void BiomeOverride::writeAttributes(DataOutputStream *dos, UINT numAttrs) +{ + GameRuleDefinition::writeAttributes(dos, numAttrs + 3); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_biomeId); + dos->writeUTF(_toString(m_biomeId)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_tileId); + dos->writeUTF(_toString(m_tile)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_topTileId); + dos->writeUTF(_toString(m_topTile)); +} + +void BiomeOverride::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"tileId") == 0) + { + int value = _fromString(attributeValue); + m_tile = value; + app.DebugPrintf("BiomeOverride: Adding parameter tileId=%d\n",m_tile); + } + else if(attributeName.compare(L"topTileId") == 0) + { + int value = _fromString(attributeValue); + m_topTile = value; + app.DebugPrintf("BiomeOverride: Adding parameter topTileId=%d\n",m_topTile); + } + else if(attributeName.compare(L"biomeId") == 0) + { + int value = _fromString(attributeValue); + m_biomeId = value; + app.DebugPrintf("BiomeOverride: Adding parameter biomeId=%d\n",m_biomeId); + } + else + { + GameRuleDefinition::addAttribute(attributeName, attributeValue); + } +} + +bool BiomeOverride::isBiome(int id) +{ + return m_biomeId == id; +} + +void BiomeOverride::getTileValues(BYTE &tile, BYTE &topTile) +{ + if(m_tile != 0) tile = (BYTE)m_tile; + if(m_topTile != 0) topTile = (BYTE)m_topTile; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/BiomeOverride.h b/Minecraft.Client/Common/GameRules/BiomeOverride.h new file mode 100644 index 00000000..5ad9263c --- /dev/null +++ b/Minecraft.Client/Common/GameRules/BiomeOverride.h @@ -0,0 +1,23 @@ +#pragma once +using namespace std; + +#include "GameRuleDefinition.h" + +class BiomeOverride : public GameRuleDefinition +{ +private: + BYTE m_topTile; + BYTE m_tile; + int m_biomeId; + +public: + BiomeOverride(); + + virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_BiomeOverride; } + + virtual void writeAttributes(DataOutputStream *dos, UINT numAttrs); + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + bool isBiome(int id); + void getTileValues(BYTE &tile, BYTE &topTile); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/CollectItemRuleDefinition.cpp b/Minecraft.Client/Common/GameRules/CollectItemRuleDefinition.cpp new file mode 100644 index 00000000..66abefbb --- /dev/null +++ b/Minecraft.Client/Common/GameRules/CollectItemRuleDefinition.cpp @@ -0,0 +1,117 @@ +#include "stdafx.h" +#include "..\..\WstringLookup.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "CollectItemRuleDefinition.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\Connection.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" + +CollectItemRuleDefinition::CollectItemRuleDefinition() +{ + m_itemId = 0; + m_auxValue = 0; + m_quantity = 0; +} + +CollectItemRuleDefinition::~CollectItemRuleDefinition() +{ +} + +void CollectItemRuleDefinition::writeAttributes(DataOutputStream *dos, UINT numAttributes) +{ + GameRuleDefinition::writeAttributes(dos, numAttributes + 3); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_itemId); + dos->writeUTF( _toString( m_itemId ) ); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_auxValue); + dos->writeUTF( _toString( m_auxValue ) ); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_quantity); + dos->writeUTF( _toString( m_quantity ) ); +} + +void CollectItemRuleDefinition::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"itemId") == 0) + { + m_itemId = _fromString(attributeValue); + app.DebugPrintf("CollectItemRule: Adding parameter itemId=%d\n",m_itemId); + } + else if(attributeName.compare(L"auxValue") == 0) + { + m_auxValue = _fromString(attributeValue); + app.DebugPrintf("CollectItemRule: Adding parameter m_auxValue=%d\n",m_auxValue); + } + else if(attributeName.compare(L"quantity") == 0) + { + m_quantity = _fromString(attributeValue); + app.DebugPrintf("CollectItemRule: Adding parameter m_quantity=%d\n",m_quantity); + } + else + { + GameRuleDefinition::addAttribute(attributeName, attributeValue); + } +} + +int CollectItemRuleDefinition::getGoal() +{ + return m_quantity; +} + +int CollectItemRuleDefinition::getProgress(GameRule *rule) +{ + GameRule::ValueType value = rule->getParameter(L"iQuantity"); + return value.i; +} + +void CollectItemRuleDefinition::populateGameRule(GameRulesInstance::EGameRulesInstanceType type, GameRule *rule) +{ + GameRule::ValueType value; + value.i = 0; + rule->setParameter(L"iQuantity",value); + + GameRuleDefinition::populateGameRule(type, rule); +} + +bool CollectItemRuleDefinition::onCollectItem(GameRule *rule, shared_ptr item) +{ + bool statusChanged = false; + if(item != NULL && item->id == m_itemId && item->getAuxValue() == m_auxValue && item->get4JData() == m_4JDataValue) + { + if(!getComplete(rule)) + { + GameRule::ValueType value = rule->getParameter(L"iQuantity"); + int quantityCollected = (value.i += item->count); + rule->setParameter(L"iQuantity",value); + + statusChanged = true; + + if(quantityCollected >= m_quantity) + { + setComplete(rule, true); + app.DebugPrintf("Completed CollectItemRule with info - itemId:%d, auxValue:%d, quantity:%d, dataTag:%d\n", m_itemId,m_auxValue,m_quantity,m_4JDataValue); + + if(rule->getConnection() != NULL) + { + rule->getConnection()->send( shared_ptr( new UpdateGameRuleProgressPacket(getActionType(), this->m_descriptionId, m_itemId, m_auxValue, this->m_4JDataValue,NULL,0))); + } + } + } + } + return statusChanged; +} + +wstring CollectItemRuleDefinition::generateXml(shared_ptr item) +{ + // 4J Stu - This should be kept in sync with the GameRulesDefinition.xsd + wstring xml = L""; + if(item != NULL) + { + xml = L"(item->id) + L"\" quantity=\"SET\" descriptionName=\"OPTIONAL\" promptName=\"OPTIONAL\""; + if(item->getAuxValue() != 0) xml += L" auxValue=\"" + _toString(item->getAuxValue()) + L"\""; + if(item->get4JData() != 0) xml += L" dataTag=\"" + _toString(item->get4JData()) + L"\""; + xml += L"/>\n"; + } + return xml; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/CollectItemRuleDefinition.h b/Minecraft.Client/Common/GameRules/CollectItemRuleDefinition.h new file mode 100644 index 00000000..5ee6f4c5 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/CollectItemRuleDefinition.h @@ -0,0 +1,40 @@ +#pragma once + +#include "GameRuleDefinition.h" + +class Pos; +class UseTileRuleDefinition; +class ItemInstance; + +class CollectItemRuleDefinition : public GameRuleDefinition +{ +private: + // These values should map directly to the xsd definition for this Rule + int m_itemId; + unsigned char m_auxValue; + int m_quantity; + +public: + CollectItemRuleDefinition(); + ~CollectItemRuleDefinition(); + + ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_CollectItemRule; } + + virtual void writeAttributes(DataOutputStream *, UINT numAttributes); + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + virtual int getGoal(); + virtual int getProgress(GameRule *rule); + + virtual int getIcon() { return m_itemId; } + virtual int getAuxValue() { return m_auxValue; } + + void populateGameRule(GameRulesInstance::EGameRulesInstanceType type, GameRule *rule); + + bool onCollectItem(GameRule *rule, shared_ptr item); + + static wstring generateXml(shared_ptr item); + +private: + //static wstring generateXml(CollectItemRuleDefinition *ruleDef); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/CompleteAllRuleDefinition.cpp b/Minecraft.Client/Common/GameRules/CompleteAllRuleDefinition.cpp new file mode 100644 index 00000000..adaf70c8 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/CompleteAllRuleDefinition.cpp @@ -0,0 +1,66 @@ +#include "stdafx.h" +#include "CompleteAllRuleDefinition.h" +#include "ConsoleGameRules.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\Connection.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" + +void CompleteAllRuleDefinition::getChildren(vector *children) +{ + CompoundGameRuleDefinition::getChildren(children); +} + +bool CompleteAllRuleDefinition::onUseTile(GameRule *rule, int tileId, int x, int y, int z) +{ + bool statusChanged = CompoundGameRuleDefinition::onUseTile(rule,tileId,x,y,z); + if(statusChanged) updateStatus(rule); + return statusChanged; +} + +bool CompleteAllRuleDefinition::onCollectItem(GameRule *rule, shared_ptr item) +{ + bool statusChanged = CompoundGameRuleDefinition::onCollectItem(rule,item); + if(statusChanged) updateStatus(rule); + return statusChanged; +} + +void CompleteAllRuleDefinition::updateStatus(GameRule *rule) +{ + int goal = 0; + int progress = 0; + for(AUTO_VAR(it, rule->m_parameters.begin()); it != rule->m_parameters.end(); ++it) + { + if(it->second.isPointer) + { + goal += it->second.gr->getGameRuleDefinition()->getGoal(); + progress += it->second.gr->getGameRuleDefinition()->getProgress(it->second.gr); + } + } + if(rule->getConnection() != NULL) + { + PacketData data; + data.goal = goal; + data.progress = progress; + + int icon = -1; + int auxValue = 0; + + if(m_lastRuleStatusChanged != NULL) + { + icon = m_lastRuleStatusChanged->getIcon(); + auxValue = m_lastRuleStatusChanged->getAuxValue(); + m_lastRuleStatusChanged = NULL; + } + rule->getConnection()->send( shared_ptr( new UpdateGameRuleProgressPacket(getActionType(), this->m_descriptionId,icon, auxValue, 0,&data,sizeof(PacketData)))); + } + app.DebugPrintf("Updated CompleteAllRule - Completed %d of %d\n", progress, goal); +} + +wstring CompleteAllRuleDefinition::generateDescriptionString(const wstring &description, void *data, int dataLength) +{ + PacketData *values = (PacketData *)data; + wstring newDesc = description; + newDesc = replaceAll(newDesc,L"{*progress*}",_toString(values->progress)); + newDesc = replaceAll(newDesc,L"{*goal*}",_toString(values->goal)); + return newDesc; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/CompleteAllRuleDefinition.h b/Minecraft.Client/Common/GameRules/CompleteAllRuleDefinition.h new file mode 100644 index 00000000..b2cb8847 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/CompleteAllRuleDefinition.h @@ -0,0 +1,26 @@ +#pragma once + +#include "CompoundGameRuleDefinition.h" + +class CompleteAllRuleDefinition : public CompoundGameRuleDefinition +{ +private: + typedef struct _packetData + { + int goal; + int progress; + } PacketData; + +public: + ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_CompleteAllRule; } + + virtual void getChildren(vector *children); + + virtual bool onUseTile(GameRule *rule, int tileId, int x, int y, int z); + virtual bool onCollectItem(GameRule *rule, shared_ptr item); + + static wstring generateDescriptionString(const wstring &description, void *data, int dataLength); + +private: + void updateStatus(GameRule *rule); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/CompoundGameRuleDefinition.cpp b/Minecraft.Client/Common/GameRules/CompoundGameRuleDefinition.cpp new file mode 100644 index 00000000..0481a54b --- /dev/null +++ b/Minecraft.Client/Common/GameRules/CompoundGameRuleDefinition.cpp @@ -0,0 +1,118 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "CompoundGameRuleDefinition.h" +#include "ConsoleGameRules.h" + +CompoundGameRuleDefinition::CompoundGameRuleDefinition() +{ + m_lastRuleStatusChanged = NULL; +} + +CompoundGameRuleDefinition::~CompoundGameRuleDefinition() +{ + for(AUTO_VAR(it, m_children.begin()); it != m_children.end(); ++it) + { + delete (*it); + } +} + +void CompoundGameRuleDefinition::getChildren(vector *children) +{ + GameRuleDefinition::getChildren(children); + for (AUTO_VAR(it, m_children.begin()); it != m_children.end(); it++) + children->push_back(*it); +} + +GameRuleDefinition *CompoundGameRuleDefinition::addChild(ConsoleGameRules::EGameRuleType ruleType) +{ + GameRuleDefinition *rule = NULL; + if(ruleType == ConsoleGameRules::eGameRuleType_CompleteAllRule) + { + rule = new CompleteAllRuleDefinition(); + } + else if(ruleType == ConsoleGameRules::eGameRuleType_CollectItemRule) + { + rule = new CollectItemRuleDefinition(); + } + else if(ruleType == ConsoleGameRules::eGameRuleType_UseTileRule) + { + rule = new UseTileRuleDefinition(); + } + else if(ruleType == ConsoleGameRules::eGameRuleType_UpdatePlayerRule) + { + rule = new UpdatePlayerRuleDefinition(); + } + else + { +#ifndef _CONTENT_PACKAGE + wprintf(L"CompoundGameRuleDefinition: Attempted to add invalid child rule - %d\n", ruleType ); +#endif + } + if(rule != NULL) m_children.push_back(rule); + return rule; +} + +void CompoundGameRuleDefinition::populateGameRule(GameRulesInstance::EGameRulesInstanceType type, GameRule *rule) +{ + GameRule *newRule = NULL; + int i = 0; + for(AUTO_VAR(it, m_children.begin()); it != m_children.end(); ++it) + { + newRule = new GameRule(*it, rule->getConnection() ); + (*it)->populateGameRule(type,newRule); + + GameRule::ValueType value; + value.gr = newRule; + value.isPointer = true; + + // Somehow add the newRule to the current rule + rule->setParameter(L"rule" + _toString(i),value); + ++i; + } + GameRuleDefinition::populateGameRule(type, rule); +} + +bool CompoundGameRuleDefinition::onUseTile(GameRule *rule, int tileId, int x, int y, int z) +{ + bool statusChanged = false; + for(AUTO_VAR(it, rule->m_parameters.begin()); it != rule->m_parameters.end(); ++it) + { + if(it->second.isPointer) + { + bool changed = it->second.gr->getGameRuleDefinition()->onUseTile(it->second.gr,tileId,x,y,z); + if(!statusChanged && changed) + { + m_lastRuleStatusChanged = it->second.gr->getGameRuleDefinition(); + statusChanged = true; + } + } + } + return statusChanged; +} + +bool CompoundGameRuleDefinition::onCollectItem(GameRule *rule, shared_ptr item) +{ + bool statusChanged = false; + for(AUTO_VAR(it, rule->m_parameters.begin()); it != rule->m_parameters.end(); ++it) + { + if(it->second.isPointer) + { + bool changed = it->second.gr->getGameRuleDefinition()->onCollectItem(it->second.gr,item); + if(!statusChanged && changed) + { + m_lastRuleStatusChanged = it->second.gr->getGameRuleDefinition(); + statusChanged = true; + } + } + } + return statusChanged; +} + +void CompoundGameRuleDefinition::postProcessPlayer(shared_ptr player) +{ + for(AUTO_VAR(it, m_children.begin()); it != m_children.end(); ++it) + { + (*it)->postProcessPlayer(player); + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/CompoundGameRuleDefinition.h b/Minecraft.Client/Common/GameRules/CompoundGameRuleDefinition.h new file mode 100644 index 00000000..bfedfd09 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/CompoundGameRuleDefinition.h @@ -0,0 +1,23 @@ +#pragma once + +#include "GameRuleDefinition.h" + +class CompoundGameRuleDefinition : public GameRuleDefinition +{ +protected: + vector m_children; +protected: + GameRuleDefinition *m_lastRuleStatusChanged; +public: + CompoundGameRuleDefinition(); + virtual ~CompoundGameRuleDefinition(); + + virtual void getChildren(vector *children); + virtual GameRuleDefinition *addChild(ConsoleGameRules::EGameRuleType ruleType); + + virtual void populateGameRule(GameRulesInstance::EGameRulesInstanceType type, GameRule *rule); + + virtual bool onUseTile(GameRule *rule, int tileId, int x, int y, int z); + virtual bool onCollectItem(GameRule *rule, shared_ptr item); + virtual void postProcessPlayer(shared_ptr player); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/ConsoleGameRules.h b/Minecraft.Client/Common/GameRules/ConsoleGameRules.h new file mode 100644 index 00000000..41c5e557 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/ConsoleGameRules.h @@ -0,0 +1,32 @@ +#pragma once +#include "ConsoleGameRulesConstants.h" + +#include "GameRuleManager.h" + +#include "GameRule.h" + +#include "GameRuleDefinition.h" + +#include "LevelRuleset.h" +#include "NamedAreaRuleDefinition.h" + +#include "CollectItemRuleDefinition.h" +#include "CompleteAllRuleDefinition.h" +#include "CompoundGameRuleDefinition.h" +#include "UseTileRuleDefinition.h" +#include "UpdatePlayerRuleDefinition.h" +#include "AddItemRuleDefinition.h" +#include "AddEnchantmentRuleDefinition.h" + +#include "LevelGenerationOptions.h" +#include "ApplySchematicRuleDefinition.h" +#include "ConsoleGenerateStructure.h" +#include "ConsoleGenerateStructureAction.h" +#include "XboxStructureActionGenerateBox.h" +#include "XboxStructureActionPlaceBlock.h" +#include "XboxStructureActionPlaceContainer.h" +#include "XboxStructureActionPlaceSpawner.h" +#include "BiomeOverride.h" +#include "StartFeature.h" + +#include "GameRulesInstance.h" diff --git a/Minecraft.Client/Common/GameRules/ConsoleGameRulesConstants.h b/Minecraft.Client/Common/GameRules/ConsoleGameRulesConstants.h new file mode 100644 index 00000000..a7111f04 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/ConsoleGameRulesConstants.h @@ -0,0 +1,119 @@ +#pragma once + +//#include " + +class ConsoleGameRules +{ +public: + enum EGameRuleType + { + eGameRuleType_Invalid = -1, + eGameRuleType_Root = 0, // This is the top level rule that defines a game mode, this is used to generate data for new players + + eGameRuleType_LevelGenerationOptions, + eGameRuleType_ApplySchematic, + eGameRuleType_GenerateStructure, + eGameRuleType_GenerateBox, + eGameRuleType_PlaceBlock, + eGameRuleType_PlaceContainer, + eGameRuleType_PlaceSpawner, + eGameRuleType_BiomeOverride, + eGameRuleType_StartFeature, + + eGameRuleType_AddItem, + eGameRuleType_AddEnchantment, + + eGameRuleType_LevelRules, + eGameRuleType_NamedArea, + + eGameRuleType_UseTileRule, + eGameRuleType_CollectItemRule, + eGameRuleType_CompleteAllRule, + eGameRuleType_UpdatePlayerRule, + + eGameRuleType_Count + }; + + enum EGameRuleAttr + { + eGameRuleAttr_Invalid = -1, + + eGameRuleAttr_descriptionName = 0, + eGameRuleAttr_promptName, + eGameRuleAttr_dataTag, + + eGameRuleAttr_enchantmentId, + eGameRuleAttr_enchantmentLevel, + + eGameRuleAttr_itemId, + eGameRuleAttr_quantity, + eGameRuleAttr_auxValue, + eGameRuleAttr_slot, + + eGameRuleAttr_name, + + eGameRuleAttr_food, + eGameRuleAttr_health, + + eGameRuleAttr_tileId, + eGameRuleAttr_useCoords, + + eGameRuleAttr_seed, + eGameRuleAttr_flatworld, + + eGameRuleAttr_filename, + eGameRuleAttr_rot, + + eGameRuleAttr_data, + eGameRuleAttr_block, + eGameRuleAttr_entity, + + eGameRuleAttr_facing, + + eGameRuleAttr_edgeTile, + eGameRuleAttr_fillTile, + eGameRuleAttr_skipAir, + + eGameRuleAttr_x, + eGameRuleAttr_x0, + eGameRuleAttr_x1, + + eGameRuleAttr_y, + eGameRuleAttr_y0, + eGameRuleAttr_y1, + + eGameRuleAttr_z, + eGameRuleAttr_z0, + eGameRuleAttr_z1, + + eGameRuleAttr_chunkX, + eGameRuleAttr_chunkZ, + + eGameRuleAttr_yRot, + + eGameRuleAttr_spawnX, + eGameRuleAttr_spawnY, + eGameRuleAttr_spawnZ, + + eGameRuleAttr_orientation, + eGameRuleAttr_dimension, + + eGameRuleAttr_topTileId, + eGameRuleAttr_biomeId, + + eGameRuleAttr_feature, + + eGameRuleAttr_Count + }; + + static void write(DataOutputStream *dos, ConsoleGameRules::EGameRuleType eType) + { + dos->writeInt(eType); + } + + static void write(DataOutputStream *dos, ConsoleGameRules::EGameRuleAttr eAttr) + { + dos->writeInt( eGameRuleType_Count + eAttr ); + } + +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.cpp b/Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.cpp new file mode 100644 index 00000000..0476b0e3 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.cpp @@ -0,0 +1,181 @@ +#include "stdafx.h" +#include "ConsoleGenerateStructure.h" +#include "ConsoleGameRules.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.dimension.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.levelgen.structure.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\net.minecraft.h" + +ConsoleGenerateStructure::ConsoleGenerateStructure() : StructurePiece(0) +{ + m_x = m_y = m_z = 0; + boundingBox = NULL; + orientation = Direction::NORTH; + m_dimension = 0; +} + +void ConsoleGenerateStructure::getChildren(vector *children) +{ + GameRuleDefinition::getChildren(children); + + for(AUTO_VAR(it, m_actions.begin()); it != m_actions.end(); it++) + children->push_back( *it ); +} + +GameRuleDefinition *ConsoleGenerateStructure::addChild(ConsoleGameRules::EGameRuleType ruleType) +{ + GameRuleDefinition *rule = NULL; + if(ruleType == ConsoleGameRules::eGameRuleType_GenerateBox) + { + rule = new XboxStructureActionGenerateBox(); + m_actions.push_back((XboxStructureActionGenerateBox *)rule); + } + else if(ruleType == ConsoleGameRules::eGameRuleType_PlaceBlock) + { + rule = new XboxStructureActionPlaceBlock(); + m_actions.push_back((XboxStructureActionPlaceBlock *)rule); + } + else if(ruleType == ConsoleGameRules::eGameRuleType_PlaceContainer) + { + rule = new XboxStructureActionPlaceContainer(); + m_actions.push_back((XboxStructureActionPlaceContainer *)rule); + } + else if(ruleType == ConsoleGameRules::eGameRuleType_PlaceSpawner) + { + rule = new XboxStructureActionPlaceSpawner(); + m_actions.push_back((XboxStructureActionPlaceSpawner *)rule); + } + else + { +#ifndef _CONTENT_PACKAGE + wprintf(L"ConsoleGenerateStructure: Attempted to add invalid child rule - %d\n", ruleType ); +#endif + } + return rule; +} + +void ConsoleGenerateStructure::writeAttributes(DataOutputStream *dos, UINT numAttrs) +{ + GameRuleDefinition::writeAttributes(dos, numAttrs + 5); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_x); + dos->writeUTF(_toString(m_x)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_y); + dos->writeUTF(_toString(m_y)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_z); + dos->writeUTF(_toString(m_z)); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_orientation); + dos->writeUTF(_toString(orientation)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_dimension); + dos->writeUTF(_toString(m_dimension)); +} + +void ConsoleGenerateStructure::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"x") == 0) + { + int value = _fromString(attributeValue); + m_x = value; + app.DebugPrintf("ConsoleGenerateStructure: Adding parameter x=%d\n",m_x); + } + else if(attributeName.compare(L"y") == 0) + { + int value = _fromString(attributeValue); + m_y = value; + app.DebugPrintf("ConsoleGenerateStructure: Adding parameter y=%d\n",m_y); + } + else if(attributeName.compare(L"z") == 0) + { + int value = _fromString(attributeValue); + m_z = value; + app.DebugPrintf("ConsoleGenerateStructure: Adding parameter z=%d\n",m_z); + } + else if(attributeName.compare(L"orientation") == 0) + { + int value = _fromString(attributeValue); + orientation = value; + app.DebugPrintf("ConsoleGenerateStructure: Adding parameter orientation=%d\n",orientation); + } + else if(attributeName.compare(L"dim") == 0) + { + m_dimension = _fromString(attributeValue); + if(m_dimension > 1 || m_dimension < -1) m_dimension = 0; + app.DebugPrintf("ApplySchematicRuleDefinition: Adding parameter dimension=%d\n",m_dimension); + } + else + { + GameRuleDefinition::addAttribute(attributeName, attributeValue); + } +} + +BoundingBox* ConsoleGenerateStructure::getBoundingBox() +{ + if(boundingBox == NULL) + { + // Find the max bounds + int maxX, maxY, maxZ; + maxX = maxY = maxZ = 1; + for(AUTO_VAR(it, m_actions.begin()); it != m_actions.end(); ++it) + { + ConsoleGenerateStructureAction *action = *it; + maxX = max(maxX,action->getEndX()); + maxY = max(maxY,action->getEndY()); + maxZ = max(maxZ,action->getEndZ()); + } + + boundingBox = new BoundingBox(m_x, m_y, m_z, m_x + maxX, m_y + maxY, m_z + maxZ); + } + return boundingBox; +} + +bool ConsoleGenerateStructure::postProcess(Level *level, Random *random, BoundingBox *chunkBB) +{ + if(level->dimension->id != m_dimension) return false; + + for(AUTO_VAR(it, m_actions.begin()); it != m_actions.end(); ++it) + { + ConsoleGenerateStructureAction *action = *it; + + switch(action->getActionType()) + { + case ConsoleGameRules::eGameRuleType_GenerateBox: + { + XboxStructureActionGenerateBox *genBox = (XboxStructureActionGenerateBox *)action; + genBox->generateBoxInLevel(this,level,chunkBB); + } + break; + case ConsoleGameRules::eGameRuleType_PlaceBlock: + { + XboxStructureActionPlaceBlock *pPlaceBlock = (XboxStructureActionPlaceBlock *)action; + pPlaceBlock->placeBlockInLevel(this,level,chunkBB); + } + break; + case ConsoleGameRules::eGameRuleType_PlaceContainer: + { + XboxStructureActionPlaceContainer *pPlaceContainer = (XboxStructureActionPlaceContainer *)action; + pPlaceContainer->placeContainerInLevel(this,level,chunkBB); + } + break; + case ConsoleGameRules::eGameRuleType_PlaceSpawner: + { + XboxStructureActionPlaceSpawner *pPlaceSpawner = (XboxStructureActionPlaceSpawner *)action; + pPlaceSpawner->placeSpawnerInLevel(this,level,chunkBB); + } + break; + }; + } + + return false; +} + +bool ConsoleGenerateStructure::checkIntersects(int x0, int y0, int z0, int x1, int y1, int z1) +{ + return getBoundingBox()->intersects(x0,y0,z0,x1,y1,z1); +} + +int ConsoleGenerateStructure::getMinY() +{ + return getBoundingBox()->y0; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.h b/Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.h new file mode 100644 index 00000000..5b97b108 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.h @@ -0,0 +1,38 @@ +#pragma once +#include "GameRuleDefinition.h" +#include "..\..\..\Minecraft.World\StructurePiece.h" + +class Level; +class Random; +class BoundingBox; +class ConsoleGenerateStructureAction; +class XboxStructureActionPlaceContainer; +class GRFObject; + +class ConsoleGenerateStructure : public GameRuleDefinition, public StructurePiece +{ +private: + int m_x, m_y, m_z; + vector m_actions; + int m_dimension; +public: + ConsoleGenerateStructure(); + + virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_GenerateStructure; } + + virtual void getChildren(vector *children); + virtual GameRuleDefinition *addChild(ConsoleGameRules::EGameRuleType ruleType); + + virtual void writeAttributes(DataOutputStream *dos, UINT numAttrs); + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + // StructurePiece + virtual BoundingBox *getBoundingBox(); + virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + + void createContainer(XboxStructureActionPlaceContainer *action, Level *level, BoundingBox *chunkBB); + + bool checkIntersects(int x0, int y0, int z0, int x1, int y1, int z1); + + virtual int getMinY(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/ConsoleGenerateStructureAction.h b/Minecraft.Client/Common/GameRules/ConsoleGenerateStructureAction.h new file mode 100644 index 00000000..14eb2fd8 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/ConsoleGenerateStructureAction.h @@ -0,0 +1,11 @@ +#pragma once + +#include "GameRuleDefinition.h" + +class ConsoleGenerateStructureAction : public GameRuleDefinition +{ +public: + virtual int getEndX() = 0; + virtual int getEndY() = 0; + virtual int getEndZ() = 0; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp b/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp new file mode 100644 index 00000000..4a4e27b2 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp @@ -0,0 +1,1020 @@ +#include "stdafx.h" +#include +#include "..\..\..\Minecraft.World\com.mojang.nbt.h" +#include "..\..\..\Minecraft.World\System.h" +#include "ConsoleSchematicFile.h" +#include "..\..\..\Minecraft.World\InputOutputStream.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.chunk.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.phys.h" +#include "..\..\..\Minecraft.World\compression.h" + +ConsoleSchematicFile::ConsoleSchematicFile() +{ + m_xSize = m_ySize = m_zSize = 0; + m_refCount = 1; + m_data.data = NULL; +} + +ConsoleSchematicFile::~ConsoleSchematicFile() +{ + app.DebugPrintf("Deleting schematic file\n"); + if(m_data.data != NULL) delete [] m_data.data; +} + +void ConsoleSchematicFile::save(DataOutputStream *dos) +{ + if(dos != NULL) + { + dos->writeInt(XBOX_SCHEMATIC_CURRENT_VERSION); + + dos->writeByte(APPROPRIATE_COMPRESSION_TYPE); + + dos->writeInt(m_xSize); + dos->writeInt(m_ySize); + dos->writeInt(m_zSize); + + byteArray ba(new BYTE[ m_data.length ], m_data.length); + Compression::getCompression()->CompressLZXRLE( ba.data, &ba.length, + m_data.data, m_data.length); + + dos->writeInt(ba.length); + dos->write(ba); + + save_tags(dos); + + delete [] ba.data; + } +} + +void ConsoleSchematicFile::load(DataInputStream *dis) +{ + if(dis != NULL) + { + // VERSION CHECK // + int version = dis->readInt(); + + Compression::ECompressionTypes compressionType = Compression::eCompressionType_LZXRLE; + + if (version > XBOX_SCHEMATIC_ORIGINAL_VERSION) // Or later versions + { + compressionType = (Compression::ECompressionTypes)dis->readByte(); + } + + if (version > XBOX_SCHEMATIC_CURRENT_VERSION) + assert(false && "Unrecognised schematic version!!"); + + m_xSize = dis->readInt(); + m_ySize = dis->readInt(); + m_zSize = dis->readInt(); + + int compressedSize = dis->readInt(); + byteArray compressedBuffer(compressedSize); + dis->readFully(compressedBuffer); + + if(m_data.data != NULL) + { + delete [] m_data.data; + m_data.data = NULL; + } + + if(compressionType == Compression::eCompressionType_None) + { + m_data = compressedBuffer; + } + else + { + unsigned int outputSize = m_xSize * m_ySize * m_zSize * 3/2; + m_data = byteArray(outputSize); + + switch(compressionType) + { + case Compression::eCompressionType_RLE: + Compression::getCompression()->DecompressRLE( m_data.data, &m_data.length, compressedBuffer.data, compressedSize); + break; + case APPROPRIATE_COMPRESSION_TYPE: + Compression::getCompression()->DecompressLZXRLE( m_data.data, &m_data.length, compressedBuffer.data, compressedSize); + break; + default: + app.DebugPrintf("Unrecognized compression type for Schematic file (%d)\n", (int)compressionType); + Compression::getCompression()->SetDecompressionType( (Compression::ECompressionTypes)compressionType ); + Compression::getCompression()->DecompressLZXRLE( m_data.data, &m_data.length, compressedBuffer.data, compressedSize); + Compression::getCompression()->SetDecompressionType( APPROPRIATE_COMPRESSION_TYPE ); + }; + + delete [] compressedBuffer.data; + } + + // READ TAGS // + CompoundTag *tag = NbtIo::read(dis); + ListTag *tileEntityTags = (ListTag *) tag->getList(L"TileEntities"); + if (tileEntityTags != NULL) + { + for (int i = 0; i < tileEntityTags->size(); i++) + { + CompoundTag *teTag = tileEntityTags->get(i); + shared_ptr te = TileEntity::loadStatic(teTag); + + if(te == NULL) + { +#ifndef _CONTENT_PACKAGE + app.DebugPrintf("ConsoleSchematicFile has read a NULL tile entity\n"); + __debugbreak(); +#endif + } + else + { + m_tileEntities.push_back(te); + } + } + } + ListTag *entityTags = (ListTag *) tag->getList(L"Entities"); + if (entityTags != NULL) + { + for (int i = 0; i < entityTags->size(); i++) + { + CompoundTag *eTag = entityTags->get(i); + eINSTANCEOF type = EntityIO::getType(eTag->getString(L"id")); + ListTag *pos = (ListTag *) eTag->getList(L"Pos"); + + double x = pos->get(0)->data; + double y = pos->get(1)->data; + double z = pos->get(2)->data; + + if( type == eTYPE_PAINTING || type == eTYPE_ITEM_FRAME ) + { + x = ((IntTag *) eTag->get(L"TileX") )->data; + y = ((IntTag *) eTag->get(L"TileY") )->data; + z = ((IntTag *) eTag->get(L"TileZ") )->data; + } +#ifdef _DEBUG + //app.DebugPrintf(1,"Loaded entity type %d at (%f,%f,%f)\n",(int)type,x,y,z); +#endif + m_entities.push_back( pair(Vec3::newPermanent(x,y,z),(CompoundTag *)eTag->copy())); + } + } + delete tag; + } +} + +void ConsoleSchematicFile::save_tags(DataOutputStream *dos) +{ + CompoundTag *tag = new CompoundTag(); + + ListTag *tileEntityTags = new ListTag(); + tag->put(L"TileEntities", tileEntityTags); + + for (AUTO_VAR(it, m_tileEntities.begin()); it != m_tileEntities.end(); it++) + { + CompoundTag *cTag = new CompoundTag(); + (*it)->save(cTag); + tileEntityTags->add(cTag); + } + + ListTag *entityTags = new ListTag(); + tag->put(L"Entities", entityTags); + + for (AUTO_VAR(it, m_entities.begin()); it != m_entities.end(); it++) + entityTags->add( (CompoundTag *)(*it).second->copy() ); + + NbtIo::write(tag,dos); + delete tag; +} + +__int64 ConsoleSchematicFile::applyBlocksAndData(LevelChunk *chunk, AABB *chunkBox, AABB *destinationBox, ESchematicRotation rot) +{ + int xStart = max(destinationBox->x0, (double)chunk->x*16); + int xEnd = min(destinationBox->x1, (double)((xStart>>4)<<4) + 16); + + int yStart = destinationBox->y0; + int yEnd = destinationBox->y1; + if(yEnd > Level::maxBuildHeight) yEnd = Level::maxBuildHeight; + + int zStart = max(destinationBox->z0, (double)chunk->z*16); + int zEnd = min(destinationBox->z1, (double)((zStart>>4)<<4) + 16); + +#ifdef _DEBUG + app.DebugPrintf("Range is (%d,%d,%d) to (%d,%d,%d)\n",xStart,yStart,zStart,xEnd-1,yEnd-1,zEnd-1); +#endif + + int rowBlocksIncluded = (yEnd-yStart)*(zEnd-zStart); + int blocksIncluded = (xEnd-xStart)*rowBlocksIncluded; + + int rowBlockCount = getYSize() * getZSize(); + int totalBlockCount = getXSize() * rowBlockCount; + + byteArray blockData = byteArray(Level::CHUNK_TILE_COUNT); + PIXBeginNamedEvent(0,"Getting block data"); + chunk->getBlockData(blockData); + PIXEndNamedEvent(); + byteArray dataData = byteArray(Level::HALF_CHUNK_TILE_COUNT); + PIXBeginNamedEvent(0,"Getting Data data"); + chunk->getDataData(dataData); + PIXEndNamedEvent(); + + // Ignore light data + int blockLightP = -1; + int skyLightP = -1; + if( rot == eSchematicRot_90 || rot == eSchematicRot_180 || rot == eSchematicRot_270 ) + { + int schematicXRow = 0; + int schematicZRow = 0; + int blocksP = 0; + int dataP = 0; + + for(int x = xStart; x < xEnd; ++x) + { + int x0 = x - chunk->x*16; + int x1 = x0 + 1; + + for(int z = zStart; z < zEnd; ++z) + { + int z0 = z - chunk->z*16; + int z1 = z0 + 1; + + chunkCoordToSchematicCoord(destinationBox, x, z, rot, schematicXRow, schematicZRow); + blocksP = (schematicXRow*rowBlockCount) + (schematicZRow*getYSize()); + dataP = totalBlockCount + (blocksP)/2; + + ConsoleSchematicFile::setBlocksAndData(chunk,blockData,dataData,m_data, x0, yStart, z0, x1, yEnd, z1, blocksP, dataP, blockLightP, skyLightP); + } + } + } + else if( rot == eSchematicRot_0 ) + { + // The initial pointer offsets for the different data types + int schematicXRow = xStart - destinationBox->x0; + int schematicZRow = zStart - destinationBox->z0; + int blocksP = (schematicXRow*rowBlockCount) + (schematicZRow*getYSize()); + int dataP = totalBlockCount + (schematicXRow*rowBlockCount + (schematicZRow*getYSize()))/2; + + for(int x = xStart; x < xEnd; ++x) + { + int x0 = x - chunk->x*16; + int x1 = x0 + 1; + + int z0 = zStart - chunk->z*16; + int z1 = zEnd - chunk->z*16; + + ConsoleSchematicFile::setBlocksAndData(chunk,blockData,dataData,m_data, x0, yStart, z0, x1, yEnd, z1, blocksP, dataP, blockLightP, skyLightP); + // update all pointer positions + // For z start to z end + // Set blocks and data + // increment z by the right amount + blocksP += (rowBlockCount-rowBlocksIncluded); + dataP += (rowBlockCount-rowBlocksIncluded)/2; + } + } + else + { + app.DebugPrintf("ERROR: Rotation of block and data not implemented!!\n"); + } + + // 4J Stu - Hack for ME pack to replace sand with end stone in schematics + //for(int i = 0; i < blockData.length; ++i) + //{ + // if(blockData[i] == Tile::sand_Id || blockData[i] == Tile::sandStone_Id) + // { + // blockData[i] = Tile::whiteStone_Id; + // } + //} + + PIXBeginNamedEvent(0,"Setting Block data"); + chunk->setBlockData(blockData); + PIXEndNamedEvent(); + delete blockData.data; + chunk->recalcHeightmapOnly(); + PIXBeginNamedEvent(0,"Setting Data data"); + chunk->setDataData(dataData); + PIXEndNamedEvent(); + delete dataData.data; + + // A basic pass through to roughly do the lighting. At this point of post-processing, we don't have all the neighbouring chunks loaded in, + // so any lighting here should be things that won't propagate out of this chunk. + for( int xx = xStart ; xx < xEnd; xx++ ) + for( int y = yStart ; y < yEnd; y++ ) + for( int zz = zStart ; zz < zEnd; zz++ ) + { + int x = xx - chunk->x * 16; + int z = zz - chunk->z * 16; + chunk->setBrightness(LightLayer::Block,x,y,z,0); + if( chunk->getTile(x,y,z) ) + { + chunk->setBrightness(LightLayer::Sky,x,y,z,0); + } + else + { + if( chunk->isSkyLit(x,y,z) ) + { + chunk->setBrightness(LightLayer::Sky,x,y,z,15); + } + else + { + chunk->setBrightness(LightLayer::Sky,x,y,z,0); + } + } + } + + return blocksIncluded; +} + +// At the point that this is called, we have all the neighbouring chunks loaded in (and generally post-processed, apart from this lighting pass), so +// we can do the sort of lighting that might propagate out of the chunk. +__int64 ConsoleSchematicFile::applyLighting(LevelChunk *chunk, AABB *chunkBox, AABB *destinationBox, ESchematicRotation rot) +{ + int xStart = max(destinationBox->x0, (double)chunk->x*16); + int xEnd = min(destinationBox->x1, (double)((xStart>>4)<<4) + 16); + + int yStart = destinationBox->y0; + int yEnd = destinationBox->y1; + if(yEnd > Level::maxBuildHeight) yEnd = Level::maxBuildHeight; + + int zStart = max(destinationBox->z0, (double)chunk->z*16); + int zEnd = min(destinationBox->z1, (double)((zStart>>4)<<4) + 16); + + int rowBlocksIncluded = (yEnd-yStart)*(zEnd-zStart); + int blocksIncluded = (xEnd-xStart)*rowBlocksIncluded; + + // Now actually do a checkLight on blocks that might need it, which should more accurately put everything in place + for( int xx = xStart ; xx < xEnd; xx++ ) + for( int y = yStart ; y < yEnd; y++ ) + for( int zz = zStart ; zz < zEnd; zz++ ) + { + int x = xx - chunk->x * 16; + int z = zz - chunk->z * 16; + + if( y <= chunk->getHeightmap( x, z ) ) + { + chunk->level->checkLight(LightLayer::Sky, xx, y, zz, true); + } + if( Tile::lightEmission[chunk->getTile(x,y,z)] ) + { + // Note that this lighting passes a rootOnlyEmissive flag of true, which means that only the location xx/y/zz is considered + // as possibly being a source of emissive light, not other tiles that we might encounter whilst propagating the light from + // the start location. If we don't do this, and Do encounter another emissive source in the radius of influence that the first + // light source had, then we'll start also lighting from that tile but won't actually be able to progatate that second light + // fully since checkLight only has a finite radius of 17 from the start position that it can light. Then when we do a checkLight + // on the second light later, it won't bother doing anything because the light level at the location of the tile itself will be correct. + chunk->level->checkLight(LightLayer::Block, xx, y, zz, true, true); + } + } + + return blocksIncluded; +} + +void ConsoleSchematicFile::chunkCoordToSchematicCoord(AABB *destinationBox, int chunkX, int chunkZ, ESchematicRotation rot, int &schematicX, int &schematicZ) +{ + switch(rot) + { + case eSchematicRot_90: + // schematicX decreases as chunkZ increases + // schematicZ increases as chunkX increases + schematicX = chunkZ - destinationBox->z0; + schematicZ = (destinationBox->x1 - 1 - destinationBox->x0) - (chunkX - destinationBox->x0); + break; + case eSchematicRot_180: + // schematicX decreases as chunkX increases + // schematicZ decreases as chunkZ increases + schematicX = (destinationBox->x1 - 1 - destinationBox->x0) - (chunkX - destinationBox->x0); + schematicZ = (destinationBox->z1 - 1 - destinationBox->z0) - (chunkZ - destinationBox->z0); + break; + case eSchematicRot_270: + // schematicX increases as chunkZ increases + // shcematicZ decreases as chunkX increases + schematicX = (destinationBox->z1 - 1 - destinationBox->z0) - (chunkZ - destinationBox->z0); + schematicZ = chunkX - destinationBox->x0; + break; + case eSchematicRot_0: + default: + // schematicX increases as chunkX increases + // schematicZ increases as chunkZ increases + schematicX = chunkX - destinationBox->x0; + schematicZ = chunkZ - destinationBox->z0; + break; + }; +} + +void ConsoleSchematicFile::schematicCoordToChunkCoord(AABB *destinationBox, double schematicX, double schematicZ, ESchematicRotation rot, double &chunkX, double &chunkZ) +{ + switch(rot) + { + case eSchematicRot_90: + // schematicX decreases as chunkZ increases + // schematicZ increases as chunkX increases + chunkX = (destinationBox->x1 - 1 - schematicZ); + chunkZ = schematicX + destinationBox->z0; + break; + case eSchematicRot_180: + // schematicX decreases as chunkX increases + // schematicZ decreases as chunkZ increases + chunkX = (destinationBox->x1 - 1 - schematicX); + chunkZ = (destinationBox->z1 - 1 - schematicZ); + break; + case eSchematicRot_270: + // schematicX increases as chunkZ increases + // shcematicZ decreases as chunkX increases + chunkX = schematicZ + destinationBox->x0; + chunkZ = (destinationBox->z1 - 1 - schematicX); + break; + case eSchematicRot_0: + default: + // schematicX increases as chunkX increases + // schematicZ increases as chunkZ increases + chunkX = schematicX + destinationBox->x0; + chunkZ = schematicZ + destinationBox->z0; + break; + }; +} + +void ConsoleSchematicFile::applyTileEntities(LevelChunk *chunk, AABB *chunkBox, AABB *destinationBox, ESchematicRotation rot) +{ + for(AUTO_VAR(it, m_tileEntities.begin()); it != m_tileEntities.end();++it) + { + shared_ptr te = *it; + + double targetX = te->x; + double targetY = te->y + destinationBox->y0; + double targetZ = te->z; + + schematicCoordToChunkCoord(destinationBox, te->x, te->z, rot, targetX, targetZ); + + Vec3 *pos = Vec3::newTemp(targetX,targetY,targetZ); + if( chunkBox->containsIncludingLowerBound(pos) ) + { + shared_ptr teCopy = chunk->getTileEntity( (int)targetX & 15, (int)targetY & 15, (int)targetZ & 15 ); + + if ( teCopy != NULL ) + { + CompoundTag *teData = new CompoundTag(); + te->save(teData); + + teCopy->load(teData); + + delete teData; + + // Adjust the tileEntity position to world coords from schematic co-ords + teCopy->x = targetX; + teCopy->y = targetY; + teCopy->z = targetZ; + + // Remove the current tile entity + //chunk->removeTileEntity( (int)targetX & 15, (int)targetY & 15, (int)targetZ & 15 ); + } + else + { + teCopy = te->clone(); + + // Adjust the tileEntity position to world coords from schematic co-ords + teCopy->x = targetX; + teCopy->y = targetY; + teCopy->z = targetZ; + chunk->addTileEntity(teCopy); + } + + teCopy->setChanged(); + } + } + for(AUTO_VAR(it, m_entities.begin()); it != m_entities.end();) + { + Vec3 *source = it->first; + + double targetX = source->x; + double targetY = source->y + destinationBox->y0; + double targetZ = source->z; + schematicCoordToChunkCoord(destinationBox, source->x, source->z, rot, targetX, targetZ); + + // Add 0.01 as the AABB::contains function returns false if a value is <= the lower bound + Vec3 *pos = Vec3::newTemp(targetX+0.01,targetY+0.01,targetZ+0.01); + if( !chunkBox->containsIncludingLowerBound(pos) ) + { + ++it; + continue; + } + + CompoundTag *eTag = it->second; + shared_ptr e = EntityIO::loadStatic(eTag, NULL); + + if( e->GetType() == eTYPE_PAINTING ) + { + shared_ptr painting = dynamic_pointer_cast(e); + + double tileX = painting->xTile; + double tileZ = painting->zTile; + schematicCoordToChunkCoord(destinationBox, painting->xTile, painting->zTile, rot, tileX, tileZ); + + painting->yTile += destinationBox->y0; + painting->xTile = tileX; + painting->zTile = tileZ; + painting->setDir(painting->dir); + } + else if( e->GetType() == eTYPE_ITEM_FRAME ) + { + shared_ptr frame = dynamic_pointer_cast(e); + + double tileX = frame->xTile; + double tileZ = frame->zTile; + schematicCoordToChunkCoord(destinationBox, frame->xTile, frame->zTile, rot, tileX, tileZ); + + frame->yTile += destinationBox->y0; + frame->xTile = tileX; + frame->zTile = tileZ; + frame->setDir(frame->dir); + } + else + { + e->absMoveTo(targetX, targetY, targetZ,e->yRot,e->xRot); + } +#ifdef _DEBUG + app.DebugPrintf("Adding entity type %d at (%f,%f,%f)\n",e->GetType(),e->x,e->y,e->z); +#endif + e->setLevel(chunk->level); + e->resetSmallId(); + e->setDespawnProtected(); // default to being protected against despawning + chunk->level->addEntity(e); + + // 4J Stu - Until we can copy every type of entity, remove them from this vector + // This means that the entities will only exist in the first use of the schematic that is processed + //it = m_entities.erase(it); + ++it; + } +} + +void ConsoleSchematicFile::generateSchematicFile(DataOutputStream *dos, Level *level, int xStart, int yStart, int zStart, int xEnd, int yEnd, int zEnd, bool bSaveMobs, Compression::ECompressionTypes compressionType) +{ + assert(xEnd > xStart); + assert(yEnd > yStart); + assert(zEnd > zStart); + // 4J Stu - Enforce even numbered positions to start with to avoid problems with half-bytes in data + + // We want the start to be even + if(xStart > 0 && xStart%2 != 0) + xStart-=1; + else if(xStart < 0 && xStart%2 !=0) + xStart-=1; + if(yStart < 0) yStart = 0; + else if(yStart > 0 && yStart%2 != 0) + yStart-=1; + if(zStart > 0 && zStart%2 != 0) + zStart-=1; + else if(zStart < 0 && zStart%2 !=0) + zStart-=1; + + // We want the end to be odd to have a total size that is even + if(xEnd > 0 && xEnd%2 == 0) + xEnd+=1; + else if(xEnd < 0 && xEnd%2 ==0) + xEnd+=1; + if(yEnd > Level::maxBuildHeight) + yEnd = Level::maxBuildHeight; + else if(yEnd > 0 && yEnd%2 == 0) + yEnd+=1; + else if(yEnd < 0 && yEnd%2 ==0) + yEnd+=1; + if(zEnd > 0 && zEnd%2 == 0) + zEnd+=1; + else if(zEnd < 0 && zEnd%2 ==0) + zEnd+=1; + + int xSize = xEnd - xStart + 1; + int ySize = yEnd - yStart + 1; + int zSize = zEnd - zStart + 1; + + app.DebugPrintf("Generating schematic file for area (%d,%d,%d) to (%d,%d,%d), %dx%dx%d\n",xStart,yStart,zStart,xEnd,yEnd,zEnd,xSize,ySize,zSize); + + if(dos != NULL) dos->writeInt(XBOX_SCHEMATIC_CURRENT_VERSION); + + if(dos != NULL) dos->writeByte(compressionType); + + //Write xSize + if(dos != NULL) dos->writeInt(xSize); + + //Write ySize + if(dos != NULL) dos->writeInt(ySize); + + //Write zSize + if(dos != NULL) dos->writeInt(zSize); + + //byteArray rawBuffer = level->getBlocksAndData(xStart, yStart, zStart, xSize, ySize, zSize, false); + int xRowSize = ySize * zSize; + int blockCount = xSize * xRowSize; + byteArray result( blockCount * 3 / 2 ); + + // Position pointers into the data when not ordered by chunk + int p = 0; + int dataP = blockCount; + int blockLightP = -1; + int skyLightP = -1; + + int y0 = yStart; + int y1 = yStart + ySize; + if (y0 < 0) y0 = 0; + if (y1 > Level::maxBuildHeight) y1 = Level::maxBuildHeight; + + // Every x is a whole row + for(int xPos = xStart; xPos < xStart + xSize; ++xPos) + { + int xc = xPos >> 4; + + int x0 = xPos - xc * 16; + if (x0 < 0) x0 = 0; + int x1 = x0 + 1; + if (x1 > 16) x1 = 16; + + for(int zPos = zStart; zPos < zStart + zSize;) + { + int zc = zPos >> 4; + + int z0 = zStart - zc * 16; + int z1 = zStart + zSize - zc * 16; + if (z0 < 0) z0 = 0; + if (z1 > 16) z1 = 16; + getBlocksAndData(level->getChunk(xc, zc), &result, x0, y0, z0, x1, y1, z1, p, dataP, blockLightP, skyLightP); + zPos += (z1-z0); + } + } + +#ifndef _CONTENT_PACKAGE + if(p!=blockCount) __debugbreak(); +#endif + + // We don't know how this will compress - just make a fixed length buffer to initially decompress into + // Some small sets of blocks can end up compressing into something bigger than their source + unsigned int inputSize = blockCount * 3 / 2; + unsigned char *ucTemp = new unsigned char[inputSize]; + + switch(compressionType) + { + case Compression::eCompressionType_LZXRLE: + Compression::getCompression()->CompressLZXRLE( ucTemp, &inputSize, result.data, (unsigned int) result.length ); + break; + case Compression::eCompressionType_RLE: + Compression::getCompression()->CompressRLE( ucTemp, &inputSize, result.data, (unsigned int) result.length ); + break; + case Compression::eCompressionType_None: + default: + memcpy( ucTemp, result.data, inputSize ); + break; + }; + + delete [] result.data; + byteArray buffer = byteArray(ucTemp,inputSize); + + if(dos != NULL) dos->writeInt(inputSize); + if(dos != NULL) dos->write(buffer); + delete [] buffer.data; + + CompoundTag tag; + ListTag *tileEntitiesTag = new ListTag(L"tileEntities"); + + int xc0 = xStart >> 4; + int zc0 = zStart >> 4; + int xc1 = (xStart + xSize - 1) >> 4; + int zc1 = (zStart + zSize - 1) >> 4; + + for (int xc = xc0; xc <= xc1; xc++) + { + for (int zc = zc0; zc <= zc1; zc++) + { + vector > *tileEntities = getTileEntitiesInRegion(level->getChunk(xc, zc), xStart, yStart, zStart, xStart + xSize, yStart + ySize, zStart + zSize); + for(AUTO_VAR(it, tileEntities->begin()); it != tileEntities->end(); ++it) + { + shared_ptr te = *it; + CompoundTag *teTag = new CompoundTag(); + shared_ptr teCopy = te->clone(); + + // Adjust the tileEntity position to schematic coords from world co-ords + teCopy->x -= xStart; + teCopy->y -= yStart; + teCopy->z -= zStart; + teCopy->save(teTag); + tileEntitiesTag->add(teTag); + } + delete tileEntities; + } + } + tag.put(L"TileEntities", tileEntitiesTag); + + AABB *bb = AABB::newTemp(xStart,yStart,zStart,xEnd,yEnd,zEnd); + vector > *entities = level->getEntities(nullptr, bb); + ListTag *entitiesTag = new ListTag(L"entities"); + + for(AUTO_VAR(it, entities->begin()); it != entities->end(); ++it) + { + shared_ptr e = *it; + + bool mobCanBeSaved = false; + if(bSaveMobs) + { + if( ( e->GetType() & eTYPE_MONSTER ) || ( e->GetType() & eTYPE_WATERANIMAL ) || ( e->GetType() & eTYPE_ANIMAL ) || + ( e->GetType() == eTYPE_CHICKEN ) || ( e->GetType() == eTYPE_WOLF ) || ( e->GetType() == eTYPE_VILLAGER) || ( e->GetType() == eTYPE_MUSHROOMCOW ) ) + { + mobCanBeSaved = true; + } + } + if(mobCanBeSaved || e->GetType() == eTYPE_MINECART || e->GetType() == eTYPE_BOAT || e->GetType() == eTYPE_PAINTING || e->GetType() == eTYPE_ITEM_FRAME) + { + CompoundTag *eTag = new CompoundTag(); + if( e->save(eTag) ) + { + ListTag *pos = (ListTag *) eTag->getList(L"Pos"); + + pos->get(0)->data -= xStart; + pos->get(1)->data -= yStart; + pos->get(2)->data -= zStart; + + if( e->GetType() == eTYPE_PAINTING || e->GetType() == eTYPE_ITEM_FRAME ) + { + ((IntTag *) eTag->get(L"TileX") )->data -= xStart; + ((IntTag *) eTag->get(L"TileY") )->data -= yStart; + ((IntTag *) eTag->get(L"TileZ") )->data -= zStart; + } + + entitiesTag->add(eTag); + } + } + } + + tag.put(L"Entities", entitiesTag); + + if(dos != NULL) NbtIo::write(&tag,dos); +} + +void ConsoleSchematicFile::getBlocksAndData(LevelChunk *chunk, byteArray *data, int x0, int y0, int z0, int x1, int y1, int z1, int &blocksP, int &dataP, int &blockLightP, int &skyLightP) +{ + // 4J Stu - Needs updated to work with higher worlds, should still work with non-optimised version below + //int xs = x1 - x0; + //int ys = y1 - y0; + //int zs = z1 - z0; + //if (xs * ys * zs == LevelChunk::BLOCKS_LENGTH) + //{ + // byteArray blockData = byteArray(data->data + blocksP, Level::CHUNK_TILE_COUNT); + // chunk->getBlockData(blockData); + // blocksP += blockData.length; + + // byteArray dataData = byteArray(data->data + dataP, 16384); + // chunk->getBlockLightData(dataData); + // dataP += dataData.length; + + // byteArray blockLightData = byteArray(data->data + blockLightP, 16384); + // chunk->getBlockLightData(blockLightData); + // blockLightP += blockLightData.length; + + // byteArray skyLightData = byteArray(data->data + skyLightP, 16384); + // chunk->getSkyLightData(skyLightData); + // skyLightP += skyLightData.length; + // return; + //} + + bool bHasLower, bHasUpper; + bHasLower = bHasUpper = false; + int lowerY0, lowerY1, upperY0, upperY1; + lowerY0 = upperY0 = y0; + lowerY1 = upperY1 = y1; + + int compressedHeight = Level::COMPRESSED_CHUNK_SECTION_HEIGHT; + if(y0 < Level::COMPRESSED_CHUNK_SECTION_HEIGHT) + { + lowerY0 = y0; + lowerY1 = min(y1, compressedHeight); + bHasLower = true; + } + if(y1 >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT) + { + upperY0 = max(y0, compressedHeight) - Level::COMPRESSED_CHUNK_SECTION_HEIGHT; + upperY1 = y1 - Level::COMPRESSED_CHUNK_SECTION_HEIGHT; + bHasUpper = true; + } + + byteArray blockData = byteArray(Level::CHUNK_TILE_COUNT); + chunk->getBlockData(blockData); + for (int x = x0; x < x1; x++) + for (int z = z0; z < z1; z++) + { + if(bHasLower) + { + int slot = x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | lowerY0; + int len = lowerY1 - lowerY0; + System::arraycopy(blockData, slot, data, blocksP, len); + blocksP += len; + } + if(bHasUpper) + { + int slot = (x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | upperY0) + Level::COMPRESSED_CHUNK_SECTION_TILES; + int len = upperY1 - upperY0; + System::arraycopy(blockData, slot, data, blocksP, len); + blocksP += len; + } + } + delete blockData.data; + + byteArray dataData = byteArray(Level::CHUNK_TILE_COUNT); + chunk->getDataData(dataData); + for (int x = x0; x < x1; x++) + for (int z = z0; z < z1; z++) + { + if(bHasLower) + { + int slot = (x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | lowerY0) >> 1; + int len = (lowerY1 - lowerY0) / 2; + System::arraycopy(dataData, slot, data, dataP, len); + dataP += len; + } + if(bHasUpper) + { + int slot = ((x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | upperY0) + Level::COMPRESSED_CHUNK_SECTION_TILES) >> 1; + int len = (upperY1 - upperY0) / 2; + System::arraycopy(dataData, slot, data, dataP, len); + dataP += len; + } + } + delete dataData.data; + + // 4J Stu - Allow ignoring light data + if(blockLightP > -1) + { + byteArray blockLightData = byteArray(Level::HALF_CHUNK_TILE_COUNT); + chunk->getBlockLightData(blockLightData); + for (int x = x0; x < x1; x++) + for (int z = z0; z < z1; z++) + { + if(bHasLower) + { + int slot = (x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | lowerY0) >> 1; + int len = (lowerY1 - lowerY0) / 2; + System::arraycopy(blockLightData, slot, data, blockLightP, len); + blockLightP += len; + } + if(bHasUpper) + { + int slot = ((x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | upperY0) >> 1) + (Level::COMPRESSED_CHUNK_SECTION_TILES/2); + int len = (upperY1 - upperY0) / 2; + System::arraycopy(blockLightData, slot, data, blockLightP, len); + blockLightP += len; + } + } + delete blockLightData.data; + } + + + // 4J Stu - Allow ignoring light data + if(skyLightP > -1) + { + byteArray skyLightData = byteArray(Level::HALF_CHUNK_TILE_COUNT); + chunk->getSkyLightData(skyLightData); + for (int x = x0; x < x1; x++) + for (int z = z0; z < z1; z++) + { + if(bHasLower) + { + int slot = (x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | lowerY0) >> 1; + int len = (lowerY1 - lowerY0) / 2; + System::arraycopy(skyLightData, slot, data, skyLightP, len); + skyLightP += len; + } + if(bHasUpper) + { + int slot = ((x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | upperY0) >> 1) + (Level::COMPRESSED_CHUNK_SECTION_TILES/2); + int len = (upperY1 - upperY0) / 2; + System::arraycopy(skyLightData, slot, data, skyLightP, len); + skyLightP += len; + } + } + delete skyLightData.data; + } + + return; +} + +void ConsoleSchematicFile::setBlocksAndData(LevelChunk *chunk, byteArray blockData, byteArray dataData, byteArray inputData, int x0, int y0, int z0, int x1, int y1, int z1, int &blocksP, int &dataP, int &blockLightP, int &skyLightP) +{ + bool bHasLower, bHasUpper; + bHasLower = bHasUpper = false; + int lowerY0, lowerY1, upperY0, upperY1; + lowerY0 = upperY0 = y0; + lowerY1 = upperY1 = y1; + + int compressedHeight = Level::COMPRESSED_CHUNK_SECTION_HEIGHT; + if(y0 < Level::COMPRESSED_CHUNK_SECTION_HEIGHT) + { + lowerY0 = y0; + lowerY1 = min(y1, compressedHeight); + bHasLower = true; + } + if(y1 >= Level::COMPRESSED_CHUNK_SECTION_HEIGHT) + { + upperY0 = max(y0, compressedHeight) - Level::COMPRESSED_CHUNK_SECTION_HEIGHT; + upperY1 = y1 - Level::COMPRESSED_CHUNK_SECTION_HEIGHT; + bHasUpper = true; + } + PIXBeginNamedEvent(0,"Applying block data"); + for (int x = x0; x < x1; x++) + for (int z = z0; z < z1; z++) + { + if(bHasLower) + { + int slot = x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | lowerY0; + int len = lowerY1 - lowerY0; + System::arraycopy(inputData, blocksP, &blockData, slot, len); + blocksP += len; + } + if(bHasUpper) + { + int slot = (x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | upperY0) + Level::COMPRESSED_CHUNK_SECTION_TILES; + int len = upperY1 - upperY0; + System::arraycopy(inputData, blocksP, &blockData, slot, len); + blocksP += len; + } + } + PIXEndNamedEvent(); + + PIXBeginNamedEvent(0,"Applying Data data"); + for (int x = x0; x < x1; x++) + for (int z = z0; z < z1; z++) + { + if(bHasLower) + { + int slot = (x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | lowerY0) >> 1; + int len = (lowerY1 - lowerY0) / 2; + System::arraycopy(inputData, dataP, &dataData, slot, len); + dataP += len; + } + if(bHasUpper) + { + int slot = ((x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | upperY0) + Level::COMPRESSED_CHUNK_SECTION_TILES) >> 1; + int len = (upperY1 - upperY0) / 2; + System::arraycopy(inputData, dataP, &dataData, slot, len); + dataP += len; + } + } + PIXEndNamedEvent(); + // 4J Stu - Allow ignoring light data + if(blockLightP > -1) + { + byteArray blockLightData = byteArray(Level::HALF_CHUNK_TILE_COUNT); + chunk->getBlockLightData(blockLightData); + for (int x = x0; x < x1; x++) + for (int z = z0; z < z1; z++) + { + if(bHasLower) + { + int slot = (x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | lowerY0) >> 1; + int len = (lowerY1 - lowerY0) / 2; + System::arraycopy(inputData, blockLightP, &blockLightData, slot, len); + blockLightP += len; + } + if(bHasUpper) + { + int slot = ( (x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | upperY0) >> 1) + (Level::COMPRESSED_CHUNK_SECTION_TILES/2); + int len = (upperY1 - upperY0) / 2; + System::arraycopy(inputData, blockLightP, &blockLightData, slot, len); + blockLightP += len; + } + } + chunk->setBlockLightData(blockLightData); + delete blockLightData.data; + } + + // 4J Stu - Allow ignoring light data + if(skyLightP > -1) + { + byteArray skyLightData = byteArray(Level::HALF_CHUNK_TILE_COUNT); + chunk->getSkyLightData(skyLightData); + for (int x = x0; x < x1; x++) + for (int z = z0; z < z1; z++) + { + if(bHasLower) + { + int slot = (x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | lowerY0) >> 1; + int len = (lowerY1 - lowerY0) / 2; + System::arraycopy(inputData, skyLightP, &skyLightData, slot, len); + skyLightP += len; + } + if(bHasUpper) + { + int slot = (x << Level::genDepthBitsPlusFour | z << Level::genDepthBits | upperY0) + (Level::COMPRESSED_CHUNK_SECTION_TILES/2); + int len = (upperY1 - upperY0) / 2; + System::arraycopy(inputData, skyLightP, &skyLightData, slot, len); + skyLightP += len; + } + } + chunk->setSkyLightData(skyLightData); + delete skyLightData.data; + } +} + +vector > *ConsoleSchematicFile::getTileEntitiesInRegion(LevelChunk *chunk, int x0, int y0, int z0, int x1, int y1, int z1) +{ + vector > *result = new vector >; + for (AUTO_VAR(it, chunk->tileEntities.begin()); it != chunk->tileEntities.end(); ++it) + { + shared_ptr te = it->second; + if (te->x >= x0 && te->y >= y0 && te->z >= z0 && te->x < x1 && te->y < y1 && te->z < z1) + { + result->push_back(te); + } + } + return result; +} diff --git a/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.h b/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.h new file mode 100644 index 00000000..f37a6058 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.h @@ -0,0 +1,90 @@ +#pragma once +using namespace std; + +#define XBOX_SCHEMATIC_ORIGINAL_VERSION 1 +#define XBOX_SCHEMATIC_CURRENT_VERSION 2 + +#include "..\..\..\Minecraft.World\ArrayWithLength.h" + +class Level; +class DataOutputStream; +class DataInputStream; +class TileEntity; +class LevelChunk; +class AABB; +class Vec3; + +class ConsoleSchematicFile +{ +public: + enum ESchematicRotation + { + eSchematicRot_0, + eSchematicRot_90, + eSchematicRot_180, + eSchematicRot_270 + }; +private: + int m_refCount; + +public: + void incrementRefCount() { ++m_refCount; } + void decrementRefCount() { --m_refCount; } + bool shouldDelete() { return m_refCount <= 0; } + + typedef struct _XboxSchematicInitParam + { + wchar_t name[64]; + int startX; + int startY; + int startZ; + int endX; + int endY; + int endZ; + bool bSaveMobs; + + Compression::ECompressionTypes compressionType; + + _XboxSchematicInitParam() + { + ZeroMemory(name,64*(sizeof(wchar_t))); + startX = startY = startZ = endX = endY = endZ = 0; + bSaveMobs = false; + compressionType = Compression::eCompressionType_None; + } + } XboxSchematicInitParam; +private: + int m_xSize, m_ySize, m_zSize; + vector > m_tileEntities; + vector< pair > m_entities; + +public: + byteArray m_data; + +public: + ConsoleSchematicFile(); + ~ConsoleSchematicFile(); + + int getXSize() { return m_xSize; } + int getYSize() { return m_ySize; } + int getZSize() { return m_zSize; } + + void save(DataOutputStream *dos); + void load(DataInputStream *dis); + + __int64 applyBlocksAndData(LevelChunk *chunk, AABB *chunkBox, AABB *destinationBox, ESchematicRotation rot); + __int64 applyLighting(LevelChunk *chunk, AABB *chunkBox, AABB *destinationBox, ESchematicRotation rot); + void applyTileEntities(LevelChunk *chunk, AABB *chunkBox, AABB *destinationBox, ESchematicRotation rot); + + static void generateSchematicFile(DataOutputStream *dos, Level *level, int xStart, int yStart, int zStart, int xEnd, int yEnd, int zEnd, bool bSaveMobs, Compression::ECompressionTypes); + static void setBlocksAndData(LevelChunk *chunk, byteArray blockData, byteArray dataData, byteArray data, int x0, int y0, int z0, int x1, int y1, int z1, int &blocksP, int &dataP, int &blockLightP, int &skyLightP); +private: + void save_tags(DataOutputStream *dos); + void load_tags(DataInputStream *dis); + + static void getBlocksAndData(LevelChunk *chunk, byteArray *data, int x0, int y0, int z0, int x1, int y1, int z1, int &blocksP, int &dataP, int &blockLightP, int &skyLightP); + static vector > *getTileEntitiesInRegion(LevelChunk *chunk, int x0, int y0, int z0, int x1, int y1, int z1); + + void chunkCoordToSchematicCoord(AABB *destinationBox, int chunkX, int chunkZ, ESchematicRotation rot, int &schematicX, int &schematicZ); + void schematicCoordToChunkCoord(AABB *destinationBox, double schematicX, double schematicZ, ESchematicRotation rot, double &chunkX, double &chunkZ); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/GameRule.cpp b/Minecraft.Client/Common/GameRules/GameRule.cpp new file mode 100644 index 00000000..34d6196c --- /dev/null +++ b/Minecraft.Client/Common/GameRules/GameRule.cpp @@ -0,0 +1,97 @@ +#include "stdafx.h" +#include "ConsoleGameRules.h" + +GameRule::GameRule(GameRuleDefinition *definition, Connection *connection) +{ + m_definition = definition; + m_connection = connection; +} + +GameRule::~GameRule() +{ + for(AUTO_VAR(it, m_parameters.begin()); it != m_parameters.end(); ++it) + { + if(it->second.isPointer) + { + delete it->second.gr; + } + } +} + +GameRule::ValueType GameRule::getParameter(const wstring ¶meterName) +{ + if(m_parameters.find(parameterName) == m_parameters.end()) + { +#ifndef _CONTENT_PACKAGE + wprintf(L"WARNING: Parameter %ls was not set before being fetched\n", parameterName.c_str()); + __debugbreak(); +#endif + } + return m_parameters[parameterName]; +} + +void GameRule::setParameter(const wstring ¶meterName,ValueType value) +{ + if(m_parameters.find(parameterName) == m_parameters.end()) + { +#ifndef _CONTENT_PACKAGE + wprintf(L"Adding parameter %ls to GameRule\n", parameterName.c_str()); +#endif + } + else + { +#ifndef _CONTENT_PACKAGE + wprintf(L"Setting parameter %ls for GameRule\n", parameterName.c_str()); +#endif + } + m_parameters[parameterName] = value; +} + +GameRuleDefinition *GameRule::getGameRuleDefinition() +{ + return m_definition; +} + +void GameRule::onUseTile(int tileId, int x, int y, int z) { m_definition->onUseTile(this,tileId,x,y,z); } +void GameRule::onCollectItem(shared_ptr item) { m_definition->onCollectItem(this,item); } + +void GameRule::write(DataOutputStream *dos) +{ + // Find required parameters. + dos->writeInt(m_parameters.size()); + for (AUTO_VAR(it, m_parameters.begin()); it != m_parameters.end(); it++) + { + wstring pName = (*it).first; + ValueType vType = (*it).second; + + dos->writeUTF( (*it).first ); + dos->writeBoolean( vType.isPointer ); + + if (vType.isPointer) + vType.gr->write(dos); + else + dos->writeLong( vType.i64 ); + } +} + +void GameRule::read(DataInputStream *dis) +{ + int savedParams = dis->readInt(); + for (int i = 0; i < savedParams; i++) + { + wstring pNames = dis->readUTF(); + + ValueType vType = getParameter(pNames); + + if (dis->readBoolean()) + { + vType.gr->read(dis); + } + else + { + vType.isPointer = false; + vType.i64 = dis->readLong(); + setParameter(pNames, vType); + } + } +} diff --git a/Minecraft.Client/Common/GameRules/GameRule.h b/Minecraft.Client/Common/GameRules/GameRule.h new file mode 100644 index 00000000..bdc2ceff --- /dev/null +++ b/Minecraft.Client/Common/GameRules/GameRule.h @@ -0,0 +1,62 @@ +#pragma once +using namespace std; + +#include + +class CompoundTag; +class GameRuleDefinition; +class Connection; + +// A game rule maintains the state for one particular definition +class GameRule +{ +public: + typedef struct _ValueType + { + union{ + __int64 i64; + int i; + char c; + bool b; + float f; + double d; + GameRule *gr; + }; + bool isPointer; + + _ValueType() + { + i64 = 0; + isPointer = false; + } + } ValueType; + +private: + GameRuleDefinition *m_definition; + Connection *m_connection; + +public: + typedef unordered_map stringValueMapType; + stringValueMapType m_parameters; // These are the members of this rule that maintain it's state + +public: + GameRule(GameRuleDefinition *definition, Connection *connection = NULL); + virtual ~GameRule(); + + Connection *getConnection() { return m_connection; } + + ValueType getParameter(const wstring ¶meterName); + void setParameter(const wstring ¶meterName,ValueType value); + GameRuleDefinition *getGameRuleDefinition(); + + // All the hooks go here + void onUseTile(int tileId, int x, int y, int z); + void onCollectItem(shared_ptr item); + + // 4J-JEV: For saving. + //CompoundTag *toTags(unordered_map *map); + //static GameRule *fromTags(Connection *c, CompoundTag *cTag, vector *grds); + + void write(DataOutputStream *dos); + void read(DataInputStream *dos); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/GameRuleDefinition.cpp b/Minecraft.Client/Common/GameRules/GameRuleDefinition.cpp new file mode 100644 index 00000000..b63687c2 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/GameRuleDefinition.cpp @@ -0,0 +1,151 @@ +#include "stdafx.h" +#include "..\..\WstringLookup.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "ConsoleGameRules.h" + +GameRuleDefinition::GameRuleDefinition() +{ + m_descriptionId = L""; + m_promptId = L""; + m_4JDataValue = 0; +} + +void GameRuleDefinition::write(DataOutputStream *dos) +{ + // Write EGameRuleType. + ConsoleGameRules::EGameRuleType eType = getActionType(); + assert( eType != ConsoleGameRules::eGameRuleType_Invalid ); + ConsoleGameRules::write(dos, eType); // stringID + + writeAttributes(dos, 0); + + // 4J-JEV: Get children. + vector *children = new vector(); + getChildren( children ); + + // Write children. + dos->writeInt( children->size() ); + for (AUTO_VAR(it, children->begin()); it != children->end(); it++) + (*it)->write(dos); +} + +void GameRuleDefinition::writeAttributes(DataOutputStream *dos, UINT numAttributes) +{ + dos->writeInt(numAttributes + 3); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_descriptionName); + dos->writeUTF(m_descriptionId); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_promptName); + dos->writeUTF(m_promptId); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_dataTag); + dos->writeUTF(_toString(m_4JDataValue)); +} + +void GameRuleDefinition::getChildren(vector *children) {} + +GameRuleDefinition *GameRuleDefinition::addChild(ConsoleGameRules::EGameRuleType ruleType) +{ +#ifndef _CONTENT_PACKAGE + wprintf(L"GameRuleDefinition: Attempted to add invalid child rule - %d\n", ruleType ); +#endif + return NULL; +} + +void GameRuleDefinition::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"descriptionName") == 0) + { + m_descriptionId = attributeValue; +#ifndef _CONTENT_PACKAGE + wprintf(L"GameRuleDefinition: Adding parameter descriptionId=%ls\n",m_descriptionId.c_str()); +#endif + } + else if(attributeName.compare(L"promptName") == 0) + { + m_promptId = attributeValue; +#ifndef _CONTENT_PACKAGE + wprintf(L"GameRuleDefinition: Adding parameter m_promptId=%ls\n",m_promptId.c_str()); +#endif + } + else if(attributeName.compare(L"dataTag") == 0) + { + m_4JDataValue = _fromString(attributeValue); + app.DebugPrintf("GameRuleDefinition: Adding parameter m_4JDataValue=%d\n",m_4JDataValue); + } + else + { +#ifndef _CONTENT_PACKAGE + wprintf(L"GameRuleDefinition: Attempted to add invalid attribute: %ls\n", attributeName.c_str()); +#endif + } +} + +void GameRuleDefinition::populateGameRule(GameRulesInstance::EGameRulesInstanceType type, GameRule *rule) +{ + GameRule::ValueType value; + value.b = false; + rule->setParameter(L"bComplete",value); +} + +bool GameRuleDefinition::getComplete(GameRule *rule) +{ + GameRule::ValueType value; + value = rule->getParameter(L"bComplete"); + return value.b; +} + +void GameRuleDefinition::setComplete(GameRule *rule, bool val) +{ + GameRule::ValueType value; + value = rule->getParameter(L"bComplete"); + value.b = val; + rule->setParameter(L"bComplete",value); +} + +vector *GameRuleDefinition::enumerate() +{ + // Get Vector. + vector *gRules; + gRules = new vector(); + gRules->push_back(this); + getChildren(gRules); + return gRules; +} + +unordered_map *GameRuleDefinition::enumerateMap() +{ + unordered_map *out + = new unordered_map(); + + int i = 0; + vector *gRules = enumerate(); + for (AUTO_VAR(it, gRules->begin()); it != gRules->end(); it++) + out->insert( pair( *it, i++ ) ); + + return out; +} + +GameRulesInstance *GameRuleDefinition::generateNewGameRulesInstance(GameRulesInstance::EGameRulesInstanceType type, LevelRuleset *rules, Connection *connection) +{ + GameRulesInstance *manager = new GameRulesInstance(rules, connection); + + rules->populateGameRule(type, manager); + + return manager; +} + +wstring GameRuleDefinition::generateDescriptionString(ConsoleGameRules::EGameRuleType defType, const wstring &description, void *data, int dataLength) +{ + wstring formatted = description; + switch(defType) + { + case ConsoleGameRules::eGameRuleType_CompleteAllRule: + formatted = CompleteAllRuleDefinition::generateDescriptionString(description,data,dataLength); + break; + default: + break; + }; + return formatted; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/GameRuleDefinition.h b/Minecraft.Client/Common/GameRules/GameRuleDefinition.h new file mode 100644 index 00000000..afec8fbc --- /dev/null +++ b/Minecraft.Client/Common/GameRules/GameRuleDefinition.h @@ -0,0 +1,66 @@ +#pragma once +using namespace std; +#include +#include + +#include "..\..\..\Minecraft.World\ItemInstance.h" +#include "ConsoleGameRulesConstants.h" + +#include "GameRulesInstance.h" + +class GameRule; +class LevelRuleset; +class Player; +class WstringLookup; + +class GameRuleDefinition +{ +private: + // Owner type defines who this rule applies to + GameRulesInstance::EGameRulesInstanceType m_ownerType; + +protected: + // These attributes should map to those in the XSD GameRuleType + wstring m_descriptionId; + wstring m_promptId; + int m_4JDataValue; + +public: + GameRuleDefinition(); + + virtual ConsoleGameRules::EGameRuleType getActionType() = 0; + + void setOwnerType(GameRulesInstance::EGameRulesInstanceType ownerType) { m_ownerType = ownerType;} + + virtual void write(DataOutputStream *); + + virtual void writeAttributes(DataOutputStream *dos, UINT numAttributes); + virtual void getChildren(vector *); + + virtual GameRuleDefinition *addChild(ConsoleGameRules::EGameRuleType ruleType); + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + virtual void populateGameRule(GameRulesInstance::EGameRulesInstanceType type, GameRule *rule); + + bool getComplete(GameRule *rule); + void setComplete(GameRule *rule, bool val); + + virtual int getGoal() { return 0; } + virtual int getProgress(GameRule *rule) { return 0; } + + virtual int getIcon() { return -1; } + virtual int getAuxValue() { return 0; } + + // Here we should have functions for all the hooks, with a GameRule* as the first parameter + virtual bool onUseTile(GameRule *rule, int tileId, int x, int y, int z) { return false; } + virtual bool onCollectItem(GameRule *rule, shared_ptr item) { return false; } + virtual void postProcessPlayer(shared_ptr player) { } + + vector *enumerate(); + unordered_map *enumerateMap(); + + // Static functions + static GameRulesInstance *generateNewGameRulesInstance(GameRulesInstance::EGameRulesInstanceType type, LevelRuleset *rules, Connection *connection); + static wstring generateDescriptionString(ConsoleGameRules::EGameRuleType defType, const wstring &description, void *data = NULL, int dataLength = 0); + +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/GameRuleManager.cpp b/Minecraft.Client/Common/GameRules/GameRuleManager.cpp new file mode 100644 index 00000000..0c6a7804 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/GameRuleManager.cpp @@ -0,0 +1,767 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\compression.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\File.h" +#include "..\..\..\Minecraft.World\compression.h" +#include "..\DLC\DLCPack.h" +#include "..\DLC\DLCLocalisationFile.h" +#include "..\DLC\DLCGameRulesFile.h" +#include "..\DLC\DLCGameRules.h" +#include "..\DLC\DLCGameRulesHeader.h" +#include "..\..\StringTable.h" +#include "ConsoleGameRules.h" +#include "GameRuleManager.h" + +WCHAR *GameRuleManager::wchTagNameA[] = +{ + L"", // eGameRuleType_Root + L"MapOptions", // eGameRuleType_LevelGenerationOptions + L"ApplySchematic", // eGameRuleType_ApplySchematic + L"GenerateStructure", // eGameRuleType_GenerateStructure + L"GenerateBox", // eGameRuleType_GenerateBox + L"PlaceBlock", // eGameRuleType_PlaceBlock + L"PlaceContainer", // eGameRuleType_PlaceContainer + L"PlaceSpawner", // eGameRuleType_PlaceSpawner + L"BiomeOverride", // eGameRuleType_BiomeOverride + L"StartFeature", // eGameRuleType_StartFeature + L"AddItem", // eGameRuleType_AddItem + L"AddEnchantment", // eGameRuleType_AddEnchantment + L"LevelRules", // eGameRuleType_LevelRules + L"NamedArea", // eGameRuleType_NamedArea + L"UseTile", // eGameRuleType_UseTileRule + L"CollectItem", // eGameRuleType_CollectItemRule + L"CompleteAll", // eGameRuleType_CompleteAllRule + L"UpdatePlayer", // eGameRuleType_UpdatePlayerRule +}; + +WCHAR *GameRuleManager::wchAttrNameA[] = +{ + L"descriptionName", // eGameRuleAttr_descriptionName + L"promptName", // eGameRuleAttr_promptName + L"dataTag", // eGameRuleAttr_dataTag + L"enchantmentId", // eGameRuleAttr_enchantmentId + L"enchantmentLevel", // eGameRuleAttr_enchantmentLevel + L"itemId", // eGameRuleAttr_itemId + L"quantity", // eGameRuleAttr_quantity + L"auxValue", // eGameRuleAttr_auxValue + L"slot", // eGameRuleAttr_slot + L"name", // eGameRuleAttr_name + L"food", // eGameRuleAttr_food + L"health", // eGameRuleAttr_health + L"tileId", // eGameRuleAttr_tileId + L"useCoords", // eGameRuleAttr_useCoords + L"seed", // eGameRuleAttr_seed + L"flatworld", // eGameRuleAttr_flatworld + L"filename", // eGameRuleAttr_filename + L"rot", // eGameRuleAttr_rot + L"data", // eGameRuleAttr_data + L"block", // eGameRuleAttr_block + L"entity", // eGameRuleAttr_entity + L"facing", // eGameRuleAttr_facing + L"edgeTile", // eGameRuleAttr_edgeTile + L"fillTile", // eGameRuleAttr_fillTile + L"skipAir", // eGameRuleAttr_skipAir + L"x", // eGameRuleAttr_x + L"x0", // eGameRuleAttr_x0 + L"x1", // eGameRuleAttr_x1 + L"y", // eGameRuleAttr_y + L"y0", // eGameRuleAttr_y0 + L"y1", // eGameRuleAttr_y1 + L"z", // eGameRuleAttr_z + L"z0", // eGameRuleAttr_z0 + L"z1", // eGameRuleAttr_z1 + L"chunkX", // eGameRuleAttr_chunkX + L"chunkZ", // eGameRuleAttr_chunkZ + L"yRot", // eGameRuleAttr_yRot + L"spawnX", // eGameRuleAttr_spawnX + L"spawnY", // eGameRuleAttr_spawnY + L"spawnZ", // eGameRuleAttr_spawnZ + L"orientation", + L"dimension", + L"topTileId", // eGameRuleAttr_topTileId + L"biomeId", // eGameRuleAttr_biomeId + L"feature", // eGameRuleAttr_feature +}; + +GameRuleManager::GameRuleManager() +{ + m_currentGameRuleDefinitions = NULL; + m_currentLevelGenerationOptions = NULL; +} + +void GameRuleManager::loadGameRules(DLCPack *pack) +{ + StringTable *strings = NULL; + + if(pack->doesPackContainFile(DLCManager::e_DLCType_LocalisationData,L"languages.loc")) + { + DLCLocalisationFile *localisationFile = (DLCLocalisationFile *)pack->getFile(DLCManager::e_DLCType_LocalisationData, L"languages.loc"); + strings = localisationFile->getStringTable(); + } + + int gameRulesCount = pack->getDLCItemsCount(DLCManager::e_DLCType_GameRulesHeader); + for(int i = 0; i < gameRulesCount; ++i) + { + DLCGameRulesHeader *dlcHeader = (DLCGameRulesHeader *)pack->getFile(DLCManager::e_DLCType_GameRulesHeader, i); + DWORD dSize; + byte *dData = dlcHeader->getData(dSize); + + LevelGenerationOptions *createdLevelGenerationOptions = new LevelGenerationOptions(); + // = loadGameRules(dData, dSize); //, strings); + + createdLevelGenerationOptions->setGrSource( dlcHeader ); + + readRuleFile(createdLevelGenerationOptions, dData, dSize, strings); + + createdLevelGenerationOptions->setSrc( LevelGenerationOptions::eSrc_fromDLC ); + + + //createdLevelGenerationOptions->setSrc( LevelGenerationOptions::eSrc_fromDLC ); + dlcHeader->lgo = createdLevelGenerationOptions; + } + + gameRulesCount = pack->getDLCItemsCount(DLCManager::e_DLCType_GameRules); + for (int i = 0; i < gameRulesCount; ++i) + { + DLCGameRulesFile *dlcFile = (DLCGameRulesFile *)pack->getFile(DLCManager::e_DLCType_GameRules, i); + + DWORD dSize; + byte *dData = dlcFile->getData(dSize); + + LevelGenerationOptions *createdLevelGenerationOptions = new LevelGenerationOptions(); + // = loadGameRules(dData, dSize); //, strings); + + createdLevelGenerationOptions->setGrSource( new JustGrSource() ); + readRuleFile(createdLevelGenerationOptions, dData, dSize, strings); + + createdLevelGenerationOptions->setSrc( LevelGenerationOptions::eSrc_tutorial ); + + //createdLevelGenerationOptions->set_DLCGameRulesFile( dlcFile ); + + createdLevelGenerationOptions->setLoadedData(); + } +} + +LevelGenerationOptions *GameRuleManager::loadGameRules(byte *dIn, UINT dSize) +{ + LevelGenerationOptions *lgo = new LevelGenerationOptions(); + lgo->setGrSource( new JustGrSource() ); + lgo->setSrc( LevelGenerationOptions::eSrc_fromSave ); + loadGameRules(lgo, dIn, dSize); + lgo->setLoadedData(); + return lgo; +} + +// 4J-JEV: Reverse of saveGameRules. +void GameRuleManager::loadGameRules(LevelGenerationOptions *lgo, byte *dIn, UINT dSize) +{ + app.DebugPrintf("GameRuleManager::LoadingGameRules:\n"); + + ByteArrayInputStream bais( byteArray(dIn,dSize) ); + DataInputStream dis(&bais); + + // Read file header. + + //dis.readInt(); // File Size + + short version = dis.readShort(); + assert( 0x1 == version ); + app.DebugPrintf("\tversion=%d.\n", version); + + for (int i = 0; i < 8; i++) dis.readByte(); + + BYTE compression_type = dis.readByte(); + + app.DebugPrintf("\tcompressionType=%d.\n", compression_type); + + UINT compr_len, decomp_len; + compr_len = dis.readInt(); + decomp_len = dis.readInt(); + + app.DebugPrintf("\tcompr_len=%d.\n\tdecomp_len=%d.\n", compr_len, decomp_len); + + + // Decompress File Body + + byteArray content(new BYTE[decomp_len], decomp_len), + compr_content(new BYTE[compr_len], compr_len); + dis.read(compr_content); + + Compression::getCompression()->SetDecompressionType( (Compression::ECompressionTypes)compression_type ); + Compression::getCompression()->DecompressLZXRLE( content.data, &content.length, + compr_content.data, compr_content.length); + Compression::getCompression()->SetDecompressionType( SAVE_FILE_PLATFORM_LOCAL ); + + dis.close(); + bais.close(); + + delete [] compr_content.data; + + ByteArrayInputStream bais2( content ); + DataInputStream dis2( &bais2 ); + + // Read StringTable. + byteArray bStringTable; + bStringTable.length = dis2.readInt(); + bStringTable.data = new BYTE[ bStringTable.length ]; + dis2.read(bStringTable); + StringTable *strings = new StringTable(bStringTable.data, bStringTable.length); + + // Read RuleFile. + byteArray bRuleFile; + bRuleFile.length = content.length - bStringTable.length; + bRuleFile.data = new BYTE[ bRuleFile.length ]; + dis2.read(bRuleFile); + + // 4J-JEV: I don't believe that the path-name is ever used. + //DLCGameRulesFile *dlcgr = new DLCGameRulesFile(L"__PLACEHOLDER__"); + //dlcgr->addData(bRuleFile.data,bRuleFile.length); + + if (readRuleFile(lgo, bRuleFile.data, bRuleFile.length, strings)) + { + // Set current gen options and ruleset. + //createdLevelGenerationOptions->setFromSaveGame(true); + lgo->setSrc(LevelGenerationOptions::eSrc_fromSave); + setLevelGenerationOptions( lgo ); + //m_currentGameRuleDefinitions = lgo->getRequiredGameRules(); + } + else + { + delete lgo; + } + + //delete [] content.data; + + // Close and return. + dis2.close(); + bais2.close(); + + return ; +} + +// 4J-JEV: Reverse of loadGameRules. +void GameRuleManager::saveGameRules(byte **dOut, UINT *dSize) +{ + if (m_currentGameRuleDefinitions == NULL && + m_currentLevelGenerationOptions == NULL) + { + app.DebugPrintf("GameRuleManager:: Nothing here to save."); + *dOut = NULL; + *dSize = 0; + return; + } + + app.DebugPrintf("GameRuleManager::saveGameRules:\n"); + + // Initialise output stream. + ByteArrayOutputStream baos; + DataOutputStream dos(&baos); + + // Write header. + + // VERSION NUMBER + dos.writeShort( 0x1 ); // version_number + + // Write 8 bytes of empty space in case we need them later. + // Mainly useful for the ones we save embedded in game saves. + for (UINT i = 0; i < 8; i++) + dos.writeByte(0x0); + + dos.writeByte(APPROPRIATE_COMPRESSION_TYPE); // m_compressionType + + // -- START COMPRESSED -- // + ByteArrayOutputStream compr_baos; + DataOutputStream compr_dos(&compr_baos); + + if (m_currentGameRuleDefinitions == NULL) + { + compr_dos.writeInt( 0 ); // numStrings for StringTable + compr_dos.writeInt( version_number ); + compr_dos.writeByte(Compression::eCompressionType_None); // compression type + for (int i=0; i<2; i++) compr_dos.writeByte(0x0); // Padding. + compr_dos.writeInt( 0 ); // StringLookup.length + compr_dos.writeInt( 0 ); // SchematicFiles.length + compr_dos.writeInt( 0 ); // XmlObjects.length + } + else + { + StringTable *st = m_currentGameRuleDefinitions->getStringTable(); + + if (st == NULL) + { + app.DebugPrintf("GameRuleManager::saveGameRules: StringTable == NULL!"); + } + else + { + // Write string table. + byteArray stba; + m_currentGameRuleDefinitions->getStringTable()->getData(&stba.data, &stba.length); + compr_dos.writeInt( stba.length ); + compr_dos.write( stba ); + + // Write game rule file to second + // buffer and generate string lookup. + writeRuleFile(&compr_dos); + } + } + + // Compress compr_dos and write to dos. + byteArray compr_ba(new BYTE[ compr_baos.buf.length ], compr_baos.buf.length); + Compression::getCompression()->CompressLZXRLE( compr_ba.data, &compr_ba.length, + compr_baos.buf.data, compr_baos.buf.length ); + + app.DebugPrintf("\tcompr_ba.length=%d.\n\tcompr_baos.buf.length=%d.\n", + compr_ba.length, compr_baos.buf.length ); + + dos.writeInt( compr_ba.length ); // Write length + dos.writeInt( compr_baos.buf.length ); + dos.write(compr_ba); + + delete [] compr_ba.data; + + compr_dos.close(); + compr_baos.close(); + // -- END COMPRESSED -- // + + // return + *dSize = baos.buf.length; + *dOut = baos.buf.data; + + baos.buf.data = NULL; + + dos.close(); baos.close(); +} + +// 4J-JEV: Reverse of readRuleFile. +void GameRuleManager::writeRuleFile(DataOutputStream *dos) +{ + // Write Header + dos->writeShort(version_number); // Version number. + dos->writeByte(Compression::eCompressionType_None); // compression type + for (int i=0; i<8; i++) dos->writeBoolean(false); // Padding. + + // Write string lookup. + int numStrings = ConsoleGameRules::eGameRuleType_Count + ConsoleGameRules::eGameRuleAttr_Count; + dos->writeInt(numStrings); + for (int i = 0; i < ConsoleGameRules::eGameRuleType_Count; i++) dos->writeUTF( wchTagNameA[i] ); + for (int i = 0; i < ConsoleGameRules::eGameRuleAttr_Count; i++) dos->writeUTF( wchAttrNameA[i] ); + + // Write schematic files. + unordered_map *files; + files = getLevelGenerationOptions()->getUnfinishedSchematicFiles(); + dos->writeInt( files->size() ); + for (AUTO_VAR(it, files->begin()); it != files->end(); it++) + { + wstring filename = it->first; + ConsoleSchematicFile *file = it->second; + + ByteArrayOutputStream fileBaos; + DataOutputStream fileDos(&fileBaos); + file->save(&fileDos); + + dos->writeUTF(filename); + //dos->writeInt(file->m_data.length); + dos->writeInt(fileBaos.buf.length); + dos->write((byteArray)fileBaos.buf); + + fileDos.close(); fileBaos.close(); + } + + // Write xml objects. + dos->writeInt( 2 ); // numChildren + m_currentLevelGenerationOptions->write(dos); + m_currentGameRuleDefinitions->write(dos); +} + +bool GameRuleManager::readRuleFile(LevelGenerationOptions *lgo, byte *dIn, UINT dSize, StringTable *strings) //(DLCGameRulesFile *dlcFile, StringTable *strings) +{ + bool levelGenAdded = false; + bool gameRulesAdded = false; + LevelGenerationOptions *levelGenerator = lgo;//new LevelGenerationOptions(); + LevelRuleset *gameRules = new LevelRuleset(); + + //DWORD dwLen = 0; + //PBYTE pbData = dlcFile->getData(dwLen); + //byteArray data(pbData,dwLen); + + byteArray data(dIn, dSize); + ByteArrayInputStream bais(data); + DataInputStream dis(&bais); + + // Read File. + + // version_number + __int64 version = dis.readShort(); + unsigned char compressionType = 0; + if(version == 0) + { + for (int i = 0; i < 14; i++) dis.readByte(); // Read padding. + } + else + { + compressionType = dis.readByte(); + + // Read the spare bytes we inserted for future use + for(int i = 0; i < 8; ++i) dis.readBoolean(); + } + + ByteArrayInputStream *contentBais = NULL; + DataInputStream *contentDis = NULL; + + if(compressionType == Compression::eCompressionType_None) + { + // No compression + // No need to read buffer size, as we can read the stream as it is; + app.DebugPrintf("De-compressing game rules with: None\n"); + contentDis = &dis; + } + else + { + unsigned int uncompressedSize = dis.readInt(); + unsigned int compressedSize = dis.readInt(); + byteArray compressedBuffer(compressedSize); + dis.read(compressedBuffer); + + byteArray decompressedBuffer = byteArray(uncompressedSize); + + switch(compressionType) + { + case Compression::eCompressionType_None: + memcpy(decompressedBuffer.data, compressedBuffer.data, uncompressedSize); + break; + + case Compression::eCompressionType_RLE: + app.DebugPrintf("De-compressing game rules with: RLE\n"); + Compression::getCompression()->Decompress( decompressedBuffer.data, &decompressedBuffer.length, compressedBuffer.data, compressedSize); + break; + + default: + app.DebugPrintf("De-compressing game rules."); +#ifndef _CONTENT_PACKAGE + assert( compressionType == APPROPRIATE_COMPRESSION_TYPE ); +#endif + // 4J-JEV: DecompressLZXRLE uses the correct platform specific compression type. (need to assert that the data is compressed with it though). + Compression::getCompression()->DecompressLZXRLE(decompressedBuffer.data, &decompressedBuffer.length, compressedBuffer.data, compressedSize); + break; +/* 4J-JEV: + Each platform has only 1 method of compression, 'compression.h' file deals with it. + + case Compression::eCompressionType_LZXRLE: + app.DebugPrintf("De-compressing game rules with: LZX+RLE\n"); + Compression::getCompression()->DecompressLZXRLE( decompressedBuffer.data, &uncompressedSize, compressedBuffer.data, compressedSize); + break; + default: + app.DebugPrintf("Invalid compression type %d found\n", compressionType); + __debugbreak(); + + delete [] compressedBuffer.data; delete [] decompressedBuffer.data; + dis.close(); bais.reset(); + + if(!gameRulesAdded) delete gameRules; + return false; + */ + }; + + delete [] compressedBuffer.data; + + contentBais = new ByteArrayInputStream(decompressedBuffer); + contentDis = new DataInputStream(contentBais); + } + + // string lookup. + UINT numStrings = contentDis->readInt(); + vector tagsAndAtts; + for (UINT i = 0; i < numStrings; i++) + tagsAndAtts.push_back( contentDis->readUTF() ); + + unordered_map tagIdMap; + for(int type = (int)ConsoleGameRules::eGameRuleType_Root; type < (int)ConsoleGameRules::eGameRuleType_Count; ++type) + { + for(UINT i = 0; i < numStrings; ++i) + { + if(tagsAndAtts[i].compare(wchTagNameA[type]) == 0) + { + tagIdMap.insert( unordered_map::value_type(i, (ConsoleGameRules::EGameRuleType)type) ); + break; + } + } + } + + // 4J-JEV: TODO: As yet unused. + /* + unordered_map attrIdMap; + for(int attr = (int)ConsoleGameRules::eGameRuleAttr_descriptionName; attr < (int)ConsoleGameRules::eGameRuleAttr_Count; ++attr) + { + for (UINT i = 0; i < numStrings; i++) + { + if (tagsAndAtts[i].compare(wchAttrNameA[attr]) == 0) + { + tagIdMap.insert( unordered_map::value_type(i , (ConsoleGameRules::EGameRuleAttr)attr) ); + break; + } + } + }*/ + + // subfile + UINT numFiles = contentDis->readInt(); + for (UINT i = 0; i < numFiles; i++) + { + wstring sFilename = contentDis->readUTF(); + int length = contentDis->readInt(); + byteArray ba( length ); + + contentDis->read(ba); + + levelGenerator->loadSchematicFile(sFilename, ba.data, ba.length); + + } + + LEVEL_GEN_ID lgoID = LEVEL_GEN_ID_NULL; + + // xml objects + UINT numObjects = contentDis->readInt(); + for(UINT i = 0; i < numObjects; ++i) + { + int tagId = contentDis->readInt(); + ConsoleGameRules::EGameRuleType tagVal = ConsoleGameRules::eGameRuleType_Invalid; + AUTO_VAR(it,tagIdMap.find(tagId)); + if(it != tagIdMap.end()) tagVal = it->second; + + GameRuleDefinition *rule = NULL; + + if(tagVal == ConsoleGameRules::eGameRuleType_LevelGenerationOptions) + { + rule = levelGenerator; + levelGenAdded = true; + //m_levelGenerators.addLevelGenerator(L"",levelGenerator); + lgoID = addLevelGenerationOptions(levelGenerator); + levelGenerator->loadStringTable(strings); + } + else if(tagVal == ConsoleGameRules::eGameRuleType_LevelRules) + { + rule = gameRules; + gameRulesAdded = true; + m_levelRules.addLevelRule(L"",gameRules); + levelGenerator->setRequiredGameRules(gameRules); + gameRules->loadStringTable(strings); + } + + readAttributes(contentDis, &tagsAndAtts, rule); + readChildren(contentDis, &tagsAndAtts, &tagIdMap, rule); + } + + if(compressionType != 0) + { + // Not default + contentDis->close(); + if(contentBais != NULL) delete contentBais; + delete contentDis; + } + + dis.close(); + bais.reset(); + + //if(!levelGenAdded) { delete levelGenerator; levelGenerator = NULL; } + if(!gameRulesAdded) delete gameRules; + + return true; + //return levelGenerator; +} + +LevelGenerationOptions *GameRuleManager::readHeader(DLCGameRulesHeader *grh) +{ + LevelGenerationOptions *out = + new LevelGenerationOptions(); + + + out->setSrc(LevelGenerationOptions::eSrc_fromDLC); + out->setGrSource(grh); + addLevelGenerationOptions(out); + + return out; +} + +void GameRuleManager::readAttributes(DataInputStream *dis, vector *tagsAndAtts, GameRuleDefinition *rule) +{ + int numAttrs = dis->readInt(); + for (UINT att = 0; att < numAttrs; ++att) + { + int attID = dis->readInt(); + wstring value = dis->readUTF(); + + if(rule != NULL) rule->addAttribute(tagsAndAtts->at(attID),value); + } +} + +void GameRuleManager::readChildren(DataInputStream *dis, vector *tagsAndAtts, unordered_map *tagIdMap, GameRuleDefinition *rule) +{ + int numChildren = dis->readInt(); + for(UINT child = 0; child < numChildren; ++child) + { + int tagId = dis->readInt(); + ConsoleGameRules::EGameRuleType tagVal = ConsoleGameRules::eGameRuleType_Invalid; + AUTO_VAR(it,tagIdMap->find(tagId)); + if(it != tagIdMap->end()) tagVal = it->second; + + GameRuleDefinition *childRule = NULL; + if(rule != NULL) childRule = rule->addChild(tagVal); + + readAttributes(dis,tagsAndAtts,childRule); + readChildren(dis,tagsAndAtts,tagIdMap,childRule); + } +} + +void GameRuleManager::processSchematics(LevelChunk *levelChunk) +{ + if(getLevelGenerationOptions() != NULL) + { + LevelGenerationOptions *levelGenOptions = getLevelGenerationOptions(); + levelGenOptions->processSchematics(levelChunk); + } +} + +void GameRuleManager::processSchematicsLighting(LevelChunk *levelChunk) +{ + if(getLevelGenerationOptions() != NULL) + { + LevelGenerationOptions *levelGenOptions = getLevelGenerationOptions(); + levelGenOptions->processSchematicsLighting(levelChunk); + } +} + +void GameRuleManager::loadDefaultGameRules() +{ +#ifdef _XBOX +#ifdef _TU_BUILD + wstring fileRoot = L"UPDATE:\\res\\GameRules\\Tutorial.pck"; +#else + wstring fileRoot = L"GAME:\\res\\TitleUpdate\\GameRules\\Tutorial.pck"; +#endif + File packedTutorialFile(fileRoot); + if(loadGameRulesPack(&packedTutorialFile)) + { + m_levelGenerators.getLevelGenerators()->at(0)->setWorldName(app.GetString(IDS_PLAY_TUTORIAL)); + //m_levelGenerators.getLevelGenerators()->at(0)->setDefaultSaveName(L"Tutorial"); + m_levelGenerators.getLevelGenerators()->at(0)->setDefaultSaveName(app.GetString(IDS_TUTORIALSAVENAME)); + } + +#ifndef _CONTENT_PACKAGE + // 4J Stu - Remove these just now + //File testRulesPath(L"GAME:\\GameRules"); + //vector *packFiles = testRulesPath.listFiles(); + + //for(AUTO_VAR(it,packFiles->begin()); it != packFiles->end(); ++it) + //{ + // loadGameRulesPack(*it); + //} + //delete packFiles; +#endif + +#else // _XBOX + + wstring fpTutorial = L"Tutorial.pck"; + if(app.getArchiveFileSize(fpTutorial) >= 0) + { + DLCPack *pack = new DLCPack(L"",0xffffffff); + DWORD dwFilesProcessed = 0; + if ( app.m_dlcManager.readDLCDataFile(dwFilesProcessed,fpTutorial,pack,true) ) + { + app.m_dlcManager.addPack(pack); + m_levelGenerators.getLevelGenerators()->at(0)->setWorldName(app.GetString(IDS_PLAY_TUTORIAL)); + m_levelGenerators.getLevelGenerators()->at(0)->setDefaultSaveName(app.GetString(IDS_TUTORIALSAVENAME)); + } + else delete pack; + } + /*StringTable *strings = new StringTable(baStrings.data, baStrings.length); + LevelGenerationOptions *lgo = new LevelGenerationOptions(); + lgo->setGrSource( new JustGrSource() ); + lgo->setSrc( LevelGenerationOptions::eSrc_tutorial ); + readRuleFile(lgo, tutorial.data, tutorial.length, strings); + lgo->setLoadedData();*/ + +#endif +} + +bool GameRuleManager::loadGameRulesPack(File *path) +{ + bool success = false; +#ifdef _XBOX + if(path->exists()) + { + DLCPack *pack = new DLCPack(L"",0xffffffff); + DWORD dwFilesProcessed = 0; + if( app.m_dlcManager.readDLCDataFile(dwFilesProcessed, path->getPath(),pack)) + { + app.m_dlcManager.addPack(pack); + success = true; + } + else + { + delete pack; + } + } +#endif + return success; +} + +void GameRuleManager::setLevelGenerationOptions(LevelGenerationOptions *levelGen) +{ + m_currentGameRuleDefinitions = NULL; + m_currentLevelGenerationOptions = levelGen; + + if(m_currentLevelGenerationOptions != NULL && m_currentLevelGenerationOptions->requiresGameRules() ) + { + m_currentGameRuleDefinitions = m_currentLevelGenerationOptions->getRequiredGameRules(); + } + + if(m_currentLevelGenerationOptions != NULL) + m_currentLevelGenerationOptions->reset_start(); +} + +LPCWSTR GameRuleManager::GetGameRulesString(const wstring &key) +{ + if(m_currentGameRuleDefinitions != NULL && !key.empty() ) + { + return m_currentGameRuleDefinitions->getString(key); + } + else + { + return L""; + } +} + +LEVEL_GEN_ID GameRuleManager::addLevelGenerationOptions(LevelGenerationOptions *lgo) +{ + vector *lgs = m_levelGenerators.getLevelGenerators(); + + for (int i = 0; isize(); i++) + if (lgs->at(i) == lgo) + return i; + + lgs->push_back(lgo); + return lgs->size() - 1; +} + +void GameRuleManager::unloadCurrentGameRules() +{ + if (m_currentLevelGenerationOptions != NULL) + { + if (m_currentGameRuleDefinitions != NULL + && m_currentLevelGenerationOptions->isFromSave()) + m_levelRules.removeLevelRule( m_currentGameRuleDefinitions ); + + if (m_currentLevelGenerationOptions->isFromSave()) + { + m_levelGenerators.removeLevelGenerator( m_currentLevelGenerationOptions ); + + delete m_currentLevelGenerationOptions; + } + else if (m_currentLevelGenerationOptions->isFromDLC()) + { + m_currentLevelGenerationOptions->reset_finish(); + } + } + + m_currentGameRuleDefinitions = NULL; + m_currentLevelGenerationOptions = NULL; +} diff --git a/Minecraft.Client/Common/GameRules/GameRuleManager.h b/Minecraft.Client/Common/GameRules/GameRuleManager.h new file mode 100644 index 00000000..e9e983b8 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/GameRuleManager.h @@ -0,0 +1,80 @@ +#pragma once +using namespace std; + +#include "LevelGenerators.h" +#include "LevelRules.h" +class LevelGenerationOptions; +class RootGameRulesDefinition; +class LevelChunk; +class DLCPack; +class DLCGameRulesFile; +class DLCGameRulesHeader; +class StringTable; +class GameRuleDefinition; +class DataInputStream; +class DataOutputStream; +class WstringLookup; + +#define GAME_RULE_SAVENAME L"requiredGameRules.grf" + +// 4J-JEV: +#define LEVEL_GEN_ID int +#define LEVEL_GEN_ID_NULL 0 + +class GameRuleManager +{ +public: + static WCHAR *wchTagNameA[ConsoleGameRules::eGameRuleType_Count]; + static WCHAR *wchAttrNameA[ConsoleGameRules::eGameRuleAttr_Count]; + + static const short version_number = 2; + +private: + LevelGenerationOptions *m_currentLevelGenerationOptions; + LevelRuleset *m_currentGameRuleDefinitions; + LevelGenerators m_levelGenerators; + LevelRules m_levelRules; + +public: + GameRuleManager(); + + void loadGameRules(DLCPack *); + + LevelGenerationOptions *loadGameRules(byte *dIn, UINT dSize); + void loadGameRules(LevelGenerationOptions *lgo, byte *dIn, UINT dSize); + + void saveGameRules(byte **dOut, UINT *dSize); + +private: + LevelGenerationOptions *readHeader(DLCGameRulesHeader *grh); + + void writeRuleFile(DataOutputStream *dos); + +public: + bool readRuleFile(LevelGenerationOptions *lgo, byte *dIn, UINT dSize, StringTable *strings); //(DLCGameRulesFile *dlcFile, StringTable *strings); + +private: + void readAttributes(DataInputStream *dis, vector *tagsAndAtts, GameRuleDefinition *rule); + void readChildren(DataInputStream *dis, vector *tagsAndAtts, unordered_map *tagIdMap, GameRuleDefinition *rule); + +public: + void processSchematics(LevelChunk *levelChunk); + void processSchematicsLighting(LevelChunk *levelChunk); + void loadDefaultGameRules(); + +private: + bool loadGameRulesPack(File *path); + + LEVEL_GEN_ID addLevelGenerationOptions(LevelGenerationOptions *); + +public: + vector *getLevelGenerators() { return m_levelGenerators.getLevelGenerators(); } + void setLevelGenerationOptions(LevelGenerationOptions *levelGen); + LevelRuleset *getGameRuleDefinitions() { return m_currentGameRuleDefinitions; } + LevelGenerationOptions *getLevelGenerationOptions() { return m_currentLevelGenerationOptions; } + LPCWSTR GetGameRulesString(const wstring &key); + + // 4J-JEV: + // Properly cleans-up and unloads the current set of gameRules. + void unloadCurrentGameRules(); +}; diff --git a/Minecraft.Client/Common/GameRules/GameRulesInstance.h b/Minecraft.Client/Common/GameRules/GameRulesInstance.h new file mode 100644 index 00000000..064e086d --- /dev/null +++ b/Minecraft.Client/Common/GameRules/GameRulesInstance.h @@ -0,0 +1,24 @@ +#pragma once +using namespace std; +#include +#include "GameRule.h" + +class GameRuleDefinition; + +// The game rule manager belongs to a player/server or other object, and maintains their current state for each of +// the rules that apply to them +class GameRulesInstance : public GameRule +{ +public: + // These types are used by the GameRuleDefinition to know which rules to add to this GameRulesInstance + enum EGameRulesInstanceType + { + eGameRulesInstanceType_ServerPlayer, + eGameRulesInstanceType_Server, + eGameRulesInstanceType_Count + }; + +public: + GameRulesInstance(GameRuleDefinition *definition, Connection *connection) : GameRule(definition,connection) {} + // Functions for all the hooks should go here +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp new file mode 100644 index 00000000..717b066e --- /dev/null +++ b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp @@ -0,0 +1,514 @@ +#include "stdafx.h" + +#include + +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\Pos.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.phys.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.chunk.h" +#include "..\..\StringTable.h" +#include "LevelGenerationOptions.h" +#include "ConsoleGameRules.h" + +JustGrSource::JustGrSource() +{ + m_displayName = L"Default_DisplayName"; + m_worldName= L"Default_WorldName"; + m_defaultSaveName = L"Default_DefaultSaveName"; + m_bRequiresTexturePack = false; + m_requiredTexturePackId = 0; + m_grfPath = L"__NO_GRF_PATH__"; + m_bRequiresBaseSave = false; +} + +bool JustGrSource::requiresTexturePack() {return m_bRequiresTexturePack;} +UINT JustGrSource::getRequiredTexturePackId() {return m_requiredTexturePackId;} +wstring JustGrSource::getDefaultSaveName() {return m_defaultSaveName;} +LPCWSTR JustGrSource::getWorldName() {return m_worldName.c_str();} +LPCWSTR JustGrSource::getDisplayName() {return m_displayName.c_str();} +wstring JustGrSource::getGrfPath() {return m_grfPath;} +bool JustGrSource::requiresBaseSave() { return m_bRequiresBaseSave; }; +wstring JustGrSource::getBaseSavePath() { return m_baseSavePath; }; + +void JustGrSource::setRequiresTexturePack(bool x) {m_bRequiresTexturePack = x;} +void JustGrSource::setRequiredTexturePackId(UINT x) {m_requiredTexturePackId = x;} +void JustGrSource::setDefaultSaveName(const wstring &x) {m_defaultSaveName = x;} +void JustGrSource::setWorldName(const wstring &x) {m_worldName = x;} +void JustGrSource::setDisplayName(const wstring &x) {m_displayName = x;} +void JustGrSource::setGrfPath(const wstring &x) {m_grfPath = x;} +void JustGrSource::setBaseSavePath(const wstring &x) { m_baseSavePath = x; m_bRequiresBaseSave = true; } + +bool JustGrSource::ready() { return true; } + +LevelGenerationOptions::LevelGenerationOptions() +{ + m_spawnPos = NULL; + m_stringTable = NULL; + + m_hasLoadedData = false; + + m_seed = 0; + m_useFlatWorld = false; + m_bHaveMinY = false; + m_minY = INT_MAX; + m_bRequiresGameRules = false; + + m_pbBaseSaveData = NULL; + m_dwBaseSaveSize = 0; +} + +LevelGenerationOptions::~LevelGenerationOptions() +{ + clearSchematics(); + if(m_spawnPos != NULL) delete m_spawnPos; + for(AUTO_VAR(it, m_schematicRules.begin()); it != m_schematicRules.end(); ++it) + { + delete *it; + } + for(AUTO_VAR(it, m_structureRules.begin()); it != m_structureRules.end(); ++it) + { + delete *it; + } + + for(AUTO_VAR(it, m_biomeOverrides.begin()); it != m_biomeOverrides.end(); ++it) + { + delete *it; + } + + for(AUTO_VAR(it, m_features.begin()); it != m_features.end(); ++it) + { + delete *it; + } + + if (m_stringTable) + if (!isTutorial()) + delete m_stringTable; + + if (isFromSave()) delete m_pSrc; +} + +ConsoleGameRules::EGameRuleType LevelGenerationOptions::getActionType() { return ConsoleGameRules::eGameRuleType_LevelGenerationOptions; } + +void LevelGenerationOptions::writeAttributes(DataOutputStream *dos, UINT numAttrs) +{ + GameRuleDefinition::writeAttributes(dos, numAttrs + 5); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_spawnX); + dos->writeUTF(_toString(m_spawnPos->x)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_spawnY); + dos->writeUTF(_toString(m_spawnPos->y)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_spawnZ); + dos->writeUTF(_toString(m_spawnPos->z)); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_seed); + dos->writeUTF(_toString(m_seed)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_flatworld); + dos->writeUTF(_toString(m_useFlatWorld)); +} + +void LevelGenerationOptions::getChildren(vector *children) +{ + GameRuleDefinition::getChildren(children); + + vector used_schematics; + for (AUTO_VAR(it, m_schematicRules.begin()); it != m_schematicRules.end(); it++) + if ( !(*it)->isComplete() ) + used_schematics.push_back( *it ); + + for(AUTO_VAR(it, m_structureRules.begin()); it!=m_structureRules.end(); it++) + children->push_back( *it ); + for(AUTO_VAR(it, used_schematics.begin()); it!=used_schematics.end(); it++) + children->push_back( *it ); + for(AUTO_VAR(it, m_biomeOverrides.begin()); it != m_biomeOverrides.end(); ++it) + children->push_back( *it ); + for(AUTO_VAR(it, m_features.begin()); it != m_features.end(); ++it) + children->push_back( *it ); +} + +GameRuleDefinition *LevelGenerationOptions::addChild(ConsoleGameRules::EGameRuleType ruleType) +{ + GameRuleDefinition *rule = NULL; + if(ruleType == ConsoleGameRules::eGameRuleType_ApplySchematic) + { + rule = new ApplySchematicRuleDefinition(this); + m_schematicRules.push_back((ApplySchematicRuleDefinition *)rule); + } + else if(ruleType == ConsoleGameRules::eGameRuleType_GenerateStructure) + { + rule = new ConsoleGenerateStructure(); + m_structureRules.push_back((ConsoleGenerateStructure *)rule); + } + else if(ruleType == ConsoleGameRules::eGameRuleType_BiomeOverride) + { + rule = new BiomeOverride(); + m_biomeOverrides.push_back((BiomeOverride *)rule); + } + else if(ruleType == ConsoleGameRules::eGameRuleType_StartFeature) + { + rule = new StartFeature(); + m_features.push_back((StartFeature *)rule); + } + else + { +#ifndef _CONTENT_PACKAGE + wprintf(L"LevelGenerationOptions: Attempted to add invalid child rule - %d\n", ruleType ); +#endif + } + return rule; +} + +void LevelGenerationOptions::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"seed") == 0) + { + m_seed = _fromString<__int64>(attributeValue); + app.DebugPrintf("LevelGenerationOptions: Adding parameter m_seed=%I64d\n",m_seed); + } + else if(attributeName.compare(L"spawnX") == 0) + { + if(m_spawnPos == NULL) m_spawnPos = new Pos(); + int value = _fromString(attributeValue); + m_spawnPos->x = value; + app.DebugPrintf("LevelGenerationOptions: Adding parameter spawnX=%d\n",value); + } + else if(attributeName.compare(L"spawnY") == 0) + { + if(m_spawnPos == NULL) m_spawnPos = new Pos(); + int value = _fromString(attributeValue); + m_spawnPos->y = value; + app.DebugPrintf("LevelGenerationOptions: Adding parameter spawnY=%d\n",value); + } + else if(attributeName.compare(L"spawnZ") == 0) + { + if(m_spawnPos == NULL) m_spawnPos = new Pos(); + int value = _fromString(attributeValue); + m_spawnPos->z = value; + app.DebugPrintf("LevelGenerationOptions: Adding parameter spawnZ=%d\n",value); + } + else if(attributeName.compare(L"flatworld") == 0) + { + if(attributeValue.compare(L"true") == 0) m_useFlatWorld = true; + app.DebugPrintf("LevelGenerationOptions: Adding parameter flatworld=%s\n",m_useFlatWorld?"TRUE":"FALSE"); + } + else if(attributeName.compare(L"saveName") == 0) + { + wstring string(getString(attributeValue)); + if(!string.empty()) setDefaultSaveName( string ); + else setDefaultSaveName( attributeValue ); + app.DebugPrintf("LevelGenerationOptions: Adding parameter saveName=%ls\n", getDefaultSaveName().c_str()); + } + else if(attributeName.compare(L"worldName") == 0) + { + wstring string(getString(attributeValue)); + if(!string.empty()) setWorldName( string ); + else setWorldName( attributeValue ); + app.DebugPrintf("LevelGenerationOptions: Adding parameter worldName=%ls\n", getWorldName()); + } + else if(attributeName.compare(L"displayName") == 0) + { + wstring string(getString(attributeValue)); + if(!string.empty()) setDisplayName( string ); + else setDisplayName( attributeValue ); + app.DebugPrintf("LevelGenerationOptions: Adding parameter displayName=%ls\n", getDisplayName()); + } + else if(attributeName.compare(L"texturePackId") == 0) + { + setRequiredTexturePackId( _fromString(attributeValue) ); + setRequiresTexturePack( true ); + app.DebugPrintf("LevelGenerationOptions: Adding parameter texturePackId=%0x\n", getRequiredTexturePackId()); + } + else if(attributeName.compare(L"isTutorial") == 0) + { + if(attributeValue.compare(L"true") == 0) setSrc(eSrc_tutorial); + app.DebugPrintf("LevelGenerationOptions: Adding parameter isTutorial=%s\n",isTutorial()?"TRUE":"FALSE"); + } + else if(attributeName.compare(L"baseSaveName") == 0) + { + setBaseSavePath( attributeValue ); + app.DebugPrintf("LevelGenerationOptions: Adding parameter baseSaveName=%ls\n", getBaseSavePath().c_str()); + } + else + { + GameRuleDefinition::addAttribute(attributeName, attributeValue); + } +} + +void LevelGenerationOptions::processSchematics(LevelChunk *chunk) +{ + PIXBeginNamedEvent(0,"Processing schematics for chunk (%d,%d)", chunk->x, chunk->z); + AABB *chunkBox = AABB::newTemp(chunk->x*16,0,chunk->z*16,chunk->x*16 + 16,Level::maxBuildHeight,chunk->z*16 + 16); + for( AUTO_VAR(it, m_schematicRules.begin()); it != m_schematicRules.end();++it) + { + ApplySchematicRuleDefinition *rule = *it; + rule->processSchematic(chunkBox, chunk); + } + + int cx = (chunk->x << 4); + int cz = (chunk->z << 4); + + for( AUTO_VAR(it, m_structureRules.begin()); it != m_structureRules.end(); it++ ) + { + ConsoleGenerateStructure *structureStart = *it; + + if (structureStart->getBoundingBox()->intersects(cx, cz, cx + 15, cz + 15)) + { + BoundingBox *bb = new BoundingBox(cx, cz, cx + 15, cz + 15); + structureStart->postProcess(chunk->level, NULL, bb); + delete bb; + } + } + PIXEndNamedEvent(); +} + +void LevelGenerationOptions::processSchematicsLighting(LevelChunk *chunk) +{ + PIXBeginNamedEvent(0,"Processing schematics (lighting) for chunk (%d,%d)", chunk->x, chunk->z); + AABB *chunkBox = AABB::newTemp(chunk->x*16,0,chunk->z*16,chunk->x*16 + 16,Level::maxBuildHeight,chunk->z*16 + 16); + for( AUTO_VAR(it, m_schematicRules.begin()); it != m_schematicRules.end();++it) + { + ApplySchematicRuleDefinition *rule = *it; + rule->processSchematicLighting(chunkBox, chunk); + } + PIXEndNamedEvent(); +} + +bool LevelGenerationOptions::checkIntersects(int x0, int y0, int z0, int x1, int y1, int z1) +{ + PIXBeginNamedEvent(0,"Check Intersects"); + + // As an optimisation, we can quickly discard things below a certain y which makes most ore checks faster due to + // a) ores generally being below ground/sea level and b) tutorial world additions generally being above ground/sea level + if(!m_bHaveMinY) + { + for(AUTO_VAR(it, m_schematicRules.begin()); it != m_schematicRules.end();++it) + { + ApplySchematicRuleDefinition *rule = *it; + int minY = rule->getMinY(); + if(minY < m_minY) m_minY = minY; + } + + for( AUTO_VAR(it, m_structureRules.begin()); it != m_structureRules.end(); it++ ) + { + ConsoleGenerateStructure *structureStart = *it; + int minY = structureStart->getMinY(); + if(minY < m_minY) m_minY = minY; + } + + m_bHaveMinY = true; + } + + // 4J Stu - We DO NOT intersect if our upper bound is below the lower bound for all schematics + if( y1 < m_minY ) return false; + + bool intersects = false; + for(AUTO_VAR(it, m_schematicRules.begin()); it != m_schematicRules.end();++it) + { + ApplySchematicRuleDefinition *rule = *it; + intersects = rule->checkIntersects(x0,y0,z0,x1,y1,z1); + if(intersects) break; + } + + if(!intersects) + { + for( AUTO_VAR(it, m_structureRules.begin()); it != m_structureRules.end(); it++ ) + { + ConsoleGenerateStructure *structureStart = *it; + intersects = structureStart->checkIntersects(x0,y0,z0,x1,y1,z1); + if(intersects) break; + } + } + PIXEndNamedEvent(); + return intersects; +} + +void LevelGenerationOptions::clearSchematics() +{ + for(AUTO_VAR(it, m_schematics.begin()); it != m_schematics.end(); ++it) + { + delete it->second; + } + m_schematics.clear(); +} + +ConsoleSchematicFile *LevelGenerationOptions::loadSchematicFile(const wstring &filename, PBYTE pbData, DWORD dwLen) +{ + // If we have already loaded this, just return + AUTO_VAR(it, m_schematics.find(filename)); + if(it != m_schematics.end()) + { +#ifndef _CONTENT_PACKAGE + wprintf(L"We have already loaded schematic file %ls\n", filename.c_str() ); +#endif + it->second->incrementRefCount(); + return it->second; + } + + ConsoleSchematicFile *schematic = NULL; + byteArray data(pbData,dwLen); + ByteArrayInputStream bais(data); + DataInputStream dis(&bais); + schematic = new ConsoleSchematicFile(); + schematic->load(&dis); + m_schematics[filename] = schematic; + bais.reset(); + return schematic; +} + +ConsoleSchematicFile *LevelGenerationOptions::getSchematicFile(const wstring &filename) +{ + ConsoleSchematicFile *schematic = NULL; + // If we have already loaded this, just return + AUTO_VAR(it, m_schematics.find(filename)); + if(it != m_schematics.end()) + { + schematic = it->second; + } + return schematic; +} + +void LevelGenerationOptions::releaseSchematicFile(const wstring &filename) +{ + // 4J Stu - We don't want to delete them when done, but probably want to keep a set of active schematics for the current world + //AUTO_VAR(it, m_schematics.find(filename)); + //if(it != m_schematics.end()) + //{ + // ConsoleSchematicFile *schematic = it->second; + // schematic->decrementRefCount(); + // if(schematic->shouldDelete()) + // { + // delete schematic; + // m_schematics.erase(it); + // } + //} +} + +void LevelGenerationOptions::loadStringTable(StringTable *table) +{ + m_stringTable = table; +} + +LPCWSTR LevelGenerationOptions::getString(const wstring &key) +{ + if(m_stringTable == NULL) + { + return L""; + } + else + { + return m_stringTable->getString(key); + } +} + +void LevelGenerationOptions::getBiomeOverride(int biomeId, BYTE &tile, BYTE &topTile) +{ + for(AUTO_VAR(it, m_biomeOverrides.begin()); it != m_biomeOverrides.end(); ++it) + { + BiomeOverride *bo = *it; + if(bo->isBiome(biomeId)) + { + bo->getTileValues(tile,topTile); + break; + } + } +} + +bool LevelGenerationOptions::isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature) +{ + bool isFeature = false; + + for(AUTO_VAR(it, m_features.begin()); it != m_features.end(); ++it) + { + StartFeature *sf = *it; + if(sf->isFeatureChunk(chunkX, chunkZ, feature)) + { + isFeature = true; + break; + } + } + return isFeature; +} + +unordered_map *LevelGenerationOptions::getUnfinishedSchematicFiles() +{ + // Clean schematic rules. + unordered_set usedFiles = unordered_set(); + for (AUTO_VAR(it, m_schematicRules.begin()); it!=m_schematicRules.end(); it++) + if ( !(*it)->isComplete() ) + usedFiles.insert( (*it)->getSchematicName() ); + + // Clean schematic files. + unordered_map *out + = new unordered_map(); + for (AUTO_VAR(it, usedFiles.begin()); it!=usedFiles.end(); it++) + out->insert( pair(*it, getSchematicFile(*it)) ); + + return out; +} + +void LevelGenerationOptions::reset_start() +{ + for ( AUTO_VAR( it, m_schematicRules.begin()); + it != m_schematicRules.end(); + it++ ) + { + (*it)->reset(); + } +} + +void LevelGenerationOptions::reset_finish() +{ + //if (m_spawnPos) { delete m_spawnPos; m_spawnPos = NULL; } + //if (m_stringTable) { delete m_stringTable; m_stringTable = NULL; } + + if (isFromDLC()) + { + m_hasLoadedData = false; + } +} + + +GrSource *LevelGenerationOptions::info() { return m_pSrc; } +void LevelGenerationOptions::setSrc(eSrc src) { m_src = src; } +LevelGenerationOptions::eSrc LevelGenerationOptions::getSrc() { return m_src; } + +bool LevelGenerationOptions::isTutorial() { return getSrc() == eSrc_tutorial; } +bool LevelGenerationOptions::isFromSave() { return getSrc() == eSrc_fromSave; } +bool LevelGenerationOptions::isFromDLC() { return getSrc() == eSrc_fromDLC; } + +bool LevelGenerationOptions::requiresTexturePack() { return info()->requiresTexturePack(); } +UINT LevelGenerationOptions::getRequiredTexturePackId() { return info()->getRequiredTexturePackId(); } +wstring LevelGenerationOptions::getDefaultSaveName() { return info()->getDefaultSaveName(); } +LPCWSTR LevelGenerationOptions::getWorldName() { return info()->getWorldName(); } +LPCWSTR LevelGenerationOptions::getDisplayName() { return info()->getDisplayName(); } +wstring LevelGenerationOptions::getGrfPath() { return info()->getGrfPath(); } +bool LevelGenerationOptions::requiresBaseSave() { return info()->requiresBaseSave(); } +wstring LevelGenerationOptions::getBaseSavePath() { return info()->getBaseSavePath(); } + +void LevelGenerationOptions::setGrSource(GrSource *grs) { m_pSrc = grs; } + +void LevelGenerationOptions::setRequiresTexturePack(bool x) { info()->setRequiresTexturePack(x); } +void LevelGenerationOptions::setRequiredTexturePackId(UINT x) { info()->setRequiredTexturePackId(x); } +void LevelGenerationOptions::setDefaultSaveName(const wstring &x) { info()->setDefaultSaveName(x); } +void LevelGenerationOptions::setWorldName(const wstring &x) { info()->setWorldName(x); } +void LevelGenerationOptions::setDisplayName(const wstring &x) { info()->setDisplayName(x); } +void LevelGenerationOptions::setGrfPath(const wstring &x) { info()->setGrfPath(x); } +void LevelGenerationOptions::setBaseSavePath(const wstring &x) { info()->setBaseSavePath(x); } + +bool LevelGenerationOptions::ready() { return info()->ready(); } + +void LevelGenerationOptions::setBaseSaveData(PBYTE pbData, DWORD dwSize) { m_pbBaseSaveData = pbData; m_dwBaseSaveSize = dwSize; } +PBYTE LevelGenerationOptions::getBaseSaveData(DWORD &size) { size = m_dwBaseSaveSize; return m_pbBaseSaveData; } +bool LevelGenerationOptions::hasBaseSaveData() { return m_dwBaseSaveSize > 0 && m_pbBaseSaveData != NULL; } +void LevelGenerationOptions::deleteBaseSaveData() { if(m_pbBaseSaveData) delete m_pbBaseSaveData; m_pbBaseSaveData = NULL; m_dwBaseSaveSize = 0; } + +bool LevelGenerationOptions::hasLoadedData() { return m_hasLoadedData; } +void LevelGenerationOptions::setLoadedData() { m_hasLoadedData = true; } + +__int64 LevelGenerationOptions::getLevelSeed() { return m_seed; } +Pos *LevelGenerationOptions::getSpawnPos() { return m_spawnPos; } +bool LevelGenerationOptions::getuseFlatWorld() { return m_useFlatWorld; } + +bool LevelGenerationOptions::requiresGameRules() { return m_bRequiresGameRules; } +void LevelGenerationOptions::setRequiredGameRules(LevelRuleset *rules) { m_requiredGameRules = rules; m_bRequiresGameRules = true; } +LevelRuleset *LevelGenerationOptions::getRequiredGameRules() { return m_requiredGameRules; } \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/LevelGenerationOptions.h b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.h new file mode 100644 index 00000000..0cc9da79 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.h @@ -0,0 +1,216 @@ +#pragma once +using namespace std; + +#pragma message("LevelGenerationOptions.h ") + +#include "GameRuleDefinition.h" +#include "..\..\..\Minecraft.World\StructureFeature.h" + +class ApplySchematicRuleDefinition; +class LevelChunk; +class ConsoleGenerateStructure; +class ConsoleSchematicFile; +class LevelRuleset; +class BiomeOverride; +class StartFeature; + +class GrSource +{ +public: + // 4J-JEV: + // Moved all this here; I didn't like that all this header information + // was being mixed in with all the game information as they have + // completely different lifespans. + + virtual bool requiresTexturePack()=0; + virtual UINT getRequiredTexturePackId()=0; + virtual wstring getDefaultSaveName()=0; + virtual LPCWSTR getWorldName()=0; + virtual LPCWSTR getDisplayName()=0; + virtual wstring getGrfPath()=0; + virtual bool requiresBaseSave() = 0; + virtual wstring getBaseSavePath() = 0; + + virtual void setRequiresTexturePack(bool)=0; + virtual void setRequiredTexturePackId(UINT)=0; + virtual void setDefaultSaveName(const wstring &)=0; + virtual void setWorldName(const wstring &)=0; + virtual void setDisplayName(const wstring &)=0; + virtual void setGrfPath(const wstring &)=0; + virtual void setBaseSavePath(const wstring &)=0; + + virtual bool ready()=0; + + //virtual void getGrfData(PBYTE &pData, DWORD &pSize)=0; +}; + +class JustGrSource : public GrSource +{ +protected: + wstring m_worldName; + wstring m_displayName; + wstring m_defaultSaveName; + bool m_bRequiresTexturePack; + int m_requiredTexturePackId; + wstring m_grfPath; + wstring m_baseSavePath; + bool m_bRequiresBaseSave; + +public: + virtual bool requiresTexturePack(); + virtual UINT getRequiredTexturePackId(); + virtual wstring getDefaultSaveName(); + virtual LPCWSTR getWorldName(); + virtual LPCWSTR getDisplayName(); + virtual wstring getGrfPath(); + virtual bool requiresBaseSave(); + virtual wstring getBaseSavePath(); + + virtual void setRequiresTexturePack(bool x); + virtual void setRequiredTexturePackId(UINT x); + virtual void setDefaultSaveName(const wstring &x); + virtual void setWorldName(const wstring &x); + virtual void setDisplayName(const wstring &x); + virtual void setGrfPath(const wstring &x); + virtual void setBaseSavePath(const wstring &x); + + virtual bool ready(); + + JustGrSource(); +}; + +class LevelGenerationOptions : public GameRuleDefinition +{ +public: + enum eSrc + { + eSrc_none, + + eSrc_fromSave, // Neither content or header is persistent. + + eSrc_fromDLC, // Header is persistent, content should be deleted to conserve space. + + eSrc_tutorial, // Both header and content is persistent, content cannot be reloaded. + + eSrc_MAX + }; + +private: + eSrc m_src; + + GrSource *m_pSrc; + GrSource *info(); + + bool m_hasLoadedData; + + PBYTE m_pbBaseSaveData; + DWORD m_dwBaseSaveSize; + +public: + + void setSrc(eSrc src); + eSrc getSrc(); + + bool isTutorial(); + bool isFromSave(); + bool isFromDLC(); + + bool requiresTexturePack(); + UINT getRequiredTexturePackId(); + wstring getDefaultSaveName(); + LPCWSTR getWorldName(); + LPCWSTR getDisplayName(); + wstring getGrfPath(); + bool requiresBaseSave(); + wstring getBaseSavePath(); + + void setGrSource(GrSource *grs); + + void setRequiresTexturePack(bool x); + void setRequiredTexturePackId(UINT x); + void setDefaultSaveName(const wstring &x); + void setWorldName(const wstring &x); + void setDisplayName(const wstring &x); + void setGrfPath(const wstring &x); + void setBaseSavePath(const wstring &x); + + bool ready(); + + void setBaseSaveData(PBYTE pbData, DWORD dwSize); + PBYTE getBaseSaveData(DWORD &size); + bool hasBaseSaveData(); + void deleteBaseSaveData(); + + bool hasLoadedData(); + void setLoadedData(); + +private: + // This should match the "MapOptionsRule" definition in the XML schema + __int64 m_seed; + bool m_useFlatWorld; + Pos *m_spawnPos; + vector m_schematicRules; + vector m_structureRules; + bool m_bHaveMinY; + int m_minY; + unordered_map m_schematics; + vector m_biomeOverrides; + vector m_features; + + bool m_bRequiresGameRules; + LevelRuleset *m_requiredGameRules; + + StringTable *m_stringTable; + +public: + LevelGenerationOptions(); + ~LevelGenerationOptions(); + + virtual ConsoleGameRules::EGameRuleType getActionType(); + + virtual void writeAttributes(DataOutputStream *dos, UINT numAttributes); + virtual void getChildren(vector *children); + virtual GameRuleDefinition *addChild(ConsoleGameRules::EGameRuleType ruleType); + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + __int64 getLevelSeed(); + Pos *getSpawnPos(); + bool getuseFlatWorld(); + + void processSchematics(LevelChunk *chunk); + void processSchematicsLighting(LevelChunk *chunk); + + bool checkIntersects(int x0, int y0, int z0, int x1, int y1, int z1); + +private: + void clearSchematics(); + +public: + ConsoleSchematicFile *loadSchematicFile(const wstring &filename, PBYTE pbData, DWORD dwLen); + +public: + ConsoleSchematicFile *getSchematicFile(const wstring &filename); + void releaseSchematicFile(const wstring &filename); + + bool requiresGameRules(); + void setRequiredGameRules(LevelRuleset *rules); + LevelRuleset *getRequiredGameRules(); + + void getBiomeOverride(int biomeId, BYTE &tile, BYTE &topTile); + bool isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature); + + void loadStringTable(StringTable *table); + LPCWSTR getString(const wstring &key); + + unordered_map *getUnfinishedSchematicFiles(); + + // 4J-JEV: + // ApplySchematicRules contain limited state + // which needs to be reset BEFORE a new game starts. + void reset_start(); + + // 4J-JEV: + // This file contains state that needs to be deleted + // or reset once a game has finished. + void reset_finish(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/LevelGenerators.cpp b/Minecraft.Client/Common/GameRules/LevelGenerators.cpp new file mode 100644 index 00000000..653a26d0 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/LevelGenerators.cpp @@ -0,0 +1,26 @@ +#include "stdafx.h" +#include "LevelGenerationOptions.h" +#include "LevelGenerators.h" + + +LevelGenerators::LevelGenerators() +{ +} + +void LevelGenerators::addLevelGenerator(const wstring &displayName, LevelGenerationOptions *generator) +{ + if(!displayName.empty()) generator->setDisplayName(displayName); + m_levelGenerators.push_back(generator); +} + +void LevelGenerators::removeLevelGenerator(LevelGenerationOptions *generator) +{ + vector::iterator it; + while ( (it = find( m_levelGenerators.begin(), + m_levelGenerators.end(), + generator ) ) + != m_levelGenerators.end() ) + { + m_levelGenerators.erase(it); + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/LevelGenerators.h b/Minecraft.Client/Common/GameRules/LevelGenerators.h new file mode 100644 index 00000000..824b8387 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/LevelGenerators.h @@ -0,0 +1,19 @@ +#pragma once + +using namespace std; + +class LevelGenerationOptions; + +class LevelGenerators +{ +private: + vector m_levelGenerators; + +public: + LevelGenerators(); + + void addLevelGenerator(const wstring &displayName, LevelGenerationOptions *generator); + void removeLevelGenerator(LevelGenerationOptions *generator); + + vector *getLevelGenerators() { return &m_levelGenerators; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/LevelRules.cpp b/Minecraft.Client/Common/GameRules/LevelRules.cpp new file mode 100644 index 00000000..b7c8a8a5 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/LevelRules.cpp @@ -0,0 +1,20 @@ +#include "stdafx.h" +#include "LevelRules.h" + + +LevelRules::LevelRules() +{ +} + +void LevelRules::addLevelRule(const wstring &displayName, PBYTE pbData, DWORD dwLen) +{ +} + +void LevelRules::addLevelRule(const wstring &displayName, LevelRuleset *rootRule) +{ +} + +void LevelRules::removeLevelRule(LevelRuleset *removing) +{ + // TODO ? +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/LevelRules.h b/Minecraft.Client/Common/GameRules/LevelRules.h new file mode 100644 index 00000000..a94a2123 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/LevelRules.h @@ -0,0 +1,14 @@ +#pragma once + +class LevelRuleset; + +class LevelRules +{ +public: + LevelRules(); + + void addLevelRule(const wstring &displayName, PBYTE pbData, DWORD dwLen); + void addLevelRule(const wstring &displayName, LevelRuleset *rootRule); + + void removeLevelRule(LevelRuleset *removing); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/LevelRuleset.cpp b/Minecraft.Client/Common/GameRules/LevelRuleset.cpp new file mode 100644 index 00000000..1c7ecd47 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/LevelRuleset.cpp @@ -0,0 +1,71 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\StringTable.h" +#include "ConsoleGameRules.h" +#include "LevelRuleset.h" + +LevelRuleset::LevelRuleset() +{ + m_stringTable = NULL; +} + +LevelRuleset::~LevelRuleset() +{ + for(AUTO_VAR(it, m_areas.begin()); it != m_areas.end(); ++it) + { + delete *it; + } +} + +void LevelRuleset::getChildren(vector *children) +{ + CompoundGameRuleDefinition::getChildren(children); + for (AUTO_VAR(it, m_areas.begin()); it != m_areas.end(); it++) + children->push_back(*it); +} + +GameRuleDefinition *LevelRuleset::addChild(ConsoleGameRules::EGameRuleType ruleType) +{ + GameRuleDefinition *rule = NULL; + if(ruleType == ConsoleGameRules::eGameRuleType_NamedArea) + { + rule = new NamedAreaRuleDefinition(); + m_areas.push_back((NamedAreaRuleDefinition *)rule); + } + else + { + rule = CompoundGameRuleDefinition::addChild(ruleType); + } + return rule; +} + +void LevelRuleset::loadStringTable(StringTable *table) +{ + m_stringTable = table; +} + +LPCWSTR LevelRuleset::getString(const wstring &key) +{ + if(m_stringTable == NULL) + { + return L""; + } + else + { + return m_stringTable->getString(key); + } +} + +AABB *LevelRuleset::getNamedArea(const wstring &areaName) +{ + AABB *area = NULL; + for(AUTO_VAR(it, m_areas.begin()); it != m_areas.end(); ++it) + { + if( (*it)->getName().compare(areaName) == 0 ) + { + area = (*it)->getArea(); + break; + } + } + return area; +} diff --git a/Minecraft.Client/Common/GameRules/LevelRuleset.h b/Minecraft.Client/Common/GameRules/LevelRuleset.h new file mode 100644 index 00000000..bbb17c43 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/LevelRuleset.h @@ -0,0 +1,27 @@ +#pragma once + +#include "CompoundGameRuleDefinition.h" + +class NamedAreaRuleDefinition; + +class LevelRuleset : public CompoundGameRuleDefinition +{ +private: + vector m_areas; + StringTable *m_stringTable; +public: + LevelRuleset(); + ~LevelRuleset(); + + virtual void getChildren(vector *children); + virtual GameRuleDefinition *addChild(ConsoleGameRules::EGameRuleType ruleType); + + virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_LevelRules; } + + void loadStringTable(StringTable *table); + LPCWSTR getString(const wstring &key); + + AABB *getNamedArea(const wstring &areaName); + + StringTable *getStringTable() { return m_stringTable; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/NamedAreaRuleDefinition.cpp b/Minecraft.Client/Common/GameRules/NamedAreaRuleDefinition.cpp new file mode 100644 index 00000000..41ff15e8 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/NamedAreaRuleDefinition.cpp @@ -0,0 +1,84 @@ +#include "stdafx.h" +#include "NamedAreaRuleDefinition.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.phys.h" + +NamedAreaRuleDefinition::NamedAreaRuleDefinition() +{ + m_name = L""; + m_area = AABB::newPermanent(0,0,0,0,0,0); +} + +NamedAreaRuleDefinition::~NamedAreaRuleDefinition() +{ + delete m_area; +} + +void NamedAreaRuleDefinition::writeAttributes(DataOutputStream *dos, UINT numAttributes) +{ + GameRuleDefinition::writeAttributes(dos, numAttributes + 7); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_name); + dos->writeUTF(m_name); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_x0); + dos->writeUTF(_toString(m_area->x0)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_y0); + dos->writeUTF(_toString(m_area->y0)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_z0); + dos->writeUTF(_toString(m_area->z0)); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_x1); + dos->writeUTF(_toString(m_area->x1)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_y1); + dos->writeUTF(_toString(m_area->y1)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_z1); + dos->writeUTF(_toString(m_area->z1)); +} + +void NamedAreaRuleDefinition::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"name") == 0) + { + m_name = attributeValue; +#ifndef _CONTENT_PACKAGE + wprintf(L"NamedAreaRuleDefinition: Adding parameter name=%ls\n",m_name.c_str()); +#endif + } + else if(attributeName.compare(L"x0") == 0) + { + m_area->x0 = _fromString(attributeValue); + app.DebugPrintf("NamedAreaRuleDefinition: Adding parameter x0=%f\n",m_area->x0); + } + else if(attributeName.compare(L"y0") == 0) + { + m_area->y0 = _fromString(attributeValue); + if(m_area->y0 < 0) m_area->y0 = 0; + app.DebugPrintf("NamedAreaRuleDefinition: Adding parameter y0=%f\n",m_area->y0); + } + else if(attributeName.compare(L"z0") == 0) + { + m_area->z0 = _fromString(attributeValue); + app.DebugPrintf("NamedAreaRuleDefinition: Adding parameter z0=%f\n",m_area->z0); + } + else if(attributeName.compare(L"x1") == 0) + { + m_area->x1 = _fromString(attributeValue); + app.DebugPrintf("NamedAreaRuleDefinition: Adding parameter x1=%f\n",m_area->x1); + } + else if(attributeName.compare(L"y1") == 0) + { + m_area->y1 = _fromString(attributeValue); + if(m_area->y1 < 0) m_area->y1 = 0; + app.DebugPrintf("NamedAreaRuleDefinition: Adding parameter y1=%f\n",m_area->y1); + } + else if(attributeName.compare(L"z1") == 0) + { + m_area->z1 = _fromString(attributeValue); + app.DebugPrintf("NamedAreaRuleDefinition: Adding parameter z1=%f\n",m_area->z1); + } + else + { + GameRuleDefinition::addAttribute(attributeName, attributeValue); + } +} diff --git a/Minecraft.Client/Common/GameRules/NamedAreaRuleDefinition.h b/Minecraft.Client/Common/GameRules/NamedAreaRuleDefinition.h new file mode 100644 index 00000000..7cf7db19 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/NamedAreaRuleDefinition.h @@ -0,0 +1,23 @@ +#pragma once + +#include "GameRuleDefinition.h" + +class NamedAreaRuleDefinition : public GameRuleDefinition +{ +private: + wstring m_name; + AABB *m_area; + +public: + NamedAreaRuleDefinition(); + ~NamedAreaRuleDefinition(); + + virtual void writeAttributes(DataOutputStream *dos, UINT numAttributes); + + virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_NamedArea; } + + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + AABB *getArea() { return m_area; } + wstring getName() { return m_name; } +}; diff --git a/Minecraft.Client/Common/GameRules/StartFeature.cpp b/Minecraft.Client/Common/GameRules/StartFeature.cpp new file mode 100644 index 00000000..9d5f15c0 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/StartFeature.cpp @@ -0,0 +1,53 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "StartFeature.h" + +StartFeature::StartFeature() +{ + m_chunkX = 0; + m_chunkZ = 0; + m_feature = StructureFeature::eFeature_Temples; +} + +void StartFeature::writeAttributes(DataOutputStream *dos, UINT numAttrs) +{ + GameRuleDefinition::writeAttributes(dos, numAttrs + 3); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_chunkX); + dos->writeUTF(_toString(m_chunkX)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_chunkZ); + dos->writeUTF(_toString(m_chunkZ)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_feature); + dos->writeUTF(_toString((int)m_feature)); +} + +void StartFeature::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"chunkX") == 0) + { + int value = _fromString(attributeValue); + m_chunkX = value; + app.DebugPrintf("StartFeature: Adding parameter chunkX=%d\n",m_chunkX); + } + else if(attributeName.compare(L"chunkZ") == 0) + { + int value = _fromString(attributeValue); + m_chunkZ = value; + app.DebugPrintf("StartFeature: Adding parameter chunkZ=%d\n",m_chunkZ); + } + else if(attributeName.compare(L"feature") == 0) + { + int value = _fromString(attributeValue); + m_feature = (StructureFeature::EFeatureTypes)value; + app.DebugPrintf("StartFeature: Adding parameter feature=%d\n",m_feature); + } + else + { + GameRuleDefinition::addAttribute(attributeName, attributeValue); + } +} + +bool StartFeature::isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature) +{ + return chunkX == m_chunkX && chunkZ == m_chunkZ && feature == m_feature; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/StartFeature.h b/Minecraft.Client/Common/GameRules/StartFeature.h new file mode 100644 index 00000000..d3f1280a --- /dev/null +++ b/Minecraft.Client/Common/GameRules/StartFeature.h @@ -0,0 +1,22 @@ +#pragma once +using namespace std; + +#include "GameRuleDefinition.h" +#include "..\..\..\Minecraft.World\StructureFeature.h" + +class StartFeature : public GameRuleDefinition +{ +private: + int m_chunkX, m_chunkZ; + StructureFeature::EFeatureTypes m_feature; + +public: + StartFeature(); + + virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_StartFeature; } + + virtual void writeAttributes(DataOutputStream *dos, UINT numAttrs); + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + bool isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/UpdatePlayerRuleDefinition.cpp b/Minecraft.Client/Common/GameRules/UpdatePlayerRuleDefinition.cpp new file mode 100644 index 00000000..6e55cd45 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/UpdatePlayerRuleDefinition.cpp @@ -0,0 +1,171 @@ +#include "stdafx.h" +#include "UpdatePlayerRuleDefinition.h" +#include "ConsoleGameRules.h" +#include "..\..\..\Minecraft.World\Pos.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.food.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" + +UpdatePlayerRuleDefinition::UpdatePlayerRuleDefinition() +{ + m_bUpdateHealth = m_bUpdateFood = m_bUpdateYRot = false;; + m_health = 0; + m_food = 0; + m_spawnPos = NULL; + m_yRot = 0.0f; +} + +UpdatePlayerRuleDefinition::~UpdatePlayerRuleDefinition() +{ + for(AUTO_VAR(it, m_items.begin()); it != m_items.end(); ++it) + { + delete *it; + } +} + +void UpdatePlayerRuleDefinition::writeAttributes(DataOutputStream *dos, UINT numAttributes) +{ + int attrCount = 3; + if(m_bUpdateHealth) ++attrCount; + if(m_bUpdateFood) ++attrCount; + if(m_bUpdateYRot) ++attrCount; + GameRuleDefinition::writeAttributes(dos, numAttributes + attrCount ); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_spawnX); + dos->writeUTF(_toString(m_spawnPos->x)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_spawnY); + dos->writeUTF(_toString(m_spawnPos->y)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_spawnZ); + dos->writeUTF(_toString(m_spawnPos->z)); + + if(m_bUpdateYRot) + { + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_yRot); + dos->writeUTF(_toString(m_yRot)); + } + if(m_bUpdateHealth) + { + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_food); + dos->writeUTF(_toString(m_health)); + } + if(m_bUpdateFood) + { + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_health); + dos->writeUTF(_toString(m_food)); + } +} + +void UpdatePlayerRuleDefinition::getChildren(vector *children) +{ + GameRuleDefinition::getChildren(children); + for(AUTO_VAR(it, m_items.begin()); it!=m_items.end(); it++) + children->push_back(*it); +} + +GameRuleDefinition *UpdatePlayerRuleDefinition::addChild(ConsoleGameRules::EGameRuleType ruleType) +{ + GameRuleDefinition *rule = NULL; + if(ruleType == ConsoleGameRules::eGameRuleType_AddItem) + { + rule = new AddItemRuleDefinition(); + m_items.push_back((AddItemRuleDefinition *)rule); + } + else + { +#ifndef _CONTENT_PACKAGE + wprintf(L"UpdatePlayerRuleDefinition: Attempted to add invalid child rule - %d\n", ruleType ); +#endif + } + return rule; +} + +void UpdatePlayerRuleDefinition::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"spawnX") == 0) + { + if(m_spawnPos == NULL) m_spawnPos = new Pos(); + int value = _fromString(attributeValue); + m_spawnPos->x = value; + app.DebugPrintf("UpdatePlayerRuleDefinition: Adding parameter spawnX=%d\n",value); + } + else if(attributeName.compare(L"spawnY") == 0) + { + if(m_spawnPos == NULL) m_spawnPos = new Pos(); + int value = _fromString(attributeValue); + m_spawnPos->y = value; + app.DebugPrintf("UpdatePlayerRuleDefinition: Adding parameter spawnY=%d\n",value); + } + else if(attributeName.compare(L"spawnZ") == 0) + { + if(m_spawnPos == NULL) m_spawnPos = new Pos(); + int value = _fromString(attributeValue); + m_spawnPos->z = value; + app.DebugPrintf("UpdatePlayerRuleDefinition: Adding parameter spawnZ=%d\n",value); + } + else if(attributeName.compare(L"health") == 0) + { + int value = _fromString(attributeValue); + m_health = value; + m_bUpdateHealth = true; + app.DebugPrintf("UpdatePlayerRuleDefinition: Adding parameter health=%d\n",value); + } + else if(attributeName.compare(L"food") == 0) + { + int value = _fromString(attributeValue); + m_food = value; + m_bUpdateFood = true; + app.DebugPrintf("UpdatePlayerRuleDefinition: Adding parameter health=%d\n",value); + } + else if(attributeName.compare(L"yRot") == 0) + { + float value = _fromString(attributeValue); + m_yRot = value; + m_bUpdateYRot = true; + app.DebugPrintf("UpdatePlayerRuleDefinition: Adding parameter yRot=%f\n",value); + } + else + { + GameRuleDefinition::addAttribute(attributeName, attributeValue); + } +} + +void UpdatePlayerRuleDefinition::postProcessPlayer(shared_ptr player) +{ + if(m_bUpdateHealth) + { + player->lastHealth = m_health; + player->setHealth(m_health); + } + + if(m_bUpdateFood) + { + player->getFoodData()->setFoodLevel(m_food); + } + + double x = player->x; + double y = player->y; + double z = player->z; + float yRot = player->yRot; + float xRot = player->xRot; + if(m_spawnPos != NULL) + { + x = m_spawnPos->x; + y = m_spawnPos->y; + z = m_spawnPos->z; + } + + if(m_bUpdateYRot) + { + yRot = m_yRot; + } + + if(m_spawnPos != NULL || m_bUpdateYRot) player->absMoveTo(x,y,z,yRot,xRot); + + for(AUTO_VAR(it, m_items.begin()); it != m_items.end(); ++it) + { + AddItemRuleDefinition *addItem = *it; + + addItem->addItemToContainer(player->inventory, -1); + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/UpdatePlayerRuleDefinition.h b/Minecraft.Client/Common/GameRules/UpdatePlayerRuleDefinition.h new file mode 100644 index 00000000..538aefa1 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/UpdatePlayerRuleDefinition.h @@ -0,0 +1,33 @@ +#pragma once +using namespace std; + +#include "GameRuleDefinition.h" + +class AddItemRuleDefinition; +class Pos; + +class UpdatePlayerRuleDefinition : public GameRuleDefinition +{ +private: + vector m_items; + + bool m_bUpdateHealth, m_bUpdateFood, m_bUpdateYRot, m_bUpdateInventory; + int m_health; + int m_food; + Pos *m_spawnPos; + float m_yRot; + +public: + UpdatePlayerRuleDefinition(); + ~UpdatePlayerRuleDefinition(); + + virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_UpdatePlayerRule; } + + virtual void getChildren(vector *children); + virtual GameRuleDefinition *addChild(ConsoleGameRules::EGameRuleType ruleType); + + virtual void writeAttributes(DataOutputStream *dos, UINT numAttributes); + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + virtual void postProcessPlayer(shared_ptr player); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/UseTileRuleDefinition.cpp b/Minecraft.Client/Common/GameRules/UseTileRuleDefinition.cpp new file mode 100644 index 00000000..965405ae --- /dev/null +++ b/Minecraft.Client/Common/GameRules/UseTileRuleDefinition.cpp @@ -0,0 +1,82 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "UseTileRuleDefinition.h" + +UseTileRuleDefinition::UseTileRuleDefinition() +{ + m_tileId = -1; + m_useCoords = false; +} + +void UseTileRuleDefinition::writeAttributes(DataOutputStream *dos, UINT numAttributes) +{ + GameRuleDefinition::writeAttributes(dos, numAttributes + 5); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_tileId); + dos->writeUTF(_toString(m_tileId)); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_useCoords); + dos->writeUTF(_toString(m_useCoords)); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_x); + dos->writeUTF(_toString(m_coordinates.x)); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_y); + dos->writeUTF(_toString(m_coordinates.y)); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_z); + dos->writeUTF(_toString(m_coordinates.z)); +} + +void UseTileRuleDefinition::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"tileId") == 0) + { + m_tileId = _fromString(attributeValue); + app.DebugPrintf("UseTileRule: Adding parameter tileId=%d\n",m_tileId); + } + else if(attributeName.compare(L"useCoords") == 0) + { + m_useCoords = _fromString(attributeValue); + app.DebugPrintf("UseTileRule: Adding parameter useCoords=%s\n",m_useCoords?"TRUE":"FALSE"); + } + else if(attributeName.compare(L"x") == 0) + { + m_coordinates.x = _fromString(attributeValue); + app.DebugPrintf("UseTileRule: Adding parameter x=%d\n",m_coordinates.x); + } + else if(attributeName.compare(L"y") == 0) + { + m_coordinates.y = _fromString(attributeValue); + app.DebugPrintf("UseTileRule: Adding parameter y=%d\n",m_coordinates.y); + } + else if(attributeName.compare(L"z") == 0) + { + m_coordinates.z = _fromString(attributeValue); + app.DebugPrintf("UseTileRule: Adding parameter z=%d\n",m_coordinates.z); + } + else + { + GameRuleDefinition::addAttribute(attributeName, attributeValue); + } +} + +bool UseTileRuleDefinition::onUseTile(GameRule *rule, int tileId, int x, int y, int z) +{ + bool statusChanged = false; + if( m_tileId == tileId ) + { + if( !m_useCoords || (m_coordinates.x == x && m_coordinates.y == y && m_coordinates.z == z) ) + { + if(!getComplete(rule)) + { + statusChanged = true; + setComplete(rule,true); + app.DebugPrintf("Completed UseTileRule with info - t:%d, coords:%s, x:%d, y:%d, z:%d\n", m_tileId,m_useCoords?"TRUE":"FALSE",m_coordinates.x,m_coordinates.y,m_coordinates.z); + + // Send a packet or some other announcement here + } + } + } + return statusChanged; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/UseTileRuleDefinition.h b/Minecraft.Client/Common/GameRules/UseTileRuleDefinition.h new file mode 100644 index 00000000..ad64bfe4 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/UseTileRuleDefinition.h @@ -0,0 +1,24 @@ +#pragma once +using namespace std; + +#include "GameRuleDefinition.h" +#include "..\..\..\Minecraft.World\Pos.h" + +class UseTileRuleDefinition : public GameRuleDefinition +{ +private: + // These values should map directly to the xsd definition for this Rule + int m_tileId; + bool m_useCoords; + Pos m_coordinates; + +public: + UseTileRuleDefinition(); + + ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_UseTileRule; } + + virtual void writeAttributes(DataOutputStream *dos, UINT numAttributes); + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + virtual bool onUseTile(GameRule *rule, int tileId, int x, int y, int z); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/XboxStructureActionGenerateBox.cpp b/Minecraft.Client/Common/GameRules/XboxStructureActionGenerateBox.cpp new file mode 100644 index 00000000..6d687b36 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/XboxStructureActionGenerateBox.cpp @@ -0,0 +1,104 @@ +#include "stdafx.h" +#include "XboxStructureActionGenerateBox.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.levelgen.structure.h" + +XboxStructureActionGenerateBox::XboxStructureActionGenerateBox() +{ + m_x0 = m_y0 = m_z0 = m_x1 = m_y1 = m_z1 = m_edgeTile = m_fillTile = 0; + m_skipAir = false; +} + +void XboxStructureActionGenerateBox::writeAttributes(DataOutputStream *dos, UINT numAttrs) +{ + ConsoleGenerateStructureAction::writeAttributes(dos, numAttrs + 9); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_x0); + dos->writeUTF(_toString(m_x0)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_y0); + dos->writeUTF(_toString(m_y0)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_z0); + dos->writeUTF(_toString(m_z0)); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_x1); + dos->writeUTF(_toString(m_x1)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_y1); + dos->writeUTF(_toString(m_y1)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_z1); + dos->writeUTF(_toString(m_z1)); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_edgeTile); + dos->writeUTF(_toString(m_edgeTile)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_fillTile); + dos->writeUTF(_toString(m_fillTile)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_skipAir); + dos->writeUTF(_toString(m_skipAir)); +} + +void XboxStructureActionGenerateBox::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"x0") == 0) + { + int value = _fromString(attributeValue); + m_x0 = value; + app.DebugPrintf("XboxStructureActionGenerateBox: Adding parameter x0=%d\n",m_x0); + } + else if(attributeName.compare(L"y0") == 0) + { + int value = _fromString(attributeValue); + m_y0 = value; + app.DebugPrintf("XboxStructureActionGenerateBox: Adding parameter y0=%d\n",m_y0); + } + else if(attributeName.compare(L"z0") == 0) + { + int value = _fromString(attributeValue); + m_z0 = value; + app.DebugPrintf("XboxStructureActionGenerateBox: Adding parameter z0=%d\n",m_z0); + } + else if(attributeName.compare(L"x1") == 0) + { + int value = _fromString(attributeValue); + m_x1 = value; + app.DebugPrintf("XboxStructureActionGenerateBox: Adding parameter x1=%d\n",m_x1); + } + else if(attributeName.compare(L"y1") == 0) + { + int value = _fromString(attributeValue); + m_y1 = value; + app.DebugPrintf("XboxStructureActionGenerateBox: Adding parameter y1=%d\n",m_y1); + } + else if(attributeName.compare(L"z1") == 0) + { + int value = _fromString(attributeValue); + m_z1 = value; + app.DebugPrintf("XboxStructureActionGenerateBox: Adding parameter z1=%d\n",m_z1); + } + else if(attributeName.compare(L"edgeTile") == 0) + { + int value = _fromString(attributeValue); + m_edgeTile = value; + app.DebugPrintf("XboxStructureActionGenerateBox: Adding parameter edgeTile=%d\n",m_edgeTile); + } + else if(attributeName.compare(L"fillTile") == 0) + { + int value = _fromString(attributeValue); + m_fillTile = value; + app.DebugPrintf("XboxStructureActionGenerateBox: Adding parameter fillTile=%d\n",m_fillTile); + } + else if(attributeName.compare(L"skipAir") == 0) + { + if(attributeValue.compare(L"true") == 0) m_skipAir = true; + app.DebugPrintf("XboxStructureActionGenerateBox: Adding parameter skipAir=%s\n",m_skipAir?"TRUE":"FALSE"); + } + else + { + GameRuleDefinition::addAttribute(attributeName, attributeValue); + } +} + +bool XboxStructureActionGenerateBox::generateBoxInLevel(StructurePiece *structure, Level *level, BoundingBox *chunkBB) +{ + app.DebugPrintf("XboxStructureActionGenerateBox - generating a box\n"); + structure->generateBox(level,chunkBB,m_x0,m_y0,m_z0,m_x1,m_y1,m_z1,m_edgeTile,m_fillTile,m_skipAir); + return true; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/XboxStructureActionGenerateBox.h b/Minecraft.Client/Common/GameRules/XboxStructureActionGenerateBox.h new file mode 100644 index 00000000..78664d42 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/XboxStructureActionGenerateBox.h @@ -0,0 +1,26 @@ +#pragma once +#include "ConsoleGenerateStructureAction.h" + +class StructurePiece; +class Level; +class BoundingBox; + +class XboxStructureActionGenerateBox : public ConsoleGenerateStructureAction +{ +private: + int m_x0, m_y0, m_z0, m_x1, m_y1, m_z1, m_edgeTile, m_fillTile; + bool m_skipAir; +public: + XboxStructureActionGenerateBox(); + + virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_GenerateBox; } + + virtual int getEndX() { return m_x1; } + virtual int getEndY() { return m_y1; } + virtual int getEndZ() { return m_z1; } + + virtual void writeAttributes(DataOutputStream *dos, UINT numAttrs); + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + bool generateBoxInLevel(StructurePiece *structure, Level *level, BoundingBox *chunkBB); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceBlock.cpp b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceBlock.cpp new file mode 100644 index 00000000..b816d5b6 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceBlock.cpp @@ -0,0 +1,72 @@ +#include "stdafx.h" +#include "XboxStructureActionPlaceBlock.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.levelgen.structure.h" + +XboxStructureActionPlaceBlock::XboxStructureActionPlaceBlock() +{ + m_x = m_y = m_z = m_tile = m_data = 0; +} + +void XboxStructureActionPlaceBlock::writeAttributes(DataOutputStream *dos, UINT numAttrs) +{ + ConsoleGenerateStructureAction::writeAttributes(dos, numAttrs + 5); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_x); + dos->writeUTF(_toString(m_x)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_y); + dos->writeUTF(_toString(m_y)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_z); + dos->writeUTF(_toString(m_z)); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_data); + dos->writeUTF(_toString(m_data)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_block); + dos->writeUTF(_toString(m_tile)); +} + + +void XboxStructureActionPlaceBlock::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"x") == 0) + { + int value = _fromString(attributeValue); + m_x = value; + app.DebugPrintf("XboxStructureActionPlaceBlock: Adding parameter x=%d\n",m_x); + } + else if(attributeName.compare(L"y") == 0) + { + int value = _fromString(attributeValue); + m_y = value; + app.DebugPrintf("XboxStructureActionPlaceBlock: Adding parameter y=%d\n",m_y); + } + else if(attributeName.compare(L"z") == 0) + { + int value = _fromString(attributeValue); + m_z = value; + app.DebugPrintf("XboxStructureActionPlaceBlock: Adding parameter z=%d\n",m_z); + } + else if(attributeName.compare(L"block") == 0) + { + int value = _fromString(attributeValue); + m_tile = value; + app.DebugPrintf("XboxStructureActionPlaceBlock: Adding parameter block=%d\n",m_tile); + } + else if(attributeName.compare(L"data") == 0) + { + int value = _fromString(attributeValue); + m_data = value; + app.DebugPrintf("XboxStructureActionPlaceBlock: Adding parameter data=%d\n",m_data); + } + else + { + GameRuleDefinition::addAttribute(attributeName, attributeValue); + } +} + +bool XboxStructureActionPlaceBlock::placeBlockInLevel(StructurePiece *structure, Level *level, BoundingBox *chunkBB) +{ + app.DebugPrintf("XboxStructureActionPlaceBlock - placing a block\n"); + structure->placeBlock(level,m_tile,m_data,m_x,m_y,m_z,chunkBB); + return true; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceBlock.h b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceBlock.h new file mode 100644 index 00000000..3ee377b9 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceBlock.h @@ -0,0 +1,25 @@ +#pragma once +#include "ConsoleGenerateStructureAction.h" + +class StructurePiece; +class Level; +class BoundingBox; + +class XboxStructureActionPlaceBlock : public ConsoleGenerateStructureAction +{ +protected: + int m_x, m_y, m_z, m_tile, m_data; +public: + XboxStructureActionPlaceBlock(); + + virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_PlaceBlock; } + + virtual int getEndX() { return m_x; } + virtual int getEndY() { return m_y; } + virtual int getEndZ() { return m_z; } + + virtual void writeAttributes(DataOutputStream *dos, UINT numAttrs); + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + bool placeBlockInLevel(StructurePiece *structure, Level *level, BoundingBox *chunkBB); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.cpp b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.cpp new file mode 100644 index 00000000..8184f45b --- /dev/null +++ b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.cpp @@ -0,0 +1,99 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "XboxStructureActionPlaceContainer.h" +#include "AddItemRuleDefinition.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.levelgen.structure.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" + +XboxStructureActionPlaceContainer::XboxStructureActionPlaceContainer() +{ + m_tile = Tile::chest_Id; +} + +XboxStructureActionPlaceContainer::~XboxStructureActionPlaceContainer() +{ + for(AUTO_VAR(it, m_items.begin()); it != m_items.end(); ++it) + { + delete *it; + } +} + +// 4J-JEV: Super class handles attr-facing fine. +//void XboxStructureActionPlaceContainer::writeAttributes(DataOutputStream *dos, UINT numAttrs) + + +void XboxStructureActionPlaceContainer::getChildren(vector *children) +{ + XboxStructureActionPlaceBlock::getChildren(children); + for(AUTO_VAR(it, m_items.begin()); it!=m_items.end(); it++) + children->push_back( *it ); +} + +GameRuleDefinition *XboxStructureActionPlaceContainer::addChild(ConsoleGameRules::EGameRuleType ruleType) +{ + GameRuleDefinition *rule = NULL; + if(ruleType == ConsoleGameRules::eGameRuleType_AddItem) + { + rule = new AddItemRuleDefinition(); + m_items.push_back((AddItemRuleDefinition *)rule); + } + else + { +#ifndef _CONTENT_PACKAGE + wprintf(L"XboxStructureActionPlaceContainer: Attempted to add invalid child rule - %d\n", ruleType ); +#endif + } + return rule; +} + +void XboxStructureActionPlaceContainer::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"facing") == 0) + { + int value = _fromString(attributeValue); + m_data = value; + app.DebugPrintf("XboxStructureActionPlaceContainer: Adding parameter facing=%d\n",m_data); + } + else + { + XboxStructureActionPlaceBlock::addAttribute(attributeName, attributeValue); + } +} + +bool XboxStructureActionPlaceContainer::placeContainerInLevel(StructurePiece *structure, Level *level, BoundingBox *chunkBB) +{ + int worldX = structure->getWorldX( m_x, m_z ); + int worldY = structure->getWorldY( m_y ); + int worldZ = structure->getWorldZ( m_x, m_z ); + + if ( chunkBB->isInside( worldX, worldY, worldZ ) ) + { + if ( level->getTileEntity( worldX, worldY, worldZ ) != NULL ) + { + // Remove the current tile entity + level->removeTileEntity( worldX, worldY, worldZ ); + level->setTile( worldX, worldY, worldZ, 0 ); + } + + level->setTile( worldX, worldY, worldZ, m_tile ); + shared_ptr container = dynamic_pointer_cast(level->getTileEntity( worldX, worldY, worldZ )); + + app.DebugPrintf("XboxStructureActionPlaceContainer - placing a container at (%d,%d,%d)\n", worldX, worldY, worldZ); + if ( container != NULL ) + { + level->setData( worldX, worldY, worldZ, m_data); + // Add items + int slotId = 0; + for(AUTO_VAR(it, m_items.begin()); it != m_items.end() && (slotId < container->getContainerSize()); ++it, ++slotId ) + { + AddItemRuleDefinition *addItem = *it; + + addItem->addItemToContainer(container,slotId); + } + } + return true; + } + return false; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.h b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.h new file mode 100644 index 00000000..6355ca11 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.h @@ -0,0 +1,29 @@ +#pragma once + +#include "XboxStructureActionPlaceBlock.h" + +class AddItemRuleDefinition; +class StructurePiece; +class Level; +class BoundingBox; + +class XboxStructureActionPlaceContainer : public XboxStructureActionPlaceBlock +{ +private: + vector m_items; +public: + XboxStructureActionPlaceContainer(); + ~XboxStructureActionPlaceContainer(); + + virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_PlaceContainer; } + + virtual void getChildren(vector *children); + virtual GameRuleDefinition *addChild(ConsoleGameRules::EGameRuleType ruleType); + + // 4J-JEV: Super class handles attr-facing fine. + //virtual void writeAttributes(DataOutputStream *dos, UINT numAttributes); + + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + bool placeContainerInLevel(StructurePiece *structure, Level *level, BoundingBox *chunkBB); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.cpp b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.cpp new file mode 100644 index 00000000..1eca3342 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.cpp @@ -0,0 +1,69 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "XboxStructureActionPlaceSpawner.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.levelgen.structure.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" + +XboxStructureActionPlaceSpawner::XboxStructureActionPlaceSpawner() +{ + m_tile = Tile::mobSpawner_Id; + m_entityId = L"Pig"; +} + +XboxStructureActionPlaceSpawner::~XboxStructureActionPlaceSpawner() +{ +} + +void XboxStructureActionPlaceSpawner::writeAttributes(DataOutputStream *dos, UINT numAttrs) +{ + XboxStructureActionPlaceBlock::writeAttributes(dos, numAttrs + 1); + + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_entity); + dos->writeUTF(m_entityId); +} + +void XboxStructureActionPlaceSpawner::addAttribute(const wstring &attributeName, const wstring &attributeValue) +{ + if(attributeName.compare(L"entity") == 0) + { + m_entityId = attributeValue; +#ifndef _CONTENT_PACKAGE + wprintf(L"XboxStructureActionPlaceSpawner: Adding parameter entity=%ls\n",m_entityId.c_str()); +#endif + } + else + { + XboxStructureActionPlaceBlock::addAttribute(attributeName, attributeValue); + } +} + +bool XboxStructureActionPlaceSpawner::placeSpawnerInLevel(StructurePiece *structure, Level *level, BoundingBox *chunkBB) +{ + int worldX = structure->getWorldX( m_x, m_z ); + int worldY = structure->getWorldY( m_y ); + int worldZ = structure->getWorldZ( m_x, m_z ); + + if ( chunkBB->isInside( worldX, worldY, worldZ ) ) + { + if ( level->getTileEntity( worldX, worldY, worldZ ) != NULL ) + { + // Remove the current tile entity + level->removeTileEntity( worldX, worldY, worldZ ); + level->setTile( worldX, worldY, worldZ, 0 ); + } + + level->setTile( worldX, worldY, worldZ, m_tile ); + shared_ptr entity = dynamic_pointer_cast(level->getTileEntity( worldX, worldY, worldZ )); + +#ifndef _CONTENT_PACKAGE + wprintf(L"XboxStructureActionPlaceSpawner - placing a %ls spawner at (%d,%d,%d)\n", m_entityId.c_str(), worldX, worldY, worldZ); +#endif + if( entity != NULL ) + { + entity->setEntityId(m_entityId); + } + return true; + } + return false; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.h b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.h new file mode 100644 index 00000000..16000980 --- /dev/null +++ b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.h @@ -0,0 +1,24 @@ +#pragma once + +#include "XboxStructureActionPlaceBlock.h" + +class StructurePiece; +class Level; +class BoundingBox; +class GRFObject; + +class XboxStructureActionPlaceSpawner : public XboxStructureActionPlaceBlock +{ +private: + wstring m_entityId; +public: + XboxStructureActionPlaceSpawner(); + ~XboxStructureActionPlaceSpawner(); + + virtual ConsoleGameRules::EGameRuleType getActionType() { return ConsoleGameRules::eGameRuleType_PlaceSpawner; } + + virtual void writeAttributes(DataOutputStream *dos, UINT numAttrs); + virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); + + bool placeSpawnerInLevel(StructurePiece *structure, Level *level, BoundingBox *chunkBB); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Leaderboards/LeaderboardManager.cpp b/Minecraft.Client/Common/Leaderboards/LeaderboardManager.cpp new file mode 100644 index 00000000..33707b14 --- /dev/null +++ b/Minecraft.Client/Common/Leaderboards/LeaderboardManager.cpp @@ -0,0 +1,106 @@ +#include "stdafx.h" + +#include "..\..\..\Minecraft.World\StringHelpers.h" + +#include "LeaderboardManager.h" + +const wstring LeaderboardManager::filterNames[eNumFilterModes] = + { + L"Friends", L"MyScore", L"TopRank" + }; + +void LeaderboardManager::DeleteInstance() +{ + delete m_instance; + m_instance = NULL; +} + +LeaderboardManager::LeaderboardManager() +{ + zeroReadParameters(); + + m_myXUID = INVALID_XUID; +} + +void LeaderboardManager::zeroReadParameters() +{ + m_difficulty = -1; + m_statsType = eStatsType_UNDEFINED; + m_readListener = NULL; + m_startIndex = 0; + m_readCount = 0; + m_eFilterMode = eFM_UNDEFINED; +} + +bool LeaderboardManager::ReadStats_Friends(LeaderboardReadListener *listener, int difficulty, EStatsType type, PlayerUID myUID, unsigned int startIndex, unsigned int readCount) +{ + zeroReadParameters(); + + m_readListener = listener; + m_difficulty = difficulty; + m_statsType = type; + + m_eFilterMode = eFM_Friends; + return true; +} + +bool LeaderboardManager::ReadStats_MyScore(LeaderboardReadListener *listener, int difficulty, EStatsType type, PlayerUID myUID, unsigned int readCount) +{ + zeroReadParameters(); + + m_readListener = listener; + m_difficulty = difficulty; + m_statsType = type; + + m_readCount = readCount; + + m_eFilterMode = eFM_MyScore; + return true; +} + +bool LeaderboardManager::ReadStats_TopRank(LeaderboardReadListener *listener, int difficulty, EStatsType type, unsigned int startIndex, unsigned int readCount) +{ + zeroReadParameters(); + + m_readListener = listener; + m_difficulty = difficulty; + m_statsType = type; + + m_startIndex = startIndex; + m_readCount = readCount; + + m_eFilterMode = eFM_TopRank; + return true; +} + +#ifndef _XBOX +void LeaderboardManager::printStats(ReadView &view) +{ + app.DebugPrintf("[LeaderboardManager] Printing stats:\n" + "\tnumQueries=%i\n", view.m_numQueries); + + for (int i=0; i + + + Not Used + + + + OK + + + Back + + + Cancel + + + Yes + + + No + + + Corrupt Save + + + Your save data appears to be corrupt. Create a new save and overwrite the corrupt one? + + + No Free Space + + + Your selected storage device doesn't have enough free space to create a game save. + + + Select again + + + Play without saving + + + Create a new save + + + Overwrite save? + + + Your selected storage device already contains this save. Is it OK to overwrite it? + + + No - don't overwrite + + + Overwrite and save + + + Save failed + + + Storage Device Problem + + + Your storage device is unavailable or has an error + + + Your storage device is unavailable or has an error. Please select a new storage device. + + + Select a new storage device + + + No storage device selected + + + If you do not select a storage device, game saves will be disabled + + + Select a storage device + + + Continue without saving + + + Your storage device has been removed. Please select a new one. + + + Loading failed + + + Name the save + + + Enter a name for your savegame + + + Return to Xbox Dashboard + + + Are you sure you want to exit the game? + + + + Signed out + + + You have been returned to the title screen because your gamer profile was signed out + + + The match has ended because a gamer profile was signed out + + + Continue playing + + + + Gamer profile not online + + + This game has some features which require an Xbox Live enabled gamer profile, but you are currently offline. + + + This feature requires a gamer profile which is signed into Xbox Live. + + + Connect to Xbox Live + + + Continue playing offline + + + + + Achievement Award Problem + + + There was a problem accessing your gamer profile. Your achievement could not be awarded at this time. + + + + + Gamer profile problem + + + Saving of settings to gamer profile has failed. + + + + Guest Gamer Profile + + + Guest gamer profile cannot access this feature. Please use a different gamer profile. + + + + Saving… + + + Saving content. Please don't turn off your console. + + + Unlock Full Game + + + This is the Minecraft trial game. If you had the full game, you would just have earned an achievement! +Unlock the full game to experience the joy of Minecraft and to play with your friends across the globe through Xbox Live. +Would you like to unlock the full game? + + + You are being returned to the main menu because of a problem reading your profile. + + + diff --git a/Minecraft.Client/Common/Media/AnvilMenu1080.swf b/Minecraft.Client/Common/Media/AnvilMenu1080.swf new file mode 100644 index 00000000..1776eda9 Binary files /dev/null and b/Minecraft.Client/Common/Media/AnvilMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/AnvilMenu480.swf b/Minecraft.Client/Common/Media/AnvilMenu480.swf new file mode 100644 index 00000000..21a2533b Binary files /dev/null and b/Minecraft.Client/Common/Media/AnvilMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/AnvilMenu720.swf b/Minecraft.Client/Common/Media/AnvilMenu720.swf new file mode 100644 index 00000000..76492f7c Binary files /dev/null and b/Minecraft.Client/Common/Media/AnvilMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/AnvilMenuSplit1080.swf b/Minecraft.Client/Common/Media/AnvilMenuSplit1080.swf new file mode 100644 index 00000000..3830d0c1 Binary files /dev/null and b/Minecraft.Client/Common/Media/AnvilMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/AnvilMenuSplit720.swf b/Minecraft.Client/Common/Media/AnvilMenuSplit720.swf new file mode 100644 index 00000000..68539765 Binary files /dev/null and b/Minecraft.Client/Common/Media/AnvilMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/AnvilMenuVita.swf b/Minecraft.Client/Common/Media/AnvilMenuVita.swf new file mode 100644 index 00000000..d35a6f3b Binary files /dev/null and b/Minecraft.Client/Common/Media/AnvilMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/BrewingStandMenu1080.swf b/Minecraft.Client/Common/Media/BrewingStandMenu1080.swf new file mode 100644 index 00000000..0aa8d2d3 Binary files /dev/null and b/Minecraft.Client/Common/Media/BrewingStandMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/BrewingStandMenu480.swf b/Minecraft.Client/Common/Media/BrewingStandMenu480.swf new file mode 100644 index 00000000..000dfe02 Binary files /dev/null and b/Minecraft.Client/Common/Media/BrewingStandMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/BrewingStandMenu720.swf b/Minecraft.Client/Common/Media/BrewingStandMenu720.swf new file mode 100644 index 00000000..178b3e16 Binary files /dev/null and b/Minecraft.Client/Common/Media/BrewingStandMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/BrewingStandMenuSplit1080.swf b/Minecraft.Client/Common/Media/BrewingStandMenuSplit1080.swf new file mode 100644 index 00000000..71e95d90 Binary files /dev/null and b/Minecraft.Client/Common/Media/BrewingStandMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/BrewingStandMenuSplit720.swf b/Minecraft.Client/Common/Media/BrewingStandMenuSplit720.swf new file mode 100644 index 00000000..97a9c6f0 Binary files /dev/null and b/Minecraft.Client/Common/Media/BrewingStandMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/BrewingStandMenuVita.swf b/Minecraft.Client/Common/Media/BrewingStandMenuVita.swf new file mode 100644 index 00000000..8d1d0e44 Binary files /dev/null and b/Minecraft.Client/Common/Media/BrewingStandMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/ChestLargeMenu1080.swf b/Minecraft.Client/Common/Media/ChestLargeMenu1080.swf new file mode 100644 index 00000000..951a5633 Binary files /dev/null and b/Minecraft.Client/Common/Media/ChestLargeMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/ChestLargeMenu480.swf b/Minecraft.Client/Common/Media/ChestLargeMenu480.swf new file mode 100644 index 00000000..9fcdf7e1 Binary files /dev/null and b/Minecraft.Client/Common/Media/ChestLargeMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/ChestLargeMenu720.swf b/Minecraft.Client/Common/Media/ChestLargeMenu720.swf new file mode 100644 index 00000000..ad21db18 Binary files /dev/null and b/Minecraft.Client/Common/Media/ChestLargeMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/ChestLargeMenuSplit1080.swf b/Minecraft.Client/Common/Media/ChestLargeMenuSplit1080.swf new file mode 100644 index 00000000..ab687d9b Binary files /dev/null and b/Minecraft.Client/Common/Media/ChestLargeMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/ChestLargeMenuSplit720.swf b/Minecraft.Client/Common/Media/ChestLargeMenuSplit720.swf new file mode 100644 index 00000000..c38cdada Binary files /dev/null and b/Minecraft.Client/Common/Media/ChestLargeMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/ChestLargeMenuVita.swf b/Minecraft.Client/Common/Media/ChestLargeMenuVita.swf new file mode 100644 index 00000000..6e8795dd Binary files /dev/null and b/Minecraft.Client/Common/Media/ChestLargeMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/ChestMenu1080.swf b/Minecraft.Client/Common/Media/ChestMenu1080.swf new file mode 100644 index 00000000..6f1672e0 Binary files /dev/null and b/Minecraft.Client/Common/Media/ChestMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/ChestMenu480.swf b/Minecraft.Client/Common/Media/ChestMenu480.swf new file mode 100644 index 00000000..89f13de5 Binary files /dev/null and b/Minecraft.Client/Common/Media/ChestMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/ChestMenu720.swf b/Minecraft.Client/Common/Media/ChestMenu720.swf new file mode 100644 index 00000000..c4b694ec Binary files /dev/null and b/Minecraft.Client/Common/Media/ChestMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/ChestMenuSplit1080.swf b/Minecraft.Client/Common/Media/ChestMenuSplit1080.swf new file mode 100644 index 00000000..3b2d3d84 Binary files /dev/null and b/Minecraft.Client/Common/Media/ChestMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/ChestMenuSplit720.swf b/Minecraft.Client/Common/Media/ChestMenuSplit720.swf new file mode 100644 index 00000000..5ca9b178 Binary files /dev/null and b/Minecraft.Client/Common/Media/ChestMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/ChestMenuVita.swf b/Minecraft.Client/Common/Media/ChestMenuVita.swf new file mode 100644 index 00000000..63e76142 Binary files /dev/null and b/Minecraft.Client/Common/Media/ChestMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/ComponentLogo1080.swf b/Minecraft.Client/Common/Media/ComponentLogo1080.swf new file mode 100644 index 00000000..9e93b929 Binary files /dev/null and b/Minecraft.Client/Common/Media/ComponentLogo1080.swf differ diff --git a/Minecraft.Client/Common/Media/ComponentLogo480.swf b/Minecraft.Client/Common/Media/ComponentLogo480.swf new file mode 100644 index 00000000..037a51f4 Binary files /dev/null and b/Minecraft.Client/Common/Media/ComponentLogo480.swf differ diff --git a/Minecraft.Client/Common/Media/ComponentLogo720.swf b/Minecraft.Client/Common/Media/ComponentLogo720.swf new file mode 100644 index 00000000..3e65120f Binary files /dev/null and b/Minecraft.Client/Common/Media/ComponentLogo720.swf differ diff --git a/Minecraft.Client/Common/Media/ComponentLogoSplit1080.swf b/Minecraft.Client/Common/Media/ComponentLogoSplit1080.swf new file mode 100644 index 00000000..b3c19b34 Binary files /dev/null and b/Minecraft.Client/Common/Media/ComponentLogoSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/ComponentLogoSplit720.swf b/Minecraft.Client/Common/Media/ComponentLogoSplit720.swf new file mode 100644 index 00000000..982fc19b Binary files /dev/null and b/Minecraft.Client/Common/Media/ComponentLogoSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/ComponentLogoVita.swf b/Minecraft.Client/Common/Media/ComponentLogoVita.swf new file mode 100644 index 00000000..d1d8e5a4 Binary files /dev/null and b/Minecraft.Client/Common/Media/ComponentLogoVita.swf differ diff --git a/Minecraft.Client/Common/Media/Controls1080.swf b/Minecraft.Client/Common/Media/Controls1080.swf new file mode 100644 index 00000000..36051b8c Binary files /dev/null and b/Minecraft.Client/Common/Media/Controls1080.swf differ diff --git a/Minecraft.Client/Common/Media/Controls480.swf b/Minecraft.Client/Common/Media/Controls480.swf new file mode 100644 index 00000000..5785e2c6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Controls480.swf differ diff --git a/Minecraft.Client/Common/Media/Controls720.swf b/Minecraft.Client/Common/Media/Controls720.swf new file mode 100644 index 00000000..61eb9c83 Binary files /dev/null and b/Minecraft.Client/Common/Media/Controls720.swf differ diff --git a/Minecraft.Client/Common/Media/ControlsRemotePlay1080.swf b/Minecraft.Client/Common/Media/ControlsRemotePlay1080.swf new file mode 100644 index 00000000..a1d21f0f Binary files /dev/null and b/Minecraft.Client/Common/Media/ControlsRemotePlay1080.swf differ diff --git a/Minecraft.Client/Common/Media/ControlsSplit1080.swf b/Minecraft.Client/Common/Media/ControlsSplit1080.swf new file mode 100644 index 00000000..e7c1c971 Binary files /dev/null and b/Minecraft.Client/Common/Media/ControlsSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/ControlsSplit720.swf b/Minecraft.Client/Common/Media/ControlsSplit720.swf new file mode 100644 index 00000000..8f657ac9 Binary files /dev/null and b/Minecraft.Client/Common/Media/ControlsSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/ControlsTVVita.swf b/Minecraft.Client/Common/Media/ControlsTVVita.swf new file mode 100644 index 00000000..32488a79 Binary files /dev/null and b/Minecraft.Client/Common/Media/ControlsTVVita.swf differ diff --git a/Minecraft.Client/Common/Media/ControlsVita.swf b/Minecraft.Client/Common/Media/ControlsVita.swf new file mode 100644 index 00000000..a3b37256 Binary files /dev/null and b/Minecraft.Client/Common/Media/ControlsVita.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting2x2Menu1080.swf b/Minecraft.Client/Common/Media/Crafting2x2Menu1080.swf new file mode 100644 index 00000000..65cb014a Binary files /dev/null and b/Minecraft.Client/Common/Media/Crafting2x2Menu1080.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting2x2Menu480.swf b/Minecraft.Client/Common/Media/Crafting2x2Menu480.swf new file mode 100644 index 00000000..0a6047d9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Crafting2x2Menu480.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting2x2Menu720.swf b/Minecraft.Client/Common/Media/Crafting2x2Menu720.swf new file mode 100644 index 00000000..6a2a0aae Binary files /dev/null and b/Minecraft.Client/Common/Media/Crafting2x2Menu720.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting2x2MenuSplit1080.swf b/Minecraft.Client/Common/Media/Crafting2x2MenuSplit1080.swf new file mode 100644 index 00000000..5e427387 Binary files /dev/null and b/Minecraft.Client/Common/Media/Crafting2x2MenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting2x2MenuSplit720.swf b/Minecraft.Client/Common/Media/Crafting2x2MenuSplit720.swf new file mode 100644 index 00000000..a50730af Binary files /dev/null and b/Minecraft.Client/Common/Media/Crafting2x2MenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting2x2MenuVita.swf b/Minecraft.Client/Common/Media/Crafting2x2MenuVita.swf new file mode 100644 index 00000000..041e7663 Binary files /dev/null and b/Minecraft.Client/Common/Media/Crafting2x2MenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting3x3Menu1080.swf b/Minecraft.Client/Common/Media/Crafting3x3Menu1080.swf new file mode 100644 index 00000000..4d4d4255 Binary files /dev/null and b/Minecraft.Client/Common/Media/Crafting3x3Menu1080.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting3x3Menu480.swf b/Minecraft.Client/Common/Media/Crafting3x3Menu480.swf new file mode 100644 index 00000000..00f03d75 Binary files /dev/null and b/Minecraft.Client/Common/Media/Crafting3x3Menu480.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting3x3Menu720.swf b/Minecraft.Client/Common/Media/Crafting3x3Menu720.swf new file mode 100644 index 00000000..e7888d13 Binary files /dev/null and b/Minecraft.Client/Common/Media/Crafting3x3Menu720.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting3x3MenuSplit1080.swf b/Minecraft.Client/Common/Media/Crafting3x3MenuSplit1080.swf new file mode 100644 index 00000000..cc42f3d1 Binary files /dev/null and b/Minecraft.Client/Common/Media/Crafting3x3MenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting3x3MenuSplit720.swf b/Minecraft.Client/Common/Media/Crafting3x3MenuSplit720.swf new file mode 100644 index 00000000..f2224ec8 Binary files /dev/null and b/Minecraft.Client/Common/Media/Crafting3x3MenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting3x3MenuVita.swf b/Minecraft.Client/Common/Media/Crafting3x3MenuVita.swf new file mode 100644 index 00000000..09a25f7e Binary files /dev/null and b/Minecraft.Client/Common/Media/Crafting3x3MenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/CreateWorldMenu1080.swf b/Minecraft.Client/Common/Media/CreateWorldMenu1080.swf new file mode 100644 index 00000000..245bbf65 Binary files /dev/null and b/Minecraft.Client/Common/Media/CreateWorldMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/CreateWorldMenu480.swf b/Minecraft.Client/Common/Media/CreateWorldMenu480.swf new file mode 100644 index 00000000..9426b616 Binary files /dev/null and b/Minecraft.Client/Common/Media/CreateWorldMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/CreateWorldMenu720.swf b/Minecraft.Client/Common/Media/CreateWorldMenu720.swf new file mode 100644 index 00000000..b7474a63 Binary files /dev/null and b/Minecraft.Client/Common/Media/CreateWorldMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/CreateWorldMenuVita.swf b/Minecraft.Client/Common/Media/CreateWorldMenuVita.swf new file mode 100644 index 00000000..814efa9c Binary files /dev/null and b/Minecraft.Client/Common/Media/CreateWorldMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/CreativeMenu1080.swf b/Minecraft.Client/Common/Media/CreativeMenu1080.swf new file mode 100644 index 00000000..cdd0b9de Binary files /dev/null and b/Minecraft.Client/Common/Media/CreativeMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/CreativeMenu480.swf b/Minecraft.Client/Common/Media/CreativeMenu480.swf new file mode 100644 index 00000000..4f6094b2 Binary files /dev/null and b/Minecraft.Client/Common/Media/CreativeMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/CreativeMenu720.swf b/Minecraft.Client/Common/Media/CreativeMenu720.swf new file mode 100644 index 00000000..04cb96f6 Binary files /dev/null and b/Minecraft.Client/Common/Media/CreativeMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/CreativeMenuSplit1080.swf b/Minecraft.Client/Common/Media/CreativeMenuSplit1080.swf new file mode 100644 index 00000000..51bab154 Binary files /dev/null and b/Minecraft.Client/Common/Media/CreativeMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/CreativeMenuSplit720.swf b/Minecraft.Client/Common/Media/CreativeMenuSplit720.swf new file mode 100644 index 00000000..b0a06ceb Binary files /dev/null and b/Minecraft.Client/Common/Media/CreativeMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/CreativeMenuVita.swf b/Minecraft.Client/Common/Media/CreativeMenuVita.swf new file mode 100644 index 00000000..ecbbb3db Binary files /dev/null and b/Minecraft.Client/Common/Media/CreativeMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/Credits1080.swf b/Minecraft.Client/Common/Media/Credits1080.swf new file mode 100644 index 00000000..20b2027e Binary files /dev/null and b/Minecraft.Client/Common/Media/Credits1080.swf differ diff --git a/Minecraft.Client/Common/Media/Credits480.swf b/Minecraft.Client/Common/Media/Credits480.swf new file mode 100644 index 00000000..3bfee952 Binary files /dev/null and b/Minecraft.Client/Common/Media/Credits480.swf differ diff --git a/Minecraft.Client/Common/Media/Credits720.swf b/Minecraft.Client/Common/Media/Credits720.swf new file mode 100644 index 00000000..9396df05 Binary files /dev/null and b/Minecraft.Client/Common/Media/Credits720.swf differ diff --git a/Minecraft.Client/Common/Media/CreditsVita.swf b/Minecraft.Client/Common/Media/CreditsVita.swf new file mode 100644 index 00000000..aa877899 Binary files /dev/null and b/Minecraft.Client/Common/Media/CreditsVita.swf differ diff --git a/Minecraft.Client/Common/Media/DLCMainMenu1080.swf b/Minecraft.Client/Common/Media/DLCMainMenu1080.swf new file mode 100644 index 00000000..5d7e40fa Binary files /dev/null and b/Minecraft.Client/Common/Media/DLCMainMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/DLCMainMenu480.swf b/Minecraft.Client/Common/Media/DLCMainMenu480.swf new file mode 100644 index 00000000..3697b7c4 Binary files /dev/null and b/Minecraft.Client/Common/Media/DLCMainMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/DLCMainMenu720.swf b/Minecraft.Client/Common/Media/DLCMainMenu720.swf new file mode 100644 index 00000000..512301ec Binary files /dev/null and b/Minecraft.Client/Common/Media/DLCMainMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/DLCMainMenuVita.swf b/Minecraft.Client/Common/Media/DLCMainMenuVita.swf new file mode 100644 index 00000000..145a7194 Binary files /dev/null and b/Minecraft.Client/Common/Media/DLCMainMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/DLCOffersMenu1080.swf b/Minecraft.Client/Common/Media/DLCOffersMenu1080.swf new file mode 100644 index 00000000..07094b53 Binary files /dev/null and b/Minecraft.Client/Common/Media/DLCOffersMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/DLCOffersMenu480.swf b/Minecraft.Client/Common/Media/DLCOffersMenu480.swf new file mode 100644 index 00000000..7ceb2c8f Binary files /dev/null and b/Minecraft.Client/Common/Media/DLCOffersMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/DLCOffersMenu720.swf b/Minecraft.Client/Common/Media/DLCOffersMenu720.swf new file mode 100644 index 00000000..aabfdfef Binary files /dev/null and b/Minecraft.Client/Common/Media/DLCOffersMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/DLCOffersMenuVita.swf b/Minecraft.Client/Common/Media/DLCOffersMenuVita.swf new file mode 100644 index 00000000..9dfa6d89 Binary files /dev/null and b/Minecraft.Client/Common/Media/DLCOffersMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/DeathMenu1080.swf b/Minecraft.Client/Common/Media/DeathMenu1080.swf new file mode 100644 index 00000000..10c097dd Binary files /dev/null and b/Minecraft.Client/Common/Media/DeathMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/DeathMenu480.swf b/Minecraft.Client/Common/Media/DeathMenu480.swf new file mode 100644 index 00000000..1faa7a04 Binary files /dev/null and b/Minecraft.Client/Common/Media/DeathMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/DeathMenu720.swf b/Minecraft.Client/Common/Media/DeathMenu720.swf new file mode 100644 index 00000000..c9e323dc Binary files /dev/null and b/Minecraft.Client/Common/Media/DeathMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/DeathMenuSplit1080.swf b/Minecraft.Client/Common/Media/DeathMenuSplit1080.swf new file mode 100644 index 00000000..b9aba4c0 Binary files /dev/null and b/Minecraft.Client/Common/Media/DeathMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/DeathMenuSplit720.swf b/Minecraft.Client/Common/Media/DeathMenuSplit720.swf new file mode 100644 index 00000000..fd912891 Binary files /dev/null and b/Minecraft.Client/Common/Media/DeathMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/DeathMenuVita.swf b/Minecraft.Client/Common/Media/DeathMenuVita.swf new file mode 100644 index 00000000..08fb19ec Binary files /dev/null and b/Minecraft.Client/Common/Media/DeathMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/DebugCreateSchematic1080.swf b/Minecraft.Client/Common/Media/DebugCreateSchematic1080.swf new file mode 100644 index 00000000..191bbddd Binary files /dev/null and b/Minecraft.Client/Common/Media/DebugCreateSchematic1080.swf differ diff --git a/Minecraft.Client/Common/Media/DebugCreateSchematic720.swf b/Minecraft.Client/Common/Media/DebugCreateSchematic720.swf new file mode 100644 index 00000000..f7f59c57 Binary files /dev/null and b/Minecraft.Client/Common/Media/DebugCreateSchematic720.swf differ diff --git a/Minecraft.Client/Common/Media/DebugMenu1080.swf b/Minecraft.Client/Common/Media/DebugMenu1080.swf new file mode 100644 index 00000000..f9de2197 Binary files /dev/null and b/Minecraft.Client/Common/Media/DebugMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/DebugMenu720.swf b/Minecraft.Client/Common/Media/DebugMenu720.swf new file mode 100644 index 00000000..0bf908b6 Binary files /dev/null and b/Minecraft.Client/Common/Media/DebugMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/DebugOptionsMenu1080.swf b/Minecraft.Client/Common/Media/DebugOptionsMenu1080.swf new file mode 100644 index 00000000..62c663a6 Binary files /dev/null and b/Minecraft.Client/Common/Media/DebugOptionsMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/DebugOptionsMenu720.swf b/Minecraft.Client/Common/Media/DebugOptionsMenu720.swf new file mode 100644 index 00000000..a22e81b2 Binary files /dev/null and b/Minecraft.Client/Common/Media/DebugOptionsMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/DebugSetCamera1080.swf b/Minecraft.Client/Common/Media/DebugSetCamera1080.swf new file mode 100644 index 00000000..093b1b8e Binary files /dev/null and b/Minecraft.Client/Common/Media/DebugSetCamera1080.swf differ diff --git a/Minecraft.Client/Common/Media/DebugSetCamera720.swf b/Minecraft.Client/Common/Media/DebugSetCamera720.swf new file mode 100644 index 00000000..6505d3f0 Binary files /dev/null and b/Minecraft.Client/Common/Media/DebugSetCamera720.swf differ diff --git a/Minecraft.Client/Common/Media/DebugUIConsoleComponent1080.swf b/Minecraft.Client/Common/Media/DebugUIConsoleComponent1080.swf new file mode 100644 index 00000000..51c1c0ea Binary files /dev/null and b/Minecraft.Client/Common/Media/DebugUIConsoleComponent1080.swf differ diff --git a/Minecraft.Client/Common/Media/DebugUIConsoleComponent720.swf b/Minecraft.Client/Common/Media/DebugUIConsoleComponent720.swf new file mode 100644 index 00000000..430060d6 Binary files /dev/null and b/Minecraft.Client/Common/Media/DebugUIConsoleComponent720.swf differ diff --git a/Minecraft.Client/Common/Media/DebugUIMarketingGuide1080.swf b/Minecraft.Client/Common/Media/DebugUIMarketingGuide1080.swf new file mode 100644 index 00000000..7406ae55 Binary files /dev/null and b/Minecraft.Client/Common/Media/DebugUIMarketingGuide1080.swf differ diff --git a/Minecraft.Client/Common/Media/DebugUIMarketingGuide720.swf b/Minecraft.Client/Common/Media/DebugUIMarketingGuide720.swf new file mode 100644 index 00000000..945020ec Binary files /dev/null and b/Minecraft.Client/Common/Media/DebugUIMarketingGuide720.swf differ diff --git a/Minecraft.Client/Common/Media/DispenserMenu1080.swf b/Minecraft.Client/Common/Media/DispenserMenu1080.swf new file mode 100644 index 00000000..1833b868 Binary files /dev/null and b/Minecraft.Client/Common/Media/DispenserMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/DispenserMenu480.swf b/Minecraft.Client/Common/Media/DispenserMenu480.swf new file mode 100644 index 00000000..cdd1d587 Binary files /dev/null and b/Minecraft.Client/Common/Media/DispenserMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/DispenserMenu720.swf b/Minecraft.Client/Common/Media/DispenserMenu720.swf new file mode 100644 index 00000000..28d8664c Binary files /dev/null and b/Minecraft.Client/Common/Media/DispenserMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/DispenserMenuSplit1080.swf b/Minecraft.Client/Common/Media/DispenserMenuSplit1080.swf new file mode 100644 index 00000000..4619e30a Binary files /dev/null and b/Minecraft.Client/Common/Media/DispenserMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/DispenserMenuSplit720.swf b/Minecraft.Client/Common/Media/DispenserMenuSplit720.swf new file mode 100644 index 00000000..9e0af4b4 Binary files /dev/null and b/Minecraft.Client/Common/Media/DispenserMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/DispenserMenuVita.swf b/Minecraft.Client/Common/Media/DispenserMenuVita.swf new file mode 100644 index 00000000..fcf62ed2 Binary files /dev/null and b/Minecraft.Client/Common/Media/DispenserMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/EULA1080.swf b/Minecraft.Client/Common/Media/EULA1080.swf new file mode 100644 index 00000000..f05c71ed Binary files /dev/null and b/Minecraft.Client/Common/Media/EULA1080.swf differ diff --git a/Minecraft.Client/Common/Media/EULA480.swf b/Minecraft.Client/Common/Media/EULA480.swf new file mode 100644 index 00000000..fc079444 Binary files /dev/null and b/Minecraft.Client/Common/Media/EULA480.swf differ diff --git a/Minecraft.Client/Common/Media/EULA720.swf b/Minecraft.Client/Common/Media/EULA720.swf new file mode 100644 index 00000000..2deba6fd Binary files /dev/null and b/Minecraft.Client/Common/Media/EULA720.swf differ diff --git a/Minecraft.Client/Common/Media/EULAVita.swf b/Minecraft.Client/Common/Media/EULAVita.swf new file mode 100644 index 00000000..525ad6d5 Binary files /dev/null and b/Minecraft.Client/Common/Media/EULAVita.swf differ diff --git a/Minecraft.Client/Common/Media/EnchantingMenu1080.swf b/Minecraft.Client/Common/Media/EnchantingMenu1080.swf new file mode 100644 index 00000000..c86b678b Binary files /dev/null and b/Minecraft.Client/Common/Media/EnchantingMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/EnchantingMenu480.swf b/Minecraft.Client/Common/Media/EnchantingMenu480.swf new file mode 100644 index 00000000..eeee87ad Binary files /dev/null and b/Minecraft.Client/Common/Media/EnchantingMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/EnchantingMenu720.swf b/Minecraft.Client/Common/Media/EnchantingMenu720.swf new file mode 100644 index 00000000..f309fec9 Binary files /dev/null and b/Minecraft.Client/Common/Media/EnchantingMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/EnchantingMenuSplit1080.swf b/Minecraft.Client/Common/Media/EnchantingMenuSplit1080.swf new file mode 100644 index 00000000..31078758 Binary files /dev/null and b/Minecraft.Client/Common/Media/EnchantingMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/EnchantingMenuSplit720.swf b/Minecraft.Client/Common/Media/EnchantingMenuSplit720.swf new file mode 100644 index 00000000..e1e9aaa4 Binary files /dev/null and b/Minecraft.Client/Common/Media/EnchantingMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/EnchantingMenuVita.swf b/Minecraft.Client/Common/Media/EnchantingMenuVita.swf new file mode 100644 index 00000000..14a91482 Binary files /dev/null and b/Minecraft.Client/Common/Media/EnchantingMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/EndPoem1080.swf b/Minecraft.Client/Common/Media/EndPoem1080.swf new file mode 100644 index 00000000..64ca91eb Binary files /dev/null and b/Minecraft.Client/Common/Media/EndPoem1080.swf differ diff --git a/Minecraft.Client/Common/Media/EndPoem480.swf b/Minecraft.Client/Common/Media/EndPoem480.swf new file mode 100644 index 00000000..a957a040 Binary files /dev/null and b/Minecraft.Client/Common/Media/EndPoem480.swf differ diff --git a/Minecraft.Client/Common/Media/EndPoem720.swf b/Minecraft.Client/Common/Media/EndPoem720.swf new file mode 100644 index 00000000..d985e66a Binary files /dev/null and b/Minecraft.Client/Common/Media/EndPoem720.swf differ diff --git a/Minecraft.Client/Common/Media/EndPoemVita.swf b/Minecraft.Client/Common/Media/EndPoemVita.swf new file mode 100644 index 00000000..26f37bf9 Binary files /dev/null and b/Minecraft.Client/Common/Media/EndPoemVita.swf differ diff --git a/Minecraft.Client/Common/Media/FullscreenProgress1080.swf b/Minecraft.Client/Common/Media/FullscreenProgress1080.swf new file mode 100644 index 00000000..2f2f85be Binary files /dev/null and b/Minecraft.Client/Common/Media/FullscreenProgress1080.swf differ diff --git a/Minecraft.Client/Common/Media/FullscreenProgress480.swf b/Minecraft.Client/Common/Media/FullscreenProgress480.swf new file mode 100644 index 00000000..4e2ccb6c Binary files /dev/null and b/Minecraft.Client/Common/Media/FullscreenProgress480.swf differ diff --git a/Minecraft.Client/Common/Media/FullscreenProgress720.swf b/Minecraft.Client/Common/Media/FullscreenProgress720.swf new file mode 100644 index 00000000..39250572 Binary files /dev/null and b/Minecraft.Client/Common/Media/FullscreenProgress720.swf differ diff --git a/Minecraft.Client/Common/Media/FullscreenProgressSplit1080.swf b/Minecraft.Client/Common/Media/FullscreenProgressSplit1080.swf new file mode 100644 index 00000000..811c2dea Binary files /dev/null and b/Minecraft.Client/Common/Media/FullscreenProgressSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/FullscreenProgressSplit720.swf b/Minecraft.Client/Common/Media/FullscreenProgressSplit720.swf new file mode 100644 index 00000000..1daa0eab Binary files /dev/null and b/Minecraft.Client/Common/Media/FullscreenProgressSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/FullscreenProgressVita.swf b/Minecraft.Client/Common/Media/FullscreenProgressVita.swf new file mode 100644 index 00000000..a15a2e3e Binary files /dev/null and b/Minecraft.Client/Common/Media/FullscreenProgressVita.swf differ diff --git a/Minecraft.Client/Common/Media/FurnaceMenu1080.swf b/Minecraft.Client/Common/Media/FurnaceMenu1080.swf new file mode 100644 index 00000000..e21c3dea Binary files /dev/null and b/Minecraft.Client/Common/Media/FurnaceMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/FurnaceMenu480.swf b/Minecraft.Client/Common/Media/FurnaceMenu480.swf new file mode 100644 index 00000000..802e7940 Binary files /dev/null and b/Minecraft.Client/Common/Media/FurnaceMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/FurnaceMenu720.swf b/Minecraft.Client/Common/Media/FurnaceMenu720.swf new file mode 100644 index 00000000..f0e76da3 Binary files /dev/null and b/Minecraft.Client/Common/Media/FurnaceMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/FurnaceMenuSplit1080.swf b/Minecraft.Client/Common/Media/FurnaceMenuSplit1080.swf new file mode 100644 index 00000000..0b78826e Binary files /dev/null and b/Minecraft.Client/Common/Media/FurnaceMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/FurnaceMenuSplit720.swf b/Minecraft.Client/Common/Media/FurnaceMenuSplit720.swf new file mode 100644 index 00000000..b9fe506b Binary files /dev/null and b/Minecraft.Client/Common/Media/FurnaceMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/FurnaceMenuVita.swf b/Minecraft.Client/Common/Media/FurnaceMenuVita.swf new file mode 100644 index 00000000..25d6d8ec Binary files /dev/null and b/Minecraft.Client/Common/Media/FurnaceMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/GamertagSplit720.swf b/Minecraft.Client/Common/Media/GamertagSplit720.swf new file mode 100644 index 00000000..0373d5a6 Binary files /dev/null and b/Minecraft.Client/Common/Media/GamertagSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/Graphics/AnvilCross.png b/Minecraft.Client/Common/Media/Graphics/AnvilCross.png new file mode 100644 index 00000000..6e78dfaf Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/AnvilCross.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/AnvilHammer.png b/Minecraft.Client/Common/Media/Graphics/AnvilHammer.png new file mode 100644 index 00000000..94ec647c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/AnvilHammer.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/AnvilPlus.png b/Minecraft.Client/Common/Media/Graphics/AnvilPlus.png new file mode 100644 index 00000000..261176d2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/AnvilPlus.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Armour_Slot_Body.png b/Minecraft.Client/Common/Media/Graphics/Armour_Slot_Body.png new file mode 100644 index 00000000..c1fbf884 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Armour_Slot_Body.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Armour_Slot_Feet.png b/Minecraft.Client/Common/Media/Graphics/Armour_Slot_Feet.png new file mode 100644 index 00000000..0180d560 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Armour_Slot_Feet.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Armour_Slot_Head.png b/Minecraft.Client/Common/Media/Graphics/Armour_Slot_Head.png new file mode 100644 index 00000000..d96b0423 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Armour_Slot_Head.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Armour_Slot_Legs.png b/Minecraft.Client/Common/Media/Graphics/Armour_Slot_Legs.png new file mode 100644 index 00000000..71b6df34 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Armour_Slot_Legs.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Arrow_Off.png b/Minecraft.Client/Common/Media/Graphics/Arrow_Off.png new file mode 100644 index 00000000..fe0ffb41 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Arrow_Off.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Arrow_On.png b/Minecraft.Client/Common/Media/Graphics/Arrow_On.png new file mode 100644 index 00000000..356edd0c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Arrow_On.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Arrow_Small_Off.png b/Minecraft.Client/Common/Media/Graphics/Arrow_Small_Off.png new file mode 100644 index 00000000..c27d89ab Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Arrow_Small_Off.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Arrow_Small_On.png b/Minecraft.Client/Common/Media/Graphics/Arrow_Small_On.png new file mode 100644 index 00000000..653f1a10 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Arrow_Small_On.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/BrewingArrow_Off.png b/Minecraft.Client/Common/Media/Graphics/BrewingArrow_Off.png new file mode 100644 index 00000000..890db0a8 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/BrewingArrow_Off.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/BrewingArrow_On.png b/Minecraft.Client/Common/Media/Graphics/BrewingArrow_On.png new file mode 100644 index 00000000..a57b2d37 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/BrewingArrow_On.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/BrewingArrow_Small_Off.png b/Minecraft.Client/Common/Media/Graphics/BrewingArrow_Small_Off.png new file mode 100644 index 00000000..43b85846 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/BrewingArrow_Small_Off.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/BrewingArrow_Small_On.png b/Minecraft.Client/Common/Media/Graphics/BrewingArrow_Small_On.png new file mode 100644 index 00000000..c921bcfe Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/BrewingArrow_Small_On.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/BrewingBubbles_Off.png b/Minecraft.Client/Common/Media/Graphics/BrewingBubbles_Off.png new file mode 100644 index 00000000..4aa026c2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/BrewingBubbles_Off.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/BrewingBubbles_On.png b/Minecraft.Client/Common/Media/Graphics/BrewingBubbles_On.png new file mode 100644 index 00000000..0c910850 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/BrewingBubbles_On.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/BrewingBubbles_Small_Off.png b/Minecraft.Client/Common/Media/Graphics/BrewingBubbles_Small_Off.png new file mode 100644 index 00000000..616774c1 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/BrewingBubbles_Small_Off.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/BrewingBubbles_Small_On.png b/Minecraft.Client/Common/Media/Graphics/BrewingBubbles_Small_On.png new file mode 100644 index 00000000..91fbf090 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/BrewingBubbles_Small_On.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/BrewingStand.png b/Minecraft.Client/Common/Media/Graphics/BrewingStand.png new file mode 100644 index 00000000..419dac9d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/BrewingStand.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/BrewingStand_small.png b/Minecraft.Client/Common/Media/Graphics/BrewingStand_small.png new file mode 100644 index 00000000..91794485 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/BrewingStand_small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Controller_Message_Frame_L.png b/Minecraft.Client/Common/Media/Graphics/Controller_Message_Frame_L.png new file mode 100644 index 00000000..bc5f8c4a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Controller_Message_Frame_L.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Controller_Quadrant_Icon_Empty.png b/Minecraft.Client/Common/Media/Graphics/Controller_Quadrant_Icon_Empty.png new file mode 100644 index 00000000..777eeec9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Controller_Quadrant_Icon_Empty.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Controller_Quadrant_Icon_Segment.png b/Minecraft.Client/Common/Media/Graphics/Controller_Quadrant_Icon_Segment.png new file mode 100644 index 00000000..611be0bb Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Controller_Quadrant_Icon_Segment.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_Materials.png b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_Materials.png new file mode 100644 index 00000000..fffdde5e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_Materials.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_Redstone_and_Transport.png b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_Redstone_and_Transport.png new file mode 100644 index 00000000..45a89584 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_Redstone_and_Transport.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_armour.png b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_armour.png new file mode 100644 index 00000000..62dd6431 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_armour.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_brewing.png b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_brewing.png new file mode 100644 index 00000000..b8536a3d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_brewing.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_decoration.png b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_decoration.png new file mode 100644 index 00000000..65c802d6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_decoration.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_food.png b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_food.png new file mode 100644 index 00000000..038d8aad Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_food.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_mechanisms.png b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_mechanisms.png new file mode 100644 index 00000000..1eb81a27 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_mechanisms.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_misc.png b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_misc.png new file mode 100644 index 00000000..e0737cb2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_misc.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_structures.png b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_structures.png new file mode 100644 index 00000000..b69b5d04 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_structures.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_tools.png b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_tools.png new file mode 100644 index 00000000..7a59c7ce Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_tools.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_transport.png b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_transport.png new file mode 100644 index 00000000..c60f9303 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftIcons/icon_transport.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftScene/Craft_Highlight_L_ExtraSmall.png b/Minecraft.Client/Common/Media/Graphics/CraftScene/Craft_Highlight_L_ExtraSmall.png new file mode 100644 index 00000000..bffd9a7f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftScene/Craft_Highlight_L_ExtraSmall.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftScene/Craft_Highlight_L_Small.png b/Minecraft.Client/Common/Media/Graphics/CraftScene/Craft_Highlight_L_Small.png new file mode 100644 index 00000000..a7981af7 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftScene/Craft_Highlight_L_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftScene/Crafting_2SlotLargeV.png b/Minecraft.Client/Common/Media/Graphics/CraftScene/Crafting_2SlotLargeV.png new file mode 100644 index 00000000..32144c33 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftScene/Crafting_2SlotLargeV.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftScene/Crafting_2SlotSmallV.png b/Minecraft.Client/Common/Media/Graphics/CraftScene/Crafting_2SlotSmallV.png new file mode 100644 index 00000000..ea93b91c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftScene/Crafting_2SlotSmallV.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CraftScene/Crafting_3SlotLargeV.png b/Minecraft.Client/Common/Media/Graphics/CraftScene/Crafting_3SlotLargeV.png new file mode 100644 index 00000000..034ff80d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CraftScene/Crafting_3SlotLargeV.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/CreditBackground.png b/Minecraft.Client/Common/Media/Graphics/CreditBackground.png new file mode 100644 index 00000000..d979ebe7 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/CreditBackground.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/DLCBackground.png b/Minecraft.Client/Common/Media/Graphics/DLCBackground.png new file mode 100644 index 00000000..636a4d10 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/DLCBackground.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/DLC_Tick.png b/Minecraft.Client/Common/Media/Graphics/DLC_Tick.png new file mode 100644 index 00000000..2645bdf8 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/DLC_Tick.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/DLC_TickSmall.png b/Minecraft.Client/Common/Media/Graphics/DLC_TickSmall.png new file mode 100644 index 00000000..efa3b796 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/DLC_TickSmall.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/DefaultPack_Comparison.png b/Minecraft.Client/Common/Media/Graphics/DefaultPack_Comparison.png new file mode 100644 index 00000000..c654f994 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/DefaultPack_Comparison.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Dirt_Tile.png b/Minecraft.Client/Common/Media/Graphics/Dirt_Tile.png new file mode 100644 index 00000000..bd311a10 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Dirt_Tile.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Enchant_Slot.png b/Minecraft.Client/Common/Media/Graphics/Enchant_Slot.png new file mode 100644 index 00000000..77797bd0 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Enchant_Slot.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Enchant_Slot_Small.png b/Minecraft.Client/Common/Media/Graphics/Enchant_Slot_Small.png new file mode 100644 index 00000000..249667f0 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Enchant_Slot_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonActive.png b/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonActive.png new file mode 100644 index 00000000..08204edf Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonActive.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonActive_small.png b/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonActive_small.png new file mode 100644 index 00000000..ee49147c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonActive_small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonEmpty.png b/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonEmpty.png new file mode 100644 index 00000000..96a16143 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonEmpty.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonEmpty_small.png b/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonEmpty_small.png new file mode 100644 index 00000000..c9eb657d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonEmpty_small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonSelected.png b/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonSelected.png new file mode 100644 index 00000000..8d29377f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonSelected.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonSelected_small.png b/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonSelected_small.png new file mode 100644 index 00000000..766eef60 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/EnchantmentButtonSelected_small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Flame_Off.png b/Minecraft.Client/Common/Media/Graphics/Flame_Off.png new file mode 100644 index 00000000..81b42fc3 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Flame_Off.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Flame_Off_Small.png b/Minecraft.Client/Common/Media/Graphics/Flame_Off_Small.png new file mode 100644 index 00000000..cf866b2e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Flame_Off_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Flame_On.png b/Minecraft.Client/Common/Media/Graphics/Flame_On.png new file mode 100644 index 00000000..535042d7 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Flame_On.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Flame_On_Small.png b/Minecraft.Client/Common/Media/Graphics/Flame_On_Small.png new file mode 100644 index 00000000..b108c261 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Flame_On_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty.png b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty.png new file mode 100644 index 00000000..ab636b94 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty2.png b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty2.png new file mode 100644 index 00000000..a310ab47 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty2.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty3.png b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty3.png new file mode 100644 index 00000000..8b8e8273 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty3.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty4.png b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty4.png new file mode 100644 index 00000000..fe31e319 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty4.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty6.png b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty6.png new file mode 100644 index 00000000..e51f5d2b Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Empty6.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full.png b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full.png new file mode 100644 index 00000000..8102b176 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full2.png b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full2.png new file mode 100644 index 00000000..7b408c9c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full2.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full3.png b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full3.png new file mode 100644 index 00000000..089f3a3a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full3.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full4.png b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full4.png new file mode 100644 index 00000000..0d6b0a33 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full4.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full6.png b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full6.png new file mode 100644 index 00000000..04661f35 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/DragonHealth_Full6.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Air_Bubble.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Air_Bubble.png new file mode 100644 index 00000000..1f89ad90 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Air_Bubble.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Air_Pop.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Air_Pop.png new file mode 100644 index 00000000..4832f1ba Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Air_Pop.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Armour_Empty.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Armour_Empty.png new file mode 100644 index 00000000..7c5391d9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Armour_Empty.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Armour_Full.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Armour_Full.png new file mode 100644 index 00000000..ebe39150 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Armour_Full.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Armour_Half.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Armour_Half.png new file mode 100644 index 00000000..3aab8fce Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Armour_Half.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Crosshair.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Crosshair.png new file mode 100644 index 00000000..e9345c06 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Crosshair.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Background.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Background.png new file mode 100644 index 00000000..a145f2b5 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Background.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Background_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Background_Flash.png new file mode 100644 index 00000000..9ffbb1e4 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Background_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Background_Poison.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Background_Poison.png new file mode 100644 index 00000000..718e6837 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Background_Poison.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full.png new file mode 100644 index 00000000..5f54c070 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full_Flash.png new file mode 100644 index 00000000..24a0304a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full_Poison.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full_Poison.png new file mode 100644 index 00000000..d7bb5e4e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full_Poison.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full_Poison_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full_Poison_Flash.png new file mode 100644 index 00000000..07369fa6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Full_Poison_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half.png new file mode 100644 index 00000000..aa5e441f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half_Flash.png new file mode 100644 index 00000000..f0c60abf Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half_Poison.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half_Poison.png new file mode 100644 index 00000000..8ab93558 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half_Poison.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half_Poison_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half_Poison_Flash.png new file mode 100644 index 00000000..7dc3928f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HUD_Food_Half_Poison_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Background.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Background.png new file mode 100644 index 00000000..a51c4ee5 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Background.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Background_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Background_Flash.png new file mode 100644 index 00000000..4fe90f0f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Background_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full.png new file mode 100644 index 00000000..ce369f6e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Flash.png new file mode 100644 index 00000000..acca4c9c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Poison.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Poison.png new file mode 100644 index 00000000..cc46064c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Poison.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Poison_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Poison_Flash.png new file mode 100644 index 00000000..aeda7180 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Poison_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half.png new file mode 100644 index 00000000..3fe9bcd0 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Flash.png new file mode 100644 index 00000000..0fc541fc Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Poison.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Poison.png new file mode 100644 index 00000000..17e08c82 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Poison.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Poison_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Poison_Flash.png new file mode 100644 index 00000000..ed2e5b4c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Poison_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/experience_bar_empty.png b/Minecraft.Client/Common/Media/Graphics/HUD/experience_bar_empty.png new file mode 100644 index 00000000..eb85721f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/experience_bar_empty.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/experience_bar_full.png b/Minecraft.Client/Common/Media/Graphics/HUD/experience_bar_full.png new file mode 100644 index 00000000..1f54f9c9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/experience_bar_full.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/hotbar_item_back.png b/Minecraft.Client/Common/Media/Graphics/HUD/hotbar_item_back.png new file mode 100644 index 00000000..280e222c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/hotbar_item_back.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/hotbar_item_selected.png b/Minecraft.Client/Common/Media/Graphics/HUD/hotbar_item_selected.png new file mode 100644 index 00000000..aebf7a5a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/hotbar_item_selected.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Anvil.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Anvil.png new file mode 100644 index 00000000..c1b009d5 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Anvil.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Anvil_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Anvil_Small.png new file mode 100644 index 00000000..e6904e65 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Anvil_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Breeding.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Breeding.png new file mode 100644 index 00000000..c5d29dd0 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Breeding.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Breeding_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Breeding_Small.png new file mode 100644 index 00000000..edcbf28e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Breeding_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Brewing.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Brewing.png new file mode 100644 index 00000000..aaba0108 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Brewing.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Brewing_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Brewing_Small.png new file mode 100644 index 00000000..b2d04ac6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Brewing_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Chest.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Chest.png new file mode 100644 index 00000000..da5088a7 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Chest.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Chest_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Chest_Small.png new file mode 100644 index 00000000..07c14cf6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Chest_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_CraftTable.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_CraftTable.png new file mode 100644 index 00000000..3ed1c675 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_CraftTable.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_CraftTable_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_CraftTable_Small.png new file mode 100644 index 00000000..96574c40 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_CraftTable_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Crafting.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Crafting.png new file mode 100644 index 00000000..eab2b7b0 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Crafting.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Crafting_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Crafting_Small.png new file mode 100644 index 00000000..6cb70610 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Crafting_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Creative.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Creative.png new file mode 100644 index 00000000..a9a1bed8 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Creative.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Creative_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Creative_Small.png new file mode 100644 index 00000000..701e28d4 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Creative_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Dispenser.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Dispenser.png new file mode 100644 index 00000000..3bcb373a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Dispenser.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Dispenser_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Dispenser_Small.png new file mode 100644 index 00000000..fb13dee0 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Dispenser_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enchantment.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enchantment.png new file mode 100644 index 00000000..cd3491aa Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enchantment.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enchantment_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enchantment_Small.png new file mode 100644 index 00000000..07d8be5f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enchantment_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enderchest.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enderchest.png new file mode 100644 index 00000000..9c874ef6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enderchest.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enderchest_small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enderchest_small.png new file mode 100644 index 00000000..80e78728 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Enderchest_small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_FarmingAnimals.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_FarmingAnimals.png new file mode 100644 index 00000000..ba818027 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_FarmingAnimals.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_FarmingAnimals_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_FarmingAnimals_Small.png new file mode 100644 index 00000000..6990f79e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_FarmingAnimals_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Furnace.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Furnace.png new file mode 100644 index 00000000..ba88862d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Furnace.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Furnace_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Furnace_Small.png new file mode 100644 index 00000000..4a3a2c92 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Furnace_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_HUD.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_HUD.png new file mode 100644 index 00000000..8b5eddfc Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_HUD.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_HUD_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_HUD_Small.png new file mode 100644 index 00000000..a5a32cf4 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_HUD_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Inventory.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Inventory.png new file mode 100644 index 00000000..d9773340 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Inventory.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Inventory_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Inventory_Small.png new file mode 100644 index 00000000..7422272c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Inventory_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_LargeChest.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_LargeChest.png new file mode 100644 index 00000000..e3226dbe Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_LargeChest.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_LargeChest_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_LargeChest_Small.png new file mode 100644 index 00000000..c3690d3c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_LargeChest_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_NetherPortal.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_NetherPortal.png new file mode 100644 index 00000000..3ccb9355 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_NetherPortal.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_NetherPortal_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_NetherPortal_Small.png new file mode 100644 index 00000000..cb0cf4b6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_NetherPortal_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_TheEnd.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_TheEnd.png new file mode 100644 index 00000000..2252890a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_TheEnd.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_TheEnd_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_TheEnd_Small.png new file mode 100644 index 00000000..aa542456 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_TheEnd_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Trading.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Trading.png new file mode 100644 index 00000000..b3182edd Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Trading.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Trading_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Trading_Small.png new file mode 100644 index 00000000..d5e1a315 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Trading_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/IconHolder.png b/Minecraft.Client/Common/Media/Graphics/IconHolder.png new file mode 100644 index 00000000..e395f3a5 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/IconHolder.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/IconHolderRed.png b/Minecraft.Client/Common/Media/Graphics/IconHolderRed.png new file mode 100644 index 00000000..0123804c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/IconHolderRed.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/IconHolderRed_Small.png b/Minecraft.Client/Common/Media/Graphics/IconHolderRed_Small.png new file mode 100644 index 00000000..e7efa119 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/IconHolderRed_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/IconHolder_Small.png b/Minecraft.Client/Common/Media/Graphics/IconHolder_Small.png new file mode 100644 index 00000000..f664d06f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/IconHolder_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_0.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_0.png new file mode 100644 index 00000000..2252f115 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_0.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_1.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_1.png new file mode 100644 index 00000000..9f18fce6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_1.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_10.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_10.png new file mode 100644 index 00000000..9f450187 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_10.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_11.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_11.png new file mode 100644 index 00000000..6b9714c9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_11.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_12.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_12.png new file mode 100644 index 00000000..d402fe5d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_12.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_13.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_13.png new file mode 100644 index 00000000..9f618d75 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_13.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_14.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_14.png new file mode 100644 index 00000000..c637d2ef Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_14.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_15.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_15.png new file mode 100644 index 00000000..4eda9274 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_15.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_2.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_2.png new file mode 100644 index 00000000..9f450187 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_2.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_3.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_3.png new file mode 100644 index 00000000..6b9714c9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_3.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_4.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_4.png new file mode 100644 index 00000000..d402fe5d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_4.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_5.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_5.png new file mode 100644 index 00000000..9f618d75 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_5.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_6.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_6.png new file mode 100644 index 00000000..c637d2ef Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_6.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_7.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_7.png new file mode 100644 index 00000000..4eda9274 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_7.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_8.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_8.png new file mode 100644 index 00000000..2252f115 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_8.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_9.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_9.png new file mode 100644 index 00000000..9f18fce6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/MapIcon_9.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/voiceMuted.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/voiceMuted.png new file mode 100644 index 00000000..39e0c552 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/voiceMuted.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/voiceNotSpeaking.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/voiceNotSpeaking.png new file mode 100644 index 00000000..e3dd7736 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/voiceNotSpeaking.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/InGameInfo/voiceSpeaking.png b/Minecraft.Client/Common/Media/Graphics/InGameInfo/voiceSpeaking.png new file mode 100644 index 00000000..1af233a5 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/InGameInfo/voiceSpeaking.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/LayoutButton_Norm.png b/Minecraft.Client/Common/Media/Graphics/LayoutButton_Norm.png new file mode 100644 index 00000000..b6153e9e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/LayoutButton_Norm.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/LayoutButton_Over.png b/Minecraft.Client/Common/Media/Graphics/LayoutButton_Over.png new file mode 100644 index 00000000..04fec073 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/LayoutButton_Over.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Climbed.png b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Climbed.png new file mode 100644 index 00000000..23b9071a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Climbed.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Creeper.png b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Creeper.png new file mode 100644 index 00000000..b8469b73 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Creeper.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Fallen.png b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Fallen.png new file mode 100644 index 00000000..dcf912c2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Fallen.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Ghast.png b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Ghast.png new file mode 100644 index 00000000..07f3e3c0 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Ghast.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Portal.png b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Portal.png new file mode 100644 index 00000000..fd4b4fea Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Portal.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Skeleton.png b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Skeleton.png new file mode 100644 index 00000000..a13247a9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Skeleton.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Slime.png b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Slime.png new file mode 100644 index 00000000..7c295a2c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Slime.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Spider.png b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Spider.png new file mode 100644 index 00000000..0f2a304d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Spider.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_SpiderJockey.png b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_SpiderJockey.png new file mode 100644 index 00000000..d84e1681 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_SpiderJockey.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Swam.png b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Swam.png new file mode 100644 index 00000000..5584b533 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Swam.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Walked.png b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Walked.png new file mode 100644 index 00000000..15248d97 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Walked.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Zombie.png b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Zombie.png new file mode 100644 index 00000000..3a46db7e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_Zombie.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_ZombiePigman.png b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_ZombiePigman.png new file mode 100644 index 00000000..01ec5f37 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Leaderboard/LeaderBoard_Icon_ZombiePigman.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/LeaderboardButton_Norm.png b/Minecraft.Client/Common/Media/Graphics/LeaderboardButton_Norm.png new file mode 100644 index 00000000..b1dff805 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/LeaderboardButton_Norm.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/LeaderboardButton_Over.png b/Minecraft.Client/Common/Media/Graphics/LeaderboardButton_Over.png new file mode 100644 index 00000000..ee3aa1fc Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/LeaderboardButton_Over.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/ListButton_Norm.png b/Minecraft.Client/Common/Media/Graphics/ListButton_Norm.png new file mode 100644 index 00000000..736a4be4 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/ListButton_Norm.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/ListButton_Over.png b/Minecraft.Client/Common/Media/Graphics/ListButton_Over.png new file mode 100644 index 00000000..7101b42a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/ListButton_Over.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Logos/4JStudios_logo.png b/Minecraft.Client/Common/Media/Graphics/Logos/4JStudios_logo.png new file mode 100644 index 00000000..48ca3fe7 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Logos/4JStudios_logo.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Logos/ESRB_10_Large.png b/Minecraft.Client/Common/Media/Graphics/Logos/ESRB_10_Large.png new file mode 100644 index 00000000..ace11862 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Logos/ESRB_10_Large.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Logos/MS_Studios_MC.png b/Minecraft.Client/Common/Media/Graphics/Logos/MS_Studios_MC.png new file mode 100644 index 00000000..8c4e84c2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Logos/MS_Studios_MC.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Logos/XBLA_MC.png b/Minecraft.Client/Common/Media/Graphics/Logos/XBLA_MC.png new file mode 100644 index 00000000..71d9a2bd Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Logos/XBLA_MC.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Logos/mojang.png b/Minecraft.Client/Common/Media/Graphics/Logos/mojang.png new file mode 100644 index 00000000..564750d2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Logos/mojang.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/MSPoints.png b/Minecraft.Client/Common/Media/Graphics/MSPoints.png new file mode 100644 index 00000000..03212188 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/MSPoints.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/MainMenuButton_Norm.png b/Minecraft.Client/Common/Media/Graphics/MainMenuButton_Norm.png new file mode 100644 index 00000000..943946d5 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/MainMenuButton_Norm.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/MainMenuButton_Over.png b/Minecraft.Client/Common/Media/Graphics/MainMenuButton_Over.png new file mode 100644 index 00000000..bcd15d54 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/MainMenuButton_Over.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/MenuTitle.png b/Minecraft.Client/Common/Media/Graphics/MenuTitle.png new file mode 100644 index 00000000..7996704c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/MenuTitle.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/MinecraftBrokenIcon.png b/Minecraft.Client/Common/Media/Graphics/MinecraftBrokenIcon.png new file mode 100644 index 00000000..a4a7de1f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/MinecraftBrokenIcon.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/MinecraftIcon.png b/Minecraft.Client/Common/Media/Graphics/MinecraftIcon.png new file mode 100644 index 00000000..0244c448 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/MinecraftIcon.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Padlock_Small.png b/Minecraft.Client/Common/Media/Graphics/Padlock_Small.png new file mode 100644 index 00000000..5854426d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Padlock_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel.png new file mode 100644 index 00000000..50079c96 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel2x2.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel2x2.png new file mode 100644 index 00000000..c83a4e7e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel2x2.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel_Small.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel_Small.png new file mode 100644 index 00000000..f8380133 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel_Small_2x2.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel_Small_2x2.png new file mode 100644 index 00000000..998396e6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Crafting_Panel_Small_2x2.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Creative_Panel_8.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Creative_Panel_8.png new file mode 100644 index 00000000..38c7579f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Creative_Panel_8.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Creative_Panel_8_Small.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Creative_Panel_8_Small.png new file mode 100644 index 00000000..cb9c62c9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Creative_Panel_8_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_BL.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_BL.png new file mode 100644 index 00000000..9e5da6ed Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_BL.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_BM.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_BM.png new file mode 100644 index 00000000..db4a2820 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_BM.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_BR.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_BR.png new file mode 100644 index 00000000..f81959fc Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_BR.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Bot_L.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Bot_L.png new file mode 100644 index 00000000..b7f14d8e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Bot_L.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Bot_M.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Bot_M.png new file mode 100644 index 00000000..5e2a638a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Bot_M.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Bot_R.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Bot_R.png new file mode 100644 index 00000000..6d789dc5 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Bot_R.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_ML.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_ML.png new file mode 100644 index 00000000..8a0c7058 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_ML.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_MM.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_MM.png new file mode 100644 index 00000000..af398ff3 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_MM.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_MR.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_MR.png new file mode 100644 index 00000000..78608fad Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_MR.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Mid_L.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Mid_L.png new file mode 100644 index 00000000..c7c25dd5 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Mid_L.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Mid_M.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Mid_M.png new file mode 100644 index 00000000..d5159253 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Mid_M.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Mid_R.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Mid_R.png new file mode 100644 index 00000000..b5c4ef0c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Mid_R.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Bot_L.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Bot_L.png new file mode 100644 index 00000000..b496f73c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Bot_L.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Bot_M.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Bot_M.png new file mode 100644 index 00000000..85065ce2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Bot_M.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Bot_R.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Bot_R.png new file mode 100644 index 00000000..a89eaba7 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Bot_R.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Mid_L.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Mid_L.png new file mode 100644 index 00000000..c93b0208 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Mid_L.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Mid_M.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Mid_M.png new file mode 100644 index 00000000..e612b855 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Mid_M.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Mid_R.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Mid_R.png new file mode 100644 index 00000000..804c6336 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Mid_R.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Top_L.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Top_L.png new file mode 100644 index 00000000..6ca2500e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Top_L.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Top_M.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Top_M.png new file mode 100644 index 00000000..a99240c7 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Top_M.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Top_R.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Top_R.png new file mode 100644 index 00000000..7f01f01d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Recess_Top_R.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_TL.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_TL.png new file mode 100644 index 00000000..8a81d9dd Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_TL.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_TM.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_TM.png new file mode 100644 index 00000000..7e67370b Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_TM.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_TR.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_TR.png new file mode 100644 index 00000000..90229029 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_TR.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Top_L.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Top_L.png new file mode 100644 index 00000000..afc0f322 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Top_L.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Top_M.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Top_M.png new file mode 100644 index 00000000..6758a5f4 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Top_M.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Top_R.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Top_R.png new file mode 100644 index 00000000..307897fe Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Panel_Top_R.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_BL.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_BL.png new file mode 100644 index 00000000..4099dae6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_BL.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_BM.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_BM.png new file mode 100644 index 00000000..8b08e0c0 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_BM.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_BR.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_BR.png new file mode 100644 index 00000000..8c0b09ec Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_BR.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_ML.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_ML.png new file mode 100644 index 00000000..b9452f91 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_ML.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_MM.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_MM.png new file mode 100644 index 00000000..df2ce955 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_MM.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_MR.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_MR.png new file mode 100644 index 00000000..2d2f752e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_MR.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_TL.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_TL.png new file mode 100644 index 00000000..7828db7e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_TL.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_TM.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_TM.png new file mode 100644 index 00000000..48cf0cc3 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_TM.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_TR.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_TR.png new file mode 100644 index 00000000..cd93f3ce Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/PointerTextPanel_TR.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBar.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBar.png new file mode 100644 index 00000000..54e19629 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBar.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmall.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmall.png new file mode 100644 index 00000000..fec365c2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmall.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmallPanel.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmallPanel.png new file mode 100644 index 00000000..d5d7e30d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmallPanel.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmallPanel_Selected.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmallPanel_Selected.png new file mode 100644 index 00000000..16f7e088 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmallPanel_Selected.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmall_Selected.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmall_Selected.png new file mode 100644 index 00000000..2b9d9ad0 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBarSmall_Selected.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBar_Selected.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBar_Selected.png new file mode 100644 index 00000000..aa9d5421 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabBar_Selected.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormal.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormal.png new file mode 100644 index 00000000..cc61e51e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormal.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormalSmall.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormalSmall.png new file mode 100644 index 00000000..af897247 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormalSmall.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormalSmall_Selected.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormalSmall_Selected.png new file mode 100644 index 00000000..4bd1a612 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormalSmall_Selected.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormal_Selected.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormal_Selected.png new file mode 100644 index 00000000..62d34b66 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabNormal_Selected.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOver.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOver.png new file mode 100644 index 00000000..b66af841 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOver.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOverSmall.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOverSmall.png new file mode 100644 index 00000000..64a4b9ea Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOverSmall.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOverSmall_Selected.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOverSmall_Selected.png new file mode 100644 index 00000000..04b12e14 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOverSmall_Selected.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOver_Selected.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOver_Selected.png new file mode 100644 index 00000000..e829610f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/SkinSelect_TabOver_Selected.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Bot_L.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Bot_L.png new file mode 100644 index 00000000..d80e35ec Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Bot_L.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Bot_M.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Bot_M.png new file mode 100644 index 00000000..65dad94f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Bot_M.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Bot_R.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Bot_R.png new file mode 100644 index 00000000..7da1873b Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Bot_R.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Mid_L.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Mid_L.png new file mode 100644 index 00000000..ab1361e3 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Mid_L.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Mid_M.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Mid_M.png new file mode 100644 index 00000000..7ec34e51 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Mid_M.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Mid_R.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Mid_R.png new file mode 100644 index 00000000..8d91f426 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Mid_R.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Top_L.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Top_L.png new file mode 100644 index 00000000..523e0640 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Top_L.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Top_M.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Top_M.png new file mode 100644 index 00000000..8be05151 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Top_M.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Top_R.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Top_R.png new file mode 100644 index 00000000..23428b0f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Square_Recess_Top_R.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_L.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_L.png new file mode 100644 index 00000000..9a2f0f12 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_L.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_M.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_M.png new file mode 100644 index 00000000..1bcfdc00 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_M.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_R.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_R.png new file mode 100644 index 00000000..b0da3c70 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_R.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_Small_L.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_Small_L.png new file mode 100644 index 00000000..7331cece Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_Small_L.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_Small_M.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_Small_M.png new file mode 100644 index 00000000..d4f65311 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_Small_M.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_Small_R.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_Small_R.png new file mode 100644 index 00000000..c3ff209c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Creative8_Small_R.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Left.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Left.png new file mode 100644 index 00000000..a8719aa9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Left.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Middle.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Middle.png new file mode 100644 index 00000000..b9b8e874 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Middle.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Right.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Right.png new file mode 100644 index 00000000..6a1eff9a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Right.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Small_Left.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Small_Left.png new file mode 100644 index 00000000..32a332b2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Small_Left.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Small_Middle.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Small_Middle.png new file mode 100644 index 00000000..1fd69b08 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Small_Middle.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Small_Right.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Small_Right.png new file mode 100644 index 00000000..54d958ae Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/Tab_Small_Right.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Panorama_Background_N.png b/Minecraft.Client/Common/Media/Graphics/Panorama_Background_N.png new file mode 100644 index 00000000..2acd010d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Panorama_Background_N.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Panorama_Background_S.png b/Minecraft.Client/Common/Media/Graphics/Panorama_Background_S.png new file mode 100644 index 00000000..6bbe3dee Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Panorama_Background_S.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Pointer.png b/Minecraft.Client/Common/Media/Graphics/Pointer.png new file mode 100644 index 00000000..81de2572 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Pointer.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Blindness.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Blindness.png new file mode 100644 index 00000000..793b16d1 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Blindness.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Fire_Resistance.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Fire_Resistance.png new file mode 100644 index 00000000..d33df82a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Fire_Resistance.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Haste.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Haste.png new file mode 100644 index 00000000..2b4c91ac Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Haste.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Hunger.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Hunger.png new file mode 100644 index 00000000..af3fed50 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Hunger.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Invisibility.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Invisibility.png new file mode 100644 index 00000000..c09cdcbd Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Invisibility.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Jump_Boost.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Jump_Boost.png new file mode 100644 index 00000000..0389e26e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Jump_Boost.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Mining_Fatigue.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Mining_Fatigue.png new file mode 100644 index 00000000..7387d71d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Mining_Fatigue.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Nausea.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Nausea.png new file mode 100644 index 00000000..d45d34ef Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Nausea.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Night_Vision.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Night_Vision.png new file mode 100644 index 00000000..9789a799 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Night_Vision.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Poison.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Poison.png new file mode 100644 index 00000000..32a04f6d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Poison.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Regeneration.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Regeneration.png new file mode 100644 index 00000000..57d69bb0 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Regeneration.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Resistance.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Resistance.png new file mode 100644 index 00000000..e79e5df4 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Resistance.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Slowness.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Slowness.png new file mode 100644 index 00000000..356c60d6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Slowness.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Speed.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Speed.png new file mode 100644 index 00000000..874b43c6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Speed.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Strength.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Strength.png new file mode 100644 index 00000000..48dc8e0b Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Strength.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Water_Breathing.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Water_Breathing.png new file mode 100644 index 00000000..cd6bd0d9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Water_Breathing.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Weakness.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Weakness.png new file mode 100644 index 00000000..26830ed7 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Weakness.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/SaveArrow.png b/Minecraft.Client/Common/Media/Graphics/SaveArrow.png new file mode 100644 index 00000000..01b336df Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/SaveArrow.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/SaveChest.png b/Minecraft.Client/Common/Media/Graphics/SaveChest.png new file mode 100644 index 00000000..04e46ee9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/SaveChest.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/SignEditBackground.png b/Minecraft.Client/Common/Media/Graphics/SignEditBackground.png new file mode 100644 index 00000000..edb55585 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/SignEditBackground.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Slider_Button.png b/Minecraft.Client/Common/Media/Graphics/Slider_Button.png new file mode 100644 index 00000000..524b6a8e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Slider_Button.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Slider_Track.png b/Minecraft.Client/Common/Media/Graphics/Slider_Track.png new file mode 100644 index 00000000..41865e50 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Slider_Track.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/TexturePackIcon.png b/Minecraft.Client/Common/Media/Graphics/TexturePackIcon.png new file mode 100644 index 00000000..5ee74794 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/TexturePackIcon.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Tick.png b/Minecraft.Client/Common/Media/Graphics/Tick.png new file mode 100644 index 00000000..fcf3697f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Tick.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Tickbox_Norm.png b/Minecraft.Client/Common/Media/Graphics/Tickbox_Norm.png new file mode 100644 index 00000000..54ee164f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Tickbox_Norm.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Tickbox_Over.png b/Minecraft.Client/Common/Media/Graphics/Tickbox_Over.png new file mode 100644 index 00000000..7702fa23 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Tickbox_Over.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/TutorialExitScreenshot.png b/Minecraft.Client/Common/Media/Graphics/TutorialExitScreenshot.png new file mode 100644 index 00000000..b8475962 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/TutorialExitScreenshot.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot1.png b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot1.png new file mode 100644 index 00000000..4c817af2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot1.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot10.png b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot10.png new file mode 100644 index 00000000..85295c59 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot10.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot2.png b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot2.png new file mode 100644 index 00000000..550d8adb Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot2.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot3.png b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot3.png new file mode 100644 index 00000000..dbc999eb Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot3.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot4.png b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot4.png new file mode 100644 index 00000000..343272b1 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot4.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot5.png b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot5.png new file mode 100644 index 00000000..98a3b719 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot5.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot6.png b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot6.png new file mode 100644 index 00000000..6a8fb7f1 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot6.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot7.png b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot7.png new file mode 100644 index 00000000..2afc7bfe Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot7.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot8.png b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot8.png new file mode 100644 index 00000000..5cba153b Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot8.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot9.png b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot9.png new file mode 100644 index 00000000..383c6d21 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/UpsellScreenshots/Screenshot9.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Warning.png b/Minecraft.Client/Common/Media/Graphics/Warning.png new file mode 100644 index 00000000..2fda44c1 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Warning.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/360ctrl.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/360ctrl.png new file mode 100644 index 00000000..b7c7ce2b Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/360ctrl.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonA.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonA.png new file mode 100644 index 00000000..f3b5328f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonA.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonB.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonB.png new file mode 100644 index 00000000..a6aa753a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonB.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonBack.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonBack.png new file mode 100644 index 00000000..d12b7f42 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonBack.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadD.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadD.png new file mode 100644 index 00000000..dcca6773 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadD.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadL.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadL.png new file mode 100644 index 00000000..5497dd8d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadL.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadR.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadR.png new file mode 100644 index 00000000..12c11236 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadR.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadU.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadU.png new file mode 100644 index 00000000..21ef0fd2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonDpadU.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLS.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLS.png new file mode 100644 index 00000000..fa97097f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLS.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftBumper.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftBumper.png new file mode 100644 index 00000000..aa3b1a9a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftBumper.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftBumper_TT.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftBumper_TT.png new file mode 100644 index 00000000..45baccfc Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftBumper_TT.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftStick.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftStick.png new file mode 100644 index 00000000..ce32bf05 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftStick.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftStick_Navigate.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftStick_Navigate.png new file mode 100644 index 00000000..81881801 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftStick_Navigate.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftStick_sides.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftStick_sides.png new file mode 100644 index 00000000..b9855f21 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftStick_sides.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftTrigger.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftTrigger.png new file mode 100644 index 00000000..e95acd1c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftTrigger.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftTrigger_TT.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftTrigger_TT.png new file mode 100644 index 00000000..067e139c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonLeftTrigger_TT.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRS.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRS.png new file mode 100644 index 00000000..652a03cc Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRS.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightBumper.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightBumper.png new file mode 100644 index 00000000..acdb4a8c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightBumper.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightBumper_TT.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightBumper_TT.png new file mode 100644 index 00000000..154b57db Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightBumper_TT.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightStick.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightStick.png new file mode 100644 index 00000000..3de652ea Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightStick.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightTrigger.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightTrigger.png new file mode 100644 index 00000000..05dd8940 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightTrigger.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightTrigger_TT.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightTrigger_TT.png new file mode 100644 index 00000000..44880854 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRightTrigger_TT.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonStart.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonStart.png new file mode 100644 index 00000000..1e8d2020 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonStart.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonX.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonX.png new file mode 100644 index 00000000..79170139 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonX.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonY.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonY.png new file mode 100644 index 00000000..31d17ec1 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonY.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Blu_Focus.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Blu_Focus.png new file mode 100644 index 00000000..7ea10c25 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Blu_Focus.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Blu_Normal.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Blu_Normal.png new file mode 100644 index 00000000..5c983d68 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Blu_Normal.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Disable.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Disable.png new file mode 100644 index 00000000..afbf9757 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Disable.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Green_Focus.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Green_Focus.png new file mode 100644 index 00000000..c14a1062 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Green_Focus.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Green_Normal.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Green_Normal.png new file mode 100644 index 00000000..2b0b6efa Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Green_Normal.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Red_Focus.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Red_Focus.png new file mode 100644 index 00000000..85875ee1 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Red_Focus.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Red_Normal.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Red_Normal.png new file mode 100644 index 00000000..8f284813 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Red_Normal.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Yello_Focus.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Yello_Focus.png new file mode 100644 index 00000000..300252bf Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Yello_Focus.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Yello_Normal.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Yello_Normal.png new file mode 100644 index 00000000..dd37a19f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/Legend_Button_Yello_Normal.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/a_graphic.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/a_graphic.png new file mode 100644 index 00000000..126e1b02 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/a_graphic.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/b_graphic.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/b_graphic.png new file mode 100644 index 00000000..e7721e48 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/b_graphic.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/x_graphic.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/x_graphic.png new file mode 100644 index 00000000..3d1b50cd Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/x_graphic.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/y_graphic.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/y_graphic.png new file mode 100644 index 00000000..6213c53c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/y_graphic.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/icon_shank.png b/Minecraft.Client/Common/Media/Graphics/icon_shank.png new file mode 100644 index 00000000..d5b4e32e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/icon_shank.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/scrollDown.png b/Minecraft.Client/Common/Media/Graphics/scrollDown.png new file mode 100644 index 00000000..dac9905c Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/scrollDown.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/scrollLeft.png b/Minecraft.Client/Common/Media/Graphics/scrollLeft.png new file mode 100644 index 00000000..d87ecd7d Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/scrollLeft.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/scrollRight.png b/Minecraft.Client/Common/Media/Graphics/scrollRight.png new file mode 100644 index 00000000..0496bf8a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/scrollRight.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/scrollUp.png b/Minecraft.Client/Common/Media/Graphics/scrollUp.png new file mode 100644 index 00000000..3a7a51e7 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/scrollUp.png differ diff --git a/Minecraft.Client/Common/Media/HTMLColours.col b/Minecraft.Client/Common/Media/HTMLColours.col new file mode 100644 index 00000000..50999d5a Binary files /dev/null and b/Minecraft.Client/Common/Media/HTMLColours.col differ diff --git a/Minecraft.Client/Common/Media/HTMLColours.xml b/Minecraft.Client/Common/Media/HTMLColours.xml new file mode 100644 index 00000000..ea6ef00c --- /dev/null +++ b/Minecraft.Client/Common/Media/HTMLColours.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Minecraft.Client/Common/Media/HUD1080.swf b/Minecraft.Client/Common/Media/HUD1080.swf new file mode 100644 index 00000000..c9a05166 Binary files /dev/null and b/Minecraft.Client/Common/Media/HUD1080.swf differ diff --git a/Minecraft.Client/Common/Media/HUD480.swf b/Minecraft.Client/Common/Media/HUD480.swf new file mode 100644 index 00000000..d8a65a41 Binary files /dev/null and b/Minecraft.Client/Common/Media/HUD480.swf differ diff --git a/Minecraft.Client/Common/Media/HUD720.swf b/Minecraft.Client/Common/Media/HUD720.swf new file mode 100644 index 00000000..3527bb70 Binary files /dev/null and b/Minecraft.Client/Common/Media/HUD720.swf differ diff --git a/Minecraft.Client/Common/Media/HUDSplit1080.swf b/Minecraft.Client/Common/Media/HUDSplit1080.swf new file mode 100644 index 00000000..cff338b9 Binary files /dev/null and b/Minecraft.Client/Common/Media/HUDSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/HUDSplit720.swf b/Minecraft.Client/Common/Media/HUDSplit720.swf new file mode 100644 index 00000000..405cb99d Binary files /dev/null and b/Minecraft.Client/Common/Media/HUDSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/HUDVita.swf b/Minecraft.Client/Common/Media/HUDVita.swf new file mode 100644 index 00000000..3197a722 Binary files /dev/null and b/Minecraft.Client/Common/Media/HUDVita.swf differ diff --git a/Minecraft.Client/Common/Media/HelpAndOptionsMenu1080.swf b/Minecraft.Client/Common/Media/HelpAndOptionsMenu1080.swf new file mode 100644 index 00000000..956277c5 Binary files /dev/null and b/Minecraft.Client/Common/Media/HelpAndOptionsMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/HelpAndOptionsMenu480.swf b/Minecraft.Client/Common/Media/HelpAndOptionsMenu480.swf new file mode 100644 index 00000000..26df9a49 Binary files /dev/null and b/Minecraft.Client/Common/Media/HelpAndOptionsMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/HelpAndOptionsMenu720.swf b/Minecraft.Client/Common/Media/HelpAndOptionsMenu720.swf new file mode 100644 index 00000000..cdd6849f Binary files /dev/null and b/Minecraft.Client/Common/Media/HelpAndOptionsMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/HelpAndOptionsMenuSplit1080.swf b/Minecraft.Client/Common/Media/HelpAndOptionsMenuSplit1080.swf new file mode 100644 index 00000000..6073ec66 Binary files /dev/null and b/Minecraft.Client/Common/Media/HelpAndOptionsMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/HelpAndOptionsMenuSplit720.swf b/Minecraft.Client/Common/Media/HelpAndOptionsMenuSplit720.swf new file mode 100644 index 00000000..be8993c6 Binary files /dev/null and b/Minecraft.Client/Common/Media/HelpAndOptionsMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/HelpAndOptionsMenuVita.swf b/Minecraft.Client/Common/Media/HelpAndOptionsMenuVita.swf new file mode 100644 index 00000000..6027b19b Binary files /dev/null and b/Minecraft.Client/Common/Media/HelpAndOptionsMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/HorseInventoryMenu1080.swf b/Minecraft.Client/Common/Media/HorseInventoryMenu1080.swf new file mode 100644 index 00000000..2f383848 Binary files /dev/null and b/Minecraft.Client/Common/Media/HorseInventoryMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/HorseInventoryMenu480.swf b/Minecraft.Client/Common/Media/HorseInventoryMenu480.swf new file mode 100644 index 00000000..1c1d8177 Binary files /dev/null and b/Minecraft.Client/Common/Media/HorseInventoryMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/HorseInventoryMenu720.swf b/Minecraft.Client/Common/Media/HorseInventoryMenu720.swf new file mode 100644 index 00000000..b07966bc Binary files /dev/null and b/Minecraft.Client/Common/Media/HorseInventoryMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/HorseInventoryMenuSplit1080.swf b/Minecraft.Client/Common/Media/HorseInventoryMenuSplit1080.swf new file mode 100644 index 00000000..c90925e5 Binary files /dev/null and b/Minecraft.Client/Common/Media/HorseInventoryMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/HorseInventoryMenuSplit720.swf b/Minecraft.Client/Common/Media/HorseInventoryMenuSplit720.swf new file mode 100644 index 00000000..d4814571 Binary files /dev/null and b/Minecraft.Client/Common/Media/HorseInventoryMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlay1080.swf b/Minecraft.Client/Common/Media/HowToPlay1080.swf new file mode 100644 index 00000000..8a74aae1 Binary files /dev/null and b/Minecraft.Client/Common/Media/HowToPlay1080.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlay480.swf b/Minecraft.Client/Common/Media/HowToPlay480.swf new file mode 100644 index 00000000..60449f75 Binary files /dev/null and b/Minecraft.Client/Common/Media/HowToPlay480.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlay720.swf b/Minecraft.Client/Common/Media/HowToPlay720.swf new file mode 100644 index 00000000..eb7652ac Binary files /dev/null and b/Minecraft.Client/Common/Media/HowToPlay720.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayMenu1080.swf b/Minecraft.Client/Common/Media/HowToPlayMenu1080.swf new file mode 100644 index 00000000..5dc90de1 Binary files /dev/null and b/Minecraft.Client/Common/Media/HowToPlayMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayMenu480.swf b/Minecraft.Client/Common/Media/HowToPlayMenu480.swf new file mode 100644 index 00000000..df33898a Binary files /dev/null and b/Minecraft.Client/Common/Media/HowToPlayMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayMenu720.swf b/Minecraft.Client/Common/Media/HowToPlayMenu720.swf new file mode 100644 index 00000000..0f01ef70 Binary files /dev/null and b/Minecraft.Client/Common/Media/HowToPlayMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayMenuSplit1080.swf b/Minecraft.Client/Common/Media/HowToPlayMenuSplit1080.swf new file mode 100644 index 00000000..2c1515ce Binary files /dev/null and b/Minecraft.Client/Common/Media/HowToPlayMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayMenuSplit720.swf b/Minecraft.Client/Common/Media/HowToPlayMenuSplit720.swf new file mode 100644 index 00000000..c861543a Binary files /dev/null and b/Minecraft.Client/Common/Media/HowToPlayMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayMenuVita.swf b/Minecraft.Client/Common/Media/HowToPlayMenuVita.swf new file mode 100644 index 00000000..b2db55a1 Binary files /dev/null and b/Minecraft.Client/Common/Media/HowToPlayMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlaySplit1080.swf b/Minecraft.Client/Common/Media/HowToPlaySplit1080.swf new file mode 100644 index 00000000..db806225 Binary files /dev/null and b/Minecraft.Client/Common/Media/HowToPlaySplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlaySplit720.swf b/Minecraft.Client/Common/Media/HowToPlaySplit720.swf new file mode 100644 index 00000000..1735af41 Binary files /dev/null and b/Minecraft.Client/Common/Media/HowToPlaySplit720.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayVita.swf b/Minecraft.Client/Common/Media/HowToPlayVita.swf new file mode 100644 index 00000000..7ead38e2 Binary files /dev/null and b/Minecraft.Client/Common/Media/HowToPlayVita.swf differ diff --git a/Minecraft.Client/Common/Media/InGameHostOptions1080.swf b/Minecraft.Client/Common/Media/InGameHostOptions1080.swf new file mode 100644 index 00000000..9caefeab Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameHostOptions1080.swf differ diff --git a/Minecraft.Client/Common/Media/InGameHostOptions480.swf b/Minecraft.Client/Common/Media/InGameHostOptions480.swf new file mode 100644 index 00000000..6177ad68 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameHostOptions480.swf differ diff --git a/Minecraft.Client/Common/Media/InGameHostOptions720.swf b/Minecraft.Client/Common/Media/InGameHostOptions720.swf new file mode 100644 index 00000000..448b39a3 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameHostOptions720.swf differ diff --git a/Minecraft.Client/Common/Media/InGameHostOptionsSplit1080.swf b/Minecraft.Client/Common/Media/InGameHostOptionsSplit1080.swf new file mode 100644 index 00000000..281f75d9 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameHostOptionsSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/InGameHostOptionsSplit720.swf b/Minecraft.Client/Common/Media/InGameHostOptionsSplit720.swf new file mode 100644 index 00000000..328a3115 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameHostOptionsSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/InGameHostOptionsVita.swf b/Minecraft.Client/Common/Media/InGameHostOptionsVita.swf new file mode 100644 index 00000000..c9f6c0d7 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameHostOptionsVita.swf differ diff --git a/Minecraft.Client/Common/Media/InGameInfoMenu1080.swf b/Minecraft.Client/Common/Media/InGameInfoMenu1080.swf new file mode 100644 index 00000000..5f74a102 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameInfoMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/InGameInfoMenu480.swf b/Minecraft.Client/Common/Media/InGameInfoMenu480.swf new file mode 100644 index 00000000..ecd2384e Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameInfoMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/InGameInfoMenu720.swf b/Minecraft.Client/Common/Media/InGameInfoMenu720.swf new file mode 100644 index 00000000..e6f1dc54 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameInfoMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/InGameInfoMenuSplit1080.swf b/Minecraft.Client/Common/Media/InGameInfoMenuSplit1080.swf new file mode 100644 index 00000000..dc435457 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameInfoMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/InGameInfoMenuSplit720.swf b/Minecraft.Client/Common/Media/InGameInfoMenuSplit720.swf new file mode 100644 index 00000000..17de71d8 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameInfoMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/InGameInfoMenuVita.swf b/Minecraft.Client/Common/Media/InGameInfoMenuVita.swf new file mode 100644 index 00000000..f148ea66 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameInfoMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/InGamePlayerOptions1080.swf b/Minecraft.Client/Common/Media/InGamePlayerOptions1080.swf new file mode 100644 index 00000000..12a15405 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGamePlayerOptions1080.swf differ diff --git a/Minecraft.Client/Common/Media/InGamePlayerOptions480.swf b/Minecraft.Client/Common/Media/InGamePlayerOptions480.swf new file mode 100644 index 00000000..707d8fdb Binary files /dev/null and b/Minecraft.Client/Common/Media/InGamePlayerOptions480.swf differ diff --git a/Minecraft.Client/Common/Media/InGamePlayerOptions720.swf b/Minecraft.Client/Common/Media/InGamePlayerOptions720.swf new file mode 100644 index 00000000..36c7ea04 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGamePlayerOptions720.swf differ diff --git a/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit1080.swf b/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit1080.swf new file mode 100644 index 00000000..65772a1b Binary files /dev/null and b/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit720.swf b/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit720.swf new file mode 100644 index 00000000..1c3b7820 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/InGamePlayerOptionsVita.swf b/Minecraft.Client/Common/Media/InGamePlayerOptionsVita.swf new file mode 100644 index 00000000..c8d8d370 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGamePlayerOptionsVita.swf differ diff --git a/Minecraft.Client/Common/Media/InGameTeleportMenu1080.swf b/Minecraft.Client/Common/Media/InGameTeleportMenu1080.swf new file mode 100644 index 00000000..8a65f8aa Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameTeleportMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/InGameTeleportMenu480.swf b/Minecraft.Client/Common/Media/InGameTeleportMenu480.swf new file mode 100644 index 00000000..2c1a9cfd Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameTeleportMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/InGameTeleportMenu720.swf b/Minecraft.Client/Common/Media/InGameTeleportMenu720.swf new file mode 100644 index 00000000..bc1e957c Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameTeleportMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/InGameTeleportMenuSplit1080.swf b/Minecraft.Client/Common/Media/InGameTeleportMenuSplit1080.swf new file mode 100644 index 00000000..0516dcb4 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameTeleportMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/InGameTeleportMenuSplit720.swf b/Minecraft.Client/Common/Media/InGameTeleportMenuSplit720.swf new file mode 100644 index 00000000..078b3e59 Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameTeleportMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/InGameTeleportMenuVita.swf b/Minecraft.Client/Common/Media/InGameTeleportMenuVita.swf new file mode 100644 index 00000000..8d97ccab Binary files /dev/null and b/Minecraft.Client/Common/Media/InGameTeleportMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/Intro1080.swf b/Minecraft.Client/Common/Media/Intro1080.swf new file mode 100644 index 00000000..92569e1a Binary files /dev/null and b/Minecraft.Client/Common/Media/Intro1080.swf differ diff --git a/Minecraft.Client/Common/Media/Intro480.swf b/Minecraft.Client/Common/Media/Intro480.swf new file mode 100644 index 00000000..2b289ff8 Binary files /dev/null and b/Minecraft.Client/Common/Media/Intro480.swf differ diff --git a/Minecraft.Client/Common/Media/Intro720.swf b/Minecraft.Client/Common/Media/Intro720.swf new file mode 100644 index 00000000..42c086d4 Binary files /dev/null and b/Minecraft.Client/Common/Media/Intro720.swf differ diff --git a/Minecraft.Client/Common/Media/IntroVita.swf b/Minecraft.Client/Common/Media/IntroVita.swf new file mode 100644 index 00000000..54a9b2d5 Binary files /dev/null and b/Minecraft.Client/Common/Media/IntroVita.swf differ diff --git a/Minecraft.Client/Common/Media/InventoryMenu1080.swf b/Minecraft.Client/Common/Media/InventoryMenu1080.swf new file mode 100644 index 00000000..f7e84e8a Binary files /dev/null and b/Minecraft.Client/Common/Media/InventoryMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/InventoryMenu480.swf b/Minecraft.Client/Common/Media/InventoryMenu480.swf new file mode 100644 index 00000000..c5facdc4 Binary files /dev/null and b/Minecraft.Client/Common/Media/InventoryMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/InventoryMenu720.swf b/Minecraft.Client/Common/Media/InventoryMenu720.swf new file mode 100644 index 00000000..e6f3cee0 Binary files /dev/null and b/Minecraft.Client/Common/Media/InventoryMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/InventoryMenuSplit1080.swf b/Minecraft.Client/Common/Media/InventoryMenuSplit1080.swf new file mode 100644 index 00000000..4f6e78c5 Binary files /dev/null and b/Minecraft.Client/Common/Media/InventoryMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/InventoryMenuSplit720.swf b/Minecraft.Client/Common/Media/InventoryMenuSplit720.swf new file mode 100644 index 00000000..1e7d00ed Binary files /dev/null and b/Minecraft.Client/Common/Media/InventoryMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/InventoryMenuVita.swf b/Minecraft.Client/Common/Media/InventoryMenuVita.swf new file mode 100644 index 00000000..e38bb07d Binary files /dev/null and b/Minecraft.Client/Common/Media/InventoryMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/JoinMenu1080.swf b/Minecraft.Client/Common/Media/JoinMenu1080.swf new file mode 100644 index 00000000..817c3633 Binary files /dev/null and b/Minecraft.Client/Common/Media/JoinMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/JoinMenu480.swf b/Minecraft.Client/Common/Media/JoinMenu480.swf new file mode 100644 index 00000000..f93a4f52 Binary files /dev/null and b/Minecraft.Client/Common/Media/JoinMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/JoinMenu720.swf b/Minecraft.Client/Common/Media/JoinMenu720.swf new file mode 100644 index 00000000..21be70a4 Binary files /dev/null and b/Minecraft.Client/Common/Media/JoinMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/JoinMenuVita.swf b/Minecraft.Client/Common/Media/JoinMenuVita.swf new file mode 100644 index 00000000..ddf2641f Binary files /dev/null and b/Minecraft.Client/Common/Media/JoinMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/Keyboard1080.swf b/Minecraft.Client/Common/Media/Keyboard1080.swf new file mode 100644 index 00000000..e9b6107e Binary files /dev/null and b/Minecraft.Client/Common/Media/Keyboard1080.swf differ diff --git a/Minecraft.Client/Common/Media/KeyboardSplit1080.swf b/Minecraft.Client/Common/Media/KeyboardSplit1080.swf new file mode 100644 index 00000000..fdeea502 Binary files /dev/null and b/Minecraft.Client/Common/Media/KeyboardSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu1080.swf b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu1080.swf new file mode 100644 index 00000000..3db865f8 Binary files /dev/null and b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu480.swf b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu480.swf new file mode 100644 index 00000000..ea1132c0 Binary files /dev/null and b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu720.swf b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu720.swf new file mode 100644 index 00000000..1cdf4d22 Binary files /dev/null and b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenuVita.swf b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenuVita.swf new file mode 100644 index 00000000..21fede27 Binary files /dev/null and b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/LeaderboardMenu1080.swf b/Minecraft.Client/Common/Media/LeaderboardMenu1080.swf new file mode 100644 index 00000000..ca956284 Binary files /dev/null and b/Minecraft.Client/Common/Media/LeaderboardMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/LeaderboardMenu480.swf b/Minecraft.Client/Common/Media/LeaderboardMenu480.swf new file mode 100644 index 00000000..04c32493 Binary files /dev/null and b/Minecraft.Client/Common/Media/LeaderboardMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/LeaderboardMenu720.swf b/Minecraft.Client/Common/Media/LeaderboardMenu720.swf new file mode 100644 index 00000000..8418ec5e Binary files /dev/null and b/Minecraft.Client/Common/Media/LeaderboardMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/LeaderboardMenuVita.swf b/Minecraft.Client/Common/Media/LeaderboardMenuVita.swf new file mode 100644 index 00000000..9310c89d Binary files /dev/null and b/Minecraft.Client/Common/Media/LeaderboardMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/LoadMenu1080.swf b/Minecraft.Client/Common/Media/LoadMenu1080.swf new file mode 100644 index 00000000..e89f1875 Binary files /dev/null and b/Minecraft.Client/Common/Media/LoadMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/LoadMenu480.swf b/Minecraft.Client/Common/Media/LoadMenu480.swf new file mode 100644 index 00000000..ce7ac1ad Binary files /dev/null and b/Minecraft.Client/Common/Media/LoadMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/LoadMenu720.swf b/Minecraft.Client/Common/Media/LoadMenu720.swf new file mode 100644 index 00000000..c3976f49 Binary files /dev/null and b/Minecraft.Client/Common/Media/LoadMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/LoadMenuVita.swf b/Minecraft.Client/Common/Media/LoadMenuVita.swf new file mode 100644 index 00000000..8bbf94e7 Binary files /dev/null and b/Minecraft.Client/Common/Media/LoadMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/LoadOrJoinMenu1080.swf b/Minecraft.Client/Common/Media/LoadOrJoinMenu1080.swf new file mode 100644 index 00000000..5ad47f8a Binary files /dev/null and b/Minecraft.Client/Common/Media/LoadOrJoinMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/LoadOrJoinMenu480.swf b/Minecraft.Client/Common/Media/LoadOrJoinMenu480.swf new file mode 100644 index 00000000..a424e7f3 Binary files /dev/null and b/Minecraft.Client/Common/Media/LoadOrJoinMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/LoadOrJoinMenu720.swf b/Minecraft.Client/Common/Media/LoadOrJoinMenu720.swf new file mode 100644 index 00000000..5d2cdf5e Binary files /dev/null and b/Minecraft.Client/Common/Media/LoadOrJoinMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/LoadOrJoinMenuVita.swf b/Minecraft.Client/Common/Media/LoadOrJoinMenuVita.swf new file mode 100644 index 00000000..d888f666 Binary files /dev/null and b/Minecraft.Client/Common/Media/LoadOrJoinMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/MainMenu1080.swf b/Minecraft.Client/Common/Media/MainMenu1080.swf new file mode 100644 index 00000000..a3c55273 Binary files /dev/null and b/Minecraft.Client/Common/Media/MainMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/MainMenu480.swf b/Minecraft.Client/Common/Media/MainMenu480.swf new file mode 100644 index 00000000..adc8e52a Binary files /dev/null and b/Minecraft.Client/Common/Media/MainMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/MainMenu720.swf b/Minecraft.Client/Common/Media/MainMenu720.swf new file mode 100644 index 00000000..3823791e Binary files /dev/null and b/Minecraft.Client/Common/Media/MainMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/MainMenuVita.swf b/Minecraft.Client/Common/Media/MainMenuVita.swf new file mode 100644 index 00000000..c9477bce Binary files /dev/null and b/Minecraft.Client/Common/Media/MainMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/MediaDurango.arc b/Minecraft.Client/Common/Media/MediaDurango.arc new file mode 100644 index 00000000..53e9b222 Binary files /dev/null and b/Minecraft.Client/Common/Media/MediaDurango.arc differ diff --git a/Minecraft.Client/Common/Media/MediaOrbis.arc b/Minecraft.Client/Common/Media/MediaOrbis.arc new file mode 100644 index 00000000..fcb53c05 Binary files /dev/null and b/Minecraft.Client/Common/Media/MediaOrbis.arc differ diff --git a/Minecraft.Client/Common/Media/MediaPS3.arc b/Minecraft.Client/Common/Media/MediaPS3.arc new file mode 100644 index 00000000..7ab3a320 Binary files /dev/null and b/Minecraft.Client/Common/Media/MediaPS3.arc differ diff --git a/Minecraft.Client/Common/Media/MediaPSVita.arc b/Minecraft.Client/Common/Media/MediaPSVita.arc new file mode 100644 index 00000000..01aa7466 Binary files /dev/null and b/Minecraft.Client/Common/Media/MediaPSVita.arc differ diff --git a/Minecraft.Client/Common/Media/MediaWindows64.arc b/Minecraft.Client/Common/Media/MediaWindows64.arc new file mode 100644 index 00000000..130661a2 Binary files /dev/null and b/Minecraft.Client/Common/Media/MediaWindows64.arc differ diff --git a/Minecraft.Client/Common/Media/MenuBackground1080.swf b/Minecraft.Client/Common/Media/MenuBackground1080.swf new file mode 100644 index 00000000..5f8c6a7d Binary files /dev/null and b/Minecraft.Client/Common/Media/MenuBackground1080.swf differ diff --git a/Minecraft.Client/Common/Media/MenuBackground480.swf b/Minecraft.Client/Common/Media/MenuBackground480.swf new file mode 100644 index 00000000..e41d429b Binary files /dev/null and b/Minecraft.Client/Common/Media/MenuBackground480.swf differ diff --git a/Minecraft.Client/Common/Media/MenuBackground720.swf b/Minecraft.Client/Common/Media/MenuBackground720.swf new file mode 100644 index 00000000..9668b865 Binary files /dev/null and b/Minecraft.Client/Common/Media/MenuBackground720.swf differ diff --git a/Minecraft.Client/Common/Media/MenuBackgroundVita.swf b/Minecraft.Client/Common/Media/MenuBackgroundVita.swf new file mode 100644 index 00000000..9067027b Binary files /dev/null and b/Minecraft.Client/Common/Media/MenuBackgroundVita.swf differ diff --git a/Minecraft.Client/Common/Media/MessageBox1080.swf b/Minecraft.Client/Common/Media/MessageBox1080.swf new file mode 100644 index 00000000..eba77b2f Binary files /dev/null and b/Minecraft.Client/Common/Media/MessageBox1080.swf differ diff --git a/Minecraft.Client/Common/Media/MessageBox480.swf b/Minecraft.Client/Common/Media/MessageBox480.swf new file mode 100644 index 00000000..4190c5ee Binary files /dev/null and b/Minecraft.Client/Common/Media/MessageBox480.swf differ diff --git a/Minecraft.Client/Common/Media/MessageBox720.swf b/Minecraft.Client/Common/Media/MessageBox720.swf new file mode 100644 index 00000000..5b0dd657 Binary files /dev/null and b/Minecraft.Client/Common/Media/MessageBox720.swf differ diff --git a/Minecraft.Client/Common/Media/MessageBoxSplit1080.swf b/Minecraft.Client/Common/Media/MessageBoxSplit1080.swf new file mode 100644 index 00000000..7a968050 Binary files /dev/null and b/Minecraft.Client/Common/Media/MessageBoxSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/MessageBoxSplit720.swf b/Minecraft.Client/Common/Media/MessageBoxSplit720.swf new file mode 100644 index 00000000..17106ae6 Binary files /dev/null and b/Minecraft.Client/Common/Media/MessageBoxSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/MessageBoxVita.swf b/Minecraft.Client/Common/Media/MessageBoxVita.swf new file mode 100644 index 00000000..e032b5d2 Binary files /dev/null and b/Minecraft.Client/Common/Media/MessageBoxVita.swf differ diff --git a/Minecraft.Client/Common/Media/NewUpdateMessage1080.swf b/Minecraft.Client/Common/Media/NewUpdateMessage1080.swf new file mode 100644 index 00000000..4ac9b9b4 Binary files /dev/null and b/Minecraft.Client/Common/Media/NewUpdateMessage1080.swf differ diff --git a/Minecraft.Client/Common/Media/NewUpdateMessage480.swf b/Minecraft.Client/Common/Media/NewUpdateMessage480.swf new file mode 100644 index 00000000..30920167 Binary files /dev/null and b/Minecraft.Client/Common/Media/NewUpdateMessage480.swf differ diff --git a/Minecraft.Client/Common/Media/NewUpdateMessage720.swf b/Minecraft.Client/Common/Media/NewUpdateMessage720.swf new file mode 100644 index 00000000..a2a44878 Binary files /dev/null and b/Minecraft.Client/Common/Media/NewUpdateMessage720.swf differ diff --git a/Minecraft.Client/Common/Media/NewUpdateMessageVita.swf b/Minecraft.Client/Common/Media/NewUpdateMessageVita.swf new file mode 100644 index 00000000..4e8dfdf0 Binary files /dev/null and b/Minecraft.Client/Common/Media/NewUpdateMessageVita.swf differ diff --git a/Minecraft.Client/Common/Media/Panorama1080.swf b/Minecraft.Client/Common/Media/Panorama1080.swf new file mode 100644 index 00000000..a73b2b85 Binary files /dev/null and b/Minecraft.Client/Common/Media/Panorama1080.swf differ diff --git a/Minecraft.Client/Common/Media/Panorama480.swf b/Minecraft.Client/Common/Media/Panorama480.swf new file mode 100644 index 00000000..9cd162a2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Panorama480.swf differ diff --git a/Minecraft.Client/Common/Media/Panorama720.swf b/Minecraft.Client/Common/Media/Panorama720.swf new file mode 100644 index 00000000..07cc2e36 Binary files /dev/null and b/Minecraft.Client/Common/Media/Panorama720.swf differ diff --git a/Minecraft.Client/Common/Media/PanoramaSplit1080.swf b/Minecraft.Client/Common/Media/PanoramaSplit1080.swf new file mode 100644 index 00000000..f0178099 Binary files /dev/null and b/Minecraft.Client/Common/Media/PanoramaSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/PanoramaSplit720.swf b/Minecraft.Client/Common/Media/PanoramaSplit720.swf new file mode 100644 index 00000000..459e7bc9 Binary files /dev/null and b/Minecraft.Client/Common/Media/PanoramaSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/PanoramaVita.swf b/Minecraft.Client/Common/Media/PanoramaVita.swf new file mode 100644 index 00000000..281d0cf7 Binary files /dev/null and b/Minecraft.Client/Common/Media/PanoramaVita.swf differ diff --git a/Minecraft.Client/Common/Media/PauseMenu1080.swf b/Minecraft.Client/Common/Media/PauseMenu1080.swf new file mode 100644 index 00000000..9259be16 Binary files /dev/null and b/Minecraft.Client/Common/Media/PauseMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/PauseMenu480.swf b/Minecraft.Client/Common/Media/PauseMenu480.swf new file mode 100644 index 00000000..747ea97e Binary files /dev/null and b/Minecraft.Client/Common/Media/PauseMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/PauseMenu720.swf b/Minecraft.Client/Common/Media/PauseMenu720.swf new file mode 100644 index 00000000..aa60f80c Binary files /dev/null and b/Minecraft.Client/Common/Media/PauseMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/PauseMenuSplit1080.swf b/Minecraft.Client/Common/Media/PauseMenuSplit1080.swf new file mode 100644 index 00000000..31c8a99d Binary files /dev/null and b/Minecraft.Client/Common/Media/PauseMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/PauseMenuSplit720.swf b/Minecraft.Client/Common/Media/PauseMenuSplit720.swf new file mode 100644 index 00000000..fec48456 Binary files /dev/null and b/Minecraft.Client/Common/Media/PauseMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/PauseMenuVita.swf b/Minecraft.Client/Common/Media/PauseMenuVita.swf new file mode 100644 index 00000000..bb811234 Binary files /dev/null and b/Minecraft.Client/Common/Media/PauseMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/PressStartToPlay1080.swf b/Minecraft.Client/Common/Media/PressStartToPlay1080.swf new file mode 100644 index 00000000..d15bedfc Binary files /dev/null and b/Minecraft.Client/Common/Media/PressStartToPlay1080.swf differ diff --git a/Minecraft.Client/Common/Media/PressStartToPlay480.swf b/Minecraft.Client/Common/Media/PressStartToPlay480.swf new file mode 100644 index 00000000..dab6c326 Binary files /dev/null and b/Minecraft.Client/Common/Media/PressStartToPlay480.swf differ diff --git a/Minecraft.Client/Common/Media/PressStartToPlay720.swf b/Minecraft.Client/Common/Media/PressStartToPlay720.swf new file mode 100644 index 00000000..30255042 Binary files /dev/null and b/Minecraft.Client/Common/Media/PressStartToPlay720.swf differ diff --git a/Minecraft.Client/Common/Media/PressStartToPlayVita.swf b/Minecraft.Client/Common/Media/PressStartToPlayVita.swf new file mode 100644 index 00000000..339d134b Binary files /dev/null and b/Minecraft.Client/Common/Media/PressStartToPlayVita.swf differ diff --git a/Minecraft.Client/Common/Media/QuadrantSignin1080.swf b/Minecraft.Client/Common/Media/QuadrantSignin1080.swf new file mode 100644 index 00000000..760a0319 Binary files /dev/null and b/Minecraft.Client/Common/Media/QuadrantSignin1080.swf differ diff --git a/Minecraft.Client/Common/Media/QuadrantSignin720.swf b/Minecraft.Client/Common/Media/QuadrantSignin720.swf new file mode 100644 index 00000000..fd3542ff Binary files /dev/null and b/Minecraft.Client/Common/Media/QuadrantSignin720.swf differ diff --git a/Minecraft.Client/Common/Media/ReinstallMenu1080.swf b/Minecraft.Client/Common/Media/ReinstallMenu1080.swf new file mode 100644 index 00000000..cff53681 Binary files /dev/null and b/Minecraft.Client/Common/Media/ReinstallMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/ReinstallMenu480.swf b/Minecraft.Client/Common/Media/ReinstallMenu480.swf new file mode 100644 index 00000000..d7c580e9 Binary files /dev/null and b/Minecraft.Client/Common/Media/ReinstallMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/ReinstallMenu720.swf b/Minecraft.Client/Common/Media/ReinstallMenu720.swf new file mode 100644 index 00000000..3d3ccd82 Binary files /dev/null and b/Minecraft.Client/Common/Media/ReinstallMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/ReinstallMenuSplit1080.swf b/Minecraft.Client/Common/Media/ReinstallMenuSplit1080.swf new file mode 100644 index 00000000..fc77e2a2 Binary files /dev/null and b/Minecraft.Client/Common/Media/ReinstallMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/ReinstallMenuSplit720.swf b/Minecraft.Client/Common/Media/ReinstallMenuSplit720.swf new file mode 100644 index 00000000..9749eb8e Binary files /dev/null and b/Minecraft.Client/Common/Media/ReinstallMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/ReinstallMenuVita.swf b/Minecraft.Client/Common/Media/ReinstallMenuVita.swf new file mode 100644 index 00000000..8df38f63 Binary files /dev/null and b/Minecraft.Client/Common/Media/ReinstallMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/SaveMenu1080.swf b/Minecraft.Client/Common/Media/SaveMenu1080.swf new file mode 100644 index 00000000..ff546d74 Binary files /dev/null and b/Minecraft.Client/Common/Media/SaveMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/SaveMessage1080.swf b/Minecraft.Client/Common/Media/SaveMessage1080.swf new file mode 100644 index 00000000..1108359d Binary files /dev/null and b/Minecraft.Client/Common/Media/SaveMessage1080.swf differ diff --git a/Minecraft.Client/Common/Media/SaveMessage480.swf b/Minecraft.Client/Common/Media/SaveMessage480.swf new file mode 100644 index 00000000..094e4811 Binary files /dev/null and b/Minecraft.Client/Common/Media/SaveMessage480.swf differ diff --git a/Minecraft.Client/Common/Media/SaveMessage720.swf b/Minecraft.Client/Common/Media/SaveMessage720.swf new file mode 100644 index 00000000..dc0cec49 Binary files /dev/null and b/Minecraft.Client/Common/Media/SaveMessage720.swf differ diff --git a/Minecraft.Client/Common/Media/SaveMessageVita.swf b/Minecraft.Client/Common/Media/SaveMessageVita.swf new file mode 100644 index 00000000..f4017ed2 Binary files /dev/null and b/Minecraft.Client/Common/Media/SaveMessageVita.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsAudioMenu1080.swf b/Minecraft.Client/Common/Media/SettingsAudioMenu1080.swf new file mode 100644 index 00000000..cc3330ab Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsAudioMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsAudioMenu480.swf b/Minecraft.Client/Common/Media/SettingsAudioMenu480.swf new file mode 100644 index 00000000..aaa79aee Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsAudioMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsAudioMenu720.swf b/Minecraft.Client/Common/Media/SettingsAudioMenu720.swf new file mode 100644 index 00000000..45993245 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsAudioMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsAudioMenuSplit1080.swf b/Minecraft.Client/Common/Media/SettingsAudioMenuSplit1080.swf new file mode 100644 index 00000000..6115bf4f Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsAudioMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsAudioMenuSplit720.swf b/Minecraft.Client/Common/Media/SettingsAudioMenuSplit720.swf new file mode 100644 index 00000000..7dd3f025 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsAudioMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsAudioMenuVita.swf b/Minecraft.Client/Common/Media/SettingsAudioMenuVita.swf new file mode 100644 index 00000000..86e7295c Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsAudioMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsControlMenu1080.swf b/Minecraft.Client/Common/Media/SettingsControlMenu1080.swf new file mode 100644 index 00000000..19f88ec2 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsControlMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsControlMenu480.swf b/Minecraft.Client/Common/Media/SettingsControlMenu480.swf new file mode 100644 index 00000000..1e05af61 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsControlMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsControlMenu720.swf b/Minecraft.Client/Common/Media/SettingsControlMenu720.swf new file mode 100644 index 00000000..983e879e Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsControlMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsControlMenuSplit1080.swf b/Minecraft.Client/Common/Media/SettingsControlMenuSplit1080.swf new file mode 100644 index 00000000..58770d0a Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsControlMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsControlMenuSplit720.swf b/Minecraft.Client/Common/Media/SettingsControlMenuSplit720.swf new file mode 100644 index 00000000..2893aac0 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsControlMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsControlMenuVita.swf b/Minecraft.Client/Common/Media/SettingsControlMenuVita.swf new file mode 100644 index 00000000..dcf91a67 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsControlMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsGraphicsMenu1080.swf b/Minecraft.Client/Common/Media/SettingsGraphicsMenu1080.swf new file mode 100644 index 00000000..3a48abc9 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsGraphicsMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsGraphicsMenu480.swf b/Minecraft.Client/Common/Media/SettingsGraphicsMenu480.swf new file mode 100644 index 00000000..4fb884a9 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsGraphicsMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsGraphicsMenu720.swf b/Minecraft.Client/Common/Media/SettingsGraphicsMenu720.swf new file mode 100644 index 00000000..94996803 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsGraphicsMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsGraphicsMenuSplit1080.swf b/Minecraft.Client/Common/Media/SettingsGraphicsMenuSplit1080.swf new file mode 100644 index 00000000..6037882d Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsGraphicsMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsGraphicsMenuSplit720.swf b/Minecraft.Client/Common/Media/SettingsGraphicsMenuSplit720.swf new file mode 100644 index 00000000..133dae45 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsGraphicsMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsGraphicsMenuVita.swf b/Minecraft.Client/Common/Media/SettingsGraphicsMenuVita.swf new file mode 100644 index 00000000..5e937d4d Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsGraphicsMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsMenu1080.swf b/Minecraft.Client/Common/Media/SettingsMenu1080.swf new file mode 100644 index 00000000..9e922acd Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsMenu480.swf b/Minecraft.Client/Common/Media/SettingsMenu480.swf new file mode 100644 index 00000000..4f94774b Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsMenu720.swf b/Minecraft.Client/Common/Media/SettingsMenu720.swf new file mode 100644 index 00000000..38371275 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsMenuSplit1080.swf b/Minecraft.Client/Common/Media/SettingsMenuSplit1080.swf new file mode 100644 index 00000000..467b2e1f Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsMenuSplit720.swf b/Minecraft.Client/Common/Media/SettingsMenuSplit720.swf new file mode 100644 index 00000000..7c504168 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsMenuVita.swf b/Minecraft.Client/Common/Media/SettingsMenuVita.swf new file mode 100644 index 00000000..b8bd51b7 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsOptionsMenu1080.swf b/Minecraft.Client/Common/Media/SettingsOptionsMenu1080.swf new file mode 100644 index 00000000..9dc478c4 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsOptionsMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsOptionsMenu480.swf b/Minecraft.Client/Common/Media/SettingsOptionsMenu480.swf new file mode 100644 index 00000000..717e8ac9 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsOptionsMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsOptionsMenu720.swf b/Minecraft.Client/Common/Media/SettingsOptionsMenu720.swf new file mode 100644 index 00000000..05a1bc63 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsOptionsMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsOptionsMenuSplit1080.swf b/Minecraft.Client/Common/Media/SettingsOptionsMenuSplit1080.swf new file mode 100644 index 00000000..5bef6ed3 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsOptionsMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsOptionsMenuSplit720.swf b/Minecraft.Client/Common/Media/SettingsOptionsMenuSplit720.swf new file mode 100644 index 00000000..e6bf0a4e Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsOptionsMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsOptionsMenuVita.swf b/Minecraft.Client/Common/Media/SettingsOptionsMenuVita.swf new file mode 100644 index 00000000..a3ca1b24 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsOptionsMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsUIMenu1080.swf b/Minecraft.Client/Common/Media/SettingsUIMenu1080.swf new file mode 100644 index 00000000..a72537df Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsUIMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsUIMenu480.swf b/Minecraft.Client/Common/Media/SettingsUIMenu480.swf new file mode 100644 index 00000000..a25ea999 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsUIMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsUIMenu720.swf b/Minecraft.Client/Common/Media/SettingsUIMenu720.swf new file mode 100644 index 00000000..b1987781 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsUIMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsUIMenuSplit1080.swf b/Minecraft.Client/Common/Media/SettingsUIMenuSplit1080.swf new file mode 100644 index 00000000..18128a0e Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsUIMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsUIMenuSplit720.swf b/Minecraft.Client/Common/Media/SettingsUIMenuSplit720.swf new file mode 100644 index 00000000..5ca09874 Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsUIMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsUIMenuVita.swf b/Minecraft.Client/Common/Media/SettingsUIMenuVita.swf new file mode 100644 index 00000000..76eaf79d Binary files /dev/null and b/Minecraft.Client/Common/Media/SettingsUIMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/SignEntryMenu1080.swf b/Minecraft.Client/Common/Media/SignEntryMenu1080.swf new file mode 100644 index 00000000..710de35e Binary files /dev/null and b/Minecraft.Client/Common/Media/SignEntryMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/SignEntryMenu480.swf b/Minecraft.Client/Common/Media/SignEntryMenu480.swf new file mode 100644 index 00000000..9e980151 Binary files /dev/null and b/Minecraft.Client/Common/Media/SignEntryMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/SignEntryMenu720.swf b/Minecraft.Client/Common/Media/SignEntryMenu720.swf new file mode 100644 index 00000000..7118faef Binary files /dev/null and b/Minecraft.Client/Common/Media/SignEntryMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/SignEntryMenuSplit1080.swf b/Minecraft.Client/Common/Media/SignEntryMenuSplit1080.swf new file mode 100644 index 00000000..4bea3fcd Binary files /dev/null and b/Minecraft.Client/Common/Media/SignEntryMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/SignEntryMenuSplit720.swf b/Minecraft.Client/Common/Media/SignEntryMenuSplit720.swf new file mode 100644 index 00000000..a26f2534 Binary files /dev/null and b/Minecraft.Client/Common/Media/SignEntryMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/SignEntryMenuVita.swf b/Minecraft.Client/Common/Media/SignEntryMenuVita.swf new file mode 100644 index 00000000..1c7e5efa Binary files /dev/null and b/Minecraft.Client/Common/Media/SignEntryMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/SkinSelectMenu1080.swf b/Minecraft.Client/Common/Media/SkinSelectMenu1080.swf new file mode 100644 index 00000000..002d7639 Binary files /dev/null and b/Minecraft.Client/Common/Media/SkinSelectMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/SkinSelectMenu480.swf b/Minecraft.Client/Common/Media/SkinSelectMenu480.swf new file mode 100644 index 00000000..236bb593 Binary files /dev/null and b/Minecraft.Client/Common/Media/SkinSelectMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/SkinSelectMenu720.swf b/Minecraft.Client/Common/Media/SkinSelectMenu720.swf new file mode 100644 index 00000000..ae8b3ed3 Binary files /dev/null and b/Minecraft.Client/Common/Media/SkinSelectMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/SkinSelectMenuSplit1080.swf b/Minecraft.Client/Common/Media/SkinSelectMenuSplit1080.swf new file mode 100644 index 00000000..a6666acf Binary files /dev/null and b/Minecraft.Client/Common/Media/SkinSelectMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/SkinSelectMenuSplit720.swf b/Minecraft.Client/Common/Media/SkinSelectMenuSplit720.swf new file mode 100644 index 00000000..b090beaa Binary files /dev/null and b/Minecraft.Client/Common/Media/SkinSelectMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/SkinSelectMenuVita.swf b/Minecraft.Client/Common/Media/SkinSelectMenuVita.swf new file mode 100644 index 00000000..34950165 Binary files /dev/null and b/Minecraft.Client/Common/Media/SkinSelectMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/SocialPost1080.swf b/Minecraft.Client/Common/Media/SocialPost1080.swf new file mode 100644 index 00000000..58377378 Binary files /dev/null and b/Minecraft.Client/Common/Media/SocialPost1080.swf differ diff --git a/Minecraft.Client/Common/Media/SocialPost480.swf b/Minecraft.Client/Common/Media/SocialPost480.swf new file mode 100644 index 00000000..90711844 Binary files /dev/null and b/Minecraft.Client/Common/Media/SocialPost480.swf differ diff --git a/Minecraft.Client/Common/Media/SocialPost720.swf b/Minecraft.Client/Common/Media/SocialPost720.swf new file mode 100644 index 00000000..8f96a982 Binary files /dev/null and b/Minecraft.Client/Common/Media/SocialPost720.swf differ diff --git a/Minecraft.Client/Common/Media/SocialPostSplit1080.swf b/Minecraft.Client/Common/Media/SocialPostSplit1080.swf new file mode 100644 index 00000000..68d7cc5d Binary files /dev/null and b/Minecraft.Client/Common/Media/SocialPostSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/SocialPostSplit720.swf b/Minecraft.Client/Common/Media/SocialPostSplit720.swf new file mode 100644 index 00000000..0fa023d1 Binary files /dev/null and b/Minecraft.Client/Common/Media/SocialPostSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/SocialPostVita.swf b/Minecraft.Client/Common/Media/SocialPostVita.swf new file mode 100644 index 00000000..94f79ae4 Binary files /dev/null and b/Minecraft.Client/Common/Media/SocialPostVita.swf differ diff --git a/Minecraft.Client/Common/Media/Sound/MenuSounds.xap b/Minecraft.Client/Common/Media/Sound/MenuSounds.xap new file mode 100644 index 00000000..998e0090 --- /dev/null +++ b/Minecraft.Client/Common/Media/Sound/MenuSounds.xap @@ -0,0 +1,808 @@ +Signature = XACT3; +Version = 18; +Content Version = 46; +Release = February 2010; + +Options +{ + Verbose Report = 0; + Generate C/C++ Headers = 1; +} + +Global Settings +{ + Xbox File = Xbox\MenuSounds.xgs; + Windows File = Win\MenuSounds.xgs; + Header File = C:\Work\4J\Mojang\Minecraft\Minecraft360\Minecraft.Client\Xbox\Media\Sound\MenuSounds.h; + Exclude Category Names = 0; + Exclude Variable Names = 0; + Last Modified Low = 30214254; + Last Modified High = 4282487269; + + Category + { + Name = Global; + Public = 1; + Background Music = 0; + Volume = 0; + + Category Entry + { + } + + Instance Limit + { + Max Instances = 255; + Behavior = 0; + + Crossfade + { + Fade In = 0; + Fade Out = 0; + Crossfade Type = 0; + } + } + } + + Category + { + Name = Default; + Public = 1; + Background Music = 0; + Volume = 0; + + Category Entry + { + Name = Global; + } + + Instance Limit + { + Max Instances = 255; + Behavior = 0; + + Crossfade + { + Fade In = 0; + Fade Out = 0; + Crossfade Type = 0; + } + } + } + + Category + { + Name = Music; + Public = 1; + Background Music = 1; + Volume = 0; + + Category Entry + { + Name = Global; + } + + Instance Limit + { + Max Instances = 255; + Behavior = 0; + + Crossfade + { + Fade In = 0; + Fade Out = 0; + Crossfade Type = 0; + } + } + } + + Variable + { + Name = OrientationAngle; + Public = 1; + Global = 0; + Internal = 0; + External = 0; + Monitored = 1; + Reserved = 1; + Read Only = 0; + Time = 0; + Value = 0.000000; + Initial Value = 0.000000; + Min = -180.000000; + Max = 180.000000; + } + + Variable + { + Name = DopplerPitchScalar; + Public = 1; + Global = 0; + Internal = 0; + External = 0; + Monitored = 1; + Reserved = 1; + Read Only = 0; + Time = 0; + Value = 1.000000; + Initial Value = 1.000000; + Min = 0.000000; + Max = 4.000000; + } + + Variable + { + Name = SpeedOfSound; + Public = 1; + Global = 1; + Internal = 0; + External = 0; + Monitored = 1; + Reserved = 1; + Read Only = 0; + Time = 0; + Value = 343.500000; + Initial Value = 343.500000; + Min = 0.000000; + Max = 1000000.000000; + } + + Variable + { + Name = ReleaseTime; + Public = 1; + Global = 0; + Internal = 1; + External = 1; + Monitored = 1; + Reserved = 1; + Read Only = 1; + Time = 1; + Value = 0.000000; + Initial Value = 0.000000; + Min = 0.000000; + Max = 15000.000000; + } + + Variable + { + Name = AttackTime; + Public = 1; + Global = 0; + Internal = 1; + External = 1; + Monitored = 1; + Reserved = 1; + Read Only = 1; + Time = 1; + Value = 0.000000; + Initial Value = 0.000000; + Min = 0.000000; + Max = 15000.000000; + } + + Variable + { + Name = NumCueInstances; + Public = 1; + Global = 0; + Internal = 1; + External = 1; + Monitored = 1; + Reserved = 1; + Read Only = 1; + Time = 0; + Value = 0.000000; + Initial Value = 0.000000; + Min = 0.000000; + Max = 1024.000000; + } + + Variable + { + Name = Distance; + Public = 1; + Global = 0; + Internal = 0; + External = 0; + Monitored = 1; + Reserved = 1; + Read Only = 0; + Time = 0; + Value = 0.000000; + Initial Value = 0.000000; + Min = 0.000000; + Max = 1000000.000000; + } + + RPC + { + Name = Pitch; + } + + Compression Preset + { + Name = Default; + Xbox Format Tag = 357; + Target Sample Rate = 48000; + XMA Quality = 60; + Find Best Quality = 0; + High Freq Cut = 0; + Loop = 0; + PC Format Tag = 2; + Samples Per Block = 128; + } +} + +Wave Bank +{ + Name = MenuSounds; + Xbox File = Xbox\MenuSounds.xwb; + Windows File = Win\MenuSounds.xwb; + Xbox Bank Path Edited = 0; + Windows Bank Path Edited = 0; + Entry Names = 1; + Seek Tables = 1; + Compression Preset Name = Default; + Bank Last Revised Low = 4141013591; + Bank Last Revised High = 30214257; + + Wave + { + Name = wood click; + File = wood click.wav; + Build Settings Last Modified Low = 4121320074; + Build Settings Last Modified High = 30213378; + + Cache + { + Format Tag = 0; + Channels = 1; + Sampling Rate = 44100; + Bits Per Sample = 1; + Play Region Offset = 44; + Play Region Length = 13868; + Loop Region Offset = 0; + Loop Region Length = 0; + File Type = 1; + Last Modified Low = 2058846419; + Last Modified High = 30205926; + } + } + + Wave + { + Name = btn_Back; + File = btn_Back.wav; + Build Settings Last Modified Low = 1085331294; + Build Settings Last Modified High = 30213595; + + Cache + { + Format Tag = 0; + Channels = 2; + Sampling Rate = 48000; + Bits Per Sample = 1; + Play Region Offset = 44; + Play Region Length = 47368; + Loop Region Offset = 0; + Loop Region Length = 0; + File Type = 1; + Last Modified Low = 2645456735; + Last Modified High = 30170504; + } + } + + Wave + { + Name = pop; + File = pop.wav; + Build Settings Last Modified Low = 1085336294; + Build Settings Last Modified High = 30213595; + + Cache + { + Format Tag = 0; + Channels = 1; + Sampling Rate = 44100; + Bits Per Sample = 1; + Play Region Offset = 44; + Play Region Length = 15340; + Loop Region Offset = 0; + Loop Region Length = 0; + File Type = 1; + Last Modified Low = 2055455989; + Last Modified High = 30205926; + } + } + + Wave + { + Name = Scroll1; + File = Scroll1.wav; + Build Settings Last Modified Low = 2362955424; + Build Settings Last Modified High = 30214253; + + Cache + { + Format Tag = 0; + Channels = 1; + Sampling Rate = 44100; + Bits Per Sample = 1; + Play Region Offset = 112; + Play Region Length = 18228; + Loop Region Offset = 0; + Loop Region Length = 0; + File Type = 1; + Last Modified Low = 3761304897; + Last Modified High = 30214252; + } + } + + Wave + { + Name = Back3; + File = Back3.wav; + Build Settings Last Modified Low = 2362965426; + Build Settings Last Modified High = 30214253; + + Cache + { + Format Tag = 0; + Channels = 2; + Sampling Rate = 44100; + Bits Per Sample = 1; + Play Region Offset = 112; + Play Region Length = 43272; + Loop Region Offset = 0; + Loop Region Length = 0; + File Type = 1; + Last Modified Low = 3722514971; + Last Modified High = 30214252; + } + } + + Wave + { + Name = Scroll3; + File = Scroll3.wav; + Build Settings Last Modified Low = 3498867049; + Build Settings Last Modified High = 30214257; + + Cache + { + Format Tag = 0; + Channels = 2; + Sampling Rate = 44100; + Bits Per Sample = 1; + Play Region Offset = 112; + Play Region Length = 5828; + Loop Region Offset = 0; + Loop Region Length = 0; + File Type = 1; + Last Modified Low = 3757184373; + Last Modified High = 30214252; + } + } +} + +Sound Bank +{ + Name = MenuSounds; + Xbox File = Xbox\MenuSounds.xsb; + Windows File = Win\MenuSounds.xsb; + Xbox Bank Path Edited = 0; + Windows Bank Path Edited = 0; + Header Last Modified High = 0; + Header Last Modified Low = 0; + + Sound + { + Name = ButtonPress; + Volume = -1670; + Pitch = 0; + Priority = 0; + + Category Entry + { + Name = Default; + } + + Track + { + Volume = 0; + Use Filter = 0; + + Play Wave Event + { + Break Loop = 0; + Use Speaker Position = 0; + Use Center Speaker = 1; + New Speaker Position On Loop = 1; + Speaker Position Angle = 0.000000; + Speaker Position Arc = 0.000000; + + Event Header + { + Timestamp = 0; + Relative = 0; + Random Recurrence = 0; + Random Offset = 0; + } + + Wave Entry + { + Bank Name = MenuSounds; + Bank Index = 0; + Entry Name = wood click; + Entry Index = 0; + Weight = 255; + Weight Min = 0; + } + } + } + } + + Sound + { + Name = ButtonFocus; + Volume = -320; + Pitch = 531; + Priority = 0; + + Category Entry + { + Name = Default; + } + + Track + { + Volume = 0; + Use Filter = 0; + + Play Wave Event + { + Break Loop = 0; + Use Speaker Position = 0; + Use Center Speaker = 1; + New Speaker Position On Loop = 1; + Speaker Position Angle = 0.000000; + Speaker Position Arc = 0.000000; + + Event Header + { + Timestamp = 0; + Relative = 0; + Random Recurrence = 0; + Random Offset = 0; + } + + Pitch Variation + { + Min = -100; + Max = 100; + Operator = 0; + New Variation On Loop = 0; + } + + Wave Entry + { + Bank Name = MenuSounds; + Bank Index = 0; + Entry Name = Scroll1; + Entry Index = 3; + Weight = 255; + Weight Min = 0; + } + } + } + } + + Sound + { + Name = ButtonCraft; + Volume = -1200; + Pitch = 0; + Priority = 0; + + Category Entry + { + Name = Default; + } + + Track + { + Volume = 0; + Use Filter = 0; + + Play Wave Event + { + Break Loop = 0; + Use Speaker Position = 0; + Use Center Speaker = 1; + New Speaker Position On Loop = 1; + Speaker Position Angle = 0.000000; + Speaker Position Arc = 0.000000; + + Event Header + { + Timestamp = 0; + Relative = 0; + Random Recurrence = 0; + Random Offset = 0; + } + + Wave Entry + { + Bank Name = MenuSounds; + Bank Index = 0; + Entry Name = pop; + Entry Index = 2; + Weight = 255; + Weight Min = 0; + } + } + } + } + + Sound + { + Name = ButtonCraftFail; + Volume = -1200; + Pitch = 0; + Priority = 0; + + Category Entry + { + Name = Default; + } + + Track + { + Volume = 0; + Use Filter = 0; + + Play Wave Event + { + Break Loop = 0; + Use Speaker Position = 0; + Use Center Speaker = 1; + New Speaker Position On Loop = 1; + Speaker Position Angle = 0.000000; + Speaker Position Arc = 0.000000; + + Event Header + { + Timestamp = 0; + Relative = 0; + Random Recurrence = 0; + Random Offset = 0; + } + + Wave Entry + { + Bank Name = MenuSounds; + Bank Index = 0; + Entry Name = btn_Back; + Entry Index = 1; + Weight = 255; + Weight Min = 0; + } + } + } + } + + Sound + { + Name = ButtonBack; + Volume = -1200; + Pitch = 0; + Priority = 0; + + Category Entry + { + Name = Default; + } + + Track + { + Volume = 0; + Use Filter = 0; + + Play Wave Event + { + Break Loop = 0; + Use Speaker Position = 0; + Use Center Speaker = 1; + New Speaker Position On Loop = 1; + Speaker Position Angle = 0.000000; + Speaker Position Arc = 0.000000; + + Event Header + { + Timestamp = 0; + Relative = 0; + Random Recurrence = 0; + Random Offset = 0; + } + + Wave Entry + { + Bank Name = MenuSounds; + Bank Index = 0; + Entry Name = Back3; + Entry Index = 4; + Weight = 255; + Weight Min = 0; + } + } + } + } + + Sound + { + Name = Scroll; + Volume = -1200; + Pitch = 0; + Priority = 0; + + Category Entry + { + Name = Default; + } + + Track + { + Volume = 0; + Use Filter = 0; + + Play Wave Event + { + Break Loop = 0; + Use Speaker Position = 0; + Use Center Speaker = 1; + New Speaker Position On Loop = 1; + Speaker Position Angle = 0.000000; + Speaker Position Arc = 0.000000; + + Event Header + { + Timestamp = 0; + Relative = 0; + Random Recurrence = 0; + Random Offset = 0; + } + + Wave Entry + { + Bank Name = MenuSounds; + Bank Index = 0; + Entry Name = Scroll3; + Entry Index = 5; + Weight = 255; + Weight Min = 0; + } + } + } + } + + Cue + { + Name = ButtonPress; + + Variation + { + Variation Type = 3; + Variation Table Type = 1; + New Variation on Loop = 0; + } + + Sound Entry + { + Name = ButtonPress; + Index = 0; + Weight Min = 0; + Weight Max = 255; + } + } + + Cue + { + Name = ButtonFocus; + + Variation + { + Variation Type = 3; + Variation Table Type = 1; + New Variation on Loop = 0; + } + + Sound Entry + { + Name = ButtonFocus; + Index = 1; + Weight Min = 0; + Weight Max = 255; + } + } + + Cue + { + Name = ButtonCraft; + + Variation + { + Variation Type = 3; + Variation Table Type = 1; + New Variation on Loop = 0; + } + + Sound Entry + { + Name = ButtonCraft; + Index = 2; + Weight Min = 0; + Weight Max = 255; + } + } + + Cue + { + Name = ButtonCraftFail; + + Variation + { + Variation Type = 3; + Variation Table Type = 1; + New Variation on Loop = 0; + } + + Sound Entry + { + Name = ButtonCraftFail; + Index = 3; + Weight Min = 0; + Weight Max = 255; + } + } + + Cue + { + Name = ButtonBack; + + Variation + { + Variation Type = 3; + Variation Table Type = 1; + New Variation on Loop = 0; + } + + Sound Entry + { + Name = ButtonBack; + Index = 4; + Weight Min = 0; + Weight Max = 255; + } + } + + Cue + { + Name = Scroll; + + Variation + { + Variation Type = 3; + Variation Table Type = 1; + New Variation on Loop = 0; + } + + Sound Entry + { + Name = Scroll; + Index = 5; + Weight Min = 0; + Weight Max = 255; + } + } +} diff --git a/Minecraft.Client/Common/Media/Sound/Xbox/MenuSounds.xgs b/Minecraft.Client/Common/Media/Sound/Xbox/MenuSounds.xgs new file mode 100644 index 00000000..0a676adc Binary files /dev/null and b/Minecraft.Client/Common/Media/Sound/Xbox/MenuSounds.xgs differ diff --git a/Minecraft.Client/Common/Media/Sound/Xbox/MenuSounds.xsb b/Minecraft.Client/Common/Media/Sound/Xbox/MenuSounds.xsb new file mode 100644 index 00000000..3ec3310a Binary files /dev/null and b/Minecraft.Client/Common/Media/Sound/Xbox/MenuSounds.xsb differ diff --git a/Minecraft.Client/Common/Media/Sound/Xbox/MenuSounds.xwb b/Minecraft.Client/Common/Media/Sound/Xbox/MenuSounds.xwb new file mode 100644 index 00000000..e3a7b39b Binary files /dev/null and b/Minecraft.Client/Common/Media/Sound/Xbox/MenuSounds.xwb differ diff --git a/Minecraft.Client/Common/Media/Sound/btn_Back.wav b/Minecraft.Client/Common/Media/Sound/btn_Back.wav new file mode 100644 index 00000000..2bb8100e Binary files /dev/null and b/Minecraft.Client/Common/Media/Sound/btn_Back.wav differ diff --git a/Minecraft.Client/Common/Media/Sound/click.wav b/Minecraft.Client/Common/Media/Sound/click.wav new file mode 100644 index 00000000..0b708578 Binary files /dev/null and b/Minecraft.Client/Common/Media/Sound/click.wav differ diff --git a/Minecraft.Client/Common/Media/Sound/pop.wav b/Minecraft.Client/Common/Media/Sound/pop.wav new file mode 100644 index 00000000..387f1329 Binary files /dev/null and b/Minecraft.Client/Common/Media/Sound/pop.wav differ diff --git a/Minecraft.Client/Common/Media/Sound/wood click.wav b/Minecraft.Client/Common/Media/Sound/wood click.wav new file mode 100644 index 00000000..7a71ba9f Binary files /dev/null and b/Minecraft.Client/Common/Media/Sound/wood click.wav differ diff --git a/Minecraft.Client/Common/Media/Timer1080.swf b/Minecraft.Client/Common/Media/Timer1080.swf new file mode 100644 index 00000000..613908c6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Timer1080.swf differ diff --git a/Minecraft.Client/Common/Media/Timer480.swf b/Minecraft.Client/Common/Media/Timer480.swf new file mode 100644 index 00000000..d86c8a95 Binary files /dev/null and b/Minecraft.Client/Common/Media/Timer480.swf differ diff --git a/Minecraft.Client/Common/Media/Timer720.swf b/Minecraft.Client/Common/Media/Timer720.swf new file mode 100644 index 00000000..3ec17805 Binary files /dev/null and b/Minecraft.Client/Common/Media/Timer720.swf differ diff --git a/Minecraft.Client/Common/Media/TimerSplit1080.swf b/Minecraft.Client/Common/Media/TimerSplit1080.swf new file mode 100644 index 00000000..31c8c742 Binary files /dev/null and b/Minecraft.Client/Common/Media/TimerSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/TimerSplit720.swf b/Minecraft.Client/Common/Media/TimerSplit720.swf new file mode 100644 index 00000000..55e608f0 Binary files /dev/null and b/Minecraft.Client/Common/Media/TimerSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/TimerVita.swf b/Minecraft.Client/Common/Media/TimerVita.swf new file mode 100644 index 00000000..6eddd47e Binary files /dev/null and b/Minecraft.Client/Common/Media/TimerVita.swf differ diff --git a/Minecraft.Client/Common/Media/ToolTips1080.swf b/Minecraft.Client/Common/Media/ToolTips1080.swf new file mode 100644 index 00000000..6bb2e367 Binary files /dev/null and b/Minecraft.Client/Common/Media/ToolTips1080.swf differ diff --git a/Minecraft.Client/Common/Media/ToolTips480.swf b/Minecraft.Client/Common/Media/ToolTips480.swf new file mode 100644 index 00000000..735361e7 Binary files /dev/null and b/Minecraft.Client/Common/Media/ToolTips480.swf differ diff --git a/Minecraft.Client/Common/Media/ToolTips720.swf b/Minecraft.Client/Common/Media/ToolTips720.swf new file mode 100644 index 00000000..f29f1649 Binary files /dev/null and b/Minecraft.Client/Common/Media/ToolTips720.swf differ diff --git a/Minecraft.Client/Common/Media/ToolTipsSplit1080.swf b/Minecraft.Client/Common/Media/ToolTipsSplit1080.swf new file mode 100644 index 00000000..91d6327c Binary files /dev/null and b/Minecraft.Client/Common/Media/ToolTipsSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/ToolTipsSplit720.swf b/Minecraft.Client/Common/Media/ToolTipsSplit720.swf new file mode 100644 index 00000000..260092c5 Binary files /dev/null and b/Minecraft.Client/Common/Media/ToolTipsSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/ToolTipsVita.swf b/Minecraft.Client/Common/Media/ToolTipsVita.swf new file mode 100644 index 00000000..f8aa42fc Binary files /dev/null and b/Minecraft.Client/Common/Media/ToolTipsVita.swf differ diff --git a/Minecraft.Client/Common/Media/TradingMenu1080.swf b/Minecraft.Client/Common/Media/TradingMenu1080.swf new file mode 100644 index 00000000..b4bd5ebd Binary files /dev/null and b/Minecraft.Client/Common/Media/TradingMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/TradingMenu480.swf b/Minecraft.Client/Common/Media/TradingMenu480.swf new file mode 100644 index 00000000..e6fa8b5f Binary files /dev/null and b/Minecraft.Client/Common/Media/TradingMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/TradingMenu720.swf b/Minecraft.Client/Common/Media/TradingMenu720.swf new file mode 100644 index 00000000..1ce0cfb1 Binary files /dev/null and b/Minecraft.Client/Common/Media/TradingMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/TradingMenuSplit1080.swf b/Minecraft.Client/Common/Media/TradingMenuSplit1080.swf new file mode 100644 index 00000000..ac6c27ae Binary files /dev/null and b/Minecraft.Client/Common/Media/TradingMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/TradingMenuSplit720.swf b/Minecraft.Client/Common/Media/TradingMenuSplit720.swf new file mode 100644 index 00000000..73ece9f8 Binary files /dev/null and b/Minecraft.Client/Common/Media/TradingMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/TradingMenuVita.swf b/Minecraft.Client/Common/Media/TradingMenuVita.swf new file mode 100644 index 00000000..f36749fb Binary files /dev/null and b/Minecraft.Client/Common/Media/TradingMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/TrialExitUpsell480.swf b/Minecraft.Client/Common/Media/TrialExitUpsell480.swf new file mode 100644 index 00000000..ef85c9f3 Binary files /dev/null and b/Minecraft.Client/Common/Media/TrialExitUpsell480.swf differ diff --git a/Minecraft.Client/Common/Media/TrialExitUpsell720.swf b/Minecraft.Client/Common/Media/TrialExitUpsell720.swf new file mode 100644 index 00000000..d564d461 Binary files /dev/null and b/Minecraft.Client/Common/Media/TrialExitUpsell720.swf differ diff --git a/Minecraft.Client/Common/Media/TutorialPopup1080.swf b/Minecraft.Client/Common/Media/TutorialPopup1080.swf new file mode 100644 index 00000000..01619554 Binary files /dev/null and b/Minecraft.Client/Common/Media/TutorialPopup1080.swf differ diff --git a/Minecraft.Client/Common/Media/TutorialPopup480.swf b/Minecraft.Client/Common/Media/TutorialPopup480.swf new file mode 100644 index 00000000..fbea78ea Binary files /dev/null and b/Minecraft.Client/Common/Media/TutorialPopup480.swf differ diff --git a/Minecraft.Client/Common/Media/TutorialPopup720.swf b/Minecraft.Client/Common/Media/TutorialPopup720.swf new file mode 100644 index 00000000..0d3dcb20 Binary files /dev/null and b/Minecraft.Client/Common/Media/TutorialPopup720.swf differ diff --git a/Minecraft.Client/Common/Media/TutorialPopupSplit1080.swf b/Minecraft.Client/Common/Media/TutorialPopupSplit1080.swf new file mode 100644 index 00000000..cdb09fc9 Binary files /dev/null and b/Minecraft.Client/Common/Media/TutorialPopupSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/TutorialPopupSplit720.swf b/Minecraft.Client/Common/Media/TutorialPopupSplit720.swf new file mode 100644 index 00000000..2234e02c Binary files /dev/null and b/Minecraft.Client/Common/Media/TutorialPopupSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/TutorialPopupVita.swf b/Minecraft.Client/Common/Media/TutorialPopupVita.swf new file mode 100644 index 00000000..e671b2c5 Binary files /dev/null and b/Minecraft.Client/Common/Media/TutorialPopupVita.swf differ diff --git a/Minecraft.Client/Common/Media/de-DE/4J_strings.resx b/Minecraft.Client/Common/Media/de-DE/4J_strings.resx new file mode 100644 index 00000000..8c11837c --- /dev/null +++ b/Minecraft.Client/Common/Media/de-DE/4J_strings.resx @@ -0,0 +1,108 @@ + +Nicht verwendet + +OK + +Zurück + +Abbrechen + +Ja + +Nein + +Beschädigte Speicherdatei + +Deine Speicherdatei ist beschädigt. Beschädigte Speicherdatei überschreiben und neue erstellen? + +Kein freier Speicherplatz + +Auf dem ausgewählten Speichergerät steht nicht genug freier Speicherplatz zur Verfügung, um eine Speicherdatei für das Spiel zu erstellen. + +Erneut auswählen + +Ohne Speichern spielen + +Neue Speicherdatei erstellen + +Speicherdatei überschreiben? + +Diese Speicherdatei existiert bereits auf deinem ausgewählten Speichergerät. Möchtest du sie überschreiben? + +Nein, nicht überschreiben + +Überschreiben und speichern + +Fehler beim Speichern + +Problem mit dem Speichergerät + +Dein Speichergerät ist nicht verfügbar oder hat einen Fehler verursacht. + +Dein Speichergerät ist nicht verfügbar oder hat einen Fehler verursacht. Wähl ein neues Speichergerät aus. + +Neues Speichergerät auswählen + +Kein Speichergerät ausgewählt + +Wenn du kein Speichergerät auswählst, wird die Speicherfunktion deaktiviert. + +Speichergerät auswählen + +Ohne Speichern fortsetzen + +Dein Speichergerät wurde entfernt. Wähl ein neues aus. + +Fehler beim Laden + +Speicherdatei benennen + +Gib einen Namen für deine Speicherdatei ein. + +Zurück zur Xbox Steuerung + +Bist du sicher, dass du das Spiel verlassen möchtest? + +Abgemeldet + +Du bist zum Titelbildschirm zurückgekehrt, weil dein Spielerprofil abgemeldet wurde. + +Das Spiel wurde beendet, weil ein Spielerprofil abgemeldet wurde. + +Weiterspielen + +Spielerprofil nicht online + +Dieses Spiel verfügt über Funktionen, die ein Spielerprofil mit Xbox Live-Berechtigung erfordern, du bist derzeit aber offline. + +Diese Funktion erfordert ein Spielerprofil, das bei Xbox Live angemeldet ist. + +Mit Xbox Live verbinden + +Offline weiterspielen + +Verleihen des Erfolgs misslungen + + Beim Zugriff auf dein Spielerprofil ist ein Problem aufgetreten. Dein Erfolg kann derzeit nicht verliehen werden. + +Problem mit Spielerprofil + +Fehler beim Speichern der Einstellungen im Spielerprofil. + +Gast-Spielerprofil + +Ein Gast-Spielerprofil kann diese Funktion nicht verwenden. Verwende bitte ein anderes Spielerprofil. + +Speichern ... + +Inhalt wird gespeichert. Bitte schalten Sie Ihre Konsole nicht aus. + +Vollständiges Spiel freischalten + +Dies ist die Testversion von Minecraft. Würdest du das vollständige Spiel besitzen, hättest du dir gerade einen Erfolg verdient! +Schalte das vollständige Spiel frei, um den ganzen Spaß von Minecraft zu erleben und zusammen mit deinen Freunden auf der ganzen Welt über Xbox Live zu spielen. +Jetzt das vollständige Spiel freischalten? + +Du bist zum Hauptmenü zurückgekehrt, weil beim Lesen deines Profils ein Fehler aufgetreten ist. + + diff --git a/Minecraft.Client/Common/Media/de-DE/strings.resx b/Minecraft.Client/Common/Media/de-DE/strings.resx new file mode 100644 index 00000000..219cb1b9 --- /dev/null +++ b/Minecraft.Client/Common/Media/de-DE/strings.resx @@ -0,0 +1,4471 @@ + +Es sind neue Inhalte zum Herunterladen verfügbar! Du kannst sie im Hauptmenü über die Schaltfläche "Minecraft Store" herunterladen. + +Du kannst das Aussehen deiner Spielfigur mit einem Skinpaket aus dem Minecraft Store anpassen. Wähle "Minecraft Store" im Hauptmenü, um zu sehen, was verfügbar ist. + +Wenn du dieses Spiel im HD-Modus spielst, können auf einer Konsole mit geteiltem Bildschirm bis zu vier Spieler spielen! + +Schließ zusätzliche Controller an deine Konsole an und drück auf ihnen START, um jederzeit einem Spiel beizutreten. + +Ändere die Gamma-Einstellung, um das Spiel heller oder dunkler anzeigen zu lassen. + +Wenn du die Spielschwierigkeit auf Friedlich setzt, wird deine Gesundheit automatisch regeneriert und nachts tauchen keine Monster auf! + +Füttere einen Wolf mit einem Knochen, um ihn zu zähmen. Du kannst ihm dann befehlen, sich zu setzen oder dir zu folgen. + +Du kannst vom Inventarmenü aus Gegenstände ablegen, indem du den Cursor aus dem Menü hinaus bewegst und{*CONTROLLER_VK_A*}drückst. + +Wenn du nachts in einem Bett schläfst, wird die Zeit bis zum Sonnenaufgang vorgedreht. In einem Multiplayer-Spiel müssen sich dafür aber alle Spieler gleichzeitig im Bett befinden. + +Hol dir Schweinefleisch von Schweinen. Koch und iss es, um deine Gesundheit zu regenerieren. + +Hol dir Leder von Kühen und stell daraus Rüstungen her. + +Wenn du einen leeren Eimer hast, kannst du ihn mit Milch von einer Kuh, Wasser oder Lava füllen! + +Bereite mit einer Hacke den Boden aufs Bepflanzen vor. + +Spinnen werden dich tagsüber nicht angreifen, es sei denn, du greifst sie an! + +Erde oder Sand lässt sich mit einem Spaten schneller abbauen als per Hand! + +Mit gekochtem Schweinefleisch regeneriert die Gesundheit besser als mit rohem. + +Stelle Fackeln her, um nachts die Gegend zu erhellen. Monster werden die Bereiche rund um diese Fackeln meiden. + +Mit einer Lore und Schienen erreichst du dein Ziel schneller! + +Pflanz ein paar Setzlinge. Sie werden zu Bäumen heranwachsen. + +Pigmen greifen dich nicht an, es sei denn, du greifst sie an. + +Du kannst deinen Wiedereintrittspunkt ändern und zum Sonnenaufgang vorspringen, indem du in einem Bett schläfst. + +Schleudere die Feuerbälle auf den Ghast zurück! + +Wenn du ein Portal baust, kannst du damit in eine andere Dimension reisen - den Nether. + +Drück{*CONTROLLER_VK_B*}, um den Gegenstand abzulegen, den du derzeit in der Hand hältst! + +Verwende für jede Arbeit das geeignete Werkzeug! + +Wenn du keine Kohle für deine Fackeln findest, kannst du immer noch im Ofen aus Bäumen Holzkohle herstellen. + +Gerade nach unten oder oben zu graben, ist keine so gute Idee. + +Knochenmehl (hergestellt aus einem Skelettknochen) kann als Dünger verwendet werden und lässt Pflanzen sofort wachsen! + +Creeper explodieren, wenn sie dir zu nahe kommen! + +Obsidian entsteht, wenn Wasser auf eine Lavaquelle trifft. + +Es kann Minuten dauern, bis die Lava VOLLSTÄNDIG verschwindet, nachdem die Lavaquelle entfernt wurde. + +Pflasterstein ist immun gegen die Feuerbälle von Ghasts und eignet sich daher zum Schutz von Portalen. + +Alle Blöcke, die als Lichtquelle verwendet werden können, schmelzen Schnee und Eis. Dazu zählen Fackeln, Glowstone und Kürbislaternen. + +Sei vorsichtig, wenn du unter freiem Himmel Strukturen aus Wolle baust, da Gewitterblitze Wolle entzünden können. + +Ein einziger Eimer Lava reicht als Brennmaterial, um in einem Ofen 100 Blöcke zu schmelzen. + +Das Instrument, das ein Notenblock spielt, hängt von dem Material unter dem Block ab. + +Zombies und Skelette können den Kontakt mit Tageslicht überleben, wenn sie sich im Wasser befinden. + +Wenn du einen Wolf angreifst, werden alle Wölfe in der unmittelbaren Umgebung aggressiv und greifen dich an. Das Gleiche gilt für Zombie Pigmen. + +Wölfe können nicht den Nether betreten. + +Wölfe werden keine Creeper angreifen. + +Hühner legen alle 5 bis 10 Minuten ein Ei. + +Obsidian kann nur mit einer Diamantspitzhacke abgebaut werden. + +Creeper sind die einfachste Möglichkeit, zu Schießpulver zu kommen. + +Wenn du zwei Truhen direkt nebeneinander stellst, entsteht eine große Truhe. + +Zahme Wölfe zeigen ihre Gesundheit durch die Haltung ihres Schwanzes an. Füttere sie mit Fleisch, um sie zu heilen. + +Koche Kaktus im Ofen, um grüne Farbe zu erhalten. + +Die neuesten Informationen von 4J Studios und Kappische zu diesem Spiel findest du auf Twitter! + +Beeindrucke deine Freunde, indem du vom Pause-Menü aus Screenshots deiner Minecraft-Werke auf Facebook freigibst! + +Lies dir den Abschnitt „Was ist neu“ im Menü „So wird gespielt“ durch, um die aktuellen Update-Informationen über das Spiel zu erfahren. + +Es gibt jetzt stapelbare Zäune im Spiel! + +minecraftforum hat einen eigenen Bereich zur Xbox 360 Edition. + +Manche Tiere folgen dir, wenn du Weizen in deiner Hand hältst. + +Wenn ein Tier sich nicht mehr als 20 Blöcke in eine beliebige Richtung bewegen kann, verschwindet es nicht. + +Musik von C418! + +Notch hat mehr als eine Million Follower auf Twitter! + +Nicht alle Schweden sind blond. Manche wie Jens von Mojang haben sogar rote Haare! + +Wir glauben, dass 4J Studios Herobrine aus dem Xbox 360 Konsolenspiel entfernt haben, aber wir sind uns nicht ganz sicher. + +Irgendwann wird es ein Update für dieses Spiel geben! + +Wer ist Notch? + +Mojang hat mehr Preise als Mitarbeiter! + +Es gibt berühmte Personen, die Minecraft spielen! + +deadmau5 mag Minecraft! + +Bitte schau nicht direkt auf die Bugs. + +Creeper wurden aus einem Programmierfehler geboren. + +Ist es ein Huhn oder eine Ente? + +Warst du auf der MineCon? + +Niemand bei Mojang hat je das Gesicht von Junkboy gesehen. + +Wusstest du schon, dass es ein Minecraft Wiki gibt? + +Mojangs neues Büro ist cool! + +Minecraft: Xbox 360 Edition hat jede Menge Rekorde gebrochen! + +Die Minecon 2013 fand in Orlando, Florida (USA) statt! + +.party() war exzellent! + +Gerüchte sind sicherlich immer eher falsch als wahr! + +{*T3*}SO WIRD GESPIELT: GRUNDLAGEN{*ETW*}{*B*}{*B*} +Minecraft ist ein Spiel, bei dem du Blöcke platzierst, um alles zu bauen, was du dir vorstellen kannst. Nachts treiben sich Monster herum, du solltest dir eine Zuflucht bauen, bevor sie herauskommen.{*B*}{*B*} +Mit{*CONTROLLER_ACTION_LOOK*} kannst du dich umsehen.{*B*}{*B*} +Mit{*CONTROLLER_ACTION_MOVE*} kannst du dich bewegen.{*B*}{*B*} +Drück{*CONTROLLER_ACTION_JUMP*}, um zu springen.{*B*}{*B*} +Drück{*CONTROLLER_ACTION_MOVE*} zweimal schnell nacheinander nach vorn, um zu sprinten. Solange du{*CONTROLLER_ACTION_MOVE*} nach vorn gedrückt hältst, sprintest du weiter, bis dir die Sprintzeit ausgeht oder deine Hungerleiste weniger als{*ICON_SHANK_03*} anzeigt. +Halte{*CONTROLLER_ACTION_ACTION*} gedrückt, um mit deiner Hand oder dem, was du darin hältst, zu graben oder zu hacken. Möglicherweise musst du dir ein Werkzeug bauen, um manche Blöcke abbauen zu können.{*B*}{*B*} +Wenn du einen Gegenstand in der Hand hältst, kannst du ihn mit{*CONTROLLER_ACTION_USE*} verwenden. Drück{*CONTROLLER_ACTION_DROP*}, um ihn abzulegen. + +{*T3*}SO WIRD GESPIELT: DISPLAY{*ETW*}{*B*}{*B*} +Das Display auf dem Bildschirm zeigt dir Informationen zu deinem Zustand: deine Gesundheit, deinen restlichen Sauerstoff, wenn du unter Wasser bist, deinen Hunger (du musst etwas essen, um ihn zu stillen) und deine Rüstung, wenn du eine trägst. Wenn du Gesundheit verlierst, du aber 9 oder mehr{*ICON_SHANK_01*} in deiner Hungerleiste hast, regeneriert deine Gesundheit sich automatisch. Wenn du Nahrung isst, wird deine Hungerleiste aufgefüllt.{*B*} +Hier wird auch die Erfahrungsleiste angezeigt. Ein Zahlenwert gibt deinen Erfahrungslevel an; die Länge der Leiste zeigt an, wie viele Erfahrungspunkte du benötigst, um deinen Erfahrungslevel zu steigern. Du erhältst Erfahrungspunkte durch Einsammeln von Erfahrungskugeln, die entstehen, wenn NPCs sterben oder wenn du bestimmte Blocktypen abbaust, Tiere züchtest, angelst oder Erze im Ofen schmilzt.{*B*}{*B*} +Das Display zeigt auch die Gegenstände an, die du verwenden kannst. Wechsle mit{*CONTROLLER_ACTION_LEFT_SCROLL*} oder{*CONTROLLER_ACTION_RIGHT_SCROLL*} den Gegenstand in deiner Hand. + +{*T3*}SO WIRD GESPIELT: INVENTAR{*ETW*}{*B*}{*B*} +Sieh dir mit{*CONTROLLER_ACTION_INVENTORY*} dein Inventar an.{*B*}{*B*} +Auf diesem Bildschirm siehst du die Gegenstände, die du in deiner Hand verwenden kannst, und alle anderen Gegenstände, die du bei dir trägst. Außerdem wird hier deine Rüstung angezeigt.{*B*}{*B*} +Beweg den Cursor mit{*CONTROLLER_MENU_NAVIGATE*}. Wähl mit{*CONTROLLER_VK_A*} den Gegenstand unter dem Cursor aus. Wenn sich mehr als ein Gegenstand unter dem Cursor befindet, werden alle aufgenommen. Mit{*CONTROLLER_VK_X*} kannst du nur die Hälfte von ihnen aufnehmen.{*B*}{*B*} +Beweg den Gegenstand mit dem Cursor an einen anderen Platz im Inventar, und leg ihn dort mit{*CONTROLLER_VK_A*} ab. Wenn unter dem Cursor mehrere Gegenstände liegen, kannst du mit{*CONTROLLER_VK_A*} alle ablegen oder mit{*CONTROLLER_VK_X*} nur einen.{*B*}{*B*} +Wenn du den Cursor über eine Rüstung bewegst, informiert eine QuickInfo dich über die Möglichkeit zum Aktivieren des schnellen Bewegens der Rüstung an den richtigen Rüstungsplatz im Inventar.{*B*}{*B*} +Du kannst deine Lederrüstung einfärben, indem du im Inventarmenü die Farbe mit dem Cursor hältst und sie dann mit{*CONTROLLER_VK_X*} auf das Teil anwendest, über dem sich der Cursor befindet. + + +{*T3*}SO WIRD GESPIELT: TRUHE{*ETW*}{*B*}{*B*} +Wenn du eine Truhe erschaffen hast, kannst du sie in der Welt platzieren und dann mit{*CONTROLLER_ACTION_USE*}verwenden, um Gegenstände aus deinem Inventar hineinzulegen.{*B*}{*B*} +Verwende den Cursor, um Gegenstände zwischen deinem Inventar und der Truhe zu verschieben.{*B*}{*B*} +Du kannst Gegenstände in der Truhe lagern, um sie später wieder deinem Inventar hinzuzufügen. + + +{*T3*}SO WIRD GESPIELT: GROSSE TRUHE{*ETW*}{*B*}{*B*} +Wenn du zwei Truhen nebeneinander stellst, werden sie zu einer großen Truhe zusammengefügt. In ihr kannst du noch mehr Gegenstände lagern.{*B*}{*B*} +Sie funktioniert genauso wie eine normale Truhe. + + +{*T3*}SO WIRD GESPIELT: CRAFTING{*ETW*}{*B*}{*B*} +Auf der Crafting-Oberfläche kannst du Gegenstände aus deinem Inventar kombinieren, um neue Arten von Gegenständen zu erschaffen. Öffne die Crafting-Oberfläche mit{*CONTROLLER_ACTION_CRAFTING*}.{*B*}{*B*} +Wechsle mit{*CONTROLLER_VK_LB*} und{*CONTROLLER_VK_RB*} zwischen den Reitern am oberen Rand, um die Art des Gegenstands auszuwählen, den du herstellen möchtest. Wähl dann mit{*CONTROLLER_MENU_NAVIGATE*}den Gegenstand aus, den du herstellen möchtest.{*B*}{*B*} +Der Crafting-Bereich zeigt dir die Gegenstände, die du brauchst, um den neuen Gegenstand herzustellen. Drück{*CONTROLLER_VK_A*}, um den Gegenstand herzustellen und ihn in deinem Inventar abzulegen. + + +{*T3*}SO WIRD GESPIELT: WERKBANK{*ETW*}{*B*}{*B*} +Mit einer Werkbank kannst du größere Gegenstände herstellen.{*B*}{*B*} +Platzier die Werkbank in der Welt und drück{*CONTROLLER_ACTION_USE*}, um sie zu verwenden.{*B*}{*B*} +Crafting auf der Werkbank funktioniert genauso wie einfaches Crafting, allerdings bietet sie mehr Platz und dadurch eine größere Auswahl an Gegenständen, die du herstellen kannst. + + +{*T3*}SO WIRD GESPIELT: OFEN{*ETW*}{*B*}{*B*} +Mit einem Ofen kannst du Gegenstände durch Erhitzen verändern. Zum Beispiel kannst du im Ofen aus Eisenerz Eisenbarren herstellen.{*B*}{*B*} +Platzier den Ofen in der Welt und drück{*CONTROLLER_ACTION_USE*}, um ihn zu verwenden.{*B*}{*B*} +Du musst unten in den Ofen etwas Brennstoff legen und oben in den Ofen den Gegenstand, den du erhitzen möchtest. Der Ofen wird dann angeheizt und beginnt zu arbeiten.{*B*}{*B*} +Wenn deine Gegenstände erhitzt sind, kannst du sie aus dem Ausgangsbereich in dein Inventar verschieben.{*B*}{*B*} +Wenn du den Cursor über eine Zutat oder einen Brennstoff für den Ofen bewegst, informiert eine Quickinfo dich über die Möglichkeit zum Aktivieren des schnellen Bewegens des Gegenstands in den Ofen. + + +{*T3*}SO WIRD GESPIELT: DISPENSER{*ETW*}{*B*}{*B*} +Ein Dispenser wird verwendet, um Gegenstände zu verschießen. Du musst einen Schalter wie zum Beispiel einen Hebel neben den Dispenser platzieren, um diesen auszulösen.{*B*}{*B*} +Um den Dispenser mit Gegenständen zu befüllen, drück{*CONTROLLER_ACTION_USE*}, und beweg dann die zu verschießenden Gegenstände aus deinem Inventar in den Dispenser.{*B*}{*B*} +Wenn du jetzt den Schalter betätigst, wird der Dispenser einen Gegenstand verschießen. + + +{*T3*}SO WIRD GESPIELT: BRAUEN{*ETW*}{*B*}{*B*} +Zum Brauen von Tränken brauchst du einen Braustand, den du an der Werkbank herstellen kannst. Jeder Trank beginnt mit einer Flasche Wasser, die man erhält, indem man eine Glasflasche mit Wasser aus einem Kessel oder einer Wasserquelle füllt. {*B*} +Ein Braustand hat drei Plätze für Flaschen, du kannst also drei Tränke auf einmal herstellen. Eine Zutat reicht für alle drei Flaschen aus, du solltest also immer drei Tränke auf einmal brauchen, um deine Rohstoffe optimal auszunutzen. {*B*} +Wenn du eine Trankzutat in das obere Feld des Braustandes legst, wird nach kurzer Zeit ein Grundtrank gebraut. Dieser hat noch keinen Effekt, aber du kannst aus diesem Grundtrank und einer weiteren Zutat einen Trank mit einem Effekt brauen. {*B*} +Wenn du diesen Trank hast, kannst du ihm noch eine dritte Zutat hinzufügen, damit der Effekt länger anhält (durch Redstone-Staub), stärker wirkt (durch Glowstone-Staub) oder zu einem schädlichen Trank wird (durch ein Fermentiertes Spinnenauge). {*B*} +Du kannst jedem Trank auch Schießpulver hinzufügen, wodurch er zu einem Wurftrank wird. Wenn du ihn wirfst, wird der Effekt des Tranks auf das Gebiet angewendet, in dem der Trank landet. {*B*} + +Die Grundzutaten für Tränke sind:{*B*}{*B*} +* {*T2*}Netherwarze{*ETW*}{*B*} +* {*T2*}Spinnenauge{*ETW*}{*B*} +* {*T2*}Zucker{*ETW*}{*B*} +* {*T2*}Ghastträne{*ETW*}{*B*} +* {*T2*}Lohenstaub{*ETW*}{*B*} +* {*T2*}Magmacreme{*ETW*}{*B*} +* {*T2*}Funkelnde Melone{*ETW*}{*B*} +* {*T2*}Redstone-Staub{*ETW*}{*B*} +* {*T2*}Glowstone-Staub{*ETW*}{*B*} +* {*T2*}Fermentiertes Spinnenauge{*ETW*}{*B*}{*B*} + +Du wirst selbst mit Kombinationen von Zutaten experimentieren müssen, um alle verschiedenen Tränke zu finden, die du brauen kannst. + + +{*T3*}SO WIRD GESPIELT: VERZAUBERN{*ETW*}{*B*}{*B*} +Mithilfe der Erfahrungspunkte, die du erhältst, wenn ein NPC stirbt oder wenn du bestimmte Blöcke abbaust oder im Ofen einschmilzt, kannst du einige Werkzeuge, Waffen, Rüstungen und Bücher verzaubern. {*B*} +Wenn ein Schwert, ein Bogen, eine Axt, eine Spitzhacke, eine Schaufel, eine Rüstung oder ein Buch in das Feld unter dem Buch in den Zaubertisch gelegt werden, zeigen die drei Schaltflächen rechts des Feldes ein paar Zauber und ihre Kosten in Erfahrungsleveln an. {*B*} +Wenn du für einen der Zauber nicht genug Erfahrungslevel hast, werden seine Kosten in Rot angezeigt, sonst in Grün. {*B*}{*B*} +Die tatsächlich angewendete Verzauberung wird zufällig aus den angezeigten Verzauberungen ausgewählt. {*B*}{*B*} +Wenn der Zaubertisch von Bücherregalen umgeben ist (bis hin zu maximal 15 Bücherregalen), wobei zwischen Zaubertisch und Bücherregal ein Block Abstand sein muss, werden die Verzauberungen verstärkt und man kann sehen, wie arkane Schriftzeichen aus dem Buch auf dem Zaubertisch herausfliegen. {*B*}{*B*} +Alle Zutaten für einen Zaubertisch kann man in den Dörfern einer Welt finden oder indem man die Welt abbaut und bewirtschaftet.{*B*}{*B*} +Zauberbücher werden beim Amboss benutzt, um Verzauberungen auf Gegenstände anzuwenden. Das gibt dir mir Kontrolle darüber, welche Verzauberungen du auf deinen Gegenständen möchtest.{*B*} + + +{*T3*}SO WIRD GESPIELT: TIERHALTUNG{*ETW*}{*B*}{*B*} +Wenn du deine Tiere an einer Stelle halten willst, solltest du einen eingezäunten Bereich von mindestens 20x20 Blöcke anlegen und deine Tiere dort unterbringen. Dann sind sie das nächste Mal auch noch da, wenn du sie besuchen willst. + + +{*T3*}SO WIRD GESPIELT: TIERZUCHT{*ETW*}{*B*}{*B*} +Die Tiere in Minecraft können sich vermehren und werden Babyversionen von sich selbst in die Welt setzen!{*B*} +Damit Tiere sich paaren, musst du sie mit dem richtigen Futter füttern, um sie in den "Liebesmodus" zu versetzen.{*B*} +Füttere eine Kuh, eine Pilzkuh oder ein Schaf mit Weizen, ein Schwein mit Karotten, ein Huhn mit Weizensamen oder Netherwarzen, einen Wolf mit beliebigem Fleisch und schon ziehen sie los und suchen in der Nähe nach einem anderen Tier derselben Gattung, das auch im Liebesmodus ist.{*B*} +Wenn sich zwei Tiere derselben Gattung begegnen und beide im Liebesmodus sind, küssen sie sich für ein paar Sekunden und dann erscheint ein Babytier. Das Babytier folgt seinen Eltern für eine Weile, bevor es zu einem ausgewachsenen Tier heranwächst.{*B*} +Nachdem ein Tier im Liebesmodus war, dauert es fünf Minuten, bis das Tier den Liebesmodus erneut annehmen kann.{*B*} +Du kannst in einer Welt maximal eine bestimmte Anzahl an Tieren haben; es kann also sein, dass Tiere sich nicht vermehren, wenn du schon viele hast. + +{*T3*}SO WIRD GESPIELT: NETHERPORTAL{*ETW*}{*B*}{*B*} +Mithilfe eines Netherportals kannst du zwischen der oberirdischen Welt und dem Nether hin und her reisen. Wenn du im Nether eine Entfernung von einem Block reist, entspricht das einer Reise von drei Blöcken in der oberirdischen Welt. Wenn du also ein Portal in die Netherwelt baust und sie darüber verlässt, wirst du dich dreimal so weit von deinem Startpunkt entfernt befinden.{*B*}{*B*} +Du brauchst mindestens 10 Blöcke Obsidian, um ein Portal zu bauen. Das Portal muss 5 Blöcke hoch, 4 Blöcke breit und 1 Block tief sein. Wenn der Rahmen des Portals gebaut ist, muss der Inhalt des Rahmens angezündet werden, um das Portal zu aktivieren. Dies kannst du mit dem Feuerzeug oder einer Feuerkugel tun.{*B*}{*B*} +Beispiele für Portale sind im Bild rechts dargestellt. + + +{*T3*}SO WIRD GESPIELT: MULTIPLAYER{*ETW*}{*B*}{*B*} +Minecraft auf der Xbox 360 Konsole ist als Standard ein Multiplayer-Spiel. Wenn du in einem HD-Modus spielst, weitere Controller anschließt und START drückst, können lokale Spieler jederzeit deinem Spiel beitreten.{*B*}{*B*} +Wenn du ein Onlinespiel startest oder einem beitrittst, können die Spieler in deiner Freundesliste es sehen (es sei denn, du hostest das Spiel und hast "Nur mit Einladung" ausgewählt), und wenn sie dem Spiel beitreten, können Spieler in ihrer Freundesliste es auch sehen (falls du die Option "Freunde von Freunden zulassen" ausgewählt hast).{*B*} +Wenn du in einem Spiel bist, kannst du durch Drücken der BACK-Taste eine Liste aller anderen Spieler im Spiel aufrufen, dir ihre Spielerkarten ansehen, Spieler aus dem Spiel ausschließen und andere ins Spiel einladen. + + +{*T3*}SO WIRD GESPIELT: SCREENSHOTS GETEILT{*ETW*}{*B*} {*B*} +Du kannst einen Screenshot von deinem Spiel erstellen, indem du das Pause-Menü aufrufst und{*CONTROLLER_VK_Y*} drückst, um den Screenshot auf Facebook zu veröffentlichen. Es wird eine verkleinerte Version deines Screenshots angezeigt, und du kannst den Begleittext deines Facebook-Beitrags bearbeiten.{*B*}{*B*} +Es gibt einen eigenen Kameramodus für das Erstellen solcher Screenshots, damit du auf dem Bild deine Spielfigur von vorn sehen kannst. Drück{*CONTROLLER_ACTION_CAMERA*}, bis du deine Spielfigur von vorn siehst, bevor du zum Teilen{*CONTROLLER_VK_Y*} drückst.{*B*}{*B*} +Gamertags werden auf Screenshots nicht angezeigt. + + +{*T3*}SO WIRD GESPIELT: LEVEL SPERREN{*ETW*}{*B*}{*B*} +Wenn du in einem Level, den du spielst, anstößige Inhalte findest, kannst du den Level deiner Liste der gesperrten Level hinzufügen. +Ruf dafür das Pause-Menü auf, und drück dann{*CONTROLLER_VK_RB*}, um die QuickInfo zum Sperren eines Levels aufzurufen. +Wenn du in Zukunft versuchst, diesem Level beizutreten, wirst du darüber benachrichtigt, dass dieser Level sich auf deiner Liste der gesperrten Level befindet, und du erhältst die Wahl, den Level von der Liste zu entfernen und ihn zu betreten oder abzubrechen. + +{*T3*}SO WIRD GESPIELT: KREATIVMODUS{*ETW*}{*B*}{*B*} +Die Oberfläche des Kreativmodus erlaubt es dir, alle Gegenstände im Spiel in dein Inventar zu verschieben, ohne dass du sie vorher abbauen oder herstellen musst. +Die Gegenstände werden nicht aus deinem Inventar entfernt, wenn du sie in der Welt platzierst oder sie verbrauchst. Dadurch kannst du dich ganz aufs Bauen konzentrieren anstatt auf das Sammeln von Ressourcen. {*B*} +Wenn du eine Welt im Kreativmodus erstellst, lädst oder speicherst, sind Erfolge und Bestenlisten- +Aktualisierungen in dieser Welt deaktiviert, selbst wenn du die Welt später im Überlebensmodus lädst.{*B*} +Um im Kreativmodus zu fliegen, drücke zweimal schnell {*CONTROLLER_ACTION_JUMP*}. Um das Fliegen zu beenden, wiederhole die Aktion. Um schneller zu fliegen, drück beim Fliegen{*CONTROLLER_ACTION_MOVE*} zweimal schnell nach vorn. +Im Flugmodus halte{*CONTROLLER_ACTION_JUMP*} nach unten gedrückt, um dich nach oben zu bewegen, und{*CONTROLLER_ACTION_SNEAK*}, um dich nach unten zu bewegen. Oder verwende{*CONTROLLER_ACTION_DPAD_UP*}, um dich nach oben zu bewegen, {*CONTROLLER_ACTION_DPAD_DOWN*}, um dich nach unten zu bewegen, +{*CONTROLLER_ACTION_DPAD_LEFT*}, um dich nach links zu bewegen, und {*CONTROLLER_ACTION_DPAD_RIGHT*}, um dich nach rechts zu bewegen. + +{*T3*}SO WIRD GESPIELT: HOST- UND SPIELEROPTIONEN{*ETW*}{*B*}{*B*} + +{*T1*}Spieloptionen{*ETW*}{*B*} +Beim Laden oder Erstellen einer Welt kannst du mit der Schaltfläche "Weitere Optionen" ein Menü aufrufen, mit dem du mehr Kontrolle über dein Spiel hast.{*B*}{*B*} + + {*T2*}Spieler gegen Spieler{*ETW*}{*B*} + Aktiviert, dass Spieler anderen Spielern Schaden zufügen können. Diese Option betrifft nur den Überlebensmodus.{*B*}{*B*} + + {*T2*}Spielern vertrauen{*ETW*}{*B*} + Ist diese Option deaktiviert, sind Spieler, die dem Spiel beitreten, in ihren Handlungen eingeschränkt. Folgende Handlungen sind nicht möglich: Vorkommen abbauen, Gegenstände verwenden, Blöcke platzieren, Türen und Schalter verwenden, Container verwenden, Spieler angreifen, Tiere angreifen. Über das Spielmenü kannst du die Privilegien für einen speziellen Spieler ändern.{*B*}{*B*} + + {*T2*}Feuer breitet sich aus{*ETW*}{*B*} + Aktiviert, dass Feuer auf brennbare Blöcke in der Nähe übergreifen kann. Diese Option kann ebenfalls über das Spielmenü geändert werden.{*B*}{*B*} + + {*T2*}TNT explodiert{*ETW*}{*B*} + Aktiviert, dass TNT nach dem Zünden explodiert. Diese Option kann ebenfalls über das Spielmenü geändert werden.{*B*}{*B*} + + {*T2*}Hostprivilegien{*ETW*}{*B*} + Aktiviert, dass der Host das Fliegen nutzen, Erschöpfung deaktivieren und sich selbst im Spielmenü unsichtbar machen kann. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + +{*T1*}Optionen für das Erstellen der Welt{*ETW*}{*B*} +Beim Erstellen einer neuen Welt gibt es einige zusätzliche Optionen.{*B*}{*B*} + + {*T2*}Strukturen erzeugen{*ETW*}{*B*} + Aktiviert, dass Strukturen wie Dörfer und Festungen in der Welt erstellt werden.{*B*}{*B*} + + {*T2*}Superflache Welt{*ETW*}{*B*} + Aktiviert, dass eine völlig flache Welt in der Oberwelt und im Nether erschaffen wird.{*B*}{*B*} + + {*T2*}Bonustruhe{*ETW*}{*B*} + Aktiviert, dass eine Truhe mit nützlichen Gegenständen in der Nähe des Startpunkts des Spielers erstellt wird.{*B*}{*B*} + + {*T2*}Nether zurücksetzen{*ETW*}{*B*} + Bei Aktivierung wird der Nether neu erstellt. Das ist nützlich, wenn du einen älteren Spielstand ohne Netherfestungen hast.{*B*}{*B*} + + {*T1*}Optionen im Spiel{*ETW*}{*B*} + Während des Spielens hast du Zugriff auf eine Reihe von Optionen, indem du mit der BACK-Taste das Spielmenü aufrufst.{*B*}{*B*} + + {*T2*}Hostoptionen{*ETW*}{*B*} + Der Host-Spieler und alle anderen als Moderatoren eingesetzten Spieler haben Zugriff auf das Menü "Hostoptionen". In diesem Menü können "Feuer breitet sich aus" und "TNT explodiert" aktiviert und deaktiviert werden.{*B*}{*B*} + +{*T1*}Spieleroptionen{*ETW*}{*B*} +Um die Privilegien für einen Spieler zu bearbeiten, rufst du mit {*CONTROLLER_VK_A*} das Privilegien-Menü eines Spielers auf, wo du die folgenden Optionen benutzen kannst.{*B*}{*B*} + + {*T2*}Kann bauen und abbauen{*ETW*}{*B*} + Diese Option ist nur verfügbar, wenn "Spielern vertrauen" ausgeschaltet ist. Ist diese Option aktiviert, kann der Spieler wie gewöhnlich mit der Welt interagieren. Ist diese Option deaktiviert, kann der Spieler keine Blöcke platzieren und vernichten und auch nicht mit vielen Gegenständen und Blöcken interagieren.{*B*}{*B*} + + {*T2*}Kann Türen und Schalter verwenden{*ETW*}{*B*} + Diese Option ist nur verfügbar, wenn "Spielern vertrauen" ausgeschaltet ist. Ist diese Option deaktiviert, kann der Spieler keine Türen und Schalter verwenden.{*B*}{*B*} + + {*T2*}Kann Container öffnen{*ETW*}{*B*} + Diese Option ist nur verfügbar, wenn "Spielern vertrauen" ausgeschaltet ist. Ist diese Option deaktiviert, kann der Spieler keine Container wie etwa Truhen öffnen.{*B*}{*B*} + + {*T2*}Kann Spieler angreifen{*ETW*}{*B*} + Diese Option ist nur verfügbar, wenn "Spielern vertrauen" ausgeschaltet ist. Ist diese Option deaktiviert, kann der Spieler anderen Spielern keinen Schaden zufügen.{*B*}{*B*} + + {*T2*}Kann Tiere angreifen{*ETW*}{*B*} + Diese Option ist nur verfügbar, wenn "Spielern vertrauen" ausgeschaltet ist. Ist diese Option deaktiviert, kann der Spieler Tieren keinen Schaden zufügen.{*B*}{*B*} + + {*T2*}Moderator{*ETW*}{*B*} + Ist diese Option aktiviert, kann der Spieler Privilegien für andere Spieler (den Host ausgenommen) ändern, wenn "Spielern vertrauen" ausgeschaltet ist. Der Spieler kann andere Spieler ausschließen und "Feuer breitet sich aus" sowie "TNT explodiert" an- und ausschalten.{*B*}{*B*} + + {*T2*}Spieler ausschließen{*ETW*}{*B*} + Ist diese Option ausgewählt, werden Spieler, die nicht auf der gleichen {*PLATFORM_NAME*} Konsole wie der Host-Spieler spielen, ebenso wie alle anderen Spieler auf seiner {*PLATFORM_NAME*} Konsole vom Spiel ausgeschlossen. Dieser Spieler kann dem Spiel erst wieder beitreten, wenn es neu gestartet wird.{*B*}{*B*} + +{*T1*}Optionen für Host-Spieler{*ETW*}{*B*} +Wenn "Hostprivilegien" aktiviert ist, kann der Host-Spieler einige seiner eigenen Privilegien bearbeiten. Zur Bearbeitung der Privilegien für einen Spieler rufst du mit {*CONTROLLER_VK_A*} das Privilegien-Menü für Spieler auf, wo du die folgenden Optionen nutzen kannst.{*B*}{*B*} + + {*T2*}Kann fliegen{*ETW*}{*B*} + Ist diese Option aktiviert, kann der Spieler fliegen. Diese Option ist nur für den Überlebensmodus relevant, da das Fliegen im Kreativmodus für alle Spieler aktiviert ist.{*B*}{*B*} + + {*T2*}Erschöpfung deaktivieren{*ETW*}{*B*} + Diese Option betrifft nur den Überlebensmodus. Aktiviert, dass körperliche Aktivitäten (Laufen/Sprinten/Springen etc.) sich nicht auf die Hungerleiste auswirken. Verletzt der Spieler sich allerdings, verringert sich die Hungerleiste langsam während des Heilungsvorgangs.{*B*}{*B*} + + {*T2*}Unsichtbar{*ETW*}{*B*} + Ist diese Option aktiviert, kann der Spieler von anderen Spielern nicht gesehen werden und ist unverwundbar.{*B*}{*B*} + + {*T2*}Kann teleportieren{*ETW*}{*B*} + Dies erlaubt dem Spieler, sich selbst oder andere Spieler zu anderen Spielern in der Welt zu bewegen. + + +Nächste Seite + +Vorige Seite + +Grundlagen + +Display + +Inventar + +Truhen + +Dinge herstellen + +Ofen + +Dispenser + +Tierhaltung + +Tierzucht + +Brauen + +Verzaubern + +Nether-Portal + +Multiplayer + +Screenshots teilen + +Level sperren + +Kreativmodus + +Host- und Spieleroptionen + +Handel + +Amboss + +Das Ende + +{*T3*}SO WIRD GESPIELT: DAS ENDE{*ETW*}{*B*}{*B*} +Das Ende ist eine andere Dimension im Spiel, die durch ein aktives Endportal erreicht wird. Das Endportal findest du in einer Festung tief unter der Oberwelt.{*B*} +Um das Endportal zu aktivieren, musst du eine Enderperle in einen Endportalrahmen einsetzen, in dem keine ist.{*B*} +Wenn das Portal aktiv ist, kannst du hindurch in Das Ende springen.{*B*}{*B*} +Im Ende begegnest du dem Enderdrachen, einem bösen, mächtigen Feind, und vielen Endermen; bereite dich also gut auf den Kampf vor, bevor du dich aufmachst!{*B*}{*B*} +Der Enderdrache heilt sich mithilfe von Enderkristallen, die auf acht Obsidianstacheln ruhen; +du musst diese zuallererst einzeln zerstören.{*B*} +Die ersten paar davon erreichst du mit Pfeilen, doch die späteren werden durch einen Eisengitterkäfig geschützt, und du musst dich zu ihnen hochbauen.{*B*}{*B*} +Dabei greift dich der Enderdrache aus der Luft mit Endersäurekugeln an!{*B*} +Nähere dich dem Eierpodest inmitten der Stacheln; der Enderdrache fliegt herab und greift dich an, und du kannst ihm nun einigen Schaden zufügen!{*B*} +Nimm dich vor dem Säureatem in Acht und ziele auf die Augen des Enderdrachens, um wirkungsvolle Treffer zu landen. Bring, wenn du kannst, einen Freund mit in Das Ende, der dir im Kampf beisteht!{*B*}{*B*} +Sobald du Das Ende besuchst, sehen deine Freunde die Lage des Endportals in den Festungen auf ihren Karten; +sie können dir also leicht zu Hilfe kommen. + + +Sprinten + +Neuigkeiten + + +{*T3*}Veränderungen und Neuerungen{*ETW*}{*B*}{*B*} +- Neue Gegenstände hinzugefügt: Smaragde, Smaragderz, Smaragdblock, Endertruhe, Stolperdrahthaken, verzauberter goldener Apfel, Amboss, Blumentopf, Pflastersteinmauer, bemooste Pflastersteinmauer, Dörrgemälde, Kartoffel, Ofenkartoffel, giftige Kartoffel, Karotte, goldene Karotte, +Karottenangel, Kürbiskuchen, Nachtsichttrank, Unsichtbarkeitstrank, Netherquarz, Netherquarzerz, Quarzblock, Quarzstufe, Quarztreppe, gemeißelter Quarzblock, Säulen-Quarzblock, Zauberbuch, Teppich.{*B*} +- Neue Rezepte für glatten und gemeißelten Sandstein hinzugefügt.{*B*} +- Neue NPCs hinzugefügt: Zombie-Dorfbewohner.{*B*} +- Neue Geländeerstellungsfunktionen hinzugefügt: Wüstentempel, Wüstendörfer, Dschungeltempel.{*B*} +- Handel mit Dorfbewohnern hinzugefügt.{*B*} +- Ambossmenü hinzugefügt.{*B*} +- Lederrüstungen können nun eingefärbt werden.{*B*} +- Wolfshalsbänder können nun eingefärbt werden.{*B*} +- Beim Reiten auf Schweinen kann mit einer Karottenangel gesteuert werden.{*B*} +- Aktualisierter Bonustruheninhalt mit mehr Gegenständen.{*B*} +- Die Platzierung halber Blöcke sowie von Blöcken auf halben Blöcken wurde geändert.{*B*} +- Die Platzierung von umgedrehten Treppen und Stufen wurde geändert.{*B*} +- Verschiedene Berufe für Dorfbewohner hinzugefügt.{*B*} +- Dorfbewohner, die aus einem Eintrittsei spawnen, haben zufällige Berufe.{*B*} +- Baumstämme können seitwärts platziert werden.{*B*} +- Öfen können mit hölzernen Werkzeugen befeuert werden.{*B*} +- Eis- und Glasscheiben können mit Werkzeugen gesammelt werden, die mit Behutsamkeit verzaubert wurden.{*B*} +- Hölzerne Knöpfe und Druckplatten können durch Pfeile betätigt werden.{*B*} +- Nether-NPCs können oberirdisch aus Portalen spawnen.{*B*} +- Creeper und Spinnen sind aggressiver gegenüber dem Spieler, der sie zuletzt geschlagen hat.{*B*} +- Im Kreativmodus werden NPCs nach kurzer Zeit wieder neutral.{*B*} +- Der Rückstoßeffekt beim Ertrinken wurde entfernt.{*B*} +- Wenn Zombies Türen zerstören, ist der Schaden jetzt sichtbar.{*B*} +- Eis schmilzt im Nether.{*B*} +- Kessel, die draußen im Regen stehen, werden aufgefüllt.{*B*} +- Die Aktualisierungszeit von Kolben wurde verdoppelt.{*B*} +- Schweine verlieren gegebenenfalls ihren Sattel, wenn sie getötet werden.{*B*} +- Die Farbe des Himmels im Ende wurde geändert.{*B*} +- Draht für Stolperdraht kann platziert werden.{*B*} +- Regen tropft durch Blätter.{*B*} +- Hebel können an der Unterseite von Blöcken platziert werden.{*B*} +- Je nach Schwierigkeit verursacht TNT mehr oder weniger Schaden.{*B*} +- Das Bücherrezept wurde geändert.{*B*} +- Boote zerstören jetzt Seerosenblätter, nicht mehr umgekehrt.{*B*} +- Schweine lassen mehr Schweinefleisch fallen.{*B*} +- In superflachen Welten spawnen weniger Slimes.{*B*} +- Creeper verursachen je nach Schwierigkeit mehr oder weniger Schaden und der Rückstoß wurde erhöht.{*B*} +- Das Problem, durch das Endermen ihre Kiefer nicht bewegen konnten, wurde behoben.{*B*} +- Spieler können nun im BACK-Taste-Menü während des Spiels teleportieren.{*B*} +- Neue Hostoptionen für Flug, Unsichtbarkeit und Unverwundbarkeit entfernter Spieler hinzugefügt.{*B*} +- Neue Tutorials über neue Gegenstände und Funktionen zur Tutorial-Welt hinzugefügt.{*B*} +- Die Schallplattentruhen in der Tutorial-Welt wurden neu verteilt.{*B*} + + +{*ETB*}Willkommen zurück! Vielleicht hast du es gar nicht bemerkt, aber dein Minecraft wurde gerade aktualisiert.{*B*}{*B*} +Es gibt jede Menge neue Funktionen für dich und deine Freunde. Hier stellen wir dir nur ein paar Highlights vor. Lies sie dir durch und dann ziehe los und hab Spaß!{*B*}{*B*} +{*T1*}Neue Gegenstände{*ETB*}: Smaragde, Smaragderz, Smaragdblock, Endertruhe, Stolperdrahthaken, verzauberter goldener Apfel, Amboss, Blumentopf, Pflastersteinmauer, bemooste Pflastersteinmauer, Dörrgemälde, Kartoffel, Ofenkartoffel, giftige Kartoffel, Karotte, goldene Karotte, +Karottenangel, Kürbiskuchen, Nachtsichttrank, Unsichtbarkeitstrank, Netherquarz, Netherquarzerz, Quarzblock, Quarzstufe, Quarztreppe, gemeißelter Quarzblock, Säulen-Quarzblock, Zauberbuch, Teppich.{*B*}{*B*} + {*T1*}Neue NPCs{*ETB*} – Zombie-Dorfbewohner.{*B*}{*B*} +{*T1*}Neue Funktionen{*ETB*}: Handel mit Dorfbewohnern, Waffen und Werkzeuge auf Ambossen reparieren oder verzaubern, Gegenstände in einer Endertruhe lagern, Steuerung beim Reiten auf Schweinen mit einer Karottenangel!{*B*}{*B*} +{*T1*}Neue Mini-Tutorials{*ETB*} – Lerne in der Tutorial-Welt, wie man die neuen Features benutzt!{*B*}{*B*} +{*T1*}Neue 'Easter Eggs'{*ETB*} – Wir haben alle geheimen Schallplatten in der Tutorial-Welt neu platziert. Versuch, sie alle wiederzufinden!{*B*}{*B*} + + +Fügt mehr Schaden zu als eine leere Hand. + +Hiermit kannst du Erde, Gras, Sand, Kies und Schnee schneller als mit der Hand abbauen. Du brauchst eine Schaufel, um Schneebälle abzubauen. + +Wird benötigt, um Stein- und Erzblöcke abzubauen. + +Wird verwendet, um Holzblöcke schneller als per Hand abzubauen. + +Wird verwendet, um Erd- und Grasblöcke umzugraben und sie damit fürs Bepflanzen vorzubereiten. + +Holztüren werden geöffnet, indem du sie verwendest, dagegen schlägst oder mittels Redstone. + +Eisentüren können nur mit Redstone, Knöpfen oder Schaltern geöffnet werden. + +NOT USED + +NOT USED + +NOT USED + +NOT USED + +Verleiht dem Träger 1 Rüstungspunkt. + +Verleiht dem Spieler beim Tragen 3 Rüstungspunkte. + +Verleiht dem Träger 2 Rüstungspunkte. + +Verleihen dem Träger 1 Rüstungspunkt. + +Verleiht dem Träger 2 Rüstungspunkte. + +Verleiht dem Träger 5 Rüstungspunkte. + +Verleiht dem Spieler beim Tragen 4 Rüstungspunkte. + +Verleihen dem Träger 1 Rüstungspunkt. + +Verleiht dem Träger 2 Rüstungspunkte. + +Verleiht dem Träger 6 Rüstungspunkte. + +Verleiht dem Träger 5 Rüstungspunkte. + +Verleihen dem Träger 2 Rüstungspunkte. + +Verleiht dem Träger 2 Rüstungspunkte. + +Verleiht dem Träger 5 Rüstungspunkte. + +Verleiht dem Spieler beim Tragen 3 Rüstungspunkte. + +Verleiht dem Träger 1 Rüstungspunkt. + +Verleiht dem Spieler beim Tragen 3 Rüstungspunkte. + +Verleiht dem Träger 8 Rüstungspunkte. + +Verleiht dem Träger 6 Rüstungspunkte. + +Verleiht dem Spieler beim Tragen 3 Rüstungspunkte. + +Ein glänzender Barren, aus dem du Werkzeuge herstellen kannst, die aus diesem Material bestehen. Entsteht, wenn du im Ofen Erz schmilzt. + +Ermöglicht es, aus Barren, Diamanten oder Farben platzierbare Blöcke zu erzeugen. Kann als teurer Baublock oder kompakter Erzspeicher +verwendet werden. + +Wird verwendet, um einen elektrischen Impuls zu erzeugen, wenn ein Spieler, ein Tier oder ein Monster darauftritt. Hölzerne Druckplatten können auch aktiviert werden, indem etwas darauf abgelegt wird. + +Wird zum Bau platzsparender Treppen verwendet. + +Wird zum Bau langer Treppen verwendet. Zwei Stufen, die aufeinandergelegt werden, werden zu einem normal großen Doppelstufen-Block verschmolzen. + +Wird zum Bau langer Treppen verwendet. Zwei aufeinander platzierte Stufen erzeugen einen normal großen Doppelstufen-Block. + +Wird verwendet, um Licht zu erzeugen. Fackeln schmelzen außerdem Schnee und Eis. + +Wird als Baumaterial und zur Herstellung vieler Dinge verwendet. Kann aus jeder Art von Holz hergestellt werden. + +Wird als Baumaterial verwendet. Zerfällt nicht wie normaler Sand durch die Schwerkraft. + +Wird als Baumaterial verwendet. + +Wird zur Herstellung von +Fackeln, Pfeilen, Schildern, +Leitern, Zäunen und als Griff +für Werkzeuge und Waffen +verwendet. + +Kann die Zeit von einem beliebigen Zeitpunkt in der Nacht bis zum Morgen vorstellen, wenn alle Spieler in der Welt im Bett liegen. Kann auch deinen Wiedereintrittspunkt ändern. +Das Bett hat immer dieselbe Farbe, egal aus Wolle welcher Farbe es hergestellt wurde. + +Erlaubt dir, eine größere Auswahl von Gegenständen zu erschaffen als beim normalen Crafting. + +Erlaubt dir, Erz zu schmelzen, Holzkohle und Glas herzustellen sowie Fisch und Schweinefleisch zu kochen. + +Lässt dich in ihrem Inneren Blöcke und Gegenstände lagern. Platzier zwei Truhen nebeneinander, um eine größere Truhe mit der doppelten Kapazität zu erschaffen. + +Wird als Barriere verwendet, über die nicht hinübergesprungen werden kann. Hat für Spieler, Tiere und Monster eine Höhe von 1,5 Blöcken, für andere Blöcke aber die normale Höhe von 1 Block. + +Verwendet, um sich in vertikaler Richtung zu bewegen. + +Wird durch Verwenden, Dagegenschlagen oder mittels Redstone aktiviert. Funktioniert wie eine normale Tür, ist 1 x 1 Block groß und liegt flach auf dem Boden. + +Zeigt den Text an, den du oder andere Spieler eingegeben +haben. + +Erzeugt helleres Licht als Fackeln. Schmilzt Schnee und Eis und kann unter Wasser verwendet werden. + +Erzeugt eine Explosion. Wird nach Platzieren mit dem Feuerzeug oder elektrisch gezündet. + +Wird verwendet, um Pilzsuppe aufzubewahren. Wenn die Suppe aufgegessen ist, behältst du die Schüssel. + +Wird zum Aufbewahren und zum Transport von Wasser, Lava und Milch verwendet. + +Wird zum Aufbewahren und zum Transport von Wasser verwendet. + +Wird zum Aufbewahren und zum Transport von Lava verwendet. + +Wird zum Aufbewahren und zum Transport von Milch verwendet. + +Kann Feuer erzeugen, TNT zünden und ein Portal nach dem Bau öffnen. + +Wird verwendet, um Fische zu fangen. + +Zeigt die Position der Sonne und des Mondes an. + +Zeigt auf deinen Startpunkt. + +Erzeugt ein Abbild einer Gegend, bei deren Erforschung du sie in der Hand hattest. Nützlich, um den Weg zu finden. + +Erlaubt Fernangriffe mit Pfeilen. + +Wird als Munition für Bögen verwendet. + +Regeneriert 2,5{*ICON_SHANK_01*}. + +Regeneriert 1,5{*ICON_SHANK_01*}. Kann 6-mal verwendet werden. + +Regeneriert 1{*ICON_SHANK_01*}. + +Regeneriert 1{*ICON_SHANK_01*}. + +Regeneriert 3{*ICON_SHANK_01*}. + +Regeneriert 1{*ICON_SHANK_01*}, kann dich aber krankmachen. Kann im Ofen gebraten werden. + +Regeneriert 3{*ICON_SHANK_01*}. Entsteht, wenn man rohes Hühnchen im Ofen brät. + +Regeneriert 1,5{*ICON_SHANK_01*}. Kann im Ofen gebraten werden. + +Regeneriert 4{*ICON_SHANK_01*}. Entsteht, wenn man rohes Rindfleisch im Ofen brät. + +Regeneriert 1,5{*ICON_SHANK_01*}. Kann im Ofen gebraten werden. + +Regeneriert 4{*ICON_SHANK_01*}. Entsteht, wenn man rohes Schweinefleisch im Ofen brät. + +Regeneriert 1{*ICON_SHANK_01*}. Kann im Ofen gebraten werden. Füttere einen Ozelot damit, um ihn zu zähmen. + +Regeneriert 2,5{*ICON_SHANK_01*}. Entsteht, wenn man rohen Fisch im Ofen brät. + +Regeneriert 2{*ICON_SHANK_01*} und kann zu einem goldenen Apfel verarbeitet werden. + +Regeneriert 2{*ICON_SHANK_01*} und regeneriert 4 Sekunden lang Gesundheit. Wird aus einem Apfel und Goldnuggets hergestellt. + +Regeneriert 2{*ICON_SHANK_01*}, kann dich aber krankmachen. + +Wird für das Kuchenrezept und als Zutat für Tränke benötigt. + +Erzeugt einen elektrischen Impuls, wenn er gedrückt wird. Bleibt ein- oder ausgeschaltet, bis er erneut gedrückt wird. + +Konstante Stromquelle. Kann als Empfänger/Sender verwendet werden, wenn sie mit der Seite eines Blocks verbunden ist. +Kann auch genutzt werden, um ein wenig Licht zu erzeugen. + +Wird in Redstone-Schaltkreisen als Repeater, Verzögerer und/oder als Diode eingesetzt. + +Erzeugt ein elektrisches Signal, wenn er gedrückt wird. Bleibt für ungefähr eine Sekunde aktiv, bevor er sich wieder deaktiviert. + +Kann Gegenstände in zufälliger Reihenfolge verschießen, wenn er einen Impuls von einem Redstone-Stromkreis erhält. + +Spielt beim Auslösen eine Note ab. Schlag auf den Block, um die Tonhöhe zu ändern. Wenn du diesen Block auf verschiedenen Untergründen platzierst, ändert sich das verwendete Instrument. + +Wird verwendet, um Loren eine Richtung vorzugeben. + +Beschleunigt darüberfahrende Loren, wenn sie unter Strom steht. Wenn kein Strom anliegt, bewirkt sie, dass Loren auf ihr anhalten. + +Funktioniert wie eine Druckplatte – sendet ein Redstone-Signal, wenn sie aktiviert wird, kann aber nur durch Loren aktiviert werden. + +Kann dich, ein Tier oder ein Monster auf Schienen transportieren. + +Wird verwendet, um Waren auf Schienen zu transportieren. + +Bewegt sich auf Schienen und kann andere Loren schieben, wenn du Kohle hineinlegst. + +Wird verwendet, um schneller als schwimmend übers Wasser zu reisen. + +Wird von Schafen eingesammelt und kann mit Farben gefärbt werden. + +Wird als Baumaterial verwendet und kann mit Farben gefärbt werden. Dieses Rezept ist nicht empfehlenswert, da man Wolle leicht von Schafen erhalten +kann. + +Wird als Farbe verwendet, um Wolle schwarz zu färben. + +Wird als Farbe verwendet, um Wolle grün zu färben. + +Werden als Farbe verwendet, um Wolle braun zu färben, als Zutat für Kekse und um Kakaoschoten wachsen zu lassen. + +Wird als Farbe verwendet, um Wolle silbern zu färben. + +Wird als Farbe verwendet, um Wolle gelb zu färben. + +Wird als Farbe verwendet, um Wolle rot zu färben. + +Wird verwendet, um Getreide, Bäume, hohes Gras, riesige Pilze und Blumen fast augenblicklich wachsen zu lassen. Kann außerdem als Zutat in Farbrezepten verwendet werden. + +Wird als Farbe verwendet, um Wolle rosa zu färben. + +Wird als Farbe verwendet, um Wolle orange zu färben. + +Wird als Farbe verwendet, um Wolle hellgrün zu färben. + +Wird als Farbe verwendet, um Wolle grau zu färben. + +Wird als Farbe verwendet, um Wolle hellgrau zu färben. +(Hinweis: Hellgraue Farbe kann auch aus grauer Farbe und Knochenmehl erzeugt werden. So erhältst du aus jedem +Tintensack 4 hellgraue Farbe +statt nur 3.) + +Wird als Farbe verwendet, um Wolle hellblau zu färben. + +Wird als Farbe verwendet, um Wolle cyanfarben zu färben. + +Wird als Farbe verwendet, um Wolle lila zu färben. + +Wird als Farbe verwendet, um Wolle magentafarben zu färben. + +Wird als Farbe verwendet, um Wolle blau zu färben. + +Spielt Schallplatten ab. + +Hieraus kannst du sehr beständige Werkzeuge, Waffen und Rüstungen herstellen. + +Erzeugt helleres Licht als Fackeln. Schmilzt Schnee und Eis und kann unter Wasser verwendet werden. + +Wird zur Herstellung von Büchern und Karten verwendet. + +Wird zur Herstellung eines Bücherregals verwendet oder verzaubert, um Zauberbücher herzustellen. + +Ermöglicht die Herstellung mächtigerer Verzauberungen bei Anordnung um den Zaubertisch. + +Wird als Dekoration eingesetzt. + +Muss mit mindestens einer Eisenspitzhacke abgebaut und dann in einem Ofen geschmolzen werden, um Goldbarren zu erzeugen. + +Muss mit mindestens einer Steinspitzhacke abgebaut und dann in einem Ofen geschmolzen werden, um Eisenbarren zu erzeugen. + +Kann mit einer Spitzhacke abgebaut werden, um Kohle zu erhalten. + +Muss mit mindestens einer Steinspitzhacke abgebaut werden, um Lapislazuli zu erhalten. + +Muss mit mindestens einer Eisenspitzhacke abgebaut werden, um Diamanten zu erhalten. + +Muss mit mindestens einer Eisenspitzhacke abgebaut werden, um Redstone-Staub zu erhalten. + +Kann mit einer Spitzhacke abgebaut werden, um Pflasterstein zu erhalten. + +Wird mithilfe einer Schaufel abgebaut. Kann für Bauarbeiten verwendet werden. + +Kann gepflanzt werden und wächst mit der Zeit zu einem Baum heran. + +Ist unzerstörbar. + +Setzt alles in Brand, was es berührt. Kann in einem Eimer eingesammelt werden. + +Wird mithilfe einer Schaufel abgebaut. Kann im Ofen zu Glas geschmolzen werden. Wird unter dem Einfluss der Schwerkraft nach unten fallen, wenn sich kein anderer Block darunter befindet. + +Wird mithilfe einer Schaufel abgebaut, wodurch man gelegentlich Feuerstein erhält. Fällt unter dem Einfluss der Schwerkraft nach unten, wenn es darunter keinen anderen Block gibt. + +Kann mit einer Axt abgebaut und zur Herstellung von Holz oder als Brennstoff verwendet werden. + +Wird im Ofen durch Schmelzen von Sand hergestellt. Kann zum Bauen verwendet werden, bricht aber weg, wenn du versuchst, ihn abzubauen. + +Kann aus Stein mit einer Spitzhacke abgebaut werden. Kann zum Bau von Öfen oder Steinwerkzeugen verwendet werden. + +Wird in einem Ofen aus Lehm gebacken. + +Kann in einem Ofen zu Ziegeln gebacken werden. + +Wenn er zerstört wird, entstehen Lehmbälle, die in einem Ofen zu Lehmziegeln gebacken werden können. + +Eine platzsparende Art, Schneebälle zu lagern. + +Kann mit einer Schaufel abgebaut werden, um Schneebälle zu erzeugen. + +Erzeugt beim Abbauen gelegentlich Weizensamen. + +Kann zu Farbe verarbeitet werden. + +Kann mithilfe einer Schüssel zu Suppe verarbeitet werden. + +Kann nur mit einer Diamantspitzhacke abgebaut werden. Entsteht, wenn fließendes Wasser und ruhende Lava aufeinandertreffen. Wird zum Bauen von Portalen verwendet. + +Erschafft Monster und setzt sie in die Welt. + +Wird auf den Boden gelegt, um eine elektrische Ladung zu erzeugen. Verlängert die Dauer eines Trankeffekts bei Verwendung als Zutat. + +Im reifen Zustand kann Getreide geerntet werden, wodurch man Weizen erhält. + +Boden, der vorbereitet wurde, um bepflanzt zu werden. + +Kann im Ofen gekocht werden, um grüne Farbe herzustellen. + +Kann zu Zucker verarbeitet werden. + +Kann als Helm getragen oder mit einer Fackel zu einer Kürbislaterne verarbeitet werden. Ist außerdem die Hauptzutat von Kürbiskuchen. + +Brennt unendlich lange, wenn er angezündet wird. + +Verlangsamt die Bewegung von allem, was darüber läuft. + +Mit einem Portal kannst du dich zwischen der oberirdischen Welt und dem Nether hin und her bewegen. + +Kann im Ofen als Brennstoff verwendet oder zu einer Fackel verarbeitet werden. + +Erhält man durch Töten einer Spinne. Kann zu einem Bogen oder einer Angel verarbeitet oder auf den Boden gelegt werden, um Stolperdraht zu erschaffen. + +Erhält man durch Töten eines Huhns. Kann zu einem Pfeil verarbeitet werden. + +Erhält man durch Töten eines Creepers. Kann zu TNT verarbeitet oder als Zutat für Tränke verwendet werden. + +Kann auf Ackerboden gepflanzt werden, um Getreide wachsen zu lassen. Achte darauf, dass es genügend Licht gibt, damit die Pflanzen wachsen können! + +Erhält man durch Ernten von Getreide. Kann zu Nahrung verarbeitet werden. + +Erhält man beim Abbauen von Kies. Kann zu einem Feuerzeug verarbeitet werden. + +Kann mit einem Schwein verwendet werden, wodurch es möglich ist, auf ihm zu reiten. Gesteuert wird dabei mit einer Karottenangel. + +Entsteht beim Abbauen von Schnee. Kann geworfen werden. + +Erhält man durch Töten einer Kuh. Kann zu Rüstungen oder Büchern verarbeitet werden. + +Erhält man durch Töten eines Slimes. Wird als Zutat für Tränke oder haftende Kolben verwendet. + +Wird zufällig von Hühnern fallen gelassen. Kann zu Nahrung verarbeitet werden. + +Erhält man durch Abbauen von Glowstone. Kann verarbeitet werden, um wieder Glowstone-Blöcke zu bilden oder zum Brauen eines Tranks verwendet werden, um dessen Effekt zu verstärken. + +Erhält man durch Töten eines Skeletts. Kann zu Knochenmehl verarbeitet werden. Kann an einen Wolf verfüttert werden, um ihn zu zähmen. + +Entsteht, wenn ein Creeper von einem Skelett getötet wird. Kann in einer Jukebox abgespielt werden. + +Löscht Feuer und lässt Getreide wachsen. Kann in einem Eimer eingesammelt werden. + +Wenn sie abgebaut werden, erscheint manchmal ein Setzling, den man wieder einpflanzen kann, woraus ein neuer Baum wächst. + +Kann in Dungeons gefunden und für Bauarbeiten und als Dekoration verwendet werden. + +Wird verwendet, um Wolle von Schafen zu erhalten und Blätterblöcke zu ernten. + +Wenn Strom an einen Kolben angelegt wird (mit einem Schalter, einem Hebel, einer Druckplatte, einer Redstone-Fackel oder Redstone mit einem der vorgenannten Dinge), wird der Kolben länger, falls möglich, und verschiebt Blöcke. + +Wenn Strom an einen Kolben angelegt wird (mit einem Schalter, einem Hebel, einer Druckplatte, einer Redstone-Fackel oder Redstone mit einem der vorgenannten Dinge), wird der Kolben länger, falls möglich, und verschiebt Blöcke. Wenn der Kolben zurückgezogen wird, zieht er den Block mit zurück, der den Kolben berührt. + +Hergestellt aus Steinblöcken, findet man oft in Festungen. + +Wird als Absperrung verwendet, ähnlich wie Zäune. + +Wie eine Tür, findet aber hauptsächlich in Zäunen Verwendung. + +Kann aus Melonenscheiben hergestellt werden. + +Transparente Blöcke, können als Alternative zu Glasblöcken verwendet werden. + +Kann gepflanzt werden, um Kürbisse wachsen zu lassen. + +Kann gepflanzt werden, um Melonen wachsen zu lassen. + +Wird von einem sterbenden Enderman fallen gelassen. Wenn du die Enderperle wirfst, wirst du an die Stelle teleportiert, wo sie landet, und verlierst etwas Gesundheit. + +Ein Block Erde, auf dem Gras wächst. Wird mithilfe einer Schaufel abgebaut. Kann für Bauarbeiten verwendet werden. + +Kann für Bauarbeiten und als Dekoration verwendet werden. + +Verlangsamt beim Darüberlaufen die Bewegung. Kann mit einer Schere zerstört werden, um Faden zu erhalten. + +Lässt bei Zerstörung einen Silberfisch entstehen. Kann auch Silberfische entstehen lassen, wenn in der Nähe Silberfische angegriffen werden. + +Wächst nach Platzierung mit der Zeit. Kann mit einer Schere eingesammelt werden. Du kannst daran wie an einer Leiter klettern. + +Ist beim Darüberlaufen rutschig. Wird bei Zerstörung zu Wasser, wenn darunter ein anderer Block ist. Schmilzt in der Nähe einer Lichtquelle oder bei Platzierung im Nether. + +Kann als Dekoration verwendet werden. + +Kann zum Brauen verwendet werden und zum Finden von Festungen. Wird von Lohen hinterlassen, die sich meist in oder nahe von Netherfestungen aufhalten. + +Kann zum Brauen verwendet werden. Wird von sterbenden Ghasts fallen gelassen. + +Wird von sterbenden Zombie Pigmen fallen gelassen. Zombie Pigmen findest du im Nether. Wird als Zutat für Tränke verwendet. + +Kann zum Brauen verwendet werden. Wächst auf natürliche Weise in Netherfestungen. Kann auch auf Seelensand gepflanzt werden. + +Kann verschiedene Effekte haben, abhängig davon, worauf er angewendet wird. + +Kann mit Wasser gefüllt werden und wird als Startzutat zum Brauen von Tränken am Braustand verwendet. + +Giftige Nahrung und Brauzutat. Wird von Spinnen und Höhlenspinnen fallen gelassen, wenn sie von einem Spieler getötet werden. + +Kann zum Brauen verwendet werden, hauptsächlich, um Tränke mit einem negativen Effekt herzustellen. + +Kann zum Brauen verwendet werden oder um mit anderen Gegenständen Enderaugen oder Magmacreme herzustellen. + +Kann zum Brauen verwendet werden. + +Wird verwendet, um Tränke und Wurftränke herzustellen. + +Kann mithilfe von Regen oder eines Eimers mit Wasser gefüllt werden, und kann dann verwendet werden, um Glasflaschen mit Wasser zu füllen. + +Wenn man es wirft, zeigt es die Richtung zu einem Endportal an. Wenn zwölf davon in die Endportalblöcke gelegt werden, wird das Endportal aktiviert. + +Kann zum Brauen verwendet werden. + +Ähnlich wie Grasblöcke, eignet sich aber gut, um Pilze darauf wachsen zu lassen. + +Schwimmt auf dem Wasser, und man kann darüber laufen. + +Wird verwendet, um Netherfestungen zu bauen. Immun gegenüber den Feuerbällen von Ghasts. + +Wird in Netherfestungen verwendet. + +Findet man in Netherfestungen. Wenn man ihn zerbricht, erhält man Netherwarzen. + +Erlaubt es Spielern, Schwerter, Spitzhacken, Schaufeln, Äxte und Bögen sowie Rüstungen mithilfe der Erfahrungspunkte des Spielers zu verzaubern. + +Kann mit zwölf Enderaugen aktiviert werden, und erlaubt es dem Spieler, in die Enddimension zu reisen. + +Wird verwendet, um ein Endportal zu bilden. + +Ein Block, den man im Ende findet. Ist sehr widerstandsfähig gegenüber Explosionen und daher ein nützliches Baumaterial. + +Dieser Block entsteht, wenn der Spieler im Ende den Drachen besiegt. + +Wenn man sie wirft, erscheint eine Erfahrungskugel, die deine Erfahrungspunkte steigert, wenn du sie einsammelst. + +Nützlich, um Dinge in Brand zu stecken oder beim Abschuss durch einen Dispenser, um willkürlich Feuer zu erzeugen. + +Ähnelt einem Schaukasten und zeigt den Gegenstand oder Block, der darin platziert wurde. + +Wirft man damit, kann eine Kreatur des angegebenen Typs erscheinen. + +Wird zum Bau langer Treppen verwendet. Zwei Stufen, die aufeinandergelegt werden, werden zu einem normal großen Doppelstufen-Block verschmolzen. + +Wird zum Bau langer Treppen verwendet. Zwei Stufen, die aufeinandergelegt werden, werden zu einem normal großen Doppelstufen-Block verschmolzen. + +Entsteht, wenn du im Ofen Netherstein schmilzt. Kann zu Netherziegelblöcken verarbeitet werden. + +Sie leuchten, wenn sie unter Strom stehen. + +Kann angebaut werden, um Kakaobohnen zu erhalten. + +NPC-Köpfe können als Dekoration platziert werden oder als Maske anstatt eines Helms getragen werden. + +Tintenfisch + +Wenn er getötet wird, lässt er einen Tintensack fallen. + +Kuh + +Wenn sie getötet wird, lässt sie Leder fallen. Kann außerdem mit einem Eimer gemolken werden. + +Schaf + +Wenn es geschoren wird, lässt es Wolle fallen, wenn es nicht schon geschoren war. Kann gefärbt werden, wodurch seine Wolle eine andere Farbe erhält. + +Huhn + +Wenn es getötet wird, lässt es Federn fallen. Legt in zufälligen Abständen Eier. + +Schwein + +Wenn es getötet wird, lässt es Schweinefleisch fallen. Kann mithilfe eines Sattels geritten werden. + +Wolf + +Friedlich, bis er angegriffen wird, dann wehrt er sich. Kann mithilfe von Knochen gezähmt werden. Der Wolf wird dir dann folgen und alles angreifen, was dich angreift. + +Creeper + +Explodiert, wenn du ihm zu nahe kommst! + +Skelett + +Schießt mit Pfeilen auf dich. Wenn es getötet wird, lässt es Pfeile fallen. + +Spinne + +Greift dich an, wenn du ihr zu nahe kommst. Kann Wände hochklettern. Wenn sie getötet wird, lässt sie Faden fallen. + +Zombie + +Greift dich an, wenn du ihm zu nahe kommst. + +Zombie-Schweinezüchter + +Eigentlich friedlich, greift dich aber in Gruppen an, wenn du einen angreifst. + +Ghast + +Schießt Feuerbälle auf dich, die beim Auftreffen explodieren. + +Slime + +Zerfällt in kleinere Slimes, wenn er Schaden erhält. + +Enderman + +Greift dich an, wenn du ihn ansiehst. Kann außerdem Blöcke bewegen. + +Silberfisch + +Lockt in der Nähe versteckte Silberfische an, wenn er angegriffen wird. Versteckt sich in Steinblöcken. + +Höhlenspinne + +Hat einen giftigen Biss. + +Pilzkuh + +Kann mithilfe einer Schüssel zu Pilzsuppe verarbeitet werden. Lässt Pilze fallen und wird zu einer normalen Kuh, wenn man sie schert. + +Schneegolem + +Der Schneegolem entsteht, wenn Spieler Schneeblöcke und einen Kürbis kombinieren. Bewirft die Feinde seines Erbauers mit Schneebällen. + +Enderdrache + +Ein großer schwarzer Drache, den man im Ende findet. + +Lohe + +Gegner, die man im Nether findet, vorwiegend in Netherfestungen. Lassen Lohenruten fallen, wenn sie getötet werden. + +Magmawürfel + +Findet man im Nether. Ähnlich wie Schleim zerfallen sie zu kleineren Versionen, wenn man sie tötet. + +Dorfbewohner + +Ozelot + +Findet man in Dschungeln. Füttere sie mit rohem Fisch, um sie zu zähmen. Du musst aber zulassen, dass der Ozelot sich dir nähert, denn bei schnellen Bewegungen läuft er weg. + +Eisengolem + +Erscheinen in Dörfern, um sie zu beschützen, und können mittels Eisenblöcken und Kürbissen erstellt werden. + +Explosives Animator + +Concept Artist + +Number Crunching and Statistics + +Bully Coordinator + +Original Design and Code by + +Project Manager/Producer + +Rest of Mojang Office + +Lead Game Programmer Minecraft PC + +Ninja Coder + +CEO + +White Collar Worker + +Customer Support + +Office DJ + +Designer/Programmer Minecraft - Pocket Edition + +Developer + +Chief Architect + +Art Developer + +Game Crafter + +Director of Fun + +Music and Sounds + +Programming + +Art + +QA + +Executive Producer + +Lead Producer + +Producer + +Test Lead + +Lead Tester + +Design Team + +Development Team + +Release Management + +Director, XBLA Publishing + +Business Development + +Portfolio Director + +Product Manager + +Marketing + + Community Manager + +Europe Localization Team + +Redmond Localization Team + +Asia Localization Team + +User Research Team + +MGS Central Teams + +Milestone Acceptance Tester + +Special Thanks + +Test Manager + +Senior Test Lead + +SDET + +Project STE + +Additional STE + +Test Associates + +Jon KÃ¥gström + +Tobias Möllstam + +Risë Lugo + +Holzschwert + +Steinschwert + +Eisenschwert + +Diamantschwert + +Goldschwert + +Holzschaufel + +Steinschaufel + +Eisenschaufel + +Diamantschaufel + +Goldschaufel + +Holzspitzhacke + +Steinspitzhacke + +Eisenspitzhacke + +Diamantspitzhacke + +Goldspitzhacke + +Holzaxt + +Steinaxt + +Eisenaxt + +Diamantaxt + +Goldaxt + +Holzhacke + +Steinhacke + +Eisenhacke + +Diamanthacke + +Goldhacke + +Holztür + +Eisentür + +Kettenhelm + +Kettenbrustplatte + +Kettenhose + +Kettenstiefel + +Lederkappe + +Eisenhelm + +Diamanthelm + +Goldhelm + +Ledertunika + +Eisenbrustplatte + +Diamantbrustplatte + +Goldbrustplatte + +Lederhose + +Eisenhose + +Diamanthose + +Goldhose + +Lederstiefel + +Eisenstiefel + +Diamantstiefel + +Goldstiefel + +Eisenbarren + +Goldbarren + +Eimer + +Wassereimer + +Lavaeimer + +Feuerzeug + +Apfel + +Bogen + +Pfeil + +Kohle + +Holzkohle + +Diamant + +Stock + +Schüssel + +Pilzsuppe + +Faden + +Feder + +Schießpulver + +Weizensamen + +Weizen + +Brot + +Feuerstein + +Rohes Schweinefleisch + +Gekochtes Schweinefleisch + +Gemälde + +Goldener Apfel + +Schild + +Lore + +Sattel + +Redstone + +Schneeball + +Boot + +Leder + +Milcheimer + +Ziegel + +Lehm + +Zuckerrohr + +Papier + +Buch + +Schleimball + +Lore mit Truhe + +Lore mit Ofen + +Ei + +Kompass + +Angel + +Uhr + +Glowstone-Staub + +Roher Fisch + +Gekochter Fisch + +Farbpulver + +Tintensack + +Rosenrot + +Kaktusgrün + +Kakaobohnen + +Lapislazuli + +Lila Farbe + +Farbe Cyan + +Hellgraue Farbe + +Graue Farbe + +Rosa Farbe + +Hellgrüne Farbe + +Löwenzahngelb + +Hellblaue Farbe + +Farbe Magenta + +Farbe Orange + +Knochenmehl + +Knochen + +Zucker + +Kuchen + +Bett + +Redstone-Repeater + +Keks + +Karte + +Schallplatte - "13" + +Schallplatte - "cat" + +Schallplatte - "blocks" + +Schallplatte - "chirp" + +Schallplatte - "far" + +Schallplatte - "mall" + +Schallplatte - "mellohi" + +Schallplatte - "stal" + +Schallplatte - "strad" + +Schallplatte - "ward" + +Schallplatte - "11" + +Schallplatte - "where are we now" + +Schere + +Kürbissamen + +Melonensamen + +Rohes Hühnchen + +Gebratenes Hühnchen + +Rohes Rindfleisch + +Steak + +Verrottetes Fleisch + +Enderperle + +Melonenscheibe + +Lohenrute + +Ghastträne + +Goldklumpen + +Netherwarze + +{*prefix*} {*splash*}Trank {*postfix*} + +Glasflasche + +Wasserflasche + +Spinnenauge + +Fermentiertes Spinnenauge + +Lohenstaub + +Magmacreme + +Braustand + +Kessel + +Enderauge + +Funkelnde Melone + +Erfahrungsfläschchen + +Feuerkugel + +Feuerkugel (Holzkohle) + +Feuerkugel (Kohle) + +Gegenstandsrahmen + +{*CREATURE*} erzeugen + +Netherziegel + +Schädel + +Skelettschädel + +Dörrskelettschädel + +Zombiekopf + +Kopf + +Kopf von %s + +Creeper-Kopf + +Stein + +Grasblock + +Erde + +Pflasterstein + +Eichenholzbretter + +Fichtenholzbretter + +Birkenholzbretter + +Dschungelholzbretter + +Setzling + +Eichensetzling + +Fichtensetzling + +Birkensetzling + +Dschungelbaumsetzling + +Bedrock + +Wasser + +Lava + +Sand + +Sandstein + +Kies + +Golderz + +Eisenerz + +Kohlenerz + +Baumstamm + +Eichenholz + +Fichtenholz + +Birkenholz + +Dschungelholz + +Eiche + +Fichte + +Birke + +Blätter + +Eichenblätter + +Fichtenblätter + +Birkenblätter + +Dschungelblätter + +Schwamm + +Glas + +Wolle + +Schwarze Wolle + +Rote Wolle + +Grüne Wolle + +Braune Wolle + +Blaue Wolle + +Lila Wolle + +Cyanfarbene Wolle + +Hellgraue Wolle + +Graue Wolle + +Rosa Wolle + +Hellgrüne Wolle + +Gelbe Wolle + +Hellblaue Wolle + +Magentafarbene Wolle + +Orangefarbene Wolle + +Weiße Wolle + +Blume + +Rose + +Pilz + +Goldblock + +Eine kompakte Lagermöglichkeit für Gold. + +Eine kompakte Lagermöglichkeit für Eisen. + +Eisenblock + +Steinstufe + +Steinstufe + +Sandsteinstufe + +Eichenholzstufe + +Pflastersteinstufe + +Ziegelstufe + +Steinziegelstufe + +Eichenholzstufe + +Fichtenholzstufe + +Birkenholzstufe + +Dschungelholzstufe + +Netherziegelstufe + +Ziegel + +TNT + +Bücherregal + +Bemooster Pflasterstein + +Obsidian + +Fackel + +Fackel (Kohle) + +Fackel (Holzkohle) + +Feuer + +Monster-Spawner + +Eichenholztreppe + +Truhe + +Redstone-Staub + +Diamanterz + +Diamantblock + +Eine kompakte Lagermöglichkeit für Diamanten. + +Werkbank + +Getreide + +Ackerland + +Ofen + +Schild + +Holztür + +Leiter + +Schiene + +Booster-Schiene + +Detektor-Schiene + +Steintreppe + +Hebel + +Druckplatte + +Eisentür + +Redstone-Erz + +Redstone-Fackel + +Schalter + +Schnee + +Eis + +Kaktus + +Lehm + +Zuckerrohr + +Jukebox + +Zaun + +Kürbis + +Kürbislaterne + +Netherrack + +Soul Sand + +Glowstone + +Portal + +Lapislazulierz + +Lapislazuliblock + +Eine kompakte Lagermöglichkeit für Lapislazuli. + +Dispenser + +Notenblock + +Kuchen + +Bett + +Netz + +Hohes Gras + +Toter Strauch + +Diode + +Verschlossene Truhe + +Falltür + +Wolle (beliebige Farbe) + +Kolben + +Haftender Kolben + +Silberfischblock + +Steinziegel + +Bemooste Steinziegel + +Rissige Steinziegel + +Gemeißelter Steinziegel + +Pilz + +Pilz + +Eisengitter + +Glasscheibe + +Melone + +Kürbispflanze + +Melonenpflanze + +Ranken + +Zauntor + +Ziegeltreppe + +Steinziegeltreppe + +Silberfischstein + +Silberfisch-Pflasterstein + +Silberfisch-Steinziegel + +Myzel + +Seerosenblatt + +Netherziegel + +Netherzaun + +Netherziegeltreppe + +Netherwarze + +Zaubertisch + +Braustand + +Kessel + +Endportal + +Endportalrahmen + +Endstein + +Drachenei + +Strauch + +Hohes Gras + +Sandsteintreppe + +Fichtenholztreppe + +Birkenholztreppe + +Dschungelholztreppe + +Redstone-Lampe + +Kakao + +Schädel + +Derzeitige Steuerung + +Layout + +Bewegen/Sprinten + +Schauen + +Pause + +Springen + +Springen/Hochfliegen + +Inventar + +Gegenstand wechseln + +Aktion + +Verwenden + +Crafting + +Ablegen + +Schleichen + +Schleichen/Runterfliegen + +Kameramodus ändern + +Spieler/Einladen + +Bewegen (Beim Fliegen) + +Layout 1 + +Layout 2 + +Layout 3 + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +{*B*}Drück zum Fortfahren{*CONTROLLER_VK_A*}. + +{*B*}Drück{*CONTROLLER_VK_A*}, um das Tutorial zu starten.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du denkst, dass du so weit bist, dass du allein spielen kannst. + +Minecraft ist ein Spiel, bei dem du Blöcke platzierst, um alles zu bauen, was du dir vorstellen kannst. +Nachts treiben sich Monster herum, du solltest dir einen Unterstand bauen, bevor sie herauskommen. + +Mit{*CONTROLLER_ACTION_LOOK*}kannst du nach oben, unten und in die anderen Richtungen schauen. + +Mit{*CONTROLLER_ACTION_MOVE*}kannst du dich umherbewegen. + +Um zu sprinten, drücke {*CONTROLLER_ACTION_MOVE*} zweimal schnell nacheinander nach vorn. Solange du {*CONTROLLER_ACTION_MOVE*} nach vorn gedrückt hältst, sprintest du, bis dir die Sprintzeit oder die Nahrung ausgeht. + +Drück{*CONTROLLER_ACTION_JUMP*}, um zu springen. + +Halte{*CONTROLLER_ACTION_ACTION*}gedrückt, um mit deiner Hand oder dem Werkzeug in deiner Hand zu graben oder zu hacken. Um manche Blöcke abbauen zu können, wirst du dir ein Werkzeug herstellen müssen. + +Halte{*CONTROLLER_ACTION_ACTION*}gedrückt, um 4 Blöcke von Baumstämmen abzuhacken.{*B*}Wenn ein Block abbricht, kannst du ihn aufnehmen, indem du dich dicht neben das auftauchende, schwebende Objekt stellst, wodurch es in deinem Inventar erscheint. + +Drück{*CONTROLLER_ACTION_CRAFTING*}, um die Crafting-Oberfläche zu öffnen. + +Wenn du zunehmend mehr Gegenstände einsammelst und herstellst, wird sich dein Inventar langsam füllen.{*B*} + Drück{*CONTROLLER_ACTION_INVENTORY*}, um das Inventar zu öffnen. + +Durch Umherlaufen, Graben und Angreifen leerst du deine Hungerleiste {*ICON_SHANK_01*}. Durch Sprinten und Sprint-Springen verbrauchst du viel mehr Nahrung als durch normales Laufen und Springen. + +Wenn du Gesundheit verlierst, aber eine Hungerleiste mit 9 oder mehr{*ICON_SHANK_01*} darin hast, regeneriert sich deine Gesundheit automatisch. Wenn du Nahrung isst, regeneriert sich deine Hungerleiste. + +Halte{*CONTROLLER_ACTION_USE*} gedrückt, wenn du Nahrung in der Hand hast, um sie zu essen und deine Hungerleiste aufzufüllen. Du kannst nichts essen, wenn deine Hungerleiste voll ist. + +Deine Hungerleiste ist fast leer, und du hast etwas Gesundheit verloren. Iss das Steak aus deinem Inventar, um deine Hungerleiste aufzufüllen und deine Gesundheit zu regenerieren.{*ICON*}364{*/ICON*} + +Die eingesammelten Baumstämme können zu Holz verarbeitet werden. Öffne dazu die Crafting-Oberfläche.{*PlanksIcon*} + +Viele Crafting-Vorgänge bestehen aus mehreren Schritten. Jetzt, da du etwas Holz hast, kannst du weitere Gegenstände herstellen. Erstell eine Werkbank.{*CraftingTableIcon*} + +Um Blöcke schneller einsammeln zu können, kannst du dir besser geeignete Werkzeuge herstellen. Manche Werkzeuge haben einen Griff, der aus Stöcken hergestellt wird. Stell jetzt ein paar Stöcke her.{*SticksIcon*} + +Wechsle mit{*CONTROLLER_ACTION_LEFT_SCROLL*} oder{*CONTROLLER_ACTION_RIGHT_SCROLL*} den Gegenstand in deiner Hand. + +Drück{*CONTROLLER_ACTION_USE*}, um Gegenstände zu verwenden, mit Objekten zu interagieren und geeignete Gegenstände zu platzieren. Platzierte Gegenstände kannst du wieder aufnehmen, indem du sie mit dem geeigneten Werkzeug abbaust. + +Wenn du die Werkbank ausgewählt hast, zeig mit dem Fadenkreuz dahin, wo du sie aufstellen möchtest, und platzier sie, indem du{*CONTROLLER_ACTION_USE*} drückst. + +Zeig mit dem Fadenkreuz auf die Werkbank und drück{*CONTROLLER_ACTION_USE*}, um sie zu öffnen. + +Eine Schaufel hilft dir, weiche Blöcke wie Erde und Schnee schneller abzubauen. Wenn du weitere Materialien gesammelt hast, kannst du Werkzeuge herstellen, mit denen du schneller arbeiten kannst und die länger halten. Stell eine Holzschaufel her.{*WoodenShovelIcon*} + +Mit einer Axt kannst du schneller Stämme und hölzerne Gegenstände bearbeiten. Wenn du weitere Materialien gesammelt hast, kannst du Werkzeuge herstellen, mit denen du schneller arbeiten kannst und die länger halten. Stell eine Holzaxt her.{*WoodenHatchetIcon*} + +Eine Spitzhacke hilft dir, harte Blöcke wie Stein und Erz schneller abzubauen. Wenn du weitere Materialien gesammelt hast, kannst du Werkzeuge herstellen, mit denen du schneller arbeiten sowie härtere Materialien abbauen kannst und die länger halten. Stell eine Holzspitzhacke her.{*WoodenPickaxeIcon*} + +Container öffnen + + + Die Nacht kann schnell hereinbrechen, und dann wird es gefährlich, sich unvorbereitet im Freien aufzuhalten. Du kannst Rüstungen und Waffen herstellen, es ist aber eine gute Idee, einen sicheren Unterstand zu haben. + + + + In der Nähe gibt es einen verlassenen Unterstand von Minenarbeitern, den du fertigstellen kannst, um nachts in Sicherheit zu sein. + + + + Du wirst die nötigen Materialien sammeln müssen, um den Unterstand fertig zu bauen. Wände und Dach können aus beliebigem Material bestehen, aber du wirst eine Tür, ein paar Fenster und Beleuchtung brauchen. + + +Bau mithilfe deiner Spitzhacke ein paar Steinblöcke ab. Steinblöcke erzeugen beim Abbauen Pflastersteine. Wenn du 8 Blöcke Pflasterstein sammelst, kannst du einen Ofen bauen. Möglicherweise musst du dich durch Erde graben, um auf Stein zu stoßen. Verwende dazu deine Schaufel.{*StoneIcon*} + +Du hast genügend Pflastersteine gesammelt, um einen Ofen zu bauen. Verwende deine Werkbank, um einen herzustellen. + +Drück{*CONTROLLER_ACTION_USE*}, um den Ofen in der Welt zu platzieren, und öffne ihn dann. + +Verwende den Ofen, um etwas Holzkohle herzustellen. Wie wäre es, wenn du noch weitere Materialien für deinen Unterstand sammelst, während du wartest? + +Verwende den Ofen, um etwas Glas herzustellen. Wie wäre es, wenn du noch weitere Materialien für deinen Unterstand sammelst, während du wartest? + +Eine gute Unterkunft sollte eine Tür haben, damit du leicht hinaus- und hineingehen kannst, ohne immer die Wände abbauen und wieder ersetzen zu müssen. Stell jetzt eine Holztür her.{*WoodenDoorIcon*} + +Drück{*CONTROLLER_ACTION_USE*}, um die Tür zu platzieren. Du kannst {*CONTROLLER_ACTION_USE*}verwenden, um eine Holztür zu öffnen oder zu schließen. + +Nachts kann es sehr dunkel werden, du wirst daher deine Unterkunft beleuchten wollen, damit du etwas sehen kannst. Stell auf der Crafting-Oberfläche eine Fackel aus Stöcken und Holzkohle her.{*TorchIcon*} + + + Du hast den ersten Teil des Tutorials abgeschlossen. + + + + {*B*} + Drück{*CONTROLLER_VK_A*}, um das Tutorial fortzusetzen.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du denkst, dass du so weit bist, dass du allein spielen kannst. + + + + Dies ist dein Inventar. Hier werden die Gegenstände angezeigt, die du in deiner Hand verwenden kannst, sowie alle anderen Gegenstände, die du bei dir trägst. Außerdem wird hier deine Rüstung angezeigt. + + +{*B*} + Drück zum Fortfahren{*CONTROLLER_VK_A*}.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits weißt, wie das Inventar verwendet wird. + + + + Beweg den Cursor mit{*CONTROLLER_MENU_NAVIGATE*}. Drück{*CONTROLLER_VK_A*}, um einen Gegenstand unter dem Cursor aufzunehmen. + Falls es dort mehr als einen Gegenstand gibt, werden alle aufgenommen. Du kannst auch {*CONTROLLER_VK_X*}drücken, um nur die Hälfte von ihnen aufzunehmen. + + + + Beweg diesen Gegenstand mit dem Cursor an einen anderen Platz im Inventar, und platzier ihn dort, indem du{*CONTROLLER_VK_A*} drückst. + Wenn sich mehrere Gegenstände unter dem Cursor befinden, drück{*CONTROLLER_VK_A*}, um alle abzulegen, oder{*CONTROLLER_VK_X*}, um nur einen abzulegen. + + + + Wenn du den Cursor mit einem Gegenstand über den Rand der Oberfläche hinaus bewegst, kannst du den Gegenstand ablegen. + + + + Wenn du mehr Informationen über einen Gegenstand brauchst, beweg den Cursor über den Gegenstand und drück{*CONTROLLER_VK_RT*}. + + + + Drück jetzt{*CONTROLLER_VK_B*}, um das Inventar zu verlassen. + + + + Dies ist das Inventar des Kreativmodus. Hier werden die Gegenstände angezeigt, die du in der Hand verwenden kannst, sowie alle anderen Gegenstände, die dir zur Verfügung stehen. + + +{*B*} + Drück zum Fortfahren{*CONTROLLER_VK_A*}. {*B*} + Drück{*CONTROLLER_VK_B*}, wenn du schon weißt, wie man das Kreativmodus-Inventar verwendet. + + + + Beweg den Cursor mithilfe von{*CONTROLLER_MENU_NAVIGATE*}. + Wähle in der Gegenstandsliste mit{*CONTROLLER_VK_A*} den Gegenstand unter dem Cursor oder mit{*CONTROLLER_VK_Y*} eine ganze Gruppe dieses Gegenstands aus. + + + + Der Cursor bewegt sich automatisch über ein Feld in der Verwendungsreihe. Du kannst den Gegenstand mit {*CONTROLLER_VK_A*} ablegen. Sobald du den Gegenstand abgelegt hast, kehrt der Cursor in die Gegenstandsliste zurück, wo du einen weiteren Gegenstand auswählen kannst. + + + + Wenn du den Cursor mit einem Gegenstand über den Rand der Oberfläche hinaus bewegst, kannst du den Gegenstand in der Welt ablegen. Drück {*CONTROLLER_VK_X*}, um alle Gegenstände in der Schnellauswahlleiste zu löschen. + + + + Wechsle mit{*CONTROLLER_VK_LB*} und{*CONTROLLER_VK_RB*} zwischen den Reitern der einzelnen Gruppen, um die Gruppe des Gegenstands auszuwählen, den du brauchst. + + + + Wenn du mehr Informationen über einen Gegenstand brauchst, beweg den Cursor über den Gegenstand und drück{*CONTROLLER_VK_RT*}. + + + + Drück jetzt{*CONTROLLER_VK_B*}, um das Kreativmodus-Inventar zu verlassen. + + + + Dies ist die Crafting-Oberfläche. Hier kannst du gesammelte Gegenstände kombinieren, um neue Gegenstände herzustellen. + + +{*B*} + Drück zum Fortfahren{*CONTROLLER_VK_A*}.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits weißt, wie man craftet. + + +{*B*} + Drück{*CONTROLLER_VK_X*}, um eine Beschreibung des Gegenstands anzuzeigen. + + +{*B*} + Drück{*CONTROLLER_VK_X*}, um die Zutaten anzuzeigen, die du für den aktuellen Gegenstand benötigst. + + +{*B*} + Drück{*CONTROLLER_VK_X*}, um wieder das Inventar anzuzeigen. + + + + Wechsle mit{*CONTROLLER_VK_LB*} und{*CONTROLLER_VK_RB*} zwischen den Reitern der einzelnen Gruppen, um die Gruppe des gewünschten Gegenstands auszuwählen, und wähl dann den herzustellenden Gegenstand mit{*CONTROLLER_MENU_NAVIGATE*} aus. + + + + Der Crafting-Bereich zeigt die Gegenstände an, die du brauchst, um den neuen Gegenstand herzustellen. Drück{*CONTROLLER_VK_A*}, um den Gegenstand herzustellen und in deinem Inventar abzulegen. + + + + Mithilfe einer Werkbank kannst du eine größere Auswahl an Gegenständen herstellen. Crafting auf einer Werkbank funktioniert genau wie einfaches Crafting, du hast aber einen größeren Crafting-Bereich, der mehr Zutatenkombinationen erlaubt. + + + + Der untere rechte Bereich der Crafting-Oberfläche zeigt dein Inventar an. In diesem Bereich kannst du dir auch eine Beschreibung des derzeit ausgewählten Gegenstands samt der dafür benötigten Zutaten anzeigen lassen. + + + + Jetzt wird die Beschreibung des derzeit ausgewählten Gegenstands angezeigt. Die Beschreibung hilft dir zu verstehen, wofür der Gegenstand eingesetzt werden kann. + + + + Jetzt wird die Liste der Zutaten angezeigt, die benötigt werden, um den ausgewählten Gegenstand herzustellen. + + +Die eingesammelten Baumstämme können zu Holz verarbeitet werden. Wähl das Holzsymbol aus und drück{*CONTROLLER_VK_A*}, um Holz herzustellen.{*PlanksIcon*} + + + Du solltest deine Werkbank jetzt in der Welt platzieren, damit du eine größere Auswahl an Gegenständen herstellen kannst.{*B*} + Drück jetzt{*CONTROLLER_VK_B*}, um die Crafting-Oberfläche zu verlassen. + + + + Drück{*CONTROLLER_VK_LB*} und{*CONTROLLER_VK_RB*}, um zur Gruppe der Gegenstände zu wechseln, die du herstellen möchtest. Wähl die Gruppe „Werkzeuge“ aus.{*ToolsIcon*} + + + + Drück{*CONTROLLER_VK_LB*} und{*CONTROLLER_VK_RB*}, um zur Gruppe der Gegenstände zu wechseln, die du herstellen möchtest. Wähl die Gruppe „Strukturen“ aus.{*StructuresIcon*} + + + + Ändere mit{*CONTROLLER_MENU_NAVIGATE*} den Gegenstand, den du herstellen möchtest. Von manchen Gegenständen gibt es mehrere Versionen, abhängig vom verwendeten Material. Wähl die Holzschaufel aus.{*WoodenShovelIcon*} + + + + Viele Crafting-Vorgänge bestehen aus mehreren Schritten. Jetzt, da du etwas Holz hast, kannst du weitere Gegenstände herstellen. Ändere mit{*CONTROLLER_MENU_NAVIGATE*} den Gegenstand, den du herstellen möchtest. Wähl die Werkbank aus.{*CraftingTableIcon*} + + + + Mit den Werkzeugen, die du gebaut hast, hast du einen guten Start hingelegt. Du bist jetzt in der Lage, eine Vielzahl verschiedener Materialien effektiver zu sammeln.{*B*} + Drück jetzt{*CONTROLLER_VK_B*}, um die Crafting-Oberfläche zu verlassen. + + + + Manche Gegenstände kannst du nicht mit der Werkbank herstellen, sondern brauchst dafür einen Ofen. Stell jetzt einen Ofen her.{*FurnaceIcon*} + + + + Platzier den hergestellten Ofen in der Welt. Du wirst ihn in deinen Unterstand stellen wollen.{*B*} + Drück jetzt{*CONTROLLER_VK_B*}, um die Crafting-Oberfläche zu verlassen. + + + + Dies ist die Ofen-Oberfläche. Ein Ofen erlaubt dir, Gegenstände zu verändern, indem du sie erhitzt. Du kannst im Ofen zum Beispiel Eisenbarren aus Eisenerz herstellen. + + +{*B*} + Drück zum Fortfahren{*CONTROLLER_VK_A*}.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits weißt, wie man einen Ofen verwendet. + + + + Du musst in das untere Feld des Ofens Brennstoff legen und in das obere den Gegenstand, den du verändern möchtest. Der Ofen wird dann angeheizt und beginnt zu arbeiten, wodurch das Ergebnis im rechten Feld erscheint. + + + + Du kannst viele Holzgegenstände als Brennstoff verwenden, aber nicht alles brennt gleich lange. Du wirst auch andere Gegenstände in der Welt finden, die du als Brennstoff verwenden kannst. + + + + Wenn dein Gegenstand fertig erhitzt ist, kannst du ihn aus dem Ausgabefeld in dein Inventar verschieben. Du solltest mit verschiedenen Zutaten experimentieren, um zu sehen, was du alles herstellen kannst. + + + + Wenn du Baumstämme als Zutat verwendest, kannst du Holzkohle herstellen. Leg Brennstoff in den Ofen und einen Baumstamm in das Zutatenfeld. Es wird eine Weile dauern, bis der Ofen die Holzkohle fertig hat, du kannst währenddessen etwas anderes tun und später wiederkommen, um dir den Fortschritt anzusehen. + + + + Holzkohle kann als Brennstoff verwendet werden, du kannst daraus aber auch mit einem Stock eine Fackel herstellen. + + + + Wenn du Sand ins Zutatenfeld legst, kannst du Glas herstellen. Erschaff ein paar Glasblöcke, die du als Fenster in deinem Unterstand verwenden kannst. + + + + Dies ist die Brau-Oberfläche. Hier kannst du Tränke erschaffen, die die verschiedensten Effekte haben können. + + +{*B*} + Drück zum Fortfahren{*CONTROLLER_VK_A*}. {*B*} + Drück{*CONTROLLER_VK_B*}, wenn du schon weißt, wie man den Braustand verwendet. + + + + Du braust Tränke, indem du in das obere Feld eine Zutat legst und in die unteren Felder je einen Trank oder eine Wasserflasche (du kannst gleichzeitig bis zu 3 Tränke brauen). Sobald eine funktionierende Kombination eingelegt wurde, beginnt der Brauprozess und nach kurzer Zeit entsteht der Trank. + + + + Basis aller Tränke ist eine Wasserflasche. Die meisten Tränke werden hergestellt, indem zuerst mit einer Netherwarze ein Seltsamer Trank hergestellt wird. Sie erfordern mindestens eine weitere Zutat, bevor der Trank fertig ist. + + + + Wenn du einen Trank fertig hast, kannst du seinen Effekt noch weiter modifizieren. Wenn du ihm Redstone-Staub hinzufügst, steigerst du die Dauer seines Effekts. Wenn du ihm Glowstone-Staub hinzufügst, machst du ihn stärker. + + + + Wenn du dem Trank ein Fermentiertes Spinnenauge hinzufügst, verdirbt der Trank und kann den entgegengesetzten Effekt hervorrufen. Wenn du dem Trank Schießpulver hinzufügst, wird aus dem Trank ein Wurftrank und du kannst seinen Effekt auf einen ganzen Bereich entfalten. + + + + Erzeuge einen Trank der Feuerresistenz, indem du zuerst eine Netherwarze zu einer Wasserflasche hinzufügst und dann Magmacreme. + + + + Drück jetzt{*CONTROLLER_VK_B*}, um die Brauoberfläche zu verlassen. + + + + In diesem Gebiet gibt es einen Braustand, einen Kessel sowie eine Truhe mit Gegenständen zum Brauen. + + +{*B*} + Drück{*CONTROLLER_VK_A*}, wenn du mehr über das Brauen und Tränke erfahren möchtest. {*B*} + Drück{*CONTROLLER_VK_B*}, wenn du schon alles über das Brauen und Tränke weißt. + + + + Der erste Schritt zum Brauen eines Trankes ist es, eine Wasserflasche zu erschaffen. Nimm eine Glasflasche aus der Truhe. + + + + Du kannst eine Glasflasche aus einem Kessel mit Wasser füllen oder aus einem Wasserblock. Fülle jetzt deine Glasflasche, indem du damit auf eine Wasserquelle zeigst und{*CONTROLLER_ACTION_USE*} drückst. + + + + Wenn ein Kessel leer ist, kannst du ihn mit einem Wassereimer wieder auffüllen. + + + + Braue mithilfe des Braustandes einen Trank der Feuerresistenz. Du brauchst dazu eine Wasserflasche, eine Netherwarze und Magmacreme. + + + + Nimm einen Trank in deine Hand und halte{*CONTROLLER_ACTION_USE*} gedrückt, um ihn zu verwenden. Einen normalen Trank wirst du trinken und den Effekt auf dich selbst anwenden, Wurftränke wirst du werfen und den Effekt auf die Kreaturen in der Nähe der Aufschlagstelle anwenden. + Wurftränke kannst du herstellen, indem du zu einem normalen Trank Schießpulver hinzufügst. + + + + Verwende deinen Trank der Feuerresistenz für dich selbst. + + + + Jetzt bist du resistent gegenüber Feuer und Lava. Probier doch mal aus, ob du jetzt Orte erreichen kannst, die dir vorher versperrt geblieben sind. + + + + Dies ist die Verzauberoberfläche, über die du Waffen, Rüstungen und einige Werkzeuge verzaubern kannst. + + +{*B*} + Drück{*CONTROLLER_VK_A*}, wenn du mehr über die Verzauberoberfläche erfahren möchtest. {*B*} + Drück{*CONTROLLER_VK_B*}, wenn du schon alles über die Verzauberoberfläche weißt. + + + + Um einen Gegenstand zu verzaubern, lege ihn in das Verzauberfeld. Waffen, Rüstungen und manche Werkzeuge können verzaubert werden, um Spezialeffekte zu erhalten wie einen verbesserten Widerstand gegenüber Schaden oder eine Steigerung der Anzahl der Gegenstände, die du erhältst, wenn du einen Block abbaust. + + + + Wenn ein Gegenstand in das Verzauberfeld gelegt wird, ändern sich die Schaltflächen rechts und zeigen eine Auswahl zufälliger Verzauberungen an. + + + + Die Zahl auf den Schaltflächen symbolisiert die Kosten in Erfahrungsleveln, um die Verzauberung auf den Gegenstand anzuwenden. Wenn dein Erfahrungslevel nicht hoch genug ist, ist die Schaltfläche deaktiviert. + + + + Wähl eine Verzauberung aus und drück{*CONTROLLER_VK_A*}, um den Gegenstand zu verzaubern. Dadurch sinkt dein Erfahrungslevel um die Kosten der Verzauberung. + + + + Auch wenn alle Verzauberungen zufällig sind, sind einige der besseren doch nur verfügbar, wenn du einen hohen Erfahrungslevel und viele Bücherregale rund um den Zaubertisch errichtet hast, um die Stärke des Zaubers zu vergrößern. + + + + In diesem Gebiet stehen ein Zaubertisch und weitere Gegenstände, die dir helfen, etwas über das Verzaubern zu lernen. + + +{*B*} + Drücke {*CONTROLLER_VK_A*}, um mehr über das Verzaubern zu erfahren.{*B*} + Drücke {*CONTROLLER_VK_B*}, wenn du bereits alles über das Verzaubern weißt. + + + + Mithilfe eines Zaubertisches kannst du Waffen, Rüstungen und manchen Werkzeugen Spezialeffekte hinzufügen wie einen verbesserten Widerstand gegenüber Schaden oder eine Steigerung der Anzahl der Gegenstände, die du erhältst, wenn du einen Block abbaust. + + + + Wenn du Bücherregale rund um den Zaubertisch baust, steigerst du seine Zauberkraft und kannst Verzauberungen höherer Level erhalten. + + + + Gegenstände verzaubern kostet Erfahrungslevel, die du durch das Sammeln von Erfahrungskugeln steigerst. Erfahrungskugeln entstehen, wenn du Monster und Tiere tötest, Erz abbaust, Tiere züchtest, angelst und manche Dinge in einem Ofen kochst/einschmilzt. + + + + Du kannst Erfahrung auch durch den Einsatz von Erfahrungsflaschen erhalten. Wenn diese geworfen werden, entstehen Erfahrungskugeln rund um die Stelle, wo sie gelandet ist. Diese Kugeln können eingesammelt werden. + + + + In den Truhen in dieser Gegend findest du ein paar verzauberte Gegenstände, Erfahrungsflaschen und ein paar Gegenstände, die noch verzaubert werden müssen – also alles, was du brauchst, um mit dem Zaubertisch zu experimentieren. + + + + Du fährst jetzt in einer Lore. Um die Lore zu verlassen, platzier den Cursor darauf und drück{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + + +{*B*} + Drück{*CONTROLLER_VK_A*}, um mehr über Loren zu erfahren.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits alles über Loren weißt. + + + + Loren fahren auf Schienen. Mit einem Ofen und einer Lore kannst du eine angetriebene Lore erschaffen. Du kannst auch eine Lore mit einer Truhe darin erschaffen. + {*RailIcon*} + + + + Du kannst auch Booster-Schienen erschaffen, die Loren mit Strom aus Redstone-Fackeln und -Stromkreisen beschleunigen. Sie können mit Schaltern, Hebeln und Druckplatten verbunden werden, um komplexe Systeme zu erschaffen. + {*PoweredRailIcon*} + + + + Du segelst jetzt in einem Boot. Um das Boot zu verlassen, platzier den Cursor darauf und drück{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + + + + {*B*} + Drück{*CONTROLLER_VK_A*}, um mehr über Boote zu erfahren.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits alles über Boote weißt. + + + + Ein Boot erlaubt dir, schneller übers Wasser zu reisen. Du kannst es mit{*CONTROLLER_ACTION_MOVE*} und{*CONTROLLER_ACTION_LOOK*} steuern. + {*BoatIcon*} + + + + Du verwendest jetzt eine Angel. Drück{*CONTROLLER_ACTION_USE*}, um sie einzusetzen.{*FishingRodIcon*} + + + + {*B*} + Drück{*CONTROLLER_VK_A*}, um mehr übers Angeln zu erfahren.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits alles übers Angeln weißt. + + + + Drück{*CONTROLLER_ACTION_USE*}, um deine Angel auszuwerfen und mit dem Angeln zu beginnen. Drück erneut{*CONTROLLER_ACTION_USE*}, um die Angel einzuholen. + {*FishingRodIcon*} + + + + Wenn du mit dem Einholen wartest, bis der Schwimmer unter die Wasseroberfläche versunken ist, kannst du einen Fisch fangen. Fische können roh gegessen oder in einem Ofen gekocht werden, um deine Gesundheit zu regenerieren. + {*FishIcon*} + + + + Genau wie viele andere Werkzeuge kann eine Angel nicht unbegrenzt oft eingesetzt werden. Ihr Einsatz beschränkt sich aber nicht aufs Fangen von Fischen. Du solltest mit ihr experimentieren, um zu sehen, was du sonst noch so fangen oder aktivieren kannst ... + {*FishingRodIcon*} + + + + Dies ist ein Bett. Drück{*CONTROLLER_ACTION_USE*}, während du nachts darauf zeigst, um die Nacht zu verschlafen und am Morgen wieder zu erwachen.{*ICON*}355{*/ICON*} + + + + {*B*} + Drück{*CONTROLLER_VK_A*}, um mehr über Betten zu erfahren.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits alles über Betten weißt. + + + + Ein Bett sollte an einem sicheren, gut beleuchteten Ort stehen, damit du nicht mitten in der Nacht von Monstern geweckt wirst. Sobald du einmal ein Bett verwendet hast und später stirbst, erscheinst du in diesem Bett wieder in der Spielwelt. + {*ICON*}355{*/ICON*} + + + + Wenn es in deinem Spiel noch weitere Spieler gibt, müssen sich alle gleichzeitig im Bett befinden, um schlafen zu können. + {*ICON*}355{*/ICON*} + + + + In diesem Gebiet gibt es ein paar einfache Redstone- und Kolben-Schaltkreise sowie eine Truhe mit weiteren Gegenständen, um diese Schaltkreise zu erweitern. + + + + {*B*} + Drück{*CONTROLLER_VK_A*}, um mehr über Redstone-Schaltkreise und Kolben zu erfahren.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du bereits alles über Redstone-Schaltkreise und Kolben weißt. + + + + Hebel, Schalter, Druckplatten und auch Redstone-Fackeln können Schaltkreise mit Strom versorgen, indem du sie entweder direkt oder mithilfe von Redstone-Staub mit dem Gegenstand verbindest, den du aktivieren möchtest. + + + + Sowohl Position als auch Ausrichtung einer Stromquelle können einen Einfluss darauf haben, welchen Effekt sie auf die umgebenden Blöcke hat. Wenn du zum Beispiel eine Redstone-Fackel seitlich an einem Block anbringst, kann sie ausgeschaltet werden, wenn der Block Strom von einer anderen Quelle erhält. + + + + Redstone-Staub kannst du beim Abbauen von Redstone-Erz mit einer Spitzhacke aus Eisen, Diamant oder Gold erhalten. Mit seiner Hilfe kannst du Strom 15 Blöcke weit und einen Block nach oben oder unten übertragen. + {*ICON*}331{*/ICON*} + + + + Mit Redstone-Repeatern kannst du die Distanz verlängern, über die du Strom übertragen kannst, oder eine Verzögerung in einem Schaltkreis verursachen. + {*ICON*}356{*/ICON*} + + + + Wenn Strom an den Kolben angelegt wird, wird der Kolben länger und verschiebt bis zu 12 Blöcke. Wenn ein haftender Kolben zurückgezogen wird, zieht er einen Block der meisten Typen mit sich zurück. + {*ICON*}33{*/ICON*} + + + + In der Truhe in diesem Gebiet findest du Komponenten, um Schaltkreise mit Kolben herzustellen. Versuch, die Schaltkreise in diesem Gebiet zu verwenden oder sie fertigzustellen, oder bau deine eigenen zusammen. Außerhalb des Tutorial-Gebiets findest du weitere Beispiele. + + + + In diesem Gebiet gibt es ein Portal in den Nether! + + + + {*B*} + Drück {*CONTROLLER_VK_A*}, um mehr über das Portal und den Nether zu erfahren.{*B*} + Drück {*CONTROLLER_VK_B*}, wenn du schon alles über das Portal und den Nether weißt. + + + + Portale werden erzeugt, indem man Obsidian-Blöcke zu einem vier Blöcke breiten und fünf Blöcke hohen Rahmen anordnet. Die Eckblöcke können dabei weggelassen werden. + + + + Um ein Nether-Portal zu aktivieren, entzünde die Obsidian-Blöcke in dem Rahmen mit einem Feuerzeug. Portale können deaktiviert werden, wenn ihr Rahmen zerbrochen wird, wenn sich in der Nähe eine Explosion ereignet oder wenn eine Flüssigkeit hindurchfließt. + + + + Um ein Nether-Portal zu verwenden, stell dich hinein. Dein Bildschirm wird sich lila färben, und du hörst ein Geräusch. Nach ein paar Sekunden wirst du in eine andere Dimension transportiert. + + + + Der Nether kann ein gefährlicher Ort sein, voller Lava. Er ist aber auch nützlich, um Netherstein zu sammeln, der nach dem Anzünden ewig brennt, sowie Glowstone, der Licht produziert. + + + + Mithilfe der Netherwelt kann man in der oberirdischen Welt schneller reisen – eine Entfernung von einem Block im Nether entspricht drei Blöcken in der oberirdischen Welt. + + + + Du bist jetzt im Kreativmodus. + + + + {*B*} + Drück{*CONTROLLER_VK_A*}, wenn du mehr über den Kreativmodus erfahren möchtest. {*B*} + Drück{*CONTROLLER_VK_B*}, wenn du schon alles über den Kreativmodus weißt. + + +Im Kreativmodus hast du einen unbegrenzten Vorrat aller verfügbaren Gegenstände und Blöcke, du kannst Blöcke ohne Werkzeug mit einem Klick zerstören, bist unverwundbar und kannst fliegen. + +Drücke zweimal schnell nacheinander {*CONTROLLER_ACTION_JUMP*}, um zu fliegen. Um das Fliegen zu beenden, wiederhole die Aktion. Um schneller zu fliegen, drück{*CONTROLLER_ACTION_MOVE*} beim Fliegen zweimal schnell nach vorn. +Im Flugmodus halte{*CONTROLLER_ACTION_JUMP*} nach unten gedrückt, um dich nach oben zu bewegen, und{*CONTROLLER_ACTION_SNEAK*}, um dich nach unten zu bewegen, oder verwende das Steuerkreuz, um dich nach oben, nach unten, nach links oder nach rechts zu bewegen. + +Drück{*CONTROLLER_ACTION_CRAFTING*}, um die Kreativinventar-Oberfläche zu öffnen. + +Begib dich auf die andere Seite dieses Lochs. + +Du hast jetzt das Tutorial zum Kreativmodus abgeschlossen. + + + In diesem Gebiet wurde eine Farm errichtet. Mithilfe von Landwirtschaft kannst du eine erneuerbare Quelle von Nahrung und anderen Gegenständen erschaffen. + + + + {*B*} + Drück {*CONTROLLER_VK_A*}, um mehr über Landwirtschaft zu erfahren.{*B*} + Drück {*CONTROLLER_VK_B*}, wenn du bereits alles über Landwirtschaft weißt. + + +Weizen, Kürbisse und Melonen zieht man aus Samen. Weizensamen kann man sammeln, indem man Weizen erntet oder Hohes Gras abbaut. Kürbis- und Melonensamen kann man aus Kürbissen bzw. Melonen herstellen. + +Bevor du Samen pflanzt, musst du Erdblöcke mithilfe einer Hacke in Ackerboden umwandeln. Wenn sich in der Nähe eine Wasserquelle befindet, wird sie den Ackerboden befeuchten, wodurch die Pflanzen schneller wachsen. Denselben Effekt erzielt man, indem man die Gegend permanent beleuchtet. + +Weizen durchläuft beim Wachstum mehrere Phasen. Er kann geerntet werden, wenn er dunkler aussieht.{*ICON*}59:7{*/ICON*} + +Kürbisse und Melonen benötigen einen Block Platz neben der Stelle, wo du den Samen gepflanzt hast, damit die Frucht wachsen kann, nachdem der Stängel voll ausgewachsen ist. + +Zuckerrohr muss auf einem Gras-, Erd- oder Sandblock gepflanzt werden, der sich direkt neben einem Wasserblock befindet. Wenn man einen Zuckerrohrblock entfernt, zerfallen auch alle darüber liegenden Zuckerrohrblöcke.{*ICON*}83{*/ICON*} + +Kakteen müssen auf Sand gepflanzt werden. Sie wachsen bis zu drei Blöcke hoch. Genau wie bei Zuckerrohrblock musst du nur den untersten Block zerstören, um auch die darüber liegenden Blöcke einsammeln zu können.{*ICON*}81{*/ICON*} + +Pilze solltest du in einem spärlich beleuchteten Gebiet pflanzen. Sie breiten sich auf umliegende spärlich beleuchtete Blöcke aus.{*ICON*}39{*/ICON*} + +Man kann Knochenmehl verwenden, um Pflanzen schneller auswachsen zu lassen oder um Pilze zu Riesigen Pilzen wachsen zu lassen.{*ICON*}351:15{*/ICON*} + +Du hast jetzt das Tutorial zur Landwirtschaft abgeschlossen. + + + In diesem Gebiet sind Tiere untergebracht. Du kannst Tiere dazu bringen, dass sie Tierbabys produzieren. + + + +{*B*} + Drücke {*CONTROLLER_VK_A*}, um mehr über Tiere und ihre Zucht zu erfahren.{*B*} + Drücke {*CONTROLLER_VK_B*}, wenn du bereits alles über Tiere und ihre Zucht weißt. + + +Damit Tiere sich paaren, musst du sie mit dem richtigen Futter füttern, um sie in den "Liebesmodus" zu versetzen. + +Füttere eine Kuh, eine Pilzkuh oder ein Schaf mit Weizen, ein Schwein mit Karotten, ein Huhn mit Weizensamen bzw. Netherwarzen oder einen Wolf mit beliebigem Fleisch und schon ziehen sie los und suchen in der Nähe nach einem anderen Tier derselben Gattung, das auch im Liebesmodus ist. + +Wenn sich zwei Tiere derselben Gattung begegnen und beide im Liebesmodus sind, küssen sie sich für ein paar Sekunden und dann erscheint ein Babytier. Das Babytier folgt seinen Eltern für eine Weile, bevor es zu einem ausgewachsenen Tier heranwächst. + +Nachdem ein Tier im Liebesmodus war, dauert es fünf Minuten, bis das Tier den Liebesmodus erneut annehmen kann. + +Manche Tiere folgen dir, wenn du ihr Futter in deiner Hand hältst. Das erleichtert es, Tiere zu Gruppen zu versammeln, um die Paarung zu erleichtern.{*ICON*}296{*/ICON*} + + + Gib wilden Wölfen Knochen, um sie zu zähmen. Wenn sie gezähmt sind, erscheinen Liebesherzen um sie herum. Gezähmte Wölfe folgen dir und verteidigen dich, wenn ihnen nicht befohlen wurde, Sitz zu machen. + + +Du hast jetzt das Tutorial zu Tieren und ihrer Zucht abgeschlossen. + + + In dieser Gegend gibt es Kürbisse und Blöcke, um einen Schneegolem und einen Eisengolem zu erstellen. + + + + {*B*} + Drück {*CONTROLLER_VK_A*}, um mehr über Golems zu erfahren.{*B*} + Drück {*CONTROLLER_VK_B*}, wenn du bereits alles über Golems weißt. + + +Du erstellst Golems, indem du einen Kürbis auf einen Stapel Blöcke legst. + +Schneegolems bestehen aus zwei aufeinanderliegenden Schneeblöcken mit einem Kürbis darauf. Schneegolems bewerfen deine Feinde mit Schneebällen. + +Eisengolems bestehen aus vier Eisenblöcken im gezeigten Muster mit einem Kürbis auf dem mittleren Block. Eisengolems greifen deine Feinde an. + +Eisengolems erscheinen auch auf natürliche Art, um Dörfer zu verteidigen, und greifen dich an, falls du Dorfbewohner attackierst. + +Du kannst diesen Bereich erst verlassen, wenn du das Tutorial abgeschlossen hast. + +Verschiedene Werkzeuge eignen sich verschieden gut für verschiedene Materialien. Du solltest eine Schaufel verwenden, um weiches Material wie Erde und Sand abzubauen. + +Verschiedene Werkzeuge eignen sich verschieden gut für verschiedene Materialien. Du solltest eine Axt verwenden, um Baumstämme abzuhacken. + +Verschiedene Werkzeuge eignen sich verschieden gut für verschiedene Materialien. Du solltest eine Spitzhacke verwenden, um Steine und Erz abzubauen. Möglicherweise musst du eine Spitzhacke aus besserem Material herstellen, um aus manchen Blöcken Rohstoffe gewinnen zu können. + +Manche Werkzeuge eignen sich besser, um Gegner anzugreifen. Probier zum Angreifen mal ein Schwert aus. + +Tipp: Halte {*CONTROLLER_ACTION_ACTION*}gedrückt, um mit deiner Hand oder dem Werkzeug in deiner Hand zu graben oder zu hacken. Um manche Blöcke abbauen zu können, wirst du dir ein Werkzeug anfertigen müssen. + +Das verwendete Werkzeug ist beschädigt worden. Jedes Mal, wenn du ein Werkzeug einsetzt, erhält es ein wenig Schaden, und irgendwann geht es kaputt. Die farbige Leiste unterhalb des Gegenstands in deinem Inventar zeigt seinen aktuellen Zustand an. + +Halte{*CONTROLLER_ACTION_JUMP*} gedrückt, um nach oben zu schwimmen. + +In diesem Gebiet gibt es Schienen, auf denen eine Lore steht. Um die Lore zu betreten, platzier den Cursor darauf und drück{*CONTROLLER_ACTION_USE*}. Verwende{*CONTROLLER_ACTION_USE*} auf dem Schalter, um die Lore in Bewegung zu setzen. + +In der Truhe neben dem Fluss befindet sich ein Boot. Um das Boot zu verwenden, platzier den Cursor auf Wasser und drück{*CONTROLLER_ACTION_USE*}. Verwende{*CONTROLLER_ACTION_USE*}, während du auf das Boot zeigst, um es zu betreten. + +In der Truhe neben dem Teich befindet sich eine Angel. Nimm die Angel aus der Truhe, und nimm sie in deine Hand, um sie zu verwenden. + +Dieser kompliziertere Kolbenmechanismus erzeugt eine selbstreparierende Brücke! Drück zum Aktivieren den Schalter und schau dir dann an, wie die Komponenten interagieren, um alles besser zu verstehen. + +Wenn du den Cursor über den Rand der Oberfläche hinaus bewegst, während du einen Gegenstand trägst, kannst du den Gegenstand ablegen. + +Du hast nicht alle Zutaten, die du brauchst, um diesen Gegenstand herzustellen. Das Feld unten links zeigt dir die benötigten Zutaten an. + + + Glückwunsch, du hast das Tutorial abgeschlossen. Die Spielzeit vergeht jetzt mit normaler Geschwindigkeit, und du hast nicht mehr viel Zeit, bis die Nacht hereinbricht und Monster auftauchen! Stell deinen Unterstand fertig! + + +{*EXIT_PICTURE*} Wenn du bereit bist, dich weiter umzusehen, gibt es in der Nähe des Unterstands der Minenarbeiter eine Treppe, die zu einer kleinen Burg führt. + +Erinnerung: + +]]> + +Mit der aktuellen Version wurden dem Spiel neue Features hinzugefügt, darunter neue Gebiete in der Tutorial-Welt. + +{*B*}Drück{*CONTROLLER_VK_A*}, um das Tutorial ganz normal zu spielen.{*B*} + Drück{*CONTROLLER_VK_B*}, um das Haupt-Tutorial zu überspringen. + +In diesem Gebiet gibt es Bereiche, in denen du mehr über das Angeln, Boote, Kolben und Redstone erfahren kannst. + +Außerhalb dieses Gebiets findest du Beispiele für Gebäude, Landwirtschaft, Loren und Schienen sowie zum Verzaubern, Brauen, Handeln, Schmieden und noch einiges mehr! + + + Deine Hungerleiste ist so weit geleert, dass du dich nicht mehr regenerieren kannst. + + + + {*B*} + Drück{*CONTROLLER_VK_A*}, um mehr über die Hungerleiste und die Nahrungsaufnahme zu erfahren.{*B*} + Drück{*CONTROLLER_VK_B*}, wenn du schon alles über die Hungerleiste und die Nahrungsaufnahme weißt. + + +Auswählen + +Verwenden + +Zurück + +Verlassen + +Abbrechen + +Beitritt abbrechen + +Speichergerät auswählen + +Gerät wechseln + +Onlinespiele aktualisieren + +Partyspiele + +Alle Spiele + +Gruppe wechseln + +Inventar + +Beschreibg. + +Zutaten + +Crafting + +Erschaffen + +Nehmen/Ablegen + +Nehmen + +Alles nehmen + +Hälfte nehmen + +Platzieren + +Alles platzieren + +Eins platzieren + +Ablegen + +Alles ablegen + +Eins ablegen + +Tauschen + +Verschieben + +Schnellauswahl leeren + +? + +Auf Facebook teilen + +Filter ändern + +Spielerkarte + +Spielerprofil ansehen + +Freundschaftsanfrage + +Seite runter + +Seite hoch + +Weiter + +Zurück + +Spieler ausschließen + +Färben + +Abbauen + +Füttern + +Zähmen + +Heilen + +Sitz + +Folge mir + +Auswerfen + +Leeren + +Sattel + +Platzieren + +Treffen + +Melken + +Sammeln + +Essen + +Schlafen + +Aufwachen + +Spielen + +Reiten + +Segeln + +Anbauen + +Hochschwimmen + +Öffnen + +Tonhöhe ändern + +Explodieren + +Lesen + +Hängen + +Werfen + +Pflanzen + +Umgraben + +Ernten + +Weiter + +Vollständiges Spiel freischalten + +Spielstand löschen + +Löschen + +Optionen + +Xbox Live Party Einladung + +Freunde einladen + +Annehmen + +Schere + +Level sperren + +Skin auswählen + +Anzünden + +Navigieren + +Vollständiges Spiel installieren + +Testversion installieren + +Installieren + +Neu installieren + +Speicheroptionen + +Kommando ausführen + +Kreativ + +Zutat verschieben + +Brennstoff verschieben + +Beweg-Werkzeug + +Rüstung bewegen + +Waffe bewegen + +Verwenden + +Ziehen + +Loslassen + +Privilegien + +Blocken + +Seite hoch + +Seite runter + +Liebesmodus + +Trinken + +Drehen + +Ausblenden + +Spielstand für Xbox One hochladen + +Alle Slots leeren + +Spielstand für Xbox One hochladen + +OK + +Abbrechen + +Minecraft Store + +Möchtest du dieses Spiel wirklich verlassen und dem neuen beitreten? Dabei gehen nicht gespeicherte Fortschritte verloren. + +Spiel verlassen + +Spiel speichern + +Verlassen ohne Speichern + +Willst du wirklich mit der aktuellen Version dieser Welt alle früheren Speicherdateien für diese Welt überschreiben? + +Möchtest du wirklich ohne Speichern aufhören? Du verlierst dabei alle Fortschritte in dieser Welt! + +Spiel starten + +Wenn du eine Welt im Kreativmodus erstellst, lädst oder speicherst, sind in dieser Welt Erfolge und Bestenlisten-Aktualisierungen deaktiviert, selbst wenn sie später im Überlebensmodus geladen wird. Möchtest du wirklich fortfahren? + +Diese Welt wurde früher im Kreativmodus gespeichert, Erfolge und Bestenlisten-Aktualisierungen sind deaktiviert. Möchtest du wirklich fortfahren? + +Diese Welt wurde im Kreativmodus gespeichert, Erfolge und Bestenlisten-Aktualisierungen sind deaktiviert. + +Wenn du eine Welt mit aktivierten Hostprivilegien erstellst, lädst oder speicherst, sind in diese Welt Erfolge und Bestenlisten-Aktualisierungen deaktiviert, selbst wenn sie später ohne diese Privilegien geladen wird. Möchtest du wirklich fortfahren? + +Datei beschädigt + +Diese Speicherdatei ist ungültig oder beschädigt. Möchtest du sie löschen? + +Möchtest du wirklich zum Hauptmenü zurückkehren und alle Spieler vom Spiel trennen? Dabei gehen nicht gespeicherte Fortschritte verloren. + +Verlassen und speichern + +Verlassen ohne speichern + +Möchtest du das Spiel wirklich verlassen und zum Hauptmenü zurückkehren? Dabei gehen nicht gespeicherte Fortschritte verloren. + +Möchtest du das Spiel wirklich verlassen und zum Hauptmenü zurückkehren? Dabei geht dein Fortschritt verloren! + +Neue Welt erschaffen + +Tutorial spielen + +Tutorial + +Benenne deine Welt + +Gib einen Namen für deine Welt ein. + +Gib den Seed fürs Erstellen deiner Welt ein + +Gespeicherte Welt laden + +Drück START, um dem Spiel beizutreten + +Spiel verlassen + +Es ist ein Fehler aufgetreten. Zurück zum Hauptmenü. + +Fehler beim Herstellen der Verbindung + +Verbindung verloren. + +Die Verbindung zum Server wurde unterbrochen. Zurück zum Hauptmenü. + +Die Verbindung zu Xbox Live wurde unterbrochen. Zurück zum Hauptmenü. + +Die Verbindung zu Xbox Live wurde unterbrochen. + +Die Verbindung zum Server wurde getrennt. + +Du wurdest aus dem Spiel ausgeschlossen. + +Du wurdest wegen Fliegens aus dem Spiel ausgeschlossen. + +Verbindungsversuch dauert zu lange. + +Der Server ist voll. + +Der Host hat das Spiel verlassen. + +Du kannst diesem Spiel nicht beitreten, da du mit niemandem in diesem Spiel befreundet bist. + +Du kannst diesem Spiel nicht beitreten, da du vom Host aus dem Spiel ausgeschlossen wurdest. + +Du kannst diesem Spiel nicht beitreten, da der Spieler, zu dem du zu gelangen versuchst, eine ältere Spielversion verwendet. + +Du kannst diesem Spiel nicht beitreten, da der Spieler, zu dem du zu gelangen versuchst, eine neuere Spielversion verwendet. + +Neue Welt + +Preis freigeschaltet! + +Hurra - du hast ein Spielerbild mit Steve von Minecraft gewonnen! + +Hurra - du hast ein Spielerbild mit einem Creeper gewonnen! + +Hurra – du hast einen Avatar-Gegenstand gewonnen – ein Minecraft: Xbox 360 Edition-T-Shirt! +Geh zur Xbox Steuerung, um es deinem Avatar anzuziehen! + +Hurra – du hast einen Avatar-Gegenstand gewonnen – eine Minecraft: Xbox 360 Edition-Uhr! +Geh zur Xbox Steuerung, um sie deinem Avatar anzulegen! + +Hurra – du hast einen Avatar-Gegenstand gewonnen – eine Creeper-Basecap! +Geh zur Xbox Steuerung, um sie deinem Avatar aufzusetzen! + +Hurra – du hast das Minecraft: Xbox 360 Edition-Design gewonnen! +Geh zur Xbox Steuerung, um dieses Design auszuwählen! + +Vollständiges Spiel freischalten + +Du spielst die Testversion, kannst deinen Spielstand aber nur im vollständigen Spiel speichern. +Möchtest du jetzt das vollständige Spiel freischalten? + +Dies ist die Testversion von Minecraft: Xbox 360 Edition. Würdest du das vollständige Spiel besitzen, hättest du dir gerade einen Erfolg verdient! +Jetzt das vollständige Spiel freischalten? + +Dies ist die Testversion von Minecraft: Xbox 360 Edition. Würdest du das vollständige Spiel besitzen, hättest du dir gerade eine Avatar-Auszeichnung verdient! +Jetzt das vollständige Spiel freischalten? + +Dies ist die Testversion von Minecraft: Xbox 360 Edition. Würdest du das vollständige Spiel besitzen, hättest du dir gerade ein Spielerbild verdient! +Jetzt das vollständige Spiel freischalten? + +Dies ist die Testversion von Minecraft: Xbox 360 Edition. Würdest du das vollständige Spiel besitzen, hättest du dir gerade ein Design verdient! +Jetzt das vollständige Spiel freischalten? + +Dies ist die Testversion von Minecraft: Xbox 360 Edition. Du brauchst das vollständige Spiel, um diese Einladung anzunehmen. +Möchtest du das vollständige Spiel freischalten? + +Gastspieler können das vollständige Spiel nicht freischalten. Melde dich mit einer Xbox Live-Benutzer-ID an. + +Bitte warten + +Keine Ergebnisse + +Filter: + +Freunde + +Meine Punkte + +Insgesamt + +Einträge: + +Rang + +Gamertag + +Vorbereiten fürs Speichern des Levels + +Teile werden vorbereitet ... + +Wird finalisiert ... + +Gelände bauen + +Welt simulieren + +Server initialisieren + +Startbereich generieren + +Startbereich laden + +Nether betreten + +Nether verlassen + +Erneut erscheinen + +Level generieren + +Level laden + +Spieler speichern + +Mit dem Host verbinden + +Gelände herunterladen + +Wechsel in den Offline-Modus. + +Warte bitte, bis der Host das Spiel gespeichert hat. + +Das ENDE betreten + +Das ENDE verlassen + +Seed für den Weltengenerator finden + +Dieses Bett ist belegt. + +Du kannst nur nachts schlafen. + +%s schläft in einem Bett. Um zum Sonnenaufgang vorzuspringen, müssen alle Spieler gleichzeitig in Betten schlafen. + +Dein Bett fehlt oder ist versperrt. + +Du kannst dich jetzt nicht ausruhen, es sind Monster in der Nähe. + +Du schläfst in einem Bett. Um zum Sonnenaufgang zu wechseln, müssen alle Spieler gleichzeitig schlafen. + +Werkzeuge und Waffen + +Waffen + +Nahrung + +Strukturen + +Rüstung + +Mechanismen + +Transport + +Dekorationen + +Blöcke bauen + +Redstone & Transport + +Verschiedenes + +Brauen + +Brauen + +Werkzeuge, Waffen & Rüstungen + +Materialien + +Abgemeldet + +Du bist zum Titelbildschirm zurückgekehrt, weil dein Spielerprofil abgemeldet wurde. + +Schwierigkeit + +Musik + +Sound + +Gamma + +Spielempfindlichkeit + +Menüempfindlichkeit + +Friedlich + +Leicht + +Normal + +Schwierig + +In diesem Modus regeneriert sich deine Gesundheit mit der Zeit, und es gibt keine Gegner in der Welt. + +In diesem Modus erscheinen Gegner in der Umgebung, sie fügen dem Spieler aber weniger Schaden zu als im normalen Modus. + +In diesem Modus erscheinen Gegner in der Umgebung und fügen dem Spieler eine normale Menge Schaden zu. + +In diesem Modus erscheinen Gegner in der Umgebung und fügen dem Spieler eine große Menge Schaden zu. Achte auch auf die Creeper, sie brechen ihren Explosionsangriff nicht ab, wenn du dich von ihnen entfernst! + +Testversion abgelaufen + +Du hast die Testversion von Minecraft: Xbox 360 Edition die maximal erlaubte Zeit lang gespielt! Möchtest du jetzt das vollständige Spiel freischalten, um weiterhin Minecraft spielen zu können? + +Spiel voll + +Fehler beim Spielbeitritt, da keine Plätze mehr frei sind. + +Schildtext eingeben + +Gib eine Textzeile für dein Schild ein. + +Titel eingeben + +Gib einen Titel für deinen Beitrag ein. + +Überschrift eingeben + +Gib eine Überschrift für deinen Beitrag ein. + +Beschreibung eingeben + +Gib eine Beschreibung für deinen Beitrag ein. + +Inventar + +Zutaten + +Braustand + +Truhe + +Verzaubern + +Ofen + +Zutat + +Brennstoff + +Dispenser + +Es stehen derzeit keine entsprechenden Inhalte zum Herunterladen für diesen Titel zur Verfügung. + +%s ist dem Spiel beigetreten. + +%s hat das Spiel verlassen. + +%s wurde aus dem Spiel ausgeschlossen. + +Möchtest du diesen Spielstand wirklich löschen? + +Wird genehmigt ... + +Zensiert + +Jetzt wird gespielt: + +Einstellungen zurücksetzen + +Möchtest du deine Einstellungen wirklich auf die Standardwerte zurücksetzen? + +Ladefehler + +Minecraft: Xbox 360 Edition konnte nicht geladen werden und kann daher nicht fortgesetzt werden. + +Spiel von %s + +Unbekanntes Hostspiel + +Gast abgemeldet + +Ein Gastspieler hat sich abgemeldet, dadurch wurden alle Gastspieler aus dem Spiel entfernt. + +Anmelden + +Du bist derzeit nicht angemeldet. Du musst angemeldet sein, um dieses Spiel zu spielen. Möchtest du dich jetzt anmelden? + +Multiplayer nicht möglich + +Beitritt zum Spiel nicht möglich: Einer oder mehrere Spieler haben keine Multiplayer-Berechtigung für Xbox Live. + +Erstellen des Online-Spiels nicht möglich: Einer oder mehrere Spieler haben keine Multiplayer-Berechtigung für Xbox Live. Deaktiviere die Option "Onlinespiel", um offline zu spielen. + +Du kannst dieser Spielsitzung nicht beitreten, weil deine Rechteeinstellung für Inhalte von Mitgliedern zu streng ist. Ändere diese Einstellung bitte unter den Datenschutz- und Onlineeinstellungen in der Xbox Steuerung, wenn du dieser Sitzung beitreten möchtest. + +Du kannst dieser Spielsitzung nicht beitreten, weil die Rechteeinstellung für Inhalte von Mitgliedern eines deiner lokalen Spieler zu streng ist. + +Du kannst dieser Spielsitzung nicht beitreten, weil die Rechteeinstellung für Inhalte von Mitgliedern eines Spielers in der Sitzung "Nur Freunde" ist und du nicht auf seiner Freundesliste bist. + +Fehler beim Erstellen des Spiels + +Du kannst diese Spielsitzung nicht erstellen, weil die Rechteeinstellung für Inhalte von Mitgliedern eines deiner lokalen Spieler zu streng ist. Entferne die Markierung bei "Online-Spiel", um ein Offline-Spiel zu starten, oder ändere diese Einstellung unter den Datenschutz- und Onlineeinstellungen in der Xbox Steuerung. + +Automatisch ausgewählt + +Kein Paket: Standard-Skins + +Skin-Favoriten + +Gesperrter Level + +Das Spiel, dem du beitrittst, steht auf deiner Liste gesperrter Level. +Wenn du dem Spiel beitrittst, wird der Level von deiner Liste gesperrter Level entfernt. + +Diesen Level sperren? + +Möchtest du diesen Level wirklich deiner Liste gesperrter Level hinzufügen? +Wenn du OK auswählst, verlässt du dieses Spiel. + +Von Liste gesperrter Level entfernen + +Intervall für automatisches Speichern + +Speicherintervall: AUS + +Min + +Kann hier nicht platziert werden! + +Das Platzieren von Lava neben dem Wiedereintrittspunkt ist nicht gestattet, das sonst Spieler beim Wiedereintritt in den Level sofort sterben könnten. + +Dieses Spiel verfügt eine automatische Levelspeicherfunktion. Wenn du das obige Symbol siehst, speichert das Spiel deine Daten. +Bitte schalte deine Xbox 360 Konsole nicht aus, solange dieses Symbol angezeigt wird. + +Oberflächen-Undurchsichtigkeit + +Autospeichern des Levels wird vorbereitet + +Displaygröße + +Displaygröße (geteilter Bildschirm) + +Seed + +Skinpaket freischalten + +Um die ausgewählte Skin zu verwenden, musst du dieses Skinpaket freischalten. +Möchtest du dieses Skinpaket jetzt freischalten? + +Texturpaket freischalten + +Du musst das Texturpaket freischalten, um es für deine Welt zu verwenden. +Möchtest du es jetzt freischalten? + +Texturpaket-Testversion + +Du verwendest nun eine Testversion des Texturpakets. Du kannst diese Welt erst speichern, wenn du die Vollversion freischaltest. +Möchtest du die Vollversion des Texturpakets freischalten? + +Texturpaket nicht verfügbar + +Vollversion freischalten + +Testversion herunterladen + +Vollversion herunterladen + +Diese Welt verwendet ein Mash-up-Paket oder Texturpaket, das dir fehlt! +Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? + +Testversion holen + +Vollständiges Spiel holen + +Spieler ausschließen + +Möchtest du diesen Spieler wirklich aus dem Spiel ausschließen? Er wird bis zum Neustart der Welt dem Spiel nicht mehr beitreten können. + +Spielerbilder-Paket + +Themen + +Skinpaket + +Freunde von Freunden zulassen + +Du kannst diesem Spiel nicht beitreten, da es auf Spieler beschränkt wurde, die mit dem Host befreundet sind. + +Spielbeitritt nicht möglich + +Ausgewählt + +Ausgewählte Skin: + +Inhalte zum Herunterladen def. + +Diese Inhalte zum Herunterladen sind beschädigt und können nicht verwendet werden. Du musst sie löschen und dann vom Menü "Minecraft Store" aus neu installieren. + +Einige deiner Inhalte zum Herunterladen sind beschädigt und können nicht verwendet werden. Du musst sie löschen und dann vom Menü "Minecraft Store" aus neu installieren. + +Dein Spielmodus wurde geändert. + +Welt umbenennen + +Gib den neuen Namen für deine Welt ein. + +Spielmodus: Überleben + +Spielmodus: Kreativ + +Überleben + +Kreativ + +Im Überlebensmodus + +Im Kreativmodus + +Wolken erstellen + +Was möchtest du mit diesem Spielstand tun? + +Spielstand umbenennen + +Automatisches Speichern in %d ... + +Ein + +Aus + +Normal + +Superflach + +Wenn dies aktiviert ist, ist das Spiel online. + +Wenn dies aktiviert ist, können nur eingeladene Spieler beitreten. + +Wenn dies aktiviert ist, können nur Freunde von Leuten auf deiner Freundesliste dem Spiel beitreten. + +Aktiviert, dass Spieler sich gegenseitig Schaden zufügen können. Hat nur Einfluss auf den Überlebensmodus. + +Wenn deaktiviert, können Spieler, die dem Spiel beitreten, nicht bauen oder abbauen, bis sie autorisiert wurden. + +Aktiviert, dass Feuer auf brennbare Blöcke in der Nähe übergreifen kann. + +Aktiviert, dass aktiviertes TNT explodieret. + +Aktiviert, dass der Host das Fliegen nutzen, Erschöpfung deaktivieren und sich selbst im Spielmenü unsichtbar machen kann. Deaktiviert Erfolge und Bestenlisten-Aktualisierungen. + +Sorgt bei Aktivierung dafür, dass der Nether neu erstellt wird. Dies ist nützlich, wenn du einen alten Spielstand hast, der keine Netherfestungen enthält. + +Aktiviert, dass Strukturen wie Dörfer und Festungen in der Welt erstellt werden. + +Aktiviert, dass eine völlig flache Welt in der Oberwelt und im Nether erschaffen wird. + +Aktiviert, dass eine Truhe mit nützlichen Gegenständen in der Nähe des Startpunkts des Spielers erstellt wird. + +Skinpakete + +Themen + +Spielerbilder + +Avatargegenstände + +Texturpakete + +Mash-up-Pakete + +{*PLAYER*} ist in Flammen aufgegangen. + +{*PLAYER*} ist zu Tode verbrannt. + +{*PLAYER*} hat versucht, in Lava zu schwimmen. + +{*PLAYER*} ist in einer Wand erstickt. + +{*PLAYER*} ist ertrunken. + +{*PLAYER*} ist verhungert. + +{*PLAYER*} wurde erstochen. + +{*PLAYER*} ist zu hart auf dem Boden aufgeschlagen. + +{*PLAYER*} ist aus der Welt herausgefallen. + +{*PLAYER*} ist gestorben. + +{*PLAYER*} ist in die Luft gegangen. + +{*PLAYER*} wurde durch Magie getötet. + +{*PLAYER*} wurde durch Enderdrachen-Odem getötet. + +{*PLAYER*} wurde durch {*SOURCE*} getötet. + +{*PLAYER*} wurde durch {*SOURCE*} getötet. + +{*PLAYER*} wurde von {*SOURCE*} erschossen. + +{*PLAYER*} starb durch einen Feuerball von {*SOURCE*}. + +{*PLAYER*} wurde von {*SOURCE*} erschlagen. + +{*PLAYER*} wurde durch {*SOURCE*} getötet. + +Grundgesteinnebel + +Display anzeigen + +Hand anzeigen + +Gamertags auf geteiltem Bildschirm + +Todesmeldungen + +Animierte Spielfigur + +Eigene Skin-Animation + +Du kannst nicht mehr graben und keine Gegenstände mehr verwenden. + +Du kannst jetzt graben und Gegenstände verwenden. + +Du kannst keine Blöcke mehr platzieren. + +Du kannst jetzt Blöcke platzieren. + +Du kannst jetzt Türen und Schalter verwenden. + +Du kannst keine Türen und Schalter mehr verwenden. + +Du kannst jetzt Container (z. B. Truhen) verwenden. + +Du kannst keine Container (z. B. Truhen) mehr verwenden. + +Du kannst keine NPCs mehr angreifen. + +Du kannst jetzt NPCs angreifen. + +Du kannst keine Spieler mehr angreifen. + +Du kannst jetzt Spieler angreifen. + +Du kannst keine Tiere mehr angreifen. + +Du kannst jetzt Tiere angreifen. + +Du bist jetzt ein Moderator. + +Du bist kein Moderator mehr. + +Du kannst jetzt fliegen. + +Du kannst nicht mehr fliegen. + +Du wirst keine Erschöpfung mehr spüren. + +Du wirst jetzt wieder Erschöpfung spüren. + +Du bist jetzt unsichtbar. + +Du bist nicht mehr unsichtbar. + +Du bist jetzt unverwundbar. + +Du bist nicht mehr unverwundbar. + +%d MSP + +Enderdrache + +%s hat das Ende betreten. + +%s hat das Ende verlassen. + + +{*C3*}Ich sehe das spielende Wesen, das du meinst.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Ja. Sei auf der Hut. Es hat eine höhere Stufe erreicht. Es kann unsere Gedanken lesen.{*EF*}{*B*}{*B*} +{*C2*}Das ist gleichgültig. Es denkt, wir gehören zum Spiel.{*EF*}{*B*}{*B*} +{*C3*}Ich mag dieses spielende Wesen. Es hat gut gespielt. Es hat nicht aufgegeben.{*EF*}{*B*}{*B*} +{*C2*}Es liest unsere Gedanken, als wären sie Worte auf einem Bildschirm.{*EF*}{*B*}{*B*} +{*C3*}So stellt es sich vielerlei Dinge vor, wenn es sich tief im Traum eines Spiels befindet.{*EF*}{*B*}{*B*} +{*C2*}Worte sind eine wunderbare Schnittstelle. Äußerst flexibel. Und weniger furchteinflößend, als auf die Realität hinter dem Bildschirm zu starren.{*EF*}{*B*}{*B*} +{*C3*}Früher haben sie Stimmen gehört. Eher die spielenden Wesen lesen konnten. Damals, als jene, die nicht spielten, die spielenden Wesen als Hexen und Hexer beschimpften. Und die spielenden Wesen träumten, sie flögen durch die Luft, auf Stöcken, die von Dämonen angetrieben waren.{*EF*}{*B*}{*B*} +{*C2*}Was hat dieses spielende Wesen geträumt?{*EF*}{*B*}{*B*} +{*C3*}Dieses spielende Wesen hat von Sonnenlicht und Bäumen geträumt. Von Feuer und Wasser. Es hat davon geträumt, etwas zu erschaffen. Und es hat davon geträumt zu zerstören. Es hat davon geträumt zu jagen und gejagt zu werden. Es hat von einem Unterschlupf geträumt.{*EF*}{*B*}{*B*} +{*C2*}Ha, die ursprüngliche Schnittstelle. Eine Million Jahre alt, und doch funktioniert sie immer noch. Aber welche Struktur hat dieses spielende Wesen wirklich geschaffen, in der Realität jenseits des Bildschirms?{*EF*}{*B*}{*B*} +{*C3*}Es hat, zusammen mit Millionen anderen, daran gearbeitet, eine wahre Welt in einer Falte des {*EF*}{*NOISE*}{*C3*} zu bauen und erschuf eine{*EF*}{*NOISE*}{*C3*} für {*EF*}{*NOISE*}{*C3*}, in der {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}Es kann diesen Gedanken nicht lesen.{*EF*}{*B*}{*B*} +{*C3*}Nein. Es hat die höchste Stufe noch nicht erreicht. Diese muss es im langen Traum des Lebens erreichen, nicht im kurzen Traum eines Spiels.{*EF*}{*B*}{*B*} +{*C2*}Weiß es, dass wir es lieben? Dass das Universum gütig ist?{*EF*}{*B*}{*B*} +{*C3*}Manchmal hört es, durch den Lärm seiner Gedanken hindurch, das Universum, ja.{*EF*}{*B*}{*B*} +{*C2*}Aber bisweilen ist es auch traurig, im langen Traum. Es erschafft Welten, in denen es keinen Sommer gibt, und es zittert unter einer schwarzen Sonne. Und es hält seine erbärmliche Schöpfung für die Wirklichkeit.{*EF*}{*B*}{*B*} +{*C3*}Es vom Kummer zu erlösen, würde es zerstören. Der Kummer ist Teil seiner eigenen, ganz privaten Aufgabe. Da können wir uns nicht einmischen.{*EF*}{*B*}{*B*} +{*C2*}Manchmal, wenn sie sich in den Tiefen der Träume befinden, möchte ich ihnen sagen, dass sie echte Welten in der Realität bauen. Manchmal möchte ich ihnen mitteilen, wie wichtig sie dem Universum sind. Manchmal, wenn sie schon eine Weile keine richtige Verbindung mehr aufgebaut haben, möchte ich ihnen helfen, das Wort auszusprechen, das sie fürchten.{*EF*}{*B*}{*B*} +{*C3*}Es liest unsere Gedanken.{*EF*}{*B*}{*B*} +{*C2*}Manchmal ist es mir gleichgültig. Manchmal möchte ich es ihnen sagen: Diese Welt, die ihr für die Wahrheit haltet, ist lediglich {*EF*}{*NOISE*}{*C2*} und {*EF*}{*NOISE*}{*C2*}, ich möchte ihnen sagen, dass sie {*EF*}{*NOISE*}{*C2*} in der {*EF*}{*NOISE*}{*C2*} sind. Sie sehen so wenig von der Realität in ihrem langen Traum.{*EF*}{*B*}{*B*} +{*C3*}Und dennoch spielen sie das Spiel.{*EF*}{*B*}{*B*} +{*C2*}Aber es wäre so leicht, es ihnen zu sagen ...{*EF*}{*B*}{*B*} +{*C3*}Zu stark für diesen Traum. Ihnen zu sagen, wie sie leben sollen, würde sie davon abhalten zu leben.{*EF*}{*B*}{*B*} +{*C2*}Ich werde dem spielenden Wesen nicht sagen, wie es leben soll.{*EF*}{*B*}{*B*} +{*C3*}Das spielende Wesen wird langsam ungeduldig.{*EF*}{*B*}{*B*} +{*C2*}Ich werde dem spielenden Wesen eine Geschichte erzählen.{*EF*}{*B*}{*B*} +{*C3*}Aber nicht die Wahrheit.{*EF*}{*B*}{*B*} +{*C2*}Nein. Eine Geschichte, in der die Wahrheit sicher aufgehoben ist, in einem Käfig aus Worten. Nicht die nackte Wahrheit, die aus beliebiger Entfernung Feuer entzünden kann.{*EF*}{*B*}{*B*} +{*C3*}Ihm einen neuen Körper geben.{*EF*}{*B*}{*B*} +{*C2*}Ja. Spielendes Wesen ...{*EF*}{*B*}{*B*} +{*C3*}Benutze seinen Namen.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Wesen, das Spiele spielt.{*EF*}{*B*}{*B*} +{*C3*}Gut.{*EF*}{*B*}{*B*} + + + +{*C2*}Atme jetzt tief ein. Atme noch einmal ein. Fühle die Luft in deine Lungen strömen. Lass deine Gliedmaßen aufwachen. Ja, bewege die Finger. Erhalte einen Körper zurück, in der Schwerkraft, in der Luft. Erscheine erneut im langen Traum. Da bist du nun. Dein Körper berührt das Universum wieder, an jedem Punkt, als würdet ihr getrennt existieren. Als würden wir getrennt existieren.{*EF*}{*B*}{*B*} +{*C3*}Wer sind wir? Einst nannte man uns den Geist des Berges. Vater Sonne, Mutter Mond. Uralte Geister, Tiergeister. Dschinnen. Gespenster. Grüne Männchen. Dann Götter, Dämonen. Engel. Poltergeister. Aliens, Außerirdische. Leptonen, Quarks. Die Worte ändern sich. Wir ändern uns nicht.{*EF*}{*B*}{*B*} +{*C2*}Wir sind das Universum. Wir sind alles, von dem du denkst, dass es nicht du sei. Du siehst uns jetzt an, durch deine Haut und deine Augen. Und wieso berührt das Universum deine Haut und wirft Licht auf dich? Um dich zu sehen, spielendes Wesen. Um dich zu kennen. Und um selbst gekannt zu werden. Ich werde dir eine Geschichte erzählen.{*EF*}{*B*}{*B*} +{*C2*}Es war einmal ein spielendes Wesen.{*EF*}{*B*}{*B*} +{*C3*}Dieses spielende Wesen warst du, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Manchmal hielt es sich für einen Menschen, auf der dünnen Kruste einer sich drehenden Kugel aus geschmolzenem Gestein. Dieser Globus aus flüssigem Fels drehte sich um einen Ball aus brennendem Gas, der dreihundertdreißigtausendmal so viel Masse besaß wie er selbst. Sie waren so weit voneinander entfernt, dass das Licht acht Minuten benötigte, um die Strecke zurückzulegen. Das Licht war Information von einem Stern, und es konnte deine Haut aus einer Entfernung von hundertfünfzig Millionen Kilometer verbrennen.{*EF*}{*B*}{*B*} +{*C2*}Manchmal träumte das spielende Wesen, es wäre ein Bergarbeiter, auf der Oberfläche einer Welt, die flach und unendlich war. Die Sonne war ein weißes Quadrat. Die Tage waren kurz, es gab viel zu tun, und der Tod war ein vorübergehendes Ärgernis.{*EF*}{*B*}{*B*} +{*C3*}Manchmal träumte das spielende Wesen, es hätte sich in einer Geschichte verirrt.{*EF*}{*B*}{*B*} +{*C2*}Manchmal träumte das spielende Wesen, es wäre etwas anderes, an anderen Orten. Manchmal waren diese Träume beunruhigend. Manchmal wirklich wunderschön. Manchmal erwachte das spielende Wesen aus einem Traum und glitt in einen anderen hinein, und aus diesem in einen dritten.{*EF*}{*B*}{*B*} +{*C3*}Manchmal träumte das spielende Wesen, es würde Worte auf einem Bildschirm betrachten.{*EF*}{*B*}{*B*} +{*C2*}Aber nun zurück.{*EF*}{*B*}{*B*} +{*C2*}Die Atome des spielenden Wesens waren im Gras verstreut, in den Flüssen, in der Luft, im Boden. Eine Frau sammelte die Atome; sie trank und aß und atmete ein; und die Frau setzte das spielende Wesen in ihrem Körper zusammen.{*EF*}{*B*}{*B*} +{*C2*}Und das spielende Wesen erwachte, aus der warmen, dunklen Welt des Körpers seiner Mutter, in den langen Traum hinein.{*EF*}{*B*}{*B*} +{*C2*}Und das spielende Wesen war eine neue Geschichte, die noch nie zuvor erzählt worden war, in den Buchstaben der DNA geschrieben. Und das spielende Wesen war ein neues Programm, das noch nie zuvor ausgeführt worden war, von einem Source-Code erzeugt, der eine Milliarde Jahre alt war. Und das spielende Wesen war ein neuer Mensch, der noch nie lebendig gewesen war, aus nichts als Milch und Liebe erschaffen.{*EF*}{*B*}{*B*} +{*C3*}Du bist das spielende Wesen. Die Geschichte. Das Programm. Der Mensch. Aus nichts als Milch und Liebe erschaffen.{*EF*}{*B*}{*B*} +{*C2*}Gehen wir nun noch weiter zurück.{*EF*}{*B*}{*B*} +{*C2*}Die sieben Milliarden Milliarden Milliarden Atome des Körpers des spielenden Wesens wurden lange vor diesem Spiel im Herzen eines Sterns erschaffen. Also repräsentiert auch das spielende Wesen Information aus einem Stern. Und das spielende Wesen bewegt sich durch eine Geschichte, die einen Wald aus Informationen darstellt, von einem Mann namens Julian gepflanzt, in einer flachen, unendlichen Welt, die von einem Mann namens Markus erschaffen wurde, die wiederum innerhalb einer kleinen, privaten Welt existiert, die vom spielenden Wesen erschaffen wurde, das ein Universum bewohnt, erschaffen von ...{*EF*}{*B*}{*B*} +{*C3*}Pssst. Manchmal erschuf das spielende Wesen eine kleine, private Welt, die weich war, warm und einfach. Manchmal war sie hart und kalt und kompliziert. Manchmal baute es ein Modell des Universums in seinem Kopf; Flecken aus Energie, die sich durch weite, leere Räume bewegen. Manchmal nannte es diese Flecken "Elektronen" und "Protonen".{*EF*}{*B*}{*B*} + + + +{*C2*}Manchmal nannte es sie "Planeten" und "Sterne".{*EF*}{*B*}{*B*} +{*C2*}Manchmal glaubte es, es befände sich in einem Universum, das aus Energie bestand, welche wiederum aus Aus- und An-Zuständen bestand, aus Nullen und Einsen; Programmzeilen. Manchmal glaubte es, dass es ein Spiel spielte. Manchmal glaubte es, dass es Worte auf einem Bildschirm las.{*EF*}{*B*}{*B*} +{*C3*}Du bist das spielende Wesen, das die Worte liest ...{*EF*}{*B*}{*B*} +{*C2*}Pssst ... Manchmal las das spielende Wesen Programmzeilen auf einem Bildschirm. Entschlüsselte sie, um Worte zu erhalten; entschlüsselte die Worte, um deren Bedeutung zu erfahren; entschlüsselte die Bedeutung, und gewann daraus Gefühle, Emotionen, Theorien, Ideen. Und das spielende Wesen begann schneller zu atmen, tiefer zu atmen, und es erkannte, dass es am Leben war. Jene tausend Tode waren nicht reell gewesen, das spielende Wesen lebte.{*EF*}{*B*}{*B*} +{*C3*}Du. Du. Du lebst.{*EF*}{*B*}{*B*} +{*C2*}Und manchmal glaubte das spielende Wesen, das Universum habe durch das Sonnenlicht, das durch die raschelnden Blätter der sommerlichen Bäume drang, zu ihm gesprochen.{*EF*}{*B*}{*B*} +{*C3*}Und manchmal glaubte das spielende Wesen, das Universum habe durch das Licht, welches aus dem klaren Nachthimmel des Winters herabschien, zu ihm gesprochen, wo ein Lichtfleck, den das spielende Wesen aus dem Augenwinkel erhaschte, ein Stern sein könnte, dessen Masse die der Sonne um ein Millionenfaches übertrifft und der seine Planeten zu Plasma zerkocht, um für einen kurzen Moment vom spielenden Wesen wahrgenommen zu werden, das am anderen Ende des Universums nach Hause geht, plötzlich Essen riecht, kurz vor der vertrauten Tür, hinter der es bald wieder träumen wird.{*EF*}{*B*}{*B*} +{*C2*}Und manchmal glaubte das spielende Wesen, das Universum habe durch die Nullen und Einsen, durch die Elektrizität der Welt, durch die über den Bildschirm huschenden Worte am Ende eines Traumes zu ihm gesprochen.{*EF*}{*B*}{*B*} +{*C3*}Und das Universum sprach: Ich liebe dich.{*EF*}{*B*}{*B*} +{*C2*}Und das Universum sprach: Du hast gut gespielt.{*EF*}{*B*}{*B*} +{*C3*}Und das Universum sprach: Alles, was du brauchst, befindet sich in deinem Innern.{*EF*}{*B*}{*B*} +{*C2*}Und das Universum sprach: Du bist stärker, als du denkst.{*EF*}{*B*}{*B*} +{*C3*}Und das Universum sprach: Du bist das Tageslicht.{*EF*}{*B*}{*B*} +{*C2*}Und das Universum sprach: Du bist die Nacht.{*EF*}{*B*}{*B*} +{*C3*}Und das Universum sprach: Die Finsternis, gegen die du kämpfst, befindet sich in deinem Innern.{*EF*}{*B*}{*B*} +{*C2*}Und das Universum sprach: Das Licht, nach dem du trachtest, befindet sich in deinem Innern.{*EF*}{*B*}{*B*} +{*C3*}Und das Universum sprach: Du bist nicht allein.{*EF*}{*B*}{*B*} +{*C2*}Und das Universum sprach: Du existierst nicht getrennt von allem anderen.{*EF*}{*B*}{*B*} +{*C3*}Und das Universum sprach: Du bist das Universum, das von sich selbst kostet, das mit sich selbst spricht und seinen eigenen Code liest.{*EF*}{*B*}{*B*} +{*C2*}Und das Universum sprach: Ich liebe dich, denn du bist die Liebe.{*EF*}{*B*}{*B*} +{*C3*}Und das Spiel war vorbei und das spielende Wesen erwachte aus dem Traum. Und das spielende Wesen begann einen neuen Traum. Und das spielende Wesen träumte wieder, träumte besser. Und das spielende Wesen war das Universum. Und das spielende Wesen war Liebe.{*EF*}{*B*}{*B*} +{*C3*}Du bist das spielende Wesen.{*EF*}{*B*}{*B*} +{*C2*}Wach auf.{*EF*} + + +Nether zurücksetzen + +Möchtest du wirklich den Nether in diesem Spielstand auf den ursprünglichen Zustand zurücksetzen? Alles, was du im Nether gebaut hast, geht verloren! + +Nether zurücksetzen + +Nether nicht zurücksetzen + +Pilzkuh kann momentan nicht geschoren werden. Die Höchstanzahl von Schweinen, Schafen, Kühen und Katzen wurde erreicht. + +Eintrittsei kann momentan nicht verwendet werden. Die Höchstanzahl von Schweinen, Schafen, Kühen und Katzen wurde erreicht. + +Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Pilzkühen wurde erreicht. + +Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Wölfen in einer Welt wurde erreicht. + +Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Hühnern in einer Welt wurde erreicht. + +Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Tintenfischen in einer Welt wurde erreicht. + +Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Feinden in einer Welt wurde erreicht. + +Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Dorfbewohnern in einer Welt wurde erreicht. + +Die Höchstanzahl von Gemälden/Gegenstandsrahmen in einer Welt wurde erreicht. + +Im friedlichen Modus kannst du keine Feinde erscheinen lassen. + +Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Schweine, Schafe, Kühe und Katzen wurde erreicht. + +Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Wölfe wurde erreicht. + +Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Hühner wurde erreicht. + +Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Pilzkühe wurde erreicht. + +Die Höchstanzahl von Booten in einer Welt wurde erreicht. + +Die Höchstanzahl von NPC-Köpfen in einer Welt wurde erreicht. + +Sicht umkehren + +Linkshänder + +Gestorben! + +Wieder erscheinen + +Inhalte zum Herunterladen + +Skin ändern + +So wird gespielt + +Steuerung + +Einstellungen + +Mitwirkende + +Inhalte neu installieren + +Debug-Einstellungen + +Feuer breitet sich aus + +TNT explodiert + +Spieler gegen Spieler + +Spielern vertrauen + +Hostprivilegien + +Strukturen erzeugen + +Superflache Welt + +Bonustruhe + +Weltoptionen + +Kann bauen und abbauen + +Kann Türen und Schalter verwenden + +Kann Container öffnen + +Kann Spieler angreifen + +Kann Tiere angreifen + +Moderator + +Spieler ausschließen + +Kann fliegen + +Erschöpfung deaktivieren + +Unsichtbar + +Hostoptionen + +Spieler/Einladen + +Onlinespiel + +Nur mit Einladung + +Weitere Optionen + +Laden + +Neue Welt + +Weltname + +Seed für den Weltengenerator + +Freilassen für zufälligen Seed + +Spieler + +Spiel beitreten + +Spiel starten + +Keine Spiele gefunden + +Spielen + +Bestenlisten + +Erfolge + +Hilfe & Optionen + +Vollständiges Spiel freischalten + +Spiel fortsetzen + +Spiel speichern + +Schwierigkeit: + +Spieltyp: + +Gamertags: + +Strukturen: + +Leveltyp: + +PvP: + +Spielern vertrauen: + +TNT: + +Feuer breitet sich aus: + +Design neu installieren + +Spielerbild 1 neu installieren + +Spielerbild 2 neu installieren + +Avatar-Gegenstand 1 neu installieren + +Avatar-Gegenstand 2 neu installieren + +Avatar-Gegenstand 3 neu installieren + +Optionen + +Audio + +Steuerung + +Grafik + +Benutzeroberfläche + +Standardeinstellungen + +Kamerabewegung ansehen + +Tipps + +Spiel-QuickInfos + +Gamertags im Spiel + +2 Spieler auf geteiltem Bildschirm vertikal + +Fertig + +Schildnachricht ändern: + +Gib erklärende Texte zu deinem Screenshot ein. + +Überschrift + +Screenshot aus dem Spiel + +Schildnachricht ändern: + +Schau mal, was ich in Minecraft: Xbox 360 Edition erschaffen habe! + +Die klassischen Texturen, Symbole und Benutzeroberfläche aus Minecraft! + +Alle Mash-up-Welten zeigen + +Spielstandtransferslot auswählen + +Slot leeren + +Spielstand-Metadaten hochladen + +Spielstand hochladen + +Spielstand für Xbox One hochladen + +Upload abgebrochen + +Du hast den Upload dieses Spielstands in den Transferslot abgebrochen. + +Keine Effekte + +Geschwindigkeit + +Langsamkeit + +Grabeile + +Grabmüdigkeit + +Stärke + +Schwäche + +Sofortgesundheit + +Sofortschaden + +Sprungverstärkung + +Verwirrtheit + +Regeneration + +Widerstand + +Feuerwiderstand + +Wasseratmung + +Unsichtbarkeit + +Blindheit + +Nachtsicht + +Hunger + +Gift + +der Geschwindigkeit + +der Langsamkeit + +der Grabeile + +der Langsamkeit + +der Stärke + +der Schwäche + +der Heilung + +des Schadens + +der Sprungverstärkung + +der Verwirrtheit + +der Regeneration + +des Widerstands + +des Feuerwiderstands + +der Wasseratmung + +der Unsichtbarkeit + +der Blindheit + +der Nachtsicht + +des Hungers + +des Gifts + + + +II + +III + +IV + +Wurf- + +Mondäner + +Uninteressanter + +Fader + +Farbloser + +Milchiger + +Diffuser + +Schlichter + +Dünner + +Seltsamer + +Flacher + +Bauchiger + +Gepfuschter + +Gebutterter + +Glatter + +Sanfter + +Gefälliger + +Dicker + +Eleganter + +Aparter + +Charmanter + +Schneidiger + +Veredelter + +Belebender + +Prickelnder + +Potenter + +Fauler + +Geruchloser + +Kräftiger + +Harscher + +Beißender + +Ekliger + +Stinkender + +Dient als Basis für alle Tränke. Wird in einem Braustand verwendet, um Tränke zu brauen. + +Hat keinen Effekt. Kann in einem Braustand verwendet werden, um durch Zugabe weiterer Zutaten Tränke zu brauen. + +Vergrößert die Bewegungsgeschwindigkeit betroffener Spieler, Tiere und Monster sowie die Sprintgeschwindigkeit, die Sprungweite und das Gesichtsfeld von Spielern. + +Verkleinert die Bewegungsgeschwindigkeit betroffener Spieler, Tiere und Monster sowie die Sprintgeschwindigkeit, die Sprungweite und das Gesichtsfeld von Spielern. + +Vergrößert den Schaden, den betroffene Spieler und Monster beim Angreifen anrichten. + +Verringert den Schaden, den betroffene Spieler und Monster beim Angreifen anrichten. + +Verbessert sofort die Gesundheit betroffener Spieler, Tiere und Monster. + +Verschlechtert sofort die Gesundheit betroffener Spieler, Tiere und Monster. + +Stellt mit der Zeit die Gesundheit von betroffenen Spielern, Tieren und Monstern wieder her. + +Macht die betroffenen Spieler, Tiere und Monster immun gegen Schaden durch Feuer, Lava und Fernangriffe von Lohen. + +Verringert mit der Zeit die Gesundheit von betroffenen Spielern, Tieren und Monstern. + +Schärfe + +Bann + +Nemesis der Gliederfüßer + +Rückstoß + +Verbrennung + +Schutz + +Feuerschutz + +Federfall + +Explosionsschutz + +Schusssicher + +Atmung + +Wasseraffinität + +Effizienz + +Behutsamkeit + +Haltbarkeit + +Plünderung + +Glück + +Stärke + +Feuer + +Schlag + +Unendlichkeit + +I + +II + +III + +IV + +V + +VI + +VII + +VIII + +IX + +X + +Muss mit mindestens einer Eisenspitzhacke abgebaut werden, um Smaragde zu erhalten. + +Ähnlich wie eine Truhe, doch Gegenstände, die in eine Endertruhe gelegt werden, sind in jeder Endertruhe des Spielers verfügbar, auch in anderen Dimensionen. + +Wird aktiviert, wenn etwas oder jemand einen verbundenen Stolperdraht durchquert. + +Aktiviert einen verbundenen Stolperdrahthaken, wenn etwas oder jemand ihn durchquert. + +Eine kompakte Lagermöglichkeit für Smaragde. + +Eine Mauer aus Pflasterstein. + +Damit kann man Waffen, Werkzeuge und Rüstungen reparieren. + +Kann in einem Ofen geschmolzen werden, um Netherquarz herzustellen. + +Wird als Dekoration verwendet. + +Kann mit Dorfbewohnern gehandelt werden. + +Wird als Dekoration verwendet. Blumen, Setzlinge, Kakteen und Pilze können darin eingepflanzt werden. + +Regeneriert 2{*ICON_SHANK_01*} und kann zu einer goldenen Karotte verarbeitet werden. Kann auf Ackerland gepflanzt werden. + +Regeneriert 0,5{*ICON_SHANK_01*}. Kann in einem Ofen gebraten oder auf Ackerland gepflanzt werden. + +Regeneriert 3{*ICON_SHANK_01*}. Entsteht, wenn man eine Kartoffel im Ofen brät. + +Regeneriert 1{*ICON_SHANK_01*}, doch du kannst dich damit vergiften. Kann in einem Ofen gebraten oder auf Ackerland gepflanzt werden. + +Regeneriert 3{*ICON_SHANK_01*}. Wird aus einer Karotte und Goldnuggets hergestellt. + +Hiermit steuerst du beim Reiten auf einem gesattelten Schwein. + +Regeneriert 4{*ICON_SHANK_01*}. + +Hiermit kannst du auf einem Amboss Waffen, Werkzeuge und Rüstungen verzaubern. + +Kann von Netherquarzerz abgebaut und zu Quarzblöcken verarbeitet werden. + +Wird aus Wolle hergestellt und als Dekoration verwendet. + +Smaragd + +Blumentopf + +Karotte + +Kartoffel + +Ofenkartoffel + +Giftige Kartoffel + +Goldene Karotte + +Karottenangel + +Kürbiskuchen + +Zauberbuch + +Netherquarz + +Smaragderz + +Endertruhe + +Stolperdrahthaken + +Stolperdraht + +Smaragdblock + +Pflastersteinmauer + +Bemooste Pflastersteinmauer + +Blumentopf + +Karotten + +Kartoffeln + +Amboss + +Amboss + +Leicht beschädigter Amboss + +Schwer beschädigter Amboss + +Netherquarzerz + +Quarzblock + +Gemeißelter Quarzblock + +Säulen-Quarzblock + +Quarztreppe + +Teppich + +Schwarzer Teppich + +Roter Teppich + +Grüner Teppich + +Brauner Teppich + +Blauer Teppich + +Lila Teppich + +Cyanfarbener Teppich + +Hellgrauer Teppich + +Grauer Teppich + +Rosa Teppich + +Hellgrüner Teppich + +Gelber Teppich + +Hellblauer Teppich + +Magentafarbener Teppich + +Oranger Teppich + +Weißer Teppich + +Gemeißelter Sandstein + +Glatter Sandstein + +{*PLAYER*} wurde beim Versuch, {*SOURCE*} zu verletzen, getötet. + +{*PLAYER*} wurde von einem fallenden Amboss erschlagen. + +{*PLAYER*} wurde von einem fallenden Block erschlagen. + +{*PLAYER*} zu {*DESTINATION*} teleportiert. + +{*PLAYER*} hat dich zu sich teleportiert. + +{*PLAYER*} ist zu dir teleportiert. + +Dornen + +Quarzstufe + +Lässt dunkle Stellen taghell erscheinen, auch unter Wasser. + +Macht betroffene Spieler, Tiere und Monster unsichtbar. + +Reparieren & benennen + +Verzauberungskosten: %d + +Zu teuer! + +Umbenennen + +Du hast: + +Benötigte Handelsgüter + +{*VILLAGER_TYPE*} bietet: %s + +Reparieren + +Handeln + +Halsband einfärben + + + Dies ist das Ambossmenü, über das du Waffen, Rüstungen und Werkzeuge für Erfahrungspunkte umbenennen, reparieren und verzaubern kannst. + + + + {*B*} + Drücke {*CONTROLLER_VK_A*}, wenn du mehr über das Ambossmenü erfahren möchtest. {*B*} + Drücke {*CONTROLLER_VK_B*}, wenn du schon alles über das Ambossmenü weißt. + + + + Lege einen Gegenstand in den ersten Eingabeplatz, um ihn zu bearbeiten. + + + + Wenn das richtige Rohmaterial in den zweiten Eingabeplatz gelegt wird (z. B. Eisenbarren für ein Eisenschwert), erscheint die vorgeschlagene Reparatur im Ausgabeplatz. + + + + Stattdessen kannst du auch einen identischen Gegenstand in den zweiten Eingabeplatz legen, um beide Gegenstände zu kombinieren. + + + + Um Gegenstände auf dem Amboss zu verzaubern, legst du ein Zauberbuch in den zweiten Eingabeplatz. + + + + Unter der Ausgabe siehst du, wie viele Erfahrungslevel der Vorgang kostet. Wenn du nicht genug davon hast, ist die Reparatur nicht möglich. + + + + Ändere den Namen im Textfeld, um den Gegenstand, den du bearbeitest, umzubenennen. + + + + Wenn du den reparierten Gegenstand aufhebst, werden beide Gegenstände vom Amboss verbraucht und dein Erfahrungslevel sinkt um den angegebenen Wert. + + + + Hier sind ein Amboss und eine Truhe mit Werkzeugen und Waffen zur Bearbeitung. + + + + {*B*} + Drücke {*CONTROLLER_VK_A*}, wenn du mehr über den Amboss erfahren möchtest. {*B*} + Drücke {*CONTROLLER_VK_B*}, wenn du schon alles über den Amboss weißt. + + + + Auf einem Amboss können Waffen und Werkzeuge repariert und so wieder haltbar gemacht, umbenannt oder mithilfe von Zauberbüchern verzaubert werden. + + + + Zauberbücher findest du in Truhen in Dungeons. Du kannst auch normale Bücher auf dem Zaubertisch verzaubern. + + + + Die Nutzung des Ambosses kostet Erfahrungslevel. Bei jeder Nutzung besteht das Risiko, dass der Amboss beschädigt wird. + + + + Die Kosten der Reparatur hängen von der Art der Bearbeitung, dem Wert des Gegenstands, der Anzahl an Verzauberungen und der Anzahl an vorherigen Bearbeitungen ab. + + + + Wenn du einen Gegenstand umbenennst, wird der neue Name allen Spielern angezeigt und die Kosten für vorherige Bearbeitungen sinken dauerhaft. + + + + In dieser Truhe findest du beschädigte Spitzhacken, Rohmaterialien, Erfahrungsfläschchen und Zauberbücher, mit denen du experimentieren kannst. + + + + Dies ist das Handelsmenü, wo du siehst, was mit einem Dorfbewohner gehandelt werden kann. + + + + {*B*} + Drücke {*CONTROLLER_VK_A*}, wenn du mehr über das Handelsmenü erfahren möchtest. {*B*} + Drücke {*CONTROLLER_VK_B*}, wenn du schon alles über das Handelsmenü weißt. + + + + Alle Handel, auf die sich der Dorfbewohner momentan einlässt, werden oben angezeigt. + + + + Wenn du die benötigten Gegenstände nicht hast, sind die Handel rot markiert und nicht verfügbar. + + + + In den zwei Kästen links siehst du, wie viele und welche Gegenstände du dem Dorfbewohner anbietest. + + + + In den zwei Kästen links siehst du, wie viele der Gegenstände für den Handel benötigt werden. + + + + Drücke {*CONTROLLER_VK_A*}, um die benötigten Gegenstände mit dem Dorfbewohner zu tauschen. + + + + Hier sind ein Dorfbewohner und eine Truhe mit Papier zum Kauf von Gegenständen. + + + + {*B*} + Drücke {*CONTROLLER_VK_A*}, um mehr über das Handeln zu erfahren.{*B*} + Drücke {*CONTROLLER_VK_B*}, wenn du bereits alles über das Handeln weißt. + + + + Spieler können Gegenstände aus ihrem Inventar mit Dorfbewohnern handeln. + + + + Mit welchen Gegenständen ein Dorfbewohner handelt, hängt wahrscheinlich von seinem Beruf ab. + + + + Wenn du mit verschiedenen Dingen handelst, ändern oder erweitern sich zufällig die verfügbaren Handelsangebote des Dorfbewohners. + + + + Zu oft genutzte Angebote werden mitunter vorübergehend ausgesetzt, doch der Dorfbewohner hat stets mindestens einen Handel, auf den er sich einlässt. + + + + Nimm etwas Papier aus der Truhe und handle mit dem Dorfbewohner. + + + + Hier sind zwei Endertruhen. + + + + {*B*} + Drücke {*CONTROLLER_VK_A*}, um mehr über Endertruhen zu erfahren.{*B*} + Drücke {*CONTROLLER_VK_B*}, wenn du bereits alles über Endertruhen weißt. + + + + Alle Endertruhen in einer Welt sind verknüpft, sodass Gegenstände, die in eine Endertruhe gelegt werden, in jeder anderen verfügbar werden. + + + + Allerdings sind die Inhalte der Endertruhen für jeden Spieler unterschiedlich. + + + + So können Spieler Gegenstände in eine beliebige Endertruhe legen und aus einer anderen Endertruhe irgendwo auf der Welt herausnehmen. Versuche dies jetzt, indem du einen Gegenstand in eine der beiden Endertruhen legst. + + +Regeneriert 2{*ICON_SHANK_01*}, regeneriert 30 Sekunden lang Gesundheit und gewährt 5 Minuten lang Widerstand gegen Feuer und Schaden. Wird aus einem Apfel und Goldblöcken hergestellt. + +Kann teleportieren + +Teleportieren + +Zu Spieler teleportieren + +Zu mir teleportieren + +Kann Erschöpfung deaktivieren + +Kann unsichtbar werden + +Du kannst jetzt Unsichtbarkeit aktivieren. + +Du kannst nicht länger Unsichtbarkeit aktivieren. + +Du kannst jetzt das Fliegen aktivieren. + +Du kannst nicht länger das Fliegen aktivieren. + +Du kannst jetzt Erschöpfung deaktivieren. + +Du kannst nicht länger Erschöpfung deaktivieren. + +Du kannst jetzt teleportieren. + +Du kannst nicht mehr teleportieren. + +{*T3*}SO WIRD GESPIELT: AMBOSS{*ETW*}{*B*}{*B*} +Erfahrungslevel können auch dafür genutzt werden, Gegenstände auf dem Amboss zu reparieren, verzaubern oder umzubenennen.{*B*} +Jeder Gegenstand kann umbenannt werden, doch nur haltbare Gegenstände können repariert oder mithilfe von Zauberbüchern verzaubert werden.{*B*} +Lege den Gegenstand, der repariert werden soll, in einen der Eingabeplätze links und füge entweder Rohmaterialien des Gegenstands, zum Beispiel Eisenbarren für ein Eisenschwert, oder einen Gegenstand desselben Typs hinzu.{*B*} +Gegenstände können auf einem Amboss effizienter kombiniert werden, und falls einer der Gegenstände verzaubert ist, erbt der kombinierte Gegenstand mitunter Verzauberungen von beiden Ursprungsgegenständen.{*B*} +Wenn Gegenstände auf einem Amboss mit passenden Zauberbüchern kombiniert werden, werden sie verzaubert. Zauberbücher findest du in Truhen in Dungeons, du kannst aber auch normale Bücher auf dem Zaubertisch verzaubern.{*B*} +Bei jeder Nutzung des Ambosses besteht die Gefahr, dass er beschädigt wird. Ist er zu stark beschädigt, geht er kaputt.{*B*} + + +{*T3*}SO WIRD GESPIELT: HANDEL{*ETW*}{*B*}{*B*} +Du kannst Gegenstände mit Dorfbewohnern handeln. Jeder Dorfbewohner hat einen Beruf. Es gibt Farmer, Metzger, Schmiede, Bibliothekare und Priester. Je nach Beruf handeln sie mit verschiedenen Gegenständen.{*B*} +Im Handelsmenü findest du eine Liste mit allen Handelsangeboten eines Dorfbewohners. Eventuell verändern oder erweitern Dorfbewohner beim Handeln ihr Angebot, doch wird ein Angebot zu häufig genutzt, so kann es vorübergehend ausgesetzt werden.{*B*} +Beim Handeln werden üblicherweise diverse Gegenstände für Smaragde ge- oder verkauft.{*B*} +Falls du die Gegenstände nicht besitzt, die für einen Handel benötigt werden, werden die Gegenstände rot markiert.{*B*} + + +{*T3*}SO WIRD GESPIELT: ENDERTRUHE{*ETW*}{*B*}{*B*} +Alle Endertruhen in einer Welt sind verknüpft, sodass Gegenstände, die in eine Endertruhe gelegt werden, in jeder anderen verfügbar werden. Allerdings sind die Inhalte der Endertruhen für jeden Spieler unterschiedlich; so können Spieler Gegenstände in jeder beliebigen Endertruhe verstauen und sie aus anderen Endertruhen in der Welt wieder entnehmen. + + +Farmer + +Bibliothekar + +Priester + +Schmied + +Metzger + +In Dörfern zu finden. Dorfbewohner verkaufen je nach Beruf verschiedene Gegenstände. + +Große Truhe + + + Du kannst auf dem Zaubertisch auch Zauberbücher herstellen, mit denen du später auf dem Amboss Gegenstände verzaubern kannst. + + + + Während sie von etwas ausgelöst werden, versorgen Stolperdrahthaken Kreisläufe mit Strom. + + + + Ein gezähmter Wolf trägt stets sein Halsband. Du kannst das Halsband beliebig einfärben. + + +Karotten und Kartoffeln müssen angebaut werden. Wenn das Gemüse an die Oberfläche dringt, ist es erntereif. + + + Du kannst Schweine auch satteln und reiten. Verwende eine Karottenangel, um sie in die gewünschte Richtung zu locken. + + + + Mit {*CONTROLLER_ACTION_MOVE*} kannst du deine Lore falls nötig langsam weiterbewegen. Das hilft beim Starten einer Lore, indem sie auf eine Booster-Schiene bewegt wird. + + +Du kannst diesem Spiel nicht beitreten, da Spielen mit geteiltem Bildschirm nur im HD-Modus unterstützt wird. Alle anderen Spieler müssen sich abmelden, wenn du beitreten möchtest. + +Heilen + +Xbox 360 + +Back + +Diese Option deaktiviert für diese Welt Erfolge und Bestenlisten-Aktualisierungen während des Spielens und wenn nach dem Speichern mit aktivierter Option erneut geladen wird. + +Spielstand für Xbox One hochladen + +Spielstand hochladen + +Nur ein Spielstand der Xbox 360 Konsole kann jeweils im Spielstandtransferslot gespeichert werden. Bitte vergewissere dich, dass du den Spielstand auf deine Xbox One Konsole heruntergeladen hast, bevor du einen weiteren Spielstand hochlädst. + +Hochladen ... + +Upload abgeschlossen! + +Fehler beim Upload. Bitte versuche es später erneut. + + diff --git a/Minecraft.Client/Common/Media/en-EN.lang b/Minecraft.Client/Common/Media/en-EN.lang new file mode 100644 index 00000000..a51600cb --- /dev/null +++ b/Minecraft.Client/Common/Media/en-EN.lang @@ -0,0 +1,5772 @@ + + + + + New Downloadable Content is available! Access it from the Minecraft Store button on the Main Menu. + + + You can change the look of your character with a Skin Pack from the Minecraft Store. Select 'Minecraft Store' on the Main Menu to see what's available. + + + + If you play this game in High Definition mode, you can have up to four players in split-screen on the same console! + + + Connect extra controllers to your console and press START on them to join a game at any point. + + + Alter the gamma settings to make the game brighter or darker. + + + If you set the game difficulty to Peaceful, your health will automatically regenerate, and no monsters will come out at night! + + + Feed a bone to a wolf to tame it. You can then make it sit or follow you. + + + You can drop items when in the Inventory menu by moving the cursor off the menu and pressing{*CONTROLLER_VK_A*} + + + Sleeping in a bed at night will fast forward the game to dawn, but all players in a multiplayer game need to sleep in beds at the same time. + + + Harvest pork chops from pigs, and cook and eat them to regain health. + + + Harvest leather from cows, and use it to make armor. + + + If you have an empty bucket, you can fill it with milk from a cow, or water, or lava! + + + Use a hoe to prepare areas of ground for planting. + + + Spiders won't attack you during the day - unless you attack them. + + + Digging soil or sand with a spade is faster than with your hand! + + + Eating cooked pork chops gives more health than eating raw pork chops. + + + Make some torches to light up areas at night. Monsters will avoid the areas around these torches. + + + Get to destinations faster with a minecart and rail! + + + Plant some saplings and they'll grow into trees. + + + Pigmen won't attack you, unless you attack them. + + + You can change your game spawn point and skip to dawn by sleeping in a bed. + + + Hit those fireballs back at the Ghast! + + + Building a portal will allow you to travel to another dimension - The Nether. + + + Press{*CONTROLLER_VK_B*} to drop the item currently in your hand! + + + Use the right tool for the job! + + + If you can't find any coal for your torches, you can always make charcoal from trees in a furnace. + + + Digging straight down or straight up is not a great idea. + + + Bonemeal (crafted from a Skeleton bone) can be used as a fertilizer, and can make things grow instantly! + + + Creepers explode when they get close to you! + + + Obsidian is created when water hits a lava source block. + + + Lava can take minutes to disappear COMPLETELY when the source block is removed. + + + Cobblestone is resistant to Ghast fireballs, making it useful for guarding portals. + + + Blocks that can be used as a light source will melt snow and ice. This includes torches, glowstone, and Jack-O-Lanterns. + + + Take caution when building structures made of wool in open air, as lightning from thunderstorms can set wool on fire. + + + A single bucket of lava can be used in a furnace to smelt 100 blocks. + + + The instrument played by a note block depends on the material beneath it. + + + Zombies and Skeletons can survive daylight if they are in water. + + + Attacking a wolf will cause any wolves in the immediate vicinity to turn hostile and attack you. This trait is also shared by Zombie Pigmen. + + + Wolves cannot enter the Nether. + + + Wolves won't attack Creepers. + + + Chickens lay an egg every 5 to 10 minutes. + + + Obsidian can only be mined with a diamond pickaxe. + + + Creepers are the easiest obtainable source of gunpowder. + + + Placing two chests side by side will make one large chest. + + + Tame wolves show their health with the position of their tail. Feed them meat to heal them. + + + Cook cactus in a furnace to get green dye. + + + You'll get the latest info on this game from 4J Studios and Kappische on twitter! + + + Impress your friends by posting screenshots of your Minecraft creations to Facebook from the in-game Pause menu! + + + Read the What's New section in the How To Play menus to see the latest update information about the game. + + + Stackable fences are in the game now! + + + minecraftforum has a section dedicated to the Xbox 360 Edition. + + + Some animals will follow you if you have wheat in your hand. + + + If an animal can't move more than 20 blocks in any direction, it won't despawn. + + + + Music by C418! + + + Notch has over a million followers on twitter! + + + Not all Swedish people have blonde hair. Some, like Jens from Mojang, even have ginger hair! + + + We think 4J Studios has removed Herobrine from the Xbox 360 console game, but we're not too sure. + + + There will be an update to this game eventually! + + + Who is Notch? + + + Mojang has more awards than staff! + + + Some famous people play Minecraft! + + + deadmau5 likes Minecraft! + + + Do not look directly at the bugs. + + + Creepers were born from a coding bug. + + + Is it a chicken or is it a duck? + + + Were you at Minecon? + + + No-one at Mojang has ever seen junkboy's face. + + + Did you know there's a Minecraft Wiki? + + + Mojang's new office is cool! + + + Minecraft: Xbox 360 Edition broke lots of records! + + + Minecon 2013 is in Orlando, Florida, USA! + + + .party() was excellent! + + + Always assume rumors are false, rather than assuming they're true! + + + + {*T3*}HOW TO PLAY : BASICS{*ETW*}{*B*}{*B*} +Minecraft is a game about placing blocks to build anything you can imagine. At night monsters come out, make sure to build a shelter before that happens.{*B*}{*B*} +Use{*CONTROLLER_ACTION_LOOK*} to look around.{*B*}{*B*} +Use{*CONTROLLER_ACTION_MOVE*} to move around.{*B*}{*B*} +Press{*CONTROLLER_ACTION_JUMP*} to jump.{*B*}{*B*} +Push{*CONTROLLER_ACTION_MOVE*} forward twice in rapid succession to sprint. While you hold {*CONTROLLER_ACTION_MOVE*} forward, the character will continue to sprint unless they run out of sprint time or the Food Bar has less than{*ICON_SHANK_03*}.{*B*}{*B*} +Hold{*CONTROLLER_ACTION_ACTION*} to mine and chop using your hand or whatever you are holding. You may need to craft a tool to mine some blocks.{*B*}{*B*} +If you are holding an item in your hand, use{*CONTROLLER_ACTION_USE*} to use that item, or press{*CONTROLLER_ACTION_DROP*} to drop that item. + + + {*T3*}HOW TO PLAY : HUD{*ETW*}{*B*}{*B*} +The HUD shows information about your status; your health, your remaining oxygen when you are under water, your hunger level (you need to eat to replenish this), and your armor if you are wearing any. +If you lose some health, but have a food bar with 9 or more{*ICON_SHANK_01*} in it, your health will automatically replenish. Eating food will replenish your food bar.{*B*} +The Experience Bar is also shown here, with a numeric value to show your Experience Level, and the bar indicating how many Experience Points are required to increase your Experience Level. +Experience Points are gained by collecting the Experience Orbs dropped by mobs when they die, mining certain block types, breeding animals, fishing, and smelting ores in a furnace.{*B*}{*B*} +It also shows the items that are available to use. Use{*CONTROLLER_ACTION_LEFT_SCROLL*} and{*CONTROLLER_ACTION_RIGHT_SCROLL*} to change the item in your hand. + + + {*T3*}HOW TO PLAY : INVENTORY{*ETW*}{*B*}{*B*} +Use{*CONTROLLER_ACTION_INVENTORY*} to view your inventory.{*B*}{*B*} +This screen shows items available for use in your hand, and all the other items that you are carrying. Your armor is also shown here.{*B*}{*B*} +Use{*CONTROLLER_MENU_NAVIGATE*} to move the pointer. Use{*CONTROLLER_VK_A*} to pick an item under the pointer. If there is more than one item here this will pick them all up, or you can use{*CONTROLLER_VK_X*} to pick up just half of them.{*B*}{*B*} +Move the item with the pointer over another space in the inventory and place it there using{*CONTROLLER_VK_A*}. With multiple items on the pointer, use{*CONTROLLER_VK_A*} to place them all, or{*CONTROLLER_VK_X*} to place just one.{*B*}{*B*} +If an item you are over is armor, you will be shown a tooltip to enable a quick move of this to the right armor slot in the inventory. + + + + {*T3*}HOW TO PLAY : CHEST{*ETW*}{*B*}{*B*} +Once you have crafted a Chest, you can place this in the world and then use it with{*CONTROLLER_ACTION_USE*} to store items from your inventory.{*B*}{*B*} +Use the pointer to move items between your inventory and the chest.{*B*}{*B*} +Items in the chest will be stored there for you to swap back into your inventory again later. + + + + {*T3*}HOW TO PLAY : LARGE CHEST{*ETW*}{*B*}{*B*} +Two chests placed next to each other will be combined to form a Large Chest. This can store even more items.{*B*}{*B*} +It is used in the same way as a normal chest. + + + + {*T3*}HOW TO PLAY : CRAFTING{*ETW*}{*B*}{*B*} +In the Crafting interface, you can combine items from your inventory to create new types of items. Use{*CONTROLLER_ACTION_CRAFTING*} to open the crafting interface.{*B*}{*B*} +Scroll through the tabs at the top using{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*} to select the type of item you wish to craft, then use{*CONTROLLER_MENU_NAVIGATE*} to select the item to craft.{*B*}{*B*} +The crafting area shows the items required to craft the new item. Press{*CONTROLLER_VK_A*} to craft the item and place it in your inventory. + + + + {*T3*}HOW TO PLAY : CRAFTING TABLE{*ETW*}{*B*}{*B*} +You can craft larger items using a Crafting Table.{*B*}{*B*} +Place the table in the world and press{*CONTROLLER_ACTION_USE*} to use it.{*B*}{*B*} +Crafting on a table works in the same way as basic crafting, but you have a larger crafting area, and a more varied selection of items to craft. + + + + {*T3*}HOW TO PLAY : FURNACE{*ETW*}{*B*}{*B*} +A Furnace allows you to change items by firing them. For example, you can turn iron ore into iron ingots in the furnace.{*B*}{*B*} +Place the furnace in the world and press{*CONTROLLER_ACTION_USE*} to use it.{*B*}{*B*} +You need to put some fuel into the bottom of the furnace, and the item to be fired in the top. The furnace will then fire up and start working.{*B*}{*B*} +When your items have been fired, you can move them from the output area into your inventory.{*B*}{*B*} +If an item you are over is an ingredient or fuel for the furnace, you will be shown tooltips to enable a quick move of this to the furnace. + + + + {*T3*}HOW TO PLAY : DISPENSER{*ETW*}{*B*}{*B*} +A Dispenser is used to shoot out items. You will need to place a switch, for example a lever, next to the dispenser to trigger it.{*B*}{*B*} +To fill the dispenser with items press{*CONTROLLER_ACTION_USE*}, then move the items that you want to dispense from your inventory into the dispenser.{*B*}{*B*} +Now when you use the switch, the dispenser will shoot out an item. + + + + + {*T3*}HOW TO PLAY : BREWING{*ETW*}{*B*}{*B*} +Brewing potions requires a Brewing Stand, which can be built at a crafting table. Every potion starts off with a bottle of water, which is made by filling a Glass Bottle with water from a Cauldron, or a water source.{*B*} +A Brewing Stand has three slots for bottles, so can make three potions at the same time. One ingredient can be used over all three bottles, so always brew three potions at the same time to best use your resources.{*B*} +Putting a potion ingredient in the top position at the Brewing Stand will make a base potion after a short time. This doesn't have any effect by itself, but brewing another ingredient with this base potion will give you a potion with an effect.{*B*} +Once you have this potion you can add a third ingredient to make the effect last longer (using Redstone Dust), be more intense (using Glowstone Dust), or turn into a harmful potion (using a Fermented Spider Eye).{*B*} +You can also add gunpowder to any potion to turn it into a Splash Potion, which can then be thrown. The thrown Splash Potion will cause the potion effect to apply over the area it lands in.{*B*} + +The source ingredients for potions are :-{*B*}{*B*} +* {*T2*}Nether Wart{*ETW*}{*B*} +* {*T2*}Spider Eye{*ETW*}{*B*} +* {*T2*}Sugar{*ETW*}{*B*} +* {*T2*}Ghast Tear{*ETW*}{*B*} +* {*T2*}Blaze Powder{*ETW*}{*B*} +* {*T2*}Magma Cream{*ETW*}{*B*} +* {*T2*}Glistering Melon{*ETW*}{*B*} +* {*T2*}Redstone Dust{*ETW*}{*B*} +* {*T2*}Glow Stone Dust{*ETW*}{*B*} +* {*T2*}Fermented Spider Eye{*ETW*}{*B*}{*B*} + +You'll need to experiment with combinations of ingredients in order to find out all the different potions you can make. + + + + + {*T3*}HOW TO PLAY : ENCHANTING{*ETW*}{*B*}{*B*} +The Experience Points collected when a mob dies, or when certain blocks are mined or smelted in a furnace, can be used to enchant some tools, weapons and armor.{*B*} +When the Sword, Bow, Axe, Pickaxe, Shovel or Armor is placed in the slot below the book in the Enchantment Table, the three buttons to the right of the slot will display some enchantments and their Experience Levels costs.{*B*} +If you do not have enough Experience Levels to use some of these, the cost will appear in red, otherwise it will be shown in green.{*B*}{*B*} +The actual enchantment applied is randomly selected based on the cost displayed.{*B*}{*B*} +If the Enchantment Table is surrounded by Bookshelves (up to a maximum of 15 Bookshelves), with a one block gap between the Bookcase and the Enchantment Table, the potency of the enchantments will be increased, and arcane glyphs will be seen coming from the book on the Enchantment Table.{*B*}{*B*} +All the ingredients for an enchantment table can be found within the villages in a world, or by mining and cultivation of the world.{*B*} + + + + + {*T3*}HOW TO PLAY : FARMING ANIMALS{*ETW*}{*B*}{*B*} +If you want to keep your animals in the one place, build a fenced area of less than 20x20 blocks and have your animals inside it. This ensures they will still be there when you come back to see them. + + + + + {*T3*}HOW TO PLAY : BREEDING ANIMALS{*ETW*}{*B*}{*B*} +The animals in Minecraft can breed, and will produce baby versions of themselves!{*B*} +To get the animals to breed, you will need to feed them with the right food to get them to go into 'Love Mode'.{*B*} +Feed Wheat to a cow, mooshroom, pig or sheep, Wheat Seeds or Nether Wart to a chicken, or any kind of meat to a wolf, and they'll start looking for another animal of the same species near them that is also in Love Mode.{*B*} +When two animals of the same species meet, and both are in Love Mode, they will kiss for a few seconds, and then a baby animal will appear. The baby animal will follow their parents for a while before growing into a full sized animal itself.{*B*} +After being in Love Mode, an animal will not be able to enter it again for about five minutes.{*B*} +There is a limit on the number of animals it is possible to have in a world, so you may find the animals don't breed when you have a lot of them. + + + + {*T3*}HOW TO PLAY : NETHER PORTAL{*ETW*}{*B*}{*B*} +A Nether Portal allows the player to travel between the Overworld and the Nether world. The Nether world can be used to fast-travel in the Overworld - traveling one block distance in the Nether is equivalent to traveling 3 blocks in the Overworld, so when you build a portal +in the Nether world and exit through it, you will be 3 times further away from your entry point.{*B*}{*B*} +A minimum of 10 Obsidian blocks are required to build the portal, and the portal needs to be 5 blocks high by 4 blocks wide by 1 block deep. Once the portal frame is built, the space inside the frame needs to be set on fire to activate it. This can be done using the Flint and Steel item, or the Fire Charge item.{*B*}{*B*} +Examples of portal construction are shown in the picture to the right. + + + + + {*T3*}HOW TO PLAY : MULTIPLAYER{*ETW*}{*B*}{*B*} +Minecraft on the Xbox 360 console is a multiplayer game by default. If you are playing in a High Definition mode, you can have local players join your game by attaching controllers and pressing START at any point during the game.{*B*}{*B*} +When you start or join an online game, it will be visible to people in your friends list (unless you've selected Invite Only when hosting the game), and if they join the game, it will also be visible to people in their friends list (if you have selected the Allow Friends of Friends option). +When you are in a game, you can press the BACK button to bring up a list of all other players in the game, view their Gamer Cards, Kick players from the game, and invite others to the game. + + + + + {*T3*}HOW TO PLAY : SHARING SCREENSHOTS{*ETW*}{*B*}{*B*} +You can capture a screenshot from your game by bringing up the Pause Menu, and pressing{*CONTROLLER_VK_Y*} to Share to Facebook. You'll be presented with a miniature version of your screenshot, and can edit the text associated with the Facebook post.{*B*}{*B*} +There's a camera mode especially for taking these screenshots, so that you can see the front of your character in the shot - press{*CONTROLLER_ACTION_CAMERA*} until you can see the front view of your character before pressing{*CONTROLLER_VK_Y*} to Share.{*B*}{*B*} +Gamertags will not be displayed in the screenshot. + + + + + {*T3*}HOW TO PLAY : BANNING LEVELS{*ETW*}{*B*}{*B*} +If you find offensive content within a level you are playing, you can choose to add the level to your Banned Levels list. +If you would like to do this, bring up the Pause menu, then press{*CONTROLLER_VK_RB*} to select the Ban Level tooltip. +When you attempt to join this level in future, you will be notified that the level is in your Banned Levels list, and given the option to remove it from the list and continue into the level, or back out. + + + {*T3*}HOW TO PLAY : CREATIVE MODE{*ETW*}{*B*}{*B*} +The creative mode interface allows any item in the game to be moved into the player’s inventory without the need for mining or crafting the item. +The items in the player's inventory will not be removed when they are placed or used in the world, and this allows the player to focus on building rather than resource gathering.{*B*} +If you create, load or save a world in Creative Mode, that world will have achievements and leaderboard updates disabled, even if it is then loaded in Survival Mode.{*B*} +To fly when in Creative Mode, press{*CONTROLLER_ACTION_JUMP*} twice quickly. To exit flying, repeat the action. To fly faster, push{*CONTROLLER_ACTION_MOVE*} forward twice in rapid succession while flying. +When in flying mode, you can hold down{*CONTROLLER_ACTION_JUMP*} to move up and{*CONTROLLER_ACTION_SNEAK*} to move down, or use{*CONTROLLER_ACTION_DPAD_UP*} to move up, {*CONTROLLER_ACTION_DPAD_DOWN*} to move down, +{*CONTROLLER_ACTION_DPAD_LEFT*} to move left, and {*CONTROLLER_ACTION_DPAD_RIGHT*} to move right. + + + {*T3*}HOW TO PLAY : HOST AND PLAYER OPTIONS{*ETW*}{*B*}{*B*} + +{*T1*}Game Options{*ETW*}{*B*} +When loading or creating a world, you can press the "More Options" button to enter a menu that allows more control over your game.{*B*}{*B*} + + {*T2*}Player vs Player{*ETW*}{*B*} + When enabled, players can inflict damage on other players. This option only affects Survival mode.{*B*}{*B*} + + {*T2*}Trust Players{*ETW*}{*B*} + When disabled, players joining the game are restricted in what they can do. They are not able to mine or use items, place blocks, use doors and switches, use containers, attack players or attack animals. You can change these options for a specific player using the in-game menu.{*B*}{*B*} + + {*T2*}Fire Spreads{*ETW*}{*B*} + When enabled, fire may spread to nearby flammable blocks. This option can also be changed from within the game.{*B*}{*B*} + + {*T2*}TNT Explodes{*ETW*}{*B*} + When enabled, TNT will explode when detonated. This option can also be changed from within the game.{*B*}{*B*} + + {*T2*}Host Privileges{*ETW*}{*B*} + When enabled, the host can toggle their ability to fly, disable exhaustion, and make themselves invisible from the in-game menu. This option disables achievements and leaderboard updates for this world while playing, and if loading it again after saving with this option on.{*B*}{*B*} + +{*T1*}World Generation Options{*ETW*}{*B*} +When creating a new world there are some additional options.{*B*}{*B*} + + {*T2*}Generate Structures{*ETW*}{*B*} + When enabled, structures such as Villages and Strongholds will generate in the world.{*B*}{*B*} + + {*T2*}Superflat World{*ETW*}{*B*} + When enabled, a completely flat world will be generated in the Overworld and in the Nether.{*B*}{*B*} + + {*T2*}Bonus Chest{*ETW*}{*B*} + When enabled, a chest containing some useful items will be created near the player spawn point.{*B*}{*B*} + + {*T2*}Reset Nether{*ETW*}{*B*} + When enabled, the Nether will be re-generated. This is useful if you have an older save where Nether Fortresses were not present.{*B*}{*B*} + + {*T1*}In-Game Options{*ETW*}{*B*} + While in the game a number of options can be accessed by pressing BACK to bring up the in-game menu.{*B*}{*B*} + + {*T2*}Host Options{*ETW*}{*B*} + The host player, and any players set as moderators can access the "Host Option" menu. In this menu they can enable and disable fire spreading and TNT exploding.{*B*}{*B*} + +{*T1*}Player Options{*ETW*}{*B*} +To modify the privileges for a player, select their name and press{*CONTROLLER_VK_A*} to bring up the player privileges menu where you can use the following options.{*B*}{*B*} + + {*T2*}Can Build And Mine{*ETW*}{*B*} + This option is only available when "Trust Players" is turned off. When this option is enabled, the player is able to interact with the world as normal. When disabled the player will not be able to place or destroy blocks, or interact with many items and blocks.{*B*}{*B*} + + {*T2*}Can Use Doors and Switches{*ETW*}{*B*} + This option is only available when "Trust Players" is turned off. When this option is disabled, the player will not be able to use doors and switches.{*B*}{*B*} + + {*T2*}Can Open Containers{*ETW*}{*B*} + This option is only available when "Trust Players" is turned off. When this option is disabled, the player will not be able to open containers, such as chests.{*B*}{*B*} + + {*T2*}Can Attack Players{*ETW*}{*B*} + This option is only available when "Trust Players" is turned off. When this option is disabled the player will not be able to cause damage to other players.{*B*}{*B*} + + {*T2*}Can Attack Animals{*ETW*}{*B*} + This option is only available when "Trust Players" is turned off. When this option is disabled the player will not be able to cause damage to animals.{*B*}{*B*} + + {*T2*}Moderator{*ETW*}{*B*} + When this option is enabled, the player is able to change privileges for other players (except the host) if "Trust Players" is turned off, kick players and they can enable and disable fire spreading and TNT exploding.{*B*}{*B*} + + {*T2*}Kick Player{*ETW*}{*B*} + For players that are not on the same Xbox 360 console as the host player, selecting this option will kick the player from the game and any other players on their Xbox 360 console. This player will not be able to rejoin the game until it is restarted.{*B*}{*B*} + +{*T1*}Host Player Options{*ETW*}{*B*} +If "Host Privileges" is enabled the host player can modify some privileges for themselves. To modify the privileges for a player, select their name and press{*CONTROLLER_VK_A*} to bring up the player privileges menu where you can use the following options.{*B*}{*B*} + + {*T2*}Can Fly{*ETW*}{*B*} + When this option is enabled, the player is able to fly. This option is only relevant to Survival mode, as flying is enabled for all players in Creative mode.{*B*}{*B*} + + {*T2*}Disable Exhaustion{*ETW*}{*B*} + This option only affects Survival mode. When enabled, physical activities (walking/sprinting/jumping etc.) do not decrease the food bar. However, if the player becomes injured, the food bar will slowly decrease while the player is healing.{*B*}{*B*} + + {*T2*}Invisible{*ETW*}{*B*} + When this option is enabled, the player is not visible to other players and is invulnerable.{*B*}{*B*} + + + + + Next Page + + + Previous Page + + + Basics + + + HUD + + + Inventory + + + Chests + + + Crafting + + + Furnace + + + Dispenser + + + + Farming Animals + + + Breeding Animals + + + Brewing + + + Enchantment + + + + Nether Portal + + + Multiplayer + + + Sharing Screenshots + + + Banning Levels + + + Creative Mode + + + Host and Player Options + + + + The End + + + + {*T3*}HOW TO PLAY : The End{*ETW*}{*B*}{*B*} +The End is another dimension in the game, which is reached through an active End Portal. The End Portal can be found in a Stronghold, which is deep underground in the Overworld.{*B*} +To activate the End Portal, you'll need to put an Eye of Ender into any End Portal Frame without one.{*B*} +Once the portal is active, jump in to it to go to The End.{*B*}{*B*} +In The End you will meet the Enderdragon, a fierce and powerful enemy, along with many Enderman, so you will have to be well prepared for the battle before going there!{*B*}{*B*} +You'll find that there are Ender Crystals on top of eight Obsidian spikes that the Enderdragon uses to heal itself, +so the first step in the battle is to destroy each of these.{*B*} +The first few can be reached with arrows, but the later ones are protected by an Iron Fence cage, and you will need to build up to them.{*B*}{*B*} +While you are doing this, the Enderdragon will be attacking you by flying at you and spitting Ender acid balls!{*B*} +If you approach the Egg Podium in the centre of the spikes, the Enderdragon will fly down and attack you and this is where you can really do some damage to it!{*B*} +Avoid the acid breath, and target the Enderdragon's eyes for the best results. If possible, bring some friends in to The End to help you with the battle!{*B*}{*B*} +Once you are in The End, your friends will be able to see the location of the End Portal within the Stronghold on their maps, +so they can easily join you. + + + + Sprint + + + + What's New + + + + +{*T3*}TITLE UPDATE 12{*ETW*}{*B*}{*B*} +{*T3*}Changes and Additions{*ETW*}{*B*}{*B*} +- New map height limit (256 instead of 128).{*B*} +- New Jungle biome.{*B*} +- Added Jungle trees.{*B*} +- Added new items - Redstone Lamp, Jungle Wood Stairs, Jungle Wood Half Slab, Jungle Wood Block, Jungle Wood Planks, Jungle Tree Sapling, and Ocelot Spawn Egg.{*B*} +- Added new items (only available in Creative Mode at the moment) - Chiseled Stone Brick, Mob Heads (Skeleton, Wither Skeleton, Zombie, Human and Creeper).{*B*} +- Added new Mobs - Ocelots/Cats, Iron Golems and Baby Villagers.{*B*} +- Slabs and Stairs can be placed upside down by placing them below a block.{*B*} +- Added Corner Stairs and upside down Corner Stairs.{*B*} +- Cocoa Beans grow on Jungle trees.{*B*} +- Added 3D dropped items.{*B*} +- Added dispensing boats and minecarts to Dispenser.{*B*} +- New ambient cave sounds.{*B*} +- New AI for Mobs.{*B*} +- Added rare drops for Mobs.{*B*} +- Villagers will have children if there is room in their village.{*B*} +- Zombie sieges will occur occasionally at night.{*B*} +- Zombies break down doors on Hard Mode.{*B*} +- Crafting recipe for ladder now yields 3 ladders instead of 2.{*B*} +- Placing blocks on grass will replace it.{*B*} +- Lava now has a faint rumbling sound effect, and large particles that hop out of the lava produce a popping sound.{*B*} +- Very rare Desert Wells can be found in Desert biomes.{*B*} +- When in the Nether, Snow Golems will melt and die same as when they are in Desert biomes.{*B*} +- Abandoned Mineshafts can generate with wooden bridges now when generated over a cave or over top another tunnel.{*B*} +- Added a Favorites tab to the Skin Selector menu, storing most recently used skins.{*B*} +- Added support for Texture Packs and Mash-up Packs.{*B*} +- New Tutorial World.{*B*} +- Fixed local player shadows.{*B*} +- Fixed a few issues with the Privileges settings.{*B*} +- Fixed Minecart speed being double what it should be.{*B*} + + + + + {*ETB*}Welcome back! You may not have noticed but your Minecraft has just been updated.{*B*}{*B*} +There are lots of new features for you and friends to play with so here’s just a few highlights. Have a read and then go and have fun!{*B*}{*B*} +{*T1*}New Items{*ETB*} - Redstone Lamp, Jungle Wood Stairs, Jungle Wood Half Slab, Jungle Wood Block, Jungle Wood Planks, Jungle Tree Sapling, and Ocelot Spawn Egg.{*B*}{*B*} +{*T1*}New Items (only available in Creative Mode at the moment){*ETB*} - Chiseled Stone Brick, Mob Heads (Skelton, Wither Skeleton, Zombie, Human and Creeper).{*B*}{*B*} +{*T1*}New Mobs{*ETB*} - Ocelot/Cat, Iron Golem and Baby Villager.{*B*}{*B*} +{*T1*}New Jungle Biome{*ETB*} - Jungle trees grow here!{*B*}{*B*} +{*T1*}Doubled map height limit{*ETB*} - You can now build to 256 blocks high!{*B*}{*B*} +{*T1*}New Tutorial World{*ETB*} – A brand new Tutorial World to explore!{*B*}{*B*} +{*T1*}New 'Easter Eggs'{*ETB*} – You may have found all the Music Discs in the previous Tutorial World, but you'll need to see if you can find them in the new Tutorial World!{*B*}{*B*} + + + + + + Deals more damage than by hand. + + + Used to dig dirt, grass, sand, gravel and snow faster than by hand. Shovels are required to dig snowballs. + + + Required to mine stone-related blocks and ore. + + + Used to chop wood-related blocks faster than by hand. + + + Used to till dirt and grass blocks to prepare for crops. + + + Wooden doors are activated by using, hitting them or with Redstone. + + + Iron doors can only be opened by Redstone, buttons or switches. + + + + Gives the user 1.5 Armor when worn. + + + Gives the user 4 Armor when worn. + + + Gives the user 3 Armor when worn. + + + Gives the user 1.5 Armor when worn. + + + A shiny ingot which can be used to craft tools made from this material. Created by smelting ore in a furnace. + + + Allows ingots, gems, or dyes to be crafted into placeable blocks. Can be used as an expensive building block or compact storage of the ore. + + + Used to send an electrical charge when stepped on by a player, an animal, or a monster. Wooden Pressure Plates can also be activated by dropping something on them. + + + Used for compact staircases. + + + Used for making long staircases. Two slabs placed on top of each other will create a normal-sized double slab block. + + + Used for compact staircases. + + + Used to create light. Torches also melt snow and ice. + + + + Used as a building material and can be crafted into many things. Can be crafted from any form of wood. + + + Used as a building material. Is not influenced by gravity like normal Sand. + + + Used as a building material. + + + Used to craft torches, arrows, signs, ladders, fences and as handles for tools and weapons. + + + Used to forward time from any time at night to morning if all the players in the world are in bed, and changes the spawn point of the player. +The colors of the bed are always the same, regardless of the colors of wool used. + + + Allows you to craft a more varied selection of items than the normal crafting. + + + Allows you to smelt ore, create charcoal and glass, and cook fish and porkchops. + + + Stores blocks and items inside. Place two chests side by side to create a larger chest with double the capacity. + + + Used as a barrier that cannot be jumped over. Counts as 1.5 blocks high for players, animals and monsters, but 1 block high for other blocks. + + + Used to climb vertically. + + + Activated by using, hitting them or with redstone. They function as normal doors, but are a one by one block and lay flat on the ground. + + + Shows text entered by you or other players. + + + + Used to create brighter light than torches. Melts snow/ice and can be used underwater. + + + Used to cause explosions. Activated after placing by igniting with Flint and Steel item, or with an electrical charge. + + + Used to hold mushroom stew. You keep the bowl when the stew has been eaten. + + + Used to hold and transport water, lava and milk. + + + Used to hold and transport water. + + + Used to hold and transport lava. + + + Used to hold and transport milk. + + + + Used to create fire, ignite TNT, and open a portal once it has been built. + + + Used to catch fish. + + + Displays positions of the Sun and Moon. + + + Points to your start point. + + + Will create an image of an area explored while held. This can be used for path-finding. + + + + Allows for ranged attacks by using arrows. + + + Used as ammunition for bows. + + + + Restores 2.5{*ICON_SHANK_01*}. + + + Restores 1{*ICON_SHANK_01*}. Can be used 6 times. + + + Restores 0.5{*ICON_SHANK_01*}. + + + Restores 1{*ICON_SHANK_01*}. + + + Restores 4{*ICON_SHANK_01*}. + + + Restores 1{*ICON_SHANK_01*}, but can make you ill. Cook in a furnace. + + + Restores 3{*ICON_SHANK_01*}. + + + Restores 1.5{*ICON_SHANK_01*}, but can make you ill. Cook in a furnace. + + + Restores 4{*ICON_SHANK_01*}. + + + Collected by killing a pig, restores 1.5{*ICON_SHANK_01*}, and can be cooked in a furnace. + + + Created by cooking a porkchop in a furnace. Restores 4{*ICON_SHANK_01*}. + + + Can be eaten to restore 1{*ICON_SHANK_01*}, or cooked in a furnace. Can also be fed to an Ocelot to tame it. + + + Created by cooking a raw fish in a furnace. Can be eaten to restore 2.5{*ICON_SHANK_01*}. + + + Restores 2{*ICON_SHANK_01*}, and can be crafted into a golden apple. + + + Restores 2{*ICON_SHANK_01*}, and regenerates health for 4 seconds. + + + Restores 2{*ICON_SHANK_01*}, but can make you ill. + + + + Used in the cake recipe. + + + Used to send an electrical charge by being turned on or off. Stays in the on or off state until pressed again. + + + Constantly sends an electrical charge, or can be used as a receiver/transmitter when connected to the side of a block. +Can also be used for low-level lighting. + + + Used in Redstone circuits as repeater, a delayer, and/or a diode. + + + Used to send an electrical charge by being pressed. Stays activated for approximately a second before shutting off again. + + + Used to hold and shoot out items in a random order when given a Redstone charge. + + + Plays a note when triggered. Hit it to change the pitch of the note. Placing this on top of different blocks will change the type of instrument. + + + + Used to guide minecarts. + + + When powered, accelerates minecarts that pass over it. When unpowered, causes minecarts to stop on it. + + + Functions like a Pressure Plate (sends a Redstone signal when powered) but can only be activated by a minecart. + + + Used to transport you, an animal, or a monster along rails. + + + Used to transport goods along rails. + + + Will move along rails and can push other minecarts when coal is put in it. + + + Used to travel in water more quickly than swimming. + + + + Collected from sheep, and can be colored with dyes. + + + Used as a building material and can be colored with dyes. This recipe is not recommended because Wool can be easily obtained from Sheep. + + + Used as a dye to create black wool. + + + Used as a dye to create green wool. + + + Used as a dye to create brown wool. + + + Used as a dye to create silver wool. + + + Used as a dye to create yellow wool. + + + Used as a dye to create red wool. + + + Used to instantly grow crops, trees, tall grass, huge mushrooms and flowers, and can be used in dye recipes. + + + Used as a dye to create pink wool. + + + Used as a dye to create orange wool. + + + Used as a dye to create lime wool. + + + Used as a dye to create gray wool. + + + Used as a dye to create light gray wool. +(Note: light gray dye can also be made by combining gray dye with bone meal, letting you make four light gray dyes from every ink sac instead of three.) + + + Used as a dye to create light blue wool. + + + Used as a dye to create cyan wool. + + + Used as a dye to create purple wool. + + + Used as a dye to create magenta wool. + + + Used as dye to create Blue Wool. + + + Plays Music Discs. + + + Use these to create very strong tools, weapons or armor. + + + Used to create brighter light than torches. Melts snow/ice and can be used underwater. + + + Used to create books and maps. + + + Used to create a bookshelf. + + + Used as decoration. + + + Used as decoration. + + + + Can be mined with an iron pickaxe or better, then smelted in a furnace to produce gold ingots. + + + Can be mined with a stone pickaxe or better, then smelted in a furnace to produce iron ingots. + + + Can be mined with a pickaxe to collect coal. + + + Can be mined with a stone pickaxe or better to collect lapis lazuli. + + + Can be mined with an iron pickaxe or better to collect diamonds. + + + Can be mined with an iron pickaxe or better to collect redstone dust. + + + Can be mined with a pickaxe to collect cobblestone. + + + Collected using a shovel. Can be used for construction. + + + Can be planted and it will eventually grow into a tree. + + + This cannot be broken. + + + Sets fire to anything that touches it. Can be collected in a bucket. + + + Collected using a shovel. Can be smelted into glass using the furnace. Is affected by gravity if there is no other tile underneath it. + + + Collected using a shovel. Sometimes produces flint when dug up. Is affected by gravity if there is no other tile underneath it. + + + Chopped using an axe, and can be crafted into planks or used as a fuel. + + + Created in a furnace by smelting sand. Can be used for construction, but will break if you try to mine it. + + + Mined from stone using a pickaxe. Can be used to construct a furnace or stone tools. + + + Baked from clay in a furnace. + + + Can be baked into bricks in a furnace. + + + When broken drops clay balls which can be baked into bricks in a furnace. + + + A compact way to store snowballs. + + + Can be dug with a shovel to create snowballs. + + + Sometimes produces wheat seeds when broken. + + + Can be crafted into a dye. + + + Can be crafted with a bowl to make stew. + + + Can only be mined with a diamond pickaxe. Is produced by the meeting of water and still lava, and is used to build a portal. + + + Spawns monsters into the world. + + + Is placed on the ground to carry an electrical charge. + + + When fully grown, crops can be harvested to collect wheat. + + + Ground that has been prepared ready to plant seeds. + + + Can be cooked in a furnace to create a green dye. + + + Can be crafted to create sugar. + + + Can be worn as a helmet or crafted with a torch to create a Jack-O-Lantern. + + + Burns forever if set alight. + + + Slows the movement of anything walking over it. + + + Standing in the portal allows you to pass between the Overworld and the Nether. + + + + Used as a fuel in a furnace, or crafted to make a torch. + + + Collected by killing a spider, and can be crafted into a bow. + + + Collected by killing a chicken, and can be crafted into an arrow. + + + Collected by killing a Creeper, and can be crafted into TNT. + + + Can be planted in farmland to grow crops. Make sure there's enough light for the seeds to grow! + + + Harvested from crops, and can be used to craft food items. + + + Collected by digging gravel, and can be used to craft a flint and steel. + + + When used on a pig it allows you to ride the pig. + + + Collected by digging snow, and can be thrown. + + + Collected by killing a cow, and can be crafted into armor. + + + Collected by killing a Slime. + + + Dropped randomly by chickens, and can be crafted into food items. + + + Collected by mining Glowstone, and can be crafted to make Glowstone blocks again. + + + Collected by killing a Skeleton. Can be crafted into bone meal. Can be fed to a wolf to tame it. + + + Collected by getting a Skeleton to kill a Creeper. Can be played in a jukebox. + + + Extinguishes fire and helps crops grow. Can be collected in a bucket. + + + When broken sometimes drops a sapling which can then be replanted to grow into a tree. + + + Can be used for construction and decoration. + + + Used to obtain wool from sheep and harvest leaf blocks. + + + When powered (using a button, a lever, a pressure plate, a redstone torch, or redstone with any one of these), a piston extends if it can and pushes blocks. + + + When powered (using a button, a lever, a pressure plate, a redstone torch, or redstone with any one of these), a piston extends if it can and pushes blocks. When it retracts it pulls back the block touching the extended part of the piston. + + + Made from Stone blocks, and commonly found in Strongholds. + + + Used as a barrier, similar to fences. + + + Similar to a door, but used primarily with fences. + + + Can be crafted from Melon Slices. + + + Transparent blocks that can be used as an alternative to Glass Blocks. + + + Can be planted to grow pumpkins. + + + Can be planted to grow melons. + + + Dropped by Enderman when they die. When thrown, the player will be teleported to the position the Ender Pearl lands at, and will lose some health. + + + A block of dirt with grass growing on top. Collected using a shovel. Can be used for construction. + + + Can be used for construction and decoration. + + + Slows movement when walking through it. Can be destroyed using shears to collect string. + + + Spawns a Silverfish when destroyed. May also spawn Silverfish if nearby to another Silverfish being attacked. + + + Grows over time when placed. Can be collected using shears. Can be climbed like a ladder. + + + Slippery when walked on. Turns into water if above another block when destroyed. Melts if close enough to a light source. + + + Can be used as decoration. + + + Used in potion brewing, and for locating Strongholds. Dropped by Blazes who tend to be found near or in Nether Fortresses. + + + Used in potion brewing. Dropped by Ghasts when they die. + + + Dropped by Zombie Pigmen when they die. Zombie Pigmen can be found in the Nether. + + + Used in potion brewing. This can be found naturally growing in Nether Fortresses. It can also be planted on Soul Sand. + + + When used, can have various effects, depending on what it is used on. + + + Can be filled with water, and used as the starting ingredient for a potion in the Brewing Stand. + + + This is a poisonous food and brewing item. Dropped when a Spider or Cave Spider is killed by a player. + + + Used in potion brewing, mainly to create potions with a negative effect. + + + Used in potion brewing, or crafted with other items to make Eye of Ender or Magma Cream. + + + Used in potion brewing. + + + Used for making Potions and Splash Potions. + + + Can be filled with water using a bucket of water, and can then be used to fill Glass Bottles with water. + + + When thrown, will show the direction to an End Portal. When twelve of these are placed in the End Portal Frames, the End Portal will be activated. + + + Used in potion brewing. + + + Similar to Grass Blocks, but very good for growing mushrooms on. + + + Floats on water, and can be walked on. + + + Used to build Nether Fortresses. Immune to Ghast's fireballs. + + + Used in Nether Fortresses. + + + Found in Nether Fortresses, and will drop Nether Wart when broken. + + + This allows players to enchant Swords, Pickaxes, Axes, Shovels, Bows and Armor, using the player's Experience Points. + + + This can be activated using twelve Eye of Ender, and will allow the player to travel to The End dimension. + + + Used to form an End Portal. + + + A block type found in The End. It has a very high blast resistance, so is useful for building with. + + + This block is created by the defeat of the Dragon in The End. + + + When thrown, it drops Experience Orbs which increase your experience points when collected. + + + Useful for setting things on fire. + + + These are similar to a display case, and will display the item of block placed in it. + + + When thrown can spawn a creature of the type indicated. + + + Used for making long staircases. Two slabs placed on top of each other will create a normal-sized double slab block. + + + Used for making long staircases. Two slabs placed on top of each other will create a normal-sized double slab block. + + + Created by smelting Netherrack in a furnace. Can be crafted into Nether Brick blocks. + + + When powered they emit light. + + + Can be farmed to collect Cocoa Beans. + + + Mob Heads can be placed as a decoration, or worn as a mask in the helmet slot. + + + + + Squid + + + Drops ink sacs when killed. + + + Cow + + + Drops leather when killed. Can also be milked with a bucket. + + + Sheep + + + Drops wool when sheared (if it has not already been sheared). Can be dyed to make its wool a different color. + + + Chicken + + + Drops feathers when killed, and also randomly lays eggs. + + + Pig + + + Drops porkchops when killed. Can be ridden by using a saddle. + + + Wolf + + + Docile until attacked, when they will attack you back. Can be tamed using bones which causes the wolf to follow you around and attack anything that attacks you. + + + Creeper + + + Explodes if you get too close! + + + Skeleton + + + Fires arrows at you. Drops arrows when killed. + + + Spider + + + Attacks you when you are close to it. Can climb walls. Drops string when killed. + + + Zombie + + + Attacks you when you are close to it. + + + Zombie Pigman + + + Initially docile, but will attack in groups if you attack one. + + + Ghast + + + Fires flaming balls at you that explode on contact. + + + Slime + + + Split into smaller Slimes when damaged. + + + Enderman + + + Will attack you if you look at it. Can also move blocks around. + + + Silverfish + + + Attracts nearby hidden Silverfish when attacked. Hides in stone blocks. + + + Cave Spider + + + Has a venomous bite. + + + Mooshroom + + + Makes mushroom stew when used with a bowl. Drops mushrooms and becomes a normal cow when sheared. + + + Snow Golem + + + The Snow Golem can be created by players using snow blocks and a pumpkin. They will throw snowballs at their creators enemies. + + + Enderdragon + + + This is a large black dragon found in The End. + + + Blaze + + + These are enemies found in the Nether, mostly inside Nether Fortresses. They will drop Blaze Rods when killed. + + + Magma Cube + + + These can be found in The Nether. Similar to Slimes, they will break up into smaller versions when killed. + + + Villager + + + Ocelot + + + These can be found in Jungles. They can be tamed by feeding them Raw Fish. You will need to let the Ocelot approach you though, since any sudden movements will scare it away. + + + Iron Golem + + + Appear in Villages to protect them, and can be created using Iron Blocks and Pumpkins. + + + + + Explosives Animator + + + Concept Artist + + + + Number Crunching and Statistics + + + + Bully Coordinator + + + + Original Design and Code by + + + Project Manager/Producer + + + Rest of Mojang Office + + + Lead game programmer Minecraft PC + + + Ninja Coder + + + CEO + + + White Collar Worker + + + Customer Support + + + Office DJ + + + Designer/Programmer Minecraft - Pocket Edition + + + Developer + + + Chief Architect + + + Art Developer + + + Game Crafter + + + Director of Fun + + + Music and Sounds + + + Programming + + + Art + + + QA + + + Executive Producer + + + Lead Producer + + + Producer + + + Test Lead + + + Lead Tester + + + Design Team + + + Development Team + + + Release Management + + + Director, XBLA Publishing + + + Business Development + + + Portfolio Director + + + Product Manager + + + Marketing + + + Community Manager + + + Europe Localization Team + + + Redmond Localization Team + + + Asia Localization Team + + + User Research Team + + + MGS Central Teams + + + Milestone Acceptance Tester + + + Special Thanks + + + Test Manager + + + Senior Test Lead + + + SDET + + + Project STE + + + Additional STE + + + Test Associates + + + Jon KÃ¥gström + + + Tobias Möllstam + + + Risë Lugo + + + + Wooden Sword + + + + Stone Sword + + + Iron Sword + + + Diamond Sword + + + Golden Sword + + + Wooden Shovel + + + Stone Shovel + + + Iron Shovel + + + Diamond Shovel + + + Golden Shovel + + + Wooden Pickaxe + + + Stone Pickaxe + + + Iron Pickaxe + + + Diamond Pickaxe + + + Golden Pickaxe + + + Wooden Axe + + + Stone Axe + + + Iron Axe + + + Diamond Axe + + + Golden Axe + + + Wooden Hoe + + + Stone Hoe + + + Iron Hoe + + + Diamond Hoe + + + Golden Hoe + + + Wooden Door + + + Iron Door + + + Chain Helmet + + + Chain Chestplate + + + Chain Leggings + + + Chain Boots + + + Leather Cap + + + Iron Helmet + + + Diamond Helmet + + + Golden Helmet + + + Leather Tunic + + + Iron Chestplate + + + Diamond Chestplate + + + Golden Chestplate + + + Leather Pants + + + Iron Leggings + + + Diamond Leggings + + + Golden Leggings + + + Leather Boots + + + Iron Boots + + + Diamond Boots + + + Golden Boots + + + Iron Ingot + + + Gold Ingot + + + Bucket + + + Water Bucket + + + Lava Bucket + + + Flint and Steel + + + Apple + + + Bow + + + Arrow + + + Coal + + + Charcoal + + + Diamond + + + Stick + + + Bowl + + + Mushroom Stew + + + String + + + Feather + + + Gunpowder + + + Wheat Seeds + + + Wheat + + + Bread + + + Flint + + + Raw Porkchop + + + Cooked Porkchop + + + Painting + + + Golden Apple + + + Sign + + + Minecart + + + Saddle + + + Redstone + + + Snowball + + + Boat + + + Leather + + + Milk Bucket + + + Brick + + + Clay + + + Sugar Canes + + + Paper + + + Book + + + Slimeball + + + Minecart with Chest + + + Minecart with Furnace + + + Egg + + + Compass + + + Fishing Rod + + + Clock + + + Glowstone Dust + + + Raw Fish + + + Cooked Fish + + + Dye Powder + + + Ink Sac + + + Rose Red + + + Cactus Green + + + Cocoa Beans + + + Lapis Lazuli + + + Purple Dye + + + Cyan Dye + + + Light Gray Dye + + + Gray Dye + + + Pink Dye + + + Lime Dye + + + Dandelion Yellow + + + Light Blue Dye + + + Magenta Dye + + + Orange Dye + + + Bone Meal + + + Bone + + + Sugar + + + Cake + + + Bed + + + Redstone Repeater + + + Cookie + + + Map + + + Music Disc - "13" + + + Music Disc - "cat" + + + Music Disc - "blocks" + + + Music Disc - "chirp" + + + Music Disc - "far" + + + Music Disc - "mall" + + + Music Disc - "mellohi" + + + Music Disc - "stal" + + + Music Disc - "strad" + + + Music Disc - "ward" + + + Music Disc - "11" + + + Music Disc - "where are we now" + + + Shears + + + Pumpkin Seeds + + + Melon Seeds + + + Raw Chicken + + + Cooked Chicken + + + Raw Beef + + + Steak + + + Rotten Flesh + + + Ender Pearl + + + Melon Slice + + + Blaze Rod + + + Ghast Tear + + + Gold Nugget + + + Nether Wart + + + {*splash*}{*prefix*}Potion {*postfix*} + + + Glass Bottle + + + Water Bottle + + + Spider Eye + + + Fermented Spider Eye + + + Blaze Powder + + + Magma Cream + + + Brewing Stand + + + Cauldron + + + Eye of Ender + + + Glistering Melon + + + Bottle o' Enchanting + + + Fire Charge + + + Fire Charge (Charcoal) + + + Fire Charge (Coal) + + + Item Frame + + + Spawn {*CREATURE*} + + + Nether Brick + + + Skull + + + Skeleton Skull + + + Wither Skeleton Skull + + + Zombie Head + + + Head + + + %s's Head + + + Creeper Head + + + + Stone + + + Grass Block + + + Dirt + + + Cobblestone + + + Oak Wood Planks + + + Spruce Wood Planks + + + Birch Wood Planks + + + Jungle Wood Planks + + + Sapling + + + Oak Sapling + + + Spruce Sapling + + + Birch Sapling + + + Jungle Tree Sapling + + + Bedrock + + + Water + + + Lava + + + Sand + + + Sandstone + + + Gravel + + + Gold Ore + + + Iron Ore + + + Coal Ore + + + Wood + + + Oak Wood + + + Spruce Wood + + + Birch Wood + + + Jungle Wood + + + Oak + + + Spruce + + + Birch + + + Leaves + + + Oak Leaves + + + Spruce Leaves + + + Birch Leaves + + + Jungle Leaves + + + Sponge + + + Glass + + + Wool + + + Black Wool + + + Red Wool + + + Green Wool + + + Brown Wool + + + Blue Wool + + + Purple Wool + + + Cyan Wool + + + Light Gray Wool + + + Gray Wool + + + Pink Wool + + + Lime Wool + + + Yellow Wool + + + Light Blue Wool + + + Magenta Wool + + + Orange Wool + + + White Wool + + + Flower + + + Rose + + + Mushroom + + + Block of Gold + + + Block of Iron + + + Stone Slab + + + Stone Slab + + + Sandstone Slab + + + Oak Wood Slab + + + Cobblestone Slab + + + Bricks Slab + + + Stone Bricks Slab + + + Oak Wood Slab + + + Spruce Wood Slab + + + Birch Wood Slab + + + Jungle Wood Slab + + + Nether Brick Slab + + + Bricks + + + TNT + + + Bookshelf + + + Moss Stone + + + Obsidian + + + Torch + + + + Torch (Coal) + + + Torch (Charcoal) + + + Fire + + + Monster Spawner + + + Oak Wood Stairs + + + Chest + + + Redstone Dust + + + Diamond Ore + + + Block of Diamond + + + Crafting Table + + + Crops + + + Farmland + + + Furnace + + + Sign + + + Wooden Door + + + Ladder + + + Rail + + + Powered Rail + + + Detector Rail + + + Stone Stairs + + + Lever + + + Pressure Plate + + + Iron Door + + + Redstone Ore + + + Redstone Torch + + + Button + + + Snow + + + Ice + + + Cactus + + + Clay + + + Sugar Cane + + + Jukebox + + + Fence + + + Pumpkin + + + Jack-O-Lantern + + + Netherrack + + + Soul Sand + + + Glowstone + + + Portal + + + Lapis Lazuli Ore + + + Lapis Lazuli Block + + + Dispenser + + + Note Block + + + Cake + + + Bed + + + Web + + + Tall Grass + + + Dead Bush + + + Diode + + + Locked Chest + + + Trapdoor + + + Wool (any color) + + + Piston + + + Sticky Piston + + + Silverfish Block + + + Stone Bricks + + + Mossy Stone Bricks + + + Cracked Stone Bricks + + + Chiseled Stone Bricks + + + Mushroom + + + Mushroom + + + Iron Bars + + + Glass Pane + + + Melon + + + Pumpkin Stem + + + Melon Stem + + + Vines + + + Fence Gate + + + Brick Stairs + + + Stone Brick Stairs + + + Silverfish Stone + + + Silverfish Cobblestone + + + Silverfish Stone Brick + + + Mycelium + + + Lily Pad + + + Nether Brick + + + Nether Brick Fence + + + Nether Brick Stairs + + + Nether Wart + + + Enchantment Table + + + Brewing Stand + + + Cauldron + + + End Portal + + + End Portal Frame + + + End Stone + + + Dragon Egg + + + Shrub + + + Fern + + + Sandstone Stairs + + + Spruce Wood Stairs + + + Birch Wood Stairs + + + Jungle Wood Stairs + + + Redstone Lamp + + + Cocoa + + + Skull + + + + + Current Controls + + + Layout + + + Move/Sprint + + + Look + + + Pause + + + Jump + + + Jump/Fly Up + + + Inventory + + + Cycle Held Item + + + Action + + + Use + + + Crafting + + + Drop + + + Sneak + + + Sneak/Fly Down + + + Change Camera Mode + + + Players/Invite + + + Movement (When Flying) + + + Layout 1 + + + Layout 2 + + + Layout 3 + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + + ]]> + + + ]]> + + + + + {*B*}Press{*CONTROLLER_VK_A*} to continue. + + + {*B*}Press{*CONTROLLER_VK_A*} to start the tutorial.{*B*} + Press{*CONTROLLER_VK_B*} if you think you are ready to play on your own. + + + + Minecraft is a game about placing blocks to build anything you can imagine. +At night monsters come out, make sure to build a shelter before that happens. + + + Use{*CONTROLLER_ACTION_LOOK*} to look up, down and around. + + + Use{*CONTROLLER_ACTION_MOVE*} to move around. + + + To sprint, push{*CONTROLLER_ACTION_MOVE*} forward twice quickly. While you hold{*CONTROLLER_ACTION_MOVE*} forward, the character will continue to sprint unless they run out of sprint time or food. + + + Press{*CONTROLLER_ACTION_JUMP*} to jump. + + + Hold{*CONTROLLER_ACTION_ACTION*} to mine and chop using your hand or whatever you are holding. You may need to craft a tool to mine some blocks... + + + Hold{*CONTROLLER_ACTION_ACTION*} to chop down 4 blocks of wood (tree trunks).{*B*}When a block breaks you can pick it up by standing near to the floating item that appears, causing it to appear in your inventory. + + + Press{*CONTROLLER_ACTION_CRAFTING*} to open the crafting interface. + + + As you collect and craft more items, your inventory will fill up.{*B*} + Press{*CONTROLLER_ACTION_INVENTORY*} to open the inventory. + + + As you move around, mine and attack, you will deplete your food bar{*ICON_SHANK_01*}. Sprinting and sprint jumping use a lot more food than walking and jumping normally. + + + If you lose some health, but have a food bar with 9 or more{*ICON_SHANK_01*} in it, your health will automatically replenish. Eating food will replenish your food bar. + + + With a food item in your hand, hold{*CONTROLLER_ACTION_USE*} to eat it and replenish your food bar. You cannot eat if your food bar is full. + + + Your food bar is low, and you have lost some health. Eat the steak in your inventory to replenish your food bar and start healing.{*ICON*}364{*/ICON*} + + + The wood that you have collected can be crafted into planks. Open the crafting interface to craft them.{*PlanksIcon*} + + + A lot of crafting can involve multiple steps. Now that you have some planks there are more items that you can craft. Create a crafting table.{*CraftingTableIcon*} + + + To make collecting blocks faster you can build tools designed for the job. Some tools have a handle made of sticks. Craft some sticks now.{*SticksIcon*} + + + Use{*CONTROLLER_ACTION_LEFT_SCROLL*} and{*CONTROLLER_ACTION_RIGHT_SCROLL*} to change the current held item. + + + Use{*CONTROLLER_ACTION_USE*} to use items, interact with objects and place some items. Items that have been placed can be picked up again by mining them with the right tool. + + + With the crafting table selected, point the crosshair where you want it and use{*CONTROLLER_ACTION_USE*} to place a crafting table. + + + Point the crosshair at the crafting table and press{*CONTROLLER_ACTION_USE*} to open it. + + + A shovel helps dig soft blocks, like dirt and snow, faster. As you collect more materials you can craft tools that work faster and last longer. Create a wooden shovel.{*WoodenShovelIcon*} + + + An axe helps chop wood and wooden tiles, faster. As you collect more materials you can craft tools that work faster and last longer. Create a wooden axe.{*WoodenHatchetIcon*} + + + A pickaxe helps dig hard blocks, like stone and ore, faster. As you collect more materials you can craft tools that work faster and last longer, and allow you to mine harder materials. Create a wooden pickaxe.{*WoodenPickaxeIcon*} + + + Open the container + + + + Night time can approach quickly, and it is dangerous to be outside unprepared. You can craft armor and weapons, but it is sensible to have a safe shelter. + + + + + Nearby there is an abandoned Miner's shelter that you can complete to be safe overnight. + + + + + You will need to collect the resources to complete the shelter. Walls and roof can be made of any tile type, but you will want to create a door, some windows and lighting. + + + + Use your pickaxe to mine some stone blocks. Stone blocks will produce cobblestone when mined. If you collect 8 cobblestone blocks you can build a furnace. You may need to dig through some dirt to reach the stone, so use your shovel for this.{*StoneIcon*} + + + You have collected enough cobblestone to build a furnace. Use your crafting table to create one. + + + Use{*CONTROLLER_ACTION_USE*} to place the furnace in the world, and then open it. + + + Use the furnace to create some charcoal. If you are waiting for it to finish how about using the time to collect more materials to finish the shelter? + + + Use the furnace to create some glass. If you are waiting for it to finish how about using the time to collect more materials to finish the shelter? + + + A good shelter will have a door so that you can easily go in and out without having to mine and replace the walls. Craft a wooden door now.{*WoodenDoorIcon*} + + + Use{*CONTROLLER_ACTION_USE*} to place the door. You can use{*CONTROLLER_ACTION_USE*} to open and close a wooden door in the world. + + + It can get very dark at night, so you will want some lighting inside your shelter so that you can see. Craft a torch now from sticks and charcoal using the crafting interface.{*TorchIcon*} + + + + You have completed the first part of the tutorial. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to continue with the tutorial.{*B*} + Press{*CONTROLLER_VK_B*} if you think you are ready to play on your own. + + + + + + This is your inventory. It shows items available for use in your hand, and all the other items that you are carrying. Your armor is also shown here. + + + + {*B*} + Press{*CONTROLLER_VK_A*} to continue.{*B*} + Press{*CONTROLLER_VK_B*} if you already know how to use the inventory. + + + + + Use{*CONTROLLER_MENU_NAVIGATE*} to move the pointer. Use{*CONTROLLER_VK_A*} to pick an item under the pointer. + If there is more than one item here this will pick them all up, or you can use{*CONTROLLER_VK_X*} to pick up just half of them. + + + + + Move this item with the pointer over another space in the inventory and place it down using{*CONTROLLER_VK_A*}. + With multiple items on the pointer, use{*CONTROLLER_VK_A*} to place them all, or{*CONTROLLER_VK_X*} to place just one. + + + + + If you move the pointer outside the edge of the interface with an item on the pointer, you can drop the item. + + + + + If you want more information about an item, move the pointer over the item and press{*CONTROLLER_VK_RT*} . + + + + + Press{*CONTROLLER_VK_B*} now to exit the inventory. + + + + + + + + This is the creative mode inventory. It shows items available for use in your hand, and all the other items that you can choose from. + + + + {*B*} + Press{*CONTROLLER_VK_A*} to continue.{*B*} + Press{*CONTROLLER_VK_B*} if you already know how to use the creative mode inventory. + + + + + Use{*CONTROLLER_MENU_NAVIGATE*} to move the pointer. + When on the item list, use{*CONTROLLER_VK_A*} to pick an item under the pointer, and use{*CONTROLLER_VK_Y*} to pick up a full stack of that item. + + + + + The pointer will automatically move over a space in the use row. You can place it down using{*CONTROLLER_VK_A*}. Once you have placed the item, the pointer will return to the item list where you can select another item. + + + + + If you move the pointer outside the edge of the interface with an item on the pointer, you can drop the item into the world. To clear all items in the quick select bar, press{*CONTROLLER_VK_X*}. + + + + + Scroll through the Group Type tabs at the top using{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*} to select the group type of the item you wish to pickup. + + + + + If you want more information about an item, move the pointer over the item and press{*CONTROLLER_VK_RT*} . + + + + + Press{*CONTROLLER_VK_B*} now to exit the creative mode inventory. + + + + + + This is the crafting interface. This interface allows you to combine the items you've collected to make new items. + + + + {*B*} + Press{*CONTROLLER_VK_A*} to continue.{*B*} + Press{*CONTROLLER_VK_B*} if you already know how to craft. + + + + {*B*} + Press{*CONTROLLER_VK_X*} to show the item description. + + + + {*B*} + Press{*CONTROLLER_VK_X*} to show the ingredients required to make the current item. + + + + {*B*} + Press{*CONTROLLER_VK_X*} to show the inventory again. + + + + + Scroll through the Group Type tabs at the top using{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*} to select the group type of the item you wish to craft, then use{*CONTROLLER_MENU_NAVIGATE*} to select the item to craft. + + + + + The crafting area shows the items you require in order to craft the new item. Press{*CONTROLLER_VK_A*} to craft the item and place it in your inventory. + + + + + You can craft a larger selection of items using a crafting table. Crafting on a table works in the same way as basic crafting, but you have a larger crafting area allowing more combinations of ingredients. + + + + + The bottom right part of the crafting interface shows your inventory. This area can also show a description of the currently selected item, and the ingredients required to craft it. + + + + + The description of the currently selected item is now displayed. The description can give you an idea of what the item can be used for. + + + + + The list of ingredients required to craft the selected item are now displayed. + + + + The wood that you have collected can be crafted into planks. Select the planks icon and press{*CONTROLLER_VK_A*} to create them.{*PlanksIcon*} + + + + Now you have built a crafting table you should place it in the world to enable you to build a larger selection of items.{*B*} + Press{*CONTROLLER_VK_B*} now to exit the crafting interface. + + + + + Press{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*} to change to the group type of the items you wish to craft. Select the tools group.{*ToolsIcon*} + + + + + Press{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*} to change to the group type of the items you wish to craft. Select the structures group.{*StructuresIcon*} + + + + + Use{*CONTROLLER_MENU_NAVIGATE*} to change to the item you wish to craft. Some items have multiple versions depending on the materials used. Select the wooden shovel.{*WoodenShovelIcon*} + + + + + A lot of crafting can involve multiple steps. Now that you have some planks there are more items that you can craft. Use{*CONTROLLER_MENU_NAVIGATE*} to change to the item you wish to craft. Select the crafting table.{*CraftingTableIcon*} + + + + + With the tools you have built you are off to a great start, and are able to collect a variety of different materials more efficiently.{*B*} + Press{*CONTROLLER_VK_B*} now to exit the crafting interface. + + + + + Some items can not be created using the crafting table, but require a furnace. Craft a furnace now.{*FurnaceIcon*} + + + + + Place the furnace you have crafted in the world. You will want to put this inside your shelter.{*B*} + Press{*CONTROLLER_VK_B*} now to exit the crafting interface. + + + + + + This is the furnace interface. A furnace allows you to change items by firing them. For example, you can turn iron ore into iron ingots in the furnace. + + + + {*B*} + Press{*CONTROLLER_VK_A*} to continue.{*B*} + Press{*CONTROLLER_VK_B*} if you already know how to use a furnace. + + + + + You need to put some fuel into the bottom slot of the furnace, and the item to be changed in the top slot. The furnace will then fire up and start working, putting the result in the right-hand slot. + + + + + Many wooden items can be used as fuels, but not everything burns for the same time. You may also discover other items in the world that can be used as a fuel. + + + + + When your items have been fired, you can move them from the output area into your inventory. You should experiment with different ingredients to see what you can make. + + + + + If you use wood as the ingredient then you can make charcoal. Put some fuel in the furnace and wood in the ingredient slot. It can take some time for the furnace to create the charcoal, so feel free to do something else and come back to check the progress. + + + + + Charcoal can be used as a fuel, as well as being crafted into a torch with a stick. + + + + + Placing sand in the ingredient slot allows you to make glass. Create some glass blocks to use as windows in your shelter. + + + + + + This is the brewing interface. You can use this to create potions that have a variety of different effects. + + + + {*B*} + Press{*CONTROLLER_VK_A*} to continue.{*B*} + Press{*CONTROLLER_VK_B*} if you already know how to use the brewing stand. + + + + + You brew potions by placing an ingredient in the top slot, and a potion or water bottle in the bottom slots (up to 3 can be brewed at one time). Once a valid combination is entered the brewing process will start and create the potion after a short time. + + + + + All potions start with a Water Bottle. Most potions are created by first using a Nether Wart to make an Awkward Potion, and will require at least one more ingredient to make the final potion. + + + + + Once you have a potion you can modify its effects. Adding Redstone Dust increases the duration of its effect and adding Glowstone Dust can make its effect more powerful. + + + + + Adding Fermented Spider Eye corrupts the potion and can turn it into a potion with the opposite effect, and adding Gunpowder turns the potion into a Splash Potion which can be thrown to apply its affect to a nearby area. + + + + + Create a Potion of Fire Resistance by first adding Nether Wart to a Water Bottle, and then adding Magma Cream. + + + + + Press{*CONTROLLER_VK_B*} now to exit the brewing interface. + + + + + + In this area there is a Brewing Stand, a Cauldron and a chest full of items for brewing. + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about brewing and potions.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about brewing and potions. + + + + + The first step in brewing a potion is to create a Water Bottle. Take a Glass Bottle from the chest. + + + + + You can fill a glass bottle from a Cauldron that has water in it, or from a block of water. Fill your glass bottle now by pointing at a water source and pressing{*CONTROLLER_ACTION_USE*}. + + + + + If a cauldron becomes empty, you can refill it with a Water Bucket. + + + + + Use the Brewing Stand to create a Potion of Fire Resistance. You will need a Water Bottle, Nether Wart and Magma Cream. + + + + + With a potion in your hand, hold{*CONTROLLER_ACTION_USE*} to use it. For a normal potion you will drink it and apply the effect to yourself, and for a Splash potion you will throw it and apply the effect to creatures near where it hits. + Splash potions can be created by adding gunpowder to normal potions. + + + + + Use your Potion of Fire Resistance on yourself. + + + + + Now that you are resistant to fire and lava, you should see if there are places you can get to that you couldn't before. + + + + + + This is the enchanting interface which you can use to add enchantments to weapons, armor and some tools. + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about the enchanting interface.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about the enchanting interface. + + + + + To enchant an item, first place it in the enchanting slot. Weapons, armor and some tools can be enchanted to add special effects such as improved damage resistance or increasing the number of items produced when mining a block. + + + + + When an item is placed in the enchanting slot, the buttons on the right will change to show a selection of random enchantments. + + + + + The number on the button represents the cost in experience levels to apply that enchantment to the item. If you do not have a high enough level the button will be disabled. + + + + + Select an enchantment and press{*CONTROLLER_VK_A*} to enchant the item. This will decrease your experience level by the cost of the enchantment. + + + + + Although the enchantments are all random, some of the better enchantments are only available when you have a high experience level and have lots of bookcases around the Enchantment Table to increase its power. + + + + + + In this area there is an Enchantment Table and some other items to help you learn about enchanting. + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about the enchanting.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about the enchanting. + + + + + Using an Enchantment Table allows you to add special effects such as increasing the number of items produced when mining a block, or improved damage resistance for weapons, armor and some tools. + + + + + Placing bookcases around the Enchantment Table increases its power and allows access to higher level enchantments. + + + + + Enchanting items costs Experience Levels, which can be built up by collecting Experience Orbs which are produced by killing monsters and animals, mining ores, breeding animals, fishing and smelting/cooking some things in a furnace. + + + + + You can also build experience levels using a Bottle O' Enchanting, which, when thrown, creates Experience Orbs around where it lands. These orbs can then be collected. + + + + + In the chests in this area you can find some enchanted items, Bottles O' Enchanting, and some items that have yet to be enchanted for you to experiment with at the Enchantment Table. + + + + + + You are now riding in a minecart. To exit the minecart, point the cursor at it and press{*CONTROLLER_ACTION_USE*} .{*MinecartIcon*} + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about minecarts.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about minecarts. + + + + + A minecart runs on rails. You can also craft a powered minecart with a furnace and a minecart with a chest in it. + {*RailIcon*} + + + + + You can also craft powered rails, which take power from redstone torches and circuits to accelerate the cart. These can be connected to switches, levers and pressure plates to make complex systems. + {*PoweredRailIcon*} + + + + + + You are now sailing a boat. To exit the boat, point the cursor at it and press{*CONTROLLER_ACTION_USE*} .{*BoatIcon*} + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about boats.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about boats. + + + + + A boat allows you to travel quicker over water. You can steer it using{*CONTROLLER_ACTION_MOVE*} and{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + + + + + + You are now using a fishing rod. Press{*CONTROLLER_ACTION_USE*} to use it.{*FishingRodIcon*} + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about fishing.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about fishing. + + + + + Press{*CONTROLLER_ACTION_USE*} to cast your line and start fishing. Press{*CONTROLLER_ACTION_USE*} again to reel in the fishing line. + {*FishingRodIcon*} + + + + + If you wait until the float sinks below the surface of the water before reeling in you can catch a fish. Fish can be eaten raw, or cooked by a furnace, to restore health. + {*FishIcon*} + + + + + As with many other tools a fishing rod has a fixed number of uses. Those uses are not limited to catching fish though. You should experiment with it to see what else can be caught or activated... + {*FishingRodIcon*} + + + + + + This is a bed. Press{*CONTROLLER_ACTION_USE*} while pointing at it at night to sleep through the night and awake in the morning.{*ICON*}355{*/ICON*} + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about beds.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about beds. + + + + + A bed should be placed in a safe, well-lit place so that monsters do not wake you in the middle of the night. Once you have used a bed, if you die you will respawn at that bed. + {*ICON*}355{*/ICON*} + + + + + If there are other players in your game, everyone must be in a bed at the same time to be able to sleep. + {*ICON*}355{*/ICON*} + + + + + + In this area there are some simple Redstone and Piston circuits, and a chest with more items to extend these circuits. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about Redstone circuits and Pistons.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about Redstone circuits and Pistons. + + + + + Levers, Buttons, Pressure Plates and Redstone Torches can all provide power to circuits, either by directly attaching them to the item you want to activate or by connecting them with Redstone dust. + + + + + The position and direction that you place a power source can change how it affects the surrounding blocks. For example a Redstone torch on the side of a block can be turned off if the block is powered by another source. + + + + + Redstone dust is collected by mining redstone ore with a pickaxe made of Iron, Diamond or Gold. You can use it to carry power up to 15 blocks, and it can travel up or down one block in height. + {*ICON*}331{*/ICON*} + + + + + Redstone repeaters can be used to extend the distance that the power is carried, or put a delay in a circuit. + {*ICON*}356{*/ICON*} + + + + + When powered, a Piston will extend, pushing up to 12 blocks. When they retract, Sticky Pistons can pull back one block of most types. + {*ICON*}33{*/ICON*} + + + + + In the chest in this area there are some components for making circuits with pistons. Try using or completing the circuits in this area, or put together your own. There are more examples outside the tutorial area. + + + + + + In this area there is a Portal to the Nether! + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about Portals and The Nether.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about Portals and The Nether. + + + + + Portals are created by placing Obsidian blocks into a frame four blocks wide and five blocks tall. The corner blocks are not required. + + + + + To activate a Nether Portal, set fire to the Obisidian blocks inside the frame with a Flint and Steel. Portals can be deactivated if their frame is broken, an explosion happens nearby or a liquid flows through them. + + + + + To use a Nether Portal, stand inside it. Your screen will go purple and a sound will play. After a few seconds you will be transported to another dimension. + + + + + The Nether can be a dangerous place, full of lava, but can be useful to collect Netherrack which burns forever when lit, and Glowstone which produces light. + + + + + The Nether world can be used to fast-travel in the Overworld - traveling one block distance in the Nether is equivalent to traveling 3 blocks in the Overworld. + + + + + + You are now in Creative mode. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about Creative mode.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about Creative mode. + + + + When in Creative mode you have in infinite number of all available items and blocks, you can destroy blocks with one click without a tool, you are invulnerable and you can fly. + + + Pressing{*CONTROLLER_ACTION_JUMP*} twice quickly will allow you to fly. To exit flying, repeat the action. To fly faster, push{*CONTROLLER_ACTION_MOVE*} forward twice in rapid succession while flying. +When in flying mode, you can hold down{*CONTROLLER_ACTION_JUMP*} to move up and{*CONTROLLER_ACTION_SNEAK*} to move down, or use the D-pad to move up, down, left or right. + + + Press{*CONTROLLER_ACTION_CRAFTING*} to open the creative inventory interface. + + + Make your way to the opposite side of this hole to continue. + + + You have now completed the Creative mode tutorial. + + + + + In this area a farm has been set up. Farming enables you to create a renewable source of food and other items. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about farming.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about farming. + + + + Wheat, Pumpkins and Melons are grown from seeds. Wheat seeds are collected by breaking Tall Grass or harvesting wheat, and Pumpkin and Melon seeds are crafted from Pumpkins and Melons respectively. + + + Before planting seeds the dirt blocks need to be turned into Farmland by using a Hoe. A nearby source of water will help keep the Farmland hydrated and make the crops grow faster, as will keeping the area lit. + + + Wheat goes through several stages when growing, and is ready to be harvested when it appears darker.{*ICON*}59:7{*/ICON*} + + + Pumpkins and Melons also need a block next to where you planted the seed for the fruit to grow once the stem has fully grown. + + + Sugarcane must be planted on a Grass, Dirt or Sand block that is right next to water block. Chopping a Sugarcane block will also drop all blocks that are above it.{*ICON*}83{*/ICON*} + + + Cacti must be planted on Sand, and will grow up to three blocks high. Like Sugarcane, destroying the lowest block will also allow you to collect the blocks that are above it.{*ICON*}81{*/ICON*} + + + Mushrooms should be planted in a dimly lit area, and will spread to nearby dimly lit blocks.{*ICON*}39{*/ICON*} + + + Bonemeal can be used to grow crops to their fully grown state, or grow Mushrooms into Huge Mushrooms.{*ICON*}351:15{*/ICON*} + + + You have now completed the farming tutorial. + + + + + In this area animals have been penned in. You can breed animals to produce baby versions of themselves. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about breeding.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about breeding. + + + + To get the animals to breed, you will need to feed them with the right food to get them to go into 'Love Mode'. + + + Feed Wheat to a cow, mooshroom, pig or sheep, Wheat Seeds or Nether Wart to a chicken, or any kind of meat to a wolf, and they'll start looking for another animal of the same species near them that is also in Love Mode. + + + When two animals of the same species meet, and both are in Love Mode, they will kiss for a few seconds, and then a baby animal will appear. The baby animal will follow their parents for a while before growing into a full sized animal itself. + + + After being in Love Mode, an animal will not be able to enter it again for about five minutes. + + + Some animals will follow you if you are holding Wheat in your hand. This makes it easier to group animals together to breed them.{*ICON*}296{*/ICON*} + + + You have now completed the breeding tutorial. + + + + + In this area are some pumpkins and blocks to make a Snow Golem and an Iron Golem. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about Golems.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about Golems. + + + + Golems are created by placing a pumpkin on top of a stack of blocks. + + + Snow Golems are created with two Snow Blocks, one of top of the other, with a pumpkin on top. Snow Golems throw snowballs at your enemies. + + + Iron Golems are created with four Iron Blocks in the pattern shown, with a pumpkin on top of the middle block. Iron Golems attack your enemies. + + + Iron Golems also appear naturally to protect villages, and will attack you if you attack any villagers. + + + + You cannot leave this area until you have completed the tutorial. + + + + Different tools are better for different materials. You should use a shovel to mine soft materials like earth and sand. + + + Different tools are better for different materials. You should use an axe to chop tree trunks. + + + Different tools are better for different materials. You should use a pickaxe to mine stone and ore. You may need to make your pickaxe from better materials to get resources from some blocks. + + + Certain tools are better for attacking enemies. Consider using a sword to attack. + + + Hint: Hold {*CONTROLLER_ACTION_ACTION*}to mine and chop using your hand or whatever you are holding. You may need to craft a tool to mine some blocks... + + + The tool you are using has become damaged. Every time you use a tool it becomes damaged, and will eventually break. The colored bar below the item in your inventory shows the current damage state. + + + Hold{*CONTROLLER_ACTION_JUMP*} to swim up. + + + In this area there is a minecart on a track. To enter the minecart, point the cursor at it and press{*CONTROLLER_ACTION_USE*}. Use{*CONTROLLER_ACTION_USE*} on the button to make the minecart move. + + + In the chest beside the river there is a boat. To use the boat, point the cursor at water and press{*CONTROLLER_ACTION_USE*}. Use{*CONTROLLER_ACTION_USE*} while pointing at the boat to enter it. + + + In the chest beside the pond there is a fishing rod. Take the fishing rod from the chest and select it as the current item in your hand to use it. + + + This more advanced piston mechanism creates a self-repairing bridge! Push the button to activate, then investigate how the components interact to learn more. + + + + If you move the pointer outside of the interface while carrying an item, you can drop that item. + + + + You do not have all the ingredients required to make this item. The box on the bottom left shows the ingredients required to craft this. + + + + + Congratulations, you have completed the tutorial. Time in the game is now passing normally, and you don't have long until night time and the monsters come out! Finish your shelter! + + + + {*EXIT_PICTURE*} When you are ready to explore further, there is a doorway in this area near the Miner's shelter that leads to a small castle. + + + Reminder: + + + + ]]> + + + + + New features have been added to the game in the latest version, including new areas in the tutorial world. + + + {*B*}Press{*CONTROLLER_VK_A*} to play through the tutorial as normal.{*B*} + Press{*CONTROLLER_VK_B*} to skip the main tutorial. + + + In this area you will find areas setup to help you learn about fishing, boats, pistons and redstone. + + + Outside of this area you will find examples of buildings, farming, minecarts and tracks, enchanting, brewing and more! + + + + + Your food bar has depleted to a level where you will no longer heal. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about the food bar and eating food.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about the food bar and eating food. + + + + + Select + + + Use + + + Back + + + Exit + + + Cancel + + + Cancel Join + + + Select Storage Device + + + Change Storage Device + + + Refresh Online Games List + + + Party Games + + + All Games + + + Change Group + + + Show Inventory + + + Show Description + + + Show Ingredients + + + Crafting + + + Create + + + Take/Place + + + Take + + + Take All + + + Take Half + + + Place + + + Place All + + + Place One + + + Drop + + + Drop All + + + Drop One + + + Swap + + + Quick Move + + + Clear Quick Select + + + What's This? + + + Share To Facebook + + + Change Filter + + + View Gamer Card + + + View Gamer Profile + + + Send Friend Request + + + Page Down + + + Page Up + + + Next + + + Previous + + + Kick Player + + + Dye + + + Mine + + + Feed + + + Tame + + + Heal + + + Sit + + + Follow Me + + + Eject + + + Empty + + + Saddle + + + Place + + + Hit + + + Milk + + + Collect + + + Eat + + + Sleep + + + Wake Up + + + Play + + + Ride + + + Sail + + + Grow + + + Swim Up + + + Open + + + Change Pitch + + + Detonate + + + Read + + + Hang + + + Throw + + + Plant + + + Till + + + Harvest + + + Continue + + + Unlock Full Game + + + Delete Save + + + Delete + + + Options + + + Invite Xbox LIVE Party + + + Invite Friends + + + Accept + + + Shear + + + Ban Level + + + Select Skin + + + Ignite + + + Navigate + + + Install Full Version + + + Install Trial Version + + + Install + + + Reinstall + + + + Save Options + + + Execute Command + + + Creative + + + Move Ingredient + + + Move Fuel + + + Move Tool + + + Move Armor + + + Move Weapon + + + + Equip + + + Draw + + + Release + + + Privileges + + + Block + + + Page Up + + + Page Down + + + Love Mode + + + Drink + + + Rotate + + + + OK + + + Cancel + + + Minecraft Store + + + + Are you sure you want to leave your current game and join the new one? Any unsaved progress will be lost. + + + Exit Game + + + + Save Game + + + Exit Without Saving + + + + Are you sure you want to overwrite any previous save for this world with the current version of this world? + + + Are you sure you want to exit without saving? You will lose all progress in this world! + + + + Start Game + + + If you create, load or save a world in Creative Mode, that world will have achievements and leaderboard updates disabled, even if it is then loaded in Survival Mode. Are you sure you want to continue? + + + This world has previously been saved in Creative Mode, and it will have achievements and leaderboard updates disabled. Are you sure you want to continue? + + + This world has previously been saved in Creative Mode, and it will have achievements and leaderboard updates disabled. + + + If you create, load or save a world with Host Privileges enabled, that world will have achievements and leaderboard updates disabled, even if it is then loaded with those options off. Are you sure you want to continue? + + + + Damaged Save + + + This save is corrupt or damaged. Would you like to delete it? + + + + Are you sure you want to exit to the main menu and disconnect all players from the game? Any unsaved progress will be lost. + + + + Exit and save + + + Exit without saving + + + + Are you sure you want to exit to the main menu? Any unsaved progress will be lost. + + + Are you sure you want to exit to the main menu? Your progress will be lost! + + + Create New World + + + Play Tutorial + + + Tutorial + + + Name Your World + + + + Enter a name for your world + + + Input the seed for your world generation + + + + Load Saved World + + + Press START to join game + + + + Exiting the game + + + + An error occurred. Exiting to the main menu. + + + + Connection failed + + + Connection lost + + + + Connection to the server was lost. Exiting to the main menu. + + + Connection to Xbox LIVE was lost. Exiting to the main menu. + + + Connection to Xbox LIVE was lost. + + + + Disconnected by the server + + + You were kicked from the game + + + You were kicked from the game for flying + + + Connection attempt took too long + + + The server is full + + + The host has exited the game. + + + You cannot join this game as you are not friends with anybody in the game. + + + You cannot join this game as you have previously been kicked by the host. + + + You cannot join this game as the player you are trying to join is running an older version of the game. + + + You cannot join this game as the player you are trying to join is running a newer version of the game. + + + + New World + + + Award Unlocked! + + + + Hurray - you've been awarded a gamerpic featuring Steve from Minecraft! + + + Hurray - you've been awarded a gamerpic featuring a Creeper! + + + Hurray - you've been awarded an avatar item - a Minecraft: Xbox 360 Edition t-shirt! +Go to the dashboard to put the t-shirt on your avatar. + + + Hurray - you've been awarded an avatar item - a Minecraft: Xbox 360 Edition watch! +Go to the dashboard to put the watch on your avatar. + + + Hurray - you've been awarded an avatar item - a Creeper baseball cap! +Go to the dashboard to put the cap on your avatar. + + + Hurray - you've been awarded the Minecraft: Xbox 360 Edition theme! +Go to the dashboard to select this theme. + + + + Unlock Full Game + + + You're playing the trial game, but you'll need the full game to be able to save your game. +Would you like to unlock the full game now? + + + This is the Minecraft: Xbox 360 Edition trial game. If you had the full game, you would just have earned an achievement! +Unlock the full game to experience the joy of Minecraft: Xbox 360 Edition and to play with your friends across the globe through Xbox LIVE. +Would you like to unlock the full game? + + + This is the Minecraft: Xbox 360 Edition trial game. If you had the full game, you would just have earned an avatar award! +Unlock the full game to experience the joy of Minecraft: Xbox 360 Edition and to play with your friends across the globe through Xbox LIVE. +Would you like to unlock the full game? + + + This is the Minecraft: Xbox 360 Edition trial game. If you had the full game, you would just have earned a gamerpic! +Unlock the full game to experience the joy of Minecraft: Xbox 360 Edition and to play with your friends across the globe through Xbox LIVE. +Would you like to unlock the full game? + + + This is the Minecraft: Xbox 360 Edition trial game. If you had the full game, you would just have earned a theme! +Unlock the full game to experience the joy of Minecraft: Xbox 360 Edition and to play with your friends across the globe through Xbox LIVE. +Would you like to unlock the full game? + + + This is the Minecraft: Xbox 360 Edition trial game. You need the full game to be able to accept this invite. +Would you like to unlock the full game? + + + Guest players cannot unlock the full game. Please sign in with an Xbox LIVE user ID. + + + + Please wait + + + No results + + + Filter: + + + Friends + + + My Score + + + Overall + + + Entries: + + + Rank + + + Gamertag + + + + Preparing to Save Level + + + Preparing Chunks... + + + Finalizing... + + + Building Terrain + + + Simulating world for a bit + + + Initializing server + + + Generating spawn area + + + Loading spawn area + + + Entering The Nether + + + Leaving The Nether + + + Respawning + + + Generating level + + + Loading level + + + Saving players + + + Connecting to host + + + Downloading terrain + + + Switching to offline game + + + Please wait while the host saves the game + + + Entering The END + + + Leaving The END + + + + This bed is occupied + + + You can only sleep at night + + + %s is sleeping in a bed. To skip to dawn, all players need to sleep in beds at the same time. + + + Your home bed was missing or obstructed + + + You may not rest now, there are monsters nearby + + + + You are sleeping in a bed. To skip to dawn, all players need to sleep in beds at the same time. + + + + Tools and Weapons + + + Weapons + + + Food + + + Structures + + + Armor + + + Mechanisms + + + Transport + + + Decorations + + + Building Blocks + + + Redstone & Transportation + + + Miscellaneous + + + Brewing - Press{*CONTROLLER_VK_LT*} to cycle strength + + + Brewing - Press LT to cycle strength + + + + Tools, Weapons & Armor + + + Materials + + + + Signed out + + + You have been returned to the title screen because your gamer profile was signed out + + + + Difficulty + + + Music + + + Sound + + + Gamma + + + Game Sensitivity + + + Interface Sensitivity + + + Peaceful + + + Easy + + + Normal + + + Hard + + + + In this mode, the player regains health over time, and there are no enemies in the environment. + + + In this mode, enemies spawn in the environment, but will do less damage to the player than in the Normal mode. + + + In this mode, enemies spawn in the environment and will do a standard amount of damage to the player. + + + In this mode, enemies will spawn in the environment, and will do a great deal of damage to the player. Watch out for the Creepers too, since they are unlikely to cancel their exploding attack when you move away from them! + + + + Trial Timeout + + + You've been playing the Minecraft: Xbox 360 Edition Trial Game for the maximum time allowed! To continue the fun, would you like to unlock the full game? + + + + Game full + + + Failed to join game as there are no spaces left + + + + Enter Sign Text + + + Enter a line of text for your sign + + + + Enter Title + + + Enter a title for your post + + + Enter Caption + + + Enter a caption for your post + + + Enter Description + + + Enter a description for your post + + + + Inventory + + + Ingredients + + + Brewing Stand + + + Chest + + + Enchant + + + Furnace + + + Ingredient + + + Fuel + + + Dispenser + + + + There are no downloadable content offers of this type available for this title at the moment. + + + %s has joined the game. + + + %s has left the game. + + + %s was kicked from the game. + + + Are you sure you want to delete this save game? + + + Awaiting approval + + + Censored + + + + Now playing: + + + + Reset Settings + + + Are you sure you would like to reset your settings to their default values? + + + + Loading Error + + + + "Minecraft: Xbox 360 Edition" has failed to load, and cannot continue. + + + + %s's Game + + + Unknown host game + + + + Guest signed out + + + A guest player has signed out causing all guest players to be removed from the game. + + + Sign in + + + You are not signed in. In order to play this game, you will need to be signed in. Do you want to sign in now? + + + Multiplayer not allowed + + + Failed to join the game as one or more players are not allowed to play multiplayer games on Xbox LIVE. + + + Failed to create an online game as one or more players are not allowed to play multiplayer games on Xbox LIVE. Uncheck the "Online Game" box to start an offline game. + + + You are not allowed to join this game session because your Member Content privilege setting is too restrictive. Please change this setting in the Privacy and Online Settings portion of the Xbox dashboard if you would like to join this session. + + + You are not allowed to join this game session because one of your local players has a Member Content privilege setting that is too restrictive. + + + You are not allowed to join this game session because a player in the session has a Member Content privilege setting of Friends Only, and you are not on their Friends List. + + + Failed to create game + + + You are not allowed to create this game session because one of your local players has a Member Content privilege setting that is too restrictive. Uncheck the "Online Game" box to start an offline game, or change this setting in the Privacy and Online Settings portion of the Xbox dashboard. + + + + Auto Selected + + + No Pack: Default Skins + + + Favorite Skins + + + + + Banned Level + + + + The game you are joining is in your banned level list. +If you choose to join this game, the level will be removed from your banned level list. + + + + Ban This Level? + + + + Are you sure you want to add this level to your banned level list? +Selecting OK will also exit this game. + + + + Remove from Banned List + + + + Autosave Interval + + + + Autosave Interval: OFF + + + Mins + + + Can't Place Here! + + + Placing lava close to the level spawn point is not allowed due to the possibility of instant death for spawning players. + + + + This game has a level autosave feature. When you see the icon above displayed, the game is saving your data. +Please do not turn off your Xbox 360 console while this icon is on-screen. + + + + Interface Opacity + + + + Preparing to Autosave Level + + + + HUD Size + + + HUD Size (Splitscreen) + + + + Seed + + + + Unlock Skin Pack + + + To use the skin you have selected, you need to unlock this skin pack. +Would you like to unlock this skin pack now? + + + Unlock Texture Pack + + + To use this texture pack for your world, you need to unlock it. +Would you like to unlock it now? + + + Trial Texture Pack + + + You are using a trial version of the texture pack. You will not be able to save this world unless you unlock the full version. +Would you like to unlock the full version of the texture pack? + + + + Texture Pack Not Present + + + + Unlock Full Version + + + + Download Trial Version + + + Download Full Version + + + This world uses a mash-up pack or texture pack you don't have! +Would you like to install the mash-up pack or texture pack now? + + + + Get Trial Version + + + Get Full Version + + + + Kick player + + + Are you sure you want to kick this player from the game? They will not be able to rejoin until you restart the world. + + + + Gamerpics Packs + + + Themes + + + Skins Packs + + + Allow friends of friends + + + You cannot join this game because it has been limited to players who are friends of the host. + + + Can't Join Game + + + + Selected + + + Selected skin: + + + + Corrupt Downloadable Content + + + This downloadable content is corrupt and cannot be used. You need to delete it, then re-install it from the Minecraft Store menu. + + + Some of your downloadable content is corrupt and cannot be used. You need to delete them, then re-install them from the Minecraft Store menu. + + + Your game mode has been changed + + + Rename Your World + + + Enter the new name for your world + + + + Game Mode: Survival + + + Game Mode: Creative + + + Survival + + + Creative + + + Created in Survival Mode + + + Created in Creative Mode + + + Render Clouds + + + What would you like to do with this save game? + + + Rename Save + + + Autosaving in %d... + + + + On + + + Off + + + Normal + + + Superflat + + + When enabled, the game will be an online game. + + + When enabled, only invited players can join. + + + When enabled, friends of people on your Friends List can join the game. + + + When enabled, players can inflict damage on other players. Only affects Survival mode. + + + When disabled, players joining the game cannot build or mine until authorised. + + + When enabled, fire may spread to nearby flammable blocks. + + + When enabled, TNT will explode when activated. + + + When enabled, the host can toggle their ability to fly, disable exhaustion, and make themselves invisible from the in-game menu. Disables achievements and leaderboard updates. + + + When enabled, the Nether world will be re-generated. This is useful if you have an older save where Nether Fortresses were not present. + + + When enabled, structures such as Villages and Strongholds will generate in the world. + + + When enabled, a completely flat world will be generated in the Overworld and in the Nether. + + + When enabled, a chest containing some useful items will be created near the player spawn point. + + + Skin Packs + + + Themes + + + Gamerpics + + + Avatar Items + + + Texture Packs + + + Mash-Up Packs + + + + + {*PLAYER*} went up in flames + + + {*PLAYER*} burned to death + + + {*PLAYER*} tried to swim in lava + + + {*PLAYER*} suffocated in a wall + + + {*PLAYER*} drowned + + + {*PLAYER*} starved to death + + + {*PLAYER*} was pricked to death + + + {*PLAYER*} hit the ground too hard + + + {*PLAYER*} fell out of the world + + + {*PLAYER*} died + + + {*PLAYER*} blew up + + + {*PLAYER*} was killed by magic + + + {*PLAYER*} was killed by Enderdragon breath + + + {*PLAYER*} was slain by {*SOURCE*} + + + {*PLAYER*} was slain by {*SOURCE*} + + + {*PLAYER*} was shot by {*SOURCE*} + + + {*PLAYER*} was fireballed by {*SOURCE*} + + + {*PLAYER*} was pummeled by {*SOURCE*} + + + {*PLAYER*} was killed by {*SOURCE*} + + + + Bedrock Fog + + + + Display HUD + + + + Display Hand + + + + Splitscreen Gamertags + + + + Death Messages + + + + Animated Character + + + + Custom Skin Animation + + + + You can no longer mine or use items + + + You can now mine and use items + + + You can no longer place blocks + + + You can now place blocks + + + You can now use doors and switches + + + You can no longer use doors and switches + + + You can now use containers (e.g. chests) + + + You can no longer use containers (e.g. chests) + + + You can no longer attack mobs + + + You can now attack mobs + + + You can no longer attack players + + + You can now attack players + + + You can no longer attack animals + + + You can now attack animals + + + You are now a moderator + + + You are no longer a moderator + + + You can now fly + + + You can no longer fly + + + You will no longer get exhausted + + + You will now get exhausted + + + You are now invisible + + + You are no longer invisible + + + You are now invulnerable + + + You are no longer invulnerable + + + %d MSP + + + Enderdragon + + + %s has entered The End + + + %s has left The End + + + + +{*C3*}I see the player you mean.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Yes. Take care. It has reached a higher level now. It can read our thoughts.{*EF*}{*B*}{*B*} +{*C2*}That doesn't matter. It thinks we are part of the game.{*EF*}{*B*}{*B*} +{*C3*}I like this player. It played well. It did not give up.{*EF*}{*B*}{*B*} +{*C2*}It is reading our thoughts as though they were words on a screen.{*EF*}{*B*}{*B*} +{*C3*}That is how it chooses to imagine many things, when it is deep in the dream of a game.{*EF*}{*B*}{*B*} +{*C2*}Words make a wonderful interface. Very flexible. And less terrifying than staring at the reality behind the screen.{*EF*}{*B*}{*B*} +{*C3*}They used to hear voices. Before players could read. Back in the days when those who did not play called the players witches, and warlocks. And players dreamed they flew through the air, on sticks powered by demons.{*EF*}{*B*}{*B*} +{*C2*}What did this player dream?{*EF*}{*B*}{*B*} +{*C3*}This player dreamed of sunlight and trees. Of fire and water. It dreamed it created. And it dreamed it destroyed. It dreamed it hunted, and was hunted. It dreamed of shelter.{*EF*}{*B*}{*B*} +{*C2*}Hah, the original interface. A million years old, and it still works. But what true structure did this player create, in the reality behind the screen?{*EF*}{*B*}{*B*} +{*C3*}It worked, with a million others, to sculpt a true world in a fold of the {*EF*}{*NOISE*}{*C3*}, and created a {*EF*}{*NOISE*}{*C3*} for {*EF*}{*NOISE*}{*C3*}, in the {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}It cannot read that thought.{*EF*}{*B*}{*B*} +{*C3*}No. It has not yet achieved the highest level. That, it must achieve in the long dream of life, not the short dream of a game.{*EF*}{*B*}{*B*} +{*C2*}Does it know that we love it? That the universe is kind?{*EF*}{*B*}{*B*} +{*C3*}Sometimes, through the noise of its thoughts, it hears the universe, yes.{*EF*}{*B*}{*B*} +{*C2*}But there are times it is sad, in the long dream. It creates worlds that have no summer, and it shivers under a black sun, and it takes its sad creation for reality.{*EF*}{*B*}{*B*} +{*C3*}To cure it of sorrow would destroy it. The sorrow is part of its own private task. We cannot interfere.{*EF*}{*B*}{*B*} +{*C2*}Sometimes when they are deep in dreams, I want to tell them, they are building true worlds in reality. Sometimes I want to tell them of their importance to the universe. Sometimes, when they have not made a true connection in a while, I want to help them to speak the word they fear.{*EF*}{*B*}{*B*} +{*C3*}It reads our thoughts.{*EF*}{*B*}{*B*} +{*C2*}Sometimes I do not care. Sometimes I wish to tell them, this world you take for truth is merely {*EF*}{*NOISE*}{*C2*} and {*EF*}{*NOISE*}{*C2*}, I wish to tell them that they are {*EF*}{*NOISE*}{*C2*} in the {*EF*}{*NOISE*}{*C2*}. They see so little of reality, in their long dream.{*EF*}{*B*}{*B*} +{*C3*}And yet they play the game.{*EF*}{*B*}{*B*} +{*C2*}But it would be so easy to tell them...{*EF*}{*B*}{*B*} +{*C3*}Too strong for this dream. To tell them how to live is to prevent them living.{*EF*}{*B*}{*B*} +{*C2*}I will not tell the player how to live.{*EF*}{*B*}{*B*} +{*C3*}The player is growing restless.{*EF*}{*B*}{*B*} +{*C2*}I will tell the player a story.{*EF*}{*B*}{*B*} +{*C3*}But not the truth.{*EF*}{*B*}{*B*} +{*C2*}No. A story that contains the truth safely, in a cage of words. Not the naked truth that can burn over any distance.{*EF*}{*B*}{*B*} +{*C3*}Give it a body, again.{*EF*}{*B*}{*B*} +{*C2*}Yes. Player...{*EF*}{*B*}{*B*} +{*C3*}Use its name.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Player of games.{*EF*}{*B*}{*B*} +{*C3*}Good.{*EF*}{*B*}{*B*} + + + + + +{*C2*}Take a breath, now. Take another. Feel air in your lungs. Let your limbs return. Yes, move your fingers. Have a body again, under gravity, in air. Respawn in the long dream. There you are. Your body touching the universe again at every point, as though you were separate things. As though we were separate things.{*EF*}{*B*}{*B*} +{*C3*}Who are we? Once we were called the spirit of the mountain. Father sun, mother moon. Ancestral spirits, animal spirits. Jinn. Ghosts. The green man. Then gods, demons. Angels. Poltergeists. Aliens, extraterrestrials. Leptons, quarks. The words change. We do not change.{*EF*}{*B*}{*B*} +{*C2*}We are the universe. We are everything you think isn't you. You are looking at us now, through your skin and your eyes. And why does the universe touch your skin, and throw light on you? To see you, player. To know you. And to be known. I shall tell you a story.{*EF*}{*B*}{*B*} +{*C2*}Once upon a time, there was a player.{*EF*}{*B*}{*B*} +{*C3*}The player was you, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Sometimes it thought itself human, on the thin crust of a spinning globe of molten rock. The ball of molten rock circled a ball of blazing gas that was three hundred and thirty thousand times more massive than it. They were so far apart that light took eight minutes to cross the gap. The light was information from a star, and it could burn your skin from a hundred and fifty million kilometres away.{*EF*}{*B*}{*B*} +{*C2*}Sometimes the player dreamed it was a miner, on the surface of a world that was flat, and infinite. The sun was a square of white. The days were short; there was much to do; and death was a temporary inconvenience.{*EF*}{*B*}{*B*} +{*C3*}Sometimes the player dreamed it was lost in a story.{*EF*}{*B*}{*B*} +{*C2*}Sometimes the player dreamed it was other things, in other places. Sometimes these dreams were disturbing. Sometimes very beautiful indeed. Sometimes the player woke from one dream into another, then woke from that into a third.{*EF*}{*B*}{*B*} +{*C3*}Sometimes the player dreamed it watched words on a screen.{*EF*}{*B*}{*B*} +{*C2*}Let's go back.{*EF*}{*B*}{*B*} +{*C2*}The atoms of the player were scattered in the grass, in the rivers, in the air, in the ground. A woman gathered the atoms; she drank and ate and inhaled; and the woman assembled the player, in her body.{*EF*}{*B*}{*B*} +{*C2*}And the player awoke, from the warm, dark world of its mother's body, into the long dream.{*EF*}{*B*}{*B*} +{*C2*}And the player was a new story, never told before, written in letters of DNA. And the player was a new program, never run before, generated by a sourcecode a billion years old. And the player was a new human, never alive before, made from nothing but milk and love.{*EF*}{*B*}{*B*} +{*C3*}You are the player. The story. The program. The human. Made from nothing but milk and love.{*EF*}{*B*}{*B*} +{*C2*}Let's go further back.{*EF*}{*B*}{*B*} +{*C2*}The seven billion billion billion atoms of the player's body were created, long before this game, in the heart of a star. So the player, too, is information from a star. And the player moves through a story, which is a forest of information planted by a man called Julian, on a flat, infinite world created by a man called Markus, that exists inside a small, private world created by the player, who inhabits a universe created by...{*EF*}{*B*}{*B*} +{*C3*}Shush. Sometimes the player created a small, private world that was soft and warm and simple. Sometimes hard, and cold, and complicated. Sometimes it built a model of the universe in its head; flecks of energy, moving through vast empty spaces. Sometimes it called those flecks "electrons" and "protons".{*EF*}{*B*}{*B*} + + + + + +{*C2*}Sometimes it called them "planets" and "stars".{*EF*}{*B*}{*B*} +{*C2*}Sometimes it believed it was in a universe that was made of energy that was made of offs and ons; zeros and ones; lines of code. Sometimes it believed it was playing a game. Sometimes it believed it was reading words on a screen.{*EF*}{*B*}{*B*} +{*C3*}You are the player, reading words...{*EF*}{*B*}{*B*} +{*C2*}Shush... Sometimes the player read lines of code on a screen. Decoded them into words; decoded words into meaning; decoded meaning into feelings, emotions, theories, ideas, and the player started to breathe faster and deeper and realised it was alive, it was alive, those thousand deaths had not been real, the player was alive{*EF*}{*B*}{*B*} +{*C3*}You. You. You are alive.{*EF*}{*B*}{*B*} +{*C2*}and sometimes the player believed the universe had spoken to it through the sunlight that came through the shuffling leaves of the summer trees{*EF*}{*B*}{*B*} +{*C3*}and sometimes the player believed the universe had spoken to it through the light that fell from the crisp night sky of winter, where a fleck of light in the corner of the player's eye might be a star a million times as massive as the sun, boiling its planets to plasma in order to be visible for a moment to the player, walking home at the far side of the universe, suddenly smelling food, almost at the familiar door, about to dream again{*EF*}{*B*}{*B*} +{*C2*}and sometimes the player believed the universe had spoken to it through the zeros and ones, through the electricity of the world, through the scrolling words on a screen at the end of a dream{*EF*}{*B*}{*B*} +{*C3*}and the universe said I love you{*EF*}{*B*}{*B*} +{*C2*}and the universe said you have played the game well{*EF*}{*B*}{*B*} +{*C3*}and the universe said everything you need is within you{*EF*}{*B*}{*B*} +{*C2*}and the universe said you are stronger than you know{*EF*}{*B*}{*B*} +{*C3*}and the universe said you are the daylight{*EF*}{*B*}{*B*} +{*C2*}and the universe said you are the night{*EF*}{*B*}{*B*} +{*C3*}and the universe said the darkness you fight is within you{*EF*}{*B*}{*B*} +{*C2*}and the universe said the light you seek is within you{*EF*}{*B*}{*B*} +{*C3*}and the universe said you are not alone{*EF*}{*B*}{*B*} +{*C2*}and the universe said you are not separate from every other thing{*EF*}{*B*}{*B*} +{*C3*}and the universe said you are the universe tasting itself, talking to itself, reading its own code{*EF*}{*B*}{*B*} +{*C2*}and the universe said I love you because you are love.{*EF*}{*B*}{*B*} +{*C3*}And the game was over and the player woke up from the dream. And the player began a new dream. And the player dreamed again, dreamed better. And the player was the universe. And the player was love.{*EF*}{*B*}{*B*} +{*C3*}You are the player.{*EF*}{*B*}{*B*} +{*C2*}Wake up.{*EF*} + + + + + Reset Nether + + + + Are you sure you want to reset the Nether in this savegame to its default state? You will lose anything you have built in the Nether! + + + + Reset Nether + + + Don't Reset Nether + + + + Can't shear this Mooshroom at the moment. The maximum number of Pigs, Sheep, Cows and Cats has been reached. + + + Can't use Spawn Egg at the moment. The maximum number of Pigs, Sheep, Cows and Cats has been reached. + + + Can't use Spawn Egg at the moment. The maximum number of Mooshrooms has been reached. + + + + Can't use Spawn Egg at the moment. The maximum number of Wolves in a world has been reached. + + + Can't use Spawn Egg at the moment. The maximum number of Chickens in a world has been reached. + + + + Can't use Spawn Egg at the moment. The maximum number of Squid in a world has been reached. + + + + Can't use Spawn Egg at the moment. The maximum number of enemies in a world has been reached. + + + Can't use Spawn Egg at the moment. The maximum number of villagers in a world has been reached. + + + The maximum number of Paintings/Item Frames in a world has been reached. + + + You can't spawn enemies in Peaceful mode. + + + This animal can't enter Love Mode. The maximum number of breeding Pigs, Sheep, Cows and Cats has been reached. + + + This animal can't enter Love Mode. The maximum number of breeding Wolves has been reached. + + + This animal can't enter Love Mode. The maximum number of breeding Chickens has been reached. + + + + This animal can't enter Love Mode. The maximum number of breeding Mooshrooms has been reached. + + + The maximum number of Boats in a world has been reached. + + + The maximum number of Mob Heads in a world has been reached. + + + + Invert Look + + + Southpaw + + + You Died! + + + Respawn + + + Downloadable Content Offers + + + + Change Skin + + + How To Play + + + Controls + + + Settings + + + Credits + + + Reinstall Content + + + Debug Settings + + + + Fire Spreads + + + TNT Explodes + + + Player vs Player + + + Trust Players + + + Host Privileges + + + Generate Structures + + + Superflat World + + + Bonus Chest + + + World Options + + + + Can Build and Mine + + + Can Use Doors and Switches + + + Can Open Containers + + + Can Attack Players + + + Can Attack Animals + + + Moderator + + + Kick Player + + + Can Fly + + + Disable Exhaustion + + + Invisible + + + Host Options + + + Players/Invite + + + + Online Game + + + Invite Only + + + More Options + + + Load + + + New World + + + World Name + + + Seed for the World Generator + + + Leave blank for a random seed + + + Players + + + Join Game + + + Start Game + + + No Games Found + + + + Play Game + + + Leaderboards + + + Achievements + + + Help & Options + + + Unlock Full Game + + + Resume Game + + + Save Game + + + + Difficulty: + + + Game Type: + + + Gamertags: + + + Structures: + + + Level Type: + + + PvP: + + + Trust Players: + + + TNT: + + + Fire Spreads: + + + + + Reinstall Theme + + + Reinstall Gamerpic 1 + + + Reinstall Gamerpic 2 + + + Reinstall Avatar Item 1 + + + Reinstall Avatar Item 2 + + + Reinstall Avatar Item 3 + + + + Options + + + Audio + + + Control + + + Graphics + + + User Interface + + + Reset to Defaults + + + + View Bobbing + + + Hints + + + In-Game Tooltips + + + In-Game Gamertags + + + 2 Player Split-screen Vertical + + + + Done + + + Edit sign message: + + + + Fill in the details to accompany your screenshot + + + Caption + + + Screenshot from in-game + + + Edit sign message: + + + Look what I made in Minecraft: Xbox 360 Edition! + + + + + The classic Minecraft textures, icons and user interface! + + + + + No Effects + + + Swiftness + + + Slowness + + + Haste + + + Mining Fatigue + + + Strength + + + Weakness + + + Instant Health + + + Instant Damage + + + Jump Boost + + + Nausea + + + Regeneration + + + Resistance + + + Fire Resistance + + + Water Breathing + + + Invisibility + + + Blindness + + + Night Vision + + + Hunger + + + Poison + + + + of Swiftness + + + of Slowness + + + of Haste + + + of Dullness + + + of Strength + + + of Weakness + + + of Healing + + + of Harming + + + of Leaping + + + of Nausea + + + of Regeneration + + + of Resistance + + + of Fire Resistance + + + of Water Breathing + + + of Invisibility + + + of Blindness + + + of Night Vision + + + of Hunger + + + of Poison + + + + + + + II + + + III + + + IV + + + + + Splash + + + Mundane + + + Uninteresting + + + Bland + + + Clear + + + Milky + + + Diffuse + + + Artless + + + Thin + + + Awkward + + + Flat + + + Bulky + + + Bungling + + + Buttered + + + Smooth + + + Suave + + + Debonair + + + Thick + + + Elegant + + + Fancy + + + Charming + + + Dashing + + + Refined + + + Cordial + + + Sparkling + + + Potent + + + Foul + + + Odorless + + + Rank + + + Harsh + + + Acrid + + + Gross + + + Stinky + + + + Used as the base of all potions. Use in a brewing stand to create potions. + + + Has no effects, can be used in a brewing stand to create potions by adding more ingredients. + + + Increases affected players, animals and monsters movement speed, and players sprinting speed, jumping length and field of view. + + + Reduces affected players, animals and monsters movement speed, and players sprinting speed, jumping length and field of view. + + + Increase the damage caused by affected players and monsters when attacking. + + + Reduces the damage cause by affected players and monsters when attacking. + + + Instantly increases the affected players, animals and monsters health. + + + Instantly reduces the affected players, animals and monsters health. + + + Restores health to the affected players, animals and monsters over time. + + + Makes the affected players, animals and monsters immune to damage from fire, lava, and ranged Blaze attacks. + + + Reduces health of the affected players, animals and monsters over time. + + + + Sharpness + + + Smite + + + Bane of Arthropods + + + Knockback + + + Fire Aspect + + + Protection + + + Fire Protection + + + Feather Falling + + + Blast Protection + + + Projectile Protection + + + Respiration + + + Aqua Affinity + + + Efficiency + + + Silk Touch + + + Unbreaking + + + Looting + + + Fortune + + + Power + + + Flame + + + Punch + + + Infinity + + + + I + + + II + + + III + + + IV + + + V + + + VI + + + VII + + + VIII + + + IX + + + X + + + + + diff --git a/Minecraft.Client/Common/Media/es-ES/4J_strings.resx b/Minecraft.Client/Common/Media/es-ES/4J_strings.resx new file mode 100644 index 00000000..ea428db6 --- /dev/null +++ b/Minecraft.Client/Common/Media/es-ES/4J_strings.resx @@ -0,0 +1,108 @@ + +Sin usar + +Aceptar + +Atrás + +Cancelar + +Sí + +No + +Archivo dañado + +Parece que tus datos guardados están dañados. ¿Crear un nuevo archivo de guardado y sobrescribir el archivo dañado? + +No hay espacio libre + +El dispositivo de almacenamiento seleccionado no tiene suficiente espacio libre para crear un archivo de guardado. + +Volver a seleccionar + +Jugar sin guardar + +Crear nuevo archivo de guardado + +¿Sobrescribir archivo guardado? + +El dispositivo de almacenamiento seleccionado ya contiene este archivo guardado. ¿Te parece bien sobrescribirlo? + +No, no sobrescribir. + +Sobrescribir y guardar. + +Error al guardar + +Problema con disp. almacenaje + +El dispositivo de almacenamiento no está disponible o produce un error. + +El dispositivo de almacenamiento no está disponible o produce un error. Selecciona un nuevo dispositivo de almacenamiento. + +Sel. nuevo disp. almacenamiento. + +No disp. de almacenaje selec. + +Si no seleccionas un dispositivo de almacenamiento, se deshabilitará la función de guardado de juegos. + +Selecciona disp. almacenamiento + +Continuar sin guardar + +Se ha extraído el dispositivo de almacenamiento. Selecciona uno nuevo. + +Error al cargar + +Nombrar el archivo de guardado + +Escribe un nombre para tu archivo de guardado. + +Volver a la Interfaz Xbox + +¿Seguro que quieres salir del juego? + +Sesión cerrada + +Has vuelto a la pantalla de título porque tu perfil de jugador ha cerrado la sesión. + +La partida ha finalizado porque un perfil de jugador ha cerrado la sesión. + +Seguir jugando + +Perfil de jugador no en línea + +Este juego ofrece características que requieren un perfil de jugador habilitado para Xbox Live, pero en estos momentos estás desconectado. + +Esta característica requiere un perfil de jugador con sesión iniciada en Xbox Live. + +Conectarse a Xbox Live + +Seguir jugando sin conexión + +Problema con el premio de logro + + Se ha producido un problema al acceder a tu perfil de jugador. No se puede conceder tu logro en este momento. + +Problema con perfil de jugador + +Se ha producido un error al guardar la configuración en el perfil de jugador. + +Perfil de jugador de invitado + +El perfil de jugador de invitado no puede acceder a esta característica. Usa un perfil de jugador diferente. + +Guardando… + +Guardando contenido. No apagues tu consola. + +Desbloquear juego completo + +Esta es la versión de prueba de Minecraft. Si tuvieras el juego completo, ¡habrías conseguido un logro! +Desbloquea el juego completo para vivir toda la emoción de Minecraft y jugar con amigos de todo el mundo a través de Xbox Live. +¿Te gustaría desbloquear el juego completo? + +Volverás al menú principal porque se ha producido un error al leer tu perfil. + + diff --git a/Minecraft.Client/Common/Media/es-ES/strings.resx b/Minecraft.Client/Common/Media/es-ES/strings.resx new file mode 100644 index 00000000..6fbeff35 --- /dev/null +++ b/Minecraft.Client/Common/Media/es-ES/strings.resx @@ -0,0 +1,4473 @@ + +¡Nueva descarga de contenido disponible! Utiliza el botón Tienda de Minecraft del menú principal para acceder a él. + +Puedes cambiar el aspecto de tu personaje con el pack de aspecto de la tienda Minecraft. Ve a "Tienda Minecraft" en el menú principal para ver qué hay disponible. + +¡Si juegas en el modo de alta definición puedes incluir a un máximo de cuatro jugadores en pantalla dividida en la misma consola! + +Conecta más mandos a tu consola y pulsa START sobre ellos para unirte al juego en cualquier momento. + +Varía la configuración de gamma para que la visualización del juego sea más clara o más oscura. + +Si estableces la dificultad del juego en Pacífico, tu salud se regenerará automáticamente. ¡Además, no saldrán monstruos por la noche! + +Dale un hueso a un lobo para domesticarlo. Puedes hacer que se siente o que te siga. + +Para soltar objetos desde el menú de inventario, mueve el cursor fuera del menú y pulsa{*CONTROLLER_VK_A*}. + +Si duermes en una cama de noche, el juego avanzará hasta el amanecer, pero en los juegos multijugador todos los jugadores tienen que dormir en camas a la vez. + +Extrae chuletas de los cerdos y cocínalas para comerlas y recuperar tu salud. + +Extrae cuero de las vacas y úsalo para fabricar armaduras. + +Si tienes un cubo vacío, puedes llenarlo con leche de vaca, agua ¡o lava! + +Usa una azada para preparar el terreno para la cosecha. + +Las arañas no atacan por el día, a no ser que tú las ataques a ellas. + +¡Es más fácil excavar arena o tierra con un azadón que a mano! + +Si comes las chuletas de cerdo cocinadas, recuperarás más salud que si las comes crudas. + +Crea antorchas para iluminar áreas oscuras de noche. Los monstruos evitarán las áreas cercanas a las antorchas. + +¡Con una vagoneta y un raíl llegarás a tu destino más rápido! + +Planta arbolillos y se convertirán en árboles. + +Los cerdos no te atacarán a no ser que tú los ataques a ellos. + +Puedes echarte a dormir en una cama para cambiar el punto de generación del juego y avanzar hasta el amanecer. + +¡Golpea esas bolas de fuego de vuelta al Ghast! + +Si construyes un portal podrás viajar a otra dimensión: el mundo inferior. + +¡Pulsa {*CONTROLLER_VK_B*} para soltar el objeto que llevas en la mano! + +¡Usa la herramienta correcta para el trabajo! + +Si no encuentras hulla para las antorchas, siempre puedes convertir árboles en carbón en un horno. + +Excavar en línea recta hacia abajo o hacia arriba no es buena idea. + +La carne de hueso (se fabrica con hueso de esqueleto) se puede usar como fertilizante, y hace que las cosas crezcan al instante. + +¡Los Creepers explotan cuando se acercan a ti! + +La obsidiana se crea cuando el agua alcanza un bloque de origen de lava. + +Al eliminar el bloque de origen, la lava puede tardar varios minutos en desaparecer por completo. + +Los guijarros son resistentes a las bolas de fuego del Ghast, lo que los hace útiles para defender portales. + +Los bloques que se pueden usar como fuente de luz derriten la nieve y el hielo. Entre ellos se incluyen las antorchas, las piedras brillantes y los fuegos fatuos. + +Ten cuidado cuando construyas estructuras de lana al aire libre, ya que los rayos de las tormentas pueden prenderles fuego. + +Un solo cubo de lava se puede usar para fundir 100 bloques en un horno. + +El instrumento que toca un bloque de nota depende del material que tenga debajo. + +Los zombis y los esqueletos pueden sobrevivir a la luz del día si están en el agua. + +Si atacas a un lobo provocarás que todos los lobos de los alrededores se vuelvan hostiles hacia ti y te ataquen. Esta característica la comparten también los porqueros zombis. + +Los lobos no pueden entrar en el mundo inferior. + +Los lobos no atacan a los Creepers. + +Las gallinas ponen huevos cada 5 o 10 minutos. + +La obsidiana solo se puede perforar con un pico de diamante. + +Los Creepers son la fuente de pólvora de más sencilla obtención. + +Si colocas dos cofres juntos crearás un cofre grande. + +Los lobos domesticados indican su salud con la posición de su cola. Dales de comer para curarlos. + +Cocina un cactus en un horno para obtener tinte verde. + +¡En Twitter obtendrás la información más reciente sobre 4J Studios y Kappische! + +¡Impresiona a tus amigos publicando capturas de pantalla de tus creaciones de Minecraft en Facebook desde el menú de pausa del juego! + +Lee la sección Novedades en el menú Cómo se juega para ver la información más reciente sobre el juego. + +¡Ahora hay vallas apilables en el juego! + +minecraftforum cuenta con una sección dedicada a la edición para Xbox 360. + +Algunos animales te seguirán si llevas trigo en la mano. + +Si un animal no pude desplazarse más de 20 bloques en cualquier dirección, no se degenerará. + +¡Música de C418! + +¡Notch tiene más de un millón de seguidores en Twitter! + +No todos los suecos son rubios. ¡Algunos, como Jens de Mojang, son pelirrojos! + +Creemos que 4J Studios ha eliminado a Herobrine del juego para la Consola Xbox 360, pero no estamos seguros. + +¡Pronto habrá una actualización de este juego! + +¿Quién es Notch? + +¡Mojang tiene más premios que empleados! + +¡Hay famosos que juegan a Minecraft! + +¡A deadmau5 le gusta Minecraft! + +No mires directamente a los bichos. + +Los Creepers surgieron de un fallo de código. + +¿Es una gallina o es un pato? + +¿Estuviste en la Minecon? + +Nadie de Mojang ha visto jamás la cara a junkboy. + +¿Sabías que hay una Wiki de Minecraft? + +¡El nuevo despacho de Mojang mola! + +¡Minecraft: Xbox 360 Edition ha batido todos los récords! + +¡Minecon 2013 tuvo lugar en Orlando, Florida! + +.party() fue excelente. + +Supón siempre que los rumores son falsos, ¡no creas que son ciertos! + +{*T3*}CÓMO SE JUEGA: FUNDAMENTOS{*ETW*}{*B*}{*B*} +Minecraft es un juego que consiste en colocar bloques para construir cualquier cosa que puedas imaginar. De noche salen los monstruos, así que procura construir un refugio antes de que eso suceda.{*B*}{*B*} +Usa{*CONTROLLER_ACTION_LOOK*} para mirar a tu alrededor.{*B*}{*B*} +Usa{*CONTROLLER_ACTION_MOVE*} para moverte.{*B*}{*B*} +Pulsa{*CONTROLLER_ACTION_JUMP*} para saltar.{*B*}{*B*} +Pulsa{*CONTROLLER_ACTION_MOVE*} dos veces hacia delante en sucesión rápida para correr. Mientras mantienes pulsado {*CONTROLLER_ACTION_MOVE*} hacia delante, el personaje seguirá corriendo a menos que se agote el tiempo de carrera o la barra de comida tenga menos de {*ICON_SHANK_03*}.{*B*}{*B*} +Mantén pulsado{*CONTROLLER_ACTION_ACTION*} para perforar y picar con la mano o con cualquier objeto que sostengas. Quizá necesites crear una herramienta para perforar algunos bloques.{*B*}{*B*} +Si tienes un objeto en la mano, usa{*CONTROLLER_ACTION_USE*} para utilizar ese objeto o pulsa{*CONTROLLER_ACTION_DROP*} para soltarlo. + +{*T3*}CÓMO SE JUEGA: HUD{*ETW*}{*B*}{*B*} +El HUD muestra información sobre tu estado, tu salud, el oxígeno que te queda cuando estás bajo el agua, tu nivel de hambre (para llenarlo tienes que comer) y la armadura, si la llevas. Si pierdes salud pero tienes una barra de comida con 9 o más{*ICON_SHANK_01*}, tu salud se recargará automáticamente. Si comes, se recargará la barra de comida.{*B*} +Aquí también aparece la barra de experiencia, con un valor numérico que indica tu nivel de experiencia y la barra que señala los puntos de experiencia que necesitas para subir de nivel. Los puntos de experiencia se obtienen al recoger los orbes de experiencia que sueltan los enemigos al morir, al extraer cierto tipo de bloques, al criar nuevos animales, al pescar y al fundir mineral en un horno.{*B*}{*B*} +También muestra los objetos que puedes utilizar. Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} y{*CONTROLLER_ACTION_RIGHT_SCROLL*} para cambiar el objeto que llevas en la mano. + +{*T3*}CÓMO SE JUEGA: INVENTARIO{*ETW*}{*B*}{*B*} +Usa{*CONTROLLER_ACTION_INVENTORY*} para ver el inventario.{*B*}{*B*} +Esta pantalla muestra los objetos que puedes llevar en la mano y todos los objetos que ya llevas. También aparece tu armadura.{*B*}{*B*} +Usa{*CONTROLLER_MENU_NAVIGATE*} para mover el foco. Usa{*CONTROLLER_VK_A*} para coger el objeto que se encuentra bajo el foco. Si hay más de un objeto, los cogerá todos; también puedes usar{*CONTROLLER_VK_X*} para coger solo la mitad de ellos.{*B*}{*B*} +Mueve el objeto con el foco hacia otro espacio del inventario y colócalo con{*CONTROLLER_VK_A*}. Si hay varios objetos en el foco, usa{*CONTROLLER_VK_A*} para colocarlos todos o{*CONTROLLER_VK_X*} para colocar solo uno.{*B*}{*B*} +Si un objeto sobre el que estás es una armadura, aparecerá un mensaje de función para activar un movimiento rápido y enviarla al espacio de armadura correspondiente del inventario.{*B*}{*B*} +Puedes teñir tu armadura de cuero para cambiarla de color. Para ello, accede al menú del inventario, mantén el foco sobre el tinte y después pulsa{*CONTROLLER_VK_X*} mientras señalas con el foco la prenda que quieres teñir. + + +{*T3*}CÓMO SE JUEGA: COFRE{*ETW*}{*B*}{*B*} +Cuando creas un cofre, puedes colocarlo en el mundo y usarlo con{*CONTROLLER_ACTION_USE*} para almacenar objetos de tu inventario.{*B*}{*B*} +Usa el foco para mover objetos del inventario al cofre y viceversa.{*B*}{*B*} +Los objetos del cofre se almacenan para que puedas volver a colocarlos en el inventario más tarde. + + +{*T3*}CÓMO SE JUEGA: COFRE GRANDE{*ETW*}{*B*}{*B*} +Si se colocan dos cofres normales, uno junto a otro, se combinarán para formar un cofre grande.{*B*}{*B*} +Se usa como si fuera un cofre normal. + + +{*T3*}CÓMO SE JUEGA: CREACIÓN{*ETW*}{*B*}{*B*} +En la interfaz de creación puedes combinar objetos del inventario para crear nuevos tipos de objetos. Usa{*CONTROLLER_ACTION_CRAFTING*} para abrir la interfaz de creación.{*B*}{*B*} +Desplázate por las pestañas de la parte superior con {*CONTROLLER_VK_LB*} y {*CONTROLLER_VK_RB*} para seleccionar el tipo de objeto que quieres crear; a continuación, usa{*CONTROLLER_MENU_NAVIGATE*} para seleccionar el objeto y crearlo.{*B*}{*B*} +La zona de creación indica los objetos que se necesitan para crear el nuevo objeto. Pulsa{*CONTROLLER_VK_A*} para crear el objeto y colocarlo en tu inventario. + + +{*T3*}CÓMO SE JUEGA: MESA DE CREACIÓN{*ETW*}{*B*}{*B*} +Con una mesa de creación puedes crear objetos más grandes.{*B*}{*B*} +Coloca la mesa en el mundo y pulsa{*CONTROLLER_ACTION_USE*} para usarla.{*B*}{*B*} +La creación en una mesa se realiza igual que la creación normal, pero dispones de un área de creación mayor y una selección de objetos para crear más amplia. + + +{*T3*}CÓMO SE JUEGA: HORNO{*ETW*}{*B*}{*B*} +En el horno puedes cambiar objetos con fuego. Por ejemplo, puedes convertir mineral de hierro en lingotes de hierro.{*B*}{*B*} +Coloca el horno en el mundo y pulsa{*CONTROLLER_ACTION_USE*} para usarlo.{*B*}{*B*} +En la parte inferior del horno debes colocar combustible y el objeto que quieres fundir en la parte superior. El horno se encenderá y empezará a funcionar.{*B*}{*B*} +Después de fundir los objetos puedes trasladarlos de la zona de producción a tu inventario.{*B*}{*B*} +Si un objeto sobre el que estás es un ingrediente o combustible para el horno, aparecerán mensajes de función para activar un movimiento rápido y enviarlo al horno. + + +{*T3*}CÓMO SE JUEGA: DISPENSADOR{*ETW*}{*B*}{*B*} +El dispensador se usa para arrojar objetos. Para ello tendrás que colocar un interruptor, como por ejemplo una palanca, junto al dispensador para accionarlo.{*B*}{*B*} +Para llenar el dispensador con objetos, pulsa{*CONTROLLER_ACTION_USE*} y mueve los objetos que quieres arrojar desde tu inventario al dispensador.{*B*}{*B*} +A partir de ese momento, cuando uses el interruptor, el dispensador arrojará un objeto. + + +{*T3*}CÓMO SE JUEGA: DESTILACIÓN{*ETW*}{*B*}{*B*} +Para destilar pociones se necesita un puesto de destilado, que se puede construir en la mesa de creación. Todas las pociones se empiezan con una botella de agua, que se obtiene al llenar una botella de cristal con agua de un caldero o una fuente.{*B*} +Los puestos de destilado tienen tres espacios para botellas, de forma que puedes hacer tres pociones a la vez. Se puede usar un ingrediente en las tres botellas, así que procura destilar siempre tres pociones a la vez para aprovechar mejor tus recursos.{*B*} +Si colocas un ingrediente de poción en la posición superior del puesto de destilado, tras un breve periodo de tiempo obtendrás una poción básica. Esto no tiene ningún efecto por sí mismo, pero si destilas otro ingrediente con esta poción básica, obtendrás una poción con un efecto.{*B*} +Cuando obtengas esa poción, podrás añadir un tercer ingrediente para que el efecto sea más duradero (usando polvo de piedra rojiza), más intenso (con polvo de piedra brillante) o convertirlo en una poción perjudicial (con un ojo de araña fermentado).{*B*} +También puedes añadir pólvora a cualquier poción para convertirla en una poción de salpicadura, que después podrás arrojar. Si lanzas una poción de salpicadura, su efecto se aplicará sobre toda la zona donde caiga.{*B*} + +Los ingredientes originales de las pociones son :{*B*}{*B*} +* {*T2*}Verruga del mundo inferior{*ETW*}{*B*} +* {*T2*}Ojo de araña{*ETW*}{*B*} +* {*T2*}Azúcar{*ETW*}{*B*} +* {*T2*}Lágrima de espectro{*ETW*}{*B*} +* {*T2*}Polvo de llama{*ETW*}{*B*} +* {*T2*}Crema de magma{*ETW*}{*B*} +* {*T2*}Melón resplandeciente{*ETW*}{*B*} +* {*T2*}Polvo de piedra rojiza{*ETW*}{*B*} +* {*T2*}Polvo p. brillante{*ETW*}{*B*} +* {*T2*}Ojo de araña fermentado{*ETW*}{*B*}{*B*} + +Tendrás que experimentar y combinar ingredientes para averiguar cuántas pociones diferentes puedes crear. + + +{*T3*}CÓMO SE JUEGA: HECHIZOS{*ETW*}{*B*}{*B*} +Los puntos de experiencia que se recogen cuando muere un enemigo, o cuando se extraen o se funden determinados bloques en un horno, se pueden usar para hechizar herramientas, armas, armaduras y libros.{*B*} +Cuando la espada, el arco, el hacha, el pico, la pala, la armadura o el libro se colocan en el espacio que está debajo del libro en la mesa de hechizos, los tres botones de la parte derecha del espacio mostrarán algunos hechizos y sus niveles de experiencia correspondientes.{*B*} +Si no tienes suficientes niveles de experiencia para usarlos, el coste aparecerá en rojo; si no, aparecerá en verde.{*B*}{*B*} +El hechizo real que se aplica se selecciona aleatoriamente en función del coste que aparece.{*B*}{*B*} +Si la mesa de hechizos está rodeada de estanterías (hasta un máximo de 15), con un espacio de un bloque entre la estantería y la mesa de hechizos, la intensidad de los hechizos aumentará y aparecerán glifos arcanos en el libro de la mesa de hechizos.{*B*}{*B*} +Todos los ingredientes para la mesa de hechizos se pueden encontrar en las aldeas de un mundo o al extraer mineral y cultivar en él.{*B*}{*B*} +Usa los libros hechizados en el yunque para aplicar hechizos a los objetos. De este modo tendrás más control sobre los hechizos que te gustaría aplicar a tus objetos.{*B*} + + +{*T3*}CÓMO SE JUEGA: CUIDAR ANIMALES{*ETW*}{*B*}{*B*} +Si quieres guardar a tus animales en un único lugar, construye una zona vallada de menos de 20x20 bloques y coloca a tus animales dentro. Así te asegurarás de que estén allí cuando vuelvas. + + +{*T3*}CÓMO SE JUEGA: CRIAR ANIMALES{*ETW*}{*B*}{*B*} +¡Los animales de Minecraft pueden reproducirse y tener crías que son sus réplicas exactas!{*B*} +Para que los animales tengan crías, tienes que alimentarles con la comida correcta para que pasen a estar en el "modo Amor".{*B*} +Si alimentas con trigo a las vacas, champiñacas u ovejas, con zanahorias a un cerdo, con semillas de trigo o verrugas del mundo inferior a los pollos, o con cualquier tipo de carne a los lobos, estos animales empezarán a buscar a otros animales de la misma especie que también estén en el modo Amor.{*B*} +Cuando dos animales de la misma especie se encuentran, y ambos están en el modo Amor, se besarán durante unos segundos y luego aparecerá una cría. La cría seguirá a sus padres durante un tiempo antes de crecer y convertirse en adulto.{*B*} +Tras dejar de estar en modo Amor, un animal no podrá volver a estarlo hasta pasados 5 minutos.{*B*} +Existe un límite para la cantidad de animales que puedes tener en un mundo, por lo que es posible que tus animales no tengan más crías cuando tengas muchos. + +{*T3*}CÓMO SE JUEGA: PORTAL INFERIOR{*ETW*}{*B*}{*B*} +El portal inferior permite al jugador viajar entre el mundo superior y el mundo inferior. El mundo inferior sirve para viajar a toda velocidad por el mundo superior, ya que un bloque de distancia en el mundo inferior equivale a 3 bloques en el mundo superior, así que cuando construyas un portal en el mundo inferior y salgas por él, estarás 3 veces más lejos del punto de entrada.{*B*}{*B*} +Se necesita un mínimo de 10 bloques de obsidiana para construir el portal, y el portal tiene que tener 5 bloques de alto, 4 de ancho y 1 de profundidad. Una vez construida la estructura del portal, tendrás que prender fuego al espacio interior para activarlo. Para ello, usa el objeto "chisquero de pedernal" o "descarga de fuego".{*B*}{*B*} +En la imagen de la derecha dispones de ejemplos de construcción de un portal. + + +{*T3*}CÓMO SE JUEGA: MULTIJUGADOR{*ETW*}{*B*}{*B*} +Minecraft para la consola Xbox 360 es, de forma predeterminada, un juego multijugador. En el modo de alta definición los jugadores locales pueden unirse a tu partida conectando un mando y pulsando START en cualquier momento del juego.{*B*}{*B*} +Si inicias o te unes a una partida en línea, los miembros de tu lista de amigos podrán verla (a menos que selecciones Solo por invitación cuando crees la partida), y si ellos se unen a la partida, los miembros de su lista de amigos también podrán verla (a menos que selecciones la opción Permitir amigos de amigos).{*B*} +Una vez en la partida, pulsa el Botón BACK para mostrar la lista de todos los jugadores, ver sus tarjetas de jugador, expulsar a jugadores de la partida e invitar a otros miembros a la partida. + + +{*T3*}CÓMO SE JUEGA: COMPARTIR CAPTURAS DE PANTALLA{*ETW*}{*B*}{*B*} +Si quieres realizar una captura de pantalla de tu partida, ve al menú de pausa y pulsa {*CONTROLLER_VK_Y*} para compartirla en Facebook. Obtendrás una versión en miniatura de tu captura y podrás editar el texto asociado a la publicación de Facebook.{*B*}{*B*} +Existe un modo de cámara especial para tomar estas capturas, de forma que podrás ver la parte frontal de tu personaje en la imagen. Pulsa{*CONTROLLER_ACTION_CAMERA*} hasta que veas la parte frontal del personaje y después pulsa{*CONTROLLER_VK_Y*} para compartir.{*B*}{*B*} +En la captura de pantalla no se mostrarán los gamertags. + + +{*T3*}CÓMO SE JUEGA: BLOQUEAR NIVELES{*ETW*}{*B*}{*B*} +Si detectas contenido ofensivo en algún nivel, puedes añadirlo a la lista de niveles bloqueados. +Si quieres hacerlo, accede al menú de pausa y pulsa {*CONTROLLER_VK_RB*} para seleccionar el mensaje de información sobre herramientas Bloquear nivel. +Si en un momento posterior quieres unirte a este nivel, recibirás una notificación de que se encuentra en la lista de niveles bloqueados y tendrás la opción de eliminarlo de la lista y continuarlo, o dejarlo bloqueado. + +{*T3*}CÓMO SE JUEGA: MODO CREATIVO{*ETW*}{*B*}{*B*} +La interfaz de modo Creativo del juego permite mover cualquier objeto del juego al inventario del jugador sin tener que extraerlo o crearlo. +Los objetos del inventario del jugador no se eliminan cuando se colocan o se usan en el mundo, lo que permite al jugador centrarse en la construcción más que en la recolección de recursos.{*B*} +Si creas, cargas o guardas un mundo en el modo Creativo, ese mundo tendrá deshabilitado los logros y las actualizaciones de marcador, aunque después lo cargues en el modo Supervivencia.{*B*} +Para volar en el modo Creativo, pulsa {*CONTROLLER_ACTION_JUMP*} dos veces con rapidez. Para dejar de volar, repite la acción. Para volar más rápido, pulsa{*CONTROLLER_ACTION_MOVE*} dos veces en una sucesión rápida mientras vuelas. +En modo de vuelo, puedes mantener pulsado{*CONTROLLER_ACTION_JUMP*} para subir y{*CONTROLLER_ACTION_SNEAK*} para bajar, o usa{*CONTROLLER_ACTION_DPAD_UP*} para subir, {*CONTROLLER_ACTION_DPAD_DOWN*} para bajar, +{*CONTROLLER_ACTION_DPAD_LEFT*} para ir a la izquierda y {*CONTROLLER_ACTION_DPAD_RIGHT*} para ir a la derecha. + +{*T3*}CÓMO SE JUEGA: OPCIONES DE HOST Y DE JUGADOR{*ETW*}{*B*}{*B*} + +{*T1*}Opciones de juego{*ETW*}{*B*} +Al cargar o crear un mundo, pulsa el botón "Más opciones" para entrar en un menú donde podrás tener más control sobre tu juego.{*B*}{*B*} + + {*T2*}Jugador contra jugador{*ETW*}{*B*} + Si está habilitada, los jugadores pueden causar daño a otros jugadores. Esta opción solo afecta al modo Supervivencia.{*B*}{*B*} + + {*T2*}Confiar en jugadores{*ETW*}{*B*} + Si está deshabilitada, los jugadores que se unen al juego tienen restringidas sus acciones. No pueden extraer ni usar objetos, colocar bloques, usar puertas ni interruptores, usar contenedores, atacar a jugadores o atacar a animales. Las opciones de un jugador determinado se pueden cambiar en el menú de juego.{*B*}{*B*} + + {*T2*}El fuego se propaga{*ETW*}{*B*} + Si está habilitada, el fuego se puede propagar a los bloques inflamables cercanos. Esta opción también se puede cambiar dentro del juego.{*B*}{*B*} + + {*T2*}La dinamita explota{*ETW*}{*B*} + Si está habilitada, la dinamita explota cuando se detona. Esta opción también se puede cambiar dentro del juego.{*B*}{*B*} + + {*T2*}Privilegios de host{*ETW*}{*B*} + Si está habilitada, el host puede activar su habilidad para volar, deshabilitar la extenuación y hacerse invisible desde el menú de juego. Esta opción deshabilita los logros y las actualizaciones del marcador de este mundo cuando se juega y si se vuelve a cargar después de guardarlo con esta opción activada.{*B*}{*B*} + +{*T1*}Opciones de generación del mundo{*ETW*}{*B*} +Cuando se crea un mundo existen opciones adicionales.{*B*}{*B*} + + {*T2*}Genera estructuras{*ETW*}{*B*} + Si está habilitada, se generarán estructuras como aldeas y fortalezas en el mundo.{*B*}{*B*} + + {*T2*}Mundo superplano{*ETW*}{*B*} + Si está habilitada, se generará un mundo completamente plano en el mundo superior y en el mundo inferior.{*B*}{*B*} + + {*T2*}Cofre de bonificación{*ETW*}{*B*} + Si está habilitada, se creará un cofre con objetos útiles cerca del punto de generación del jugador.{*B*}{*B*} + + {*T2*}Restablecer mundo inferior{*ETW*}{*B*} + Si está habilitada, el mundo inferior se regenará. Esta opción te será útil si tienes una partida guardada en la que no aparecían fortalezas del mundo inferior.{*B*}{*B*} + + {*T1*}Opciones del juego{*ETW*}{*B*} + Dentro del juego se pueden acceder a varias opciones pulsando BACK para mostrar el menú del juego.{*B*}{*B*} + + {*T2*}Opciones de host{*ETW*}{*B*} + El host y cualquier jugador establecido como moderador pueden acceder al menú "Opciones de host". En este menú se puede habilitar y deshabilitar la propagación del fuego y la explosión de dinamita.{*B*}{*B*} + +{*T1*}Opciones del jugador{*ETW*}{*B*} +Para modificar los privilegios de un jugador, selecciona su nombre y pulsa{*CONTROLLER_VK_A*} para mostrar el menú de privilegios donde podrás usar las siguientes opciones.{*B*}{*B*} + + {*T2*}Puede construir y extraer{*ETW*}{*B*} + Esta opción solo está disponible cuando "Confiar en jugadores" está desactivada. Cuando esta opción está habilitada, el jugador puede interaccionar con el mundo de forma normal. Cuando está deshabilitada el jugador no puede colocar ni destruir bloques ni interaccionar con muchos objetos y bloques.{*B*}{*B*} + + {*T2*}Puede usar puertas e interruptores{*ETW*}{*B*} + Esta opción solo está disponible cuando "Confiar en jugadores" está desactivada. Cuando esta opción está deshabilitada, el jugador no puede usar puertas e interruptores.{*B*}{*B*} + + {*T2*}Puede abrir contenedores{*ETW*}{*B*} + Esta opción solo está disponible cuando "Confiar en jugadores" está desactivada. Cuando esta opción está deshabilitada, el jugador no puede abrir contenedores, como por ejemplo cofres.{*B*}{*B*} + + {*T2*}Puede atacar a jugadores{*ETW*}{*B*} + Esta opción solo está disponible cuando "Confiar en jugadores" está desactivada. Cuando esta opción está deshabilitada, el jugador no puede causar daños a otros jugadores.{*B*}{*B*} + + {*T2*}Puede atacar a animales{*ETW*}{*B*} + Esta opción solo está disponible cuando "Confiar en jugadores" está desactivada. Cuando esta opción está deshabilitada, el jugador no puede causar daños a los animales.{*B*}{*B*} + + {*T2*}Moderador{*ETW*}{*B*} + Cuando esta opción está habilitada, el jugador puede cambiar los privilegios de otros jugadores (excepto los del host) si "Confiar en jugadores" está desactivada, expulsar jugadores, y activar y desactivar "El fuego se propaga" y "La dinamita explota".{*B*}{*B*} + + {*T2*}Expulsar jugador{*ETW*}{*B*} + En el caso de jugadores que no estén en la misma Consola Xbox 360 que el host, si se selecciona esta opción se expulsará al jugador de la partida y a cualquier otro jugador en la misma Consola Xbox 360. El jugador no podrá volver a unirse al juego hasta que se reinicie.{*B*}{*B*} + +{*T1*}Opciones de host{*ETW*}{*B*} +Si "Privilegios de host" está habilitado, el host podrá modificar algunos privilegios para sí mismo. Para modificar los privilegios de un jugador, selecciona su nombre y pulsa{*CONTROLLER_VK_A*} para mostrar el menú de privilegios donde podrás usar las siguientes opciones.{*B*}{*B*} + + {*T2*}Puede volar{*ETW*}{*B*} + Cuando esta opción está habilitada, el jugador puede volar. Esta opción solo es relevante en el modo Supervivencia, ya que el vuelo está habilitado para todos los jugadores en el modo Creativo.{*B*}{*B*} + + {*T2*}Desactivar extenuación{*ETW*}{*B*} + Esta opción solo afecta al modo Supervivencia. Si se habilita, las actividades físicas (caminar/correr/saltar, etc.) no disminuyen la barra de comida. Sin embargo, si el jugador resulta herido, la barra de comida disminuye lentamente mientras el jugador se cura.{*B*}{*B*} + + {*T2*}Invisible{*ETW*}{*B*} + Cuando esta opción está habilitada, el jugador es invisible para otros jugadores y es invulnerable.{*B*}{*B*} + + {*T2*}Puede teletransportarse{*ETW*}{*B*} + Permite al jugador desplazarse o desplazar a otros hasta la posición de otros jugadores en el mundo. + + +Página siguiente + +Página anterior + +Fundamentos + +HUD + +Inventario + +Cofres + +Creando + +Horno + +Dispensador + +Cuidar animales + +Reproducción de animales + +Destilación + +Hechizo + +Portal inferior + +Multijugador + +Compartir capturas de pantalla + +Bloquear niveles + +Modo Creativo + +Opciones de host y de jugador + +Comerciar + +Yunque + +El Fin + +{*T3*}CÓMO SE JUEGA: EL FIN{*ETW*}{*B*}{*B*} +El Fin es otra dimensión del juego, a la que se llega a través de un portal final activo. Puedes encontrar el portal final en una fortaleza, en lo más profundo del mundo superior.{*B*} +Para activar el portal final, debes colocar un ojo de Ender en la estructura de un portal final que no tenga uno.{*B*} +Una vez que el portal esté activo, introdúcete en él para ir a El fin.{*B*}{*B*} +En El Fin te encontrarás con el dragón de Ender, un feroz y poderoso enemigo, además de muchos finalizadores, por lo que tendrás que estar preparado para la batalla antes de ir allí.{*B*}{*B*} +En lo alto de ocho pilares obsidianos, verás cristales finalizadores que el dragón de Ender usa para curarse, +así que lo primero que deberás hacer será destruirlos todos.{*B*} +Podrás alcanzar a los primeros con flechas, pero los últimos están en una jaula con barrotes de hierro. Tendrás que subir a lo alto para llegar a ellos.{*B*}{*B*} +Mientras lo haces, el dragón de Ender volará hacia ti y te atacará escupiendo bolas de ácido de Ender.{*B*} +Si te acercas al nido de huevos en el centro de los pilares, el dragón de Ender irá hacia abajo y te atacará. ¡Tienes que aprovechar ese momento para hacerle daño!{*B*} +Esquiva su aliento de ácido y apunta a los ojos del dragón de Ender para hacerle el máximo daño posible. Si puedes, ¡tráete amigos a El Fin para que te echen una mano en la batalla!{*B*}{*B*} +En cuanto hayas llegado a El Fin, tus amigos podrán ver la ubicación del portal final dentro de la fortaleza en sus mapas, +para que puedan unirse a ti con facilidad. + + +Correr + +Novedades + + +{*T3*}Cambios e incorporaciones{*ETW*}{*B*}{*B*} +- Se han añadido nuevos objetos: esmeralda, mena de esmeralda, bloque de esmeralda, cofre de Ender, gancho de cable trampa, manzana dorada hechizada, yunque, maceta, paredes de adoquines, paredes de adoquines musgosas, pintura de Wither, patata, patata asada, patata venenosa, zanahoria, zanahoria dorada, palo y zanahoria, +pastel de calabaza, poción de visión nocturna, poción de invisibilidad, cuarzo del mundo inferior, mena de cuarzo del mundo inferior, bloque de cuarzo, losa de cuarzo, escaleras de cuarzo, bloque de cuarzo cincelado, pilar de cuarzo, libro hechizado, alfombra.{*B*} +- Se han añadido nuevas recetas de arenisca lisa y arenisca cincelada.{*B*} +- Se han añadido nuevos enemigos: aldeanos zombis.{*B*} +- Se han añadido nuevas funciones de generación de terrenos: templos del desierto, aldeas del desierto, templos de la jungla.{*B*} +- Se ha añadido la función de comerciar con los aldeanos.{*B*} +- Se ha añadido la interfaz del yunque.{*B*} +- Se ha añadido la posibilidad de teñir las armaduras de cuero.{*B*} +- Se ha añadido la posibilidad de teñir los collares de los lobos.{*B*} +- Se puede montar sobre un cerdo y controlarlo con un palo y una zanahoria.{*B*} +- Actualización del contenido de los cofres de bonificación con más objetos.{*B*} +- Se ha modificado la colocación de medios bloques y otros bloques en medios bloques.{*B*} +- Se ha modificado la colocación de las escaleras y las losas del revés.{*B*} +- Se han añadido diferentes profesiones de aldeanos.{*B*} +- Los aldeanos generados a partir de un huevo generador desempeñarán profesiones al azar.{*B*} +- Se ha añadido la posibilidad de colocar troncos de lado.{*B*} +- Los hornos pueden usar herramientas de madera como combustible.{*B*} +- Los paneles de hielo y cristal se pueden recoger mediante herramientas hechizadas con el toque sedoso.{*B*} +- Los botones de madera y los platos de presión de madera se pueden activar mediante flechas.{*B*} +- Los enemigos del mundo inferior pueden acceder al mundo superior mediante portales.{*B*} +- Los Creepers y las arañas son agresivos con el último jugador que los toque.{*B*} +- Los enemigos en el modo Creativo vuelven a ser neutrales tras un breve periodo de tiempo.{*B*} +- Se ha eliminado el derribo durante el ahogamiento.{*B*} +- Las puertas muestran daños cuando los zombis las rompen.{*B*} +- El hielo se derrite en el mundo inferior.{*B*} +- Los calderos se llenan cuando están bajo la lluvia.{*B*} +- Los pistones tardan el doble en actualizarse.{*B*} +- Los cerdos dejan caer la silla de montar al morir (si llevan una).{*B*} +- Se ha modificado el color del cielo en El Fin.{*B*} +- Se puede colocar una cuerda (para los cables trampa).{*B*} +- La lluvia cae entre las hojas.{*B*} +- Se pueden colocar palancas en la parte inferior de los bloques.{*B*} +- La dinamita provoca daños variables en función del nivel de dificultad.{*B*} +- Se han modificado las recetas de libros.{*B*} +- Los barcos rompen los nenúfares y no al contrario.{*B*} +- Los cerdos dejan caer más chuletas.{*B*} +- La generación de limos es menor en los mundos superplanos.{*B*} +- Los Creepers causan daños variables en función del nivel de dificultad; más derribo.{*B*} +- Se ha corregido el error que hacía que los Finalizadores no abrieran sus mandíbulas.{*B*} +- Se ha añadido el teletransporte de jugadores (usando el menú {*BACK_BUTTON*} del juego).{*B*} +- Se han añadido nuevas opciones de host que permiten a los jugadores remotos volar, volverse invisibles e invulnerables.{*B*} +- Se han añadido nuevos tutoriales al mundo tutorial sobre nuevos objetos y funciones.{*B*} +- Se han actualizado las posiciones de los cofres de discos en el mundo tutorial.{*B*} + + +{*ETB*}¡Hola otra vez! Quizá no te hayas dado cuenta, pero hemos actualizado Minecraft.{*B*}{*B*} +Hay un montón de novedades con las que lo pasarás en grande con tus amigos. A continuación te detallamos las más destacadas:{*B*}{*B*} +{*T1*}Nuevos objetos{*ETB*}: esmeralda, mena de esmeralda, bloque de esmeralda, cofre de Ender, gancho de cable trampa, manzana dorada hechizada, yunque, maceta, paredes de adoquines, paredes de adoquines musgosas, pintura de Wither, patata, patata asada, patata venenosa, zanahoria, zanahoria dorada, palo y zanahoria, +Pastel de calabaza, poción de visión nocturna, poción de invisibilidad, cuarzo del mundo inferior, mena de cuarzo del mundo inferior, bloque de cuarzo, losa de cuarzo, escaleras de cuarzo, bloque de cuarzo cincelado, pilar de cuarzo,, libro hechizado, alfombra.{*B*}{*B*} + {*T1*}Nuevos enemigos{*ETB*}: aldeanos zombis.{*B*}{*B*} +{*T1*}Nuevas funciones{*ETB*}: ¡comercia con los aldeanos, repara o hechiza armas y herramientas con el yunque, guarda objetos en un cofre de Ender o controla a un cerdo mientras montas sobre él usando un palo y una zanahoria!{*B*}{*B*} +{*T1*}Nuevos minitutoriales{*ETB*} – ¡Aprende a utilizar las nuevas funciones con el mundo tutorial!{*B*}{*B*} +{*T1*}Nuevos "huevos de Pascua"{*ETB*} – Hemos cambiado de sitio todos los discos secretos del mundo tutorial. ¡Intenta encontrarlos de nuevo!{*B*}{*B*} + + +Causa más daño que a mano. + +Se usa para excavar tierra, hierba, arena, gravilla y nieve más rápido que a mano. La pala es necesaria para excavar bolas de nieve. + +Necesario para perforar bloques de piedra y mineral. + +Se usa para picar bloques de madera más rápido que a mano. + +Se usa para labrar tierra y hierba y prepararla para el cultivo. + +Las puertas de madera se activan usándolas, golpeándolas o con piedra rojiza. + +Las puertas de hierro solo se pueden abrir con piedra rojiza, botones o interruptores. + +NOT USED + +NOT USED + +NOT USED + +NOT USED + +Cuando lo lleva puesto, el usuario recibe 1 de armadura. + +Cuando lo lleva puesto, el usuario recibe 3 de armadura. + +Cuando lo lleva puesto, el usuario recibe 2 de armadura. + +Cuando lo lleva puesto, el usuario recibe 1 de armadura. + +Cuando lo lleva puesto, el usuario recibe 2 de armadura. + +Cuando lo lleva puesto, el usuario recibe 5 de armadura. + +Cuando lo lleva puesto, el usuario recibe 4 de armadura. + +Cuando lo lleva puesto, el usuario recibe 1 de armadura. + +Cuando lo lleva puesto, el usuario recibe 2 de armadura. + +Cuando lo lleva puesto, el usuario recibe 6 de armadura. + +Cuando lo lleva puesto, el usuario recibe 5 de armadura. + +Cuando lo lleva puesto, el usuario recibe 2 de armadura. + +Cuando lo lleva puesto, el usuario recibe 2 de armadura. + +Cuando lo lleva puesto, el usuario recibe 5 de armadura. + +Cuando lo lleva puesto, el usuario recibe 3 de armadura. + +Cuando lo lleva puesto, el usuario recibe 1 de armadura. + +Cuando lo lleva puesto, el usuario recibe 3 de armadura. + +Cuando lo lleva puesto, el usuario recibe 8 de armadura. + +Cuando lo lleva puesto, el usuario recibe 6 de armadura. + +Cuando lo lleva puesto, el usuario recibe 3 de armadura. + +Un lingote brillante que se usa para crear herramientas de este material. Se crea fundiendo mineral en un horno. + +Permite convertir lingotes, gemas o tintes en bloques utilizables. Se puede usar como bloque de construcción de precio elevado o como almacenamiento compacto del mineral. + +Se usa para aplicar una descarga eléctrica cuando un jugador, un animal o un monstruo lo pisa. Los platos de presión de madera también se activan soltando algo sobre ellos. + +Se usan en escaleras compactas. + +Se usan para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. + +Se usan para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. + +Se usa para crear luz. Las antorchas derriten la nieve y el hielo. + +Se usan como material de construcción y se pueden convertir en muchas cosas. Se crean a partir de cualquier tipo de madera. + +Se usa como material de construcción. No recibe la influencia de la gravedad, como la arena normal. + +Se usa como material de construcción. + +Se usa para crear antorchas, flechas, señales, escaleras, vallas y mangos para armas y herramientas. + +Se usa para avanzar en el tiempo, desde cualquier momento de la noche hasta la mañana, si todos los jugadores del mundo están en cama; además cambia el punto de generación del jugador. +Los colores de la cama siempre son los mismos, independientemente del color de la lana que se use. + +Te permite crear una selección más variada de objetos que la creación normal. + +Te permite fundir mineral, crear carbón y cristal y cocinar pescado y chuletas. + +Almacena bloques y objetos en su interior. Coloca dos cofres uno junto a otro para crear un cofre más grande con el doble de capacidad. + +Se usa como barrera sobre la que no se puede saltar. Cuenta como 1,5 bloques de alto para jugadores, animales y monstruos, pero solo 1 bloque de alto para otros bloques. + +Se usa para escalar en vertical. + +Se activan mediante el uso, el golpe o la piedra rojiza. Funcionan como puertas normales, pero consisten en un bloque tras otro y se apoyan en el suelo. + +Muestra el texto introducido por ti o por otros jugadores. + +Se usa para crear luz más brillante que la de las antorchas. Derrite la nieve y el hielo y se puede usar bajo el agua. + +Se usa para provocar explosiones. Se activa después de su colocación golpeándola con el objeto eslabón y pedernal o con una descarga eléctrica. + +Se usa para contener estofado de champiñón. Te quedas el cuenco después de comer el estofado. + +Se usa para contener y transportar agua, lava y leche. + +Se usa para contener y transportar agua. + +Se usa para contener y transportar lava. + +Se usa para contener y transportar leche. + +Se usa para crear fuego, detonar dinamita y abrir un portal después de construirlo. + +Se usa para pescar peces. + +Muestra la posición del sol y de la luna. + +Indica tu punto de inicio. + +Cuando se porta, crea una imagen del área explorada. Se puede usar para buscar rutas. + +Permite ataques a distancia con flechas. + +Se usa como munición para arcos. + +Restablece 2,5{*ICON_SHANK_01*}. + +Restablece 1{*ICON_SHANK_01*}. Se puede usar 6 veces. + +Restablece 1{*ICON_SHANK_01*}. + +Restablece 1{*ICON_SHANK_01*}. + +Restablece 3{*ICON_SHANK_01*}. + +Restablece 1{*ICON_SHANK_01*}o se puede cocinar en el horno. Si comes esto puede que te envenene. + +Restablece 3{*ICON_SHANK_01*}. Se crea cocinando pollo crudo en el horno. + +Restablece 1.5{*ICON_SHANK_01*}, o se puede cocinar en el horno. + +Restablece {*ICON_SHANK_01*}. Se crea cocinando ternera cruda en el horno. + +Restablece 1.5{*ICON_SHANK_01*}, o se puede cocinar en el horno. + +Restablece 4{*ICON_SHANK_01*}. Se crea cocinando una chuleta de cerdo cruda en el horno. + +Restablece 1{*ICON_SHANK_01*}o se puede cocinar en el horno. Se puede dar de comer a un ocelote para domarlo. + +Restablece 2,5{*ICON_SHANK_01*}. Se crea cocinando pescado crudo en el horno. + +Restablece 2{*ICON_SHANK_01*} y se puede convertir en una manzana de oro. + +Restablece 2{*ICON_SHANK_01*} y regenera la salud durante 4 segundos. Creada con una manzana y pepitas de oro. + +Restablece 2{*ICON_SHANK_01*}. Si comes esto puede que te envenene. + +Se usa en la receta de pasteles como ingrediente para destilar pociones. + +Se activa y desactiva para aplicar una descarga eléctrica. Se mantiene en estado activado o desactivado hasta que se vuelve a pulsar. + +Da una descarga eléctrica +constante o puede usarse +de receptor/transmisor si +se conecta al lateral de +un bloque. También puede +usarse de iluminación +de nivel bajo. + + +Se usa en circuitos de piedra rojiza como repetidor, retardador o diodo. + +Se usa para enviar una descarga eléctrica cuando se pulsa. Se mantiene activo durante un segundo aproximadamente antes de volver a cerrarse. + +Se usa para sujetar y arrojar objetos en orden aleatorio cuando recibe una descarga de piedra rojiza. + +Reproduce una nota cuando se activa. Si lo golpeas cambiarás el tono de la nota. Colócalo en la parte superior de los bloques para cambiar el tipo de instrumento. + +Se usa para conducir vagonetas. + +Cuando se activa, acelera las vagonetas que pasan por encima. Si no está activado, las vagonetas se detendrán. + +Funciona como un plato de presión, envía una señal de piedra rojiza cuando se activa, pero solo una vagoneta puede hacerlo. + +Se usa para transportarte a ti, a un animal o a un monstruo por raíles. + +Se usa para transportar mercancías por los raíles. + +Se mueve por raíles y empujará a otras vagonetas si se le añade hulla. + +Se usa para desplazarte por el agua más rápido que nadando. + +Se obtiene de las ovejas y se puede colorear con tinte. + +Se usa como material de construcción y se puede colorear con tinte. Esta receta no es muy recomendable porque la lana se puede obtener con facilidad de las ovejas. + +Se usa como tinte para crear lana negra. + +Se usa como tinte para crear lana verde. + +Se usa como tinte para crear lana marrón, como ingrediente para cocinar galletas o para cultivar granos de cacao. + +Se usa como tinte para crear lana plateada. + +Se usa como tinte para crear lana amarilla. + +Se usa como tinte para crear lana roja. + +Se usa para que las cosechas, árboles, hierba alta, champiñones gigantes y flores crezcan al instante, y se puede usar en recetas de tinte. + +Se usa como tinte para crear lana rosa. + +Se usa como tinte para crear lana naranja. + +Se usa como tinte para crear lana lima. + +Se usa como tinte para crear lana gris. + +Se usa como tinte para +crear lana gris clara. + +(Nota: También se obtiene +combinando tinte gris con +carne de hueso, lo que +permite crear 4 tintes +gris claro de cada bolsa +de tinta en vez de 3). + +Se usa como tinte para crear lana azul clara. + +Se usa como tinte para crear lana cian. + +Se usa como tinte para crear lana púrpura. + +Se usa como tinte para crear lana magenta. + +Se usa como tinte para crear lana azul. + +Reproduce discos. + +Úsalos para crear herramientas, armas o armaduras sólidas. + +Se usa para crear luz más brillante que la de las antorchas. Derrite la nieve y el hielo y se puede usar bajo el agua. + +Se usa para crear libros y mapas. + +Se usa para crear una estantería o para hechizar libros. + +Permite crear hechizos más potentes cuando se coloca alrededor de una mesa de hechizos. + +Se usa como elemento decorativo. + +Se puede perforar con un pico de hierro o un objeto mejor y después fundir en un horno para producir lingotes de oro. + +Se puede perforar con un pico de piedra o un objeto mejor y después fundir en un horno para producir lingotes de hierro. + +Se puede perforar con un pico para extraer hulla. + +Se puede perforar con un pico de piedra o un objeto mejor para extraer lapislázuli. + +Se puede perforar con un pico de hierro o un objeto mejor para extraer diamantes. + +Se puede perforar con un pico de hierro o un objeto mejor para extraer polvo de piedra rojiza. + +Se puede perforar con un pico para extraer guijarros. + +Se recoge con una pala. Se puede emplear en la construcción. + +Se puede plantar y con el tiempo se convierte en un árbol. + +No se puede romper. + +Incendia cualquier cosa que toque. Se puede recoger en un cubo. + +Se recoge con una pala. Se puede fundir y convertir en cristal en el horno. Recibe la influencia de la gravedad si no hay ninguna otra casilla por debajo. + +Se recoge con una pala. A veces produce pedernal cuando se excava. Recibe la influencia de la gravedad si no hay ninguna otra casilla por debajo. + +Se pica con un hacha y se puede convertir en tablones o usar como combustible. + +Se crea en el horno al fundir arena. Se puede usar en la construcción, pero si intentas perforarlo se romperá. + +Se extrae de la piedra con un pico. Se puede usar para construir un horno o herramientas de madera. + +Se cuecen con arcilla en un horno. + +Se cuece y convierte en ladrillo en un horno. + +Cuando se rompe suelta bolas de arcilla que se pueden cocer y convertir en ladrillos en un horno. + +Una forma compacta de almacenar bolas de nieve. + +Se puede excavar con una pala para crear bolas de nieve. + +A veces produce semillas de trigo cuando se rompe. + +Se puede convertir en tinte. + +Se puede convertir con un cuenco para hacer estofado. + +Solo se puede perforar con un pico de diamante. Se produce al combinar agua con lava inmóvil y se usa para construir portales. + +Genera monstruos en el mundo. + +Se coloca en el suelo para portar una descarga eléctrica. Cuando se destila con una poción, aumenta la duración del efecto. + +Cuando están completamente maduras, las cosechas se pueden recoger para obtener trigo. + +Terreno que se ha preparado para plantar semillas. + +Se pueden cocinar en un horno para crear tinte verde. + +Se pueden usar para crear azúcar. + +Se puede vestir como casco o convertir en antorcha para crear un fuego fatuo. También es el ingrediente principal del pastel de calabaza. + +Si se enciende, arderá para siempre. + +Ralentiza el movimiento de cualquier cosa que camina sobre ella. + +Si te colocas en el portal podrás trasladarte del mundo superior al inferior y viceversa. + +Se usa como combustible en un horno o se trabaja para crear una antorcha. + +Se consigue al matar una araña y se puede convertir en arco o caña de pescar, así como colocarlo en el suelo para crear un cable trampa. + +Se consigue al matar una gallina y se puede convertir en una flecha. + +Se consigue al matar un Creeper y se puede convertir en dinamita o utilizar como ingrediente para destilar pociones. + +Se puede plantar en una granja para hacer crecer los cultivos. ¡Asegúrate de que hay luz suficiente para que las semillas crezcan! + +Se cosecha de los cultivos y se puede usar para crear objetos de comida. + +Se obtiene al excavar gravilla y se puede usar para crear chisquero de pedernal. + +Si se usa con un cerdo te permite montarlo. Para controlarlo, usa un palo y una zanahoria. + +Se obtiene al excavar nieve y se puede arrojar. + +Se obtiene al matar una vaca y se puede convertir en armadura o utilizarlo para fabricar libros. + +Se obtiene al matar un limo y se usa como ingrediente para destilar pociones o para crear pistones adhesivos. + +Las gallinas lo sueltan al azar y se puede convertir en alimentos. + +Se obtiene al perforar una piedra brillante y se puede trabajar para crear bloques de piedra brillante otra vez o destilarlo en una poción para aumentar la potencia del efecto. + +Se obtiene al matar un esqueleto. Se puede convertir en carne de hueso. Se puede dar de comer a un lobo para domarlo. + +Se obtiene al hacer que un esqueleto mate un Creeper. Se puede reproducir en un tocadiscos. + +Extingue el fuego y ayuda a que crezcan las cosechas. Se puede recoger en un cubo. + +Si se rompen, a veces sueltan un arbolillo que se puede plantar para cultivar un árbol. + +Presente en las mazmorras, se puede emplear en la construcción y en la decoración. + +Se usa para obtener lana de las ovejas y cosechar bloques de hoja. + +Cuando se activa (por medio de un botón, una palanca, un plato de presión, una antorcha de piedra rojiza o piedra rojiza con cualquiera de ellos), se extiende un pistón y empuja los bloques. + +Cuando se activa (por medio de un botón, una palanca, un plato de presión, una antorcha de piedra rojiza o piedra rojiza con cualquiera de ellos), se extiende un pistón y empuja los bloques. Cuando se repliega, tira hacia atrás del bloque que está en contacto con la parte extendida del pistón. + +Creado con bloques de piedra y se encuentra normalmente en fortalezas. + +Se usa como barrera, igual que las vallas. + +Es como una puerta, pero se usa principalmente con vallas. + +Se puede crear a partir de rodajas de melón. + +Bloques transparentes que se pueden usar como alternativa a los bloques de cristal. + +Se puede plantar para cultivar calabazas. + +Se puede plantar para cultivar melones. + +Lo suelta el Finalizador cuando muere. Cuando se lanza, el jugador se teletransporta a la posición donde cae la perla finalizadora y pierde parte de la salud. + +Un bloque de tierra con hierba encima. Se recoge con una pala y se puede usar para construir. + +Se puede emplear en la construcción y en la decoración. + +Ralentiza el movimiento cuando pasas sobre él. Se puede destruir con unas tijeras para recoger la cuerda. + +Genera un pez plateado cuando se destruye. También puede generar un pez plateado si está cerca de otro al que están atacando. + +Una vez colocada, va creciendo con el paso del tiempo. Se puede recoger con tijeras. Puede usarse como una escalera para trepar por ella. + +Cuando se pasa sobre él se resbala. Se convierte en agua cuando se destruye si está sobre otro bloque. Se derrite si está cerca de una fuente de luz o si se coloca en el mundo inferior. + +Se puede usar como elemento decorativo. + +Se usa para destilar pociones y para localizar fortalezas. Lo sueltan las llamas, que se suelen encontrar en las fortalezas del mundo inferior o cerca. + +Se usa para destilar pociones. Lo sueltan los espectros cuando mueren. + +Lo sueltan los porqueros zombis cuando mueren. Los porqueros zombis se encuentran en el mundo inferior. Se usa como ingrediente para destilar pociones. + +Se usa para destilar pociones. Crecen de forma natural en las fortalezas del mundo inferior, donde pueden encontrarse. También se pueden plantar en arena de alma. + +Cuando se usa puede tener diversos efectos, dependiendo de con qué se use. + +Se puede llenar con agua y se usa como ingrediente inicial para crear una poción en el puesto de destilado. + +Es una comida venenosa y un objeto de destilado. Aparece cuando el jugador mata una araña o una araña de las cuevas. + +Se usa para destilar pociones, principalmente para crear pociones con efecto negativo. + +Se usa para destilar pociones o se combina con otros objetos para crear el ojo de Ender o crema de magma. + +Se usa para destilar pociones. + +Se usa para crear pociones y pociones de salpicadura. + +Se puede llenar con agua de lluvia o con un cubo y usar para llenar de agua las botellas de cristal. + +Cuando se lanza indica la dirección a un portal final. Si se colocan doce de ellos en estructuras de portal final, se activará el portal final. + +Se usa para destilar pociones. + +Son similares a los bloques de hierba pero fantásticos para cultivar champiñones. + +Flota en el agua y se puede caminar sobre él. + +Se usa para construir fortalezas del mundo inferior. Inmume a las bolas de fuego del espectro. + +Se usa en las fortalezas del mundo inferior. + +Se encuentra en las fortalezas del mundo inferior si suelta verrugas del mundo inferior cuando se rompe. + +Esto permite a los jugadores hechizar espadas, picos, hachas, palas, arcos y armaduras utilizando puntos de experiencia del jugador. + +Se puede activar con doce ojos de Ender y permite al jugador viajar a la dimensión El Fin. + +Se usa para crear un portal final. + +Un tipo de bloque que se encuentra en El Fin. Tiene una resistencia a la ráfaga alta, así que es útil para utilizar en la construcción. + +Este bloque se crea al derrotar al dragón en El Fin. + +Cuando se lanza, suelta orbes de experiencia que aumentan tus puntos de experiencia al recogerlos. + +Útil para prender fuego a las cosas o para causar incendios de forma indiscriminada cuando se arroja mediante un dispensador. + +Son similares a una vitrina y mostrarán el objeto o bloque situado encima. + +Al lanzarse, puede generar una criatura del tipo indicado. + +Se usan para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. + +Se usan para crear escaleras largas. Si colocas dos losas, una sobre otra, crearás un bloque de losa doble de tamaño normal. + +Creado al fundir un bloque inferior en un horno. Puedeted by smelting Netherrack in a furnace. Se puede convertir en bloques de ladrillo del mundo inferior. + +Al recibir energía, emiten luz. + +Puede plantarse en la granja para cosechar granos de cacao. + +Las cabezas de enemigos pueden colocarse como decoración o llevarse como una máscara en el espacio de casco. + +Calamar + +Suelta bolsas de tinta cuando muere. + +Vaca + +Suelta cuero cuando muere. Se puede ordeñar con un cubo. + +Oveja + +Suelta lana cuando se esquila (si aún no ha sido esquilada). Se puede teñir para que su lana sea de diferente color. + +Gallina + +Suelta plumas cuando muere y pone huevos al azar. + +Cerdo + +Suelta chuletas de cerdo cuando muere. Se puede montar con una silla. + +Lobo + +Es dócil hasta que lo atacan, ya que devolverá el ataque. Se puede domar con huesos, lo que ocasionará que el lobo te siga a todas partes y ataque a cualquier cosa que te ataque a ti. + +Creeper + +¡Explota si te acercas demasiado! + +Esqueleto + +Te dispara flechas. Suelta flechas cuando muere. + +Araña + +Te ataca cuando está cerca. Puede escalar muros. Suelta cuerda cuando muere. + +Zombi + +Te ataca cuando está cerca. + +Porquero zombi + +En principio es manso, pero si atacas a uno atacará en grupo. + +Ghast + +Te dispara bolas de fuego que explotan al hacer contacto. + +Limo + +Escupe limos más pequeños cuando recibe daños. + +Enderman + +Te ataca si lo miras. También puede mover bloques de sitio. + +Pez plateado + +Atrae a los peces plateados ocultos cercanos al atacarlo. Se oculta en bloques de piedra. + +Araña de las cuevas + +Tiene una picadura venenosa. + +Champiñaca + +Crea estofado de champiñón si se usa en un cuenco. Suelta champiñones y se convierte en una vaca normal cuando se esquila. + +Gólem de nieve + +Los jugadores pueden crear el gólem de nieve con bloques de nieve y una calabaza. Lanza bolas de nieve a los enemigos de su creador. + +Dragón de Ender + +Un dragón negro y grande que se encuentra en El Fin. + +Llama + +Son enemigos que se encuentran en el mundo inferior, principalmente dentro de las fortalezas del mundo inferior. Sueltan barras de llama cuando mueren. + +Cubo de magma + +Se encuentran en el mundo inferior. Son parecidos a los limos y se fragmentan en versiones más pequeñas cuando mueren. + +Aldeano + +Ocelote + +Se encuentran en junglas. Pueden domesticarse dándoles de comer pescado crudo. Tienes que dejar se te acerque el ocelote, aunque ten cuidado: cualquier movimiento repentino le espantará. + +Gólem de hierro + +Aparecen en aldeas para protegerlas y pueden crearse usando bloques de hierro y calabazas. + +Explosives Animator + +Concept Artist + +Number Crunching and Statistics + +Bully Coordinator + +Original Design and Code by + +Project Manager/Producer + +Rest of Mojang Office + +Lead game programmer Minecraft PC + +Ninja Coder + +CEO + +White Collar Worker + +Customer Support + +Office DJ + +Designer/Programmer Minecraft - Pocket Edition + +Developer + +Chief Architect + +Art Developer + +Game Crafter + +Director of Fun + +Music and Sounds + +Programming + +Art + +QA + +Executive Producer + +Lead Producer + +Producer + +Test Lead + +Lead Tester + +Design Team + +Development Team + +Release Management + +Director, XBLA Publishing + +Business Development + +Portfolio Director + +Product Manager + +Marketing + + Community Manager + +Europe Localization Team + +Redmond Localization Team + +Asia Localization Team + +User Research Team + +MGS Central Teams + +Milestone Acceptance Tester + +Special Thanks + +Test Manager + +Senior Test Lead + +SDET + +Project STE + +Additional STE + +Test Associates + +Jon KÃ¥gström + +Tobias Möllstam + +Risë Lugo + +Espada de madera + +Espada de piedra + +Espada de hierro + +Espada de diamante + +Espada de oro + +Pala de madera + +Pala de piedra + +Pala de hierro + +Pala de diamante + +Pala de oro + +Pico de madera + +Pico de piedra + +Pico de hierro + +Pico de diamante + +Pico de oro + +Hacha de madera + +Hacha de piedra + +Hacha de hierro + +Hacha de diamante + +Hacha de oro + +Azada de madera + +Azada de piedra + +Azada de hierro + +Azada de diamante + +Azada de oro + +Puerta de madera + +Puerta de hierro + +Casco de malla + +Peto de malla + +Mallas de malla + +Botas de malla + +Gorra de cuero + +Casco de hierro + +Casco de diamante + +Casco de oro + +Túnica de cuero + +Coraza de hierro + +Coraza de diamante + +Coraza de oro + +Pantalones de cuero + +Mallas de hierro + +Mallas de diamante + +Mallas de oro + +Botas de cuero + +Botas de hierro + +Botas de diamante + +Botas de oro + +Lingote de hierro + +Lingote de oro + +Cubo + +Cubo de agua + +Cubo de lava + +Chisquero de pedernal + +Manzana + +Arco + +Flecha + +Hulla + +Carbón + +Diamante + +Palo + +Cuenco + +Estofado de champiñón + +Cuerda + +Pluma + +Pólvora + +Semillas de trigo + +Trigo + +Pan + +Pedernal + +Chuleta de cerdo cruda + +Chuleta de cerdo cocinada + +Pintura + +Manzana de oro + +Señal + +Vagoneta + +Silla + +Piedra rojiza + +Bola de nieve + +Barco + +Cuero + +Cubo de leche + +Ladrillo + +Arcilla + +Cañas de azúcar + +Papel + +Libro + +Repugnante + +Vagoneta con cofre + +Vagoneta con horno + +Huevo + +Brújula + +Caña de pescar + +Reloj + +Polvo p. brillante + +Pescado crudo + +Pescado cocinado + +Polvo de tinte + +Bolsa de tinta + +Rojo rosa + +Verde cactus + +Granos de cacao + +Lapislázuli + +Tinte púrpura + +Tinte cian + +Tinte gris claro + +Tinte gris + +Tinte rosa + +Tinte lima + +Amarillo amargo + +Tinte azul claro + +Tinte magenta + +Tinte naranja + +Carne de hueso + +Hueso + +Azúcar + +Pastel + +Cama + +Repetidor de p. rojiza + +Galleta + +Mapa + +Disco: "13" + +Disco: "gato" + +Disco: "bloques" + +Disco: "gorjeo" + +Disco: "lejos" + +Disco: "galería" + +Disco: "mellohi" + +Disco: "establo" + +Disco: "strad" + +Disco: "pabellón" + +Disco: "11" + +Disco: "estamos" + +Tijeras + +Semillas de calabaza + +Semillas de melón + +Pollo crudo + +Pollo cocinado + +Ternera cruda + +Filete + +Carne podrida + +Ender Pearl + +Rodaja de melón + +Barra de llama + +Lágrima de espectro + +Pepita de oro + +Verruga del mundo inferior + +{*splash*}{*prefix*}Poción {*postfix*} + +Botella de cristal + +Botella de agua + +Ojo de araña + +Ojo de araña fermentado + +Polvo de llama + +Crema de magma + +Puesto de destilado + +Caldero + +Ojo de Ender + +Melón resplandeciente + +Botella de hechizo + +Descarga de fuego + +Descarga de fuego (carbón) + +Descarga de fuego (hulla) + +Estructura de objeto + +Generar {*CREATURE*} + +Ladrillo del mundo inferior + +Calavera + +Calavera de esqueleto + +Calavera de esqueleto atrofiado + +Cabeza de zombi + +Cabeza + +Cabeza de %s + +Cabeza de Creeper + +Piedra + +Bloque de hierba + +Tierra + +Guijarro + +Tablones de roble + +Tablones de abeto + +Tablones de abedul + +Tablones de la jungla + +Arbolillo + +Arbolillo de roble + +Arbolillo de abeto + +Arbolillo de abedul + +Arbolillo de la jungla + +Lecho de roca + +Agua + +Lava + +Arena + +Arenisca + +Grava + +Mineral de oro + +Mineral de hierro + +Mineral de hulla + +Madera + +Madera de roble + +Madera de abeto + +Madera de abedul + +Madera de la jungla + +Roble + +Abeto + +Abedul + +Hojas + +Hojas de roble + +Hojas de abeto + +Hojas de abedul + +Hojas de la jungla + +Esponja + +Cristal + +Lana + +Lana negra + +Lana roja + +Lana verde + +Lana marrón + +Lana azul + +Lana púrpura + +Lana cian + +Lana gris claro + +Lana gris + +Lana rosa + +Lana lima + +Lana amarilla + +Lana azul claro + +Lana magenta + +Lana naranja + +Lana blanca + +Flor + +Rosa + +Champiñón + +Bloque de oro + +Una manera de almacenar oro de forma compacta. + +Una manera de almacenar hierro de forma compacta. + +Bloque de hierro + +Losa de piedra + +Losa de piedra + +Losa de arenisca + +Losa de roble + +Losa de guijarros + +Losa de ladrillos + +Losa ladr. piedra + +Losa de roble + +Losa de abeto + +Losa de abedul + +Losa de madera de la jungla + +Losa de ladrillo del mundo inferior + +Ladrillos + +Dinamita + +Estantería + +Piedra musgosa + +Obsidiana + +Antorcha + +Antorcha (hulla) + +Antorcha (carbón) + +Fuego + +Generador de monstruos + +Escaleras de roble + +Cofre + +Polvo de piedra rojiza + +Mineral de diamante + +Bloque de diamante + +Una manera de almacenar diamantes de forma compacta. + +Mesa de creación + +Cultivos + +Granja + +Horno + +Señal + +Puerta de madera + +Escalera + +Raíl + +Raíl propulsado + +Raíl detector + +Escaleras de piedra + +Palanca + +Plato de presión + +Puerta de hierro + +Mineral de piedra rojiza + +Ant. de piedra rojiza + +Botón + +Nieve + +Hielo + +Cactus + +Arcilla + +Caña de azúcar + +Tocadiscos + +Valla + +Calabaza + +Fuego fatuo + +Bloque inferior + +Arena de alma + +Piedra brillante + +Portal + +Mineral de lapislázuli + +Bloque lapislázuli + +Una manera de almacenar lapislázuli de forma compacta. + +Dispensador + +Bloque de nota + +Pastel + +Cama + +Tela + +Hierba alta + +Arbusto muerto + +Diodo + +Cofre cerrado + +Escotilla + +Lana + +Pistón + +Pistón adhesivo + +Bloque de pez plateado + +Ladrillos de piedra + +Ladrillos de piedra musgosa + +Ladrillos de piedra requebrajada + +Ladrillos de piedra cincelados + +Champiñón + +Champiñón + +Barras de hierro + +Panel de cristal + +Melón + +Tallo de calabaza + +Tallo de melón + +Hiedras + +Puerta de valla + +Escaleras de ladrillo + +Esc. ladrillo de piedra + +Piedra pez plateado + +Guijarro de pez plateado + +Ladrillo de piedra de pez plateado + +Micelio + +Vaina de lila + +Ladrillo del mundo inferior + +Valla del mundo inferior + +Escaleras del mundo inferior + +Verruga del mundo inferior + +Mesa de hechizos + +Puesto de destilado + +Caldero + +Portal final + +Estructura de portal final + +Piedra final + +Huevo de dragón + +Arbusto + +Helecho + +Escaleras de arenisca + +Escaleras de abeto + +Escaleras de abedul + +Escaleras de madera de la jungla + +Lámpara de piedra rojiza + +Cacao + +Calavera + +Controles actuales + +Diseño + +Movimiento/Correr + +Mirar + +Pausa + +Salto + +Saltar/Volar hacia arriba + +Inventario + +Cambiar objeto + +Acción + +Usar + +Creación + +Soltar + +Acechar + +Acechar/Volar hacia abajo + +Cambiar modo de cámara + +Jugadores/Invitar + +Movimiento (al volar) + +Diseño 1 + +Diseño 2 + +Diseño 3 + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +{*B*}Pulsa{*CONTROLLER_VK_A*} para continuar. + +{*B*}Pulsa{*CONTROLLER_VK_A*} para comenzar el tutorial.{*B*} + Pulsa{*CONTROLLER_VK_B*} si crees que ya estás listo para jugar tú solo. + +Minecraft es un juego que consiste en colocar bloques para construir cualquier cosa que puedas imaginar. +De noche salen los monstruos, así que procura construir un refugio antes de que eso suceda. + +Usa{*CONTROLLER_ACTION_LOOK*} para mirar hacia arriba, hacia abajo o a tu alrededor. + +Usa{*CONTROLLER_ACTION_MOVE*} para moverte. + +Para correr, pulsa{*CONTROLLER_ACTION_MOVE*} hacia delante dos veces con rapidez. Mientras mantienes pulsado{*CONTROLLER_ACTION_MOVE*} hacia delante, el personaje seguirá corriendo a menos que te quedes sin tiempo de carrera o sin comida. + +Pulsa{*CONTROLLER_ACTION_JUMP*} para saltar. + +Mantén pulsado{*CONTROLLER_ACTION_ACTION*} para perforar y picar a mano o con el objeto que sostengas. Quizá tengas que crear una herramienta para perforar algunos bloques... + +Mantén pulsado{*CONTROLLER_ACTION_ACTION*} para talar 4 bloques de madera (troncos de árbol).{*B*}Cuando un bloque se rompe, puedes colocarte junto al objeto flotante que aparece para recogerlo y así hacer que salga en tu inventario. + +Pulsa{*CONTROLLER_ACTION_CRAFTING*} para abrir la interfaz de creación. + +A medida que recojas y crees más objetos, llenarás tu inventario.{*B*} + Pulsa{*CONTROLLER_ACTION_INVENTORY*} para abrir el inventario. + +Cuando te mueves, extraes o atacas, tu barra de comida se vacía{*ICON_SHANK_01*}. Si corres y saltas en carrera consumes más comida que si caminas y saltas de forma normal. + +Si pierdes salud pero tienes una barra de comida con 9 o más{*ICON_SHANK_01*} en ella, la salud se repondrá automáticamente. Si comes se recargará la barra de comida. + +Con un objeto de comida en la mano, mantén pulsado{*CONTROLLER_ACTION_USE*} para comerlo y recargar la barra de comida. No puedes comer si la barra de comida está llena. + +Tu barra de comida está baja y has perdido salud. Come el filete de tu inventario para recargar tu barra de comida y empezar a curarte.{*ICON*}364{*/ICON*} + +La leña que recojas se puede convertir en tablones. Abre la interfaz de creación para crearlos.{*PlanksIcon*} + +Si creas mucho, necesitarás repetir la acción muchas veces. Ahora que tienes tablones, hay más objetos que puedes crear. Crea una mesa de creación.{*CraftingTableIcon*} + +Para que la recolección de bloques sea más rápida, puedes construir herramientas diseñadas a tal efecto. Algunas herramientas tienen un mando de palo. Crea algunos palos ahora.{*SticksIcon*} + +Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} y{*CONTROLLER_ACTION_RIGHT_SCROLL*} para cambiar el objeto que llevas en ese momento. + +Utiliza{*CONTROLLER_ACTION_USE*} para usar objetos, interaccionar con ellos y colocarlos. Los objetos colocados se pueden volver a coger perforándolos con la herramienta adecuada. + +Para colocar una mesa de creación, selecciónala, apunta donde la quieras y usa{*CONTROLLER_ACTION_USE*}. + +Apunta hacia la mesa de creación y pulsa{*CONTROLLER_ACTION_USE*} para abrirla. + +Con una pala puedes excavar bloques blandos, como tierra y nieve, más rápido. A medida que recoges más materiales puedes crear herramientas para trabajar más rápido y durante más tiempo. Crea una pala de madera.{*WoodenShovelIcon*} + +Con un hacha puedes picar madera y casillas de madera más rápido. A medida que recoges más materiales puedes crear herramientas para trabajar más rápido y durante más tiempo. Crea un hacha de madera.{*WoodenHatchetIcon*} + +Con un pico puedes excavar bloques duros, como piedra y mineral, más rápido. A medida que recoges más materiales puedes crear herramientas para trabajar más rápido y durante más tiempo. Crea un pico de madera.{*WoodenPickaxeIcon*} + +Abre el contenedor + + + La noche cae enseguida, y es un momento peligroso para salir sin estar preparado. Puedes crear armadura y armas, pero lo más sensato es disponer de un refugio seguro. + + + + Cerca de aquí hay un refugio de minero abandonado que puedes finalizar para mantenerte a salvo por la noche. + + + + Para finalizar el refugio tendrás que recoger recursos. Los muros y los tejados se fabrican con cualquier tipo de casilla, pero tendrás que crear una puerta, ventanas e iluminación. + + +Usa tu pico para perforar bloques de piedra. Estos bloques producirán guijarros al perforarlos. Si recoges 8 bloques de guijarro podrás construir un horno. Para llegar a la piedra quizá debas excavar algo de tierra, así que usa una pala para esta tarea.{*StoneIcon*} + +Ya has recogido suficientes guijarros para construir un horno. Usa la mesa de creación para construir uno. + +Usa{*CONTROLLER_ACTION_USE*} para colocar un horno en el mundo y después ábrelo. + +Usa el horno para crear carbón. Si estás esperando a que termine, ¿por qué no empleas ese tiempo en recoger más materiales para finalizar el refugio? + +Usa el horno para crear cristal. Si estás esperando a que termine, ¿por qué no empleas ese tiempo en recoger más materiales para finalizar el refugio? + +Un buen refugio debe tener una puerta para que puedas entrar y salir con facilidad sin tener que perforar y sustituir los muros. Crea ahora una puerta de madera.{*WoodenDoorIcon*} + +Usa{*CONTROLLER_ACTION_USE*} para colocar la puerta. Puedes usar {*CONTROLLER_ACTION_USE*}para abrir y cerrar una puerta de madera en el mundo. + +La noche puede ser muy oscura, así que necesitarás iluminación en el refugio si quieres ver. Crea una antorcha con palos y carbón mediante la interfaz de creación.{*TorchIcon*} + + + Has completado la primera parte del tutorial. + + + + {*B*} +Pulsa{*CONTROLLER_VK_A*} para continuar el tutorial.{*B*} + Pulsa{*CONTROLLER_VK_B*} si crees que ya estás listo para jugar tú solo. + + + + Este es tu inventario. Muestra los objetos que llevas en la mano y los demás objetos que portas. Aquí también aparece tu armadura. + + +{*B*} + Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo usar el inventario. + + + + Usa{*CONTROLLER_MENU_NAVIGATE*}para mover el foco. Usa{*CONTROLLER_VK_A*}para recoger un objeto señalado con el foco. + Si hay más de un objeto, los cogerás todos; también puedes usar{*CONTROLLER_VK_X*}para coger solo la mitad de ellos. + + + + Mueve el objeto con el foco hacia otro espacio del inventario y colócalo con{*CONTROLLER_VK_A*}. + Si hay varios objetos en el foco, usa{*CONTROLLER_VK_A*} para colocarlos todos o{*CONTROLLER_VK_X*} para colocar solo uno. + + + + Si desplazas el foco por fuera del borde de la interfaz con un objeto en él, podrás soltarlo. + + + + Si quieres obtener más información sobre un objeto, mueve el foco sobre él y pulsa{*CONTROLLER_VK_RT*} . + + + + Pulsa{*CONTROLLER_VK_B*} ahora para salir del inventario. + + + + Este es el inventario del modo Creativo. Muestra los objetos que llevas en la mano y los demás objetos que puedes elegir. + + +{*B*} + Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo usar el inventario del modo Creativo. + + + + Usa{*CONTROLLER_MENU_NAVIGATE*} para mover el foco. + En una lista de objetos, usa{*CONTROLLER_VK_A*} para recoger un objeto que esté bajo el foco y usa{*CONTROLLER_VK_Y*} para recoger un montón entero de ese objeto. + + + + El foco se desplazará automáticamente sobre un espacio de la fila de uso. Usa{*CONTROLLER_VK_A*} para colocarlo. Después de colocar el objeto, el foco volverá a la lista de objetos y podrás seleccionar otro. + + + + Si desplazas el foco por fuera del borde de la interfaz con un objeto en él, podrás soltarlo en el mundo. Para borrar todos los objetos de la barra de selección rápida, pulsa{*CONTROLLER_VK_X*}. + + + + Desplázate por las pestañas de tipo de grupo de la parte superior con{*CONTROLLER_VK_LB*} y{*CONTROLLER_VK_RB*} para seleccionar el tipo de grupo del objeto que quieres recoger. + + + + Si quieres obtener más información sobre un objeto, mueve el foco sobre él y pulsa{*CONTROLLER_VK_RT*} . + + + + Pulsa{*CONTROLLER_VK_B*} ahora para salir del inventario del modo Creativo. + + + + Esta es la interfaz de creación. En esta interfaz puedes combinar los objetos que has recogido para crear objetos nuevos. + + +{*B*} + Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo crear. + + +{*B*} + Pulsa{*CONTROLLER_VK_X*} para mostrar la descripción del objeto. + + +{*B*} + Pulsa{*CONTROLLER_VK_X*} para mostrar los ingredientes necesarios para fabricar el objeto actual. + + +{*B*} + Pulsa{*CONTROLLER_VK_X*} para mostrar de nuevo el inventario. + + + + Desplázate por las pestañas de tipo de grupo de la parte superior con{*CONTROLLER_VK_LB*} y{*CONTROLLER_VK_RB*} para seleccionar el tipo de grupo del objeto que quieres crear; a continuación usa{*CONTROLLER_MENU_NAVIGATE*} para seleccionar el objeto y crearlo. + + + + La zona de creación indica los objetos que se necesitan para crear el nuevo objeto. Pulsa{*CONTROLLER_VK_A*} para crear el objeto y colocarlo en tu inventario. + + + + Con una mesa de creación puedes crear objetos más grandes. La creación en una mesa se realiza igual que la creación normal, pero dispones de un área de creación mayor que permite una mayor combinación de ingredientes. + + + + La parte inferior derecha de la interfaz de creación muestra tu inventario. Aquí puede aparecer también una descripción del objeto seleccionado en ese momento y los ingredientes necesarios para crearlo. + + + + Ahora aparece la descripción del objeto seleccionado actualmente. Esta descripción puede darte una idea de la utilidad de ese objeto. + + + + Ahora aparece la lista de ingredientes necesarios para crear el objeto actual. + + +La leña que recojas se puede convertir en tablones. Selecciona el icono de tablones y pulsa{*CONTROLLER_VK_A*} para crearlos.{*PlanksIcon*} + + + Ahora que has construido una mesa de creación, deberías colocarla en el mundo para poder construir una selección mayor de objetos.{*B*} + Pulsa{*CONTROLLER_VK_B*} ahora para salir de la interfaz de creación. + + + + Pulsa{*CONTROLLER_VK_LB*} y{*CONTROLLER_VK_RB*} para cambiar el tipo de grupo de los objetos que quieres crear. Selecciona el grupo de herramientas.{*ToolsIcon*} + + + + Pulsa{*CONTROLLER_VK_LB*} y{*CONTROLLER_VK_RB*} para cambiar el tipo de grupo de los objetos que quieres crear. Selecciona el grupo de estructuras.{*StructuresIcon*} + + + + Usa{*CONTROLLER_MENU_NAVIGATE*}para cambiar al objeto que quieres crear. Algunos objetos tienen varias versiones, en función de los materiales utilizados. Selecciona la pala de madera.{*WoodenShovelIcon*} + + + + Si creas mucho necesitarás repetir la acción muchas veces. Ahora que tienes tablones, hay más objetos que puedes crear. Usa{*CONTROLLER_MENU_NAVIGATE*}para desplazarte al objeto que quieres crear. Selecciona la mesa de creación.{*CraftingTableIcon*} + + + + Con las herramientas que has creado ya estás listo para empezar y podrás recoger varios materiales de forma más eficaz.{*B*} + Pulsa{*CONTROLLER_VK_B*} ahora para salir de la interfaz de creación. + + + + Hay objetos que no se pueden crear con la mesa de creación, sino que requieren un horno. Crea un horno ahora.{*FurnaceIcon*} + + + + Coloca el horno que has creado en el mundo. Te conviene colocarlo en el interior del refugio.{*B*} + Pulsa{*CONTROLLER_VK_B*} ahora para salir de la interfaz de creación. + + + + Esta es la interfaz del horno. En el horno puedes modificar objetos fundiéndolos. En el horno puedes, por ejemplo, convertir mineral de hierro en lingotes de hierro. + + +{*B*} + Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo usar el horno. + + + + Tienes que colocar combustible en el espacio de la parte inferior del horno y el objeto que quieres modificar en el espacio superior. El horno se encenderá y empezará a funcionar, y colocará el resultado en el espacio de la parte derecha. + + + + Muchos objetos de madera se pueden usar como combustible, pero no todos arden la misma cantidad de tiempo. También es posible descubrir otros objetos en el mundo que funcionen como combustible. + + + + Después de fundir los objetos puedes trasladarlos de la zona de producción a tu inventario. Experimenta con distintos ingredientes para comprobar lo que puedes crear. + + + + Si usas la madera como ingrediente podrás crear carbón. Coloca combustible en el horno y la madera en el espacio de ingredientes. Puede que el horno tarde un tiempo en crear el carbón, así que puedes aprovechar para hacer alguna otra cosa y volver más tarde a comprobar el progreso. + + + + El carbón se puede usar como combustible y convertir en una antorcha con un palo. + + + + Si colocas arena en el espacio de ingredientes podrás crear cristal. Crea bloques de cristal para usarlos a modo de ventana en el refugio. + + + + Esta es la interfaz de destilado. Se puede usar para crear pociones con efectos diversos. + + +{*B*} + Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo usar el puesto de destilado. + + + + Para destilar pociones, coloca un ingrediente en la parte superior y una botella de agua o una poción en los espacios inferiores (se pueden destilar hasta 3 a la vez). Cuando se introduce una combinación válida, comienza el destilado y al cabo de poco tiempo se creará una poción. + + + + Todas las pociones se empiezan con una botella de agua. La mayoría de pociones se crean usando primero una verruga del mundo inferior para crear una poción rara y requieren como mínimo un ingrediente más para obtener la poción final. + + + + Una vez que tengas una poción, podrás modificar sus efectos. Si añades polvo de piedra rojiza, aumentas la duración del efecto, y si añades polvo de piedra brillante su efecto será más potente. + + + + Si añades ojo de araña fermentado dañarás la poción y puede que la conviertas en otra con el efecto contrario, y si añades pólvora quizá la conviertas en una poción de salpicadura que se puede lanzar para aplicar su efecto sobre un área cercana. + + + + Para crear una poción de resistencia al fuego, primero añade una verruga del mundo inferior a una botella de agua y luego añade crema de magma. + + + + Pulsa{*CONTROLLER_VK_B*} ahora para salir de la interfaz de destilación. + + + + En esta zona hay un puesto de destilado, un caldero y un cofre lleno de objetos para destilar. + + +{*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre el destilado y las pociones.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo destilar y crear pociones. + + + + El primer paso para destilar una poción es crear una botella de agua. Toma una botella de agua del cofre. + + + + Puedes llenar una botella de agua con un caldero que tenga agua o con un bloque de agua. Ahora, para llenar la botella de agua, apunta a una fuente de agua y pulsa{*CONTROLLER_ACTION_USE*}. + + + + Si un caldero se vacía, puedes rellenarlo con un cubo de agua. + + + + Usa el puesto de destilado para crear una poción de resistencia al fuego. Necesitarás una botella de agua, verruga del mundo inferior y crema de magma. + + + + Toma una poción en la mano y mantén pulsado{*CONTROLLER_ACTION_USE*} para usarla. Si es una poción normal, bébela y te aplicarás el efecto a ti mismo; si es una poción de salpicadura, la lanzarás y aplicarás el efecto a las criaturas que estén cerca en el momento del impacto. + Las pociones de salpicadura se crean añadiendo pólvora a las pociones normales. + + + + Usa una poción de resistencia al fuego contigo mismo. + + + Ahora eres resistente al fuego y a la lava, así que comprueba si puedes acceder a lugares a los que antes no podías. + + + + Esta es la interfaz de hechizo, que puedes usar para añadir hechizos a armas, armadura y a algunas herramientas. + + +{*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre la interfaz de hechizos.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo utilizar la interfaz de hechizos. + + + + Para hechizar un objeto, primero colócalo en el espacio de hechizado. Las armas, las armaduras y algunas herramientas se pueden hechizar para añadirles efectos especiales, como resistencia mejorada al daño o aumentar el número de objetos que se generan al extraer un bloque. + + + + Cuando se coloca un objeto en el espacio de hechizado, los botones de la parte derecha cambian y muestran una selección de hechizos aleatorios. + + + + El número que está sobre el botón representa el coste en niveles de experiencia que tiene que aplicar ese hechizo al objeto. Si no tienes un nivel suficiente, el botón no estará activo. + + + + Selecciona un hechizo y pulsa{*CONTROLLER_VK_A*} para hechizar el objeto. Con ello se reducirá el nivel de experiencia en función del coste del hechizo. + + + + Aunque los hechizos son aleatorios, algunos de los mejores hechizos solo están disponibles cuando tienes el nivel de experiencia adecuado y muchas estanterías alrededor de la mesa de hechizos para aumentar su poder. + + + + En esta zona hay una mesa de hechizos y otros objetos que te ayudarán a entender y aprender los hechizos. + + +{*B*} + Pulsa {*CONTROLLER_VK_A*} para obtener más información sobre los hechizos.{*B*} + Pulsa {*CONTROLLER_VK_B*} si ya sabes cómo utilizar los hechizos. + + + + Con una mesa de hechizos podrás añadir efectos especiales, como aumentar el número de objetos que se obtienen al extraer un bloque o mejorar la resistencia al daño de armas, armaduras y algunas herramientas. + + + + Coloca estanterías alrededor de la mesa de hechizos para aumentar su poder y acceder a hechizos de nivel superior. + + + + Hechizar objetos cuesta niveles de experiencia, que se aumentan al acumular orbes de experiencia. Estos orbes se generan al matar monstruos y animales, extraer mineral, criar nuevos animales, pescar y fundir o cocinar algunos objetos en un horno. + + + + También puedes aumentar niveles de experiencia con una botella de hechizo que, una vez arrojada, crea orbes de experiencia donde cae. Después podrás recoger esos orbes. + + + + En los cofres de esta zona encontrarás objetos hechizados, botellas de hechizos y objetos que aún están sin hechizar para que experimentes con ellos en la mesa de hechizos. + + + + Ahora vas subido en una vagoneta. Para salir de ella, apunta el cursor hacia ella y pulsa{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + + +{*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre las vagonetas.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan las vagonetas. + + + + Las vagonetas van sobre raíles. También puedes crear una vagoneta propulsada con un horno y una vagoneta con un cofre en ella. + {*RailIcon*} + + + + También puedes crear raíles propulsados, que absorben energía de las antorchas y circuitos de piedra rojiza para acelerar las vagonetas. Se pueden conectar a interruptores, palancas y platos de presión para crear sistemas complejos. + {*PoweredRailIcon*} + + + + Ahora navegas en un barco. Para salir de él, apunta el cursor hacia él y pulsa{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los barcos.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los barcos. + + + + Los barcos te permiten viajar más deprisa por el agua. Usa{*CONTROLLER_ACTION_MOVE*} y{*CONTROLLER_ACTION_LOOK*} para pilotarlo. + {*BoatIcon*} + + + + Ahora usas una caña de pescar. Pulsa{*CONTROLLER_ACTION_USE*} para usarla.{*FishingRodIcon*} + + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre la pesca.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo pescar. + + + + Pulsa{*CONTROLLER_ACTION_USE*} para lanzar la caña y empezar a pescar. Pulsa{*CONTROLLER_ACTION_USE*} de nuevo para recoger sedal. + {*FishingRodIcon*} + + + + Si esperas a que el corcho se hunda por debajo de la superficie del agua antes de recoger, podrás pescar un pez. Los peces se pueden comer crudos o cocinados en un horno para recuperar salud. + {*FishIcon*} + + + + Al igual que muchas otras herramientas, la caña tiene muchos usos distintos. Sus usos no se limitan a pescar peces. Puedes experimentar con ella e investigar qué se puede pescar o activar... + {*FishingRodIcon*} + + + + Esto es una cama. Pulsa{*CONTROLLER_ACTION_USE*} y apunta hacia ella de noche para dormir y despertar por la mañana.{*ICON*}355{*/ICON*} + + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre las camas.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan las camas. + + + + Las camas deben colocarse en un lugar seguro y bien iluminado para que los monstruos no te despierten en mitad de la noche. Después de usar una cama, si mueres te regenerarás en ella. + {*ICON*}355{*/ICON*} + + + + Si hay más jugadores en tu juego, todos deben estar en una cama al mismo tiempo para poder dormir. + {*ICON*}355{*/ICON*} + + + + En esta área hallarás circuitos sencillos de pistones y piedra rojiza, así como un cofre con más objetos para ampliar estos circuitos. + + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los circuitos de piedra rojiza y los pistones.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya tienes información sobre los circuitos de piedra rojiza y los pistones. + + + + Las palancas, botones, platos de presión y antorchas de piedra rojiza proporcionan energía a los circuitos, bien acoplándolos directamente al objeto que quieres activar o conectándolos con polvo de piedra rojiza. + + + + La posición y dirección en que colocas la fuente de energía puede cambiar la forma en que afecta a los bloques que la rodean. Por ejemplo, una antorcha de piedra rojiza en un lado de un bloque se puede desactivar si el bloque recibe energía de otra fuente. + + + + El polvo de piedra rojiza se consigue al extraer mineral de piedra rojiza con un pico hecho de hierro, diamante u oro. Puedes usarlo para proporcionar energía a un máximo de 15 bloques, y se puede desplazar hacia arriba o hacia abajo un bloque de altura. + {*ICON*}331{*/ICON*} + + + + Los repetidores de piedra rojiza se usan para ampliar la distancia a la que se puede transportar la energía o para colocar un retardo en un circuito. + {*ICON*}356{*/ICON*} + + + + Al recibir energía, los pistones se extienden y empujan hasta 12 bloques. Cuando se repliegan, los pistones adhesivos pueden tirar de bloques de casi cualquier tipo. + {*ICON*}33{*/ICON*} + + + + En el cofre de esta área encontrarás componentes para fabricar circuitos con pistones. Prueba a usar o completar los circuitos de esta área o coloca los tuyos propios. Fuera del área de tutorial encontrarás más ejemplos. + + + + ¡En esta área hay un portal al mundo inferior! + + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los portales y el mundo inferior.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya conoces los portales y el mundo inferior. + + + + Los portales se crean colocando obsidiana en una estructura de cuatro bloques de ancho y cinco de alto. No se necesitan bloques de esquina. + + + + Para activar el portal inferior, prende fuego a los bloques de obsidiana del interior de la estructura con eslabón y pedernal. Los portales se pueden desactivar si se rompe la estructura, si se produce una explosión cerca y si fluye un líquido a través de ellos. + + + + Para usar un portal inferior, colócate en su interior. La pantalla se pondrá púrpura y se reproducirá un sonido. Al cabo de unos segundos, te transportarás a otra dimensión. + + + + El mundo inferior es un lugar peligroso, repleto de lava, pero puede recoger un bloque inferior, que arde para siempre una vez que se enciende, y piedra brillante que genera luz. + + + + El mundo inferior sirve para desplazarte con rapidez por el mundo superior. Una distancia de un bloque en el mundo inferior equivale a desplazarte 3 bloques en el mundo superior. + + + + Ahora estás en el modo Creativo. + + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre el modo Creativo.{*B*} + Pulsa{*CONTROLLER_VK_B*}si ya sabes cómo funciona el modo Creativo. + + +En el modo Creativo posees un número infinito de los objetos y bloques disponibles, puedes destruir bloques con un clic y sin herramientas, eres invulnerable y puedes volar. + +Pulsa{*CONTROLLER_ACTION_JUMP*} dos veces con rapidez para volar. Para dejar de volar, repite la acción. Para volar más rápido, pulsa{*CONTROLLER_ACTION_MOVE*} dos veces en una sucesión rápida mientras vuelas. +En el modo de vuelo, mantén pulsado{*CONTROLLER_ACTION_JUMP*} para moverte hacia arriba y{*CONTROLLER_ACTION_SNEAK*} para moverte hacia abajo, o usa el mando D para moverte hacia arriba, hacia abajo, hacia la izquierda o hacia la derecha. + +Pulsa{*CONTROLLER_ACTION_CRAFTING*} para abrir la interfaz del inventario creativo. + +Para continuar, cruza al otro lado de este agujero. + +Has completado el tutorial del modo creativo. + + + En esta área se ha colocado una granja. Cultivar en la granja te permite crear una fuente renovable de comida y otros objetos. + + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los cultivos.{*B*} + Pulsa{*CONTROLLER_VK_B*}si ya sabes cómo funcionan los cultivos. + + +El trigo, las calabazas y los melones se cultivan a partir de semillas. Las semillas de trigo se obtienen al romper hierba alta o al cosechar trigo, y las semillas de calabaza y melón se consiguen a partir de calabazas y melones respectivamente. + +Antes de plantar semillas, debes convertir los bloques de tierra en tierra de cultivo por medio de una azada. Una fuente cercana de agua te ayudará a mantener la tierra de cultivo hidratada y hará que los cultivos crezcan más rápido, además de mantener la zona iluminada. + +El trigo pasa por distintas fases durante su crecimiento. Cuando aparece más oscuro es que está listo para la cosecha.{*ICON*}59:7{*/ICON*} + +Las calabazas y los melones también necesitan un bloque cerca de donde hayas plantado la semilla para que el fruto crezca cuando el tallo se haya desarrollado por completo. + +La caña de azúcar debe plantarse en un bloque de hierba, tierra o arena que esté junto a un bloque de agua. Cortar un bloque de caña de azúcar provocará que todos los bloques que estén sobre él caigan.{*ICON*}83{*/ICON*} + +Los cactus deben plantarse en arena y crecerán hasta tres bloques de alto. Al igual que con la caña de azúcar, si se destruye el bloque más bajo podrás recoger los bloques que estén sobre él.{*ICON*}81{*/ICON*} + +Los champiñones deben plantarse en una zona con luz tenue y se extenderán a los bloques de luz tenue cercanos.{*ICON*}39{*/ICON*} + +La carne de hueso se puede usar para germinar cultivos hasta su estado de mayor crecimiento o cultivar champiñones hasta que se hagan gigantes.{*ICON*}351:15{*/ICON*} + +Has completado el tutorial de los cultivos. + + + En esta área se han guardado animales en corrales. Puedes hacer que los animales se reproduzcan para crear crías de sí mismos. + + + + {*B*} + Pulsa {*CONTROLLER_VK_A*} para obtener más información sobre la reproducción de animales.{*B*} + Pulsa {*CONTROLLER_VK_B*} si ya sabes cómo funciona la reproducción de animales. + + +Para que los animales se reproduzcan, tendrás que alimentarlos con la comida adecuada para que entren en el "modo Amor". + +Si alimentas con trigo a las vacas, champiñacas u ovejas, con zanahorias a los cerdos, con semillas de trigo o verrugas del mundo inferior a los pollos, o con cualquier tipo de carne a los lobos, estos animales empezarán a buscar a otros animales de la misma especie que también estén en el modo Amor. + +Cuando dos animales de la misma especie se encuentran, y ambos están en el modo Amor, se besarán durante unos segundos y luego aparecerá una cría. La cría seguirá a sus padres durante un tiempo antes de convertirse en un animal adulto. + +Después de estar en el modo Amor los animales no podrán volver a él durante cinco minutos como mínimo. + +Algunos animales te seguirán si tienes su comida en la mano. Así te será más fácil agrupar animales para hacer que se reproduzcan.{*ICON*}296{*/ICON*} + + + Los lobos salvajes se pueden domesticar dándoles huesos. Una vez domesticados, aparecerán corazones de amor a su alrededor. Los lobos mansos seguirán al jugador y lo defenderán si no reciben la orden de quedarse sentados. + + +Has completado el tutorial de reproducción de animales. + + + En esta zona hay algunas calabazas y bloques para crear un gólem de nieve y otro de hierro. + + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre los gólems.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo funcionan los gólems. + + +Los gólems se crean colocando una calabaza encima de un montón de bloques. + +Los gólems de nieve se crean con dos bloques de nieve, uno sobre el otro, y encima una calabaza. Estos gólems lanzan bolas de nieve a tus enemigos. + +Los gólems de hierro se crean con cuatro bloques de hierro colocados como muestra el modelo y con una calabaza encima del bloque central. Estos gólems atacan a tus enemigos. + +Los gólems de hierro aparecen en las aldeas para protegerlas, y te atacarán si atacas a los aldeanos. + +No puedes salir de esta área hasta que completes el tutorial. + +Cada herramienta funciona mejor con distintos materiales. Deberías usar una pala para perforar materiales blandos como tierra y arena. + +Cada herramienta funciona mejor con distintos materiales. Deberías usar un hacha para cortar troncos de árboles. + +Cada herramienta funciona mejor con distintos materiales. Deberías usar un pico para perforar piedra y mineral. Quizá debas fabricar tu pico con mejores materiales para obtener recursos de algunos bloques. + +Hay herramientas que son mejores para atacar enemigos. Plantéate usar una espada para atacar. + +Consejo: mantén pulsado {*CONTROLLER_ACTION_ACTION*}para perforar y picar a mano o con el objeto que sostengas. Quizá tengas que crear una herramienta para perforar algunos bloques... + +La herramienta que usas está dañada. Cada vez que usas una herramienta le causarás daños y con el tiempo se romperá. La barra de colores que está debajo del objeto en el inventario muestra el estado de daños actual. + +Mantén pulsado{*CONTROLLER_ACTION_JUMP*} para nadar. + +En esta área hay una vagoneta en una pista. Para subir a una vagoneta, apunta el cursor hacia ella y puls{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} sobre el botón para que la vagoneta se mueva. + +En el cofre que está junto al río hay un barco. Para usar el barco, apunta el cursor al agua y pulsa{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} mientras apuntas al barco para subir a él. + +En el cofre que está junto al estanque hay una caña de pescar. Coge la caña del cofre y selecciónala para que sea el objeto que quieres llevar en la mano para usarla. + +¡Este mecanismo de pistones más avanzado crea un puente autorreparable! Pulsa el botón para activarlo e investiga la forma en que los componentes interaccionan para averiguar su funcionamiento. + +Si desplazas el foco por fuera del borde de la interfaz con un objeto en él, podrás soltarlo. + +No tienes todos los ingredientes necesarios para crear este objeto. El cuadro de la parte inferior izquierda muestra los ingredientes necesarios para crearlo. + + + ¡Enhorabuena! Has completado el tutorial. El tiempo del juego transcurre ahora a velocidad normal, ¡y no falta mucho para la noche y para que salgan los monstruos! ¡Acaba el refugio! + + +{*EXIT_PICTURE*} Cuando estés dispuesto a seguir explorando, hay una escalera en esta zona, cerca del refugio del minero, que conduce a un pequeño castillo. + +Recordatorio: + +]]> + +Se han añadido nuevas características en la última versión del juego, como áreas nuevas en el tutorial. + +{*B*}Pulsa{*CONTROLLER_VK_A*} para jugar el tutorial de forma normal.{*B*} + Pulsa{*CONTROLLER_VK_B*} para omitir el tutorial principal. + +En esta área encontrarás otras áreas configuradas para que aprendas el funcionamiento de la pesca, los barcos y la piedra rojiza. + +Fuera de esta área encontrarás ejemplos de edificios, cultivos, vagonetas y pistas, hechizos, destilación, intercambios comerciales, herrería y mucho más. + + + La barra de comida se ha agotado hasta un nivel a partir del cual ya no te puedes curar. + + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre la barra de comida y cómo comer.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya tienes información sobre la barra de comida y cómo comer. + + +Seleccionar + +Usar + +Atrás + +Salir + +Cancelar + +Cancelar unión + +Seleccionar disp. de alm. + +Cambiar disp. de alm. + +Actualizar juegos en línea + +Juegos en grupo + +Todos los juegos + +Cambiar grupo + +Mostrar inventario + +Mostrar descripción + +Mostrar ingredientes + +Creación + +Crear + +Coger/colocar + +Coger + +Coger todo + +Coger la mitad + +Colocar + +Colocar todo + +Colocar uno + +Soltar + +Soltar todo + +Soltar uno + +Cambiar + +Movimiento rápido + +Borrar selección rápida + +? + +Compartir en Facebook + +Cambiar filtro + +Ver tarjeta de jugador + +Ver perfil de jugador + +Enviar solicitud de amigo + +Avanzar página + +Retroceder página + +Siguiente + +Anterior + +Expulsar jugador + +Teñir + +Recoger + +Alimentar + +Domesticar + +Curar + +Sentarse + +Sígueme + +Expulsar + +Vacío + +Silla + +Colocar + +Golpear + +Leche + +Recoger + +Comer + +Dormir + +Despertar + +Jugar + +Montar + +Navegar + +Crecer + +Nadar + +Abrir + +Cambiar tono + +Detonar + +Leer + +Colgar + +Arrojar + +Plantar + +Labrar + +Cosechar + +Continuar + +Desbloquear juego completo + +Borrar juego guardado + +Borrar + +Opciones + +Invitar a Xbox Live Party + +Invitar a amigos + +Aceptar + +Tijera + +Bloquear nivel + +Seleccionar aspecto + +Poner en marcha + +Desplazar + +Instalar versión completa + +Instalar versión de prueba + +Instalar + +Resinstalar + +Opc. de guardado + +Ejecutar comando + +Creativo + +Mover ingrediente + +Mover combustible + +Herramienta Mover + +Mover armadura + +Mover arma + +Equipar + +Retirar + +Soltar + +Privilegios + +Bloque + +Retroceder página + +Avanzar página + +Modo Amor + +Beber + +Rotar + +Ocultar + +Cargar part. para Xbox One + +Eliminar todos los espacios + +Subir partida guardada para Xbox One + +Aceptar + +Cancelar + +Tienda de Minecraft + +¿Seguro que quieres salir del juego actual y unirte al nuevo? Se perderán todos los progresos no guardados. + +Salir del juego + +Guardar juego + +Salir sin guardar + +¿Seguro que quieres sobrescribir los archivos de guardado anteriores de este mundo con su versión actual? + +¿Seguro que quieres salir sin guardar? ¡Perderás todos los progresos en este mundo! + +Iniciar juego + +Si creas, cargas o guardas un mundo en el modo Creativo, ese mundo tendrá deshabilitado los logros y las actualizaciones de marcador, aunque después lo cargues en el modo Supervivencia. ¿Seguro que quieres continuar? + +Este mundo se ha guardado en el modo Creativo y tiene deshabilitados los logros y las actualizaciones de marcador. ¿Seguro que quieres continuar? + +Este mundo se ha guardado en el modo Creativo y tiene deshabilitados los logros y las actualizaciones de marcador. + +Si creas, cargas o guardas un mundo con los privilegios de host habilitados, ese mundo tendrá deshabilitado los logros y las actualizaciones de marcador, aunque después lo cargues con esas opciones deshabilitadas. ¿Seguro que quieres continuar? + +Archivo dañado + +El archivo de guardado está dañado. ¿Quieres borrarlo? + +¿Seguro que quieres salir al menú principal y desconectar a todos los jugadores del juego? Se perderán todos los progresos no guardados. + +Salir y guardar + +Salir sin guardar + +¿Seguro que quieres salir al menú principal? Se perderán todos los progresos no guardados. + +¿Seguro que quieres salir al menú principal? ¡Se perderán tus progresos! + +Crear nuevo mundo + +Jugar tutorial + +Tutorial + +Dar nombre al mundo + +Escribe un nombre para tu mundo. + +Introduce la semilla para la generación del mundo. + +Cargar mundo guardado + +Pulsa START para unirte al juego. + +Saliendo del juego + +Se ha producido un error. Saliendo al menú principal. + +Error de conexión + +Se ha perdido la conexión + +Se ha perdido la conexión con el servidor. Saliendo al menú principal. + +Se ha perdido la conexión con Xbox Live. Saliendo al menú principal. + +Se ha perdido la conexión con Xbox Live. + +Desconectado por el servidor. + +Has sido expulsado del juego. + +Has sido expulsado del juego por volar. + +El intento de conexión ha tardado demasiado. + +El servidor está lleno. + +El host ha salido del juego. + +No puedes unirte a este juego porque no tienes ningún amigo en él. + +No puedes unirte a este juego porque el host te ha expulsado anteriormente. + +No puedes unirte a este juego porque el jugador al que quieres unirte usa una versión más antigua. + +No puedes unirte a este juego porque el jugador al que quieres unirte usa una versión más antigua. + +Nuevo mundo + +¡Premio desbloqueado! + +¡Hurra! ¡Has obtenido una imagen de jugador de Steve, de Minecraft! + +¡Hurra! ¡Has obtenido una imagen de jugador de un Creeper! + +¡Hurra! ¡Has obtenido un objeto de avatar: una camiseta de Minecraft: Xbox 360 Edition! +Ve a la Interfaz para ponerle la camiseta a tu avatar. + +¡Hurra! ¡Has obtenido un objeto de avatar: un reloj de Minecraft: Xbox 360 Edition! +Ve a la Interfaz para ponerle el reloj a tu avatar. + +¡Hurra! ¡Has obtenido un objeto de avatar: una gorra de béisbol de Creeper! +Ve a la Interfaz para ponerle la gorra a tu avatar. + +¡Hurra! ¡Has obtenido el tema de Minecraft: Xbox 360 Edition! +Ve a la Interfaz para seleccionar este tema. + +Desbloquear juego completo + +Estás jugando la versión de prueba, pero necesitarás el juego completo para guardar tu juego. +¿Quieres desbloquear el juego completo? + +Esta es la versión de prueba de Minecraft: Xbox 360 Edition. Si tuvieras el juego completo, ¡habrías conseguido un logro! +¿Te gustaría desbloquear el juego completo? + +Esta es la versión de prueba de Minecraft: Xbox 360 Edition. Si tuvieras el juego completo, ¡habrías conseguido un premio de avatar! +¿Te gustaría desbloquear el juego completo? + +Esta es la versión de prueba de Minecraft: Xbox 360 Edition. Si tuvieras el juego completo, ¡habrías conseguido una imagen de jugador! +¿Te gustaría desbloquear el juego completo? + +Esta es la versión de prueba de Minecraft: Xbox 360 Edition. Si tuvieras el juego completo, ¡habrías conseguido un tema! +¿Te gustaría desbloquear el juego completo? + +Esta es la versión de prueba de Minecraft: Xbox 360 Edition. Necesitas la versión completa para aceptar esta invitación. +¿Quieres desbloquear la versión completa del juego? + +Los jugadores invitados no pueden desbloquear el juego completo. Inicia sesión con un ID de usuario de Xbox Live. + +Espera + +No hay resultados + +Filtro: + +Amigos + +Mi puntuación + +Total + +Entradas: + +Clasif. + +Gamertag + +Preparando para guardar nivel + +Preparando fragmento... + +Finalizando... + +Construyendo terreno + +Simulando mundo durante un instante + +Inicializando servidor + +Generando zona de generación + +Cargando zona de generación + +Entrando en el mundo inferior + +Saliendo del mundo inferior + +Regenerando + +Generando nivel + +Cargando nivel + +Guardando jugadores + +Conectando al host + +Descargando terreno + +Cambiando a juego sin conexión + +Espera mientras el host guarda el juego. + +Entrando en El FIN + +Saliendo de El FIN + +Buscando semilla para el generador de mundos + +Esta cama está ocupada. + +Solo puedes dormir por la noche. + +%s está en cama durmiendo. Para avanzar al amanecer, todos los jugadores deben dormir en camas a la vez. + +¡Tu casa original ha desaparecido o está obstruida! + +Ahora no puedes descansar, hay monstruos cerca. + +Estás en cama durmiendo. Para avanzar al amanecer, todos los jugadores deben dormir en camas a la vez. + +Herramientas y armas + +Armas + +Comida + +Estructuras + +Armadura + +Mecanismos + +Transporte + +Decoraciones + +Construir bloques + +Piedra rojiza y transporte + +Varios + +Destilación + +Destilado + +Herramientas, armas y armadura + +Materiales + +Sesión cerrada + +Has vuelto a la pantalla de título porque tu perfil de jugador ha cerrado la sesión. + +Dificultad + +Música + +Sonido + +Gamma + +Sensibilidad del juego + +Sensibilidad de la interfaz + +Pacífico + +Fácil + +Normal + +Difícil + +En este modo, el jugador recupera la salud con el paso del tiempo y no hay enemigos en el entorno. + +En este modo, el entorno genera enemigos, pero causarán menos daño al jugador que en el modo normal. + +En este modo, el entorno genera enemigos que infligirán al jugador una cantidad de daño normal. + +En este modo, el entorno genera enemigos que infligirán al jugador una cantidad de daño elevada. ¡Ten cuidado también con los Creepers, ya que no es probable que cancelen su ataque explosivo cuando te alejes de ellos! + +Límite de tiempo alcanzado + +Has jugado a la versión de prueba de Minecraft: Xbox 360 Edition durante la cantidad máxima de tiempo permitida. Para continuar divirtiéndote, ¿quieres desbloquear el juego completo? + +Juego completo + +No te has podido unir al juego y no quedan más espacios. + +Introducir texto de señal + +Introduce una línea de texto para tu señal. + +Introducir título + +Introduce un título para tu publicación. + +Introducir subtítulo + +Introduce un subtítulo para tu publicación. + +Introducir descripción + +Introduce una descripción para tu publicación. + +Inventario + +Ingredientes + +Puesto de destilado + +Cofre + +Hechizar + +Horno + +Ingrediente + +Combustible + +Dispensador + +No existen ofertas de descarga de contenido de este tipo disponibles para este título en este momento. + +%s se ha unido al juego. + +%s ha abandonado el juego. + +Han expulsado a %s del juego. + +¿Seguro que quieres borrar este juego guardado? + +Aprobando... + +Censurado + +Ahora jugando: + +Restablecer configuración + +¿Seguro que quieres restablecer la configuración a los valores predeterminados? + +Error al cargar + +Minecraft: Xbox 360 Edition ha experimentado un error al cargar y no puede continuar. + +Juego de %s + +Juego de host desconocido + +Un invitado ha cerrado la sesión + +Un jugador invitado ha cerrado la sesión, lo que ha provocado que todos los invitados queden excluidos del juego. + +Iniciar sesión + +No has iniciado sesión. Para jugar tienes que iniciar sesión. ¿Quieres hacerlo ahora? + +Multijugador no admitido + +No te has podido unir al juego porque uno o más jugadores no tienen autorización para participar en juegos multijugador en Xbox Live. + +No has podido crear un juego en línea porque uno o más jugadores no tienen autorización para participar en juegos multijugador en Xbox Live. Desmarca la casilla "Juego en línea" para jugar sin conexión. + +No te puedes unir a esta sesión de juego porque la configuración de privilegios de Contenido de miembro es demasiado restrictiva. Cambia esta configuración en la sección Privacidad, Privacidad y conexión de la Interfaz Xbox si quieres unirte a la sesión. + +No te puedes unir a esta sesión de juego porque uno de los jugadores locales tiene una configuración de privilegios de Contenido de miembro demasiado restrictiva. + +No te puedes unir a esta sesión de juego porque uno de los jugadores de la sesión tiene una configuración de privilegios de Contenido de miembro de Solo amigos y no estás en su lista de amigos. + +No se ha podido crear el juego. + +No puedes crear esta sesión de juego porque uno de los jugadores locales tiene una configuración de privilegios de Contenido de miembro demasiado restrictiva. Desmarca la casilla "Juego en línea" para iniciar un juego sin conexión o cambia este ajuste en la sección Privacidad, Privacidad y conexión de la Interfaz Xbox + +Seleccionado automáticamente + +Sin pack: aspectos pred. + +Aspectos favoritos + +Nivel bloqueado + +El juego al que te estás uniendo está en la lista de niveles bloqueados. +Si decides unirte a este juego, se eliminará el nivel de la lista de niveles bloqueados. + +¿Bloquear este nivel? + +¿Seguro que quieres añadir este nivel a la lista de niveles bloqueados? +Selecciona ACEPTAR para salir del juego. + +Eliminar de la lista de bloqueados + +Intervalo de autoguardado + +Intervalo de autoguardado: NO + +Minutos + +¡No se puede colocar aquí! + +No se puede colocar lava cerca del punto de generación del nivel porque se puede producir la muerte instantánea de los jugadores que se regeneran. + +Este juego utiliza la función de autoguardado. Si ves este icono, el juego está guardando los datos. +No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. + +Opacidad de la interfaz + +Preparación de autoguardado del nivel + +Tamaño de HUD + +Tamaño de HUD (pantalla dividida) + +Semilla + +Desbloquear pack de aspecto + +Para usar el aspecto que has seleccionado tienes que desbloquear este pack de aspecto. +¿Quieres desbloquear este pack de aspecto ahora? + +Desbloquear pack de textura + +Desbloquea este pack de textura para usarlo en tu mundo. +¿Te gustaría desbloquearlo ahora? + +Pack de textura de prueba + +Estás usando una versión de prueba del pack de textura. No podrás guardar este mundo a menos que desbloquees la versión completa. +¿Te gustaría desbloquear la versión completa de este pack de textura? + +Pack de textura no disponible + +Desbloquear versión completa + +Descargar versión de prueba + +Descargar versión completa + +¡Este mundo usa un pack de textura o de popurrí que no tienes! +¿Quieres instalar el pack de textura o de popurrí ahora? + +Conseguir versión de prueba + +Conseguir versión completa + +Expulsar jugador + +¿Seguro que quieres expulsar a este jugador del juego? No podrá volver a unirse hasta que reinicies el mundo. + +Packs de imágenes de jugador + +Temas + +Packs de aspectos + +Permitir amigos de amigos + +No puedes unirte a este juego porque está limitado a jugadores que son amigos del host. + +No te puedes unir al juego + +Seleccionado + +Aspecto seleccionado: + +Descarga de contenido dañada + +La descarga de contenido está dañada y no se puede utilizar. Debes eliminarla y volver a instalarla en el menú de Tienda de Minecraft. + +Alguna descarga de contenido está dañada y no se puede utilizar. Debes eliminarla y volver a instalarla en el menú de Tienda de Minecraft. + +Se ha cambiado el modo de juego. + +Cambiar nombre al mundo + +Escribe un nuevo nombre para tu mundo. + +Modo juego: Supervivencia + +Modo juego: Creativo + +Supervivencia + +Creativo + +En modo Supervivencia + +En modo Creativo + +Generar nubes + +¿Qué quieres hacer con este juego guardado? + +Cambiar nombre a juego guardado + +Autoguardando en %d... + +Sí + +No + +Normal + +Superplano + +Si está habilitado, el juego será un juego en línea. + +Si está habilitado, solo los jugadores invitados pueden unirse. + +Si está habilitado, los amigos de la gente en tu lista de amigos pueden unirse. + +Si está habilitado, los jugadores pueden causar daño a otros jugadores. Solo afecta al modo Supervivencia. + +Si está deshabilitado, los jugadores que se unan al juego no pueden construir ni extraer sin autorización. + +Si está habilitado, el fuego se puede propagar a los bloques inflamables cercanos. + +Si está habilitado, la dinamita explota cuando se activa. + +Si está habilitado, el host puede volar, deshabilitar la extenuación y hacerse invisible. Deshabilita los logros y actualizaciones del marcador. + +Si se activa, el mundo inferior se regenerará. Esto es útil si tienes una partida guardada antigua donde no está presente la fortaleza del mundo inferior. + +Si está habilitado, se generarán estructuras como aldeas y fortalezas en el mundo. + +Si está habilitado, se generará un mundo completamente plano en el mundo superior y en el inferior. + +Si está habilitado, se creará un cofre con objetos útiles cerca del punto de generación del jugador. + +Packs de aspecto + +Temas + +Imágenes de jugador + +Objetos de avatar + +Packs de textura + +Packs de popurrí + +{*PLAYER*} ha entrado en combustión + +{*PLAYER*} se quemó hasta morir + +{*PLAYER*} intentó nadar en la lava + +{*PLAYER*} se asfixió en un muro + +{*PLAYER*} se ahogó + +{*PLAYER*} se murió de hambre + +{*PLAYER*} se pinchó hasta morir + +{*PLAYER*} se golpeó demasiado fuerte contra el suelo + +{*PLAYER*} se cayó del mundo + +{*PLAYER*} murió + +{*PLAYER*} explotó + +{*PLAYER*} murió a causa de la magia + +{*PLAYER*} murió a causa del aliento del dragón de Ender. + +{*SOURCE*} asesinó a {*PLAYER*} + +{*SOURCE*} asesinó a {*PLAYER*} + +{*SOURCE*} disparó a {*PLAYER*} + +{*SOURCE*} quemó con bolas de fuego a {*PLAYER*} + +{*SOURCE*} apaleó a {*PLAYER*} + +{*PLAYER*} ha muerto a manos de {*SOURCE*} + +Niebla de lecho de roca + +Mostrar HUD + +Mostrar mano + +Gamertags en pantalla dividida + +Mensajes de muerte + +Personaje animado + +Animación de aspecto personalizada + +Ya no puedes perforar ni usar objetos. + +Ahora puedes perforar y usar objetos. + +Ya no puedes colocar bloques. + +Ahora puedes colocar bloques. + +Ahora puedes usar puertas e interruptores. + +Ya no puedes usar puertas ni interruptores. + +Ahora puedes usar contenedores (p. ej. cofres). + +Ya no puedes usar contenedores (p. ej. cofres). + +Ya no puedes atacar a enemigos. + +Ahora puedes atacar a enemigos. + +Ya no puedes atacar a jugadores. + +Ahora puedes atacar a jugadores. + +Ya no puedes atacar a animales. + +Ahora puedes atacar a animales. + +Ahora eres un moderador. + +Ya no eres un moderador. + +Ahora puedes volar. + +Ya no puedes volar. + +Ya no te fatigarás. + +Ahora te fatigarás. + +Ahora eres invisible. + +Ya no eres invisible. + +Ahora eres invulnerable. + +Ya no eres invulnerable. + +%d MSP + +Dragón de Ender + +%s ha entrado en El Fin. + +%s ha salido de El Fin. + + +{*C3*}Veo a ese jugador al que te referías.{*EF*}{*B*}{*B*} +{*C2*}¿{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Sí. Cuidado. Ha alcanzado un nivel superior. Puede leer nuestros pensamientos.{*EF*}{*B*}{*B*} +{*C2*}No importa. Cree que somos parte del juego.{*EF*}{*B*}{*B*} +{*C3*}Me gusta. Ha jugado bien. No se ha rendido.{*EF*}{*B*}{*B*} +{*C2*}Lee nuestros pensamientos como si fueran textos en una pantalla.{*EF*}{*B*}{*B*} +{*C3*}Así le gusta imaginar muchas cosas, cuando está en lo más profundo del sueño del juego.{*EF*}{*B*}{*B*} +{*C2*}Las palabras son una interfaz maravillosa. Muy flexibles. Y asustan menos que contemplar la realidad que se oculta detrás de la pantalla.{*EF*}{*B*}{*B*} +{*C3*}Antes oían voces. Antes de que los jugadores pudieran leer. En aquellos tiempos en los que los que no jugaban llamaban a los jugadores hechiceros y brujas. Y en los que los jugadores soñaban que volaban sobre palos impulsados por demonios.{*EF*}{*B*}{*B*} +{*C2*}¿Qué soñaba este jugador?{*EF*}{*B*}{*B*} +{*C3*}Soñaba la luz del sol y los árboles. Fuego y agua. Soñaba que creaba. Y soñaba que destruía. Soñaba que cazaba y que le daban caza. Soñaba un refugio.{*EF*}{*B*}{*B*} +{*C2*}Ja, la interfaz original. Tiene un millón de años y sigue funcionando. Pero ¿qué estructura verdadera ha creado en la realidad tras la pantalla?{*EF*}{*B*}{*B*} +{*C3*}Colaboró con muchos más para esculpir un mundo real en un pliego de {*EF*}{*NOISE*}{*C3*} y creó un {*EF*}{*NOISE*}{*C3*} para {*EF*}{*NOISE*}{*C3*} en {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}Pero eso no lo puede leer.{*EF*}{*B*}{*B*} +{*C3*}No. Todavía no ha alcanzado el nivel superior. Debe conseguirlo en el largo sueño de la vida, no el corto sueño de un juego.{*EF*}{*B*}{*B*} +{*C2*}¿Sabe que lo queremos? ¿Que el universo es amable?{*EF*}{*B*}{*B*} +{*C3*}A veces, entre el ruido de sus pensamientos, escucha al universo, sí.{*EF*}{*B*}{*B*} +{*C2*}Pero, a veces, está triste en el sueño largo. Crea mundos que no tienen verano y tiembla bajo un sol negro, y confunde su creación triste con la realidad.{*EF*}{*B*}{*B*} +{*C3*}Quitarle la pena lo destruiría. La pena es parte de su propia misión. No podemos interferir.{*EF*}{*B*}{*B*} +{*C2*}A veces, cuando están en un sueño muy profundo, quiero decírselo, decirles que están construyendo mundos de verdad en la realidad. A veces, quiero decirles que son importantes para el universo. A veces, cuando no han creado una conexión real en mucho tiempo, quiero ayudarles a decir la palabra que temen.{*EF*}{*B*}{*B*} +{*C3*}Lee nuestros pensamientos.{*EF*}{*B*}{*B*} +{*C2*}A veces, no me importa. A veces, quiero decirles que este mundo que toman por real tan solo es {*EF*}{*NOISE*}{*C2*} y {*EF*}{*NOISE*}{*C2*}, quiero decirles que son {*EF*}{*NOISE*}{*C2*} en {*EF*}{*NOISE*}{*C2*}. Ven tan poco de la realidad en su sueño largo.{*EF*}{*B*}{*B*} +{*C3*}Pero siguen jugando.{*EF*}{*B*}{*B*} +{*C2*}Y sería tan fácil decirles que...{*EF*}{*B*}{*B*} +{*C3*}Demasiado fuerte para este sueño. Decirles que vivir es impedir que vivan.{*EF*}{*B*}{*B*} +{*C2*}Nunca diré a un jugador cómo vivir.{*EF*}{*B*}{*B*} +{*C3*}Se está inquietando.{*EF*}{*B*}{*B*} +{*C2*}Le contaré una historia.{*EF*}{*B*}{*B*} +{*C3*}Pero no la verdad.{*EF*}{*B*}{*B*} +{*C2*}No. Una historia que contenga la verdad de forma segura, en una jaula de palabras. No la verdad desnuda que puede quemar a cualquier distancia.{*EF*}{*B*}{*B*} +{*C3*}Dale un cuerpo, otra vez.{*EF*}{*B*}{*B*} +{*C2*}Sí. Jugador...{*EF*}{*B*}{*B*} +{*C3*}Utiliza su nombre.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Jugador de juegos.{*EF*}{*B*}{*B*} +{*C3*}Bien.{*EF*}{*B*}{*B*} + + + +{*C2*}Ahora, respira. Vuelve a respirar. Siente el aire en los pulmones. Permite que tus extremidades regresen. Sí, mueve los dedos. Vuelve a tener un cuerpo sometido a la gravedad, en el aire. Vuelve a generarte en el sueño largo. Ahí estás. Todo tu cuerpo vuelve a tocar el universo, como si fuerais cosas distintas. Como si fuerais cosas distintas.{*EF*}{*B*}{*B*} +{*C3*}¿Quiénes somos? Otrora nos llamaron espíritu de la montaña. Padre sol, madre luna. Espíritus ancestrales, espíritus animales. Genios. Fantasmas. Los hombrecillos verdes. Después, dioses, demonios. Ãngeles. Fenómenos paranormales. Alienígenas, extraterrestres. Leptones, quarks. Las palabras cambian. Nosotros no.{*EF*}{*B*}{*B*} +{*C2*}Somos el universo. Somos todo lo que piensas que no eres tú. Nos estás mirando a través de tu piel y tus ojos. ¿Y por qué toca el universo tu piel y te ilumina? Para verte, jugador. Para conocerte. Y para que nos conozcas. Te contaré una historia.{*EF*}{*B*}{*B*} +{*C2*}Érase una vez un jugador.{*EF*}{*B*}{*B*} +{*C3*}El jugador eras tú, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}A veces, el jugador se consideraba un ser humano, en la fina corteza de una esfera de roca derretida. La esfera de roca derretida giraba alrededor de una esfera de gas ardiente que era trescientas treinta mil veces mayor que ella. Estaban tan separadas que la luz tardaba ocho minutos en llegar de una a otra. La luz era información de una estrella y podía quemar la piel a cincuenta millones de kilómetros de distancia.{*EF*}{*B*}{*B*} +{*C2*}A veces, el jugador soñaba que era un minero, sobre la superficie de un mundo plano e infinito. El sol era un cuadrado blanco. Los días eran cortos; había mucho que hacer y la muerte no era más que un inconveniente temporal.{*EF*}{*B*}{*B*} +{*C3*}A veces, el jugador soñaba que estaba perdido en una historia.{*EF*}{*B*}{*B*} +{*C2*}A veces, el jugador soñaba que era otras cosas, en otros lugares. A veces, esos sueños eran perturbadores. A veces, realmente bellos. A veces, el jugador se despertaba de un sueño en otro, y después de ese en un tercero.{*EF*}{*B*}{*B*} +{*C3*}A veces, el jugador soñaba que veía palabras en una pantalla.{*EF*}{*B*}{*B*} +{*C2*}Retrocedamos.{*EF*}{*B*}{*B*} +{*C2*}Los átomos del jugador estaban esparcidos en la hierba, en los ríos, en el aire, en la tierra. Una mujer recogió los átomos, bebió y comió y respiró; y la mujer ensamblo al jugador en su cuerpo.{*EF*}{*B*}{*B*} +{*C2*}Y el jugador despertó del mundo oscuro y cálido del cuerpo de su madre en el sueño largo.{*EF*}{*B*}{*B*} +{*C2*}Y el jugador fue una nueva historia, nunca antes contada, escrita con ADN. Y el jugador era un nuevo programa, que nunca se había ejecutado, generado por un código fuente con un billón de años. Y el jugador era un nuevo ser humano, que nunca había vivido antes, hecho tan solo de leche y amor.{*EF*}{*B*}{*B*} +{*C3*}Tú eres el jugador. La historia. El programa. El humano. Hecho tan solo de leche y amor.{*EF*}{*B*}{*B*} +{*C2*}Retrocedamos más.{*EF*}{*B*}{*B*} +{*C2*}Los siete trillones de trillones de trillones de átomos del jugador se crearon, mucho antes de este juego, en el corazón de una estrella. Así que el jugador también es información de una estrella. Y el jugador se mueve a través de una historia que es un bosque de información colocada por un tipo llamado Julian, en un mundo infinito y plano creado por un hombre llamado Markus que existe en un mundo pequeño y privado creado por el jugador que habita un universo creado por...{*EF*}{*B*}{*B*} +{*C3*}Sssh. A veces, el jugador creaba un mundo pequeño y privado que era suave, cálido y sencillo. A veces, frío, duro y complicado. A veces, creaba un modelo del universo en su cabeza; motas de energía moviéndose a través de vastos espacios vacíos. A veces llamaba a esas motas "electrones" y "protones".{*EF*}{*B*}{*B*} + + + +{*C2*}A veces, las llamaba "planetas" y "estrellas".{*EF*}{*B*}{*B*} +{*C2*}A veces, creía que estaba en un universo hecho de energía que estaba compuesto de encendidos y apagados, de ceros y unos, de líneas de código. A veces, creía que jugaba a un juego. A veces, creía que leía palabras en una pantalla.{*EF*}{*B*}{*B*} +{*C3*}Tú eres el jugador, que lee palabras...{*EF*}{*B*}{*B*} +{*C2*}Sssh... A veces, el jugador leía líneas de código en una pantalla. Las decodificaba en palabras, decodificaba las palabras en significados; decodificaba los significados en sentimientos, teorías, ideas... y el jugador comenzó a respirar cada vez más deprisa y más profundamente cuando se dio cuenta de que estaba vivo, estaba vivo, esas miles de muertes no habían sido reales, el jugador estaba vivo.{*EF*}{*B*}{*B*} +{*C3*}Tú. Tú. Tú estás vivo.{*EF*}{*B*}{*B*} +{*C2*}Y, a veces, el jugador creía que el universo le había hablado a través de la luz del sol del verano que se colaba entre las hojas al viento.{*EF*}{*B*}{*B*} +{*C3*}Y, a veces, el jugador creía que el universo le había hablado a través de la luz que llegaba del frío cielo nocturno del invierno, donde una mota de luz en el rabillo del ojo del jugador podría ser una estrella un millón de veces más grande que el sol, quemando sus planetas, convirtiéndolos en plasma, para que el jugador pudiera verla un instante desde el otro extremo del universo mientras volvía a casa, mientras olía comida de pronto, casi en su puerta, a punto de volver a soñar.{*EF*}{*B*}{*B*} +{*C2*}Y, a veces, el jugador creía que el universo le había hablado a través de los ceros y los unos, a través de la electricidad del mundo, a través de las palabras deslizándose por una pantalla al final de un sueño.{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía te quiero.{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía has jugado bien.{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía cuanto necesitas está en tu interior.{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía eres más fuerte de lo que crees.{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía eres la luz del día.{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía eres la noche.{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía tu lucha está en tu interior.{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía la luz que buscas está en tu interior.{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía no estás solo.{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía no estás separado del resto de las cosas.{*EF*}{*B*}{*B*} +{*C3*}Y el universo le decía eres el universo probándose a sí mismo, hablando consigo mismo, leyendo su propio código.{*EF*}{*B*}{*B*} +{*C2*}Y el universo le decía te quiero porque eres amor.{*EF*}{*B*}{*B*} +{*C3*}Y el juego había acabado y el jugador se despertó del sueño. Y el jugador comenzó un nuevo sueño. Y el jugador volvió a soñar, soñó mejor. Y el jugador era el universo. Y el jugador era amor.{*EF*}{*B*}{*B*} +{*C3*}Tú eres el jugador.{*EF*}{*B*}{*B*} +{*C2*}Despierta.{*EF*} + + +Restablecer mundo inferior + +¿Seguro que quieres restablecer el mundo inferior de este archivo de guardado a sus valores predeterminados? Perderás todo lo que has construido en el mundo inferior. + +Restablecer mundo inferior + +No restablecer mundo inferior + +No se puede trasquilar esta champiñaca en este momento. Límite de cerdos, ovejas, vacas y gatos alcanzado. + +El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de cerdos, ovejas, vacas y gatos. + +No se pueden usar huevos generadores ahora. Límite de champiñacas en un mundo alcanzado. + +No se pueden usar huevos generadores en este momento. Se ha alcanzado el límite de lobos en un mundo. + +No se pueden usar huevos generadores en este momento. Se ha alcanzado el límite de gallinas en un mundo. + +No se pueden usar huevos generadores en este momento. Se ha alcanzado el límite de calamares en un mundo. + +No se pueden usar huevos generadores en este momento. Se ha alcanzado el límite de enemigos en un mundo. + +No se pueden usar huevos generadores en este momento. Se ha alcanzado el límite de aldeanos en un mundo. + +Se ha alcanzado el límite de pinturas y estructuras de objeto en un mundo. + +No puedes generar enemigos en el modo pacífico. + +Este animal no puede entrar en el modo Amor. Se ha alcanzado la cantidad máxima de cerdos, ovejas, vacas y gatos reproductores. + +Este animal no puede estar en modo Amor. Se ha alcanzado el límite de cría de lobos. + +Este animal no puede estar en modo Amor. Se ha alcanzado el límite de cría de gallinas. + +Este animal no puede estar en modo Amor. Se ha alcanzado el límite de cría de champiñacas. + +Se ha alcanzado la cantidad máxima de barcos en un mundo. + +Se ha alcanzado el límite de cabezas de enemigos en un mundo. + +Invertir vista + +Zurdo + +¡Has muerto! + +Regenerarse + +Descarga de contenido + +Cambiar aspecto + +Cómo se juega + +Controles + +Configuración + +Créditos + +Volver a instalar contenido + +Configuración de depuración + +El fuego se propaga + +La dinamita explota + +Jugador contra jugador + +Confiar en jugadores + +Privilegios de host + +Genera estructuras + +Mundo superplano + +Cofre de bonificación + +Opciones del mundo + +Puede construir y extraer + +Puedes usar puertas e interruptores. + +Puedes abrir contenedores. + +Puede atacar a los jugadores + +Puedes atacar a animales. + +Moderador + +Expulsar + +Puede volar + +Desactiva la extenuación + +Invisible + +Opciones de host + +Jugadores/Invitar + +Juego en línea + +Solo por invitación + +Más opciones + +Carga + +Nuevo mundo + +Nombre del mundo + +Semilla para el generador de mundos + +Dejar vacío para semilla aleatoria + +Jugadores + +Unirse al juego + +Iniciar juego + +No se encontraron juegos + +Jugar al juego + +Marcadores + +Logros + +Ayuda y opciones + +Desbloquear juego completo + +Reanudar juego + +Guardar juego + +Dificultad: + +Tipo de juego: + +Gamertags: + +Estructuras: + +Tipo de nivel: + +JcJ: + +Confiar en jugadores: + +Dinamita: + +El fuego se propaga: + +Volver a instalar tema + +Volver a instalar imagen de jugador 1 + +Volver a instalar imagen de jugador 2 + +Volver a instalar objeto de avatar 1 + +Volver a instalar objeto de avatar 2 + +Volver a instalar objeto de avatar 3 + +Opciones + +Sonido + +Control + +Gráficos + +Interfaz de usuario + +Valores predeterminados + +Ver oscilación + +Consejos + +Información sobre herramientas del juego + +Gamertags del juego + +Pantalla dividida vertical para 2 jugadores + +Listo + +Editar mensaje de señal: + +Completa la información que irá junto a tu captura. + +Subtítulo + +Captura de pantalla del juego + +Editar mensaje de señal: + +¡Mira lo que he hecho en Minecraft: Xbox 360 Edition! + +¡Con la interfaz de usuario, los iconos y la textura clásica de Minecraft! + +Mostrar todos los mundos de popurrí + +Seleccionar espacio de transferencia + +Vaciar espacio + +Subiendo metadatos guardados + +Subiendo datos guardados + +Subiendo partida guardada para Xbox One + +Carga cancelada + +Has cancelado la carga de este archivo de guardado al área de transferencia. + +Sin efectos + +Velocidad + +Lentitud + +Rapidez + +Fatiga de extracción + +Fuerza + +Debilidad + +Salud instantánea + +Daño instantáneo + +Impulso en salto + +Náusea + +Regeneración + +Resistencia + +Resistente al fuego + +Respiración en agua + +Invisibilidad + +Ceguera + +Visión nocturna + +Hambre + +Veneno + +de rapidez + +de lentitud + +de rapidez + +de torpeza + +de fortaleza + +de debilidad + +de curación + +de daño + +de salto + +de náusea + +de regeneración + +de resistencia + +de resistencia al fuego + +de respiración en agua + +de invisibilidad + +de ceguera + +de visión nocturna + +de hambre + +de veneno + + + +II + +III + +IV + +Salpicadura + +Mundano + +Aburrido + +Blando + +Nítido + +Lechoso + +Difuso + +Natural + +Fino + +Raro + +Plano + +Voluminoso + +Chapucero + +Untado + +Liso + +Suave + +Cortés + +Grueso + +Elegante + +Sofisticado + +Encantador + +Enérgico + +Refinado + +Cordial + +Resplandeciente + +Potente + +Repugnante + +Inodoro + +Rancio + +Ãspero + +Acre + +Asqueroso + +Hediondo + +Se usa como base para todas las pociones. Úsala en un puesto de destilado para crear pociones. + +No tiene efectos. Se puede usar en un puesto de destilado para crear pociones añadiendo más ingredientes. + +Aumenta la velocidad de movimiento de los jugadores, animales y monstruos afectados y la velocidad de carrera, longitud de salto y campo de visión de los jugadores. + +Disminuye la velocidad de movimiento de los jugadores, animales y monstruos afectados y la velocidad de carrera, longitud de salto y campo de visión de los jugadores. + +Aumenta el daño causado por los jugadores y monstruos afectados cuanto atacan. + +Disminuye el daño causado por los jugadores y monstruos afectados cuanto atacan. + +Aumenta al instante la salud de los jugadores y monstruos afectados. + +Disminuye al instante la salud de los jugadores y monstruos afectados. + +Restablece la salud de los jugadores, animales y monstruos afectados con el tiempo. + +Hace que los jugadores, animales y monstruos afectados sean inmunes al daño causado por fuego, lava y ataques de llama a distancia. + +Disminuye la salud de los jugadores, animales y monstruos afectados con el tiempo. + +Afilado + +Aporrear + +Maldición de los artrópodos + +Derribar + +Aspecto del fuego + +Protección + +Protección del fuego + +Caída de hojas + +Protección de ráfagas + +Protección de proyectiles + +Respiración + +Afinidad al agua + +Eficiencia + +Toque sedoso + +Irrompible + +Saqueo + +Fortuna + +Poder + +Llama + +Puñetazo + +Infinidad + +I + +II + +III + +IV + +V + +VI + +VII + +VIII + +IX + +X + +Se puede perforar con un pico de hierro o un objeto mejor para extraer esmeraldas. + +Similar a los cofres, pero los objetos colocados en un cofre de Ender estarán disponibles en los cofres del mismo tipo del resto de jugadores, incluso en dimensiones distintas. + +Se activa cuando una entidad tropieza con un cable trampa conectado. + +Activa un gancho de cable trampa conectado cuando una entidad choca con él. + +Una manera de almacenar esmeraldas de forma compacta. + +Una pared hecha de adoquines. + +Se puede usar para reparar armas, herramientas y armaduras. + +Se funde en un horno para producir cuarzo del mundo inferior. + +Se usa como decoración. + +Se puede intercambiar con los aldeanos. + +Se usa como decoración. En ella se pueden plantar flores, arbolillos, cactus y champiñones. + +Restablece 2{*ICON_SHANK_01*} y se puede convertir en una zanahoria dorada. Se puede plantar en tierras de cultivo. + +Restablece 0.5{*ICON_SHANK_01*}o se puede cocinar en el horno. Se puede plantar en tierras de cultivo. + +Restablece 3{*ICON_SHANK_01*}. Se crea cocinando una patata en el horno. + +Restablece 1{*ICON_SHANK_01*}o se puede cocinar en el horno. Se puede plantar en tierras de cultivo. Si comes esto puede que te envenene. + +Restablece 3{*ICON_SHANK_01*}. Se produce a partir de una zanahoria y pepitas de oro. Restablece 3. + +Se usa para controlar los cerdos ensillados mientras montas sobre ellos. + +Restablece 4{*ICON_SHANK_01*}. + +Se usa junto con un yunque para hechizar armas, herramientas o armaduras. + +Se crea fundiendo menas de cuarzo del mundo inferior. Se le puede dar forma de bloque de cuarzo. + +Se fabrica con lana. Se usa como decoración. + +Esmeralda + +Maceta + +Zanahoria + +Patata + +Patata asada + +Patata venenosa + +Zanahoria dorada + +Palo y zanahoria + +Pastel de zanahoria + +Libro hechizado + +Cuarzo del mundo inferior + +Mena de esmeralda + +Cofre de Ender + +Gancho de cable trampa + +Cable trampa + +Bloque de esmeralda + +Pared de adoquines + +Pared de adoquines musgosa + +Maceta + +Zanahorias + +Patatas + +Yunque + +Yunque + +Yunque ligeramente dañado + +Yunque muy dañado + +Mena de cuarzo del mundo inferior + +Bloque de cuarzo + +Bloque de cuarzo cincelado + +Pilar de cuarzo + +Escaleras de cuarzo + +Alfombra + +Alfombra negra + +Alfombra roja + +Alfombra verde + +Alfombra marrón + +Alfombra azul + +Alfombra púrpura + +Alfombra cian + +Alfombra gris claro + +Alfombra gris + +Alfombra rosa + +Alfombra lima + +Alfombra amarilla + +Alfombra azul claro + +Alfombra magenta + +Alfombra naranja + +Alfombra blanca + +Arenisca cincelada + +Arenisca lisa + +{*PLAYER*} murió intentando herir a {*SOURCE*} + +{*PLAYER*} fue aplastado por un yunque caído. + +{*PLAYER*} fue aplastado por un bloque caído. + +Se ha teleetransportado a {*PLAYER*} a {*DESTINATION*}. + +{*PLAYER*} te ha teletransportado a su posición. + +{*PLAYER*} se ha teletransportado a tu posición. + +Espinas + +Losa de cuarzo + +Ilumina las zonas oscuras como si fuera de día, incluso bajo el agua. + +Vuelve invisibles a los jugadores, animales y monstruos afectados. + +Reparar y nombrar + +Coste del hechizo: %d + +¡Demasiado caro! + +Renombrar + +Tienes: + +Objetos necesarios + +{*VILLAGER_TYPE*} ofrece %s + +Reparar + +Intercambiar + +Teñir collar + + + Esta es la interfaz del yunque, en la que podrás renombrar, reparar y aplicar hechizos a armas, armaduras o herramientas a cambio de niveles de experiencia. + + + + {*B*} + Pulsa {*CONTROLLER_VK_A*} para obtener más información sobre la interfaz del yunque.{*B*} + Pulsa {*CONTROLLER_VK_B*} si ya sabes cómo funciona la interfaz del yunque. + + + + Para empezar a trabajar sobre un objeto, colócalo en el primer espacio. + + + + Cuando coloques la materia prima correcta en el segundo espacio (p. ej., lingotes de hierro para una espada de hierro dañada), la reparación sugerida aparecerá en el espacio de salida. + + + + También puedes colocar un segundo objeto idéntico en el segundo espacio para combinar ambos objetos. + + + + Para hechizar los objetos sobre el yunque, coloca un libro hechizado en el segundo espacio. + + + + El número de niveles de experiencia que costará el trabajo se muestra bajo el espacio de salida. Si no tienes suficientes niveles de experiencia, no podrás completar la reparación. + + + + Puedes renombrar un objeto editando el nombre que aparece en el cuadro de texto. + + + + Recoger el objeto reparado consumirá los dos objetos utilizados por el yunque y reducirá tu nivel de experiencia en la cantidad establecida. + + + + Esta zona contiene un yunque y un cofre con las herramientas y armas necesarias para trabajar. + + + + {*B*} + Pulsa{*CONTROLLER_VK_A*} para obtener más información sobre el yunque.{*B*} + Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo utilizar el yunque. + + + + El yunque te permite reparar armas y herramientas para hacerlas más duraderas, así como renombrarlas o hechizarlas mediante libros hechizados. + + + + Los libros hechizados se encuentran dentro de los cofres en las mazmorras y también en forma de libros normales que han sido hechizados en la mesa de hechizos. + + + + El uso del yunque consume niveles de experiencia y puede provocar daños al mismo. + + + + El tipo de trabajo, el valor del objeto, el número de hechizos y la cantidad de trabajo realizado previamente afectan al coste de la reparación. + + + + Renombrar un objeto modifica su nombre para todos los jugadores y reduce de forma permanente el coste del trabajo previo. + + + + En el cofre de esta zona encontrarás picos dañados, materias primas, botellas de hechizos y libros hechizados con los que experimentar. + + + + Esta es la interfaz de comercio, que muestra los intercambios comerciales que puedes realizar con un aldeano. + + + + {*B*} + Pulsa {*CONTROLLER_VK_A*} para obtener más información sobre la interfaz de comercio.{*B*} + Pulsa {*CONTROLLER_VK_B*} si ya sabes cómo funciona la interfaz de comercio. + + + + En la parte superior se muestran los intercambios comerciales que el aldeano está dispuesto a hacer en este momento. + + + + Los intercambios comerciales aparecerán en rojo y no estarán disponibles si no tienes los objetos requeridos. + + + + La cantidad y la clase de objetos que le das al aldeano se muestran en dos cuadros a la izquierda. + + + + La cantidad total de objetos necesarios para el intercambio se muestra en los dos cuadros de la izquierda. + + + + Pulsa {*CONTROLLER_VK_A*} para intercambiar los objetos que demanda el aldeano por el objeto que ofrece. + + + + En esta zona hay un aldeano y un cofre que contiene papel para comprar objetos. + + + + {*B*} + Pulsa {*CONTROLLER_VK_A*} para obtener más información sobre el comercio.{*B*} + Pulsa {*CONTROLLER_VK_B*} si ya sabes cómo se comercia. + + + + Los jugadores pueden intercambiar objetos de su inventario con los aldeanos. + + + + Los objetos que los aldeanos pueden ofrecer dependen de su profesión. + + + + La realización de diferentes intercambios hará que los objetos disponibles del aldeano aumenten o se actualicen al azar. + + + + Los intercambios realizados con más frecuencia pueden deshabilitarse de forma temporal, aunque los aldeanos siempre ofrecerán como mínimo un objeto. + + + + Coge un papel del cofre e intenta comerciar con este aldeano. + + + + Esta zona contiene dos cofres de Ender. + + + + {*B*} + Pulsa {*CONTROLLER_VK_A*} para obtener más información sobre los cofres de Ender.{*B*} + Pulsa {*CONTROLLER_VK_B*} si ya sabes cómo utilizar los cofres de Ender. + + + + Todos los cofres de Ender están vinculados, incluso los de dimensiones diferentes. Los objetos colocados en un cofre de Ender estarán disponibles en cualquier otro cofre del mismo tipo. + + + + No obstante, el contenido de los cofres de Ender es diferente para cada jugador. + + + + Esto permite a los jugadores almacenar objetos en cualquier cofre de Ender y recuperarlos en otros cofres repartidos por el mundo. Para comprobarlo, coloca objetos en cualquiera de los cofres de Ender. + + +Restablece 2{*ICON_SHANK_01*}, regenera la salud durante 30 segundos y concede resistencia al fuego y al daño durante 5 minutos. Creada con una manzana y bloques de oro. + +Puede teletransportarse. + +Teletransportarse + +Teletransportar hacia el jugador + +Teletransportar hacia mí + +Puede desactivar la extenuación. + +Puede volverse invisible. + +Ahora puedes activar la invisibilidad. + +Ya no puedes activar la invisibilidad. + +Ahora puedes volar. + +Ya no puedes volar. + +Ahora puedes desactivar la extenuación. + +Ya no puedes desactivar la extenuación. + +Ahora puedes teletransportarte. + +Ya no puedes teletransportarte. + +{*T3*}CÓMO SE JUEGA: YUNQUE{*ETW*}{*B*}{*B*} +Los niveles de experiencia se pueden usar para reparar, hechizar o renombrar objetos mediante el yunque.{*B*} +Todos los objetos pueden ser renombrados, aunque solo los duraderos pueden ser reparados o hechizados mediante libros de hechizos.{*B*} +Para reparar un objeto, colócalo en uno de los espacios a la izquierda junto con algunas materias primas del mismo, como por ejemplo lingotes de hierro para la espada de hierro, o combinados con otro objeto del mismo tipo.{*B*} +La combinación de objetos resulta más eficaz cuando se lleva a cabo con un yunque. Además, si alguno de los objetos estaba bajo un hechizo, el producto resultante incluirá hechizos pertenecientes a cualquiera de los espacios.{*B*} +Para aplicar hechizos de los libros a los objetos, combina los libros en un yunque si el hechizo del libro es el adecuado. Los libros hechizados se encuentran en los cofres dentro de las mazmorras y también en forma de libros normales que han sido hechizados en la mesa de hechizos.{*B*} +Los yunques pueden sufrir daños después de cada uso. También pueden destruirse si se abusa de ellos.{*B*} + + +{*T3*}CÓMO SE JUEGA: COMERCIAR{*ETW*}{*B*}{*B*} +Es posible intercambiar objetos con los aldeanos. Cada aldeano tiene una profesión (granjero, carnicero, herrero, bibliotecario o sacerdote) y esta afecta al tipo de objetos con los que comercian.{*B*} +El menú de comercio contiene una lista de todos los objetos que cada aldeano ofrece. Los aldeanos pueden modificar o ampliar sus intercambios comerciales cada vez que comercian con un jugador, aunque los intercambios comerciales se pueden deshabilitar de forma temporal si se abusa de ellos.{*B*} +Los intercambios suelen consistir en la compra o venta de una serie de objetos a cambio de esmeraldas.{*B*} +Si no posees los objetos necesarios para realizar el intercambio, los objetos aparecerán en rojo.{*B*} + + +{*T3*}CÓMO SE JUEGA: COFRE DE ENDER {*ETW*}{*B*}{*B*} +Todos los cofres de Ender de un mundo están vinculados, y los objetos que contiene cada uno están disponibles en el resto de cofres. No obstante, el contenido de cada cofre de Ender varía para cada jugador, lo que permite almacenar objetos en cualquiera de ellos y recuperarlos en otro cofre de Ender situado en una parte distinta del mundo. + + +Granjero + +Bibliotecario + +Sacerdote + +Herrero + +Carnicero + +Los objetos que los habitantes de las aldeas venden al jugador varían en función de sus profesiones. + +Cofre grande + + + La mesa de hechizos también te permite crear libros hechizados, que podrás usar más adelante en un yunque para aplicar sus hechizos a un objeto. + + + + Los ganchos de cables trampa también proporcionarán energía constantemente a un circuito mientras algo active la cuerda que los une. + + + + Una vez domesticados, los lobos siempre llevarán un collar. Tíñelo para cambiarlo de color. + + +Planta zanahorias o patatas y coséchalas cuando empiecen a brotar del suelo. + + + Además, los jugadores pueden ensillar a los cerdos y montar sobre ellos. Para controlarlos, utiliza un palo y una zanahoria. + + + + En caso de necesidad, puedes mover tu vagoneta usando {*CONTROLLER_ACTION_MOVE*}. Esta acción hará que la vagoneta empiece a moverse por un raíl propulsado. + + +No puedes unirte a esta partida porque la pantalla dividida solo se admite en el modo de alta definición. Cierra la sesión del resto de jugadores para unirte. + +Curar + +Xbox 360 + +Atrás + +Esta opción deshabilita los logros y las actualizaciones del marcador de este mundo cuando se juega y si se vuelve a cargar después de guardarlo con esta opción activada. + +Subir partida guardada para Xbox One + +Subir datos guardados + +En el área de transferencia de datos solo se pueden almacenar los datos guardados de una Consola Xbox 360. Asegúrate de haber descargado los datos guardados de tu Consola Xbox One antes de cargar los de la Consola Xbox 360. + +Cargando... + +¡Carga completada! + +Error al cargar. Inténtalo más tarde. + + diff --git a/Minecraft.Client/Common/Media/font/CHT/DFHeiMedium-B5.ttf b/Minecraft.Client/Common/Media/font/CHT/DFHeiMedium-B5.ttf new file mode 100644 index 00000000..f9fb4894 Binary files /dev/null and b/Minecraft.Client/Common/Media/font/CHT/DFHeiMedium-B5.ttf differ diff --git a/Minecraft.Client/Common/Media/font/CHT/DFTT_R5.TTC b/Minecraft.Client/Common/Media/font/CHT/DFTT_R5.TTC new file mode 100644 index 00000000..34839685 Binary files /dev/null and b/Minecraft.Client/Common/Media/font/CHT/DFTT_R5.TTC differ diff --git a/Minecraft.Client/Common/Media/font/JPN/DF-DotDotGothic16.ttf b/Minecraft.Client/Common/Media/font/JPN/DF-DotDotGothic16.ttf new file mode 100644 index 00000000..1be2b4b3 Binary files /dev/null and b/Minecraft.Client/Common/Media/font/JPN/DF-DotDotGothic16.ttf differ diff --git a/Minecraft.Client/Common/Media/font/JPN/DFGMaruGothic-Md.ttf b/Minecraft.Client/Common/Media/font/JPN/DFGMaruGothic-Md.ttf new file mode 100644 index 00000000..4eb4eef7 Binary files /dev/null and b/Minecraft.Client/Common/Media/font/JPN/DFGMaruGothic-Md.ttf differ diff --git a/Minecraft.Client/Common/Media/font/KOR/BOKMSD.ttf b/Minecraft.Client/Common/Media/font/KOR/BOKMSD.ttf new file mode 100644 index 00000000..83fe8699 Binary files /dev/null and b/Minecraft.Client/Common/Media/font/KOR/BOKMSD.ttf differ diff --git a/Minecraft.Client/Common/Media/font/KOR/candadite2.ttf b/Minecraft.Client/Common/Media/font/KOR/candadite2.ttf new file mode 100644 index 00000000..f2ba094f Binary files /dev/null and b/Minecraft.Client/Common/Media/font/KOR/candadite2.ttf differ diff --git a/Minecraft.Client/Common/Media/font/Mojang Font_11.ttf b/Minecraft.Client/Common/Media/font/Mojang Font_11.ttf new file mode 100644 index 00000000..969cee58 Binary files /dev/null and b/Minecraft.Client/Common/Media/font/Mojang Font_11.ttf differ diff --git a/Minecraft.Client/Common/Media/font/Mojang Font_7.ttf b/Minecraft.Client/Common/Media/font/Mojang Font_7.ttf new file mode 100644 index 00000000..727c5fb6 Binary files /dev/null and b/Minecraft.Client/Common/Media/font/Mojang Font_7.ttf differ diff --git a/Minecraft.Client/Common/Media/font/Mojangles.ttf b/Minecraft.Client/Common/Media/font/Mojangles.ttf new file mode 100644 index 00000000..e7b87e9f Binary files /dev/null and b/Minecraft.Client/Common/Media/font/Mojangles.ttf differ diff --git a/Minecraft.Client/Common/Media/font/Mojangles_11.abc b/Minecraft.Client/Common/Media/font/Mojangles_11.abc new file mode 100644 index 00000000..016fdf99 Binary files /dev/null and b/Minecraft.Client/Common/Media/font/Mojangles_11.abc differ diff --git a/Minecraft.Client/Common/Media/font/Mojangles_7.abc b/Minecraft.Client/Common/Media/font/Mojangles_7.abc new file mode 100644 index 00000000..6ce06673 Binary files /dev/null and b/Minecraft.Client/Common/Media/font/Mojangles_7.abc differ diff --git a/Minecraft.Client/Common/Media/font/RU/SpaceMace.ttf b/Minecraft.Client/Common/Media/font/RU/SpaceMace.ttf new file mode 100644 index 00000000..70cd3f7d Binary files /dev/null and b/Minecraft.Client/Common/Media/font/RU/SpaceMace.ttf differ diff --git a/Minecraft.Client/Common/Media/font/chars.txt b/Minecraft.Client/Common/Media/font/chars.txt new file mode 100644 index 00000000..f7ba12ae Binary files /dev/null and b/Minecraft.Client/Common/Media/font/chars.txt differ diff --git a/Minecraft.Client/Common/Media/fr-FR/4J_strings.resx b/Minecraft.Client/Common/Media/fr-FR/4J_strings.resx new file mode 100644 index 00000000..9ae2bb13 --- /dev/null +++ b/Minecraft.Client/Common/Media/fr-FR/4J_strings.resx @@ -0,0 +1,108 @@ + +Inutilisé + +O.K. + +Retour + +Annuler + +Oui + +Non + +Sauvegarde endommagée + +Vos données de sauvegarde semblent endommagées. Créer une nouvelle sauvegarde et écraser le fichier endommagé ? + +Espace libre insuffisant + +Le périphérique de stockage sélectionné ne dispose pas de suffisamment d'espace libre pour créer une sauvegarde. + +Resélectionner + +Jouer sans sauvegarder + +Créer une sauvegarde + +Écraser la sauvegarde ? + +Le périphérique de stockage sélectionné contient déjà une sauvegarde. L'écraser ? + +Non, ne pas écraser + +Écraser et sauvegarder + +Échec de la sauvegarde + +Problème de périph. de stockage + +Votre périphérique de stockage n'est pas disponible ou présente une erreur. + +Votre périphérique de stockage est inaccessible ou présente une erreur. Veuillez sélectionner un autre périphérique de stockage. + +Sélectionner autre périphérique + +Aucun périph. sélectionné + +Si vous ne sélectionnez pas de périphérique de stockage, la fonction de sauvegarde sera désactivée. + +Sélectionner un périphérique + +Continuer sans sauvegarder + +Votre périphérique de stockage a été retiré. Sélectionnez-en un autre. + +Échec du chargement + +Nommer la sauvegarde + +Saisir un nom pour la sauvegarde + +Retour à l'Interface Xbox + +Voulez-vous vraiment quitter le jeu ? + +Déconnexion + +Votre profil de joueur a été déconnecté : retour à l'écran titre + +Un profil de joueur s'est déconnecté : partie interrompue + +Continuer à jouer + +Profil de joueur hors ligne + +Ce jeu intègre des fonctionnalités qui nécessitent un profil de joueur autorisé sur Xbox Live, mais vous êtes actuellement hors ligne. + +Cette fonctionnalité nécessite un profil de joueur connecté à Xbox Live. + +Connexion à Xbox Live + +Continuer à jouer hors ligne + +Problème d'attribution de succès + + Un problème est survenu lors de l'accès à votre profil du joueur. Votre succès n'a pas pu être attribué. + +Problème de profil du joueur + +La sauvegarde des paramètres sur le profil du joueur a échoué. + +Profil du joueur invité + +Le profil du joueur invité ne peut pas accéder à cette fonctionnalité. Veuillez utiliser un autre profil de joueur. + +Sauvegarde... + +Enregistrement en cours. N'éteignez pas votre console. + +Déverrouiller le jeu complet + +Vous jouez à la version d'évaluation de Minecraft. Si vous possédiez le jeu complet, vous auriez déjà remporté un succès ! +Déverrouillez le jeu complet pour profiter au mieux de Minecraft et jouer avec vos amis partout dans le monde via Xbox Live. +Voulez-vous déverrouiller le jeu complet ? + +Un problème s'est produit lors de la lecture de votre profil : retour au menu principal. + + diff --git a/Minecraft.Client/Common/Media/fr-FR/strings.resx b/Minecraft.Client/Common/Media/fr-FR/strings.resx new file mode 100644 index 00000000..788799ff --- /dev/null +++ b/Minecraft.Client/Common/Media/fr-FR/strings.resx @@ -0,0 +1,4467 @@ + +Un nouveau contenu téléchargeable est disponible ! Pour y accéder, utilisez le bouton Magasin Minecraft dans le menu principal. + +Changez l'apparence de votre personnage avec un pack de skins depuis le Magasin Minecraft. Sélectionnez-le dans le menu principal pour voir ce qui est disponible. + +Si vous jouez en mode Haute définition, votre partie peut accueillir jusqu'à quatre joueurs sur écran partagé, le tout sur une seule console ! + +Connectez des manettes supplémentaires à votre console et appuyez sur START pour rejoindre une partie à tout moment. + +Modifie les paramètres de gamma pour augmenter/réduire la luminosité de l'écran. + +Si vous avez réglé la difficulté du jeu sur Pacifique, votre santé se régénérera automatiquement, et aucun monstre ne sera de sortie à la nuit tombée ! + +Donnez un os à un loup pour l'amadouer. Ensuite, donnez-lui l'ordre de s'asseoir ou de vous suivre. + +Depuis l'inventaire, déplacez le curseur à l'extérieur de la fenêtre d'inventaire et appuyez sur{*CONTROLLER_VK_A*} pour vous séparer d'un objet. + +À la nuit tombée, dormir dans un lit accélère le défilement du temps jusqu'au matin suivant. En mode multijoueur, tous les joueurs doivent dormir dans leur lit en même temps. + +Prélevez de la viande de porc sur les cochons puis cuisinez-la. Mangez-la pour récupérer de la santé. + +Prélevez du cuir sur les vaches et utilisez-le pour confectionner des armures. + +Si vous avez un seau vide, remplissez-le de lait, d'eau ou de lave ! + +Utilisez une houe pour préparer des terres arables à la culture. + +Les araignées ne vous attaqueront pas de jour, sauf pour se défendre. + +Creuser le sol ou le sable avec une pelle, c'est plus rapide qu'à mains nues ! + +Préférez la viande de porc cuite à la viande crue ; vous récupérerez plus de santé. + +Fabriquez des torches pour vous éclairer la nuit. Les monstres se tiendront à l'écart des zones éclairées. + +Rendez-vous plus rapidement à bon port dans un chariot de mine propulsé sur des rails ! + +Plantez de jeunes pousses et elles produiront des arbres. + +Les hommes-cochons ne s'en prendront pas à vous, sauf si vous les attaquez. + +Dormez dans un lit pour changer votre point d'apparition dans le jeu et accélérer le temps jusqu'à l'aube. + +Retournez ces boules de feu à l'envoyeur ! + +Construire un portail vous permettra de voyager jusqu'à une autre dimension : le Nether. + +Appuyez sur{*CONTROLLER_VK_B*} pour lâcher l'objet que vous tenez en main ! + +Utilisez un outil adapté à la tâche ! + +Si vous ne trouvez pas de charbon pour embraser vos torches, vous pouvez toujours placer du bois dans le four pour obtenir du charbon de bois. + +Creuser juste sous vos pieds, ou au-dessus de vous, c'est rarement très judicieux. + +La poudre d'os (obtenue depuis un os de squelette) peut servir d'engrais : vos cultures arrivent instantanément à maturité ! + +Les creepers explosent au contact ! + +Au contact de l'eau, une source de lave produit de l'obsidienne. + +La lave peut mettre plusieurs minutes à disparaître TOTALEMENT lorsque le bloc source est détruit. + +La pierre taillée résiste aux boules de feu des ghasts et convient donc très bien à la protection des portails. + +Les blocs susceptibles d'émettre de la lumière (torches, glowstone et citrouilles-lanternes, entre autres) peuvent fondre la neige et la glace. + +Si vous bâtissez des structures de laine à l'air libre, méfiez-vous : les éclairs peuvent y mettre le feu. + +Un seul seau de lave suffit à fondre 100 blocs dans un four. + +L'instrument joué par un bloc musical dépend du matériau sur lequel il est posé. + +Les zombies et squelettes peuvent survivre à la lumière du jour s'ils sont dans l'eau. + +Si vous attaquez un loup, tous les loups à proximité immédiate deviendront aussitôt agressifs ; une propriété qu'ils partagent avec les cochons zombies. + +Les loups ne peuvent pas entrer dans le Nether. + +Les loups n'attaquent pas les creepers. + +Les poules pondent un Å“uf toutes les 5 à 10 minutes. + +L'obsidienne ne peut se miner qu'à l'aide d'une pioche en diamant. + +Les creepers sont la source de poudre à canon la plus facilement exploitable. + +Deux coffres placés côte à côte formeront un grand coffre. + +La santé des loups apprivoisés est illustrée par la position de leur queue. Donnez-leur de la viande pour les soigner. + +Passez du cactus au four pour obtenir du colorant vert. + +Suivez 4J Studios et Kappische sur Twitter pour rester au courant des dernières actus du jeu ! + +Depuis le menu Pause, publiez les captures d'écran de vos créations Minecraft sur Facebook et impressionnez vos amis ! + +Reportez-vous à la rubrique Nouveautés des menus Comment jouer pour consulter les dernières notes de mise à jour du jeu. + +Les barrières superposables sont désormais disponibles dans le jeu ! + +minecraftforum consacre toute une section à l'édition Xbox 360. + +Certains animaux vous suivrons si vous tenez du blé dans votre main. + +Si un animal ne peut se déplacer de plus de 20 blocs dans chaque direction, il ne disparaîtra pas. + +Musique par C418 ! + +Notch a plus d'un million d'abonnés sur Twitter ! + +Les Suédois ne sont pas tous blonds. Certains sont même roux, comme Jens de Mojang ! + +Il paraîtrait que 4J Studios a supprimé Herobrine du jeu sur console Xbox 360, mais rien n'est moins sûr. + +Une mise à jour du jeu sera déployée un jour ou l'autre ! + +Qui c'est, Notch ? + +Mojang a reçu plus de récompenses qu'il n'a d'employés ! + +De vraies célébrités jouent à Minecraft ! + +deadmau5 aime Minecraft ! + +Ne regardez pas les bugs dans les yeux. + +Les creepers sont nés d'un bug d'encodage. + +C'est une poule ou un canard ? + +Vous étiez à la Minecon ? + +Personne de chez Mojang n'a jamais vu le visage de junkboy. + +Vous saviez qu'il existait un Wiki Minecraft ? + +Le nouveau bureau de Mojang, il déchire ! + +Minecraft: Xbox 360 Edition a battu (presque) tous les records ! + +La Minecon 2013 s'est déroulée à Orlando, Floride, États-Unis ! + +La .party() était réussie ! + +N'oubliez pas : les rumeurs tiennent plus de l'invention que de la réalité ! + +{*T3*}COMMENT JOUER : PRINCIPES{*ETW*}{*B*}{*B*} +Le principe de Minecraft consiste à placer des blocs pour construire tout ce qu'on peut imaginer. La nuit, les monstres sont de sortie ; tâchez donc d'aménager un abri avant le coucher du soleil.{*B*}{*B*} +Utilisez{*CONTROLLER_ACTION_LOOK*} pour regarder autour de vous.{*B*}{*B*} +Utilisez{*CONTROLLER_ACTION_MOVE*} pour vous déplacer.{*B*}{*B*} +Appuyez sur{*CONTROLLER_ACTION_JUMP*} pour sauter.{*B*}{*B*} +Orientez{*CONTROLLER_ACTION_MOVE*} deux fois vers l'avant pour sprinter. Tant que vous maintenez {*CONTROLLER_ACTION_MOVE*} vers l'avant, le personnage continuera de sprinter jusqu'à ce que sa durée de sprint soit écoulée ou que sa jauge de nourriture compte moins de{*ICON_SHANK_03*}.{*B*}{*B*} +Maintenez{*CONTROLLER_ACTION_ACTION*} pour miner ou frapper à mains nues ou à l'aide d'un ustensile. Vous devrez parfois façonner des outils pour miner certains blocs.{*B*}{*B*} +Si vous tenez un objet à la main, utilisez{*CONTROLLER_ACTION_USE*} pour vous en servir, ou appuyez sur{*CONTROLLER_ACTION_DROP*} pour vous en débarrasser. + +{*T3*}COMMENT JOUER : INTERFACE PRINCIPALE{*ETW*}{*B*}{*B*} +L'interface principale affiche diverses informations, comme votre état, votre santé, l'oxygène qu'il vous reste quand vous nagez sous l'eau, votre niveau de satiété (vous devez manger pour remplir cette jauge) et votre armure, si vous en portez une. Si vous perdez de la santé, mais que votre jauge de nourriture comporte au moins 9{*ICON_SHANK_01*}, votre santé se reconstituera automatiquement. Manger de la nourriture reconstituera votre jauge de nourriture.{*B*} +L'interface principale affiche également la barre d'expérience, assortie d'une valeur numérique qui représente votre niveau d'expérience, ainsi qu'une jauge indiquant combien de points d'expérience sont nécessaires pour passer au niveau supérieur. Pour obtenir de l'expérience, ramassez les orbes d'expérience abandonnés par les monstres à leur mort, minez certains types de blocs, élevez des animaux, pêchez et fondez du minerai dans le four.{*B*}{*B*} +Les objets utilisables sont également répertoriés ici. Utilisez{*CONTROLLER_ACTION_LEFT_SCROLL*} et{*CONTROLLER_ACTION_RIGHT_SCROLL*} pour sélectionner un autre objet à tenir en main. + +{*T3*}COMMENT JOUER : INVENTAIRE{*ETW*}{*B*}{*B*} +Utilisez{*CONTROLLER_ACTION_INVENTORY*} pour consulter votre inventaire.{*B*}{*B*} +Cet écran affiche les objets susceptibles d'être tenus en main ainsi que tous les autres objets que vous portez, armure comprise.{*B*}{*B*} +Utilisez{*CONTROLLER_MENU_NAVIGATE*} pour déplacer le curseur. Utilisez{*CONTROLLER_VK_A*} pour saisir l'objet placé sous le curseur. S'il s'agit de plusieurs objets, vous sélectionnerez toute la pile. Vous pouvez aussi utiliser{*CONTROLLER_VK_X*} pour n'en sélectionner que la moitié.{*B*}{*B*} +Déplacez l'objet annexé au curseur jusqu'à un autre emplacement de l'inventaire et déposez-le avec{*CONTROLLER_VK_A*}. Si plusieurs objets sont annexés au curseur, utilisez{*CONTROLLER_VK_A*} pour tous les déposer, ou{*CONTROLLER_VK_X*} pour n'en déposer qu'un seul.{*B*}{*B*} +Si l'objet pointé est une armure, une infobulle s'affichera pour l'affecter rapidement à l'emplacement d'armure correspondant de votre inventaire. +{*B*}{*B*} +Vous pouvez modifier la couleur de votre armure en cuir en utilisant un colorant. Pour cela, sélectionnez le colorant dans votre inventaire et maintenez le curseur puis appuyez sur{*CONTROLLER_VK_X*} lorsque le curseur est sur la pièce à teindre. + + +{*T3*}COMMENT JOUER : COFFRE{*ETW*}{*B*}{*B*} +Dès que vous aurez fabriqué un coffre, vous pourrez le placer dans votre environnement puis l'utiliser avec{*CONTROLLER_ACTION_USE*} pour entreposer des objets de votre inventaire.{*B*}{*B*} +Utilisez le pointeur pour déplacer des objets entre votre coffre et votre inventaire.{*B*}{*B*} +Les objets remisés dans le coffre peuvent ensuite être réintégrés à l'inventaire. + + +{*T3*}COMMENT JOUER : GRAND COFFRE{*ETW*}{*B*}{*B*} +Deux coffres placés côte à côte se combineront pour former un grand coffre où vous pourrez entreposer toujours plus d'objets.{*B*}{*B*} +Son mode d'utilisation est identique à celui du coffre de base. + + +{*T3*}COMMENT JOUER : ARTISANAT{*ETW*}{*B*}{*B*} +Depuis l'interface d'artisanat, vous pouvez combiner divers objets de votre inventaire pour en créer de nouveaux. Utilisez{*CONTROLLER_ACTION_CRAFTING*} pour afficher l'interface d'artisanat.{*B*}{*B*} +Parcourez les onglets, en haut, à l'aide de{*CONTROLLER_VK_LB*} et{*CONTROLLER_VK_RB*} pour sélectionner la catégorie d'objets que vous souhaitez confectionner, puis utilisez{*CONTROLLER_MENU_NAVIGATE*} pour choisir l'article à créer.{*B*}{*B*} +La grille d'artisanat indique quels objets sont nécessaires à la production du nouvel article. Appuyez sur{*CONTROLLER_VK_A*} pour confectionner l'objet et le placer dans votre inventaire. + + +{*T3*}COMMENT JOUER : ATELIER{*ETW*}{*B*}{*B*} +Vous pouvez utiliser un atelier pour confectionner des objets plus grands.{*B*}{*B*} +Placez l'atelier dans votre environnement et appuyez sur{*CONTROLLER_ACTION_USE*} pour l'utiliser.{*B*}{*B*} +L'artisanat sur atelier fonctionne de la même manière que l'artisanat classique, mais vous disposez d'une grille d'artisanat plus étendue et d'un éventail plus riche d'objets à créer. + + +{*T3*}COMMENT JOUER : FOUR{*ETW*}{*B*}{*B*} +Un four vous permet de fondre des objets pour les modifier. Par exemple, vous pouvez y déposer du minerai de fer pour fondre des lingots de fer.{*B*}{*B*} +Placez le four dans votre environnement et appuyez sur{*CONTROLLER_ACTION_USE*} pour l'utiliser.{*B*}{*B*} +Vous devrez alimenter le four avec du combustible, en bas, et déposer l'objet à fondre en haut. Le four s'actionnera alors.{*B*}{*B*} +Une fois les objets fondus, vous pouvez les déplacer depuis la zone de production jusqu'à votre inventaire.{*B*}{*B*} +Si l'objet pointé est un ingrédient ou du combustible pour le four, une infobulle s'affichera pour transférer l'objet dans le four. + + +{*T3*}COMMENT JOUER : DISTRIBUTEUR{*ETW*}{*B*}{*B*} +Un distributeur sert à... distribuer des objets. Pour l'actionner, vous devrez placer un interrupteur ou levier à proximité.{*B*}{*B*} +Pour remplir d'objets le distributeur, appuyez sur{*CONTROLLER_ACTION_USE*}, puis placez-y les articles de votre inventaire que vous souhaitez distribuer.{*B*}{*B*} +Le distributeur crachera un objet dès que vous actionnerez l'interrupteur dédié. + + +{*T3*}COMMENT JOUER : ALCHIMIE{*ETW*}{*B*}{*B*} +La concoction de potions nécessite un alambic, à construire dans un atelier. Toutes les potions ont pour base une fiole d'eau, qu'on obtient en remplissant une fiole avec de l'eau tirée d'un chaudron ou d'une source d'eau.{*B*} +Un alambic peut accueillir jusqu'à trois fioles ; vous pouvez donc distiller jusqu'à trois potions à la fois. Un même ingrédient peut servir aux trois fioles. Pensez à toujours distiller trois potions à la fois pour optimiser vos ressources.{*B*} +Placer un ingrédient de potion dans l'emplacement du haut de l'alambic produira une potion de base au bout de quelques instants. Celle-ci n'a aucun effet, mais si vous distillez un autre ingrédient avec cette fiole de base, vous produirez une potion avec un principe actif.{*B*} +Ajoutez alors un troisième ingrédient pour allonger la durée d'effet de la potion (à l'aide de poudre de redstone), renforcer son intensité (à l'aide de poudre de glowstone) ou bien en faire une potion offensive (à l'aide d'un Å“il d'araignée fermenté).{*B*} +Vous pouvez aussi y incorporer de la poudre à canon pour en faire une potion volatile que vous pouvez lancer. Une fois lancées, les potions volatiles appliquent leurs effets à la zone d'impact.{*B*} + +Les matières premières pour les potions sont :{*B*}{*B*} +* {*T2*}Verrue du Nether{*ETW*}{*B*} +* {*T2*}Å’il d'araignée{*ETW*}{*B*} +* {*T2*}Sucre{*ETW*}{*B*} +* {*T2*}Larme de Ghast{*ETW*}{*B*} +* {*T2*}Poudre de feu{*ETW*}{*B*} +* {*T2*}Crème de magma{*ETW*}{*B*} +* {*T2*}Pastèque scintillante{*ETW*}{*B*} +* {*T2*}Poudre de redstone{*ETW*}{*B*} +* {*T2*}Poudre de glowstone{*ETW*}{*B*} +* {*T2*}Å’il d'araignée fermenté{*ETW*}{*B*}{*B*} + +Vous devrez essayer diverses combinaisons d'ingrédients pour découvrir toutes les recettes de potions à concocter. + + +{*T3*}COMMENT JOUER : ENCHANTEMENT{*ETW*}{*B*}{*B*} +Les points d'expérience obtenus à la mort d'un monstre, ou lorsque certains blocs sont minés ou fondus dans un four, peuvent servir à enchanter les outils, armes, armures et livres.{*B*} +Lorsqu'une épée, une hache, une pioche, une pelle, une armure ou un livre est placé dans l'emplacement situé sous le livre de la table d'enchantement, les trois boutons à sa droite afficheront certains enchantements ainsi que leur coût en niveaux d'expérience.{*B*} +Si vous n'avez pas assez de niveaux d'expérience pour utiliser certains d'entre eux, le coût apparaîtra en rouge ; sinon, en vert.{*B*}{*B*} +L'enchantement appliqué par défaut est choisi aléatoirement d'après le coût affiché.{*B*}{*B*} +Si la table d'enchantement est entourée de bibliothèques (jusqu'à 15) avec un intervalle d'un bloc entre la table et la bibliothèque, la puissance des enchantements sera renforcée et des glyphes arcaniques apparaîtront, projetés par le livre sur la table d'enchantement.{*B*}{*B*} +Tous les ingrédients nécessaires à une table d'enchantement peuvent se trouver dans les villages, ou bien en minant et cultivant.{*B*} +Utilisez les livres d'enchantement à l'enclume pour enchanter des objets. Ainsi, vous contrôlez mieux quels enchantements vous désirez utiliser sur vos objets.{*B*} + + +{*T3*}COMMENT JOUER : ANIMAUX DE LA FERME{*ETW*}{*B*}{*B*} +Si vous souhaitez garder vos animaux au même endroit, construisez une zone clôturée de moins de 20x20 blocs pour y parquer vos animaux. Avec la clôture, vous serez sûr de retrouver vos animaux quand vous viendrez les voir. + + +{*T3*}COMMENT JOUER : ÉLEVER DES ANIMAUX{*ETW*}{*B*}{*B*} +Les animaux de Minecraft peuvent se reproduirent et donner naissance à des petits !{*B*} +Pour faire en sorte que les animaux se reproduisent, vous devez leur donner à manger la nourriture appropriée ; ils basculeront alors en mode « Romance ».{*B*} +Donnez du blé aux vaches, Champimeuh et moutons, des carottes aux cochons, des graines de blé ou des verrues du Nether aux poulets et n'importe quelle variété de viande aux loups : ils se mettront alors en chasse d'un autre animal de leur espèce, lui aussi disposé à se reproduire.{*B*} +Lorsque deux animaux d'une même espèce se rencontrent, et pourvu qu'ils soient tous les deux en mode Romance, ils s'embrassent quelques secondes, et un bébé apparaît. Le jeune animal suivra ses parents quelque temps avant de devenir adulte.{*B*} +Une fois qu'un animal est passé en mode Romance, il faut patienter cinq minutes environ pour qu'il soit à nouveau apte.{*B*} +Le nombre d'animaux dans un monde est limité ; il est donc possible que vos animaux ne se reproduisent pas s'ils sont déjà nombreux. + +{*T3*}COMMENT JOUER : PORTAIL DU NETHER{*ETW*}{*B*}{*B*} +Un portail du Nether permet au joueur de circuler entre la Surface et le Nether. Vous pouvez emprunter le Nether pour voyager rapidement à la Surface : parcourir un bloc de distance dans le Nether équivaut à voyager sur trois blocs de la Surface. Lorsque vous empruntez un portail pour quitter le Nether, vous aurez voyagé sur une distance 3 fois supérieure à celle réellement parcourue.{*B*}{*B*} +Vous devrez disposer d'au moins 10 blocs d'obsidienne pour construire le portail : celui-ci doit être haut de 5 blocs et large de 4, pour une épaisseur d'1 bloc. Une fois le contour achevé, l'espace contenu à l'intérieur doit être enflammé pour activer le portail. Pour ce faire, vous pouvez utiliser un briquet à silex ou une boule de feu.{*B*}{*B*} +Des exemples de construction de portail sont illustrés à droite. + + +{*T3*}COMMENT JOUER : MULTIJOUEUR{*ETW*}{*B*}{*B*} +Par défaut, Minecraft sur console Xbox 360 est un jeu multijoueur. Si vous jouez en mode haute définition, vous pouvez raccorder des manettes supplémentaires et appuyer sur START à n'importe quel moment pour que d'autres joueurs rejoignent la partie.{*B*}{*B*} +Lorsque vous démarrez ou rejoignez une partie en ligne, elle apparaîtra à tous les joueurs de votre liste d'amis (à moins que vous n'ayez sélectionné l'option Sur invitation lors de la création de la partie) ; s'ils rejoignent la partie, elle apparaîtra également aux membres de leur propre liste d'amis (si vous avez sélectionné l'option Autoriser les amis d'amis).{*B*} +En cours de partie, vous pouvez appuyer sur la touche BACK pour afficher la liste des joueurs qui figurent dans la partie, consulter leurs cartes du joueur, exclure des joueurs et en inviter d'autres à rejoindre la partie. + + +{*T3*}COMMENT JOUER : PARTAGE DE CAPTURES D'ÉCRAN{*ETW*}{*B*}{*B*} +Pour saisir une capture d'écran de votre partie, affichez le menu Pause et appuyez sur{*CONTROLLER_VK_Y*} pour partager sur Facebook. Vous verrez apparaître une version miniature de votre capture d'écran ; vous pourrez alors modifier le texte associé à votre publication sur Facebook.{*B*}{*B*} +Un mode Caméra est tout spécialement conçu pour saisir ces captures d'écran. Appuyez sur{*CONTROLLER_ACTION_CAMERA*} jusqu'à ce que s'affiche la vue de devant du personnage. Ensuite, appuyez sur{*CONTROLLER_VK_Y*} pour partager.{*B*}{*B*} +Les gamertags ne seront pas affichés sur la capture d'écran. + + +{*T3*}COMMENT JOUER : EXCLUSION DE NIVEAUX{*ETW*}{*B*}{*B*} +Si vous découvrez du contenu inapproprié dans un niveau auquel vous jouez, vous pouvez choisir de l'ajouter à votre liste de niveaux exclus. +Pour ce faire, affichez le menu Pause puis appuyez sur{*CONTROLLER_VK_RB*} pour sélectionner l'option d'exclusion de niveaux. +Si vous tentez de rejoindre ce niveau à l'avenir, un message vous indiquera qu'il figure dans votre liste de niveaux exclus. Vous pourrez alors décider de le supprimer de la liste et d'y accéder, ou bien d'annuler. + +{*T3*}COMMENT JOUER : MODE CRÉATIF{*ETW*}{*B*}{*B*} +L'interface du mode Créatif permet de déplacer dans l'inventaire du joueur n'importe quel objet du jeu sans qu'il soit besoin de le miner ou de le fabriquer. {*B*} +Les objets figurant dans l'inventaire du joueur ne sont pas supprimés lorsqu'ils sont placés ou utilisés dans l'environnement du jeu, ce qui permet au joueur de tout miser sur la construction sans se soucier de collecter des ressources.{*B*} +Si vous créez, chargez ou sauvegardez un monde en mode Créatif, les mises à jour des succès et des classements seront désactivées pour ce monde, même s'il est chargé en mode Survie.{*B*} +Pour voler en mode Créatif, appuyez deux fois rapidement sur {*CONTROLLER_ACTION_JUMP*}. Pour ne plus voler, répétez l'opération. Pour voler plus vite, orientez rapidement{*CONTROLLER_ACTION_MOVE*} deux fois vers l'avant en cours de vol.{*B*} +En mode Vol, maintenez{*CONTROLLER_ACTION_JUMP*} pour monter et{*CONTROLLER_ACTION_SNEAK*} pour descendre, ou bien utilisez{*CONTROLLER_ACTION_DPAD_UP*} pour monter, {*CONTROLLER_ACTION_DPAD_DOWN*} pour descendre, {*B*} +{*CONTROLLER_ACTION_DPAD_LEFT*} pour virer à gauche et {*CONTROLLER_ACTION_DPAD_RIGHT*} pour virer à droite. + +{*T3*}COMMENT JOUER : OPTIONS DU JOUEUR ET DE L'HÔTE{*ETW*}{*B*}{*B*} + +{*T1*}Options du joueur{*ETW*}{*B*} +Lorsque vous chargez ou créez un monde, appuyez sur le bouton Plus d'options pour accéder à un menu où figurent d'autres paramètres de configuration de la partie.{*B*}{*B*} + + {*T2*}Joueur contre joueur{*ETW*}{*B*} + Lorsque cette option est activée, les joueurs peuvent infliger des dégâts aux autres joueurs. Cette option ne s'applique qu'au mode Survie.{*B*}{*B*} + + {*T2*}Joueurs de confiance{*ETW*}{*B*} + Lorsque cette option est désactivée, les joueurs sont limités dans leurs activités. Ils ne peuvent pas miner ou utiliser des objets, placer des blocs ou des interrupteurs, utiliser des conteneurs, attaquer des joueurs ou des animaux. Vous pouvez modifier les options applicables à un joueur donné depuis le menu de jeu.{*B*}{*B*} + + {*T2*}Propagation du feu{*ETW*}{*B*} + Lorsque cette option est activée, le feu peut se propager aux blocs voisins inflammables. Vous pouvez aussi modifier cette option depuis le menu de jeu.{*B*}{*B*} + + {*T2*}Explosion de TNT{*ETW*}{*B*} + Lorsque cette option est activée, le TNT peut exploser lorsqu'il est activé. Vous pouvez aussi modifier cette option depuis le menu de jeu.{*B*}{*B*} + + {*T2*}Privilèges d'hôte{*ETW*}{*B*} + Lorsque cette option est activée, l'hôte peut activer/désactiver sa capacité à voler, désactiver la fatigue et se rendre invisible depuis le menu de jeu. {*DISABLES ACHIEVEMENTS}{*.{*B*}{*B*} + +{*T1*}Options de création de monde{*ETW*}{*B*} +Lorsque vous créez un monde, vous disposez d'options supplémentaires.{*B*}{*B*} + + {*T2*}Génération de structures{*ETW*}{*B*} + Lorsque cette option est activée, les structures comme les villages et les forts apparaîtront dans le monde.{*B*}{*B*} + + {*T2*}Monde superplat{*ETW*}{*B*} + Lorsque cette option est activée, un monde complètement plat apparaîtra à la Surface et dans le Nether.{*B*}{*B*} + + {*T2*}Coffre bonus{*ETW*}{*B*} + Lorsque cette option est activée, un coffre renfermant des objets utiles sera créé à proximité du point d'apparition du joueur.{*B*}{*B*} + + {*T2*}Réinitialiser le Nether{*ETW*}{*B*} + Quand activé, le Nether sera généré de nouveau. Ceci est utile si vous avez une sauvegarde plus ancienne sans forteresse du Nether.{*B*}{*B*} + + {*T1*}Options de jeu{*ETW*}{*B*} + Appuyez sur la touche BACK pour afficher le menu de jeu et accéder à diverses options.{*B*}{*B*} + + {*T2*}Options de l'hôte{*ETW*}{*B*} + Le joueur hôte et les joueurs au statut de modérateur peuvent accéder au menu Options de l'hôte. Depuis ce menu, ils peuvent activer/désactiver la propagation du feu et l'explosion de TNT.{*B*}{*B*} + +{*T1*}Options du joueur{*ETW*}{*B*} +Pour modifier les privilèges d'un joueur, sélectionnez son nom et appuyez sur{*CONTROLLER_VK_A*} pour afficher le menu des privilèges et paramétrer les options suivantes.{*B*}{*B*} + + {*T2*}Peut construire et miner{*ETW*}{*B*} + Uniquement disponible si l'option Joueurs de confiance est désactivée. Lorsque cette option est activée, le joueur peut interagir normalement avec le monde. Sinon, il ne pourra ni placer ni détruire des blocs, ni même interagir avec de nombreux objets et blocs.{*B*}{*B*} + + {*T2*}Peut utiliser les portes et les interrupteurs{*ETW*}{*B*} + Uniquement disponible quand l'option Joueurs de confiance est désactivée. Quand cette option est désactivée, le joueur ne pourra pas utiliser les portes ou les interrupteurs.{*B*}{*B*} + + {*T2*}Peut ouvrir les conteneurs{*ETW*}{*B*} + Uniquement disponible quand l'option Joueurs de confiance est désactivée. Quand cette option est désactivée, le joueur ne pourra pas ouvrir les conteneurs, tels que les coffres.{*B*}{*B*} + + {*T2*}Peut attaquer les joueurs{*ETW*}{*B*} + Uniquement disponible si l'option Joueurs de confiance est désactivée. Cette option désactivée, le joueur ne pourra pas infliger de dégâts aux autres joueurs.{*B*}{*B*} + + {*T2*}Peut attaquer des animaux{*ETW*}{*B*} + Uniquement disponible quand l'option Joueurs de confiance est désactivée. Quand cette option est désactivée, le joueur ne pourra pas infliger des dégâts aux animaux.{*B*}{*B*} + + {*T2*}Modérateur{*ETW*}{*B*} + Lorsque cette option est activée, le joueur peut modifier les privilèges des autres joueurs (à l'exception de l'hôte) si l'option Joueurs de confiance est désactivée, il peut exclure des joueurs et activer ou désactiver la propagation du feu et l'explosion de TNT.{*B*}{*B*} + + {*T2*}Exclure joueur{*ETW*}{*B*} + Pour les joueurs qui ne jouent pas sur la même console {*PLATFORM_NAME*} que le joueur hôte, sélectionner cette option exclura le joueur de la partie, ainsi que tout autre joueur sur sa console {*PLATFORM_NAME*}. Ce joueur ne pourra plus rejoindre la partie jusqu'à son redémarrage.{*B*}{*B*} + +{*T1*}Options du joueur hôte{*ETW*}{*B*} +Si l'option Privilèges d'hôte est activée, le joueur hôte peut modifier certains de ses propres privilèges. Pour modifier les privilèges d'un joueur, sélectionnez son nom et appuyez sur{*CONTROLLER_VK_A*} pour afficher le menu des privilèges et paramétrer les options suivantes.{*B*}{*B*} + + {*T2*}Peut voler{*ETW*}{*B*} + Lorsque cette option est activée, le joueur peut voler. Cette option ne sert qu'en mode Survie, puisque tous les joueurs peuvent voler en mode Créatif.{*B*}{*B*} + + {*T2*}Fatigue désactivée{*ETW*}{*B*} + Cette option ne s'applique qu'au mode Survie. Lorsque cette option est activée, les activités physiques (marcher, courir, sauter, etc.) n'épuisent pas la jauge de nourriture. En revanche, si le joueur est blessé, sa jauge de nourriture se videra progressivement tandis qu'il se remet de ses blessures.{*B*}{*B*} + + {*T2*}Invisible{*ETW*}{*B*} + Lorsque cette option est activée, le joueur est dissimulé au regard des autres joueurs et est invulnérable.{*B*}{*B*} + + {*T2*}Peut se téléporter{*ETW*}{*B*} + Cette option permet au joueur de se déplacer ou déplacer d'autres joueurs instantanément dans le monde. + + +Page suivante + +Page précédente + +Principes + +Interface principale + +Inventaire + +Coffres + +Artisanat + +Four + +Distributeur + +Animaux de la ferme + +Élever des animaux + +Alchimie + +Enchantement + +Portail du Nether + +Multijoueur + +Partage des captures d'écran + +Exclusion de niveaux + +Mode Créatif + +Options de l'hôte et du joueur + +Transactions + +Enclume + +La Fin + +{*T3*}COMMENT JOUER : L'ENDER{*ETW*}{*B*}{*B*} +L'Ender est une autre dimension du jeu, atteinte par un portail de l'Ender actif. Le portail de l'Ender se trouve dans un fort, profondément enfoui sous la Surface.{*B*} +Pour activer le portail de l'Ender, vous devrez placer un Å“il d'Ender dans n'importe quel cadre de portail de l'Ender qui n'en contient pas.{*B*} +Quand le portail est actif, sautez dedans pour vous rendre dans l'Ender.{*B*}{*B*} +Dans l'Ender, vous rencontrerez le dragon de l'Ender, un ennemi féroce et puissant, et de nombreux Enderman. Vous devrez donc être préparé au combat avant de vous y rendre !{*B*}{*B*} +Vous découvrirez qu'il existe des cristaux d'Ender à l'extrémité de huit pics d'obsidienne que le dragon utilise pour se soigner. +La première étape est donc de détruire chacun d'entre eux.{*B*} +Les premiers peuvent être atteints par des flèches, mais les derniers sont protégés par une cage d'acier, et vous devrez les atteindre par étapes.{*B*}{*B*} +Ce faisant, le dragon de l'Ender vous attaquera en volant vers vous et en crachant des boules d'acide de l'Ender !{*B*} +Si vous vous approchez du podium aux Å“ufs au centre des pics, le dragon volera vers vous pour vous attaquer, ce qui vous donnera une bonne occasion de le blesser !{*B*} +Évitez son souffle acide et visez ses yeux pour de meilleurs résultats. Si possible, demandez à des amis de vous suivre dans l'Ender pour vous aider dans votre combat !{*B*}{*B*} +Une fois que vous serez dans l'Ender, vos amis pourront voir l'emplacement du portail de l'Ender dans le fort sur leurs cartes, +et ils pourront facilement vous rejoindre. + + +Sprint + +Nouveautés + + +{*T3*}Modifications et ajouts {*ETW*}{*B*}{*B*} +- Ajout de nouveaux objets : émeraude, minerai d'émeraude, bloc d'émeraude, coffre du Néant, crochet, pomme dorée enchantée, enclume, pot de fleurs, murets, murets moussus, peinture de Wither, pomme de terre, pomme de terre cuite, pomme de terre empoisonnée, carotte, carotte dorée, carotte sur un bâton, +tarte à la citrouille, potion de vision nocturne, potion d'invisibilité, quartz du Nether, minerai de quartz du Nether, bloc de quartz du Nether, dalle de quartz, escalier en quartz, bloc de quartz taillé, pilier de blocs de quartz, livre enchanté, tapis.{*B*} +- Ajout de nouvelles recettes pour le grès lisse et le grès taillé.{*B*} +- Ajout de nouveaux monstres : villageois zombies.{*B*} +- Ajout de nouvelles fonctions de génération de terrain : pyramides, villages du désert, temples de la jungle.{*B*} +- Ajout de transactions avec les villageois.{*B*} +- Ajout d'une interface d'enclume.{*B*} +- Possibilité de teindre les armures en cuir.{*B*} +- Possibilité de teindre les colliers des loups.{*B*} +- Possibilité de contrôler un cochon comme monture à l'aide d'une carotte sur un bâton.{*B*} +- Mise à jour du contenu des coffres bonus, qui contiennent maintenant plus d'objets.{*B*} +- Modification du placement des demi-blocs et autres blocs sur demi-blocs.{*B*} +- Modification du placement des escaliers et dalles à l'envers.{*B*} +- Ajout de différentes professions pour les villageois.{*B*} +- Les villageois générés par un Å“uf d'apparition ont une profession aléatoire.{*B*} +- Ajout d'un placement de tronc oblique.{*B*} +- Les fours peuvent utiliser les outils en bois comme combustible.{*B*} +- Vous pouvez récupérer les vitres en glace et en verre à l'aide d'outils disposant de l'enchantement Délicatesse.{*B*} +- Vous pouvez déclencher les boutons en bois et les plaques de détection en bois à l'aide de flèches.{*B*} +- Les portails à la Surface peuvent générer des monstres du Nether.{*B*} +- Les creepers et les araignées attaquent le dernier joueur qui les a touchés.{*B*} +- En mode Créatif, les monstres redeviennent neutres après un bref laps de temps.{*B*} +- Suppression du recul en cas de noyade.{*B*} +- Les dégâts des portes abîmées par les zombies sont visibles.{*B*} +- La glace fond dans le Nether.{*B*} +- Les chaudrons se remplissent d'eau de pluie.{*B*} +- Les pistons sont deux fois plus longs à mettre à jour.{*B*} +- Le cochon laisse une selle à sa mort (s'il en possède une).{*B*} +- La couleur du ciel de La Fin a changé.{*B*} +- Il est possible de placer un fil de déclenchement relié à un crochet.{*B*} +- La pluie goutte à travers les feuilles.{*B*} +- Il est possible de placer des leviers sur le bas des blocs.{*B*} +- La TNT inflige des dégâts variables selon la difficulté choisie.{*B*} +- La recette des livres a changé.{*B*} +- Ce sont les bateaux qui cassent les nénuphars et non l'inverse.{*B*} +- Les cochons lâchent plus de viande de porc.{*B*} +- Les slimes se reproduisent moins dans les mondes superplats.{*B*} +- Les dégâts des creepers sont variables selon la difficulté choisie. Recul accru.{*B*} +- Correction du bug qui empêchait l'Enderman d'ouvrir les mâchoires.{*B*} +- Ajout d'une téléportation des joueurs (à l'aide du menu {*BACK_BUTTON*} dans le jeu).{*B*} +- Ajout de nouvelles options de l'hôte gérant la lévitation, l'invisibilité et l'invulnérabilité des joueurs distants.{*B*} +- Ajout de nouveaux didacticiels dans le monde didacticiel, correspondant aux nouveaux objets et fonctionnalités.{*B*} +- Mise à jour de l'emplacement des coffres à disques vinyles dans le monde didacticiel.{*B*} + + +{*ETB*}Bienvenue ! Comme vous l'avez peut-être déjà remarqué, votre Minecraft vient de bénéficier d'une nouvelle mise à jour.{*B*}{*B*} +Vous et vos amis pouvez découvrir de nombreuses nouvelles fonctionnalités. Jetez un Å“il à l'aperçu qui suit et allez jouer !{*B*}{*B*} +{*T1*}Nouveaux objets{*ETB*} - Émeraude, minerai d'émeraude, bloc d'émeraude, coffre du Néant, crochet, pomme dorée enchantée, enclume, pot de fleurs, murets, murets moussus, peinture de Wither, pomme de terre, pomme de terre cuite, pomme de terre empoisonnée, carotte, carotte dorée, carotte sur un bâton, +tarte à la citrouille, potion de vision nocturne, potion d'invisibilité, quartz du Nether, minerai de quartz du Nether, bloc de quartz, dalle de quartz, escalier en quartz, bloc de quartz taillé, pilier de blocs de quartz, livre enchanté, tapis.{*B*}{*B*} +{*T1*}Nouveaux monstres{*ETB*} - Villageois zombies.{*B*}{*B*} +{*T1*}Nouvelles fonctionnalités{*ETB*} - Commercez avec les villageois, réparez ou enchantez vos armes et outils à l'aide d'une enclume, stockez des objets dans le coffre du Néant, faites du rodéo sur un cochon avec une carotte sur un bâton !{*B*}{*B*} +{*T1*}Nouveaux mini-didacticiels{*ETB*} – Apprenez à utiliser ces nouvelles fonctionnalités dans le monde didacticiel !{*B*}{*B*} +{*T1*}Nouveaux 'Easter Eggs'{*ETB*} – Nous avons modifié l'emplacement de tous les disques vinyles secrets dans le monde didacticiel. Essayez de les retrouver !{*B*}{*B*} + + +Inflige plus de dégâts qu'à mains nues. + +Sert à pelleter la terre, l'herbe, le sable, le gravier et la neige plus vite qu'à mains nues. Vous devrez posséder une pelle pour creuser les boules de neige. + +Nécessaire pour miner les blocs de pierre et le minerai. + +Sert à travailler les blocs de bois plus vite qu'à mains nues. + +Sert à faucher les blocs de terre et d'herbe pour les préparer à la culture. + +Pour activer les portes en bois, vous devez les actionner, les frapper ou utiliser une redstone. + +Les portes en fer ne peuvent s'ouvrir qu'au moyen d'une redstone, de boutons ou d'interrupteurs. + +NOT USED + +NOT USED + +NOT USED + +NOT USED + +Confère au porteur une armure de 1. + +Confère au porteur une armure de 3. + +Confère au porteur une armure de 2. + +Confère au porteur une armure de 1. + +Confère au porteur une armure de 2. + +Confère au porteur une armure de 5. + +Confère au porteur une armure de 4. + +Confère au porteur une armure de 1. + +Confère au porteur une armure de 2. + +Confère au porteur une armure de 6. + +Confère au porteur une armure de 5. + +Confère au porteur une armure de 2. + +Confère au porteur une armure de 2. + +Confère au porteur une armure de 5. + +Confère au porteur une armure de 3. + +Confère au porteur une armure de 1. + +Confère au porteur une armure de 3. + +Confère au porteur une armure de 8. + +Confère au porteur une armure de 6. + +Confère au porteur une armure de 3. + +Un lingot étincelant qui sert à la confection d'outils. Créé en fondant du minerai dans le four. + +Permet de transformer les lingots, gemmes ou colorants en blocs aménageables. Peut servir de bloc de construction précieux ou d'entrepôt compact pour le minerai. + +Sert à infliger une décharge électrique au joueur, animal ou monstre qui marche dessus. Les plaques de détection en bois se déclenchent également si vous laissez tomber un objet dessus. + +Sert à la création d'escaliers compacts. + +Sert à la création d'escaliers longs. Deux dalles placées l'une sur l'autre formeront une dalle double de taille normale. + +Sert à la création d'escaliers longs. Deux blocs placés l'un sur l'autre créent un bloc double de taille normale. + +Sert à produire de la lumière. Les torches permettent aussi de fondre la neige et la glace. + +Sert de matériau de construction ; transformable en de nombreux objets. Se taille dans n'importe quel type de bois. + +Sert de matériau de +construction. La gravité n'a pas d'effet sur lui, contrairement au sable normal. + +Sert de matériau de construction. + +Sert à la confection des torches, flèches, panneaux, échelles, barrières, ainsi que +des poignées d'armes et manches d'outils. + +Permet d'accélérer le cycle nuit/jour jusqu'à l'aube suivante pourvu que tous les joueurs soient couchés ; modifie également le point d'apparition du joueur. +La couleur des lits est toujours la même. + +Permet de créer un éventail d'objets plus riche que l'artisanat classique. + +Permet de fondre le minerai, de créer du charbon et du verre, de cuisiner le poisson et la viande de porc. + +Permet d'entreposer des blocs et objets. Placez deux coffres côte à côte pour former un grand coffre à la capacité doublée. + +Sert de rempart impossible à franchir. Compte pour 1,5 bloc de hauteur pour les joueurs, animaux et monstres, mais pour un seul bloc de hauteur pour les autres blocs. + +Permet de grimper et de descendre. + +Actionnez, frappez la trappe ou utilisez une redstone pour l'activer. La trappe fonctionne à la manière d'une porte classique, sauf qu'elle occupe un espace d'1x1 bloc et repose à même le sol. + +Affiche les messages que les autres joueurs et vous saisissez. + +Sert à produire une lumière plus vive que celle des torches. Permet de fondre la neige et la glace ; peut s'utiliser sous l'eau. + +Sert à déclencher des explosions. Une fois placé, appliquez une décharge électrique ou utilisez un briquet à silex pour l'activer. + +Sert à contenir du ragoût de champignons. Vous conservez le bol une fois le ragoût avalé. + +Sert à contenir et transporter eau, lave et lait. + +Sert à contenir et transporter de l'eau. + +Sert à contenir et transporter de la lave. + +Sert à contenir et transporter du lait. + +Sert à faire du feu et à allumer la mèche du TNT ; ouvre un portail sitôt fabriqué. + +Sert à pêcher le poisson. + +Affiche la position du soleil et de la lune. + +Indique la position de votre point de départ. + +Tenue en main, la carte crée l'image d'une zone explorée. Peut servir à la détermination d'un trajet. + +Permet d'attaquer à distance à l'aide de flèches. + +Sert de munitions pour les arcs. + +Restitue 2,5{*ICON_SHANK_01*}. + +Restitue 1{*ICON_SHANK_01*}.. Peut s'utiliser jusqu'à 6 fois. + +Restitue 1{*ICON_SHANK_01*}. + +Restitue 1{*ICON_SHANK_01*}. + +Restitue 3{*ICON_SHANK_01*}. + +Restitue 1{*ICON_SHANK_01*} mais peut vous empoisonner. Se cuisine dans un four. + +Restitue 3{*ICON_SHANK_01*}. Obtenu en cuisinant de la viande de poulet cru dans un four. + +Restitue 1,5{*ICON_SHANK_01*}. Se cuisine dans un four. + +Restitue 4{*ICON_SHANK_01*}. Obtenu en cuisinant de la viande de bÅ“uf cru dans un four. + +Restitue 1,5{*ICON_SHANK_01*} ou se cuisine dans un four. + +Restitue 4{*ICON_SHANK_01*}. Obtenue en cuisinant de la viande de porc cru dans un four. + +Restitue 1{*ICON_SHANK_01*} ou se cuisine dans un four. Sert également à nourrir un ocelot pour l'apprivoiser. + +Restitue 2,5{*ICON_SHANK_01*}. Résulte de la cuisson de poisson cru dans un four. + +Restitue 2{*ICON_SHANK_01*} ; transformable en pomme dorée. + +Restitue 2{*ICON_SHANK_01*} et régénère la santé pendant 4 secondes. Se fabrique avec une carotte et des pépites d'or. + +Restitue 2{*ICON_SHANK_01*} mais peut vous empoisonner. + +Sert d'ingrédient dans la recette du gâteau et à la préparation de potions. + +Si activé, permet de produire une décharge électrique. Reste activé/désactivé jusqu'à nouvelle utilisation. + +Produit une décharge électrique constante ; peut aussi servir de récepteur/ +transmetteur si connectée à la façade d'un bloc. +Génère également une faible luminosité. + +Sert dans les circuits de redstone comme répéteur, retardateur et/ou diode. + +Sert à produire une décharge électrique une fois actionné. Reste activé pendant environ une seconde avant de se désactiver. + +Sert à entreposer et distribuer aléatoirement des objets lorsqu'on lui applique une charge de redstone. + +Joue une note une fois actionné. Frappez-le pour changer la hauteur de note. Déposez-le sur des blocs différents pour changer le type d'instrument. + +Sert à diriger les chariots de mine. + +Une fois alimenté en énergie, accélère les chariots de mine qui l'empruntent. Si le rail n'est pas alimenté, les chariots interrompent aussitôt leur trajet. + +Fonctionne comme une plaque de détection (diffuse un signal de redstone si alimenté), mais ne peut être activé que par un chariot de mine. + +Sert à véhiculer sur les rails joueurs, animaux et monstres. + +Sert à acheminer des marchandises sur les rails. + +Se déplace sur les rails et propulse les autres chariots de mine lorsqu'on l'alimente au charbon. + +Sert à circuler dans l'eau plus rapidement qu'à la nage. + +Prélevée sur les moutons ; se teint avec les colorants. + +Sert de matériau de construction et se teint avec les colorants. Cette recette n'est pas recommandée, puisque la laine s'obtient facilement sur les moutons. + +Sert de colorant pour la confection de laine noire. + +Sert de colorant pour la confection de laine verte. + +Utilisé comme colorant pour la confection de laine marron, d'ingrédient pour la préparation de cookies et pour faire pousser des fèves de chocolat. + +Sert de colorant pour la confection de laine argentée. + +Sert de colorant pour la confection de laine jaune. + +Sert de colorant pour la confection de laine rouge. + +Fait instantanément arriver à maturité les cultures, arbres, herbes hautes, champignons géants et fleurs ; peut aussi servir dans les recettes de colorant. + +Sert de colorant pour la confection de laine rose. + +Sert de colorant pour la confection de laine orange. + +Sert de colorant pour la confection de laine vert lime. + +Sert de colorant pour la confection de laine grise. + +Sert de colorant pour créer de la laine gris clair. +Remarque : vous pouvez aussi combiner colorant gris et poudre d'os pour en produire. Vous pouvez ainsi en confectionner quatre par poche d'encre au lieu de trois. + +Sert de colorant pour la confection de laine bleu ciel. + +Sert de colorant pour la confection de laine bleu cyan. + +Sert de colorant pour la confection de laine violette. + +Sert de colorant pour la confection de laine magenta. + +Sert de colorant pour la confection de laine bleue. + +Permet d'écouter des disques. + +Utiles pour confectionner des outils, armes et armures très robustes. + +Sert à produire une lumière plus vive que celle des torches. Permet de fondre la neige et la glace ; peut s'utiliser sous l'eau. + +Sert à créer des livres et cartes. + +Sert à créer des bibliothèques ou est utilisé enchanté pour fabriquer des livres enchantés. + +Placée dans la table d'enchantement, permet de créer des enchantements encore plus puissants. + +Sert de décoration. + +Se mine à l'aide d'une pioche en fer (ou mieux) ; transformé en lingots d'or dans le four. + +Se mine à l'aide d'une pioche en pierre (ou mieux) ; transformé en lingots de fer dans le four. + +Se mine avec une pioche pour prélever du charbon. + +Se mine avec une pioche en pierre pour prélever du lapis-lazuli. + +Se mine avec une pioche en fer pour prélever des diamants. + +Se mine avec une pioche en fer pour prélever de la poudre de redstone. + +Se mine avec une pioche pour prélever de la pierre taillée. + +Prélevée à l'aide d'une pelle. Sert de matériau de construction. + +Une fois plantée, peut prospérer et devenir un arbre. + +Impossible à briser. + +Enflamme n'importe quoi à son contact. Peut être prélevée dans un seau. + +Prélevé à l'aide d'une pelle. Peut être fondu en verre dans le four. Soumis à la gravité s'il ne repose sur aucun autre bloc. + +Prélevé à l'aide d'une pelle. Donne parfois du silex lorsqu'il est travaillé. Soumis à la gravité s'il ne repose sur aucun autre bloc. + +Travaillé à la hache. Transformé en planches ou utilisé comme combustible. + +Créé par la fusion du sable dans un four. Peut servir de matériau de construction, mais sera détruit si vous tentez de le miner. + +Obtenue en travaillant la pierre à l'aide d'une pioche. Peut servir à la construction d'un four ou à la fabrication d'outils en pierre. + +Obtenue par la cuisson d'argile dans un four. + +Peut être transformée en briques à la chaleur d'un four. + +Une fois brisé, produit des boules d'argile qui peuvent être transformées en briques dans le four. + +Un moyen peu encombrant d'entreposer des boules de neige. + +Se creuse à l'aide d'une pelle pour créer des boules de neige. + +Produit parfois des graines de blé si détruite. + +Transformable en colorant. + +Combiné à un bol, sert à la préparation de ragoûts. + +Ne peut être travaillée qu'à l'aide d'une pioche en diamant. Résulte d'un mélange d'eau et de lave inerte. Sert à la construction des portails. + +Libère des monstres dans l'environnement. + +Se place au sol pour créer un câble conducteur d'électricité. Utilisé dans une potion, permet d'augmenter la durée de l'effet. + +Une fois arrivées à maturité, les cultures peuvent être récoltées pour produire du blé. + +Un sol fertile préparé pour la culture des graines. + +Passé au four, sert à la confection d'un colorant vert. + +Sert à la confection de sucre. + +Peut servir de casque ou se combiner avec une torche pour produire une citrouille-lanterne. C'est également l'ingrédient principal de la tarte à la citrouille. + +Brûle indéfiniment si embrasé. + +Ralentit le mouvement de toute créature qui circule dessus. + +Emprunter un portail permet de circuler entre la Surface et le Nether. + +Alimente le four en combustible ; sert à la confection des torches. + +Prélevé sur les cadavres d'araignées. Sert à la confection d'arcs ou de cannes à pêche ou se dépose au sol pour fabriquer un crochet. + +Prélevé sur les cadavres de poulets ; sert à la confection des flèches. + +Prélevée sur les cadavres de creepers. Sert à la confection de TNT ou comme ingrédient dans la confection de potions. + +Plantées dans une terre labourée, produisent des cultures. Assurez-vous que les graines soient assez exposées au soleil ! + +Obtenu par la récolte des cultures ; sert à la préparation d'aliments. + +Obtenu en creusant le gravier ; sert à la confection d'un briquet à silex. + +Utilisée sur un cochon, vous permet de le chevaucher. Vous pouvez ensuite diriger votre monture à l'aide d'une carotte sur un bâton. + +Obtenue en creusant la neige ; peut servir de projectile. + +Prélevé sur les cadavres de vaches. Sert à la confection d'armures ou de livres. + +Prélevé sur les cadavres de slimes. Sert comme ingrédient dans la confection de potions ou pour fabriquer des pistons collants. + +Produit aléatoirement par les poules ; sert à la préparation d'aliments. + +Obtenue en minant un bloc de glowstone. Sert à la reconstitution de blocs de glowstone ou comme ingrédient dans la confection de potions pour accroître leur effet. + +Prélevé sur les cadavres de squelettes ; sert à la confection de poudre d'os. Donnez-en à manger à un loup pour le domestiquer. + +Obtenu sur les creepers tués par un squelette ; à lire dans un juke-box. + +Éteint les flammes et contribue à la prospérité des cultures ; à prélever dans un seau. + +Une fois détruit, produit une pousse d'arbre à replanter pour créer un nouvel arbre. + +Se trouve dans les donjons et sert à la construction et à la décoration. + +Sert à tondre la laine des moutons et à exploiter les blocs de feuillage. + +Une fois alimenté (moyennant un bouton, un levier, une plaque de détection, une torche de redstone ou une redstone avec l'un ou l'autre de ces éléments), le piston s'allonge si possible pour pousser des blocs. + +Une fois alimenté (moyennant un bouton, un levier, une plaque de détection, une torche de redstone ou une redstone avec l'un ou l'autre de ces éléments), le piston s'allonge si possible pour pousser des blocs. Lorsque le piston se rétracte, le bloc en contact avec la tête du piston retrouve son emplacement initial. + +À tailler dans les blocs de pierre ; on en trouve généralement dans les forts. + +Sert de clôture, comparable aux barrières. + +Comparable à une porte, mais s'utilise principalement avec une barrière. + +Se fabrique avec des tranches de pastèque. + +Des blocs transparents qui peuvent servir d'alternative aux blocs de verre. + +À planter pour faire pousser des citrouilles. + +À planter pour faire pousser des pastèques. + +Produite par les Enderman à leur mort. Lorsqu'elle est lancée, le joueur est téléporté jusqu'à la zone d'impact de la perle du néant et perdra un peu de santé. + +Un bloc de terre couronnée de gazon. Se prélève à l'aide d'une pelle. Sert de matériau de construction. + +Sert à la construction et à la décoration. + +Ralentit vos mouvements lorsque vous passez à travers. Utilisez des cisailles pour la détruire et prélever du fil. + +Produit un poisson d'argent lorsqu'elle est détruite. Peut également produire un poisson d'argent si à proximité d'un autre poisson d'argent en train d'être attaqué. + +Lorsqu'il est placé, pousse sans interruption. Se prélève avec des cisailles. Peut-être utilisé comme une échelle. + +Glissante lorsque vous marchez dessus. Se transforme en eau si elle est placée au-dessus d'un autre bloc lorsqu'elle est détruite. Fond si elle est trop voisine d'une source de lumière ou si elle est placée dans le Nether. + +Peut servir de décoration. + +Sert en alchimie ; sert aussi à localiser les forts. Produit par les Blazes qu'on trouve à proximité ou à l'intérieur des forteresses du Nether. + +Sert en alchimie. Produite par les Ghasts à leur mort. + +Produite par les Cochons zombies à leur mort. Les Cochons zombies se rencontrent dans le Nether. Sert d'ingrédient dans la préparation de potions. + +Sert en alchimie. Pousse dans les forteresses du Nether. Peut aussi être plantée dans du sable des âmes. + +Peut avoir divers effets selon ce sur quoi elle est utilisée. + +Peut être remplie d'eau et servir d'ingrédient de base d'une potion distillée dans l'alambic. + +Aliment vénéneux et ingrédient alchimique. Se trouve sur les cadavres d'araignées ou d'araignées bleues. + +Sert en alchimie ; intervient principalement dans la création de potions néfastes. + +Sert en alchimie et intervient dans la fabrication d'objets comme l'Å“il d'Ender ou la crème de magma. + +Sert en alchimie. + +Sert à la création de potions simples et volatiles. + +Rempli d'eau par la pluie ou à l'aide d'un seau d'eau. Sert aussi à remplir des fioles. + +Lancé, indique la direction d'un portail de l'Ender. Quand douze de ces yeux sont placés dans des cadres de portail de l'Ender, le portail de l'Ender s'ouvrira. + +Sert en alchimie. + +Comparable aux blocs d'herbe, mais très efficace pour faire pousser des champignons. + +Flotte sur l'eau et permet de marcher dessus. + +Sert à construire des forteresses du Nether. Invulnérable aux boules de feu des Ghasts. + +Sert dans les forteresses du Nether. + +Se trouve dans les forteresses du Nether et produit des verrues du Nether lorsqu'elle est brisée. + +Permet au joueur, moyennant ses points d'expérience, d'enchanter épées, pioches, haches, pelles, arcs et armures. + +S'active à l'aide de l'Å“il d'Ender et permet au joueur de voyager jusqu'à la dimension de l'Ender. + +Sert à créer un portail de l'Ender. + +Un type de bloc rencontré dans l'Ender. Elle est dotée d'une résistance très élevée aux explosions et constitue donc un matériau de construction très utile. + +Ce bloc est créé lorsque le Dragon de l'Ender est terrassé. + +Lancé, il produit des orbes d'expérience qui augmentent vos points d'expérience une fois ramassés. + +Utile pour enflammer des choses ou pour démarrer des incendies sans faire de distinction depuis un distributeur. + +Similaires à une vitrine, affichent les objets et blocs qui y sont placés. + +Lancez-le pour faire apparaître une créature du type indiqué. + +Sert à la création d'escaliers longs. Deux dalles placées l'une sur l'autre formeront une dalle double de taille normale. + +Sert à la création d'escaliers longs. Deux dalles placées l'une sur l'autre formeront une dalle double de taille normale. + +Créé en fusionnant du netherrack dans un fourneau. Peut être transformés en blocs de briques du Nether. + +Émettent de la lumière lors de leur activation. + +Leur récolte permet d'obtenir des fèves de cacao. + +Les crânes peuvent servir de décoration ou être portés comme masques dans l'emplacement pour le casque. + +Pieuvre + +Produit une poche d'encre une fois tuée. + +Vache + +Produit du cuir une fois tuée. Utilisez un seau pour la traire. + +Mouton + +Produit de la laine dès qu'il est tondu (s'il ne l'a pas déjà été). Utilisez un colorant pour changer la couleur de sa laine. + +Poulet + +Produit des plumes une fois tué ; pond aussi des Å“ufs, à l'occasion. + +Cochon + +Produit de la viande de porc une fois tué. Utilisez une selle pour le chevaucher. + +Loup + +Inoffensif à moins d'être attaqué : il n'hésitera pas à riposter. Utilisez des os pour le domestiquer : le loup vous suivra et s'en prendra à tous vos assaillants. + +Creeper + +Explose si vous l'approchez de trop près ! + +Squelette + +Vous décoche des flèches. Produit des flèches une fois tué. + +Araignée + +Attaque dès que vous approchez. Peut escalader les murs. Produit du fil une fois tuée. + +Zombie + +Attaque dès que vous approchez. + +Cochon zombie + +Inoffensifs de nature, ils vous attaqueront en groupe si vous vous en prenez à l'un d'entre eux. + +Ghast + +Décoche des boules de feu qui explosent à l'impact. + +Slime + +Se divise en plusieurs slimes plus petits dès qu'il est touché. + +Enderman + +Vous attaquera si vous le regardez. Peut aussi déplacer des blocs. + +Poisson d'argent + +Attire les poissons d'argent tapis à proximité si vous l'attaquez. Se cache dans les blocs de pierre. + +Araignée bleue + +Sa morsure est empoisonnée. + +Champimeuh + +Combiné à un bol, sert à la préparation de ragoûts de champignons. Produit des champignons et devient une vache normale une fois tondue. + +Golem de neige + +Le Golem de neige se crée en combinant des blocs de neige et une citrouille. Ils lancent des boules de neige sur les ennemis de leur créateur. + +Dragon de l'Ender + +Un colossal dragon noir qu'on rencontre dans l'Ender. + +Blaze + +Des ennemis qu'on croise dans le Nether, surtout dans les forteresses du Nether. Ils produisent des bâtons de feu une fois tués. + +Cube de magma + +On les rencontre dans le Nether. De même que les Slimes, ils se scindent en plusieurs cubes plus petits dès qu'ils sont tués. + +Villageois + +Ocelot + +Se trouve dans la jungle. Peut être dompté en le nourrissant de poisson cru. Vous devrez cependant laisser l'ocelot vous approcher, tout mouvement brusque le fera fuir. + +Golem de fer + +Apparaît dans les villages pour les protéger et peut être créé à partir de blocs de fer et de citrouilles. + +Explosives Animator + +Concept Artist + +Number Crunching and Statistics + +Bully Coordinator + +Original Design and Code by + +Project Manager/Producer + +Rest of Mojang Office + +Lead game programmer Minecraft PC + +Ninja Coder + +CEO + +White Collar Worker + +Customer Support + +Office DJ + +Designer/Programmer Minecraft - Pocket Edition + +Developer + +Chief Architect + +Art Developer + +Game Crafter + +Director of Fun + +Music and Sounds + +Programming + +Art + +QA + +Executive Producer + +Lead Producer + +Producer + +Test Lead + +Lead Tester + +Design Team + +Development Team + +Release Management + +Director, XBLA Publishing + +Business Development + +Portfolio Director + +Product Manager + +Marketing + + Community Manager + +Europe Localization Team + +Redmond Localization Team + +Asia Localization Team + +User Research Team + +MGS Central Teams + +Milestone Acceptance Tester + +Special Thanks + +Test Manager + +Senior Test Lead + +SDET + +Project STE + +Additional STE + +Test Associates + +Jon KÃ¥gström + +Tobias Möllstam + +Risë Lugo + +Épée en bois + +Épée en pierre + +Épée en fer + +Épée en diamant + +Épée en or + +Pelle en bois + +Pelle en pierre + +Pelle en fer + +Pelle en diamant + +Pelle en or + +Pioche en bois + +Pioche en pierre + +Pioche en fer + +Pioche en diamant + +Pioche en or + +Hache en bois + +Hache en pierre + +Hache en fer + +Hache en diamant + +Hache en or + +Houe en bois + +Houe en pierre + +Houe en fer + +Houe en diamant + +Houe en or + +Porte en bois + +Porte en fer + +Casque en mailles + +Plastron en mailles + +Jambières en mailles + +Bottes en mailles + +Coiffe en cuir + +Casque en fer + +Casque en diamant + +Casque en or + +Tunique de cuir + +Plastron en fer + +Plastron en diamant + +Plastron en or + +Pantalon en cuir + +Jambières en fer + +Jambières en diamant + +Jambières en or + +Bottes en cuir + +Bottes en fer + +Bottes en diamant + +Bottes en or + +Lingot de fer + +Lingot d'or + +Seau + +Seau d'eau + +Seau de lave + +Briquet à silex + +Pomme + +Arc + +Flèche + +Charbon + +Charbon de bois + +Diamant + +Bâton + +Bol + +Ragoût de champignons + +Fil + +Plume + +Poudre à canon + +Graines de blé + +Blé + +Pain + +Silex + +Viande de porc crue + +Viande de porc cuite + +Peinture + +Pomme dorée + +Panneau + +Chariot de mine + +Selle + +Redstone + +Boule de neige + +Bateau + +Cuir + +Seau de lait + +Brique + +Argile + +Canne à sucre + +Papier + +Livre + +Boule de slime + +Chariot de mine avec coffre + +Chariot de mine avec four + +Å’uf + +Boussole + +Canne à pêche + +Montre + +Poudre glowstone + +Poisson cru + +Poisson cuit + +Poudre de colorant + +Poche d'encre + +Pétale de rose + +Vert de cactus + +Fèves de cacao + +Lapis-lazuli + +Colorant violet + +Colorant bleu cyan + +Colorant gris clair + +Colorant gris + +Colorant rose + +Colorant vert lime + +Pétale de pissenlit + +Colorant bleu ciel + +Colorant magenta + +Colorant orange + +Poudre d'os + +Os + +Sucre + +Gâteau + +Lit + +Répéteur de redstone + +Cookie + +Carte + +Disque vinyle "13" + +Disque vinyle "cat" + +Disque vinyle "blocks" + +Disque vinyle "chirp" + +Disque vinyle "far" + +Disque vinyle "mall" + +Disque vinyle "mellohi" + +Disque vinyle "stal" + +Disque vinyle "strad" + +Disque vinyle "ward" + +Disque vinyle "11" + +Disque vinyle "where are we now" + +Cisailles + +Graines de citrouille + +Graines de pastèque + +Poulet cru + +Poulet cuit + +BÅ“uf cru + +Steak + +Chair putréfiée + +Ender Pearl + +Tranche de pastèque + +Bâton de feu + +Larme de Ghast + +Pépite d'or + +Verrue du Nether + +Potion{*splash*}{*prefix*} {*postfix*} + +Fiole + +Fiole d'eau + +Å’il d'araignée + +Å’il d'araignée fermenté + +Poudre de feu + +Crème de magma + +Alambic + +Chaudron + +Å’il d'Ender + +Pastèque scintillante + +Fiole d'expérience + +Boule de feu + +Boule de feu (charbon de bois) + +Boule de feu (charbon) + +Cadre + +Fait apparaître {*CREATURE*} + +Brique du Nether + +Crâne + +Crâne de squelette + +Crâne de wither squelette + +Tête de zombie + +Crâne + +Crâne de %s + +Crâne de creeper + +Pierre + +Bloc d'herbe + +Terre + +Pierre taillée + +Planches en chêne + +Planches en sapin + +Planches en bouleau + +Planches de bois tropical + +Pousse d'arbre + +Pousse de chêne + +Pousse d'épicéa + +Pousse de bouleau + +Pousse d'arbre tropical + +Adminium + +Eau + +Lave + +Sable + +Grès + +Gravier + +Minerai d'or + +Minerai de fer + +Minerai de charbon + +Bois + +Bois de chêne + +Bois d'épicéa + +Bois de bouleau + +Bois tropical + +Chêne + +Sapin + +Bouleau + +Feuillage + +Feuilles de chêne + +Feuilles d'épicéa + +Feuilles de bouleau + +Feuilles tropicales + +Éponge + +Verre + +Laine + +Laine noire + +Laine rouge + +Laine verte + +Laine marron + +Laine bleue + +Laine violette + +Laine bleu cyan + +Laine gris clair + +Laine grise + +Laine rose + +Laine vert lime + +Laine jaune + +Laine bleu ciel + +Laine magenta + +Laine orange + +Laine blanche + +Fleur + +Rose + +Champignon + +Bloc d'or + +Un moyen peu encombrant d'entreposer de l'or. + +Un moyen peu encombrant d'entreposer du fer. + +Bloc de fer + +Dalle de pierre + +Dalle de pierre + +Dalle de grès + +Dalle de chêne + +Dalle de pierre taillée + +Dalle en briques + +Dalle en briques de pierre + +Dalle de chêne + +Dalle de sapin + +Dalle de bouleau + +Dalle de bois tropical + +Dalles du Nether + +Briques + +TNT + +Bibliothèque + +Pierre moussue + +Obsidienne + +Torche + +Torche (charbon) + +Torche (charbon de bois) + +Feu + +Générateur de monstres + +Escalier en chêne + +Coffre + +Poudre de redstone + +Minerai de diamant + +Bloc de diamant + +Un moyen peu encombrant d'entreposer des diamants. + +Atelier + +Cultures + +Terre labourée + +Four + +Panneau + +Porte en bois + +Échelle + +Rail + +Rail de propulsion + +Rail de détection + +Escalier en pierre + +Levier + +Plaque de détection + +Porte en fer + +Minerai de redstone + +Torche de redstone + +Bouton + +Neige + +Glace + +Cactus + +Argile + +Canne à sucre + +Juke-box + +Barrière + +Citrouille + +Citrouille-lanterne + +Netherrack + +Sable des âmes + +Glowstone + +Portail + +Minerai de lapis-lazuli + +Bloc de lapis-lazuli + +Un moyen peu encombrant d'entreposer du Lapis-lazuli. + +Distributeur + +Bloc musical + +Gâteau + +Lit + +Toile + +Herbes hautes + +Arbuste mort + +Diode + +Coffre verrouillé + +Trappe + +Laine (toutes couleurs) + +Piston + +Piston collant + +Bloc de poisson d'argent + +Briques de pierre + +Pierres taillées moussues + +Pierres craquelées + +Blocs de pierre taillée + +Champignon + +Champignon + +Barreaux de fer + +Vitre + +Pastèque + +Queue de citrouille + +Queue de pastèque + +Lierre + +Portillon + +Escalier en briques + +Escalier en briques de pierre + +Pierre de poisson d'argent + +Pierre taillée de poisson d'argent + +Brique en pierre de poisson d'argent + +Mycélium + +Nénuphar + +Brique du Nether + +Barrière en brique du Nether + +Escaliers en brique du Nether + +Verrue du Nether + +Table d'enchantement + +Alambic + +Chaudron + +Portail de l'Ender + +Cadre de portail de l'Ender + +Pierre blanche + +Å’uf de Dragon + +Arbuste + +Fougère + +Escaliers en grès + +Escaliers en sapin + +Escaliers en bouleau + +Escalier en bois tropical + +Lampe de redstone + +Cacao + +Crâne + +Commandes actuelles + +Config. + +Se déplacer/Sprinter + +Regarder + +Pause + +Sauter + +Sauter/Voler Haut + +Inventaire + +Changer d'objet + +Action + +Utiliser + +Artisanat + +Lâcher + +Se faufiler + +Se faufiler/Voler Bas + +Changer mode caméra + +Joueurs/Invitation + +Déplacement (en vol) + +Config. 1 + +Config. 2 + +Config. 3 + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +{*B*}Appuyez sur{*CONTROLLER_VK_A*} pour continuer. + +{*B*}Appuyez sur{*CONTROLLER_VK_A*} pour commencer le didacticiel.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous pensez pouvoir vous en passer. + +Le principe de Minecraft consiste à placer des blocs pour construire tout ce qu'on peut imaginer. +La nuit, les monstres sont de sortie ; tâchez donc d'aménager un abri avant le coucher du soleil. + +Utilisez{*CONTROLLER_ACTION_LOOK*} pour regarder vers le haut, vers le bas et autour de vous. + +Utilisez{*CONTROLLER_ACTION_MOVE*} pour vous déplacer. + +Pour sprinter, orientez rapidement{*CONTROLLER_ACTION_MOVE*} deux fois vers l'avant. Tant que vous maintenez{*CONTROLLER_ACTION_MOVE*} vers l'avant, le personnage continuera de sprinter jusqu'à ce que sa durée de sprint soit écoulée ou que sa jauge de nourriture se vide. + +Appuyez sur{*CONTROLLER_ACTION_JUMP*} pour sauter. + +Maintenez{*CONTROLLER_ACTION_ACTION*} pour miner ou frapper à mains nues ou à l'aide d'un ustensile. Vous devrez parfois façonner des outils pour miner certains blocs. + +Maintenez{*CONTROLLER_ACTION_ACTION*} pour détruire 4 blocs de bois (troncs d'arbre).{*B*}Lorsqu'un bloc est détruit, tenez-vous à proximité de l'objet flottant apparu pour le ramasser : l'objet est alors déposé dans votre inventaire. + +Appuyez sur{*CONTROLLER_ACTION_CRAFTING*} pour ouvrir l'interface d'artisanat. + +Votre inventaire se remplira à mesure que vous prélèverez des ressources et confectionnerez des objets.{*B*} + Appuyez sur{*CONTROLLER_ACTION_INVENTORY*} pour ouvrir l'inventaire. + +À force de vous déplacer, de miner et d'attaquer, la barre de nourriture{*ICON_SHANK_01*} se vide progressivement. Sprinter et sauter après un sprint épuisent bien plus rapidement la barre de nourriture que la marche et les sauts classiques. + +Si vous perdez de la santé, mais que votre jauge de nourriture comporte au moins 9{*ICON_SHANK_01*}, votre santé se reconstituera automatiquement. Manger des aliments remplira votre barre de nourriture. + +Un aliment à la main, maintenez{*CONTROLLER_ACTION_USE*} pour le manger et remplir votre barre de nourriture. Vous ne pouvez pas manger si votre barre de nourriture est pleine. + +Votre barre de nourriture est presque vide et vous avez perdu de la santé. Mangez le steak qui apparaît dans votre inventaire pour remplir votre barre de nourriture et vous soigner.{*ICON*}364{*/ICON*} + +Le bois que vous avez recueilli peut être taillé en planches. Ouvrez l'interface d'artisanat pour en fabriquer.{*PlanksIcon*} + +La confection d'un certain nombre d'objets implique plusieurs étapes. Maintenant que vous avez des planches à disposition, l'éventail d'objets à fabriquer s'est enrichi. Créez un atelier.{*CraftingTableIcon*} + +Pour accélérer la collecte de ressources, vous pouvez fabriquer des outils dédiés à cette tâche. Certains outils possèdent un manche taillé dans un bâton. Fabriquez maintenant des bâtons.{*SticksIcon*} + +Utilisez{*CONTROLLER_ACTION_LEFT_SCROLL*} et{*CONTROLLER_ACTION_RIGHT_SCROLL*} pour sélectionner un autre objet à manier. + +Utilisez{*CONTROLLER_ACTION_USE*} pour vous servir d'objets, interagir avec les éléments du décor et placer vos créations. Travaillez les objets déjà placés avec un outil adapté pour les ramasser. + +L'atelier sélectionné, placez le réticule à l'emplacement voulu et utilisez{*CONTROLLER_ACTION_USE*} pour placer un atelier. + +Pointez le réticule sur l'atelier et appuyez sur{*CONTROLLER_ACTION_USE*} pour l'ouvrir. + +La pelle vous permet de creuser plus rapidement les matériaux meubles, comme la terre et la neige. À mesure que vous accumulerez des ressources, vous pourrez créer des outils plus efficaces et robustes. Créez une pelle en bois.{*WoodenShovelIcon*} + +La hache accélère le travail du bois et des blocs en bois. À mesure que vous accumulerez des ressources, vous pourrez créer des outils plus efficaces et robustes. Créez une hache en bois.{*WoodenHatchetIcon*} + +La pioche accélère le travail des matériaux solides, comme la pierre et le minerai. À mesure que vous accumulerez des ressources, vous pourrez créer des outils plus efficaces et robustes pour miner les matériaux les plus coriaces. Créez une pioche en bois.{*WoodenPickaxeIcon*} + +Ouvrir le conteneur + + + Évitez de vous laisser surprendre par la nuit. Vous pouvez confectionner des armes et armures, mais le plus sûr reste de vous aménager un abri. + + + + Un refuge de mineur se trouve à proximité : finissez de l'aménager pour passer la nuit à l'abri. + + + + Vous aurez besoin de ressources pour achever la construction du refuge. Vous pouvez utiliser n'importe quel type de bloc pour les murs et le toit, mais vous voudrez sans doute aménager une porte et des fenêtres, sans compter qu'il vous faudra un peu d'éclairage. + + +Utilisez votre pioche pour miner des blocs de pierre. Une fois minés, les blocs de pierre produiront de la pierre taillée. Récupérez 8 blocs de pierre taillée et vous pourrez construire un four. Vous risquez d'avoir à déblayer la terre avant de pouvoir attaquer la pierre. Justement, la pelle est faite pour ça !{*StoneIcon*} + +Vous avez désormais une quantité suffisante de pierres taillées pour fabriquer un four. Utilisez votre atelier pour le créer. + +Utilisez{*CONTROLLER_ACTION_USE*} pour placer le four dans l'environnement, puis ouvrez-le. + +Utilisez le four pour produire du charbon de bois. Le temps que la production aboutisse, profitez-en pour vous procurer les ressources nécessaires à vos travaux sur le refuge. + +Utilisez le four pour produire du verre. Le temps que la production aboutisse, profitez-en pour vous procurer les ressources nécessaires à vos travaux sur le refuge. + +Un refuge digne de ce nom sera pourvu d'une porte pour faciliter vos allées et venues. Faute de quoi, vous devrez percer à travers les murs pour entrer et sortir. Fabriquez une porte en bois.{*WoodenDoorIcon*} + +Utilisez{*CONTROLLER_ACTION_USE*} pour placer la porte et{*CONTROLLER_ACTION_USE*} pour l'ouvrir et la fermer. + +La nuit, l'obscurité est quasi totale. Pour y voir clair dans votre refuge, vous aurez besoin de lumière. Utilisez des bâtons et du charbon de bois pour créer une torche. Pour ce faire, commencez par ouvrir l'interface d'artisanat et fabriquez une torche.{*TorchIcon*} + + + Vous avez terminé la première partie du didacticiel. + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour continuer le didacticiel.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous pensez pouvoir vous en passer. + + + + Voici votre inventaire. Il affiche les objets susceptibles d'être tenus en main ainsi que tous les autres objets que vous portez, armure comprise. + + +{*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour continuer.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser l'inventaire. + + + + Utilisez{*CONTROLLER_MENU_NAVIGATE*} pour déplacer le pointeur. Utilisez{*CONTROLLER_VK_A*} pour saisir l'objet placé sous le pointeur. + S'il s'agit de plusieurs objets, vous sélectionnerez toute la pile. Vous pouvez aussi utiliser{*CONTROLLER_VK_X*} pour n'en sélectionner que la moitié. + + + + Déplacez l'objet annexé au pointeur jusqu'à un autre emplacement de l'inventaire et déposez-le avec{*CONTROLLER_VK_A*}. + Si plusieurs objets sont annexés au pointeur, utilisez{*CONTROLLER_VK_A*} pour tous les déposer, ou{*CONTROLLER_VK_X*} pour n'en déposer qu'un seul. + + + + Si vous déplacez le pointeur à l'extérieur de l'interface alors qu'un objet lui est annexé, vous jetterez l'objet. + + + + Si vous voulez en savoir plus sur un objet, déplacez le pointeur sur l'objet en question et appuyez sur{*CONTROLLER_VK_RT*}. + + + + Appuyez sur{*CONTROLLER_VK_B*} pour quitter l'inventaire. + + + + L'inventaire du mode Créatif, où figurent les objets utilisables, ainsi que tous les objets à sélectionner. + + +{*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour continuer.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser l'inventaire du mode Créatif. + + + + Utilisez{*CONTROLLER_MENU_NAVIGATE*} pour déplacer le pointeur. + Lorsque la liste des objets est affichée, utilisez{*CONTROLLER_VK_A*} pour saisir un objet sous le pointeur. Utilisez {*CONTROLLER_VK_Y*} pour en saisir toute une pile. + + + + Le pointeur se déplacera automatiquement sur un espace de la colonne d'utilisation. Vous pouvez le déplacer vers le bas avec{*CONTROLLER_VK_A*}. Une fois l'objet déplacé, le pointeur retournera à la liste d'objets, où vous pourrez sélectionner un autre article. + + + + Si vous déplacez le curseur à l'extérieur de l'interface alors qu'un objet lui est annexé, vous jetterez l'objet. Pour supprimer tous les objets de la barre de sélection rapide, appuyez sur{*CONTROLLER_VK_X*}. + + + + Parcourez les onglets de catégorie, en haut, à l'aide de{*CONTROLLER_VK_LB*} et{*CONTROLLER_VK_RB*} pour sélectionner la catégorie de l'objet que vous souhaitez saisir. + + + + Si vous voulez en savoir plus sur un objet, déplacez le pointeur sur l'objet en question et appuyez sur{*CONTROLLER_VK_RT*}. + + + + Appuyez sur{*CONTROLLER_VK_B*} pour quitter l'inventaire du mode Créatif. + + + + Vous êtes dans l'interface d'artisanat. Cette interface vous permet de combiner les ressources récoltées pour confectionner de nouveaux objets. + + +{*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour continuer.{*B*} + Appuyez sur {*CONTROLLER_VK_B*}si vous savez déjà utiliser l'interface d'artisanat. + + +{*B*} + Appuyez sur{*CONTROLLER_VK_X*} pour afficher la description de l'objet. + + +{*B*} + Appuyez sur{*CONTROLLER_VK_X*} pour afficher les ingrédients nécessaires à la confection de l'objet sélectionné. + + +{*B*} + Appuyez sur{*CONTROLLER_VK_X*} pour à nouveau afficher l'inventaire. + + + + Parcourez les onglets de catégorie, en haut, à l'aide de{*CONTROLLER_VK_LB*} et{*CONTROLLER_VK_RB*} pour sélectionner la catégorie d'objets que vous souhaitez confectionner puis utilisez{*CONTROLLER_MENU_NAVIGATE*} pour choisir l'article à créer. + + + + La grille d'artisanat indique quels objets sont nécessaires à la production du nouvel article. Appuyez sur{*CONTROLLER_VK_A*} pour confectionner l'objet et le placer dans votre inventaire. + + + + Vous pouvez utiliser un atelier pour confectionner des objets plus grands. L'artisanat sur atelier fonctionne de la même manière que l'artisanat classique, mais vous disposez d'une grille d'artisanat plus étendue pour combiner un plus vaste éventail d'ingrédients. + + + + Votre inventaire apparaît en bas à droite de l'interface d'artisanat. Cette zone peut également afficher la description de l'objet sélectionné ainsi que les ingrédients nécessaires à sa fabrication. + + + + La description de l'objet sélectionné est maintenant affichée. Elle vous indique pour quels usages l'objet est conçu. + + + + La liste des ingrédients nécessaires à la fabrication de l'objet sélectionné est maintenant affichée. + + +Le bois que vous avez coupé peut être transformé en planches. Sélectionnez l'icône en forme de planches et appuyez sur{*CONTROLLER_VK_A*} pour les produire.{*PlanksIcon*} + + + Maintenant que votre atelier est fabriqué, il vous reste à le placer dans l'environnement. Vous pourrez ensuite accéder à une gamme plus vaste d'objets à créer.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} pour quitter l'interface d'artisanat. + + + + Appuyez sur{*CONTROLLER_VK_LB*} et{*CONTROLLER_VK_RB*} pour accéder à la catégorie d'objets que vous souhaitez créer. Sélectionnez la catégorie Outils.{*ToolsIcon*} + + + + Appuyez sur{*CONTROLLER_VK_LB*} et{*CONTROLLER_VK_RB*} pour accéder à la catégorie d'objets que vous souhaitez créer. Sélectionnez la catégorie Structures.{*StructuresIcon*} + + + + Utilisez{*CONTROLLER_MENU_NAVIGATE*} pour sélectionner l'objet à créer. Certains objets présentent plusieurs variantes selon le type de matériau utilisé. Sélectionnez la pelle en bois.{*WoodenShovelIcon*} + + + + La confection d'un certain nombre d'objets implique plusieurs étapes. Maintenant que vous avez des planches à disposition, l'éventail d'objets à fabriquer s'est enrichi. Utilisez{*CONTROLLER_MENU_NAVIGATE*} pour sélectionner l'objet à créer. Sélectionnez l'atelier.{*CraftingTableIcon*} + + + + Vous êtes sur la bonne voie. Grâce aux outils que vous avez fabriqués, vous pourrez prélever diverses ressources plus efficacement.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} pour quitter l'interface d'artisanat. + + + + La fabrication de certains objets nécessite un four plutôt qu'un atelier. Fabriquez un four.{*FurnaceIcon*} + + + + Placez le four que vous avez créé dans l'environnement, à l'intérieur de votre refuge, de préférence.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} pour quitter l'interface d'artisanat. + + + + Vous êtes dans l'interface du four. Un four vous permet de fondre des objets pour les modifier. Par exemple, vous pouvez y déposer du minerai de fer pour fondre des lingots de fer. + + +{*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour continuer.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser le four. + + + + Vous devrez alimenter le four en combustible (partie inférieure du four), et déposer l'objet à transformer dans la partie supérieure. Le four s'actionnera alors : l'objet produit apparaîtra dans l'emplacement de droite. + + + + La plupart des objets en bois peuvent servir de combustible. Au fil de vos aventures, vous découvrirez d'autres variétés de matériaux qui feront d'excellents combustibles. + + + + Une fois les objets fondus, vous pouvez les déplacer depuis la zone de production jusqu'à votre inventaire. Essayez divers ingrédients et observez les résultats. + + + + Si vous utilisez du bois en guise d'ingrédient, vous pouvez produire du charbon de bois. Alimentez le four en combustible et déposez le bois dans l'emplacement dédié. L'opération peut durer quelque temps ; profitez de ce délai pour vaquer à d'autres tâches et repassez régulièrement pour vérifier l'état d'avancement de la production. + + + + Le charbon de bois peut servir de combustible et se combiner à un bâton pour créer une torche. + + + + Placer du sable à l'emplacement dévolu aux ingrédients vous permet de fabriquer du verre. Créez des blocs de verre qui serviront de fenêtres dans votre refuge. + + + + Vous êtes dans l'interface d'alchimie. Cette interface vous permet de créer des potions aux effets variés. + + +{*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour continuer.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser l'alambic. + + + + Pour distiller une potion, placez un ingrédient dans l'emplacement du haut, ainsi qu'une potion ou une fiole d'eau dans les emplacements du bas (vous pouvez créer jusqu'à 3 potions à la fois). Une fois qu'une combinaison correcte est choisie, le processus de distillation commence et la potion est créée au bout de quelques instants. + + + + La création d'une potion commence toujours avec une fiole d'eau. Pour créer la plupart des potions, il s'agit d'abord de confectionner une potion étrange à l'aide d'une verrue du Nether. Ensuite, il s'y ajoute au moins un autre ingrédient pour créer la potion finale. + + + + Une fois la potion créée, vous pouvez modifier ses effets. Ajoutez de la poudre de redstone pour allonger la durée d'effet ou de la poudre de glowstone pour en renforcer la puissance. + + + + Ajouter un Å“il d'araignée fermenté corrompt la potion et inverse l'effet initial. Ajouter de la poudre à canon transforme la potion en potion volatile qu'on peut lancer pour appliquer l'effet à toute la zone d'impact. + + + + Pour créer une potion de résistance au feu, commencez par ajouter une verrue du Nether à une fiole d'eau, puis incorporez de la crème de magma. + + + + Appuyez sur{*CONTROLLER_VK_B*} pour quitter l'interface d'alchimie. + + + + Dans cette zone se trouvent un alambic, un chaudron et un coffre rempli d'articles d'alchimie. + + +{*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur l'alchimie et les potions.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si l'alchimie et les potions n'ont déjà plus de secrets pour vous. + + + + Pour distiller une potion, il faut d'abord créer une fiole d'eau. Prenez une fiole dans le coffre. + + + + Vous pouvez remplir une fiole d'eau depuis un chaudron qui en contient, ou bien en prélever sur les blocs d'eau. Pointez le curseur sur une source d'eau et appuyez sur{*CONTROLLER_ACTION_USE*} pour remplir votre fiole. + + + + Si un chaudron se vide, vous pouvez le remplir à l'aide d'un seau d'eau. + + + + Utilisez l'alambic pour créer une potion de résistance au feu. Vous aurez besoin d'une fiole d'eau, d'une verrue du Nether et de crème de magma. + + + + Une potion à la main, maintenez{*CONTROLLER_ACTION_USE*} pour l'utiliser. Dans le cas d'une potion normale, il suffit de la boire pour bénéficier de ses effets. Quant aux potions volatiles, lancez-les pour appliquer leurs effets aux créatures proches de la zone d'impact. + Mélangez de la poudre à canon aux potions normales pour créer des potions volatiles. + + + + Utilisez votre potion de résistance au feu sur vous-même. + + + + Maintenant que vous résistez au feu et à la lave, peut-être pourrez-vous rejoindre des lieux jusque-là inaccessibles. + + + + Vous êtes dans l'interface d'enchantement qui vous permet d'appliquer des enchantements aux armes et armures, ainsi qu'à certains outils. + + +{*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur l'interface d'enchantement.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si l'interface d'enchantement n'a déjà plus de secrets pour vous. + + + + Pour enchanter un objet, commencez par le placer dans l'emplacement d'enchantement. Les armes et armures, ainsi que certains outils, peuvent être enchantés pour leur appliquer certains effets spéciaux, comme renforcer la résistance aux dégâts ou augmenter le nombre de ressources produites lorsque vous minez un bloc. + + + + Lorsqu'un objet est disposé dans l'emplacement d'enchantement, les boutons sur la droite afficheront un éventail d'enchantements aléatoires. + + + + Le chiffre qui figure sur le bouton indique le coût d'enchantement de l'objet, exprimé en niveaux d'expérience. Si votre niveau est insuffisant, le bouton sera désactivé. + + + + Sélectionnez un enchantement et appuyez sur{*CONTROLLER_VK_A*} pour enchanter l'objet. Le coût de l'enchantement sera déduit de votre niveau d'expérience. + + + + Les enchantements sont tous aléatoires, mais les meilleurs d'entre eux ne seront disponibles qu'à haut niveau d'expérience et nécessiteront de très nombreuses bibliothèques disposées autour de la table d'enchantement pour en augmenter la puissance. + + + + Dans cette zone, vous trouverez une table d'enchantement ainsi que plusieurs objets qui vous aideront à vous familiariser avec l'enchantement. + + +{*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur l'enchantement.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il y a à savoir sur l'enchantement. + + + + L'utilisation d'une table d'enchantement vous permet d'appliquer aux objets certains effets spéciaux, comme renforcer la résistance aux dégâts ou augmenter le nombre de ressources produites lorsque vous minez un bloc. + + + + Placer des bibliothèques autour de la table d'enchantement augmente sa puissance et permet d'accéder aux niveaux d'enchantement supérieurs. + + + + L'enchantement d'objets coûte des niveaux d'expérience qu'on obtient au moyen d'orbes d'expérience. Pour obtenir ces orbes, tuez des monstres et animaux, prélevez du minerai, élevez des animaux, pêchez ou fondez/cuisinez certains objets dans un four. + + + + Vous pouvez aussi engranger de l'expérience à l'aide d'une fiole d'expérience. Lorsque vous la lancez, elle crée un orbe d'expérience à l'endroit où elle tombe, que vous n'avez plus qu'à ramasser. + + + + Dans les coffres de cette zone, vous trouverez certains objets enchantés, des fioles d'expérience ainsi que certains objets qui restent à enchanter sur la table d'enchantement. + + + + Vous êtes à bord d'un chariot de mine. Pour descendre, pointez le curseur sur le chariot et appuyez sur{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + + +{*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les chariots de mine.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si les chariots de mine n'ont déjà plus de secrets pour vous. + + + + Le chariot de mine circule sur des rails. Vous pouvez fabriquer des chariots motorisés et des chariots de transport. + {*RailIcon*} + + + + Vous pouvez aussi aménager des rails de propulsion ; alimentés par les torches et circuits de redstone, ils augmentent la vitesse du chariot. Ces rails peuvent être associés à des interrupteurs, leviers et plaques de détection pour mettre en Å“uvre des systèmes complexes. + {*PoweredRailIcon*} + + + + Vous naviguez à bord d'un bateau. Pour descendre, pointez le curseur sur le bateau et appuyez sur{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les bateaux.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il faut savoir sur les bateaux. + + + + Le bateau vous permet de circuler plus rapidement sur l'eau. Vous pouvez le diriger à l'aide de{*CONTROLLER_ACTION_MOVE*} et{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + + + + Vous maniez une canne à pêche. Appuyez{*CONTROLLER_ACTION_USE*} pour l'utiliser.{*FishingRodIcon*} + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur la pêche.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il faut savoir sur la pêche. + + + + Appuyez sur{*CONTROLLER_ACTION_USE*} pour lancer la ligne et commencer à pêcher. Appuyez à nouveau sur{*CONTROLLER_ACTION_USE*} pour relever la ligne. + {*FishingRodIcon*} + + + + Si vous attendez que le flotteur plonge sous l'eau avant de relever la ligne, vous pourrez attraper un poisson. Mangé cru ou cuit au four, le poisson restitue de la santé. + {*FishIcon*} + + + + Comme de nombreux outils, la canne à pêche a un nombre d'utilisations limité, mais elle n'a pas pour seule vocation d'attraper du poisson. Testez par vous-même et observez quels autres objets ou créatures elle est capable d'actionner ou de capturer... + {*FishingRodIcon*} + + + + C'est un lit. La nuit, pointez le curseur sur le lit et appuyez sur{*CONTROLLER_ACTION_USE*} pour dormir jusqu'au matin.{*ICON*}355{*/ICON*} + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les lits.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il faut savoir sur les lits. + + + + Placez votre lit dans un lieu sûr et bien éclairé pour éviter que les monstres ne vous tirent du sommeil au beau milieu de la nuit. Si vous avez déjà utilisé un lit, vous réapparaîtrez à son emplacement si vous mourez. + {*ICON*}355{*/ICON*} + + + + Si votre partie compte d'autres joueurs, tous devront être au lit au même moment avant de pouvoir dormir. + {*ICON*}355{*/ICON*} + + + + Dans cette zone, vous trouverez des circuits de redstone avec piston, ainsi qu'un coffre qui renferme les objets nécessaires pour développer ces circuits. + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les circuits de redstone et les pistons.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il y a à savoir sur les circuits de redstone et les pistons. + + + + Les leviers, boutons, plaques de détection et torches de redstone permettent d'alimenter les circuits. Pour ce faire, reliez-les directement à l'objet que vous souhaitez activer, ou bien connectez-les moyennant de la poudre de redstone. + + + + La position et l'orientation d'une source d'alimentation peuvent modifier l'effet qu'elle exerce sur les blocs voisins. Par exemple, une torche de redstone placée sur le côté d'un bloc peut être désactivée si le bloc en question est raccordé à une autre source d'alimentation. + + + + Pour obtenir de la poudre de redstone, creusez du minerai de redstone avec une pioche en fer, en diamant ou en or. Elle permet de conduire le courant sur une longueur maximale de 15 blocs et sur une hauteur d'1 bloc. + {*ICON*}331{*/ICON*} + + + + Les répéteurs de redstone permettent de prolonger la distance de conduction du courant, ou de retarder les signaux de redstone. + {*ICON*}356{*/ICON*} + + + + Une fois alimenté, le piston s'allonge et pousse jusqu'à 12 blocs. Lorsqu'il se rétracte, le piston collant rabat sur lui un bloc (tous types de blocs confondus, ou presque). + {*ICON*}33{*/ICON*} + + + + Le coffre de cette zone renferme les composants nécessaires à la fabrication de circuits avec pistons. Essayez d'utiliser ou de développer les circuits de cette zone, ou bien d'assembler votre propre circuit. Vous trouverez d'autres exemples de ces circuits en dehors de la zone didacticielle. + + + + Un portail vers le Nether se trouve dans cette zone ! + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les portails et le Nether.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il y a à savoir sur les portails et le Nether. + + + + Pour créer un portail, placez des blocs d'obsidienne dans un cadre large de quatre blocs et haut de cinq. Les blocs d'angle n'ont qu'une fonction esthétique. + + + + Pour activer un portail du Nether, embrasez les blocs contenus dans le cadre à l'aide d'un briquet à silex. Les portails se désactivent si leur cadre est brisé, si une explosion se produit à proximité ou si un liquide les franchit. + + + + Pour emprunter un portail du Nether, tenez-vous à l'intérieur du cadre. L'écran deviendra violet et un son sera déclenché. Au bout de quelques secondes, vous serez propulsé dans une autre dimension. + + + + Le Nether est un lieu de tous les dangers, inondé de lave, mais c'est le seul endroit où prélever du Netherrack, un matériau qui brûle indéfiniment une fois qu'il est enflammé, et de la glowstone, qui produit de la lumière. + + + + Vous pouvez emprunter le Nether pour voyager rapidement à la Surface : parcourir un bloc de distance dans le Nether équivaut à voyager sur trois blocs de la Surface. + + + + Vous êtes désormais en mode Créatif. + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur le mode Créatif.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous n'avez plus rien à apprendre sur ce mode. + + +En mode Créatif, vous disposez d'un nombre infini d'objets et de blocs, vous pouvez détruire des blocs d'un seul clic sans utiliser d'outil, vous êtes invulnérable et vous pouvez voler. + +Appuyez deux fois rapidement sur{*CONTROLLER_ACTION_JUMP*} pour voler. Pour ne plus voler, répétez l'opération. Pour voler plus vite, orientez rapidement{*CONTROLLER_ACTION_MOVE*} deux fois vers l'avant en cours de vol. +En mode Vol, maintenez{*CONTROLLER_ACTION_JUMP*} pour monter et{*CONTROLLER_ACTION_SNEAK*} pour descendre, ou bien utilisez le BMD pour monter/descendre et virer à gauche et à droite. + +Appuyez sur{*CONTROLLER_ACTION_CRAFTING*} pour ouvrir l'interface d'inventaire du mode Créatif. + +Rejoignez l'autre extrémité de ce trou pour continuer. + +Vous êtes arrivé à la fin du didacticiel du mode Créatif. + + + Une ferme a été aménagée dans cette zone. La culture vous permet de créer une source renouvelable de nourriture et d'autres objets. + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur la culture.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous n'avez plus rien à apprendre sur la question. + + +Le blé, les citrouilles et les pastèques sont créés à partir de graines. Exploitez des herbes hautes ou moissonnez du blé pour recueillir des graines de blé. Les graines de citrouille et de pastèque s'obtiennent respectivement sur les citrouilles et les pastèques. + +Avant de planter les graines, les blocs de terre doivent être transformés en terre labourée à l'aide d'une houe. Une source d'eau voisine permettra d'irriguer la terre labourée. Les cultures pousseront d'autant plus vite si elles sont abondamment irriguées et exposées à la lumière. + +Le blé passe par plusieurs stades de croissance. Il est prêt à la moisson lorsque son aspect s'assombrit.{*ICON*}59:7{*/ICON*} + +Les citrouilles et les pastèques nécessitent de laisser vacant un bloc adjacent pour accueillir le fruit une fois le plant arrivé à maturité. + +La canne à sucre doit être plantée dans un bloc d'herbe, de terre ou de sable adjacent à un bloc d'eau. Détruire un bloc de canne à sucre vous permet de récolter tous les blocs qui lui sont superposés.{*ICON*}83{*/ICON*} + +Les cactus doivent être plantés dans le sable et pousseront jusqu'à atteindre trois blocs de hauteur. Tout comme pour le sucre de canne, détruire le bloc inférieur vous permettra de récolter les blocs qui lui sont superposés.{*ICON*}81{*/ICON*} + +Les champignons doivent être plantés dans des zones faiblement éclairées et se propageront aux blocs adjacents peu exposés à la lumière.{*ICON*}39{*/ICON*} + +Vous pouvez utiliser de la poudre d'os pour accélérer l'arrivée à maturité de vos cultures, ou pour transformer vos champignons en champignons géants.{*ICON*}351:15{*/ICON*} + +Le didacticiel consacré aux cultures est maintenant terminé. + + + Des animaux ont été placés en enclos dans cette zone. Vous pouvez élever des animaux pour en faire apparaître des versions miniatures. + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les animaux et l'élevage.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si les animaux et l'élevage n'ont déjà plus de secrets pour vous. + + +Pour faire en sorte que les animaux se reproduisent, vous devez leur donner à manger la nourriture appropriée ; ils basculeront alors en mode « Romance ». + +Donnez du blé aux vaches, Champimeuh et moutons, des carottes aux cochons, des graines de blé ou des verrues du Nether aux poulets et n'importe quelle variété de viande aux loups : ils chercheront alors un autre animal de leur espèce, lui aussi disposé à se reproduire. + +Lorsque deux animaux d'une même espèce se rencontrent, et pourvu qu'ils soient tous les deux en mode Romance, ils s'embrassent quelques secondes, et un bébé apparaît. Le jeune animal suivra ses parents quelque temps avant de devenir adulte. + +Une fois qu'un animal est passé en mode Romance, il faut patienter cinq minutes environ pour qu'il soit à nouveau apte. + +Certains animaux vous suivront si vous tenez leur nourriture dans la main. Il vous sera alors plus facile de réunir des animaux pour qu'ils se reproduisent.{*ICON*}296{*/ICON*} + + + Il est possible d'apprivoiser les loups sauvages en leur donnant des os. Des cÅ“urs apparaissent alors autour d'eux pour symboliser leur état. Les loups apprivoisés suivent le joueur et le défendent s'ils n'ont pas reçu l'ordre de s'asseoir. + + +Le didacticiel consacré aux animaux et à l'élevage est maintenant terminé. + + + Cette zone comporte des citrouilles et des blocs pour créer un golem de neige et un golem de fer. + + + + {*B*} + Appuyez sur {*CONTROLLER_VK_A*} pour en savoir plus sur les golems.{*B*} + Appuyez sur {*CONTROLLER_VK_B*} si vous savez déjà ce que sont les golems. + + +Les golems sont créés en plaçant une citrouille sur une pile de blocs. + +Les golems de neige sont créés en empilant de blocs de neige puis une citrouille. Les golems de neige lancent des boules de neige à vos ennemis. + +Les golems de fer sont créés à partir de quatre blocs de fer selon un certain modèle, avec une citrouille au-dessus du bloc central. Les golems de fer attaquent vos ennemis. + +Les golems de fer apparaissent naturellement pour protéger les villages. Ils vous attaqueront si vous attaquez les villageois. + +Vous devez poursuivre jusqu'à la fin de ce didacticiel avant de quitter cette zone. + +Certains outils conviennent mieux que d'autres au travail de ressources spécifiques. Par exemple, utilisez plutôt une pelle pour creuser les matériaux meubles comme la terre et le sable. + +Certains outils conviennent mieux que d'autres au travail de ressources spécifiques. Utilisez une hache pour couper les troncs d'arbre. + +Certains outils conviennent mieux que d'autres au travail de ressources spécifiques. Utilisez une pioche pour creuser le minerai et la pierre. Vous devrez sûrement confectionner une pioche dans des matériaux de meilleure qualité pour exploiter certains blocs. + +Certains outils sont plus efficaces que d'autres pour attaquer des ennemis. Pour attaquer, songez à vous équiper d'une épée. + +Maintenez {*CONTROLLER_ACTION_ACTION*}pour miner ou frapper à mains nues ou à l'aide d'un ustensile. Vous devrez parfois façonner des outils pour miner certains blocs. + +L'outil que vous maniez est endommagé. Chaque fois que vous utilisez un outil, son état se dégrade, jusqu'à se briser. Dans l'inventaire, la jauge colorée située sous l'objet illustre son niveau d'intégrité. + +Maintenez{*CONTROLLER_ACTION_JUMP*} pour nager vers le haut. + +Dans cette zone, un chariot de mine est placé sur des rails. Pour monter à bord, pointez le curseur sur le chariot et appuyez sur{*CONTROLLER_ACTION_USE*}. Utilisez{*CONTROLLER_ACTION_USE*} sur le bouton pour déplacer le chariot. + +Le coffre sur la rive contient un bateau. Pour l'utiliser, pointez le curseur sur l'eau et appuyez sur{*CONTROLLER_ACTION_USE*}. Pour embarquer, pointez le curseur sur le bateau et appuyez sur{*CONTROLLER_ACTION_USE*}. + +Vous trouverez une canne à pêche dans le coffre situé près de l'étang. Prenez-la et sélectionnez-la pour la tenir en main. + +Ce mécanisme à piston, plus complexe, crée un pont capable de s'auto-réparer ! Appuyez sur le bouton pour l'activer puis tâchez de comprendre comment les composants interagissent. + +Si vous déplacez le pointeur hors des limites de l'interface alors qu'un objet lui est annexé, vous pouvez jeter cet objet. + +Vous ne disposez pas des ingrédients nécessaires pour confectionner cet objet. Le champ situé en bas à gauche de l'écran répertorie les ingrédients requis pour cette tâche d'artisanat. + + + Félicitations, vous êtes arrivé à la fin de ce didacticiel. Désormais, le temps s'écoule normalement dans le jeu et la nuit ne va pas tarder à tomber avec son cortège de monstres ! Terminez votre refuge ! + + +{*EXIT_PICTURE*} Dès que vous serez prêt à explorer plus avant, un escalier, près du refuge de mineur, donne sur un petit château. + +Rappel : + +]]> + +De nouvelles fonctionnalités ont été ajoutées à la dernière version du jeu, dont de nouvelles zones dans le monde didacticiel. + +{*B*}Appuyez sur{*CONTROLLER_VK_A*} pour parcourir normalement le didacticiel.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} pour passer le didacticiel principal. + +Ici, vous trouverez des zones déjà configurées qui vous en apprendront davantage sur la pêche, les bateaux, les pistons et la redstone. + +À l'extérieur de cette zone, vous trouverez des exemples de bâtiments, de terres labourées, de chariots de mine et de rails, ainsi que des tables d'enchantement, des alambics, des partenaires commerciaux, des enclumes... et bien plus encore ! + + + Votre barre de nourriture est à un niveau où votre santé ne se régénère plus. + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur la barre de nourriture et les aliments.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il y a à savoir sur la barre de nourriture et les aliments. + + +Sélectionner + +Utiliser + +Retour + +Quitter + +Annuler + +Annuler connexion + +Sélectionner un périphérique + +Changer périph. + +Actualiser jeux + +Party Games + +Tous les jeux + +Changer catégorie + +Inventaire + +Description + +Ingrédients + +Artisanat + +Créer + +Prendre/Placer + +Prendre + +Prendre tout + +Prendre la moitié + +Placer + +Placer tout + +Placer un + +Lâcher + +Jeter tout + +Jeter un + +Permuter + +Dépl. rapide + +Vider la barre de sélection rapide + +? + +Partager sur Facebook + +Changer de filtre + +Carte du joueur + +Voir profil du joueur + +Envoyer requête d'ami + +Page Bas + +Page Haut + +Suivant + +Précédent + +Exclure joueur + +Teindre + +Miner + +Nourrir + +Apprivoiser + +Soigner + +Assis + +Suis-moi + +Éjecter + +Vider + +Seller + +Placer + +Frapper + +Traire + +Prélever + +Manger + +Dormir + +Se réveiller + +Jouer + +Monter + +Naviguer + +Faire pousser + +Nager (haut) + +Ouvrir + +Changer hauteur + +Exploser + +Lire + +Suspendre + +Lancer + +Planter + +Faucher + +Récolter + +Continuer + +Déverrouiller le jeu complet + +Supp. sauvegarde + +Supprimer + +Options + +Inviter Groupe d'amis Xbox Live + +Inviter des amis + +Accepter + +Tondre + +Exclure le niveau + +Sélectionner skin + +Allumer + +Naviguer + +Installer la version complète + +Installer la version d'évaluation + +Installer + +Réinstaller + +Enregistrer options + +Exécuter ordre + +Créatif + +Déplacer ingrédient + +Déplacer combustible + +Outil Déplacement + +Déplacer l'armure + +Déplacer l'arme + +Équiper + +Bander + +Lâcher + +Privilèges + +Bloc + +Page Haut + +Page Bas + +Mode Romance + +Boire + +Faire pivoter + +Masquer + +Charger la sauvegarde pour Xbox One + +Libérer tous les emplacements + +Charger la sauvegarde pour Xbox One + +O.K. + +Annuler + +Magasin Minecraft + +Voulez-vous vraiment quitter la partie en cours et rejoindre la nouvelle ? Toute progression non sauvegardée sera perdue. + +Quitter le jeu + +Sauvegarder la partie + +Quitter sans sauvegarder + +Voulez-vous vraiment supprimer toute sauvegarde préalable pour ce monde et la remplacer par la version actuelle de ce monde ? + +Voulez-vous vraiment quitter sans sauvegarder ? Vous perdrez toute progression dans ce monde ! + +Commencer la partie + +Si vous créez, chargez ou sauvegardez un monde en mode Créatif, les mises à jour des succès et des classements seront désactivées pour ce monde, même s'il est ensuite chargé en mode Survie. Voulez-vous vraiment continuer ? + +Ce monde a déjà été sauvegardé en mode Créatif : les mises à jour des succès et des classements seront désactivées. Voulez-vous vraiment continuer ? + +Ce monde a déjà été sauvegardé en mode Créatif : les mises à jour des succès et du classement seront désactivées. + +Si vous créez, chargez ou sauvegardez un monde avec des privilèges d'hôte, les mises à jour des succès et des classements seront désactivées pour ce monde, même s'il est ensuite chargé avec ces options désactivées. Voulez-vous vraiment continuer ? + +Sauv. endommagée + +Cette sauvegarde semble corrompue ou endommagée. La supprimer ? + +Voulez-vous vraiment retourner au menu principal et déconnecter tous les joueurs de la partie ? Toute progression non sauvegardée sera perdue. + +Quitter et sauvegarder + +Quitter sans sauvegarder + +Voulez-vous vraiment retourner au menu principal ? Toute progression non sauvegardée sera perdue. + +Voulez-vous vraiment retourner au menu principal ? Votre progression sera perdue ! + +Créer un monde + +Lancer le didacticiel + +Didacticiel + +Nommer votre monde + +Saisir le nom de votre monde + +Saisir une graine pour la génération de votre monde + +Charger monde sauvegardé + +Appuyez sur START pour rejoindre la partie + +Sortie du jeu + +Une erreur s'est produite. Retour au menu principal. + +Échec de la connexion + +Connexion perdue + +La connexion au serveur a été interrompue. Retour au menu principal. + +La connexion à Xbox Live a été interrompue. Retour au menu principal. + +La connexion à Xbox Live a été interrompue. + +Déconnexion par le serveur + +Vous avez été exclu de la partie + +Vous avez été exclu de la partie. Motif : vol. + +Expiration du délai de connexion + +Le serveur est au complet. + +L'hôte a quitté la partie. + +Vous ne pouvez pas rejoindre cette partie, car vous n'êtes l'ami d'aucun des joueurs présents. + +Vous ne pouvez pas rejoindre cette partie car l'hôte vous en a déjà exclu. + +Vous ne pouvez pas rejoindre cette partie car le joueur avec qui vous essayez de jouer utilise une version antérieure du jeu. + +Vous ne pouvez pas rejoindre cette partie car le joueur avec qui vous essayez de jouer utilise une version supérieure du jeu. + +Nouveau monde + +Récompense déverrouillée ! + +Hourra, vous avez reçu une image de joueur représentant Steve de Minecraft ! + +Hourra, vous avez reçu une image de joueur représentant un creeper ! + +Hourra, vous avez reçu une récompense pour avatar : un T-shirt Minecraft: Xbox 360 Edition ! +Accédez à l'Interface pour en habiller votre avatar. + +Hourra, vous avez reçu une récompense pour avatar : une montre Minecraft: Xbox 360 Edition ! +Accédez à l'Interface pour la mettre au poignet de votre avatar. + +Hourra, vous avez reçu une récompense pour avatar : une casquette de base-ball Creeper ! +Accédez à l'Interface pour en coiffer votre avatar. + +Hourra, vous avez reçu le thème Minecraft: Xbox 360 Edition ! +Accédez à l'Interface pour sélectionner ce thème. + +Déverrouiller le jeu complet + +Vous jouez à la version d'évaluation. Vous devrez vous procurer le jeu complet pour sauvegarder votre partie. +Déverrouiller le jeu complet ? + +Vous jouez à la version d'évaluation de Minecraft: Xbox 360 Edition. Si vous possédiez le jeu complet, vous auriez déjà remporté un succès ! +Voulez-vous déverrouiller le jeu complet ? + +Vous jouez à la version d'évaluation de Minecraft: Xbox 360 Edition. Si vous possédiez le jeu complet, vous auriez déjà remporté une récompense pour avatar ! +Voulez-vous déverrouiller le jeu complet ? + +Vous jouez à la version d'évaluation de Minecraft: Xbox 360 Edition. Si vous possédiez le jeu complet, vous auriez déjà remporté une image de joueur ! +Voulez-vous déverrouiller le jeu complet ? + +Vous jouez à la version d'évaluation de Minecraft: Xbox 360 Edition. Si vous possédiez le jeu complet, vous auriez déjà remporté un thème ! +Voulez-vous déverrouiller le jeu complet ? + +Vous jouez à la version d'évaluation de Minecraft: Xbox 360 Edition. Vous devez disposer du jeu complet pour accepter cette invitation. +Voulez-vous déverrouiller le jeu complet ? + +Les joueurs invités ne peuvent pas déverrouiller le jeu complet. Veuillez vous connecter à un profil de joueur Xbox Live. + +Veuillez patienter + +Aucun résultat + +Filtre : + +Amis + +Mon score + +Général + +Entrées : + +Rang + +Gamertag + +Sauvegarde du niveau en préparation + +Préparation des tronçons... + +Finalisation... + +Aménagement du terrain + +Brève simulation du monde + +Initialisation du serveur + +Génération de la zone d'apparition + +Chargement de la zone d'apparition + +Entrée dans le Nether + +Sortie du Nether + +Réapparition + +Génération du niveau + +Chargement du niveau + +Sauvegarde des joueurs + +Connexion à l'hôte + +Téléchargement du terrain + +Passage en mode hors ligne + +Veuillez patienter pendant que l'hôte sauvegarde la partie + +Entrée dans l'ENDER + +Sortie de l'ENDER + +Recherche de graines pour le générateur de monde + +Ce lit est occupé + +Vous ne pouvez dormir que la nuit + +%s dort dans un lit. Pour vous réveiller directement à l'aube, tous les joueurs doivent dormir dans leur lit au même moment. + +Le lit de votre refuge est absent ou inaccessible + +Vous ne pouvez pas vous reposer : des monstres rôdent dans les parages + +Vous dormez dans un lit. Pour vous réveiller directement à l'aube, tous les joueurs doivent dormir dans leur lit au même moment. + +Outils et armes + +Armes + +Nourriture + +Structures + +Armures + +Mécanismes + +Transports + +Décorations + +Construction de blocs + +Redstone et transport + +Divers + +Alchimie + +Alchimie + +Outils, armes et armures + +Matériaux + +Déconnexion + +Votre profil de joueur a été déconnecté : retour à l'écran titre + +Difficulté + +Musique + +Son + +Gamma + +Sensibilité jeu + +Sensibilité interface + +Pacifique + +Facile + +Normal + +Difficile + +Dans ce mode, la santé du joueur se régénère au fil du temps et aucun ennemi ne rôde dans les parages. + +Dans ce mode, des ennemis apparaissent dans l'environnement mais infligent moins de dégâts qu'en mode Normal. + +Dans ce mode, des ennemis apparaissent dans l'environnement et infligent des dégâts normaux. + +Dans ce mode, des ennemis apparaissent dans l'environnement et infligent des dégâts considérables. Méfiez-vous des creepers : même si vous prenez vos distances, ils ne renonceront pas à vous attaquer ! + +Expiration de la version d'évaluation + +La durée impartie de la version d'évaluation de Minecraft: Xbox 360 Edition est écoulée ! Pour continuer à en profiter, voulez-vous déverrouiller le jeu complet ? + +Partie au complet + +Impossible de rejoindre la partie : aucune place vacante + +Saisir un message sur le panneau + +Saisir une ligne de texte à inscrire sur votre panneau + +Saisir un titre + +Saisir le titre de votre message + +Saisir un sous-titre + +Saisir le sous-titre de votre message + +Saisir une description + +Saisir la description de votre message + +Inventaire + +Ingrédients + +Alambic + +Coffre + +Enchantement + +Four + +Ingrédient + +Combustible + +Distributeur + +Aucun contenu téléchargeable de ce type n'est actuellement disponible pour ce jeu. + +%s a rejoint la partie. + +%s a quitté la partie. + +%s s'est fait exclure de la partie. + +Voulez-vous vraiment supprimer cette sauvegarde ? + +Attente d'accord + +Censuré + +En jeu : + +Réinitialiser paramètres + +Voulez-vous vraiment rétablir les paramètres par défaut ? + +Échec du chargement + +Le chargement de Minecraft: Xbox 360 Edition a échoué : impossible de continuer. + +Jeu de %s + +Partie d'un hôte inconnu + +Invité déconnecté + +Un joueur invité s'est déconnecté : tous les joueurs invités ont été exclus de la partie. + +Se connecter + +Vous n'êtes pas connecté. Pour jouer, vous devez d'abord vous connecter. Vous connecter ? + +Multijoueur non autorisé + +Impossible de rejoindre la partie : l'un des joueurs au moins n'est pas autorisé à jouer en multijoueur sur Xbox Live. + +Impossible de créer une partie en ligne : l'un des joueurs au moins n'est pas autorisé à jouer en multijoueur sur Xbox Live. Décochez la case Jeu en ligne pour commencer une partie hors ligne. + +Vous n'êtes pas autorisé à rejoindre cette session de jeu : vos privilèges d'accès au contenu sont trop restrictifs. Si vous souhaitez rejoindre cette session, modifiez ces paramètres dans la section Confidentialité et connexion Xbox 360 de l'Interface Xbox. + +Vous n'êtes pas autorisé à rejoindre cette session de jeu : les privilèges d'accès au contenu d'un de vos joueurs locaux sont trop restrictifs. + +Vous n'êtes pas autorisé à rejoindre cette session de jeu : les privilèges d'accès au contenu d'un des joueurs de la session sont réglés sur Amis uniquement et vous ne figurez pas sur sa liste d'amis. + +Impossible de créer la partie + +Vous n'êtes pas autorisé à créer cette session de jeu : les privilèges d'accès au contenu d'un des joueurs locaux sont trop restrictifs. Décochez la case Jeu en ligne pour commencer une partie hors ligne. Vous pouvez aussi modifier ces paramètres dans la section Confidentialité et connexion Xbox 360 de l'Interface Xbox. + +Sélection auto + +Non pack : skins stand. + +Skins préférées + +Niveau exclu + +La partie que vous tentez de rejoindre figure dans votre liste de niveaux exclus. +Si vous choisissez de rejoindre cette partie, le niveau sera retiré de votre liste de niveaux exclus. + +Exclure ce niveau ? + +Voulez-vous vraiment ajouter ce niveau à votre liste de niveaux exclus ? +Si vous sélectionnez O.K., vous quitterez cette partie. + +Retirer de la liste d'exclusion + +Intervalle de sauvegarde auto + +Intervalle de sauvegarde auto : NON + +min + +Placement impossible à cet endroit ! + +Pour éviter la mort instantanée dès l'apparition des joueurs, il n'est pas autorisé de placer de la lave aussi près du point d'apparition du niveau. + +Le jeu comporte une fonction de sauvegarde automatique du niveau. Quand l'icône ci-dessus apparaît, le jeu sauvegarde vos données. +Ne pas éteindre la console Xbox 360 quand cette icône apparaît. + +Opacité interface + +Préparation de sauvegarde auto du niveau + +Taille de l'interface + +Taille de l'interface (écran partagé) + +Graine + +Déverrouiller pack de skins + +Pour utiliser la skin que vous avez sélectionnée, vous devez d'abord déverrouiller le pack correspondant. +Déverrouiller ce pack de skins ? + +Débloquer le pack de textures + +Pour utiliser ce pack de textures dans votre monde, vous devez le débloquer. +Le débloquer maintenant ? + +Pack de textures d'essai + +Vous utilisez une version d'essai du pack de textures. Vous ne pourrez pas sauvegarder ce monde si vous ne déverrouillez pas la version complète. +Déverrouiller la version complète du pack de textures ? + +Pack de textures introuvable + +Déverrouiller la version complète + +Télécharger la version d'essai + +Télécharger la version complète + +Ce monde utilise un pack mash-up ou de textures que vous ne possédez pas. +Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? + +Obtenir la version d'essai + +Obtenir la version complète + +Exclure joueur + +Voulez-vous vraiment exclure ce joueur de la partie ? Il ne pourra plus rejoindre la partie jusqu'au redémarrage du monde. + +Packs d'images de joueur + +Thèmes + +Packs de skins + +Autoriser les amis d'amis + +Vous ne pouvez pas rejoindre cette partie : elle est réservée aux seuls amis de l'hôte. + +Impossible de rejoindre la partie + +Sélectionnée + +Skin sélectionnée : + +Contenu téléchargeable corrompu + +Ce contenu téléchargeable est endommagé et inutilisable. Supprimez-le puis réinstallez-le depuis le menu Magasin Minecraft. + +Votre contenu téléchargeable est partiellement endommagé et inutilisable. Supprimez-le puis réinstallez-le depuis le menu Magasin Minecraft. + +Votre mode de jeu a été modifié + +Renommer votre monde + +Saisir le nouveau nom de votre monde + +Mode de jeu : Survie + +Mode de jeu : Créatif + +Survie + +Créatif + +Créé en mode Survie + +Créé en mode Créatif + +Afficher les nuages + +Que voulez-vous faire de cette sauvegarde ? + +Renommer sauvegarde + +Sauvegarde auto. dans %d... + +Oui + +Non + +Normal + +Superplat + +Une fois activé, le jeu sera un jeu en ligne. + +Une fois activé, seuls les joueurs invités peuvent participer. + +Une fois activé, les amis des personnes présentes sur votre liste d'amis peuvent rejoindre la partie. + +Lorsque cette option est activée, les joueurs peuvent infliger des dégâts aux autres joueurs. Ne s'applique qu'au mode Survie. + +Lorsque cette option est désactivée, les joueurs qui rejoignent la partie ne peuvent ni construire ni miner sans autorisation. + +Lorsque cette option est activée, le feu peut se propager aux blocs voisins inflammables. + +Lorsque cette option est activée, le TNT peut exploser lorsqu'il est activé. + +Cette option permet à l'hôte d'activer sa capacité à voler et à se rendre un invisible, et de désactiver la fatigue. Elle désactive la mise à jour des succès et classements. + +Si vous l'activez, le Nether sera régénéré. Très utile si vous avez une ancienne sauvegarde où les forteresses du Nether ne sont pas présentes. + +Lorsque cette option est activée, les structures comme les villages et les forts apparaîtront dans le monde. + +Lorsque cette option est activée, un monde complètement plat apparaîtra à la Surface et dans le Nether. + +Lorsque cette option est activée, un coffre renfermant des objets utiles sera créé à proximité du point d'apparition du joueur. + +Packs de skins + +Thèmes + +Images du joueur + +Objets pour avatar + +Packs de textures + +Packs mash-up + +{*PLAYER*} s'est fait descendre en flammes + +{*PLAYER*} a joué les allumettes + +{*PLAYER*} a piqué une tête dans la lave + +{*PLAYER*} a suffoqué dans un mur + +{*PLAYER*} a péri par noyade + +{*PLAYER*} a crevé de faim + +{*PLAYER*} a reçu une piqûre mortelle + +{*PLAYER*} a percuté le sol + +{*PLAYER*} a chuté du bout du monde + +{*PLAYER*} a péri + +{*PLAYER*} a explosé + +{*PLAYER*} a trépassé par magie + +{*PLAYER*} a été tué(e) par le souffle du Dragon de l'Ender. + +{*PLAYER*} s'est fait tuer par {*SOURCE*} + +{*PLAYER*} s'est fait tuer par {*SOURCE*} + +{*PLAYER*} s'est fait tirer dessus par {*SOURCE*} + +{*PLAYER*} a encaissé une boule de feu décochée par {*SOURCE*} + +{*PLAYER*} s'est fait rouer de coups par {*SOURCE*} + +{*PLAYER*} s'est fait tuer par {*SOURCE*} + +Brouillard d'adminium + +Afficher interface + +Afficher main + +Gamertags écran partagé + +Messages mortuaires + +Personnage animé + +Animations personnalisée pour skin + +Vous ne pouvez plus miner ou utiliser d'objet + +Vous pouvez maintenant miner et utiliser des objets + +Vous ne pouvez plus placer de blocs + +Vous pouvez maintenant placer des blocs + +Vous pouvez maintenant utiliser portes et leviers + +Vous ne pouvez plus utiliser portes et leviers + +Vous pouvez maintenant utiliser des conteneurs (coffres, par exemple) + +Vous ne pouvez plus utiliser de conteneurs (coffres, par exemple) + +Vous ne pouvez plus attaquer des monstres + +Vous pouvez maintenant attaquer des monstres + +Vous ne pouvez plus attaquer des joueurs + +Vous pouvez maintenant attaquer des joueurs + +Vous ne pouvez plus attaquer les animaux + +Vous pouvez maintenant attaquer les animaux + +Vous êtes désormais modérateur + +Vous n'êtes plus modérateur + +Vous pouvez maintenant voler + +Vous ne pouvez plus voler + +Vous ne vous fatiguerez plus + +Vous allez maintenant vous fatiguer + +Vous êtes maintenant invisible + +Vous n'êtes plus invisible + +Vous êtes maintenant invulnérable + +Vous n'êtes plus invulnérable + +%d MSP + +Dragon de l'Ender + +%s est entré(e) dans l'Ender + +%s a quitté l'Ender + + +{*C3*}Je vois le joueur dont tu parles.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*} ?{*EF*}{*B*}{*B*} +{*C3*}Oui. Fais attention. Son niveau est plus élevé maintenant. Il peut lire nos pensées.{*EF*}{*B*}{*B*} +{*C2*}Ça ne fait rien. Il pense qu'on fait partie du jeu.{*EF*}{*B*}{*B*} +{*C3*}Je l'aime bien, ce joueur. Il a bien joué. Il n'a jamais baissé les bras.{*EF*}{*B*}{*B*} +{*C2*}Il lit nos pensées comme des mots sur un écran.{*EF*}{*B*}{*B*} +{*C3*}C'est sa façon d'imaginer bien des choses quand il est plongé dans le rêve d'un jeu.{*EF*}{*B*}{*B*} +{*C2*}Les mots font une interface remarquable. Très flexible. Et bien moins terrifiante que d'observer la réalité qui se trouve derrière l'écran.{*EF*}{*B*}{*B*} +{*C3*}Ils entendaient des voix, avant que les joueurs ne sachent lire. C'était l'époque où ceux qui ne jouaient pas appelaient les joueurs sorcières et sorciers. Et eux, rêvaient de voler dans les airs, sur des bâtons envoûtés par des démons. {*EF*}{*B*}{*B*} +{*C2*}De quoi rêvait ce joueur ?{*EF*}{*B*}{*B*} +{*C3*}De la lumière du soleil et des arbres. Du feu et de l'eau. Il l'a rêvé et l'a créé. Puis il a rêvé de destruction. Il a rêvé de chasser et d'être chassé. Il a rêvé d'un refuge.{*EF*}{*B*}{*B*} +{*C2*}Ah, l'interface originale. Vieille d'un million d'années et elle fonctionne encore. Mais quelle structure ce joueur a-t-il créée, dans la réalité qui se trouve derrière l'écran ?{*EF*}{*B*}{*B*} +{*C3*}Il a travaillé aux côtés de milliers d'autres, pour créer un véritable monde d'un pli de {*EF*}{*NOISE*}{*C3*}, et créé {*EF*}{*NOISE*}{*C3*} pour {*EF*}{*NOISE*}{*C3*}, dans {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}Il n'arrive pas à lire ces pensées.{*EF*}{*B*}{*B*} +{*C3*}Non. Il n'a pas encore atteint le niveau le plus élevé. Pour cela, il doit accomplir le long rêve de la vie, pas le court rêve d'un jeu.{*EF*}{*B*}{*B*} +{*C2*}Sait-il que nous l'aimons ? Que l'univers est bon ?{*EF*}{*B*}{*B*} +{*C3*}Parfois, à travers les sons de sa pensée, il entend l'univers, oui.{*EF*}{*B*}{*B*} +{*C2*}Mais il est des moments où il est en peine, dans le long rêve. Il crée des mondes sans étés et frissonne sous un soleil noir, il prend ses tristes créations pour la réalité.{*EF*}{*B*}{*B*} +{*C3*}Soigner sa tristesse causerait sa perte. Le chagrin est une tâche personnelle. Nous ne pouvons interférer.{*EF*}{*B*}{*B*} +{*C2*}Parfois, quand les joueurs sont plongés dans leurs rêves, je veux leur dire qu'en réalité, ils construisent de véritables mondes. Parfois, je veux leur dire à quel point ils sont importants pour l'univers. Parfois, lorsqu'ils ne se sont pas vraiment connectés pendant un long moment, je veux les aider à exprimer leur peur.{*EF*}{*B*}{*B*} +{*C3*}Il lit nos pensées.{*EF*}{*B*}{*B*} +{*C2*}Parfois, cela m'indiffère. Parfois, j'aimerais leur dire que ce monde qu'ils croient véritable n'est que {*EF*}{*NOISE*}{*C2*} et {*EF*}{*NOISE*}{*C2*}, j'aimerais leur dire qu'ils sont {*EF*}{*NOISE*}{*C2*} dans {*EF*}{*NOISE*}{*C2*}. Leur vision de la réalité est tellement limitée dans leur long rêve.{*EF*}{*B*}{*B*} +{*C3*}Et pourtant, ils jouent le jeu.{*EF*}{*B*}{*B*} +{*C2*}Mais il serait tellement facile de leur dire...{*EF*}{*B*}{*B*} +{*C3*}Ce serait trop puissant pour ce rêve. Leur dire comment vivre revient à les empêcher de vivre.{*EF*}{*B*}{*B*} +{*C2*}Je ne dirai pas au joueur comment vivre.{*EF*}{*B*}{*B*} +{*C3*}Le joueur commence à s'agiter.{*EF*}{*B*}{*B*} +{*C2*}Je vais lui conter une histoire.{*EF*}{*B*}{*B*} +{*C3*}Mais pas la vérité.{*EF*}{*B*}{*B*} +{*C2*}Non. Une histoire qui protège la vérité dans une cage de mots. Pas la vérité à nue qui peut brûler sur une infinie distance.{*EF*}{*B*}{*B*} +{*C3*}Donne-lui à nouveau un corps.{*EF*}{*B*}{*B*} +{*C2*}Oui. Joueur...{*EF*}{*B*}{*B*} +{*C3*}Utilise son nom.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Joueur de jeux.{*EF*}{*B*}{*B*} +{*C3*}Bien.{*EF*}{*B*}{*B*} + + + + + +{*C2*}Prenez une inspiration, maintenant. Prenez-en une autre. Sentez l'air dans vos poumons. Laissez vos membres se ranimer. Oui, bougez vos doigts. Ressentez à nouveau votre corps, la gravité, l'air. Réapparaissez dans le long rêve. Vous y êtes. Votre corps touche à présent l'univers de toute part, comme si vous étiez deux choses séparées. Comme si nous étions deux choses séparées.{*EF*}{*B*}{*B*} +{*C3*}Qui sommes-nous ? Nous étions jadis appelés esprits de la montagne. Père soleil et mère lune. Esprits ancestraux, esprits animaux. Génies. Fantômes. Homme vert. Puis dieux, démons. Anges. Poltergeists. Aliens, extraterrestres. Leptons, quarks. Les mots changent mais nous restons les mêmes.{*EF*}{*B*}{*B*} +{*C2*}Nous sommes l'univers. Nous sommes tout ce que vous considérez ne pas être vous. Vous nous regardez à présent, à travers votre peau et vos yeux. Et pourquoi l'univers touche-t-il votre peau et vous éclaire de sa lumière ? Pour vous voir, joueur. Pour vous connaître. Et pour être connu. Je vais vous raconter une histoire.{*EF*}{*B*}{*B*} +{*C2*}Il était une fois un joueur.{*EF*}{*B*}{*B*} +{*C3*}Ce joueur, c'était vous, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Parfois il se croyait humain, sur la fine croûte d'un globe tournant fait de roche en fusion. La boule de roche en fusion tournait autour d'une autre boule de gaz embrasé qui était trois cent trente trois millions de fois plus massive qu'elle. Elles étaient si éloignées l'une de l'autre que la lumière mettait huit minutes à traverser l'intervalle. La lumière était les données d'une étoile et pouvait brûler la peau à plus de cent cinquante millions de kilomètres de distance.{*EF*}{*B*}{*B*} +{*C2*}Parfois, le joueur rêvait qu'il était un mineur, à la surface d'un monde plat et infini. Le soleil était un carré blanc. Les jours étaient courts, il y avait beaucoup à faire et la mort n'était qu'un inconvénient temporaire.{*EF*}{*B*}{*B*} +{*C3*}Parfois le joueur rêvait qu'il était perdu dans une histoire.{*EF*}{*B*}{*B*} +{*C2*}Parfois, le joueur rêvait qu'il était d'autres choses, en d'autres lieux. Parfois ces rêves étaient perturbants. Parfois vraiment beaux. Parfois le joueur se réveillait dans un rêve pour se retrouver dans un autre et se réveiller dans un troisième.{*EF*}{*B*}{*B*} +{*C3*}Parfois, le joueur rêvait qu'il lisait des mots sur un écran.{*EF*}{*B*}{*B*} +{*C2*}Revenons en arrière.{*EF*}{*B*}{*B*} +{*C2*}Les atomes du joueur étaient éparpillés dans l'herbe, les rivières, l'air, le sol. Une femme a rassemblé les atomes, elle a bu et respiré, et a assemblé le joueur dans son corps.{*EF*}{*B*}{*B*} +{*C2*}Et le joueur s'est réveillé, passant du monde maternel chaud et sombre à celui du long rêve.{*EF*}{*B*}{*B*} +{*C2*}Et le joueur était une nouvelle histoire, jamais racontée avant, écrite en lettres ADN. Et le joueur était un nouveau programme, jamais utilisé auparavant, généré par un code source d'un milliard d'années. Et le joueur était un nouvel humain n'ayant encore jamais vécu, uniquement fait d'amour et de lait.{*EF*}{*B*}{*B*} +{*C3*}Vous êtes le joueur. L'histoire. Le programme. L'humain. Uniquement fait d'amour et de lait.{*EF*}{*B*}{*B*} +{*C2*}Allons un peu plus loin.{*EF*}{*B*}{*B*} +{*C2*}Les sept quadrilliards d'atomes qui forment le corps du joueur ont été créés, bien longtemps avant ce jeu, au cÅ“ur d'une étoile. Le joueur est donc, lui aussi, les données d'une étoile. Et le joueur évolue dans une histoire, faite d'une forêt de données plantées par un homme nommé Julian, dans un monde plat et infini, créé par un homme nommé Markus, qui existe dans un petit monde privé créé par le joueur qui habite lui-même un univers créé par...{*EF*}{*B*}{*B*} +{*C3*}Chut. Parfois, le joueur créait un petit monde privé doux, simple et chaleureux. Parfois difficile, froid et compliqué. Parfois, il construisait le modèle d'un univers dans sa tête ; éclats d'énergie se déplaçant dans de vastes espaces vides. Parfois, il appelait ces éclats « électrons » et « protons ».{*EF*}{*B*}{*B*} + + + +{*C2*}Parfois, il les appelait « planètes » et « étoiles ».{*EF*}{*B*}{*B*} +{*C2*}Parfois, il se croyait dans un univers fait d'énergie, elle-même faite de zéros et de uns ; d'allumages et de mises en veille ; de lignes de codes. Parfois, il se croyait en train de jouer. Parfois il se croyait en train de lire des mots sur un écran.{*EF*}{*B*}{*B*} +{*C3*}Vous êtes le joueur lisant des mots...{*EF*}{*B*}{*B*} +{*C2*}Chut... Parfois, le joueur lisait les lignes de code d'un écran, les décodait pour en faire des mots, puis décodait les mots pour en tirer un sens, lui-même décodé en sentiments, émotions, théories, idées, et le joueur se mettait à respirer plus vite et plus profondément alors qu'il réalisait qu'il était vivant, il était vivant. Ces milliers de morts n'étaient pas réelles, le joueur était en vie.{*EF*}{*B*}{*B*} +{*C3*}Vous. Vous êtes en vie.{*EF*}{*B*}{*B*} +{*C2*}Et parfois, le joueur pensait que l'univers lui avait parlé par la lumière qui passait à travers les feuilles mouvantes des arbres en été.{*EF*}{*B*}{*B*} +{*C3*}Et parfois, le joueur pensait que l'univers lui avait parlé par la lumière qui tombait de la fraîcheur du ciel nocturne de l'hiver, où un éclat de lumière dans l'angle de l'Å“il du joueur pouvait être une étoile un million de fois plus massive que le soleil, fusionnant ses planètes en plasma pour les rendre visibles un instant au joueur rentrant chez lui de l'autre côté de l'univers, une odeur de nourriture lui chatouillant les narines, presque arrivé au pas de la porte familière, sur le point de se mettre à rêver à nouveau.{*EF*}{*B*}{*B*} +{*C2*}Et parfois, le joueur pensait que l'univers lui avait parlé par les zéros et les uns, par l'électricité du monde, par les mots défilant sur un écran à la fin d'un rêve.{*EF*}{*B*}{*B*} +{*C3*}Et l'univers disait : je vous aime ;{*EF*}{*B*}{*B*} +{*C2*}Et l'univers disait : vous avez bien joué ;{*EF*}{*B*}{*B*} +{*C3*}Et l'univers disait : tout ce dont vous avez besoin est en vous ;{*EF*}{*B*}{*B*} +{*C2*}Et l'univers disait : votre force est plus grande que vous ne le pensez ;{*EF*}{*B*}{*B*} +{*C3*}Et l'univers disait : vous êtes la lumière du jour ;{*EF*}{*B*}{*B*} +{*C2*}Et l'univers disait : vous êtes la nuit ;{*EF*}{*B*}{*B*} +{*C3*}Et l'univers disait : les ténèbres que vous combattez sont en vous ;{*EF*}{*B*}{*B*} +{*C2*}Et l'univers disait : la lumière que vous cherchez est en vous ;{*EF*}{*B*}{*B*} +{*C3*}Et l'univers disait : vous n'êtes pas seul ;{*EF*}{*B*}{*B*} +{*C2*}Et l'univers disait : vous êtes lié à tout ce qui vous entoure ;{*EF*}{*B*}{*B*} +{*C3*}Et l'univers disait : vous êtes l'univers se goûtant lui-même, se parlant à lui-même, listant son propre code ;{*EF*}{*B*}{*B*} +{*C2*}Et l'univers disait : je vous aime, car vous êtes amour.{*EF*}{*B*}{*B*} +{*C3*}Et la partie se termina et le joueur sortit du rêve. Et le joueur en commença un nouveau. Et le joueur rêva à nouveau, et rêva mieux. Et le joueur était l'univers. Et le joueur était amour.{*EF*}{*B*}{*B*} +{*C3*}Vous êtes le joueur.{*EF*}{*B*}{*B*} +{*C2*}Réveillez-vous.{*EF*} + + +Réinitialiser le Nether + +Voulez-vous vraiment réinitialiser le Nether de cette sauvegarde à ses paramètres par défaut ? Vous perdrez tout ce que vous avez construit dans le Nether ! + +Réinitialiser le Nether + +Ne pas réinitialiser le Nether + +Pas de tonte de champimeuh pour le moment. Le nombre max de cochons, moutons, vaches et chats a été atteint. + +Impossible d'utiliser l'Å“uf d'apparition pour le moment. Vous avez atteint le nombre maximum de cochons, moutons, vaches et chats. + +Impossible d'utiliser l'Å“uf d'apparition pour le moment. Vous avez atteint le nombre maximum de champimeuh. + +Impossible d'utiliser l'Å“uf d'apparition pour le moment. Vous avez atteint le nombre maximum de loups dans un monde. + +Impossible d'utiliser l'Å“uf d'apparition pour le moment. Vous avez atteint le nombre maximum de poulets dans un monde. + +Impossible d'utiliser l'Å“uf d'apparition pour le moment. Vous avez atteint le nombre maximum de pieuvres dans un monde. + +Impossible d'utiliser un Å“uf d'apparition pour le moment. Le nombre maximum d'ennemis dans un monde a été atteint. + +Impossible d'utiliser un Å“uf d'apparition pour le moment. Le nombre maximum de villageois dans un monde a été atteint. + +Le nombre maximum de tableaux/objets encadrés dans un monde a été atteint. + +Vous ne pouvez pas faire apparaître des ennemis en mode Paisible. + +Cet animal ne peut pas entrer en mode amour. Le nombre maximum de cochons, moutons, vaches et chats en cours d'élevage a été atteint. + +Cet animal ne peut pas entrer en mode amour. Le nombre maximum de loups en cours d'élevage a été atteint. + +Cet animal ne peut pas entrer en mode amour. Le nombre maximum de poulets en cours d'élevage a été atteint. + +Cet animal ne peut pas entrer en mode amour. Nbre max de champimeuh élevés atteint. + +Le nombre maximum de bateaux dans un monde a été atteint. + +Le nombre maximum de crânes dans un monde a été atteint. + +Inverser + +Gaucher + +Vous êtes mort ! + +Réapparaître + +Contenu téléchargeable + +Changer de skin + +Comment jouer + +Commandes + +Paramètres + +Crédits + +Réinstaller le contenu + +Debug Settings + +Propagation du feu + +Explosion de TNT + +PvP + +Joueurs de confiance + +Privilèges d'hôte + +Génération de structures + +Monde superplat + +Coffre bonus + +Options mondiales + +Peut construire et miner + +Utilisation de portes et leviers possible + +Ouverture de conteneurs possible + +Peut attaquer les joueurs + +Attaque d'animaux possible + +Modérateur + +Exclure joueur + +Peut voler + +Fatigue désactivée + +Invisible + +Options de l'hôte + +Joueurs/Invitation + +Jeu en ligne + +Sur invitation + +Plus d'options + +Charger + +Nouveau monde + +Nom du monde + +Graine pour le générateur de monde + +Champ vide pour une graine aléatoire + +Joueurs + +Rejoindre la partie + +Commencer la partie + +Aucune partie trouvée + +Jouer + +Classements + +Succès + +Aide et options + +Déverrouiller le jeu complet + +Reprendre le jeu + +Sauvegarder la partie + +Difficulté : + +Type de partie : + +Gamertags : + +Structures : + +Type de niveau : + +PvP : + +Joueurs de confiance : + +TNT : + +Propagation du feu : + +Réinstaller le thème + +Réinstaller l'image du joueur 1 + +Réinstaller l'image du joueur 2 + +Réinstaller l'article pour avatar 1 + +Réinstaller l'article pour avatar 2 + +Réinstaller l'article pour avatar 3 + +Options + +Audio + +Contrôle + +Vidéo + +Interface utilisateur + +Paramètres par défaut + +Afficher flottement + +Conseils + +Infobulles en jeu + +Gamertags en jeu + +Écran partagé vertical (2 joueurs) + +Terminé + +Modifier le message : + +Renseigner la légende de votre capture d'écran + +Sous-titre + +Capture d'écran du jeu + +Modifier le message : + +Regardez où j'en suis dans Minecraft: Xbox 360 Edition ! + +Les textures, icônes et interface utilisateur classiques de Minecraft ! + +Afficher tous les mondes Mash-up + +Sélectionner Transférer l'emplacement de sauvegarde + +Emplacement vide + +Chargement des métadonnées sauvegardées + +Chargement des données sauvegardées + +Chargement de la sauvegarde pour Xbox One + +Chargement annulé + +Vous avez annulé le chargement de cette sauvegarde vers la zone de transfert de sauvegarde. + +Pas d'effet + +Vitesse + +Lenteur + +Hâte + +Fatigue de mineur + +Force + +Faiblesse + +Santé + +Dégâts + +Saut + +Nausée + +Régénération + +Résistance + +Résistance au feu + +Respiration aquatique + +Invisibilité + +Cécité + +Vision nocturne + +Faim + +Poison + +de rapidité + +de lenteur + +de hâte + +de lassitude + +de force + +de faiblesse + +de santé + +de dégâts + +de saut + +de nausée + +de régénération + +de résistance + +de résistance au feu + +de respiration aquatique + +d'invisibilité + +de cécité + +de vision nocturne + +de faim + +de poison + + + +II + +III + +IV + + vol. + +banale + +triviale + +insipide + +claire + +laiteuse + +diffuse + +naïve + +mince + +étrange + +plate + +volumineuse + +maladroite + +beurrée + +lisse + +suave + +débonnaire + +épaisse + +élégante + +fantasque + +de charme + +fringante + +raffinée + +cordiale + +mousseuse + +puissante + +viciée + +inodore + +rang + +rude + +âcre + +brute + +puante + +Sert de base à toutes les potions. À utiliser dans un alambic pour distiller des potions. + +N'a pas d'effet. Combinée à d'autres ingrédients, peut servir à distiller des potions dans un alambic. + +Augmente la vitesse de déplacement des joueurs, animaux et monstres affectés ; augmente la vitesse de sprint, la longueur des sauts et le champ de vision des joueurs. + +Réduit la vitesse de déplacement des joueurs, animaux et monstres affectés ; réduit la vitesse de sprint, la longueur des sauts et le champ de vision des joueurs. + +Augmente les dégâts infligés par les attaques des joueurs et des monstres affectés. + +Réduit les dégâts infligés par les attaques des joueurs et des monstres affectés. + +Augmente instantanément la santé des joueurs, animaux et monstres affectés. + +Réduit instantanément la santé des joueurs, animaux et monstres affectés. + +Rend progressivement de la santé aux joueurs, animaux et monstres affectés. + +Rend les joueurs, animaux et monstres affectés résistants au feu, à la lave et aux attaques à distance des Blazes. + +Réduit progressivement la santé des joueurs, animaux et monstres affectés. + +Tranchant + +Châtiment + +Fléau des arthropodes + +Recul + +Aura de Feu + +Protection + +Protection contre le feu + +Chute amortie + +Protection contre les explosions + +Protection contre les projectiles + +Respiration + +Aisance aquatique + +Efficacité + +Délicatesse + +Solidité + +Butin + +Fortune + +Puissance + +Flamme + +Repoussoir + +Infinité + +I + +II + +III + +IV + +V + +VI + +VII + +VIII + +IX + +X + +Se mine à l'aide d'une pioche en fer (ou mieux) pour prélever des émeraudes. + +Semblable à un coffre normal, hormis que les objets placés dans un coffre du Néant sont récupérables dans tous les coffres du Néant du joueur, même dans une autre dimension. + +S'active quand une entité traverse un fil de déclenchement connecté. + +Active un crochet connecté quand une entité le traverse. + +Un moyen peu encombrant d'entreposer des émeraudes. + +Un muret en pierre taillée. + +Peut servir à réparer les armes, outils et armures. + +À fondre dans un four pour produire du quartz du Nether. + +Sert de décoration. + +À échanger avec les villageois. + +Sert de décoration. Vous pouvez y planter des fleurs, des pousses d'arbre, des cactus et des champignons. + +Restitue 2{*ICON_SHANK_01*}; transformable en carotte dorée. À planter dans une terre labourée. + +Restitue 0,5{*ICON_SHANK_01*}. À cuire dans un four. À planter dans une terre labourée. + +Restitue 3{*ICON_SHANK_01*}. Obtenu en cuisinant une pomme de terre dans un four. + +Restitue 1{*ICON_SHANK_01*} mais peut vous empoisonner. À cuire dans un four ou planter dans une terre labourée. + +Restitue 3{*ICON_SHANK_01*}. Se fabrique avec une carotte et des pépites d'or. + +Sert à contrôler un cochon sellé quand vous le montez. + +Restitue 4{*ICON_SHANK_01*}. + +À utiliser en conjonction avec une enclume pour enchanter des armes, outils ou armures. + +Se crée en minant du minerai de quartz du Nether dans un four. Peut produire un bloc de quartz. + +Se fabrique avec de la laine. Sert de décoration. + +Émeraude + +Pot de fleurs + +Carotte + +Pomme de terre + +Pomme de terre cuite + +Pomme de terre empoisonnée + +Carotte dorée + +Carotte sur un bâton + +Tarte à la citrouille + +Livre enchanté + +Quartz du Nether + +Minerai d'émeraude + +Coffre du Néant + +Crochet + +Fil de déclenchement + +Bloc d'émeraude + +Muret + +Muret moussu + +Pot de fleurs + +Carottes + +Pommes de terre + +Enclume + +Enclume + +Enclume légèrement abîmée + +Enclume très abîmée + +Minerai de quartz du Nether + +Bloc de quartz + +Bloc de quartz taillé + +Pilier de blocs de quartz + +Escalier en quartz + +Tapis + +Tapis noir + +Tapis rouge + +Tapis vert + +Tapis marron + +Tapis bleu + +Tapis violet + +Tapis cyan + +Tapis gris clair + +Tapis gris + +Tapis rose + +Tapis vert clair + +Tapis jaune + +Tapis bleu ciel + +Tapis magenta + +Tapis orange + +Tapis blanc + +Grès taillé + +Grès lisse + +{*PLAYER*} s'est fait tuer en tentant de frapper {*SOURCE*} + +{*PLAYER*} s'est fait écraser par la chute d'une enclume. + +{*PLAYER*} s'est fait écraser par la chute d'un bloc + +{*PLAYER*} s'est fait téléporter vers : {*DESTINATION*} + +{*PLAYER*} vient de vous téléporter jusqu'à son emplacement + +{*PLAYER*} vient de se téléporter jusqu'à vous + +Épines + +Dalle de quartz + +Les zones sombres apparaissent comme en plein jour, même sous l'eau. + +Les joueurs, animaux et monstres affectés deviennent invisibles. + +Réparer et nommer + +Coût : %d + +Trop cher ! + +Renommer + +Vous avez : + +Objets nécessaires à la transaction + +{*VILLAGER_TYPE*} propose %s + +Réparer + +Commercer + +Teindre le collier + + + Voici l'interface de l'enclume qui vous permet de renommer, réparer et appliquer des enchantements aux armes, armures ou outils, moyennant des niveaux d'expérience. + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur l'interface de l'enclume.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si l'interface de l'enclume n'a déjà plus de secrets pour vous. + + + + Pour commencer à travailler sur un objet, placez-le dans la première case. + + + + Placez la bonne matière première dans la deuxième case (par exemple des lingots de fer pour une épée en fer endommagée) et une proposition de réparation apparaîtra dans la case de résultat. + + + + Vous pouvez aussi placer un deuxième objet identique dans la deuxième case pour combiner les deux. + + + + Pour enchanter des objets sur l'enclume, placez un livre enchanté dans la deuxième case. + + + + Le nombre de niveaux d'expérience que coûte l'opération s'affiche sous le résultat. Si vous n'avez pas assez de niveaux d'expérience, l'opération ne peut pas aboutir. + + + + Il est possible de renommer l'objet en modifiant le nom qui s'affiche dans la case de texte. + + + + Quand vous ramassez l'objet réparé, les deux objets placés sur l'enclume sont consommés et vous perdez le nombre de niveaux d'expérience indiqué. + + + + Cette zone contient une enclume et un coffre renfermant des outils et armes à modifier. + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur l'enclume.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si l'enclume n'a déjà plus de secrets pour vous. + + + + Une enclume permet de réparer vos armes et outils afin de reconstituer leur durabilité, de les renommer ou de les enchanter à l'aide de livres enchantés. + + + + Vous pouvez trouver des livres enchantés dans les coffres des donjons, ou enchanter un livre normal sur la table d'enchantement. + + + + L'utilisation de l'enclume coûte des niveaux d'expérience et chaque utilisation est susceptible d'abîmer l'enclume. + + + + Le type d'opération, la valeur de l'objet, le nombre d'enchantements et la quantité de travail déjà effectué ont tous une incidence sur le coût des réparations. + + + + Quand vous renommez un objet, le nom qui s'affiche pour tous les joueurs est modifié et le coût du travail déjà effectué est réduit de façon définitive. + + + + Le coffre de cette zone contient des pioches abîmées, des matières premières, des fioles d'expérience ainsi que des livres enchantés pour vous permettre de faire des tests. + + + + Voici l'interface de commerce, qui affiche les transactions disponibles auprès d'un villageois. + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur l'interface de commerce.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si l'interface de commerce n'a déjà plus de secrets pour vous. + + + + Toutes les transactions que le villageois est disposé à effectuer en ce moment s'affichent en haut de l'écran. + + + + Les transactions apparaissent en rouge et sont indisponibles si vous n'avez pas les objets nécessaires. + + + + La quantité et le type d'objets que vous donnez au villageois s'affichent dans les deux cases à gauche. + + + + Vous pouvez voir le total des objets nécessaires à la transaction dans les deux cases à gauche. + + + + Appuyez sur{*CONTROLLER_VK_A*} pour échanger les objets que demande le villageois contre ce qu'il offre. + + + + Cette zone contient un villageois et un coffre renfermant du papier pour acheter des objets. + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur le commerce.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si le commerce n'a déjà plus de secrets pour vous. + + + + Les joueurs peuvent échanger des objets de leur inventaire avec les villageois. + + + + Les transactions qu'un villageois est susceptible de vous proposer dépendent de sa profession. + + + + Au fur et à mesure des transactions, l'éventail d'échanges proposés par le villageois est complété ou mis à jour aléatoirement. + + + + Les transactions effectuées fréquemment sont susceptibles d'être temporairement désactivées, mais le villageois en propose toujours au moins une. + + + + Prenez du papier dans le coffre et essayez de commercer avec le villageois. + + + + Cette zone contient deux coffres du Néant. + + + + {*B*} + Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les coffres du Néant.{*B*} + Appuyez sur{*CONTROLLER_VK_B*} si les coffres du Néant n'ont déjà plus de secrets pour vous. + + + + Tous les coffres du Néant d'un monde sont liés, y compris d'une dimension à l'autre. Les objets placés dans un coffre du Néant sont accessibles depuis n'importe quel autre coffre du Néant. + + + + Cependant, le contenu des coffres du Néant diffère pour chaque joueur. + + + + Il est ainsi possible de stocker des objets dans n'importe quel coffre du Néant pour ensuite les récupérer dans un autre situé ailleurs dans le monde. Testez ce principe en plaçant des objets dans l'un des deux coffres du Néant. + + +Restitue 2{*ICON_SHANK_01*}, régénère la santé pendant 30 secondes et octroie une résistance au feu ainsi qu'aux dégâts pendant 5 minutes. Fabriqué avec une pomme et des blocs d'or. + +Peut se téléporter + +Se téléporter + +Téléporter vers le joueur + +Téléporter vers moi + +Peut désactiver la fatigue + +Peut devenir invisible + +Vous pouvez maintenant activer l'invisibilité + +Vous ne pouvez plus activer l'invisibilité + +Vous pouvez maintenant activer la lévitation + +Vous ne pouvez plus activer la lévitation + +Vous pouvez maintenant désactiver la fatigue + +Vous ne pouvez plus désactiver la fatigue + +Vous pouvez maintenant vous téléporter + +Vous ne pouvez plus vous téléporter + +{*T3*}COMMENT JOUER : ENCLUME{*ETW*}{*B*}{*B*} +Vous pouvez également utiliser vos niveaux pour réparer, enchanter ou renommer un objet à l'aide de l'enclume.{*B*} +Il est possible de renommer tous les objets, mais seuls ceux disposant d'une durabilité peuvent être réparés ou enchantés à l'aide d'un livre enchanté.{*B*} +Pour réparer un objet, placez-le dans l'une des cases à gauche, accompagné de sa matière première (par exemple un lingot de fer pour une épée en fer) ou combiné à un autre objet de même type.{*B*} +Les combinaisons d'objets sont plus efficaces quand vous utilisez une enclume. En outre, si l'un des objets était déjà enchanté, le produit fini est susceptible de conserver les enchantements de l'un ou l'autre des objets d'origine.{*B*} +Les livres enchantés peuvent appliquer des enchantements aux objets en les combinant sur une enclume, tant que l'enchantement en question convient à l'objet. Vous pouvez trouver des livres enchantés dans les donjons, ou enchanter des livres normaux sur une table d'enchantement.{*B*} +Chaque utilisation de l'enclume est susceptible de l'abîmer. Après une certaine quantité de dégâts, elle devient inutilisable.{*B*} + + +{*T3*}COMMENT JOUER : COMMERCE{*ETW*}{*B*}{*B*} +Il est possible de faire du commerce avec les villageois. À chaque villageois correspond une profession : fermier, boucher, forgeron, bibliothécaire ou prêtre. Cette profession influe sur le type d'objets dont ils font le commerce.{*B*} +Vous trouverez une liste de toutes les transactions que propose un villageois dans le menu de commerce. Un villageois peut modifier ou compléter son panel d'objets quand un joueur commerce avec lui. Si une transaction spécifique est utilisée trop fréquemment, elle est susceptible d'être temporairement désactivée.{*B*} +Les transactions impliquent généralement d'acheter ou de vendre un certain nombre d'objets contre des émeraudes.{*B*} +Si vous ne possédez pas les objets nécessaires à une transaction, ces cases apparaissent en rouge.{*B*} + + +{*T3*}COMMENT JOUER : COFFRE DU NÉANT{*ETW*}{*B*}{*B*} +Tous les coffres du Néant d'un monde sont liés. Les objets placés dans un coffre du Néant sont accessibles dans n'importe quel autre. Cependant, le contenu des coffres du Néant diffère pour chaque joueur. Ainsi, les joueurs peuvent y stocker des objets et les récupérer dans d'autres coffres du Néant disséminés à travers le monde. + + +Fermier + +Bibliothécaire + +Prêtre + +Forgeron + +Boucher + +Présents dans les villages, les villageois vendent des objets au joueur selon leur profession. + +Grand coffre + + + Vous pouvez aussi créer des livres enchantés sur la table d'enchantement, livres dont vous pouvez ensuite appliquer l'enchantement à un objet sur l'enclume. + + + + Les crochets alimentent également en continu un circuit tant que quelque chose déclenche le fil connecté. + + + + Une fois apprivoisé, un loup porte toujours son collier, que vous pouvez teindre pour en changer la couleur. + + +Pour récolter des carottes et des pommes de terre, vous devez d'abord les planter. Elles sont prêtes à la récolte quand le légume pointe à la surface. + + + Vous pouvez aussi seller les cochons pour ensuite les chevaucher. Utilisez alors une carotte sur un bâton pour les diriger. + + + + Si nécessaire, vous pouvez déplacer lentement votre chariot de mine en utilisant {*CONTROLLER_ACTION_MOVE*}. Ceci vous aidera à lancer le chariot de mine en le mettant sur un rail alimenté. + + +Vous ne pouvez pas rejoindre cette partie car l'écran partagé n'est pris en charge qu'en mode Haute définition. Déconnectez tous les autres joueurs si vous désirez la rejoindre. + +Guérison + +Xbox 360 + +BACK + +Cette option désactive les mises à jour des succès et des classements pour le monde en cours ; ces mises à jour resteront désactivées si vous chargez ce monde après l'avoir sauvegardé avec cette option activée. + +Charger la sauvegarde pour Xbox One + +Charger la sauvegarde + +La zone de transfert de sauvegarde ne peut stocker qu'une seule sauvegarde Xbox 360 à la fois. Assurez-vous d'avoir téléchargé la sauvegarde sur votre console Xbox One avant de charger une autre sauvegarde Xbox 360. + +Chargement en cours... + +Chargement terminé ! + +Échec du chargement. Veuillez réessayer ultérieurement. + + diff --git a/Minecraft.Client/Common/Media/it-IT/4J_strings.resx b/Minecraft.Client/Common/Media/it-IT/4J_strings.resx new file mode 100644 index 00000000..18d7ab69 --- /dev/null +++ b/Minecraft.Client/Common/Media/it-IT/4J_strings.resx @@ -0,0 +1,108 @@ + +Non utilizzato + +OK + +Indietro + +Annulla + +Sì + +No + +Salvataggio danneggiato + +I dati salvati sono danneggiati. Vuoi creare un nuovo salvataggio, sovrascrivendo quello danneggiato? + +Spazio libero insufficiente + +La periferica di memorizzazione selezionata non dispone di spazio libero sufficiente per creare un salvataggio. + +Seleziona di nuovo + +Gioca senza salvare + +Crea un nuovo salvataggio + +Sovrascrivere? + +La periferica di memorizzazione selezionata contiene già questo salvataggio. Vuoi sovrascriverlo? + +No, non sovrascrivere + +Sovrascrivi e salva + +Salvataggio non riuscito + +Problema periferica + +La periferica di memorizzazione non è disponibile o si è verificato un errore. + +La periferica di memorizzazione non è disponibile o si è verificato un errore. Seleziona una nuova periferica di memorizzazione. + +Seleziona un'altra periferica + +Nessuna periferica selezionata + +Se non selezioni una periferica di memorizzazione, il salvataggio sarà disattivato. + +Seleziona una periferica + +Continua senza salvare + +La periferica di memorizzazione è stata rimossa. Selezionane un'altra. + +Caricamento non riuscito + +Nomina il salvataggio + +Inserisci un nome per il salvataggio + +Torna a Xbox Dashboard + +Vuoi davvero uscire dal gioco? + +Disconnesso + +Sei tornato alla schermata iniziale perché il tuo profilo giocatore si è disconnesso. + +La partita è terminata perché un profilo giocatore si è disconnesso. + +Continua a giocare + +Profilo giocatore non online + +Alcune funzionalità di questo gioco richiedono un profilo giocatore abilitato per Xbox Live, ma tu sei offline. + +Questa funzionalità richiede un profilo giocatore connesso a Xbox Live. + +Connettiti a Xbox Live + +Continua a giocare offline + +Problema assegnazione obiettivo + +Si è verificato un problema durante l'accesso al tuo profilo giocatore. Per il momento non è stato possibile sbloccare l'obiettivo. + +Problema profilo giocatore + +Salvataggio delle impostazioni sul profilo giocatore non riuscito. + +Profilo giocatore ospite + +Il profilo giocatore ospite non può accedere a questa funzionalità. Usa un altro profilo giocatore. + +Salvataggio... + +Salvataggio del contenuto. Non spegnere la console. + +Sblocca gioco completo + +Questa è una versione di prova di Minecraft. Se avessi il gioco completo, avresti sbloccato un obiettivo! +Sblocca il gioco completo per provare le gioie di Minecraft e per giocare con amici di tutto il mondo su Xbox Live. +Vuoi sbloccare il gioco completo? + +Verrai riportato al menu principale per un problema di lettura del tuo profilo. + + diff --git a/Minecraft.Client/Common/Media/it-IT/strings.resx b/Minecraft.Client/Common/Media/it-IT/strings.resx new file mode 100644 index 00000000..8082dfdc --- /dev/null +++ b/Minecraft.Client/Common/Media/it-IT/strings.resx @@ -0,0 +1,4461 @@ + +Sono disponibili nuovi contenuti scaricabili! Per accedervi, seleziona il pulsante Negozio di Minecraft nel menu principale. + +Puoi cambiare l'aspetto del tuo personaggio con il pacchetto Skin disponibile nel Negozio. Seleziona "Negozio di Minecraft" per sapere che cosa è disponibile. + +Se giochi in modalità Alta definizione, fino a quattro giocatori possono divertirsi a schermo diviso sulla stessa console! + +Collega i controller extra alla tua console e premi START su ciascuno per entrare in una partita in qualsiasi momento. + +Modifica le impostazioni gamma per aumentare o diminuire la luminosità del gioco. + +Impostando la difficoltà del gioco su Relax, la salute verrà reintegrata automaticamente e di notte non usciranno mostri! + +Dai un osso a un lupo per ammansirlo. Potrai chiedergli di sedersi o di seguirti. + +Per mettere degli oggetti nel menu Inventario, sposta il cursore dal menu e premi{*CONTROLLER_VK_A*} + +Se di notte dormi in un letto, il gioco scorrerà velocemente fino all'alba, ma tutti i giocatori in modalità multiplayer devono dormire in un letto contemporaneamente. + +Ottieni costolette di maiale dai maiali, cucinale e mangiale per reintegrare la salute. + +Ottieni della pelle dalle mucche e usala per costruire un'armatura. + +Se hai un secchio vuoto, puoi riempirlo di latte di mucca, acqua o lava! + +Usa una zappa per preparare un appezzamento di terreno pronto per la coltura. + +I ragni non attaccano durante il giorno, a meno che non vengano attaccati per primi. + +Se per scavare nella terra o nella sabbia usi una vanga invece delle mani farai più in fretta! + +Le costolette di maiale arrostite reintegrano più salute di quelle crude. + +Costruisci delle torce per fare luce durante la notte. I mostri staranno alla larga dalle aree illuminate. + +Arriva prima a destinazione con un carrello da miniera e un binario! + +Pianta degli arbusti e cresceranno fino a diventare alberi. + +Gli uomini-maiale non attaccano, a meno che non vengano attaccati per primi. + +Puoi modificare il punto di generazione del gioco e saltare all'alba dormendo in un letto. + +Rispondi all'attacco del ghast con queste palle di fuoco! + +Costruendo un portale potrai accedere a un'altra dimensione, il Sottomondo. + +Premi{*CONTROLLER_VK_B*} per far cadere l'oggetto che stai tenendo in mano! + +Usa l'attrezzo giusto per il lavoro giusto! + +Se non trovi il carbone per le torce, puoi sempre crearne un po' utilizzando gli alberi e la fornace. + +Scavare in linea retta verso l'alto o verso il basso non è una grande idea. + +La farina d'ossa (creata da un osso di scheletro) può essere utilizzata come fertilizzante e tutto crescerà in un istante! + +I creeper esplodono man mano che ti si avvicinano! + +L'ossidiana si crea quando l'acqua entra in contatto con un blocco di lava. + +Una volta rimosso il blocco di lava, servono alcuni minuti prima che quest'ultima scompaia COMPLETAMENTE. + +I ciottoli non subiscono danni dalle sfere di fuoco dei ghast, quindi sono utili per proteggere i portali. + +I blocchi utilizzabili come fonti di luce sciolgono neve e ghiaccio. Tra questi vi sono torce, pietre brillanti e zucche di Halloween. + +Fai attenzione quando costruisci strutture di lana all'aria aperta: i fulmini dei temporali possono incendiarle. + +Usa un secchio di lava in una fornace per fondere 100 blocchi. + +Lo strumento suonato dal blocco nota dipende dal materiale sottostante. + +Zombie e scheletri possono sopravvivere alla luce del giorno, se si trovano nell'acqua. + +Se attacchi un lupo, gli altri membri del suo branco si rivolteranno contro di te e ti assaliranno. Questo vale anche per gli uomini-maiali zombie. + +I lupi non possono accedere al Sottomondo. + +I lupi non attaccano i creeper. + +Le galline depongono uova a intervalli di 5-10 minuti. + +L'ossidiana si scava solo con una piccozza di diamante. + +I creeper sono la fonte di polvere da sparo più facile da ottenere. + +Colloca due casse vicine per creare una cassa grande. + +Lo stato di salute dei lupi addomesticati è riconoscibile dalla posizione della coda. Dagli della carne per curarli. + +Cuoci un cactus in una fornace per ottenere tintura verde. + +Segui 4J Studios e Kappische su twitter per le ultime notizie sul gioco! + +Fai bella figura con gli amici: pubblica su Facebook screenshot delle tue creazioni Minecraft dal menu di pausa nel gioco! + +Per le ultime informazioni sugli aggiornamenti del gioco, leggi la sezione Novità nei menu Come giocare. + +Il gioco ora contiene recinzioni impilabili! + +minecraftforum contiene una sezione dedicata alla Xbox 360 Edition. + +Alcuni animali ti seguiranno se hai del grano in mano. + +Se un animale non può spostarsi per più di 20 blocchi in qualsiasi direzione non sparirà. + +Musica di C418! + +Oltre un milione di persone seguono Notch su Twitter! + +Non tutti gli svedesi sono biondi. Alcuni, come Jens della Mojang, hanno addirittura i capelli rossi! + +Riteniamo che 4J Studios abbia rimosso Herobrine dal gioco per Xbox 360, ma non ne siamo sicuri. + +Presto verrà rilasciato un aggiornamento per questo gioco! + +Chi è Notch? + +La Mojang ha più premi che dipendenti! + +Alcune celebrità giocano a Minecraft! + +A deadmau5 piace Minecraft! + +Non guardare direttamente i bug. + +I creeper sono il risultato di un bug di codifica. + +È una gallina o un'anatra? + +Hai partecipato alla Minecon? + +Nessuno a Mojang ha mai visto una faccia del genere. + +Sapevi che c'è anche una Wiki di Minecraft? + +Il nuovo ufficio di Mojang è fico! + +Minecraft: Xbox 360 Edition ha battuto diversi record! + +La Minecon 2013 si è svolta a Orlando, Florida, negli Stati Uniti d'America! + +.party() è stato fantastico! + +Invece di dare credito ai pettegolezzi, dai sempre per scontato che siano falsi! + +{*T3*}COME GIOCARE: BASI{*ETW*}{*B*}{*B*} +In Minecraft si posizionano blocchi per costruire tutto ciò che vuoi. Di notte i mostri vagano in libertà, quindi costruisci un riparo per tempo.{*B*}{*B*} +Usa{*CONTROLLER_ACTION_LOOK*} per guardarti intorno.{*B*}{*B*} +Usa{*CONTROLLER_ACTION_MOVE*} per muoverti.{*B*}{*B*} +Premi{*CONTROLLER_ACTION_JUMP*} per saltare.{*B*}{*B*} +Sposta in avanti{*CONTROLLER_ACTION_MOVE*} due volte in rapida successione per scattare. Finché tieni premuto {*CONTROLLER_ACTION_MOVE*}, il personaggio continuerà a scattare, a meno che il tempo per lo scatto non si esaurisca o nella barra del cibo restino meno di{*ICON_SHANK_03*}.{*B*}{*B*} +Tieni premuto{*CONTROLLER_ACTION_ACTION*} per scavare e abbattere alberi usando la mano o un oggetto. Potresti dover creare un attrezzo per scavare i blocchi.{*B*}{*B*} +Se tieni un oggetto in mano, usa{*CONTROLLER_ACTION_USE*} per utilizzarlo, oppure premi{*CONTROLLER_ACTION_DROP*} per posarlo. + +{*T3*}COME GIOCARE: INTERFACCIA{*ETW*}{*B*}{*B*} +L'interfaccia mostra informazioni sul tuo stato: salute, ossigeno rimasto (quando sei sott'acqua), livello di fame (devi mangiare per reintegrare la barra) e armatura (se la indossi). Se subisci dei danni, ma nella tua barra del cibo ci sono 9 o più{*ICON_SHANK_01*}, la tua salute si ripristinerà automaticamente. Mangiare reintegrerà la barra del cibo.{*B*} +Qui è visualizzata anche la barra dell'esperienza, che mostra il tuo livello di Esperienza corrente e quanti punti Esperienza ti mancano per raggiungere il livello successivo. Guadagni punti Esperienza raccogliendo le sfere Esperienza abbandonate dai nemici uccisi, scavando certi tipi di blocchi, facendo riprodurre animali, pescando e fondendo minerali in una fornace.{*B*}{*B*} +L'interfaccia mostra anche gli oggetti disponibili. Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} e{*CONTROLLER_ACTION_RIGHT_SCROLL*} per cambiare l'oggetto che tieni in mano. + +{*T3*}COME GIOCARE: INVENTARIO{*ETW*}{*B*}{*B*} +Usa{*CONTROLLER_ACTION_INVENTORY*} per visualizzare l'inventario.{*B*}{*B*} +Questa schermata mostra gli oggetti che puoi tenere in mano e quelli che trasporti, nonché la tua eventuale armatura.{*B*}{*B*} +Usa{*CONTROLLER_MENU_NAVIGATE*} per muovere il puntatore. Usa{*CONTROLLER_VK_A*} per prendere l'oggetto sotto il puntatore. Se c'è più di un oggetto, verranno raccolti tutti; per raccoglierne solo la metà, premi{*CONTROLLER_VK_X*}.{*B*}{*B*} +Sposta l'oggetto in un'altra casella dell'inventario usando il puntatore e collocalo con{*CONTROLLER_VK_A*}. Se il puntatore ha selezionato più oggetti, usa{*CONTROLLER_VK_A*} per collocarli tutti oppure{*CONTROLLER_VK_X*} per collocarne uno solo.{*B*}{*B*} +Se il puntatore è posizionato su un'armatura, un aiuto contestuale ti consentirà di spostarla rapidamente nello slot appropriato dell'inventario.{*B*}{*B*} +Puoi cambiare il colore dell'armatura di pelle usando una tintura. Per farlo, prendi la tintura nell'inventario usando il puntatore, poi premi{*CONTROLLER_VK_X*} mentre il puntatore è sull'oggetto il cui colore desideri cambiare. + + +{*T3*}COME GIOCARE: CASSA{*ETW*}{*B*}{*B*} +Una volta creata una cassa, puoi collocarla nel mondo e usarla con{*CONTROLLER_ACTION_USE*} per conservare gli oggetti dell'inventario.{*B*}{*B*} +Usa il puntatore per spostare oggetti dall'inventario alla cassa e viceversa.{*B*}{*B*} +Gli oggetti nella cassa resteranno a tua disposizione e potrai riportarli nell'inventario in seguito. + + +{*T3*}COME GIOCARE: CASSA GRANDE{*ETW*}{*B*}{*B*} +Due casse collocate una accanto all'altra si combinano per formare una cassa grande in grado di contenere più oggetti.{*B*}{*B*} +Puoi usarla come la cassa normale. + + +{*T3*}COME GIOCARE: CRAFTING{*ETW*}{*B*}{*B*} +Nell'interfaccia Crafting, puoi combinare oggetti dell'inventario per creare nuovi tipi di oggetti. Usa{*CONTROLLER_ACTION_CRAFTING*} per aprire l'interfaccia Crafting.{*B*}{*B*} +Scorri le schede in alto usando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} per selezionare il tipo di oggetto, poi usa{*CONTROLLER_MENU_NAVIGATE*} per selezionare l'oggetto da creare.{*B*}{*B*} +L'area crafting mostra gli ingredienti richiesti per creare il nuovo oggetto. Premi{*CONTROLLER_VK_A*} per creare l'oggetto e inserirlo nell'inventario. + + +{*T3*}COME GIOCARE: TAVOLO DA LAVORO{*ETW*}{*B*}{*B*} +Puoi creare oggetti più grandi usando il tavolo da lavoro.{*B*}{*B*} +Colloca il tavolo nel mondo e premi{*CONTROLLER_ACTION_USE*} per usarlo.{*B*}{*B*} +La creazione al tavolo funziona come il crafting di base, ma hai a disposizione un'area più ampia e una più vasta selezione di oggetti da creare. + + +{*T3*}COME GIOCARE: FORNACE{*ETW*}{*B*}{*B*} +La fornace ti consente di modificare oggetti cuocendoli. Per esempio, nella fornace puoi trasformare il minerale di ferro in lingotti di ferro.{*B*}{*B*} +Colloca la fornace nel mondo e premi{*CONTROLLER_ACTION_USE*} per usarla.{*B*}{*B*} +Dovrai inserire del combustibile nella parte inferiore della fornace e l'oggetto da modificare nella parte superiore. A quel punto, la fornace si attiverà.{*B*}{*B*} +Una volta fusi i tuoi oggetti, puoi spostarli dall'area di produzione all'inventario.{*B*}{*B*} +Se il puntatore è posizionato su ingredienti o combustibili per la fornace, degli aiuti contestuali ti consentiranno di spostarli rapidamente nella fornace. + + +{*T3*}COME GIOCARE: DISPENSER{*ETW*}{*B*}{*B*} +Il dispenser serve per far uscire gli oggetti. Per attivare il dispenser, dovrai collocarvi accanto un interruttore, per esempio una leva.{*B*}{*B*} +Per riempire il dispenser di oggetti, premi{*CONTROLLER_ACTION_USE*}, quindi sposta gli oggetti desiderati dall'inventario al dispenser.{*B*}{*B*} +Ora, quando userai l'interruttore, il dispenser farà uscire un oggetto. + + +{*T3*}COME GIOCARE: DISTILLAZIONE{*ETW*}{*B*}{*B*} +Per distillare pozioni occorre munirsi di un Banco di distillazione, costruendolo presso un tavolo da lavoro. L'ingrediente principale di tutte le pozioni è una bottiglia d'acqua, che si ottiene riempiendo una Bottiglia di vetro con acqua attinta da un Calderone o da un'altra fonte.{*B*} +Il Banco di distillazione ha tre slot e permette di realizzare tre pozioni contemporaneamente. Dal momento che uno stesso ingrediente può essere usato in tutte e tre le bottiglie, è consigliabile produrre sempre tre pozioni insieme, in modo da ottimizzare l'uso delle risorse.{*B*} +Inserendo un ingrediente nella posizione più alta del Banco di distillazione si otterrà, dopo un breve periodo di tempo, una pozione di base. La pozione così ottenuta non ha alcun effetto; per renderla efficace, bisognerà distillare un secondo ingrediente.{*B*} +L'aggiunta di un terzo ingrediente può rendere l'effetto della pozione più durevole (se si usa Polvere di pietra rossa) o più intenso (se si usa Polvere di pietra brillante), o rendere nociva la pozione (se si usa un Occhio di ragno fermentato).{*B*} +Aggiungendo della polvere da sparo, si può trasformare una qualsiasi pozione in una Bomba pozione che, una volta lanciata, diffonderà il suo effetto nell'area colpita.{*B*} + +Gli ingredienti utilizzabili nelle pozioni sono :{*B*}{*B*} +* {*T2*}Verruca del Sottomondo{*ETW*}{*B*} +* {*T2*}Occhio di ragno{*ETW*}{*B*} +* {*T2*}Zucchero{*ETW*}{*B*} +* {*T2*}Lacrima di Ghast{*ETW*}{*B*} +* {*T2*}Polvere di Vampe{*ETW*}{*B*} +* {*T2*}Crema di magma{*ETW*}{*B*} +* {*T2*}Melone scintillante{*ETW*}{*B*} +* {*T2*}Polvere di pietra rossa{*ETW*}{*B*} +* {*T2*}Polvere di pietra brillante{*ETW*}{*B*} +* {*T2*}Occhio di ragno fermentato{*ETW*}{*B*}{*B*} + +Le combinazioni possibili sono numerose, e ognuna produce una pozione con un effetto diverso. + + +{*T3*}COME GIOCARE: INCANTESIMI{*ETW*}{*B*}{*B*} +I punti Esperienza guadagnati uccidendo i nemici, oppure scavando o fondendo in una fornace determinati tipi di blocchi, possono essere usati per incantare attrezzi, armi, armature e libri.{*B*} +Quando posizioni una Spada, un Arco, un'Ascia, una Piccozza, una Pala, un'Armatura o un Libro nello slot sotto il libro nel Tavolo per incantesimi, sui tre pulsanti a destra saranno visualizzati alcuni incantesimi e il livello di Esperienza che richiedono.{*B*} +Se hai abbastanza Esperienza per applicare un incantesimo all'oggetto, la cifra apparirà in verde; in caso contrario, apparirà in rosso.{*B*}{*B*} +L'incantesimo sarà selezionato casualmente in base al costo indicato.{*B*}{*B*} +Se il Tavolo per incantesimi è circondato da Scaffali (fino a un massimo di 15), con uno spazio pari a un blocco tra lo Scaffale e il Tavolo, la potenza degli incantesimi aumenterà e dal libro posto sul Tavolo scaturiranno dei simboli arcani.{*B*}{*B*} +Tutti gli ingredienti per un Tavolo per incantesimi possono essere trovati nei villaggi oppure ottenuti scavando e coltivando.{*B*}{*B*} +I Libri incantati si usano con l'incudine per lanciare incantesimi sugli oggetti. In questo modo avrai maggiori possibilità di scegliere gli incantesimi di cui vuoi che i tuoi oggetti siano dotati.{*B*} + + +{*T3*}COME GIOCARE: ALLEVARE GLI ANIMALI{*ETW*}{*B*}{*B*} +Se vuoi che gli animali rimangano nel solito posto, crea una zona recintata di 20x20 blocchi e sistema gli animali là dentro. In questo modo sarai sicuro di ritrovarli dove li hai lasciati. + + +{*T3*}COME GIOCARE: RIPRODUZIONE{*ETW*}{*B*}{*B*} +Gli animali di Minecraft possono riprodursi e dar vita a versioni in miniatura di se stessi!{*B*} +Per far riprodurre un animale, devi prima farlo entrare in "modalità Amore" nutrendolo con l'alimento adatto.{*B*} +Dai Grano a una mucca, muccafungo o pecora, Carote ai maiali, Semi di grano o Verruche del Sottomondo a una gallina, o qualsiasi tipo di carne a un lupo, e cominceranno a cercare nei dintorni un altro animale della stessa specie che sia a sua volta in modalità Amore.{*B*} +Quando l'avrà trovato, i due si scambieranno effusioni per qualche secondo e poi apparirà un cucciolo. Il piccolo seguirà i genitori per un certo periodo di tempo prima di diventare adulto.{*B*} +Devono passare circa cinque minuti prima che un animale possa entrare nuovamente in modalità Amore.{*B*} +C'è un limite al numero di animali che si può avere in un mondo, e questo potrebbe essere il motivo per cui non si riproducono. + +{*T3*}COME GIOCARE: SOTTOPORTALE{*ETW*}{*B*}{*B*} +Il sottoportale consente al giocatore di spostarsi tra il Sopramondo e il Sottomondo. Il Sottomondo serve per viaggiare velocemente nel Sopramondo: una distanza di un blocco nel Sottomondo equivale a 3 blocchi nel Sopramondo, quindi quando costruisci un portale nel Sottomondo e lo usi per uscire, ti troverai a una distanza triplicata rispetto al punto di entrata.{*B*}{*B*} +La costruzione del portale richiede un minimo di 10 blocchi di ossidiana. Il portale deve essere alto 5 blocchi, largo 4 e profondo 1. Una volta costruita la struttura del portale, lo spazio interno dev'essere incendiato per attivarlo. Per farlo, usa pietra focaia e acciarino oppure l'oggetto Scarica di fuoco.{*B*}{*B*} +L'immagine a destra mostra alcuni esempi di costruzione di un portale. + + +{*T3*}COME GIOCARE: MULTIPLAYER{*ETW*}{*B*}{*B*} +Minecraft per Xbox 360 è un gioco multiplayer per impostazione predefinita. Se giochi in alta definizione, puoi aggiungere giocatori locali alla partita collegando altri controller e premendo START in qualsiasi momento.{*B*}{*B*} +Quando avvii o accedi a una partita online, essa sarà visibile alle persone incluse nella tua lista amici (a meno che, come host, tu non abbia selezionato l'opzione "Solo invito") e, se entreranno nella partita, essa sarà visibile alle persone incluse nella loro lista amici (se hai selezionato l'opzione "Accetta amici di amici"){*B*} +Durante una partita, premi il pulsante BACK per richiamare un elenco di tutti i giocatori e visualizzarne la scheda giocatore, e per espellere o invitare altri utenti. + + +{*T3*}COME GIOCARE: CONDIVISIONE DI SCREENSHOT{*ETW*}{*B*}{*B*} +Puoi salvare uno screenshot del gioco visualizzando il menu di pausa e premendo{*CONTROLLER_VK_Y*} per condividerlo su Facebook. Apparirà un'anteprima in miniatura dello screenshot e potrai modificare il testo associato al post di Facebook.{*B*}{*B*} +Esiste una modalità fotografica appositamente progettata per il salvataggio di screenshot, che ti consente di vedere il tuo personaggio frontalmente: premi{*CONTROLLER_ACTION_CAMERA*} finché non vedi la parte frontale del personaggio, poi premi{*CONTROLLER_VK_Y*} per condividere.{*B*}{*B*} +I gamertag non vengono visualizzati nello screenshot. + + +{*T3*}COME GIOCARE: ESCLUSIONE DI LIVELLI{*ETW*}{*B*}{*B*} +Se trovi dei contenuti offensivi all'interno di un livello che stai giocando, puoi scegliere di aggiungere questo livello all'elenco dei livelli esclusi. +Per farlo, visualizza il menu di pausa, quindi premi{*CONTROLLER_VK_RB*} per selezionare lo strumento Escludi livello. +Quando tenterai di accedere a questo livello in futuro, verrà visualizzata una notifica per segnalarti che quel livello fa parte dell'elenco dei livelli esclusi e potrai scegliere se annullare l'operazione o rimuovere il livello dall'elenco e accedervi. + +{*T3*}COME GIOCARE: MODALITÀ CREATIVA{*ETW*}{*B*}{*B*} +L'interfaccia della modalità Creativa consente al giocatore di spostare nel proprio inventario qualsiasi oggetto senza doverlo scavare o creare. +Gli oggetti presenti nell'inventario non saranno rimossi quando vengono posizionati o usati nel mondo; in questo modo, il giocatore non dovrà preoccuparsi di raccogliere risorse e potrà concentrarsi sulla costruzione.{*B*} +Se crei, carichi o salvi un mondo in modalità Creativa, gli obiettivi e gli aggiornamenti di classifica saranno disabilitati e lo resteranno anche se quel mondo verrà successivamente caricato in modalità Sopravvivenza.{*B*} +Per volare mentre sei in modalità Creativa, premi rapidamente {*CONTROLLER_ACTION_JUMP*} due volte. Ripeti l'azione per interrompere il volo. Per volare più rapidamente, sposta in avanti{*CONTROLLER_ACTION_MOVE*} due volte in rapida successione mentre stai volando. +Durante il volo, puoi tenere premuto{*CONTROLLER_ACTION_JUMP*} per salire e{*CONTROLLER_ACTION_SNEAK*} per scendere, oppure usare{*CONTROLLER_ACTION_DPAD_UP*} per salire e {*CONTROLLER_ACTION_DPAD_DOWN*} per scendere, +{*CONTROLLER_ACTION_DPAD_LEFT*} per andare a sinistra e {*CONTROLLER_ACTION_DPAD_RIGHT*} per andare a destra. + +{*T3*}COME GIOCARE: OPZIONI DELL'HOST E DEL GIOCATORE{*ETW*}{*B*}{*B*} + +{*T1*}Opzioni di gioco{*ETW*}{*B*} +Quando carichi o crei un mondo, se premi il pulsante "Altre opzioni" accederai a un menu che ti consente di avere maggior controllo sul gioco.{*B*}{*B*} + + {*T2*}Giocatore vs Giocatore{*ETW*}{*B*} + Se l'opzione è attivata, è possibile infliggere danni agli altri giocatori. Quest'opzione ha effetto esclusivamente nella modalità Sopravvivenza.{*B*}{*B*} + + {*T2*}Autorizza giocatori{*ETW*}{*B*} + Se l'opzione non è attivata, i giocatori che si uniscono alla partita non potranno svolgere determinate azioni, come scavare, usare oggetti, posizionare blocchi, utilizzare porte, interruttori e contenitori, attaccare gli altri giocatori o gli animali. È possibile modificare le opzioni dei singoli giocatori accedendo al menu di gioco.{*B*}{*B*} + + {*T2*}Diffusione incendio{*ETW*}{*B*} + Se l'opzione è attivata, il fuoco può propagarsi ai blocchi infiammabili vicini. Quest'opzione può essere modificata anche durante il gioco.{*B*}{*B*} + + {*T2*}Esplosione TNT{*ETW*}{*B*} + Se l'opzione è attivata, il TNT esplode quando viene fatto detonare. Quest'opzione può essere modificata anche durante il gioco.{*B*}{*B*} + + {*T2*}Privilegi dell'host{*ETW*}{*B*} + Se l'opzione è abilitata, l'host, tramite il menu di gioco, può attivare o disattivare la possibilità di volare, disabilitare la stanchezza e rendersi invisibile. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + +{*T1*}Opzioni di generazione del mondo{*ETW*}{*B*} +Quando crei un nuovo mondo, sono disponibili alcune opzioni aggiuntive.{*B*}{*B*} + + {*T2*}Genera strutture{*ETW*}{*B*} + Se l'opzione è abilitata, nel mondo saranno generate strutture come Villaggi e Fortezze.{*B*}{*B*} + + {*T2*}Mondo superpiatto{*ETW*}{*B*} + Se l'opzione è attivata, sarà generato un mondo completamente piatto, sia nel Sopramondo sia nel Sottomondo.{*B*}{*B*} + + {*T2*}Cassa bonus{*ETW*}{*B*} + Se l'opzione è attivata, vicino al punto di generazione del giocatore apparirà una cassa contenente alcuni oggetti utili.{*B*}{*B*} + + {*T1*}Resetta Sottomondo{*ETW*}{*B*} + Quando è attivato, il Sottomondo sarà rigenerato. Questa funzionalità può essere molto utile se hai dei vecchi salvataggi in cui le Fortezze del Sottomondo non erano presenti.{*B*}{*B*} + + {*T1*}Opzioni di gioco{*ETW*}{*B*} + Durante la partita, premi BACK per aprire il menu di gioco, dove potrai accedere a diverse opzioni.{*B*}{*B*} + + {*T2*}Opzioni host{*ETW*}{*B*} + L'host e tutti i giocatori identificati come moderatori possono accedere al menu "Opzioni host", nel quale avranno la possibilità di abilitare o disabilitare le opzioni "Diffusione incendio" ed "Esplosione TNT".{*B*}{*B*} + +{*T1*}Opzioni del giocatore{*ETW*}{*B*} +Per modificare i privilegi di un giocatore, seleziona il suo nome e premi{*CONTROLLER_VK_A*} per accedere al menu dei privilegi del giocatore, dove potrai agire sulle seguenti opzioni.{*B*}{*B*} + + {*T2*}Può costruire e scavare{*ETW*}{*B*} + Quando quest'opzione è abilitata, il giocatore può interagire con il mondo normalmente. Se, invece, l'opzione è disattivata, il giocatore non può posizionare né distruggere blocchi e non potrà interagire con oggetti e blocchi di vario tipo. Quest'opzione è disponibile solo se "Autorizza giocatori" è disattivata.{*B*}{*B*} + + {*T2*}Può usare porte e interruttori{*ETW*}{*B*} + Se disattivata, il giocatore non sarà in grado di usare né le porte né gli interruttori. Quest'opzione è disponibile solo se "Autorizza giocatori" è disattivata.{*B*}{*B*} + + {*T2*}Può aprire contenitori{*ETW*}{*B*} + Se disattivata, il giocatore non sarà in grado di aprire i contenitori, come le casse. Quest'opzione è disponibile solo se "Autorizza giocatori" è disattivata.{*B*}{*B*} + + {*T2*}Può attaccare i giocatori{*ETW*}{*B*} + Se disattivata, impedisce al giocatore di causare danni agli altri utenti. Quest'opzione è disponibile solo se "Autorizza giocatori" è disattivata.{*B*}{*B*} + + {*T2*}Può attaccare animali{*ETW*}{*B*} + Se disattivata, il giocatore non sarà in grado di infliggere danni agli animali. Quest'opzione è disponibile solo se "Autorizza giocatori" è disattivata.{*B*}{*B*} + + {*T2*}Moderatore{*ETW*}{*B*} + Se quest'opzione è attivata, il giocatore potrà modificare i privilegi degli altri utenti, fatta eccezione per l'host, a patto che "Autorizza giocatori" sia disabilitata. Inoltre, il giocatore potrà espellere gli altri utenti e modificare le opzioni relative alla diffusione degli incendi e all'esplosione del TNT.{*B*}{*B*} + + {*T2*}Espelli giocatore{*ETW*}{*B*} + Selezionando quest'opzione, è possibile espellere qualsiasi giocatore che non si trova sulla console {*PLATFORM_NAME*} dell'host e tutti gli altri utenti eventualmente collegati tramite la console {*PLATFORM_NAME*} del giocatore espulso. I giocatori espulsi non potranno rientrare prima che la partita sia riavviata.{*B*}{*B*} + +{*T1*}Opzioni del giocatore host{*ETW*}{*B*} +Se l'opzione "Privilegi dell'host" è attivata, l'host può modificare da solo alcuni privilegi. Per modificare i privilegi di un giocatore, seleziona il suo nome e premi {*CONTROLLER_VK_A*} per aprire il menu dei privilegi del giocatore e accedere alle seguenti opzioni.{*B*}{*B*} + + {*T2*}Può volare{*ETW*}{*B*} + Se l'opzione è attivata, il giocatore è in grado di volare. L'opzione ha effetto esclusivamente sulla modalità Sopravvivenza, perché in modalità Creativa, tutti i giocatori possono volare.{*B*}{*B*} + + {*T2*}Disabilita stanchezza{*ETW*}{*B*} + L'opzione ha effetto esclusivamente sulla modalità Sopravvivenza. Se attivata, le attività fisiche (camminare, correre, saltare e altre ancora) non fanno diminuire la barra del cibo. Tuttavia, se il giocatore viene ferito, la barra del cibo diminuirà lentamente man mano che il giocatore guarisce.{*B*}{*B*} + + {*T2*}Invisibile{*ETW*}{*B*} + Se l'opzione è abilitata, il giocatore è invulnerabile e gli altri utenti non possono vederlo.{*B*}{*B*} + + {*T2*}Può usare il teletrasporto{*ETW*}{*B*} + Permette al giocatore di spostare sé stesso o gli altri utenti, raggiungendo altri giocatori presenti nel mondo. + + +Pagina successiva + +Pagina precedente + +Basi + +Interfaccia + +Inventario + +Casse + +Crafting + +Fornace + +Dispenser + +Allevare gli animali + +Riproduzione animali + +Distillazione + +Incantesimi + +Sottoportale + +Multiplayer + +Condivisione di screenshot + +Esclusione di livelli + +Modalità Creativa + +Opzioni dell'host e del giocatore + +Commercio + +Incudine + +Limite + +{*T3*}COME GIOCARE : IL LIMITE{*ETW*}{*B*}{*B*} +Il Limite è un'altra dimensione del gioco, che può essere raggiunta tramite un Portale del Limite attivo. Il Portale del Limite si trova in una fortezza posta nelle profondità sotterranee del Sopramondo.{*B*} +Per attivare il portale è necessario inserire un Occhio di Ender nei Telai del Portale del Limite che non ne hanno uno.{*B*} +Una volta che il Portale del Limite è attivo, ti basterà attraversarlo per raggiungere il Limite.{*B*}{*B*} +Nel Limite incontrerai il Drago di Ender, nemico forte e fiero, oltre agli Enderman, quindi dovrai prepararti a dovere prima di intraprendere il viaggio!{*B*}{*B*} +Scoprirai che, per rigenerarsi, il Drago di Ender usa i Cristalli di Ender che si trovano su otto punte di ossidiana, +quindi la prima cosa che dovrai fare è distruggere tutti i cristalli.{*B*} +Puoi colpire i primi con le frecce, ma i successivi sono protetti da una gabbia di metallo, e quindi dovrai trovare il modo di avvicinarti.{*B*}{*B*} +Nel frattempo, il Drago di Ender ti attaccherà dall'alto e ti lancerà contro delle sfere di acido!{*B*} +Se ti avvicini al piedistallo dell'uovo posto al centro delle punte, il Drago di Ender scenderà in picchiata per affrontarti: quello sarà il momento giusto per attaccarlo e infliggergli pesanti danni!{*B*} +Evita l'acido e mira agli occhi del Drago di Ender per ottenere i risultati migliori. Se puoi, porta degli amici con te nel Limite, così ti aiuteranno a trionfare in questa difficile battaglia!{*B*}{*B*} +Una volta che sarai nel Limite, i tuoi amici potranno vedere sulla loro mappa l'ubicazione del Portale del Limite nella Fortezza, +così saranno in grado di raggiungerti facilmente. + + +Scatto + +Novità + + +{*T3*}Modifiche e aggiunte{*ETW*}{*B*}{*B*} +- Nuovi oggetti: smeraldi, minerale di smeraldo, blocco di smeraldo, forziere di Ender, gancio a filo, mela d'oro incantata, incudine, vaso di fiori, muro di ciottoli, muro di ciottoli coperto di muschio, quadro sbiadito, patata, patata arrostita, patata velenosa, carota, carota d'oro, carota e bastone, +torta di zucca, pozione della visione notturna, pozione dell'invisibilità, quarzo del Sottomondo, minerale di quarzo del Sottomondo, blocco di quarzo, lastra di quarzo, scala di quarzo, blocco cesellato di quarzo, blocco portante di quarzo, libro incantato, tappeto.{*B*} +- Nuove ricette per arenaria liscia e arenaria cesellata.{*B*} +- Nuovi nemici: abitanti del villaggio zombie.{*B*} +- Nuove caratteristiche per la generazione del mondo: templi nel deserto, villaggi nel deserto, templi nella giungla.{*B*} +- Aggiunta la possibilità di commerciare con gli abitanti dei villaggi.{*B*} +- Aggiunta l'interfaccia incudine.{*B*} +- Il colore delle armature di pelle può essere cambiato usando le tinture.{*B*} +- Il colore dei collari dei lupi può essere cambiato usando le tinture.{*B*} +- I maiali possono essere controllati usando bastone e carota quando li si cavalca.{*B*} +- Il contenuto dei forzieri bonus è stato aggiornato con altri oggetti.{*B*} +- La posizione dei mezzi blocchi e degli altri blocchi sui mezzi blocchi è stata modificata.{*B*} +- La posizione delle scale e delle lastre al contrario è stata modificata.{*B*} +- Sono stati aggiunti mestieri diversi per gli abitanti dei villaggi.{*B*} +- Gli abitanti dei villaggi nati da un uovo generazione svolgono mestieri scelti in modo casuale.{*B*} +- È stata aggiunta la possibilità di posizionare i tronchi di legno in orizzontale.{*B*} +- Gli attrezzi di legno possono essere usati come combustibile nelle fornaci.{*B*} +- Le lastre di vetro e quelle di ghiaccio possono essere raccolte con attrezzi dotati dell'incantesimo "Tocco di seta".{*B*} +- Le piastre a pressione di legno e i pulsanti di legno possono essere attivati con le frecce.{*B*} +- I nemici del Sottomondo possono essere generati nel Sopramondo tramite i portali.{*B*} +- I creeper e i ragni sono aggressivi nei confronti del giocatore che li ha colpiti per ultimo.{*B*} +- I nemici in modalità Creativa tornano a essere neutrali dopo un breve periodo.{*B*} +- È stato rimosso l'atterramento in caso di annegamento.{*B*} +- Le porte rotte dagli zombie mostrano i segni dei danni subiti.{*B*} +- Il ghiaccio si scioglie nel Sottomondo.{*B*} +- I calderoni si riempiono d'acqua sotto la pioggia.{*B*} +- I pistoni impiegano il doppio del tempo per tornare al punto di partenza.{*B*} +- In caso siano sellati, i maiali lasciano cadere la sella quando sono uccisi.{*B*} +- Il colore del cielo nel Limite è stato cambiato.{*B*} +- È possibile posizionare corde (per i ganci a filo).{*B*} +- Le gocce di pioggia filtrano tra le foglie.{*B*} +- Le leve possono essere posizionate sulla parte inferiore dei blocchi.{*B*} +- Il TNT infligge danni che variano in base al livello di difficoltà.{*B*} +- La ricetta del libro è stata cambiata.{*B*} +- Le barche rompono le ninfee (le ninfee non rompono più le barche).{*B*} +- I maiali fanno guadagnare un maggior numero di costolette di maiale.{*B*} +- Sono generati meno slime nei mondi superpiatti.{*B*} +- I creeper infliggono una quantità di danni variabile in base al livello di difficoltà, ma l'atterramento è aumentato.{*B*} +- È stato risolto il problema degli Enderman che non aprono le mascelle.{*B*} +- È stato aggiunto il teletrasporto per i giocatori (usando il menu BACK durante il gioco).{*B*} +- Sono state aggiunte opzioni host per il volo, l'invisibilità e l'invulnerabilità per i giocatori in remoto.{*B*} +- Nel mondo tutorial sono stati aggiunti altri tutorial che spiegano nuovi oggetti e caratteristiche del gioco.{*B*} +- Le posizioni dei forzieri dei dischi nel mondo tutorial sono state aggiornate.{*B*} + + +{*ETB*}Bentornato! Forse non lo sai, ma Minecraft è appena stato aggiornato.{*B*}{*B*} +Abbiamo aggiunto tante nuove funzionalità per te e i tuoi amici: di seguito troverai elencate quelle principali. Dai un'occhiata e corri a divertirti!{*B*}{*B*} +{*T1*}Nuovi oggetti{*ETB*} - Smeraldi, minerale di smeraldo, blocco di smeraldo, forziere di Ender, gancio a filo, mela d'oro incantata, incudine, vaso di fiori, muro di ciottoli, muro di ciottoli coperto di muschio, quadro sbiadito, patata, patata arrostita, patata velenosa, carota, carota d'oro, carota e bastone, +torta di zucca, pozione della visione notturna, pozione dell'invisibilità, quarzo del Sottomondo, minerale di quarzo del Sottomondo, blocco di quarzo, lastra di quarzo, scala di quarzo, blocco cesellato di quarzo, blocco portante di quarzo, libro incantato, tappeto.{*B*}{*B*} + {*T1*}Nuovi nemici{*ETB*} - Abitanti del villaggio zombie.{*B*}{*B*} +{*T1*}Nuove funzioni di gioco{*ETB*} - Commercia con gli abitanti dei villaggi, ripara e incanta armi e attrezzi con l'incudine, custodisci oggetti nei forzieri di Ender, controlla il maiale che cavalchi usando bastone e carota!{*B*}{*B*} +{*T1*}Nuovi mini tutorial{*ETB*} – Impara a usare le nuove funzioni di gioco nel mondo tutorial!{*B*}{*B*} +{*T1*}Nuove "sorprese nascoste"{*ETB*} – Abbiamo cambiato la posizione di tutti i dischi segreti nel mondo tutorial. Vediamo se riesci a trovarli di nuovo!{*B*}{*B*} + + +Infligge un danno maggiore della mano. + +Serve per scavare terra, erba, sabbia, ghiaia e neve più in fretta che a mano. Le pale servono per scavare palle di neve. + +Serve per scavare blocchi di pietra e minerali. + +Si usa per abbattere blocchi di legno più in fretta che a mano. + +Si usa per arare blocchi di terra ed erba e prepararli per il raccolto. + +Le porte di legno si attivano usandole, colpendole o con una pietra rossa. + +Le porte di ferro si aprono solo con pietra rossa, pulsanti o interruttori. + +NOT USED + +NOT USED + +NOT USED + +NOT USED + +Si indossa per ottenere 1 punto armatura. + +Si indossano per ottenere 3 punti armatura. + +Si indossa per ottenere 2 punti armatura. + +Si indossa per ottenere 1 punto armatura. + +Si indossa per ottenere 2 punti armatura. + +Si indossa per ottenere 5 punti armatura. + +Si indossa per ottenere 4 punti armatura. + +Si indossa per ottenere 1 punto armatura. + +Si indossa per ottenere 2 punti armatura. + +Si indossa per ottenere 6 punti armatura. + +Si indossa per ottenere 5 punti armatura. + +Si indossa per ottenere 2 punti armatura. + +Si indossa per ottenere 2 punti armatura. + +Si indossa per ottenere 5 punti armatura. + +Si indossano per ottenere 3 punti armatura. + +Si indossa per ottenere 1 punto armatura. + +Si indossano per ottenere 3 punti armatura. + +Si indossa per ottenere 8 punti armatura. + +Si indossa per ottenere 6 punti armatura. + +Si indossano per ottenere 3 punti armatura. + +Lingotto lucente utilizzabile per creare oggetti di questo materiale. Si crea fondendo minerali nella fornace. + +Consente di trasformare lingotti, gemme o tinture in blocchi collocabili. Si può usare come blocco da costruzione costoso o come magazzino compatto per minerali. + +Quando un giocatore, un animale o un mostro ci passa sopra, prende la scossa. La piastra a pressione di legno si attiva anche facendoci cadere sopra qualcosa. + +Si usa per le scale compatte. + +Si usa per creare scale lunghe. Due lastre una sopra l'altra creano un blocco doppio di dimensioni normali. + +Si usa per costruire scale lunghe. Due lastre poste l'una sull'altra creano un blocco da due lastre di dimensioni normali. + +La torcia si usa per fare luce, nonché per sciogliere neve e ghiaccio. + +Si usano come materiali da costruzione e per creare diversi oggetti. Si possono creare da qualsiasi forma di legno. + +Si usa come materiale da costruzione. Non subisce la gravità come la sabbia normale. + +Si usa come materiale da costruzione. + +Si usa per creare torce, frecce, cartelli, scale a pioli, recinzioni e come maniglia per attrezzi e armi. + +Si usa per far avanzare il tempo dalla notte al mattino, se tutti i giocatori nel mondo sono a letto. Cambia il punto di generazione del giocatore. +I colori sono sempre gli stessi, qualunque sia la lana usata. + +Consente di creare una selezione di oggetti più vasta rispetto alla normale schermata crafting. + +Consente di fondere minerali, creare antracite e vetro e cuocere pesce e costolette di maiale. + +Vi si possono conservare blocchi e oggetti. Colloca due casse una accanto all'altra per creare una cassa grande dalla capacità doppia. + +Si usa come barriera impenetrabile. Vale come 1,5 blocchi di altezza per giocatori, animali e mostri, ma come 1 solo blocco di altezza per gli altri blocchi. + +Si usa per salire in verticale. + +Si attiva usandola, colpendola o con una pietra rossa. Funziona come una porta normale, ma è un blocco di 1x1 appiattito sul terreno. + +Mostra il testo scritto da te o da altri giocatori. + +Fa più luce della torcia. Scioglie ghiaccio e neve e si può usare anche sott'acqua. + +Si usa per provocare esplosioni. Una volta collocato, si attiva accendendolo con un oggetto acciarino e pietra focaia, o con una scarica elettrica. + +Serve per conservare la zuppa di funghi. Una volta mangiata, la ciotola rimane. + +Si usa per contenere e trasportare acqua, lava e latte. + +Si usa per contenere e trasportare acqua. + +Si usa per contenere e trasportare lava. + +Si usa per contenere e trasportare latte. + +Si usa per creare il fuoco, accendere TNT e aprire un portale dopo averlo costruito. + +Si usa per pescare. + +Mostra la posizione del sole e della luna. + +Indica il punto iniziale. + +Mentre la tieni in mano, crea un'immagine di un'area esplorata. Può essere utile per orientarti. + +Consente attacchi a distanza con le frecce. + +Si usa come munizione per l'arco. + +Reintegra 2,5{*ICON_SHANK_01*}. + +Reintegra 1{*ICON_SHANK_01*}. Utilizzabile 6 volte. + +Reintegra 1{*ICON_SHANK_01*}. + +Reintegra 1{*ICON_SHANK_01*}. + +Fa recuperare 3 {*ICON_SHANK_01*}. + +Reintegra 1{*ICON_SHANK_01*}, o può essere cucinato nella fornace. Può farti star male. + +Reintegra 3{*ICON_SHANK_01*}. Si crea cucinando il pollo crudo nella fornace. + +Reintegra 1,5{*ICON_SHANK_01*}, o può essere cucinato in una fornace. + +Reintegra 4{*ICON_SHANK_01*}. Si crea cucinando il manzo crudo nella fornace. + +Reintegra 1,5{*ICON_SHANK_01*} o si può cucinare nella fornace. + +Reintegra 4{*ICON_SHANK_01*}. Si crea cucinando una costoletta di maiale in una fornace. + +Reintegra 1{*ICON_SHANK_01*} o si può cucinare in una fornace. Può essere dato a un ocelot per ammansirlo. + +Reintegra 2,5{*ICON_SHANK_01*}. Si crea cucinando pesce crudo in una fornace. + +Reintegra 2{*ICON_SHANK_01*} e si può usare per creare una mela d'oro. + +Reintegra 2{*ICON_SHANK_01*} e rigenera la salute per 4 secondi. Si crea usando una mela e dalle pepite d'oro. + +Reintegra 2{*ICON_SHANK_01*}, ma può avvelenarti. + +Si usa nella ricetta per la torta come ingrediente per preparare pozioni. + +Accendila o spegnila per generare una scarica elettrica. Rimane accesa o spenta finché non la premi di nuovo. + +Invia costantemente una scarica elettrica e si può usare anche come ricevitore/trasmettitore se collegata a un lato del blocco. +È anche una debole fonte di illuminazione. + +Si usa nei circuiti a pietre rosse come ripetitore, ritardante e/o diodo. + +Premilo per generare una scarica elettrica. Rimane attivo per circa un secondo prima di spegnersi di nuovo. + +Si usa per conservare e distribuire oggetti in ordine casuale quando riceve una carica di pietra rossa. + +Quando si attiva, suona una nota. Colpiscilo per cambiare tonalità. Mettilo sopra blocchi diversi per cambiare il tipo di strumento. + +Si usano per guidare i carrelli da miniera. + +Accesi, fanno accelerare i carrelli da miniera che ci passano sopra. Spenti, fanno fermare i carrelli da miniera. + +Funzionano come la piastra a pressione (inviano un segnale pietra rossa mentre sono in funzione) ma sono attivabili solo dal carrello da miniera. + +Trasporta te, un animale o un mostro sui binari. + +Si usa per trasportare merci sui binari. + +Si muove sui binari e spinge altri carrelli da miniera se ci metti del carbone. + +Si usa per spostarsi nell'acqua più velocemente che a nuoto. + +Si ottiene dalle pecore e si può colorare con le tinture. + +Si usa come materiale da costruzione e si può colorare con le tinture. Ricetta sconsigliata, in quanto la lana è facilmente ottenibile dalle pecore. + +Si usa come tintura per creare lana nera. + +Si usa come tintura per creare lana verde. + +Si usano come tintura per creare lana marrone, come ingrediente per preparare biscotti e per far crescere frutti di cacao. + +Si usa come tintura per creare lana argento. + +Si usa come tintura per creare lana gialla. + +Si usa come tintura per creare lana rossa. + +Si usa per far crescere immediatamente colture, alberi, erba alta, funghi giganti e fiori e si impiega nelle ricette delle tinture. + +Si usa come tintura per creare lana rosa. + +Si usa come tintura per creare lana arancione. + +Si usa come tintura per creare lana verde lime. + +Si usa come tintura per creare lana grigia. + +Usata come tintura per la lana grigio chiaro. +(Nota: si può anche preparare con tintura grigia e farina d'ossa, avendone quattro per sacca di inchiostro, invece di tre.) + +Si usa come tintura per creare lana azzurra. + +Si usa come tintura per creare lana turchese. + +Si usa come tintura per creare lana viola. + +Si usa come tintura per creare lana magenta. + +Si usa come tintura per creare lana blu. + +Suona dischi. + +Utilizzabile per creare attrezzi, armi o armature molto robusti. + +Fa più luce della torcia. Scioglie ghiaccio e neve e si può usare anche sott'acqua. + +Si usa per creare libri e mappe. + +Si usa per costruire scaffali o si può incantare per creare Libri incantati. + +Permette di creare incantesimi più potenti se lo si mette intorno al Tavolo per incantesimi. + +Si usa come decorazione. + +Si scava con una piccozza di ferro o migliore, poi si fonde nella fornace per produrre lingotti d'oro. + +Si scava con una piccozza di pietra o migliore, poi si fonde nella fornace per produrre lingotti di ferro. + +Si scava con una piccozza per ottenere carbone. + +Si scava con una piccozza di pietra o migliore per ottenere lapislazzuli. + +Si scava con una piccozza di ferro o migliore per ottenere diamanti. + +Si scava con una piccozza di ferro o migliore per ottenere polvere di pietra rossa. + +Si scava con una piccozza per ottenere ciottoli. + +Si ottiene con la pala. Si può usare per la costruzione. + +Si può piantare per far crescere un albero. + +Non si rompe. + +Dà fuoco a qualsiasi cosa tocca. Si può raccogliere in un secchio. + +Si ottiene con la pala. Si fonde in vetro usando la fornace. Subisce la gravità se sotto non ci sono altre tessere. + +Si ottiene con la pala. A volte produce una pietra focaia. Subisce la gravità se sotto non ci sono altre tessere. + +Si abbatte con l'ascia e si può tagliare in assi o usare come combustibile. + +Si crea nella fornace fondendo la sabbia. Si può usare per la costruzione, ma si rompe se cerchi di prenderlo. + +Si estrae dalla pietra usando la piccozza. Si può usare per costruire una fornace o attrezzi di pietra. + +Risultato della cottura dell'argilla in una fornace. + +Si inserisce nella fornace per creare mattoni. + +Quando viene rotta, rilascia delle sfere di argilla che possono essere cotte in una fornace per creare dei mattoni. + +Per conservare le palle di neve in poco spazio. + +Si può scavare con una pala per creare palle di neve. + +Può produrre Semi di grano quando viene tagliata. + +Si usa per creare tinture. + +Si usa con la ciotola per fare la zuppa. + +Si scava solo con una piccozza di diamante. Nasce dall'incontro tra acqua e lava e si usa per creare portali. + +Genera mostri nel mondo. + +Si posa a terra per condurre elettricità. Se si usa per preparare una pozione, aumenta la durata dell'effetto. + +Le colture si possono mietere per ottenere grano. + +Terreno pronto per piantare semi. + +Si può cuocere in fornace per produrre tintura verde. + +Si può usare per produrre zucchero. + +Si può indossare come elmo o unire a una torcia per creare una zucca di Halloween. È anche l'ingrediente principale per la torta di zucca. + +Una volta accesa, brucia per sempre. + +Rallentano il movimento di qualsiasi cosa ci passi sopra. + +Entra nel portale per spostarti tra il Sopramondo e il Sottomondo. + +Si usa come combustibile per la fornace o per creare una torcia. + +Si ottiene uccidendo un ragno e si usa per creare archi o canne da pesca. Si può anche mettere per terra per creare un filo. + +Si ottiene uccidendo una gallina e si usa per creare una freccia. + +Si ottiene uccidendo un creeper e si usa per creare del TNT, oppure come ingrediente per preparare pozioni. + +Si possono piantare e coltivare su una zolla. Assicurati che vi sia luce a sufficienza per far crescere i semi! + +Si ottiene dalle colture e si può usare per creare cibo. + +Si ottiene scavando nella ghiaia e si può usare per creare acciarino e pietra focaia. + +Si usa sui maiali per poterli cavalcare. Il maiale cavalcato può essere controllato usando carota e bastone. + +Si ottiene scavando nella neve e si può lanciare. + +Si ottiene uccidendo una mucca e si usa per creare un'armatura o per fare libri. + +Si ottiene uccidendo uno slime e si usa come ingrediente per preparare pozioni o per costruire pistoni appiccicosi. + +Viene deposto casualmente dalle galline e si può usare per creare cibi. + +Si ottiene scavando nella pietra brillante e si può usare per creare blocchi di pietra brillante. Si può anche utilizzare insieme alle pozioni per rendere più potente il loro effetto. + +Si ottiene uccidendo uno scheletro. Si usa per produrre farina d'ossa. Può essere dato in pasto a un lupo per ammansirlo. + +Si ottiene facendo uccidere un creeper da uno scheletro. Si può suonare in un jukebox. + +Spegne il fuoco e favorisce la crescita delle colture. Si può raccogliere in un secchio. + +Quando si rompono, a volte fanno cadere un arbusto che può essere trapiantato per far crescere un albero. + +Si trova nei dungeon e si può usare per costruire e decorare. + +Si usa per ottenere lana dalle pecore e ottenere blocchi foglia. + +Quando è alimentato (attraverso un pulsante, una leva, una piastra a pressione, una torcia pietra rossa o pietra rossa con uno qualsiasi di questi), se possibile il pistone si estende e spinge i blocchi. + +Quando è alimentato (attraverso un pulsante, una leva, una piastra a pressione, una torcia pietra rossa o pietra rossa con uno qualsiasi di questi), se possibile il pistone si estende e spinge i blocchi. Quando si ritrae, tira anche il blocco a contatto con la parte estesa del pistone. + +Creato utilizzando blocchi di pietra. Si trova comunemente nelle fortezze. + +Si usa come barriera, analogamente alle recinzioni. + +Simile a una porta, ma usato principalmente nelle recinzioni. + +Può essere creato usando Fette di melone. + +Blocchi trasparenti che possono essere usati come alternativa ai blocchi di vetro. + +Si possono piantare per far crescere delle zucche. + +Si possono piantare per far crescere dei meloni. + +Viene deposta dagli Enderman quando muoiono. Lanciando la Perla di Ender, il giocatore verrà teletrasportato nel punto in cui essa atterra, ma perderà un po' di salute. + +Un blocco di terra coperto d'erba. Si ottiene con la pala. Si può usare per la costruzione. + +Si può usare per costruire e decorare. + +Attraversarla rallenta i movimenti. Può essere distrutta con le forbici per raccogliere corda. + +Genera un Pesciolino d'argento quando viene distrutto. Può anche generare un Pesciolino d'argento se nelle vicinanze c'è un altro Pesciolino d'argento sotto attacco. + +Una volta posizionato, cresce nel corso del tempo. Si può raccogliere usando le forbici. Ci si può salire come su una scala. + +Superficie scivolosa. Si trasforma in acqua se si trova sopra un altro blocco quando questo viene distrutto. Si scioglie se posizionato nei pressi di una fonte di luce o nel Sottomondo. + +Si può usare come decorazione. + +Si usa come ingrediente di pozioni e per individuare Fortezze. Viene abbandonata dalle Vampe che si trovano nei pressi delle Fortezze del Sottomondo o al loro interno. + +Si usa come ingrediente di pozioni. Viene deposta dai Ghast quando muoiono. + +Viene deposta dagli uomini-maiale zombie quando muoiono. Gli uomini-maiale zombie si trovano nel Sottomondo. Si può usare come ingrediente per preparare pozioni. + +Si usa come ingrediente di pozioni. Cresce spontaneamente nelle Fortezze del Sottomondo. Si può piantare anche nelle Sabbie mobili. + +Può avere effetti diversi a seconda dell'oggetto su cui viene usata. + +Può essere riempita d'acqua e usata come ingrediente di base per preparare pozioni nel Banco di distillazione. + +Cibo velenoso e ingrediente per pozioni tossiche. Viene deposto dai Ragni o Ragni delle grotte uccisi dal giocatore. + +Si usa come ingrediente di pozioni, soprattutto nelle pozioni con effetti negativi. + +Si usa come ingrediente di pozioni o insieme ad altri oggetti per creare l'Occhio di Ender o la Crema di magma. + +Si usa come ingrediente di pozioni. + +Si usa per produrre Pozioni e Bombe pozione. + +Può essere riempito d'acqua mettendolo sotto la pioggia oppure usando un secchio, poi lo si può utilizzare per riempire d'acqua Bottiglie di vetro. + +Quando viene lanciato, l'Occhio di Ender mostra la posizione di un Portale del Limite. Dodici Occhi inseriti nel Telaio di un portale del Limite attivano il Portale stesso. + +Si usa come ingrediente di pozioni. + +Simili ai blocchi Erba, questi blocchi sono ideali come terreno di coltura per i funghi. + +Galleggia e può essere usata per guadare un corso d'acqua. + +Si usa per costruire Fortezze del Sottomondo. È immune alle palle di fuoco lanciate dai Ghast. + +Si usa nelle Fortezze del Sottomondo. + +Si trova nelle Fortezze del Sottomondo. Quando viene distrutto, rilascia una Verruca del Sottomondo. + +Permette al giocatore di incantare spade, piccozze, asce, pale, archi e armature usando i punti Esperienza guadagnati. + +Si attiva usando dodici Occhi di Ender e permette di raggiungere la dimensione Limite. + +Si usa per costruire un Portale del Limite. + +Un tipo di blocco che si trova nel Limite. Estremamente resistente alle esplosioni, è molto utile per costruire. + +Questo blocco si crea dopo aver sconfitto il Drago nel Limite. + +Quando viene lanciata, lascia cadere delle sfere Esperienza; raccogliendole, il giocatore può aumentare i propri punti Esperienza. + +Utile per appiccare il fuoco alle cose. Se si spara da un dispenser può scatenare incendi tutt'intorno in modo casuale. + +Simile a un espositore, mostra l'oggetto o il blocco messo al suo interno. + +Quando è lanciato può generare una creatura del tipo indicato. + +Si usa per creare scale lunghe. Due lastre una sopra l'altra creano un blocco doppio di dimensioni normali. + +Si usa per creare scale lunghe. Due lastre una sopra l'altra creano un blocco doppio di dimensioni normali. + +Creato dalla fusione della Sottogriglia nella fornace. Può generare blocchi di mattoni del Sottomondo. + +Se alimentate, emettono una luce. + +Può essere coltivato per raccogliere Semi di cacao. + +Le teste di Mob si possono collocare come decorazioni o indossare come maschere nello slot per l'elmo. + +Calamaro + +Rilascia sacche di inchiostro quando viene ucciso. + +Mucca + +Rilascia pelle quando viene uccisa. Si può anche mungere usando un secchio. + +Pecora + +Rilascia lana quando viene tosata (se non è già stata tosata). Si può creare lana di vari colori usando le tinture. + +Gallina + +Rilascia piume quando viene uccisa, inoltre a volte depone le uova. + +Maiale + +Rilascia costolette quando viene ucciso. Si può cavalcare usando una sella. + +Lupo + +Docile finché non viene attaccato, nel qual caso reagisce. Si può domare usando le ossa, che lo convincono a seguirti e ad attaccare i tuoi nemici. + +Creeper + +Esplode se ti avvicini troppo! + +Scheletro + +Ti lancia delle frecce. Rilascia frecce quando viene ucciso. + +Ragno + +Ti attacca quando ti avvicini. Può arrampicarsi sui muri. Rilascia un pungiglione quando viene ucciso. + +Zombie + +Ti attacca quando ti avvicini. + +Uomo-maiale zombie + +Inizialmente docile, ma se ne colpisci uno verrai attaccato da un gruppo. + +Ghast + +Ti lancia sfere di fuoco che esplodono al contatto. + +Slime + +Se danneggiato, si divide in slime più piccoli. + +Enderman + +Ti attacca se lo guardi. Può anche spostare blocchi. + +Pesciolino d'argento + +Quando viene attaccato, attira tutti i Pesciolini d'argento nascosti nei dintorni. Si nasconde nei blocchi di pietra. + +Ragno delle grotte + +Il suo morso è velenoso. + +Muccafungo + +Si usa con una Ciotola per preparare la Zuppa di funghi. Deposita funghi e diventa una mucca normale quando viene tosata. + +Golem di neve + +Il Golem di neve può essere creato assemblando blocchi di neve e una zucca. Lancia palle di neve contro i nemici del suo creatore. + +Drago di Ender + +Grosso drago nero che si trova nel Limite. + +Vampe + +Nemici che si trovano nel Sottomondo, soprattutto all'interno delle Fortezze. Quando vengono uccisi, depositano Bacchette di Vampe. + +Cubo di magma + +Si trovano nel Sottomondo. Simili a Slime, si dividono in esemplari più piccoli quando vengono uccisi. + +Abitante del villaggio + +Ocelot + +Possono essere trovati nelle giungle. Sono addomesticabili se sfamati con pesce crudo, ma aspetta che sia lui ad avvicinarsi a te, perché un movimento brusco lo metterebbe in fuga. + +Golem di ferro + +Appare nei villaggi per proteggerli, può essere creato usando blocchi di ferro e zucche. + +Explosives Animator + +Concept Artist + +Number Crunching and Statistics + +Bully Coordinator + +Original Design and Code by + +Project Manager/Producer + +Rest of Mojang Office + +Capo programmatore Minecraft PC + +Ninja Coder + +CEO + +White Collar Worker + +Customer Support + +Office DJ + +Designer/Programmer Minecraft - Pocket Edition + +Developer + +Chief Architect + +Art Developer + +Game Crafter + +Director of Fun + +Music and Sounds + +Programming + +Art + +QA + +Executive Producer + +Lead Producer + +Producer + +Test Lead + +Lead Tester + +Design Team + +Development Team + +Release Management + +Director, XBLA Publishing + +Business Development + +Portfolio Director + +Product Manager + +Marketing + + Community Manager + +Europe Localization Team + +Redmond Localization Team + +Asia Localization Team + +User Research Team + +MGS Central Teams + +Milestone Acceptance Tester + +Special Thanks + +Test Manager + +Senior Test Lead + +SDET + +Project STE + +Additional STE + +Test Associates + +Jon KÃ¥gström + +Tobias Möllstam + +Risë Lugo + +Spada di legno + +Spada di pietra + +Spada di ferro + +Spada di diamante + +Spada d'oro + +Pala di legno + +Pala di pietra + +Pala di ferro + +Pala di diamante + +Pala d'oro + +Piccozza di legno + +Piccozza di pietra + +Piccozza di ferro + +Piccozza di diamante + +Piccozza d'oro + +Ascia di legno + +Ascia di pietra + +Ascia di ferro + +Ascia di diamante + +Ascia d'oro + +Zappa di legno + +Zappa di pietra + +Zappa di ferro + +Zappa di diamante + +Zappa d'oro + +Porta di legno + +Porta di ferro + +Elmo di maglia metallica + +Corazza di maglia metallica + +Gambali di maglia metallica + +Stivali di maglia metallica + +Cappello di pelle + +Elmo di ferro + +Elmo di diamante + +Elmo d'oro + +Tunica di pelle + +Corsaletto di ferro + +Corsaletto di diamante + +Corsaletto d'oro + +Pantaloni di pelle + +Gambali di ferro + +Gambali di diamante + +Gambali d'oro + +Stivali di cuoio + +Stivali di ferro + +Stivali di diamante + +Stivali d'oro + +Lingotto di ferro + +Lingotto d'oro + +Secchio + +Secchio d'acqua + +Secchio di lava + +Pietra focaia e acciarino + +Mela + +Arco + +Freccia + +Carbone + +Antracite + +Diamante + +Bastone + +Ciotola + +Zuppa di funghi + +Corda + +Piuma + +Polvere da sparo + +Semi di grano + +Grano + +Pane + +Pietra focaia + +Costoletta di maiale cruda + +Costoletta di maiale cotta + +Dipinto + +Mela d'oro + +Cartello + +Carrello da miniera + +Sella + +Pietra rossa + +Palla di neve + +Barca + +Pelle + +Secchio di latte + +Mattone + +Argilla + +Canna da zucchero + +Carta + +Libro + +Palla di slime + +Carrello con cassa + +Carrello con fornace + +Uovo + +Bussola + +Canna da pesca + +Orologio + +Polvere di pietra brillante + +Pesce crudo + +Pesce cotto + +Tintura in polvere + +Sacca d'inchiostro + +Rosso rosa + +Verde cactus + +Semi di cacao + +Lapislazzulo + +Tintura viola + +Tintura turchese + +Tintura grigiastra + +Tintura grigia + +Tintura rosa + +Tintura verde lime + +Giallo mimosa + +Tintura azzurra + +Tintura magenta + +Tintura arancione + +Farina d'ossa + +Osso + +Zucchero + +Torta + +Letto + +Ripetitore pietra rossa + +Biscotto + +Mappa + +Disco - "13" + +Disco - "gatto" + +Disco - "blocchi" + +Disco - "cip" + +Disco - "lontano" + +Disco - "centro commerciale" + +Disco - "mellohi" + +Disco - "stal" + +Disco - "strad" + +Disco - "reparto" + +Disco - "11" + +Disco - "dove siamo adesso" + +Tosatrice + +Semi di zucca + +Semi di melone + +Pollo crudo + +Pollo cotto + +Manzo crudo + +Bistecca + +Carne guasta + +Ender Pearl + +Fetta di melone + +Bacchetta di Vampe + +Lacrima di Ghast + +Pepita d'oro + +Verruca del Sottomondo + +{*splash*}{*prefix*}Pozione {*postfix*} + +Bottiglia di vetro + +Bottiglia d'acqua + +Occhio di ragno + +Occhio di ragno fermentato + +Polvere di Vampe + +Crema di magma + +Banco di distillazione + +Calderone + +Occhio di Ender + +Melone scintillante + +Bottiglia magica + +Scarica di fuoco + +Scarica di fuoco (carbone vegetale) + +Scarica di fuoco (carbone) + +Espositore + +Genera {*CREATURE*} + +Mattone del Sottomondo + +Teschio + +Teschio di scheletro + +Teschio di scheletro avvizzito + +Testa di zombie + +Testa + +Testa di %s + +Testa di Creeper + +Pietra + +Blocco d'erba + +Terra + +Ciottolo + +Assi di legno di quercia + +Assi di legno di abete + +Assi di legno di betulla + +Assi di legno della giungla + +Arbusto + +Arbusto di quercia + +Arbusto di abete + +Arbusto di betulla + +Arbusto della giungla + +Substrato roccioso + +Acqua + +Lava + +Sabbia + +Arenaria + +Ghiaia + +Minerale d'oro + +Minerale di ferro + +Minerale carbone + +Legno + +Legno di quercia + +Legno di abete + +Legno di betulla + +Legno della giungla + +Quercia + +Abete + +Betulla + +Foglie + +Foglie di quercia + +Foglie d'abete + +Foglie di betulla + +Foglie della giungla + +Spugna + +Vetro + +Lana + +Lana nera + +Lana rossa + +Lana verde + +Lana marrone + +Lana blu + +Lana viola + +Lana turchese + +Lana grigio chiaro + +Lana grigia + +Lana rosa + +Lana verde lime + +Lana gialla + +Lana azzurra + +Lana magenta + +Lana arancione + +Lana bianca + +Fiore + +Rosa + +Fungo + +Blocco d'oro + +Un modo compatto di riporre l'oro. + +Un modo compatto di riporre il ferro. + +Blocco di ferro + +Lastra di pietra + +Lastra di pietra + +Lastra di arenaria + +Lastra di legno + +Lastra acciottolata + +Lastra di mattoni + +Lastra di mattoni di pietra + +Lastra di legna di quercia + +Lastra di arbusto + +Lastra di legno di betulla + +Lastra di legno della giungla + +Lastra di mattoni del Sottomondo + +Mattoni + +TNT + +Scaffale + +Pietra di muschio + +Ossidiana + +Torcia + +Torcia (carbone) + +Torcia (antracite) + +Fuoco + +Generatore di mostri + +Scala di legno di quercia + +Cassa + +Polvere di pietra rossa + +Minerale di diamante + +Blocco di diamante + +Un modo compatto di riporre i diamanti. + +Tavolo da lavoro + +Coltura + +Zolla + +Fornace + +Cartello + +Porta di legno + +Scala a pioli + +Binari + +Binari potenziati + +Binari rilevatori + +Scala di pietra + +Leva + +Piastra a pressione + +Porta di ferro + +Minerale pietra rossa + +Torcia pietra rossa + +Pulsante + +Neve + +Ghiaccio + +Cactus + +Argilla + +Canna da zucchero + +Jukebox + +Recinzione + +Zucca + +Zucca di halloween + +Sottogriglia + +Sabbie mobili + +Pietra brillante + +Portale + +Minerale di lapislazzulo + +Blocco lapislazzulo + +Un modo compatto di riporre i lapislazzuli. + +Dispenser + +Blocco nota + +Torta + +Letto + +Ragnatela + +Erba alta + +Cespuglio secco + +Diodo + +Cassa chiusa + +Botola + +Lana (qualsiasi colore) + +Pistone + +Pistone appiccicoso + +Blocco Pesciolino d'argento + +Mattoni di pietra + +Mattoni di pietra coperti di muschio + +Mattoni di pietra lesionati + +Mattoni di pietra cesellati + +Fungo + +Fungo + +Barre di ferro + +Lastra di vetro + +Melone + +Picciolo di zucca + +Picciolo di melone + +Rampicanti + +Cancello per recinzioni + +Scale di mattoni + +Scale di mattoni di pietra + +Pietra Pesciolino d'argento + +Ciottolo Pesciolino d'argento + +Mattone di pietra Pesciolino d'argento + +Micelio + +Ninfea + +Mattone del Sottomondo + +Recinzione di mattoni del Sottomondo + +Scale di mattoni del Sottomondo + +Verruca del Sottomondo + +Tavolo per incantesimi + +Banco di distillazione + +Calderone + +Portale del Limite + +Telaio per portale del Limite + +Pietra del Limite + +Uovo di drago + +Arbusto + +Felce + +Scala di arenaria + +Scale di abete + +Scale di legno di betulla + +Scala di legno della giungla + +Torcia di pietra rossa + +Cacao + +Teschio + +Comandi attuali + +Layout + +Muoviti/Scatta + +Guarda + +Pausa + +Salta + +Salta/Vola su + +Inventario + +Scorri oggetti in mano + +Azione + +Usa + +Crafting + +Posa + +Furtività + +Muoviti furtivamente/Vola giù + +Cambia modalità telecamera + +Giocatori/Invito + +Movimento (durante il volo) + +Layout 1 + +Layout 2 + +Layout 3 + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +{*B*}Premi{*CONTROLLER_VK_A*} per continuare. + +{*B*}Premi{*CONTROLLER_VK_A*} per avviare il tutorial.{*B*} + Premi{*CONTROLLER_VK_B*} se sei pronto a giocare da solo. + +In Minecraft si posizionano blocchi per costruire tutto ciò che vuoi. +Di notte, i mostri vagano in libertà, quindi costruisci un riparo per tempo. + +Usa{*CONTROLLER_ACTION_LOOK*} per guardare su, giù e intorno. + +Usa{*CONTROLLER_ACTION_MOVE*} per muoverti. + +Per scattare, sposta in avanti {*CONTROLLER_ACTION_MOVE*} due volte rapidamente. Finché tieni premuto {*CONTROLLER_ACTION_MOVE*}, il personaggio continuerà a scattare, a meno che non esaurisca il tempo per lo scatto o il cibo. + +Premi{*CONTROLLER_ACTION_JUMP*} per saltare. + +Tieni premuto{*CONTROLLER_ACTION_ACTION*} per scavare e abbattere alberi usando la mano o un oggetto. Potresti dover creare un attrezzo per scavare alcuni blocchi... + +Tieni premuto{*CONTROLLER_ACTION_ACTION*} per abbattere 4 blocchi di legno (tronchi).{*B*}Quando un blocco si rompe, puoi raccoglierlo avvicinandoti all'oggetto fluttuante che appare, inserendolo così nel tuo inventario. + +Premi{*CONTROLLER_ACTION_CRAFTING*} per aprire l'interfaccia Crafting. + +Man mano che raccogli e crei oggetti, l'inventario si riempie.{*B*} + Premi{*CONTROLLER_ACTION_INVENTORY*} per aprire l'inventario. + +Via via che ti sposti, scavi e attacchi i nemici, il livello della barra del cibo diminuisce {*ICON_SHANK_01*}. Scattando e saltando durante uno scatto si consuma molto più cibo che non camminando e saltando normalmente. + +Se subisci dei danni, ma nella tua barra del cibo ci sono 9 o più{*ICON_SHANK_01*}, la tua salute si ripristinerà automaticamente. Mangiare farà risalire la tua barra del cibo. + +Tenendo in mano un cibo, tieni premuto{*CONTROLLER_ACTION_USE*} per mangiarlo e reintegrare la tua barra del cibo. Se la barra del cibo è piena, non potrai mangiare. + +Il livello della tua barra del cibo è sceso e hai perso energia. Mangia la bistecca nel tuo inventario per reintegrare la barra del cibo e riacquistare le forze.{*ICON*}364{*/ICON*} + +Il legno ottenuto si può tagliare in assi. Apri l'interfaccia Crafting per crearle.{*PlanksIcon*} + +Il crafting può richiedere diverse operazioni. Ora che hai delle assi, puoi creare nuovi oggetti. Crea un tavolo da lavoro.{*CraftingTableIcon*} + +Per velocizzare la raccolta di blocchi, puoi costruire attrezzi appositi. Alcuni attrezzi hanno un manico creato con dei bastoni. Crea dei bastoni.{*SticksIcon*} + +Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} e{*CONTROLLER_ACTION_RIGHT_SCROLL*} per cambiare l'oggetto che tieni in mano. + +Usa{*CONTROLLER_ACTION_USE*} per utilizzare gli oggetti, interagire e collocarli. Gli oggetti collocati possono essere raccolti scavando con l'attrezzo appropriato. + +Una volta selezionato il tavolo da lavoro, sposta il puntatore nel punto desiderato e usa{*CONTROLLER_ACTION_USE*} per collocarlo. + +Sposta il puntatore sul tavolo da lavoro e premi{*CONTROLLER_ACTION_USE*} per aprirlo. + +La pala aiuta a scavare più in fretta i blocchi cedevoli come terra e neve. Raccogliendo materiali, potrai creare attrezzi più robusti e durevoli. Crea una pala di legno.{*WoodenShovelIcon*} + +L'ascia ti aiuta a tagliare più in fretta la legna e le tessere di legno. Raccogliendo materiali, potrai creare attrezzi più robusti e durevoli. Crea un'ascia di legno.{*WoodenHatchetIcon*} + +La piccozza aiuta a scavare più in fretta i blocchi duri come pietra e minerale. Raccogliendo materiali, potrai creare attrezzi più robusti e durevoli, inoltre potrai scavare anche i materiali più duri. Crea una piccozza di legno.{*WoodenPickaxeIcon*} + +Apri il contenitore + + + La notte arriva in fretta ed è pericoloso restare all'aperto impreparati. Puoi creare armi e armature, ma conviene avere un riparo sicuro. + + + + Nelle vicinanze c'è un rifugio di minatori abbandonato che puoi completare entro sera. + + + + Dovrai raccogliere le risorse per completare il rifugio. Per muri e tetto si può usare qualsiasi materiale, ma ti converrà creare una porta, delle finestre e un po' di luce. + + +Usa la piccozza per scavare dei blocchi di pietra. I blocchi di pietra producono ciottoli. Con 8 blocchi di ciottoli puoi costruire una fornace. Potresti dover scavare nella terra per raggiungere la pietra: usa la pala.{*StoneIcon*} + +Hai abbastanza ciottoli per costruire una fornace. Usa il tavolo da lavoro. + +Usa{*CONTROLLER_ACTION_USE*} per collocare la fornace nel mondo, poi aprila. + +Usa la fornace per creare l'antracite. Mentre aspetti che sia pronta, che ne dici di raccogliere altri materiali per completare il rifugio? + +Usa la fornace per creare del vetro. Mentre aspetti che sia pronto, che ne dici di raccogliere altri materiali per completare il rifugio? + +Un buon rifugio ha una porta per entrare e uscire agilmente senza dover ogni volta scavare e sostituire i muri. Crea una porta di legno.{*WoodenDoorIcon*} + +Usa{*CONTROLLER_ACTION_USE*} per collocare la porta. Puoi usare{*CONTROLLER_ACTION_USE*} per aprire e chiudere una porta di legno nel mondo. + +Di notte è buio, quindi serve della luce per poterci vedere nel rifugio. Crea una torcia usando bastoni e antracite dall'interfaccia Crafting.{*TorchIcon*} + + + Hai completato la prima parte del tutorial. + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per continuare il tutorial.{*B*} + Premi{*CONTROLLER_VK_B*} se sei pronto a giocare da solo. + + + + Questo è il tuo inventario. Mostra gli oggetti che puoi tenere in mano e quelli che trasporti, nonché la tua eventuale armatura. + + +{*B*} + Premi{*CONTROLLER_VK_A*} per continuare.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come si usa l'inventario. + + + + Usa{*CONTROLLER_MENU_NAVIGATE*} per muovere il puntatore. Usa{*CONTROLLER_VK_A*} per raccogliere un oggetto sotto il puntatore. + Se c'è più di un oggetto, verranno raccolti tutti, oppure premi{*CONTROLLER_VK_X*} per raccoglierne soltanto la metà. + + + + Sposta l'oggetto in un'altra casella dell'inventario usando il puntatore e collocalo con{*CONTROLLER_VK_A*}. + Se il puntatore seleziona più oggetti, usa{*CONTROLLER_VK_A*} per collocarli tutti o{*CONTROLLER_VK_X*} per collocarne solo uno. + + + + Sposta il puntatore fuori dal bordo dell'interfaccia mentre è selezionato un oggetto per posarlo. + + + + Se vuoi maggiori informazioni su un oggetto, spostaci sopra il puntatore e premi{*CONTROLLER_VK_RT*}. + + + + Ora premi{*CONTROLLER_VK_B*} per uscire dall'inventario. + + + + Questo è l'inventario della modalità Creativa. Mostra gli oggetti che hai in mano e tutti quelli a tua disposizione. + + +{*B*} + Premi{*CONTROLLER_VK_A*} per continuare.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come si usa l'inventario della modalità Creativa. + + + + Usa{*CONTROLLER_MENU_NAVIGATE*} per muovere il puntatore. + Quando sei nell'elenco degli oggetti, usa{*CONTROLLER_VK_A*} per selezionare l'oggetto sotto il puntatore e{*CONTROLLER_VK_Y*} per prenderne la quantità massima. + + + + Il puntatore si sposterà automaticamente su uno spazio nella riga per l'uso. Posiziona l'oggetto usando{*CONTROLLER_VK_A*}. Una volta completata questa operazione, il puntatore tornerà all'elenco degli oggetti e potrai selezionarne un altro. + + + + Sposta il puntatore fuori dal bordo dell'interfaccia mentre è selezionato un oggetto per posizionarlo nel mondo. Per eliminare tutti gli oggetti nella barra di scelta rapida, premi{*CONTROLLER_VK_X*}. + + + + Scorri le schede dei tipi di oggetti usando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} per selezionare il tipo di oggetto che vuoi prendere. + + + + Se vuoi maggiori informazioni su un oggetto, spostaci sopra il puntatore e premi{*CONTROLLER_VK_RT*}. + + + + Ora premi{*CONTROLLER_VK_B*} per uscire dall'inventario della modalità Creativa. + + + + Questa è l'interfaccia Crafting, che ti consente di combinare gli oggetti raccolti per crearne di nuovi. + + +{*B*} + Premi {*CONTROLLER_VK_A*}per continuare.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona il crafting. + + +{*B*} + Premi{*CONTROLLER_VK_X*} per visualizzare la descrizione dell'oggetto. + + +{*B*} + Premi{*CONTROLLER_VK_X*} per visualizzare gli ingredienti necessari per creare l'oggetto corrente. + + +{*B*} + Premi{*CONTROLLER_VK_X*} per visualizzare di nuovo l'inventario. + + + + Scorri le schede dei tipi di oggetti usando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} per selezionare il tipo di oggetto, poi usa{*CONTROLLER_MENU_NAVIGATE*} per scegliere l'oggetto da creare. + + + + L'area crafting mostra gli elementi richiesti per creare il nuovo oggetto. Premi{*CONTROLLER_VK_A*} per creare l'oggetto e inserirlo nell'inventario. + + + + Il tavolo da lavoro consente di creare una selezione di oggetti più vasta. Lavorare al tavolo funziona come il normale crafting, ma avrai un'area di lavoro più ampia, che consente una maggiore combinazione di ingredienti. + + + + La parte in basso a destra dell'interfaccia Crafting mostra il tuo inventario. Qui puoi anche vedere una descrizione dell'oggetto selezionato e gli ingredienti necessari per crearlo. + + + + Ora è visualizzata la descrizione dell'oggetto selezionato, che ti dà un'idea del suo possibile utilizzo. + + + + Ora è visualizzato l'elenco degli ingredienti necessari per creare l'oggetto selezionato. + + +Il legno ottenuto si può tagliare in assi. Seleziona l'icona delle assi e premi{*CONTROLLER_VK_A*} per crearle.{*PlanksIcon*} + + + Ora che hai costruito un tavolo da lavoro, collocalo nel mondo per creare una selezione di oggetti più vasta.{*B*} + Ora premi{*CONTROLLER_VK_B*} per uscire dall'interfaccia Crafting. + + + + Premi{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} per cambiare il tipo di oggetto da creare. Seleziona il gruppo attrezzi.{*ToolsIcon*} + + + + Premi{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} per cambiare il tipo di oggetto da creare. Seleziona il gruppo strutture.{*StructuresIcon*} + + + + Usa{*CONTROLLER_MENU_NAVIGATE*} per cambiare l'oggetto da creare. Alcuni oggetti esistono in varie versioni, a seconda dei materiali impiegati. Seleziona la pala di legno.{*WoodenShovelIcon*} + + + + Il crafting può richiedere diverse operazioni. Ora che hai delle assi, puoi creare nuovi oggetti. Usa{*CONTROLLER_MENU_NAVIGATE*} per cambiare l'oggetto da creare. Seleziona il tavolo da lavoro.{*CraftingTableIcon*} + + + + Grazie agli attrezzi che hai creato, puoi partire alla grande e raccogliere diversi materiali in modo più efficiente.{*B*} + Ora premi{*CONTROLLER_VK_B*} per uscire dall'interfaccia Crafting. + + + + Alcuni oggetti non possono essere creati con il tavolo da lavoro, ma è necessaria una fornace. Ora crea una fornace.{*FurnaceIcon*} + + + + Colloca la fornace creata nel mondo. Ti conviene metterla nel tuo rifugio.{*B*} + Ora premi{*CONTROLLER_VK_B*} per uscire dall'interfaccia Crafting. + + + + Questa è l'interfaccia fornace, dove puoi modificare gli oggetti attraverso il fuoco. Per esempio, puoi trasformare il minerale di ferro in lingotti di ferro. + + +{*B*} + Premi{*CONTROLLER_VK_A*} per continuare.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come si usa la fornace. + + + + Dovrai inserire del combustibile nella parte inferiore della fornace e l'oggetto da modificare nella parte superiore. A questo punto, la fornace si accenderà e si metterà in funzione, fornendo il risultato nella parte destra. + + + + Puoi usare molti oggetti di legno come combustibile, ma ciascuno brucia per un tempo diverso. Puoi anche scoprire altri oggetti nel mondo da usare come combustibile. + + + + Gli oggetti nell'area di produzione possono essere trasferiti nell'inventario. Sperimenta con diversi ingredienti e vedi cosa riesci a creare. + + + + Usando il legno come ingrediente, puoi produrre l'antracite. Inserisci del combustibile nella fornace e del legno nello slot ingrediente. La fornace può richiedere tempo per creare l'antracite, quindi sentiti libero di fare altro e di tornare in seguito a controllare l'avanzamento. + + + + L'antracite può essere usata come combustibile o combinata con un bastone per creare una torcia. + + + + Inserisci la sabbia nello slot ingrediente per produrre del vetro. Crea dei blocchi di vetro da usare come finestre nel tuo rifugio. + + + + Questa è l'interfaccia di distillazione. Puoi usarla per creare pozioni di vario tipo. + + +{*B*} + Premi{*CONTROLLER_VK_A*} per continuare.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come si usa il Banco di distillazione. + + + + Per distillare una pozione, posiziona un ingrediente nello slot superiore e una pozione o una Bottiglia d'acqua negli slot inferiori. Puoi preparare fino a tre pozioni contemporaneamente. Una volta inserita una combinazione di ingredienti corretta, il processo di distillazione si avvierà e, dopo un breve periodo di tempo, potrai ritirare la tua pozione. + + + + Il punto di partenza di tutte le pozioni è una Bottiglia d'acqua. Quasi tutte le pozioni vengono preparate utilizzando prima una Verruca del Sottomondo per creare una Maldestra pozione e aggiungendo poi almeno un altro ingrediente per ottenere il prodotto finale. + + + + È possibile modificare gli effetti di una pozione aggiungendo altri ingredienti. La Polvere di pietra rossa, ad esempio, rende più duraturi gli effetti della pozione, mentre la Polvere di pietra brillante li rende più potenti. + + + + L'Occhio di ragno fermentato inquina la pozione e può farle acquisire effetti diametralmente opposti, mentre la Polvere da sparo la trasforma in una Bomba pozione che, una volta lanciata, diffonderà il suo effetto nella zona colpita. + + + + Crea una Pozione di Resistenza al fuoco aggiungendo prima una Verruca del Sottomondo a una Bottiglia d'acqua e completando poi la pozione con della Crema di magma. + + + + Ora premi{*CONTROLLER_VK_B*} per uscire dall'interfaccia di distillazione. + + + + In quest'area troverai un Banco di distillazione, un Calderone e una cassa pieni di oggetti da utilizzare per la preparazione di pozioni. + + +{*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla distillazione di pozioni.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + + + Prima di poter distillare una pozione, devi creare una Bottiglia d'acqua. Prendi una Bottiglia di vetro dalla cassa. + + + + Puoi riempire una Bottiglia di vetro attingendo acqua da un Calderone che ne contenga o da un blocco d'acqua. Riempi la tua bottiglia posizionando il cursore su una fonte d'acqua e premendo{*CONTROLLER_ACTION_USE*}. + + + + Se il Calderone si svuota, puoi riempirlo con un Secchio d'acqua. + + + + Usa il Banco di distillazione per creare una Pozione di Resistenza al fuoco. Ti serviranno una Bottiglia d'acqua, una Verruca del Sottomondo e Crema di magma. + + + + Prendi una pozione e tieni premuto{*CONTROLLER_ACTION_USE*} per usarla. Le pozioni normali vengono ingerite e producono i propri effetti sul giocatore stesso; le pozioni Area, invece, vengono lanciate e il loro effetto si applica alle creature che si trovano nella zona dell'impatto. + È possibile creare delle Bombe pozione aggiungendo polvere da sparo a una pozione normale. + + + + Usa la Pozione di Resistenza al fuoco su te stesso. + + + + Ora che sei resistente al fuoco e alla lava, approfittane per raggiungere dei luoghi che prima ti risultavano inaccessibili. + + + + Questa è l'interfaccia di incantamento. Puoi usarla per incantare armi, armature e alcuni attrezzi. + + +{*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sull'interfaccia per gli incantesimi.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + + + Per applicare un incantesimo a un oggetto, posizionalo nello slot di incantamento. È possibile incantare armi, armature e alcuni attrezzi per dotarli di proprietà speciali, come una maggiore resistenza ai danni o la capacità di raccogliere più oggetti quando si scava un blocco. + + + + Quando un oggetto viene posizionato nello slot di incantamento, i pulsanti a destra mostreranno una selezione casuale di incantesimi. + + + + La cifra sul pulsante indica il costo in punti Esperienza dell'incantesimo. Se non hai un livello di Esperienza sufficiente, il pulsante non sarà selezionabile. + + + + Seleziona un incantesimo e premi{*CONTROLLER_VK_A*} per applicarlo all'oggetto. Il costo dell'incantesimo verrà detratto dai tuoi punti Esperienza. + + + + Gli incantesimi sono casuali, ma alcuni dei più potenti sono disponibili solo quando hai un livello elevato di Esperienza e intorno al Tavolo per incantesimi ci sono molti scaffali che ne aumentano la potenza. + + + + In quest'area troverai un Tavolo per incantesimi e alcuni altri oggetti che potrai utilizzare per familiarizzarti con questa nuova funzionalità. + + +{*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sugli incantesimi.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + + + Utilizzando un Tavolo per incantesimi è possibile incantare armi, armature e alcuni attrezzi per dotarli di proprietà speciali, come una maggiore resistenza ai danni o la capacità di raccogliere più oggetti quando si scava un blocco. + + + + Posizionare degli scaffali intorno al Tavolo per incantesimi ne aumenta la potenza e consente di accedere agli incantesimi di livello più alto. + + + + Gli incantesimi richiedono un certo livello di Esperienza; puoi far salire di livello la tua Esperienza raccogliendo le sfere di Esperienza che vengono abbandonate da mostri e animali uccisi, estraendo metalli, facendo riprodurre animali, pescando e fondendo/cuocendo alcuni oggetti in una fornace. + + + + Puoi guadagnare Esperienza anche usando una Bottiglia magica. Quando viene lanciata, la Bottiglia magica rilascia attorno a sé Sfere di Esperienza che possono essere raccolte. + + + + Le casse che troverai in quest'area contengono oggetti già incantati, Bottiglie magiche e alcuni oggetti da incantare per acquisire dimestichezza con il Tavolo per incantesimi. + + + + Ora viaggi in un carrello da miniera. Per smontare, punta il cursore verso il carrello e premi{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + + +{*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sul carrello da miniera.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona il carrello da miniera. + + + + Il carrello da miniera viaggia sui binari. Puoi creare un carrello potenziato usando una fornace e un carrello da miniera contenente una cassa. + {*RailIcon*} + + + + Puoi anche creare binari potenziati, che traggono energia dai circuiti e dalle torce di pietre rosse per far accelerare il carrello. Potrai quindi collegarli a interruttori, leve e piastre a pressione per realizzare sistemi complessi. + {*PoweredRailIcon*} + + + + Ora navighi su una barca. Per scendere, punta il cursore verso la barca e premi{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla barca.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona la barca. + + + + La barca consente di viaggiare velocemente sull'acqua. Per virare, usa{*CONTROLLER_ACTION_MOVE*} e{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + + + + Ora stai utilizzando la canna da pesca. Premi{*CONTROLLER_ACTION_USE*} per usarla.{*FishingRodIcon*} + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla pesca.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona la pesca. + + + + Premi{*CONTROLLER_ACTION_USE*} per lanciare la lenza e iniziare a pescare. Premi di nuovo{*CONTROLLER_ACTION_USE*} per tirare la lenza. + {*FishingRodIcon*} + + + + Se aspetti che il galleggiante affondi sotto la superficie dell'acqua prima di tirare, potresti prendere un pesce. Il pesce si può mangiare crudo o cucinato nella fornace per reintegrare la salute. + {*FishIcon*} + + + + Come nel caso di molti altri attrezzi, la canna da pesca ha un numero di utilizzi prestabilito, non limitato alla pesca. Sperimenta e scopri cos'altro puoi prendere o attivare... + {*FishingRodIcon*} + + + + Questo è un letto. Premi{*CONTROLLER_ACTION_USE*} mentre punti verso di esso di notte per dormire e risvegliarti il mattino successivo.{*ICON*}355{*/ICON*} + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sul letto.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona il letto. + + + + Il letto dovrebbe trovarsi in un punto sicuro e ben illuminato, in modo che i mostri non ti sveglino nel cuore della notte. Una volta usato un letto, se dovessi morire, tornerai in quel punto. + {*ICON*}355{*/ICON*} + + + + Se ci sono altri giocatori nel gioco, per dormire devono essere tutti a letto nello stesso momento. + {*ICON*}355{*/ICON*} + + + + In quest'area ci sono dei semplici circuiti con pietre rosse e pistoni, oltre a un forziere contenente altri oggetti per ampliare i circuiti. + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sui circuiti con pietre rosse e pistoni.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funzionano. + + + + Leve, pulsanti, piastre a pressione e torce a pietre rosse alimentano i circuiti collegandoli direttamente all'oggetto da attivare o connettendoli con la polvere di pietra rossa. + + + + Posizione e direzione delle fonti di alimentazione modificano il loro effetto sui blocchi circostanti. Per esempio, una torcia a pietre rosse sul lato di un blocco può essere spenta se il blocco è alimentato da un'altra fonte. + + + + La polvere di pietra rossa si raccoglie estraendo il minerale di pietra rossa con una piccozza di ferro, diamante o oro. Puoi usarla per alimentare fino a 15 blocchi e può salire o scendere di un blocco in altezza. + {*ICON*}331{*/ICON*} + + + + I ripetitori a pietre rosse si usano per aumentare la distanza di alimentazione o per inserire un ritardo in un circuito. + {*ICON*}356{*/ICON*} + + + + Quando è alimentato, un pistone si estende, spingendo fino a 12 blocchi. Quando si ritira, un pistone appiccicoso può tirare un blocco di quasi tutti i tipi. + {*ICON*}33{*/ICON*} + + + + Nel forziere in quest'area ci sono dei componenti per creare dei circuiti con i pistoni. Prova a usare o completare i circuiti in quest'area, oppure creane uno personalizzato. Troverai altri esempi al di fuori dell'area del tutorial. + + + + In quest'area c'è un Portale per il Sottomondo! + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sui Portali e sul Sottomondo.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funzionano i Portali e il Sottomondo. + + + + I Portali si creano posizionando blocchi di ossidiana in una struttura larga quattro blocchi e alta cinque. I blocchi d'angolo non sono necessari. + + + + Per attivare un Sottoportale, dai fuoco ai blocchi di ossidiana dentro la struttura, usando acciarino e pietra focaia. I Portali possono essere disattivati se la struttura si rompe, se c'è un'esplosione nelle vicinanze o se del liquido vi scorre dentro. + + + + Per usare un Sottoportale, mettiti in piedi all'interno. Lo schermo diventerà viola e sentirai un suono. Dopo qualche secondo sarai trasportato in un'altra dimensione. + + + + Il Sottomondo può essere pericoloso e pieno di lava, ma può essere utile per raccogliere Sottogriglia, che una volta accesa brucia all'infinito, e Pietra brillante, che produce luce. + + + + Si può usare il Sottomondo per viaggiare velocemente nel Sopramondo: una distanza di un blocco nel Sottomondo equivale a 3 blocchi nel Sopramondo. + + + + Ora sei in modalità Creativa. + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla modalità Creativa.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona la modalità Creativa. + + +In modalità Creativa avrai a disposizione una quantità infinita di oggetti e blocchi, potrai distruggere blocchi con un clic, senza usare alcun attrezzo, sarai invulnerabile e potrai volare. + +In modalità Creativa, premi due volte rapidamente{*CONTROLLER_ACTION_JUMP*} per volare. Ripeti l'azione per interrompere il volo. Per volare più rapidamente, sposta in avanti{*CONTROLLER_ACTION_MOVE*} due volte in rapida successione mentre stai volando. +Durante il volo, puoi tenere premuto{*CONTROLLER_ACTION_JUMP*} per salire e{*CONTROLLER_ACTION_SNEAK*} per scendere, oppure utilizzare il tasto D per salire, scendere e spostarti lateralmente. + +Premi{*CONTROLLER_ACTION_CRAFTING*} per aprire l'interfaccia dell'inventario in modalità Creativa. + +Raggiungi l'altra estremità di questo fosso per continuare. + +Hai completato il tutorial della modalità Creativa. + + + In quest'area è stata allestita una fattoria. Coltivare la terra ti permette di avere una fonte rinnovabile di cibo e altri oggetti. + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla coltivazione.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funziona. + + +Grano, Zucche e Meloni crescono a partire dai semi. I Semi di grano si ottengono tagliando l'Erba alta o raccogliendo Grano maturo, mentre quelli di Zucca e di Melone si ricavano dai rispettivi ortaggi. + +Prima di poter procedere alla semina, devi lavorare i blocchi di terra con la Zappa per trasformarli in Zolle. Una fonte d'acqua nei pressi manterrà umide le zolle, farà crescere i raccolti più rapidamente e illuminerà l'area. + +Il Grano attraversa vari stadi prima di giungere a maturazione. È pronto ad essere raccolto quando ha assunto una tinta più scura.{*ICON*}59:7{*/ICON*} + +Zucche e Meloni richiedono un blocco libero accanto a quello in cui sono stati piantati i semi in modo che il frutto abbia spazio per crescere una volta che il picciolo è giunto a maturazione. + +La Canna da zucchero deve essere piantata su un blocco di erba, terra o sabbia attiguo a un blocco d'acqua. Tagliare un blocco di Canna da zucchero fa cadere anche tutti i blocchi che lo sovrastano.{*ICON*}83{*/ICON*} + +I Cactus si piantano nella sabbia e crescono fino a raggiungere un'altezza di tre blocchi. Come per la Canna da zucchero, distruggere il blocco inferiore ti permetterà di raccogliere anche i blocchi che lo sovrastano.{*ICON*}81{*/ICON*} + +I Funghi vanno piantati in un'area scarsamente illuminata. Crescendo, si allargano verso i blocchi vicini, purché siano anch'essi in penombra.{*ICON*}39{*/ICON*} + +La Farina d'ossa può essere usata per portare a maturità i raccolti o per trasformare i Funghi in Funghi giganti.{*ICON*}351:15{*/ICON*} + +Hai completato il tutorial sulla coltivazione. + + + In quest'area troverai alcuni animali rinchiusi in un recinto. Se li fai riprodurre, gli animali metteranno al mondo delle versioni in miniatura di se stessi. + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sugli animali e sulla riproduzione.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + +Per far riprodurre un animale, devi prima farlo entrare in "modalità Amore" nutrendolo con l'alimento adatto. + +Dai grano a una mucca, a un muccafungo o a una pecora, carote a un maiale, semi di grano o verruche del Sottomondo a una gallina, e qualsiasi tipo di carne a un lupo, e le creature cominceranno a cercare nei dintorni un altro animale della stessa specie che sia a sua volta in modalità Amore. + +Quando l'avrà trovato, i due si scambieranno effusioni per qualche secondo e poi apparirà un cucciolo. Il piccolo seguirà i genitori per un certo periodo di tempo prima di diventare adulto. + +Devono passare circa cinque minuti prima che un animale possa entrare nuovamente in modalità Amore. + +Alcuni animali ti seguiranno quando hai in mano il loro cibo. In questo modo ti sarà più semplice raggrupparli per farli riprodurre.{*ICON*}296{*/ICON*} + + + I lupi selvatici possono essere ammansiti dando loro degli ossi. Una volta ammansiti, intorno ai lupi compariranno dei cuoricini. I lupi ammansiti seguono il giocatore e lo difendono, a meno che non sia stato loro ordinato di stare seduti. + + +Hai completato il tutorial sugli animali e sulla riproduzione. + + + In questa area ci sono zucche e blocchi per creare un golem di neve e uno di ferro. + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sui golem.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già tutto sui golem. + + +I golem si creano sistemando una zucca in cima a una pila di blocchi. + +I golem di neve si creano con due blocchi di neve, uno sull'altro, con in cima una zucca. I golem di neve scagliano palle di neve contro i nemici. + +I golem di ferro si creano con quattro blocchi di ferro, come mostrato, con una zucca sopra il blocco centrale. I golem di ferro attaccano i tuoi nemici. + +I golem di ferro compaiono per aiutare i villaggi e ti attaccheranno se proverai ad attaccare un abitante. + +Non puoi abbandonare l'area finché non avrai completato il tutorial. + +Attrezzi diversi sono indicati per materiali diversi. Usa la pala per scavare materiali cedevoli come terra e sabbia. + +Attrezzi diversi sono indicati per materiali diversi. Usa l'ascia per abbattere gli alberi. + +Attrezzi diversi sono indicati per materiali diversi. Usa la piccozza per scavare pietra e minerali. Per ottenere risorse da alcuni blocchi, potrebbe rendersi necessario costruire piccozze con materiali migliori. + +Alcuni attrezzi sono perfetti per attaccare i nemici. La spada è uno di questi. + +Suggerimento: tieni premuto {*CONTROLLER_ACTION_ACTION*}per scavare e abbattere alberi usando la mano o un oggetto. Potresti dover creare un attrezzo per scavare alcuni blocchi... + +L'attrezzo che stai usando si è danneggiato. Ogni volta che usi un attrezzo, esso si danneggia e, alla fine, si rompe. La barra colorata sotto l'oggetto nell'inventario mostra lo stato corrente. + +Tieni premuto{*CONTROLLER_ACTION_JUMP*} per nuotare verso l'alto. + +In quest'area c'è un carrello da miniera sui binari. Per salirci, punta il cursore verso i binari e premi{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} sul pulsante per far muovere il carrello. + +Nella cassa accanto al fiume c'è una barca. Per usarla, punta il cursore verso l'acqua e premi{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} mentre punti verso la barca per salirci. + +Nella cassa accanto al laghetto c'è una canna da pesca. Prendi la canna da pesca dalla cassa e selezionala come oggetto in mano per usarla. + +Questo pistone con un meccanismo più avanzato crea un ponte auto-riparante! Premi il pulsante per attivarlo, poi scopri in che modo i componenti interagiscono tra loro per saperne di più. + +Se sposti il puntatore fuori dall'interfaccia mentre trasporti un oggetto, puoi posarlo. + +Non hai tutti gli ingredienti necessari per creare questo oggetto. La casella in basso a sinistra mostra gli ingredienti necessari. + + + Congratulazioni, hai completato il tutorial. Il tempo nel gioco scorre normalmente, e tra poco sarà notte e i mostri usciranno allo scoperto! Completa il rifugio! + + +{*EXIT_PICTURE*} Quando vorrai proseguire l'esplorazione, vicino al rifugio di minatori, in quest'area, troverai una scala che conduce a un piccolo castello. + +Promemoria: + +]]> + +Nell'ultima versione del gioco, sono state aggiunte nuove funzionalità, tra cui nuove aree nel mondo tutorial. + +{*B*}Premi{*CONTROLLER_VK_A*} per giocare normalmente il tutorial.{*B*} + Premi{*CONTROLLER_VK_B*} per saltare il tutorial principale. + +In quest'area, troverai delle zone che ti aiuteranno a scoprire la pesca, le barche, i pistoni e le pietre rosse. + +Fuori da quest'area troverai esempi di edifici, coltivazioni, carrelli da miniera e binari, oltre a incantesimi, pozioni da distillare, scambi da effettuare, metalli da lavorare e molto altro ancora! + + + La tua barra del cibo è scesa a un livello troppo basso e non potrai più recuperare energia. + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sulla barra del cibo e sull'alimentazione.{*B*} + Premi{*CONTROLLER_VK_B*} se sai già come funzionano la barra del cibo e l'alimentazione. + + +Seleziona + +Usa + +Indietro + +Esci + +Annulla + +Annulla accesso + +Seleziona periferica + +Cambia periferica + +Aggiorna elenco partite + +Giochi Party + +Tutti i giochi + +Cambia gruppo + +Mostra inventario + +Mostra descrizione + +Mostra ingredienti + +Crafting + +Crea + +Prendi/Colloca + +Prendi + +Prendi tutto + +Prendi metà + +Colloca + +Colloca tutti + +Colloca uno + +Posa + +Posa tutti + +Posa uno + +Scambia + +Spost. veloce + +Elimina scelta rapida + +Cos'è? + +Condividi su Facebook + +Cambia filtro + +Scheda giocatore + +Visualizza profilo giocatore + +Invia richiesta amico + +Pagina giù + +Pagina su + +Avanti + +Indietro + +Espelli giocatore + +Tingi + +Scava + +Nutri + +Addomestica + +Cura + +Siediti + +Seguimi + +Espelli + +Svuota + +Sella + +Colloca + +Colpisci + +Mungi + +Raccogli + +Mangia + +Dormi + +Svegliati + +Suona + +Cavalca + +Naviga + +Coltiva + +Nuota su + +Apri + +Cambia tonalità + +Fai esplodere + +Leggi + +Appendi + +Lancia + +Pianta + +Ara + +Mieti + +Continua + +Sblocca gioco completo + +Elimina salvataggio + +Elimina + +Opzioni + +Invito Party Xbox Live + +Invita amici + +Accetta + +Tosa + +Escludi livello + +Seleziona skin + +Accendi + +Naviga + +Installa versione completa + +Installa versione di prova + +Installa + +Reinstalla + +Opzioni di salvataggio + +Esegui comando + +Creativa + +Sposta ingrediente + +Sposta combustibile + +Sposta attrezzo + +Sposta armatura + +Sposta arma + +Equipaggia + +Tendi + +Rilascia + +Privilegi + +Blocco + +Pagina su + +Pagina giù + +Modalità Amore + +Bevi + +Ruota + +Nascondi + +Carica salvataggio per Xbox One + +Svuota tutti gli slot + +Carica salvataggio per Xbox One + +OK + +Annulla + +Negozio di Minecraft + +Vuoi davvero uscire dalla partita attuale e accedere a quella nuova? Tutti i progressi non salvati andranno persi. + +Esci dal gioco + +Salva gioco + +Esci senza salvare + +Vuoi davvero sovrascrivere qualsiasi salvataggio precedente di questo mondo con la versione del mondo corrente? + +Vuoi davvero uscire senza salvare? Perderai tutti i progressi in questo mondo! + +Avvia gioco + +Se crei, carichi o salvi un mondo in modalità Creativa, gli obiettivi e gli aggiornamenti della classifica saranno disabilitati e lo resteranno anche se quel mondo verrà successivamente caricato in modalità Sopravvivenza. Vuoi davvero continuare? + +Questo mondo è stato precedentemente salvato in modalità Creativa. Gli obiettivi e gli aggiornamenti della classifica sono disabilitati. Vuoi davvero continuare? + +Questo mondo è stato precedentemente salvato in modalità Creativa. Gli obiettivi e gli aggiornamenti della classifica sono disabilitati. + +Se crei, carichi o salvi un mondo con l'opzione Privilegi dell'host abilitata, gli obiettivi e gli aggiornamenti della classifica saranno disabilitati e lo resteranno anche se quel mondo verrà successivamente caricato con l'opzione disattivata. Vuoi davvero continuare? + +Salvataggio dannegg. + +Questo salvataggio è danneggiato. Vuoi eliminarlo? + +Vuoi davvero tornare al menu principale e disconnettere tutti i giocatori? Tutti i progressi non salvati andranno persi. + +Esci e salva + +Esci senza salvare + +Vuoi davvero tornare al menu principale? Tutti i progressi non salvati andranno persi. + +Vuoi davvero tornare al menu principale? I progressi andranno persi! + +Crea nuovo mondo + +Avvia tutorial + +Tutorial + +Nomina il tuo mondo + +Immetti un nome per il tuo mondo + +Pianta il seme per la generazione del tuo mondo + +Carica mondo salvato + +Premi START per accedere alla partita + +Uscita dal gioco + +Si è verificato un errore. Tornerai al menu principale. + +Connessione non riuscita + +Connessione persa + +Connessione al server persa. Tornerai al menu principale. + +Connessione a Xbox Live persa. Tornerai al menu principale. + +Connessione a Xbox Live persa. + +Disconnesso dal server + +Sei stato espulso dalla partita + +Sei stato espulso dalla partita per comportamento scorretto + +Timeout del tentativo di connessione + +Server pieno + +L'host è uscito dal gioco. + +Non puoi accedere a questa partita perché non hai amici tra i partecipanti. + +Non puoi accedere a questa partita perché sei stato espulso dall'host in precedenza. + +Non puoi partecipare alla partita perché il giocatore a cui vuoi unirti ha una versione più vecchia del gioco. + +Non puoi partecipare alla partita perché il giocatore a cui vuoi unirti a una versione più nuova del gioco. + +Nuovo mondo + +Premio sbloccato! + +Evviva, hai ottenuto un'immagine del giocatore con Steve di Minecraft! + +Evviva, hai ottenuto un'immagine del giocatore con un creeper! + +Evviva, hai ottenuto un oggetto avatar: una t-shirt Minecraft: Xbox 360 Edition! +Vai alla dashboard per farla indossare al tuo avatar. + +Evviva, hai ottenuto un oggetto avatar: un orologio Minecraft: Xbox 360 Edition! +Vai alla dashboard per farlo indossare al tuo avatar. + +Evviva, hai ottenuto un oggetto avatar: un cappellino creeper! +Vai alla dashboard per farlo indossare al tuo avatar. + +Evviva, hai ottenuto il tema di Minecraft: Xbox 360 Edition! +Vai alla dashboard per selezionarlo. + +Sblocca gioco completo + +Stai giocando con la versione di prova, ma serve la versione completa per salvare i progressi. +Vuoi sbloccare il gioco completo ora? + +Questa è la versione di prova di Minecraft: Xbox 360 Edition. Se avessi il gioco completo, avresti sbloccato un obiettivo! +Vuoi sbloccare il gioco completo? + +Questa è la versione di prova di Minecraft: Xbox 360 Edition. Se avessi il gioco completo, avresti ottenuto un premio avatar! +Vuoi sbloccare il gioco completo? + +Questa è la versione di prova di Minecraft: Xbox 360 Edition. Se avessi il gioco completo, avresti ottenuto un'immagine del giocatore! +Vuoi sbloccare il gioco completo? + +Questa è la versione di prova di Minecraft: Xbox 360 Edition. Se avessi il gioco completo, avresti ottenuto un tema! +Vuoi sbloccare il gioco completo? + +Questa è la versione di prova di Minecraft: Xbox 360 Edition. Per accettare questo invito è necessario il gioco completo. +Vuoi sbloccare il gioco completo? + +I giocatori ospiti non possono sbloccare il gioco completo. Effettua l'accesso con un ID utente di Xbox Live. + +Attendi + +Nessun risultato + +Filtro: + +Amici + +Punt. personale + +Generale + +Totale: + +Posiz. + +Gamertag + +Preparazione al salvataggio livello + +Preparazione blocchi... + +Finalizzazione... + +Creazione terreno + +Simulazione mondo + +Inizializzazione server + +Creazione area di generazione + +Caricamento area di generazione + +Ingresso nel Sottomondo + +Uscita dal Sottomondo + +Rigenerazione + +Generazione livello + +Caricamento livello + +Salvataggio giocatori + +Connessione all'host + +Download terreno + +Passaggio a gioco offline + +Attendi mentre l'host salva il gioco + +Ingresso nel LIMITE + +Uscita dal LIMITE + +Ricerca Seme per generatore mondo + +Questo letto è occupato + +Puoi dormire solo di notte + +%s dorme in un letto. Per saltare all'alba, tutti i giocatori devono dormire in un letto contemporaneamente. + +Letto mancante o passaggio ostruito + +Non puoi riposare adesso: ci sono mostri nei paraggi + +Stai dormendo in un letto. Per saltare all'alba, tutti i giocatori devono dormire in un letto contemporaneamente. + +Attrezzi e armi + +Armi + +Cibo + +Strutture + +Armature + +Meccanismi + +Trasporto + +Decorazioni + +Blocchi da costruzione + +Pietra rossa e trasporti + +Varie + +Distillazione + +Distillazione + +Attrezzi, armi e armature + +Materiali + +Disconnesso + +Sei tornato alla schermata iniziale perché il tuo profilo giocatore si è disconnesso + +Difficoltà + +Musica + +Effetti + +Gamma + +Sensibilità gioco + +Sensibilità interfaccia + +Relax + +Facile + +Normale + +Difficile + +In questa modalità, il giocatore recupera salute col tempo e non ci sono nemici nell'ambiente. + +In questa modalità, vengono generati nemici nell'ambiente, ma infliggono danni minori rispetto alla modalità normale. + +In questa modalità, nell'ambiente vengono generati nemici che infliggono un danno standard al giocatore. + +In questa modalità, nell'ambiente vengono generati nemici che infliggono gravi danni al giocatore. Fai attenzione anche ai creeper: è improbabile che annullino il loro attacco esplosivo quando ti allontani! + +Timeout prova + +Hai giocato alla versione di prova di Minecraft: Xbox 360 Edition per il tempo massimo consentito! Per continuare a divertirti, vuoi sbloccare il gioco completo? + +Partita al completo + +Impossibile accedere: nessuno spazio rimasto + +Inserisci testo cartello + +Inserisci il testo per il cartello + +Inserisci titolo + +Inserisci un titolo per il tuo messaggio + +Inserisci didascalia + +Inserisci una didascalia per il tuo messaggio + +Inserisci descrizione + +Inserisci una descrizione per il tuo messaggio + +Inventario + +Ingredienti + +Banco di distillazione + +Cassa + +Incanta + +Fornace + +Ingrediente + +Combustibile + +Dispenser + +Nessuna offerta di contenuto scaricabile disponibile per questo titolo al momento. + +%s si unisce alla partita. + +%s ha abbandonato la partita. + +%s è stato espulso dal gioco. + +Vuoi davvero eliminare questo salvataggio? + +Da approvare + +Censurato + +In gioco: + +Resetta impostazioni + +Vuoi davvero ripristinare le impostazioni predefinite? + +Errore caricamento + +Caricamento "Minecraft: "Minecraft: Xbox 360 Edition" non riuscito, impossibile continuare. + +Gioco di %s + +Gioco con host sconosciuto + +Ospite disconnesso + +Un giocatore ospite si è disconnesso, rimuovendo tutti i giocatori ospite dal gioco. + +Accedi + +Non hai effettuato l'accesso. Per partecipare a questo gioco, devi prima accedere. Vuoi accedere ora? + +Multiplayer non consentito + +Impossibile accedere alla partita: uno o più giocatori non possono disputare partite multiplayer su Xbox Live. + +Impossibile creare una partita online: uno o più giocatori non possono disputare partite multiplayer su Xbox Live. Deseleziona la casella "Gioco online" per avviare una partita offline. + +Non ti è consentito accedere a questa sessione di gioco perché l'impostazione per i privilegi dei contenuti dell'abbonato è troppo restrittiva. Modificala nella sezione Impostazioni privacy e online della Xbox Dashboard se desideri accedere a questa sessione. + +Non ti è consentito accedere a questa sessione di gioco perché uno dei giocatori locali ha un'impostazione per i privilegi dei contenuti dell'abbonato troppo restrittiva. + +Non ti è consentito accedere a questa sessione di gioco perché uno dei giocatori nella sessione ha i privilegi dei contenuti dell'abbonato impostati su Solo amici, e tu non sei nella sua lista amici. + +Creazione di partita non riuscita + +Non ti è consentito creare questa sessione di gioco perché uno dei giocatori locali ha un'impostazione per i privilegi dei contenuti dell'abbonato troppo restrittiva. Deseleziona la casella "Gioco online" per avviare una partita offline, oppure modifica questa impostazione nella sezione Impostazioni privacy e online della Xbox Dashboard. + +Selezionato automaticamente + +No pacchetto: skin predef. + +Skin preferite + +Livello escluso + +Il gioco a cui stai cercando di accedere è nell'elenco dei livelli esclusi. +Se scegli di entrarvi comunque, il livello verrà rimosso dall'elenco dei livelli esclusi. + +Escludere questo livello? + +Vuoi davvero aggiungere questo livello all'elenco dei livelli esclusi? +Selezionando OK, uscirai da questa partita. + +Rimuovi da elenco esclusi + +Intervallo autosalvataggio + +Intervallo autosalvataggio: NO + +Min + +Impossibile collocare qui! + +Non è consentito collocare la lava accanto al punto di generazione del livello: i giocatori appena generati potrebbero morire immediatamente. + +Questo gioco utilizza una funzione di autosalvataggio. Quando appare l'icona qui sopra, il gioco sta salvando i dati. +Non spegnere la console Xbox 360 mentre l'icona è visualizzata. + +Opacità interfaccia + +Preparazione salvataggio livello + +Dimensioni dell'interfaccia + +Dimensioni dell'interfaccia (schermo diviso) + +Seme + +Sblocca pacchetto Skin + +Per usare la skin che hai selezionato, devi sbloccare questo pacchetto Skin. +Vuoi sbloccare il pacchetto Skin ora? + +Sblocca pacchetto texture + +Per usare questo pacchetto texture nel tuo mondo, devi prima sbloccarlo. +Vuoi sbloccarlo ora? + +Versione di prova pacchetto texture + +Stai usando una versione di prova del pacchetto texture. Non potrai salvare questo mondo, a meno che non sblocchi la versione completa. +Vuoi sbloccare la versione completa del pacchetto texture? + +Nessun pacchetto texture + +Sblocca versione completa + +Scarica versione di prova + +Scarica versione completa + +Questo mondo usa un pacchetto texture o mash-up che non hai! +Vuoi installare uno dei due pacchetti ora? + +Ottieni la versione di prova + +Ottieni la versione completa + +Espelli giocatore + +Sei sicuro di voler espellere questo giocatore dalla partita? Non potrà accedere finché non riavvii il mondo. + +Pacchetti Immagini del giocatore + +Temi + +Pacchetti Skin + +Accetta amici di amici + +Non puoi unirti a questa partita. L'host ha limitato l'accesso ai propri amici. + +Impossibile accedere alla partita + +Selezionato + +Skin selezionata: + +Contenuto scaricabile danneg. + +Questo contenuto scaricabile è danneggiato e non può essere usato. Cancellalo e installalo nuovamente dal menu del Negozio di Minecraft. + +Parte del contenuto scaricabile è danneggiato e non può essere usato. Cancella il contenuto e installalo nuovamente dal menu del Negozio di Minecraft. + +La modalità di gioco è cambiata + +Rinomina il mondo + +Inserisci il nuovo nome del tuo mondo + +Modalità: Sopravvivenza + +Modalità: Creativa + +Sopravvivenza + +Creativa + +In modalità Sopravvivenza + +In modalità Creativa + +Renderizza nuvole + +Cosa vuoi fare con questo salvataggio? + +Rinomina salvataggio + +Autosalvataggio tra %d... + +Sì + +No + +Normale + +Superpiatto + +Se attivato, il gioco sarà un gioco online. + +Se attivato, i giocatori potranno unirsi solo su invito. + +Se attivato, gli amici delle persone nella Lista amici potranno unirsi alla partita. + +Se l'opzione è abilitata, è possibile infliggere danni agli altri giocatori. Efficace solo in modalità Sopravvivenza. + +Se l'opzione è disabilitata, i giocatori che si uniscono alla partita non possono costruire o scavare fino a quando non vengono autorizzati. + +Se l'opzione è abilitata, il fuoco può propagarsi ai blocchi infiammabili vicini. + +Se l'opzione è abilitata, il TNT esplode quando viene attivato. + +Se l'opzione é abilitata, l'host può att./dis. la possibilità di volare, disabilitare la stanchezza e rendersi invisibile. Obiettivi e aggiornamenti della classifica verranno disabilitati. + +Quando è attivato, il Sottomondo viene rigenerato. È molto utile nel caso tu abbia un vecchio salvataggio nel quale non sono presenti Fortezze del Sottomondo. + +Se l'opzione è abilitata, nel mondo si genereranno strutture come Villaggi e Fortezze. + +Se l'opzione è abilitata, verrà generato un mondo completamente piatto tanto nel Sopramondo che nel Sottomondo. + +Se l'opzione è abilitata, vicino al punto di generazione del giocatore apparirà una cassa contenente alcuni oggetti utili. + +Pacchetti di skin + +Temi + +Immagini del giocatore + +Oggetti avatar + +Pacchetti Texture + +Pacchetti Mash-Up + +{*PLAYER*} ha preso fuoco + +{*PLAYER*} è bruciato vivo + +{*PLAYER*} ha cercato di nuotare nella lava + +{*PLAYER*} è soffocato dentro un muro + +{*PLAYER*} è affogato + +{*PLAYER*} è morto di fame + +{*PLAYER*} è morto in seguito a una puntura + +{*PLAYER*} si è schiantato al suolo + +{*PLAYER*} è caduto fuori dal mondo + +{*PLAYER*} è morto + +{*PLAYER*} è saltato in aria + +{*PLAYER*} è stato ucciso dalla magia + +Il Drago di Ender ha ucciso {*PLAYER*} con il suo alito + +{*PLAYER*} è stato ucciso da {*SOURCE*} + +{*PLAYER*} è stato ucciso da {*SOURCE*} + +{*PLAYER*} è stato colpito da un proiettile di {*SOURCE*} + +{*PLAYER*} è stato colpito con una palla di fuoco da {*SOURCE*} + +{*PLAYER*} è stato pestato a morte da {*SOURCE*} + +{*PLAYER*} è stato ucciso da {*SOURCE*} + +Nebbia substrato roccioso + +Mostra interfaccia + +Mostra mano + +Gamertag schermo diviso + +Messaggi di morte + +Personaggio animato + +Animazione skin personalizzata + +Non puoi più scavare né usare oggetti + +Ora puoi scavare e usare oggetti + +Non puoi più posizionare blocchi + +Ora puoi posizionare blocchi + +Ora puoi usare porte e interruttori + +Non puoi più usare porte e interruttori + +Ora puoi usare contenitori (es. casse) + +Non puoi più usare contenitori (es. casse) + +Non puoi più attaccare i nemici + +Ora puoi attaccare i nemici + +Non puoi più attaccare i giocatori + +Ora puoi attaccare i giocatori + +Non puoi più attaccare gli animali + +Ora puoi attaccare gli animali + +Ora sei un moderatore + +Non sei più un moderatore + +Ora puoi volare + +Non puoi più volare + +Non sentirai più la stanchezza + +Ora sentirai la stanchezza + +Ora sei invisibile + +Non sei più invisibile + +Ora sei invulnerabile + +Non sei più invulnerabile + +%d MSP + +Drago di Ender + +%s si trova ora nel Limite + +%s ha lasciato il Limite + + +{*C3*}Ho capito a quale giocatore ti riferisci.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Sì. Fai attenzione. Ha raggiunto un livello superiore. Può leggere le nostre menti.{*EF*}{*B*}{*B*} +{*C2*}Non importa. Crede che siamo parte del gioco.{*EF*}{*B*}{*B*} +{*C3*}Mi piace, questo giocatore. Ha giocato bene. Non si è arreso.{*EF*}{*B*}{*B*} +{*C2*}Sta leggendo i nostri pensieri come se fossero parole su uno schermo.{*EF*}{*B*}{*B*} +{*C3*}È così che riesce a immaginare molte cose, quando è immerso nel sogno di un gioco.{*EF*}{*B*}{*B*} +{*C2*}Le parole sono un'interfaccia meravigliosa, estremamente flessibile e molto meno spaventosa del guardare la realtà oltre lo schermo.{*EF*}{*B*}{*B*} +{*C3*}Prima erano soliti ascoltare voci. Prima i giocatori erano in grado di leggere. Un tempo, chi non giocava chiamava i giocatori "streghe" e "stregoni", e i giocatori sognavano di volare su bastoni alimentati dall'energia dei demoni.{*EF*}{*B*}{*B*} +{*C2*}Cosa sognava questo giocatore?{*EF*}{*B*}{*B*} +{*C3*}Sognava la luce del sole, gli alberi... Sognava l'acqua e il fuoco... Sognava di creare, e sognava di distruggere... Sognava di cacciare e di essere preda... Sognava un riparo.{*EF*}{*B*}{*B*} +{*C2*}Ah, l'interfaccia originale... È vecchia di un milione di anni, ma ancora funziona. Ma quale vera struttura ha creato questo giocatore, nella realtà oltre lo schermo?{*EF*}{*B*}{*B*} +{*C3*}Ha funzionato, con oltre un milione di altri individui, per scolpire un vero mondo in una piega di {*EF*}{*NOISE*}{*C3*}, e ha creato {*EF*}{*NOISE*}{*C3*} per {*EF*}{*NOISE*}{*C3*}, in {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}Non può leggere quel pensiero.{*EF*}{*B*}{*B*} +{*C3*}No. Non ha ancora raggiunto il livello più alto. Deve arrivarci nel lungo sogno della vita, non nella brevità di un gioco.{*EF*}{*B*}{*B*} +{*C2*}Sa che lo amiamo? Che l'universo è buono?{*EF*}{*B*}{*B*} +{*C3*}A volte, attraverso il rumore dei suoi pensieri, egli ascolta l'universo, sì.{*EF*}{*B*}{*B*} +{*C2*}Capita, però, che nel lungo sogno sia triste. Crea mondi senza estate, trema sotto un sole nero, e crede che la sua triste creazione sia la realtà.{*EF*}{*B*}{*B*} +{*C3*}Se lo guarissimo dal dolore lo distruggeremmo. Il dolore è parte del suo compito personale. Noi non possiamo interferire.{*EF*}{*B*}{*B*} +{*C2*}A volte, quando sognano profondamente, vorrei dire loro che in realtà stanno costruendo dei veri mondi. Vorrei svelare l'importanza che essi hanno per l'universo. E quando non hanno effettuato un vero collegamento per molto tempo, vorrei aiutarli a pronunciare la parola che temono.{*EF*}{*B*}{*B*} +{*C3*}Legge i nostri pensieri.{*EF*}{*B*}{*B*} +{*C2*}Non me ne importa. Certe volte vorrei dire loro che questo mondo che ritengono reale è solo {*EF*}{*NOISE*}{*C2*} e {*EF*}{*NOISE*}{*C2*}. Mi piacerebbe dire loro che sono {*EF*}{*NOISE*}{*C2*} nel {*EF*}{*NOISE*}{*C2*}. Vedono una parte minuscola della realtà, nel loro lungo sogno...{*EF*}{*B*}{*B*} +{*C3*}Eppure, essi continuano a giocare.{*EF*}{*B*}{*B*} +{*C2*}Sarebbe così facile dire tutto...{*EF*}{*B*}{*B*} +{*C3*}La rivelazione sarebbe troppo forte per questo sogno. Dire come vivere impedirebbe loro di vivere.{*EF*}{*B*}{*B*} +{*C2*}Non dirò al giocatore come vivere.{*EF*}{*B*}{*B*} +{*C3*}Il giocatore si sta inquietando.{*EF*}{*B*}{*B*} +{*C2*}Narrerò una storia al giocatore.{*EF*}{*B*}{*B*} +{*C3*}Ma non racconterò la verità.{*EF*}{*B*}{*B*} +{*C2*}No. Sarà una storia che conterrà la verità in modo sicuro, protetta da una gabbia di parole. Non dirò la cruda verità che può bruciare a qualsiasi distanza.{*EF*}{*B*}{*B*} +{*C3*}Dagli di nuovo un corpo.{*EF*}{*B*}{*B*} +{*C2*}Sì. Giocatore...{*EF*}{*B*}{*B*} +{*C3*}Usa il suo nome.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Giocatore.{*EF*}{*B*}{*B*} +{*C3*}Bene.{*EF*}{*B*}{*B*} + + + +{*C2*}Ora respira profondamente. Respira ancora. Senti l'aria nei polmoni. I tuoi arti stanno tornando. Sì, muovi le dita... Hai di nuovo un corpo, nell'aria, soggetto alla forza di gravità. Rigenerati nel lungo sogno. Eccoti. Il tuo corpo tocca ancora una volta l'universo, in tutti i suoi punti, come se foste cose separate. Come se noi fossimo entità separate.{*EF*}{*B*}{*B*} +{*C3*}Chi siamo? Un tempo eravamo chiamati gli spiriti della montagna. Padre Sole, Madre Luna. Spiriti ancestrali... Spiriti animali... Jinn, fantasmi. Poi l'uomo verde. E ancora dei, demoni, angeli... Spiriti, alieni, extraterrestri... Infine leptoni, quark... Le parole cambiano. Noi non cambiamo.{*EF*}{*B*}{*B*} +{*C2*}Noi siamo l'universo. Siamo tutto ciò che credi non sia te. Ora ci stai guardando, attraverso la tua pelle e i tuoi occhi. Perché l'universo sfiora la tua pelle e ti inonda di luce? Per guardarti, giocatore. Per conoscersi e per farsi conoscere. Voglio raccontarti una storia.{*EF*}{*B*}{*B*} +{*C2*}Un tempo c'era un giocatore...{*EF*}{*B*}{*B*} +{*C3*}Quel giocatore eri tu, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}A volte il giocatore pensava di essere una creatura umana sulla sottile crosta di un globo rotante fatto di roccia fusa. Il globo di roccia fusa girava intorno a una sfera di gas fiammeggianti che era trecentotrentamila volte più grande di esso. La sfera era talmente distante dal globo che la luce impiegava otto minuti per viaggiare dall'una all'altro. La luce era informazione che veniva da una stella, e poteva bruciarti la pelle da una distanza di centocinquanta milioni di chilometri.{*EF*}{*B*}{*B*} +{*C2*}A volte il giocatore sognava di essere un minatore sulla superficie di un mondo piatto e infinito. Il sole era un quadrato bianco. I giorni erano brevi. C'era sempre molto da fare, e la morte non era altro che un inconveniente temporaneo.{*EF*}{*B*}{*B*} +{*C3*}A volte il giocatore credeva di essere parte di una storia.{*EF*}{*B*}{*B*} +{*C2*}A volte il giocatore sognava di essere altre cose in luoghi diversi. Alcuni di quei sogni erano sgradevoli, altri meravigliosi. Capitava anche che il giocatore si svegliasse da un sogno e si ritrovasse in un altro, per poi destarsi anche da quello e scoprirsi in un terzo sogno.{*EF*}{*B*}{*B*} +{*C3*}A volte il giocatore sognava di guardare delle parole su uno schermo.{*EF*}{*B*}{*B*} +{*C2*}Torniamo indietro.{*EF*}{*B*}{*B*} +{*C2*}Gli atomi del giocatore erano sparsi nell'erba, nei fiumi, nell'aria, nel suolo. Una donna raccolse gli atomi; li bevve, li mangiò, li respirò. La donna ricostruì il giocatore nel proprio corpo.{*EF*}{*B*}{*B*} +{*C2*}Il giocatore si svegliò dal caldo, buio mondo del corpo di sua madre e si ritrovò nel lungo sogno.{*EF*}{*B*}{*B*} +{*C2*}Il giocatore era una nuova storia, mai narrata prima, scritta con lettere di DNA. E il giocatore era un nuovo programma, mai eseguito prima, generato da un codice sorgente vecchio di miliardi di anni. E il giocatore era un nuovo essere umano, che non aveva mai vissuto prima, fatto solo di latte e amore.{*EF*}{*B*}{*B*} +{*C3*}Tu sei il giocatore. La storia. Il programma. L'essere umano. Sei fatto solo di latte e amore.{*EF*}{*B*}{*B*} +{*C2*}Torniamo ancora più indietro.{*EF*}{*B*}{*B*} +{*C2*}I sette miliardi di miliardi di miliardi di atomi che compongono il corpo del giocatore furono creati molto tempo prima di questo gioco, nel cuore di una stella. Quindi, anche il giocatore è informazione che proviene da una stella. Il giocatore si muove in una storia, che è una foresta di informazioni seminata da un uomo di nome Julian su un mondo piatto e infinito creato da un altro uomo chiamato Markus, che esiste nel piccolo mondo personale creato dal giocatore, che vive in un universo creato da...{*EF*}{*B*}{*B*} +{*C3*}Silenzio... A volte il giocatore creava il suo piccolo mondo personale, e lo faceva caldo, tenero, semplice. Altre volte lo faceva duro, freddo e complesso. A volte creava un modello dell'universo che aveva in mente, punti di energia che si muovono attraverso ampi spazi vuoti. A volte chiamava questi punti "elettroni" e "protoni".{*EF*}{*B*}{*B*} + + + +{*C2*}A volte li chiamava "pianeti" e "stelle".{*EF*}{*B*}{*B*} +{*C2*}A volte credeva di esistere in un universo fatto di energia composta da serie di on e di off, di zero e di uno, di linee di codice. A volte credeva di giocare a un gioco. A volte credeva di leggere parole su uno schermo.{*EF*}{*B*}{*B*} +{*C3*}Tu sei il giocatore che legge le parole...{*EF*}{*B*}{*B*} +{*C2*}Silenzio... A volte il giocatore leggeva linee di codice su uno schermo, le scomponeva in parole e da esse ricavava un significato, che diventava sensazioni, emozioni, teorie e idee. Il giocatore iniziò a respirare più velocemente, più profondamente... Si era reso conto di essere vivo. Era vivo. Le migliaia di morti attraverso le quali era passato non erano reali. Il giocatore era vivo{*EF*}{*B*}{*B*} +{*C3*}Tu... Tu... sei... vivo.{*EF*}{*B*}{*B*} +{*C2*}E a volte il giocatore credeva che l'universo gli avesse parlato mediante i raggi di sole che filtravano tra le foglie ondeggianti sugli alberi d'estate...{*EF*}{*B*}{*B*} +{*C3*}E a volte il giocatore pensava che l'universo gli avesse parlato tramite la luce che cadeva dal limpido cielo delle notti invernali, quando un puntino luminoso nell'angolo del suo occhio poteva essere una stella milioni di volte più grande del sole, che trasformava i suoi pianeti in plasma incandescente per essere visibile per un solo istante al giocatore, che tornava a casa, dall'altro lato dell'universo, e sentiva il profumo dei cibi sulla porta a lui familiare, poco prima di rimettersi a sognare.{*EF*}{*B*}{*B*} +{*C2*}E a volte il giocatore credeva che l'universo gli avesse parlato con serie di zero e di uno, attraverso l'elettricità del mondo, con le parole che comparivano su uno schermo alla fine di un sogno.{*EF*}{*B*}{*B*} +{*C3*}L'universo gli diceva "ti amo"...{*EF*}{*B*}{*B*} +{*C2*}E l'universo gli diceva "hai giocato bene"...{*EF*}{*B*}{*B*} +{*C3*}E l'universo gli diceva "tutto ciò di cui hai bisogno è dentro di te"...{*EF*}{*B*}{*B*} +{*C2*}E l'universo gli diceva "sei più forte di quanto tu creda"...{*EF*}{*B*}{*B*} +{*C3*}E l'universo gli diceva "sei la luce del giorno"...{*EF*}{*B*}{*B*} +{*C2*}E l'universo gli diceva "tu sei la notte"...{*EF*}{*B*}{*B*} +{*C3*}E l'universo gli diceva "l'oscurità che combatti è dentro di te"...{*EF*}{*B*}{*B*} +{*C2*}E l'universo gli diceva "la luce che cerchi è dentro di te"...{*EF*}{*B*}{*B*} +{*C3*}E l'universo gli diceva "non sei solo"...{*EF*}{*B*}{*B*} +{*C2*}E l'universo gli diceva "tu non sei separato da tutte le altre cose"...{*EF*}{*B*}{*B*} +{*C3*}E l'universo gli diceva "tu sei l'universo che assapora sé stesso, che parla a sé stesso, che legge il proprio codice"...{*EF*}{*B*}{*B*} +{*C2*}E l'universo gli diceva "ti amo perché tu sei amore"...{*EF*}{*B*}{*B*} +{*C3*}E il gioco terminò, e il giocatore si svegliò dal sogno. Il giocatore iniziò un nuovo sogno, migliore del precedente. Il giocatore era l'universo. Il giocatore era amore.{*EF*}{*B*}{*B*} +{*C3*}Tu sei il giocatore.{*EF*}{*B*}{*B*} +{*C2*}Svegliati.{*EF*} + + +Resetta Sottomondo + +Ripristinare le impostazioni iniziali del Sottomondo in questo salvataggio? Tutto ciò che hai creato nel Sottomondo andrà perso! + +Resetta Sottomondo + +Non ripristinare il Sottomondo + +Impossibile tosare il muccafungo al momento. Hai raggiunto il numero massimo di maiali, pecore, mucche e gatti. + +Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di maiali, pecore, mucche e gatti. + +Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di muccafunghi. + +Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di lupi. + +Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di galline. + +Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di calamari. + +Impossibile usare Uovo rigenerazione al momento. È stato raggiunto il numero massimo di nemici nel mondo. + +Impossibile usare Uovo rigenerazione al momento. È stato raggiunto il numero massimo di villici nel mondo. + +Hai raggiunto il limite per i Telai di dipinti/oggetti di un mondo. + +Non puoi generare nemici in modalità Relax. + +Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di maiali, pecore, mucche e gatti. + +Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di riproduzione di lupi. + +Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di riproduzione di galline. + +Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di riproduzione di muccafunghi. + +È stato raggiunto il numero massimo di navi per mondo. + +Hai raggiunto il numero massimo di teste di Mob in un mondo. + +Inverti + +Mancino + +Sei morto! + +Rigenera + +Offerte contenuto scaricabile + +Cambia skin + +Come giocare + +Comandi + +Impostazioni + +Riconoscimenti + +Reinstalla contenuto + +Impostazioni debug + +Diffusione incendio + +Esplosione TNT + +Giocatore vs Giocatore + +Autorizza giocatori + +Privilegi dell'host + +Genera strutture + +Mondo superpiatto + +Cassa bonus + +Opzioni mondo + +Può costruire e scavare + +Può usare porte e interruttori + +Può aprire contenitori + +Può attaccare i giocatori + +Può attaccare gli animali + +Moderatore + +Espelli giocatore + +Può volare + +Disabilita stanchezza + +Invisibile + +Opzioni host + +Giocatori/Invito + +Partita online + +Solo invito + +Altre opzioni + +Carica + +Nuovo mondo + +Nome mondo + +Seme per generatore mondo + +Lascia vuoto per seme casuale + +Giocatori + +Unisciti alla partita + +Avvia gioco + +Nessuna partita trovata + +Gioca + +Classifiche + +Obiettivi + +Guida e opzioni + +Sblocca gioco completo + +Riprendi gioco + +Salva gioco + +Difficoltà: + +Tipo di gioco: + +Gamertag: + +Strutture: + +Tipo di livello: + +GvG: + +Autorizza giocatori: + +TNT: + +Diffusione incendio: + +Reinstalla tema + +Reinstalla immagine del giocatore 1 + +Reinstalla immagine del giocatore 2 + +Reinstalla oggetto avatar 1 + +Reinstalla oggetto avatar 2 + +Reinstalla oggetto avatar 3 + +Opzioni + +Audio + +Comando + +Grafica + +Interfaccia utente + +Ripristina predefinite + +Vedi bobbing + +Aiuti + +Aiuti contestuali del gioco + +Gamertag nel gioco + +2 giocatori schermo diviso verticale + +Fatto + +Modifica messaggio cartello: + +Inserisci i dettagli del tuo screenshot + +Didascalia + +Screenshot del gioco + +Modifica messaggio cartello: + +Guarda cosa ho fatto a Minecraft: Xbox 360 Edition! + +Texture, icone e interfaccia classiche di Minecraft! + +Mostra tutti i mondi Mash-up + +Seleziona Trasferisci slot salvataggio + +Slot vuoto + +Caricamento metadati salvataggio + +Caricamento dati salvati + +Caricamento salvataggio per Xbox One + +Caricamento annullato + +Hai annullato il caricamento di questo salvataggio sull'area trasferimento salvataggio. + +Nessun effetto + +Velocità + +Lentezza + +Fretta + +Fatica del minatore + +Forza + +Debolezza + +Guarigione istantanea + +Danno istantaneo + +Salto potenziato + +Nausea + +Rigenerazione + +Resistenza + +Resistenza al fuoco + +Apnea + +Invisibilità + +Cecità + +Visione notturna + +Fame + +Veleno + +della Velocità + +della Lentezza + +della Fretta + +dell'Opacità + +della Forza + +della Debolezza + +della Guarigione + +del Danno + +del Salto + +della Nausea + +della Rigenerazione + +della Resistenza + +della Resistenza al fuoco + +dell'Apnea + +dell'Invisibilità + +della Cecità + +della Visione notturna + +della Fame + +del Veleno + + + +II + +III + +IV + +Bomba + +Prosaica + +Banale + +Blanda + +Chiara + +Opaca + +Diffusa + +Rozza + +Sottile + +Maldestra + +Insipida + +Voluminosa + +Pasticciata + +Imburrata + +Amabile + +Affabile + +Distinta + +Densa + +Elegante + +Elaborata + +Affascinante + +Prestante + +Raffinata + +Cordiale + +Frizzante + +Potente + +Pessima + +Inodore + +Rancida + +Aspra + +Acida + +Disgustosa + +Puzzolente + +Si usa in un Banco di distillazione come base per tutte le pozioni. + +Non ha effetti; può essere usata in un Banco di distillazione per creare pozioni aggiungendo altri ingredienti. + +Aumenta la velocità di movimento di giocatori, animali e mostri affetti. Nei giocatori affetti aumenta inoltre la velocità di scatto, la lunghezza dei salti e il campo visivo. + +Riduce la velocità di movimento di giocatori, animali e mostri affetti. Nei giocatori affetti riduce inoltre la velocità di scatto, la lunghezza dei salti e il campo visivo. + +Aumenta i danni provocati con l'attacco da giocatori e mostri affetti. + +Riduce i danni provocati con l'attacco da giocatori e mostri affetti. + +Aumenta istantaneamente la salute di giocatori, animali e mostri affetti. + +Riduce istantaneamente la salute di giocatori, animali e mostri affetti. + +Restituisce progressivamente salute a giocatori, animali e mostri affetti. + +Rende giocatori, animali e mostri affetti immuni ai danni causati da fuoco, lava e attacchi a distanza di Vampe. + +Riduce progressivamente la salute di giocatori, animali e mostri affetti. + +Acutezza + +Percossa + +Flagello degli Artropodi + +Atterramento + +Aspetto di Fuoco + +Protezione + +Protezione dal Fuoco + +Caduta della Piuma + +Protezione dalle esplosioni + +Protezione dai proiettili + +Respirazione + +Affinità con l'acqua + +Efficienza + +Tocco di Seta + +Durezza + +Saccheggio + +Fortuna + +Potenza + +Fiamma + +Pugno + +Infinito + +I + +II + +III + +IV + +V + +VI + +VII + +VIII + +IX + +X + +Si scava con una piccozza di ferro o migliore, per ottenere smeraldi. + +È simile a un forziere, ma gli oggetti posti in un forziere di Ender sono disponibili in tutti i forzieri di Ender, anche se di dimensioni diverse. + +Si attiva quando qualcosa passa sul filo collegato. + +Attiva un gancio a filo collegato quando qualcosa ci passa sopra. + +Una soluzione compatta per conservare gli smeraldi. + +Un muro fatto di ciottoli. + +Si può usare per riparare armi, attrezzi e armature. + +Si può fondere nelle fornaci per produrre quarzo del Sottomondo. + +Si usa come decorazione. + +Si usa per commerciare con gli abitanti dei villaggi. + +Si usa come decorazione. Al suo interno si possono piantare fiori, arbusti, cactus e funghi. + +Fa recuperare 2 {*ICON_SHANK_01*} e si può creare da una carota d'oro. Si può piantare sulle zolle. + +Fa recuperare 0,5 {*ICON_SHANK_01*} o si può cuocere nelle fornaci. Si può piantare sulle zolle. + +Fa recuperare 3 {*ICON_SHANK_01*}. Si crea cucinando una patata nella fornace. + +Reintegra 1 {*ICON_SHANK_01*}, o si può cucinare nella fornace. Si può piantare sulle zolle. Può avvelenarti. + +Reintegra 3 {*ICON_SHANK_01*}. Si realizza usando una carota e delle pepite d'oro. + +Si usa per controllare un maiale sellato quando lo si cavalca. + +Fa recuperare 4 {*ICON_SHANK_01*}. + +Si usa con un'incudine per incantare armi, attrezzi e armature. + +Si crea scavando il minerale di quarzo del Sottomondo. Si può trasformare in un blocco di quarzo. + +Si realizza con la lana. Si usa come decorazione. + +Smeraldo + +Vaso di fiori + +Carota + +Patata + +Patata arrostita + +Patata velenosa + +Carota d'oro + +Carota e bastone + +Torta di zucca + +Libro incantato + +Quarzo del Sottomondo + +Minerale di smeraldo + +Forziere di Ender + +Gancio a filo + +Filo + +Blocco di smeraldo + +Muro di ciottoli + +Muro di ciottoli coperto di muschio + +Vaso di fiori + +Carote + +Patate + +Incudine + +Incudine + +Incudine poco danneggiata + +Incudine molto danneggiata + +Minerale di quarzo del Sottomondo + +Blocco di quarzo + +Blocco di quarzo cesellato + +Blocco portante di quarzo + +Scale di quarzo + +Tappeto + +Tappeto nero + +Tappeto rosso + +Tappeto verde + +Tappeto marrone + +Tappeto blu + +Tappeto viola + +Tappeto ciano + +Tappeto grigio chiaro + +Tappeto grigio + +Tappeto rosa + +Tappeto lime + +Tappeto giallo + +Tappeto azzurro + +Tappeto magenta + +Tappeto arancione + +Tappeto bianco + +Arenaria cesellata + +Arenaria liscia + +{*PLAYER*} ha perso la vita mentre cercava di far male a {*SOURCE*} + +Un'incudine è caduta e ha schiacciato {*PLAYER*}. + +Un blocco è caduto e ha schiacciato {*PLAYER*}. + +{*PLAYER*} ha raggiunto {*DESTINATION*} grazie al teletrasporto + +{*PLAYER*} ti ha fatto raggiungere il luogo dove si trova usando il teletrasporto + +{*PLAYER*} ti ha teletrasportato + +Spine + +Lastra di quarzo + +Le aree buie appaiono come se fossero alla luce del giorno, anche sott'acqua. + +Rende invisibili i giocatori, gli animali e i mostri che subiscono l'effetto. + +Ripara e dai un nome + +Costo incantesimo: %d + +Troppo caro! + +Cambia il nome + +Hai: + +Oggetti richiesti per lo scambio + +{*VILLAGER_TYPE*} offre %s + +Ripara + +Scambia + +Tingi il collare + + + Questa è l'interfaccia dell'incudine, che puoi usare per riparare, cambiare nome e applicare incantesimi ad armi, armature e attrezzi, al costo di livelli di esperienza. + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sull'interfaccia incudine.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + + + Per iniziare a lavorare su un oggetto, ponilo nel primo slot di inserimento. + + + + Quando la corretta materia prima (ad esempio, dei lingotti di ferro per riparare una spada di ferro danneggiata) è messa nel secondo slot di inserimento, la riparazione proposta comparirà nello slot di uscita. + + + + In alternativa, è possibile mettere nel secondo slot di inserimento un oggetto uguale a quello posto nel primo slot. I due oggetti saranno combinati tra loro. + + + + Per incantare un oggetto sull'incudine, posiziona un libro incantato nel secondo slot di inserimento. + + + + Sotto il risultato compare il numero di livelli di esperienza che il lavoro ti costerà. Se non hai livelli di esperienza a sufficienza, la riparazione non potrà essere completata. + + + + Puoi cambiare nome all'oggetto modificando quello che compare nel riquadro del testo. + + + + Quando prendi l'oggetto riparato, gli oggetti usati dall'incudine scompaiono e il tuo livello di esperienza si riduce della quantità indicata. + + + + In quest'area ci sono un'incudine e un forziere che contengono attrezzi e armi su cui puoi lavorare. + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sull'incudine.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + + + Usando l'incudine è possibile riparare armi e attrezzi per ripristinarne la durata, cambiare il loro nome e aggiungere incantesimi mediante i libri incantati. + + + + È possibile trovare i libri incantati all'interno di forzieri posti nei dungeon, oppure puoi crearli al Tavolo per incantesimi lanciando incantesimi sui libri normali. + + + + Usare l'incudine costa livelli di esperienza e, a ogni utilizzo, c'è la possibilità che essa si danneggi. + + + + Il tipo di lavoro da svolgere, il valore dell'oggetto, il numero di incantesimi e la quantità di lavoro precedente influiscono sul costo della riparazione. + + + + Cambiare il nome a un oggetto modifica il nome mostrato per tutti i giocatori e riduce in modo permanente il costo del lavoro precedente. + + + + Nel forziere in quest'area troverai piccozze danneggiate, materie prime, bottiglie magiche e libri incantati, tutti oggetti con i quali potrai condurre qualche esperimento. + + + + Questa è l'interfaccia del commercio, che mostra quali scambi puoi fare con un abitante del villaggio. + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sull'interfaccia del commercio.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + + + Nella parte superiore compaiono gli scambi che l'abitante del villaggio è disposto a fare in questo momento. + + + + Gli scambi indicati in rosso sono quelli che non puoi fare perché non disponi degli oggetti richiesti. + + + + Il tipo e la quantità di oggetti che offri all'abitante del villaggio compaiono nei due slot a sinistra. + + + + Nei due slot a sinistra è indicato il numero totale di oggetti richiesti per lo scambio. + + + + Premi{*CONTROLLER_VK_A*} per scambiare gli oggetti chiesti dall'abitante del villaggio con quello offerto. + + + + In quest'area ci sono un abitante del villaggio e un forziere contenente carta per acquistare oggetti. + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sul commercio.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + + + I giocatori possono scambiare con gli abitanti dei villaggi gli oggetti presenti nell'inventario. + + + + Gli oggetti che gli abitanti dei villaggi sono propensi a scambiare dipendono in massima parte dal mestiere che essi svolgono. + + + + Effettuare più scambi modifica in modo casuale l'elenco degli oggetti (anche aggiungendone di nuovi) che l'abitante del villaggio è disposto a scambiare. + + + + Il commercio degli oggetti che sono stati scambiati molto di frequente può essere temporaneamente sospeso. In ogni caso, l'abitante del villaggio avrà comunque almeno un oggetto da scambiare. + + + + Prendi della carta dal forziere e prova a scambiarla con l'abitante del villaggio. + + + + In quest'area ci sono due forzieri di Ender. + + + + {*B*} + Premi{*CONTROLLER_VK_A*} per saperne di più sui forzieri di Ender.{*B*} + Premi{*CONTROLLER_VK_B*} se non hai bisogno di spiegazioni al riguardo. + + + + Tutti i forzieri di Ender presenti in un mondo sono collegati tra loro, anche attraverso dimensioni diverse. Attraverso uno qualsiasi dei forzieri di Ender, è possibile accedere agli oggetti messi in uno qualunque dei forzieri di Ender. + + + + Comunque, il contenuto dei forzieri di Ender è diverso per ciascun giocatore. + + + + In tal modo, i giocatori possono riporre i loro oggetti in qualsiasi forziere di Ender, e prenderli da qualsiasi forziere di Ender posto in qualsivoglia parte del mondo. Prova a mettere degli oggetti in uno dei forzieri di Ender. + + +Fa recuperare 2 {*ICON_SHANK_01*}, rigenera la salute per 30 secondi e dona resistenza al fuoco e resistenza ai danni per 5 minuti. Si crea usando una mela e dei blocchi d'oro. + +Può usare il teletrasporto + +Teletrasporto + +Teletrasporto verso il giocatore + +Teletrasporto verso di me + +Può disabilitare la stanchezza + +Può diventare invisibile + +Ora puoi attivare l'invisibilità + +Non puoi più attivare l'invisibilità + +Ora puoi attivare il volo + +Non puoi più attivare il volo + +Ora puoi disabilitare la stanchezza + +Non puoi più disabilitare la stanchezza + +Ora puoi usare il teletrasporto + +Non puoi più usare il teletrasporto + +{*T3*}COME GIOCARE: L'INCUDINE{*ETW*}{*B*}{*B*} +I livelli Esperienza possono anche essere usati per riparare o incantare gli oggetti con l'incudine, o per dar loro un nuovo nome.{*B*} +È possibile cambiare il nome a tutti gli oggetti, ma solo quelli durevoli possono essere riparati o ricevere incantesimi tramite i libri incantati.{*B*} +Per riparare un oggetto, mettilo in uno degli slot di inserimento posti sulla sinistra insieme a qualcuna delle materie prime da cui è composto (ad esempio, dei lingotti di ferro nel caso l'oggetto da riparare sia una spada di ferro) oppure combinalo con un altro oggetto dello stesso tipo.{*B*} +Usare un'incudine per combinare gli oggetti permette di lavorare con maggiore efficienza. Inoltre, gli incantesimi eventualmente presenti negli oggetti usati per la combinazione potrebbero passare al prodotto finito.{*B*} +I libri incantati possono incantare gli oggetti se combinati mediante un'incudine, a patto che l'incantesimo del libro sia adatto. È possibile trovare i libri incantati nei forzieri all'interno dei dungeon, ma si può anche incantare un libro normale usando il Tavolo per incantesimi.{*B*} +L'incudine può subire danni ogni volta che viene usata, e si romperà definitivamente dopo numerosi utilizzi.{*B*} + + +{*T3*}COME GIOCARE: COMMERCIO{*ETW*}{*B*}{*B*} +Puoi scambiare oggetti con gli abitanti dei villaggi. Ciascun abitante svolge un mestiere: ci sono contadini, macellai, fabbri, librai e sacerdoti, e il loro lavoro determina il tipo di oggetti che ciascuno di essi potrebbe scambiare.{*B*} +Nel menu del commercio troverai l'elenco di tutti gli oggetti che un abitante del villaggio offre. Quando un giocatore effettua scambi con un abitante di un villaggio, costui può modificare l'elenco degli oggetti offerti, anche aggiungendone di nuovi. Se un oggetto fosse scambiato troppo di frequente, il suo commercio potrebbe essere temporaneamente sospeso.{*B*} +Di norma, i commerci si svolgono acquistando o vendendo una certa quantità di oggetti in cambio di smeraldi.{*B*} +Se non disponi degli oggetti necessari per concludere uno scambio, gli oggetti sono colorati in rosso.{*B*} + + +{*T3*}COME GIOCARE: FORZIERI DI ENDER {*ETW*}{*B*}{*B*} +Tutti i forzieri di Ender presenti in un mondo sono collegati tra loro, quindi puoi accedere al contenuto di uno di essi tramite qualsiasi forziere di Ender. Il contenuto dei forzieri di Ender è diverso per ogni giocatore. I giocatori possono usare i forzieri di Ender per custodire i loro oggetti in tutta sicurezza e recuperarli da altri forzieri di Ender posti in qualsiasi parte del mondo. + + +Contadino + +Libraio + +Sacerdote + +Fabbro + +Macellaio + +Si trovano nei villaggi. Gli abitanti dei villaggi si offrono di vendere al giocatore oggetti che cambiano in base al loro mestiere. + +Forziere grande + + + È anche possibile creare i libri incantati al Tavolo per incantesimi. Successivamente, potrai usare i libri incantati con l'incudine per applicare i loro incantesimi agli oggetti. + + + + I ganci a filo forniscono anche energia costante a un circuito mentre qualcosa aziona la corda posta tra di essi. + + + + Dopo che sono stati ammansiti, i lupi indossano sempre il collare. Il colore del collare può essere cambiato usando le tinture. + + +Le carote e le patate si coltivano piantando carote e patate. Il raccolto è pronto quando i vegetali spuntano dal suolo. + + + Inoltre, i maiali possono essere sellati e poi cavalcati dai giocatori. È possibile controllare i maiali cavalcati dirigendoli con carota e bastone. + + + + Se necessario, puoi far muovere lentamente il carrello da miniera con {*CONTROLLER_ACTION_MOVE*}. In questo modo aiuterai il carrello a partire facendolo arrivare su un binario potenziato. + + +Non puoi unirti a questa partita perché lo schermo diviso è supportato solo in modalità Alta definizione. Se vuoi prendere parte al gioco, fai uscire tutti gli altri giocatori. + +Cura + +Xbox 360 + +Indietro + +L'opzione disabilita gli obiettivi e gli aggiornamenti della classifica durante il gioco e, se la partita viene salvata con l'opzione abilitata, l'impostazione rimane anche quando lo stesso mondo viene caricato di nuovo successivamente. + +Carica salvataggio per Xbox One + +Carica salvataggio + +Solo un salvataggio Xbox 360 può essere caricato nell'area trasferimento salvataggio. Assicurati di aver scaricato il salvataggio sulla tua console Xbox One prima di caricare un altro salvataggio Xbox 360. + +Caricamento... + +Caricamento completo! + +Caricamento non riuscito. Riprova più tardi. + + diff --git a/Minecraft.Client/Common/Media/ja-JP/4J_strings.resx b/Minecraft.Client/Common/Media/ja-JP/4J_strings.resx new file mode 100644 index 00000000..63927afe --- /dev/null +++ b/Minecraft.Client/Common/Media/ja-JP/4J_strings.resx @@ -0,0 +1,108 @@ + +未使用 + +OK + +戻る + +キャンセル + +ã¯ã„ + +ã„ã„㈠+ +ç ´æã—ãŸã‚»ãƒ¼ãƒ–データ + +セーブデータãŒç ´æã—ã¦ã„ã¾ã™ã€‚æ–°ã—ã„セーブデータを作æˆã—ã€ç ´æã—ãŸãƒ‡ãƒ¼ã‚¿ã‚’上書ãã—ã¾ã™ã‹? + +空ã容é‡ãŒä¸è¶³ã—ã¦ã„ã¾ã™ + +é¸æŠžã•れã¦ã„るデータä¿å­˜æ©Ÿå™¨ã«ã¯ã€æ–°ã—ã„セーブデータを作æˆã™ã‚‹ãŸã‚ã®ç©ºã容é‡ãŒã‚りã¾ã›ã‚“ + +別ã®ãƒ‡ãƒ¼ã‚¿ä¿å­˜æ©Ÿå™¨ã‚’é¸æŠž + +セーブãªã—ã§ãƒ—レイ + +æ–°ã—ã„ã‚»ãƒ¼ãƒ–ãƒ‡ãƒ¼ã‚¿ã‚’ä½œæˆ + +セーブデータを上書ãã—ã¾ã™ã‹? + +é¸æŠžã—ãŸãƒ‡ãƒ¼ã‚¿ä¿å­˜æ©Ÿå™¨ã«ã™ã§ã«ã‚»ãƒ¼ãƒ–データãŒã‚りã¾ã™ã€‚上書ãã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? + +上書ãã—ãªã„ + +上書ãã—ã¦ã‚»ãƒ¼ãƒ– + +セーブã«å¤±æ•— + +データä¿å­˜æ©Ÿå™¨ã®ã‚¨ãƒ©ãƒ¼ + +データä¿å­˜æ©Ÿå™¨ãŒè¦‹ã¤ã‹ã‚‰ãªã„ã‹ã€ã‚¨ãƒ©ãƒ¼ãŒèµ·ãã¦ã„ã¾ã™ + +データä¿å­˜æ©Ÿå™¨ãŒè¦‹ã¤ã‹ã‚‰ãªã„ã‹ã€ã‚¨ãƒ©ãƒ¼ãŒèµ·ãã¦ã„ã¾ã™ã€‚別ã®ãƒ‡ãƒ¼ã‚¿ä¿å­˜æ©Ÿå™¨ã‚’é¸æŠžã—ã¦ãã ã•ã„ + +別ã®ãƒ‡ãƒ¼ã‚¿ä¿å­˜æ©Ÿå™¨ã‚’é¸æŠž + +データä¿å­˜æ©Ÿå™¨ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“ + +データä¿å­˜æ©Ÿå™¨ã‚’é¸æŠžã—ãªã„å ´åˆã€ã‚²ãƒ¼ãƒ ã¯ã‚»ãƒ¼ãƒ–ã§ããªããªã‚Šã¾ã™ + +データä¿å­˜æ©Ÿå™¨ã‚’é¸æŠž + +セーブãªã—ã§ãƒ—レイ + +データä¿å­˜æ©Ÿå™¨ãŒå–り外ã•れã¦ã„ã¾ã™ã€‚æ–°ã—ã„データä¿å­˜æ©Ÿå™¨ã‚’é¸æŠžã—ã¦ãã ã•ã„ + +ロードã«å¤±æ•— + +セーブデータã®åå‰ã‚’入力 + +セーブデータã®åå‰ã‚’入力ã—ã¦ãã ã•ã„ + +Xbox ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰ã«æˆ»ã‚‹ + +本当ã«ã‚²ãƒ¼ãƒ ã‚’終了ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? + +サインアウト + +ゲーマー プロフィールã‹ã‚‰ã‚µã‚¤ãƒ³ã‚¢ã‚¦ãƒˆã—ã¾ã—ãŸã€‚タイトル画é¢ã«æˆ»ã‚Šã¾ã™ + +ゲーマー プロフィールã‹ã‚‰ã‚µã‚¤ãƒ³ã‚¢ã‚¦ãƒˆã—ã¾ã—ãŸã€‚マッãƒã‚’終了ã—ã¾ã™ + +プレイを続ã‘ã‚‹ + +Xbox LIVE ã«ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã—ã¦ã„ã¾ã›ã‚“ + +ã“ã®ã‚²ãƒ¼ãƒ ã®ä¸€éƒ¨ã®æ©Ÿèƒ½ã§ã¯ã€Xbox LIVE ã«ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã—ã¦ã„るゲーマー プロフィールãŒå¿…è¦ã¨ãªã‚Šã¾ã™ã€‚ç¾åœ¨ã¯ Xbox LIVE ã«ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã—ã¦ã„ã¾ã›ã‚“ + +ã“ã®æ©Ÿèƒ½ã‚’使ã†ã«ã¯ã€Xbox LIVE ã«ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã—ã¦ã„るゲーマー プロフィールãŒå¿…è¦ã§ã™ + +Xbox LIVE ã«ã‚µã‚¤ãƒ³ã‚¤ãƒ³ + +サインインã›ãšã«ãƒ—レイを続ã‘ã‚‹ + +実績ç²å¾—ã®ã‚¨ãƒ©ãƒ¼ + +ゲーマー ãƒ—ãƒ­ãƒ•ã‚£ãƒ¼ãƒ«ã«æ­£å¸¸ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ç¾åœ¨ã¯å®Ÿç¸¾ã‚’ç²å¾—ã§ãã¾ã›ã‚“ + +ゲーマー プロフィールã®ã‚¨ãƒ©ãƒ¼ + +ゲーマー プロフィールã«è¨­å®šã‚’ä¿å­˜ã§ãã¾ã›ã‚“ã§ã—㟠+ +ゲストã®ã‚²ãƒ¼ãƒžãƒ¼ プロフィール + +ゲストã®ã‚²ãƒ¼ãƒžãƒ¼ プロフィールã§ã¯ã“ã®æ©Ÿèƒ½ã‚’利用ã§ãã¾ã›ã‚“。別ã®ã‚²ãƒ¼ãƒžãƒ¼ プロフィールを使用ã—ã¦ãã ã•ã„ + +ä¿å­˜ä¸­... + +ä¿å­˜ã—ã¦ã„ã¾ã™ã€‚本体ã®é›»æºã‚’切らãªã„ã§ãã ã•ã„ + +完全版を購入 + +ã“れ㯠Minecraft ã®ãŠè©¦ã—版ã§ã™ã€‚完全版ã§ã‚れã°ã€ä»Šã™ãç²å¾—ã§ãる実績ãŒã‚りã¾ã™! +完全版を購入ã—ã¦ã€Xbox LIVE を通ã˜ã¦ä¸–界中ã®ãƒ•レンドã¨ä¸€ç·’ã«éŠã¹ã‚‹Minecraft ã®æ¥½ã—ã•を体験ã—ã¦ãã ã•ã„。 +完全版を購入ã—ã¾ã™ã‹? + +プロフィールã®èª­ã¿è¾¼ã¿ã«å•題ãŒç™ºç”Ÿã—ãŸãŸã‚ã€ãƒ¡ã‚¤ãƒ³ ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã«æˆ»ã‚Šã¾ã™ + + diff --git a/Minecraft.Client/Common/Media/ja-JP/strings.resx b/Minecraft.Client/Common/Media/ja-JP/strings.resx new file mode 100644 index 00000000..132435fb --- /dev/null +++ b/Minecraft.Client/Common/Media/ja-JP/strings.resx @@ -0,0 +1,4464 @@ + +æ–°ã—ã„ダウンロード コンテンツãŒè¿½åŠ ã•れã¾ã—ãŸ! メイン メニュー㮠[Minecraft ストア] ã‹ã‚‰ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™ + +Minecraft ストアã®ã‚¹ã‚­ãƒ³ パックを使ãˆã°ã€ã‚ãªãŸã®ã‚­ãƒ£ãƒ©ã‚¯ã‚¿ãƒ¼ã®å¤–見を変ãˆã‚‰ã‚Œã¾ã™ã€‚メイン メニュー㮠[Minecraft ストア] ã‹ã‚‰å“ãžã‚ãˆã‚’確èªã—ã¦ãã ã•ã„ã­ + +高解åƒåº¦ãƒ¢ãƒ¼ãƒ‰ã‚’使ã†ã¨ã€1 å°ã® Xbox 360 æœ¬ä½“ã§æœ€å¤§ 4 人ã®ãƒ—レイヤーãŒåˆ†å‰²ç”»é¢ãƒ—レイå¯èƒ½! + +Xbox 360 本体ã«åˆ¥ã®ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ©ãƒ¼ã‚’接続㗠START を押ã™ã¨ã€ã„ã¤ã§ã‚‚ゲームã«å‚加ã§ãã¾ã™ + +ガンマ設定を変更ã™ã‚‹ã¨ã€ã‚²ãƒ¼ãƒ ã®æ˜Žã‚‹ã•を調整ã§ãã¾ã™ + +難易度を「ピースã€ã«è¨­å®šã™ã‚‹ã¨ã€HP ãŒè‡ªå‹•çš„ã«å›žå¾©ã—ã€å¤œé–“ã«ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ãŒå‡ºç¾ã—ãªããªã‚Šã¾ã™! + +オオカミã«éª¨ã‚’与ãˆã¦ã€æ‰‹ãªãšã‘ã¾ã—ょã†ã€‚ãŠã™ã‚りã•ã›ãŸã‚Šã€ã‚ãªãŸã«ã¤ã„ã¦ã“ã•ã›ãŸã‚Šã§ãã¾ã™ + +æŒã¡ç‰©ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã§ã€ã‚«ãƒ¼ã‚½ãƒ«ã‚’メニュー外ã«å‹•ã‹ã—ã¦ã€{*CONTROLLER_VK_A*} を押ã™ã¨ã€ã‚¢ã‚¤ãƒ†ãƒ ã‚’è½ã¨ã™ã“ã¨ãŒã§ãã¾ã™ + +夜間ã«ãƒ™ãƒƒãƒ‰ã§å¯ã‚‹ã¨ã€æœã¾ã§æ™‚間をスキップã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚マルãƒãƒ—レイヤー ゲームã§ã¯ã€ã™ã¹ã¦ã®ãƒ—レイヤーãŒå¯ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ + +豚ã‹ã‚‰å–れる豚肉を調ç†ã—ã¦é£Ÿã¹ã‚‹ã¨ HP ãŒå›žå¾©ã—ã¾ã™ + +牛ã‹ã‚‰å–ã£ãŸé©ã‚’使用ã—ã¦é˜²å…·ã‚’作りã¾ã—ょㆠ+ +空ã®ãƒã‚±ãƒ„ãŒã‚れã°ã€ç‰›ã®ãƒŸãƒ«ã‚¯ã‚’æ¾ã£ãŸã‚Šã€æ°´ã‚’汲んã ã‚Šã€æº¶å²©ã‚’入れãŸã‚Šã§ãã¾ã™ + +ãã‚を使ã£ã¦ã€åœŸåœ°ã‚’耕ã—ã¾ã—ょㆠ+ +ã‚¯ãƒ¢ã¯æ—¥ä¸­ã¯ã€ã“ã¡ã‚‰ã‹ã‚‰æ”»æ’ƒã—ãªã„é™ã‚Šæ”»æ’ƒã—ã¦ãã¾ã›ã‚“ + +手ã§åœ°é¢ã‚„砂を掘るよりもã€ã‚·ãƒ£ãƒ™ãƒ«ã‚’使ã£ãŸã»ã†ãŒé€Ÿã掘れã¾ã™ + +豚肉ã¯ç”Ÿã§é£Ÿã¹ã‚‹ã‚ˆã‚Šã‚‚ã€èª¿ç†ã—ãŸã»ã†ãŒ HP を多ã回復ã—ã¾ã™ + +ãŸã„ã¾ã¤ã‚’作ã£ã¦ã€å¤œã«æ˜Žã‹ã‚Šã¨ã—ã¦ä½¿ã„ã¾ã—ょã†ã€‚ãŸã„ã¾ã¤ã®å›žã‚Šã«ã¯ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ãŒè¿‘寄ã£ã¦ã“ãªããªã‚Šã¾ã™ + +トロッコã¨ãƒ¬ãƒ¼ãƒ«ã‚’使ãˆã°ã€æ—©ã目的地ã«ç€ã‘ã¾ã™ + +苗木をæ¤ãˆã‚Œã°ã€æˆé•·ã—ã¦æœ¨ã«ãªã‚Šã¾ã™ + +Pigman ã¯ã€ã“ã¡ã‚‰ã‹ã‚‰æ”»æ’ƒã—ãªã„é™ã‚Šã€æ”»æ’ƒã—ã¦ãã¾ã›ã‚“ + +ベッドã§å¯ã‚‹ã“ã¨ã§ã€å¾©æ´»åœ°ç‚¹ã®å¤‰æ›´ã¨ã€å¤œã‹ã‚‰æœã¸æ™‚間を早回ã—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ + +Ghast ã«ç«ã®çŽ‰ã‚’æ‰“ã¡è¿”ã—ã¦ã‚„りã¾ã—ょã†! + +é—‡ã®ãƒãƒ¼ã‚¿ãƒ«ã‚’作れã°ã€åˆ¥ã®ä¸–界ã§ã‚る暗黒界ã«è¡Œãã“ã¨ãŒã§ãã¾ã™ + +{*CONTROLLER_VK_B*} を押ã™ã¨ã€æ‰‹ã«æŒã£ã¦ã„るアイテムをè½ã¨ã—ã¾ã™! + +目的ã«ã‚ã£ãŸé“具を使ã„ã¾ã—ょã†! + +ãŸã„ã¾ã¤ã«ä½¿ã†çŸ³ç‚­ãŒè¦‹ã¤ã‹ã‚‰ãªã„ã¨ãã«ã¯ã€ã‹ã¾ã©ã‚’使ã£ã¦æœ¨ã‹ã‚‰æœ¨ç‚­ã‚’作るã“ã¨ãŒã§ãã¾ã™ + +çœŸä¸‹ã‚„çœŸä¸Šã«æŽ˜ã‚Šé€²ã‚€ã®ã¯ã€è³¢ã„ã¨ã¯ã„ãˆã¾ã›ã‚“ + +ガイコツã®éª¨ã‹ã‚‰ä½œã‚Œã‚‹éª¨ç²‰ã¯ã€è‚¥æ–™ã¨ã—ã¦ä½¿ã£ã¦ã€è‰²ã€…ãªã‚‚ã®ã‚’ä¸€çž¬ã§æˆé•·ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™! + +Creeper ã¯è¿‘ã¥ãã¨çˆ†ç™ºã—ã¾ã™! + +æº¶å²©ã®æºã®ãƒ–ãƒ­ãƒƒã‚¯ã«æ°´ãŒè§¦ã‚Œã‚‹ã¨ã€é»’曜石ãŒã§ãã¾ã™ + +æº¶å²©ã®æºã®ãƒ–ロックをå–り除ãã¨ã€æº¶å²©ã¯ã—ã°ã‚‰ãã—ã¦æ¶ˆãˆã¦ã—ã¾ã„ã¾ã™ + +丸石㯠Ghast ã®ç«ã®çŽ‰ã‚’é˜²ã„ã§ãれã¾ã™ã€‚ãƒãƒ¼ã‚¿ãƒ«ã‚’守るã®ã«ä½¿ãˆã¾ã™ + +å…‰æºã«ä½¿ç”¨ã§ãるブロックã¯ã€é›ªã‚„氷を溶ã‹ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ãŸã„ã¾ã¤ã€å…‰çŸ³ã€ã‚«ãƒœãƒãƒ£ ランタンãªã©ã®ãƒ–ロックã§ã™ + +屋外ã«ã‚¦ãƒ¼ãƒ«ã§å»ºç‰©ã‚’建ã¦ã‚‹å ´åˆã«ã¯ã€æ³¨æ„ã—ã¾ã—ょã†ã€‚é›·ãŒå½“ãŸã‚‹ã¨ç‡ƒãˆã¦ã—ã¾ã„ã¾ã™ + +ãƒã‚±ãƒ„ 1 æ¯ã®æº¶å²©ãŒã‚れã°ã€ã‹ã¾ã©ã§ 100 個ã®ãƒ–ロックを精錬ã§ãã¾ã™ + +éŸ³ãƒ–ãƒ­ãƒƒã‚¯ã§æ¼”å¥ã•れる楽器ã¯ã€ãƒ–ロックã®ä¸‹ã®æè³ªã§å¤‰åŒ–ã—ã¾ã™ + +ゾンビやガイコツã¯ã€æ°´ã®ä¸­ã§ã¯å¤ªé™½ã®å…‰ã«å½“ãŸã£ã¦ã‚‚大丈夫ã§ã™ + +オオカミを攻撃ã™ã‚‹ã¨ã€è¿‘ãã«ã„ã‚‹ã™ã¹ã¦ã®ã‚ªã‚ªã‚«ãƒŸãŒè¥²ã„掛ã‹ã£ã¦ãã¾ã™ã€‚ゾンビ Pigman ã‚‚åŒã˜ç¿’性をæŒã£ã¦ã„ã¾ã™ + +ã‚ªã‚ªã‚«ãƒŸã¯æš—黒界ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ + +オオカミ㯠Creeper を攻撃ã—ã¾ã›ã‚“ + +ニワトリ㯠5~10 分ã”ã¨ã«ã‚¿ãƒžã‚´ã‚’生ã¿ã¾ã™ + +黒曜石を掘り出ã™ã«ã¯ã€ãƒ€ã‚¤ãƒ¤ãƒ¢ãƒ³ãƒ‰ã®ãƒ„ルãƒã‚·ãŒå¿…è¦ã§ã™ + +Creeper ã‹ã‚‰ã¯ç«è–¬ãŒç°¡å˜ã«æ‰‹ã«å…¥ã‚Šã¾ã™ + +ãƒã‚§ã‚¹ãƒˆ 2 ã¤ã‚’並ã¹ã¦é…ç½®ã™ã‚Œã°ã€1 ã¤ã®å¤§ããªãƒã‚§ã‚¹ãƒˆã«ãªã‚Šã¾ã™ + +手ãªãšã‘ãŸã‚ªã‚ªã‚«ãƒŸã® HP ã¯å°»å°¾ã®çŠ¶æ…‹ã§åˆ†ã‹ã‚Šã¾ã™ã€‚回復ã™ã‚‹ã«ã¯ã€è‚‰ã‚’与ãˆã¾ã—ょㆠ+ +ç·‘è‰²ã®æŸ“料を作るã«ã¯ã€ã‚µãƒœãƒ†ãƒ³ã‚’ã‹ã¾ã©ã§èª¿ç†ã—ã¾ã™ + +ã‚²ãƒ¼ãƒ ã®æœ€æ–°æƒ…報㯠4J Studios 㨠Kappische ã®Twitter ã§ã‚²ãƒƒãƒˆ! + +ãƒãƒ¼ã‚º メニューã‹ã‚‰ Minecraft ã®ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆã‚’ Facebook ã«å…¬é–‹ã§ãã¾ã™ + +[éŠã³æ–¹] ã®æœ€æ–°æƒ…å ±ã§ã€æ›´æ–°æƒ…報をãƒã‚§ãƒƒã‚¯ã§ãã¾ã™ + +柵をç©ã¿é‡ã­å¯èƒ½ã¨ã—ã¾ã—㟠+ +minecraftforum ã«ã¯ã€Xbox 360 版専用セクションãŒã‚りã¾ã™ + +動物ã®ä¸­ã«ã¯ã€å°éº¦ã‚’æŒã£ã¦ã„ã‚‹ã¨ã¤ã„ã¦ãã‚‹ã‚‚ã®ãŒã„ã¾ã™ + +ã„ãšã‚Œã‹ã®æ–¹å‘ã« 20 ブロック以上動ã‘ãªã„å‹•ç‰©ã¯æ¶ˆæ»…ã—ã¾ã›ã‚“ + +BGM 制作: C418 + +Notch ã® Twitter ã«ã¯ 100 万人以上ã®ãƒ•ォロワーãŒã„ã¾ã™! + +スウェーデン人ã¿ã‚“ãªãŒé‡‘髪ã¨ã„ã†ã‚ã‘ã§ã¯ã‚りã¾ã›ã‚“。ãŸã¨ãˆã°ã€Mojang ã® Jens ã¯èµ¤æ¯›ã§ã™ + +4J Studios ã® Xbox 360 å‘ã‘超ホラー大作「Herobrineã€ã¯ã¾ã•ã‹ã®ã‚­ãƒ£ãƒ³ã‚»ãƒ«... ã¨ã„ã†ã‚¦ãƒ¯ã‚µ + +アップデートも予定中ã§ã™ã€‚ãŠæ¥½ã—ã¿ã«! + +Notch ã£ã¦èª°? + +Mojang ã¯ã‚¹ã‚¿ãƒƒãƒ•ã®æ•°ã‚ˆã‚Šå—ã‘ãŸè³žã®æ•°ã®æ–¹ãŒå¤šã‹ã£ãŸã‚Šã—ã¾ã™ + +有å人も Minecraft をプレイ中! + +deadmau5 㯠Minecraft ãŒå¤§å¥½ã! + +虫ã¨ç›®ã‚’åˆã‚ã›ã¦ã¯ã„ã‘ã¾ã›ã‚“ + +Creeper ã¯ãƒ—ログラムã®ãƒã‚°ã‹ã‚‰ç™ºç”Ÿã—ã¾ã™ + +ニワトリ? ãれã¨ã‚‚アヒル? + +MineCon ã«ã¯å‚加ã—ã¾ã—ãŸã‹? + +Mojang ã®ã‚¹ã‚¿ãƒƒãƒ•ã§ã™ã‚‰ã‚¸ãƒ£ãƒ³ã‚¯ãƒœãƒ¼ã‚¤ã®ç´ é¡”ã¯çŸ¥ã‚Šã¾ã›ã‚“ + +Minecraft Wiki ãŒã‚ã‚‹ã®ã‚’知ã£ã¦ã„ã¾ã™ã‹? + +Mojang ã®æ–°ã—ã„事務所ã¯ã¨ã£ã¦ã‚‚最高 + +Minecraft: Xbox 360 版ã¯ã•ã¾ã–ã¾ãªè¨˜éŒ²ã‚’æ›´æ–°ã—ã¦ã„ã¾ã™! + +MineCon 2013 ã¯ãƒ•ロリダ州オーランド (アメリカåˆè¡†å›½) ã§é–‹å‚¬ã•れã¾ã—ãŸ! + +.party() ã¯æœ€é«˜ã§ã—ãŸ! + +ウワサã¯éµœå‘‘ã¿ã«ã—ãªã„ã“ã¨ã€‚ã»ã©ã»ã©ã«ä¿¡ã˜ã‚‹ã®ãŒä¸€ç•ª! + +{*T3*}éŠã³æ–¹: 基本{*ETW*}{*B*}{*B*} +Minecraft ã¯è‡ªç”±ãªç™ºæƒ³ã§ãƒ–ロックをç©ã¿ä¸Šã’ã¦ã€æŽ¢æ¤œã—ãŸã‚Šã€ã„ã‚ã„ã‚ãªç‰©ã‚’作ã£ãŸã‚Šã™ã‚‹ã‚²ãƒ¼ãƒ ã§ã™ã€‚夜ã«ãªã‚‹ã¨ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ãŒç¾ã‚Œã‚‹ã®ã§ã€ãã®å‰ã«å¿…ãšå®‰å…¨ãªå ´æ‰€ã‚’作ã£ã¦ãŠã‹ãªã‘れã°ãªã‚Šã¾ã›ã‚“。{*B*}{*B*} +周囲を見回ã™ã«ã¯ã€{*CONTROLLER_ACTION_LOOK*} を押ã—ã¾ã™ã€‚{*B*}{*B*} +æ­©ã回るã«ã¯ã€{*CONTROLLER_ACTION_MOVE*} を押ã—ã¾ã™ã€‚{*B*}{*B*} +ジャンプã™ã‚‹ã«ã¯ã€{*CONTROLLER_ACTION_JUMP*} を押ã—ã¾ã™ã€‚{*B*}{*B*} +ダッシュã™ã‚‹ã«ã¯ã€{*CONTROLLER_ACTION_MOVE*} ã‚’å‰æ–¹å‘ã«ã™ã°ã‚„ã2å›žé€£ç¶šã§æŠ¼ã—ã¾ã™ã€‚{*CONTROLLER_ACTION_MOVE*} ã‚’å‰ã«æŠ¼ã—ã¦ã„ã‚‹é–“ã€ã‚­ãƒ£ãƒ©ã‚¯ã‚¿ãƒ¼ã¯ãƒ€ãƒƒã‚·ãƒ¥ã‚’ç¶šã‘ã¾ã™ã€‚ãŸã ã—一定時間ãŒéŽãŽã‚‹ã‹ç©ºè…¹ã‚²ãƒ¼ã‚¸ãŒ{*ICON_SHANK_03*}.以下ã«ãªã‚‹ã¨ã€ãã“ã§ã‚„ã‚ã¦ã—ã¾ã„ã¾ã™ã€‚{*B*}{*B*} +æ‰‹ã‚„ã€æ‰‹ã«æŒã£ãŸã‚¢ã‚¤ãƒ†ãƒ ã§ç‰©ã‚’掘ã£ãŸã‚Šã€æœ¨ã‚’切ã£ãŸã‚Šã™ã‚‹ã«ã¯ã€ {*CONTROLLER_ACTION_ACTION*} を押ã—ç¶šã‘ã¾ã™ã€‚ブロックã®ä¸­ã«ã¯ã€ç‰¹åˆ¥ãªé“具を作らãªã„ã¨ã€æŽ˜ã‚‹ã“ã¨ãŒã§ããªã„ã‚‚ã®ã‚‚ã‚りã¾ã™ã€‚{*B*}{*B*} +æ‰‹ã«æŒã£ãŸã‚¢ã‚¤ãƒ†ãƒ ã¯ã€{*CONTROLLER_ACTION_USE*} ã§ä½¿ã†ã“ã¨ãŒã§ãã¾ã™ã€‚ã¾ãŸã€{*CONTROLLER_ACTION_DROP*} を押ã™ã¨ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’è½ã¨ã—ã¾ã™ + +{*T3*}éŠã³æ–¹: ç”»é¢ã®è¡¨ç¤º{*ETW*}{*B*}{*B*} +ç”»é¢ä¸Šã«ã¯ãƒ—レイヤーã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ãŒè¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚HPã€ç©ºæ°—ã®æ®‹ã‚Š (水中ã®å ´åˆ)ã€ç©ºè…¹åº¦ (何ã‹é£Ÿã¹ã‚‹ã¨å›žå¾©ã™ã‚‹)ã€è£…å‚™ã—ã¦ã„る防具ãªã©ã§ã™ã€‚ 空腹ゲージ㮠{*ICON_SHANK_01*} ㌠9 個以上ã‚る状態ã§ã¯ã€HP ãŒè‡ªç„¶ã«å›žå¾©ã—ã¾ã™ã€‚食ã¹ç‰©ã‚’食ã¹ã‚‹ã¨ç©ºè…¹ã‚²ãƒ¼ã‚¸ã¯å›žå¾©ã—ã¾ã™ã€‚{*B*} +経験値ゲージも画é¢ã«è¡¨ç¤ºã•れã€ç¾åœ¨ã®çµŒé¨“å€¤ãƒ¬ãƒ™ãƒ«ã¨æ¬¡ã®ãƒ¬ãƒ™ãƒ«ã¾ã§ã«å¿…è¦ãªå€¤ã‚’確èªã§ãã¾ã™ã€‚ 経験値ã¯ã€ç”Ÿã物を倒ã—ãŸæ™‚ã€ç‰¹å®šã®ãƒ–ロックを採掘ã—ãŸæ™‚ã€å‹•ç‰©ã‚’ç¹æ®–ã•ã›ãŸæ™‚ã€é‡£ã‚Šã€ã‹ã¾ã©ã§é‰±çŸ³ã‚’製錬ã—ãŸæ™‚ãªã©ã«ç²å¾—ã§ãる経験値オーブを集ã‚ã‚‹ã¨è²¯ã¾ã£ã¦ã„ãã¾ã™ã€‚{*B*}{*B*} +ã•らã«ä½¿ç”¨ã§ãるアイテムも表示ã•れã€{*CONTROLLER_ACTION_LEFT_SCROLL*} 㨠{*CONTROLLER_ACTION_RIGHT_SCROLL*} ã§æ‰‹ã«æŒã¤ã‚¢ã‚¤ãƒ†ãƒ ã‚’切り替ãˆã‚‰ã‚Œã¾ã™ + +{{*T3*}éŠã³æ–¹: æŒã¡ç‰©{*ETW*}{*B*}{*B*} +æŒã¡ç‰©ã¯ {*CONTROLLER_ACTION_INVENTORY*} ã§è¦‹ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚{*B*}{*B*} +ã“ã®ç”»é¢ã§ã¯ã€æ‰‹ã«ã—ã¦ã„る使用å¯èƒ½ãªã‚¢ã‚¤ãƒ†ãƒ ã€æ‰€æœ‰ã—ã¦ã„るアイテムã®ãƒªã‚¹ãƒˆã€ç¾åœ¨è£…å‚™ã—ã¦ã„る防具を確èªã§ãã¾ã™ã€‚{*B*}{*B*} +ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’ {*CONTROLLER_MENU_NAVIGATE*} ã§å‹•ã‹ã—ã¦ã€ã‚¢ã‚¤ãƒ†ãƒ ã«åˆã‚ã›ã¦ã‹ã‚‰ {*CONTROLLER_VK_A*} を押ã™ã¨ã€ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã§ãã¾ã™ã€‚ãã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’複数所有ã—ã¦ã„ã‚‹å ´åˆã¯ã€ãã®ã™ã¹ã¦ãŒé¸æŠžã•れã¾ã™ã€‚åŠåˆ†ã ã‘é¸æŠžã™ã‚‹ã«ã¯ {*CONTROLLER_VK_X*} を使用ã—ã¾ã™ã€‚{*B*}{*B*} +ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã§é¸ã‚“ã ã‚¢ã‚¤ãƒ†ãƒ ã‚’æŒã¡ç‰©ã®åˆ¥ã®å ´æ‰€ã«ç§»å‹•ã•ã›ã‚‹ã«ã¯ã€ç§»å‹•先㧠{*CONTROLLER_VK_A*} を押ã—ã¾ã™ã€‚ ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ãŒã‚ã‚‹å ´åˆã¯ã€{*CONTROLLER_VK_A*} を押ã™ã¨å…¨éƒ¨ã€ {*CONTROLLER_VK_X*} を押ã™ã¨ 1 ã¤ã ã‘移動ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚{*B*}{*B*} +ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã§é¸ã‚“ã ã‚¢ã‚¤ãƒ†ãƒ ãŒé˜²å…·ã®å ´åˆã€é©åˆ‡ãªé˜²å…·ã‚¹ãƒ­ãƒƒãƒˆã«ç§»ã™ãŸã‚ã®ãƒœã‚¿ãƒ³ã‚¬ã‚¤ãƒ‰ãŒè¡¨ç¤ºã•れã¾ã™ã€‚{*B*}{*B*} +é©ã®ã‚¢ãƒ¼ãƒžãƒ¼ã¯æŸ“色ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚æŒã¡ç‰©ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã®ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã§æŸ“料をé¸ã³ã€æŸ“色ã™ã‚‹ã‚¢ã‚¤ãƒ†ãƒ ã®ä¸Šã«ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’移動ã•ã›ã¦{*CONTROLLER_VK_X*} を押ã™ã¨æŸ“色ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ + + +{*T3*}ä½¿ã„æ–¹: ãƒã‚§ã‚¹ãƒˆ{*ETW*}{*B*}{*B*} +ãƒã‚§ã‚¹ãƒˆã‚’作ã£ãŸã‚‰ã€ãれをゲームã®ä¸–界ã«ç½®ãã¾ã—ょã†ã€‚{*CONTROLLER_ACTION_USE*} ã§ãƒã‚§ã‚¹ãƒˆã‚’使ã£ã¦ã€ä¸­ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’ä¿ç®¡ã§ãã¾ã™ã€‚{*B*}{*B*} +ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’使ã£ã¦ã€ã‚¢ã‚¤ãƒ†ãƒ ã‚’æŒã¡ç‰©ã‹ã‚‰ãƒã‚§ã‚¹ãƒˆã«ã€ã‚ã‚‹ã„ã¯ãã®é€†ã«ç§»ã›ã¾ã™ã€‚{*B*}{*B*} +ãƒã‚§ã‚¹ãƒˆã«å…¥ã‚ŒãŸã‚¢ã‚¤ãƒ†ãƒ ã¯ã€ãã®ã¾ã¾ä¿ç®¡ã•れるã®ã§ã€å¾Œã§ã€ãƒã‚§ã‚¹ãƒˆã‹ã‚‰ã€è‡ªåˆ†ã®æŒã¡ç‰©ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’å–り出ã›ã¾ã™ + + +{*T3*}ä½¿ã„æ–¹: ãƒã‚§ã‚¹ãƒˆ (大){*ETW*}{*B*}{*B*} +2 ã¤ã®ãƒã‚§ã‚¹ãƒˆã‚’横ã«ä¸¦ã¹ã¦ç½®ãã¨ã€ãƒã‚§ã‚¹ãƒˆ (大) ã«ãªã‚Šã¾ã™ã€‚よりãŸãã•ã‚“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ä¿ç®¡ã§ãã¾ã™ã€‚{*B*}{*B*} +ä½¿ã„æ–¹ã¯æ™®é€šã®ãƒã‚§ã‚¹ãƒˆã¨åŒã˜ã§ã™ + + +{*T3*}éŠã³æ–¹: 工作{*ETW*}{*B*}{*B*} +工作画é¢ã§ã¯ã€æŒã¡ç‰©ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’組ã¿åˆã‚ã›ã¦æ–°ã—ã„アイテムを作れã¾ã™ã€‚ 工作画é¢ã‚’é–‹ãã«ã¯ {*CONTROLLER_ACTION_CRAFTING*} を押ã—ã¾ã™ã€‚{*B*}{*B*} +ç”»é¢ä¸Šéƒ¨ã®ã‚¿ãƒ–ã‚’ {*CONTROLLER_VK_LB*} 㨠{*CONTROLLER_VK_RB*} ã§åˆ‡ã‚Šæ›¿ãˆã¦ã€ä½œã‚ŠãŸã„アイテムã®ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸ã‚“ã§ã‹ã‚‰ {*CONTROLLER_MENU_NAVIGATE*} ã§ä½œã‚‹ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸ã³ã¾ã™ã€‚{*B*}{*B*} +工作ウィンドウã«ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’作るã®ã«å¿…è¦ãªã‚¢ã‚¤ãƒ†ãƒ ãŒè¡¨ç¤ºã•れã¾ã™ã€‚{*CONTROLLER_VK_A*} を押ã™ã¨ã€ã‚¢ã‚¤ãƒ†ãƒ ãŒä½œã‚‰ã‚Œã€æŒã¡ç‰©ã«è¿½åŠ ã•れã¾ã™ + + +{*T3*}ä½¿ã„æ–¹: 作業å°{*ETW*}{*B*}{*B*} +作業å°ã‚’使ã†ã¨ã€ã‚‚ã£ã¨å¤§ããªã‚¢ã‚¤ãƒ†ãƒ ã‚’作るã“ã¨ãŒã§ãã¾ã™{*B*}{*B*} +ゲームã®ä¸–界ã«ä½œæ¥­å°ã‚’ç½®ã„㦠{*CONTROLLER_ACTION_USE*} を押ã™ã¨ã€ä½¿ã†ã“ã¨ãŒã§ãã¾ã™{*B*}{*B*} +作業å°ã§ã®ä½œæ¥­ã‚‚通常ã®å·¥ä½œã¨æµã‚Œã¯åŒã˜ã§ã™ãŒã€å·¥ä½œã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãŒå¤§ãããªã‚Šã€ã‚ˆã‚Šå¤šãã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’作れるよã†ã«ãªã‚Šã¾ã™ + + +{*T3*}ä½¿ã„æ–¹: ã‹ã¾ã©{*ETW*}{*B*}{*B*} +ã‹ã¾ã©ã‚’使ã£ã¦ã‚¢ã‚¤ãƒ†ãƒ ã«ç†±ã‚’加ãˆã‚‹ã“ã¨ã§ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’加工ã§ãã¾ã™ã€‚例ãˆã°ã€é‰„鉱石を鉄ã®å»¶ã¹æ£’ã«å¤‰ãˆã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚{*B*}{*B*} +ゲームã®ä¸–界ã«ã‹ã¾ã©ã‚’ç½®ã„㦠{*CONTROLLER_ACTION_USE*} を押ã™ã¨ä½¿ã†ã“ã¨ãŒã§ãã¾ã™ã€‚{*B*}{*B*} +ã‹ã¾ã©ã®ä¸‹ã«ç‡ƒæ–™ã‚’入れã€ä¸Šã«ã¯åŠ å·¥ã—ãŸã„アイテムを入れã¦ãã ã•ã„。ã™ã‚‹ã¨ã‹ã¾ã©ã«ç«ãŒå…¥ã‚Šã€åŠ å·¥ãŒå§‹ã¾ã‚Šã¾ã™ã€‚{*B*}{*B*} +加工ãŒçµ‚ã‚ã‚‹ã¨ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ã‹ã¾ã©ã®å–り出ã—å£ã‹ã‚‰æŒã¡ç‰©ã«ç§»ã™ã“ã¨ãŒã§ãã¾ã™ã€‚{*B*}{*B*} +ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã§é¸ã‚“ã ã‚¢ã‚¤ãƒ†ãƒ ãŒã‹ã¾ã©ã§ä½¿ç”¨ã™ã‚‹ç´ æã¾ãŸã¯ç‡ƒæ–™ã®å ´åˆã€ã‹ã¾ã©ã¸ç§»å‹•ã™ã‚‹ãŸã‚ã®ãƒœã‚¿ãƒ³ã‚¬ã‚¤ãƒ‰ãŒè¡¨ç¤ºã•れã¾ã™ + + +{*T3*}ä½¿ã„æ–¹: 発射装置{*ETW*}{*B*}{*B*} +発射装置を使ã†ã¨ã€ã‚¢ã‚¤ãƒ†ãƒ ã‚’æ’ƒã¡å‡ºã™ã“ã¨ãŒã§ãã¾ã™ã€‚ãã®ãŸã‚ã«ã¯ç™ºå°„è£…ç½®ã®æ¨ªã«ãƒ¬ãƒãƒ¼ãªã©ã®ã‚¹ã‚¤ãƒƒãƒéƒ¨åˆ†ã‚’å–り付ã‘ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚{*B*}{*B*} +発射装置ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’入れるã«ã¯ã€{*CONTROLLER_ACTION_USE*} を押ã—ã¦ã‹ã‚‰ã€æŒã¡ç‰©ã‹ã‚‰ã‚¢ã‚¤ãƒ†ãƒ ã‚’発射装置ã«ç§»ã—ã¾ã™ã€‚{*B*}{*B*} +ãれã‹ã‚‰å–り付ã‘ãŸã‚¹ã‚¤ãƒƒãƒã‚’使ã†ã¨ã€ç™ºå°„装置ãŒã‚¢ã‚¤ãƒ†ãƒ ã‚’æ’ƒã¡å‡ºã—ã¾ã™ + + +{*T3*}ä½¿ã„æ–¹: 調åˆ{*ETW*}{*B*}{*B*} +ãƒãƒ¼ã‚·ãƒ§ãƒ³ã®èª¿åˆã«ã¯ä½œæ¥­å°ã§ä½œã‚Œã‚‹èª¿åˆå°ã‚’使ã„ã¾ã™ã€‚ãƒãƒ¼ã‚·ãƒ§ãƒ³ã®èª¿åˆã«ã¯ã¾ãšæ°´ã®ãƒ“ンãŒå¿…è¦ãªã®ã§ã€å¤§é‡œã‚„æ°´æºã‹ã‚‰ã‚¬ãƒ©ã‚¹ãƒ“ãƒ³ã«æ°´ã‚’ç§»ã—ã€æ°´ã®ãƒ“ンを用æ„ã—ã¾ã—ょã†ã€‚{*B*} +調åˆå°ã«ã¯ãƒ“ãƒ³ã‚’ç½®ãæž ãŒ 3 ã¤ã‚りã€1 回ã®èª¿åˆã§æœ€å¤§ 3 ã¤ã®ãƒãƒ¼ã‚·ãƒ§ãƒ³ã‚’調åˆã§ãã¾ã™ã€‚1 ã¤ã®ææ–™ã§ãƒ“ン 3 本分ã®ãƒãƒ¼ã‚·ãƒ§ãƒ³ãŒä½œã‚Œã‚‹ã®ã§ã€è³‡æºã‚’効率よã使ã†ã«ã¯ä¸€åº¦ã« 3 ã¤ã®ãƒãƒ¼ã‚·ãƒ§ãƒ³ã‚’作りã¾ã—ょã†ã€‚{*B*} +調åˆå°ã®ä¸Šã®æž ã«ãƒãƒ¼ã‚·ãƒ§ãƒ³ã®ææ–™ã‚’ç½®ã„ã¦å°‘ã—å¾…ã¤ã¨ã€åŸºå‰¤ã¨ãªã‚‹ãƒãƒ¼ã‚·ãƒ§ãƒ³ãŒã§ãã¾ã™ã€‚基剤自体ã«åŠ¹æžœã¯ã‚りã¾ã›ã‚“ãŒã€åˆ¥ã®ææ–™ã‚’加ãˆã¦èª¿åˆã™ã‚‹ã¨ã€åŠ¹åŠ›ã‚’æŒã¤ãƒãƒ¼ã‚·ãƒ§ãƒ³ã‚’作れã¾ã™ã€‚{*B*} +ã“ã®ãƒãƒ¼ã‚·ãƒ§ãƒ³ãŒå®Œæˆã—ãŸã‚‰ã€3 ã¤ã‚ã®ææ–™ã‚’åŠ ãˆã¦ã•らãªã‚‹åŠ¹æžœã‚’ã¤ã‘ã¦ã¿ã¾ã—ょã†ã€‚レッドストーンã®ç²‰ã‚’è¶³ã›ã°åŠ¹æžœã®æŒç¶šæ™‚é–“ãŒé•·ããªã‚Šã€å…‰çŸ³ã®ç²‰ã‚’è¶³ã›ã°ãƒãƒ¼ã‚·ãƒ§ãƒ³ã®åŠ¹åŠ›ãŒé«˜ã¾ã‚Šã€ç™ºé…µã—ãŸã‚¯ãƒ¢ã®ç›®ã‚’è¶³ã›ã°ãƒžã‚¤ãƒŠã‚¹åŠ¹æžœã®ã‚ã‚‹ãƒãƒ¼ã‚·ãƒ§ãƒ³ãŒä½œã‚Œã¾ã™ã€‚{*B*} +ã¾ãŸã€ã©ã®ãƒãƒ¼ã‚·ãƒ§ãƒ³ã§ã‚‚ç«è–¬ã‚’加ãˆã‚Œã°ã‚¹ãƒ—ラッシュãƒãƒ¼ã‚·ãƒ§ãƒ³ã«ãªã‚Šã¾ã™ã€‚スプラッシュãƒãƒ¼ã‚·ãƒ§ãƒ³ã¯æŠ•ã’ã¦ä½¿ç”¨ã—ã€è½ã¡ãŸå ´æ‰€ã«åŠ¹æžœã‚’ç™ºæ®ã—ã¾ã™ã€‚{*B*}ãƒãƒ¼ã‚·ãƒ§ãƒ³ã®åŽŸææ–™ã¨ãªã‚‹ã‚‚ã®ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:-{*B*}{*B*} +* {*T2*}暗黒茸{*ETW*}{*B*} +* {*T2*}クモã®ç›®{*ETW*}{*B*} +* {*T2*}ç ‚ç³–{*ETW*}{*B*} +* {*T2*}Ghast ã®æ¶™{*ETW*}{*B*} +* {*T2*}Blaze パウダー{*ETW*}{*B*} +* {*T2*}マグマクリーム{*ETW*}{*B*} +* {*T2*}è¼ãスイカ{*ETW*}{*B*} +* {*T2*}レッドストーンã®ç²‰{*ETW*}{*B*} +* {*T2*}光石ã®ç²‰{*ETW*}{*B*} +* {*T2*}発酵ã—ãŸã‚¯ãƒ¢ã®ç›®{*ETW*}{*B*}{*B*} + +調åˆã§ãã‚‹ææ–™ã®çµ„ã¿åˆã‚ã›ã¯ãŸãã•ã‚“ã‚りã¾ã™ã®ã§ã€è‰²ã€…ã¨å®Ÿé¨“ã—ã¦ã¿ã¦ãã ã•ã„! + + +{*T3*}ä½¿ã„æ–¹: エンãƒãƒ£ãƒ³ãƒˆ{*ETW*}{*B*}{*B*} +モンスターや動物を倒ã—ãŸã‚Šã€æŽ¡æŽ˜ã—ãŸã‚Šã€ã‹ã¾ã©ã‚’使ã£ãŸç²¾éŒ¬ã‚„æ–™ç†ã§ç²å¾—ã—ãŸçµŒé¨“値ã¯ã€ä¸€éƒ¨ã®é“具や武器ã€é˜²å…·ã®ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã«ä½¿ãˆã¾ã™ã€‚{*B*} +剣ã€å¼“ã€æ–§ã€ãƒ„ルãƒã‚·ã€ã‚·ãƒ£ãƒ™ãƒ«ã¾ãŸã¯é˜²å…·ã‚’エンãƒãƒ£ãƒ³ãƒˆãƒ†ãƒ¼ãƒ–ãƒ«ã®æœ¬ã®ä¸‹ã®æž ã«ç½®ãã¨ã€å³å´ã®ãƒœã‚¿ãƒ³ã«ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã¨ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã§æ¶ˆè²»ã•れる経験値ãŒç¤ºã•れã¾ã™ã€‚{*B*} +エンãƒãƒ£ãƒ³ãƒˆã«å¿…è¦ãªçµŒé¨“値ã¯ã€ä¸è¶³ã—ã¦ã„ã‚‹å ´åˆã¯èµ¤ã€è¶³ã‚Šã¦ã„ã‚‹å ´åˆã¯ç·‘ã§è¡¨ç¤ºã•れã¾ã™ã€‚{*B*}{*B*} +エンãƒãƒ£ãƒ³ãƒˆã¯æ¶ˆè²»å¯èƒ½ãªçµŒé¨“値ã®ç¯„囲ã§ãƒ©ãƒ³ãƒ€ãƒ ã«é¸æŠžã•れã¾ã™ã€‚{*B*}{*B*} +エンãƒãƒ£ãƒ³ãƒˆãƒ†ãƒ¼ãƒ–ルã®å‘¨å›²ã«ã€ãƒ†ãƒ¼ãƒ–ルã¨ãƒ–ロック 1 ã¤åˆ†ã®ã™ã間を空ã‘ã¦æœ¬æ£š (最大 15 å°) を並ã¹ã‚‹ã“ã¨ã§ã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã®ãƒ¬ãƒ™ãƒ«ãŒä¸ŠãŒã‚Šã¾ã™ã€‚ã¾ãŸæœ¬æ£šã‹ã‚‰ãƒ†ãƒ¼ãƒ–ãƒ«ä¸Šã®æœ¬ã«å‘ã‘ã¦æ–‡å­—ãŒæµã‚Œè¾¼ã‚€ã‚¨ãƒ•ェクトãŒè¡¨ç¤ºã•れã¾ã™ã€‚{*B*}{*B*} +エンãƒãƒ£ãƒ³ãƒˆãƒ†ãƒ¼ãƒ–ルã«å¿…è¦ãªææ–™ã¯ã™ã¹ã¦æ‘や採掘ã€è¾²è€•ãªã©ã§æ‰‹ã«å…¥ã‚Šã¾ã™ã€‚{*B*}{*B} +エンãƒãƒ£ãƒ³ãƒˆã—ãŸæœ¬ã¯é‡‘床を使ã£ã¦ã‚¢ã‚¤ãƒ†ãƒ ã‚’エンãƒãƒ£ãƒ³ãƒˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“れã«ã‚ˆã‚Šã‚¢ã‚¤ãƒ†ãƒ ã«ã‚ˆã‚Šå¤šãã®ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã‚’é¸æŠžã™ã‚‹ã“ã¨ãŒã§ãã¾ã™{*B*} + + +{*T3*}éŠã³æ–¹: 動物ã®é£¼è‚²{*ETW*}{*B*}{*B*} +動物を特定ã®å ´æ‰€ã§é£¼ã†ã«ã¯ 20 x 20 ブロック未満ã®ã‚¨ãƒªã‚¢ã«æŸµã‚’ç«‹ã¦ã€ãã®ä¸­ã«å‹•物を入れã¾ã™ã€‚ã“れã§å‹•ç‰©ã¯æŸµã®ä¸­ã«ã¨ã©ã¾ã‚Šã€ã„ã¤ã§ã‚‚様å­ã‚’見るã“ã¨ãŒã§ãã¾ã™ + + +{*T3*}éŠã³æ–¹: 動物ã®ç¹æ®–{*ETW*}{*B*}{*B*} +Minecraft ã«ç™»å ´ã™ã‚‹å‹•物ã¯ç¹æ®–能力をæŒã¡ã€è‡ªåˆ†ãŸã¡ã®èµ¤ã¡ã‚ƒã‚“ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’産ã¿å‡ºã—ã¾ã™!{*B*} +å‹•ç‰©ã‚’ç¹æ®–ã•ã›ã‚‹ã«ã¯ã€ãã®å‹•物ã«ã‚ã£ãŸé¤Œã‚’与ãˆã¦ã€å‹•物ãŸã¡ã‚’「求愛モードã€ã«å°Žãå¿…è¦ãŒã‚りã¾ã™ã€‚{*B*} +牛ã€Mooshroomã€ç¾Šã«ã¯å°éº¦ã€è±šã«ã¯ãƒ‹ãƒ³ã‚¸ãƒ³ã€ãƒ‹ãƒ¯ãƒˆãƒªã«ã¯å°éº¦ã®ç¨®ã‹æš—黒茸ã€ã‚ªã‚ªã‚«ãƒŸã«ã¯è‚‰ã‚’与ãˆã¾ã—ょã†ã€‚ã™ã‚‹ã¨ã€è¿‘ãã«ã„る求愛モードã®ä»²é–“を探ã—å§‹ã‚ã¾ã™ã€‚{*B*} +求愛モードã«ãªã£ã¦ã„ã‚‹åŒã˜ç¨®é¡žã®å‹•物ãŒå‡ºä¼šã†ã¨ã€å°‘ã—ã®é–“キスをã—ã¦èµ¤ã¡ã‚ƒã‚“ãŒèª•生ã—ã¾ã™ã€‚赤ã¡ã‚ƒã‚“ã¯ã€æˆé•·ã™ã‚‹ã¾ã§ã¯ä¸¡è¦ªã®å¾Œã‚ã‚’ã¤ã„ã¦å›žã‚Šã¾ã™ã€‚{*B*} +一度求愛モードã«ãªã£ãŸå‹•物㯠5 分間ã¯å†ã³æ±‚愛モードã«ãªã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。{*B*} +世界全体ã§å‡ºç¾ã™ã‚‹å‹•ç‰©ã®æ•°ã«ã¯åˆ¶é™ãŒã‚ã‚‹ãŸã‚ã€ãŸãã•ã‚“ã„る動物ã¯ç¹æ®–ã—ãªã„ã“ã¨ãŒã‚りã¾ã™ + +{*T3*}ä½¿ã„æ–¹: é—‡ã®ãƒãƒ¼ã‚¿ãƒ«{*ETW*}{*B*}{*B*} +é—‡ã®ãƒãƒ¼ã‚¿ãƒ«ã‚’使ã†ã¨ã€åœ°ä¸Šç•Œã¨æš—黒界ã®é–“ã‚’è¡Œãæ¥ã§ãã¾ã™ã€‚暗黒界ã¯åœ°ä¸Šç•Œã®å ´æ‰€ã‚’ã™ã°ã‚„ã移動ã—ãŸã„時ã«ä¾¿åˆ©ã§ã™ã€‚暗黒界ã§ã® 1 ブロックã®ç§»å‹•ã¯ã€åœ°ä¸Šç•Œã§ã® 3 ブロックã®ç§»å‹•ã«ç›¸å½“ã—ã¾ã™ã€‚ã¤ã¾ã‚Šæš—黒界ã«ã‚‚ãƒãƒ¼ã‚¿ãƒ«ã‚’作ã£ã¦ +地上界ã«å‡ºã‚‹ã¨ã€åŒã˜æ™‚é–“ã§ 3 å€é›¢ã‚ŒãŸå ´æ‰€ã«å‡ºã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚{*B*}{*B*} +ãƒãƒ¼ã‚¿ãƒ«ã‚’作るã«ã¯ã€å°‘ãªãã¨ã‚‚黒曜石㌠10 個必è¦ã§ã€ãƒãƒ¼ã‚¿ãƒ«ã¯é«˜ã• 5 ブロック x 横 4 ブロック x 奥行 1 ブロックã§ãªã‘れã°ã„ã‘ã¾ã›ã‚“。ãƒãƒ¼ã‚¿ãƒ«ã®æž ã‚’作ã£ãŸã‚‰ã€æž ã®ä¸­ã«ç«ã‚’付ã‘ã‚‹ã“ã¨ã§ãƒãƒ¼ã‚¿ãƒ«ãŒèµ·å‹•ã—ã¾ã™ã€‚ç«ã¯ã€ç«æ‰“ã¡çŸ³ã¨æ‰“ã¡é‡‘ã¾ãŸã¯ç™ºç«å‰¤ã§ä»˜ã‘られã¾ã™ã€‚{*B*}{*B*} +å³ã®å›³ã¯ã€å®Œæˆã—ãŸãƒãƒ¼ã‚¿ãƒ«ã®è¦‹æœ¬ã§ã™ + + +{*T3*}éŠã³æ–¹: マルãƒãƒ—レイヤー{*ETW*}{*B*}{*B*} +Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ゲームã«ãªã£ã¦ã„ã¾ã™ã€‚高解åƒåº¦ã§ãƒ—レイã—ã¦ã„ã‚‹å ´åˆã¯ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ©ãƒ¼ã‚’接続ã—㦠START を押ã™ã¨ã€ã„ã¤ã§ã‚‚ローカル プレイヤーãŒã‚²ãƒ¼ãƒ ã«å‚加ã§ãã¾ã™ã€‚{*B*}{*B*} +é–‹å§‹ã¾ãŸã¯å‚加ã—ãŸã‚ªãƒ³ãƒ©ã‚¤ãƒ³ ゲームã¯ãƒ•レンド リストã«è¡¨ç¤ºã•れã¾ã™ (ホストã¨ã—ã¦ã‚²ãƒ¼ãƒ ã‚’é–‹å§‹ã™ã‚‹ã¨ãã« [招待者ã®ã¿] ã‚’é¸æŠžã—ãŸå ´åˆã‚’除ãã¾ã™)。フレンドãŒå‚加ã™ã‚‹ã¨ãã®ãƒ•レンド リストã«ã‚‚ゲームãŒè¡¨ç¤ºã•れã€ãƒ•レンドã‹ã‚‰ãƒ•レンドã«ã‚²ãƒ¼ãƒ ãŒåºƒãŒã£ã¦ã„ãã¾ã™ (オプション㧠[フレンドã®ãƒ•レンドを許å¯] ã‚’é¸æŠžã—ã¦ã„ã‚‹å ´åˆ)。{*B*} +ゲーム中㫠BACK ボタンを押ã™ã¨ã€å‚加中ã®ãƒ—レイヤーã®ãƒªã‚¹ãƒˆã‚’é–‹ã‘ã¾ã™ã€‚リストã‹ã‚‰ã‚²ãƒ¼ãƒžãƒ¼ カードを確èªã—ãŸã‚Šã€ãƒ—レイヤーを追放ã—ãŸã‚Šã€ã‚²ãƒ¼ãƒ ã«æ‹›å¾…ã—ãŸã‚Šã§ãã¾ã™ + + +{*T3*}éŠã³æ–¹: スクリーンショットã®å…¬é–‹{*ETW*}{*B*}{*B*} +ãƒãƒ¼ã‚º メニュー㧠{*CONTROLLER_VK_Y*} を押ã—ã¦ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆã‚’撮影ã—ã€Facebook ã§å…¬é–‹ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚投稿ã®å‰ã«ã€æ’®å½±ã—ãŸã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆã®ç¸®å°ç‰ˆãŒè¡¨ç¤ºã•ã‚Œã€æŠ•ç¨¿ã«æ·»ãˆã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’編集ã§ãã¾ã™ã€‚{*B*}{*B*} +スクリーンショット撮影ã«é©ã—ãŸã‚«ãƒ¡ãƒ© モードも用æ„ã•れã¦ã„ã¾ã™ã€‚ã‚­ãƒ£ãƒ©ã‚¯ã‚¿ãƒ¼ã®æ­£é¢ã‹ã‚‰ã®ã‚·ãƒ§ãƒƒãƒˆã‚’撮影ã—ã¦å…¬é–‹ã™ã‚‹ã«ã¯ã€{*CONTROLLER_ACTION_CAMERA*} ã‚’ä½•åº¦ã‹æŠ¼ã—ã¦æ­£é¢ã‹ã‚‰ã®ã‚«ãƒ¡ãƒ©ã«åˆ‡ã‚Šæ›¿ãˆã€{*CONTROLLER_VK_Y*} を押ã—ã¾ã™ã€‚{*B*}{*B*} +スクリーンショットã«ã‚²ãƒ¼ãƒžãƒ¼ã‚¿ã‚°ã¯è¡¨ç¤ºã•れã¾ã›ã‚“ + + +{*T3*}éŠã³æ–¹: 世界ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ç¦æ­¢{*ETW*}{*B*}{*B*} +プレイ中ã®ä¸–界ãŒä¸é©åˆ‡ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã‚’å«ã‚“ã§ã„ã‚‹å ´åˆã€ãã®ä¸–ç•Œã‚’ã‚¢ã‚¯ã‚»ã‚¹ç¦æ­¢ãƒªã‚¹ãƒˆã«ç™»éŒ²ã§ãã¾ã™ã€‚ +ä¸–ç•Œã‚’ã‚¢ã‚¯ã‚»ã‚¹ç¦æ­¢ãƒªã‚¹ãƒˆã«ç™»éŒ²ã™ã‚‹ã«ã¯ã€ãƒãƒ¼ã‚º メニューを開ãã€{*CONTROLLER_VK_RB*} を押ã—ã¦ã€[ã‚¢ã‚¯ã‚»ã‚¹ã‚’ç¦æ­¢] ã‚’é¸æŠžã—ã¾ã™ã€‚ +次ã«ãã®ä¸–界ã§ãƒ—レイã—よã†ã¨ã™ã‚‹ã¨ã€ã‚¢ã‚¯ã‚»ã‚¹ç¦æ­¢ãƒªã‚¹ãƒˆã«ç™»éŒ²ã•れã¦ã„ã‚‹ã“ã¨ãŒé€šçŸ¥ã•れã€ãƒªã‚¹ãƒˆã‹ã‚‰å¤–ã—ã¦ãƒ—レイã™ã‚‹ã‹ã€ãƒ—レイをキャンセルã—ã¦æˆ»ã‚‹ã‹é¸æŠžã§ãã¾ã™ + +{*T3*}éŠã³æ–¹: クリエイティブ モード{*ETW*}{*B*}{*B*} +クリエイティブ モード画é¢ã§ã¯æŽ¡æŽ˜ã‚„工作をã—ãªãã¦ã‚‚ã€ã‚²ãƒ¼ãƒ å†…ã®ã‚らゆるアイテムをæŒã¡ç‰©ã«åŠ ãˆã‚‰ã‚Œã¾ã™ã€‚ +ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ã®æŒã¡ç‰©å†…ã«ã‚るアイテムã¯ã€ä¸–界ã«ç½®ã„ãŸã‚Šä½¿ã£ãŸã‚Šã—ã¦ã‚‚æŒã¡ç‰©ã‹ã‚‰æ¶ˆãˆãªã„ãŸã‚ã€ææ–™é›†ã‚ã®é¢å€’ãŒãªã建設ãã®ã‚‚ã®ã«é›†ä¸­ã§ãã¾ã™ã€‚{*B*} +クリエイティブ モードã§ä½œæˆã€ãƒ­ãƒ¼ãƒ‰ã€ã‚»ãƒ¼ãƒ–ã—ãŸä¸–界ã¯ã€ãŸã¨ãˆå¾Œã§ã‚µãƒã‚¤ãƒãƒ« モードã§ãƒ­ãƒ¼ãƒ‰ã—ãŸã¨ã—ã¦ã‚‚ã€å®Ÿç¸¾ã‚„ランキング更新ã®å¯¾è±¡ã«ãªã‚Šã¾ã›ã‚“。{*B*} +クリエイティブ モードã§é£›è¡Œã™ã‚‹ã«ã¯ã€{*CONTROLLER_ACTION_JUMP*} ã‚’ã™ã°ã‚„ã 2 回押ã—ã¾ã™ã€‚飛行をやã‚ã‚‹ã«ã¯ã€åŒã˜æ“作をもã†ä¸€åº¦è¡Œã„ã¾ã™ã€‚より速ã飛ã¶ã«ã¯ã€é£›è¡Œä¸­ã« {*CONTROLLER_ACTION_MOVE*} ã‚’å‰æ–¹å‘ã«ã™ã°ã‚„ã 2 回押ã—ã¾ã™ã€‚ +飛行モードã§ã¯ã€{*CONTROLLER_ACTION_JUMP*} ã§ä¸Šæ˜‡ã€{*CONTROLLER_ACTION_SNEAK*} ã§ä¸‹é™ã§ãã¾ã™ã€‚ã¾ãŸã¯ã€{*CONTROLLER_ACTION_DPAD_UP*} ã§ä¸Šæ˜‡ã€ {*CONTROLLER_ACTION_DPAD_DOWN*} ã§ä¸‹é™ã€ +{*CONTROLLER_ACTION_DPAD_LEFT*} ã§å·¦ã«ã€{*CONTROLLER_ACTION_DPAD_RIGHT*} ã§å³ã«é£›ã¹ã¾ã™ + +{*T3*}éŠã³æ–¹: ホストã¨ãƒ—レイヤーã®ã‚ªãƒ—ション{*ETW*}{*B*}{*B*} + +{*T1*}ゲーム オプション{*ETW*}{*B*} +世界をロードã¾ãŸã¯ç”Ÿæˆã™ã‚‹éš›ã€[ãã®ä»–ã®ã‚ªãƒ—ション] ã‚’é¸æŠžã—ã¦ã€ã‚ˆã‚Šè©³ç´°ãªè¨­å®šãŒã§ãるよã†ã«ãªã‚Šã¾ã—ãŸã€‚{*B*}{*B*} + + {*T2*}PvP{*ETW*}{*B*} + 有効ã«ã™ã‚‹ã¨ã€ãƒ—レイヤーãŒä»–ã®ãƒ—レイヤーã«ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’与ãˆã‚‰ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ (サãƒã‚¤ãƒãƒ« モードã®ã¿)。{*B*}{*B*} + + {*T2*}é«˜åº¦ãªæ“作を許å¯{*ETW*}{*B*} + 無効ã«ã™ã‚‹ã¨ã‚²ãƒ¼ãƒ ã«å‚加ã—ãŸãƒ—レイヤーã®è¡Œå‹•ãŒåˆ¶é™ã•ã‚Œã€æŽ¡æŽ˜ã‚„ã‚¢ã‚¤ãƒ†ãƒ ã®ä½¿ç”¨ã€ãƒ–ロックã®è¨­ç½®ã€ãƒ‰ã‚¢ã¨ã‚¹ã‚¤ãƒƒãƒã‚„入れ物ã®ä½¿ç”¨ã€ä»–ã®ãƒ—レイヤーや動物ã«å¯¾ã™ã‚‹æ”»æ’ƒãŒã§ããªããªã‚Šã¾ã™ã€‚ゲーム内ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã«ã‚ˆã‚Šç‰¹å®šã®ãƒ—レイヤーã«å¯¾ã™ã‚‹è¨­å®šã‚’変更ã§ãã¾ã™ã€‚{*B*}{*B*} + + {*T2*}ç«ã®å»¶ç„¼{*ETW*}{*B*} + 有効ã«ã™ã‚‹ã¨è¿‘ãã®å¯ç‡ƒæ€§ãƒ–ロックã«ç«ãŒå»¶ç„¼ã—ã¾ã™ã€‚ã“ã®è¨­å®šã¯ã‚²ãƒ¼ãƒ å†…ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã§å¤‰æ›´ã§ãã¾ã™ã€‚{*B*}{*B*} + + {*T2*}TNT ã®çˆ†ç™º{*ETW*}{*B*} + 有効ã«ã™ã‚‹ã¨èµ·çˆ†ã—㟠TNT ãŒçˆ†ç™ºã—ã¾ã™ã€‚ã“ã®è¨­å®šã¯ã‚²ãƒ¼ãƒ å†…ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã§å¤‰æ›´ã§ãã¾ã™ã€‚{*B*}{*B*} + + {*T2*}ホスト特権{*ETW*}{*B*} + 有効ã«ã™ã‚‹ã¨ã€ãƒ›ã‚¹ãƒˆã®é£›è¡Œèƒ½åŠ›ã€ç–²åŠ´ç„¡åŠ¹ã€ã‚²ãƒ¼ãƒ å†…メニューã§ã®éžè¡¨ç¤ºã‚’切り替ãˆã‚‰ã‚Œã¾ã™ã€‚{*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + +{*T1*}世界ã®ç”Ÿæˆã®ã‚ªãƒ—ション{*ETW*}{*B*} +世界ã®ç”Ÿæˆã«ã‚ªãƒ—ションãŒè¿½åŠ ã•れã¾ã—ãŸã€‚{*B*}{*B*} + + {*T2*}建物ã®ç”Ÿæˆ{*ETW*}{*B*} + 有効ã«ã™ã‚‹ã¨æ‘ã‚„è¦å¡žãªã©ã®å»ºç‰©ãŒä¸–界ã«ç”Ÿæˆã•れるよã†ã«ãªã‚Šã¾ã™ã€‚{*B*}{*B*} + + {*T2*}スーパーフラット{*ETW*}{*B*} + 有効ã«ã™ã‚‹ã¨ã€åœ°ä¸Šç•ŒãŠã‚ˆã³æš—黒界ã«ã€ã¾ã£ãŸã平らãªä¸–界を生æˆã—ã¾ã™ã€‚{*B*}{*B*} + + {*T2*}ボーナス ãƒã‚§ã‚¹ãƒˆ{*ETW*}{*B*} + 有効ã«ã™ã‚‹ã¨ã€ãƒ—レイヤーã®å¾©æ´»åœ°ç‚¹ã®è¿‘ãã«ä¾¿åˆ©ãªã‚¢ã‚¤ãƒ†ãƒ ã®å…¥ã£ãŸãƒã‚§ã‚¹ãƒˆãŒå‡ºç¾ã—ã¾ã™ã€‚{*B*}{*B*} + + {*T2*}暗黒界をリセットã™ã‚‹{*ETW*}{*B*} + 有効ã«ã™ã‚‹ã¨æš—黒界をå†ç”Ÿæˆã—ã¾ã™ã€‚æš—é»’ç ¦ãŒå­˜åœ¨ã—ãªã„セーブ データãŒã‚ã‚‹å ´åˆã«ä¾¿åˆ©ã§ã™{*B*}{*B*} + + {*T1*}ゲーム内ã®ã‚ªãƒ—ション{*ETW*}{*B*} + ゲーム中㫠BACK を押ã™ã¨ã€æ§˜ã€…ãªã‚ªãƒ—ション メニューを開ãã“ã¨ãŒã§ãã¾ã™ã€‚{*B*}{*B*} + + {*T2*}ホスト オプション{*ETW*}{*B*} + ホストプレイヤー㨠[ホストオプションを変更ã§ãã‚‹] ã«è¨­å®šã•れãŸãƒ—レイヤー㯠[ホスト オプション] メニューを使用ã§ãã¾ã™ã€‚ã“ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã§ã¯ç«ã®å»¶ç„¼ã‚„ TNT ã®çˆ†ç™ºãªã©ã‚’切り替ãˆã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚{*B*}{*B*} + +{*T1*}プレイヤー オプション{*ETW*}{*B*} +プレイヤー特権を変更ã™ã‚‹ã«ã¯ã€{*CONTROLLER_VK_A*} ã§ãƒ—レイヤー特権メニューを開ã„ã¦æ¬¡ã®ã‚ªãƒ—ションを設定ã—ã¦ãã ã•ã„。{*B*}{*B*} + + {*T2*}å»ºè¨­ã¨æŽ¡æŽ˜ã®è¨±å¯{*ETW*}{*B*} + [é«˜åº¦ãªæ“作を許å¯] を無効ã«ã—ã¦ã„ã‚‹å ´åˆã®ã¿ä½¿ãˆã‚‹ã‚ªãƒ—ションã§ã™ã€‚ 有効ã«ã™ã‚‹ã¨ã“ã®ã‚²ãƒ¼ãƒ ã«å‚加ã—ãŸãƒ—レイヤーã¯é€šå¸¸é€šã‚Šã«ä¸–界をæ“作ã§ãã¾ã™ã€‚無効ã«ã™ã‚‹ã¨ã€ã“ã®ã‚²ãƒ¼ãƒ ã«å‚加ã—ãŸãƒ—レイヤーã¯å»ºè¨­ã‚„採掘ãŠã‚ˆã³å¤šãã®ã‚¢ã‚¤ãƒ†ãƒ ã‚„ãƒ–ãƒ­ãƒƒã‚¯ã®æ“作ãŒã§ãã¾ã›ã‚“。{*B*}{*B*} + + {*T2*}ドアã¨ã‚¹ã‚¤ãƒƒãƒã®ä½¿ç”¨ã‚’許å¯{*ETW*}{*B*} + [é«˜åº¦ãªæ“作を許å¯] を無効ã«ã—ã¦ã„ã‚‹å ´åˆã®ã¿ä½¿ãˆã‚‹ã‚ªãƒ—ションã§ã™ã€‚無効ã«ã™ã‚‹ã¨ã€ã“ã®ã‚²ãƒ¼ãƒ ã«å‚加ã—ãŸãƒ—レイヤーã¯ãƒ‰ã‚¢ã¨ã‚¹ã‚¤ãƒƒãƒã‚’使用ã§ãã¾ã›ã‚“。{*B*}{*B*} + + {*T2*}入れ物ã®ä½¿ç”¨ã‚’許å¯{*ETW*}{*B*} + [é«˜åº¦ãªæ“作を許å¯] を無効ã«ã—ã¦ã„ã‚‹å ´åˆã®ã¿ä½¿ãˆã‚‹ã‚ªãƒ—ションã§ã™ã€‚無効ã«ã™ã‚‹ã¨ã€ã“ã®ã‚²ãƒ¼ãƒ ã«å‚加ã—ãŸãƒ—レイヤーã¯ãƒã‚§ã‚¹ãƒˆãªã©ã®å…¥ã‚Œç‰©ã‚’使用ã§ãã¾ã›ã‚“。{*B*}{*B*} + + {*T2*}プレイヤーを攻撃å¯èƒ½{*ETW*}{*B*} + [é«˜åº¦ãªæ“作を許å¯] を無効ã«ã—ã¦ã„ã‚‹å ´åˆã®ã¿ä½¿ãˆã‚‹ã‚ªãƒ—ションã§ã™ã€‚無効ã«ã™ã‚‹ã¨ã€ãƒ—レイヤーãŒä»–ã®ãƒ—レイヤーã«ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’与ãˆã‚‰ã‚Œãªããªã‚Šã¾ã™ã€‚{*B*}{*B*} + + {*T2*}動物を攻撃å¯èƒ½{*ETW*}{*B*} + [é«˜åº¦ãªæ“作を許å¯] を無効ã«ã—ã¦ã„ã‚‹å ´åˆã®ã¿ä½¿ãˆã‚‹ã‚ªãƒ—ションã§ã™ã€‚無効ã«ã™ã‚‹ã¨ã€ãƒ—レイヤーãŒå‹•物ã«ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’与ãˆã‚‰ã‚Œãªããªã‚Šã¾ã™ã€‚{*B*}{*B*} + + {*T2*}ホスト オプションを変更ã§ãã‚‹{*ETW*}{*B*} + ã“ã®è¨­å®šã‚’有効ã«ã™ã‚‹ã¨ã€ãã®ãƒ—レイヤーã¯ã€Œé«˜åº¦ãªæ“作を許å¯ã€ãŒç„¡åйã®å ´åˆã«ã€ãƒ›ã‚¹ãƒˆã‚’除ãä»–ã®ãƒ—レイヤーã®ç‰¹æ¨©ã‚„ã€ãƒ—レイヤーã®è¿½æ”¾ã€ç«ã®å»¶ç„¼ã¨ TNT ã®çˆ†ç™ºã®è¨­å®šãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚{*B*}{*B*} + + {*T2*}プレイヤーを追放{*ETW*}{*B*} + ホストプレイヤーã¨åŒã˜ {*PLATFORM_NAME*} を使用ã—ã¦ã„ãªã„プレイヤーã«å¯¾ã—ã¦ã“ã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠžã™ã‚‹ã¨ã€ãã®ãƒ—レイヤーãŠã‚ˆã³å¯¾è±¡ãƒ—レイヤーã¨åŒã˜ {*PLATFORM_NAME*} を使用ã—ã¦ã„ã‚‹ä»–ã®ãƒ—レイヤーãŒã‚²ãƒ¼ãƒ ã‹ã‚‰è¿½æ”¾ã•れã¾ã™ã€‚追放ã•れãŸãƒ—レイヤーã¯ã€ã‚²ãƒ¼ãƒ ãŒå†èµ·å‹•ã•れるã¾ã§ã¯å†ã³å‚加ã§ãã¾ã›ã‚“。{*B*}{*B*} + +{*T1*}ホストプレイヤー オプション{*ETW*}{*B*} +[ホスト特権] ãŒæœ‰åйã®å ´åˆã€ãƒ›ã‚¹ãƒˆãƒ—レイヤーã¯è‡ªåˆ†ã«ç‰¹æ¨©ã‚’設定ã§ãã¾ã™ã€‚ホスト特権を変更ã™ã‚‹ã«ã¯ã€ãƒ—レイヤーåã‚’é¸æŠžã—㦠{*CONTROLLER_VK_A*} ã§ç‰¹æ¨©ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’é–‹ãã€æ¬¡ã®ã‚ªãƒ—ションを設定ã—ã¦ãã ã•ã„。{*B*}{*B*} + + {*T2*}飛行å¯èƒ½{*ETW*}{*B*} + 有効ã«ã™ã‚‹ã¨ã€é£›è¡Œã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚クリエイティブ モードã§ã¯å…¨ãƒ—レイヤーãŒé£›è¡Œã§ãã‚‹ãŸã‚ã€ã‚µãƒã‚¤ãƒãƒ« モードã«ã®ã¿é©ç”¨ã•れã¾ã™ã€‚{*B*}{*B*} + + {*T2*}疲労無効{*ETW*}{*B*} + サãƒã‚¤ãƒãƒ« モードã«ã®ã¿é©ç”¨ã•れるオプションã§ã™ã€‚有効ã«ã™ã‚‹ã¨ç§»å‹•ã€ãƒ€ãƒƒã‚·ãƒ¥ã€ã‚¸ãƒ£ãƒ³ãƒ—ãªã©ã®è¡Œå‹•ã§ç©ºè…¹ã‚²ãƒ¼ã‚¸ãŒæ¸›ã‚‰ãªããªã‚Šã¾ã™ã€‚ãŸã ã—プレイヤーãŒãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’å—ã‘ã¦ã„ã‚‹é–“ã¯ã€å›žå¾©ä¸­ã«ç©ºè…¹ã‚²ãƒ¼ã‚¸ãŒã‚†ã£ãり減少ã—ã¾ã™ã€‚{*B*}{*B*} + + {*T2*}ä¸å¯è¦–{*ETW*}{*B*} + 有効ã«ã™ã‚‹ã¨ãƒ—レイヤーã¯ä»–ã®ãƒ—レイヤーã‹ã‚‰è¦‹ãˆãªããªã‚Šã€ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚‚å—ã‘ãªããªã‚Šã¾ã™ã€‚{*B*}{*B*} + + {*T2*テレãƒãƒ¼ãƒˆå¯èƒ½{*ETW*}{*B*} + 自分や他ã®ãƒ—レイヤーを世界ã«ã„ã‚‹ä»–ã®ãƒ—レイヤーã®å ´æ‰€ã«ç§»å‹•ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ + + +次㸠+ +å‰ã¸ + +基本 + +ç”»é¢ã®è¡¨ç¤º + +æŒã¡ç‰© + +ãƒã‚§ã‚¹ãƒˆ + +工作 + +ã‹ã¾ã© + +発射装置 + +動物ã®é£¼è‚² + +動物ã®ç¹æ®– + +èª¿åˆ + +エンãƒãƒ£ãƒ³ãƒˆ + +é—‡ã®ãƒãƒ¼ã‚¿ãƒ« + +マルãƒãƒ—レイヤー + +スクリーンショットã®å…¬é–‹ + +世界ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ç¦æ­¢ + +クリエイティブ モード + +ホストã¨ãƒ—レイヤーã®ã‚ªãƒ—ション + +å–引 + +金床 + +æžœã¦ã®ä¸–界 + +{*T3*}éŠã³æ–¹: æžœã¦ã®ä¸–界{*ETW*}{*B*}{*B*} +æžœã¦ã®ä¸–界ã¯åˆ¥ä¸–界㮠1 ã¤ã§ã€æžœã¦ã®ãƒãƒ¼ã‚¿ãƒ«ã‚’èµ·å‹•ã—ã¦è¡Œãã“ã¨ãŒã§ãã¾ã™ã€‚æžœã¦ã®ãƒãƒ¼ã‚¿ãƒ«ã¯åœ°ä¸Šç•Œã®åœ°ä¸‹æ·±ãã®è¦å¡žã«ã‚りã¾ã™ã€‚{*B*} +æžœã¦ã®ãƒãƒ¼ã‚¿ãƒ«ã‚’èµ·å‹•ã™ã‚‹ã«ã¯ã€ã‚¨ãƒ³ãƒ€ãƒ¼ã‚¢ã‚¤ã‚’æžœã¦ã®ãƒãƒ¼ã‚¿ãƒ«ã®æž å†…ã«ã¯ã‚込む必è¦ãŒã‚りã¾ã™ã€‚{*B*} +ãƒãƒ¼ã‚¿ãƒ«ãŒèµ·å‹•ã—ãŸã‚‰ã€é£›ã³è¾¼ã‚“ã§æžœã¦ã®ä¸–界ã«è¡Œãã¾ã—ょã†ã€‚{*B*}{*B*} +æžœã¦ã®ä¸–界ã§ã¯ã€æã‚ã—ãæ‰‹ã”ã‚ã„ Enderman ãŸã¡ãŒå¾…ã¡æ§‹ãˆã¦ã„ã‚‹ã ã‘ã§ãªãã€ã‚¨ãƒ³ãƒ€ãƒ¼ ドラゴンãŒå‡ºç¾ã—ã¾ã™ã€‚æžœã¦ã®ä¸–界ã«é€²ã‚€å‰ã«ã—ã£ã‹ã‚Šæº–備を整ãˆã¾ã—ょã†!{*B*}{*B*} +8 本ã®é»’æ›œçŸ³ã®æŸ±ã®ä¸Šã«ã¯ã‚¨ãƒ³ãƒ€ãƒ¼ クリスタルãŒã‚りã€ã‚¨ãƒ³ãƒ€ãƒ¼ ドラゴンã¯ã“れを使ã£ã¦å›žå¾©ã—ã¾ã™ã€‚ +戦ã„ãŒå§‹ã¾ã£ãŸã‚‰æœ€åˆã«ã‚¨ãƒ³ãƒ€ãƒ¼ クリスタルをã²ã¨ã¤ãšã¤ç ´å£Šã—ã¾ã—ょã†ã€‚{*B*} +手å‰ã®æ•°å€‹ã¯çŸ¢ãŒå±Šã場所ã«ã‚りã¾ã™ãŒã€æ®‹ã‚Šã¯é‰„ã®æŸµã§å›²ã¾ã‚Œã¦ã„ã¾ã™ã€‚届ã高ã•ã¾ã§è¶³å ´ã‚’ç©ã¿ä¸Šã’ã¾ã—ょã†ã€‚{*B*}{*B*} +ãã®é–“ã€ã‚¨ãƒ³ãƒ€ãƒ¼ ドラゴンãŒé£›ã³ã‹ã‹ã£ã¦ããŸã‚Šã€ã‚¨ãƒ³ãƒ€ãƒ¼ アシッド ブレスをåã„ã¦æ”»æ’ƒã—ã¦ãã¾ã™!{*B*} +柱ã®ä¸­å¤®ã«ã‚るタマゴå°ã«è¿‘ã¥ãã¨ã€ã‚¨ãƒ³ãƒ€ãƒ¼ ãƒ‰ãƒ©ã‚´ãƒ³ãŒæ”»æ’ƒã—よã†ã¨é™ä¸‹ã—ã¦ãã¾ã™ã€‚ダメージを与ãˆã‚‹ãƒãƒ£ãƒ³ã‚¹ã§ã™!{*B*} +アシッド ブレスをã‹ã‚ã—ãªãŒã‚‰ã€ã‚¨ãƒ³ãƒ€ãƒ¼ ドラゴンã®å¼±ç‚¹ã§ã‚る目を狙ã†ã®ãŒåŠ¹æžœçš„ã§ã™ã€‚助ã‘ã¦ãれるフレンドãŒã„ã‚‹å ´åˆã¯ã€æžœã¦ã®ä¸–ç•Œã«æ¥ã¦ã‚‚らã£ã¦ä¸€ç·’ã«æˆ¦ã„ã¾ã—ょã†!{*B*}{*B*} +ã‚ãªãŸãŒä¸€åº¦ã§ã‚‚æžœã¦ã®ä¸–界ã«å…¥ã‚‹ã¨ã€ãƒ•レンドã®åœ°å›³ã«ã‚‚æžœã¦ã®ãƒãƒ¼ã‚¿ãƒ«ã®å ´æ‰€ãŒè¡¨ç¤ºã•れるよã†ã«ãªã‚Š +ç°¡å˜ã«å‚加ã—ã¦ã‚‚らãˆã¾ã™ + + +ダッシュ + +最新情報 + +{*T3*}修正ã¨è¿½åŠ {*ETW*}{*B*}{*B*} +- æ–°ã—ã„アイテムを追加ã—ã¾ã—ãŸã€‚エメラルドã€ã‚¨ãƒ¡ãƒ©ãƒ«ãƒ‰é‰±çŸ³ã€ã‚¨ãƒ¡ãƒ©ãƒ«ãƒ‰ã®ãƒ–ロックã€ã‚¨ãƒ³ãƒ€ãƒ¼ ãƒã‚§ã‚¹ãƒˆã€ãƒˆãƒªãƒƒãƒ—ワイヤー フックã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã—ãŸé‡‘ã®ãƒªãƒ³ã‚´ã€é‡‘åºŠã€æ¤æœ¨é‰¢ã€ä¸¸çŸ³ã®å£ã€è‹”ã®ç”ŸãˆãŸä¸¸çŸ³ã®å£ã€ã‚¦ã‚£ã‚¶ãƒ¼ã®çµµã€ã‚¸ãƒ£ã‚¬ã‚¤ãƒ¢ã€ãƒ™ã‚¤ã‚¯ãƒ‰ ãƒãƒ†ãƒˆï½¤æœ‰æ¯’ãªã‚¸ãƒ£ã‚¬ã‚¤ãƒ¢ã€ãƒ‹ãƒ³ã‚¸ãƒ³ã€é‡‘ã®ãƒ‹ãƒ³ã‚¸ãƒ³ã€æ£’付ãã®ãƒ‹ãƒ³ã‚¸ãƒ³ +パンプキン ãƒ‘ã‚¤ã€æš—視ã®ãƒãƒ¼ã‚·ãƒ§ãƒ³ã€ä¸å¯è¦–ã®ãƒãƒ¼ã‚·ãƒ§ãƒ³ã€é—‡ã®ã‚¯ã‚©ãƒ¼ãƒ„ã€é—‡ã®ã‚¯ã‚©ãƒ¼ãƒ„鉱石ã€ã‚¯ã‚©ãƒ¼ãƒ„ã®ãƒ–ロックã€ã‚¯ã‚©ãƒ¼ãƒ„ã®åŽšæ¿ã€ã‚¯ã‚©ãƒ¼ãƒ„ã®éšŽæ®µã€æ¨¡æ§˜å…¥ã‚Šã®ã‚¯ã‚©ãƒ¼ãƒ„ã®ãƒ–ãƒ­ãƒƒã‚¯ã€æŸ±çжã®ã‚¯ã‚©ãƒ¼ãƒ„ã®ãƒ–ロックã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã—ãŸæœ¬ã€ã‚«ãƒ¼ãƒšãƒƒãƒˆã€‚{*B*} +- ãªã‚らã‹ãªç ‚å²©ã¨æ¨¡æ§˜å…¥ã‚Šã®ç ‚å²©ã®æ–°ã—ã„レシピを追加ã—ã¾ã—ãŸã€‚{*B*} +- æ–°ã—ã„ç”Ÿç‰©ã€æ‘人ゾンビを追加ã—ã¾ã—ãŸã€‚{*B*} +- æ–°ã—ã„åœ°å½¢ç”Ÿæˆæ©Ÿèƒ½ã‚’追加ã—ã¾ã—ãŸã€‚ç ‚æ¼ ã®ç¥žæ®¿ã€ç ‚æ¼ ã®æ‘ã€ã‚¸ãƒ£ãƒ³ã‚°ãƒ«ã®ç¥žæ®¿ã€‚{*B*} +- æ‘人ã¨ã®å–引を追加ã—ã¾ã—ãŸã€‚{*B*} +- 金床ã®ç”»é¢ã‚’追加ã—ã¾ã—ãŸã€‚{*B*} +- é©ã®ã‚¢ãƒ¼ãƒžãƒ¼ã‚’染色ã§ãã¾ã™ã€‚{*B*} +- オオカミã®é¦–輪を染色ã§ãã¾ã™ã€‚{*B*} +- 棒付ãã®ãƒ‹ãƒ³ã‚¸ãƒ³ã§ä¹—り物ã®è±šã‚’æ“縦ã§ãã¾ã™ã€‚{*B*} +- ボーナス ãƒã‚§ã‚¹ãƒˆ コンテンツã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’増やã—ã¾ã—ãŸã€‚{*B*} +- ãƒãƒ¼ãƒ•ブロックã¨ãƒãƒ¼ãƒ•ブロック上ã®ãã®ä»–ã®ãƒãƒ¼ãƒ•ブロックã®é…置を変更ã—ã¾ã—ãŸã€‚{*B*} +- 上下逆ã®éšŽæ®µã¨åŽšæ¿ã®é…置を変更ã—ã¾ã—ãŸã€‚{*B*} +- ç•°ãªã‚‹æ‘人ã®è·æ¥­ã‚’追加ã—ã¾ã—ãŸã€‚{*B*} +- スãƒãƒ¼ãƒ³ エッグã‹ã‚‰å‡ºç¾ã—ãŸæ‘人ã®è·æ¥­ãŒãƒ©ãƒ³ãƒ€ãƒ ã«ãªã‚Šã¾ã™ã€‚{*B*} +- 横é“ã®ä¸¸å¤ªã®é…置を追加ã—ã¾ã—ãŸã€‚{*B*} +- 木ã®é“å…·ã‚’ã‹ã¾ã©ã®ç‡ƒæ–™ã¨ã—ã¦ä½¿ç”¨ã§ãã¾ã™ã€‚{*B*} +- æ°·æ¿ã¨ã‚¬ãƒ©ã‚¹æ¿ã‚’技能ã§ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã—ãŸé“å…·ã§å›žåŽã§ãã¾ã™ã€‚{*B*} +- 木ã®ãƒœã‚¿ãƒ³ã¨æœ¨ã®ãƒ—レッシャー プレートを矢ã§èµ·å‹•ã§ãã¾ã™ã€‚{*B*} +- é—‡ã®ç”Ÿç‰©ãŒåœ°ä¸Šç•Œã®ãƒãƒ¼ã‚¿ãƒ«ã‹ã‚‰ç™ºç”Ÿã—ã¾ã™ã€‚{*B*} +- Creeperã¨ã‚¯ãƒ¢ãŒã€æœ€å¾Œã«æ”»æ’ƒã—ã¦ããŸãƒ—レイヤーã«å¯¾ã—ã¦æ”»æ’ƒçš„ã«ãªã‚Šã¾ã™ã€‚{*B*} +- クリエイティブ モードã®ç”Ÿç‰©ãŒçŸ­æ™‚é–“ã§ä¸­ç«‹ã«æˆ»ã‚Šã¾ã™ã€‚{*B*} +- 溺れã¦ã„る時ã®ãƒŽãƒƒã‚¯ãƒãƒƒã‚¯ã‚’排除ã—ã¾ã—ãŸã€‚{*B*} +- ゾンビã«å£Šã•れã¦ã„るドアã®ãƒ€ãƒ¡ãƒ¼ã‚¸ãŒè¡¨ç¤ºã•れã¾ã™ã€‚{*B*} +- 暗黒界ã§ã¯æ°·ãŒæº¶ã‘ã¾ã™ã€‚{*B*} +- 雨ãŒé™ã£ã¦ã„る時ã«å¤§é‡œã‚’外ã«å‡ºã™ã¨ä¸€æ¯ã«ãªã‚Šã¾ã™ã€‚{*B*} +- ãƒ”ã‚¹ãƒˆãƒ³ã®æ›´æ–°ã« 2 å€ã®æ™‚é–“ãŒã‹ã‹ã‚Šã¾ã™ã€‚{*B*} +- 豚を殺ã™ã¨éžã‚’è½ã¨ã—ã¾ã™ (éžã‚’ç€ã‘ã¦ã„ã‚‹å ´åˆ)。{*B*} +- æžœã¦ã®ä¸–界ã®ç©ºã®è‰²ã‚’変更ã—ã¾ã—ãŸã€‚{*B*} +- ã²ã‚‚ (トップワイヤー用) を付ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚{*B*} +- 雨ãŒè‘‰ã®é–“ã‚’ã—ãŸãŸã‚Šè½ã¡ã¾ã™ã€‚{*B*} +- ブロックã®ä¸‹ã«ãƒ¬ãƒãƒ¼ã‚’付ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚{*B*} +- 難易度設定ã«ã‚ˆã£ã¦ TNT ãŒã•ã¾ã–ã¾ãªãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’与ãˆã¾ã™ã€‚{*B*} +- 本ã®ãƒ¬ã‚·ãƒ”を変更ã—ã¾ã—ãŸã€‚{*B*} +- スイレンã®è‘‰ãŒãƒœãƒ¼ãƒˆã‚’壊ã™ä»£ã‚りã«ã€ãƒœãƒ¼ãƒˆãŒã‚¹ã‚¤ãƒ¬ãƒ³ã®è‘‰ã‚’壊ã—ã¾ã™ã€‚{*B*} +- 豚ã®è½ã¨ã™è±šè‚‰ã‚’増やã—ã¾ã—ãŸã€‚{*B*} +- スーパーフラットã§ç™ºç”Ÿã™ã‚‹ã‚¹ãƒ©ã‚¤ãƒ ã‚’減らã—ã¾ã—ãŸã€‚{*B*} +- Creeper ã®ãƒ€ãƒ¡ãƒ¼ã‚¸å¤‰æ•°ãŒé›£æ˜“度設定ã«åŸºã¥ãã€ãƒŽãƒƒã‚¯ãƒãƒƒã‚¯ã‚’増やã—ã¾ã—ãŸã€‚{*B*} +- EndermanãŒã‚¢ã‚´ã‚’é–‹ã‹ãªã„ã¨ã„ã†å•題を修正ã—ã¾ã—ãŸã€‚{*B*} +- プレイヤーã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’追加ã—ã¾ã—㟠(ゲーム内㮠BACK メニューを使用)。{*B*} +- リモート プレイヤー用ã®é£›è¡Œã€ä¸å¯è¦–ã€ä¸æ­»èº«ã®æ–°ã—ã„ホスト オプションを追加ã—ã¾ã—ãŸã€‚{*B*} +- æ–°ã—ã„ã‚¢ã‚¤ãƒ†ãƒ ã¨æ©Ÿèƒ½ã®ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã‚’追加ã—ã¾ã—ãŸã€‚{*B*} +- ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã®éŸ³æ¥½ãƒ‡ã‚£ã‚¹ã‚¯ ãƒã‚§ã‚¹ãƒˆã®ä½ç½®ã‚’変更ã—ã¾ã—ãŸ{*B*} + + +{*ETB*}よã†ã“ã! ã¾ã ãŠæ°—ã¥ãã§ãªã„ã‹ã‚‚ã—れã¾ã›ã‚“ãŒã€Minecraft ãŒã‚¢ãƒƒãƒ—デートã•れã¾ã—ãŸã€‚{*B*}{*B*} +ã“ã“ã§ã”紹介ã—ã¦ã„ã‚‹ã®ã¯ã€ãƒ•レンドã¨ä¸€ç·’ã«éŠã¹ã‚‹æ–°æ©Ÿèƒ½ã®ã»ã‚“ã®ä¸€éƒ¨ã§ã™ã€‚よãèª­ã‚“ã§æ¥½ã—ãéŠã‚“ã§ãã ã•ã„!{*B*}{*B*} +{*T1*}新アイテム{*ETB*} - エメラルドã€ã‚¨ãƒ¡ãƒ©ãƒ«ãƒ‰é‰±çŸ³ã€ã‚¨ãƒ¡ãƒ©ãƒ«ãƒ‰ã®ãƒ–ロックã€ã‚¨ãƒ³ãƒ€ãƒ¼ ãƒã‚§ã‚¹ãƒˆã€ãƒˆãƒªãƒƒãƒ—ワイヤー フックã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã—ãŸé‡‘ã®ãƒªãƒ³ã‚´ã€é‡‘åºŠã€æ¤æœ¨é‰¢ã€ä¸¸çŸ³ã®å£ã€è‹”ã®ç”ŸãˆãŸä¸¸çŸ³ã®å£ã€ã‚¦ã‚£ã‚¶ãƒ¼ã®çµµã€ã‚¸ãƒ£ã‚¬ã‚¤ãƒ¢ã€ãƒ™ã‚¤ã‚¯ãƒ‰ ãƒãƒ†ãƒˆï½¤æœ‰æ¯’ãªã‚¸ãƒ£ã‚¬ã‚¤ãƒ¢ã€ãƒ‹ãƒ³ã‚¸ãƒ³ã€é‡‘ã®ãƒ‹ãƒ³ã‚¸ãƒ³ã€æ£’付ãã®ãƒ‹ãƒ³ã‚¸ãƒ³ã€ +パンプキン ãƒ‘ã‚¤ã€æš—視ã®ãƒãƒ¼ã‚·ãƒ§ãƒ³ã€ä¸å¯è¦–ã®ãƒãƒ¼ã‚·ãƒ§ãƒ³ã€é—‡ã®ã‚¯ã‚©ãƒ¼ãƒ„ã€é—‡ã®ã‚¯ã‚©ãƒ¼ãƒ„鉱石ã€ã‚¯ã‚©ãƒ¼ãƒ„ã®ãƒ–ロックã€ã‚¯ã‚©ãƒ¼ãƒ„ã®åŽšæ¿ã€ã‚¯ã‚©ãƒ¼ãƒ„ã®éšŽæ®µã€æ¨¡æ§˜å…¥ã‚Šã®ã‚¯ã‚©ãƒ¼ãƒ„ã®ãƒ–ãƒ­ãƒƒã‚¯ã€æŸ±çжã®ã‚¯ã‚©ãƒ¼ãƒ„ã®ãƒ–ロックã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã—ãŸæœ¬ã€ã‚«ãƒ¼ãƒšãƒƒãƒˆã€‚{*B*}{*B*} + {*T1*}æ–°ã—ã„生物{*ETB*} - æ‘人ゾンビ。{*B*}{*B*} +{*T1*}新機能{*ETB*} - æ‘人ã¨ã®å–引ã€é‡‘床ã§ã®æ­¦å™¨ã¨é“å…·ã®ä¿®ç†ã¾ãŸã¯ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã€ã‚¨ãƒ³ãƒ€ãƒ¼ ãƒã‚§ã‚¹ãƒˆã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’ä¿ç®¡ã€æ£’付ãニンジンを使ã£ã¦ä¹—ã£ãŸè±šã®æ“縦!{*B*}{*B*} +{*T1*}æ–°ã—ã„ミニãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«{*ETB*} ? ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã®æ–°æ©Ÿèƒ½ã‚’紹介!{*B*}{*B*} +{*T1*}æ–°ã—ã„「イースター エッグã€{*ETB*} ? ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã®ç§˜å¯†ã®éŸ³æ¥½ãƒ‡ã‚£ã‚¹ã‚¯ã‚’移動ã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦è¦‹ã¤ã‘出ã—ã¦ã¿ã¾ã—ょã†!{*B*}{*B*} + + +手よりも攻撃力ãŒé«˜ã„ + +土ã€è‰ã€ç ‚ã€ç ‚利や雪を掘るã®ã«ä½¿ã†ã€‚æ‰‹ã§æŽ˜ã‚‹ã‚ˆã‚Šé€Ÿã„。雪玉を掘るã«ã¯ã‚·ãƒ£ãƒ™ãƒ«ãŒå¿…è¦ + +石ã§ã§ãã¦ã„るブロックã¨é‰±çŸ³ã‚’掘るã®ã«å¿…è¦ + +木ã§ã§ãã¦ã„るブロックを切り出ã™ã®ã«ä½¿ã†ã€‚手ã§åˆ‡ã‚Šå‡ºã™ã‚ˆã‚Šé€Ÿã„ + +土やè‰ã®ãƒ–ロックを耕ã—ã¦ä½œç‰©ã‚’育ã¦ã‚‰ã‚Œã‚‹ã‚ˆã†ã«ã™ã‚‹ + +木ã®ãƒ‰ã‚¢ã¯ã€ä½¿ç”¨ã—ãŸã‚Šã€å©ã„ãŸã‚Šã€ãƒ¬ãƒƒãƒ‰ã‚¹ãƒˆãƒ¼ãƒ³ã‚’使ã†ã“ã¨ã§é–‹ãã¾ã™ + +鉄ã®ãƒ‰ã‚¢ã‚’é–‹ãã«ã¯ã€ãƒ¬ãƒƒãƒ‰ã‚¹ãƒˆãƒ¼ãƒ³ã‚„ã€ãƒœã‚¿ãƒ³ã€ã‚¹ã‚¤ãƒƒãƒã‚’使ã†å¿…è¦ãŒã‚りã¾ã™ + +NOT USED + +NOT USED + +NOT USED + +NOT USED + +装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +1 + +装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +3 + +装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +2 + +装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +1 + +装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +2 + +装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +5 + +装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +4 + +装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +1 + +装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +2 + +装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +6 + +装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +5 + +装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +2 + +装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +2 + +装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +5 + +装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +3 + +装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +1 + +装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +3 + +装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +8 + +装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +6 + +装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +3 + +光沢を放ã¤å»¶ã¹æ£’ã€é“å…·ã‚’ä½œã‚‹ææ–™ã¨ã—ã¦ä½¿ã†ã€‚ã‹ã¾ã©ã§é‰±çŸ³ã‚’精錬ã—ã¦ä½œã‚‹ + +å»¶ã¹æ£’ã€å®çŸ³ã€æŸ“æ–™ãªã©ã‚’ã€ä¸–界ã«ç½®ã‘るブロックã«å¤‰ãˆã‚‰ã‚Œã‚‹ã€‚高級ãªå»ºç¯‰ç”¨ãƒ–ロックやã€é‰±çŸ³ã®ä¿ç®¡ç”¨ã¨ã—ã¦ä½¿ã†ã“ã¨ãŒã§ãã‚‹ + +プレイヤーや動物ã€ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ãªã©ãŒä¸Šã‚’通るã¨é›»æ°—ã‚’é€ã‚Šå‡ºã™ã€‚木ã®é‡é‡æ„ŸçŸ¥æ¿ã¯ã€ç‰©ã‚’上ã«ç½®ãã“ã¨ã§ã‚‚作動ã™ã‚‹ + +å°ã•ãªéšŽæ®µã‚’作るã®ã«ä½¿ã† + +é•·ã„階段を作るã®ã«ä½¿ã†ã€‚ãれãžã‚Œã®ä¸Šéƒ¨ã« 2 ã¤ã®åŽšæ¿ã‚’ç½®ãã“ã¨ã§ã€é€šå¸¸ã‚µã‚¤ã‚ºã® 2 å€ã®åŽšæ¿ãƒ–ロックを作るã“ã¨ãŒã§ãã‚‹ + +é•·ã„階段を作るã®ã«ä½¿ã†ã€‚ãれãžã‚Œã®ä¸Šéƒ¨ã« 2 ã¤ã®åŽšæ¿ã‚’ç½®ãã“ã¨ã§ã€é€šå¸¸ã‚µã‚¤ã‚ºã® 2 å€ã®åŽšæ¿ãƒ–ロックを作るã“ã¨ãŒã§ãã‚‹ + +明ã‹ã‚Šã‚’照らã™ã®ã«ä½¿ã†ã€‚ãŸã„ã¾ã¤ã¯ã€é›ªã‚„氷も溶ã‹ã™ã“ã¨ãŒã§ãã‚‹ + +建築用素æã€‚様々ãªç‰©ã®ææ–™ã«ãªã‚‹ã€‚ã©ã‚“ãªå½¢ã®æœ¨ã‹ã‚‰ã§ã‚‚切り出ã›ã‚‹ + +建築用素æã€‚通常ã®ç ‚ã®ã‚ˆã†ã«é‡åŠ›ã®å½±éŸ¿ã‚’å—ã‘ãªã„ + +建築用素æ + +ãŸã„ã¾ã¤ã€çŸ¢ã€çœ‹æ¿ã€ã¯ã—ã”ã€æŸµã‚’作るã€ã¾ãŸã¯é“å…·ã‚„æ­¦å™¨ã®æ¡ã‚Šéƒ¨åˆ†ã‚’作るã®ã«ä½¿ã† + +ゲーム内ã®å…¨ã¦ã®ãƒ—レイヤーãŒãƒ™ãƒƒãƒ‰ã§å¯ã¦ã„る時ã«ä½¿ã†ã¨ã€å¤œã‹ã‚‰æœã¸æ™‚間を早回ã—ã™ã‚‹ã“ã¨ãŒã§ãる。ãã—ã¦ã€ä½¿ç”¨ã—ãŸãƒ—レイヤーã®å¾©æ´»åœ°ç‚¹ãŒå¤‰ã‚る。 +ベッドã®è‰²ã¯ä½¿ã‚れãŸã‚¦ãƒ¼ãƒ«ã®è‰²ã«é–¢ä¿‚ãªãã€å¸¸ã«åŒã˜ + +通常ã®å·¥ä½œã‚ˆã‚Šã‚‚ã€ã•らã«å¤šãã®ç¨®é¡žã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’作るã“ã¨ãŒã§ãã‚‹ + +鉱石を精錬ã—ã¦æœ¨ç‚­ã‚„ガラスを作ã£ãŸã‚Šã€é­šã‚„豚肉を調ç†ã™ã‚‹ã“ã¨ãŒã§ãã‚‹ + +中ã«ãƒ–ロックやアイテムをä¿ç®¡ã§ãる。2 ã¤ã®ãƒã‚§ã‚¹ãƒˆã‚’横ã«ä¸¦ã¹ã‚‹ã“ã¨ã§ã€2 å€ã®å®¹é‡ã®ãƒã‚§ã‚¹ãƒˆ (大) ãŒã§ãã‚‹ + +「障害物ã€ã¨ã—ã¦æ©Ÿèƒ½ã—ã€ã‚¸ãƒ£ãƒ³ãƒ—ã§é£›ã³è¶Šãˆã‚‹ã“ã¨ãŒã§ããªã„。プレイヤーや動物ã€ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ã«å¯¾ã—ã¦ã¯ã€é«˜ã• 1.5 ブロックã¨ã—ã¦æ©Ÿèƒ½ã—ã€ä»–ã®ãƒ–ロックã«å¯¾ã—ã¦ã¯é«˜ã• 1 ブロックã¨ã—ã¦æ©Ÿèƒ½ã™ã‚‹ + +垂直方å‘ã«ç™»ã‚‹ã®ã«ä½¿ã† + +使用ã—ãŸã‚Šã€å©ã„ãŸã‚Šã€ãƒ¬ãƒƒãƒ‰ã‚¹ãƒˆãƒ¼ãƒ³ã§é–‹ã。普通ã®ãƒ‰ã‚¢ã¨ã—ã¦æ©Ÿèƒ½ã™ã‚‹ãŒã€ãƒ–ロック 1 個分ã§ã‚りã€å¹³ã‚‰ãªåºŠé¢ã¨ã—ã¦ç½®ã‘ã‚‹ + +自分や他ã®ãƒ—レイヤーã®å…¥åŠ›ã—ãŸãƒ†ã‚­ã‚¹ãƒˆã‚’表示ã§ãã‚‹ + +ãŸã„ã¾ã¤ã‚ˆã‚Šã‚‚明るã„å…‰ã§ç…§ã‚‰ã™ã“ã¨ãŒã§ãる。雪や氷を溶ã‹ã—ãŸã‚Šã€æ°´ä¸­ã§ã‚‚使ãˆã‚‹ + +爆発を起ã“ã™ã®ã«ä½¿ã†ã€‚ç½®ã„ã¦ã‹ã‚‰ç«æ‰“çŸ³ã¨æ‰“ã¡é‡‘を使ã£ãŸã‚Šã€é›»æ°—を通ã™ã“ã¨ã§èµ·çˆ†ã™ã‚‹ + +ãã®ã“ã‚·ãƒãƒ¥ãƒ¼ã‚’入れるã®ã«ä½¿ã†ã€‚ã‚·ãƒãƒ¥ãƒ¼ã‚’食ã¹ã¦ã—ã¾ã£ã¦ã‚‚ã€ãŠã‚ã‚“ã¯æ®‹ã‚‹ + +水や溶岩ã€ãƒŸãƒ«ã‚¯ã‚’貯ã‚ã¦ç§»å‹•ã™ã‚‹ã®ã«ä½¿ã† + +水を入れã¦é‹ã¶ã®ã«ä½¿ã† + +溶岩を入れã¦é‹ã¶ã®ã«ä½¿ã† + +ミルクを入れã¦é‹ã¶ã®ã«ä½¿ã† + +ç«ã‚’èµ·ã“ã—ãŸã‚Šã€TNT を起爆ã—ãŸã‚Šã€å»ºç¯‰æ¸ˆã¿ã®ãƒãƒ¼ã‚¿ãƒ«ã‚’é–‹ãã®ã«ä½¿ã† + +é­šã‚’ç²ã‚‹ã®ã«ä½¿ã† + +å¤ªé™½ã¨æœˆã®ä½ç½®ã‚’表示ã™ã‚‹ + +自分ã®ã‚¹ã‚¿ãƒ¼ãƒˆåœ°ç‚¹ã‚’示㙠+ +æ‰‹ã«æŒã£ã¦ã„ã‚‹ã¨ã€æŽ¢ç´¢æ¸ˆã¿ã®ã‚¨ãƒªã‚¢ã®åœ°å›³ã‚’表示ã™ã‚‹ã€‚é“を確èªã™ã‚‹ã®ã«ä½¿ã† + +矢を射る攻撃ãŒã§ãã‚‹ + +弓ã¨çµ„ã¿åˆã‚ã›ã¦ã€æ­¦å™¨ã¨ã—ã¦ä½¿ã† + +2.5{*ICON_SHANK_01*} 回復ã™ã‚‹ + +1{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚6 回ã¾ã§ä½¿ç”¨ã§ãã‚‹ + +1{*ICON_SHANK_01*} 回復ã™ã‚‹ + +1{*ICON_SHANK_01*} 回復ã™ã‚‹ + +3{*ICON_SHANK_01*} 回復ã™ã‚‹ + +1{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚ã‹ã¾ã©ã§èª¿ç†ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã€‚ç—…æ°—ã«ãªã‚‹å ´åˆã‚‚ã‚ã‚‹ + +3{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚é¶è‚‰ã‚’ã‹ã¾ã©ã§èª¿ç†ã™ã‚‹ã¨ã§ãã‚‹ + +1.5{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚ã‹ã¾ã©ã§èª¿ç†ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ + +4{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚牛肉をã‹ã¾ã©ã§èª¿ç†ã™ã‚‹ã¨ã§ãã‚‹ + +1.5{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚ã‹ã¾ã©ã§èª¿ç†ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ + +4{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚生ã®è±šè‚‰ã‚’ã‹ã¾ã©ã§èª¿ç†ã™ã‚‹ã¨ã§ãã‚‹ + +1{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚ã‹ã¾ã©ã§èª¿ç†ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã€‚ヤマãƒã‚³ã«ä¸Žãˆã¦æ‰‹ãªãšã‘ã‚‹ã“ã¨ã‚‚ã§ãã‚‹ + +2.5{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚生魚をã‹ã¾ã©ã§èª¿ç†ã™ã‚‹ã¨ã§ãã‚‹ + +2{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚金ã®ãƒªãƒ³ã‚´ã®ææ–™ã¨ãªã‚‹ + +2{*ICON_SHANK_01*} 回復ã—ã€ã•ら㫠HP ㌠4 ç§’é–“ã€è‡ªå‹•回復ã™ã‚‹ã€‚リンゴã¨é‡‘ã®å¡Šã‹ã‚‰ä½œã‚‹ + +2{*ICON_SHANK_01*} 回復ã™ã‚‹ãŒã€ç—…æ°—ã«ãªã‚‹å ´åˆã‚‚ã‚ã‚‹ + +ã‚±ãƒ¼ã‚­ã®ææ–™ã® 1 ã¤ã€‚ãƒãƒ¼ã‚·ãƒ§ãƒ³ã®èª¿åˆã¨ã—ã¦ã‚‚使ã†ã“ã¨ãŒã§ãã‚‹ + +オン/オフを切り替ãˆã¦ã€é›»æ°—ã‚’é€ã‚Œã‚‹ã€‚ã‚‚ã†ä¸€åº¦æŠ¼ã™ã¾ã§ã‚ªãƒ³ã¾ãŸã¯ã‚ªãƒ•ã®çŠ¶æ…‹ãŒä¿ãŸã‚Œã‚‹ + +ãƒ–ãƒ­ãƒƒã‚¯ã®æ¨ªã«å–り付ã‘ã¦ã€å¸¸ã«é›»æ°—ã‚’é€ã£ãŸã‚Šã€é€ä¿¡æ©Ÿã€å—信機ã¨ã—ã¦ä½¿ãˆã‚‹ã€‚ +å¼±ã„æ˜Žã‹ã‚Šã¨ã—ã¦ã‚‚使用å¯èƒ½ + +å復装置ã€é…延装置ã€ãƒ€ã‚¤ã‚ªãƒ¼ãƒ‰ã¨ã—ã¦å˜ä½“ã§ã€ã¾ãŸã¯çµ„ã¿åˆã‚ã›ã¦ã€ãƒ¬ãƒƒãƒ‰ã‚¹ãƒˆãƒ¼ãƒ³ã®å›žè·¯ã«ä½¿ã‚れる + +押ã™ã¨é›»æ°—ã‚’é€ã‚Œã‚‹ã€‚ç´„ 1 ç§’é–“èµ·å‹•ã—ãŸå¾Œã€è‡ªå‹•çš„ã«ã‚ªãƒ•ã«ãªã‚‹ + +レッドストーンを電æºã¨ã—ã¦ä½¿ã„ã€ãƒ©ãƒ³ãƒ€ãƒ ãªé †ç•ªã§ã‚¢ã‚¤ãƒ†ãƒ ã‚’æ’ƒã¡å‡ºã™ + +音をå¥ã§ã‚‹ã€‚å©ãã¨éŸ³ç¨‹ã‚’変ãˆã‚‰ã‚Œã‚‹ã€‚種類ã®é•ã†ãƒ–ロックã®ä¸Šã«ç½®ãã“ã¨ã§ã€æ¥½å™¨ã®ç¨®é¡žã‚’変ãˆã‚‹ã“ã¨ãŒã§ãã‚‹ + +トロッコを走らã›ã‚‹ã®ã«ä½¿ã† + +é›»æºãŒå…¥ã£ã¦ã„る時ã€ä¸Šã‚’走るトロッコを加速ã•ã›ã‚‹ã€‚é›»æºãŒå…¥ã£ã¦ã„ãªã„時ã¯ã€ä¸Šã§ãƒˆãƒ­ãƒƒã‚³ãŒæ­¢ã¾ã‚‹ + +トロッコ専用ã®é‡é‡æ„ŸçŸ¥æ¿ã¨ã—ã¦æ©Ÿèƒ½ã™ã‚‹ã€‚é›»æºãŒå…¥ã£ã¦ã„る時ã«ãƒ¬ãƒƒãƒ‰ã‚¹ãƒˆãƒ¼ãƒ³ã®ä¿¡å·ã‚’é€ã‚‹ + +プレイヤーや動物ã€ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ã‚’ä¹—ã›ã¦ã€ãƒ¬ãƒ¼ãƒ«ã®ä¸Šã‚’移動ã§ãã‚‹ + +物をé‹ã‚“ã§ã€ãƒ¬ãƒ¼ãƒ«ä¸Šã‚’移動ã§ãã‚‹ + +レールã®ä¸Šã‚’移動ã™ã‚‹ã€‚石炭を使ã†ã“ã¨ã§ä»–ã®ãƒˆãƒ­ãƒƒã‚³ã‚’押ã™ã“ã¨ãŒã§ãã‚‹ + +æ³³ãã‚ˆã‚Šã‚‚é€Ÿãæ°´ä¸Šã‚’移動ã§ãã‚‹ + +羊ã‹ã‚‰æŽ¡ã‚Œã‚‹ã€‚染料を使ã£ã¦è‰²ã‚’変ãˆã‚‹ã“ã¨ãŒã§ãã‚‹ + +建築用素æã€‚染料ã§è‰²ã‚’変ãˆã‚‹ã“ã¨ãŒã§ãる。ウールã¯ç¾Šã‹ã‚‰ç°¡å˜ã«å…¥æ‰‹ã§ãã‚‹ã®ã§ã€ã“ã®ä½œã‚Šæ–¹ã¯ã‚ã¾ã‚ŠãŠå‹§ã‚ã§ããªã„ + +é»’ã®ã‚¦ãƒ¼ãƒ«ã‚’作るã®ã«ä½¿ã†æŸ“æ–™ + +ç·‘ã®ã‚¦ãƒ¼ãƒ«ã‚’作るã®ã«ä½¿ã†æŸ“æ–™ + +茶色ã®ã‚¦ãƒ¼ãƒ«ã‚’作るã®ã«ä½¿ã†æŸ“æ–™ã€‚ã‚¯ãƒƒã‚­ãƒ¼ã®ææ–™ã‚„ã‚«ã‚«ã‚ªãƒãƒƒãƒ‰ã‚’育ã¦ã‚‹ã®ãŸã‚ã«ä½¿ã†ã“ã¨ã‚‚ã§ãã‚‹ + +銀ã®ã‚¦ãƒ¼ãƒ«ã‚’作るã®ã«ä½¿ã†æŸ“æ–™ + +黄色ã®ã‚¦ãƒ¼ãƒ«ã‚’作るã®ã«ä½¿ã†æŸ“æ–™ + +赤ã®ã‚¦ãƒ¼ãƒ«ã‚’作るã®ã«ä½¿ã†æŸ“æ–™ + +å³åº§ã«ä½œç‰©ã‚„木ã€èƒŒã®é«˜ã„è‰ã€å·¨å¤§ãªãã®ã“ã€èбãªã©ã‚’育ã¦ã‚‹ã®ã«ä½¿ã†ã€‚æŸ“æ–™ã®ææ–™ã«ã‚‚ãªã‚‹ + +ピンクã®ã‚¦ãƒ¼ãƒ«ã‚’作るã®ã«ä½¿ã†æŸ“æ–™ + +オレンジã®ã‚¦ãƒ¼ãƒ«ã‚’作るã®ã«ä½¿ã†æŸ“æ–™ + +黄緑ã®ã‚¦ãƒ¼ãƒ«ã‚’作るã®ã«ä½¿ã†æŸ“æ–™ + +ç°è‰²ã®ã‚¦ãƒ¼ãƒ«ã‚’作るã®ã«ä½¿ã†æŸ“æ–™ + +è–„ç°è‰²ã®ã‚¦ãƒ¼ãƒ«ã‚’作るã®ã«ä½¿ã†æŸ“æ–™ +(注æ„: è–„ç°è‰²ã®æŸ“æ–™ã¯ç°è‰²ã®æŸ“æ–™ã¨éª¨ç²‰ã‚’æ··ãœã¦ä½œã‚‹ã“ã¨ã‚‚ã§ãる。ã“ã®æ–¹æ³•ã ã¨ 3 ã¤ã§ã¯ãªã 1 ã¤ã®å¢¨è¢‹ã‹ã‚‰ 4 ã¤ã®è–„ç°è‰²ã®æŸ“料を作るã“ã¨ãŒã§ãã‚‹) + +空色ã®ã‚¦ãƒ¼ãƒ«ã‚’作るã®ã«ä½¿ã†æŸ“æ–™ + +水色ã®ã‚¦ãƒ¼ãƒ«ã‚’作るã®ã«ä½¿ã†æŸ“æ–™ + +ç´«ã®ã‚¦ãƒ¼ãƒ«ã‚’作るã®ã«ä½¿ã†æŸ“æ–™ + +赤紫ã®ã‚¦ãƒ¼ãƒ«ã‚’作るã®ã«ä½¿ã†æŸ“æ–™ + +é’ã®ã‚¦ãƒ¼ãƒ«ã‚’作るã®ã«ä½¿ã†æŸ“æ–™ + +音楽ディスクをèžã‘ã‚‹ + +強力ãªé“å…·ã€æ­¦å™¨ã‚„防具を作るã“ã¨ãŒã§ãã‚‹ + +ãŸã„ã¾ã¤ã‚ˆã‚Šã‚‚明るã„å…‰ã§ç…§ã‚‰ã™ã“ã¨ãŒã§ãる。雪や氷を溶ã‹ã—ãŸã‚Šã€æ°´ä¸­ã§ã‚‚使ãˆã‚‹ + +本や地図を作るã®ã«ä½¿ã† + +本棚を作るã®ã«ä½¿ã£ãŸã‚Šã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã—ã¦ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã—ãŸæœ¬ã‚’作るãŸã‚ã«ä½¿ã† + +エンãƒãƒ£ãƒ³ãƒˆãƒ†ãƒ¼ãƒ–ルã®å‘¨å›²ã«ç½®ã„ã¦ã€ã‚ˆã‚Šå¼·åŠ›ãªã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã‚’作る + +飾り付ã‘ã¨ã—ã¦ä½¿ã† + +鉄ã®ãƒ„ルãƒã‚·ä»¥ä¸Šã§æŽ˜ã‚Œã‚‹ã€‚ã‹ã¾ã©ã«å…¥ã‚Œã¦ç²¾éŒ¬ã™ã‚‹ã¨ã€é‡‘ã®å»¶ã¹æ£’ã«ãªã‚‹ + +石ã®ãƒ„ルãƒã‚·ä»¥ä¸Šã§æŽ˜ã‚Œã‚‹ã€‚ã‹ã¾ã©ã«å…¥ã‚Œã¦ç²¾éŒ¬ã™ã‚‹ã¨ã€é‰„ã®å»¶ã¹æ£’ã«ãªã‚‹ + +ツルãƒã‚·ã§æŽ˜ã‚Œã‚‹ã€‚çŸ³ç‚­ãŒæŽ¡ã‚Œã‚‹ + +石ã®ãƒ„ルãƒã‚·ä»¥ä¸Šã§æŽ˜ã‚Œã‚‹ã€‚ãƒ©ãƒ”ã‚¹ãƒ©ã‚ºãƒªãŒæŽ¡ã‚Œã‚‹ + +鉄ã®ãƒ„ルãƒã‚·ä»¥ä¸Šã§æŽ˜ã‚Œã‚‹ã€‚ãƒ€ã‚¤ãƒ¤ãƒ¢ãƒ³ãƒ‰ãŒæŽ¡ã‚Œã‚‹ + +鉄ã®ãƒ„ルãƒã‚·ä»¥ä¸Šã§æŽ˜ã‚Œã‚‹ã€‚レッドストーンã®ç²‰ãŒæŽ¡ã‚Œã‚‹ + +ツルãƒã‚·ã§æŽ˜ã‚Œã‚‹ã€‚ä¸¸çŸ³ãŒæŽ¡ã‚Œã‚‹ + +シャベルを使ã£ã¦é›†ã‚る。建築用ã«ä½¿ã‚れる + +æ¤ãˆã‚‹ã¨ã€æœ€çµ‚çš„ã«æœ¨ã«æˆé•·ã™ã‚‹ + +破壊ã™ã‚‹ã“ã¨ãŒã§ããªã„ + +様々ãªç‰©ã«ç«ã‚’ã¤ã‘ã‚‹ã“ã¨ãŒã§ãる。ãƒã‚±ãƒ„を使ã£ã¦é›†ã‚ã‚‹ + +シャベルを使ã£ã¦é›†ã‚る。ã‹ã¾ã©ã«å…¥ã‚Œã¦ç²¾éŒ¬ã™ã‚‹ã¨ã‚¬ãƒ©ã‚¹ã«ãªã‚‹ã€‚下ã«ä½•ã‚‚ãªã„ã¨é‡åŠ›ã«å¼•ã‹ã‚Œã‚‹ + +シャベルを使ã£ã¦é›†ã‚る。掘ã£ã¦ã„ã‚‹ã¨ã€æ™‚ã€…ç«æ‰“ã¡çŸ³ãŒå‡ºã¦ãる。下ã«ä½•ã‚‚ãªã„ã¨é‡åŠ›ã«å¼•ã‹ã‚Œã‚‹ + +斧を使ã£ã¦åˆ‡ã‚‹ã€‚æœ¨ã®æ¿ã®ææ–™ã«ãªã£ãŸã‚Šã€ç‡ƒæ–™ã¨ã—ã¦ã‚‚使ã‚れる + +ã‹ã¾ã©ã§ç ‚を精錬ã™ã‚‹ã¨ã§ãる。建築用素æã¨ã—ã¦ä½¿ãˆã‚‹ãŒã€æŽ˜ã‚‹ã¨å£Šã‚Œã‚‹ + +ツルãƒã‚·ã‚’使ã£ã¦çŸ³ã‹ã‚‰æŽ˜ã‚Šå‡ºã™ã€‚ã‹ã¾ã©ã‚„石ã®é“具を作るã®ã«ä½¿ã† + +ã‹ã¾ã©ã§ç²˜åœŸã‚’焼ã„ã¦ä½œã‚‹ + +ã‹ã¾ã©ã§ç„¼ãã¨ãƒ¬ãƒ³ã‚¬ã«ãªã‚‹ + +破壊ã•れるã¨ç²˜åœŸã®å¡Šã‚’è½ã¨ã—ã¾ã™ã€‚粘土ã¯ã‹ã¾ã©ã§ç„¼ãã¨ãƒ¬ãƒ³ã‚¬ã«ãªã‚Šã¾ã™ + +雪玉をä¿ç®¡ã™ã‚‹ã®ã«ä½¿ãˆã‚‹ + +ã‚·ãƒ£ãƒ™ãƒ«ã§æŽ˜ã‚Šå‡ºã—ã¦é›ªçŽ‰ã‚’ä½œã‚‹ + +壊ã™ã¨æ™‚々ã€å°éº¦ã®ç¨®ãŒå‡ºã¦ãã‚‹ + +æŸ“æ–™ã®ææ–™ã«ãªã‚‹ + +ãŠã‚ã‚“ã«å…¥ã‚Œã¦ã‚·ãƒãƒ¥ãƒ¼ã‚’作れる + +ダイヤモンドã®ãƒ„ルãƒã‚·ã®ã¿ã§æŽ˜ã‚Œã‚‹ã€‚æ°´ã¨æº¶å²©ãŒæ··ã–ã‚‹ã“ã¨ã§ç”Ÿã¾ã‚Œã‚‹ã€‚ãƒãƒ¼ã‚¿ãƒ«ã®ææ–™ã«ãªã‚‹ + +モンスターを出ç¾ã•ã›ã‚‹ + +地é¢ã«ç½®ã„ã¦ã€é›»æ°—ã‚’ä¼ãˆã‚‰ã‚Œã‚‹ã€‚ãƒãƒ¼ã‚·ãƒ§ãƒ³ã¨èª¿åˆã™ã‚‹ã¨åŠ¹æžœã®æŒç¶šæ™‚é–“ãŒå»¶é•·ã•れる + +å分ã«è‚²ã¤ã¨ä½œç‰©ãŒå®Ÿã‚Šã€å°éº¦ã‚’åŽç©«ã§ãã‚‹ + +耕ã•れãŸåœ°é¢ã€‚種をæ¤ãˆã‚‰ã‚Œã‚‹ + +ã‹ã¾ã©ã§èª¿ç†ã™ã‚‹ã“ã¨ã§ã€ç·‘è‰²ã®æŸ“æ–™ã«ãªã‚‹ + +砂糖を作るãŸã‚ã®ææ–™ã«ãªã‚‹ + +ヘルメットã¨ã—ã¦ã‹ã¶ã£ãŸã‚Šã€ãŸã„ã¾ã¤ã¨çµ„ã¿åˆã‚ã›ã¦ã‚«ãƒœãƒãƒ£ ランタンã«ã§ãる。パンプキンパイã®ä¸»ãªææ–™ã§ã‚‚ã‚ã‚‹ + +ã„ã£ãŸã‚“ç«ãŒã¤ãã¨ã€ç‡ƒãˆç¶šã‘ã‚‹ + +上を歩ãã‚‚ã®ã®ã‚¹ãƒ”ードをé…ãã™ã‚‹ + +ãƒãƒ¼ã‚¿ãƒ«ã‚’通éŽã™ã‚‹ã¨ã€åœ°ä¸Šç•Œã¨æš—é»’ç•Œã‚’è¡Œãæ¥ã§ãã‚‹ + +ã‹ã¾ã©ã®ç‡ƒæ–™ã¨ã—ã¦ä½¿ç”¨ã™ã‚‹ã€‚ãŸã„ã¾ã¤ã®ææ–™ã«ã‚‚ãªã‚‹ + +クモを倒ã™ã¨æ‰‹ã«å…¥ã‚‹ã€‚å¼“ã‚„é‡£ã‚Šç«¿ã®ææ–™ã«ãªã£ãŸã‚Šã€åœ°é¢ã«ç½®ã„ã¦ãƒˆãƒªãƒƒãƒ—ワイヤーを作る + +ニワトリを倒ã™ã¨æ‰‹ã«å…¥ã‚‹ã€‚çŸ¢ã®ææ–™ã«ãªã‚‹ + +Creeper を倒ã™ã¨æ‰‹ã«å…¥ã‚‹ã€‚TNT ç«è–¬ã®ææ–™ã«ãªã‚‹ã€‚ãƒãƒ¼ã‚·ãƒ§ãƒ³ã‚’調åˆã™ã‚‹ææ–™ã¨ã—ã¦ä½¿ã† + +農地ã«ã¾ãã¨ä½œç‰©ãŒã§ãる。日光ãŒå分ã«å½“ãŸã‚‹ã‚ˆã†ã«ã—よã†! + +作物ã‹ã‚‰åŽç©«ã§ãる。食ã¹ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã‚’作るã®ã«ä½¿ã‚れる + +ç ‚åˆ©ã‚’æŽ˜ã‚‹ã¨æ‰‹ã«å…¥ã‚‹ã€‚ç«æ‰“ã¡çŸ³ã¨æ‰“ã¡é‡‘ã®ææ–™ã«ãªã‚‹ + +豚ã«å‘ã‹ã£ã¦ä½¿ã†ã¨ã€ãã®è±šã«ä¹—れるよã†ã«ãªã‚‹ã€‚è±šã¯æ£’付ãã®ãƒ‹ãƒ³ã‚¸ãƒ³ã‚’使ã£ã¦æ“縦ã§ãã‚‹ + +é›ªã‚’æŽ˜ã‚‹ã¨æ‰‹ã«å…¥ã‚‹ã€‚投ã’ã‚‹ã“ã¨ãŒã§ãã‚‹ + +牛を倒ã™ã¨æ‰‹ã«å…¥ã‚‹ã€‚é˜²å…·ã®ææ–™ã¨ãªã‚‹ã€‚本を作るã“ã¨ãŒã§ãã‚‹ + +スライムを倒ã™ã¨æ‰‹ã«å…¥ã‚‹ã€‚ãƒãƒ¼ã‚·ãƒ§ãƒ³ã‚’調åˆã™ã‚‹ææ–™ã¨ã—ã¦ä½¿ã†ã€‚å¸ç€ãƒ”ã‚¹ãƒˆãƒ³ã®ææ–™ã«ã‚‚ãªã‚‹ + +ニワトリãŒãƒ©ãƒ³ãƒ€ãƒ ã§è½ã¨ã™ã€‚食ã¹ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã®ææ–™ã«ãªã‚‹ + +å…‰çŸ³ã‚’æŽ˜ã‚‹ã¨æ‰‹ã«å…¥ã‚‹ã€‚光石ã®ãƒ–ãƒ­ãƒƒã‚¯ã«æˆ»ã™ã“ã¨ãŒã§ãる。ãƒãƒ¼ã‚·ãƒ§ãƒ³ã¨èª¿åˆã™ã‚‹ã¨åŠ¹æžœãŒä¸ŠãŒã‚‹ + +ガイコツを倒ã™ã¨æ‰‹ã«å…¥ã‚‹ã€‚éª¨ç²‰ã®ææ–™ã¨ãªã‚‹ã€‚オオカミã«ä½¿ã†ã¨æ‰‹æ‡ã‘ã‚‹ã“ã¨ãŒã§ãã‚‹ + +ガイコツ㫠Creeper を倒ã•ã›ã‚‹ã¨æ‰‹ã«å…¥ã‚‹ã€‚ジュークボックスã§å†ç”Ÿã§ãã‚‹ + +ç«ã‚’消ã—ã€ä½œç‰©ã®æˆé•·ã‚’促進ã™ã‚‹ã€‚ãƒã‚±ãƒ„ã§é›†ã‚ã‚‹ã“ã¨ãŒã§ãã‚‹ + +壊ã™ã¨æ™‚々ã€è‹—木をè½ã¨ã™ã€‚è‹—æœ¨ã¯æ¤ãˆã‚‹ã¨æœ¨ã¸ã¨æˆé•·ã™ã‚‹ + +ダンジョンã«ã‚る。建設ã€é£¾ã‚Šä»˜ã‘ã«ä½¿ã† + +羊ã‹ã‚‰ã‚¦ãƒ¼ãƒ«ã‚’刈りå–ã£ãŸã‚Šã€è‘‰ã£ã±ã®ãƒ–ロックをåŽç©«ã™ã‚‹ã®ã«ä½¿ã† + +(ボタンã€ãƒ¬ãƒãƒ¼ã€é‡é‡æ„ŸçŸ¥æ¿ã€ãƒ¬ãƒƒãƒ‰ã‚¹ãƒˆãƒ¼ãƒ³ã®ãŸã„ã¾ã¤ãªã©ã§) 電気ãŒé€ã‚‰ã‚Œã‚‹ã¨ã€ãƒ”ストンãŒä¼¸ã³ã¦ãƒ–ロックを押ã™ã“ã¨ãŒã§ãã‚‹ + +(ボタンã€ãƒ¬ãƒãƒ¼ã€é‡é‡æ„ŸçŸ¥æ¿ã€ãƒ¬ãƒƒãƒ‰ã‚¹ãƒˆãƒ¼ãƒ³ã®ãŸã„ã¾ã¤ãªã©ã§) 電気ãŒé€ã‚‰ã‚Œã‚‹ã¨ã€ãƒ”ストンãŒä¼¸ã³ã¦ãƒ–ロックを押ã™ã“ã¨ãŒã§ãる。ã¾ãŸã€ãƒ”ã‚¹ãƒˆãƒ³ãŒæˆ»ã‚‹ã¨ãã«ã€ãã®æ™‚ã«è§¦ã‚Œã¦ã„ã‚‹ãƒ–ãƒ­ãƒƒã‚¯ã‚’å¼•ãæˆ»ã™ + +石ブロックã‹ã‚‰ä½œã‚‹ã€‚è¦å¡žã§è¦‹ã‹ã‘ã‚‹ã“ã¨ãŒå¤šã„ + +柵ã¨åŒã˜ãã€éšœå®³ç‰©ã¨ã—ã¦ä½¿ã† + +ドアã¨ä¼¼ã¦ã„ã‚‹ãŒã€ä¸»ã«æŸµã¨çµ„ã¿åˆã‚ã›ã¦ä½¿ã† + +切ã£ãŸã‚¹ã‚¤ã‚«ã‹ã‚‰ä½œã‚Œã‚‹ + +逿˜Žãªãƒ–ロックã§ã€ã‚¬ãƒ©ã‚¹ãƒ–ロックã®ä»£ã‚りã«ä½¿ãˆã‚‹ + +æ¤ãˆã‚‹ã¨ã‚«ãƒœãƒãƒ£ãŒç”Ÿãˆã‚‹ + +æ¤ãˆã‚‹ã¨ã‚¹ã‚¤ã‚«ãŒç”Ÿãˆã‚‹ + +Enderman ãŒå€’ã•れãŸã¨ãã«è½ã¨ã™ã€‚投ã’ã‚‹ã¨ã€è½ã¡ãŸå ´æ‰€ã«ä½¿ç”¨è€…ãŒãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•れã€HP ãŒå°‘ã—æ¸›ã‚‹ + +上é¢ã«è‰ãŒç”ŸãˆãŸåœŸãƒ–ロック。シャベルを使ã£ã¦é›†ã‚る。建築用ã«ä½¿ã‚れる + +建設ã¨é£¾ã‚Šä»˜ã‘ã«ä½¿ã† + +上を歩ãã¨ç§»å‹•ãŒé…ããªã‚‹ã€‚ãƒã‚µãƒŸã§ç ´å£Šã§ãã€ã²ã‚‚ãŒæŽ¡ã‚Œã‚‹ + +破壊ã•れる㨠Silverfish を出ç¾ã•ã›ã‚‹ã€‚è¿‘ãã§åˆ¥ã® Silverfish ãŒæ”»æ’ƒã‚’å—ã‘ãŸã¨ãã«ã‚‚ã€Silverfish を出ç¾ã•ã›ã‚‹å ´åˆãŒã‚ã‚‹ + +ç½®ãã¨å¾ã€…ã«èŒ‚る。ãƒã‚µãƒŸã‚’使ã£ã¦é›†ã‚る。ã¯ã—ã”ã®ã‚ˆã†ã«ç™»ã‚‹ã“ã¨ãŒã§ãã‚‹ + +上é¢ã‚’æ­©ãã¨æ»‘る。上ã«è¼‰ã£ãŸãƒ–ロックãŒå£Šã‚Œã‚‹ã¨æ°´ã«ãªã‚‹ã€‚å…‰æºã«ã‚ã¾ã‚Šè¿‘ã¥ã‘ãŸã‚Šæš—黒界ã«ç½®ãã¨æº¶ã‘ã‚‹ + +飾り付ã‘ã¨ã—ã¦ä½¿ã† + +ãƒãƒ¼ã‚·ãƒ§ãƒ³ã®èª¿åˆã‚„è¦å¡žã‚’探ã™ã®ã«ä½¿ã†ã€‚æš—é»’ç ¦ã®å‘¨å›²ã«ã„ã‚‹ Blaze ãŒè½ã¨ã™ + +ãƒãƒ¼ã‚·ãƒ§ãƒ³ã®èª¿åˆã«ä½¿ã†ã€‚Ghast ãŒå€’ã•れãŸã¨ãã«è½ã¨ã™ + +ゾンビ Pigman ãŒå€’ã•れãŸã¨ãã«è½ã¨ã™ã€‚ゾンビ Pigman ã¯æš—黒界ã«ã„る。ãƒãƒ¼ã‚·ãƒ§ãƒ³ã‚’調åˆã™ã‚‹ææ–™ã¨ã—ã¦ä½¿ã† + +ãƒãƒ¼ã‚·ãƒ§ãƒ³ã®èª¿åˆã«ä½¿ã†ã€‚æš—é»’ç ¦ã«ç”Ÿãˆã¦ã„る。ã¾ãŸã€ã‚½ã‚¦ãƒ«ã‚µãƒ³ãƒ‰ã§ã‚‚育㤠+ +何ã«ä½¿ã†ã‹ã«ã‚ˆã‚Šã€æ§˜ã€…ãªåŠ¹æžœãŒç¾ã‚Œã‚‹ + +水を入れるビン。調åˆå°ã§ãƒãƒ¼ã‚·ãƒ§ãƒ³ã‚’ä½œã‚‹æ™‚ã€æœ€åˆã«å¿…è¦ã«ãªã‚‹ + +食ã¹ç‰©ã‚„è–¬ã®ææ–™ã¨ãªã‚‹æœ‰æ¯’ã®ã‚¢ã‚¤ãƒ†ãƒ ã€‚クモや洞窟グモãŒå€’ã•れãŸã¨ãã«è½ã¨ã™ + +主ã«ãƒžã‚¤ãƒŠã‚¹åŠ¹æžœã®ãƒãƒ¼ã‚·ãƒ§ãƒ³ã‚’調åˆã™ã‚‹ã®ã«ä½¿ã† + +ãƒãƒ¼ã‚·ãƒ§ãƒ³ã®èª¿åˆã‚„ã€ä»–ã®ã‚¢ã‚¤ãƒ†ãƒ ã¨åˆã‚ã›ã¦ã‚¨ãƒ³ãƒ€ãƒ¼ã‚¢ã‚¤ã¾ãŸã¯ãƒžã‚°ãƒžã‚¯ãƒªãƒ¼ãƒ ã‚’作るã®ã«ä½¿ã† + +ãƒãƒ¼ã‚·ãƒ§ãƒ³ã®èª¿åˆã«ä½¿ã† + +ãƒãƒ¼ã‚·ãƒ§ãƒ³ã‚„スプラッシュãƒãƒ¼ã‚·ãƒ§ãƒ³ã®èª¿åˆã«ä½¿ã† + +雨ã¾ãŸã¯æ°´ãƒã‚±ãƒ„を使ã£ã¦æ°´ã‚’入れãŸå¾Œã€æ°´ã‚’ガラスビンã«è©°ã‚ã‚‹ã“ã¨ãŒã§ãã‚‹ + +投ã’ã‚‹ã¨æžœã¦ã®ãƒãƒ¼ã‚¿ãƒ«ãŒã‚る方角を示ã™ã€‚æžœã¦ã®ãƒãƒ¼ã‚¿ãƒ«ã®æž å†…ã« 12 個置ãã¨ã€æžœã¦ã®ãƒãƒ¼ã‚¿ãƒ«ãŒèµ·å‹•ã™ã‚‹ + +ãƒãƒ¼ã‚·ãƒ§ãƒ³ã®èª¿åˆã«ä½¿ã† + +è‰ãƒ–ロックã«ä¼¼ã¦ã„ã‚‹ãŒã€ãã®ã“æ ½åŸ¹ã«æœ€é© + +æ°´ã«æµ®ãæ¤ç‰©ã€‚上を歩ãã“ã¨ãŒã§ãã‚‹ + +暗黒砦を建ã¦ã‚‹ã®ã«ä½¿ã†ã€‚Ghast ã®ç«ã®çމãŒåйã‹ãªã„ + +æš—é»’ç ¦ã§ä½¿ã† + +æš—é»’ç ¦ã§æ‰‹ã«å…¥ã‚‹ã€‚壊ã™ã¨æš—黒茸をè½ã¨ã™ + +プレイヤーã®çµŒé¨“値を消費ã—ã¦å‰£ã‚„ツルãƒã‚·ã€æ–§ã€ã‚·ãƒ£ãƒ™ãƒ«ã€å¼“ã€é˜²å…·ã«ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã‚’行ã„ã¾ã™ + +エンダーアイを 12 個使ã£ã¦èµ·å‹•ã™ã‚‹ã¨ã€æžœã¦ã®ä¸–界ã¸è¡ŒããŸã‚ã®ãƒãƒ¼ã‚¿ãƒ«ãŒã§ãã‚‹ + +æžœã¦ã®ãƒãƒ¼ã‚¿ãƒ«ã‚’作るã®ã«ä½¿ã† + +æžœã¦ã®ä¸–界ã«å­˜åœ¨ã™ã‚‹ãƒ–ロックã®ä¸€ç¨®ã€‚爆発ã«å¯¾ã™ã‚‹è€æ€§ãŒé«˜ã„ã®ã§å»ºæã¨ã—ã¦ä¾¿åˆ© + +æžœã¦ã®ä¸–界ã§ã‚¨ãƒ³ãƒ€ãƒ¼ ドラゴンを倒ã™ã¨å‡ºç¾ã™ã‚‹ãƒ–ロック + +投ã’ã‚‹ã¨çµŒé¨“値オーブをè½ã¨ã™ã€‚経験値オーブを貯ã‚ã‚‹ã¨çµŒé¨“値ãŒä¸ŠãŒã‚‹ + +ç«ã‚’ã¤ã‘ã‚‹ã®ã«ä¾¿åˆ©ã§ã™ã€‚発射装置を使ã£ã¦ç„¡å·®åˆ¥ã«æ”¾ç«ã™ã‚‹ã“ã¨ãŒã§ãã‚‹ + +表示枠ã«ä¼¼ã¦ã„ã¦ã€ã“ã“ã«ã¯è¨­ç½®ã•れãŸã‚¢ã‚¤ãƒ†ãƒ ã¾ãŸã¯ãƒ–ロックãŒè¡¨ç¤ºã•れる + +投ã’ã‚‹ã¨ç‰¹å®šã®ç¨®é¡žã®ç”Ÿã物ãŒå‡ºç¾ã—ã¾ã™ + +é•·ã„階段を作るã®ã«ä½¿ã†ã€‚ãれãžã‚Œã®ä¸Šéƒ¨ã« 2 ã¤ã®åŽšæ¿ã‚’ç½®ãã“ã¨ã§ã€é€šå¸¸ã‚µã‚¤ã‚ºã® 2 å€ã®åŽšæ¿ãƒ–ロックを作るã“ã¨ãŒã§ãã‚‹ + +é•·ã„階段を作るã®ã«ä½¿ã†ã€‚ãれãžã‚Œã®ä¸Šéƒ¨ã« 2 ã¤ã®åŽšæ¿ã‚’ç½®ãã“ã¨ã§ã€é€šå¸¸ã‚µã‚¤ã‚ºã® 2 å€ã®åŽšæ¿ãƒ–ロックを作るã“ã¨ãŒã§ãã‚‹ + +ã‹ã¾ã©ã§æš—黒石を精錬ã™ã‚‹ã¨å‡ºæ¥ä¸ŠãŒã‚‹ã€‚暗黒レンガ ãƒ–ãƒ­ãƒƒã‚¯ã®ææ–™ã¨ãªã‚‹ + +動力をå—ã‘ã‚‹ã¨ç‚¹ç¯ã™ã‚‹ + +栽培ã—ã¦ã€ã‚«ã‚«ã‚ªè±†ã‚’åŽç©«ã§ãã‚‹ + +ヘッド類ã¯é£¾ã‚Šä»˜ã‘ã¨ã—ã¦ä¸¦ã¹ãŸã‚Šã€ãƒ˜ãƒ«ãƒ¡ãƒƒãƒˆã®ã‚¹ãƒ­ãƒƒãƒˆã‹ã‚‰ãƒžã‚¹ã‚¯ã¨ã—ã¦ç€ç”¨ã‚‚ã§ãã‚‹ + +イカ + +倒ã™ã¨å¢¨è¢‹ã‚’è½ã¨ã™ + +牛 + +倒ã™ã¨é©ã‚’è½ã¨ã™ã€‚ãƒã‚±ãƒ„ãŒã‚れã°ãƒŸãƒ«ã‚¯ã‚‚å–れる + +羊 + +毛を刈るã¨ãウールをè½ã¨ã™ (æ¯›ãŒæ®‹ã£ã¦ã„ã‚‹å ´åˆ)。ウールã¯ã„ã‚ã„ã‚ãªè‰²ã«æŸ“ã‚られる + +ニワトリ + +倒ã™ã¨ç¾½æ ¹ã‚’è½ã¨ã™ã€‚タマゴをæŒã£ã¦ã„ã‚‹å ´åˆã‚‚ã‚ã‚‹ + +豚 + +倒ã™ã¨è±šè‚‰ã‚’è½ã¨ã™ã€‚éžãŒã‚れã°ä¹—ã‚‹ã“ã¨ã‚‚ã§ãã‚‹ + +オオカミ + +普段ã¯ãŠã¨ãªã—ã„ãŒã€æ”»æ’ƒã™ã‚‹ã¨åæ’ƒã—ã¦ãる。骨を使ã†ã¨æ‰‹ãªãšã‘ã‚‹ã“ã¨ãŒã§ãã€ãƒ—レイヤーã«ã¤ã„ã¦å›žã£ã¦ã€ãƒ—レイヤーを攻撃ã—ã¦ãる敵を攻撃ã—ã¦ãれる + +Creeper + +è¿‘ã¥ãã™ãŽã‚‹ã¨çˆ†ç™ºã™ã‚‹! + +ガイコツ + +矢を放ã£ã¦ãる。倒ã™ã¨çŸ¢ã‚’è½ã¨ã™ + +クモ + +è¿‘ã¥ãã¨æ”»æ’ƒã—ã¦ãる。å£ã‚’登るã“ã¨ãŒã§ãる。倒ã™ã¨ç³¸ã‚’è½ã¨ã™ + +ゾンビ + +è¿‘ã¥ãã¨æ”»æ’ƒã—ã¦ãã‚‹ + +ゾンビ Pigman + +最åˆã¯ãŠã¨ãªã—ã„ãŒã€1 匹を攻撃ã™ã‚‹ã¨é›†å›£ã§åæ’ƒã—ã¦ãã‚‹ + +Ghast + +当ãŸã‚‹ã¨çˆ†ç™ºã™ã‚‹ç«ã®çŽ‰ã‚’æ”¾ã£ã¦ãã‚‹ + +スライム + +ダメージを与ãˆã‚‹ã¨ã€å°ã•ãªã‚¹ãƒ©ã‚¤ãƒ ã«åˆ†è£‚ã™ã‚‹ + +Enderman + +照準をå‘ã‘ã‚‹ã¨æ”»æ’ƒã—ã¦ãる。ブロックを移動ã§ãã‚‹ + +Silverfish + +攻撃ã™ã‚‹ã¨ã€è¿‘ãã«éš ã‚Œã¦ã„ã‚‹ Silverfish も集ã¾ã£ã¦ãる。石ブロックã®ä¸­ã«éš ã‚Œã¦ã„ã‚‹ + +洞窟グモ + +ç‰™ã«æ¯’ãŒã‚ã‚‹ + +Mooshroom + +空ã®ãŠã‚んを使ã†ã¨ãã®ã“ã‚·ãƒãƒ¥ãƒ¼ãŒæŽ¡ã‚Œã‚‹ã€‚ãƒã‚µãƒŸã§æ¯›åˆˆã‚Šã‚’ã™ã‚‹ã¨ãã®ã“ã‚’è½ã¨ã™ãŒã€æ™®é€šã®ç‰›ã«ãªã£ã¦ã—ã¾ã† + +スノー ゴーレム + +雪ブロックã¨ã‚«ãƒœãƒãƒ£ã§ä½œã‚Œã‚‹ã‚´ãƒ¼ãƒ¬ãƒ ã€‚作ã£ãŸäººã®æ•µã«å‘ã‹ã£ã¦é›ªçŽ‰ã‚’æŠ•ã’ã¤ã‘ã‚‹ + +エンダー ドラゴン + +æžœã¦ã®ä¸–界ã«å­˜åœ¨ã™ã‚‹å¤§ããªé»’竜 + +Blaze + +暗黒界ã«å‡ºç¾ã™ã‚‹æ•µã€‚ä¸»ã«æš—黒砦内ã«ã„る。倒ã™ã¨ Blaze ロッドをè½ã¨ã™ + +マグマ キューブ + +暗黒界ã«å‡ºç¾ã™ã‚‹ã€‚Slime åŒæ§˜ã€å€’ã™ã¨å°ã•㪠Lava Slime ã«åˆ†è£‚ã™ã‚‹ + +æ‘人 + +ヤマãƒã‚³ + +ジャングルã«ç”Ÿæ¯ã€‚生魚を与ãˆã¦é£¼ã„慣らã›ã‚‹ã€‚䏿„ãªå‹•ãã«é©šã„ã¦ã™ãã«é€ƒã’ã‚‹ãŸã‚ã€æŽ¥è¿‘ã™ã‚‹ã®ã¯ç°¡å˜ã§ã¯ãªã„ + +アイアン ゴーレム + +æ‘ã«å‡ºç¾ã—ã¦æ‘人を守ã£ã¦ãれる。鉄ã®ãƒ–ロックã¨ã‚«ãƒœãƒãƒ£ã§ä½œã‚‹ã“ã¨ã‚‚ã§ãã‚‹ + +Explosives Animator + +Concept Artist + +Number Crunching and Statistics + +Bully Coordinator + +Original Design and Code by + +Project Manager/Producer + +Rest of Mojang Office + +Lead game programmer Minecraft PC + +Ninja Coder + +CEO + +White Collar Worker + +Customer Support + +Office DJ + +Designer/Programmer Minecraft - Pocket Edition + +Developer + +Chief Architect + +Art Developer + +Game Crafter + +Director of Fun + +Music and Sounds + +Programming + +Art + +QA + +Executive Producer + +Lead Producer + +Producer + +Test Lead + +Lead Tester + +Design Team + +Development Team + +Release Management + +Director, XBLA Publishing + +Business Development + +Portfolio Director + +Product Manager + +Marketing + + Community Manager + +Europe Localization Team + +Redmond Localization Team + +Asia Localization Team + +User Research Team + +MGS Central Teams + +Milestone Acceptance Tester + +Special Thanks + +Test Manager + +Senior Test Lead + +SDET + +Project STE + +Additional STE + +Test Associates + +Jon Kagstrom + +Tobias Mollstam + +Rise Lugo + +木ã®å‰£ + +石ã®å‰£ + +鉄ã®å‰£ + +ダイヤモンドã®å‰£ + +金ã®å‰£ + +木ã®ã‚·ãƒ£ãƒ™ãƒ« + +石ã®ã‚·ãƒ£ãƒ™ãƒ« + +鉄ã®ã‚·ãƒ£ãƒ™ãƒ« + +ダイヤモンドã®ã‚·ãƒ£ãƒ™ãƒ« + +金ã®ã‚·ãƒ£ãƒ™ãƒ« + +木ã®ãƒ„ルãƒã‚· + +石ã®ãƒ„ルãƒã‚· + +鉄ã®ãƒ„ルãƒã‚· + +ダイヤモンドã®ãƒ„ルãƒã‚· + +金ã®ãƒ„ルãƒã‚· + +æœ¨ã®æ–§ + +çŸ³ã®æ–§ + +é‰„ã®æ–§ + +ãƒ€ã‚¤ãƒ¤ãƒ¢ãƒ³ãƒ‰ã®æ–§ + +é‡‘ã®æ–§ + +木ã®ãã‚ + +石ã®ãã‚ + +鉄ã®ãã‚ + +ダイヤモンドã®ãã‚ + +金ã®ãã‚ + +木ã®ãƒ‰ã‚¢ + +鉄ã®ãƒ‰ã‚¢ + +ãƒã‚§ãƒ¼ãƒ³ãƒ˜ãƒ«ãƒ¡ãƒƒãƒˆ + +ãƒã‚§ãƒ¼ãƒ³ãƒã‚§ã‚¹ãƒˆãƒ—レート + +ãƒã‚§ãƒ¼ãƒ³ãƒ¬ã‚®ãƒ³ã‚¹ + +ãƒã‚§ãƒ¼ãƒ³ãƒ–ーツ + +é©ã®å¸½å­ + +鉄ã®å…œ + +ダイヤモンドã®å…œ + +金ã®å…œ + +é©ã®æœ + +鉄ã®èƒ¸å½“㦠+ +ダイヤモンドã®èƒ¸å½“㦠+ +金ã®èƒ¸å½“㦠+ +é©ã®ãƒ‘ンツ + +鉄ã®è„šç”² + +ダイヤモンドã®è„šç”² + +金ã®è„šç”² + +é©ã®ãƒ–ーツ + +鉄ã®ãƒ–ーツ + +ダイヤモンドã®ãƒ–ーツ + +金ã®ãƒ–ーツ + +鉄ã®å»¶ã¹æ£’ + +金ã®å»¶ã¹æ£’ + +ãƒã‚±ãƒ„ + +æ°´ãƒã‚±ãƒ„ + +溶岩ãƒã‚±ãƒ„ + +ç«æ‰“ã¡çŸ³ã¨æ‰“ã¡é‡‘ + +リンゴ + +弓 + +矢 + +石炭 + +木炭 + +ダイヤモンド + +棒 + +ãŠã‚ã‚“ + +ãã®ã“ã‚·ãƒãƒ¥ãƒ¼ + +ã²ã‚‚ + +羽根 + +ç«è–¬ + +å°éº¦ã®ç¨® + +å°éº¦ + +パン + +ç«æ‰“ã¡çŸ³ + +生ã®è±šè‚‰ + +調ç†ã—ãŸè±šè‚‰ + +çµµ + +金ã®ãƒªãƒ³ã‚´ + +çœ‹æ¿ + +トロッコ + +éž + +レッドストーン + +雪玉 + +ボート + +é© + +ミルク ãƒã‚±ãƒ„ + +レンガ + +粘土 + +サトウキビ + +ç´™ + +本 + +スライムボール + +ãƒã‚§ã‚¹ãƒˆã¤ãトロッコ + +ã‹ã¾ã©ã¤ãトロッコ + +タマゴ + +コンパス + +釣り竿 + +時計 + +光石ã®ç²‰ + +生魚 + +調ç†ã—ãŸé­š + +染色粉 + +墨袋 + +ローズ レッド + +サボテン グリーン + +ココア ビーンズ + +ラピスラズリ + +ç´«ã®æŸ“æ–™ + +æ°´è‰²ã®æŸ“æ–™ + +è–„ç°è‰²ã®æŸ“æ–™ + +ç°è‰²ã®æŸ“æ–™ + +ãƒ”ãƒ³ã‚¯ã®æŸ“æ–™ + +é»„ç·‘ã®æŸ“æ–™ + +ãŸã‚“ã½ã½ã‚¤ã‚¨ãƒ­ãƒ¼ + +ç©ºè‰²ã®æŸ“æ–™ + +èµ¤ç´«ã®æŸ“æ–™ + +ã‚ªãƒ¬ãƒ³ã‚¸ã®æŸ“æ–™ + +骨粉 + +骨 + +ç ‚ç³– + +ケーキ + +ベッド + +レッドストーンå復装置 + +クッキー + +地図 + +音楽ディスク: 13 + +音楽ディスク: cat + +音楽ディスク: blocks + +音楽ディスク: chirp + +音楽ディスク: far + +音楽ディスク: mall + +音楽ディスク: mellohi + +音楽ディスク: stal + +音楽ディスク: strad + +音楽ディスク: ward + +音楽ディスク: 11 + +音楽ディスク: where are we now + +ãƒã‚µãƒŸ + +カボãƒãƒ£ã®ç¨® + +スイカã®ç¨® + +é¶è‚‰ + +焼ãé³¥ + +牛肉 + +ステーキ + +è…肉 + +エンダーパール + +切ã£ãŸã‚¹ã‚¤ã‚« + +Blaze ロッド + +Ghast ã®æ¶™ + +金ã®å¡Š + +暗黒茸 + +{*prefix*}{*postfix*}ãƒãƒ¼ã‚·ãƒ§ãƒ³{*splash*} + +ガラスビン + +æ°´ã®ãƒ“ン + +クモã®ç›® + +発酵ã—ãŸã‚¯ãƒ¢ã®ç›® + +Blaze パウダー + +マグマクリーム + +調åˆå° + +大釜 + +エンダーアイ + +è¼ãスイカ + +エンãƒãƒ£ãƒ³ãƒˆã®ãƒ“ン + +発ç«å‰¤ + +発ç«å‰¤ (木炭) + +発ç«å‰¤ (石炭) + +é¡ç¸ + +{*CREATURE*}å‡ºç¾ + +暗黒レンガ + +スカル + +ガイコツ スカル + +ウィザー ガイコツ スカル + +ゾンビ ヘッド + +ヘッド + +%sã®ãƒ˜ãƒƒãƒ‰ + +Creeper ヘッド + +石 + +è‰ãƒ–ロック + +土 + +丸石 + +æ¨«ã®æ¿ + +ãƒˆã‚¦ãƒ’ã®æ¿ + +æ¨ºã®æ¿ + +ã‚¸ãƒ£ãƒ³ã‚°ãƒ«ã®æœ¨ã®æ¿ + +苗木 + +樫ã®è‹—木 + +トウヒã®è‹—木 + +樺ã®è‹—木 + +ã‚¸ãƒ£ãƒ³ã‚°ãƒ«ã®æœ¨ã®è‹—木 + +岩盤 + +æ°´ + +溶岩 + +ç ‚ + +砂岩 + +砂利 + +金鉱石 + +鉄鉱石 + +石炭ã®åŽŸçŸ³ + +木 + +æ¨«ã®æœ¨ + +ãƒˆã‚¦ãƒ’ã®æœ¨ + +æ¨ºã®æœ¨ + +ã‚¸ãƒ£ãƒ³ã‚°ãƒ«ã®æœ¨ + +樫 + +トウヒ + +樺 + +葉ã£ã± + +樫ã®è‘‰ + +トウヒã®è‘‰ + +樺ã®è‘‰ + +ã‚¸ãƒ£ãƒ³ã‚°ãƒ«ã®æœ¨ã®è‘‰ + +スãƒãƒ³ã‚¸ + +ガラス + +ウール + +é»’ã®ã‚¦ãƒ¼ãƒ« + +赤ã®ã‚¦ãƒ¼ãƒ« + +ç·‘ã®ã‚¦ãƒ¼ãƒ« + +茶色ã®ã‚¦ãƒ¼ãƒ« + +é’ã®ã‚¦ãƒ¼ãƒ« + +ç´«ã®ã‚¦ãƒ¼ãƒ« + +水色ã®ã‚¦ãƒ¼ãƒ« + +è–„ç°è‰²ã®ã‚¦ãƒ¼ãƒ« + +ç°è‰²ã®ã‚¦ãƒ¼ãƒ« + +ピンクã®ã‚¦ãƒ¼ãƒ« + +黄緑ã®ã‚¦ãƒ¼ãƒ« + +黄色ã®ã‚¦ãƒ¼ãƒ« + +空色ã®ã‚¦ãƒ¼ãƒ« + +赤紫ã®ã‚¦ãƒ¼ãƒ« + +オレンジã®ã‚¦ãƒ¼ãƒ« + +白ã®ã‚¦ãƒ¼ãƒ« + +花 + +ãƒãƒ© + +ãã®ã“ + +金ã®ãƒ–ロック + +金をä¿ç®¡ã™ã‚‹ã®ã«ä½¿ãˆã‚‹ + +鉄をä¿ç®¡ã™ã‚‹ã®ã«ä½¿ãˆã‚‹ + +鉄ã®ãƒ–ロック + +石ã®åŽšæ¿ + +石ã®åŽšæ¿ + +砂岩ã®åŽšæ¿ + +樫ã®åŽšæ¿ + +丸石ã®åŽšæ¿ + +レンガã®åŽšæ¿ + +石レンガã®åŽšæ¿ + +樫ã®åŽšæ¿ + +トウヒã®åŽšæ¿ + +樺ã®åŽšæ¿ + +ã‚¸ãƒ£ãƒ³ã‚°ãƒ«ã®æœ¨ã®åŽšæ¿ + +暗黒レンガã®åŽšæ¿ + +レンガ + +TNT ç«è–¬ + +本棚 + +コケ石 + +黒曜石 + +ãŸã„ã¾ã¤ + +ãŸã„ã¾ã¤ (石炭) + +ãŸã„ã¾ã¤ (木炭) + +ç« + +モンスター発生器 + +樫ã®éšŽæ®µ + +ãƒã‚§ã‚¹ãƒˆ + +レッドストーンã®ç²‰ + +ダイヤモンド鉱石 + +ダイヤモンドã®ãƒ–ロック + +ダイヤモンドをä¿ç®¡ã™ã‚‹ã®ã«ä½¿ãˆã‚‹ + +ä½œæ¥­å° + +作物 + +農地 + +ã‹ã¾ã© + +çœ‹æ¿ + +木ã®ãƒ‰ã‚¢ + +ã¯ã—ã” + +レール + +加速レール + +感知レール + +石ã®éšŽæ®µ + +レãƒãƒ¼ + +é‡é‡æ„ŸçŸ¥æ¿ + +鉄ã®ãƒ‰ã‚¢ + +レッドストーン鉱石 + +レッドストーンã®ãŸã„ã¾ã¤ + +ボタン + +雪 + +æ°· + +サボテン + +粘土 + +サトウキビ + +ジュークボックス + +柵 + +カボãƒãƒ£ + +カボãƒãƒ£ ランタン + +暗黒石 + +ソウルサンド + +光石 + +ãƒãƒ¼ã‚¿ãƒ« + +ラピスラズリ鉱石 + +ラピスラズリã®ãƒ–ロック + +ラピスラズリをä¿ç®¡ã™ã‚‹ã®ã«ä½¿ãˆã‚‹ + +発射装置 + +音ブロック + +ケーキ + +ベッド + +クモã®å·£ + +背ã®é«˜ã„è‰ + +枯れãŸèŒ‚ã¿ + +ダイオード + +éµã¤ããƒã‚§ã‚¹ãƒˆ + +トラップドア + +ウール (ã™ã¹ã¦ã®è‰²) + +ピストン + +å¸ç€ãƒ”ストン + +Silverfish ブロック + +石レンガ + +è‹”ã®ç”ŸãˆãŸçŸ³ãƒ¬ãƒ³ã‚¬ + +ã²ã³å‰²ã‚ŒãŸçŸ³ãƒ¬ãƒ³ã‚¬ + +模様入り石レンガ + +ãã®ã“ + +ãã®ã“ + +é‰„æ ¼å­ + +ã‚¬ãƒ©ã‚¹æ¿ + +スイカ + +カボãƒãƒ£ã®èŒŽ + +スイカã®èŒŽ + +ã¤ãŸ + +フェンスゲート + +レンガ階段 + +石レンガ階段 + +Silverfish 石 + +Silverfish ã®ä¸¸çŸ³ + +Silverfish ã®çŸ³ãƒ¬ãƒ³ã‚¬ + +èŒç³¸ + +スイレンã®è‘‰ + +暗黒レンガ + +æš—é»’ãƒ¬ãƒ³ã‚¬ã®æŸµ + +暗黒レンガ階段 + +暗黒茸 + +エンãƒãƒ£ãƒ³ãƒˆãƒ†ãƒ¼ãƒ–ル + +調åˆå° + +大釜 + +æžœã¦ã®ãƒãƒ¼ã‚¿ãƒ« + +æžœã¦ã®ãƒãƒ¼ã‚¿ãƒ«ã®æž  + +æžœã¦ã®çŸ³ + +ドラゴンã®åµ + +低木 + +シダ + +砂岩ã®éšŽæ®µ + +トウヒã®éšŽæ®µ + +樺ã®éšŽæ®µ + +ã‚¸ãƒ£ãƒ³ã‚°ãƒ«ã®æœ¨ã®éšŽæ®µ + +レッドストーン ランプ + +ココア + +スカル + +ç¾åœ¨ã®æ“作方法 + +レイアウト + +å‹•ã/ダッシュ + +見る + +ãƒãƒ¼ã‚º + +ジャンプ + +ジャンプ/上昇 (飛行時) + +æŒã¡ç‰© + +手æŒã¡ã‚¢ã‚¤ãƒ†ãƒ ã®åˆ‡ã‚Šæ›¿ãˆ + +アクション + +使ㆠ+ +工作 + +è½ã¨ã™ + +ã—ã®ã³è¶³ + +ã—ã®ã³è¶³/ä¸‹é™ (飛行時) + +カメラ モードã®å¤‰æ›´ + +プレイヤー/招待 + +移動 (飛行時) + +レイアウト 1 + +レイアウト 2 + +レイアウト 3 + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +{*B*}ç¶šã‘ã‚‹ã«ã¯ {*CONTROLLER_VK_A*} を押ã—ã¦ãã ã•ã„ + +{*B*}ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã‚’å§‹ã‚ã‚‹: {*CONTROLLER_VK_A*}{*B*} + ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã‚’飛ã°ã™: {*CONTROLLER_VK_B*} + +Minecraft ã¯è‡ªç”±ãªç™ºæƒ³ã§ãƒ–ロックをç©ã¿ä¸Šã’ã¦ã€æŽ¢æ¤œã—ãŸã‚Šã€ã„ã‚ã„ã‚ãªç‰©ã‚’作ã£ãŸã‚Šã™ã‚‹ã‚²ãƒ¼ãƒ ã§ã™ã€‚ +夜ã«ãªã‚‹ã¨ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ãŒç¾ã‚Œã‚‹ã®ã§ã€ãã®å‰ã«å¿…ãšå®‰å…¨ãªå ´æ‰€ã‚’作ã£ã¦ãŠã‹ãªã‘れã°ãªã‚Šã¾ã›ã‚“ + +{*CONTROLLER_ACTION_LOOK*} ã§å‘¨å›²ã‚’見回ã›ã¾ã™ + +{*CONTROLLER_ACTION_MOVE*} å‹•ã回れã¾ã™ + +ダッシュã™ã‚‹ã«ã¯ {*CONTROLLER_ACTION_MOVE*} ã‚’å‰æ–¹å‘ã«ã™ã°ã‚„ã 2 回押ã—ã¾ã™ã€‚{*CONTROLLER_ACTION_MOVE*} ã‚’å‰æ–¹å‘ã«æŠ¼ã—ç¶šã‘る間ダッシュã§ãã¾ã™ã€‚ãŸã ã—一定時間ãŒéŽãŽã‚‹ã‹é£Ÿã¹ç‰©ãŒå°½ãã‚‹ã¨ãã“ã§ã‚„ã‚ã¦ã—ã¾ã„ã¾ã™ã€‚ + +{*CONTROLLER_ACTION_JUMP*} ã§ã‚¸ãƒ£ãƒ³ãƒ— + +æ‰‹ã‚„ã€æ‰‹ã«æŒã£ã¦ã„るアイテムを使ã£ã¦ã€æŽ˜ã£ãŸã‚Šåˆ‡ã£ãŸã‚Šã™ã‚‹ã«ã¯ã€{*CONTROLLER_ACTION_ACTION*} を押ã—ç¶šã‘ã¾ã™ã€‚é“具を作らãªã„ã¨ã€æŽ˜ã‚Œãªã„ブロックもã‚りã¾ã™ + +{*CONTROLLER_ACTION_ACTION*} を押ã—ç¶šã‘ã¦æœ¨ã‚’ 4 ブロック (木ã®å¹¹ã«ç›¸å½“) 切ã£ã¦ã¿ã¾ã—ょã†ã€‚{*B*}ブロックを壊ã™ã¨ã€ã‚¢ã‚¤ãƒ†ãƒ ãŒæµ®ã‹ã‚“ã çŠ¶æ…‹ã§ç¾ã‚Œã¾ã™ã€‚アイテムã®è¿‘ãã«ç«‹ã¤ã¨ã€ã‚¢ã‚¤ãƒ†ãƒ ã‚’集ã‚られã¾ã™ã€‚集ã‚ãŸã‚¢ã‚¤ãƒ†ãƒ ã¯ã€æŒã¡ç‰©ã«è¿½åŠ ã•れã¾ã™ + +{*CONTROLLER_ACTION_CRAFTING*} ã§å·¥ä½œç”»é¢ã‚’é–‹ãã¾ã—ょㆠ+ +アイテムを集ã‚ãŸã‚Šã€ä½œã£ãŸã‚Šã™ã‚‹ã“ã¨ã§æŒã¡ç‰©ã¯å¢—ãˆã¾ã™ã€‚{*B*} + {*CONTROLLER_ACTION_INVENTORY*} ã§æŒã¡ç‰©ã‚’é–‹ãã¾ã—ょㆠ+ +ç§»å‹•ã€æŽ¡æŽ˜ã€æ”»æ’ƒãªã©ã®è¡Œå‹•ã§ç©ºè…¹ã‚²ãƒ¼ã‚¸ {*ICON_SHANK_01*} ãŒæ¸›ã£ã¦ã„ãã¾ã™ã€‚ダッシュやダッシュ ã‚¸ãƒ£ãƒ³ãƒ—ã¯æ™®é€šã«æ­©ã„ãŸã‚Šã‚¸ãƒ£ãƒ³ãƒ—ã—ãŸã‚Šã™ã‚‹ã‚ˆã‚Šã‚‚ã‚²ãƒ¼ã‚¸ãŒæ¸›ã‚Šã¾ã™ + +HP ãŒæ¸›ã£ã¦ã‚‚空腹ゲージ㮠{*ICON_SHANK_01*} ㌠9 個以上ã‚る状態ã§ã¯ã€HP ãŒè‡ªç„¶ã«å›žå¾©ã—ã¾ã™ã€‚ 食ã¹ç‰©ã‚’食ã¹ã‚‹ã¨ç©ºè…¹ã‚²ãƒ¼ã‚¸ã¯å›žå¾©ã—ã¾ã™ + +食ã¹ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã‚’æŒã£ã¦ã„ã‚‹ã¨ãã« {*CONTROLLER_ACTION_USE*} を押ã—ç¶šã‘ã‚‹ã¨ã€ã‚¢ã‚¤ãƒ†ãƒ ã‚’食ã¹ã¦ç©ºè…¹ã‚²ãƒ¼ã‚¸ãŒå›žå¾©ã—ã¾ã™ã€‚ã‚²ãƒ¼ã‚¸ãŒæº€ã‚¿ãƒ³ã®ã¨ãã¯é£Ÿã¹ã‚‰ã‚Œã¾ã›ã‚“ + +空腹ゲージãŒä½Žã„ãŸã‚ HP ãŒæ¸›ã‚Šå§‹ã‚ã¾ã—ãŸã€‚æŒã¡ç‰©ã«å…¥ã£ã¦ã„るステーキを食ã¹ã¦ç©ºè…¹ã‚²ãƒ¼ã‚¸ã‚’回復ã•ã›ã‚Œã°ã€HP ãŒå›žå¾©ã—å§‹ã‚ã¾ã™ã€‚{*ICON*}364{*/ICON*} + +集ã‚ãŸæœ¨ã¯ã€æœ¨ã®æ¿ã®ææ–™ã«ãªã‚Šã¾ã™ã€‚工作画é¢ã‚’é–‹ã„ã¦ã€å·¥ä½œã‚’å§‹ã‚ã¾ã—ょã†{*PlanksIcon*} + +工作ã«ã¯ã„ãã¤ã‚‚ã®å·¥ç¨‹ãŒã‚りã¾ã™ã€‚æœ¨ã®æ¿ãŒæ‰‹ã«å…¥ã£ãŸã®ã§ã€ã“れã§ã€ã„ã‚ã„ã‚作るã“ã¨ãŒã§ãã¾ã™ã€‚ã¾ãšã¯ä½œæ¥­å°ã‚’作ã£ã¦ã¿ã¾ã—ょã†{*CraftingTableIcon*} + +作業ã«åˆã£ãŸé“具を使ã†ã“ã¨ã§ã€ãƒ–ロックをより効率よã集ã‚ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚é“å…·ã«ã¯æ£’ã®æŒã¡æ‰‹ãŒå¿…è¦ãªç‰©ãŒã‚ã‚‹ã®ã§ã€æ£’を作りã¾ã—ょã†{*SticksIcon*} + +æ‰‹ã«æŒã£ã¦ã„るアイテムを変更ã™ã‚‹ã«ã¯ {*CONTROLLER_ACTION_LEFT_SCROLL*} 㨠{*CONTROLLER_ACTION_RIGHT_SCROLL*} を使ã„ã¾ã™ + +アイテムを使用ã—ãŸã‚Šã€ç½®ã„ãŸã‚Šã€ã‚ªãƒ–ジェクトã«ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’å–ã£ãŸã‚Šã™ã‚‹ã«ã¯ {*CONTROLLER_ACTION_USE*} を使ã„ã¾ã™ã€‚ç½®ã„ãŸã‚¢ã‚¤ãƒ†ãƒ ã¯ã€é©åˆ‡ãªé“具を使用ã—ã¦æ‹¾ã†ã“ã¨ãŒã§ãã¾ã™ + +作業å°ã‚’ç½®ãã¾ã—ょã†ã€‚作業å°ã‚’é¸æŠžã—ã¦ã€ç½®ããŸã„場所ã«ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’åˆã‚ã›ã¦ã‹ã‚‰ {*CONTROLLER_ACTION_USE*} を押ã—ã¾ã™ + +作業å°ã«ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’åˆã‚ã›ã¦ã‹ã‚‰ {*CONTROLLER_ACTION_USE*} を押ã—ã¦ã€ä½œæ¥­å°ã‚’é–‹ãã¾ã—ょㆠ+ +シャベルを使ãˆã°ã€åœŸã‚„雪ã®ã‚ˆã†ãªæŸ”らã‹ã„ãƒ–ãƒ­ãƒƒã‚¯ã‚’æ‰‹æ—©ãæŽ˜ã‚Œã¾ã™ã€‚より多ãã®ææ–™ã‚’æ‰‹ã«å…¥ã‚Œã‚‹ã“ã¨ã§ã€ã‚ˆã‚Šä¸ˆå¤«ã§åŠ¹çŽ‡ã®è‰¯ã„é“具を作るã“ã¨ãŒã§ãã¾ã™ã€‚木ã®ã‚·ãƒ£ãƒ™ãƒ«ã‚’作ã£ã¦ã¿ã¾ã—ょã†{*WoodenShovelIcon*} + +斧を使ãˆã°ã€æœ¨ã‚„木ã®ãƒ–ロックを手早ã切り出ã›ã¾ã™ã€‚より多ãã®ææ–™ã‚’æ‰‹ã«å…¥ã‚Œã‚‹ã“ã¨ã§ã€ã‚ˆã‚Šä¸ˆå¤«ã§åŠ¹çŽ‡ã®è‰¯ã„é“具を作るã“ã¨ãŒã§ãã¾ã™ã€‚æœ¨ã®æ–§ã‚’作ã£ã¦ã¿ã¾ã—ょã†{*WoodenHatchetIcon*} + +ツルãƒã‚·ã‚’使ãˆã°ã€çŸ³ã‚„鉱石ã®ã‚ˆã†ãªå …ã„ãƒ–ãƒ­ãƒƒã‚¯ã‚’æ—©ãæŽ˜ã‚Šå‡ºã›ã¾ã™ã€‚より多ãã®ææ–™ã‚’æ‰‹ã«å…¥ã‚Œã‚‹ã“ã¨ã§ã€ã•らã«å …ã„ææ–™ã‚’æŽ˜ã‚‹ã“ã¨ã®ã§ãã‚‹ã€ã‚ˆã‚Šä¸ˆå¤«ã§åŠ¹çŽ‡ã®è‰¯ã„é“具を作るã“ã¨ãŒã§ãã¾ã™ã€‚木ã®ãƒ„ルãƒã‚·ã‚’作ã£ã¦ã¿ã¾ã—ょã†{*WoodenPickaxeIcon*} + +入れ物を開ã + + + 夜ã¯ã™ãã«è¨ªã‚Œã¾ã™ã€‚ä½•ã®æº–備もãªã—ã«å¤–ã«ã„ã‚‹ã®ã¯å±é™ºã§ã™ã€‚武器や防具を作るã“ã¨ã‚‚ã§ãã¾ã™ãŒã€ã¾ãšã¯å®‰å…¨ãªå ´æ‰€ã‚’作るã“ã¨ãŒè³¢æ˜Žã§ã™ + + + + è¿‘ãã«ã€æ˜”ã«é‰±å±±ã®åƒã手ãŒä½ã‚“ã§ã„ãŸå°å±‹ãŒã‚りã¾ã™ã€‚ãれを修復ã™ã‚Œã°å¤œã§ã‚‚安全ã§ã™ + + + + å°å±‹ã‚’修復ã™ã‚‹ãŸã‚ã®ææ–™ã‚’é›†ã‚ã¾ã—ょã†ã€‚å£ã‚„屋根ã¯ã©ã®ãƒ–ロックã§ã‚‚作れã¾ã™ãŒã€ãƒ‰ã‚¢ã‚„çª“ã€æ˜Žã‹ã‚Šã‚‚作りãŸã„ã¨ã“ã‚ã§ã™ + + +ツルãƒã‚·ã‚’使ã£ã¦ã€çŸ³ã®ãƒ–ロックを掘り出ã—ã¦ã¿ã¾ã—ょã†ã€‚石ã®ãƒ–ロックを掘り出ã—ã¦ã„ã‚‹ã¨ã€ä¸¸çŸ³ã‚‚出ã¦ãã¾ã™ã€‚丸石を 8 ã¤é›†ã‚ã‚‹ã¨ã€ã‹ã¾ã©ã‚’作るã“ã¨ãŒã§ãã¾ã™ã€‚石ã®ã‚る場所ã«ãŸã©ã‚Šç€ãã«ã¯ã€åœŸã‚’掘ã£ã¦ã„ãå¿…è¦ãŒã‚ã‚‹ã®ã§ã€ã‚·ãƒ£ãƒ™ãƒ«ã‚’使ã„ã¾ã—ょã†{*StoneIcon*} + +ã‹ã¾ã©ã‚’作るã®ã«å¿…è¦ãªæ•°ã®ä¸¸çŸ³ãŒé›†ã¾ã‚Šã¾ã—ãŸã€‚作業å°ã‚’使ã£ã¦ã€ã‹ã¾ã©ã‚’作りã¾ã—ょㆠ+ +{*CONTROLLER_ACTION_USE*} ã§ã‹ã¾ã©ã‚’ç½®ã„ã¦ã€é–‹ãã¾ã—ょㆠ+ +ã‹ã¾ã©ã‚’使ã£ã¦ã€æœ¨ç‚­ã‚’作りã¾ã—ょã†ã€‚出æ¥ä¸ŠãŒã‚Šã‚’å¾…ã£ã¦ã„ã‚‹é–“ã«ã€å°å±‹ã‚’修復ã™ã‚‹ãŸã‚ã®ææ–™ã‚’ã‚‚ã£ã¨é›†ã‚ã¦ã¿ã¾ã—ょㆠ+ +ã‹ã¾ã©ã‚’使ã£ã¦ã€ã‚¬ãƒ©ã‚¹ã‚’作りã¾ã—ょã†ã€‚出æ¥ä¸ŠãŒã‚Šã‚’å¾…ã£ã¦ã„ã‚‹é–“ã«ã€å°å±‹ã‚’修復ã™ã‚‹ãŸã‚ã®ææ–™ã‚’ã‚‚ã£ã¨é›†ã‚ã¦ã¿ã¾ã—ょㆠ+ +å°å±‹ã«ãƒ‰ã‚¢ã‚’ã¤ã‘ã‚‹ã¨ã€ã„ã¡ã„ã¡å£ã‚’掘ã£ãŸã‚Šç§»å‹•ã•ã›ãŸã‚Šã›ãšã«ã€ç°¡å˜ã«å‡ºå…¥ã‚Šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚木ã®ãƒ‰ã‚¢ã‚’作ã£ã¦ã¿ã¾ã—ょã†{*WoodenDoorIcon*} + +ドアを {*CONTROLLER_ACTION_USE*} ã§è¨­ç½®ã—ã¾ã™ã€‚ドア㯠{*CONTROLLER_ACTION_USE*} ã§é–‹ã‘é–‰ã‚ã§ãã¾ã™ + +夜ã¯å¤–ãŒçœŸã£æš—ã«ãªã‚Šã¾ã™ã€‚å°å±‹ã®ä¸­ã«ã¯æ˜Žã‹ã‚ŠãŒæ¬²ã—ã„ã¨ã“ã‚ã§ã™ã€‚工作画é¢ã§ã€æ£’ã¨æœ¨ç‚­ã‹ã‚‰ãŸã„ã¾ã¤ã‚’作りã¾ã—ょã†{*TorchIcon*} + + + ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã®æœ€åˆã®ãƒ‘ートãŒå®Œäº†ã§ã™! + + + + {*B*} + ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã‚’ç¶šã‘ã‚‹: {*CONTROLLER_VK_A*}{*B*} + ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã‚’飛ã°ã™: {*CONTROLLER_VK_B*} + + + + ã“れãŒã‚ãªãŸã®æŒã¡ç‰©ã§ã™ã€‚æ‰‹ã§æŒã£ã¦ä½¿ç”¨ã§ãるアイテムã¨ã€æ‰€æœ‰ã—ã¦ã„るアイテムã®ãƒªã‚¹ãƒˆã€ç¾åœ¨è£…å‚™ã—ã¦ã„る防具を確èªã§ãã¾ã™ + + +{*B*} + æŒã¡ç‰©ã®èª¬æ˜Žã‚’ç¶šã‘ã‚‹: {*CONTROLLER_VK_A*}{*B*} + æŒã¡ç‰©ã®èª¬æ˜Žã‚’飛ã°ã™: {*CONTROLLER_VK_B*} + + + + ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’ {*CONTROLLER_MENU_NAVIGATE*} ã§å‹•ã‹ã—ã¦ã€ã‚¢ã‚¤ãƒ†ãƒ ã«åˆã‚ã›ã¦ã‹ã‚‰ {*CONTROLLER_VK_A*} を押ã™ã¨ã€ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã§ãã¾ã™ã€‚ + ãã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’複数所有ã—ã¦ã„ã‚‹å ´åˆã¯ã€ãã®ã™ã¹ã¦ãŒé¸æŠžã•れã¾ã™ã€‚åŠåˆ†ã ã‘é¸æŠžã™ã‚‹ã«ã¯ {*CONTROLLER_VK_X*} を使用ã—ã¾ã™ + + + + ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã§é¸ã‚“ã ã‚¢ã‚¤ãƒ†ãƒ ã‚’æŒã¡ç‰©ã®åˆ¥ã®å ´æ‰€ã«ç§»å‹•ã•ã›ã‚‹ã«ã¯ã€ç§»å‹•先㧠{*CONTROLLER_VK_A*} を押ã—ã¾ã™ã€‚ + ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ãŒã‚ã‚‹å ´åˆã¯ã€{*CONTROLLER_VK_A*} を押ã™ã¨å…¨éƒ¨ã€ {*CONTROLLER_VK_X*} を押ã™ã¨ 1 ã¤ã ã‘移動ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ + + + + ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã§ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ãŸã¾ã¾ã€æŒã¡ç‰©ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®å¤–ã«ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’å‹•ã‹ã™ã“ã¨ã§ã€ã‚¢ã‚¤ãƒ†ãƒ ã‚’外ã«è½ã¨ã™ã“ã¨ãŒã§ãã¾ã™ + + + + アイテムã®èª¬æ˜Žã‚’見ãŸã„時ã¯ã€ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’アイテムã®ä¸Šã«å‹•ã‹ã—ã¦ã‹ã‚‰ {*CONTROLLER_VK_RT*} を押ã—ã¦ãã ã•ã„ + + + + æŒã¡ç‰©ç”»é¢ã‚’é–‰ã˜ã‚‹ã«ã¯ {*CONTROLLER_VK_B*} を押ã—ã¾ã™ + + + + ã“れãŒã‚¯ãƒªã‚¨ã‚¤ãƒ†ã‚£ãƒ– ãƒ¢ãƒ¼ãƒ‰ã®æŒã¡ç‰©ã§ã™ã€‚æ‰‹ã§æŒã£ã¦ä½¿ç”¨ã§ãるアイテムã¨ã€æ‰€æœ‰ã—ã¦ã„るアイテムã®ãƒªã‚¹ãƒˆã‚’確èªã§ãã¾ã™ + + +{*B*} + æŒã¡ç‰©ã®èª¬æ˜Žã‚’ç¶šã‘ã‚‹: {*CONTROLLER_VK_A*}{*B*} + クリエイティブ ãƒ¢ãƒ¼ãƒ‰ã®æŒã¡ç‰©ã®èª¬æ˜Žã‚’飛ã°ã™: {*CONTROLLER_VK_B*} + + + + ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’ {*CONTROLLER_MENU_NAVIGATE*} ã§å‹•ã‹ã—ã¦ã‚¢ã‚¤ãƒ†ãƒ ã«åˆã‚ã›ã¾ã™ã€‚ + {*CONTROLLER_VK_A*} を押ã™ã¨ã€ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¾ã™ã€‚ + ãã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’複数所有ã—ã¦ã„ã‚‹å ´åˆã¯ã€{*CONTROLLER_VK_Y*} を押ã™ã¨ã€ã™ã¹ã¦ãŒé¸æŠžã•れã¾ã™ + + + + ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã¯è‡ªå‹•çš„ã«ä½¿ç”¨æ¬„ã¸ç§»å‹•ã—ã¾ã™ã€‚{*CONTROLLER_VK_A*} ã§ãã“ã«é¸æŠžã‚¢ã‚¤ãƒ†ãƒ ã‚’ç½®ãã¾ã™ã€‚アイテムを置ãã¨ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã¯ã‚¢ã‚¤ãƒ†ãƒ ä¸€è¦§ã«æˆ»ã‚‹ã®ã§ã€ãã“ã‹ã‚‰ä»–ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸ã¶ã“ã¨ã‚‚ã§ãã¾ã™ + + + + アイテムã®ä¸Šã«ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’ç½®ã„ãŸçŠ¶æ…‹ã§ã€æŒã¡ç‰©ç”»é¢ã®å¤–ã¸ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’å‹•ã‹ã™ã¨ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’è½ã¨ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ã‚¯ã‚¤ãƒƒã‚¯é¸æŠžãƒãƒ¼ã‚’一度ã«ç©ºã«ã™ã‚‹ã«ã¯{*CONTROLLER_VK_X*}を押ã—ã¦ãã ã•ã„。 + + + + 使ã†ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚°ãƒ«ãƒ¼ãƒ—を変更ã™ã‚‹ã«ã¯ {*CONTROLLER_VK_LB*} 㨠{*CONTROLLER_VK_RB*} ã§ã€ä¸Šã«ã‚るグループã®ã‚¿ãƒ–を切り替ãˆã€{*CONTROLLER_VK_LS*} ã§ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¾ã™ + + + + アイテムã®èª¬æ˜Žã‚’見ãŸã„時ã¯ã€ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’アイテムã®ä¸Šã«å‹•ã‹ã—ã¦ã‹ã‚‰ {*CONTROLLER_VK_RT*} を押ã—ã¾ã™ + + + + クリエイティブ モードæŒã¡ç‰©ç”»é¢ã‚’é–‰ã˜ã‚‹ã«ã¯ {*CONTROLLER_VK_B*} を押ã—ã¾ã™ + + + + ã“れãŒå·¥ä½œç”»é¢ã§ã™ã€‚ã“ã®ç”»é¢ã§ã¯ã€ã“れã¾ã§ã«é›†ã‚ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’組ã¿åˆã‚ã›ã¦ã€æ–°ã—ã„アイテムを作るã“ã¨ãŒã§ãã¾ã™ + + +{*B*} + 工作ã®èª¬æ˜Žã‚’ç¶šã‘ã‚‹: {*CONTROLLER_VK_A*}{*B*} + 工作ã®èª¬æ˜Žã‚’飛ã°ã™: {*CONTROLLER_VK_B*} + + +{*B*} + アイテムã®èª¬æ˜Žã‚’見るã«ã¯ {*CONTROLLER_VK_X*} を押ã—ã¾ã™ + + +{*B*} + ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’作るã®ã«å¿…è¦ãªã‚¢ã‚¤ãƒ†ãƒ ã®ãƒªã‚¹ãƒˆã‚’見るã«ã¯ {*CONTROLLER_VK_X*} を押ã—ã¾ã™ + + +{*B*} + æŒã¡ç‰©ã«æˆ»ã‚‹ã«ã¯ {*CONTROLLER_VK_X*} を押ã—ã¾ã™ + + + + 作りãŸã„アイテムã®ã‚°ãƒ«ãƒ¼ãƒ—を変更ã™ã‚‹ã«ã¯ {*CONTROLLER_VK_LB*} 㨠{*CONTROLLER_VK_RB*} ã§ã€ä¸Šã«ã‚るグループã®ã‚¿ãƒ–を切り替ãˆã€{*CONTROLLER_MENU_NAVIGATE*} ã§ä½œã‚‹ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¾ã™ + + + + 工作ウィンドウã«ã¯ã€æ–°ã—ã„アイテムを作るã®ã«å¿…è¦ãªã‚¢ã‚¤ãƒ†ãƒ ã®ãƒªã‚¹ãƒˆãŒè¡¨ç¤ºã•れã¾ã™ã€‚{*CONTROLLER_VK_A*} を押ã™ã¨ã‚¢ã‚¤ãƒ†ãƒ ãŒä½œã‚‰ã‚Œã€æŒã¡ç‰©ã«è¿½åŠ ã•れã¾ã™ + + + + 作業å°ã‚’使ã†ã¨ã€ã‚ˆã‚Šå¤šãã®ç¨®é¡žã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’作れるよã†ã«ãªã‚Šã¾ã™ã€‚作業å°ã§ã®å·¥ä½œã‚‚普通ã®å·¥ä½œã¨å¤‰ã‚りã¾ã›ã‚“。ã§ã™ãŒä½œæ¥­ã‚¹ãƒšãƒ¼ã‚¹ãŒåºƒã„分ã€ã‚ˆã‚Šå¤šãã®ææ–™ã‚’çµ„ã¿åˆã‚ã›ã¦ã‚¢ã‚¤ãƒ†ãƒ ã‚’作るã“ã¨ãŒã§ãã¾ã™ + + + + 工作画é¢ã®å³ä¸‹ã«ã¯ã€æŒã¡ç‰©ãŒè¡¨ç¤ºã•れã¾ã™ã€‚ã•らã«ã€é¸æŠžã—ã¦ã„るアイテムã®èª¬æ˜Žã¨ã€ãれを作るã®ã«å¿…è¦ãªææ–™ã‚‚表示ã•れã¾ã™ + + + + é¸æŠžã—ã¦ã„るアイテムã®èª¬æ˜ŽãŒè¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚説明ã‹ã‚‰ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ ãŒä½•ã«ä½¿ãˆã‚‹ã‹ãŒåˆ†ã‹ã‚Šã¾ã™ + + + + é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’作るã®ã«å¿…è¦ãªã‚¢ã‚¤ãƒ†ãƒ ã®ãƒªã‚¹ãƒˆã§ã™ + + +集ã‚ãŸæœ¨ã‚’使ã£ã¦ã€æœ¨ã®æ¿ã‚’作るã“ã¨ãŒã§ãã¾ã™ã€‚作るã«ã¯ã€æœ¨ã®æ¿ã®ã‚¢ã‚¤ã‚³ãƒ³ã‚’é¸ã‚“ã§ã‹ã‚‰ {*CONTROLLER_VK_A*} を押ã—ã¦ãã ã•ã„{*PlanksIcon*} + + + ã“れ㧠作業å°ãŒå®Œæˆã§ã™! ゲームã®ä¸–界ã«ç½®ã„ã¦ã€ã„ã‚ã„ã‚ãªã‚¢ã‚¤ãƒ†ãƒ ã‚’作れるよã†ã«ã—ã¾ã—ょã†ã€‚{*B*} + 工作画é¢ã‹ã‚‰å‡ºã‚‹ã«ã¯ {*CONTROLLER_VK_B*} を押ã—ã¾ã™ + + + + 作るアイテムã®ã‚°ãƒ«ãƒ¼ãƒ—を切り替ãˆã‚‹ã«ã¯ {*CONTROLLER_VK_LB*} 㨠{*CONTROLLER_VK_RB*} を使ã„ã¾ã™ã€‚é“å…·ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¾ã—ょã†{*ToolsIcon*} + + + + 作るアイテムã®ã‚°ãƒ«ãƒ¼ãƒ—を切り替ãˆã‚‹ã«ã¯ {*CONTROLLER_VK_LB*} 㨠{*CONTROLLER_VK_RB*} を使ã„ã¾ã™ã€‚建物ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¾ã—ょã†{*StructuresIcon*} + + + + 作るアイテムを変ãˆã‚‹ã«ã¯ {*CONTROLLER_MENU_NAVIGATE*} を使ã„ã¾ã™ã€‚アイテムã«ã‚ˆã£ã¦ã¯ã€ä½¿ã†ææ–™ã«ã‚ˆã£ã¦ã€ã§ãる物ãŒå¤‰ã‚りã¾ã™ã€‚ãれã§ã¯æœ¨ã®ã‚·ãƒ£ãƒ™ãƒ«ã‚’é¸ã³ã¾ã—ょã†{*WoodenShovelIcon*} + + + + 工作ã«ã¯ã„ãã¤ã‚‚ã®å·¥ç¨‹ãŒã‚りã¾ã™ã€‚æœ¨ã®æ¿ãŒä½•æžšã‹æ‰‹å…ƒã«ã‚ã‚‹ã®ã§ã€ã•らã«ã„ã‚ã„ã‚ãªã‚¢ã‚¤ãƒ†ãƒ ã‚’作れã¾ã™ã€‚作るアイテム㯠{*CONTROLLER_MENU_NAVIGATE*} ã§å¤‰æ›´ã§ãã¾ã™ã€‚ãれã§ã¯ä½œæ¥­å°ã‚’é¸ã³ã¾ã—ょã†{*CraftingTableIcon*} + + + + é“å…·ãŒå®Œæˆã—ã¾ã—ãŸã€‚順調ã§ã™ã€‚ã“ã‚Œã§æ§˜ã€…ãªææ–™ã‚’ã•らã«åŠ¹çŽ‡ã‚ˆã集ã‚ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚{*B*} + 工作画é¢ã‚’é–‰ã˜ã‚‹ã«ã¯ {*CONTROLLER_VK_B*} を押ã—ã¦ãã ã•ã„ + + + + 一部ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ä½œæ¥­å°ã§ã¯ãªãã€ã‹ã¾ã©ã§ä½œã‚Šã¾ã™ã€‚ãれã§ã¯ã‹ã¾ã©ã‚’作りã¾ã—ょã†{*FurnaceIcon*} + + + + 完æˆã—ãŸã‹ã¾ã©ã‚’ゲームã®ä¸–界ã«ç½®ãã¾ã—ょã†ã€‚å°å±‹ã®ä¸­ã«ç½®ãã¨ã‚ˆã„ã‹ã‚‚ã—れã¾ã›ã‚“。{*B*} + 工作画é¢ã‚’é–‰ã˜ã‚‹ã«ã¯ {*CONTROLLER_VK_B*} を押ã—ã¦ãã ã•ã„ + + + + ã“れãŒã‹ã¾ã©ã®ç”»é¢ã§ã™ã€‚ã‹ã¾ã©ã‚’使ã£ã¦ã‚¢ã‚¤ãƒ†ãƒ ã«ç†±ã‚’加ãˆã‚‹ã“ã¨ã§ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’加工ã§ãã¾ã™ã€‚例ãˆã°ã€é‰„鉱石を鉄ã®å»¶ã¹æ£’ã«å¤‰ãˆã‚‹ã“ã¨ãŒã§ãã¾ã™ + + +{*B*} + ã‹ã¾ã©ã®èª¬æ˜Žã‚’ç¶šã‘ã‚‹: {*CONTROLLER_VK_A*}{*B*} + ã‹ã¾ã©ã®èª¬æ˜Žã‚’飛ã°ã™: {*CONTROLLER_VK_B*} + + + + ã‹ã¾ã©ã®ä¸‹ã«ç‡ƒæ–™ã‚’入れã€ä¸Šã«ã¯åŠ å·¥ã—ãŸã„アイテムを入れã¦ãã ã•ã„。ã™ã‚‹ã¨ã‹ã¾ã©ã«ç«ãŒå…¥ã‚Šã€åŠ å·¥ãŒå§‹ã¾ã‚Šã¾ã™ã€‚完æˆã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã¯å³ã®ã‚¹ãƒ­ãƒƒãƒˆã«å…¥ã‚Šã¾ã™ + + + + 木ã§ã§ãã¦ã„るアイテムã®å¤šããŒç‡ƒæ–™ã¨ã—ã¦ä½¿ãˆã¾ã™ãŒã€åŒæ™‚ã«é•ã†ç¨®é¡žã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’燃やã™ã“ã¨ã¯ã§ãã¾ã›ã‚“。ã•ã‚‰ã«æœ¨ä»¥å¤–ã«ã‚‚燃料ã¨ã—ã¦ä½¿ãˆã‚‹ã‚¢ã‚¤ãƒ†ãƒ ãŒã‚りã¾ã™ + + + + アイテムã®åŠ å·¥ãŒçµ‚ã‚ã‚‹ã¨ã€ãã®å®Œæˆã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’æŒã¡ç‰©ã¸ç§»å‹•ã§ãã¾ã™ã€‚æ§˜ã€…ãªææ–™ã‚’ä½¿ã£ã¦ã€ä½•ãŒå‡ºæ¥ä¸ŠãŒã‚‹ã®ã‹ã„ã‚ã„ã‚実験ã—ã¦ã¿ã¾ã—ょㆠ+ + + + æœ¨ã‚’ææ–™ã«ä½¿ã†ã¨ã€æœ¨ç‚­ãŒå‡ºæ¥ä¸ŠãŒã‚Šã¾ã™ã€‚ã‹ã¾ã©ã«ç‡ƒæ–™ã‚’å…¥ã‚Œã€ææ–™ã‚’å…¥ã‚Œã‚‹æ‰€ã«æœ¨ã‚’入れã¦ãã ã•ã„。木炭ãŒå‡ºæ¥ä¸ŠãŒã‚‹ã«ã¯å°‘ã—æ™‚é–“ãŒã‹ã‚‹ã®ã§ã€ãã®é–“ã¯ä»–ã®ã“ã¨ã‚’ã—ãªãŒã‚‰ã€æ™‚々進ã¿å…·åˆã‚’確ã‹ã‚ã«æˆ»ã£ã¦æ¥ã¾ã—ょㆠ+ + + + 木炭ã¯ç‡ƒæ–™ã¨ã—ã¦ä½¿ãˆã¾ã™ã€‚棒ã¨çµ„ã¿åˆã‚ã›ã‚‹ã¨ã€ãŸã„ã¾ã¤ã«ãªã‚Šã¾ã™ + + + + ææ–™ã‚’入れる所ã«ç ‚を入れるã¨ã€ã‚¬ãƒ©ã‚¹ã‚’作るã“ã¨ãŒã§ãã¾ã™ã€‚å°å±‹ã®çª“用ã«ã‚¬ãƒ©ã‚¹ã‚’作ã£ã¦ã¿ã¾ã—ょㆠ+ + + + ã“れãŒèª¿åˆã®ç”»é¢ã§ã™ã€‚ã•ã¾ã–ã¾ãªåŠ¹æžœã‚’ç™ºæ®ã™ã‚‹ãƒãƒ¼ã‚·ãƒ§ãƒ³ã‚’作るã“ã¨ãŒã§ãã¾ã™ + + +{*B*} + 調åˆå°ã®èª¬æ˜Žã‚’ç¶šã‘ã‚‹: {*CONTROLLER_VK_A*}{*B*} + 調åˆå°ã®èª¬æ˜Žã‚’飛ã°ã™: {*CONTROLLER_VK_B*} + + + + 調åˆã‚’行ã†ã«ã¯ã€ä¸Šã®æž ã«ææ–™ã‚’入れã€ä¸‹ã®æž ã«ãƒãƒ¼ã‚·ãƒ§ãƒ³ã¾ãŸã¯æ°´ã®ãƒ“ンを入れã¾ã™ (一度㫠3 ã¤ã¾ã§èª¿åˆå¯èƒ½)。正ã—ã„組ã¿åˆã‚ã›ã®ææ–™ãŒç½®ã‹ã‚Œã‚‹ã¨èª¿åˆãŒå§‹ã¾ã‚Šã€å°‘ã—å¾…ã¦ã°ãƒãƒ¼ã‚·ãƒ§ãƒ³ã®å‡ºæ¥ä¸ŠãŒã‚Šã§ã™ + + + + ãƒãƒ¼ã‚·ãƒ§ãƒ³ã®èª¿åˆã«ã¯ã¾ãšæ°´ã®ãƒ“ンãŒå¿…è¦ã§ã™ã€‚ã¾ãŸã€ã»ã¨ã‚“ã©ã®ãƒãƒ¼ã‚·ãƒ§ãƒ³ã¯æš—黒茸ã‹ã‚‰ä¸å®Œå…¨ãªãƒãƒ¼ã‚·ãƒ§ãƒ³ã‚’作るã¨ã“ã‚ã‹ã‚‰å§‹ã‚ã€å®Œæˆã•ã›ã‚‹ã«ã¯å°‘ãªãã¨ã‚‚ã‚㨠1 ç¨®é¡žã®ææ–™ã‚’å¿…è¦ã¨ã—ã¾ã™ + + + + ãƒãƒ¼ã‚·ãƒ§ãƒ³ã‚’作ã£ãŸã‚‰ã€ãã®åŠ¹æžœã‚’å¤‰ãˆã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚レッドストーンã®ç²‰ã‚’加ãˆã‚‹ã¨åŠ¹æžœã®æŒç¶šæ™‚é–“ãŒå»¶é•·ã•れã€å…‰çŸ³ã®ç²‰ã‚’加ãˆã‚‹ã¨åŠ¹æžœãŒã‚ˆã‚Šå¼·ããªã‚Šã¾ã™ + + + + 発酵ã—ãŸã‚¯ãƒ¢ã®ç›®ã‚’加ãˆã‚‹ã¨ã€ãƒãƒ¼ã‚·ãƒ§ãƒ³ãŒè…æ•—ã—ã¦åŠ¹æžœãŒå転ã—ã¾ã™ã€‚ã¾ãŸã€ç«è–¬ã‚’加ãˆã‚‹ã¨ãƒãƒ¼ã‚·ãƒ§ãƒ³ãŒã‚¹ãƒ—ラッシュãƒãƒ¼ã‚·ãƒ§ãƒ³ã«ãªã‚Šã€æŠ•ã’ã‚‹ã¨è½ã¡ãŸå ´æ‰€ã®å‘¨å›²ã«åŠ¹æžœã‚’ç™ºæ®ã™ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ + + + + 暗黒茸を水ã®ãƒ“ンã«åŠ ãˆã¦è€ç«ãƒãƒ¼ã‚·ãƒ§ãƒ³ã‚’作りã€ãれã‹ã‚‰ãƒžã‚°ãƒžã‚¯ãƒªãƒ¼ãƒ ã‚’è¶³ã—ã¦ã¿ã¾ã—ょㆠ+ + + + 調åˆç”»é¢ã‚’é–‰ã˜ã‚‹ã«ã¯ {*CONTROLLER_VK_B*} を押ã—ã¾ã™ + + + + ã“ã“ã«ã¯èª¿åˆå°ã€å¤§é‡œã¨èª¿åˆã«å¿…è¦ãªã‚¢ã‚¤ãƒ†ãƒ ãŒè©°ã¾ã£ãŸãƒã‚§ã‚¹ãƒˆãŒã‚りã¾ã™. + + +{*B*} + 調åˆã¨ãƒãƒ¼ã‚·ãƒ§ãƒ³ã®èª¬æ˜Žã‚’ç¶šã‘ã‚‹: {*CONTROLLER_VK_A*}{*B*} + 調åˆã¨ãƒãƒ¼ã‚·ãƒ§ãƒ³ã®èª¬æ˜Žã‚’飛ã°ã™: {*CONTROLLER_VK_B*} + + + + 調åˆã§ã¯ã€æœ€åˆã«æ°´ã®ãƒ“ンを作りã¾ã™ã€‚ãƒã‚§ã‚¹ãƒˆã‹ã‚‰ã‚¬ãƒ©ã‚¹ãƒ“ンを出ã—ã¾ã—ょㆠ+ + + + æ°´ã®å…¥ã£ãŸå¤§é‡œã‹æ°´ã®ãƒ–ロックã‹ã‚‰ã‚¬ãƒ©ã‚¹ãƒ“ãƒ³ã«æ°´ã‚’ç§»ã—ã¾ã™ã€‚æ°´æºã‚’クリックã—ã€{*CONTROLLER_ACTION_USE*} を押ã—ã¦ã‚¬ãƒ©ã‚¹ãƒ“ãƒ³ã«æ°´ã‚’è©°ã‚ã¦ãã ã•ã„ + + + + 大釜ãŒç©ºã«ãªã£ãŸã‚‰ã€æ°´ãƒã‚±ãƒ„を使ã£ã¦æ°´ã‚’溜ã‚ã¦ãã ã•ã„ + + + + 調åˆå°ã‚’使ã£ã¦è€ç«ãƒãƒ¼ã‚·ãƒ§ãƒ³ã‚’作りã¾ã—ょã†ã€‚æ°´ã®ãƒ“ãƒ³ã€æš—黒茸ã¨ãƒžã‚°ãƒžã‚¯ãƒªãƒ¼ãƒ ã‚’用æ„ã—ã¦ãã ã•ã„ + + + + ãƒãƒ¼ã‚·ãƒ§ãƒ³ã‚’使ã†ã«ã¯ã€ãƒãƒ¼ã‚·ãƒ§ãƒ³æ‰‹ã«æŒã£ã¦ {*CONTROLLER_ACTION_USE*} を押ã—ã¾ã™ã€‚普通ã®ãƒãƒ¼ã‚·ãƒ§ãƒ³ã¯é£²ã‚“ã§è‡ªåˆ†ã«åŠ¹æžœã‚’ç™ºæ®ã—ã¾ã™ã€‚スプラッシュãƒãƒ¼ã‚·ãƒ§ãƒ³ã®å ´åˆã¯ã€æŠ•ã’ã¦è½ã¡ãŸæ‰€ã®å‘¨å›²ã«ã„るクリーãƒãƒ£ãƒ¼ã«åŠ¹æžœã‚’ç™ºæ®ã—ã¾ã™ + スプラッシュãƒãƒ¼ã‚·ãƒ§ãƒ³ã¯æ™®é€šã®ãƒãƒ¼ã‚·ãƒ§ãƒ³ã«ç«è–¬ã‚’æ··ãœåˆã‚ã›ã‚‹ã¨ä½œã‚Œã¾ã™ + + + + è€ç«ãƒãƒ¼ã‚·ãƒ§ãƒ³ã‚’自分ã«ä½¿ã£ã¦ã¿ã¾ã—ょㆠ+ + + + ç«ã¨æº¶å²©ã«å¯¾ã™ã‚‹è€æ€§ãŒä¸ŠãŒã‚Šã¾ã—ãŸã€‚ã“れã¾ã§è¡Œã‘ãªã‹ã£ãŸå ´æ‰€ã«ã‚‚行ã‘ã‚‹ã®ã§è©¦ã—ã¦ã¿ã¾ã—ょㆠ+ + + + ã“れãŒã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã®ç”»é¢ã§ã™ã€‚武器や防具ã€ä¸€éƒ¨ã®é“å…·ã«ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã™ã‚‹ã“ã¨ã§ã€ç‰¹åˆ¥ãªãƒœãƒ¼ãƒŠã‚¹ã‚’付加ã§ãã¾ã™ + + +{*B*} + エンãƒãƒ£ãƒ³ãƒˆç”»é¢ã®èª¬æ˜Žã‚’ç¶šã‘ã‚‹: {*CONTROLLER_VK_A*}{*B*} + エンãƒãƒ£ãƒ³ãƒˆç”»é¢ã®èª¬æ˜Žã‚’飛ã°ã™: {*CONTROLLER_VK_B*} + + + + アイテムをエンãƒãƒ£ãƒ³ãƒˆã™ã‚‹ã«ã¯ã€ã¾ãšã‚¢ã‚¤ãƒ†ãƒ ã‚’エンãƒãƒ£ãƒ³ãƒˆã®æž ã«å…¥ã‚Œã¦ãã ã•ã„。武器や防具ã€ä¸€éƒ¨ã®é“å…·ã«ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã™ã‚‹ã“ã¨ã§ã€ãƒ€ãƒ¡ãƒ¼ã‚¸è€æ€§ã‚’上ã’ãŸã‚Šã€æŽ¡æŽ˜é‡ã‚’増やã—ãŸã‚Šãªã©ã®ç‰¹åˆ¥ãªãƒœãƒ¼ãƒŠã‚¹ã‚’付加ã§ãã¾ã™ + + + + エンãƒãƒ£ãƒ³ãƒˆã®æž ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’入れるã¨ã€å³å´ã®ãƒœã‚¿ãƒ³ã«ãƒ©ãƒ³ãƒ€ãƒ ãªã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆãŒè¡¨ç¤ºã•れã¾ã™ + + + + ボタンã«è¡¨ç¤ºã•れる数値ã¯ãã®ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã‚’行ã†ã®ã«å¿…è¦ãªçµŒé¨“値を表ã—ã¾ã™ã€‚経験値ãŒè¶³ã‚Šãªã„å ´åˆã€ä½¿ãˆãªã„ボタンã¯ç„¡åйã«ãªã‚Šã¾ã™ + + + + エンãƒãƒ£ãƒ³ãƒˆã‚’行ã†ã«ã¯ã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã‚’é¸ã‚“ã§ {*CONTROLLER_VK_A*} を押ã—ã¦ãã ã•ã„。エンãƒãƒ£ãƒ³ãƒˆã®ã‚³ã‚¹ãƒˆã«å¿œã˜ã¦çµŒé¨“値レベルãŒä¸‹ãŒã‚Šã¾ã™ + + + + エンãƒãƒ£ãƒ³ãƒˆã¯åŸºæœ¬çš„ã«ãƒ©ãƒ³ãƒ€ãƒ ã§ã™ãŒã€ä¸€éƒ¨ã®å¼·åŠ›ãªã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã¯çµŒé¨“値レベルãŒé«˜ãã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆãƒ†ãƒ¼ãƒ–ルã®å‘¨å›²ã«ãƒ†ãƒ¼ãƒ–ルを強化ã™ã‚‹æœ¬æ£šãŒãŸãã•ん設置ã•れã¦ã„ãªã„ã¨è¡¨ç¤ºã•れã¾ã›ã‚“ + + + + ã“ã“ã«ã¯ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆãƒ†ãƒ¼ãƒ–ルã¨ã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã«ã¤ã„ã¦å­¦ã¶ãŸã‚ã®ã„ãã¤ã‹ã®ã‚¢ã‚¤ãƒ†ãƒ ãŒã‚りã¾ã™ + + +{*B*} + エンãƒãƒ£ãƒ³ãƒˆã®èª¬æ˜Žã‚’ç¶šã‘ã‚‹ã«ã¯ {*CONTROLLER_VK_A*} を押ã—ã¦ãã ã•ã„。{*B*} + エンãƒãƒ£ãƒ³ãƒˆã®èª¬æ˜Žã‚’飛ã°ã™ã«ã¯ {*CONTROLLER_VK_B*} を押ã—ã¦ãã ã•ã„ + + + + エンãƒãƒ£ãƒ³ãƒˆãƒ†ãƒ¼ãƒ–ルを使ã†ã¨ã€æŽ¡æŽ˜é‡ã‚’増やã—ãŸã‚Šã€æ­¦å™¨ã‚„防具ã€ä¸€éƒ¨ã®é“å…·ã®ãƒ€ãƒ¡ãƒ¼ã‚¸è€æ€§ã‚’上ã’ãŸã‚Šãªã©ã®ç‰¹åˆ¥ãªãƒœãƒ¼ãƒŠã‚¹ã‚’付加ã§ãã¾ã™ + + + + エンãƒãƒ£ãƒ³ãƒˆãƒ†ãƒ¼ãƒ–ルã®å‘¨å›²ã«æœ¬æ£šã‚’ç½®ãã¨ã€ãƒ†ãƒ¼ãƒ–ルãŒå¼·åŒ–ã•れã¦ã‚ˆã‚Šé«˜ãƒ¬ãƒ™ãƒ«ã®ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆãŒã§ãるよã†ã«ãªã‚Šã¾ã™ + + + + エンãƒãƒ£ãƒ³ãƒˆã¯çµŒé¨“値を消費ã—ã¾ã™ã€‚経験値ã¯ã€ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ã‚„動物を倒ã—ãŸã‚Šã€æŽ¡æŽ˜ã—ãŸã‚Šã€å‹•ç‰©ã‚’ç¹æ®–ã•ã›ãŸã‚Šã€é‡£ã‚Šã‚’ã—ãŸã‚Šã€ã‹ã¾ã©ã‚’使ã£ãŸç²¾éŒ¬ã‚„æ–™ç†ãªã©ã§ç”Ÿæˆã•れる経験値オーブを集ã‚ã‚‹ã“ã¨ã§ã€è²¯ã¾ã£ã¦ã„ãã¾ã™ + + + + エンãƒãƒ£ãƒ³ãƒˆã®ãƒ“ンを使ã£ã¦çµŒé¨“値を貯ã‚ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚投ã’ã‚‹ã¨è½ã¡ãŸå ´æ‰€ã«çµŒé¨“値オーブãŒå‡ºç¾ã™ã‚‹ã®ã§ã€é›†ã‚ã¦çµŒé¨“値を貯ã‚ã¾ã—ょㆠ+ + + + ã“ã“ã«ã‚ã‚‹ãƒã‚§ã‚¹ãƒˆã«ã¯ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã•れãŸã‚¢ã‚¤ãƒ†ãƒ ã‚„ã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã®ãƒ“ンã®ã»ã‹ã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã‚’試ã—ã¦ã¿ã‚‹ã“ã¨ã®ã§ãるアイテムãŒã‚りã¾ã™ + + + + 今トロッコã«ä¹—ã£ã¦ã„ã¾ã™ã€‚トロッコã‹ã‚‰é™ã‚Šã‚‹ã«ã¯ã€ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’トロッコã«åˆã‚ã›ã¦ã‹ã‚‰ {*CONTROLLER_ACTION_USE*} を押ã—ã¦ãã ã•ã„{*MinecartIcon*} + + +{*B*} + トロッコã®èª¬æ˜Žã‚’ç¶šã‘ã‚‹: {*CONTROLLER_VK_A*}{*B*} + トロッコã®èª¬æ˜Žã‚’飛ã°ã™: {*CONTROLLER_VK_B*} + + + + トロッコã¯ãƒ¬ãƒ¼ãƒ«ã®ä¸Šã‚’走りã¾ã™ã€‚ã‹ã¾ã©ã‚’ä¹—ã›ãŸå‹•力ã¤ãã®ãƒˆãƒ­ãƒƒã‚³ã‚„ã€ãƒã‚§ã‚¹ãƒˆãŒã¤ã„ãŸãƒˆãƒ­ãƒƒã‚³ã‚’作るã“ã¨ã‚‚ã§ãã¾ã™ + {*RailIcon*} + + + + トロッコã®ã‚¹ãƒ”ードを上ã’ã‚‹ãŸã‚ã«ã€ãƒ¬ãƒƒãƒ‰ã‚¹ãƒˆãƒ¼ãƒ³ã®ãŸã„ã¾ã¤ã‚„回路ã‹ã‚‰å‹•力を得る加速用レールを作るã“ã¨ãŒã§ãã¾ã™ã€‚ã“れã¯ã‚¹ã‚¤ãƒƒãƒã‚„レãƒãƒ¼ã€é‡é‡æ„ŸçŸ¥æ¿ãªã©ã‚’組ã¿åˆã‚ã›ãŸã€è¤‡é›‘ãªè£…ç½®ã«ãªã‚Šã¾ã™ + {*PoweredRailIcon*} + + + + 今ボートã«ä¹—ã£ã¦ã„ã¾ã™ã€‚ボートã‹ã‚‰é™ã‚Šã‚‹ã«ã¯ã€ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’ボートã«åˆã‚ã›ã¦ã‹ã‚‰ {*CONTROLLER_ACTION_USE*} を押ã—ã¦ãã ã•ã„{*BoatIcon*} + + + + {*B*} + ボートã®èª¬æ˜Žã‚’ç¶šã‘ã‚‹: {*CONTROLLER_VK_A*}{*B*} + ボートã®èª¬æ˜Žã‚’飛ã°ã™: {*CONTROLLER_VK_B*} + + + + ボートを使ãˆã°ã€æ°´ä¸Šã‚’速ã移動ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚舵をå–ã‚‹ã«ã¯ {*CONTROLLER_ACTION_MOVE*} 㨠{*CONTROLLER_ACTION_LOOK*} を使ã„ã¾ã™ + {*BoatIcon*} + + + + 釣り竿を手ã«ã—ã¾ã—ãŸã€‚使ã†ã«ã¯ {*CONTROLLER_ACTION_USE*} を押ã—ã¾ã™{*FishingRodIcon*} + + + + {*B*} + 魚釣りã®èª¬æ˜Žã‚’ç¶šã‘ã‚‹: {*CONTROLLER_VK_A*}{*B*} + 魚釣りã®èª¬æ˜Žã‚’飛ã°ã™: {*CONTROLLER_VK_B*} + + + + 釣りを始ã‚ã‚‹ã«ã¯ {*CONTROLLER_ACTION_USE*} を押ã—ã¾ã™ã€‚リールを巻ã上ã’ã‚‹ã¨ãã‚‚ {*CONTROLLER_ACTION_USE*} を押ã—ã¦ãã ã•ã„ + {*FishingRodIcon*} + + + + æ°´ã®è¡¨é¢ã«ã‚ã‚‹æµ®ããŒæ²ˆã‚€ã¾ã§å¾…ã£ã¦ã‹ã‚‰ã€é‡£ã‚Šç³¸ã‚’å·»ã上ã’ã¦é­šã‚’釣り上ã’ã¾ã™ã€‚é­šã¯ç”Ÿã§ã‚‚食ã¹ã‚‰ã‚Œã¾ã™ã—ã€ã‹ã¾ã©ã§èª¿ç†ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚食ã¹ã‚‹ã¨ HP ãŒå›žå¾©ã—ã¾ã™ + {*FishIcon*} + + + + 釣り竿㯠様々ãªé“å…·ã¨çµ„ã¿åˆã‚ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ãŒã€ãã®ç”¨é€”ã¯æ¯”較的é™ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚ã—ã‹ã—魚を釣る以外ã®ã“ã¨ã‚‚ã§ãã¾ã™ã€‚釣り竿を使ã£ã¦ä»–ã«ä½•ãŒé‡£ã‚Œã‚‹ã®ã‹ã€ã©ã‚“ãªã“ã¨ãŒã§ãã‚‹ã®ã‹ã€ã„ã‚ã„ã‚試ã—ã¦ã¿ã¾ã—ょㆠ+ {*FishingRodIcon*} + + + + ã“れãŒãƒ™ãƒƒãƒ‰ã§ã™ã€‚夜ã«ãªã£ã¦ã‹ã‚‰ãƒ™ãƒƒãƒ‰ã«ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’当ã¦ã¦ {*CONTROLLER_ACTION_USE*} を押ã™ã¨ã€æœã¾ã§çœ ã‚‹ã“ã¨ãŒã§ãã¾ã™{*ICON*}355{*/ICON*} + + + + {*B*} + ベッドã®èª¬æ˜Žã‚’ç¶šã‘ã‚‹: {*CONTROLLER_VK_A*}{*B*} + ベッドã®èª¬æ˜Žã‚’飛ã°ã™: {*CONTROLLER_VK_B*} + + + + ベッドã¯å®‰å…¨ã§æ˜Žã‚‹ã„場所ã«ç½®ã‹ãªã„ã¨ã„ã‘ã¾ã›ã‚“。ã•ã‚‚ãªã„ã¨ã€å¤œä¸­ã«ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ã«è¥²ã‚れã¦ã—ã¾ã„ã¾ã™ã€‚ベッドã§çœ ã‚‹ã¨ã€æ¬¡ã®åЛ尽ããŸæ™‚ã®å¾©æ´»åœ°ç‚¹ãŒã€ãã®ãƒ™ãƒƒãƒ‰ã«å¤‰æ›´ã•れã¾ã™ + {*ICON*}355{*/ICON*} + + + + ゲーム内ã«ä»–ã®ãƒ—レイヤーãŒã„ã‚‹å ´åˆã€çœ ã‚‹ãŸã‚ã«ã¯å…¨å“¡ãŒåŒæ™‚ã«ãƒ™ãƒƒãƒ‰ã«å…¥ã£ã¦ã„ãªã‘れã°ãªã‚Šã¾ã›ã‚“ + {*ICON*}355{*/ICON*} + + + + ã“ã®ã‚¨ãƒªã‚¢ã«ã¯ã€ãƒ¬ãƒƒãƒ‰ã‚¹ãƒˆãƒ¼ãƒ³ã¨ãƒ”ストンã®å›žè·¯ã€å›žè·¯ã«ä½¿ã†ã‚¢ã‚¤ãƒ†ãƒ ã®å…¥ã£ãŸãƒã‚§ã‚¹ãƒˆãŒã‚りã¾ã™ + + + + {*B*} + レッドストーン回路ã¨ãƒ”ストンã®èª¬æ˜Žã‚’ç¶šã‘ã‚‹: {*CONTROLLER_VK_A*}{*B*} + レッドストーン回路ã¨ãƒ”ストンã®èª¬æ˜Žã‚’飛ã°ã™: {*CONTROLLER_VK_B*} + + + + レãƒãƒ¼ã€ãƒœã‚¿ãƒ³ã€é‡é‡æ„ŸçŸ¥ç‰ˆã€ãƒ¬ãƒƒãƒ‰ã‚¹ãƒˆãƒ¼ãƒ³ã®ãŸã„ã¾ã¤ã¯ã€èµ·å‹•ã—ãŸã„アイテムã«ç›´æŽ¥ã¨ã‚Šã¤ã‘ãŸã‚Šã€ãƒ¬ãƒƒãƒ‰ã‚¹ãƒˆãƒ¼ãƒ³ã®ç²‰ã§ã¤ãªã’ã‚‹ã“ã¨ã§ã€é›»æ°—ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã™ + + + + é›»æ°—ã®æºã‚’é…ç½®ã™ã‚‹ä½ç½®ã‚„å‘ãã§ã€å‘¨å›²ã®ãƒ–ロックã¸ã®åŠ¹æžœãŒå¤‰ã‚りã¾ã™ã€‚ãŸã¨ãˆã°ã€ãƒ–ロックã«è¨­ç½®ã•れãŸãƒ¬ãƒƒãƒ‰ã‚¹ãƒˆãƒ¼ãƒ³ã®ãŸã„ã¾ã¤ã¯ã€ãã®ãƒ–ロックã«é›»æ°—ãŒé€ã‚‰ã‚Œã‚‹ã¨æ¶ˆãˆã¾ã™ + + + + レッドストーンã®ç²‰ã¯ã€é‰„ã€ãƒ€ã‚¤ãƒ¤ãƒ¢ãƒ³ãƒ‰ã€é‡‘ã®ãƒ„ルãƒã‚·ã§ãƒ¬ãƒƒãƒ‰ã‚¹ãƒˆãƒ¼ãƒ³é‰±çŸ³ã‚’æŽ˜ã‚‹ã¨æ‰‹ã«å…¥ã‚Šã¾ã™ã€‚レッドストーンã®ç²‰ã‚’ブロックã«ç½®ã„ã¦ã¤ãªã’ã‚‹ã“ã¨ã§ã€é›»æ°—ã‚’ä¼ãˆã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãŸã ã—ã€ä¼ãˆã‚‰ã‚Œã‚‹ã®ã¯è·é›¢ã«ã—㦠15 ブロック分ã€é«˜ã•æ–¹å‘ã®ç§»å‹•㯠1 ブロックã¾ã§ã¨ãªã‚Šã¾ã™ + {*ICON*}331{*/ICON*} + + + + レッドストーンå復装置ã¯é›»æ°—ã®å±Šãè·é›¢ã‚’伸ã°ã—ãŸã‚Šã€å›žè·¯ã‚’é…å»¶ã•ã›ãŸã‚Šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ + {*ICON*}356{*/ICON*} + + + + ピストンã¯é›»æ°—ãŒé€ã‚‰ã‚Œã‚‹ã¨ä¼¸ã³ã¦ã€æœ€å¤§ 12 個ã®ãƒ–ロックを押ã—ã¾ã™ã€‚å¸ç€ãƒ”ストンã§ã‚れã°ã€æˆ»ã‚‹ã¨ãã«ä¸€éƒ¨ã®ç‰¹æ®Šãªãƒ–ロックを除ã„ã¦ãƒ–ロックを 1 ã¤å¼•ã寄ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ + {*ICON*}33{*/ICON*} + + + + ã“ã®ã‚¨ãƒªã‚¢ã«ã¯ã€ãƒ”ストン付ãã®å›žè·¯ã‚’作るãŸã‚ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’入れãŸãƒã‚§ã‚¹ãƒˆãŒã‚りã¾ã™ã€‚ã™ã§ã«ã‚る回路を改造ã—ãŸã‚Šã€1 ã‹ã‚‰å›žè·¯ã‚’作æˆã—ãŸã‚Šã—ã¦ã¿ã¦ãã ã•ã„。ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ« エリアã®å¤–ã«ã¯ã€ã•らã«å¤šãã®è¦‹æœ¬ãŒã‚りã¾ã™ + + + + ã“ã®ã‚¨ãƒªã‚¢ã«ã¯ã€æš—黒界ã¸ã®ãƒãƒ¼ã‚¿ãƒ«ãŒå­˜åœ¨ã—ã¾ã™! + + + + {*B*} + ãƒãƒ¼ã‚¿ãƒ«ã¨æš—黒界ã®èª¬æ˜Žã‚’ç¶šã‘ã‚‹: {*CONTROLLER_VK_A*}{*B*} + ãƒãƒ¼ã‚¿ãƒ«ã¨æš—黒界ã®èª¬æ˜Žã‚’飛ã°ã™: {*CONTROLLER_VK_B*} + + + + ãƒãƒ¼ã‚¿ãƒ«ã¯ã€é»’曜石ã®ãƒ–ãƒ­ãƒƒã‚¯ã§æ¨ª 4 ブロックã€ç¸¦ 5 ãƒ–ãƒ­ãƒƒã‚¯ã®æž ã‚’作æˆã™ã‚‹ã“ã¨ã§å®Œæˆã—ã¾ã™ã€‚è§’ã®ãƒ–ロックã¯å¿…è¦ã‚りã¾ã›ã‚“。 + + + + ãƒãƒ¼ã‚¿ãƒ«ã‚’èµ·å‹•ã™ã‚‹ã«ã¯ã€ç«æ‰“çŸ³ã¨æ‰“ã¡é‡‘ã§ã€ãƒ•レーム内ã®é»’曜石ã«ç«ã‚’ã¤ã‘ã¾ã—ょã†ã€‚æž ãŒå£Šã‚ŒãŸã‚Šã€è¿‘ãã§çˆ†ç™ºãŒèµ·ããŸã‚Šã€æ¶²ä½“ã‚’æµã—ãŸã‚Šã™ã‚‹ã¨ã€ãƒãƒ¼ã‚¿ãƒ«ã¯åœæ­¢ã—ã¾ã™ + + + + ãƒãƒ¼ã‚¿ãƒ«ã‚’使用ã™ã‚‹ã«ã¯ã€ãƒãƒ¼ã‚¿ãƒ«ã®ä¸­ã«ç«‹ã¡ã¾ã—ょã†ã€‚ç”»é¢ãŒç´«è‰²ã«å¤‰ã‚りã€éŸ³ãŒã—å§‹ã‚ã€ã—ã°ã‚‰ãã™ã‚‹ã¨ã€åˆ¥ä¸–界ã¸ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§ãã¾ã™ + + + + 暗黒界ã¯ã‚ã¡ã“ã¡ã§æº¶å²©ãŒå™´ã出ã™å±é™ºãªå ´æ‰€ã§ã™ãŒã€æš—黒石や光石を手ã«å…¥ã‚Œã‚‹ã«ã¯æœ€é©ãªå ´æ‰€ã§ã™ã€‚暗黒石ã¯ç«ã‚’ã¤ã‘ã‚‹ã¨ã€æ¶ˆãˆã‚‹ã“ã¨ãªã燃ãˆç¶šã‘ã€å…‰çŸ³ã¯ã€å…‰ã‚’発生ã•ã›ã¾ã™ + + + + 暗黒界をã†ã¾ã利用ã—ã¦åœ°ä¸Šç•Œã‚’高速移動ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚暗黒界ã§ã® 1 ブロックã®è·é›¢ã¯ã€åœ°ä¸Šç•Œã§ã® 3 ブロックã«ç›¸å½“ã—ã¾ã™ + + + + クリエイティブ モードã«ãªã‚Šã¾ã—㟠+ + + + {*B*} + クリエイティブ モードã®èª¬æ˜Žã‚’ç¶šã‘ã‚‹: {*CONTROLLER_VK_A*}{*B*} + クリエイティブ モードã®èª¬æ˜Žã‚’飛ã°ã™: {*CONTROLLER_VK_B*} + + +クリエイティブ モードã§ã¯ã»ã¨ã‚“ã©ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚„ブロックãŒç„¡é™ã«ä½¿ãˆã¾ã™ã€‚ã¾ãŸã€é“å…·ãŒãªãã¦ã‚‚ 1 回クリックã™ã‚‹ã ã‘ã§ãƒ–ロックãŒç ´å£Šã§ãã‚‹ã»ã‹ã€æ”»æ’ƒã•れã¦ã‚‚ダメージをå—ã‘ãªããªã‚Šã€é£›è¡Œã‚‚å¯èƒ½ã§ã™ + +{*CONTROLLER_ACTION_JUMP*} ã‚’ã™ã°ã‚„ã 2 回押ã™ã¨é£›è¡Œã§ãã¾ã™ã€‚飛行をやã‚ã‚‹ã«ã¯ã€åŒã˜æ“作をもã†ä¸€åº¦è¡Œã„ã¾ã™ã€‚より速ã飛ã¶ã«ã¯ã€é£›è¡Œä¸­ã« {*CONTROLLER_ACTION_MOVE*} ã‚’å‰æ–¹å‘ã«ã™ã°ã‚„ã 2 回押ã—ã¾ã™ã€‚ +飛行モードã§ã¯ã€{*CONTROLLER_ACTION_JUMP*} ã§ä¸Šæ˜‡ã€{*CONTROLLER_ACTION_SNEAK*} ã§ä¸‹é™ã§ãã¾ã™ã€‚ã¾ãŸã¯ã€æ–¹å‘パッドã§ä¸Šä¸‹å·¦å³ã«é£›ã³ã¾ã—ょㆠ+ +クリエイティブ ãƒ¢ãƒ¼ãƒ‰ã®æŒã¡ç‰©ã‚’é–‹ãã«ã¯ {*CONTROLLER_ACTION_CRAFTING*} を押ã—ã¦ãã ã•ã„ + +ç¶šã‘ã‚‹ã«ã¯ç©´ã®å対å´ã¸ç§»å‹•ã—ã¦ãã ã•ã„ + +クリエイティブ モードã®ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã‚’完了ã—ã¾ã—㟠+ + + ã“ã®ã‚¨ãƒªã‚¢ã«ã¯ã€ç•‘ãŒã‚りã¾ã™ã€‚ç•‘ã§ã¯ã€é£Ÿã¹ç‰©ãªã©ã®ç¹°ã‚Šè¿”ã—生産ã§ãる資æºã‚’作り出ã™ã“ã¨ãŒã§ãã¾ã™ + + + + {*B*} + 農作業ã®èª¬æ˜Žã‚’ç¶šã‘ã‚‹: {*CONTROLLER_VK_A*}{*B*} + 農作業ã®èª¬æ˜Žã‚’飛ã°ã™: {*CONTROLLER_VK_B*} + + +å°éº¦ã€ã‚«ãƒœãƒãƒ£ã€ã‚¹ã‚¤ã‚«ã¯ã€ç¨®ã‹ã‚‰è‚²ã¦ã¾ã™ã€‚å°éº¦ã®ç¨®ã¯ã€èƒŒã®é«˜ã„è‰ã‚’切ã£ãŸã‚Šã€å°éº¦ã‚’栽培ã™ã‚‹ã“ã¨ã§æ‰‹ã«å…¥ã‚Œã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚カボãƒãƒ£ã®ç¨®ã‚„スイカã®ç¨®ã¯ã€ãれãžã‚Œã€ã‚«ãƒœãƒãƒ£ã‚„スイカã‹ã‚‰å…¥æ‰‹ã—ã¾ã™ + +種をã¾ãå‰ã«ã€ãã‚ã‚’ã¤ã‹ã£ã¦åœŸã®ãƒ–ロックを耕地ã«å¤‰ãˆã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚è¿‘ãã«æ°´æºã‚„å…‰æºãŒã‚りã€ååˆ†ãªæ°´ã¨å…‰ãŒä¾›çµ¦ã•れã¦ã„ã‚‹ã¨ä½œç‰©ãŒæ—©ãæˆé•·ã—ã¾ã™ + +å°éº¦ã¯ä½•段階ã‹ã«å¤‰åŒ–ã—ãªãŒã‚‰æˆé•·ã—ã¦ã„ãã€è‰²ãŒæ¿ƒããªã‚‹ã¨åŽç©«ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚{*ICON*}59:7{*/ICON*} + +カボãƒãƒ£ã¨ã‚¹ã‚¤ã‚«ã®å ´åˆã¯ã€èŒŽãŒå¤ªããªã£ã¦ããŸã‚‰ã€ç¨®ã‚’ã¾ã„ãŸå ´æ‰€ã®éš£ã«å®ŸãŒã§ãã‚‹ãŸã‚ã®ãƒ–ロックãŒå¿…è¦ã«ãªã‚Šã¾ã™ + +サトウキビã¯ã€æ°´ãƒ–ロックã¨éš£æŽ¥ã™ã‚‹ã€è‰ã€åœŸã€ç ‚ã®ãƒ–ãƒ­ãƒƒã‚¯ã«æ¤ãˆã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ã¾ãŸã€ã‚µãƒˆã‚¦ã‚­ãƒ“ã®ãƒ–ロックã¯ä¸­ã»ã©ã‚’åŽç©«ã™ã‚‹ã¨ã€ä¸Šã«ã‚るブロックもã™ã¹ã¦åŽç©«ã•れã¾ã™ã€‚{*ICON*}83{*/ICON*} + +サボテンã¯ç ‚ã«æ¤ãˆã‚‹å¿…è¦ãŒã‚ã‚Šã€æˆé•·ã™ã‚‹ã¨ 3 ブロックã®é«˜ã•ã«ãªã‚Šã¾ã™ã€‚サトウキビã¨åŒæ§˜ã€ä¸‹ã®ãƒ–ロックをåŽç©«ã™ã‚‹ã¨ã€ä¸Šã«ã‚るブロックもã™ã¹ã¦åŽç©«ã§ãã¾ã™ã€‚{*ICON*}81{*/ICON*} + +ãã®ã“ã¯è–„æš—ã„ã‚¨ãƒªã‚¢ã«æ¤ãˆã¾ã—ょã†ã€‚隣接ã™ã‚‹è–„æš—ã„ブロックã«åºƒãŒã£ã¦ã„ãã¾ã™ã€‚{*ICON*}39{*/ICON*} + +骨粉ã¯ä½œç‰©ã‚’最大ã¾ã§æˆé•·ã•ã›ãŸã‚Šã€ãã®ã“を巨大ãªãã®ã“ã«æˆé•·ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚{*ICON*}351:15{*/ICON*} + +農作業ã®ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã‚’完了ã—ã¾ã—㟠+ + + ã“ã®ã‚¨ãƒªã‚¢ã§ã¯å‹•物ãŒé£¼è‚²ã•れã¦ã„ã¾ã™ã€‚動物を飼育ã—ã¦å­ä¾›ã‚’増やã™ã“ã¨ãŒã§ãã¾ã™ + + + + {*B*} + 動物ã®ç¹æ®–ã®èª¬æ˜Žã‚’ç¶šã‘ã‚‹ã«ã¯ {*CONTROLLER_VK_A*} を押ã—ã¦ãã ã•ã„。{*B*} + 動物ã®ç¹æ®–ã®èª¬æ˜Žã‚’飛ã°ã™ã«ã¯ {*CONTROLLER_VK_B*} を押ã—ã¦ãã ã•ã„ + + +å‹•ç‰©ã‚’ç¹æ®–ã•ã›ã‚‹ã«ã¯ã€å‹•物ã«ã‚ã£ãŸé¤Œã‚’与ãˆã¦ã€å‹•物ãŸã¡ã‚’「求愛モードã€ã«ã—ã¦ã‚„ã‚‹å¿…è¦ãŒã‚りã¾ã™ + +牛ã€Mooshroomã€ç¾Šã«ã¯å°éº¦ã‚’ã€è±šã«ã¯ãƒ‹ãƒ³ã‚¸ãƒ³ã‚’ã€ãƒ‹ãƒ¯ãƒˆãƒªã«ã¯å°éº¦ã®ç¨®ã¾ãŸã¯æš—黒茸ã€ã‚ªã‚ªã‚«ãƒŸã«ã¯è‚‰ã‚’与ãˆã¾ã—ょã†ã€‚ã™ã‚‹ã¨ã€è¿‘ãã«ã„る求愛モードã®ä»²é–“を探ã—å§‹ã‚ã¾ã™ + +ã¨ã‚‚ã«æ±‚愛モードã®åŒç¨®ã®å‹•物ãŒå‡ºä¼šã†ã¨ã€å°‘ã—ã®é–“キスをã—ã¦ã€å‹•物ã®èµ¤ã¡ã‚ƒã‚“ãŒèª•生ã—ã¾ã™ã€‚赤ã¡ã‚ƒã‚“ã¯ã€æˆé•·ã™ã‚‹ã¾ã§ã¯ã€ä¸¡è¦ªã®å¾Œã‚ã‚’ã¤ã„ã¦å›žã‚Šã¾ã™ + +一度求愛モードã«ãªã£ãŸå‹•物ã¯ã€5 分間ã¯å†ã³æ±‚愛モードã«ãªã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“ + +手ã«é£Ÿã¹ç‰©ã‚’æŒã£ã¦ã„ã‚‹ã¨ã€ã‚ãªãŸã®å¾Œã‚ã‚’ã¤ã„ã¦ãる動物もã„ã¾ã™ã€‚ã“ã®ç¿’性を利用ã™ã‚Œã°ã€ç°¡å˜ã«å‹•ç‰©ã‚’ä¸€ã‹æ‰€ã«é›†ã‚ã“ã¨ãŒã§ãã‚‹ã§ã—ょã†{*ICON*}296{*/ICON*} + + + 野生ã®ã‚ªã‚ªã‚«ãƒŸã¯ã€éª¨ã‚’与ãˆã‚Œã°é£¼ã„慣らã™ã“ã¨ãŒã§ãã¾ã™ã€‚é£¼ã„æ…£ã‚‰ã™ã¨ã€ãã®ã‚ªã‚ªã‚«ãƒŸã®å‘¨ã‚Šã«ãƒãƒ¼ãƒˆãŒè¡¨ç¤ºã•れã¾ã™ã€‚é£¼ã„æ…£ã‚‰ã—ãŸã‚ªã‚ªã‚«ãƒŸã¯ã€ŒãŠåº§ã‚Šã€ã®å‘½ä»¤ã‚’下ã•ãªã„é™ã‚Šã€ãƒ—レイヤーã®å¾Œã‚’付ã„ã¦å±é™ºã‹ã‚‰å®ˆã£ã¦ãれã¾ã™ + + +動物ã¨ç¹æ®–ã®ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã‚’完了ã—ã¾ã—㟠+ + + ã“ã®ã‚¨ãƒªã‚¢ã«ã¯ã€ã‚¹ãƒŽãƒ¼ ゴーレムやアイアン ゴーレムを作るãŸã‚ã®ã‚«ãƒœãƒãƒ£ã‚„ブロックãŒã‚りã¾ã™ + + + + {*B*} + ゴーレムã®èª¬æ˜Žã‚’ç¶šã‘ã‚‹{*CONTROLLER_VK_A*}{*B*} + ゴーレムã®èª¬æ˜Žã‚’飛ã°ã™{*CONTROLLER_VK_B*} + + +ゴーレムã¯ã€é‡ã­ãŸãƒ–ロックã®ä¸€ç•ªä¸Šã«ã‚«ãƒœãƒãƒ£ã‚’ãŠã„ã¦å®Œæˆã—ã¾ã™ + +スノー ゴーレムã¯ã€é›ªãƒ–ロックを 2 ã¤é‡ã­ã€ãã®ä¸Šã«ã‚«ãƒœãƒãƒ£ã‚’ã®ã›ã¦å®Œæˆã—ã¾ã™ã€‚作ã£ãŸäººã®æ•µã«ã€é›ªçŽ‰ã‚’æŠ•ã’ã¾ã™ + +アイアン ゴーレムã¯ã€é‰„ã®ãƒ–ロック 4 ã¤ã‚’ T å­—ã«ä¸¦ã¹ã€ä¸­å¤®ã«ã‚«ãƒœãƒãƒ£ã‚’ã®ã›ã¦å®Œæˆã—ã¾ã™ã€‚作ã£ãŸäººã®æ•µã‚’攻撃ã—ã¾ã™ + +アイアン ã‚´ãƒ¼ãƒ¬ãƒ ã¯æ‘ã«è‡ªç„¶ã«ç¾ã‚Œã¦æ‘人を守るã“ã¨ã‚‚ã‚りã¾ã™ã€‚æ‘人を攻撃ã™ã‚‹ã¨ã€ã“ã®ã‚¢ã‚¤ã‚¢ãƒ³ ゴーレムãŒåæ’ƒã—ã¾ã™ + +ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã‚’終ãˆã‚‹ã¾ã§ã€ã“ã®ã‚¨ãƒªã‚¢ã‹ã‚‰å‡ºã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ + +ææ–™ã”ã¨ã«é©ã—ãŸé“å…·ãŒã‚りã¾ã™ã€‚土や砂ãªã©ã®æŸ”らã‹ã„ã‚‚ã®ã‚’掘る場åˆã¯ã‚·ãƒ£ãƒ™ãƒ«ã‚’使ã†ã®ãŒã‚ˆã„ã§ã—ょㆠ+ +ææ–™ã”ã¨ã«é©ã—ãŸé“å…·ãŒã‚りã¾ã™ã€‚木ã®å¹¹ã‚’切り出ã™å ´åˆã¯æ–§ã‚’使ã†ã®ãŒã‚ˆã„ã§ã—ょㆠ+ +ææ–™ã”ã¨ã«é©ã—ãŸé“å…·ãŒã‚りã¾ã™ã€‚石や鉱石を掘り出ã™å ´åˆã¯ãƒ„ルãƒã‚·ã‚’使ã†ã®ãŒã‚ˆã„ã§ã—ょã†ã€‚特定ã®ç¨®é¡žã®ãƒ–ロックを掘るãŸã‚ã«ã¯ã€ã•らã«å„ªã‚ŒãŸææ–™ã‚’使ã£ã¦ãƒ„ルãƒã‚·ã‚’作る必è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“ + +特定ã®é“å…·ã¯æ•µã‚’攻撃ã™ã‚‹ã®ã«å‘ã„ã¦ã„ã¾ã™ã€‚剣を使ã†ã¨è‰¯ã„ã§ã—ょㆠ+ +ヒント: æ‰‹ã‚„ã€æ‰‹ã«æŒã£ã¦ã„るアイテムを使ã£ã¦ã€æŽ˜ã£ãŸã‚Šåˆ‡ã£ãŸã‚Šã™ã‚‹ã«ã¯ã€{*CONTROLLER_ACTION_ACTION*} を押ã—ç¶šã‘ã¾ã™ã€‚é“具を作らãªã„ã¨ã€æŽ˜ã‚Œãªã„ブロックもã‚りã¾ã™ + +é“å…·ã¯ä½¿ã£ã¦ã„ã‚‹ã¨ã€å°‘ã—ãšã¤å£Šã‚Œã¦ã„ãã¾ã™ã€‚使ã†ãŸã³ã«å°‘ã—ãšã¤æå‚·ã—ã¦ã„ãã€æœ€å¾Œã¯å®Œå…¨ã«å£Šã‚Œã¾ã™ã€‚アイテムã®ä¸‹ã«ã‚るゲージã§ã€ç¾åœ¨ã®çŠ¶æ…‹ãŒåˆ†ã‹ã‚Šã¾ã™ + +上ã«å‘ã‹ã£ã¦æ³³ãã«ã¯ {*CONTROLLER_ACTION_JUMP*} を押ã—ç¶šã‘ã¾ã™ + +ã“ã®ã‚¨ãƒªã‚¢ã§ã¯ãƒ¬ãƒ¼ãƒ«ã®ä¸Šã‚’トロッコãŒèµ°ã£ã¦ã„ã¾ã™ã€‚トロッコã«ä¹—ã‚‹ã«ã¯ã€ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’トロッコã«åˆã‚ã›ã¦ {*CONTROLLER_ACTION_USE*} を押ã—ã¾ã™ã€‚トロッコを動ã‹ã™ã«ã¯ã€ãƒœã‚¿ãƒ³ã«ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’åˆã‚ã›ã¦ {*CONTROLLER_ACTION_USE*} を押ã—ã¾ã—ょㆠ+ +å·ã®ãã°ã«ã‚ã‚‹ãƒã‚§ã‚¹ãƒˆã®ä¸­ã«ã€ãƒœãƒ¼ãƒˆãŒå…¥ã£ã¦ã„ã¾ã™ã€‚ボートを使ã†ã«ã¯ã€ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’æ°´ã«åˆã‚ã›ã¦ {*CONTROLLER_ACTION_USE*} を押ã—ã¾ã™ã€‚ボートã«ä¹—ã‚‹ã«ã¯ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’ボートã«åˆã‚ã›ã¦ {*CONTROLLER_ACTION_USE*} を押ã—ã¾ã—ょㆠ+ +æ± ã®ãã°ã«ã‚ã‚‹ãƒã‚§ã‚¹ãƒˆã®ä¸­ã«ã€é‡£ã‚Šç«¿ãŒå…¥ã£ã¦ã„ã¾ã™ã€‚使ã†ã«ã¯ã€ãƒã‚§ã‚¹ãƒˆã‹ã‚‰é‡£ã‚Šç«¿ã‚’出ã—ã¦ã‹ã‚‰ã€æ‰‹ã«æŒã£ã¦ä½¿ã†ã‚¢ã‚¤ãƒ†ãƒ ã«é¸ã‚“ã§ãã ã•ã„ + +ã“ã®ãƒ”ストン装置ã¯ã€è‡ªå‹•建設ã•れる橋ã§ã™ã€‚ボタンを押ã—ã¦ã€è£…ç½®ã®å‹•ãを調ã¹ã¦ã¿ã¾ã—ょㆠ+ +ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ãŸçŠ¶æ…‹ã§ã€æŒã¡ç‰©ç”»é¢ã®å¤–ã¸ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’å‹•ã‹ã™ã¨ã€ã‚¢ã‚¤ãƒ†ãƒ ã‚’è½ã¨ã™ã“ã¨ãŒã§ãã¾ã™ + +ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’作るãŸã‚ã«å¿…è¦ãªææ–™ãŒæƒã£ã¦ã„ã¾ã›ã‚“。左下ã«ã‚るボックスã®ä¸­ã«è¡¨ç¤ºã•れã¦ã„ã‚‹ã®ãŒã€å¿…è¦ãªææ–™ã§ã™ + + + ãŠã‚ã§ã¨ã†ã”ã–ã„ã¾ã™! ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã¯ã“れã§ã™ã¹ã¦å®Œäº†ã§ã™ã€‚ã‚²ãƒ¼ãƒ å†…ã®æ™‚é–“ã®æµã‚Œã¯ã“れã‹ã‚‰æ™®é€šã«æˆ»ã‚Šã¾ã™ã€‚å¤œãŒæ¥ã¦ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ãŒç¾ã‚Œã‚‹ã¾ã§ã€ã‚ã¾ã‚Šæ™‚é–“ãŒã‚りã¾ã›ã‚“。早ã安全ãªå ´æ‰€ã‚’作りã¾ã—ょã†! + + +{*EXIT_PICTURE*} ã‚‚ã£ã¨å†’険を続ã‘ãŸã„? ãれãªã‚‰ã€é‰±å±±ã®åƒã手ãŒä½ã‚“ã§ã„ãŸå°å±‹ã®è¿‘ãを探ã£ã¦ã¿ã¾ã—ょã†ã€‚å°ã•ãªåŸŽã«é€šã˜ã‚‹éšŽæ®µãŒã‚りã¾ã™ + +ãŠå¿˜ã‚Œãªã: + +]]> + +ãƒãƒ¼ã‚¸ãƒ§ãƒ³ アップã«ã‚ˆã‚Šã€ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã®æ–°ã‚¨ãƒªã‚¢ã‚’å§‹ã‚ã¨ã™ã‚‹æ–°æ©Ÿèƒ½ãŒè¿½åŠ ã•れã¾ã—㟠+ +{*B*}基本ã®ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã‹ã‚‰å§‹ã‚ã‚‹{*CONTROLLER_VK_A*}{*B*} + 基本ã®ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã‚’飛ã°ã™{*CONTROLLER_VK_B*} + +ã“ã®ã‚¨ãƒªã‚¢ã§ã€é‡£ã‚Šç«¿ã€ãƒœãƒ¼ãƒˆã€ãƒ”ストンã€ãƒ¬ãƒƒãƒ‰ã‚¹ãƒˆãƒ¼ãƒ³ãªã©ã®ä½¿ã„方を練習ã—ã¾ã—ょㆠ+ +ã“ã®ã‚¨ãƒªã‚¢ã®å¤–ã§ã¯ã€å»ºç‰©ã€ç•‘ã€ãƒˆãƒ­ãƒƒã‚³ã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã€èª¿åˆã€å–引ã€é›é€ ãªã©ãŒã‚ãªãŸã‚’å¾…ã£ã¦ã„ã¾ã™! + + + ç©ºè…¹ã‚²ãƒ¼ã‚¸ãŒæ¸›ã‚Šã™ãŽã¦ã€HP ãŒå›žå¾©ã§ãã¾ã›ã‚“。 + + + + {*B*} + 空腹ゲージや食ã¹ç‰©ã«ã¤ã„ã¦è©³ã—ã知りãŸã„å ´åˆã¯ {*CONTROLLER_VK_A*} を押ã—ã¦ãã ã•ã„。{*B*} + ã™ã§ã«å分知ã£ã¦ã„ã‚‹å ´åˆã¯ {*CONTROLLER_VK_B*} を押ã—ã¦ãã ã•ã„。 + + +é¸æŠž + +使ㆠ+ +戻る + +終了 + +キャンセル + +å‚加をキャンセル + +データä¿å­˜æ©Ÿå™¨ã‚’é¸æŠž + +データä¿å­˜æ©Ÿå™¨ã‚’変更 + +オンライン ゲーム リストを更新 + +パーティー ゲーム + +ã™ã¹ã¦ã®ã‚²ãƒ¼ãƒ  + +グループを切り替㈠+ +æŒã¡ç‰©ã‚’見る + +説明を見る + +ææ–™ã‚’見る + +工作 + +作る + +å–ã‚‹/ç½®ã + +å–ã‚‹ + +ã™ã¹ã¦å–ã‚‹ + +åŠåˆ†å–ã‚‹ + +ç½®ã + +ã™ã¹ã¦ç½®ã + +1 ã¤ç½®ã + +è½ã¨ã™ + +ã™ã¹ã¦è½ã¨ã™ + +1 ã¤è½ã¨ã™ + +入れ替㈠+ +クイック移動 + +ã‚¯ã‚¤ãƒƒã‚¯é¸æŠžãƒãƒ¼ã‚’空ã«ã™ã‚‹ + +ã“れã¯ä½•? + +Facebook ã«å…¬é–‹ + +フィルターを変更 + +ゲーマー カードを見る + +ゲーマー プロフィールを見る + +フレンド登録ã®ä¾é ¼ã‚’é€ã‚‹ + +次㸠+ +å‰ã¸ + +次㸠+ +å‰ã¸ + +プレイヤーを追放 + +染ã‚ã‚‹ + +掘る + +ãˆã•を与ãˆã‚‹ + +手ãªãšã‘ã‚‹ + +回復ã™ã‚‹ + +ãŠã™ã‚り + +ã¤ã„ã¦ã“ã„ + +å–り出㙠+ +空ã«ã™ã‚‹ + +éžã‚’ç½®ã + +ç½®ã + +å©ã + +ä¹³æ¾ã‚Š + +集ã‚ã‚‹ + +食ã¹ã‚‹ + +眠る + +èµ·ãã‚‹ + +éŠã¶ + +ä¹—ã‚‹ + +船ã«ä¹—ã‚‹ + +育ã¦ã‚‹ + +æ³³ã + +é–‹ã + +音程を変ãˆã‚‹ + +起爆ã™ã‚‹ + +読む + +ã¶ã‚‰ä¸‹ãŒã‚‹ + +投ã’ã‚‹ + +æ¤ãˆã‚‹ + +耕㙠+ +åŽç©«ã™ã‚‹ + +ç¶šã‘ã‚‹ + +完全版を購入 + +セーブデータを削除 + +削除 + +オプション + +Xbox Live パーティーを招待 + +フレンドを招待 + +決定 + +毛を刈る + +ã‚¢ã‚¯ã‚»ã‚¹ã‚’ç¦æ­¢ + +スキンを決定 + +ç«ã‚’ã¤ã‘ã‚‹ + +é¸æŠž + +完全版をインストール + +ãŠè©¦ã—版をインストール + +インストール + +å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ« + +セーブã®ã‚ªãƒ—ション + +コマンドを実行 + +クリエイティブ + +ææ–™ã‚’移動 + +燃料を移動 + +é“具を移動 + +防具を移動 + +武器を移動 + +装備 + +引ã + +放㤠+ +特権 + +ブロック + +上㸠+ +下㸠+ +求愛モード + +飲む + +回転ã™ã‚‹ + +éš ã™ + +Xbox One 用ã«ã‚»ãƒ¼ãƒ–をアップロード + +å…¨ã¦ã®ã‚¹ãƒ­ãƒƒãƒˆã‚’空ã«ã™ã‚‹ + +Xbox One 用ã«ã‚»ãƒ¼ãƒ–をアップロード + +OK + +キャンセル + +Minecraft ストア + +本当ã«ç¾åœ¨ãƒ—レイã—ã¦ã„るゲームを終了ã—ã¦ã€æ–°ã—ã„ゲームã«å‚加ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? セーブã—ã¦ã„ãªã„途中経éŽã¯å¤±ã‚れã¦ã—ã¾ã„ã¾ã™ + +ゲームを終了 + +ゲームをセーブ + +セーブã›ãšã«çµ‚了 + +以å‰ã®ã“ã®ä¸–界ã®ã‚»ãƒ¼ãƒ– データをã€ç¾åœ¨ã®ãƒ‡ãƒ¼ã‚¿ã§ä¸Šæ›¸ãã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? + +本当ã«ã‚»ãƒ¼ãƒ–ã›ãšãƒ¡ã‚¤ãƒ³ ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã«æˆ»ã£ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? ã“ã®ä¸–界ã§ã®é€”中経éŽã¯å¤±ã‚れã¦ã—ã¾ã„ã¾ã™ + +ゲームを始ã‚ã‚‹ + +クリエイティブ モードã§ä½œæˆã€ãƒ­ãƒ¼ãƒ‰ã€ã‚»ãƒ¼ãƒ–ã—ãŸä¸–界ã¯ã€ãŸã¨ãˆå¾Œã§ã‚µãƒã‚¤ãƒãƒ« モードã§ãƒ­ãƒ¼ãƒ‰ã—ãŸã¨ã—ã¦ã‚‚ã€å®Ÿç¸¾ã‚„ランキング更新ã®å¯¾è±¡ã«ãªã‚Šã¾ã›ã‚“。実行ã—ã¦ã‚ˆã‚ã—ã„ã§ã™ã‹? + +クリエイティブ モードã§ä½œæˆã€ãƒ­ãƒ¼ãƒ‰ã€ã‚»ãƒ¼ãƒ–ã—ãŸä¸–界ã¯ã€ãŸã¨ãˆå¾Œã§ã‚µãƒã‚¤ãƒãƒ« モードã§ãƒ­ãƒ¼ãƒ‰ã—ãŸã¨ã—ã¦ã‚‚ã€å®Ÿç¸¾ã‚„ランキング更新ã®å¯¾è±¡ã«ãªã‚Šã¾ã›ã‚“。実行ã—ã¦ã‚ˆã‚ã—ã„ã§ã™ã‹? + +クリエイティブ モードã§ä½œæˆã€ãƒ­ãƒ¼ãƒ‰ã€ã‚»ãƒ¼ãƒ–ã—ãŸä¸–界ã¯ã€ãŸã¨ãˆå¾Œã§ã‚µãƒã‚¤ãƒãƒ« モードã§ãƒ­ãƒ¼ãƒ‰ã—ãŸã¨ã—ã¦ã‚‚ã€å®Ÿç¸¾ã‚„ランキング更新ã®å¯¾è±¡ã«ãªã‚Šã¾ã›ã‚“。 + +ホスト特権を有効ã«ã—ã¦ä½œæˆã€ãƒ­ãƒ¼ãƒ‰ã€ã‚»ãƒ¼ãƒ–ã—ãŸä¸–界ã¯ã€ãŸã¨ãˆå¾Œã§ã‚ªãƒ—ションをオフã«ã—ãŸã¨ã—ã¦ã‚‚ã€å®Ÿç¸¾ã‚„ランキング更新ã®å¯¾è±¡ã«ãªã‚Šã¾ã›ã‚“。実行ã—ã¦ã‚ˆã‚ã—ã„ã§ã™ã‹? + +セーブ データã®ç ´æ + +ã“ã®ã‚»ãƒ¼ãƒ– データã¯ç ´æã—ã¦ã„ã¾ã™ã€‚削除ã—ã¾ã™ã‹? + +ç¾åœ¨ã®ã‚²ãƒ¼ãƒ ã‚’終了ã—ã€ã™ã¹ã¦ã®ãƒ—レイヤーã¨ã®æŽ¥ç¶šã‚’切断ã—ã¦ãƒ¡ã‚¤ãƒ³ ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã«æˆ»ã£ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? セーブã—ã¦ã„ãªã„途中経éŽã¯å¤±ã‚れã¦ã—ã¾ã„ã¾ã™ + +セーブã—ã¦çµ‚了 + +セーブã›ãšã«çµ‚了 + +本当ã«ãƒ¡ã‚¤ãƒ³ ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã«æˆ»ã£ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? セーブã—ã¦ã„ãªã„途中経éŽã¯å¤±ã‚れã¦ã—ã¾ã„ã¾ã™ + +本当ã«ãƒ¡ã‚¤ãƒ³ ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã«æˆ»ã£ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? ã“ã“ã¾ã§ã®é€”中経éŽã¯å¤±ã‚れã¦ã—ã¾ã„ã¾ã™ + +æ–°ã—ã„世界 + +ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã‚’プレイ + +ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ« + +æ–°ã—ã„世界ã«åå‰ã‚’ã¤ã‘ã‚‹ + +æ–°ã—ã„世界ã®åå‰ã‚’入力ã—ã¦ãã ã•ã„ + +世界ã®ç¨®ã‚’入力ã—ã¦ãã ã•ã„ + +セーブã—ãŸä¸–界をロードã™ã‚‹ + +START を押ã—ã¦ã‚²ãƒ¼ãƒ ã«å‚加 + +ゲームを終了 + +エラーãŒèµ·ã“りã¾ã—ãŸã€‚メイン ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã«æˆ»ã‚Šã¾ã™ + +接続ã«å¤±æ•—ã—ã¾ã—㟠+ +接続ãŒåˆ‡æ–­ã•れã¾ã—㟠+ +サーãƒãƒ¼ã¨ã®æŽ¥ç¶šãŒåˆ‡æ–­ã•れã¾ã—ãŸã€‚メイン ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã«æˆ»ã‚Šã¾ã™ + +Xbox Live ã¨ã®æŽ¥ç¶šãŒåˆ‡æ–­ã•れã¾ã—ãŸã€‚メイン ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã«æˆ»ã‚Šã¾ã™ + +Xbox Live ã¨ã®æŽ¥ç¶šãŒåˆ‡æ–­ã•れã¾ã—㟠+ +サーãƒãƒ¼ã«ã‚ˆã‚Šåˆ‡æ–­ã•れã¾ã—㟠+ +ゲームã‹ã‚‰è¿½æ”¾ã•れã¾ã—㟠+ +空を飛んã ãŸã‚ã€ã‚²ãƒ¼ãƒ ã‹ã‚‰è¿½æ”¾ã•れã¾ã—㟠+ +æŽ¥ç¶šã«æ™‚é–“ãŒã‹ã‹ã‚Šã™ãŽã¦ã„ã¾ã™ + +サーãƒãƒ¼ãŒæº€å“¡ã§ã™ + +ホストãŒã‚²ãƒ¼ãƒ ã‚’終了ã—ã¾ã—㟠+ +ã“ã®ä¸–界ã§ãƒ—レイ中ã®ãƒ•レンドãŒã„ãªã„ãŸã‚ã€ã“ã®ä¸–界ã«ã¯å…¥ã‚Œã¾ã›ã‚“ + +以å‰ã«ãƒ›ã‚¹ãƒˆã«ã‚ˆã‚Šè¿½æ”¾ã•れã¦ã„ã‚‹ãŸã‚ã€ã“ã®ä¸–界ã«ã¯å…¥ã‚Œã¾ã›ã‚“ + +相手ã®ãƒ—レイヤーã®ã‚²ãƒ¼ãƒ ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒå¤ã„ãŸã‚ã€ã‚²ãƒ¼ãƒ ã«å‚加ã§ãã¾ã›ã‚“ + +相手ã®ãƒ—レイヤーã®ã‚²ãƒ¼ãƒ ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒæ–°ã—ã„ãŸã‚ã€ã‚²ãƒ¼ãƒ ã«å‚加ã§ãã¾ã›ã‚“ + +æ–°ã—ã„世界 + +アワードをアンロックã—ã¾ã—ãŸ! + +ãŠã‚ã§ã¨ã†ã”ã–ã„ã¾ã™! Minecraft ã® Steve ã®ã‚²ãƒ¼ãƒžãƒ¼ アイコンをç²å¾—ã—ã¾ã—ãŸ! + +ãŠã‚ã§ã¨ã†ã”ã–ã„ã¾ã™! Creeper ã®ã‚²ãƒ¼ãƒžãƒ¼ アイコンをç²å¾—ã—ã¾ã—ãŸ! + +ãŠã‚ã§ã¨ã†ã”ã–ã„ã¾ã™! ã‚¢ãƒã‚¿ãƒ¼ アイテムã€Minecraft Xbox 360 版 T シャツをç²å¾—ã—ã¾ã—ãŸ! +ダッシュボードã§ã‚¢ãƒã‚¿ãƒ¼ã«è£…å‚™ã—ã¾ã—ょㆠ+ +ãŠã‚ã§ã¨ã†ã”ã–ã„ã¾ã™! ã‚¢ãƒã‚¿ãƒ¼ アイテムã€Minecraft Xbox 360 版 ウォッãƒã‚’ç²å¾—ã—ã¾ã—ãŸ! +ダッシュボードã§ã‚¢ãƒã‚¿ãƒ¼ã«è£…å‚™ã—ã¾ã—ょㆠ+ +ãŠã‚ã§ã¨ã†ã”ã–ã„ã¾ã™! ã‚¢ãƒã‚¿ãƒ¼ アイテムã€Creeper 野çƒå¸½ã‚’ç²å¾—ã—ã¾ã—ãŸ! +ダッシュボードã§ã‚¢ãƒã‚¿ãƒ¼ã«è£…å‚™ã—ã¾ã—ょㆠ+ +ãŠã‚ã§ã¨ã†ã”ã–ã„ã¾ã™! ã‚¢ãƒã‚¿ãƒ¼ アイテムã€Minecraft Xbox 360 版 テーマをç²å¾—ã—ã¾ã—ãŸ! +ダッシュボードã§ãƒ†ãƒ¼ãƒžã‚’é¸æŠžã—ã¾ã—ょㆠ+ +完全版を購入 + +今ã¯ãŠè©¦ã—版をプレイ中ã§ã™ã€‚データをセーブã™ã‚‹ãŸã‚ã«ã¯å®Œå…¨ç‰ˆã‚’購入ã„ãŸã ãå¿…è¦ãŒã‚りã¾ã™ +今ã™ã完全版を購入ã—ã¾ã™ã‹? + +ã“れ㯠Minecraft Xbox 360 版ã®ãŠè©¦ã—版ã§ã™ã€‚完全版ã§ã‚れã°ã€ä»Šã™ãç²å¾—ã§ãる実績ãŒã‚りã¾ã™! +完全版を購入ã—ã¦ã€Xbox Live を通ã˜ã¦ä¸–界中ã®ãƒ•レンドã¨ä¸€ç·’ã«éŠã¹ã‚‹Minecraft ã®æ¥½ã—ã•を体験ã—ã¦ãã ã•ã„。 +完全版を購入ã—ã¾ã™ã‹? + +ã“れ㯠Minecraft Xbox 360 版ã®ãŠè©¦ã—版ã§ã™ã€‚完全版ã§ã‚れã°ã€ä»Šã™ãç²å¾—ã§ãã‚‹ã‚¢ãƒã‚¿ãƒ¼ アワードãŒã‚りã¾ã™! +完全版を購入ã—ã¦ã€Xbox Live を通ã˜ã¦ä¸–界中ã®ãƒ•レンドã¨ä¸€ç·’ã«éŠã¹ã‚‹Minecraft ã®æ¥½ã—ã•を体験ã—ã¦ãã ã•ã„。 +完全版を購入ã—ã¾ã™ã‹? + +ã“れ㯠Minecraft Xbox 360 版ã®ãŠè©¦ã—版ã§ã™ã€‚完全版ã§ã‚れã°ã€ä»Šã™ãç²å¾—ã§ãるゲーマー アイコンãŒã‚りã¾ã™! +完全版を購入ã—ã¦ã€Xbox Live を通ã˜ã¦ä¸–界中ã®ãƒ•レンドã¨ä¸€ç·’ã«éŠã¹ã‚‹ Minecraft ã®æ¥½ã—ã•を体験ã—ã¦ãã ã•ã„。 +完全版を購入ã—ã¾ã™ã‹? + +ã“れ㯠Minecraft Xbox 360 版ã®ãŠè©¦ã—版ã§ã™ã€‚完全版ã§ã‚れã°ã€ä»Šã™ãç²å¾—ã§ãるテーマãŒã‚りã¾ã™! +完全版を購入ã—ã¦ã€Xbox Live を通ã˜ã¦ä¸–界中ã®ãƒ•レンドã¨ä¸€ç·’ã«éŠã¹ã‚‹ Minecraft ã®æ¥½ã—ã•を体験ã—ã¦ãã ã•ã„。 +完全版を購入ã—ã¾ã™ã‹? + +ãŠè©¦ã—版ã§ã¯ã€ã“ã®æ‹›å¾…ã¯å—ã‘られã¾ã›ã‚“。 +完全版を今ã™ã購入ã—ã¾ã™ã‹? + +ゲスト プレイヤーã§ã¯å®Œå…¨ç‰ˆã‚’購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。Xbox Live ゲーマー プロフィールã§ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã—ã¦ãã ã•ã„ + +ãŠå¾…ã¡ãã ã•ã„ + +çµæžœãªã— + +フィルター: + +フレンド + +マイスコア + +通算 + +登録数: + +ランク + +ゲーマータグ + +セーブレベル + +詳細を設定中... + +最終処ç†ä¸­... + +地形を構築中 + +世界ã®ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ãƒˆä¸­ + +サーãƒãƒ¼ã‚’åˆæœŸåŒ–中 + +復活地点を作æˆä¸­ + +復活地点を読ã¿è¾¼ã¿ä¸­ + +暗黒界ã«å…¥ã‚‹ + +暗黒界を出る + +復活中 + +レベルを生æˆä¸­ + +レベルを読ã¿è¾¼ã¿ä¸­ + +プレイヤーをセーブ中 + +ホストサーãƒãƒ¼ã«æŽ¥ç¶šä¸­ + +地形をダウンロード中 + +オフライン ゲームã«åˆ‡ã‚Šæ›¿ãˆã‚‹ + +ホストãŒã‚²ãƒ¼ãƒ ã‚’セーブã—ã¦ã„ã¾ã™ã€‚ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„ + +æžœã¦ã®ä¸–界ã«å…¥ã‚‹ + +æžœã¦ã®ä¸–界を出る + +世界ã®ç¨®ã‚’探㙠+ +ã“ã®ãƒ™ãƒƒãƒ‰ã¯ä½¿ç”¨ä¸­ã§ã™ + +夜ã®é–“ã—ã‹çœ ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ + +%s ã¯å¯ã¦ã„ã¾ã™ã€‚æœã¾ã§æ™‚間をスキップã™ã‚‹ã«ã¯ã€ã™ã¹ã¦ã®ãƒ—レイヤーãŒå¯ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ + +最後ã«ä½¿ç”¨ã—ãŸãƒ™ãƒƒãƒ‰ãŒãªããªã£ã¦ã„ã‚‹ã‹ã€ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ + +モンスターãŒè¿‘ãã«ã„る時ã«ä¼‘ã‚€ã®ã¯å±é™ºã§ã™ + +ã‚ãªãŸã¯å¯ã¦ã„ã¾ã™ã€‚æœã¾ã§æ™‚間をスキップã™ã‚‹ã«ã¯ã€ã™ã¹ã¦ã®ãƒ—レイヤーãŒå¯ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ + +é“å…·ã¨æ­¦å™¨ + +武器 + +食ã¹ç‰© + +建物 + +防具 + +機械 + +乗り物 + +飾り + +建設用ブロック + +レッドストーンã¨ä¹—り物 + +ãã®ä»– + +èª¿åˆ + +èª¿åˆ + +é“å…·ã€æ­¦å™¨ã€é˜²å…· + +ææ–™ + +サインアウト + +ゲーマー プロフィールã‹ã‚‰ã‚µã‚¤ãƒ³ã‚¢ã‚¦ãƒˆã—ã¾ã—ãŸã€‚タイトル画é¢ã«æˆ»ã‚Šã¾ã™ + +難易度 + +BGM + +効果音 + +ガンマ + +ゲームã§ã®æ„Ÿåº¦ + +メニューã§ã®æ„Ÿåº¦ + +ピース + +イージー + +ノーマル + +ãƒãƒ¼ãƒ‰ + +プレイヤー㮠HP ã¯è‡ªå‹•ã§å›žå¾©ã—ã€æ•µã‚‚ã„ã¾ã›ã‚“ + +敵ã¯å‡ºç¾ã—ã¾ã™ãŒã€ãƒŽãƒ¼ãƒžãƒ« モードã»ã©æ”»æ’ƒåŠ›ãŒé«˜ãã‚りã¾ã›ã‚“ + +敵ãŒå‡ºç¾ã—ã€ãã®æ”»æ’ƒåŠ›ã¯æ™®é€šã§ã™ + +敵ãŒå‡ºç¾ã—ã€ãã®æ”»æ’ƒåŠ›ãŒã‚¢ãƒƒãƒ—ã—ã¾ã™ã€‚ã¾ãŸã€ä¸€çž¬è¿‘ã¥ã„ãŸã ã‘ã§ã‚‚ Creeper ãŒçˆ†ç™ºã™ã‚‹ã‚ˆã†ã«ãªã‚‹ã®ã§æ³¨æ„ã—ã¾ã—ょㆠ+ +ãŠè©¦ã—版タイムアウト + +ãŠè©¦ã—版をプレイã§ãã‚‹åˆ¶é™æ™‚é–“ãŒéŽãŽã¦ã—ã¾ã„ã¾ã—ãŸ! 完全版を購入ã—ã¦ã€ã‚²ãƒ¼ãƒ ã‚’ç¶šã‘ã¾ã™ã‹? + +完全版 + +æ—¢ã«æº€å“¡ã®ãŸã‚ã€ã‚²ãƒ¼ãƒ ã«å‚加ã§ãã¾ã›ã‚“ã§ã—㟠+ +看æ¿ã®æ–‡å­—を入力 + +看æ¿ã®æ–‡å­—を入力ã—ã¦ãã ã•ã„ + +タイトルを入力 + +投稿ã®ã‚¿ã‚¤ãƒˆãƒ«ã‚’入力ã—ã¦ãã ã•ã„ + +キャプションを入力 + +投稿ã®ã‚­ãƒ£ãƒ—ションを入力ã—ã¦ãã ã•ã„ + +説明を入力 + +投稿ã®èª¬æ˜Žã‚’入力ã—ã¦ãã ã•ã„ + +æŒã¡ç‰© + +ææ–™ + +調åˆå° + +ãƒã‚§ã‚¹ãƒˆ + +エンãƒãƒ£ãƒ³ãƒˆ + +ã‹ã¾ã© + +ææ–™ + +燃料 + +発射装置 + +ç¾åœ¨ã€ã“ã®ã‚¿ã‚¤ãƒ—ã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ コンテンツã¯ã‚りã¾ã›ã‚“ + +%s ãŒä¸–界ã«ã‚„ã£ã¦ãã¾ã—㟠+ +%s ãŒä¸–界を去りã¾ã—㟠+ +%s ãŒè¿½æ”¾ã•れã¾ã—㟠+ +本当ã«ã“ã®ã‚»ãƒ¼ãƒ–データを削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? + +承èªå¾…ã¡ + +検閲済㿠+ +プレイ中: + +è¨­å®šã‚’å…ƒã«æˆ»ã™ + +本当ã«è¨­å®šã‚’最åˆã®çŠ¶æ…‹ã«æˆ»ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? + +ロード エラー + +Minecraft Xbox 360 版ã®ãƒ­ãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¾ã—ãŸã€‚続行ã§ãã¾ã›ã‚“ + +%s ã®ã‚²ãƒ¼ãƒ  + +ãªãªã—ã®ãƒ›ã‚¹ãƒˆã®ã‚²ãƒ¼ãƒ  + +ゲストãŒã‚µã‚¤ãƒ³ã‚¢ã‚¦ãƒˆã—ã¾ã—㟠+ +ゲスト プレイヤー㮠1 人ãŒã‚µã‚¤ãƒ³ã‚¢ã‚¦ãƒˆã—ãŸãŸã‚ã€ã™ã¹ã¦ã®ã‚²ã‚¹ãƒˆ プレイヤーãŒã‚²ãƒ¼ãƒ ã‹ã‚‰å–り除ã‹ã‚Œã¾ã—㟠+ +サインイン + +サインインã—ã¦ã„ã¾ã›ã‚“。ã“ã®ã‚²ãƒ¼ãƒ ã‚’プレイã™ã‚‹ã«ã¯ã‚µã‚¤ãƒ³ã‚¤ãƒ³ãŒå¿…è¦ã§ã™ã€‚今ã™ãサインインã—ã¾ã™ã‹? + +マルãƒãƒ—レイãŒåˆ¶é™ã•れã¦ã„ã¾ã™ + +Xbox Live ã§ã®ãƒžãƒ«ãƒãƒ—レイを制é™ã•れã¦ã„るプレイヤーãŒã„ã¾ã™ã€‚ゲームã«å‚加ã§ãã¾ã›ã‚“ + +Xbox Live ã§ã®ãƒžãƒ«ãƒãƒ—レイを制é™ã•れã¦ã„るプレイヤーãŒã„ã¾ã™ã€‚オンライン ゲームã¯ä½œæˆã§ãã¾ã›ã‚“。[オンライン ゲーム] ã®ãƒã‚§ãƒƒã‚¯ã‚’外ã™ã¨ã‚ªãƒ•ラインã§ã‚²ãƒ¼ãƒ ã‚’é–‹å§‹ã§ãã¾ã™ + +[メンãƒãƒ¼ãŒä½œã£ãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„] ã®è¨­å®šã«ã‚ˆã‚Šã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒåˆ¶é™ã•れã¦ã„ã‚‹ãŸã‚ã€ã‚²ãƒ¼ãƒ ã«å‚加ã§ãã¾ã›ã‚“。ゲームã«å‚加ã™ã‚‹ã«ã¯ã€Xbox ダッシュボード㮠[プライãƒã‚·ãƒ¼ & オンライン設定] ã§è¨­å®šã‚’変更ã—ã¦ãã ã•ã„ + +ローカル プレイヤーã®ä¸­ã« [メンãƒãƒ¼ãŒä½œã£ãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„] ã®è¨­å®šã«ã‚ˆã‚Šã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒåˆ¶é™ã•れã¦ã„るプレイヤーãŒã„ã‚‹ãŸã‚ã€ã‚²ãƒ¼ãƒ ã«å‚加ã§ãã¾ã›ã‚“ + +å‚加プレイヤーã®ä¸­ã« [メンãƒãƒ¼ãŒä½œã£ãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„] ã®è¨­å®šãŒ [フレンドã®ã¿] ã®ãƒ—レイヤーãŒãŠã‚Šã€ã‚ãªãŸã¯ãã®ãƒ•レンド リストã«ç™»éŒ²ã•れã¦ã„ãªã„ãŸã‚ã€ã‚²ãƒ¼ãƒ ã«å‚加ã§ãã¾ã›ã‚“ + +ゲームを作æˆã§ãã¾ã›ã‚“ + +ローカル プレイヤーã®ä¸­ã« [メンãƒãƒ¼ãŒä½œã£ãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„] ã®è¨­å®šã«ã‚ˆã‚Šã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒåˆ¶é™ã•れã¦ã„るプレイヤーãŒã„ã‚‹ãŸã‚ã€ã‚²ãƒ¼ãƒ ã‚’作æˆã§ãã¾ã›ã‚“。[オンライン ゲーム] ã®ãƒã‚§ãƒƒã‚¯ã‚’外ã—ã¦ã‚ªãƒ•ラインã§ã‚²ãƒ¼ãƒ ã‚’å§‹ã‚ã‚‹ã‹ã€ã¾ãŸã¯ Xbox ダッシュボード㮠[プライãƒã‚·ãƒ¼ & オンライン設定] ã§è¨­å®šã‚’変更ã—ã¦ãã ã•ã„ + +è‡ªå‹•é¸æŠžã•れã¾ã—㟠+ +デフォルト スキン + +ãŠæ°—ã«å…¥ã‚Šã®ã‚¹ã‚­ãƒ³ + +アクセスãŒç¦æ­¢ã•れã¦ã„ã¾ã™ + +ã‚¢ã‚¯ã‚»ã‚¹ç¦æ­¢ãƒªã‚¹ãƒˆã«ç™»éŒ²ã•れã¦ã„る世界ã«å‚加ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ +ã“ã®ã¾ã¾å‚加ã™ã‚‹ã¨ã€ã“ã®ä¸–界ã¯ã‚¢ã‚¯ã‚»ã‚¹ç¦æ­¢ãƒªã‚¹ãƒˆã‹ã‚‰å¤–ã•れã¾ã™ + +ã‚¢ã‚¯ã‚»ã‚¹ç¦æ­¢ã«ã—ã¾ã™ã‹ï¼Ÿ + +ã“ã®ä¸–ç•Œã‚’ã‚¢ã‚¯ã‚»ã‚¹ç¦æ­¢ãƒªã‚¹ãƒˆã«ç™»éŒ²ã—ã¾ã™ã‹? +OK ã‚’é¸æŠžã™ã‚‹ã¨ã€ã“ã®ä¸–界ã§ã®ãƒ—レイを終了ã—ã¾ã™ + +ã‚¢ã‚¯ã‚»ã‚¹ç¦æ­¢ã‚’解除 + +オートセーブã®é–“éš” + +オートセーブã®é–“éš”: オフ + +分 + +ã“ã“ã«ã¯ç½®ã‘ã¾ã›ã‚“ + +復活ã—ãŸãƒ—レイヤーã«ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’与ãˆã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚ã€å¾©æ´»åœ°ç‚¹ã®è¿‘ãã«æº¶å²©ã‚’ç½®ãã“ã¨ã¯ã§ãã¾ã›ã‚“ + +ã“ã®ã‚²ãƒ¼ãƒ ã§ã¯ã‚ªãƒ¼ãƒˆã‚»ãƒ¼ãƒ–機能を利用ã§ãã¾ã™ã€‚オートセーブã®å®Ÿè¡Œä¸­ã¯ä¸Šã®ã‚ªãƒ¼ãƒˆã‚»ãƒ¼ãƒ– アイコンãŒè¡¨ç¤ºã•れã¾ã™ã€‚ +オートセーブ アイコンã®è¡¨ç¤ºä¸­ã«æœ¬ä½“ã®é›»æºã‚’切らãªã„ã§ãã ã•ã„ + +インターフェースã®ä¸é€æ˜Žåº¦ + +オートセーブを実行ã—ã¾ã™ + +ç”»é¢è¡¨ç¤ºã‚µã‚¤ã‚º + +ç”»é¢è¡¨ç¤ºã‚µã‚¤ã‚º (ç”»é¢åˆ†å‰²) + +種 + +スキン パックã®ãƒ­ãƒƒã‚¯è§£é™¤ + +é¸æŠžã—ãŸã‚¹ã‚­ãƒ³ã‚’使用ã™ã‚‹ã«ã¯ã€ã‚¹ã‚­ãƒ³ パックをロック解除ã—ã¦ãã ã•ã„。 +今ã™ãスキン パックをロック解除ã—ã¾ã™ã‹? + +テクスãƒãƒ£ パックã®ãƒ­ãƒƒã‚¯è§£é™¤ + +ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ パックを世界ã§ä½¿ç”¨ã™ã‚‹ã«ã¯ã€ã“れをロック解除ã—ã¦ãã ã•ã„。 +今ã™ãテクスãƒãƒ£ パックをロック解除ã—ã¾ã™ã‹? + +テクスãƒãƒ£ パック試用版 + +ç¾åœ¨ãŠä½¿ã„ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ パックã¯è©¦ç”¨ç‰ˆã§ã™ã€‚完全版を利用ã—ãªã„å ´åˆã€ã“ã®ä¸–界ã¯ã‚»ãƒ¼ãƒ–ã§ãã¾ã›ã‚“。 +テクスãƒãƒ£ パックã®å®Œå…¨ç‰ˆã‚’購入ã—ã¾ã™ã‹? + +テクスãƒãƒ£ パックをæŒã£ã¦ã„ã¾ã›ã‚“ + +完全版を購入 + +試用版をダウンロード + +完全版をダウンロード + +ã“ã®ä¸–界ã¯ã€æŒã£ã¦ã„ãªã„テクスãƒãƒ£ パックã€ã¾ãŸã¯ãƒžãƒƒã‚·ãƒ¥ã‚¢ãƒƒãƒ— パックãŒä½¿ç”¨ã•れã¦ã„ã¾ã™ã€‚ +今ã™ãã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ パックã€ã¾ãŸã¯ãƒžãƒƒã‚·ãƒ¥ã‚¢ãƒƒãƒ— パックをインストールã—ã¾ã™ã‹? + +試用版を購入 + +完全版を購入 + +プレイヤーを追放 + +ã“ã®ãƒ—レイヤーをゲームã‹ã‚‰è¿½æ”¾ã—ã¾ã™ã‹? 追放ã•れãŸãƒ—レイヤーã¯ã€ã“ã®ä¸–界をå†ã‚¹ã‚¿ãƒ¼ãƒˆã™ã‚‹ã¾ã§ä¸–界ã«å…¥ã‚Œãªããªã‚Šã¾ã™ + +ゲーマー アイコン パック + +テーマ + +スキン パック + +フレンドã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’è¨±å¯ + +ã“ã®ä¸–界ã¸ã®å‚加ã¯ã€ãƒ›ã‚¹ãƒˆ プレイヤーã®ãƒ•レンドã®ã¿ã«åˆ¶é™ã•れã¦ã„ã¾ã™ + +世界ã«å…¥ã‚Œã¾ã›ã‚“ + +é¸æŠžä¸­ + +é¸æŠžã—ãŸã‚¹ã‚­ãƒ³: + +ç ´æã—ãŸãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ コンテンツ + +ã“ã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ コンテンツã¯ç ´æã—ã¦ã„ã‚‹ãŸã‚使用ã§ãã¾ã›ã‚“。破æã—ã¦ã„るコンテンツを削除ã—ã€[Minecraft ストア] ã‹ã‚‰å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ãã ã•ã„ + +ç ´æã—ã¦ä½¿ç”¨ã§ããªã„ダウンロード コンテンツãŒã‚りã¾ã™ã€‚ç ´æã—ã¦ã„るコンテンツを削除ã—ã€[Minecraft ストア] ã‹ã‚‰å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ãã ã•ã„ + +ゲームモードを変更ã—ã¾ã—㟠+ +世界ã®åå‰ã‚’変更ã™ã‚‹ + +ä¸–ç•Œã®æ–°ã—ã„åå‰ã‚’入力ã—ã¦ãã ã•ã„ + +ゲームモード: サãƒã‚¤ãƒãƒ« + +ゲームモード: クリエイティブ + +サãƒã‚¤ãƒãƒ« + +クリエイティブ + +サãƒã‚¤ãƒãƒ« モードã§ä½œæˆ + +クリエイティブ モードã§ä½œæˆ + +雲を表示ã™ã‚‹ + +ã“ã®ã‚»ãƒ¼ãƒ–データã«å¯¾ã™ã‚‹æ“作をé¸ã‚“ã§ãã ã•ã„ + +セーブデータã®åå‰ã‚’変更ã™ã‚‹ + +%d 秒後ã«ã‚ªãƒ¼ãƒˆã‚»ãƒ¼ãƒ–ã‚’é–‹å§‹ã—ã¾ã™... + +オン + +オフ + +ノーマル + +スーパーフラット + +有効ã«ã™ã‚‹ã¨ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã®ã‚²ãƒ¼ãƒ ã«ãªã‚Šã¾ã™ + +有効ã«ã™ã‚‹ã¨ã€æ‹›å¾…ã•れãŸãƒ—レイヤーã—ã‹å‚加ã§ãã¾ã›ã‚“ + +有効ã«ã™ã‚‹ã¨ã€ãƒ•レンド リストã®ãƒ•レンドã®ã¿ã‚²ãƒ¼ãƒ ã«å‚加ã§ãã¾ã™ + +有効ã«ã™ã‚‹ã¨ã€ãƒ—レイヤーãŒä»–ã®ãƒ—レイヤーã«ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’与ãˆã‚‰ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚(サãƒã‚¤ãƒãƒ« モードã®ã¿) + +無効ã«ã™ã‚‹ã¨ã€ã“ã®ã‚²ãƒ¼ãƒ ã«å‚加ã—ãŸãƒ—レイヤーã¯è¨±å¯ã‚’もらã‚ãªã„ã‹ãŽã‚Šå»ºè¨­ã‚„採掘ãŒã§ãã¾ã›ã‚“ + +有効ã«ã™ã‚‹ã¨ã€ç«ã¯è¿‘ãã®å¯ç‡ƒæ€§ãƒ–ロックã«ç‡ƒãˆåºƒãŒã‚Šã¾ã™ + +有効ã«ã™ã‚‹ã¨ã€TNT ç«è–¬ã‚’起爆ã™ã‚‹ã¨çˆ†ç™ºã—ã¾ã™ + +有効ã«ã™ã‚‹ã¨ã€ãƒ›ã‚¹ãƒˆãŒé£›è¡Œèƒ½åŠ›ã€ç–²åŠ´ç„¡åŠ¹ã€ã‚²ãƒ¼ãƒ å†…メニューã§ã®éžè¡¨ç¤ºã‚’切り替ãˆã‚‰ã‚Œã¾ã™ã€‚実績ãŠã‚ˆã³ãƒ©ãƒ³ã‚­ãƒ³ã‚°æ›´æ–°ã¯ç„¡åйã«ãªã‚Šã¾ã™ + +有効ã«ã™ã‚‹ã¨æš—黒界をå†ç”Ÿæˆã—ã¾ã™ã€‚æš—é»’ç ¦ãŒå­˜åœ¨ã—ãªã„セーブ データãŒã‚ã‚‹å ´åˆã«ä¾¿åˆ©ã§ã™ + +有効ã«ã™ã‚‹ã¨ã€æ‘ã‚„è¦å¡žãªã©ã®å»ºç‰©ãŒä¸–界ã«ç”Ÿæˆã•れるよã†ã«ãªã‚Šã¾ã™ + +有効ã«ã™ã‚‹ã¨ã€åœ°ä¸Šç•ŒãŠã‚ˆã³æš—黒界ã«ã€ã¾ã£ãŸã平らãªä¸–界を生æˆã—ã¾ã™ + +有効ã«ã™ã‚‹ã¨ã€ãƒ—レイヤーã®å¾©æ´»åœ°ç‚¹ã®è¿‘ãã«ä¾¿åˆ©ãªã‚¢ã‚¤ãƒ†ãƒ ã®å…¥ã£ãŸãƒã‚§ã‚¹ãƒˆãŒå‡ºç¾ã—ã¾ã™ + +スキン パック + +テーマ + +ゲーマーアイコン + +ã‚¢ãƒã‚¿ãƒ¼ アイテム + +テクスãƒãƒ£ パック + +マッシュアップ パック + +{*PLAYER*} ã¯ç«ã®ä¸­ã§åЛ尽ã㟠+ +{*PLAYER*} ã¯ç«ã«ã‚ˆã£ã¦åЛ尽ã㟠+ +{*PLAYER*} ã¯æº¶å²©ã«é£²ã¿è¾¼ã¾ã‚ŒãŸ + +{*PLAYER*} ã¯å£ã«é£²ã¿è¾¼ã¾ã‚ŒãŸ + +{*PLAYER*} ã¯æººã‚Œã¦åЛ尽ã㟠+ +{*PLAYER*} ã¯é£¢ãˆã¦åЛ尽ã㟠+ +{*PLAYER*} ã¯åˆºã•れã¦åЛ尽ã㟠+ +{*PLAYER*} ã¯è½ä¸‹ã®è¡æ’ƒã§åЛ尽ã㟠+ +{*PLAYER*} ã¯ä¸–界ã®å¤–ã¸è½ã¡ãŸ + +{*PLAYER*} ã¯åЛ尽ã㟠+ +{*PLAYER*} ã¯çˆ†ç™ºã—㟠+ +{*PLAYER*} ã¯é­”法ã«ã‚ˆã‚ŠåЛ尽ã㟠+ +{*PLAYER*}ã¯ã‚¨ãƒ³ãƒ€ãƒ¼ ドラゴンã®ãƒ–レスã§åЛ尽ã㟠+ +{*PLAYER*} 㯠{*SOURCE*} ã«å€’ã•れ㟠+ +{*PLAYER*} 㯠{*SOURCE*} ã«å€’ã•れ㟠+ +{*PLAYER*} 㯠{*SOURCE*} ã«æ’ƒãŸã‚Œã¦åЛ尽ã㟠+ +{*PLAYER*} 㯠{*SOURCE*} ã«ç«ã ã‚‹ã¾ã«ã•れ㟠+ +{*PLAYER*} 㯠{*SOURCE*} ã«å©ãæ½°ã•れ㟠+ +{*PLAYER*} 㯠{*SOURCE*} ã«å€’ã•れ㟠+ +岩盤ã®éœ§ + +HUD ã®è¡¨ç¤º + +ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ã®æ‰‹ã®è¡¨ç¤º + +分割画é¢ã§ã‚²ãƒ¼ãƒžãƒ¼ã‚¿ã‚°ã‚’表示 + +ゲームオーãƒãƒ¼ メッセージ + +キャラクターを動ã‹ã™ + +カスタム スキン アニメーション + +採掘やアイテムã®ä½¿ç”¨ãŒã§ããªããªã‚Šã¾ã—㟠+ +採掘やアイテムã®ä½¿ç”¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã—㟠+ +ブロックを設置ã§ããªããªã‚Šã¾ã—㟠+ +ブロックを設置ã§ãるよã†ã«ãªã‚Šã¾ã—㟠+ +ドアã¨ã‚¹ã‚¤ãƒƒãƒã‚’使用ã§ãるよã†ã«ãªã‚Šã¾ã—㟠+ +ドアã¨ã‚¹ã‚¤ãƒƒãƒã‚’使用ã§ããªããªã‚Šã¾ã—㟠+ +ãƒã‚§ã‚¹ãƒˆãªã©ã®å…¥ã‚Œç‰©ã‚’使用ã§ãるよã†ã«ãªã‚Šã¾ã—㟠+ +ãƒã‚§ã‚¹ãƒˆãªã©ã®å…¥ã‚Œç‰©ã‚’使用ã§ããªããªã‚Šã¾ã—㟠+ +生ã物を攻撃ã§ããªããªã‚Šã¾ã—㟠+ +生ã物を攻撃ã§ãるよã†ã«ãªã‚Šã¾ã—㟠+ +プレイヤーを攻撃ã§ããªããªã‚Šã¾ã—㟠+ +プレイヤーを攻撃ã§ãるよã†ã«ãªã‚Šã¾ã—㟠+ +動物を攻撃ã§ããªããªã‚Šã¾ã—㟠+ +動物を攻撃ã§ãるよã†ã«ãªã‚Šã¾ã—㟠+ +ホストオプションを変更ã§ãるよã†ã«ãªã‚Šã¾ã—㟠+ +ホストオプションを変更ã§ããªããªã‚Šã¾ã—㟠+ +飛行ã§ãるよã†ã«ãªã‚Šã¾ã—㟠+ +飛行ã§ããªããªã‚Šã¾ã—㟠+ +疲労無効ã«ãªã‚Šã¾ã—㟠+ +疲労無効ã§ã¯ãªããªã‚Šã¾ã—㟠+ +ä¸å¯è¦–ã«ãªã‚Šã¾ã—㟠+ +ä¸å¯è¦–ã§ã¯ãªããªã‚Šã¾ã—㟠+ +攻撃ã•れã¦ã‚‚ダメージをå—ã‘ãªããªã‚Šã¾ã—㟠+ +攻撃ã•れるã¨ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’å—ã‘ã¾ã™ + +%d MSP + +エンダー ドラゴン + +%s ã¯æžœã¦ã®ä¸–界ã«å…¥ã‚Šã¾ã—㟠+ +%s ã¯æžœã¦ã®ä¸–界ã‹ã‚‰å‡ºã¾ã—㟠+ + +{*C3*}ã“ã®äººãŒã€ä¾‹ã®ãƒ—レイヤーã‹{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}ã®ã“ã¨?{*EF*}{*B*}{*B*} +{*C3*}ãã†ã€‚æ°—ã‚’ã¤ã‘ã‚よã€ã‚‚ã†ãšã„ã¶ã‚“レベルãŒä¸ŠãŒã£ãŸã¿ãŸã„ã ã€‚僕らã®è€ƒãˆã¯èª­ã¾ã‚Œã¦ã„ã‚‹ã‚“ã ã‹ã‚‰{*EF*}{*B*}{*B*} +{*C2*}別ã«ã„ã„よ。僕らã¯ã‚²ãƒ¼ãƒ ã®ä¸€éƒ¨ã ã¨æ€ã‚れã¦ã‚‹ã‚“ã ã‚ã†ã—{*EF*}{*B*}{*B*} +{*C3*}僕ã¯ã“ã®ãƒ—レイヤー嫌ã„ã˜ã‚ƒãªã„ãªã€‚ã‚ãらã‚ãªã„ã§ã€ãŸãã•ã‚“éŠã‚“ã ã˜ã‚ƒãªã„ã‹{*EF*}{*B*}{*B*} +{*C2*}åƒ•ã‚‰ã®æ€è€ƒãŒç”»é¢ä¸Šã®æ–‡å­—ã¿ãŸã„ã«èª­ã¾ã‚Œã¦ã‚‹ã­{*EF*}{*B*}{*B*} +{*C3*}ゲームã¨ã„ã†å¤¢ã«ã®ã‚り込んã§ã„る時ã€ãƒ—レイヤーã¯è¨€è‘‰ã‚’使ã£ã¦ã„ã‚ã„ã‚ãªç‰©äº‹ã‚’想åƒã™ã‚‹ã‚‰ã—ã„{*EF*}{*B*}{*B*} +{*C2*}言葉ã¯ã¨ã¦ã‚‚柔軟ã§ç´ æ™´ã‚‰ã—ã„インターフェイスã ã­ã€‚ãã®ä¸Šã€ç”»é¢ã®å¤–ã®ç¾å®Ÿã‚’直視ã™ã‚‹ã‚ˆã‚Šå…¨ç„¶æ€–ããªã„{*EF*}{*B*}{*B*} +{*C3*}文字ã§èª­ã‚るよã†ã«ãªã‚‹å‰ã«ã¯å£°ã‚’使ã£ã¦ãŸã‚“ã ãžã€‚ゲームをã—ãªã„人ãŒã‚²ãƒ¼ãƒ ã‚’ã™ã‚‹äººãŸã¡ã‚’魔法使ã„ã¨ã‹è³¢è€…ã¨ã‹å‘¼ã‚“ã§ã€æ‚ªé­”ã®æ–ã«ä¹—ã£ã¦ç©ºã‚’飛ã¶å¤¢ã‚’見ã¦ã„ãŸé ƒã®è©±ã {*EF*}{*B*}{*B*} +{*C2*}ã“ã®ãƒ—レイヤーã¯ä½•ã®å¤¢ã‚’見ãŸã‚“ã ã‚ã†?{*EF*}{*B*}{*B*} +{*C3*}陽ã®å…‰ã¨æœ¨ã®å¤¢ã€‚ãれã«ç«ã¨æ°´ã€‚夢を見ã¦ã¯ã€ä½œã‚‹ã€‚夢を見ã¦ã¯ã€å£Šã™ã€‚夢を見ã¦ã¯ã€ç‹©ã‚‹ã€‚時々狩られãŸã‚Šã—ãŸã‘ã©ã€‚ã‚ã¨ã¯å®‰å…¨ãªå ´æ‰€ã®å¤¢ã {*EF*}{*B*}{*B*} +{*C2*}ãµãƒ¼ã‚“ã€å…ƒç¥–インターフェイスã‹ã€‚100 万年も昔ã®ç‰©ãªã®ã«ã¾ã ã¡ã‚ƒã‚“ã¨å‹•ã。ã§ã‚‚プレイヤーã¯ã€ç”»é¢ã®å¤–ã®ç¾å®Ÿã§ã€æœ¬å½“ã¯ã©ã‚“ãªã‚‚ã®ã‚’作ã£ãŸã‚“ã ã‚ã†?{*EF*}{*B*}{*B*} +{*C3*}ãれã¯ã€{*EF*}{*NOISE*}{*C3*} ã®æª»ã®ä¸­ã§çœŸå®Ÿã®ä¸–界を彫り上ã’ã‚‹ãŸã‚ã«ã€100 万ã®äººã¨ä¸€ç·’ã« {*EF*}{*NOISE*}{*C3*} を作ã£ãŸã‚“ã ã€‚目的㯠{*EF*}{*NOISE*}{*C3*} ã ã€‚{*EF*}{*NOISE*}{*C3*} ã®ä¸­ã®ã“ã¨ã«éŽãŽãªã„ã®ã«{*EF*}{*B*}{*B*} +{*C2*}ã“れã¯ãƒ—レイヤーã«ã¯èª­ã‚ãªã„ã­{*EF*}{*B*}{*B*} +{*C3*}ãã†ã€ã¾ã æœ€é«˜ãƒ¬ãƒ™ãƒ«ã¾ã§åˆ°é”ã—ã¦ã„ãªã„ã‹ã‚‰ã€‚ゲームã®ä¸­ã®çŸ­ã„夢ã˜ã‚ƒãªãã¦ã€äººç”Ÿã®é•·ã„夢をå¶ãˆãªãã¦ã¯ã„ã‘ãªã„{*EF*}{*B*}{*B*} +{*C2*}プレイヤーã¯åƒ•らã®å¥½æ„を知ã£ã¦ã„ã‚‹ã®? 宇宙ã¯å¯›å®¹ã ã£ã¦ã“ã¨ã‚’?{*EF*}{*B*}{*B*} +{*C3*}ãŠãらã。プレイヤーã¯å®‡å®™ã®æ€ã„ã®ãƒŽã‚¤ã‚ºã‚’èžã„ã¦ã„ã‚‹{*EF*}{*B*}{*B*} +{*C2*}ã§ã‚‚プレイヤーã®é•·ã„夢ã®ä¸­ã«ã¯ã€æ™‚ã«æ‚²ã—ã„ã“ã¨ã‚‚ã‚る。å¤ãŒè¨ªã‚Œãšã€é»’ã„太陽ã®ä¸‹ã§å‡ãˆã€è‡ªåˆ†ãŒä½œã£ãŸæ‚²ã—ã•ã‚’ç¾å®Ÿã¨æ€ã£ã¦ã—ã¾ã†ã“ã¨ãŒã‚ã‚‹{*EF*}{*B*}{*B*} +{*C3*}ã ãŒãã®æ‚²ã—ã•を外ã‹ã‚‰ç™’ã™ã¨ã€ãƒ—レイヤーã¯å£Šã‚Œã¦ã—ã¾ã†ã€‚悲ã—ã¿ã¯ãƒ—レイヤー自身ãŒä¹—り越ãˆã‚‹ã‚‚ã®ã®ã²ã¨ã¤ã§ã€å¤–ã‹ã‚‰å¹²æ¸‰ã§ãã‚‹ã“ã¨ã§ã¯ãªã„{*EF*}{*B*}{*B*} +{*C2*}プレイヤーãŒã‚ã¾ã‚Šã«å¤¢ã«æµ¸ã£ã¦ã„ã‚‹ã¨ã€æ™‚々教ãˆãŸããªã‚‹ã‚“ã ã€‚プレイヤーã¯ç¾å®Ÿã«æœ¬å½“ã®ä¸–界を作り上ã’ã¦ã„ã‚‹ã“ã¨ã‚’。ãã®å­˜åœ¨ãŒå®‡å®™ã«ã¨ã£ã¦å¤§åˆ‡ã§ã‚ã‚‹ã“ã¨ã‚’ã€‚ã‚‚ã—æœ¬å½“ã®çµ†ã‚’æŒã¦ãªã„時ã¯ã€æãã¦å£ã«å‡ºã›ãªã„ã§ã„ã‚‹è¨€è‘‰ã‚’è¨€ã†æ‰‹åŠ©ã‘ã‚’ã—ãŸããªã‚‹{*EF*}{*B*}{*B*} +{*C3*}ãŠã„ã€ãƒ—レイヤーã«èª­ã¾ã‚Œã¦ã„ã‚‹ãž{*EF*}{*B*}{*B*} +{*C2*}プレイヤーã®ã“ã¨ãªã‚“ã‹ã©ã†ã§ã‚‚ã„ã„æ™‚ã‚‚ã‚ã‚‹ã‘ã©ã€æ•™ãˆã¦ã‚ã’ãŸã„時もã‚る。ç¾å®Ÿã ã¨æ€ã£ã¦ã„ã‚‹ä¸–ç•Œã¯æœ¬å½“ã¯ãŸã ã® {*EF*}{*NOISE*}{*C2*} ã§ã€ã—ã‹ã‚‚ {*EF*}{*NOISE*}{*C2*} ã ã‘ã ã£ã¦ã“ã¨ã€‚プレイヤー㯠{*EF*}{*NOISE*}{*C2*} ã®ä¸­ã§ã¯ {*EF*}{*NOISE*}{*C2*} ãªã‚“ã ã€‚é•·ã„夢ã®ä¸­ã§çŸ¥ã‚‹ç¾å®Ÿã¯ã»ã‚“ã®ä¸€éƒ¨ã§ã—ã‹ãªã„{*EF*}{*B*}{*B*} +{*C3*}ãれã§ã‚‚プレイヤーã¯ã‚²ãƒ¼ãƒ ã‚’éŠã¶ã‚“ã {*EF*}{*B*}{*B*} +{*C2*}ã ã‘ã©ã€çœŸå®Ÿã‚’æ•™ãˆã‚‹ã“ã¨ã¯ç°¡å˜ã˜ã‚ƒãªã„ã‹...{*EF*}{*B*}{*B*} +{*C3*}ã“ã®å¤¢ã®ä¸­ã§ã¯å޳ã—ã™ãŽã‚‹ã€‚生ãる方法を教ãˆã‚‹ã“ã¨ã¯ã€ç”Ÿãã‚‹é“ã‚’é–‰ã–ã™ã“ã¨ã¨åŒã˜ã {*EF*}{*B*}{*B*} +{*C2*}ã ã‹ã‚‰åƒ•ã¯ç”Ÿã方を教ãˆãªã„{*EF*}{*B*}{*B*} +{*C3*}プレイヤーã¯è½ã¡ç€ã‹ãªããªã£ã¦ãã¦ã‚‹ãª{*EF*}{*B*}{*B*} +{*C2*}ãªã‚‰ã€ã‚る物語を教ãˆã‚ˆã†ã‚ˆ{*EF*}{*B*}{*B*} +{*C3*}ãŸã ã®ç‰©èªžã§çœŸå®Ÿã§ã¯ãªã„{*EF*}{*B*}{*B*} +{*C2*}ãã†ã€‚è¾ºã‚Šã‚’ç„¼ãæ‰•ã£ã¦ã—ã¾ã†ã‚ˆã†ãªã‚€ã出ã—ã®çœŸå®Ÿã§ã¯ãªãã€è¨€è‘‰ã®æª»ã®ä¸­ã«çœŸå®Ÿã‚’優ã—ãéš ã—ãŸç‰©èªž{*EF*}{*B*}{*B*} +{*C3*}ã‚‚ã†ä¸€åº¦ãƒ—レイヤーã«ä½“を与ãˆã‚ˆã†{*EF*}{*B*}{*B*} +{*C2*}ã•ã‚ã€ãƒ—レイヤー...{*EF*}{*B*}{*B*} +{*C3*}å›ã®åå‰ã‚’ã‚‚ã†ä¸€åº¦èžã‹ã›ã¦ã»ã—ã„{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}。ゲームã®ãƒ—レイヤーã ã‚ˆ{*EF*}{*B*}{*B*} +{*C3*}ã§ã¯å§‹ã‚よã†ã‹{*EF*}{*B*}{*B*} + + + +{*C2*}ã•ã‚ã€æ·±å‘¼å¸ã ã€‚ã‚‚ã†ä¸€åº¦ã€‚胸ã«ç©ºæ°—を入れã¦ãµãらã¾ã›ãŸã‚‰ã€åã出ã—ã¦å…ƒã«æˆ»ã—ã¦ã€‚指を動ã‹ãã†ã€‚体全体ã§ç©ºæ°—ã¨é‡åŠ›ã‚’æ„Ÿã˜ã¦ã€‚å›ã®é•·ã„夢ã®ä¸­ã«æˆ»ã‚‹ã‚“ã ã€‚å›ã®å…¨èº«ã¯å†ã³å®‡å®™ã«ãµã‚Œã¦ã„る。今ã¾ã§ã¯ã°ã‚‰ã°ã‚‰ã ã£ãŸã‹ã®ã‚ˆã†ã«ã€‚僕らãŒç‰©äº‹ã‚’分断ã—ã¦ã„ãŸã‹ã®ã‚ˆã†ã«{*EF*}{*B*}{*B*} +{*C3*}僕らã¯èª°ã ã‚ã†? å±±ã®ç²¾éœŠã¨å‘¼ã°ã‚ŒãŸã“ã¨ã‚‚ã‚ã£ãŸã€‚父ãªã‚‹å¤ªé™½ã€æ¯ãªã‚‹æœˆã€ç¥–å…ˆã®é­‚ã€ç£ã®æ€§ã€ç•°æ•™ã®ã‚½ã‚¦ãƒ«ã€å¹½éœŠã€å®‡å®™äººã€ç¥žã€æ‚ªé­”ã€å¤©ä½¿ã€ãƒãƒ«ã‚¿ãƒ¼ã‚¬ã‚¤ã‚¹ãƒˆã€ã‚¨ã‚¤ãƒªã‚¢ãƒ³ã€åœ°çƒå¤–生命体ã€ãƒ¬ãƒ—トンã€ã‚¯ã‚©ãƒ¼ã‚¯ã€‚言葉ã¯å¤‰ã‚る。僕らã¯å¤‰ã‚らãªã„{*EF*}{*B*}{*B*} +{*C2*}僕らã¯å®‡å®™ã€‚å›ãŒå›ã§ã¯ãªã„ã¨æ€ã†ã‚‚ã®ã™ã¹ã¦ã€‚å›ãŒä»Šãã®è‚Œã¨ç›®ã‚’通ã—ã¦è¦‹ã¦ã„ã‚‹ã‚‚ã®ã€‚宇宙ã¯å›ã«ãµã‚Œã€å›ã«å…‰ã‚’投ã’ã‹ã‘る。å›ã®å§¿ã‚’見るãŸã‚ã ã‚ˆã€ãƒ—レイヤー。å›ã‚’知りã€å›ã«çŸ¥ã£ã¦ã‚‚らã†ãŸã‚ã«ã€‚ã•ã‚ã€è©±ã‚’å§‹ã‚よã†{*EF*}{*B*}{*B*} +{*C2*}昔むã‹ã—ã‚ã‚‹ã¨ã“ã‚ã«ã€ã²ã¨ã‚Šã®ãƒ—レイヤーãŒã„ã¾ã—ãŸ{*EF*}{*B*}{*B*} +{*C3*}プレイヤーã¨ã¯å›ã€{*PLAYER*}ã {*EF*}{*B*}{*B*} +{*C2*}自転ã™ã‚‹æº¶ã‘ãŸå²©ã®è–„ã„地表ã«ç«‹ã£ãŸãƒ—レイヤーã¯ã€ã‚る時自分自身を人間ã ã¨è€ƒãˆã¾ã—ãŸã€‚溶ã‘ãŸå²©ã§å‡ºæ¥ãŸãƒœãƒ¼ãƒ«ã¯ã€ãれより 33 万å€ã‚‚大ãã„燃ãˆã‚‹ã‚¬ã‚¹ã®ã‹ãŸã¾ã‚Šã®å‘¨ã‚Šã‚’回ã£ã¦ã„ã¾ã—ãŸã€‚2 ã¤ã®ã‹ãŸã¾ã‚Šã®é–“ã¯ã€å…‰ã®é€Ÿã•ã§ 8 分もã‹ã‹ã‚‹ã»ã©é›¢ã‚Œã¦ã„ã¾ã—ãŸã€‚å…‰ã¯æ˜Ÿã‹ã‚‰ã®æƒ…報㧠1,500 万キロメートル離れãŸãƒ—レイヤーã®è‚Œã‚’焦ãŒã™ã“ã¨ã•ãˆã§ãã¾ã—ãŸ{*EF*}{*B*}{*B*} +{*C2*}å¹³ã‚‰ã§æžœã¦ã—ãªã„世界ã®ä¸Šã§ã€ãƒ—レイヤーã¯ã‚る時鉱山ã§åƒã夢を見ã¾ã—ãŸã€‚太陽ã¯ç™½ã四角ã§ã—ãŸã€‚æ˜Žã‚‹ã„æ™‚é–“ã¯çŸ­ã™ãŽã€ã‚„ã‚‹ã¹ãã“ã¨ã¯å¤šã™ãŽã¾ã—ãŸã€‚æ­»ã¯æŸã®é–“ã®åބ介ã”ã¨ã§ã—ãŸ{*EF*}{*B*}{*B*} +{*C3*}ã¾ãŸã‚る時ã¯ã€ãƒ—レイヤーã¯ç‰©èªžã®ä¸­ã§è‡ªåˆ†è‡ªèº«ã‚’見失ã†å¤¢ã‚’見ã¾ã—ãŸ{*EF*}{*B*}{*B*} +{*C2*}ãã—ã¦ã¾ãŸã‚る時ã¯ã€ãƒ—レイヤーã¯åˆ¥ã®å ´æ‰€ã§ã€åˆ¥ã®ã‚‚ã®ã«ãªã‚‹å¤¢ã‚’見ã¾ã—ãŸã€‚å¤¢ã¯æ™‚ã«ä¸å¿«ã§ã€æ™‚ã«ã¨ã¦ã‚‚美ã—ãã‚‚ã‚りã¾ã—ãŸã€‚プレイヤーã¯ã²ã¨ã¤ã®å¤¢ã‹ã‚‰ç›®è¦šã‚ã€åˆ¥ã®å¤¢ã«å…¥ã‚Šè¾¼ã¿ã€ã¾ãŸè¦šã‚ã¦ã¯ä»–ã®å¤¢ã‚’見ã¾ã—ãŸ{*EF*}{*B*}{*B*} +{*C3*}ãã—ã¦ã€ã‚る夢ã®ä¸­ã§ãƒ—レイヤーã¯ç”»é¢ä¸Šã«æ–‡å­—を見ã¾ã—ãŸ{*EF*}{*B*}{*B*} +{*C2*}å°‘ã—æˆ»ã‚ã†ã‹{*EF*}{*B*}{*B*} +{*C2*}プレイヤーã®åŽŸå­ã¯è‰åŽŸã«ã€å·ã«ã€å¤§åœ°ã«æ•£ã‚‰ã°ã‚Šã¾ã—ãŸã€‚ã‚る女ã®äººãŒã°ã‚‰ã¾ã‹ã‚ŒãŸåŽŸå­ã‚’集ã‚ã€é£Ÿã¹ã€é£²ã¿ã€å¸ã„è¾¼ã¿ã€ä½“ã®ä¸­ã§ãƒ—レイヤーを組ã¿ç«‹ã¦ã¾ã—ãŸ{*EF*}{*B*}{*B*} +{*C2*}温ã‹ãæš—ã„æ¯ã®èƒŽå†…ã‹ã‚‰ç›®è¦šã‚ãŸãƒ—レイヤーã¯ã€é•·ã„夢ã«å…¥ã£ã¦ã„ãã¾ã—ãŸ{*EF*}{*B*}{*B*} +{*C2*}プレイヤー㯠DNA ã«è¨˜ã•れãŸã€èªžã‚‰ã‚ŒãŸã“ã¨ã®ãªã„æ–°ã—ã„物語ã§ã—ãŸã€‚åå„„å¹´å‰ã«æ›¸ã‹ã‚ŒãŸã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã«ç”Ÿæˆã•れãŸã€å®Ÿè¡Œã•れãŸã“ã¨ã®ãªã„æ–°ã—ã„プログラムã§ã—ãŸã€‚ä¹³ã¨æ„›ã«ã‚ˆã£ã¦ã®ã¿é€ ã‚‰ã‚ŒãŸã€ã‹ã¤ã¦å­˜åœ¨ã—ãªã‹ã£ãŸæ–°ã—ã„人間ã§ã—ãŸ{*EF*}{*B*}{*B*} +{*C3*}å›ã¯ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ã€‚ç‰©èªžã€‚ãƒ—ãƒ­ã‚°ãƒ©ãƒ ã€‚ä¹³ã¨æ„›ã«ã‚ˆã£ã¦ã®ã¿é€ ã‚‰ã‚ŒãŸäººé–“{*EF*}{*B*}{*B*} +{*C2*}ã‚‚ã£ã¨ã•ã‹ã®ã¼ã‚ã†{*EF*}{*B*}{*B*} +{*C2*}ã“ã®ã‚²ãƒ¼ãƒ ã‚ˆã‚Šãšã£ã¨ãšã£ã¨å…ˆã« 70 å„„ã® 10 å„„å€ã®ã•ら㫠10 å„„å€ã®åŽŸå­ã«ã‚ˆã£ã¦ã€ãƒ—レイヤーã®ä½“ã¯æ˜Ÿã®ä¸­å¿ƒã§ä½œã‚‰ã‚Œã¾ã—ãŸã€‚ã§ã™ã‹ã‚‰ã€ãƒ—レイヤーも星ã‹ã‚‰ã®æƒ…å ±ãªã®ã§ã™ã€‚プレイヤーã¯ã‚¸ãƒ¥ãƒªã‚¢ãƒ³ã¨ã„ã†äººãŒæ¤ãˆãŸæƒ…å ±ã®æ£®ã®ç‰©èªžã‚’進ã¿ãƒžãƒ«ã‚¯ã‚¹ã¨ã„ã†äººãŒä½œã£ãŸå¹³ã‚‰ã§æžœã¦ã—ãªã„世界を渡りã¾ã™ã€‚物語ã¯ãƒ—レイヤーãŒå¯†ã‹ã«ä½œã‚Šä¸Šã’ãŸå°ã•ãªä¸–界ã®ä¸­ã«å­˜åœ¨ã—ã€ãã®ãƒ—レイヤーãŒä½ã‚€å®‡å®™ã‚’作ã£ãŸã®ã¯...{*EF*}{*B*}{*B*} +{*C3*}ãれã¯ç§˜å¯†ã ã€‚時ã«ãƒ—レイヤーã¯ã€æŸ”らã‹ãã€æš–ã‹ãã€å„ªã—ã„世界をã“ã£ãり作りã¾ã—ãŸã€‚ã‚る世界ã¯å޳ã—ãã€å‡ã¦ã¤ãã€è¤‡é›‘ã§ã‚‚ã‚りã¾ã—ãŸã€‚プレイヤーã¯å®‡å®™ã®æ¨¡åž‹ã‚’空想ã™ã‚‹ã“ã¨ã‚‚ã‚りã¾ã—ãŸã€‚å°ã•ãªã‚¨ãƒãƒ«ã‚®ãƒ¼ã®ã‹ãŸã¾ã‚ŠãŒä½•ã‚‚ãªã„広大ãªç©ºé–“を飛ã³äº¤ã„ã¾ã™ã€‚ã“ã®ã‹ãŸã¾ã‚Šã¯ã€Œé›»å­ã€ã‚„「陽å­ã€ã¨å‘¼ã°ã‚Œã‚‹ã‚‚ã®ã§ã—ãŸ{*EF*}{*B*}{*B*} + + + +{*C2*}中ã«ã¯ã€Œæƒ‘星ã€ã‚„ã€Œæ’æ˜Ÿã€ã¨å‘¼ã°ã‚Œã‚‹ã‚‚ã®ã‚‚ã‚りã¾ã—ãŸ{*EF*}{*B*}{*B*} +{*C2*}プレイヤーã¯ã€Œã‚ªãƒ•ã€ã¨ã€Œã‚ªãƒ³ã€ã€ã€Œ0ã€ã¨ã€Œ1ã€ã€ãƒ—ログラムã§ä½œã‚‰ã‚ŒãŸä¸–界ã®ä¸­ã«ã„ã‚‹ã¨ä¿¡ã˜ã¦ã„ãŸã“ã¨ã‚‚ã‚りã¾ã—ãŸã€‚ã¾ãŸã€ã‚²ãƒ¼ãƒ ã§éŠã‚“ã§ã„ã‚‹ã¨æ€ã„込んã§ã„ãŸã“ã¨ã‚‚ã‚りã¾ã—ãŸã€‚ãã—ã¦ã€ç”»é¢ä¸Šã®æ–‡å­—を読んã§ã„ã‚‹ã€ã¨æ€ã£ã¦ã„ãŸã“ã¨ã‚‚ã‚りã¾ã—ãŸ{*EF*}{*B*}{*B*} +{*C3*}ãã®æ–‡å­—を読んã§ã„ã‚‹ã®ãŒå›ã€ãƒ—レイヤー...{*EF*}{*B*}{*B*} +{*C2*}é»™ã£ã¦ã€‚プレイヤーã¯ç”»é¢ã«æ˜ ã—出ã•れãŸã‚³ãƒ¼ãƒ‰ã‚’読むã“ã¨ã‚‚ã‚りã¾ã—ãŸã€‚コードを言葉ã«åˆ†è§£ã—ã€è¨€è‘‰ã‹ã‚‰æ„味をãã¿å–ã‚Šã€æ„味ã‹ã‚‰æ„Ÿæƒ…ã‚’ã€æ€ã„ã‚’ã€ç†è«–ã‚’ã€è€ƒãˆã‚’引ã出ã—ã¾ã—ãŸã€‚呼å¸ãŒæ·±ã速ããªã‚Šã€ãã†ã—ã¦ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ã¯æ°—ãŒã¤ã„ãŸã®ã§ã™ã€‚自分ãŒç”Ÿãã¦ã„ã‚‹ã“ã¨ã«ã€‚今ã¾ã§çµŒé¨“ã—ãŸå¹¾åƒã‚‚ã®æ­»ã¯ç¾å®Ÿã§ã¯ãªã‹ã£ãŸã“ã¨ã«{*EF*}{*B*}{*B*} +{*C3*}ãれãŒå›ã€‚å›ã ã€‚å›ã¯ç”Ÿãã¦ã„ã‚‹ã‚“ã {*EF*}{*B*}{*B*} +{*C2*}時折ã€å¤ã®æœ¨æ¼ã‚Œæ—¥ã‹ã‚‰å®‡å®™ã®èªžã‚Šã‹ã‘る声をèžã„ãŸã¨æ„Ÿã˜ã‚‹ã“ã¨ã‚‚ã‚りã¾ã—ãŸ{*EF*}{*B*}{*B*} +{*C3*}時折ã€å®‡å®™ã®å£°ã¯ã€å†·ãŸã澄んã å†¬ã®å¤œç©ºã®è¼ãã‹ã‚‰èžã“ãˆã‚‹ã¨æ„Ÿã˜ãŸã“ã¨ã‚‚ã‚りã¾ã—ãŸã€‚視界ã®ç«¯ã«ã‹ã™ã‹ã«è¦‹ãˆãŸã®ã¯ã€å¤ªé™½ã‚ˆã‚Šç™¾ä¸‡å€ã‚‚大ããªæ˜Ÿã®å…‰ã ã£ãŸã®ã‹ã‚‚ã—れã¾ã›ã‚“。燃ãˆãŸæ˜Ÿã®ãƒ—ラズマãŒã€ã»ã‚“ã®ä¸€çž¬ã ã‘プレイヤーã®ç›®ã«æ˜ ã£ãŸã®ã§ã™ã€‚プレイヤーã¯å®‡å®™ã®ã¯ã‚‹ã‹é ãã§ã€å®¶ã«å‘ã‹ã£ã¦æ­©ã„ã¦ã„る途中ã«çªç„¶ãŠã„ã—ãã†ãªåŒ‚ã„を感ã˜ã€æ…£ã‚Œè¦ªã—ã‚“ã å®¶ã®ãƒ‰ã‚¢ã«ä»Šã«ã‚‚ãŸã©ã‚Šç€ããã†ãªã¨ã“ã‚ã§ã—ãŸã€‚ãã—ã¦ãƒ—レイヤーã¯ã¾ãŸå¤¢ã‚’見るã®ã§ã™{*EF*}{*B*}{*B*} +{*C2*}時折ã€å®‡å®™ã¯ã€Œ0ã€ã¨ã€Œ1ã€ã‚’通ã—ã¦ã€ä¸–界ã®é›»æ°—を介ã—ã¦èªžã‚Šã‹ã‘ã¦ãã‚‹ã®ã ã¨æ„Ÿã˜ãŸã“ã¨ã‚‚ã‚りã¾ã—ãŸã€‚夢ã®çµ‚ã‚りã«ã¯ã€å®‡å®™ã¯ç”»é¢ä¸Šã‚’æµã‚Œã¦ã„ã言葉ã§è©±ã—ã‹ã‘ã¦ã„ã¾ã—ãŸ{*EF*}{*B*}{*B*} +{*C3*}宇宙ã¯è¨€ã„ã¾ã—ãŸã€‚「愛ã—ã¦ã„ã‚‹ã€{*EF*}{*B*}{*B*} +{*C2*}「辛抱強ãéŠã‚“ã§ãれã¦ã‚りãŒã¨ã†ã€{*EF*}{*B*}{*B*} +{*C3*}「å›ãŒå¿…è¦ã¨ã™ã‚‹ç‰©ã¯ã€ã™ã¹ã¦è‡ªåˆ†ã®ä¸­ã«ã‚ã‚‹ã€{*EF*}{*B*}{*B*} +{*C2*}「å›ã¯è‡ªåˆ†ãŒæ€ã†ã‚ˆã‚Šå¼·ã„ã®ã ã€{*EF*}{*B*}{*B*} +{*C3*}「å›ã¯æ—¥å·®ã—ã ã€{*EF*}{*B*}{*B*} +{*C2*}「å›ã¯é—‡å¤œã ã€{*EF*}{*B*}{*B*} +{*C3*}「å›ãŒé—˜ã£ã¦ã„ã‚‹æš—é—‡ã¯è‡ªåˆ†ã®å†…å´ã«ä»–ãªã‚‰ãªã„ã€{*EF*}{*B*}{*B*} +{*C2*}「å›ãŒæ±‚ã‚ã‚‹å…‰ã¯è‡ªåˆ†ã®å†…å´ã«å­˜åœ¨ã™ã‚‹ã€{*EF*}{*B*}{*B*} +{*C3*}「å›ã¯ã²ã¨ã‚Šã§ã¯ãªã„ã€{*EF*}{*B*}{*B*} +{*C2*}「å›ã¯ã™ã¹ã¦ã‹ã‚‰åˆ‡ã‚Šé›¢ã•れãŸå­˜åœ¨ã§ã¯ãªã„ã€{*EF*}{*B*}{*B*} +{*C3*}「å›è‡ªèº«ãŒå®‡å®™ã ã€‚å›ã¯è‡ªåˆ†ã‚’試ã—ã€è‡ªåˆ†ã«èªžã‚Šã‹ã‘ã€è‡ªåˆ†ã‚’見ã¤ã‚ã¦ã„ã‚‹ã€{*EF*}{*B*}{*B*} +{*C2*}「ãã—ã¦åƒ•ãŒå›ã‚’æ„›ã™ã‚‹ã®ã¯ã€å›è‡ªèº«ãŒæ„›ã§ã‚ã‚‹ã‹ã‚‰ã ã€{*EF*}{*B*}{*B*} +{*C3*}ゲームã¯çµ‚ã‚りã€ãƒ—レイヤーã¯å¤¢ã‹ã‚‰ç›®è¦šã‚ã€ã¾ãŸæ–°ã—ã„夢ãŒå§‹ã¾ã‚Šã¾ã™ã€‚次ã«ãƒ—レイヤーãŒè¦‹ã‚‹å¤¢ã¯ã‚‚ã£ã¨ç´ æ™´ã‚‰ã—ã„ã‚‚ã®ã§ã—ょã†ã€‚プレイヤーã¯å®‡å®™ã§ã‚ã‚Šã€æ„›ã§ã—ãŸ{*EF*}{*B*}{*B*} +{*C3*}ã•ã‚ã€ãƒ—レイヤー{*EF*}{*B*}{*B*} +{*C2*}目を覚ã¾ã—ã¦{*EF*}{*B*}{*B*} + + +暗黒界をリセットã™ã‚‹ + +本当ã«ã“ã®ã‚»ãƒ¼ãƒ– ãƒ‡ãƒ¼ã‚¿ã®æš—黒界を最åˆã®çŠ¶æ…‹ã«ãƒªã‚»ãƒƒãƒˆã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹? 暗黒界ã«å»ºè¨­ã—ãŸã‚‚ã®ã¯ã™ã¹ã¦å¤±ã‚れã¾ã™ + +暗黒界をリセットã™ã‚‹ + +暗黒界をリセットã—ãªã„ + +ç¾åœ¨ã€Mooshroom ã¯æ¯›åˆˆã‚Šã§ãã¾ã›ã‚“。豚ã€ç¾Šã€ç‰›ã€ãƒã‚³ã®æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—ãŸã€‚ + +ç¾åœ¨ã€ã‚¹ãƒãƒ¼ãƒ³ エッグを使用ã§ãã¾ã›ã‚“。 豚ã€ç¾Šã€ç‰›ã€ãƒã‚³ã®æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—㟠+ +ç¾åœ¨ã€ã‚¹ãƒãƒ¼ãƒ³ エッグを使用ã§ãã¾ã›ã‚“。 Mooshroom ã®æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—㟠+ +ç¾åœ¨ã€ã‚¹ãƒãƒ¼ãƒ³ エッグを使用ã§ãã¾ã›ã‚“。 世界ã®ã‚ªã‚ªã‚«ãƒŸã®æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—㟠+ +ç¾åœ¨ã€ã‚¹ãƒãƒ¼ãƒ³ エッグを使用ã§ãã¾ã›ã‚“。 世界ã®ãƒ‹ãƒ¯ãƒˆãƒªã®æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—㟠+ +ç¾åœ¨ã€ã‚¹ãƒãƒ¼ãƒ³ エッグを使用ã§ãã¾ã›ã‚“。 世界ã®ã‚¤ã‚«ã®æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—㟠+ +ç¾åœ¨ã€ã‚¹ãƒãƒ¼ãƒ³ エッグを使用ã§ãã¾ã›ã‚“。 ä¸–ç•Œã®æ•µã®æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—㟠+ +ç¾åœ¨ã€ã‚¹ãƒãƒ¼ãƒ³ エッグを使用ã§ãã¾ã›ã‚“。 ä¸–ç•Œã®æ‘äººã®æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—㟠+ +世界ã®çµµ/é¡ç¸ã®æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—ãŸã€‚ + +難易度「ピースã€ã§ã¯æ•µã‚’出ç¾ã•ã›ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + +ã“ã®å‹•ç‰©ã¯æ±‚愛モードã«ã§ãã¾ã›ã‚“。豚ã€ç¾Šã€ç‰›ã€ãƒã‚³ã®ç¹æ®–æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—㟠+ +ã“ã®å‹•ç‰©ã¯æ±‚愛モードã«ã§ãã¾ã›ã‚“。オオカミã®ç¹æ®–æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—㟠+ +ã“ã®å‹•ç‰©ã¯æ±‚愛モードã«ã§ãã¾ã›ã‚“。ニワトリã®ç¹æ®–æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—㟠+ +ã“ã®å‹•ç‰©ã¯æ±‚愛モードã«ã§ãã¾ã›ã‚“。Mooshroom ã®ç¹æ®–æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—㟠+ +世界ã®ãƒœãƒ¼ãƒˆã®æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—㟠+ +世界ã®ãƒ˜ãƒƒãƒ‰é¡žã®æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—㟠+ +上下å転 + +左利ã + +ゲームオーãƒãƒ¼! + +復活 + +利用å¯èƒ½ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ コンテンツ + +スキンを変更 + +éŠã³æ–¹ + +æ“作方法 + +設定 + +クレジット + +コンテンツをå†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ« + +デãƒãƒƒã‚°è¨­å®š + +ç«ã®å»¶ç„¼ + +TNT ã®çˆ†ç™º + +PvP + +é«˜åº¦ãªæ“ä½œã‚’è¨±å¯ + +ホスト特権 + +建物を生æˆã™ã‚‹ + +スーパーフラット + +ボーナス ãƒã‚§ã‚¹ãƒˆ + +世界ã®ã‚ªãƒ—ション + +å»ºè¨­ã¨æŽ¡æŽ˜ã®è¨±å¯ + +ドアã¨ã‚¹ã‚¤ãƒƒãƒã‚’使用å¯èƒ½ + +入れ物を使用å¯èƒ½ + +プレイヤーを攻撃å¯èƒ½ + +動物を攻撃å¯èƒ½ + +ホストオプションを変更ã§ãã‚‹ + +プレイヤーを追放 + +飛行å¯èƒ½ + +疲労無効 + +ä¸å¯è¦– + +ホスト オプション + +プレイヤー/招待 + +オンライン ゲーム + +招待者ã®ã¿ + +ãã®ä»–ã®ã‚ªãƒ—ション + +ロード + +æ–°ã—ã„世界 + +世界ã®åå‰ + +世界ã®ç¨® + +ランダムã«ç¨®ã‚’決ã‚ã‚‹å ´åˆã€ç©ºç™½ã®ã¾ã¾ã«ã—ã¦ãã ã•ã„ + +プレイヤー + +ゲームã«å‚加 + +ゲームを始ã‚ã‚‹ + +ゲームãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ + +プレイã™ã‚‹ + +ランキング + +実績 + +éŠã³æ–¹ & オプション + +完全版を購入 + +ã‚²ãƒ¼ãƒ ã«æˆ»ã‚‹ + +セーブ + +難易度: + +ゲームタイプ: + +ゲーマータグ: + +建物: + +レベルタイプ: + +PvP: + +é«˜åº¦ãªæ“作を許å¯: + +TNT ç«è–¬: + +ç«ã®å»¶ç„¼: + +テーマをå†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ« + +ゲーマー アイコン 1 ã‚’å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ« + +ゲーマー アイコン 2 ã‚’å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ« + +ã‚¢ãƒã‚¿ãƒ¼ アイテム 1 ã‚’å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ« + +ã‚¢ãƒã‚¿ãƒ¼ アイテム 2 ã‚’å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ« + +ã‚¢ãƒã‚¿ãƒ¼ アイテム 3 ã‚’å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ« + +オプション + +オーディオ + +コントロール + +グラフィック + +ユーザー インターフェイス + +デフォルトã«ãƒªã‚»ãƒƒãƒˆ + +ç”»é¢ã®æºã‚Œ + +ヒント + +プレイ中ã®ãƒœã‚¿ãƒ³ã‚¬ã‚¤ãƒ‰ + +ゲーム内ã§ã‚²ãƒ¼ãƒžãƒ¼ã‚¿ã‚°ã‚’表示 + +2 プレイヤー左å³åˆ†å‰²ç”»é¢ + +完了 + +看æ¿ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’編集: + +スクリーンショットã®èª¬æ˜Žã‚’入力ã—ã¦ãã ã•ã„ + +キャプション + +ゲームã®ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆ + +看æ¿ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’編集: + +Minecraft: Xbox 360 版ã§ä½œã£ãŸã‚ˆ! + +Minecraft 正統派ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã€ã‚¢ã‚¤ã‚³ãƒ³ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ インターフェイス! + +ã™ã¹ã¦ã®ãƒžãƒƒã‚·ãƒ¥ã‚¢ãƒƒãƒ—ã•れãŸä¸–界を表示ã™ã‚‹ + +転é€ã‚’セーブã™ã‚‹ã‚¹ãƒ­ãƒƒãƒˆã‚’é¸æŠžã™ã‚‹ + +空ã®ã‚¹ãƒ­ãƒƒãƒˆ + +セーブ メタデータをアップロード中 + +セーブ データをアップロード中 + +Xbox One 用ã«ã‚»ãƒ¼ãƒ–をアップロード中 + +アップロードãŒã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•れã¾ã—㟠+ +セーブ転é€ã‚¨ãƒªã‚¢ã¸ã®ã‚»ãƒ¼ãƒ–ã®ã‚¢ãƒƒãƒ—ロードãŒã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•れã¾ã—㟠+ +効果ãªã— + +スピード + +éˆåŒ– + +勤勉 + +疲労 + +力 + +弱体化 + +回復 + +ダメージ + +è·³èº + +ç›®ã¾ã„ + +å†ç”Ÿ + +è€æ€§ + +è€ç« + +æ°´ä¸­å‘¼å¸ + +ä¸å¯è¦– + +盲目 + +暗視 + +空腹 + +毒 + +スピード㮠+ +éˆåŒ–ã® + +勤勉㮠+ +疲労㮠+ +力㮠+ +弱体化㮠+ +回復㮠+ +ダメージ㮠+ +è·³èºã® + +ç›®ã¾ã„ã® + +å†ç”Ÿã® + +è€æ€§ã® + +è€ç«ã® + +水中呼å¸ã® + +ä¸å¯è¦–ã® + +盲目㮠+ +暗視㮠+ +空腹㮠+ +毒㮠+ + + +II + +III + +IV + + (スプラッシュ) + +陳è…㪠+ +退屈㪠+ +無個性㪠+ +クリア㪠+ +ミルキー㪠+ +æ‹¡æ•£ã—㟠+ +素朴㪠+ +è–„ã„ + +ä¸å®Œå…¨ãª + +æ°—ã®æŠœã‘㟠+ +ã‹ã•ã°ã‚‹ + +無様㪠+ +ãƒã‚¿ãƒ¼é¢¨å‘³ã® + +ãªã‚らã‹ãª + +上å“㪠+ +å°ç²‹ãª + +濃厚㪠+ +エレガント㪠+ +ファンシー㪠+ +ãƒãƒ£ãƒ¼ãƒŸãƒ³ã‚°ãª + +粋㪠+ +æ´—ç·´ã•れ㟠+ +真心㮠+ +ãらã‚ã + +強力㪠+ +よã©ã‚“ã  + +無臭㮠+ +悪臭㮠+ +刺激ã®ã‚ã‚‹ + +ãˆãã„ + +キモㄠ+ +臭ㄠ+ +ã™ã¹ã¦ã®ãƒãƒ¼ã‚·ãƒ§ãƒ³ã®åŸºç¤Žã«ä½¿ç”¨ã—ã¾ã™ã€‚調åˆå°ã§ä½¿ç”¨ã™ã‚‹ã¨ã€ãƒãƒ¼ã‚·ãƒ§ãƒ³ãŒã§ãã¾ã™ã€‚ + +å˜ä½“ã§ã¯åŠ¹æžœãŒã‚りã¾ã›ã‚“ãŒã€èª¿åˆå°ã§ä½¿ç”¨ã™ã‚‹ã“ã¨ãŒã§ãã€ææ–™ã‚’è¿½åŠ ã™ã‚‹ã¨ãƒãƒ¼ã‚·ãƒ§ãƒ³ãŒã§ãã¾ã™ã€‚ + +プレイヤーã€å‹•物ã€ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ã®ç§»å‹•スピードを上昇ã•ã›ã€ãƒ—レイヤーã®èµ°ã‚‹ã‚¹ãƒ”ードã€ã‚¸ãƒ£ãƒ³ãƒ—è·é›¢ã€è¦–界をå‘上ã•ã›ã¾ã™ + +プレイヤーã€å‹•物ã€ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ã®ç§»å‹•スピードを低下ã•ã›ã€ãƒ—レイヤーã®èµ°ã‚‹ã‚¹ãƒ”ードã€ã‚¸ãƒ£ãƒ³ãƒ—è·é›¢ã€è¦–界を低下ã•ã›ã¾ã™ + +ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ã‚„ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ã®æ”»æ’ƒãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’上昇ã•ã›ã¾ã™ + +ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ã‚„ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ã®æ”»æ’ƒãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’低下ã•ã›ã¾ã™ + +プレイヤーã€å‹•物ã€ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ã® HP を瞬時ã«å›žå¾©ã•ã›ã¾ã™ + +プレイヤーã€å‹•物ã€ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ã® HP ã‚’çž¬æ™‚ã«æ¸›å°‘ã•ã›ã¾ã™ + +プレイヤーã€å‹•物ã€ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ã® HP を時間ã¨ã¨ã‚‚ã«å›žå¾©ã•ã›ã¾ã™ + +プレイヤーã€å‹•物ã€ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ãŒã€ç«ã€æº¶å²©ã€Blaze 攻撃ã‹ã‚‰ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’å—ã‘ãªããªã‚Šã¾ã™ + +プレイヤーã€å‹•物ã€ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ã® HP を時間ã¨ã¨ã‚‚ã«æ¸›å°‘ã•ã›ã¾ã™ + +é‹­ã• + +è–ãªã‚‹åŠ› + +虫殺㗠+ +ノックãƒãƒƒã‚¯ + +ç«å±žæ€§ + +防護 + +é˜²ç« + +è½ä¸‹è»½æ¸› + +çˆ†ç™ºè€æ€§ + +é–“æŽ¥æ”»æ’ƒè€æ€§ + +æ°´ä¸­å‘¼å¸ + +水中作業 + +効率 + +技能 + +è€ä¹…力 + +アイテムボーナス + +å¹¸é‹ + +パワー + +ç«ç‚Ž + +è¡æ’ƒ + +ç„¡é™ + +I + +II + +III + +IV + +V + +VI + +VII + +VIII + +IX + +X + +鉄ã®ãƒ„ルãƒã‚·ä»¥ä¸Šã§æŽ˜ã‚Œã‚‹ã€‚ã‚¨ãƒ¡ãƒ©ãƒ«ãƒ‰ãŒæŽ¡ã‚Œã‚‹ + +ãƒã‚§ã‚¹ãƒˆã«ä¼¼ã¦ã„ã‚‹ãŒã€ç•°ãªã‚‹ä¸–界ã§ã‚‚エンダー ãƒã‚§ã‚¹ãƒˆã®ä¸­ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã™ã¹ã¦ã®ãƒ—レイヤーã®ã‚¨ãƒ³ãƒ€ãƒ¼ ãƒã‚§ã‚¹ãƒˆã§æ‰‹ã«å…¥ã‚Œã‚‹ã“ã¨ãŒã§ãã‚‹ + +接続ã—ãŸãƒˆãƒªãƒƒãƒ—ワイヤーをエンティティãŒé€šéŽã—ãŸæ™‚ã«èµ·å‹•ã™ã‚‹ + +エンティティãŒé€šéŽã—ãŸæ™‚ã«æŽ¥ç¶šã—ãŸãƒˆãƒªãƒƒãƒ—ワイヤー フックを起動ã™ã‚‹ + +エメラルドをä¿ç®¡ã™ã‚‹ã®ã«ä½¿ãˆã‚‹ + +丸石ã§ã§ããŸå£ + +武器ã€é“å…·ã€é˜²å…·ã®ä¿®ç†ã«ä½¿ç”¨ã§ãã‚‹ + +é—‡ã®ã‚¯ã‚©ãƒ¼ãƒ„を作るãŸã‚ã«ã‹ã¾ã©ã§ç²¾éŒ¬ã—㟠+ +飾りã¨ã—ã¦ä½¿ç”¨ã™ã‚‹ + +æ‘人ã¨å–引ã§ãã‚‹ + +飾り付ã‘ã¨ã—ã¦ä½¿ã†ã€‚花ã€è‹—木ã€ã‚µãƒœãƒ†ãƒ³ã€ãã®ã“ã‚’æ¤ãˆã‚‹ã“ã¨ãŒã§ãã‚‹ + +2{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚金ã®ãƒ‹ãƒ³ã‚¸ãƒ³ã®ææ–™ã¨ãªã‚‹ã€‚è¾²åœ°ã«æ¤ãˆã‚‹ã“ã¨ãŒã§ãã‚‹ + +0.5{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚ã‹ã¾ã©ã§èª¿ç†ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã€‚è¾²åœ°ã«æ¤ãˆã‚‹ã“ã¨ãŒã§ãã‚‹ + +3{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚ジャガイモをã‹ã¾ã©ã§èª¿ç†ã™ã‚‹ã¨ã§ãã‚‹ + +1{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚ã‹ã¾ã©ã§èª¿ç†ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã€‚è¾²åœ°ã«æ¤ãˆã‚‹ã“ã¨ãŒã§ãる。病気ã«ãªã‚‹å ´åˆãŒã‚ã‚‹ + +3{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚ニンジンã¨é‡‘ã®å¡Šã‹ã‚‰ä½œã‚‹ + +éžã‚’ç€ã‘ãŸè±šã«ä¹—ã£ãŸæ™‚ã€æ“縦ã™ã‚‹ã®ã«ä½¿ã† + +4{*ICON_SHANK_01*} 回復ã™ã‚‹ + +武器ã€é“å…·ã€é˜²å…·ã‚’エンãƒãƒ£ãƒ³ãƒˆã™ã‚‹ã®ã«é‡‘床ã¨ä¸€ç·’ã«ä½¿ç”¨ã™ã‚‹ + +é—‡ã®ã‚¯ã‚©ãƒ¼ãƒ„鉱石を掘ã£ã¦ä½œã‚‹ã€‚クォーツã®ãƒ–ãƒ­ãƒƒã‚¯ã®ææ–™ã«ãªã‚‹ + +ウールã‹ã‚‰ä½œã‚‰ã‚Œã‚‹ã€‚飾り付ã‘ã¨ã—ã¦ä½¿ã† + +エメラルド + +æ¤æœ¨é‰¢ + +ニンジン + +ジャガイモ + +ベイクド ãƒãƒ†ãƒˆ + +有毒ãªã‚¸ãƒ£ã‚¬ã‚¤ãƒ¢ + +金ã®ãƒ‹ãƒ³ã‚¸ãƒ³ + +棒付ãã®ãƒ‹ãƒ³ã‚¸ãƒ³ + +パンプキン パイ + +エンãƒãƒ£ãƒ³ãƒˆã—ãŸæœ¬ + +é—‡ã®ã‚¯ã‚©ãƒ¼ãƒ„ + +エメラルド鉱石 + +エンダー ãƒã‚§ã‚¹ãƒˆ + +トリップワイヤー フック + +トリップワイヤー + +エメラルドã®ãƒ–ロック + +丸石ã®å£ + +è‹”ã®ç”ŸãˆãŸä¸¸çŸ³ã®å£ + +æ¤æœ¨é‰¢ + +ニンジン + +ジャガイモ + +金床 + +金床 + +軽ã„ダメージをå—ã‘ãŸé‡‘床 + +é…·ã„ダメージをå—ã‘ãŸé‡‘床 + +é—‡ã®ã‚¯ã‚©ãƒ¼ãƒ„鉱石 + +クォーツã®ãƒ–ロック + +模様入りã®ã‚¯ã‚©ãƒ¼ãƒ„ã®ãƒ–ロック + +柱状ã®ã‚¯ã‚©ãƒ¼ãƒ„ã®ãƒ–ロック + +クォーツã®éšŽæ®µ + +カーペット + +é»’ã®ã‚«ãƒ¼ãƒšãƒƒãƒˆ + +赤ã®ã‚«ãƒ¼ãƒšãƒƒãƒˆ + +ç·‘ã®ã‚«ãƒ¼ãƒšãƒƒãƒˆ + +茶色ã®ã‚«ãƒ¼ãƒšãƒƒãƒˆ + +é’ã®ã‚«ãƒ¼ãƒšãƒƒãƒˆ + +ç´«ã®ã‚«ãƒ¼ãƒšãƒƒãƒˆ + +水色ã®ã‚«ãƒ¼ãƒšãƒƒãƒˆ + +è–„ç°è‰²ã®ã‚«ãƒ¼ãƒšãƒƒãƒˆ + +ç°è‰²ã®ã‚«ãƒ¼ãƒšãƒƒãƒˆ + +ピンクã®ã‚«ãƒ¼ãƒšãƒƒãƒˆ + +黄緑ã®ã‚«ãƒ¼ãƒšãƒƒãƒˆ + +黄色ã®ã‚«ãƒ¼ãƒšãƒƒãƒˆ + +空色ã®ã‚«ãƒ¼ãƒšãƒƒãƒˆ + +赤紫ã®ã‚«ãƒ¼ãƒšãƒƒãƒˆ + +オレンジã®ã‚«ãƒ¼ãƒšãƒƒãƒˆ + +白ã®ã‚«ãƒ¼ãƒšãƒƒãƒˆ + +模様入り砂岩 + +ãªã‚らã‹ãªç ‚岩 + +{*SOURCE*} ã«æå®³ã‚’ä¸Žãˆã‚ˆã†ã¨ã—㟠{*PLAYER*} ãŒå€’ã•れ㟠+ +{*PLAYER*} ã¯è½ä¸‹ã—ãŸé‡‘åºŠã«æ½°ã•れ㟠+ +{*PLAYER*} ã¯è½ä¸‹ã—ãŸãƒ–ãƒ­ãƒƒã‚¯ã«æ½°ã•れ㟠+ +{*PLAYER*} ã‚’ {*DESTINATION*} ã¸ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—㟠+ +{*PLAYER*} ã®å ´æ‰€ã¾ã§ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•れ㟠+ +{*PLAYER*} ãŒã‚ãªãŸã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•れ㟠+ +ã¨ã’ + +クォーツã®åŽšæ¿ + +水中をå«ã‚€æš—ã„エリアをã€ã¾ã‚‹ã§æ˜¼é–“ã®ã‚ˆã†ã«æ˜Žã‚‹ã表示ã—ã¾ã™ + +影響をå—ã‘るプレイヤーã€å‹•物ã€ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ã‚’ä¸å¯è¦–ã«ã—ã¾ã™ + +ä¿®ç† & åå‰ + +エンãƒãƒ£ãƒ³ãƒˆã®ã‚³ã‚¹ãƒˆ: %d + +高ã™ãŽã¾ã™! + +åå‰ã®å¤‰æ›´ + +所有: + +å–引ã«å¿…è¦ãªã‚¢ã‚¤ãƒ†ãƒ  + +{*VILLAGER_TYPE*} ã‹ã‚‰ã®ç”³ã—è¾¼ã¿: %s + +ä¿®ç† + +å–引 + +é¦–è¼ªã®æŸ“色 + + + ã“ã®é‡‘床ã®ç”»é¢ã§ã¯ã€çµŒé¨“値を使ã£ã¦æ­¦å™¨ã€é˜²å…·ã€é“å…·ã®åå‰ã‚’変更ã—ãŸã‚Šã€ä¿®ç†ã—ãŸã‚Šã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ + + + + {*B*} + 金床ã®ç”»é¢ã®èª¬æ˜Žã‚’ç¶šã‘ã‚‹ã«ã¯ {*CONTROLLER_VK_A*} を押ã—ã¦ãã ã•ã„。{*B*} + 金床ã®èª¬æ˜Žã‚’飛ã°ã™ã«ã¯ {*CONTROLLER_VK_B*} を押ã—ã¦ãã ã•ã„ + + + + アイテムを作るã«ã¯ã€1 ã¤ç›®ã®å…¥åŠ›ã‚¹ãƒ­ãƒƒãƒˆã«å…¥ã‚Œã¦ãã ã•ã„ + + + + 2 ã¤ç›®ã®å…¥åŠ›ã‚¹ãƒ­ãƒƒãƒˆã«æ­£ã—ã„ææ–™ (例: 壊れãŸé‰„ã®å‰£ã«é‰„ã®å»¶ã¹æ£’) ãŒå…¥ã‚‹ã¨ã€å‡ºåŠ›ã‚¹ãƒ­ãƒƒãƒˆã«ä¿®ç†å¯¾è±¡ã®ã‚¢ã‚¤ãƒ†ãƒ ãŒè¡¨ç¤ºã•れã¾ã™ + + + + åŒä¸€ã‚¢ã‚¤ãƒ†ãƒ ã‚’もㆠ1 ã¤ã€2 ã¤ç›®ã®å…¥åŠ›ã‚¹ãƒ­ãƒƒãƒˆã«å…¥ã‚Œã‚Œã°ã€2 ã¤ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’組ã¿åˆã‚ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ + + + + 金床ã®ä¸Šã§ã‚¢ã‚¤ãƒ†ãƒ ã‚’エンãƒãƒ£ãƒ³ãƒˆã™ã‚‹ã«ã¯ã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã—ãŸæœ¬ã‚’ 2 ã¤ç›®ã®å…¥åŠ›ã‚¹ãƒ­ãƒƒãƒˆã«å…¥ã‚Œã¾ã™ + + + + 作業ã«ã‹ã‹ã‚‹çµŒé¨“å€¤ã®æ•°ã¯ã€å‡ºåŠ›ã‚¹ãƒ­ãƒƒãƒˆã®ä¸‹ã«è¡¨ç¤ºã•れã¾ã™ã€‚経験値ãŒè¶³ã‚Šãªã„å ´åˆã€ä¿®ç†ã¯å®Œäº†ã—ã¾ã›ã‚“ + + + + テキストボックスã«è¡¨ç¤ºã•れãŸåå‰ã‚’編集ã™ã‚Œã°ã€ã‚¢ã‚¤ãƒ†ãƒ ã®åå‰ã‚’変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ + + + + ä¿®ç†ã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’拾ã†ã¨ã€é‡‘床ã§ä½¿ç”¨ã—ãŸä¸¡æ–¹ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’消費ã—ã€ãã®åˆ†çµŒé¨“値ãŒä¸‹ãŒã‚Šã¾ã™ + + + + ã“ã®ã‚¨ãƒªã‚¢ã«ã¯ã€é“å…·ã¨æ­¦å™¨ã®å…¥ã£ãŸé‡‘床ã¨ãƒã‚§ã‚¹ãƒˆãŒã‚りã¾ã™ + + + + {*B*} + 金床ã®è§£èª¬ã‚’ç¶šã‘ã‚‹ã«ã¯ {*CONTROLLER_VK_A*} を押ã—ã¦ãã ã•ã„。{*B*} + 金床ã®èª¬æ˜Žã‚’飛ã°ã™ã«ã¯ {*CONTROLLER_VK_B*} を押ã—ã¦ãã ã•ã„ + + + + 金床を使ã£ã¦æ­¦å™¨ã¨é“å…·ã‚’ä¿®ç†ã—ã€è€ä¹…度を回復ã•ã›ãŸã‚Šã€åå‰ã‚’変更ã—ãŸã‚Šã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã—ãŸæœ¬ã‚’使ã£ã¦ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ + + + + エンãƒãƒ£ãƒ³ãƒˆã—ãŸæœ¬ã¯ã€ãƒ€ãƒ³ã‚¸ãƒ§ãƒ³å†…ã®ãƒã‚§ã‚¹ãƒˆã®ä¸­ã«ã‚ã‚‹ã‹ã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆãƒ†ãƒ¼ãƒ–ãƒ«ã§æ™®é€šã®æœ¬ã‚’エンãƒãƒ£ãƒ³ãƒˆã—ã¦ä½œã‚‹ã“ã¨ãŒã§ãã¾ã™ + + + + 金床を使ã†ã¨çµŒé¨“値を消費ã—ã€ä½¿ã†ãŸã³ã«é‡‘床ã«ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’与ãˆã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ + + + + å¿…è¦ãªä½œæ¥­å†…容ã€ã‚¢ã‚¤ãƒ†ãƒ ã®ä¾¡å€¤ã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã®å›žæ•°ãŠã‚ˆã³éŽåŽ»ã«è¡Œã£ãŸä½œæ¥­ã®æ•°ã®ã™ã¹ã¦ãŒä¿®ç†ã‚³ã‚¹ãƒˆã«å½±éŸ¿ã‚’与ãˆã¾ã™ + + + + アイテムã®åå‰ã‚’変更ã™ã‚‹ã¨ã€ã™ã¹ã¦ã®ãƒ—レイヤーã«å¯¾ã—ã¦è¡¨ç¤ºã•れるåå‰ãŒå¤‰ã‚りã€ä½œæ¥­ã‚³ã‚¹ãƒˆãŒæ°¸ä¹…ã«ä¸‹ãŒã£ãŸã¾ã¾ã«ãªã‚Šã¾ã™ + + + + ã“ã®ã‚¨ãƒªã‚¢ã®ãƒã‚§ã‚¹ãƒˆã®ä¸­ã«ã¯ã€å®Ÿé¨“ã«ä½¿ã†ã“ã¨ãŒã§ãã‚‹ã€å£Šã‚ŒãŸãƒ„ルãƒã‚·ã€åŽŸææ–™ã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã®ãƒ“ンãŠã‚ˆã³ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã—ãŸæœ¬ãŒå…¥ã£ã¦ã„ã¾ã™ + + + + ã“ã®å–引ã®ç”»é¢ã§ã¯ã€æ‘人を相手ã«è¡Œã†ã“ã¨ã®ã§ãã‚‹å–引ãŒè¡¨ç¤ºã•れã¾ã™ + + + + {*B*} + å–引ã®ç”»é¢ã®èª¬æ˜Žã‚’ç¶šã‘ã‚‹ã«ã¯ {*CONTROLLER_VK_A*} を押ã—ã¦ãã ã•ã„。{*B*} + å–引ã®ç”»é¢ã®èª¬æ˜Žã‚’飛ã°ã™ã«ã¯ {*CONTROLLER_VK_B*} を押ã—ã¦ãã ã•ã„ + + + + ç¾åœ¨ã€æ‘人ãŒå¸Œæœ›ã—ã¦ã„ã‚‹ã™ã¹ã¦ã®å–引ã¯ã€ç”»é¢ä¸Šéƒ¨ã«è¡¨ç¤ºã•れã¾ã™ + + + + å¿…è¦ãªã‚¢ã‚¤ãƒ†ãƒ ã‚’æŒã£ã¦ã„ãªã„å ´åˆã€ãã®å–引ã¯èµ¤ã§è¡¨ç¤ºã•れã€åˆ©ç”¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ + + + + æ‘äººã«æ¸¡ã™ã‚¢ã‚¤ãƒ†ãƒ ã®æ•°ã¨ç¨®é¡žã¯ã€ç”»é¢å·¦å´ã® 2 ã¤ã®ãƒœãƒƒã‚¯ã‚¹å†…ã«è¡¨ç¤ºã•れã¾ã™ + + + + å–引ã«å¿…è¦ãªã‚¢ã‚¤ãƒ†ãƒ ã®åˆè¨ˆã¯ã€ç”»é¢å·¦å´ã® 2 ã¤ã®ãƒœãƒƒã‚¯ã‚¹ã«è¡¨ç¤ºã•れã¾ã™ + + + + æ‘人ãŒç”³ã—出ã¦ã„るアイテムã¨å–引ã™ã‚‹ã«ã¯ {*CONTROLLER_VK_A*} を押ã—ã¦ãã ã•ã„ + + + + ã“ã®ã‚¨ãƒªã‚¢ã«ã¯æ‘人ã¨ã€ã‚¢ã‚¤ãƒ†ãƒ ã‚’購入ã™ã‚‹ãŸã‚ã®ç´™ãŒå…¥ã£ãŸãƒã‚§ã‚¹ãƒˆãŒã‚りã¾ã™ + + + + {*B*} + å–引ã®èª¬æ˜Žã‚’ç¶šã‘ã‚‹ã«ã¯ {*CONTROLLER_VK_A*} を押ã—ã¦ãã ã•ã„。{*B*} + å–引ã®èª¬æ˜Žã‚’飛ã°ã™ã«ã¯ {*CONTROLLER_VK_B*} を押ã—ã¦ãã ã•ã„ + + + + プレイヤーã¯ã€æŒã¡ç‰©ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’æ‘人ã¨å–引ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ + + + + æ‘人ãŒç”³ã—出るå–引ã¯ã€è·æ¥­ã«ã‚ˆã£ã¦ç•°ãªã‚Šã¾ã™ + + + + ã„ãã¤ã‹ã®å–引を組ã¿åˆã‚ã›ã¦å®Ÿè¡Œã™ã‚‹ã¨ã€æ‘人ã®å–引ãŒãƒ©ãƒ³ãƒ€ãƒ ã«è¿½åŠ ã¾ãŸã¯å¤‰æ›´ã•れã¾ã™ + + + + é »ç¹ã«ä½¿ç”¨ã•れãŸå–引ã¯ã€ä¸€æ™‚çš„ã«å‰Šé™¤ã•れるã“ã¨ãŒã‚りã¾ã™ãŒã€æ‘人ã¯å¸¸ã«å°‘ãªãã¨ã‚‚ 1 回ã¯å–引を申ã—出ã¾ã™ + + + + ãƒã‚§ã‚¹ãƒˆã®ä¸­ã®ç´™ã‚’何枚ã‹å–り出ã—ã€ã“ã“ã®æ‘人ã¨å–引ã—ã¦ã¿ã¦ãã ã•ã„ + + + + ã“ã®ã‚¨ãƒªã‚¢ã«ã¯ã€ã‚¨ãƒ³ãƒ€ãƒ¼ ãƒã‚§ã‚¹ãƒˆãŒ 2 ã¤ã‚りã¾ã™ + + + + {*B*} + エンダー ãƒã‚§ã‚¹ãƒˆã®è§£èª¬ã‚’ç¶šã‘ã‚‹ã«ã¯ {*CONTROLLER_VK_A*} を押ã—ã¦ãã ã•ã„。{*B*} + エンダー ãƒã‚§ã‚¹ãƒˆã®è§£èª¬ã‚’飛ã°ã™ã«ã¯ {*CONTROLLER_VK_B*} を押ã—ã¦ãã ã•ã„ + + + + ã™ã¹ã¦ã®ã‚¨ãƒ³ãƒ€ãƒ¼ ãƒã‚§ã‚¹ãƒˆã¯ã€ä¸–界を超ãˆã¦ãƒªãƒ³ã‚¯ã—ã¦ã„ã¾ã™ã€‚エンダー ãƒã‚§ã‚¹ãƒˆã«å…¥ã‚Œã‚‰ã‚ŒãŸã‚¢ã‚¤ãƒ†ãƒ ã¯ã€ä»–ã®ã©ã®ã‚¨ãƒ³ãƒ€ãƒ¼ ãƒã‚§ã‚¹ãƒˆã‹ã‚‰ã§ã‚‚利用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ + + + + エンダー ãƒã‚§ã‚¹ãƒˆã®ä¸­èº«ã¯ãƒ—レイヤーã«ã‚ˆã£ã¦ç•°ãªã‚Šã¾ã™ + + + + ã“れã«ã‚ˆã‚Šã€ãƒ—レイヤーã¯ã©ã®ã‚¨ãƒ³ãƒ€ãƒ¼ ãƒã‚§ã‚¹ãƒˆã«ã‚‚アイテムをä¿ç®¡ã§ãã€ä¸–界ã®ã©ã®å ´æ‰€ã®ã‚¨ãƒ³ãƒ€ãƒ¼ ãƒã‚§ã‚¹ãƒˆã‹ã‚‰ã§ã‚‚アイテムをå–り出ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ã„ãšã‚Œã‹ã®ã‚¨ãƒ³ãƒ€ãƒ¼ ãƒã‚§ã‚¹ãƒˆã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’入れã¦è©¦ã—ã¦ã¿ã¾ã—ょㆠ+ + +2{*ICON_SHANK_01*} 回復ã—ã€HP ㌠30 秒間自動回復ã—ã€è€ç«ã¨ãƒ€ãƒ¡ãƒ¼ã‚¸è€æ€§ã‚’ 5 分間与ãˆã‚‹ã€‚リンゴã¨é‡‘ã®ãƒ–ロックã‹ã‚‰ä½œã‚‹ + +テレãƒãƒ¼ãƒˆå¯èƒ½ + +テレãƒãƒ¼ãƒˆ + +プレイヤーã¸ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹ + +自分ã¸ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹ + +疲労を無効ã«ã§ãã‚‹ + +ä¸å¯è¦–ã«ãªã‚Œã‚‹ + +ä¸å¯è¦–を有効ã«ã§ãるよã†ã«ãªã‚Šã¾ã—㟠+ +ä¸å¯è¦–を有効ã«ã§ããªããªã‚Šã¾ã—㟠+ +飛行を有効ã«ã§ãるよã†ã«ãªã‚Šã¾ã—㟠+ +飛行を有効ã«ã§ããªããªã‚Šã¾ã—㟠+ +疲労を有効ã«ã§ãるよã†ã«ãªã‚Šã¾ã—㟠+ +疲労を有効ã«ã§ããªããªã‚Šã¾ã—㟠+ +テレãƒãƒ¼ãƒˆã§ãã¾ã™ + +テレãƒãƒ¼ãƒˆã§ããªããªã‚Šã¾ã—㟠+ +{*T3*}éŠã³æ–¹: 金床{*ETW*}{*B*}{*B*} +経験値ã¯ã€é‡‘床ã¨ä¸€ç·’ã«ã‚¢ã‚¤ãƒ†ãƒ ã®ä¿®ç†ã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã¾ãŸã¯åå‰ã®å¤‰æ›´ã«ã‚‚使ã†ã“ã¨ãŒã§ãã¾ã™ã€‚{*B*} +ã™ã¹ã¦ã®ã‚¢ã‚¤ãƒ†ãƒ ã®åå‰ã¯å¤‰æ›´ã§ãã¾ã™ãŒã€ä¿®ç†ã¾ãŸã¯ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã—ãŸæœ¬ã‚’用ã„ã¦ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã§ãã‚‹ã®ã¯è€ä¹…力ã®ã‚るアイテムã ã‘ã§ã™ã€‚{*B*} +アイテムを修ç†ã™ã‚‹ã«ã¯ã€ã‚¢ã‚¤ãƒ†ãƒ ã¨ææ–™ (鉄ã®å‰£ã«ã¯é‰„ã®å»¶ã¹æ£’ãªã©) ã¾ãŸã¯åŒã˜ã‚¿ã‚¤ãƒ—ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’組ã¿åˆã‚ã›ã¦ã€å·¦å´ã®å…¥åŠ›ã‚¹ãƒ­ãƒƒãƒˆã«å…¥ã‚Œã¾ã™ã€‚{*B*} +アイテムを組ã¿åˆã‚ã›ã‚‹å ´åˆã€é‡‘床ã¨çµ„ã¿åˆã‚ã›ã‚‹ã®ãŒã‚ˆã‚ŠåŠ¹æžœçš„ã§ã™ã€‚ã•らã«ã€ã©ã¡ã‚‰ã‹ãŒã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã•れãŸã‚¢ã‚¤ãƒ†ãƒ ã®å ´åˆã€å®Œæˆã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã¯å…¥åŠ›ã‚¹ãƒ­ãƒƒãƒˆã«å…¥ã‚ŒãŸã©ã¡ã‚‰ã‹ã®ã‚¢ã‚¤ãƒ†ãƒ ã«ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã•れã¾ã™ã€‚{*B*} +エンãƒãƒ£ãƒ³ãƒˆã—ãŸæœ¬ãŒé©åˆ‡ã§ã‚れã°ã€ã‚¢ã‚¤ãƒ†ãƒ ã‚’金床ã§çµ„ã¿åˆã‚ã›ã‚‹ã“ã¨ã§ã€ã‚¢ã‚¤ãƒ†ãƒ ã‚’エンãƒãƒ£ãƒ³ãƒˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚エンãƒãƒ£ãƒ³ãƒˆã—ãŸæœ¬ã¯ãƒ€ãƒ³ã‚¸ãƒ§ãƒ³å†…ã®ãƒã‚§ã‚¹ãƒˆã§è¦‹ã¤ã‘ã‚‹ã‹ã€æ™®é€šã®æœ¬ã‚’エンãƒãƒ£ãƒ³ãƒˆãƒ†ãƒ¼ãƒ–ルã§ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚{*B*} +金床ã¯ä½¿ç”¨ã™ã‚‹ãŸã³ã«ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’å—ã‘ã‚‹ã“ã¨ãŒã‚りã€é…·ä½¿ã—éŽãŽã‚‹ã¨å£Šã‚Œã¦ã—ã¾ã„ã¾ã™{*B*} + + +{*T3*}éŠã³æ–¹: å–引{*ETW*}{*B*}{*B*} +æ‘人ã¨ã‚¢ã‚¤ãƒ†ãƒ ã‚’å–引ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚æ‘人ã¯ãれãžã‚Œã€è¾²æ°‘ã€è‚‰å±‹ã€é›å†¶å±‹ã€å¸æ›¸ã€å¸ç¥­ãªã©ã®è·æ¥­ã«å°±ã„ã¦ã„ã¦ã€å–引対象ã¨ãªã‚‹ã‚¢ã‚¤ãƒ†ãƒ ã®ç¨®é¡žã«å½±éŸ¿ã‚’åŠã¼ã—ã¾ã™ã€‚{*B*} +å–引メニューã§ã€æ‘äººãŒæä¾›ã—ã¦ã„ã‚‹ã™ã¹ã¦ã®å–引ã®ãƒªã‚¹ãƒˆã‚’見るã“ã¨ãŒã§ãã¾ã™ã€‚ã‚ã¾ã‚Šé »ç¹ã«ä½¿ç”¨ã™ã‚‹ã¨ã€ãã®å–引ã¯ä¸€æ™‚çš„ã«ç„¡åйã«ãªã‚Šã¾ã™ãŒã€ãƒ—レイヤーãŒã“れを使用ã—ã¦å–引を行ã†ã¨ã€æ‘人ã¯å–引内容を変更ã—ãŸã‚Šè¿½åŠ ã—ãŸã‚Šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚{*B*} +å–引ã¯é€šå¸¸ã€ã„ãã¤ã‹ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’売買ã—ã¦ã‚¨ãƒ¡ãƒ©ãƒ«ãƒ‰ã‚’手ã«å…¥ã‚Œã‚‹ã“ã¨ã‚’指ã—ã¾ã™ã€‚{*B*} +å–引ã«å¿…è¦ãªã‚¢ã‚¤ãƒ†ãƒ ã‚’æŒã£ã¦ã„ãªã„å ´åˆã€ã‚¢ã‚¤ãƒ†ãƒ ãŒèµ¤ã表示ã•れã¾ã™{*B*} + + +{*T3*}éŠã³æ–¹: エンダー ãƒã‚§ã‚¹ãƒˆ {*ETW*}{*B*}{*B*} +ゲームã®ä¸–界ã®ã‚¨ãƒ³ãƒ€ãƒ¼ ãƒã‚§ã‚¹ãƒˆã¯ã™ã¹ã¦ãƒªãƒ³ã‚¯ã—ã¦ã„ã¦ã€ä¸­ã«ä¿ç®¡ã•れãŸã‚¢ã‚¤ãƒ†ãƒ ã¯ã©ã®ã‚¨ãƒ³ãƒ€ãƒ¼ ãƒã‚§ã‚¹ãƒˆã‹ã‚‰ã‚‚アクセスã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚エンダー ãƒã‚§ã‚¹ãƒˆã®ä¸­èº«ã¯ãƒ—レイヤーã”ã¨ã«ç•°ãªã‚Šã¾ã™ã€‚エンダー ãƒã‚§ã‚¹ãƒˆã«å…¥ã‚Œã‚‰ã‚ŒãŸã‚¢ã‚¤ãƒ†ãƒ ã¯ã€ä¸–界ã®ã©ã®å ´æ‰€ã«ã‚るエンダー ãƒã‚§ã‚¹ãƒˆã‹ã‚‰ã§ã‚‚利用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ + + +農民 + +叿›¸ + +å¸ç¥­ + +é›å†¶å±‹ + +肉屋 + +æ‘ã«ã‚る。æ‘人ãŒè·æ¥­ã«ã‚ˆã£ã¦ç•°ãªã‚‹ã‚¢ã‚¤ãƒ†ãƒ ã®å£²å´ã‚’申ã—出る + +大ããªãƒã‚§ã‚¹ãƒˆ + + + エンãƒãƒ£ãƒ³ãƒˆã—ãŸæœ¬ã¯ã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆãƒ†ãƒ¼ãƒ–ルã§ä½œã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“れを後ã§é‡‘床ã§ä½¿ãˆã°ã€ã‚¢ã‚¤ãƒ†ãƒ ã‚’エンãƒãƒ£ãƒ³ãƒˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ + + + + トリップワイヤー フックã¯ã€ãƒ¯ã‚¤ãƒ¤ãƒ¼é–“ã‚’ã¤ãªãã²ã‚‚ã«ä½•ã‹ãŒè§¦ç™ºã—ã¦ã„れã°ã€å›žè·¯ã«å‹•力を与ãˆç¶šã‘ã¾ã™ + + + + é£¼ã„æ…£ã‚‰ã—ãŸã‚ªã‚ªã‚«ãƒŸã¯å¸¸ã«é¦–輪をç€ã‘ã¾ã™ã€‚首輪ã®è‰²ã¯ã€æŸ“色ã—ã¦å¤‰ãˆã‚‹ã“ã¨ãŒã§ãã¾ã™ + + +ニンジンやジャガイモã¯ã€æ¤ãˆã¦æ ½åŸ¹ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚地上ã«é‡Žèœã®å§¿ãŒè¦‹ãˆãŸã‚‰åŽç©«ã®æº–備完了ã§ã™ + + + 豚ã«éžã‚’ç€ã‘れã°ãƒ—レイヤーã¯ä¹—ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚éžã‚’ç€ã‘ãŸè±šã¯ã€æ£’付ãã®ãƒ‹ãƒ³ã‚¸ãƒ³ã§é‡£ã£ã¦æ“縦ã—ã¾ã™ + + + + {*CONTROLLER_ACTION_MOVE*}ã§ãƒˆãƒ­ãƒƒã‚³ã‚’ゆã£ãり動ã‹ã›ã¾ã™ã€‚トロッコを加速レールã«ä¹—ã›ã¦èµ°ã‚‰ã›ã¾ã™ + + +分割画é¢ãƒ—レイã¯é«˜è§£åƒåº¦ãƒ¢ãƒ¼ãƒ‰ã§ã—ã‹å¯¾å¿œã—ã¦ã„ãªã„ãŸã‚ã€ã‚²ãƒ¼ãƒ ã«å‚加ã§ãã¾ã›ã‚“。å‚加ã™ã‚‹ã«ã¯ã€å‚加中ã®ãƒ—レイヤーをサインアウトã—ã¦ãã ã•ã„ + +治癒 + +Xbox 360 + +Back + +ã“ã®ã‚ªãƒ—ションã§ã¯ã€å®Ÿç¸¾ãŠã‚ˆã³ãƒ©ãƒ³ã‚­ãƒ³ã‚°æ›´æ–°ã¯ç„¡åйã«ãªã‚Šã¾ã™ã€‚ + +Xbox One 用ã«ã‚»ãƒ¼ãƒ–をアップロード + +セーブをアップロード + +セーブ転é€ã‚¨ãƒªã‚¢ã«ä¸€åº¦ã«ä¿ç®¡ã§ãã‚‹ã®ã¯ Xbox 360 本体 1 å°ã®ã‚»ãƒ¼ãƒ–ã®ã¿ã§ã™ã€‚別㮠Xbox 360 本体セーブã«èª­ã¿è¾¼ã‚€å‰ã«ã€ãŠä½¿ã„ã® Xbox One 本体ã«ã‚»ãƒ¼ãƒ–をダウンロードã—ãŸã‹ã”確èªãã ã•ã„ + +読ã¿è¾¼ã¿ä¸­... + +読ã¿è¾¼ã¿ãŒå®Œäº†ã—ã¾ã—ãŸ! + +読ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚後ã»ã©æ”¹ã‚ã¦ãŠè©¦ã—ãã ã•ã„ + + diff --git a/Minecraft.Client/Common/Media/ko-KR/4J_strings.resx b/Minecraft.Client/Common/Media/ko-KR/4J_strings.resx new file mode 100644 index 00000000..a084ef5d --- /dev/null +++ b/Minecraft.Client/Common/Media/ko-KR/4J_strings.resx @@ -0,0 +1,108 @@ + +사용 안 함 + +í™•ì¸ + +뒤로 + +취소 + +예 + +아니요 + +저장 ë°ì´í„° ì†ìƒ + +저장 ë°ì´í„°ê°€ ì†ìƒë˜ì—ˆìŠµë‹ˆë‹¤. 새로 저장한 ë‹¤ìŒ ê¸°ì¡´ ë°ì´í„°ë¥¼ ë®ì–´ì“°ì‹œê² ìŠµë‹ˆê¹Œ? + +여유 공간 부족 + +ì„ íƒí•œ 저장 ìž¥ì¹˜ì— ê³µê°„ì´ ë¶€ì¡±í•˜ì—¬ 새 저장 ë°ì´í„°ë¥¼ 만들 수 없습니다. + +다시 ì„ íƒ + +저장하지 않고 í”Œë ˆì´ + +새 저장 ë°ì´í„° ìƒì„± + +ë®ì–´ì“°ì‹œê² ìŠµë‹ˆê¹Œ? + +저장 ë°ì´í„°ê°€ 들어 있는 저장 장치를 ì„ íƒí–ˆìŠµë‹ˆë‹¤. ë®ì–´ì“°ì‹œê² ìŠµë‹ˆê¹Œ? + +아니요, ë®ì–´ì“°ì§€ 않습니다. + +ë®ì–´ì“°ê³  저장합니다. + +저장 실패 + +저장 장치 문제 + +저장 장치를 사용할 수 없거나 ìž¥ì¹˜ì— ì˜¤ë¥˜ê°€ 있습니다. + +저장 장치를 사용할 수 없거나 저장 ìž¥ì¹˜ì— ì˜¤ë¥˜ê°€ 있습니다. 다른 저장 장치를 ì„ íƒí•˜ì‹­ì‹œì˜¤. + +새 저장 장치 ì„ íƒ + +ì„ íƒí•œ 저장 장치 ì—†ìŒ + +저장 장치를 ì„ íƒí•˜ì§€ 않으면 ê²Œìž„ì„ ì €ìž¥í•  수 없습니다. + +저장 장치 ì„ íƒ + +저장하지 않고 계ì†í•˜ê¸° + +저장 장치가 제거ë˜ì—ˆìŠµë‹ˆë‹¤. 새 장치를 ì„ íƒí•˜ì‹­ì‹œì˜¤. + +불러오기 실패 + +저장 ë°ì´í„° ì´ë¦„ ìž…ë ¥ + +저장 ë°ì´í„° ì´ë¦„ì„ ìž…ë ¥í•˜ì‹­ì‹œì˜¤. + +Xbox 대시보드로 ëŒì•„가기 + +ê²Œìž„ì„ ì¢…ë£Œí•˜ì‹œê² ìŠµë‹ˆê¹Œ? + +로그아웃 + +게ì´ë¨¸ 프로필ì—서 로그아웃했으므로 타ì´í‹€ 화면으로 ëŒì•„갑니다. + +게ì´ë¨¸ 프로필ì—서 로그아웃했으므로 매치가 종료ë습니다. + +ê³„ì† í”Œë ˆì´ + +게ì´ë¨¸ í”„ë¡œí•„ì´ ì˜¤í”„ë¼ì¸ ìƒíƒœìž…니다. + +ì´ ê²Œìž„ 기능 중 ì¼ë¶€ëŠ” 게ì´ë¨¸ 프로필로 Xbox Liveì— ë¡œê·¸ì¸í•´ì•¼ ì´ìš©í•  수 있습니다. 현재는 오프ë¼ì¸ ìƒíƒœìž…니다. + +ì´ ê¸°ëŠ¥ì„ ì´ìš©í•˜ë ¤ë©´ 게ì´ë¨¸ 프로필로 Xbox Liveì— ë¡œê·¸ì¸í•´ì•¼ 합니다. + +Xbox Live ì—°ê²° + +오프ë¼ì¸ìœ¼ë¡œ 계ì†í•˜ê¸° + +ë„ì „ 과제 ìƒí’ˆ 문제 + +플레ì´ì–´ì˜ 게임 í”„ë¡œí•„ì— ì ‘ì†í•˜ëŠ” ì¤‘ì— ë¬¸ì œê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤. ë„ì „ 과제 ìƒí’ˆì´ 지급ë˜ì§€ 않습니다. + +게ì´ë¨¸ 프로필 문제 + +게ì´ë¨¸ í”„ë¡œí•„ì— ì„¤ì •ì„ ì €ìž¥í•˜ì§€ 못했습니다. + +ì†ë‹˜ 게ì´ë¨¸ 프로필 + +ì†ë‹˜ 게ì´ë¨¸ 프로필로 ì´ìš©í•  수 없는 기능입니다. 다른 게ì´ë¨¸ í”„ë¡œí•„ì„ ì„ íƒí•˜ì‹­ì‹œì˜¤. + +저장하는 중... + +콘í…츠를 저장하고 있습니다. 본체를 ë„ì§€ 마십시오. + +ì •ì‹ ë²„ì „ 게임 구매 + +ì´ Minecraft는 í‰ê°€íŒìž…니다. ì •ì‹ ë²„ì „ 게임ì—서는 ë„ì „ 과제를 달성할 수 있습니다. +ì •ì‹ ë²„ì „ ê²Œìž„ì„ êµ¬ë§¤í•˜ë©´ Minecraftì˜ ëª¨ë“  ê¸°ëŠ¥ì„ ì´ìš©í•˜ê³  Xbox Live를 통해 ì „ ì„¸ê³„ì˜ ì¹œêµ¬ë“¤ê³¼ 함께 ê²Œìž„ì„ ì¦ê¸¸ 수 있습니다. +ì •ì‹ ë²„ì „ ê²Œìž„ì„ êµ¬ë§¤í•˜ì‹œê² ìŠµë‹ˆê¹Œ? + +í”„ë¡œí•„ì„ ì½ëŠ” ë° ë¬¸ì œê°€ ë°œìƒí•˜ì—¬ 주 메뉴로 ëŒì•„갑니다. + + diff --git a/Minecraft.Client/Common/Media/ko-KR/strings.resx b/Minecraft.Client/Common/Media/ko-KR/strings.resx new file mode 100644 index 00000000..17c67711 --- /dev/null +++ b/Minecraft.Client/Common/Media/ko-KR/strings.resx @@ -0,0 +1,4465 @@ + +새 다운로드 콘í…츠가 준비ë˜ì—ˆìŠµë‹ˆë‹¤! 주 ë©”ë‰´ì˜ Minecraft ìƒì ì—서 ì´ìš©í•  수 있습니다. + +Minecraft ìƒì ì˜ ìºë¦­í„° 팩으로 ìºë¦­í„°ì˜ ì™¸í˜•ì„ ë°”ê¿€ 수 있습니다. 주 ë©”ë‰´ì˜ 'Minecraft ìƒì 'ì„ ì„ íƒí•´ 확ì¸í•´ 보십시오. + +고화질(HD) 모드ì—서는 í•˜ë‚˜ì˜ ë³¸ì²´ì—서 ë¶„í•  화면으로 최대 4명까지 ê²Œìž„ì„ ì¦ê¸¸ 수 있습니다. + +ê²Œìž„ì— ì°¸ê°€í•˜ë ¤ë©´ ë³¸ì²´ì— ì¶”ê°€ 컨트롤러를 연결하고 START를 누르십시오. + +ê²Œìž„ì˜ ë°ê¸°ë¥¼ 높ì´ê±°ë‚˜ 낮추려면 ê°ë§ˆ ì„¤ì •ì„ ë³€ê²½í•˜ì‹­ì‹œì˜¤. + +ë‚™ì› ë‚œì´ë„를 ì„ íƒí•˜ë©´ ì²´ë ¥ì´ ìžë™ìœ¼ë¡œ 회복ë˜ê³  ë°¤ì— ê´´ë¬¼ì´ ì¶œëª°í•˜ì§€ 않습니다! + +늑대를 길들ì´ë ¤ë©´ 뼈를 먹ì´ì‹­ì‹œì˜¤. ê¸¸ë“¤ì¸ ëŠ‘ëŒ€ëŠ” 앉게 하거나 플레ì´ì–´ë¥¼ 따르게 í•  수 있습니다. + +소지품 메뉴 밖으로 í¬ì¸í„°ë¥¼ 옮기고 {*CONTROLLER_VK_A*} 단추를 눌러 ì•„ì´í…œì„ 버릴 수 있습니다. + +ë°¤ì— ì¹¨ëŒ€ì—서 ìžë©´ ì‹œê°„ì„ ìƒˆë²½ìœ¼ë¡œ 건너뛸 수 있습니다. 멀티 플레ì´ì–´ 게임ì—서는 ë™ì‹œì— 모든 플레ì´ì–´ê°€ 잠들어야 합니다. + +ë¼ì§€ì—서 ë¼ì§€ê³ ê¸°ë¥¼ 수확하고 요리하여 먹으면 ì²´ë ¥ì´ íšŒë³µë©ë‹ˆë‹¤. + +소ì—서 ê°€ì£½ì„ ìˆ˜í™•í•˜ê³  ê·¸ ê°€ì£½ì„ ì‚¬ìš©í•´ 방어구를 만드십시오. + +빈 ì–‘ë™ì´ë¥¼ 사용하면 소ì—서 짜낸 우유, 물, ë˜ëŠ” ìš©ì•”ì„ ë‹´ì„ ìˆ˜ 있습니다! + +ì‹ë¬¼ì„ ì‹¬ì„ ë•…ì„ ì¤€ë¹„í•˜ë ¤ë©´ ê´­ì´ë¥¼ 사용하십시오. + +거미는 ë‚®ì— í•œí•´ 먼저 공격하지 않는 한 ì´ìª½ì„ 공격하지 않습니다. + +삽으로 í™ì´ë‚˜ 모래를 파는 ê²ƒì´ ì†ìœ¼ë¡œ 파는 것보다 빠릅니다! + +ë¼ì§€ê³ ê¸°ë¥¼ 날로 먹는 것보다 요리해서 ë¨¹ì„ ë•Œ ì²´ë ¥ì´ ë” ë§Žì´ íšŒë³µë©ë‹ˆë‹¤. + +ë°¤ì— ë¶ˆì„ ë°ížˆë ¤ë©´ íšƒë¶ˆì„ ë§Œë“œì‹­ì‹œì˜¤. ê´´ë¬¼ë“¤ì€ íšƒë¶ˆ 근처 지역ì—는 접근하지 않습니다. + +광물 수레와 ë ˆì¼ì„ 사용해서 목ì ì§€ê¹Œì§€ ë” ë¹ ë¥´ê²Œ ì´ë™í•˜ì‹­ì‹œì˜¤. + +ë¬˜ëª©ì„ ì‹¬ìœ¼ë©´ ìžë¼ì„œ 나무가 ë©ë‹ˆë‹¤. + +Pigmanì€ ë¨¼ì € 공격하지 않는 한 ì´ìª½ì„ 공격하지 않습니다. + +플레ì´ì–´ëŠ” 게임 시작 ì§€ì ì„ 변경할 수 있으며 침대ì—서 취침하여 ì‹œê°„ì„ ìƒˆë²½ìœ¼ë¡œ 건너뛸 수 있습니다. + +Ghastê°€ ì˜ëŠ” 불ë©ì´ë¥¼ ë˜ë°›ì•„치십시오! + +ì°¨ì›ë¬¸ì„ 지으면 다른 ì°¨ì›ì˜ ì„¸ê³„ì¸ ì§€í•˜ë¡œ ì—¬í–‰ì„ ë– ë‚  수 있습니다. + +{*CONTROLLER_VK_B*} 단추를 누르면 지금 ì†ì— 들고 있는 ì•„ì´í…œì„ 버립니다. + +ìƒí™©ì— 맞는 ë„구를 사용하십시오! + +íšƒë¶ˆì— ì“¸ ì„íƒ„ì´ ì—†ì„ ë•ŒëŠ” 화로 ì•ˆì˜ ë‚˜ë¬´ì—서 ìˆ¯ì„ ë§Œë“¤ 수 있습니다. + +ë•…ì„ ê³„ì† ìœ„ë¡œ 파거나 ê³„ì† ì•„ëž˜ë¡œ 파는 ê²ƒì€ ê·¸ë¦¬ 좋지 않습니다. + +해골 뼈ì—서 ì–»ì„ ìˆ˜ 있는 뼛가루는 ìž‘ë¬¼ì„ ì¦‰ì‹œ ìžë¼ê²Œ 하는 비료로 쓸 수 있습니다. + +Creeper는 접근하면 í­ë°œí•©ë‹ˆë‹¤. + +í‘ìš”ì„ì€ ë¬¼ê³¼ 용암 재료 블ë¡ì´ 부딪ì³ì„œ 만들어진 것입니다. + +ìš©ì•”ì€ ìž¬ë£Œ 블ë¡ì´ 제거ë˜ì–´ë„ 완전히 사ë¼ì§€ëŠ” ë° ì‹œê°„ì´ ê±¸ë¦½ë‹ˆë‹¤. + +Ghastê°€ ì˜ëŠ” 불ë©ì´ì— ë‚´ì„±ì„ ê°€ì§€ëŠ” 조약ëŒì€ 경계 ê´€ë¬¸ì„ ë§Œë“œëŠ” ë° ì í•©í•©ë‹ˆë‹¤. + +횃불, 발광ì„, 호박등과 ê°™ì´ ê´‘ì›ìœ¼ë¡œ 사용 가능한 블ë¡ì€ 눈과 ì–¼ìŒì„ 녹입니다. + +양털로 만든 ê±´ì¶• êµ¬ì¡°ë¬¼ì´ ì•¼ì™¸ì— ìžˆìœ¼ë©´ 번개 ë•Œë¬¸ì— ë¶ˆì´ ë¶™ì„ ìˆ˜ë„ ìžˆìœ¼ë¯€ë¡œ 조심해야 합니다. + +용암 한 ì–‘ë™ì´ë¡œ 화로ì—서 ë¸”ë¡ 100개를 ë…¹ì¼ ìˆ˜ 있습니다. + +연주 ìŒì€ 소리 블럭 아래 ìž¬ì§ˆì— ë”°ë¼ ë‹¬ë¼ì§‘니다. + +좀비와 í•´ê³¨ì€ ë¬¼ì†ì— 있으면 대낮ì—ë„ ì‚´ì•„ 움ì§ìž…니다. + +늑대를 공격하면 ê·¼ì²˜ì— ìžˆëŠ” ëŠ‘ëŒ€ë“¤ì´ ì ëŒ€ì ìœ¼ë¡œ 변해 플레ì´ì–´ë¥¼ 공격합니다. Pigman ì¢€ë¹„ë„ ê°™ì€ íŠ¹ì„±ì„ ê°€ì§‘ë‹ˆë‹¤. + +늑대는 지하로 내려갈 수 없습니다. + +늑대는 Creeper를 공격하지 않습니다. + +ë‹­ì€ 5ë¶„ì—서 10분마다 ë‹¬ê±€ì„ ë‚³ìŠµë‹ˆë‹¤. + +í‘ìš”ì„ì€ ë‹¤ì´ì•„몬드 곡괭ì´ë¡œë§Œ 채굴할 수 있습니다. + +Creeper를 처치하면 ì†ì‰½ê²Œ í™”ì•½ì„ ì–»ì„ ìˆ˜ 있습니다. + +ë‘ ê°œì˜ ìƒìžë¥¼ 나란히 놓으면 í° ìƒìž 하나를 만들 수 있습니다. + +ê¸¸ë“¤ì¸ ëŠ‘ëŒ€ëŠ” 꼬리를 ë³´ë©´ ì²´ë ¥ ìƒíƒœë¥¼ 알 수 있습니다. ê¸°ìš´ì„ íšŒë³µì‹œí‚¤ë ¤ë©´ 고기를 먹ì´ì‹­ì‹œì˜¤. + +화로를 ì´ìš©í•˜ë©´ ì„ ì¸ìž¥ì„ ì´ˆë¡ ì„ ì¸ìž¥ 염료로 만들 수 있습니다. + +4J Studios와 Kappischeì˜ Twitterì—서 ì´ ê²Œìž„ì˜ ìµœì‹  정보를 ì–»ì„ ìˆ˜ 있습니다. + +ì¼ì‹œ 중지 메뉴ì—서 Minecraft 스í¬ë¦°ìƒ·ì„ Facebookì— ì˜¬ë¦´ 수 있습니다. 친구들ì—게 ìžì‹ ì˜ ìž‘í’ˆì„ ìžëž‘하십시오! + +í”Œë ˆì´ ë°©ë²• ë©”ë‰´ì˜ ì—…ë°ì´íЏ ì •ë³´ 섹션ì—서 최신 ì—…ë°ì´íЏ 정보를 확ì¸í•  수 있습니다. + +ì´ì œ 울타리를 ìŒ“ì„ ìˆ˜ 있습니다! + +minecraftforumì— Xbox 360 Edition ì „ìš© ì„¹ì…˜ì´ ìƒê²¼ìŠµë‹ˆë‹¤. + +플레ì´ì–´ê°€ ì†ì— ë°€ì„ ë“¤ê³  있으면 ì¼ë¶€ ë™ë¬¼ì´ 플레ì´ì–´ë¥¼ ë”°ë¼ë‹¤ë‹™ë‹ˆë‹¤. + +ë™ë¬¼ì´ ì–´ë–¤ ë°©í–¥ì´ë“  20 ë¸”ë¡ ì´ìƒ 움ì§ì¼ 수 없으면 사ë¼ì§€ì§€ 않습니다. + +ìŒì•…ì€ C418ì´ ë§Œë“¤ì—ˆìŠµë‹ˆë‹¤! + +Notchì˜ Twitter를 팔로우하는 ì‚¬ëžŒì€ 100ë§Œ ëª…ì´ ë„˜ìŠµë‹ˆë‹¤! + +ìŠ¤ì›¨ë´ ì‚¬ëžŒë“¤ì´ ëª¨ë‘ ê¸ˆë°œì€ ì•„ë‹™ë‹ˆë‹¤. Mojang 소ì†ì˜ Jens ê°™ì´ ë¶‰ì€ ë¨¸ë¦¬ë„ ìžˆìŠµë‹ˆë‹¤! + +4J Studiosê°€ Xbox 360 게임ì—서 Herobrineì„ ì‚­ì œí•œ 것 같습니다. + +언젠가는 ì—…ë°ì´íŠ¸ê°€ ìžˆì„ ì˜ˆì •ìž…ë‹ˆë‹¤! + +Notchê°€ 누구ì¸ì§€ 아십니까? + +Mojangì˜ ì§ì› 수보다 Mojangì´ ë°›ì€ ìƒì˜ 수가 많습니다! + +유명ì¸ë“¤ë„ Minecraft를 ì¦ê¹ë‹ˆë‹¤! + +deadmau5는 Minecraft를 좋아합니다! + +버그가 ë³´ì´ë”ë¼ë„ 신경쓰지 마세요. + +Creeper는 코딩 버그ì—서 태어났습니다. + +닭입니까, 오리입니까? + +Mineconì— ê°„ ì  ìžˆë‚˜ìš”? + +Mojang ì§ì› 중, junkboyì˜ ì–¼êµ´ì„ ë³¸ ì‚¬ëžŒì€ ì—†ìŠµë‹ˆë‹¤. + +Minecraft 위키가 있다는 걸 아십니까? + +Mojangì˜ ìƒˆ ì‚¬ë¬´ì‹¤ì€ ì•„ì£¼ 멋집니다! + +Minecraft: Xbox 360 Editionì´ ë‹¤ì–‘í•œ 기ë¡ì„ 갱신했습니다! + +Minecon 2013ì´ ë¯¸êµ­ 플로리다 주 ì˜¬ëžœë„ ì‹œì—서 개최ë˜ì—ˆìŠµë‹ˆë‹¤! + +.party()ì€ ìµœê³ ì˜€ìŠµë‹ˆë‹¤! + +ëœ¬ì†Œë¬¸ì€ ëª¨ë‘ ê±°ì§“ì´ë¼ê³  ìƒê°í•˜ëŠ” ê²ƒì´ ì§„ì‹¤ì´ë¼ê³  ìƒê°í•˜ëŠ” 것보다 좋습니다! + +{*T3*}í”Œë ˆì´ ë°©ë²•: 기본{*ETW*}{*B*}{*B*} +Minecraft는 블ë¡ì„ 배치하여 무엇ì´ë“  ìƒìƒí•œ 대로 만들 수 있는 게임입니다. ë°¤ì—는 ê´´ë¬¼ì´ ì¶œëª°í•˜ë¯€ë¡œ, ê·¸ì— ëŒ€ë¹„í•˜ì—¬ 피신처를 준비해둬야 합니다.{*B*}{*B*} +{*CONTROLLER_ACTION_LOOK*}으로 주위를 둘러봅니다.{*B*}{*B*} +{*CONTROLLER_ACTION_MOVE*}으로 ì£¼ë³€ì„ ì´ë™í•©ë‹ˆë‹¤.{*B*}{*B*} +{*CONTROLLER_ACTION_JUMP*}를 누르면 ì í”„합니다.{*B*}{*B*} +{*CONTROLLER_ACTION_MOVE*}ì„ ì•žìœ¼ë¡œ 빠르게 ë‘ ë²ˆ 누르면 질주합니다. {*CONTROLLER_ACTION_MOVE*}를 ê³„ì† ëˆ„ë¥´ê³  있으면 질주 ì‹œê°„ì´ ë‹¤ ë˜ê±°ë‚˜ ìŒì‹ 막대가 {*ICON_SHANK_03*} ì´í•˜ê°€ ë  ë•Œê¹Œì§€ ê³„ì† ì§ˆì£¼í•©ë‹ˆë‹¤. +{*CONTROLLER_ACTION_ACTION*}를 누르고 있으면 ì†ì´ë‚˜ ë„구를 사용해 채굴하거나 벌목합니다. 특정 블ë¡ì„ 채굴하려면 ë„구를 만들어야 í•  수 있습니다.{*B*}{*B*} +ì†ì— ì•„ì´í…œì„ 들고 있다면 {*CONTROLLER_ACTION_USE*}를 눌러 사용하거나 {*CONTROLLER_ACTION_DROP*}를 눌러 버릴 수 있습니다. + +{*T3*}í”Œë ˆì´ ë°©ë²•: HUD{*ETW*}{*B*}{*B*} +HUD는 ì²´ë ¥ì´ë‚˜ 산소(물ì†ì— ìžˆì„ ë•Œ), ë°°ê³ í”” 레벨(ë°°ê³ í””ì„ í•´ê²°í•˜ë ¤ë©´ ìŒì‹ì„ 먹어야 함), ë°©ì–´ë ¥(방어구를 ìž…ê³  ìžˆì„ ë•Œ) ë“±ì˜ ì •ë³´ë¥¼ ë³´ì—¬ì¤ë‹ˆë‹¤. ì²´ë ¥ì„ ìžƒì–´ë„ ìŒì‹ ë§‰ëŒ€ì— {*ICON_SHANK_01*}ê°€ 9칸 ì´ìƒ 있다면 ì²´ë ¥ì´ ìžë™ìœ¼ë¡œ 회복ë©ë‹ˆë‹¤. ìŒì‹ì„ 먹으면 ìŒì‹ 막대가 차오릅니다.{*B*} +ë˜í•œ ì´ê³³ì˜ 경험치 막대는 숫ìžë¡œ 경험치가 표시ë˜ë©° 막대는 경험치를 올리는 ë° í•„ìš”í•œ 경험치 ì ìˆ˜ë¥¼ ë³´ì—¬ì¤ë‹ˆë‹¤. 경험치 ì ìˆ˜ëŠ” 괴물ì´ë‚˜ ë™ë¬¼ì„ 처치하면 나오는 구체를 모으거나, 특정 블ë¡ì„ 채굴하거나, ë™ë¬¼ì„ êµë°°í•˜ê±°ë‚˜ 낚시를 하거나 화로ì—서 ê´‘ì„ì„ ë…¹ì´ë©´ ì–»ì„ ìˆ˜ 있습니다.{*B*}{*B*} +ë˜í•œ 사용할 수 있는 ì•„ì´í…œë„ 표시ë©ë‹ˆë‹¤. {*CONTROLLER_ACTION_LEFT_SCROLL*}ê³¼ {*CONTROLLER_ACTION_RIGHT_SCROLL*}로 ì†ì— ë“  ì•„ì´í…œì„ 바꿀 수 있습니다. + +{*T3*}í”Œë ˆì´ ë°©ë²•: 소지품{*ETW*}{*B*}{*B*} +{*CONTROLLER_ACTION_INVENTORY*}ì„ ì´ìš©í•´ ì†Œì§€í’ˆì„ ë³¼ 수 있습니다.{*B*}{*B*} +ì´ í™”ë©´ì—는 ì†ì— 들고 쓸 수 있는 ì•„ì´í…œê³¼ 가지고 ë‹¤ë‹ ìˆ˜ 있는 ì•„ì´í…œì´ ëª¨ë‘ í‘œì‹œë©ë‹ˆë‹¤. ë°©ì–´ë ¥ ë˜í•œ ì´ í™”ë©´ì—서 확ì¸í•  수 있습니다.{*B*}{*B*} +{*CONTROLLER_MENU_NAVIGATE*}로 í¬ì¸í„°ë¥¼ 움ì§ì¼ 수 있습니다. {*CONTROLLER_VK_A*} 단추를 누르면 í¬ì¸í„°ë¡œ 가리킨 ì•„ì´í…œì„ 집습니다. ìˆ˜ëŸ‰ì´ 2ê°œ ì´ìƒì¼ 때는 ì•„ì´í…œì„ ì „ë¶€ 집으며, {*CONTROLLER_VK_X*} 단추를 누르면 반만 ì§‘ì„ ìˆ˜ 있습니다.{*B*}{*B*} +í¬ì¸í„°ë¥¼ 사용해서 ì•„ì´í…œì„ ì†Œì§€í’ˆì˜ ë‹¤ë¥¸ 공간으로 옮긴 ë‹¤ìŒ {*CONTROLLER_VK_A*} 단추를 누르면 해당 ìœ„ì¹˜ì— ë†“ìŠµë‹ˆë‹¤. í¬ì¸í„°ë¡œ ì§‘ì€ ì•„ì´í…œì´ 여러 ê°œì¼ ë•Œ {*CONTROLLER_VK_A*} 단추를 누르면 ëª¨ë‘ ë‚´ë ¤ë†“ê³  {*CONTROLLER_VK_X*} 단추를 누르면 하나만 놓습니다.{*B*}{*B*} +방어구 ì•„ì´í…œì— í¬ì¸í„°ë¥¼ 올려놓으면 해당 ì•„ì´í…œì„ 방어구 슬롯으로 빨리 옮길 수 있는 툴íŒì´ 표시ë©ë‹ˆë‹¤.{*B*}{*B*} +염색으로 가죽 ë°©ì–´êµ¬ì˜ ìƒ‰ì„ ë°”ê¿€ 수 있습니다. 소지품 메뉴ì—서 í¬ì¸í„°ë¡œ 염료를 ìž¡ì€ í›„ í¬ì¸í„°ê°€ ì—¼ìƒ‰ì‹œí‚¤ê³ ìž í•˜ëŠ” ì•„ì´í…œ ìœ„ì— ìžˆì„ ë•Œ {*CONTROLLER_VK_X*} 단추를 누르면 ë©ë‹ˆë‹¤. + + +{*T3*}í”Œë ˆì´ ë°©ë²•: ìƒìž{*ETW*}{*B*}{*B*} +ìƒìžë¥¼ 만들고 나면 ìƒìžë¥¼ ì›”ë“œì— ë†“ê³  {*CONTROLLER_ACTION_USE*}를 눌러 ì†Œì§€í’ˆì— ìžˆëŠ” ì•„ì´í…œì„ 보관할 수 있습니다.{*B*}{*B*} +ì•„ì´í…œì„ 소지품 ë˜ëŠ” ìƒìžë¡œ 옮기려면 í¬ì¸í„°ë¥¼ 사용하십시오.{*B*}{*B*} +ìƒìž ì•ˆì— ë„£ì–´ë‘” ì•„ì´í…œì€ ë‚˜ì¤‘ì— ì†Œì§€í’ˆì— ë‹¤ì‹œ ë„£ì„ ìˆ˜ 있습니다. + + +{*T3*}í”Œë ˆì´ ë°©ë²•: 대형 ìƒìž{*ETW*}{*B*}{*B*} +ìƒìž ë‘ ê°œë¥¼ 나란히 ë¶™ì´ë©´ 대형 ìƒìžê°€ 만들어집니다. ì´ ìƒìžì—는 ì•„ì´í…œì„ ë” ë§Žì´ ë„£ì„ ìˆ˜ 있습니다.{*B*}{*B*} +사용 ë°©ë²•ì€ ì¼ë°˜ ìƒìžì™€ 같습니다. + + +{*T3*}í”Œë ˆì´ ë°©ë²•: 제작{*ETW*}{*B*}{*B*} +제작 ì¸í„°íŽ˜ì´ìФì—서는 ì†Œì§€í’ˆì— ìžˆëŠ” ì•„ì´í…œì„ 조합해서 새로운 ì•„ì´í…œì„ 만들 수 있습니다. {*CONTROLLER_ACTION_CRAFTING*}를 눌러 제작 ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ 여십시오.{*B*}{*B*} +{*CONTROLLER_VK_LB*}ê³¼ {*CONTROLLER_VK_RB*}로 화면 ìœ„ìª½ì˜ íƒ­ì—서 제작할 ì•„ì´í…œ 종류를 ì„ íƒí•œ ë‹¤ìŒ {*CONTROLLER_MENU_NAVIGATE*}로 제작할 ì•„ì´í…œì„ 고르십시오.{*B*}{*B*} +제작 ì˜ì—­ì—는 새 ì•„ì´í…œì„ 만드는 ë° í•„ìš”í•œ 재료 ì•„ì´í…œì´ 표시ë©ë‹ˆë‹¤. {*CONTROLLER_VK_A*} 단추를 누르면 ì•„ì´í…œì„ 만들어 ì†Œì§€í’ˆì— ë„£ê²Œ ë©ë‹ˆë‹¤. + + +{*T3*}í”Œë ˆì´ ë°©ë²•: 작업대{*ETW*}{*B*}{*B*} +ë” í° ì•„ì´í…œì„ 만들 때는 작업대를 사용합니다.{*B*}{*B*} +작업대를 설치하고 {*CONTROLLER_ACTION_USE*}를 눌러 사용하십시오.{*B*}{*B*} +작업대ì—서 ì•„ì´í…œì„ 만드는 ë°©ë²•ì€ ê¸°ë³¸ 제작과 같지만, 제작 ê³µê°„ì´ ë” ë„“ê³  ì„ íƒí•  수 있는 ì•„ì´í…œì´ ë” ë§Žì•„ì§‘ë‹ˆë‹¤. + + +{*T3*}í”Œë ˆì´ ë°©ë²•: 화로{*ETW*}{*B*}{*B*} +화로ì—서는 ì•„ì´í…œì— ì—´ì„ ê°€í•´ì„œ 다른 ì•„ì´í…œìœ¼ë¡œ 바꿀 수 있습니다. 예를 들어 ì² ê´‘ì„ì„ í™”ë¡œì—서 가열하면 ì²  주괴가 만들어집니다.{*B*}{*B*} +화로를 설치하고 {*CONTROLLER_ACTION_USE*}를 눌러 사용하십시오.{*B*}{*B*} +화로 아래쪽ì—는 연료나 ë•”ê°ì„ 넣고 위쪽ì—는 가열할 ì•„ì´í…œì„ 넣어야 합니다. 그러면 í™”ë¡œì— ë¶ˆì´ ì¼œì§€ê³  ìž‘ì—…ì´ ì‹œìž‘ë©ë‹ˆë‹¤.{*B*}{*B*} +ì•„ì´í…œ ê°€ì—´ì´ ë나면 결과물 슬롯ì—서 소지품으로 옮길 수 있습니다.{*B*}{*B*} +í™”ë¡œì— ë„£ì„ ìˆ˜ 있는 재료나 연료 ì•„ì´í…œì— í¬ì¸í„°ë¥¼ 올려놓으면 해당 ì•„ì´í…œì„ 화로로 빨리 옮길 수 있는 툴íŒì´ 표시ë©ë‹ˆë‹¤. + + +{*T3*}í”Œë ˆì´ ë°©ë²•: 디스펜서{*ETW*}{*B*}{*B*} +디스펜서는 ì•„ì´í…œì„ ì˜ì•„ 보내는 ë° ì‚¬ìš©ë©ë‹ˆë‹¤. 디스펜서를 ìž‘ë™í•˜ë ¤ë©´ 레버와 ê°™ì€ ìŠ¤ìœ„ì¹˜ë¥¼ 장착해야 합니다.{*B*}{*B*} +ë””ìŠ¤íŽœì„œì— ì•„ì´í…œì„ 넣으려면 {*CONTROLLER_ACTION_USE*}를 누른 다ìŒ, ì˜ì•„ 보낼 ì•„ì´í…œì„ 소지품ì—서 꺼내 ë””ìŠ¤íŽœì„œì— ë„£ìœ¼ì‹­ì‹œì˜¤.{*B*}{*B*} +ì´ì œ 스위치를 조작하면 디스펜서가 ì•„ì´í…œì„ ì˜ì•„ 보냅니다. + + +{*T3*}í”Œë ˆì´ ë°©ë²•: ì–‘ì¡°{*ETW*}{*B*}{*B*} +ì–‘ì¡° 기술로 ë¬¼ì•½ì„ ë§Œë“¤ê¸° 위해서는 양조대가 필요하며, 양조대는 작업대ì—서 만들 수 있습니다. 모든 ë¬¼ì•½ì„ ë§Œë“¤ 때는 물 한 ë³‘ì´ í•„ìš”í•©ë‹ˆë‹¤. 가마솥ì´ë‚˜ 다른 수ì›ì—서 ìœ ë¦¬ë³‘ì— ë¬¼ì„ ì±„ìš°ì‹­ì‹œì˜¤. {*B*} +양조대 하나ì—는 ë³‘ì„ ë„£ì„ ìˆ˜ 있는 ìŠ¬ë¡¯ì´ ì„¸ ê°œ 있으므로, 한 ë²ˆì— ë¬¼ì•½ì„ ì„¸ 병까지 ì–‘ì¡°í•  수 있습니다. 재료 한 개를 병 세 ê°œì— ëª¨ë‘ ë„£ì„ ìˆ˜ 있으므로, ìžì›ì„ 최대한 ì•„ë¼ë ¤ë©´ 물약 세 ë³‘ì„ ë™ì‹œì— 양조하십시오.{*B*} +물약 재료를 양조대 ìœ„ì— ë„£ìœ¼ë©´ 잠시 후 기본 ë¬¼ì•½ì´ ì™„ì„±ë©ë‹ˆë‹¤. 기본 ë¬¼ì•½ì€ ê·¸ ìžì²´ë¡œëŠ” 아무런 효과가 없으나 다른 재료를 넣어 양조하면 효과가 있는 ë¬¼ì•½ì´ ë©ë‹ˆë‹¤.{*B*} +효과가 있는 ë¬¼ì•½ì„ ë§Œë“  ë’¤ 세 번째 재료를 넣으면 효과 ì§€ì† ì‹œê°„ì´ ê¸¸ì–´ì§€ê±°ë‚˜(레드스톤 가루 사용), 효과가 ë” ê°•í•´ì§€ê±°ë‚˜(ë°œê´‘ì„ ê°€ë£¨ 사용), 해로운 효과로 바꿀 수(발효 거미 눈 사용) 있습니다.{*B*} +ë¬¼ì•½ì— í™”ì•½ì„ ë„£ìœ¼ë©´ ë˜ì§ˆ 수 있는 í­ë°œ 물약으로 바꿀 수 있습니다. í­ë°œ ë¬¼ì•½ì„ ë˜ì§€ë©´ ë¬¼ì•½ë³‘ì´ ë–¨ì–´ì§„ ì§€ì  ì£¼ë³€ì—서 해당 ë¬¼ì•½ì˜ íš¨ê³¼ê°€ ë°œìƒí•©ë‹ˆë‹¤.{*B*} + +물약 재료는 다ìŒê³¼ 같습니다.{*B*}{*B*} +* {*T2*}지하 사마귀{*ETW*}{*B*} +* {*T2*}거미 눈{*ETW*}{*B*} +* {*T2*}설탕{*ETW*}{*B*} +* {*T2*}Ghastì˜ ëˆˆë¬¼{*ETW*}{*B*} +* {*T2*}Blaze 가루{*ETW*}{*B*} +* {*T2*}마그마 í¬ë¦¼{*ETW*}{*B*} +* {*T2*}빛나는 수박{*ETW*}{*B*} +* {*T2*}레드스톤 가루{*ETW*}{*B*} +* {*T2*}ë°œê´‘ì„ ê°€ë£¨{*ETW*}{*B*} +* {*T2*}발효 거미 눈{*ETW*}{*B*}{*B*} + +ìž¬ë£Œì˜ ì¡°í•©ì— ë”°ë¼ ë¬¼ì•½ì˜ íš¨ê³¼ê°€ 달ë¼ì§€ë‹ˆ 여러 ì¡°í•©ì„ ì‹œí—˜í•´ 보십시오. + + +{*T3*}í”Œë ˆì´ ë°©ë²•: 효과부여{*ETW*}{*B*}{*B*} +괴물 ë° ë™ë¬¼ì„ 처치하거나 ë˜ëŠ” 특정 블ë¡ì„ 채굴하거나 녹여서 ì–»ì„ ìˆ˜ 있는 경험치로 ë„구, 무기 ë° ë°©ì–´êµ¬ì— íš¨ê³¼ë¥¼ 부여할 수 있습니다.{*B*} +ê²€, 활, ë„ë¼, 곡괭ì´, 삽 ë˜ëŠ” 방어구를 íš¨ê³¼ë¶€ì—¬ëŒ€ì— ë†“ì¸ ì±… ì•„ëž˜ì— ìžˆëŠ” ìŠ¬ë¡¯ì— ë„£ìœ¼ë©´ 슬롯 ì˜¤ë¥¸ìª½ì— ê°ê° 경험치 ë¹„ìš©ì´ ì“°ì¸ ë‹¨ì¶” 세 개가 나타납니다.{*B*} +íš¨ê³¼ë¶€ì—¬ì— í•„ìš”í•œ 경험치가 모ìžëž€ í•­ëª©ì€ ë¹¨ê°„ìƒ‰ìœ¼ë¡œ 나타나며, 그렇지 않다면 ì´ˆë¡ìƒ‰ìœ¼ë¡œ 나타납니다.{*B*}{*B*} +실제 효과부여는 í‘œì‹œëœ ë¹„ìš©ì— ê¸°ë°˜ì„ ë‘ê³  무작위로 ì ìš©ë©ë‹ˆë‹¤.{*B*}{*B*} +효과부여대가 한 ë¸”ë¡ ê°„ê²©ì„ ë‘ê³  ì±…ìž¥ì— ë‘˜ëŸ¬ì‹¸ì—¬ 있으면(최대 책장 15개까지) 효과부여 ë ˆë²¨ì´ ìƒìŠ¹í•˜ë©°, íš¨ê³¼ë¶€ì—¬ëŒ€ì— ë†“ì¸ ì±…ì— ì‹ ë¹„í•œ ë¬¸ì–‘ì´ ë‚˜íƒ€ë‚©ë‹ˆë‹¤.{*B*}{*B*} +효과부여대를 만들 때 ì“°ì´ëŠ” 모든 재료는 월드 ì•ˆì˜ ë§ˆì„ì—서 찾거나 월드 안ì—서 채굴 ë° ê²½ìž‘ì„ í†µí•´ ì–»ì„ ìˆ˜ 있습니다.{*B*} +효과부여 ì±…ì€ ëª¨ë£¨ì—서 ì•„ì´í…œì— 효과를 부여하는 ë° ì‚¬ìš©í•©ë‹ˆë‹¤. ì´ê²ƒìœ¼ë¡œ ì•„ì´í…œì— ë” íš¨ìœ¨ì ìœ¼ë¡œ 효과를 부여할 수 있습니다.{*B*} + + +{*T3*}í”Œë ˆì´ ë°©ë²•: ë™ë¬¼ ë†ìž¥{*ETW*}{*B*}{*B*} +ë™ë¬¼ì„ 한 ìž¥ì†Œì— ë‘ê³  싶으면 20x20 블ë¡ë³´ë‹¤ ìž‘ì€ ë©´ì ì— 울타리를 ì§“ê³  ê·¸ ì•ˆì— ë™ë¬¼ì„ ë‘십시오. ì´ë ‡ê²Œ 하면 다른 ì¼ì„ 하다가 ëŒì•„ì™€ë„ ë™ë¬¼ì´ ê·¸ ìžë¦¬ì— ìžˆì„ ê²ë‹ˆë‹¤. + + +{*T3*}í”Œë ˆì´ ë°©ë²•: ë™ë¬¼ êµë°°{*ETW*}{*B*}{*B*} +Minecraftì—서는 ë™ë¬¼ì„ êµë°°í•´ ìƒˆë¼ ë™ë¬¼ì„ ì–»ì„ ìˆ˜ 있습니다!{*B*} +ë™ë¬¼ì„ êµë°°ì‹œí‚¤ë ¤ë©´ ê° ë™ë¬¼ì— ì í•©í•œ 먹ì´ë¥¼ 먹여 '사랑 모드'로 만들어야 합니다.{*B*} +소, Mooshroom, ì–‘ì—게는 ë°€ì„ ë¨¹ì´ê³  ë¼ì§€ì—게는 ë‹¹ê·¼ì„ ë¨¹ì´ì‹­ì‹œì˜¤. 그리고 ë‹­ì—게는 ë°€ 씨앗ì´ë‚˜ 지하 사마귀를 먹ì´ì‹­ì‹œì˜¤. 늑대ì—ê² ëª¨ë“  ì¢…ë¥˜ì˜ ê³ ê¸°ë¥¼ ë¨¹ì¼ ìˆ˜ 있습니다. ì í•©í•œ 먹ì´ë¥¼ ë¨¹ì€ ë™ë¬¼ì€ ê·¼ì²˜ì— ê°™ì€ ì¢…ë¥˜ì˜ ì‚¬ëž‘ 모드 ìƒíƒœì¸ ë™ë¬¼ì´ 있는지 찾아다니게 ë©ë‹ˆë‹¤.{*B*} +사랑 모드 ìƒíƒœì´ë©° 종류가 ê°™ì€ ë™ë¬¼ì´ ë‘ ë§ˆë¦¬ 만나게 ë˜ë©´ 서로 ìž…ì„ ë§žì¶”ê²Œ ë˜ê³ , 잠시 후 ìƒˆë¼ ë™ë¬¼ì´ 태어납니다. ìƒˆë¼ ë™ë¬¼ì€ 다 ìžë¼ê¸° 전까지 부모 ë™ë¬¼ì„ ë”°ë¼ë‹¤ë‹ˆê²Œ ë©ë‹ˆë‹¤.{*B*} +사랑 모드가 ë난 ë™ë¬¼ì€ 5ë¶„ê°„ 다시 사랑 모드 ìƒíƒœê°€ ë  ìˆ˜ 없습니다.{*B*} +ì›”ë“œì— ìƒì„±ë  수 있는 ë™ë¬¼ì˜ 숫ìžê°€ 제한ë˜ì–´ 있으므로 ë™ë¬¼ì´ ë§Žì„ ë•Œ êµë°°í•  수 ì—†ì„ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. + +{*T3*}í”Œë ˆì´ ë°©ë²•: 지하 ì°¨ì›ë¬¸{*ETW*}{*B*}{*B*} +지하 ì°¨ì›ë¬¸ì€ 플레ì´ì–´ê°€ ì§€ìƒ ì›”ë“œì™€ 지하 월드를 오갈 때 사용하는 관문입니다. 지하 월드를 ì´ìš©í•˜ë©´ ì§€ìƒ ì›”ë“œë¥¼ ë” ë¹¨ë¦¬ ì´ë™í•  수 있습니다. 지하 ì›”ë“œì˜ 1ë¸”ë¡ ê±°ë¦¬ëŠ” ì§€ìƒ ì›”ë“œì˜ 3ë¸”ë¡ ê±°ë¦¬ì™€ 같으므로 ì§€í•˜ì— ì°¨ì›ë¬¸ì„ 세우고 ê·¸ê³³ì„ í†µê³¼í•˜ë©´ 3ë°° 먼 거리로 나가게 ë©ë‹ˆë‹¤.{*B*}{*B*} +ì°¨ì›ë¬¸ì„ 세우려면 í‘ìš”ì„ ë¸”ë¡ì´ 10ê°œ ì´ìƒ 필요하며, 5ë¸”ë¡ ë†’ì´ì— 4ë¸”ë¡ ê¸¸ì´, 1ë¸”ë¡ ë„ˆë¹„ë¡œ 만들어야 합니다. ì°¨ì›ë¬¸ ì™¸í˜•ì´ ë§Œë“¤ì–´ì§€ë©´ 안쪽 ê³µê°„ì— ë¶ˆì„ ë¶™ì—¬ì•¼ ì°¨ì›ë¬¸ì„ ìž‘ë™í•  수 있습니다. ë¶ˆì€ ë¶€ì‹¯ëŒê³¼ 부시 ë˜ëŠ” 불ì˜ì‹œê°œë¥¼ 사용하여 붙입니다.{*B*}{*B*} +ì°¨ì›ë¬¸ ì„¸ìš°ê¸°ì˜ ì˜ˆì‹œëŠ” 오른쪽 ê·¸ë¦¼ì— í‘œì‹œë˜ì–´ 있습니다. + + +{*T3*}í”Œë ˆì´ ë°©ë²•: 멀티 플레ì´{*ETW*}{*B*}{*B*} +Xbox 360 본체용 Minecraft는 멀티 í”Œë ˆì´ ê²Œìž„ì´ ê¸°ë³¸ê°’ìœ¼ë¡œ ë˜ì–´ 있습니다. 고화질(HD) 모드로 í”Œë ˆì´ ì¤‘ì´ë¼ë©´, í”Œë ˆì´ ë„중 언제든지 추가 컨트롤러를 연결하고 START를 눌러 로컬 플레ì´ì–´ë¥¼ ê²Œìž„ì— ì°¸ì—¬ì‹œí‚¬ 수 있습니다.{*B*}{*B*} +온ë¼ì¸ ê²Œìž„ì„ ì‹œìž‘í•˜ê±°ë‚˜ ë„ì¤‘ì— ì°¸ê°€í•˜ë©´ 친구 목ë¡ì— 온ë¼ì¸ ìƒíƒœê°€ 표시ë©ë‹ˆë‹¤(게임 í˜¸ìŠ¤íŠ¸ì¼ ë•Œ '초대한 사람만 참가 가능'으로 설정한 경우는 제외). 그리고 친구가 ê²Œìž„ì— ì°¸ê°€í•˜ë©´ 해당 ì¹œêµ¬ì˜ ì¹œêµ¬ 목ë¡ì—ë„ ì˜¨ë¼ì¸ ìƒíƒœê°€ 표시ë©ë‹ˆë‹¤('ì¹œêµ¬ì˜ ì¹œêµ¬ë„ ì°¸ê°€ 가능' ì˜µì…˜ì„ ì„ íƒí–ˆì„ 경우).{*B*} +게임 ì ‘ì† ì¤‘ì— BACK 단추를 누르면 ê°™ì€ ê²Œìž„ ì•ˆì— ìžˆëŠ” 모든 플레ì´ì–´ 목ë¡ì„ 불러와 플레ì´ì–´ì˜ 게ì´ë¨¸ 카드를 보거나 게임ì—서 추방하거나 다른 플레ì´ì–´ë¥¼ ê²Œìž„ì— ì´ˆëŒ€í•  수 있습니다. + + +{*T3*}í”Œë ˆì´ ë°©ë²•: 스í¬ë¦°ìƒ· 공유{*ETW*}{*B*}{*B*} +ì¼ì‹œ 중지 메뉴를 불러온 ë’¤, {*CONTROLLER_VK_Y*} 단추를 눌러 스í¬ë¦°ìƒ·ì„ ì°ê³  Facebookì— ê³µìœ í•  수 있습니다. 조그맣게 스í¬ë¦°ìƒ· 미리 보기가 표시ë˜ë©° Facebook ê²Œì‹œë¬¼ì— ì¶”ê°€í•  í…스트를 입력할 수 있습니다.{*B*}{*B*} +스í¬ë¦°ìƒ·ì„ ì°ì„ 때 특히 유용하게 ì“°ì´ëŠ” ì¹´ë©”ë¼ ëª¨ë“œì˜ ë³€ê²½ìœ¼ë¡œ ìºë¦­í„°ì˜ ì•žëª¨ìŠµì„ ì°ì„ 수 있습니다. {*CONTROLLER_VK_Y*} 단추를 눌러 공유하기 ì „ì—, 게임 ì†ì—서 ìºë¦­í„°ì˜ ì•žëª¨ìŠµì´ ë‚˜ì˜¤ë„ë¡ {*CONTROLLER_ACTION_CAMERA*} 단추로 변경하십시오.{*B*}{*B*} +스í¬ë¦°ìƒ·ì—는 게ì´ë¨¸íƒœê·¸ê°€ 표시ë˜ì§€ 않습니다. + + +{*T3*}í”Œë ˆì´ ë°©ë²•: 레벨 차단{*ETW*}{*B*}{*B*} +í”Œë ˆì´ ì¤‘ì¸ ë ˆë²¨ì— ë¶€ì ì ˆí•œ ë‚´ìš©ì´ í¬í•¨ë˜ì–´ 있다고 ìƒê°ë˜ë©´ 해당 ë ˆë²¨ì„ ì°¨ë‹¨ 레벨 목ë¡ì— 추가할 수 있습니다. +ë ˆë²¨ì„ ì°¨ë‹¨í•˜ë ¤ë©´ ì¼ì‹œ 중지 메뉴를 불러온 ë’¤ {*CONTROLLER_VK_RB*}단추를 눌러 레벨 차단 툴íŒì„ ì„ íƒí•˜ì‹­ì‹œì˜¤. +다ìŒì— 해당 ë ˆë²¨ì„ ì„ íƒí•˜ì—¬ ê²Œìž„ì— ì°¸ê°€í•˜ë ¤ê³  하면 차단 레벨 목ë¡ì— 있는 레벨ì´ë¼ëŠ” 주ì˜ì‚¬í•­ì´ 표시ë©ë‹ˆë‹¤. 해당 ë ˆë²¨ì„ ë¦¬ìŠ¤íŠ¸ì—서 제거한 ë‹¤ìŒ ì°¸ê°€í• ì§€, 아니면 나갈지를 ì„ íƒí•  수 있습니다. + +{*T3*}í”Œë ˆì´ ë°©ë²• : 창작 모드{*ETW*}{*B*}{*B*} +창작 모드 ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ 사용하면 게임 ë‚´ì˜ ëª¨ë“  ì•„ì´í…œì„ 채굴하거나 제작할 í•„ìš” ì—†ì´ í”Œë ˆì´ì–´ì˜ 소지품으로 가져갈 수 있습니다. +플레ì´ì–´ì˜ 소지품 ì•ˆì— ìžˆëŠ” ì•„ì´í…œì€ 놓거나 ì‚¬ìš©í•´ë„ ì—†ì–´ì§€ì§€ 않습니다. ì´ ëª¨ë“œì—서는 ìžì›ì„ 모으기보다 ê±´ì„¤ì— ì§‘ì¤‘í•  수 있습니다.{*B*} +창작 모드ì—서 월드를 ìƒì„±, 저장하거나 불러오면 해당 월드ì—서는 ë„ì „ 과제를 íšë“í•  수 없으며 ìˆœìœ„í‘œì— ê¸°ë¡ë˜ì§€ 않습니다. ì´í›„ 해당 월드를 ìƒì¡´ 모드ì—서 ë¶ˆëŸ¬ì™€ë„ ë§ˆì°¬ê°€ì§€ìž…ë‹ˆë‹¤.{*B*} +창작 모드ì—서 {*CONTROLLER_ACTION_JUMP*}를 앞으로 빨리 ë‘ ë²ˆ 누르면 ë‚  수 있습니다. ë¹„í–‰ì„ ì¢…ë£Œí•˜ë ¤ë©´ ë˜‘ê°™ì€ ë™ìž‘ì„ ë°˜ë³µí•˜ì‹­ì‹œì˜¤. ë” ë¹¨ë¦¬ 날려면 {*CONTROLLER_ACTION_MOVE*}를 앞으로 빨리 ë‘ ë²ˆ 누르십시오. +비행 모드ì—서 {*CONTROLLER_ACTION_JUMP*}를 길게 누르면 위로 올ë¼ê°€ê³  {*CONTROLLER_ACTION_SNEAK*}를 길게 누르면 아래로 내려갑니다. ë˜ëŠ” {*CONTROLLER_ACTION_DPAD_UP*} 를 누르면 위로 올ë¼ê°€ê³  {*CONTROLLER_ACTION_DPAD_DOWN*}를 누르면 아래로 내려갑니다. +{*CONTROLLER_ACTION_DPAD_LEFT*}를 누르면 왼쪽으로 ì´ë™í•˜ê³  {*CONTROLLER_ACTION_DPAD_RIGHT*}를 누르면 오른쪽으로 ì´ë™í•©ë‹ˆë‹¤. + +{*T3*}í”Œë ˆì´ ë°©ë²•: 호스트 ë° í”Œë ˆì´ì–´ 옵션{*ETW*}{*B*}{*B*} + +{*T1*}게임 옵션{*ETW*}{*B*} +월드를 불러오거나 새로 만들 때 "추가 옵션" 단추를 누르면 ê²Œìž„ì˜ ì„¸ë¶€ ì‚¬í•­ì„ ì¡°ì •í•  수 있는 메뉴가 열립니다.{*B*}{*B*} + + {*T2*}플레ì´ì–´ 대 플레ì´ì–´{*ETW*}{*B*} + ì´ ì˜µì…˜ì„ ì¼œë©´ 플레ì´ì–´ê°€ 다른 플레ì´ì–´ë¥¼ 공격할 수 있습니다. ìƒì¡´ 모드ì—ë§Œ ì ìš©ë©ë‹ˆë‹¤.{*B*}{*B*} + + {*T2*}플레ì´ì–´ 신뢰{*ETW*}{*B*} + ì´ ì˜µì…˜ì„ ë„ë©´ ê²Œìž„ì— ì°¸ì—¬í•˜ëŠ” 플레ì´ì–´ì˜ í–‰ë™ì´ 제한ë©ë‹ˆë‹¤. 채굴, ì•„ì´í…œ 사용, ë¸”ë¡ ë†“ê¸°, 문과 스위치 사용, 보관함 사용, 플레ì´ì–´ë‚˜ ë™ë¬¼ ê³µê²©ì„ í•  수 없습니다. 게임 메뉴ì—서 특정 플레ì´ì–´ì˜ í–‰ë™ ê¶Œí•œì— ê´€í•œ ì´ëŸ¬í•œ ì˜µì…˜ì„ ë³€ê²½í•  수 있습니다.{*B*}{*B*} + + {*T2*}불 확산{*ETW*}{*B*} + ì´ ì˜µì…˜ì„ ì¼œë©´ ë¶ˆì´ ê·¼ì²˜ 가연성 블ë¡ìœ¼ë¡œ í¼ì§‘니다. ë‚˜ì¤‘ì— ê²Œìž„ì—서 ì„¤ì •ì„ ë°”ê¿€ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤.{*B*}{*B*} + + {*T2*}TNT í­ë°œ{*ETW*}{*B*} + ì´ ì˜µì…˜ì„ ì¼œë©´ TNT를 ì í™”í–ˆì„ ë•Œ í­ë°œí•©ë‹ˆë‹¤. ë‚˜ì¤‘ì— ê²Œìž„ì—서 ì„¤ì •ì„ ë°”ê¿€ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤.{*B*}{*B*} + + {*T2*}호스트 특권{*ETW*}{*B*} + ì´ ì˜µì…˜ì„ ì¼œë©´ 호스트는 게임 메뉴ì—서 플레ì´ì–´ì—게 비행 ëŠ¥ë ¥ì„ ì£¼ê±°ë‚˜, 지치지 않게 하거나, 투명하게 만들 수 있습니다.{*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + +{*T1*}월드 ìƒì„± 옵션{*ETW*}{*B*} +새 월드를 ìƒì„±í•  때 ì„ íƒí•  수 있는 추가 옵션입니다.{*B*}{*B*} + + {*T2*}건물 ìƒì„±{*ETW*}{*B*} + ì´ ì˜µì…˜ì„ ì¼œë©´ 마ì„ì´ë‚˜ 요새 ë“±ì˜ ê±´ë¬¼ì´ ì›”ë“œì— ìƒì„±ë©ë‹ˆë‹¤.{*B*}{*B*} + + {*T2*}완전í‰ë©´ 월드{*ETW*}{*B*} + ì´ ì˜µì…˜ì„ ì¼œë©´ ì§€ìƒê³¼ ì§€í•˜ì— ì™„ì „ížˆ í‰í‰í•œ 세계가 ìƒì„±ë©ë‹ˆë‹¤.{*B*}{*B*} + + {*T2*}보너스 ìƒìž{*ETW*}{*B*} + ì´ ì˜µì…˜ì„ ì¼œë©´ 쓸모있는 ì•„ì´í…œì´ ë“  ìƒìžê°€ 플레ì´ì–´ ìƒì„± ì§€ì  ê·¼ì²˜ì— ë‚˜íƒ€ë‚©ë‹ˆë‹¤.{*B*}{*B*} + + {*T2*}지하 초기화{*ETW*}{*B*} + ì´ ì˜µì…˜ì„ ì¼œë©´ 지하가 재건ë©ë‹ˆë‹¤. ì‚¬ì „ì— ì§€í•˜ 요새가 없는 ê³³ì— ë¯¸ë¦¬ 저장하면 유용합니다.{*B*}{*B*} + + {*T1*}게임 메뉴 옵션{*ETW*}{*B*} + 게임 í”Œë ˆì´ ì¤‘ì— {*BACK_BUTTON*} 단추를 눌러서 게임 메뉴로 ì´ë™í•œ ë‹¤ìŒ ì‚¬ìš©í•  수 있는 옵션입니다.{*B*}{*B*} + + {*T2*}호스트 옵션{*ETW*}{*B*} + 호스트 플레ì´ì–´ë‚˜ 관리ìžë¡œ ì„¤ì •ëœ í”Œë ˆì´ì–´ëŠ” "호스트 옵션" ë©”ë‰´ì— ë“¤ì–´ê°ˆ 수 있습니다. ì´ ë©”ë‰´ì—서 불 확산과 TNT í­ë°œì„ 켜거나 ëŒ ìˆ˜ 있습니다.{*B*}{*B*} + +{*T1*}플레ì´ì–´ 옵션{*ETW*}{*B*} +플레ì´ì–´ì˜ í–‰ë™ ê¶Œí•œì„ ë³€ê²½í•˜ë ¤ë©´ 플레ì´ì–´ ì´ë¦„ì„ ì„ íƒí•˜ê³  {*CONTROLLER_VK_A*} 단추를 눌러 플레ì´ì–´ 특권 메뉴ì—서 ë‹¤ìŒ ì˜µì…˜ì„ ì¡°ì •í•˜ì‹­ì‹œì˜¤.{*B*}{*B*} + + {*T2*}건설 ë° ì±„ê´‘ 가능{*ETW*}{*B*} + ì´ ì˜µì…˜ì€ "플레ì´ì–´ 신뢰"를 ê»ì„ 때만 사용할 수 있습니다. ì´ ì˜µì…˜ì„ ì¼œë©´ 플레ì´ì–´ëŠ” 월드ì—서 ì¼ë°˜ì ì¸ í–‰ë™ì„ ëª¨ë‘ í•  수 있습니다. ì´ ì˜µì…˜ì„ ë„ë©´ 플레ì´ì–´ëŠ” 블ë¡ì„ 놓거나 파괴하지 못합니다.{*B*}{*B*} + + {*T2*}문과 스위치 사용 가능{*ETW*}{*B*} + ì´ ì˜µì…˜ì€ "플레ì´ì–´ 신뢰"를 ê»ì„ 때만 사용할 수 있습니다. ì´ ì˜µì…˜ì„ ë„ë©´ 플레ì´ì–´ëŠ” 문과 스위치를 사용할 수 없습니다.{*B*}{*B*} + + {*T2*}ë³´ê´€í•¨ì„ ì—´ 수 있ìŒ{*ETW*}{*B*} + ì´ ì˜µì…˜ì€ "플레ì´ì–´ 신뢰"를 ê»ì„ 때만 사용할 수 있습니다. ì´ ì˜µì…˜ì„ ë„ë©´ 플레ì´ì–´ëŠ” ìƒìžì™€ ê°™ì€ ë³´ê´€í•¨ì„ ì—´ 수 없습니다.{*B*}{*B*} + + {*T2*}플레ì´ì–´ 공격 가능{*ETW*}{*B*} + ì´ ì˜µì…˜ì€ "플레ì´ì–´ 신뢰"를 ê»ì„ 때만 사용할 수 있습니다. ì´ ì˜µì…˜ì„ ë„ë©´ 플레ì´ì–´ëŠ” 다른 플레ì´ì–´ì—게 피해를 줄 수 없습니다.{*B*}{*B*} + + {*T2*}ë™ë¬¼ 공격 가능{*ETW*}{*B*} + ì´ ì˜µì…˜ì€ "플레ì´ì–´ 신뢰"를 ê»ì„ 때만 사용할 수 있습니다. ì´ ì˜µì…˜ì„ ë„ë©´ 플레ì´ì–´ëŠ” ë™ë¬¼ì—게 피해를 줄 수 없습니다.{*B*}{*B*} + + {*T2*}관리ìž{*ETW*}{*B*} + ì´ ì˜µì…˜ì„ ì¼œë©´ 플레ì´ì–´ëŠ” 다른 플레ì´ì–´ì˜ íŠ¹ê¶Œì„ ë³€ê²½í•  수 있습니다(호스트 제외). “플레ì´ì–´ 신뢰â€ë¥¼ ë„ë©´ 플레ì´ì–´ë¥¼ 추방하거나 불 확산과 TNT í­ë°œì„ 켜거나 ëŒ ìˆ˜ 있습니다.{*B*}{*B*} + + {*T2*}플레ì´ì–´ 추방{*ETW*}{*B*} + 호스트 플레ì´ì–´ì™€ ê°™ì€ {*PLATFORM_NAME*} 본체로 플레ì´í•˜ëŠ” 플레ì´ì–´ë¥¼ 제외하고, ì´ ì˜µì…˜ì„ ì„ íƒí•˜ë©´ 다른 {*PLATFORM_NAME*} 본체로 ì ‘ì†í•˜ëŠ” 플레ì´ì–´ë¥¼ 추방할 수 있습니다. 추방당한 플레ì´ì–´ëŠ” ê²Œìž„ì´ ìƒˆë¡œ 시작ë˜ê¸° 전까지 다시 참가할 수 없습니다.{*B*}{*B*} + +{*T1*}호스트 플레ì´ì–´ 옵션{*ETW*}{*B*} +"호스트 특권" ì˜µì…˜ì„ ì¼  ìƒíƒœì—서 호스트 플레ì´ì–´ëŠ” 플레ì´ì–´ íŠ¹ê¶Œì„ ë³€ê²½í•  수 있습니다. 플레ì´ì–´ íŠ¹ê¶Œì„ ë³€ê²½í•˜ë ¤ë©´ 플레ì´ì–´ ì´ë¦„ì„ ì„ íƒí•˜ê³  {*CONTROLLER_VK_A*}를 눌러 플레ì´ì–´ 특권 메뉴ì—서 ë‹¤ìŒ ì˜µì…˜ì„ ì¡°ì •í•˜ì‹­ì‹œì˜¤.{*B*}{*B*} + + {*T2*}비행 가능{*ETW*}{*B*} + ì´ ì˜µì…˜ì„ ì¼œë©´ 플레ì´ì–´ëŠ” ë‚  수 있습니다. ì´ ì˜µì…˜ì€ ìƒì¡´ 모드ì—서만 ì ìš©ë©ë‹ˆë‹¤(창작 모드ì—서는 모든 플레ì´ì–´ê°€ 비행 가능).{*B*}{*B*} + + {*T2*}지치지 않ìŒ{*ETW*}{*B*} + ì´ ì˜µì…˜ì€ ìƒì¡´ 모드ì—서만 ì ìš©ë©ë‹ˆë‹¤. ì´ ì˜µì…˜ì„ ì¼œë©´ 걷기/달리기/ì í”„ ë“±ì˜ í–‰ë™ì„ í•´ë„ ìŒì‹ 막대가 줄어들지 않습니다. 하지만 플레ì´ì–´ê°€ ìƒì²˜ë¥¼ 입으면 회복ë˜ëŠ” ë™ì•ˆ ìŒì‹ 막대가 서서히 줄어듭니다.{*B*}{*B*} + + {*T2*}투명화{*ETW*}{*B*} + ì´ ì˜µì…˜ì„ ì¼œë©´ 플레ì´ì–´ëŠ” 다른 플레ì´ì–´ì˜ ëˆˆì— ë³´ì´ì§€ 않게 ë˜ë©° ë¬´ì  ìƒíƒœê°€ ë©ë‹ˆë‹¤.{*B*}{*B*} + + {*T2*}순간ì´ë™ 가능{*ETW*}{*B*} + 플레ì´ì–´ê°€ 플레ì´ì–´ ìžì‹  ë˜ëŠ” 다른 플레ì´ì–´ë¥¼ 월드 ë‚´ 다른 곳으로 ì´ë™ì‹œí‚¬ 수 있습니다. + + +ë‹¤ìŒ íŽ˜ì´ì§€ + +ì´ì „ 페ì´ì§€ + +기본 + +HUD + +소지품 + +ìƒìž + +제작 + +화로 + +디스펜서 + +ë™ë¬¼ ë†ìž¥ + +ë™ë¬¼ êµë°° + +ì–‘ì¡° + +효과부여 + +지하 ì°¨ì›ë¬¸ + +멀티 í”Œë ˆì´ + +스í¬ë¦°ìƒ· 공유 + +레벨 차단 + +창작 모드 + +호스트 ë° í”Œë ˆì´ì–´ 옵션 + +거래 + +모루 + +Ender + +{*T3*}í”Œë ˆì´ ë°©ë²•: Ender{*ETW*}{*B*}{*B*} +Ender는 Ender ì°¨ì›ë¬¸ì„ 통해 ê°ˆ 수 있는 ê²Œìž„ì˜ ë‹¤ë¥¸ ì°¨ì›ìž…니다. Ender ì°¨ì›ë¬¸ì€ ì§€ìƒì˜ ê¹Šì€ ì§€í•˜ì— ìžˆëŠ” 요새ì—서 ì°¾ì„ ìˆ˜ 있습니다.{*B*} +Ender ì°¨ì›ë¬¸ì„ 열려면 Enderì˜ ëˆˆì´ ì—†ëŠ” Ender ì°¨ì›ë¬¸ ì™¸í˜•ì— Enderì˜ ëˆˆì„ ì˜¬ë ¤ë†“ìœ¼ì‹­ì‹œì˜¤.{*B*} +ì°¨ì›ë¬¸ì´ 열리면 Ender로 들어가십시오.{*B*}{*B*} +Enderì—서 ìˆ˜ë§Žì€ Endermanê³¼ í‰í­í•˜ê³  강력한 Ender ë“œëž˜ê³¤ì„ ë§Œë‚˜ê²Œ ë˜ë‹ˆ ì „íˆ¬ì— ëŒ€ë¹„í•´ì•¼ 합니다!{*B*}{*B*} +ì´ê³³ì—는 8ê°œì˜ í‘ìš”ì„ ê¸°ë‘¥ ìœ„ì— Ender ë“œëž˜ê³¤ì´ ì¹˜ìœ í•˜ëŠ” ë° ì‚¬ìš©í•˜ëŠ” Ender ìˆ˜ì •ì´ ìžˆìœ¼ë‹ˆ, +전투가 시작ë˜ë©´ 가장 먼저 ì´ê²ƒì„ 파괴해야 합니다.{*B*} +ì¼ë¶€ëŠ” 화살 사정거리 ë‚´ì— ìžˆì§€ë§Œ ì¼ë¶€ëŠ” ì² ì œ 우리가 보호하고 있으니 올ë¼ê°€ì•¼ 합니다.{*B*}{*B*} +Ender ë“œëž˜ê³¤ì´ Ender 산성구를 ì˜ë©° 공격하니 주ì˜í•˜ì‹­ì‹œì˜¤!{*B*} +ê¸°ë‘¥ì˜ ì¤‘ì•™ì— ìžˆëŠ” 알 ë°›ì¹¨ëŒ€ì— ì ‘ê·¼í•˜ë©´ Ender ë“œëž˜ê³¤ì´ ë‚´ë ¤ì™€ 강력한 ê³µê²©ì„ í•©ë‹ˆë‹¤!{*B*} +산성구를 피하며 Ender ë“œëž˜ê³¤ì˜ ëˆˆì„ ê³µê²©í•˜ë©´ 효과가 좋습니다. 친구와 함께 Enderì—서 전투를 벌ì´ì‹­ì‹œì˜¤!{*B*}{*B*} +Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” Ender ì°¨ì›ë¬¸ì˜ 위치를 ë³¼ 수 있으니, +쉽게 참여할 수 있습니다. + + +질주 + +ì—…ë°ì´íЏ ì •ë³´ + + +{*T3*}수정 ë° ì¶”ê°€{*ETW*}{*B*}{*B*} +- 새 ì•„ì´í…œ 추가 - ì—메랄드, ì—메랄드 ê´‘ì„, ì—메랄드 블ë¡, Ender ìƒìž, 트립와ì´ì–´ 후í¬, íš¨ê³¼ë¶€ì—¬ëœ í™©ê¸ˆ 사과, 모루, 화분, ì¡°ì•½ëŒ ë²½, ì´ë¼ ë‚€ ì¡°ì•½ëŒ ë²½, ë§ë¼ë¹„틀어진 그림, ê°ìž, 구운 ê°ìž, ë…성 ê°ìž, 당근, 황금 당근, 당근 막대, +호박 파ì´, 야간 시야 물약, 투명화 물약, 지하 ì„ì˜, 지하 ì„ì˜ ê´‘ì„, ì„ì˜ ë¸”ë¡, ì„ì˜ ë°œíŒ, ì„ì˜ ê³„ë‹¨, ê¹Žì•„ë†“ì€ ì„ì˜ ë¸”ë¡, ì„ì˜ ë¸”ë¡ ê¸°ë‘¥, 효과부여 ì±…, 카펫{*B*} +- 새 조합법 추가 - 부드러운 사암 ë° ê¹Žì•„ë†“ì€ ì‚¬ì•”{*B*} +- 새로운 괴물 추가 - 좀비 ë§ˆì„ ì‚¬ëžŒ{*B*} +- 새 지역 ìƒì„± 기능 - 사막 사ì›, 사막 마ì„, 정글 사ì›{*B*} +- ë§ˆì„ ì‚¬ëžŒê³¼ 거래 가능{*B*} +- 모루 ì¸í„°íŽ˜ì´ìФ 추가{*B*} +- 가죽 방어구 염색 가능{*B*} +- 늑대 목줄 염색 가능{*B*} +- 당근 막대기로 ë¼ì§€ ë°©í–¥ 조종 가능{*B*} +- ë” ë§Žì€ ì•„ì´í…œìœ¼ë¡œ 보너스 ìƒìž 내용물 ì—…ë°ì´íЏ{*B*} +- 반쪽 ë¸”ë¡ ë°°ì¹˜ ë° ë°˜ìª½ ë¸”ë¡ ìœ„ì˜ ë‹¤ë¥¸ ë¸”ë¡ ë°°ì¹˜ 변경{*B*} +- 뒤집힌 계단과 ë°œíŒ ë°°ì¹˜ 변경{*B*} +- ë§ˆì„ ì‚¬ëžŒ ì§ì—… 추가{*B*} +- ë‚³ì€ ì•Œì—서 나온 ë§ˆì„ ì‚¬ëžŒì—게 무작위 ì§ì—… 부여{*B*} +- 통나무 옆으로 놓기 가능{*B*} +- 나무 ë„구를 용광로ì—서 연료로 사용 가능{*B*} +- 채굴 정확성 효과부여 ë„구로 ì–¼ìŒ ë° ìœ ë¦¬ íŒìž 수집 가능{*B*} +- 화살로 나무 단추와 나무 ì••ë ¥íŒ ìž‘ë™ ê°€ëŠ¥{*B*} +- ì°¨ì›ë¬¸ì„ 통해 ì§€ìƒì— 지하 괴물 ìƒì„± 가능{*B*} +- Creeper와 거미는 마지막으로 ìžì‹ ì„ 공격한 플레ì´ì–´ë¥¼ 공격함{*B*} +- 창작 ëª¨ë“œì˜ ê´´ë¬¼ë“¤ì€ ìž ì‹œ ì‹œê°„ì´ ì§€ë‚œ 후 중립 ìƒíƒœê°€ ë¨{*B*} +- ë¬¼ì— ë¹ ì¡Œì„ ë•Œ 타격 ë°˜ë™ ì œê±°{*B*} +- 좀비가 부수는 ë¬¸ì— í”¼í•´ 표시{*B*} +- 지하ì—서 ì–¼ìŒì´ ë…¹ìŒ{*B*} +- 비가 오면 ê°€ë§ˆì†¥ì´ ì±„ì›Œì§{*B*} +- 피스톤 ì—…ë°ì´íЏ 시간 2배로 ì¦ê°€{*B*} +- ì•ˆìž¥ì„ ê°€ì§„ ë¼ì§€ë¥¼ 죽ì´ë©´ ì•ˆìž¥ì„ ë–¨ì–´íŠ¸ë¦¼{*B*} +- Enderì˜ í•˜ëŠ˜ 색 변경{*B*} +- 트립와ì´ì–´ìš©ìœ¼ë¡œ 실 설치 가능{*B*} +- 비가 ë‚˜ë­‡ìžŽì„ í†µê³¼í•´ 내림{*B*} +- ë¸”ë¡ ì•„ëž˜ìª½ì— ë ˆë²„ 설치 가능{*B*} +- 난ì´ë„ ì„¤ì •ì— ë”°ë¼ TNT 위력 변화{*B*} +- ì±… 조합법 변경{*B*} +- ì—°ìžŽì´ ë°°ë¥¼ 파괴하지 않고, ë°°ê°€ ì—°ìžŽì„ íŒŒê´´í•˜ë„ë¡ ë³€ê²½{*B*} +- ë¼ì§€ê°€ ë¼ì§€ê³ ê¸°ë¥¼ ë” ë§Žì´ ë–¨ì–´íŠ¸ë¦¼{*B*} +- 완전í‰ë©´ 월드ì—서 슬ë¼ìž„ì´ ë” ì ê²Œ ìƒì„±ë¨{*B*} +- Creeper로부터 받는 피해가 난ì´ë„ì— ë”°ë¼ ë‹¬ë¼ì§€ê³  타격 ë°˜ë™ì´ ê°•í•´ì§{*B*} +- ê³ ì •ëœ Endermanì´ í„±ì„ ë²Œë¦¬ì§€ 않ìŒ{*B*} +- 플레ì´ì–´ 순간ì´ë™ 추가(게임 ì¤‘ì— {*BACK_BUTTON*} 메뉴 사용){*B*} +- ì›ê²© 플레ì´ì–´ 비행, 투명화, ë¬´ì  ê´€ë ¨ 호스트 옵션 추가{*B*} +- 튜토리얼 ì›”ë“œì— ìƒˆ ì•„ì´í…œ ë° ê¸°ëŠ¥ì„ ìœ„í•œ 새 튜토리얼 추가{*B*} +- 튜토리얼 ì›”ë“œì˜ ìŒì•… ë””ìŠ¤í¬ ìƒìž 위치 ì—…ë°ì´íЏ{*B*} + + +{*ETB*}ëŒì•„오신 ê²ƒì„ í™˜ì˜í•©ë‹ˆë‹¤! ì•„ì§ ëˆˆì¹˜ì±„ì§€ 못했ì„ì§€ë„ ëª¨ë¥´ì§€ë§Œ, Minecraftê°€ ì—…ë°ì´íЏë˜ì—ˆìŠµë‹ˆë‹¤.{*B*}{*B*} +새로운 ê¸°ëŠ¥ì´ ë§Žì´ ì¶”ê°€ë습니다. ì¶”ê°€ëœ ì£¼ìš” 기능 ì¼ë¶€ë¥¼ 소개해 드리니 ì½ì–´ë³´ê³  ì‹  나는 ê²Œìž„ì˜ ì„¸ê³„ë¡œ ì—¬í–‰ì„ ë– ë‚˜ì‹­ì‹œì˜¤!{*B*}{*B*} +{*T1*}새로운 ì•„ì´í…œ{*ETB*} - ì—메랄드, ì—메랄드 ê´‘ì„, ì—메랄드 블ë¡, Ender ìƒìž, 트립와ì´ì–´ 후í¬, íš¨ê³¼ë¶€ì—¬ëœ í™©ê¸ˆ 사과, 모루, 화분, ì¡°ì•½ëŒ ë²½, ì´ë¼ ë‚€ ì¡°ì•½ëŒ ë²½, ë§ë¼ë¹„틀어진 그림, ê°ìž, 구운 ê°ìž, ë…성 ê°ìž, 당근, 황금 당근, 당근 막대, +호박 파ì´, 야간 시야 물약, 투명화 물약, 지하 ì„ì˜, 지하 ì„ì˜ ê´‘ì„, ì„ì˜ ë¸”ë¡, ì„ì˜ ë°œíŒ, ì„ì˜ ê³„ë‹¨, ê¹Žì•„ë†“ì€ ì„ì˜ ë¸”ë¡, ì„ì˜ ë¸”ë¡ ê¸°ë‘¥, 효과부여 ì±…, 카펫{*B*}{*B*} +{*T1*}새로운 괴물 추가{*ETB*} - 좀비 ë§ˆì„ ì‚¬ëžŒ{*B*}{*B*} +{*T1*}새 기능{*ETB*} - ë§ˆì„ ì‚¬ëžŒê³¼ 거래, 모루ì—서 무기 ë° ë„구를 수리하거나 효과 부여, Ender ìƒìžì— ì•„ì´í…œ 저장, ë¼ì§€ë¥¼ íƒ”ì„ ë•Œ 당근 스틱으로 ë°©í–¥ ì¡°ì • 가능!{*B*}{*B*} +{*T1*}새로운 미니 튜토리얼{*ETB*} – 튜토리얼 월드ì—서 새로운 ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ëŠ” ë°©ë²•ì„ ì•Œì•„ë³´ì„¸ìš”!{*B*}{*B*} +{*T1*}새로운 '부활절 알'{*ETB*} – 튜토리얼 월드ì—서 비밀 ìŒì•… 디스í¬ì˜ 위치를 ëª¨ë‘ ì˜®ê²¼ìŠµë‹ˆë‹¤. 다시 한번 찾아보세요!{*B*}{*B*} + + +ë§¨ì† ê³µê²©ë³´ë‹¤ ìœ„ë ¥ì´ ê°•í•©ë‹ˆë‹¤. + +ì†ì„ 사용하는 것보다 í™, 잡초, 모래, ìžê°ˆ, ëˆˆì„ ë” ë¹¨ë¦¬ 파냅니다. 눈ë©ì´ë¥¼ 파내려면 ì‚½ì´ í•„ìš”í•©ë‹ˆë‹¤. + +ëŒë¡œ ëœ ë¸”ë¡ì´ë‚˜ ê´‘ì„ì„ ì±„êµ´í•  때 쓰입니다. + +나무로 ëœ ë¸”ë¡ì„ ì†ì„ 사용할 때보다 ë” ë¹¨ë¦¬ 잘ë¼ëƒ…니다. + +í™ê³¼ 잡초 블ë¡ì„ 갈아엎어서 ìž‘ë¬¼ì„ ê¸°ë¥¼ 수 있게 만듭니다. + +ë‚˜ë¬´ë¬¸ì€ ì‚¬ìš©í•˜ê±°ë‚˜ 때리거나 ë˜ëŠ” 레드스톤으로 ì—´ 수 있습니다. + +ì² ë¬¸ì€ ë ˆë“œìŠ¤í†¤, 단추 ë˜ëŠ” 스위치로만 ì—´ 수 있습니다. + +NOT USED + +NOT USED + +NOT USED + +NOT USED + +ì°©ìš© 시 1ì˜ ë°©ì–´ë ¥ì„ ì–»ìŠµë‹ˆë‹¤. + +ì°©ìš© 시 3ì˜ ë°©ì–´ë ¥ì„ ì–»ìŠµë‹ˆë‹¤. + +ì°©ìš© 시 2ì˜ ë°©ì–´ë ¥ì„ ì–»ìŠµë‹ˆë‹¤. + +ì°©ìš© 시 1ì˜ ë°©ì–´ë ¥ì„ ì–»ìŠµë‹ˆë‹¤. + +ì°©ìš© 시 2ì˜ ë°©ì–´ë ¥ì„ ì–»ìŠµë‹ˆë‹¤. + +ì°©ìš© 시 5ì˜ ë°©ì–´ë ¥ì„ ì–»ìŠµë‹ˆë‹¤. + +ì°©ìš© 시 4ì˜ ë°©ì–´ë ¥ì„ ì–»ìŠµë‹ˆë‹¤. + +ì°©ìš© 시 1ì˜ ë°©ì–´ë ¥ì„ ì–»ìŠµë‹ˆë‹¤. + +ì°©ìš© 시 2ì˜ ë°©ì–´ë ¥ì„ ì–»ìŠµë‹ˆë‹¤. + +ì°©ìš© 시 6ì˜ ë°©ì–´ë ¥ì„ ì–»ìŠµë‹ˆë‹¤. + +ì°©ìš© 시 5ì˜ ë°©ì–´ë ¥ì„ ì–»ìŠµë‹ˆë‹¤. + +ì°©ìš© 시 2ì˜ ë°©ì–´ë ¥ì„ ì–»ìŠµë‹ˆë‹¤. + +ì°©ìš© 시 2ì˜ ë°©ì–´ë ¥ì„ ì–»ìŠµë‹ˆë‹¤. + +ì°©ìš© 시 5ì˜ ë°©ì–´ë ¥ì„ ì–»ìŠµë‹ˆë‹¤. + +ì°©ìš© 시 3ì˜ ë°©ì–´ë ¥ì„ ì–»ìŠµë‹ˆë‹¤. + +ì°©ìš© 시 1ì˜ ë°©ì–´ë ¥ì„ ì–»ìŠµë‹ˆë‹¤. + +ì°©ìš© 시 3ì˜ ë°©ì–´ë ¥ì„ ì–»ìŠµë‹ˆë‹¤. + +ì°©ìš© 시 8ì˜ ë°©ì–´ë ¥ì„ ì–»ìŠµë‹ˆë‹¤. + +ì°©ìš© 시 6ì˜ ë°©ì–´ë ¥ì„ ì–»ìŠµë‹ˆë‹¤. + +ì°©ìš© 시 3ì˜ ë°©ì–´ë ¥ì„ ì–»ìŠµë‹ˆë‹¤. + +빛나는 주괴입니다. 주괴로 ë„구를 만들면 주괴와 ìž¬ì§ˆì´ ê°™ì€ ë„구가 제작ë©ë‹ˆë‹¤. 화로ì—서 ê´‘ì„ì„ ë…¹ì—¬ 만듭니다. + +주괴, ë³´ì„, 염료를 설치 가능한 블ë¡ìœ¼ë¡œ 만들 수 있게 í•´ì¤ë‹ˆë‹¤. 값비싼 건설용 블ë¡ìœ¼ë¡œ 쓰거나 ê´‘ë¬¼ì„ ê°„íŽ¸í•˜ê²Œ 보관하는 ë° ì‚¬ìš©ë©ë‹ˆë‹¤. + +플레ì´ì–´ë‚˜ ë™ë¬¼ ë˜ëŠ” ê´´ë¬¼ì´ ë°Ÿìœ¼ë©´ 전기를 보냅니다. 나무 ì••ë ¥íŒì€ ìœ„ìª½ì— ë¬¼ì²´ë¥¼ ë–¨ì–´ëœ¨ë ¤ë„ ìž‘ë™í•©ë‹ˆë‹¤. + +ìž‘ì€ ê³„ë‹¨ì„ ë§Œë“œëŠ” ë° ì‚¬ìš©ë©ë‹ˆë‹¤. + +긴 ê³„ë‹¨ì„ ë§Œë“œëŠ” ë° ì“°ìž…ë‹ˆë‹¤. ë°œíŒ 2개를 쌓으면 보통 í¬ê¸°ì˜ 2단 계단 블ë¡ì´ 만들어집니다. + +긴 ê³„ë‹¨ì„ ë§Œë“œëŠ” ë° ì“°ìž…ë‹ˆë‹¤. ë°œíŒ 2개를 쌓으면 보통 í¬ê¸°ì˜ 2단 계단 블ë¡ì´ 만들어집니다. + +ë¹›ì„ ë§Œë“œëŠ” ë° ì‚¬ìš©í•©ë‹ˆë‹¤. 눈과 ì–¼ìŒë„ ë…¹ì¼ ìˆ˜ 있습니다. + +건설 재료로 쓰거나 다양한 ë¬¼ê±´ì˜ ìž¬ë£Œë¡œ 사용ë©ë‹ˆë‹¤. ì–´ë–¤ í˜•íƒœì˜ ë‚˜ë¬´ë¡œë“  만들어낼 수 있습니다. + +건설 재료로 사용ë©ë‹ˆë‹¤. ì¼ë°˜ 모래와 달리 ì¤‘ë ¥ì˜ ì˜í–¥ì„ 받지 않습니다. + +건설 재료로 사용ë©ë‹ˆë‹¤. + +횃불, 화살, 표지íŒ, 사다리, 울타리를 만들거나 무기 ë˜ëŠ” ë„êµ¬ì˜ ì†ìž¡ì´ë¡œ 사용ë©ë‹ˆë‹¤. + +ë°¤ì— ëª¨ë“  플레ì´ì–´ê°€ ì¹¨ëŒ€ì— ë“¤ë©´ ì‹œê°„ì„ ì•žë‹¹ê²¨ì„œ 아침으로 만들며, 플레ì´ì–´ ìƒì„± ì§€ì ì„ 바꿉니다. +침대 ì œìž‘ì— ì‚¬ìš©ëœ ì–‘í„¸ì˜ ìƒ‰ê³¼ ìƒê´€ì—†ì´, ì¹¨ëŒ€ì˜ ìƒ‰ìƒì€ ëª¨ë‘ ê°™ìŠµë‹ˆë‹¤. + +ì¼ë°˜ì ì¸ 제작보다 ë” ë‹¤ì–‘í•œ ì•„ì´í…œì„ ì„ íƒí•´ 제작할 수 있게 í•´ì¤ë‹ˆë‹¤. + +ê´‘ì„ì„ ë…¹ì´ê³  숯과 유리를 만들며, ìƒì„ ê³¼ ë¼ì§€ê³ ê¸°ë¥¼ 요리하는 ë° ì‚¬ìš©í•©ë‹ˆë‹¤. + +블ë¡ê³¼ ì•„ì´í…œì„ 넣어 보관합니다. ìƒìž 2개를 나란히 놓으면 ìš©ëŸ‰ì´ 2ë°° í° ìƒìžê°€ 만들어집니다. + +ë›°ì–´ë„˜ì„ ìˆ˜ 없는 방어벽으로 사용ë©ë‹ˆë‹¤. 플레ì´ì–´ë‚˜ ë™ë¬¼, ê´´ë¬¼ì— ëŒ€í•´ì„œëŠ” 1.5ë°° 높ì´ì˜ 블ë¡ìœ¼ë¡œ 간주ë˜ì§€ë§Œ 다른 블ë¡ì— 대해서는 높ì´ê°€ ê°™ì€ ê²ƒìœ¼ë¡œ 간주ë©ë‹ˆë‹¤. + +ìˆ˜ì§ ê²½ì‚¬ë¥¼ 오를 때 사용합니다. + +사용하거나 때리거나 ë ˆë“œìŠ¤í†¤ì„ ì´ìš©í•´ ìž‘ë™ì‹œí‚µë‹ˆë‹¤. ìž‘ë™ ë°©ì‹ì€ ì¼ë°˜ 문과 같지만 ê°œë³„ì  ë¸”ë¡ìœ¼ë¡œ 간주ë˜ë©°, ë•…ê³¼ 수í‰ì¸ 형태로 열립니다. + +ìžì‹ ì´ë‚˜ 다른 플레ì´ì–´ê°€ 입력한 í…스트를 표시합니다. + +횃불보다 ë” ë°ì€ ë¹›ì„ ë§Œë“¤ì–´ëƒ…ë‹ˆë‹¤. ì–¼ìŒì´ë‚˜ ëˆˆì„ ë…¹ì´ë©°, 물ì†ì—서 ì‚¬ìš©ì´ ê°€ëŠ¥í•©ë‹ˆë‹¤. + +í­ë°œì„ ì¼ìœ¼í‚µë‹ˆë‹¤. 설치한 다ìŒ, 부싯ëŒê³¼ 부시를 사용하거나 전기를 ì´ìš©í•´ í­íŒŒí•  수 있습니다. + +ë²„ì„¯ì£½ì„ ë‹´ì•„ë‘는 ë° ì‚¬ìš©í•©ë‹ˆë‹¤. ì£½ì„ ë¨¹ì–´ë„ ê·¸ë¦‡ì€ ë‚¨ìŠµë‹ˆë‹¤. + +물ì´ë‚˜ 용암, 우유를 ë‹´ì•„ë‘거나 운반하는 ë° ì“°ìž…ë‹ˆë‹¤. + +ë¬¼ì„ ì €ìž¥í•˜ê³  옮기는 ë° ì‚¬ìš©í•©ë‹ˆë‹¤. + +ìš©ì•”ì„ ì €ìž¥í•˜ê³  옮기는 ë° ì‚¬ìš©í•©ë‹ˆë‹¤. + +우유를 저장하고 옮기는 ë° ì‚¬ìš©í•©ë‹ˆë‹¤. + +ë¶ˆê½ƒì„ ì¼ìœ¼í‚¤ê³ , TNT를 í­íŒŒí•˜ê³ , ì°¨ì›ë¬¸ì„ 여는 ë° ì‚¬ìš©í•©ë‹ˆë‹¤. + +물고기를 ìž¡ì„ ìˆ˜ 있습니다. + +태양과 ë‹¬ì˜ ìœ„ì¹˜ë¥¼ 표시합니다. + +시작 ì§€ì ì„ 표시합니다. + +ì§€ë„를 들고 ìžˆì„ ë™ì•ˆ íƒí—˜í•œ ì§€ì—­ì˜ ì´ë¯¸ì§€ë¥¼ 만들어냅니다. ê¸¸ì„ ì°¾ëŠ” ë° ì‚¬ìš©í•  수 있습니다. + +화살과 함께 사용하여 ì›ê±°ë¦¬ ê³µê²©ì„ í•©ë‹ˆë‹¤. + +í™œì— ìž¥ì „í•˜ì—¬ 사용합니다. + +{*ICON_SHANK_01*}를 2.5ë§Œí¼ íšŒë³µí•©ë‹ˆë‹¤. + +{*ICON_SHANK_01*}를 1ë§Œí¼ íšŒë³µí•©ë‹ˆë‹¤. 효과가 6번까지 중복ë©ë‹ˆë‹¤. + +{*ICON_SHANK_01*}를 1ë§Œí¼ íšŒë³µí•©ë‹ˆë‹¤. + +{*ICON_SHANK_01*}를 1ë§Œí¼ íšŒë³µí•©ë‹ˆë‹¤. + +{*ICON_SHANK_01*}를 3ë§Œí¼ íšŒë³µí•©ë‹ˆë‹¤. + +먹어서 {*ICON_SHANK_01*}를 1ë§Œí¼ íšŒë³µí•˜ê±°ë‚˜ 화로ì—서 조리할 수 있습니다. 먹으면 중ë…ë  ìˆ˜ 있습니다. + +{*ICON_SHANK_01*}를 3ë§Œí¼ íšŒë³µí•©ë‹ˆë‹¤. 화로ì—서 ë‹­ 날고기를 조리하여 만듭니다. + +먹어서 {*ICON_SHANK_01*}를 1.5ë§Œí¼ íšŒë³µí•˜ê±°ë‚˜ 화로ì—서 조리할 수 있습니다. + +{*ICON_SHANK_01*}를 4ë§Œí¼ íšŒë³µí•©ë‹ˆë‹¤. 화로ì—서 소 날고기를 조리하여 만듭니다. + +먹어서 {*ICON_SHANK_01*}를 1.5ë§Œí¼ íšŒë³µí•˜ê±°ë‚˜ 화로ì—서 조리할 수 있습니다. + +{*ICON_SHANK_01*}를 4ë§Œí¼ íšŒë³µí•©ë‹ˆë‹¤. 화로ì—서 ë¼ì§€ 날고기를 조리하여 만듭니다. + +먹어서 {*ICON_SHANK_01*}를 1ë§Œí¼ íšŒë³µí•˜ê±°ë‚˜ 화로ì—서 조리할 수 있습니다. ì˜¤ì…€ë¡¯ì„ ê¸¸ë“¤ì´ê¸° 위한 먹ì´ë¡œ 사용할 ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. + +{*ICON_SHANK_01*}를 2.5ë§Œí¼ íšŒë³µí•©ë‹ˆë‹¤. 화로ì—서 ë‚ ìƒì„ ì„ 조리하여 만듭니다. + +{*ICON_SHANK_01*}를 2ë§Œí¼ íšŒë³µí•˜ë©° 황금 사과를 만드는 ë° ì‚¬ìš©í•©ë‹ˆë‹¤. + +{*ICON_SHANK_01*}를 2ë§Œí¼ íšŒë³µí•˜ë©° 4ì´ˆ ë™ì•ˆ ì²´ë ¥ì´ ìžë™ìœ¼ë¡œ 회복ë©ë‹ˆë‹¤. 사과와 금ë©ì´ë¥¼ 사용해 만들 수 있습니다. + +{*ICON_SHANK_01*}를 2ë§Œí¼ íšŒë³µí•©ë‹ˆë‹¤. 먹으면 중ë…ë  ìˆ˜ 있습니다. + +ì¼€ì´í¬ë¥¼ 만들 때 사용하며 ë¬¼ì•½ì„ ì–‘ì¡°í•  때 ìž¬ë£Œë¡œë„ ì“°ìž…ë‹ˆë‹¤. + +켜거나 ëŒ ë•Œ 전기를 보냅니다. 다시 조작하기 전까지 켜지거나 꺼진 ìƒíƒœë¡œ 있습니다. + +주기ì ìœ¼ë¡œ 전기를 보내거나, ë¸”ë¡ ì˜†ì— ì—°ê²°í•˜ë©´ 송/수신기 ì—­í• ì„ í•©ë‹ˆë‹¤. +약한 조명으로 사용할 ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. + +레드스톤 회로ì—서 중계장치, 지연장치 ë˜ëŠ” 다ì´ì˜¤ë“œ ì—­í• ì„ í•©ë‹ˆë‹¤. + +누르면 전기를 보냅니다. 단추를 떼면 1ì´ˆ ì •ë„ ìž‘ë™í•˜ë‹¤ê°€ 닫힙니다. + +레드스톤으로 전기를 공급하면 ì•„ì´í…œì„ 넣어 무작위 순서로 발사할 수 있습니다. + +ìž‘ë™ì‹œí‚¤ë©´ ìŒì„ 연주합니다. 때리면 ìŒì˜ 높낮ì´ê°€ ë°”ë€ë‹ˆë‹¤. 다른 ë¸”ë¡ ìœ„ì— ì˜¬ë ¤ë†“ìœ¼ë©´ 연주 ìŒì˜ 종류가 변경ë©ë‹ˆë‹¤. + +광물 수레가 가는 길로 사용ë©ë‹ˆë‹¤. + +ë™ë ¥ì„ 공급하면 ê·¸ 위를 지나가는 광물 ìˆ˜ë ˆì˜ ì†ë„를 올려ì¤ë‹ˆë‹¤. ë™ë ¥ì´ ëŠê¸°ë©´ 광물 수레를 멈춰 세ì›ë‹ˆë‹¤. + +ì••ë ¥ ë°œíŒì²˜ëŸ¼ 사용ë˜ì§€ë§Œ 광물 수레로만 ìž‘ë™ì‹œí‚¬ 수 있습니다. ë™ë ¥ì´ 공급ë˜ë©´ 레드스톤 신호를 보냅니다. + +ë ˆì¼ì„ ë”°ë¼ì„œ 플레ì´ì–´ë‚˜ ë™ë¬¼, ê´´ë¬¼ì„ ì´ë™ì‹œí‚µë‹ˆë‹¤. + +ë ˆì¼ì„ ë”°ë¼ì„œ ë¬¼ê±´ì„ ì´ë™ì‹œí‚µë‹ˆë‹¤. + +ì„íƒ„ì„ ì•ˆì— ë„£ìœ¼ë©´ ë ˆì¼ì„ ë”°ë¼ ì›€ì§ì´ë©° 다른 광물 수레를 밀어ì¤ë‹ˆë‹¤. + +헤엄치는 것보다 물ì—서 빨리 ì´ë™í•  수 있습니다. + +ì–‘ì—게서 얻어냅니다. 염료로 ìƒ‰ì„ ë°”ê¿€ 수 있습니다. + +건설 재료로 쓰입니다. 염료로 ìƒ‰ì„ ë°”ê¿€ 수 있지만, ì–‘í„¸ì€ ì–‘ì—게서 쉽게 ì–»ì„ ìˆ˜ 있으므로 권장하지는 않습니다. + +ì–‘í„¸ì„ ê²€ì€ìƒ‰ìœ¼ë¡œ 염색합니다. + +ì–‘í„¸ì„ ì´ˆë¡ìƒ‰ìœ¼ë¡œ 염색합니다. + +ì–‘í„¸ì„ ê°ˆìƒ‰ìœ¼ë¡œ 염색할 때, 코코아 ì½©ì„ ìž¬ë°°í•  때, 쿠키를 만들 때 쓰입니다. + +ì–‘í„¸ì„ ì€ìƒ‰ìœ¼ë¡œ 염색합니다. + +ì–‘í„¸ì„ ë…¸ëž€ìƒ‰ìœ¼ë¡œ 염색합니다. + +ì–‘í„¸ì„ ë¹¨ê°„ìƒ‰ìœ¼ë¡œ 염색합니다. + +작물ì´ë‚˜ 나무, 긴 잡초, 거대 버섯, ê½ƒì„ ì¦‰ì‹œ 성장시킵니다. 염료 ìž¬ë£Œë¡œë„ ì‚¬ìš©í•©ë‹ˆë‹¤. + +ì–‘í„¸ì„ ë¶„í™ìƒ‰ìœ¼ë¡œ 염색합니다. + +ì–‘í„¸ì„ ì£¼í™©ìƒ‰ìœ¼ë¡œ 염색합니다. + +ì–‘í„¸ì„ ë¼ìž„색으로 염색합니다. + +ì–‘í„¸ì„ íšŒìƒ‰ìœ¼ë¡œ 염색합니다. + +ì–‘í„¸ì„ ë°ì€ 회색으로 염색합니다. +(참고: ë°ì€ 회색 염료는 회색 염료와 뼛가루를 ì„žì–´ë„ ë§Œë“¤ 수 있습니다. ì´ ë°©ë²•ì„ ì“°ë©´ 먹물 주머니 하나로 회색 염료를 3개가 ì•„ë‹ˆë¼ 4ê°œ 만들 수 있습니다.) + +ì–‘í„¸ì„ ë°ì€ 파란색으로 염색합니다. + +ì–‘í„¸ì„ ì²­ë¡ìƒ‰ìœ¼ë¡œ 염색합니다. + +ì–‘í„¸ì„ ë³´ë¼ìƒ‰ìœ¼ë¡œ 염색합니다. + +ì–‘í„¸ì„ ìžì£¼ìƒ‰ìœ¼ë¡œ 염색합니다. + +ì–‘í„¸ì„ íŒŒëž€ìƒ‰ìœ¼ë¡œ 염색합니다. + +ìŒì•… 디스í¬ë¥¼ 재ìƒí•©ë‹ˆë‹¤. + +매우 강력한 ë„구나 무기, 방어구를 만드는 ë° ì‚¬ìš©í•©ë‹ˆë‹¤. + +횃불보다 ë” ë°ì€ ë¹›ì„ ë§Œë“¤ì–´ëƒ…ë‹ˆë‹¤. ì–¼ìŒì´ë‚˜ ëˆˆì„ ë…¹ì´ë©°, 물ì†ì—서 ì‚¬ìš©ì´ ê°€ëŠ¥í•©ë‹ˆë‹¤. + +ì±…ê³¼ ì§€ë„ì˜ ìž¬ë£Œìž…ë‹ˆë‹¤. + +ì±…ìž¥ì„ ë§Œë“¤ê±°ë‚˜ 효과부여 ì±…ì„ ë§Œë“œëŠ” ë° ì“°ìž…ë‹ˆë‹¤. + +효과부여대 ì£¼ìœ„ì— ë†“ìœ¼ë©´ ë” ê°•ë ¥í•œ 효과를 만들어낼 수 있습니다. + +장ì‹ìœ¼ë¡œ 사용ë©ë‹ˆë‹¤. + +ì² ì œ ê³¡ê´­ì´ ì´ìƒìœ¼ë¡œ 채굴하면 ì–»ì„ ìˆ˜ 있으며, 화로ì—서 녹여 황금 주괴로 만듭니다. + +ëŒê³¡ê´­ì´ ì´ìƒìœ¼ë¡œ 채굴하면 ì–»ì„ ìˆ˜ 있으며, 화로ì—서 녹여 ì²  주괴로 만듭니다. + +곡괭ì´ë¡œ 채굴하여 ì„íƒ„ì„ ì–»ì–´ëƒ…ë‹ˆë‹¤. + +ëŒê³¡ê´­ì´ ì´ìƒìœ¼ë¡œ 채굴하면 청금ì„ì´ ë‚˜ì˜µë‹ˆë‹¤. + +ì² ì œ ê³¡ê´­ì´ ì´ìƒìœ¼ë¡œ 채굴하면 다ì´ì•„몬드를 얻습니다. + +ì² ì œ ê³¡ê´­ì´ ì´ìƒìœ¼ë¡œ 채굴하면 레드스톤 가루를 얻습니다. + +곡괭ì´ë¡œ 채굴하여 조약ëŒì„ 얻습니다. + +ì‚½ì„ ì´ìš©í•´ì„œ 얻습니다. ê±´ë¬¼ì„ ì§“ëŠ” ë° ì“°ìž…ë‹ˆë‹¤. + +ë•…ì— ì‹¬ì„ ìˆ˜ 있으며 나무로 ìžë¼ë‚©ë‹ˆë‹¤. + +부술 수 없습니다. + +접촉하는 모든 ê²ƒì— ë¶ˆì„ ë¶™ìž…ë‹ˆë‹¤. ì–‘ë™ì´ì— ë‹´ì„ ìˆ˜ 있습니다. + +ì‚½ì„ ì´ìš©í•´ì„œ ì–»ì„ ìˆ˜ 있으며 화로ì—서 ë…¹ì´ë©´ 유리가 나옵니다. ì•„ëž˜ì— ë‹¤ë¥¸ 블ë¡ì´ 없으면 ì¤‘ë ¥ì˜ ì˜í–¥ì„ 받습니다. + +ì‚½ì„ ì´ìš©í•´ì„œ ì–»ì„ ìˆ˜ 있으며, 파낼 때 ê°€ë” ë¶€ì‹¯ëŒì´ 나옵니다. ì•„ëž˜ì— ë‹¤ë¥¸ 블ë¡ì´ 없으면 ì¤‘ë ¥ì˜ ì˜í–¥ì„ 받습니다. + +ë„ë¼ë¥¼ 사용해서 벤 ë‹¤ìŒ íŒìž 제작ì´ë‚˜ ë•”ê°ìœ¼ë¡œ 쓰입니다. + +화로ì—서 모래를 녹여 만듭니다. ê±´ë¬¼ì„ ì§“ëŠ” ë° ì‚¬ìš©í•  수 있지만, 채굴하려고 하면 깨져버립니다. + +곡괭ì´ë¡œ ëŒì„ 채굴하면 ì–»ì„ ìˆ˜ 있습니다. 화로를 만들거나 ëŒë¡œ ëœ ë„êµ¬ì˜ ìž¬ë£Œë¡œ 쓰입니다. + +화로ì—서 ì°°í™ì„ 구워 만듭니다. + +í™”ë¡œì— ë„£ì–´ ë²½ëŒë¡œ 구워냅니다. + +부수면 ì°°í™ ë©ì´ê°€ 나옵니다. ì°°í™ì„ í™”ë¡œì— ë„£ì–´ 구워내면 ë²½ëŒì´ ë©ë‹ˆë‹¤. + +눈ë©ì´ë¥¼ 보관하는 ì¢‹ì€ ë°©ë²•ìž…ë‹ˆë‹¤. + +삽으로 파서 눈ë©ì´ë¥¼ 만들 수 있습니다. + +부수면 ê°€ë” ë°€ ì”¨ì•—ì´ ë‚˜ì˜µë‹ˆë‹¤. + +ì—¼ë£Œì˜ ìž¬ë£Œìž…ë‹ˆë‹¤. + +ê·¸ë¦‡ì„ ì‚¬ìš©í•˜ì—¬ 죽으로 만들 수 있습니다. + +다ì´ì•„몬드 곡괭ì´ë¡œë§Œ ì–»ì„ ìˆ˜ 있습니다. 물과 ìš©ì•”ì„ ì„žì–´ 만들어내며, ì°¨ì›ë¬¸ì˜ 재료가 ë©ë‹ˆë‹¤. + +ê´´ë¬¼ì„ ì†Œí™˜í•©ë‹ˆë‹¤. + +ë•… ìœ„ì— ë†“ì•„ 전기를 í르게 합니다. 물약으로 양조하면 íš¨ê³¼ì˜ ì§€ì† ì‹œê°„ì´ ëŠ˜ì–´ë‚©ë‹ˆë‹¤. + +다 ìžëž€ ìž‘ë¬¼ì„ ìˆ˜í™•í•˜ë©´ ë°€ì„ ì–»ìŠµë‹ˆë‹¤. + +ì”¨ì•—ì„ ì‹¬ì„ ìˆ˜ 있게 ì¤€ë¹„ëœ ë•…ìž…ë‹ˆë‹¤. + +화로를 사용하여 ì´ˆë¡ ì„ ì¸ìž¥ 염료를 만들 수 있습니다. + +ì„¤íƒ•ì„ ë§Œë“œëŠ” ë° ì‚¬ìš©í•©ë‹ˆë‹¤. + +투구처럼 ë¨¸ë¦¬ì— ì“°ê±°ë‚˜ 횃불과 조합하여 호박등으로 만들 수 있습니다. 호박 파ì´ì˜ 주재료ì´ê¸°ë„ 합니다. + +ë¶ˆì´ ë¶™ìœ¼ë©´ ì˜ì›ížˆ 타오릅니다. + +위를 지나가는 ê²ƒë“¤ì˜ ì†ë„를 늦춥니다. + +ì°¨ì›ë¬¸ì„ 통해서 ì§€ìƒê³¼ 지하를 오갈 수 있습니다. + +í™”ë¡œì˜ ì—°ë£Œ, í˜¹ì€ íšƒë¶ˆ ì œìž‘ì˜ ìž¬ë£Œë¡œ 사용ë©ë‹ˆë‹¤. + +거미를 잡으면 ì–»ì„ ìˆ˜ 있습니다. 활과 ë‚šì‹¯ëŒ€ì˜ ìž¬ë£Œë¡œ 사용하거나 ë•…ì— ë†“ì•„ 트립와ì´ì–´ë¥¼ ìƒì„±í•  수 있습니다. + +ë‹­ì„ ìž¡ìœ¼ë©´ ì–»ì„ ìˆ˜ 있습니다. í™”ì‚´ì˜ ìž¬ë£Œìž…ë‹ˆë‹¤. + +Creeper를 처치하여 얻습니다. TNTì˜ ìž¬ë£Œë¡œ 사용하거나 ë¬¼ì•½ì„ ì–‘ì¡°í•˜ëŠ” ë° ìž¬ë£Œë¡œ 사용합니다. + +ë†ì§€ì— 심어 작물로 가꿔냅니다. ì”¨ì•—ì„ ê¸°ë¥´ë ¤ë©´ 충분한 ë¹›ì´ ìžˆì–´ì•¼ 합니다. + +ìž‘ë¬¼ì„ ìˆ˜í™•í•˜ì—¬ 얻습니다. ì‹ëŸ‰ìœ¼ë¡œ 만들 수 있습니다. + +ìžê°ˆì„ 파내서 ì–»ì„ ìˆ˜ 있습니다. 부싯ëŒê³¼ 부시를 만드는 재료입니다. + +ë¼ì§€ì— 사용하면 ë¼ì§€ë¥¼ 타고 ë‹¤ë‹ ìˆ˜ 있습니다. ë§‰ëŒ€ì— ë¼ìš´ ë‹¹ê·¼ì„ ì‚¬ìš©í•´ ë¼ì§€ê°€ 움ì§ì´ëŠ” ë°©í–¥ì„ ì¡°ì¢…í•  수 있습니다. + +ëˆˆì„ íŒŒí—¤ì³ì„œ íšë“하며, ì§‘ì–´ë˜ì§ˆ 수 있습니다. + +소를 잡으면 ì–»ì„ ìˆ˜ 있으며 ë°©ì–´êµ¬ì˜ ìž¬ë£Œë¡œ 쓰거나 ì±…ì„ ë§Œë“œëŠ” ë° ì‚¬ìš©í•©ë‹ˆë‹¤. + +슬ë¼ìž„ì„ ì²˜ì¹˜í•˜ì—¬ 얻습니다. ë¬¼ì•½ì„ ì–‘ì¡°í•  때 재료로 쓰거나 ëˆëˆì´ í”¼ìŠ¤í†¤ì˜ ìž¬ë£Œë¡œ 쓸 수 있습니다. + +ë‹­ì´ ë¬´ìž‘ìœ„ë¡œ 낳습니다. ì‹ëŸ‰ìœ¼ë¡œ 만들 수 있습니다. + +발광ì„ì„ ì±„êµ´í•´ì„œ 얻습니다. ì œìž‘ì„ ê±°ì³ ë‹¤ì‹œ ë°œê´‘ì„ ë¸”ë¡ìœ¼ë¡œ 만들거나 물약과 ì–‘ì¡°í•´ íš¨ê³¼ì˜ íš¨ëŠ¥ì„ ë†’ì¼ ìˆ˜ 있습니다. + +í•´ê³¨ì„ ì²˜ì¹˜í•˜ì—¬ 얻습니다. 뼛가루로 만들 수 있습니다. 늑대ì—게 먹ì´ë©´ ê¸¸ë“¤ì¼ ìˆ˜ 있습니다. + +í•´ê³¨ì´ Creeper를 처치하ë„ë¡ ìœ ë„해서 얻습니다. 주í¬ë°•스ì—서 재ìƒì´ 가능합니다. + +ë¶ˆì„ êº¼ëœ¨ë¦¬ê³  ìž‘ë¬¼ì˜ ì„±ìž¥ì„ ë•습니다. ì–‘ë™ì´ì— ë‹´ì„ ìˆ˜ 있습니다. + +부수면 ì¼ì • 확률로 ë¬˜ëª©ì´ ë‚˜ì˜µë‹ˆë‹¤. ë¬˜ëª©ì„ ì‹¬ì–´ 나무로 가꿀 수 있습니다. + +ë˜ì „ì—서 ì°¾ì„ ìˆ˜ 있으며 건설과 장ì‹ì— 사용ë©ë‹ˆë‹¤. + +ì–‘ì—게서 ì–‘í„¸ì„ ì–»ê±°ë‚˜ 나뭇잎 블ë¡ì„ 수확하는 ë° ì‚¬ìš©í•©ë‹ˆë‹¤. + +ë™ë ¥ì„ 공급(단추, 레버, ì••ë ¥íŒ, 레드스톤 íšƒë¶ˆì„ ì´ìš©í•˜ê±°ë‚˜, ê·¸ê²ƒë“¤ì„ ë ˆë“œìŠ¤í†¤ê³¼ 함께 사용)하면 í”¼ìŠ¤í†¤ì´ ëŠ˜ì–´ë‚˜ 블ë¡ì„ 밀어냅니다. + +ë™ë ¥ì„ 공급(단추, 레버, ì••ë ¥íŒ, 레드스톤 íšƒë¶ˆì„ ì´ìš©í•˜ê±°ë‚˜, ê·¸ê²ƒë“¤ì„ ë ˆë“œìŠ¤í†¤ê³¼ 함께 사용)하면 í”¼ìŠ¤í†¤ì´ ëŠ˜ì–´ë‚˜ 블ë¡ì„ 밀어냅니다. í”¼ìŠ¤í†¤ì´ ì¤„ì–´ë“¤ë©´ 다시 블ë¡ì„ ëŒì–´ì˜µë‹ˆë‹¤. + +ëŒë¡œ ëœ ë¸”ë¡ìœ¼ë¡œ 만들며 주로 요새ì—서 ë³¼ 수 있습니다. + +울타리처럼 방어벽으로 사용ë©ë‹ˆë‹¤. + +문과 비슷하지만 울타리와 함께 사용ë©ë‹ˆë‹¤. + +수박 ì¡°ê°ì˜ 재료입니다. + +유리 대신 사용할 수 있는 투명 íŒìžìž…니다. + +ë•…ì— ì‹¬ì–´ 호박으로 가꿔냅니다. + +ë•…ì— ì‹¬ì–´ 수박으로 가꿔냅니다. + +Endermanì´ ì£½ì„ ë•Œ 떨어뜨립니다. Ender 진주를 ë˜ì§€ë©´ 진주가 떨어진 위치로 플레ì´ì–´ê°€ ì´ë™í•˜ë©° ì²´ë ¥ì„ ìžƒìŠµë‹ˆë‹¤. + +í™ ë¸”ë¡ ìœ„ì— ìž¡ì´ˆê°€ ìžëžìŠµë‹ˆë‹¤. ì‚½ì„ ì´ìš©í•´ì„œ 얻습니다. ê±´ë¬¼ì„ ì§“ëŠ” ë° ì“°ìž…ë‹ˆë‹¤. + +ê±´ë¬¼ì„ ì§“ê±°ë‚˜ 장ì‹ìœ¼ë¡œ 사용ë©ë‹ˆë‹¤. + +통과할 때 움ì§ìž„ì´ ëŠë ¤ì§‘니다. 가위로 ìž˜ë¼ ì‹¤ì„ ì–»ì„ ìˆ˜ 있습니다. + +íŒŒê´´ë  ë•Œ Sliverfish를 소환합니다. ê·¼ì²˜ì— ìžˆëŠ” Sliverfishê°€ ê³µê²©ì„ ë°›ì•„ë„ Sliverfish를 소환합니다. + +ë†“ì€ í›„ ì‹œê°„ì´ ì§€ë‚˜ë©´ ìžë¼ë‚©ë‹ˆë‹¤. 가위를 사용하여 수확할 수 있습니다. 사다리처럼 타고 올ë¼ê°ˆ 수 있습니다. + +ì–¼ìŒ ìœ„ë¥¼ 걸어가면 미ë„러집니다. 파괴ë˜ì—ˆì„ 때 ì•„ëž˜ì— ë‹¤ë¥¸ 블ë¡ì´ 있으면 물로 변합니다. ê´‘ì› ê°€ê¹Œì´ì— 있거나 ì§€í•˜ì— ìžˆìœ¼ë©´ 녹습니다. + +장ì‹ìœ¼ë¡œ 사용할 수 있습니다. + +물약 양조와 요새 위치 íƒìƒ‰ì— 사용합니다. 지하 요새 근처나 ë‚´ë¶€ì— ì£¼ë¡œ 서ì‹í•˜ëŠ” Blazeê°€ 떨어뜨립니다. + +물약 ì–‘ì¡°ì— ì‚¬ìš©í•©ë‹ˆë‹¤. Ghastê°€ ì£½ì„ ë•Œ 떨어뜨립니다. + +좀비 Pigmanì´ ì£½ì„ ë•Œ 떨어뜨립니다. 좀비 Pigmanì€ ì§€í•˜ì—서 찾아볼 수 있습니다. ë¬¼ì•½ì„ ì–‘ì¡°í•  때 재료로 사용ë©ë‹ˆë‹¤. + +물약 ì–‘ì¡°ì— ì‚¬ìš©í•©ë‹ˆë‹¤. ì´ê²ƒì€ 지하 요새ì—서 ìžì—° ìƒíƒœë¡œ ìžë¼ëŠ” ê²ƒì„ ì°¾ì„ ìˆ˜ 있습니다. ë˜í•œ ì˜í˜¼ ëª¨ëž˜ì— ì‹¬ì„ ìˆ˜ 있습니다. + +사용하면 ìž¬ë£Œì— ë”°ë¼ ë‹¤ì–‘í•œ 효과를 ì–»ì„ ìˆ˜ 있습니다. + +ë¬¼ì„ ì±„ìš¸ 수 있으며 양조대ì—서 ë¬¼ì•½ì„ ë§Œë“œëŠ” 기본 재료로 사용할 수 있습니다. + +ë…ì´ ë“  ìŒì‹ì´ìž ì–‘ì¡°ìš© ì•„ì´í…œìž…니다. 플레ì´ì–´ê°€ 거미나 ë™êµ´ 거미를 ì£½ì¼ ë•Œ 떨어뜨립니다. + +물약 ì–‘ì¡°ì— ì‚¬ìš©í•©ë‹ˆë‹¤. 주로 해로운 íš¨ê³¼ì˜ ë¬¼ì•½ì„ ë§Œë“œëŠ” ë° ì‚¬ìš©í•©ë‹ˆë‹¤. + +물약 ì–‘ì¡°ì— ì‚¬ìš©í•©ë‹ˆë‹¤. 다른 ì•„ì´í…œê³¼ 조합하여 Enderì˜ ëˆˆì´ë‚˜ 마그마 í¬ë¦¼ìœ¼ë¡œ 만들 수 있습니다. + +물약 ì–‘ì¡°ì— ì‚¬ìš©í•©ë‹ˆë‹¤. + +물약과 í­ë°œ ë¬¼ì•½ì„ ë§Œë“œëŠ” ë° ì‚¬ìš©í•©ë‹ˆë‹¤. + +비나 물 ì–‘ë™ì´ë¥¼ 사용해서 ë¬¼ì„ ì±„ìš¸ 수 있습니다. 그리고 ìœ ë¦¬ë³‘ì— ë¬¼ì„ ì±„ìš°ëŠ” ë° ì‚¬ìš©í•  수 있습니다. + +ë˜ì§€ë©´ Ender 관문으로 가는 ë°©í–¥ì„ í‘œì‹œí•©ë‹ˆë‹¤. ì—´ë‘ ê°œë¥¼ Ender 관문 ì™¸í˜•ì— ì˜¬ë ¤ë†“ìœ¼ë©´ Ender ê´€ë¬¸ì´ ì—´ë¦½ë‹ˆë‹¤. + +물약 ì–‘ì¡°ì— ì‚¬ìš©í•©ë‹ˆë‹¤. + +잡초 블ë¡ê³¼ 비슷하나 ë²„ì„¯ì„ í‚¤ìš°ê¸°ì— ì¢‹ìŠµë‹ˆë‹¤. + +ë¬¼ì— ëœ¹ë‹ˆë‹¤. 수련잎 위로 걸어 ë‹¤ë‹ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. + +지하 요새 ê±´ì„¤ì— ì“°ìž…ë‹ˆë‹¤. Ghastì˜ ë¶ˆë©ì´ì— 피해를 받지 않습니다. + +지하 ìš”ìƒˆì— ì“°ìž…ë‹ˆë‹¤. + +지하 요새ì—서 ì°¾ì„ ìˆ˜ 있습니다. 부서지면 지하 사마귀를 떨어뜨립니다. + +플레ì´ì–´ì˜ 경험치를 사용해 ê²€, 곡괭ì´, ë„ë¼, 삽, 활 ë° ë°©ì–´êµ¬ì— íš¨ê³¼ë¥¼ 부여할 수 있습니다. + +Enderì˜ ëˆˆ ì—´ë‘ ê°œë¥¼ 사용하면 열립니다. 플레ì´ì–´ë¥¼ Ender ì°¨ì›ìœ¼ë¡œ 보냅니다. + +Ender ê´€ë¬¸ì„ í˜•ì„±í•˜ëŠ” ë° ì“°ìž…ë‹ˆë‹¤. + +Enderì—서 ì°¾ì„ ìˆ˜ 있는 ë¸”ë¡ ìœ í˜•ìž…ë‹ˆë‹¤. í­ë°œì— 견디는 ëŠ¥ë ¥ì´ ë§¤ìš° ê°•í•´ ê±´ë¬¼ì„ ì§“ëŠ” ë° ì í•©í•©ë‹ˆë‹¤. + +Ender ë“œëž˜ê³¤ì„ ì²˜ì¹˜í•˜ë©´ ìƒì„±ë˜ëŠ” 블ë¡ìž…니다. + +ì´ ì•„ì´í…œì„ ë˜ì§€ë©´, 플레ì´ì–´ì—게 경험치를 주는 경험치 구체를 떨어뜨립니다. + +ë¶ˆì„ ë¶™ì´ëŠ” ë° ìœ ìš©í•˜ë©° 디스펜서ì—서 ë¶ˆì„ ë¶™ì´ë©´ 무차별 ì‚¬ê²©ì„ ê°€í•©ë‹ˆë‹¤. + +진열장과 비슷하며 ì•ˆì— ë†“ì¸ ë¸”ë¡ì´ë‚˜ ì•„ì´í…œì„ ë³´ì—¬ì¤ë‹ˆë‹¤. + +ë˜ì§€ë©´ ì§€ì •ëœ ìƒë¬¼ ìœ í˜•ì´ ìƒì„±ë  수 있습니다. + +긴 ê³„ë‹¨ì„ ë§Œë“œëŠ” ë° ì“°ìž…ë‹ˆë‹¤. ë°œíŒ 2개를 쌓으면 보통 í¬ê¸°ì˜ 2단 계단 블ë¡ì´ 만들어집니다. + +긴 ê³„ë‹¨ì„ ë§Œë“œëŠ” ë° ì“°ìž…ë‹ˆë‹¤. ë°œíŒ 2개를 쌓으면 보통 í¬ê¸°ì˜ 2단 계단 블ë¡ì´ 만들어집니다. + +화로ì—서 지하 바위를 녹여 만듭니다. 지하 ë²½ëŒì˜ 재료입니다. + +ë™ë ¥ì„ 공급하면 ë¹›ì„ ëƒ…ë‹ˆë‹¤. + +재배하여 코코아 ì½©ì„ ì–»ì„ ìˆ˜ 있습니다. + +괴물 머리는 장ì‹ìš©ìœ¼ë¡œ 놓아둘 ìˆ˜ë„ ìžˆê³ , 투구 ìŠ¬ë¡¯ì— ë†“ì•„ 마스í¬ë¡œ 쓸 ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. + +오징어 + +잡으면 먹물 주머니를 ì–»ì„ ìˆ˜ 있습니다. + +소 + +잡으면 ê°€ì£½ì„ ì–»ì„ ìˆ˜ 있습니다. ë˜í•œ 우유를 짜서 ì–‘ë™ì´ì— ë‹´ì„ ìˆ˜ 있습니다. + +ì–‘ + +가위를 사용하면 ì–‘í„¸ì„ ì–»ì„ ìˆ˜ 있습니다. ì´ë¯¸ í„¸ì„ ê¹Žì•˜ë‹¤ë©´ ì–‘í„¸ì´ ë‚˜ì˜¤ì§€ 않습니다. í„¸ì„ ì—¼ìƒ‰í•˜ì—¬ ìƒ‰ì„ ë°”ê¿€ 수 있습니다. + +ë‹­ + +잡으면 ê¹ƒí„¸ì´ ë‚˜ì˜µë‹ˆë‹¤. ê°€ë” ì•Œì„ ë‚³ìŠµë‹ˆë‹¤. + +ë¼ì§€ + +잡으면 ë¼ì§€ê³ ê¸°ë¥¼ ì–»ì„ ìˆ˜ 있습니다. ì•ˆìž¥ì„ ì‚¬ìš©í•˜ë©´ 타고 ë‹¤ë‹ ìˆ˜ 있습니다. + +늑대 + +공격받기 전까지는 위협ì ì´ì§€ 않으며, 공격하면 뒤를 습격합니다. 뼈를 ì´ìš©í•´ì„œ 길들ì´ë©´ ë°ë¦¬ê³  ë‹¤ë‹ ìˆ˜ 있으며, 플레ì´ì–´ë¥¼ 공격하는 대ìƒì„ 공격합니다. + +Creeper + +ê°€ê¹Œì´ ë‹¤ê°€ê°€ë©´ í­ë°œí•©ë‹ˆë‹¤! + +해골 + +플레ì´ì–´ì—게 í™”ì‚´ì„ ì©ë‹ˆë‹¤. 처치하면 í™”ì‚´ì„ ë–¨ì–´ëœ¨ë¦½ë‹ˆë‹¤. + +거미 + +ê°€ê¹Œì´ ë‹¤ê°€ê°€ë©´ 공격합니다. ë²½ì„ íƒ€ê³  오를 수 있으며, 처치하면 ì‹¤ì„ ë–¨ì–´ëœ¨ë¦½ë‹ˆë‹¤. + +좀비 + +ê°€ê¹Œì´ ë‹¤ê°€ê°€ë©´ 공격합니다. + +Pigman 좀비 + +먼저 공격하지 않지만, ê³µê²©ì„ ë°›ìœ¼ë©´ 무리를 지어 달려듭니다. + +Ghast + +닿으면 í­ë°œí•˜ëŠ” 불ë©ì–´ë¦¬ë¥¼ ë˜ì§‘니다. + +슬ë¼ìž„ + +피해를 입으면 ìž‘ì€ ìŠ¬ë¼ìž„으로 분리ë©ë‹ˆë‹¤. + +Enderman + +플레ì´ì–´ê°€ ë°”ë¼ë³´ë©´ 공격합니다. 블ë¡ì„ 들어 옮길 ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. + +Sliverfish + +공격하면 ê·¼ì²˜ì˜ Sliverfish를 ëŒì–´ë“¤ìž…니다. ëŒ ë¸”ë¡ì— 숨어 있습니다. + +ë™êµ´ 거미 + +ë…ì´ ìžˆìŠµë‹ˆë‹¤. + +Mooshroom + +그릇과 함께 사용하면 ë²„ì„¯ì£½ì„ ë§Œë“¤ 수 있습니다. 가위를 사용하면 ë²„ì„¯ì„ ë–¨ì–´ëœ¨ë¦¬ê³  보통 소가 ë©ë‹ˆë‹¤. + +눈 골렘 + +플레ì´ì–´ëŠ” 눈 블ë¡ê³¼ í˜¸ë°•ì„ ì‚¬ìš©í•´ 눈 ê³¨ë ˜ì„ ë§Œë“¤ 수 있습니다. 눈 ê³¨ë ˜ì€ í”Œë ˆì´ì–´ì˜ ì ì—게 눈ë©ì´ë¥¼ ë˜ì§‘니다. + +Ender 드래곤 + +Enderì—서 찾아볼 수 있는 거대한 ê²€ì€ìƒ‰ 드래곤입니다. + +Blaze + +주로 지하 요새ì—서 찾아볼 수 있는 ì ìž…니다. 죽으면 Blaze 막대를 떨어뜨립니다. + +마그마 í브 + +지하ì—서 찾아볼 수 있습니다. 슬ë¼ìž„처럼 죽으면 분열하여 여러 ê°œì˜ ì¡°ê·¸ë§Œ í브가 ë©ë‹ˆë‹¤. + +ë§ˆì„ ì‚¬ëžŒ + +오셀롯 + +정글ì—서 ì°¾ì„ ìˆ˜ 있으며 ë‚ ìƒì„ ì„ 먹여서 ì¡°ë ¨ì´ ê°€ëŠ¥í•©ë‹ˆë‹¤. ì´ë•Œ ê°‘ìžê¸° 움ì§ì´ë©´ ì˜¤ì…€ë¡¯ì´ ê²ì„ 먹고 ë„ë§ì¹˜ê¸° 때문ì—, ì˜¤ì…€ë¡¯ì´ ë‹¤ê°€ì˜¤ê²Œ 만들어야 합니다. + +ì²  골렘 + +마ì„ì„ ë³´í˜¸í•˜ê¸° 위해 나타납니다. ì²  블ë¡ê³¼ 호박으로 만들 수 있습니다. + +Explosives Animator + +Concept Artist + +Number Crunching and Statistics + +Bully Coordinator + +Original Design and Code by + +Project Manager/Producer + +Rest of Mojang Office + +리드 게임 프로그래머 Minecraft PC + +Code Ninja + +CEO + +White Collar Worker + +Customer Support + +Office DJ + +Designer/Programmer Minecraft - Pocket Edition + +Developer + +Chief Architect + +Art Developer + +Game Crafter + +Director of Fun + +Music and Sounds + +Programming + +Art + +QA + +Executive Producer + +Lead Producer + +Producer + +Test Lead + +Lead Tester + +Design Team + +Development Team + +Release Management + +Director, XBLA Publishing + +Business Development + +Portfolio Director + +Product Manager + +Marketing + + Community Manager + +Europe Localization Team + +Redmond Localization Team + +Asia Localization Team + +User Research Team + +MGS Central Teams + +Milestone Acceptance Tester + +Special Thanks + +Test Manager + +Senior Test Lead + +SDET + +Project STE + +Additional STE + +Test Associates + +Jon Kagstrom + +Tobias Mollstam + +Rise Lugo + +목검 + +ëŒê²€ + +ì² ì œ ê²€ + +다ì´ì•„몬드 ê²€ + +황금 ê²€ + +나무 삽 + +ëŒì‚½ + +ì² ì œ 삽 + +다ì´ì•„몬드 삽 + +황금 삽 + +나무 ê³¡ê´­ì´ + +ëŒê³¡ê´­ì´ + +ì² ì œ ê³¡ê´­ì´ + +다ì´ì•„몬드 ê³¡ê´­ì´ + +황금 ê³¡ê´­ì´ + +나무 ë„ë¼ + +ëŒë„ë¼ + +ì² ì œ ë„ë¼ + +다ì´ì•„몬드 ë„ë¼ + +황금 ë„ë¼ + +나무 ê´­ì´ + +ëŒê´­ì´ + +ì² ì œ ê´­ì´ + +다ì´ì•„몬드 ê´­ì´ + +황금 ê´­ì´ + +나무문 + +철문 + +사슬 투구 + +사슬 가슴보호구 + +사슬 다리보호구 + +사슬 장화 + +가죽 ëª¨ìž + +ì² ì œ 투구 + +다ì´ì•„몬드 투구 + +황금 투구 + +가죽 ì¡°ë¼ + +ì² ì œ í‰ê°‘ + +다ì´ì•„몬드 í‰ê°‘ + +황금 í‰ê°‘ + +가죽 바지 + +ì² ì œ 다리보호대 + +다ì´ì•„몬드 다리보호대 + +황금 다리보호대 + +가죽 장화 + +ì² ì œ 장화 + +다ì´ì•„몬드 장화 + +황금 장화 + +ì²  주괴 + +황금 주괴 + +ì–‘ë™ì´ + +물 ì–‘ë™ì´ + +용암 ì–‘ë™ì´ + +부싯ëŒê³¼ 부시 + +사과 + +활 + +화살 + +ì„탄 + +숯 + +다ì´ì•„몬드 + +막대 + +그릇 + +버섯죽 + +실 + +깃털 + +화약 + +ë°€ 씨앗 + +ë°€ + +ë¹µ + +ë¶€ì‹¯ëŒ + +ë¼ì§€ 날고기 + +구운 ë¼ì§€ê³ ê¸° + +그림 ì•¡ìž + +황금 사과 + +í‘œì§€íŒ + +광물 수레 + +안장 + +레드스톤 + +눈ë©ì´ + +ë°° + +가죽 + +우유 ì–‘ë™ì´ + +ë²½ëŒ + +ì°°í™ + +사탕수수 + +ì¢…ì´ + +ì±… + +슬ë¼ìž„ ë³¼ + +ìƒìžê°€ 담긴 광물 수레 + +화로가 달린 광물 수레 + +달걀 + +나침반 + +낚싯대 + +시계 + +ë°œê´‘ì„ ê°€ë£¨ + +ë‚ ìƒì„  + +요리한 ìƒì„  + +염료 가루 + +먹물 주머니 + +ë¶‰ì€ ìž¥ë¯¸ 염료 + +ì´ˆë¡ ì„ ì¸ìž¥ 염료 + +코코아 열매 + +ì²­ê¸ˆì„ + +ë³´ë¼ìƒ‰ 염료 + +ì²­ë¡ìƒ‰ 염료 + +ë°ì€ 회색 염료 + +회색 염료 + +ë¶„í™ìƒ‰ 염료 + +ë¼ìž„색 염료 + +노란색 염료 + +ë°ì€ 파란색 염료 + +ìžì£¼ìƒ‰ 염료 + +주황색 염료 + +뼛가루 + +뼈 + +설탕 + +ì¼€ì´í¬ + +침대 + +레드스톤 íƒì§€ê¸° + +쿠키 + +ì§€ë„ + +ìŒì•… ë””ìŠ¤í¬ - "13" + +ìŒì•… ë””ìŠ¤í¬ - "cat" + +ìŒì•… ë””ìŠ¤í¬ - "blocks" + +ìŒì•… ë””ìŠ¤í¬ - "chirp" + +ìŒì•… ë””ìŠ¤í¬ - "far" + +ìŒì•… ë””ìŠ¤í¬ - "mall" + +ìŒì•… ë””ìŠ¤í¬ - "mellohi" + +ìŒì•… ë””ìŠ¤í¬ - "stal" + +ìŒì•… ë””ìŠ¤í¬ - "strad" + +ìŒì•… ë””ìŠ¤í¬ - "ward" + +ìŒì•… ë””ìŠ¤í¬ - "11" + +ìŒì•… ë””ìŠ¤í¬ - "where are we now" + +가위 + +호박씨 + +수박씨 + +ë‹­ 날고기 + +구운 닭고기 + +소 날고기 + +스테ì´í¬ + +ì©ì€ ì‚´ì  + +Ender 진주 + +수박 ì¡°ê° + +Blaze 막대 + +Ghastì˜ ëˆˆë¬¼ + +금ë©ì´ + +지하 사마귀 + +{*splash*}{*prefix*}물약 {*postfix*} + +유리병 + +물병 + +거미 눈 + +발효 거미 눈 + +Blaze 가루 + +마그마 í¬ë¦¼ + +양조대 + +가마솥 + +Enderì˜ ëˆˆ + +빛나는 수박 + +경험치 병 + +불ì˜ì‹œê°œ + +불ì˜ì‹œê°œ (숯) + +불ì˜ì‹œê°œ (ì„탄) + +ì•„ì´í…œ 외형 + +{*CREATURE*} ìƒì„± + +지하 ë²½ëŒ + +ë‘개골 + +해골 ë‘개골 + +ë§ë¼ë¹„틀어진 해골 ë‘개골 + +좀비 머리 + +머리 + +%sì˜ ë¨¸ë¦¬ + +Creeper 머리 + +ëŒ + +잡초 ë¸”ë¡ + +í™ + +ì¡°ì•½ëŒ + +참나무 목재 íŒìž + +전나무 목재 íŒìž + +ìžìž‘나무 목재 íŒìž + +정글 나무 íŒìž + +묘목 + +참나무 묘목 + +전나무 묘목 + +ìžìž‘나무 묘목 + +정글 묘목 + +기반암 + +물 + +용암 + +모래 + +사암 + +ìžê°ˆ + +황금 ê´‘ì„ + +ì² ê´‘ì„ + +ì„탄 ê´‘ì„ + +나무 + +참나무 목재 + +전나무 목재 + +ìžìž‘나무 목재 + +정글 나무 + +참나무 + +전나무 + +ìžìž‘나무 + +나뭇잎 + +참나무 나뭇잎 + +전나무 나뭇잎 + +ìžìž‘나무 나뭇잎 + +정글 잎사귀 + +스펀지 + +유리 + +양털 + +ê²€ì€ìƒ‰ 양털 + +빨간색 양털 + +ì´ˆë¡ìƒ‰ 양털 + +갈색 양털 + +파란색 양털 + +ë³´ë¼ìƒ‰ 양털 + +ì²­ë¡ìƒ‰ 양털 + +ë°ì€ 회색 양털 + +회색 양털 + +ë¶„í™ìƒ‰ 양털 + +ë¼ìž„색 양털 + +노란색 양털 + +ë°ì€ 파란색 양털 + +ìžì£¼ìƒ‰ 양털 + +주황색 양털 + +í°ìƒ‰ 양털 + +꽃 + +장미 + +버섯 + +황금 ë¸”ë¡ + +ê¸ˆì„ íŽ¸ë¦¬í•˜ê²Œ 보관할 수 있습니다. + +ì² ì„ íŽ¸ë¦¬í•˜ê²Œ 보관할 수 있습니다. + +ì²  ë¸”ë¡ + +ëŒ ë°œíŒ + +ëŒ ë°œíŒ + +사암 ë°œíŒ + +참나무 ë°œíŒ + +ì¡°ì•½ëŒ ë°œíŒ + +ë²½ëŒ ë°œíŒ + +ëŒ ë²½ëŒ ë°œíŒ + +참나무 ë°œíŒ + +전나무 ë°œíŒ + +ìžìž‘나무 ë°œíŒ + +정글 나무 ë°œíŒ + +지하 ë²½ëŒ ë°œíŒ + +ë²½ëŒ + +TNT + +책장 + +ì´ë¼ ë‚€ ëŒ + +í‘ìš”ì„ + +횃불 + +횃불(ì„탄) + +횃불(숯) + +불 + +괴물 출입문 + +참나무 계단 + +ìƒìž + +레드스톤 가루 + +다ì´ì•„몬드 ê´‘ì„ + +다ì´ì•„몬드 ë¸”ë¡ + +다ì´ì•„몬드를 편리하게 보관할 수 있습니다. + +작업대 + +작물 + +ë†ì§€ + +화로 + +í‘œì§€íŒ + +나무문 + +사다리 + +ë ˆì¼ + +ë™ë ¥ ë ˆì¼ + +íƒì§€ ë ˆì¼ + +ëŒ ê³„ë‹¨ + +ì†ìž¡ì´ + +ì••ë ¥íŒ + +철문 + +레드스톤 ê´‘ì„ + +레드스톤 횃불 + +단추 + +눈 + +ì–¼ìŒ + +ì„ ì¸ìž¥ + +ì°°í™ + +사탕수수 + +주í¬ë°•스 + +울타리 + +호박 + +호박등 + +지하 바위 + +ì˜í˜¼ 모래 + +ë°œê´‘ì„ + +ì°¨ì›ë¬¸ + +ì²­ê¸ˆì„ ê´‘ì„ + +ì²­ê¸ˆì„ ë¸”ë¡ + +청금ì„ì„ íŽ¸ë¦¬í•˜ê²Œ 보관할 수 있습니다. + +디스펜서 + +소리 ë¸”ë¡ + +ì¼€ì´í¬ + +침대 + +거미줄 + +긴 잡초 + +마른 ë¤ë¶ˆ + +다ì´ì˜¤ë“œ + +잠긴 ìƒìž + +들창 + +양털(모든 색ìƒ) + +피스톤 + +ëˆëˆì´ 피스톤 + +Sliverfish ë¸”ë¡ + +ëŒ ë²½ëŒ + +ì´ë¼ ë‚€ ëŒ ë²½ëŒ + +ê¸ˆì´ ê°„ ëŒ ë²½ëŒ + +ê¹Žì•„ë†“ì€ ëŒ ë²½ëŒ + +버섯 + +버섯 + +ì²  막대 + +유리 íŒìž + +수박 + +호박 줄기 + +수박 줄기 + +ë©êµ´ + +울타리 문 + +ë²½ëŒ ê³„ë‹¨ + +ëŒ ë²½ëŒ ê³„ë‹¨ + +Sliverfish ëŒ + +Sliverfish ì¡°ì•½ëŒ + +Sliverfish ëŒ ë²½ëŒ + +균사체 + +수련잎 + +지하 ë²½ëŒ + +지하 ë²½ëŒ ìš¸íƒ€ë¦¬ + +지하 ë²½ëŒ ê³„ë‹¨ + +지하 사마귀 + +효과부여대 + +양조대 + +가마솥 + +Ender ì°¨ì›ë¬¸ + +Ender ì°¨ì›ë¬¸ 외형 + +Ender ëŒ + +ìš©ì˜ ì•Œ + +관목 + +양치ì‹ë¬¼ + +사암 계단 + +전나무 계단 + +ìžìž‘나무 계단 + +정글 나무 계단 + +레드스톤 램프 + +코코아 + +ë‘개골 + +현재 컨트롤 + +배치 + +ì´ë™/질주 + +보기 + +ì¼ì‹œ 중지 + +ì í”„ + +ì í”„/위로 비행 + +소지품 + +ì•„ì´í…œ êµì²´ + +í–‰ë™ + +사용 + +제작 + +버리기 + +살금살금 걷기 + +살금살금 걷기/아래로 비행 + +ì¹´ë©”ë¼ ëª¨ë“œ 변경 + +플레ì´ì–´/초대 + +ì´ë™(비행 시) + +배치 1 + +배치 2 + +배치 3 + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +{*B*}{*CONTROLLER_VK_A*} 단추를 누르면 계ì†í•©ë‹ˆë‹¤. + +{*B*}{*CONTROLLER_VK_A*} 단추를 누르면 íŠœí† ë¦¬ì–¼ì„ ì‹œìž‘í•©ë‹ˆë‹¤.{*B*} + ê²Œìž„ì„ ì‹œìž‘í•  준비가 ë˜ì—ˆìœ¼ë©´ {*CONTROLLER_VK_B*} 단추를 누르십시오. + +Minecraft는 블ë¡ì„ 배치하여 무엇ì´ë“  ìƒìƒí•œ 대로 만들 수 있는 게임입니다. +ë°¤ì—는 ê´´ë¬¼ì´ ì¶œëª°í•˜ë¯€ë¡œ, ê·¸ì— ëŒ€ë¹„í•˜ì—¬ 피신처를 준비해둬야 합니다. + +{*CONTROLLER_ACTION_LOOK*}으로 위와 아래, ì£¼ë³€ì„ ë‘˜ëŸ¬ë´…ë‹ˆë‹¤. + +{*CONTROLLER_ACTION_MOVE*}으로 ì´ë™í•©ë‹ˆë‹¤. + +질주하려면 {*CONTROLLER_ACTION_MOVE*}를 앞으로 빨리 ë‘ ë²ˆ 누르십시오. {*CONTROLLER_ACTION_MOVE*} 를 ê³„ì† ëˆ„ë¥´ê³  있으면 ìºë¦­í„°ì˜ 질주 시간ì´ë‚˜ ìŒì‹ì´ 다 떨어질 때까지 ê³„ì† ì§ˆì£¼í•©ë‹ˆë‹¤. + +{*CONTROLLER_ACTION_JUMP*}를 눌러 ì í”„합니다. + +{*CONTROLLER_ACTION_ACTION*}를 누르고 있으면 ì†ì´ë‚˜ ë„구를 사용해 ë•…ì„ íŒŒê±°ë‚˜ 나무를 벱니다. 특정 블ë¡ì€ ë„구를 만들어야 파낼 수 있습니다. + +{*CONTROLLER_ACTION_ACTION*}를 길게 눌러서 나무 ë¸”ë¡ 4ê°œ(나무둥치)를 베어보십시오. {*B*}블ë¡ì´ 파괴ë˜ê³  ê³µì¤‘ì— ëœ¬ 형태로 ì•„ì´í…œì´ 나타나면, 다가가서 ì§‘ì„ ìˆ˜ 있습니다. ì§‘ì€ ì•„ì´í…œì€ ì†Œì§€í’ˆì— í‘œì‹œë©ë‹ˆë‹¤. + +{*CONTROLLER_ACTION_CRAFTING*}를 눌러 제작 ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ 엽니다. + +ì•„ì´í…œì„ 수집하고 제작하면 ì†Œì§€í’ˆì´ ì°¹ë‹ˆë‹¤.{*B*} + ì†Œì§€í’ˆì„ ì—´ë ¤ë©´ {*CONTROLLER_ACTION_INVENTORY*}를 누르십시오. + +ì´ë™, 채광 ë° ê³µê²©ì„ í•˜ë©´ ìŒì‹ 막대 {*ICON_SHANK_01*}를 소비합니다. 질주하거나 질주 ì í”„를 하면 ì¼ë°˜ì ìœ¼ë¡œ 걷거나 달리는 것보다 ë” ë§Žì´ ìŒì‹ 막대를 소비합니다. + +ìŒì‹ 막대가 9칸 ì´ìƒ{*ICON_SHANK_01*}ì¼ ë•ŒëŠ” ì²´ë ¥ì„ ìžƒì–´ë„ ìžë™ìœ¼ë¡œ 다시 회복ë©ë‹ˆë‹¤. ìŒì‹ì„ 먹으면 ìŒì‹ 막대가 다시 차오릅니다. + +ì†ì— ìŒì‹ ì•„ì´í…œì„ 들고 ìžˆì„ ë•Œ {*CONTROLLER_ACTION_USE*}ì„ ê¸¸ê²Œ 누르면 ìŒì‹ì„ 먹어서 ìŒì‹ 막대를 채ì›ë‹ˆë‹¤. ìŒì‹ 막대가 ê°€ë“ ì°¬ ìƒíƒœì—서는 ìŒì‹ì„ ë¨¹ì„ ìˆ˜ 없습니다. + +ìŒì‹ 막대가 낮고 ì²´ë ¥ì„ ìžƒì€ ìƒíƒœìž…니다. ì†Œì§€í’ˆì— ìžˆëŠ” 스테ì´í¬ë¥¼ 먹으면 ìŒì‹ 막대가 차오르고 ì²´ë ¥ì´ íšŒë³µë˜ê¸° 시작합니다.{*ICON*}364{*/ICON*} + +게임ì—서 íšë“한 나무는 íŒìžë¡œ 만들 수 있습니다. íŒìžë¥¼ 만들려면 제작 ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ 여십시오.{*PlanksIcon*} + +ë§Žì€ ì•„ì´í…œë“¤ì€ 여러 단계를 ê±°ì³ ì œìž‘ë©ë‹ˆë‹¤. ì´ì œ íŒìžë¥¼ 가지고 있으므로 ë” ë‹¤ì–‘í•œ ì•„ì´í…œì„ 만들 수 있습니다. 작업대를 만들어 보십시오.{*CraftingTableIcon*} + +블ë¡ì—서 ì•„ì´í…œì„ ë” ë¹¨ë¦¬ 얻으려면 해당 ìž‘ì—…ì— ë§žëŠ” ë„구를 만들어야 합니다. ì¼ë¶€ ë„구는 막대로 ëœ ì†ìž¡ì´ê°€ 달려 있습니다. 막대를 몇 ê°œ 만들어 보십시오.{*SticksIcon*} + +{*CONTROLLER_ACTION_LEFT_SCROLL*} ê³¼{*CONTROLLER_ACTION_RIGHT_SCROLL*}로 ì†ì— 들고 있는 ì•„ì´í…œì„ 다른 ì•„ì´í…œìœ¼ë¡œ 바꿀 수 있습니다. + +ì•„ì´í…œì„ 사용하거나, 조작하거나, 내려놓으려면 {*CONTROLLER_ACTION_USE*}를 누르십시오. ë‚´ë ¤ë†“ì€ ì•„ì´í…œì— 올바른 ë„구를 사용하여 채굴 ë™ìž‘ì„ ì·¨í•˜ë©´ ì•„ì´í…œì„ 다시 ì§‘ì„ ìˆ˜ 있습니다. + +작업대를 ì„ íƒí–ˆìœ¼ë©´ í¬ì¸í„°ë¥¼ ì›í•˜ëŠ” ê³³ì— ë‘” ë‹¤ìŒ {*CONTROLLER_ACTION_USE*}를 눌러 작업대를 놓으십시오. + +í¬ì¸í„°ë¥¼ ìž‘ì—…ëŒ€ì— ë§žì¶”ê³  {*CONTROLLER_ACTION_USE*}를 눌러 여십시오. + +ì‚½ì„ ì‚¬ìš©í•˜ë©´ í™ì´ë‚˜ 눈처럼 부드러운 블ë¡ì„ ë” ë¹¨ë¦¬ 파냅니다. 재료를 ë§Žì´ ëª¨ì„ìˆ˜ë¡ ìž‘ì—… ì†ë„와 ë‚´êµ¬ë ¥ì´ ë” ë›°ì–´ë‚œ ë„구를 만들 수 있습니다. 나무 ì‚½ì„ ë§Œë“œì‹­ì‹œì˜¤.{*WoodenShovelIcon*} + +ë„ë¼ë¥¼ 사용하면 나무와 나무 블ë¡ì„ ë” ë¹¨ë¦¬ 벱니다. 재료를 ë§Žì´ ëª¨ì„ìˆ˜ë¡ ìž‘ì—… ì†ë„와 ë‚´êµ¬ë ¥ì´ ë” ë›°ì–´ë‚œ ë„구를 만들 수 있습니다. 나무 ë„ë¼ë¥¼ 만드십시오.{*WoodenHatchetIcon*} + +곡괭ì´ëŠ” ëŒì´ë‚˜ 광물처럼 단단한 블ë¡ì„ ë” ë¹¨ë¦¬ 파게 í•´ì¤ë‹ˆë‹¤. 재료를 ë§Žì´ ëª¨ì„ìˆ˜ë¡ ìž‘ì—… ì†ë„와 ë‚´êµ¬ë ¥ì´ ë” ë›°ì–´ë‚œ ë„구를 만들 수 있으며, ë” ë‹¨ë‹¨í•œ ìž¬ë£Œë„ íŒŒë‚¼ 수 있습니다. 나무 곡괭ì´ë¥¼ 만드십시오.{*WoodenPickaxeIcon*} + +보관함 열기 + + + ë°¤ì€ ìˆœì‹ê°„ì— ì°¾ì•„ì˜¤ë©°, 준비하지 ì•Šì€ ìƒíƒœë¡œ ë°–ì— ë‚˜ê°€ë©´ 위험합니다. 방어구와 무기를 만들어 사용할 수 있지만, 안전한 피신처를 찾는 ê²ƒì´ ë” ì¢‹ìŠµë‹ˆë‹¤. + + + + ê·¼ì²˜ì— ë²„ë ¤ì§„ ê´‘ë¶€ì˜ í”¼ì‹ ì²˜ê°€ 있습니다. ì´ê³³ì´ë¼ë©´ ë°¤ì„ ì•ˆì „í•˜ê²Œ 보낼 수 있습니다. + + + + 피신처를 세울 ìžì›ì„ 모아야 합니다. 벽과 ì§€ë¶•ì€ ì•„ë¬´ 블ë¡ì´ë‚˜ ì‚¬ìš©í•´ë„ ë˜ì§€ë§Œ 문과 창문, ì¡°ëª…ì„ ì„¤ì¹˜í•˜ë ¤ë©´ 특정 재료가 필요합니다. + + +곡괭ì´ë¥¼ 사용해서 ëŒ ë¸”ë¡ì„ 채굴하십시오. ëŒ ë¸”ë¡ì„ 채굴하면 조약ëŒì´ 나옵니다. ì¡°ì•½ëŒ 8개를 모으면 화로를 만들 수 있습니다. ëŒ ë¸”ë¡ì— ë„달하려면 í™ì„ 파야 í•  ìˆ˜ë„ ìžˆìœ¼ë©°, ì´ ë•ŒëŠ” ì‚½ì„ ì‚¬ìš©í•˜ì‹­ì‹œì˜¤.{*StoneIcon*} + +화로를 만들 수 ìžˆì„ ë§Œí¼ ì¡°ì•½ëŒì„ 모았습니다. 작업대ì—서 화로를 만드십시오. + +{*CONTROLLER_ACTION_USE*}를 눌러 화로를 설치한 ë‹¤ìŒ í™”ë¡œë¥¼ 여십시오. + +화로를 사용해서 ìˆ¯ì„ ë§Œë“œì‹­ì‹œì˜¤. ìˆ¯ì´ ë§Œë“¤ì–´ì§€ëŠ” 시간 ë™ì•ˆ, 피신처를 만들 재료를 ë” êµ¬í•´ë³´ë©´ 어떨까요? + +화로를 사용해서 유리를 만드십시오. 유리가 만들어지는 시간 ë™ì•ˆ, 피신처를 만들 재료를 ë” êµ¬í•´ë³´ë©´ 어떨까요? + +ì¢‹ì€ í”¼ì‹ ì²˜ë¥¼ 만들려면, 출입할 때마다 ë²½ì„ í—ˆë¬¼ê³  다시 ìŒ“ì„ í•„ìš”ê°€ ì—†ë„ë¡ ë¬¸ì„ ë‹¬ì•„ì•¼ 합니다. ë‚˜ë¬´ë¬¸ì„ ë§Œë“¤ì–´ 보십시오.{*WoodenDoorIcon*} + +{*CONTROLLER_ACTION_USE*}를 눌러 ë¬¸ì„ ì„¤ì¹˜í•˜ì‹­ì‹œì˜¤. {*CONTROLLER_ACTION_USE*}로 ë‚˜ë¬´ë¬¸ì„ ì—´ê±°ë‚˜ ë‹«ì•„ 월드로 출입할 수 있습니다. + +ë°¤ì—는 매우 ì–´ë‘워지므로, 피신처 안ì—서 잘 ë³¼ 수 있ë„ë¡ ì¡°ëª…ì´ ìžˆì–´ì•¼ 합니다. 제작 ì¸í„°íŽ˜ì´ìФì—서 막대와 ìˆ¯ì„ ì´ìš©í•´ íšƒë¶ˆì„ ë§Œë“œì‹­ì‹œì˜¤.{*TorchIcon*} + + + 튜토리얼 1ìž¥ì„ ë§ˆì³¤ìŠµë‹ˆë‹¤. + + + + {*B*} + íŠœí† ë¦¬ì–¼ì„ ê³„ì† ì§„í–‰í•˜ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + ê²Œìž„ì„ ì‹œìž‘í•  준비가 ë다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + ì´ê³³ì€ 소지품입니다. ì´ í™”ë©´ì—는 ì†ì— 들고 쓸 수 있는 ì•„ì´í…œê³¼ 가지고 ë‹¤ë‹ ìˆ˜ 있는 ì•„ì´í…œì´ ëª¨ë‘ í‘œì‹œë©ë‹ˆë‹¤. ë°©ì–´ë ¥ ë˜í•œ ì´ í™”ë©´ì—서 확ì¸í•  수 있습니다. + + +{*B*} + 계ì†í•˜ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 소지품 ì‚¬ìš©ë²•ì„ ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + {*CONTROLLER_MENU_NAVIGATE*}로 í¬ì¸í„°ë¥¼ 움ì§ì¼ 수 있습니다. {*CONTROLLER_VK_A*} 단추를 누르면 í¬ì¸í„°ë¡œ 가리킨 ì•„ì´í…œì„ 집습니다. +ìˆ˜ëŸ‰ì´ 2ê°œ ì´ìƒì¼ 때는 ì•„ì´í…œì„ ì „ë¶€ 집으며, {*CONTROLLER_VK_X*} 단추를 누르면 반만 ì§‘ì„ ìˆ˜ 있습니다. + + + + í¬ì¸í„°ë¥¼ 사용해서 ì•„ì´í…œì„ ì†Œì§€í’ˆì˜ ë‹¤ë¥¸ 공간으로 옮긴 ë‹¤ìŒ {*CONTROLLER_VK_A*} 단추를 누르면 해당 ìœ„ì¹˜ì— ë†“ìŠµë‹ˆë‹¤. + í¬ì¸í„°ë¡œ ì§‘ì€ ì•„ì´í…œì´ 여러 ê°œì¼ ë•Œ {*CONTROLLER_VK_A*} 단추를 누르면 ëª¨ë‘ ë‚´ë ¤ë†“ê³  {*CONTROLLER_VK_X*} 단추를 누르면 하나만 놓습니다. + + + + ì•„ì´í…œì´ 걸린 í¬ì¸í„°ë¥¼ ì¸í„°íŽ˜ì´ìФ 밖으로 옮기면 ì•„ì´í…œì„ 버릴 수 있습니다. + + + + ì•„ì´í…œ 정보를 ë” ë³´ë ¤ë©´ í¬ì¸í„°ë¡œ ì•„ì´í…œì„ 가리킨 ë‹¤ìŒ {*CONTROLLER_VK_RT*}를 누르십시오. + + + + ì†Œì§€í’ˆì„ ë‹«ìœ¼ë ¤ë©´ {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + ì´ê²ƒì€ 창작 소지품입니다. ì´ í™”ë©´ì—는 ì†ì— 들고 쓸 수 있는 ì•„ì´í…œ 외ì—ë„ ì„ íƒí•  수 있는 모든 ì•„ì´í…œì´ 함께 표시ë©ë‹ˆë‹¤. + + +{*B*} + 계ì†í•˜ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 창작 모드 소지품 ì‚¬ìš©ë²•ì„ ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + {*CONTROLLER_MENU_NAVIGATE*}로 í¬ì¸í„°ë¥¼ 움ì§ì¼ 수 있습니다. + ì•„ì´í…œ 목ë¡ì—서 {*CONTROLLER_VK_A*} 단추를 누르면 í¬ì¸í„°ë¡œ 가리킨 ì•„ì´í…œì„ 집습니다. {*CONTROLLER_VK_Y*} 단추를 누르면 해당 ì•„ì´í…œì„ ì „ë¶€ ì§‘ì„ ìˆ˜ 있습니다. + + + + í¬ì¸í„°ëŠ” ìžë™ìœ¼ë¡œ 사용 ì¤„ì˜ ì¹¸ 단위로 움ì§ìž…니다. {*CONTROLLER_VK_A*} 단추로 ì•„ì´í…œì„ ë†“ì„ ìˆ˜ 있습니다. ì•„ì´í…œì„ 놓으면 í¬ì¸í„°ê°€ ì•„ì´í…œ 목ë¡ìœ¼ë¡œ ëŒì•„가므로 다른 ì•„ì´í…œì„ ì„ íƒí•  수 있습니다. + + + + ì•„ì´í…œì´ 걸린 í¬ì¸í„°ë¥¼ ì¸í„°íŽ˜ì´ìФ 밖으로 옮기면 ì•„ì´í…œì„ ì›”ë“œì— ë–¨ì–´ëœ¨ë¦´ 수 있습니다. 빠른 ì„ íƒ ë§‰ëŒ€ì— ìžˆëŠ” ì•„ì´í…œì„ ëª¨ë‘ ì„ íƒ ì·¨ì†Œí•˜ë ¤ë©´ {*CONTROLLER_VK_X*} 단추를 누르십시오. + + + + {*CONTROLLER_VK_LB*}로 ìƒë‹¨ì˜ 그룹 유형 íƒ­ì„ ìŠ¤í¬ë¡¤í•˜ê³  {*CONTROLLER_VK_RB*}로 íšë“하고 ì‹¶ì€ ì•„ì´í…œì˜ 그룹 ìœ í˜•ì„ ì„ íƒí•˜ì‹­ì‹œì˜¤. + + + + ì•„ì´í…œ 정보를 ë” ë³´ë ¤ë©´ í¬ì¸í„°ë¡œ ì•„ì´í…œì„ 가리킨 ë‹¤ìŒ {*CONTROLLER_VK_RT*}를 누르십시오. + + + + 창작 모드 ì†Œì§€í’ˆì„ ë‹«ìœ¼ë ¤ë©´ {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + ì´ê²ƒì€ 제작 ì¸í„°íŽ˜ì´ìŠ¤ìž…ë‹ˆë‹¤. 여기서 ì•„ì´í…œì„ 조합하여 새 ì•„ì´í…œì„ 만들 수 있습니다. + + +{*B*} + 계ì†í•˜ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 제작 ë°©ë²•ì„ ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + +{*B*} + ì•„ì´í…œ ì„¤ëª…ì„ ë³´ë ¤ë©´ {*CONTROLLER_VK_X*} 단추를 누르십시오. + + +{*B*} + 현재 ì•„ì´í…œì„ 만드는 ë° í•„ìš”í•œ 재료를 보려면 {*CONTROLLER_VK_X*} 단추를 누르십시오. + + +{*B*} + {*CONTROLLER_VK_X*} 단추를 눌러 ì†Œì§€í’ˆì„ ë‹¤ì‹œ 여십시오. + + + + 화면 ìœ„ìª½ì˜ ê·¸ë£¹ 유형 탭ì—서 {*CONTROLLER_VK_LB*}ê³¼ {*CONTROLLER_VK_RB*}ì„ ì‚¬ìš©í•˜ì—¬ 제작할 ì•„ì´í…œ 종류를 ì„ íƒí•œ 다ìŒ, {*CONTROLLER_MENU_NAVIGATE*}로 제작할 ì•„ì´í…œì„ ì„ íƒí•˜ì‹­ì‹œì˜¤. + + + + 작업 구역ì—는 새 ì•„ì´í…œì„ 만드는 ë° í•„ìš”í•œ 재료가 표시ë©ë‹ˆë‹¤. {*CONTROLLER_VK_A*} 단추를 눌러 ì•„ì´í…œì„ 만든 ë‹¤ìŒ ì†Œì§€í’ˆì— ë„£ìœ¼ì‹­ì‹œì˜¤. + + + + 작업대를 사용하면 제작할 ì•„ì´í…œì„ ë” ë‹¤ì–‘í•˜ê²Œ ì„ íƒí•  수 있습니다. 작업대ì—ì„œë„ ì œìž‘ ë°©ë²•ì€ ê¸°ë³¸ 제작과 같지만 작업 êµ¬ì—­ì´ ë„“ì–´ì§€ë¯€ë¡œ, 재료를 ë” ë‹¤ì–‘í•˜ê²Œ ì¡°í•©í•  수 있습니다. + + + + 제작 ì¸í„°íŽ˜ì´ìФ 오른쪽 아래ì—는 ì†Œì§€í’ˆì´ í‘œì‹œë©ë‹ˆë‹¤. 여기ì—는 현재 ì„ íƒí•œ ì•„ì´í…œì˜ 설명과, 해당 ì•„ì´í…œì„ 만드는 ë° í•„ìš”í•œ 재료가 표시ë©ë‹ˆë‹¤. + + + + 현재 ì„ íƒí•œ ì•„ì´í…œì˜ ì„¤ëª…ì´ í‘œì‹œë˜ì—ˆìŠµë‹ˆë‹¤. ì„¤ëª…ì„ ë³´ë©´ ì•„ì´í…œì„ ì–´ë””ì— ì‚¬ìš©í•˜ëŠ”ì§€ 알 수 있습니다. + + + + ì„ íƒí•œ ì•„ì´í…œì„ 만드는 ë° í•„ìš”í•œ 재료 목ë¡ì´ 표시ë˜ì—ˆìŠµë‹ˆë‹¤. + + +모아둔 나무를 ì´ìš©í•´ì„œ íŒìžë¥¼ 만들 수 있습니다. íŒìž ì•„ì´ì½˜ì„ ì„ íƒí•œ ë‹¤ìŒ {*CONTROLLER_VK_A*} 단추를 눌러 íŒìžë¥¼ 만드십시오.{*PlanksIcon*} + + + 작업대가 완성ë습니다. 작업대를 ì›”ë“œì— ì„¤ì¹˜í•´ì•¼ ë” ë‹¤ì–‘í•œ ì•„ì´í…œì„ 만들 수 있습니다.{*B*} + {*CONTROLLER_VK_B*} 단추를 눌러 작업 ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ 닫으십시오. + + + + {*CONTROLLER_VK_LB*}와 {*CONTROLLER_VK_RB*}로 제작할 ì•„ì´í…œ 그룹 ìœ í˜•ì„ ë³€ê²½í•  수 있습니다. ë„구 ê·¸ë£¹ì„ ì„ íƒí•˜ì‹­ì‹œì˜¤.{*ToolsIcon*} + + + + {*CONTROLLER_VK_LB*}와 {*CONTROLLER_VK_RB*}로 제작할 ì•„ì´í…œ 그룹 ìœ í˜•ì„ ë³€ê²½í•  수 있습니다. 구조물 ê·¸ë£¹ì„ ì„ íƒí•˜ì‹­ì‹œì˜¤.{*StructuresIcon*} + + + + {*CONTROLLER_MENU_NAVIGATE*}로 제작할 ì•„ì´í…œì„ 바꿀 수 있습니다. ì¼ë¶€ ì•„ì´í…œì€ 제작 ìž¬ë£Œì— ë”°ë¼ ì™„ì„±í’ˆì´ ë‹¬ë¼ì§‘니다. 나무 ì‚½ì„ ì„ íƒí•˜ì‹­ì‹œì˜¤.{*WoodenShovelIcon*} + + + + ë§Žì€ ì•„ì´í…œë“¤ì€ 여러 단계를 ê±°ì³ ì œìž‘ë©ë‹ˆë‹¤. ì´ì œ íŒìžë¥¼ 가지고 있으므로 ë” ë‹¤ì–‘í•œ ì•„ì´í…œì„ 만들 수 있습니다. {*CONTROLLER_MENU_NAVIGATE*}를 사용하면 제작할 ì•„ì´í…œì„ 바꿀 수 있습니다. 작업대를 ì„ íƒí•˜ì‹­ì‹œì˜¤.{*CraftingTableIcon*} + + + + 지금까지 만든 ë„구가 있으면 순조로운 ì¶œë°œì„ í•  수 있으며, 여러 ìžì›ì„ ë” íš¨ê³¼ì ìœ¼ë¡œ 확보하게 ë©ë‹ˆë‹¤.{*B*} + {*CONTROLLER_VK_B*} 단추를 눌러 제작 ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ 닫으십시오. + + + + ì¼ë¶€ ì•„ì´í…œì€ 작업대가 ì•„ë‹ˆë¼ í™”ë¡œì—서 만들어야 합니다. ì´ì œ 화로를 만들어 보십시오.{*FurnaceIcon*} + + + + 완성한 화로를 설치하십시오. 피신처 ì•ˆì— ì„¤ì¹˜í•˜ëŠ” ê²ƒì´ ì¢‹ìŠµë‹ˆë‹¤.{*B*} + {*CONTROLLER_VK_B*} 단추를 눌러 제작 ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ 닫으십시오. + + + + ì´ í™”ë©´ì€ í™”ë¡œ ì¸í„°íŽ˜ì´ìŠ¤ìž…ë‹ˆë‹¤. 화로ì—서는 ì•„ì´í…œì— ì—´ì„ ê°€í•˜ì—¬ 다른 ì•„ì´í…œìœ¼ë¡œ 바꿀 수 있습니다. 예를 들어, 화로ì—서 ì² ê´‘ì„ì„ ê°€ì—´í•˜ë©´ ì²  주괴가 만들어집니다. + + +{*B*} + 계ì†í•˜ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 화로 ì‚¬ìš©ë²•ì„ ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 화로 아래쪽ì—는 연료나 ë•”ê°ì„ 넣고 위쪽ì—는 변경할 ì•„ì´í…œì„ 넣어야 합니다. 그러면 í™”ë¡œì— ë¶ˆì´ ì¼œì§€ê³  ìž‘ì—…ì´ ì‹œìž‘ë˜ë©°, ê²°ê³¼ë¬¼ì€ ì˜¤ë¥¸ìª½ ìŠ¬ë¡¯ì— ë“¤ì–´ì˜µë‹ˆë‹¤. + + + + 나무로 ëœ ì•„ì´í…œì€ 종종 ë•”ê°ìœ¼ë¡œ 쓸 수 있지만, 타는 ì‹œê°„ì€ ì•„ì´í…œë§ˆë‹¤ 다릅니다. ë˜í•œ 주변ì—ì„œë„ ì—°ë£Œë¡œ 사용할 ì•„ì´í…œë“¤ì„ ì°¾ì„ ìˆ˜ 있습니다. + + + + ì•„ì´í…œ ê°€ì—´ì´ ë나면 결과물 슬롯ì—서 소지품으로 옮길 수 있습니다. 다양한 재료를 실험해서 ì–´ë–¤ ì•„ì´í…œì´ 만들어지는지 파악하십시오. + + + + 나무를 재료로 사용하면 ìˆ¯ì´ ë§Œë“¤ì–´ì§‘ë‹ˆë‹¤. í™”ë¡œì— ì—°ë£Œë¥¼ ë„£ì€ ë‹¤ìŒ ìž¬ë£Œ ìŠ¬ë¡¯ì— ë‚˜ë¬´ë¥¼ 넣으십시오. 화로ì—서 ìˆ¯ì´ ì™„ì„±ë  ë•Œê¹Œì§€ëŠ” 다소 ì‹œê°„ì´ í•„ìš”í•˜ë¯€ë¡œ, ìžìœ ë¡­ê²Œ 다른 ì¼ì„ 하다가 ë‚˜ì¤‘ì— ëŒì•„와서 ì§„í–‰ ìƒíƒœë¥¼ 확ì¸í•˜ì‹­ì‹œì˜¤. + + + + ìˆ¯ì€ ë§‰ëŒ€ì™€ 결합하여 íšƒë¶ˆì„ ë§Œë“¤ 수 있으며, 숯 ìžì²´ë¡œë„ 연료로 사용ë©ë‹ˆë‹¤. + + + + 재료 ìŠ¬ë¡¯ì— ëª¨ëž˜ë¥¼ 넣으면 유리가 만들어집니다. í”¼ì‹ ì²˜ì— ì°½ë¬¸ì„ ë‹¬ë ¤ë©´ 유리를 만드십시오. + + + + ì´ê²ƒì€ ì–‘ì¡° ì¸í„°íŽ˜ì´ìŠ¤ìž…ë‹ˆë‹¤. 여기서 다양한 효과를 지닌 ë¬¼ì•½ì„ ë§Œë“¤ 수 있습니다. + + +{*B*} + 계ì†í•˜ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 양조대 ì‚¬ìš©ë²•ì„ ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 위 ìŠ¬ë¡¯ì— ìž¬ë£Œë¥¼ 넣고 아래 ìŠ¬ë¡¯ì— ë¬¼ë³‘ì„ ë„£ì–´ ë¬¼ì•½ì„ ì–‘ì¡°í•©ë‹ˆë‹¤. 한 ë²ˆì— 3ë³‘ì„ ë™ì‹œì— ì–‘ì¡°í•  수 있습니다. ì¡°í•© ì¡°ê±´ì´ ê°–ì¶”ì–´ì§€ë©´ ì–‘ì¡°ê°€ 시작ë˜ê³  잠시 후 ë¬¼ì•½ì´ ì™„ì„±ë©ë‹ˆë‹¤. + + + + ë¬¼ì•½ì„ ë§Œë“¤ê¸° 위해서는 ìš°ì„  ë¬¼ë³‘ì´ ìžˆì–´ì•¼ 만들 수 있습니다. ê·¸ 후 지하 사마귀를 추가해 'ì´ìƒí•œ 물약'ì„ ë§Œë“  다ìŒ, 하나 ì´ìƒì˜ 다른 재료를 넣는 ë°©ì‹ìœ¼ë¡œ 물약 ëŒ€ë¶€ë¶„ì„ ë§Œë“¤ 수 있습니다. + + + + ë¬¼ì•½ì„ ë§Œë“  다ìŒì—ë„ ë¬¼ì•½ì˜ íš¨ê³¼ë¥¼ 바꿀 수 있습니다. 레드스톤 가루를 넣으면 효과 ì§€ì† ì‹œê°„ì´ ê¸¸ì–´ì§€ê³ , ë°œê´‘ì„ ê°€ë£¨ë¥¼ 넣으면 효과가 ë”ìš± 강해집니다. + + + + 발효 거미 ëˆˆì„ ë„£ìœ¼ë©´ ë¬¼ì•½ì´ ë¶€íŒ¨í•˜ì—¬ 반대 효과를 지니게 ë©ë‹ˆë‹¤. í™”ì•½ì„ ë„£ìœ¼ë©´ ë˜ì ¸ì„œ ì£¼ë³€ì— íš¨ê³¼ë¥¼ ì ìš©í•  수 있는 í­ë°œ ë¬¼ì•½ì´ ë©ë‹ˆë‹¤. + + + + ë¬¼ë³‘ì— ì§€í•˜ 사마귀를 넣고 ê·¸ë‹¤ìŒ ë§ˆê·¸ë§ˆ í¬ë¦¼ì„ 넣어 '물약 - 화염 저항'ì„ ë§Œë“œì‹­ì‹œì˜¤. + + + + {*CONTROLLER_VK_B*} 단추를 누르면 ì–‘ì¡° ì¸í„°íŽ˜ì´ìФì—서 나갑니다. + + + + ì´ê³³ì—는 양조대와 가마솥, 그리고 ì–‘ì¡°ìš© ì•„ì´í…œì´ 들어 있는 ìƒìžê°€ 있습니다. + + +{*B*} + 양조와 ë¬¼ì•½ì— ëŒ€í•´ ë” ì•Œì•„ë³´ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 양조와 ë¬¼ì•½ì— ëŒ€í•´ ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 물약 ì–‘ì¡°ì˜ ì²« 번째 단계는 ë¬¼ë³‘ì„ ë§Œë“œëŠ” 것입니다. ìƒìžì—서 ìœ ë¦¬ë³‘ì„ êº¼ë‚´ì‹­ì‹œì˜¤. + + + + ê°€ë§ˆì†¥ì— ë“¤ì–´ 있는 물ì´ë‚˜ 물 블ë¡ì„ 사용해 ìœ ë¦¬ë³‘ì— ë¬¼ì„ ì±„ìš°ì‹­ì‹œì˜¤. 수ì›ì„ 가리킨 ìƒíƒœì—서 {*CONTROLLER_ACTION_USE*}를 누르면 ë¬¼ì„ ì±„ì›ë‹ˆë‹¤. + + + + ê°€ë§ˆì†¥ì˜ ë¬¼ì´ ë–¨ì–´ì§€ë©´ 물 ì–‘ë™ì´ë¡œ 다시 채울 수 있습니다. + + + + 양조대를 사용하여 '물약 - 화염 저항'ì„ ë§Œë“œì‹­ì‹œì˜¤. 물병, 지하 사마귀와 마그마 í¬ë¦¼ì´ 필요합니다. + + + + ë¬¼ì•½ì„ ì†ì— ë“  ìƒíƒœì—서 {*CONTROLLER_ACTION_USE*}를 길게 누르면 ë¬¼ì•½ì„ ì‚¬ìš©í•©ë‹ˆë‹¤. ì¼ë°˜ ë¬¼ì•½ì„ ì‚¬ìš©í•˜ë©´ ë¬¼ì•½ì„ ë§ˆì‹œê²Œ ë˜ë©° 효과가 ìžì‹ ì—게 나타납니다. í­ë°œ ë¬¼ì•½ì„ ì‚¬ìš©í•˜ë©´ ë¬¼ì•½ì„ ë˜ì§€ê²Œ ë˜ë©° 효과가 ë¬¼ì•½ì´ ë–¨ì–´ì§„ ê³³ ê·¼ì²˜ì˜ ìƒë¬¼ì—게 나타납니다. + ì¼ë°˜ ë¬¼ì•½ì— í™”ì•½ì„ ë„£ìœ¼ë©´ í­ë°œ ë¬¼ì•½ì„ ë§Œë“¤ 수 있습니다. + + + + '물약 - 화염 저항'ì„ ìžì‹ ì—게 사용하십시오. + + + + ì´ì œ 화염과 ìš©ì•”ì— ëŒ€í•œ ì €í•­ë ¥ì´ ìƒê²¼ìŠµë‹ˆë‹¤. 지금까지 통과할 수 ì—†ì—ˆë˜ ìž¥ì†Œë„ í†µê³¼í•  수 있습니다. + + + + ì´ê²ƒì€ 효과부여 ì¸í„°íŽ˜ì´ìŠ¤ìž…ë‹ˆë‹¤. 무기, 방어구 ë° ì¼ë¶€ ë„êµ¬ì— íš¨ê³¼ë¥¼ 부여할 수 있습니다. + + +{*B*} + 효과부여 ì¸í„°íŽ˜ì´ìŠ¤ì— ëŒ€í•´ ë” ì•Œì•„ë³´ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 효과부여 ì¸í„°íŽ˜ì´ìŠ¤ì— ëŒ€í•´ ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + ì•„ì´í…œì— 효과를 부여하려면 ìš°ì„  ì•„ì´í…œì„ 효과부여 ìŠ¬ë¡¯ì— ë„£ìœ¼ì‹­ì‹œì˜¤. 무기, 방어구 ë° ì¼ë¶€ ë„êµ¬ì— íš¨ê³¼ë¥¼ 부여하면 특별한 효과를 ì–»ì„ ìˆ˜ 있습니다. 예를 들어 ë°©ì–´ë ¥ì´ ë” ê°•í•´ì§€ê±°ë‚˜, 블ë¡ì„ 채굴할 때 ë” ë§Žì€ ì•„ì´í…œì„ ì–»ì„ ìˆ˜ 있게 ë©ë‹ˆë‹¤. + + + + 효과부여 ìŠ¬ë¡¯ì— ì•„ì´í…œì„ 넣으면 오른쪽 ë‹¨ì¶”ì— ë¬´ìž‘ìœ„ë¡œ 부여할 효과가 표시ë©ë‹ˆë‹¤. + + + + ë‹¨ì¶”ì— ì“°ì¸ ìˆ«ìžëŠ” ì•„ì´í…œì— 해당 효과를 부여할 때 필요한 경험치입니다. 경험치가 부족할 때는 단추를 ì„ íƒí•  수 없습니다. + + + + 부여할 효과를 ì„ íƒí•˜ê³  {*CONTROLLER_VK_A*}를 누르면 ì•„ì´í…œì— 효과를 부여합니다. 부여할 효과 ë¹„ìš©ë§Œí¼ ê²½í—˜ì¹˜ê°€ 줄어듭니다. + + + + 효과는 무작위로 부여ë˜ì§€ë§Œ, ì„±ëŠ¥ì´ ë” ì¢‹ì€ íš¨ê³¼ 몇 종류는 ë” ë§Žì€ ê²½í—˜ì¹˜ë¥¼ 지불하는 ê²ƒì€ ë¬¼ë¡  효과부여대 주위를 책장으로 둘러싸 강화해야 ì–»ì„ ìˆ˜ 있습니다. + + + + 여기ì—는 효과부여대와 íš¨ê³¼ë¶€ì—¬ì— ì‚¬ìš©í•  수 있는 ì•„ì´í…œì´ 있습니다. + + + {*B*} + íš¨ê³¼ë¶€ì—¬ì— ëŒ€í•´ ë” ì•Œì•„ë³´ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + íš¨ê³¼ë¶€ì—¬ì— ëŒ€í•´ ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 효과부여대를 사용하면 무기, 방어구 ë° ì¼ë¶€ ë„êµ¬ì— íŠ¹ë³„í•œ 효과를 부여할 수 있습니다. 예를 들어 블ë¡ì„ 채굴할 때 ë” ë§Žì€ ì•„ì´í…œì„ ì–»ì„ ìˆ˜ 있는 효과나 ë°©ì–´ë ¥ì´ ë” ê°•í•´ì§€ëŠ” 효과 ë“±ì´ ìžˆìŠµë‹ˆë‹¤. + + + + 효과부여대 ì£¼ë³€ì— ì±…ìž¥ì„ ë†“ìœ¼ë©´ 효과부여대가 ê°•í™”ë˜ì–´ ë” ë†’ì€ ìˆ˜ì¤€ì˜ íš¨ê³¼ë¥¼ 부여할 수 있습니다. + + + + ì•„ì´í…œì— 효과를 부여하려면 경험치가 필요합니다. 괴물 ë° ë™ë¬¼ì„ 처치하면 나오는 경험치 구체를 모으거나, ê´‘ì„ì„ ì±„êµ´í•˜ê±°ë‚˜, ë™ë¬¼ì„ êµë°°í•˜ê±°ë‚˜, 낚시를 하거나, 화로ì—서 특정 ì•„ì´í…œì„ ë…¹ì´ê±°ë‚˜ 요리하면 경험치를 ì–»ì„ ìˆ˜ 있습니다. + + + + 경험치 ë³‘ì„ ì‚¬ìš©í•´ì„œë„ ê²½í—˜ì¹˜ë¥¼ ì–»ì„ ìˆ˜ 있습니다. 경험치 ë³‘ì„ ë˜ì§€ë©´ ë³‘ì´ ë–¨ì–´ì§„ ê³³ì— ê²½í—˜ì¹˜ 구체가 나타납니다. + + + + ì´ê³³ì— 있는 ìƒìžì—는 효과가 ë¶€ì—¬ëœ ì•„ì´í…œê³¼ 경험치 병, 그리고 효과부여대를 시험해 ë³¼ 수 있는 ì•„ì´í…œì´ 들어 있습니다. + + + + 광물 ìˆ˜ë ˆì— íƒ‘ìŠ¹í–ˆìŠµë‹ˆë‹¤. 수레ì—서 나가려면 í¬ì¸í„°ë¥¼ ìˆ˜ë ˆì— ë§žì¶˜ ë‹¤ìŒ {*CONTROLLER_ACTION_USE*}를 누르십시오.{*MinecartIcon*} + + +{*B*} + 광물 ìˆ˜ë ˆì— ëŒ€í•´ ë” ì•Œì•„ë³´ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 광물 ìˆ˜ë ˆì— ëŒ€í•´ ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 광물 수레는 ë ˆì¼ì„ ë”°ë¼ ì´ë™í•©ë‹ˆë‹¤. 화로를 ë™ë ¥ìœ¼ë¡œ 사용하여 움ì§ì´ëŠ” 광물 수레나 ìƒìžê°€ 담긴 광물 수레를 만들 ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. + {*RailIcon*} + + + + 레드스톤 횃불과 회로로 ë™ë ¥ì„ 공급받아 광물 ìˆ˜ë ˆì˜ ì†ë„를 높여주는 ë™ë ¥ ë ˆì¼ë„ 만들 수 있습니다. 스위치와 레버, ì••ë ¥íŒìœ¼ë¡œ ì´ëŸ¬í•œ 장치를 ì—°ê²°í•´ 장치를 만드십시오. + {*PoweredRailIcon*} + + + + 배를 타고 ì´ë™ 중입니다. ë°°ì—서 내리려면 í¬ì¸í„°ë¥¼ ë°°ì— ë§žì¶”ê³  {*CONTROLLER_ACTION_USE*}를 누르십시오.{*BoatIcon*} + + + + {*B*} + ë°°ì— ëŒ€í•´ ë” ì•Œì•„ë³´ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + ë°°ì— ëŒ€í•´ ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 배를 ì´ìš©í•˜ë©´ 물ì—서 ë” ë¹¨ë¦¬ ì´ë™í•  수 있습니다. {*CONTROLLER_ACTION_MOVE*}ê³¼ {*CONTROLLER_ACTION_LOOK*}으로 ë°©í–¥ì„ ì¡°ì •í•˜ì‹­ì‹œì˜¤. + {*BoatIcon*} + + + + 낚싯대를 사용하고 있습니다. 사용하려면 {*CONTROLLER_ACTION_USE*}를 누르십시오.{*FishingRodIcon*} + + + + {*B*} + ë‚šì‹œì— ëŒ€í•´ ë” ì•Œì•„ë³´ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + ë‚šì‹œì— ëŒ€í•´ ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + {*CONTROLLER_ACTION_USE*}를 누르면 찌를 ë˜ì§€ê³  낚시를 시작합니다. {*CONTROLLER_ACTION_USE*}를 한 번 ë” ëˆ„ë¥´ë©´ ë‚šì‹¯ì¤„ì„ ê°ìŠµë‹ˆë‹¤. + {*FishingRodIcon*} + + + + 물고기를 낚으려면 ë¬¼ì— ë˜ì ¸ë†“ì€ ì°Œê°€ 수면 아래로 ê°€ë¼ì•‰ê¸°ë¥¼ 기다려서 ì¤„ì„ ê°ì•„올립니다. 물고기는 날것으로 먹거나 화로ì—서 요리해 ë¨¹ì„ ìˆ˜ 있으며, 먹으면 ì²´ë ¥ì´ íšŒë³µë©ë‹ˆë‹¤. + {*FishIcon*} + + + + 다른 ë„구들과 마찬가지로, ë‚šì‹¯ëŒ€ë„ ì •í•´ì§„ 횟수만í¼ë§Œ 사용할 수 있습니다. 하지만 물고기 ì´ì™¸ì˜ ë¬¼ê±´ì„ ë‚šì•„ë„ ì‚¬ìš© 횟수는 줄어듭니다. 낚싯대를 사용해서 ì–´ë–¤ ë¬¼ê±´ì„ ë‚šì„ ìˆ˜ 있는지, ë˜ëŠ” ì–´ë–¤ ì¼ì´ ì¼ì–´ë‚˜ëŠ”ì§€ 확ì¸í•´ 보십시오. + {*FishingRodIcon*} + + + + ì´ê²ƒì€ 침대입니다. ë°¤ì— ì¹¨ëŒ€ë¥¼ 가리킨 ìƒíƒœì—서 {*CONTROLLER_ACTION_USE*}를 누르면 침대ì—서 ìž ì„ ìžê³  ì•„ì¹¨ì— ì¼ì–´ë‚©ë‹ˆë‹¤.{*ICON*}355{*/ICON*} + + + + {*B*} + ì¹¨ëŒ€ì— ëŒ€í•´ ë” ì•Œì•„ë³´ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + ì¹¨ëŒ€ì— ëŒ€í•´ ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + ìžëŠ” ë„ì¤‘ì— ê´´ë¬¼ì˜ ìŠµê²©ì„ ë°›ì§€ 않으려면 침대를 안전하고 ì¡°ëª…ì´ ì¶©ë¶„í•œ ê³³ì— ë‘어야 합니다. 침대를 한 번 사용하면 게임 ì¤‘ì— ì‚¬ë§í–ˆì„ 때 침대ì—서 부활합니다. + {*ICON*}355{*/ICON*} + + + + 게임 ë‚´ì— ë‹¤ë¥¸ 플레ì´ì–´ê°€ ìžˆì„ ë•ŒëŠ” 모든 플레ì´ì–´ê°€ ë™ì‹œì— ì¹¨ëŒ€ì— ë“¤ì–´ì•¼ ìž ì„ ìž˜ 수 있습니다. + {*ICON*}355{*/ICON*} + + + + ì´ê³³ì—는 레드스톤과 피스톤으로 ì´ë£¨ì–´ì§„ 간단한 회로가 있고, 회로를 연장할 수 있는 ì•„ì´í…œì´ ë“  ìƒìžê°€ 있습니다. + + + + {*B*} + 레드스톤 회로와 í”¼ìŠ¤í†¤ì— ëŒ€í•´ ë” ì•Œì•„ë³´ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 레드스톤 회로와 í”¼ìŠ¤í†¤ì— ëŒ€í•´ ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 레버, 단추, ì••ë ¥íŒ, 레드스톤 횃불로 íšŒë¡œì— ë™ë ¥ì„ 공급할 수 있습니다. ìž‘ë™í•  ì•„ì´í…œì— ì§ì ‘ ë¶™ì´ê±°ë‚˜ 레드스톤 가루로 연결하십시오. + + + + ë™ë ¥ì›ì„ 설치한 위치와 ë°©í–¥ì— ë”°ë¼ ì£¼ë³€ 블ë¡ì— 주는 ì˜í–¥ì´ 달ë¼ì§‘니다. 예를 들면 ë¸”ë¡ ì˜†ì— ì„¤ì¹˜í•œ 레드스톤 íšƒë¶ˆì€ í•´ë‹¹ 블ë¡ì´ 다른 ë™ë ¥ì›ì—서 ë™ë ¥ì„ 공급받는다면 꺼질 수 있습니다. + + + + ì² ì œ, 다ì´ì•„몬드, 황금 곡괭ì´ë¡œ ë ˆë“œìŠ¤í†¤ì„ ì±„êµ´í•˜ë©´ 레드스톤 가루를 ì–»ì„ ìˆ˜ 있습니다. 레드스톤 가루를 사용하면 옆으로 15 블ë¡, 아래위로 1블ë¡ê¹Œì§€ ë™ë ¥ì„ 운반할 수 있습니다. + {*ICON*}331{*/ICON*} + + + + 레드스톤 íƒì§€ê¸°ëŠ” ë™ë ¥ ìš´ë°˜ 거리를 늘리거나 íšŒë¡œì— ì§€ì—° ê¸°ëŠ¥ì„ ë¶€ì—¬í•  수 있습니다. + {*ICON*}356{*/ICON*} + + + + ë™ë ¥ì´ 공급ë˜ë©´ í”¼ìŠ¤í†¤ì´ ëŠ˜ì–´ë‚˜ 최대 12블ë¡ê¹Œì§€ 밀어냅니다. ëˆëˆì´ í”¼ìŠ¤í†¤ì€ ì¤„ì–´ë“¤ 때 ê±°ì˜ ëª¨ë“  ì¢…ë¥˜ì˜ ë¸”ë¡ 1개를 다시 ëŒì–´ì˜µë‹ˆë‹¤. + {*ICON*}33{*/ICON*} + + + + ì´ê³³ì˜ ìƒìžì—는 피스톤으로 회로를 만들 수 있는 ë¶€í’ˆì´ ë“¤ì–´ 있습니다. ì´ê³³ì— 있는 회로를 완성하거나 ìžì‹ ë§Œì˜ 회로를 만드십시오. 튜토리얼 지역 ë°–ì—는 ë” ë§Žì€ ì˜ˆì‹œê°€ 있습니다. + + + + ì´ê³³ì—는 지하로 통하는 ì°¨ì›ë¬¸ì´ 있습니다! + + + + {*B*} + 지하 ì°¨ì›ë¬¸ì— 대해 ë” ì•Œì•„ë³´ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 지하 ì°¨ì›ë¬¸ì— 대해 ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + ì°¨ì›ë¬¸ì€ í‘ìš”ì„ ë¸”ë¡ì„ 4ë¸”ë¡ ê¸¸ì´ì— 5ë¸”ë¡ ë†’ì´ë¡œ 쌓아서 만듭니다. 모서리 블ë¡ì€ ì—†ì–´ë„ ë©ë‹ˆë‹¤. + + + + 지하 ì°¨ì›ë¬¸ì„ ìž‘ë™í•˜ë ¤ë©´ 부싯ëŒê³¼ 부시를 사용하여 í‘ìš”ì„ ë¸”ë¡ ì•ˆìª½ ê³µê°„ì— ë¶ˆì„ ë¶™ì—¬ì•¼ 합니다. ì°¨ì›ë¬¸ í‹€ì´ ë¬´ë„ˆì§€ê±°ë‚˜, 근처ì—서 í­ë°œì´ ì¼ì–´ë‚˜ê±°ë‚˜, ì°¨ì›ë¬¸ ì•ˆì— ë¬¼ì´ ë“¤ì–´ê°€ë©´ ì°¨ì›ë¬¸ ìž‘ë™ì´ 멈출 수 있습니다. + + + + 지하 ì°¨ì›ë¬¸ì„ 사용하려면 안으로 들어가십시오. í™”ë©´ì´ ë³´ë¼ìƒ‰ìœ¼ë¡œ 변하며 소리가 ë‚  것입니다. 잠시 후 다른 ì°¨ì›ìœ¼ë¡œ ì´ë™í•˜ê²Œ ë©ë‹ˆë‹¤. + + + + 용암으로 ê°€ë“ì°¬ 지하 세계는 위험한 곳입니다. 하지만 ë¶ˆì„ ë¶™ì´ë©´ ì˜ì›ížˆ 타는 지하 바위와 ë¹›ì„ ë¿œëŠ” 발광ì„ì„ ì–»ì„ ìˆ˜ 있습니다. + + + + ì§€í•˜ì˜ 1ë¸”ë¡ ê±°ë¦¬ëŠ” ì§€ìƒì˜ 3ë¸”ë¡ ê±°ë¦¬ì™€ 같으므로, 지하 월드ì—서는 ì§€ìƒì—서보다 ë” ë¹¨ë¦¬ ì´ë™í•  수 있습니다. + + + + 현재 창작 모드 ìƒíƒœìž…니다. + + + + {*B*} + 창작 ëª¨ë“œì— ëŒ€í•´ ë” ì•Œì•„ë³´ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 창작 ëª¨ë“œì— ëŒ€í•´ ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + +창작 모드ì—서는 모든 ì•„ì´í…œê³¼ 블ë¡ì„ 무한정 사용할 수 있습니다. ë„구를 사용하지 ì•Šì•„ë„ í´ë¦­ 한 번만으로 블ë¡ì„ 파괴할 수 있으며, ë¬´ì  ìƒíƒœì¸ë°ë‹¤ ë‚  ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. + +{*CONTROLLER_ACTION_JUMP*}를 앞으로 빨리 ë‘ ë²ˆ 누르면 ë‚  수 있습니다. ë¹„í–‰ì„ ì¢…ë£Œí•˜ë ¤ë©´ ë˜‘ê°™ì€ ë™ìž‘ì„ ë°˜ë³µí•˜ì‹­ì‹œì˜¤. ë” ë¹¨ë¦¬ 날려면 {*CONTROLLER_ACTION_MOVE*}를 앞으로 빨리 ë‘ ë²ˆ 누르십시오. +비행 모드ì—서 {*CONTROLLER_ACTION_JUMP*}ì„ ê¸¸ê²Œ 누르면 위로 올ë¼ê°€ê³ {*CONTROLLER_ACTION_SNEAK*}ì„ ê¸¸ê²Œ 누르면 아래로 내려갑니다. ë˜ëŠ” ì‹­ìž í‚¤ë¥¼ 사용해서 ìƒí•˜ì¢Œìš°ë¡œ 움ì§ì¼ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. + +{*CONTROLLER_ACTION_CRAFTING*}를 눌러 창작 소지품 ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ 엽니다. + +êµ¬ë© ë°˜ëŒ€ìª½ìœ¼ë¡œ 나가면 계ì†í•©ë‹ˆë‹¤. + +창작 모드 íŠœí† ë¦¬ì–¼ì„ ì™„ë£Œí–ˆìŠµë‹ˆë‹¤. + + + ì´ ì§€ì—­ì—는 ë†ìž¥ì´ 있습니다. ë†ìž¥ì—서 ìž‘ë¬¼ì„ ìž¬ë°°í•˜ë©´ ìŒì‹ ë° ê¸°íƒ€ ì•„ì´í…œì˜ 재료를 ì–»ì„ ìˆ˜ 있습니다. + + + + {*B*} + ìž¬ë°°ì— ëŒ€í•´ ë” ì•Œì•„ë³´ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + ìž¬ë°°ì— ëŒ€í•´ ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + +ë°€, 호박, ìˆ˜ë°•ì€ ì”¨ì•—ì„ ì‹¬ì–´ì„œ 재배합니다. 길게 ìžëž€ í’€ì„ ìžë¥´ê±°ë‚˜ ë°€ì„ ìˆ˜í™•í•˜ë©´ ë°€ ì”¨ì•—ì„ ì–»ì„ ìˆ˜ 있습니다. 호박 ë° ìˆ˜ë°•ì„ ê°€ê³µí•˜ë©´ 호박씨 ë° ìˆ˜ë°•ì”¨ë¥¼ ì–»ì„ ìˆ˜ 있습니다. + +씨를 심으려면 ìŸê¸°ë¥¼ 사용해서 í™ ë¸”ë¡ì„ ë†ì§€ë¡œ 만들어야 합니다. ì£¼ë³€ì— ìˆ˜ì›ì´ 있으면 ë†ì§€ì— ê³„ì† ìˆ˜ë¶„ì„ ê³µê¸‰í•˜ë¯€ë¡œ ìž‘ë¬¼ì´ ë¹¨ë¦¬ ìžë¼ë©°, 해당 ì§€ì—­ì— ë¶ˆì´ ì¼œì§„ ìƒíƒœë¥¼ 유지합니다. + +ë°€ì€ ìžë¼ëŠ” ë™ì•ˆ 여러 단계를 거칩니다. 수확할 준비가 ë˜ì—ˆì„ 때는 어둡게 변합니다.{*ICON*}59:7{*/ICON*} + +호박 ë° ìˆ˜ë°•ì€ ì”¨ë¥¼ ì‹¬ì€ ë¸”ë¡ ì˜†ì— ë˜ ë‹¤ë¥¸ ë¸”ë¡ í•˜ë‚˜ê°€ 필요합니다. 줄기가 다 ìžëž€ 후 ì˜†ì˜ ë¹ˆ 블ë¡ì— 열매를 맺게 ë©ë‹ˆë‹¤. + +사탕수수는 물 ë¸”ë¡ ì˜†ì— ìžˆëŠ” í’€, í™ ë˜ëŠ” 모래 블ë¡ì— 심어야 합니다. 사탕수수 블ë¡ì„ ìžë¥´ë©´ 사탕수수 ìœ„ì— ë†“ì¸ ë¸”ë¡ì´ ëª¨ë‘ ë–¨ì–´ì§€ê²Œ ë©ë‹ˆë‹¤.{*ICON*}83{*/ICON*} + +ì„ ì¸ìž¥ì€ ëª¨ëž˜ì— ì‹¬ì–´ì•¼ 하며 최대 세 ë¸”ë¡ ë†’ì´ê¹Œì§€ ìžëžë‹ˆë‹¤. 사탕수수와 마찬가지로 맨 아래 블ë¡ì„ 파괴하면 ê·¸ ìœ„ì˜ ë¸”ë¡ì´ 떨어져 íšë“í•  수 있습니다.{*ICON*}81{*/ICON*} + +ë²„ì„¯ì€ í¬ë¯¸í•˜ê²Œ ë¶ˆì´ ì¼œì§„ ì§€ì—­ì— ì‹¬ì–´ì•¼ 합니다. ë²„ì„¯ì„ ì‹¬ìœ¼ë©´ ì£¼ë³€ì˜ í¬ë¯¸í•˜ê²Œ ë¶ˆì´ ì¼œì§„ 블ë¡ìœ¼ë¡œ í¼ì ¸ 나갑니다.{*ICON*}39{*/ICON*} + +뼛가루를 사용하면 ìž‘ë¬¼ì„ ì™„ì „ížˆ ìžëž€ ìƒíƒœë¡œ 만들거나 ë²„ì„¯ì„ ê±°ëŒ€ 버섯으로 만들 수 있습니다.{*ICON*}351:15{*/ICON*} + +재배 íŠœí† ë¦¬ì–¼ì„ ì™„ë£Œí–ˆìŠµë‹ˆë‹¤. + + + ì´ê³³ì—는 ë™ë¬¼ì´ 우리 ì•ˆì— ë“¤ì–´ 있습니다. ë™ë¬¼ì„ êµë°°í•˜ë©´ ìƒˆë¼ ë™ë¬¼ì„ ì–»ì„ ìˆ˜ 있습니다. + + + + {*B*} + ë™ë¬¼ê³¼ êµë°°ì— 대해 ë” ì•Œì•„ë³´ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + ë™ë¬¼ê³¼ êµë°°ì— 대해 ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + +ë™ë¬¼ì„ êµë°°ì‹œí‚¤ë ¤ë©´ ê° ë™ë¬¼ì— ì í•©í•œ 먹ì´ë¥¼ 먹여 '사랑 모드'로 만들어야 합니다. + +소, Mooshroom, ì–‘ì—게는 ë°€ì„ ë¨¹ì´ê³  ë¼ì§€ì—게는 ë‹¹ê·¼ì„ ë¨¹ì´ì‹­ì‹œì˜¤. 그리고 ë‹­ì—게는 ë°€ 씨앗ì´ë‚˜ 지하 사마귀를 먹ì´ì‹­ì‹œì˜¤. 늑대ì—ê² ëª¨ë“  ì¢…ë¥˜ì˜ ê³ ê¸°ë¥¼ ë¨¹ì¼ ìˆ˜ 있습니다. 먹ì´ë¥¼ ë¨¹ì€ ë™ë¬¼ì€ 사랑 모드 ìƒíƒœì¸ ê°™ì€ ì¢…ì˜ ë™ë¬¼ì´ ê·¼ì²˜ì— ìžˆëŠ”ì§€ 찾아다니게 ë©ë‹ˆë‹¤. + +사랑 모드 ìƒíƒœì´ë©° 종류가 ê°™ì€ ë™ë¬¼ì´ ë‘ ë§ˆë¦¬ 만나게 ë˜ë©´ 서로 ìž…ì„ ë§žì¶”ê²Œ ë˜ê³ , 잠시 후 ìƒˆë¼ ë™ë¬¼ì´ 태어납니다. ìƒˆë¼ ë™ë¬¼ì€ 다 ìžë¼ê¸° 전까지 잠시 부모 ë™ë¬¼ì„ ë”°ë¼ë‹¤ë‹™ë‹ˆë‹¤. + +사랑 모드가 ë난 ë™ë¬¼ì€ 5ë¶„ê°„ 다시 사랑 모드 ìƒíƒœê°€ ë  ìˆ˜ 없습니다. + +플레ì´ì–´ê°€ ì†ì— 먹ì´ë¥¼ 들고 있으면 ì¼ë¶€ ë™ë¬¼ì€ 플레ì´ì–´ë¥¼ ë”°ë¼ë‹¤ë‹™ë‹ˆë‹¤. ë™ë¬¼ì„ í•œë° ëª¨ì•„ êµë°°í•  때 편리합니다.{*ICON*}296{*/ICON*} + + + ì•¼ìƒ ëŠ‘ëŒ€ì—게 뼈를 주면 ê¸¸ë“¤ì¼ ìˆ˜ 있으며, ê¸¸ë“¤ì¸ ëŠ‘ëŒ€ 주변ì—는 하트가 나타납니다. ê¸¸ë“¤ì¸ ëŠ‘ëŒ€ëŠ” 플레ì´ì–´ë¥¼ ë”°ë¼ë‹¤ë‹ˆë©°, 앉ë„ë¡ ëª…ë ¹ë°›ì§€ ì•Šì€ ë™ì•ˆì—는 플레ì´ì–´ë¥¼ 보호합니다. + + +ë™ë¬¼ ë° êµë°° íŠœí† ë¦¬ì–¼ì„ ì™„ë£Œí–ˆìŠµë‹ˆë‹¤. + + + ì´ ì§€ì—­ì—서는 호박과 블ë¡ìœ¼ë¡œ 눈 골렘과 ì²  ê³¨ë ˜ì„ ë§Œë“¤ 수 있습니다. + + + + {*B*} + {*CONTROLLER_VK_A*}를 눌러 ê³¨ë ˜ì— ëŒ€í•´ ë” ì•Œì•„ë³´ì‹­ì‹œì˜¤.{*B*} + ê³¨ë ˜ì— ëŒ€í•´ 잘 안다면 {*CONTROLLER_VK_B*}를 누르십시오. + + +ê³¨ë ˜ì€ ì—¬ëŸ¬ ê°œ ìŒ“ì¸ ë¸”ë¡ ìœ„ì— í˜¸ë°•ì„ ë†“ì•„ 만들 수 있습니다. + +눈 ê³¨ë ˜ì€ 2ê°œì˜ ëˆˆ 블ë¡ì„ 위아래로 쌓고 ê·¸ ìœ„ì— í˜¸ë°•ì„ ë†“ì•„ 만들 수 있습니다. 눈 ê³¨ë ˜ì€ ì ì—게 눈ë©ì´ë¥¼ ë˜ì§‘니다. + +ì²  ê³¨ë ˜ì€ ë³´ì‹œëŠ” 바와 ê°™ì´ 4ê°œì˜ ì²  블ë¡ì„ 놓고 ê°€ìš´ë° ë¸”ë¡ ìœ„ì— í˜¸ë°•ì„ ë†“ì•„ 만들 수 있습니다. ì²  ê³¨ë ˜ì€ ì ì„ 공격합니다. + +ì²  ê³¨ë ˜ì€ ê¸°ë³¸ì ìœ¼ë¡œ 마ì„ì„ ë³´í˜¸í•©ë‹ˆë‹¤. 사용ìžê°€ ë§ˆì„ ì‚¬ëžŒì„ ê³µê²©í•˜ë©´ ì²  ê³¨ë ˜ì´ ì‚¬ìš©ìžë¥¼ 공격합니다. + +íŠœí† ë¦¬ì–¼ì„ ì™„ë£Œí•˜ê¸° ì „ì—는 ì´ ì§€ì—­ì„ ë²—ì–´ë‚  수 없습니다. + +재료를 확보할 때는 ê·¸ì— ë§žëŠ” ë„구를 사용하는 ê²ƒì´ ì¢‹ìŠµë‹ˆë‹¤. í™ì´ë‚˜ 모래 ê°™ì´ ë¶€ë“œëŸ¬ìš´ ìž¬ì§ˆì˜ ìž¬ë£Œë¥¼ 얻으려면 ì‚½ì„ ì¨ì•¼ 합니다. + +재료를 확보할 때는 ê·¸ì— ë§žëŠ” ë„구를 사용하는 ê²ƒì´ ì¢‹ìŠµë‹ˆë‹¤. 나무 둥치를 베려면 ë„ë¼ë¥¼ ì¨ì•¼ 합니다. + +재료를 확보할 때는 ê·¸ì— ë§žëŠ” ë„구를 사용하는 ê²ƒì´ ì¢‹ìŠµë‹ˆë‹¤. ëŒê³¼ ê´‘ë¬¼ì„ ì±„êµ´í•  때는 곡괭ì´ë¥¼ ì¨ì•¼ 합니다. 특정 블ë¡ì—서 ìžì›ì„ 채굴하려면 ë” ì¢‹ì€ ìž¬ì§ˆì˜ ê³¡ê´­ì´ê°€ 필요할 ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. + +특정 ë„구는 ì ì„ 공격하는 ë° ìœ ìš©í•©ë‹ˆë‹¤. ê²€ì„ ì‚¬ìš©í•´ì„œ 공격해 보십시오. + +힌트: {*CONTROLLER_ACTION_ACTION*}를 누르고 있으면 ì† ë˜ëŠ” ì†ì— ë“  ë„구로 채굴하거나 벌목합니다. ì¼ë¶€ 블ë¡ì€ ë„구를 사용해야 채굴할 수 있습니다. + +사용하고 있는 ë„구가 ì†ìƒë습니다. ë„구는 사용할 때마다 ì†ìƒë˜ë©°, 나중ì—는 ë§ê°€ì§‘니다. ì•„ì´í…œ ì•„ëž˜ìª½ì˜ ìƒ‰ìƒ ëˆˆê¸ˆì„ ë³´ë©´ 현재 ì†ìƒëœ ì •ë„를 알 수 있습니다. + +수면으로 헤엄치려면 {*CONTROLLER_ACTION_JUMP*}를 길게 누르십시오. + +ì´ê³³ì—는 궤ë„ê°€ 있고 ê·¸ ìœ„ì— ê´‘ë¬¼ 수레가 있습니다. 광물 ìˆ˜ë ˆì— íƒ€ë ¤ë©´ í¬ì¸í„°ë¥¼ ìˆ˜ë ˆì— ë§žì¶”ê³  {*CONTROLLER_ACTION_USE*}를 누릅니다. ë‹¨ì¶”ì— í¬ì¸í„°ë¥¼ 맞추고 {*CONTROLLER_ACTION_USE*}를 누르면 광물 수레가 움ì§ìž…니다. + +ê°• ì˜†ì˜ ìƒìžì—는 ë°°ê°€ 있습니다. 배를 사용하려면 í¬ì¸í„°ë¥¼ ë¬¼ì— ë§žì¶”ê³  {*CONTROLLER_ACTION_USE*}를 누르십시오. í¬ì¸í„°ë¥¼ ë°°ì— ë§žì¶”ê³  {*CONTROLLER_ACTION_USE*}를 누르면 ë°°ì— íƒ‘ë‹ˆë‹¤. + +연못 ì˜†ì˜ ìƒìžì—는 낚싯대가 있습니다. ìƒìžì—서 낚싯대를 꺼내 ì†ì— ë“  ì•„ì´í…œìœ¼ë¡œ ì„ íƒí•œ ë‹¤ìŒ ì‚¬ìš©í•˜ì‹­ì‹œì˜¤. + +ì´ ê³ ê¸‰ 피스톤 기계장치는 ìžë™ 수리 ê¸°ëŠ¥ì„ ì§€ë‹Œ 다리를 만듭니다! 단추를 눌러 ìž‘ë™ì‹œí‚¨ ë‹¤ìŒ ê° ë¶€í’ˆì´ ì–´ë–»ê²Œ 사용ë˜ì—ˆëŠ”ì§€ ë” ì•Œì•„ë³´ì‹­ì‹œì˜¤. + +ì•„ì´í…œì„ 옮기는 ì¤‘ì— í¬ì¸í„°ê°€ ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ 벗어나면 ì•„ì´í…œì„ 버릴 수 있습니다. + +ì´ ì•„ì´í…œì„ 만들 재료가 부족합니다. 왼쪽 ì•„ëž˜ì˜ ìƒìžì—는 ì´ ì•„ì´í…œì„ 만드는 ë° í•„ìš”í•œ 재료가 표시ë©ë‹ˆë‹¤. + + + 축하합니다. íŠœí† ë¦¬ì–¼ì„ ë§ˆì³¤ìŠµë‹ˆë‹¤. ì´ì œ 게임 ì‹œê°„ì´ ì •ìƒì ìœ¼ë¡œ í르며, ê´´ë¬¼ì´ ì¶œëª°í•˜ëŠ” ë°¤ì´ ì˜¤ê¸°ê¹Œì§€ ì‹œê°„ì´ ì–¼ë§ˆ 남지 않았습니다! 피신처를 완성하십시오! + + +{*EXIT_PICTURE*} 먼 ê³³ì„ íƒí—˜í•˜ë ¤ë©´ ì´ ì§€ì—­ì˜ ê³„ë‹¨ì„ ì´ìš©í•˜ì‹­ì‹œì˜¤. 출입구는 ìž‘ì€ ì„±ê³¼ ì—°ê²°ëœ ê´‘ë¶€ì˜ í”¼ì‹ ì²˜ ê·¼ì²˜ì— ìžˆìŠµë‹ˆë‹¤. + +알림: + +]]> + +최신 버전ì—는 튜토리얼 월드ì—서 ê°ˆ 수 있는 새로운 지역 ë“±ì˜ ë‹¤ì–‘í•œ 새 ê¸°ëŠ¥ì´ ì¶”ê°€ë˜ì—ˆìŠµë‹ˆë‹¤. + +{*B*}íŠœí† ë¦¬ì–¼ì„ í”Œë ˆì´í•˜ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + íŠœí† ë¦¬ì–¼ì„ ê±´ë„ˆë›°ë ¤ë©´ {*CONTROLLER_VK_B*} 단추를 누르십시오. + +ì´ê³³ì—는 낚시, ë°°, 피스톤, ë ˆë“œìŠ¤í†¤ì— ëŒ€í•´ 알려주는 ì§€ì—­ì´ ìžˆìŠµë‹ˆë‹¤. + +ì´ê³³ ë°–ì—서는 건설, 재배, 광물 수레와 궤ë„, 효과부여, ì–‘ì¡°, 거래, ëŒ€ìž¥ì¼ ë“±ì˜ ì˜ˆì‹œë¥¼ 만나볼 수 있습니다! + + + ìŒì‹ 막대가 다 떨어지면 ì²´ë ¥ì´ íšŒë³µí•˜ì§€ 않습니다. + + + + {*B*} + ìŒì‹ 막대와 ìŒì‹ 먹는 ë²•ì— ëŒ€í•´ ë” ì•Œì•„ë³´ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + ìŒì‹ 막대와 ìŒì‹ 먹는 ë²•ì— ëŒ€í•´ ì´ë¯¸ 알고 있다면{*CONTROLLER_VK_B*} 단추를 누르십시오. + + +ì„ íƒ + +사용 + +뒤로 + +나가기 + +취소 + +참가 취소 + +저장 장치 ì„ íƒ + +저장 장치 변경 + +온ë¼ì¸ 게임 ëª©ë¡ ìƒˆë¡œ 고침 + +파티 게임 + +모든 게임 + +그룹 변경 + +소지품 표시 + +설명 표시 + +재료 표시 + +제작 + +만들기 + +íšë“/놓기 + +íšë“ + +ëª¨ë‘ íšë“ + +절반 íšë“ + +놓기 + +ëª¨ë‘ ë†“ê¸° + +하나 놓기 + +버리기 + +ëª¨ë‘ ë²„ë¦¬ê¸° + +하나 버리기 + +êµì²´ + +빠른 ì´ë™ + +빠른 ì„ íƒ ì·¨ì†Œ + +ì´ê²ƒì€ 무엇입니까? + +Facebookì— ê³µìœ  + +í•„í„° 변경 + +게ì´ë¨¸ 카드 보기 + +게ì´ë¨¸ 프로필 í™•ì¸ + +친구 요청 보내기 + +페ì´ì§€ 내림 + +페ì´ì§€ 올림 + +ë‹¤ìŒ + +ì´ì „ + +플레ì´ì–´ 추방 + +염색 + +채굴 + +먹ì´ê¸° + +길들ì´ê¸° + +치료하기 + +앉기 + +나를 ë”°ë¥´ë¼ + +쫓아내기 + +비우기 + +안장 + +놓기 + +때리기 + +ì – 짜기 + +수집 + +먹기 + +ìž ìžê¸° + +ì¼ì–´ë‚˜ê¸° + +ìž¬ìƒ + +타기 + +ë°° 타기 + +성장 + +수면으로 헤엄치기 + +열기 + +ë†’ë‚®ì´ ë³€ê²½ + +í­íŒŒ + +ì½ê¸° + +매달기 + +ë˜ì§€ê¸° + +심기 + +경작 + +수확 + +ê³„ì† + +ì •ì‹ ë²„ì „ 게임 구매 + +저장 게임 ì‚­ì œ + +ì‚­ì œ + +옵션 + +Xbox Live 파티 초대 + +친구 초대 + +ìˆ˜ë½ + +털 깎기 + +레벨 차단 + +ìºë¦­í„° ì„ íƒ + +ì í™” + +ìºë¦­í„° 찾기 + +ì •ì‹ ë²„ì „ 설치 + +í‰ê°€íŒ 설치 + +설치 + +재설치 + +옵션 저장 + +명령 실행 + +창작 + +재료 ì´ë™ + +연료 ì´ë™ + +ë„구 움ì§ì´ê¸° + +방어구 ì´ë™ + +무기 ì´ë™ + +장비하기 + +꺼내기 + +놓기 + +특권 + +ë¸”ë¡ + +페ì´ì§€ 위로 + +페ì´ì§€ 아래로 + +사랑 모드 + +마시기 + +회전 + +숨기기 + +Xbox Oneìš© 저장 파ì¼ì„ 업로드합니다. + +모든 ìŠ¬ë¡¯ì„ ë¹„ì›ë‹ˆë‹¤. + +Xbox One 저장 ë°ì´í„° 업로드 + +í™•ì¸ + +취소 + +Minecraft ìƒì  + +ì§„í–‰ ì¤‘ì¸ ê²Œìž„ì„ ì¢…ë£Œí•˜ê³  새 ê²Œìž„ì— ì°¸ê°€í•˜ì‹œê² ìŠµë‹ˆê¹Œ? 저장하지 ì•Šì€ ì§„í–‰ ìƒí™©ì€ 사ë¼ì§‘니다. + +게임 나가기 + +게임 저장 + +저장하지 않고 나가기 + +현재 월드ì—서 ì´ì „ì— ì €ìž¥í•œ ë‚´ìš©ì„ í˜„ìž¬ 버전으로 ë®ì–´ì“°ì‹œê² ìŠµë‹ˆê¹Œ? + +저장하지 않고 나가시겠습니까? ì´ ì›”ë“œì˜ ì§„í–‰ ìƒí™©ì´ ëª¨ë‘ ì‚¬ë¼ì§‘니다! + +게임 시작 + +창작 모드ì—서 월드를 ìƒì„±, 저장하거나 불러오면 해당 월드ì—서는 ë„ì „ 과제를 íšë“í•  수 없으며 ìˆœìœ„í‘œì— ê¸°ë¡ë˜ì§€ 않습니다. ì´í›„ 해당 월드를 ìƒì¡´ 모드ì—서 ë¶ˆëŸ¬ì™€ë„ ë§ˆì°¬ê°€ì§€ìž…ë‹ˆë‹¤. 계ì†í•˜ì‹œê² ìŠµë‹ˆê¹Œ? + +ì´ì „ì— ì°½ìž‘ 모드ì—서 ì €ìž¥ëœ ì›”ë“œìž…ë‹ˆë‹¤. ë„ì „ 과제를 íšë“í•  수 없으며 ìˆœìœ„í‘œì— ê¸°ë¡ë˜ì§€ 않습니다. 계ì†í•˜ì‹œê² ìŠµë‹ˆê¹Œ? + +ì´ì „ì— ì°½ìž‘ 모드ì—서 ì €ìž¥ëœ ì›”ë“œìž…ë‹ˆë‹¤. ë„ì „ 과제를 íšë“í•  수 없으며 ìˆœìœ„í‘œì— ê¸°ë¡ë˜ì§€ 않습니다. + +호스트 íŠ¹ê¶Œì„ ì¼œê³  월드를 ìƒì„±, 저장하거나 불러오면 해당 월드ì—서는 ë„ì „ 과제를 íšë“í•  수 없으며 ìˆœìœ„í‘œì— ê¸°ë¡ë˜ì§€ 않습니다. ì´í›„ 해당 ì˜µì…˜ì„ êº¼ë„ ë§ˆì°¬ê°€ì§€ìž…ë‹ˆë‹¤. 계ì†í•˜ì‹œê² ìŠµë‹ˆê¹Œ? + +ì†ìƒëœ 저장 ë°ì´í„° + +저장 ë°ì´í„°ê°€ ì†ìƒë˜ì—ˆìŠµë‹ˆë‹¤. 삭제하시겠습니까? + +ê²Œìž„ì— ì°¸ê°€í•œ 모든 플레ì´ì–´ì˜ ì—°ê²°ì„ ëŠê³ , 주 메뉴로 나가시겠습니까? 저장하지 ì•Šì€ ì§„í–‰ ìƒí™©ì€ 사ë¼ì§‘니다. + +저장하고 나가기 + +저장하지 않고 나가기 + +주 메뉴로 나가시겠습니까? 저장하지 ì•Šì€ ì§„í–‰ ìƒí™©ì€ 사ë¼ì§‘니다. + +주 메뉴로 나가시겠습니까? 게임 ì§„í–‰ ë‚´ìš©ì„ ìžƒê²Œ ë©ë‹ˆë‹¤! + +새 월드 만들기 + +튜토리얼 ì§„í–‰ + +튜토리얼 + +월드 ì´ë¦„ 지정 + +월드 ì´ë¦„ì„ ìž…ë ¥í•˜ì‹­ì‹œì˜¤. + +월드 ìƒì„± 시드를 입력하십시오. + +ì €ìž¥ëœ ì›”ë“œ 불러오기 + +ê²Œìž„ì— ì°¸ê°€í•˜ë ¤ë©´ START를 누르십시오. + +게임ì—서 나가는 중 + +오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. 주 메뉴로 ëŒì•„갑니다. + +ì—°ê²° 실패 + +ì—°ê²° ëŠì–´ì§ + +서버 ì—°ê²°ì´ ëŠì–´ì¡ŒìŠµë‹ˆë‹¤. 주 메뉴로 ëŒì•„갑니다. + +Xbox Live ì—°ê²°ì´ ëŠì–´ì¡ŒìŠµë‹ˆë‹¤. 주 메뉴로 ëŒì•„갑니다. + +Xbox Liveì™€ì˜ ì—°ê²°ì´ ëŠì–´ì¡ŒìŠµë‹ˆë‹¤. + +서버 ì—°ê²° ëŠê¹€ + +게임ì—서 추방ë˜ì—ˆìŠµë‹ˆë‹¤. + +비행으로 ì¸í•´ 게임ì—서 추방ë˜ì—ˆìŠµë‹ˆë‹¤. + +ì—°ê²° ì‹œë„ ì‹œê°„ì´ ì´ˆê³¼í–ˆìŠµë‹ˆë‹¤. + +서버가 꽉 찼습니다. + +호스트가 게임ì—서 나갔습니다. + +ì´ ê²Œìž„ì— ì°¸ê°€í•œ 친구가 없으므로 ê²Œìž„ì— ì°¸ê°€í•  수 없습니다. + +ì˜ˆì „ì— í˜¸ìŠ¤íŠ¸ê°€ ìžì‹ ì„ 추방했기 ë•Œë¬¸ì— ê²Œìž„ì— ì°¸ê°€í•  수 없습니다. + +참가하려는 플레ì´ì–´ê°€ ì´ ê²Œìž„ì˜ ì´ì „ ë²„ì „ì„ í”Œë ˆì´í•˜ê³  있으므로 ê²Œìž„ì— ì°¸ê°€í•  수 없습니다. + +참가하려는 플레ì´ì–´ê°€ ì´ ê²Œìž„ì˜ ë‹¤ìŒ ë²„ì „ì„ í”Œë ˆì´í•˜ê³  있으므로 ê²Œìž„ì— ì°¸ê°€í•  수 없습니다. + +새 월드 + +ìƒí’ˆì„ íšë“했습니다! + +만세! Minecraftì˜ Steveê°€ 그려진 게ì´ë¨¸ ì‚¬ì§„ì„ íšë“했습니다! + +만세! Creeperê°€ 그려진 게ì´ë¨¸ ì‚¬ì§„ì„ íšë“했습니다! + +만세! Minecraft: Xbox 360 Edition 티셔츠(아바타 ì•„ì´í…œ)를 íšë“했습니다! +대시보드ì—서 아바타ì—게 티셔츠를 입혀 보십시오. + +만세! Minecraft: Xbox 360 Edition ì†ëª©ì‹œê³„(아바타 ì•„ì´í…œ)를 íšë“했습니다! +대시보드ì—서 아바타ì—게 ì†ëª©ì‹œê³„를 채워주십시오. + +만세! Creeper 야구 모ìž(아바타 ì•„ì´í…œ)를 íšë“했습니다! +대시보드ì—서 아바타ì—게 모ìžë¥¼ 씌워주십시오. + +만세! Minecraft: Xbox 360 Edition 테마를 íšë“했습니다! +대시보드ì—서 테마를 ì ìš©í•´ 보십시오. + +ì •ì‹ ë²„ì „ 게임 구매 + +현재 ê²Œìž„ì€ í‰ê°€íŒ 버전입니다. ê²Œìž„ì„ ì €ìž¥í•˜ë ¤ë©´ ì •ì‹ ë²„ì „ì´ í•„ìš”í•©ë‹ˆë‹¤. +지금 ì •ì‹ ë²„ì „ ê²Œìž„ì„ êµ¬ë§¤í•˜ì‹œê² ìŠµë‹ˆê¹Œ? + +ì´ Minecraft: Xbox 360 Editionì€ í‰ê°€íŒìž…니다. ì •ì‹ ë²„ì „ 게임ì—서는 ë„ì „ 과제를 달성할 수 있습니다. +ì •ì‹ ë²„ì „ ê²Œìž„ì„ êµ¬ë§¤í•˜ë©´ Minecraft: Xbox 360 Editionì˜ ëª¨ë“  ê¸°ëŠ¥ì„ ì´ìš©í•˜ê³  Xbox Live를 통해 ì „ ì„¸ê³„ì˜ ì¹œêµ¬ë“¤ê³¼ 함께 ê²Œìž„ì„ ì¦ê¸¸ 수 있습니다. +ì •ì‹ ë²„ì „ ê²Œìž„ì„ êµ¬ë§¤í•˜ì‹œê² ìŠµë‹ˆê¹Œ? + +ì´ Minecraft: Xbox 360 Editionì€ í‰ê°€íŒìž…니다. ì •ì‹ ë²„ì „ 게임ì—서는 아바타 ìƒí’ˆì„ ë°›ì„ ìˆ˜ 있습니다! +ì •ì‹ ë²„ì „ ê²Œìž„ì„ êµ¬ë§¤í•˜ë©´ Minecraft: Xbox 360 Editionì˜ ëª¨ë“  ê¸°ëŠ¥ì„ ì´ìš©í•˜ê³  Xbox Live를 통해 ì „ ì„¸ê³„ì˜ ì¹œêµ¬ë“¤ê³¼ 함께 ì¦ê¸¸ 수 있습니다. +ì •ì‹ ë²„ì „ ê²Œìž„ì„ êµ¬ë§¤í•˜ì‹œê² ìŠµë‹ˆê¹Œ? + +ì´ Minecraft: Xbox 360 Editionì€ í‰ê°€íŒìž…니다. ì •ì‹ ë²„ì „ 게임ì—서는 게ì´ë¨¸ ì‚¬ì§„ì„ ë°›ì„ ìˆ˜ 있습니다! +ì •ì‹ ë²„ì „ ê²Œìž„ì„ êµ¬ë§¤í•˜ë©´ Minecraft: Xbox 360 Editionì˜ ëª¨ë“  ê¸°ëŠ¥ì„ ì´ìš©í•˜ê³  Xbox Live를 통해 ì „ ì„¸ê³„ì˜ ì¹œêµ¬ë“¤ê³¼ 함께 ì¦ê¸¸ 수 있습니다. +ì •ì‹ ë²„ì „ ê²Œìž„ì„ êµ¬ë§¤í•˜ì‹œê² ìŠµë‹ˆê¹Œ? + +ì´ Minecraft: Xbox 360 Editionì€ í‰ê°€íŒìž…니다. ì •ì‹ ë²„ì „ 게임ì—서는 테마를 ë°›ì„ ìˆ˜ 있습니다! +ì •ì‹ ë²„ì „ ê²Œìž„ì„ êµ¬ë§¤í•˜ë©´ Minecraft: Xbox 360 Editionì˜ ëª¨ë“  ê¸°ëŠ¥ì„ ì´ìš©í•˜ê³  Xbox Live를 통해 ì „ ì„¸ê³„ì˜ ì¹œêµ¬ë“¤ê³¼ 함께 ì¦ê¸¸ 수 있습니다. +ì •ì‹ ë²„ì „ ê²Œìž„ì„ êµ¬ë§¤í•˜ì‹œê² ìŠµë‹ˆê¹Œ? + +ì´ ê²Œìž„ì€ Minecraft: Xbox 360 Edition í‰ê°€íŒìž…니다. 초대를 수ë½í•˜ë ¤ë©´ ì •ì‹ ë²„ì „ ê²Œìž„ì´ í•„ìš”í•©ë‹ˆë‹¤. +ì •ì‹ ë²„ì „ ê²Œìž„ì„ êµ¬ë§¤í•˜ì‹œê² ìŠµë‹ˆê¹Œ? + +ì†ë‹˜ 플레ì´ì–´ëŠ” ì •ì‹ ë²„ì „ì„ êµ¬ë§¤í•  수 없습니다. Xbox Live ì‚¬ìš©ìž ID로 로그ì¸í•˜ì‹­ì‹œì˜¤. + +잠시 기다려 주십시오. + +ê²°ê³¼ ì—†ìŒ + +í•„í„°: + +친구 + +ë‚´ ì ìˆ˜ + +ì „ì²´ + +명단: + +순위 + +게ì´ë¨¸íƒœê·¸ + +레벨 저장 준비 중 + +ì´ê²ƒì €ê²ƒ 준비 중... + +마무리 중... + +지형 구축 중 + +월드 시뮬레ì´ì…˜ 중 + +서버 ì‹œë™ ì¤‘ + +출현 지역 ìƒì„± 중 + +출현 지역 불러오는 중 + +지하 ì§„ìž… 중 + +ì§€ìƒ ì§„ìž… 중 + +재ìƒì„± 중 + +레벨 ìƒì„± 중 + +레벨 불러오는 중 + +플레ì´ì–´ 저장 중 + +í˜¸ìŠ¤íŠ¸ì— ì—°ê²° 중 + +지형 다운로드 중 + +오프ë¼ì¸ 게임으로 전환하는 중 + +호스트가 ê²Œìž„ì„ ì €ìž¥í•˜ëŠ” ë™ì•ˆ 기다리십시오. + +Enderì— ë“¤ì–´ê°€ê¸° + +Enderì—서 나가기 + +월드 ìƒì„± 시드 찾는 중 + +ì´ ì¹¨ëŒ€ëŠ” 주ì¸ì´ 있습니다. + +ìž ì€ ë°¤ì—ë§Œ 잘 수 있습니다. + +%s ë‹˜ì´ ì¹¨ëŒ€ì—서 ìžê³  있습니다. ì‹œê°„ì„ ìƒˆë²½ìœ¼ë¡œ 건너뛰려면 모든 플레ì´ì–´ê°€ 잠들어야 합니다. + +침대가 사ë¼ì¡Œê±°ë‚˜ ìž¥ì• ë¬¼ì´ ë§‰ê³  있습니다. + +휴ì‹ì„ 취할 때가 아닙니다. ê·¼ì²˜ì— ê´´ë¬¼ì´ ìžˆìŠµë‹ˆë‹¤. + +침대ì—서 ìžê³  있습니다. ì‹œê°„ì„ ìƒˆë²½ìœ¼ë¡œ 건너뛰려면 모든 플레ì´ì–´ê°€ 잠들어야 합니다. + +ë„구 ë° ë¬´ê¸° + +무기 + +ì‹ëŸ‰ + +구조물 + +방어구 + +기계장치 + +ì´ë™ìˆ˜ë‹¨ + +장ì‹ë¬¼ + +ë¸”ë¡ ì§“ê¸° + +레드스톤 ë° ìš´ì†¡ + +기타 + +ì–‘ì¡° + +ì–‘ì¡° + +ë„구, 무기 ë° ë°©ì–´êµ¬ + +재료 + +로그아웃 + +게ì´ë¨¸ 프로필ì—서 로그아웃했으므로 타ì´í‹€ 화면으로 ëŒì•„갑니다. + +난ì´ë„ + +ìŒì•… + +사운드 + +ê°ë§ˆ + +게임 ê°ë„ + +ì¸í„°íŽ˜ì´ìФ ê°ë„ + +ë‚™ì› + +쉬움 + +보통 + +어려움 + +ì´ ëª¨ë“œì—서는 플레ì´ì–´ì˜ ì²´ë ¥ì´ ì‹œê°„ì— ë”°ë¼ ìžë™ìœ¼ë¡œ 회복ë˜ë©° ì ì´ 등장하지 않습니다. + +ì´ ëª¨ë“œì—서는 ì ì´ 나타나지만 보통 난ì´ë„보다 ê³µê²©ë ¥ì´ ì•½í•©ë‹ˆë‹¤. + +ì´ ëª¨ë“œì—서는 ì ì´ 나타나며, 플레ì´ì–´ì—게 ì¼ë°˜ ìˆ˜ì¤€ì˜ í”¼í•´ë¥¼ 입힙니다. + +ì´ ëª¨ë“œì—서는 ì ì´ 나타나며, 플레ì´ì–´ì—게 í° í”¼í•´ë¥¼ 입힙니다. Creeper는 플레ì´ì–´ê°€ 거리를 ë²Œë ¤ë„ í­ë°œì„ 취소하지 않으므로 조심해야 합니다! + +í‰ê°€íŒ 시간 만료 + +Minecraft: Xbox 360 Edition í‰ê°€íŒì„ 플레ì´í•  수 있는 ì‹œê°„ì´ ë§Œë£Œë˜ì—ˆìŠµë‹ˆë‹¤! ì •ì‹ ë²„ì „ ê²Œìž„ì„ êµ¬ë§¤í•˜ì—¬ 계ì†í•´ì„œ ê²Œìž„ì„ ì¦ê¸°ì‹œê² ìŠµë‹ˆê¹Œ? + +ì¸ì› 초과 + +빈ìžë¦¬ê°€ 없어서 ê²Œìž„ì— ì°¸ê°€í•˜ì§€ 못했습니다. + +서명 ìž…ë ¥ + +서명으로 사용할 í…스트를 입력하십시오. + +제목 ìž…ë ¥ + +게시물 ì œëª©ì„ ìž…ë ¥í•˜ì‹­ì‹œì˜¤. + +설명문 ìž…ë ¥ + +게시물 ì„¤ëª…ë¬¸ì„ ìž…ë ¥í•˜ì‹­ì‹œì˜¤. + +ë‚´ìš© ìž…ë ¥ + +게시물 ë‚´ìš©ì„ ìž…ë ¥í•˜ì‹­ì‹œì˜¤. + +소지품 + +재료 + +양조대 + +ìƒìž + +효과부여 + +화로 + +재료 + +연료 + +디스펜서 + +현재 ì´ ê²Œìž„ì—서 구매할 수 있는 해당 ìœ í˜•ì˜ ë‹¤ìš´ë¡œë“œ 콘í…츠가 없습니다. + +%së‹˜ì´ ê²Œìž„ì— ì°¸ê°€í–ˆìŠµë‹ˆë‹¤. + +%së‹˜ì´ ê²Œìž„ì„ ë– ë‚¬ìŠµë‹ˆë‹¤. + +%së‹˜ì„ ê²Œìž„ì—서 추방했습니다. + +저장한 ê²Œìž„ì„ ì‚­ì œí•˜ì‹œê² ìŠµë‹ˆê¹Œ? + +승ì¸ì„ 기다리는 중 + +확ì¸ë¨ + +í”Œë ˆì´ ì¤‘: + +설정 초기화 + +ì„¤ì •ì„ ê¸°ë³¸ê°’ìœ¼ë¡œ 초기화하시겠습니까? + +불러오기 오류 + +Minecraft: Xbox 360 Editionì„ ë¶ˆëŸ¬ì˜¤ëŠ” ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒí•˜ì—¬ 계ì†í•  수 없습니다. + +%s ë‹˜ì˜ ê²Œìž„ + +알 수 없는 호스트 게임 + +ì†ë‹˜ì´ ë¡œê·¸ì•„ì›ƒë¨ + +모든 ì†ë‹˜ 플레ì´ì–´ê°€ 게임ì—서 제거ë˜ì—ˆê¸° ë•Œë¬¸ì— ì†ë‹˜ 플레ì´ì–´ê°€ 로그아웃ë˜ì—ˆìŠµë‹ˆë‹¤. + +ë¡œê·¸ì¸ + +로그ì¸í•˜ì§€ 않았습니다. ì´ ê²Œìž„ì„ í”Œë ˆì´í•˜ë ¤ë©´ 로그ì¸í•´ì•¼ 합니다. 지금 로그ì¸í•˜ì‹œê² ìŠµë‹ˆê¹Œ? + +멀티 í”Œë ˆì´ í—ˆìš©ë˜ì§€ ì•ŠìŒ + +한 명 ì´ìƒì˜ 플레ì´ì–´ê°€ Xbox Live 멀티 í”Œë ˆì´ ê²Œìž„ì„ í”Œë ˆì´í•  수 없어 ê²Œìž„ì— ì°¸ê°€í•  수 없습니다. + +한 명 ì´ìƒì˜ 플레ì´ì–´ê°€ Xbox Live 멀티 í”Œë ˆì´ ê²Œìž„ì„ í”Œë ˆì´í•  수 없어 온ë¼ì¸ ê²Œìž„ì„ ë§Œë“¤ 수 없습니다. 오프ë¼ì¸ ê²Œìž„ì„ ì‹œìž‘í•˜ë ¤ë©´ "온ë¼ì¸ 게임"ì˜ ì„ íƒì„ 해제하십시오. + +멤버 콘í…츠 권한 설정 제한 범위가 너무 높아 게임 ì„¸ì…˜ì— ì°¸ê°€í•  수 없습니다. ì„¸ì…˜ì— ì°¸ê°€í•˜ë ¤ë©´ Xbox ëŒ€ì‹œë³´ë“œì˜ ê°œì¸ ì •ë³´ 보호 ë° ì˜¨ë¼ì¸ 설정ì—서 해당 ì„¤ì •ì„ ë³€ê²½í•˜ì‹­ì‹œì˜¤. + +로컬 플레ì´ì–´ 중 한 명 ì´ìƒì˜ 멤버 콘í…츠 권한 설정 제한 범위가 너무 높아 게임 ì„¸ì…˜ì— ì°¸ê°€í•  수 없습니다. + +세션 ë‚´ì˜ í”Œë ˆì´ì–´ê°€ 멤버 콘í…츠 권한 설정 ì œí•œì„ [친구만]으로 설정하였습니다. 해당 플레ì´ì–´ì˜ 친구 목ë¡ì— 등ë¡ë˜ì§€ 않았으므로 게임 ì„¸ì…˜ì— ì°¸ê°€í•  수 없습니다. + +ê²Œìž„ì„ ìƒì„±í•˜ì§€ 못했습니다. + +로컬 플레ì´ì–´ 중 한 명 ì´ìƒì˜ 멤버 콘í…츠 권한 설정 제한 범위가 너무 높아 게임 ì„¸ì…˜ì„ ìƒì„±í•  수 없습니다. '온ë¼ì¸ 게임' ìƒìžì˜ ì„ íƒì„ 해제하여 오프ë¼ì¸ ê²Œìž„ì„ ì‹œìž‘í•˜ê±°ë‚˜ Xbox ëŒ€ì‹œë³´ë“œì˜ [ê°œì¸ ì •ë³´ 보호 ë° ì˜¨ë¼ì¸ 설정]ì—서 해당 ì„¤ì •ì„ ë³€ê²½í•˜ì‹­ì‹œì˜¤. + +ìžë™ ì„ íƒ + +팩 ì—†ìŒ: 기본 ìºë¦­í„° + +ì¦ê²¨ì°¾ëŠ” ìºë¦­í„° + +차단 레벨 + +참가하려는 ê²Œìž„ì€ ì°¨ë‹¨ 레벨 목ë¡ì— 들어 있습니다. +게임 참가를 ì„ íƒí•˜ë©´ 해당 ë ˆë²¨ì´ ì°¨ë‹¨ 레벨 목ë¡ì—서 제거ë©ë‹ˆë‹¤. + +ì´ ë ˆë²¨ì„ ì°¨ë‹¨í•˜ì‹œê² ìŠµë‹ˆê¹Œ? + +ì´ ë ˆë²¨ì„ ì°¨ë‹¨ 레벨 목ë¡ì— 추가하시겠습니까? +확ì¸ì„ ì„ íƒí•˜ë©´ ë™ì‹œì— 게임ì—서 나가게 ë©ë‹ˆë‹¤. + +차단 목ë¡ì—서 제거 + +ìžë™ 저장 간격 + +ìžë™ 저장 간격: êº¼ì§ + +ë¶„ + +ì—¬ê¸°ì— ë†“ì„ ìˆ˜ 없습니다! + +ìš©ì•”ì„ ë ˆë²¨ 출현 ì§€ì  ê·¼ì²˜ì— ë†“ì„ ìˆ˜ 없습니다. 플레ì´ì–´ê°€ 시작 ì§€ì ì—서 바로 ì£½ì„ ìˆ˜ 있기 때문입니다. + +ì´ ê²Œìž„ì€ ë ˆë²¨ ìžë™ 저장 ê¸°ëŠ¥ì„ ì§€ì›í•©ë‹ˆë‹¤. ìœ„ì— ë³´ì´ëŠ” ì•„ì´ì½˜ì€ ê²Œìž„ì„ ì €ìž¥í•˜ëŠ” ì¤‘ìž„ì„ ë‚˜íƒ€ë‚´ëŠ” 것입니다. +ì´ ì•„ì´ì½˜ì´ í™”ë©´ì— ìžˆì„ ë•Œ Xbox 360 본체를 ë„ì§€ 마십시오. + +ì¸í„°íŽ˜ì´ìФ íˆ¬ëª…ë„ + +레벨 ìžë™ 저장 준비 중 + +HUD í¬ê¸° + +HUD í¬ê¸° (ë¶„í•  화면) + +시드 + +ìºë¦­í„° 팩 íšë“ + +ì„ íƒí•œ ìºë¦­í„°ë¥¼ 사용하려면 ìºë¦­í„° íŒ©ì„ íšë“해야 합니다. +지금 ìºë¦­í„° íŒ©ì„ íšë“하시겠습니까? + +í…스처 팩 잠금 í•´ì œ + +ì´ í…스처 íŒ©ì„ ì‚¬ìš©í•˜ë ¤ë©´ 먼저 ìž ê¸ˆì„ í•´ì œí•´ì•¼ 합니다. +지금 잠금 해제하시겠습니까? + +í…스처 팩 í‰ê°€íŒ + +í…스처 íŒ©ì˜ í‰ê°€íŒì„ 사용 중입니다. ì •ì‹ ë²„ì „ì„ êµ¬ìž…í•˜ê¸° ì „ì—는 ì´ ì›”ë“œë¥¼ 저장할 수 없습니다. +í…스처 팩 ì •ì‹ ë²„ì „ì„ êµ¬ìž…í•˜ì‹œê² ìŠµë‹ˆê¹Œ? + +í…스처 팩 ì—†ìŒ + +ì •ì‹ ë²„ì „ 구입 + +í‰ê°€íŒ 다운로드 + +ì •ì‹ ë²„ì „ 다운로드 + +여기ì—는 í…스처 팩 ë˜ëŠ” 매시업 íŒ©ì´ í•„ìš”í•˜ë©° 현재 가지고 있지 않습니다! +지금 í…스처 팩 ë˜ëŠ” 매시업 íŒ©ì„ ì„¤ì¹˜í•˜ì‹œê² ìŠµë‹ˆê¹Œ? + +í‰ê°€íŒ 받기 + +ì •ì‹ ë²„ì „ 받기 + +플레ì´ì–´ 추방 + +ì´ í”Œë ˆì´ì–´ë¥¼ 게임ì—서 추방하시겠습니까? 추방당한 플레ì´ì–´ëŠ” 월드를 다시 시작하기 전까지 참가할 수 없습니다. + +게ì´ë¨¸ 사진 팩 + +테마 + +ìºë¦­í„° 팩 + +ì¹œêµ¬ì˜ ì¹œêµ¬ë„ ì°¸ê°€ 가능 + +ì´ ê²Œìž„ì€ í˜¸ìŠ¤íŠ¸ì˜ ì¹œêµ¬ë§Œ 플레ì´í•  수 있ë„ë¡ ì œí•œë˜ì–´ì„œ 참가할 수 없습니다. + +ê²Œìž„ì— ì°¸ê°€í•  수 ì—†ìŒ + +ì„ íƒ ë¨ + +ì„ íƒëœ ìºë¦­í„°: + +ì†ìƒëœ 다운로드 콘í…츠 + +ì´ ë‹¤ìš´ë¡œë“œ 콘í…츠는 ì†ìƒë˜ì–´ì„œ ì‚¬ìš©ë  ìˆ˜ 없습니다. 해당 콘í…츠를 삭제한 ë‹¤ìŒ Minecraft ìƒì  메뉴ì—서 재설치하십시오. + +ì¼ë¶€ 다운로드 콘í…츠가 ì†ìƒë˜ì–´ ì‚¬ìš©ë  ìˆ˜ 없습니다. 해당 콘í…츠를 삭제한 ë‹¤ìŒ Minecraft ìƒì  메뉴ì—서 재설치하십시오. + +게임 모드가 변경ë˜ì—ˆìŠµë‹ˆë‹¤. + +월드 ì´ë¦„ 바꾸기 + +ì›”ë“œì˜ ìƒˆ ì´ë¦„ì„ ìž…ë ¥í•˜ì‹­ì‹œì˜¤. + +게임 모드: ìƒì¡´ + +게임 모드: 창작 + +ìƒì¡´ + +창작 + +ìƒì¡´ 모드ì—서 ìƒì„± + +창작 모드ì—서 ìƒì„± + +구름 ë Œë”ë§ + +ì´ ì €ìž¥ëœ ê²Œìž„ì„ ì–´ë–»ê²Œ 하시겠습니까? + +ì €ìž¥ëœ ê²Œìž„ ì´ë¦„ 바꾸기 + +%dì´ˆ í›„ì— ìžë™ 저장 실행... + +ì¼œì§ + +êº¼ì§ + +ì¼ë°˜ + +완전í‰ë©´ + +ì´ ì˜µì…˜ì„ ì¼œë©´ 온ë¼ì¸ 게임으로 플레ì´í•©ë‹ˆë‹¤. + +ì´ ì˜µì…˜ì„ ì¼œë©´ ì´ˆëŒ€ë°›ì€ í”Œë ˆì´ì–´ë§Œ ê²Œìž„ì— ì°¸ê°€í•  수 있습니다. + +ì´ ì˜µì…˜ì„ ì¼œë©´ 친구 목ë¡ì— 있는 ì‚¬ëžŒì˜ ì¹œêµ¬ê°€ ê²Œìž„ì— ì°¸ê°€í•  수 있습니다. + +ì´ ì˜µì…˜ì„ ì¼œë©´ 플레ì´ì–´ë¼ë¦¬ 서로 피해를 ìž…íž ìˆ˜ 있습니다. ìƒì¡´ 모드ì—ë§Œ ì ìš©ë©ë‹ˆë‹¤. + +ì´ ì˜µì…˜ì„ ë„ë©´ ê²Œìž„ì— ì°¸ê°€í•œ 플레ì´ì–´ëŠ” ì¸ì¦ì„ 받기 전까지 ê±´ë¬¼ì„ ì§“ê±°ë‚˜ 채굴할 수 없습니다. + +ì´ ì˜µì…˜ì„ ì¼œë©´ ë¶ˆì´ ê·¼ì²˜ì˜ ê°€ì—°ì„± 블ë¡ìœ¼ë¡œ 번집니다. + +ì´ ì˜µì…˜ì„ ì¼œë©´ TNTê°€ ìž‘ë™í•  때 í­ë°œí•©ë‹ˆë‹¤. + +ì´ ì˜µì…˜ì„ ì¼œë©´ 호스트는 게임 메뉴ì—서 플레ì´ì–´ì—게 비행 ëŠ¥ë ¥ì„ ì£¼ê±°ë‚˜, 지치지 않게 하거나, 투명하게 만들 수 있습니다. ë„ì „ 과제를 íšë“í•  수 없으며 ìˆœìœ„í‘œì— ê¸°ë¡ë˜ì§€ 않습니다. + +ì´ ì˜µì…˜ì„ ì¼œë©´ 지하 월드가 재건ë©ë‹ˆë‹¤. ì‚¬ì „ì— ì§€í•˜ 요새가 없는 ê³³ì— ë¯¸ë¦¬ 저장하면 유용합니다. + +ì´ ì˜µì…˜ì„ ì¼œë©´ 마ì„ì´ë‚˜ 요새 ë“±ì˜ ê±´ë¬¼ì´ ì›”ë“œì— ìƒì„±ë©ë‹ˆë‹¤. + +ì´ ì˜µì…˜ì„ ì¼œë©´ ì§€ìƒê³¼ ì§€í•˜ì— ì™„ì „ížˆ í‰í‰í•œ 세계가 ìƒì„±ë©ë‹ˆë‹¤. + +ì´ ì˜µì…˜ì„ ì¼œë©´ 쓸모있는 ì•„ì´í…œì´ ë“  ìƒìžê°€ 플레ì´ì–´ ìƒì„± ì§€ì  ê·¼ì²˜ì— ë‚˜íƒ€ë‚©ë‹ˆë‹¤. + +스킨 팩 + +테마 + +게ì´ë¨¸ 사진 + +아바타 ì•„ì´í…œ + +í…스처 팩 + +매시업 팩 + +{*PLAYER*} ë¶ˆê½ƒì— íœ©ì‹¸ì—¬ 타오름 + +{*PLAYER*} 불타서 ì‚¬ë§ + +{*PLAYER*} 용암ì—서 ìˆ˜ì˜ ì‹œë„ + +{*PLAYER*} ë²½ì— ë¼ì–´ 질ì‹ì‚¬ + +{*PLAYER*} ìµì‚¬ + +{*PLAYER*} 배고파서 ì‚¬ë§ + +{*PLAYER*} 찔려서 ì‚¬ë§ + +{*PLAYER*} ë•…ì— ë„ˆë¬´ 세게 ì¶©ëŒ + +{*PLAYER*} 월드 밖으로 ë–¨ì–´ì§ + +{*PLAYER*} ì‚¬ë§ + +{*PLAYER*} í­ë°œ + +{*PLAYER*} ë§ˆë²•ì— ì˜í•´ ì‚¬ë§ + +{*PLAYER*} Ender 드래곤 ë¸Œë ˆìŠ¤ì— ì˜í•´ ì‚¬ë§ + +{*PLAYER*} {*SOURCE*}ì— ì˜í•´ ì‚¬ë§ + +{*PLAYER*} {*SOURCE*}ì— ì˜í•´ ì‚¬ë§ + +{*PLAYER*} {*SOURCE*}ì˜ ì›ê±°ë¦¬ ê³µê²©ì— ì˜í•´ ì‚¬ë§ + +{*PLAYER*} {*SOURCE*}ì˜ í™”ì—¼êµ¬ì— ì˜í•´ ì‚¬ë§ + +{*PLAYER*} {*SOURCE*}ì— íƒ€ê²©ì— ì˜í•´ ì‚¬ë§ + +{*PLAYER*}ë‹˜ì´ {*SOURCE*}ì— ì˜í•´ 살해당했습니다. + +기반암 안개 + +HUD 표시 + +ì† í‘œì‹œ + +ë¶„í•  화면 게ì´ë¨¸íƒœê·¸ + +ì‚¬ë§ ë©”ì‹œì§€ + +ìºë¦­í„° 애니메ì´ì…˜ + +ì‚¬ìš©ìž ì§€ì • 스킨 애니메ì´ì…˜ + +채굴하거나 ì•„ì´í…œì„ 사용할 수 없습니다. + +채굴하거나 ì•„ì´í…œì„ 사용할 수 있습니다. + +블ë¡ì„ ë†“ì„ ìˆ˜ 없습니다. + +블ë¡ì„ ë†“ì„ ìˆ˜ 있습니다. + +문과 스위치를 사용할 수 있습니다. + +문과 스위치를 사용할 수 없습니다. + +보관함(예; ìƒìž)ì„ ì‚¬ìš©í•  수 있습니다. + +보관함(예; ìƒìž)ì„ ì‚¬ìš©í•  수 없습니다. + +괴물 ë° ë™ë¬¼ì„ 공격할 수 없습니다. + +괴물 ë° ë™ë¬¼ì„ 공격할 수 있습니다. + +플레ì´ì–´ë¥¼ 공격할 수 없습니다. + +플레ì´ì–´ë¥¼ 공격할 수 있습니다. + +ë™ë¬¼ì„ 공격할 수 없습니다. + +ë™ë¬¼ì„ 공격할 수 있습니다. + +관리ìžê°€ ë˜ì—ˆìŠµë‹ˆë‹¤. + +관리ìžì—서 í•´ìž„ë˜ì—ˆìŠµë‹ˆë‹¤. + +ë‚  수 있습니다. + +ë‚  수 없습니다. + +지치지 않습니다. + +지치게 ë©ë‹ˆë‹¤. + +투명 ìƒíƒœê°€ ë˜ì—ˆìŠµë‹ˆë‹¤. + +투명 ìƒíƒœê°€ í•´ì œë˜ì—ˆìŠµë‹ˆë‹¤. + +ë¬´ì  ìƒíƒœê°€ ë˜ì—ˆìŠµë‹ˆë‹¤. + +ë¬´ì  ìƒíƒœê°€ í•´ì œë˜ì—ˆìŠµë‹ˆë‹¤. + +%d MSP + +Ender 드래곤 + +%s ë‹˜ì´ Enderì— ë“¤ì–´ê°”ìŠµë‹ˆë‹¤. + +%s ë‹˜ì´ Enderì—서 나갔습니다. + + +{*C3*}네가 ë§í•œ 플레ì´ì–´ê°€ ë³´ì—¬.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}, ë§ì´ì•¼?{*EF*}{*B*}{*B*} +{*C3*}그래. 조심해. ì´ì œ ë” ë†’ì€ ë‹¨ê³„ì— ë„달해서 우리 ìƒê°ì„ ì½ì„ 수 있어.{*EF*}{*B*}{*B*} +{*C2*}ìƒê´€ì—†ì–´. 어차피 우리는 ê²Œìž„ì˜ ì¼ë¶€ë¼ê³  ìƒê°í•  거야.{*EF*}{*B*}{*B*} +{*C3*}난 ì´ í”Œë ˆì´ì–´ê°€ 마ìŒì— 들어. ë©‹ì§„ 플레ì´ë¥¼ 보여줬고 절대 í¬ê¸°í•˜ì§€ 않았잖아.{*EF*}{*B*}{*B*} +{*C2*}우리 ìƒê°ì„ 마치 게임 ì† ë‹¨ì–´ì²˜ëŸ¼ ì½ê³  있어.{*EF*}{*B*}{*B*} +{*C3*}ê²Œìž„ì˜ ê¿ˆì— ê¹Šì´ ë¹ ì ¸ìžˆì„ ë•Œ ë§Žì€ ê²ƒë“¤ì„ ìƒìƒí•˜ê¸° 위해 ì„ íƒí•œ 방법ì´ì•¼.{*EF*}{*B*}{*B*} +{*C2*}단어는 ì„œë¡œì˜ ìƒê°ì„ ì†Œí†µí•˜ê¸°ì— ì¢‹ì€ ë°©ë²•ì´ì•¼. 유연하잖아. 화면 ë’¤ì˜ í˜„ì‹¤ì„ ì‘시하는 것보다 ëœ ë¬´ì„­ê³ .{*EF*}{*B*}{*B*} +{*C3*}플레ì´ì–´ê°€ ì½ì„ 수 있기 전까지는 목소리를 들었지. 예전엔 플레ì´í•˜ì§€ ì•Šë˜ ì‚¬ëžŒë“¤ì€ í”Œë ˆì´ì–´ë¥¼ 마녀나 마법사ë¼ê³  불렀어. 그리고 플레ì´ì–´ëŠ” ì•…ë§ˆì˜ íž˜ì´ ê¹ƒë“  ë¹—ìžë£¨ë¥¼ 타고 í•˜ëŠ˜ì„ ë‚ ì•„ë‹¤ë‹ˆëŠ” ê¿ˆì„ ê¿¨ê³ .{*EF*}{*B*}{*B*} +{*C2*}ì´ í”Œë ˆì´ì–´ëŠ” ì–´ë–¤ ê¿ˆì„ ê¿¨ì„까?{*EF*}{*B*}{*B*} +{*C3*}ì´ í”Œë ˆì´ì–´ëŠ” 햇살과 나무 그리고 불과 ë¬¼ì— ê´€í•œ ê¿ˆì„ ê¿¨ì–´. ì´ ëª¨ë“  ê²ƒë“¤ì„ ë§Œë“¤ì–´ë‚´ê³  파괴하는 ê¿ˆì„ ê¿¨ì§€. 그리고 사냥하고 사냥당하는 꿈과 보금ìžë¦¬ì— 관한 ê¿ˆì„ ê¿¨ì–´.{*EF*}{*B*}{*B*} +{*C2*}ì•„, 예전 ì¸í„°íŽ˜ì´ìФ ë§ì´êµ¬ë‚˜. 백만 ë…„ë„ ë” ë지만 ì•„ì§ë„ ìž‘ë™í•˜ì§€. ê·¸ëŸ°ë° ì´ í”Œë ˆì´ì–´ëŠ” 화면 ë’¤ì˜ í˜„ì‹¤ì—서 실제로 ì–´ë–¤ ê²ƒë“¤ì„ ë§Œë“¤ì—ˆì„까?{*EF*}{*B*}{*B*} +{*C3*}ìˆ˜ë§Žì€ ì‚¬ëžŒë“¤ê³¼ {*EF*}{*NOISE*}{*C3*} 사ì´ì— ì§„ì‹¤ëœ ì„¸ìƒì„ 만들고 {*EF*}{*NOISE*}{*C3*} ì†ì—서 {*EF*}{*NOISE*}{*C3*}를 위해 {*EF*}{*NOISE*}{*C3*}를 만들었어.{*EF*}{*B*}{*B*} +{*C2*}ê·¸ ìƒê°ì€ ì•„ì§ ì½ì§€ 못해.{*EF*}{*B*}{*B*} +{*C3*}그래, ì•„ì§ ê°€ìž¥ ë†’ì€ ë‹¨ê³„ì—는 ë„달하지 못했으니까. 게임ì´ë¼ëŠ” ì§§ì€ ê¿ˆì—서는 ë„달할 수 없지만 기나긴 ì¸ìƒì˜ 꿈ì†ì—서 ë„달하게 ë  ê±°ì•¼.{*EF*}{*B*}{*B*} +{*C2*}우리가 사랑하고 있다는 걸 알고 있ì„까? 그리고 세ìƒì´ 아름답고 다정하다는 ê±´?{*EF*}{*B*}{*B*} +{*C3*}ìƒê°ì˜ ìž¡ìŒ ì†ì—서 간혹 세ìƒì˜ 소리를 들으니 알고 ìžˆì„ ê±°ì•¼.{*EF*}{*B*}{*B*} +{*C2*}하지만 긴 꿈ì†ì—서 슬플 ë•Œë„ ìžˆì–´. ì—¬ë¦„ì´ ì—†ëŠ” 세ìƒì„ 만들고 ê²€ì€ íƒœì–‘ 아래ì—서 ë‘ë ¤ì›€ì— ë–¨ë©° í˜„ì‹¤ì˜ ìŠ¬í”ˆ ì°½ì¡°ë¬¼ì„ ì›€ì¼œìž¡ê³  있지.{*EF*}{*B*}{*B*} +{*C3*}ê·¸ì˜ ìŠ¬í””ì„ ì¹˜ìœ í•˜ë©´ 그를 ë§ì¹˜ê²Œ ë  ê±°ì•¼. ìŠ¬í””ì€ ì§ì ‘ 풀어야 하는 과제ì´ë‹ˆê¹Œ. 우리는 그걸 방해하면 안 ë¼.{*EF*}{*B*}{*B*} +{*C2*}ë§í•´ì£¼ê³  ì‹¶ì–´. 때로는 ê·¸ë“¤ì´ ê¿ˆì†ì— ê¹Šì€ ê³³ì—서 현실 ì†ì˜ 진정한 세ìƒì„ 만들고 있다는 걸. ë˜ ê·¸ë“¤ì´ ì„¸ìƒì—서 얼마나 중요한 존재ì¸ì§€ ë§í•´ì£¼ê³  ì‹¶ì–´. ê·¸ë“¤ì´ ì§„ì •í•œ 관계를 맺지 못하고 ìžˆì„ ë•Œ ê·¸ë“¤ì´ ë‘려워하는 바를 ë§í•  수 있ë„ë¡ ë„와주고 ì‹¶ì–´.{*EF*}{*B*}{*B*} +{*C3*}우리 ìƒê°ì„ ì½ê³  있어.{*EF*}{*B*}{*B*} +{*C2*}난 ì‹ ê²½ ì“°ì§€ 않아. 그들ì—게 ë§í•´ì£¼ê³  ì‹¶ì–´. 세ìƒì˜ ì§„ì‹¤ì€ ë‹¨ì§€ {*EF*}{*NOISE*}{*C2*}하고 {*EF*}{*NOISE*}{*C2*} í•  ë¿ì´ëž€ 걸 ë§ì´ì•¼. ë˜ ê·¸ë“¤ì€ {*EF*}{*NOISE*}{*C2*}ì—서 {*EF*}{*NOISE*}{*C2*}하고 ìžˆì„ ë¿ì´ëž€ ê²ƒë„ ë§í•´ì£¼ê³  ì‹¶ì–´. ê·¸ë“¤ì€ ê¸°ë‚˜ê¸´ 꿈ì†ì—서 í˜„ì‹¤ì˜ ì•„ì£¼ ìž‘ì€ ë¶€ë¶„ë§Œì„ ë³´ê³  있어.{*EF*}{*B*}{*B*} +{*C3*}그렇다 하ë”ë¼ë„ ê·¸ë“¤ì€ ê²Œìž„ì„ í•˜ê³  있잖아.{*EF*}{*B*}{*B*} +{*C2*}하지만 그들ì—게 ë§ì„ 전하기는 어렵지 않아...{*EF*}{*B*}{*B*} +{*C3*}ì´ ê¿ˆì—서는 안 ë¼. 그들ì—게 어떻게 살아야 하는지 ë§í•´ì£¼ëŠ” ê±´ ê·¸ë“¤ì˜ ì‚¶ì„ ë°©í•´í•˜ëŠ” 거야.{*EF*}{*B*}{*B*} +{*C2*}플레ì´ì–´ì—게 어떻게 살아야 하는지 ë§í•˜ë ¤ëŠ” 게 아니야.{*EF*}{*B*}{*B*} +{*C3*}플레ì´ì–´ëŠ” ëì—†ì´ ì„±ìž¥í•˜ê³  있어.{*EF*}{*B*}{*B*} +{*C2*}플레ì´ì–´ì—게 ì´ì•¼ê¸°ë¥¼ 들려줄 거야.{*EF*}{*B*}{*B*} +{*C3*}하지만 ì§„ì‹¤ì´ ì•„ë‹ˆìž–ì•„.{*EF*}{*B*}{*B*} +{*C2*}그래. ì´ì•¼ê¸°ì—는 ë‹¨ì–´ì˜ í‹€ì—서만 ì§„ì‹¤ì„ ë‹´ê³  있겠지. 떨어져 있기 ë•Œë¬¸ì— ê¸ˆë°©ì´ë¼ë„ 사ë¼ì§ˆ 수 있는 ì ë‚˜ë¼í•œ ì§„ì‹¤ì€ ì•„ë‹ˆì•¼.{*EF*}{*B*}{*B*} +{*C3*}ê·¸ì—게 다시 ìœ¡ì‹ ì„ ì¤˜.{*EF*}{*B*}{*B*} +{*C2*}그래. 플레ì´ì–´...{*EF*}{*B*}{*B*} +{*C3*}ì´ì œ ì´ë¦„으로 불러.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. ì´ ê²Œìž„ì˜ í”Œë ˆì´ì–´.{*EF*}{*B*}{*B*} +{*C3*}좋아.{*EF*}{*B*}{*B*} + + + +{*C2*}ì´ì œ í¬ê²Œ 심호í¡ì„ í•´. 한 번 ë”. í ì† ê°€ë“한 공기를 ëŠê»´ë´. 팔다리가 ëŒì•„오ë„ë¡ í•˜ëŠ” 거야. 그래, ì†ê°€ë½ì„ 움ì§ì—¬ë´. 중력 아래서 ëª¸ì„ ë‹¤ì‹œ 갖게 ë˜ëŠ” ê±°ì§€. 네가 다른 ì¡´ìž¬ì¸ ê²ƒì²˜ëŸ¼ 우리가 다른 ì¡´ìž¬ì¸ ê²ƒì²˜ëŸ¼ 네 ëª¸ì´ ë‹¤ì‹œ 세ìƒê³¼ 만나는 거야.{*EF*}{*B*}{*B*} +{*C3*}우리가 누구ëƒê³ ? 한때는 ì‚°ì˜ ì •ë ¹ìœ¼ë¡œ 불렸지. 아버지 태양, 어머니 달. ê³ ëŒ€ì˜ ì˜í˜¼, ë™ë¬¼ì˜ ì˜í˜¼. ì •ë ¹. 유령. 대ìžì—°. 그리고 ì‹ , 악마. 천사. í´í„°ê°€ì´ìŠ¤íŠ¸. 외계ì¸, 우주ì¸. 렙톤, 쿼í¬. 우리를 부르는 단어는 다양했지만 우리는 변하지 않았어.{*EF*}{*B*}{*B*} +{*C2*}우리가 ì„¸ìƒ ê·¸ ìžì²´ì•¼. 네가 ìƒê°í•˜ëŠ” 너 ì´ì™¸ì˜ 모든 ê²ƒì´ ë°”ë¡œ 우리지. 지금 넌 ë„ˆì˜ í”¼ë¶€ì™€ ëˆˆì„ í†µí•´ 우리를 ë³´ê³  있어. 왜 세ìƒì´ ë„ˆì˜ í”¼ë¶€ë¥¼ 통해 êµê°í•˜ê³  네게 ë¹›ì„ ë¹„ì¶œê¹Œ? 플레ì´ì–´ì¸ ë„ ë³´ê¸° 위해서야. ë„ˆì— ëŒ€í•´ 알고 네가 세ìƒì— 대해 알 수 있ë„ë¡ ë§ì´ì•¼. ì´ì œ 네게 ì´ì•¼ê¸°ë¥¼ 하나 들려줄게.{*EF*}{*B*}{*B*} +{*C2*}아주 ì˜¤ëž˜ì „ì— í”Œë ˆì´ì–´ê°€ 있었어.{*EF*}{*B*}{*B*} +{*C3*}ê·¸ 플레ì´ì–´ëŠ” 바로 {*PLAYER*}, 너야. {*EF*}{*B*}{*B*} +{*C2*}용암으로 ì´ë£¨ì–´ì§„ 회전하는 ì§€êµ¬ì˜ ì–‡ì€ í‘œë©´ 위ì—서 그는 ìžì‹ ì„ ì¸ê°„ì´ë¼ê³  ìƒê°í–ˆì–´. ê·¸ 용암 ë©ì–´ë¦¬ëŠ” ì§ˆëŸ‰ì´ 33ë§Œ ë°° ë” ë¬´ê±°ìš´ 불타는 가스 ë©ì–´ë¦¬ë¥¼ ëŒê³  있었지. ê·¸ 둘 사ì´ì˜ 거리는 ë¹›ì˜ ì†ë„로 8ë¶„ì´ë‚˜ 걸리는 먼 거리였어. ë¹›ì€ ë©€ë¦¬ 떨어져 있는 ë³„ì˜ ì •ë³´ì˜€ê³  1ì–µ 5천 킬로미터 거리ì—ì„œë„ ë„¤ 피부를 태울 수 있지.{*EF*}{*B*}{*B*} +{*C2*}ì´ë”°ê¸ˆ 플레ì´ì–´ëŠ” í‰í‰í•˜ê³  ëì´ ì—†ëŠ” 세ìƒì—서 ìžì‹ ì´ 광부가 ë˜ëŠ” ê¿ˆì„ ê¿¨ì–´. ê·¸ê³³ì˜ íƒœì–‘ì€ í•˜ì–—ê³  사ê°í˜•으로 ë˜ì–´ 있었어. 하루는 짧았고 해야 í•  ì¼ì€ 많았지. 그리고 죽ìŒì€ 단지 ìž ê¹ì˜ 불편함ì´ì—ˆì–´.{*EF*}{*B*}{*B*} +{*C3*}ì´ë”°ê¸ˆ 플레ì´ì–´ëŠ” ì´ì•¼ê¸° ì†ì—서 ê¸¸ì„ ìžƒëŠ” ê¿ˆì„ ê¿¨ì–´.{*EF*}{*B*}{*B*} +{*C2*}ì´ë”°ê¸ˆ 플레ì´ì–´ëŠ” 다른 ê³³ì—서 다른 존재가 ë˜ëŠ” ê¿ˆì„ ê¿¨ì–´. 그리고 ê°€ë” ì´ ê¿ˆë“¤ì€ ë°©í•´ë¥¼ 받았어. ê°€ë”ì€ ì •ë§ ì•„ë¦„ë‹¤ì› ì§€. ì´ë”°ê¸ˆ 플레ì´ì–´ëŠ” 꿈ì—서 깨어 다른 꿈으로 들어갔고 ë˜ ê·¸ 꿈ì—서 깨어 다른 꿈으로 들어갔어.{*EF*}{*B*}{*B*} +{*C3*}ì´ë”°ê¸ˆ 플레ì´ì–´ëŠ” í™”ë©´ì˜ ë‹¨ì–´ë¥¼ 보는 ê¿ˆì„ ê¿¨ì§€.{*EF*}{*B*}{*B*} +{*C2*}ì´ì œ 과거로 ëŒì•„ê°€ ë³´ìž.{*EF*}{*B*}{*B*} +{*C2*}플레ì´ì–´ì˜ ì›ìžëŠ” ì´ˆì›ì—, ê°•ì—, 공기ì—, ë•…ì— í©ì–´ì ¸ 있었어. ì—¬ìžê°€ ê·¸ ì›ìžë¥¼ 모아 마시고 먹고 들ì´ë§ˆì…” 한대 모아 ê·¸ë…€ì˜ ëª¸ 안ì—서 플레ì´ì–´ë¥¼ 만든 거야.{*EF*}{*B*}{*B*} +{*C2*}그렇게 플레ì´ì–´ëŠ” 아늑하고 ì–´ë‘ìš´ ì–´ë¨¸ë‹ˆì˜ ëª¸ì†ì—서 깨어나 긴 ê¿ˆì˜ ì„¸ê³„ë¡œ 들어간 거야.{*EF*}{*B*}{*B*} +{*C2*}플레ì´ì–´ëŠ” DNA로 쓰여진 한 ë²ˆë„ ë“¤ì–´ë³¸ ì ì´ 없는 새로운 ì´ì•¼ê¸°ì˜€ì–´. 플레ì´ì–´ëŠ” 수십억 ë…„ ëœ ì†ŒìŠ¤ 코드로 ìƒì„±ëœ 한 ë²ˆë„ ì‹¤í–‰í•´ë³¸ ì ì´ 없는 새로운 프로그램ì´ì—ˆì–´. 플레ì´ì–´ëŠ” 무ì—서 ì –ê³¼ 사랑으로부터 탄ìƒí•œ 한 ë²ˆë„ ìƒëª…ì„ ê°€ì ¸ë³¸ ì ì´ 없는 새로운 ì¸ê°„ì´ì—ˆì–´.{*EF*}{*B*}{*B*} +{*C3*}네가 바로 무ì—서 ì –ê³¼ 사랑으로부터 탄ìƒí•œ 바로 ê·¸ 플레ì´ì–´ì´ìž ì´ì•¼ê¸°ê³  프로그램ì´ìž ì¸ê°„ì´ì•¼.{*EF*}{*B*}{*B*} +{*C2*}ì´ì œ 좀 ë” ê³¼ê±°ë¡œ ëŒì•„ê°€ ë³´ìž.{*EF*}{*B*}{*B*} +{*C2*}플레ì´ì–´ì˜ 수백 수천 수백억 ì›ìžëŠ” ì´ ê²Œìž„ì´ ì¡´ìž¬í•˜ê¸° 훨씬 ì´ì „ì— ë³„ì˜ ì‹¬ìž¥ ì†ì—서 만들어졌어. 즉, 플레ì´ì–´ë„ 별ì—서 온 정보야. 그리고 플레ì´ì–´ëŠ” ì´ì•¼ê¸° ì†ì—서 움ì§ì´ëŠ” ë° ê·¸ ì´ì•¼ê¸°ëŠ” 쥴리안ì´ë¼ëŠ” ì‚¬ëžŒì´ ì‹¬ì–´ë†“ì€ ì •ë³´ì•¼. 그리고 ê·¸ ì´ì•¼ê¸°ëŠ” 마르쿠스ë¼ëŠ” ì‚¬ëžŒì´ ì°½ì¡°í•œ í‰í‰í•˜ê³  ë없는 ì„¸ìƒ ìœ„ì—서 펼ì³ì§€ì§€. 그리고 ê·¸ 세ìƒì€ 플레ì´ì–´ê°€ 만든 ìž‘ì€ ê·¸ë§Œì˜ ì„¸ìƒì´ì•¼. 그리고 ê·¸ 플레ì´ì–´ê°€ ì‚´ê³  있는 세ìƒì„ 창조한 사람ì€â€¦{*EF*}{*B*}{*B*} +{*C3*}쉿. ì´ë”°ê¸ˆ 플레ì´ì–´ëŠ” 부드럽고 따뜻하며 단순한 ê·¸ë§Œì˜ ìž‘ì€ ì„¸ìƒì„ 만들어. ì´ë”°ê¸ˆ ê·¸ 세ìƒì€ ê±°ì¹ ê³  추우며 ë³µìž¡í•˜ê¸°ë„ í•´. ì´ë”°ê¸ˆ 거대한 í…… 빈 공간ì—서 움ì§ì´ëŠ” ì—너지 ì¡°ê°ìœ¼ë¡œ 머릿ì†ì—서 세ìƒì„ 만들지. 한때 ê·¸ ì¡°ê°ë“¤ì„ “전ìžâ€ì™€ “양성ìžâ€ë¼ê³  부를 ë•Œë„ ìžˆì—ˆì–´.{*EF*}{*B*}{*B*} + + + +{*C2*}한때 ì¡°ê°ë“¤ì„ “행성â€ê³¼ “별â€ì´ë¼ê³  부를 ë•Œë„ ìžˆì—ˆì§€.{*EF*}{*B*}{*B*} +{*C2*}ì´ë”°ê¸ˆ 그는 Onê³¼ Off로, 0ê³¼ 1로, ì¼ë ¨ì˜ 코드로 ì´ë£¨ì–´ì§„ ì—너지로 만든 세ìƒì— 있다고 믿었어. ì´ë”°ê¸ˆ 그는 게임 플레ì´ë¥¼ 하고 있다고 믿었지. ì´ë”°ê¸ˆ 그는 í™”ë©´ì˜ ë‹¨ì–´ë¥¼ ì½ê³  있다고 믿었어.{*EF*}{*B*}{*B*} +{*C3*}네가 단어를 ì½ê³  있는 ê·¸ 플레ì´ì–´ì•¼â€¦{*EF*}{*B*}{*B*} +{*C2*}쉿… ê°€ë” í”Œë ˆì´ì–´ëŠ” í™”ë©´ì˜ ì½”ë“œë¥¼ ì½ì–´. 코드를 단어로 바꾸고, ê·¸ 단어를 ì˜ë¯¸ë¡œ í•´ì„하고, ê·¸ ì˜ë¯¸ë¥¼ ëŠë‚Œ, ê°ì •, ì´ë¡ , ì•„ì´ë””어로 바꿔서 플레ì´ì–´ëŠ” ë” ë¹ ë¥´ê³  깊게 호í¡í•˜ê¸° 시작했고 ìžì‹ ì€ ì‚´ì•„ 있으며 수천 ë²ˆì˜ ì£½ìŒì€ 진짜가 아니ë¼ëŠ” 걸 깨달아.{*EF*}{*B*}{*B*} +{*C3*}너. 그래, 너는 ì‚´ì•„ 있어.{*EF*}{*B*}{*B*} +{*C2*}그리고 ì´ë”°ê¸ˆ 플레ì´ì–´ëŠ” 여름 ë‚˜ë¬´ì˜ í•˜ëŠ˜ê±°ë¦¬ëŠ” 잎 사ì´ë¡œ 비치는 í–‡ë¹›ì„ í†µí•´ 세ìƒì´ 그와 소통하고 있다고 믿었어.{*EF*}{*B*}{*B*} +{*C3*}그리고 ì´ë”°ê¸ˆ 플레ì´ì–´ëŠ” ì–´ëŠ ì¶”ìš´ 겨울 밤하늘ì—서 ë³¼ 수 있는, 아주 먼 우주 저편ì—서 ì°°ë‚˜ì˜ ì‹œê°„ ë™ì•ˆ 플레ì´ì–´ì—게 ë³´ì´ê¸° 위해 태양보다 백만 ë°° 무거운 ë³„ì´ ìžì‹ ì„ 불태워 발한 ë¹›ì„ í†µí•´ 세ìƒì´ 그와 소통하고 있다고 믿었어. 그리고 세ìƒê³¼ 멀리 떨어져 있는 집으로 걸어가 ìµìˆ™í•œ 문가ì—서 나는 ìŒì‹ 냄새를 맡으며 다시 ê¿ˆì— ë¹ ì ¸ë“¤ì—ˆì§€.{*EF*}{*B*}{*B*} +{*C2*}그리고 ì´ë”°ê¸ˆ 플레ì´ì–´ëŠ” 0ê³¼ 1, 세ìƒì— í¼ì ¸ìžˆëŠ” 전기, ê¿ˆì˜ ë§ˆì§€ë§‰ì— í™”ë©´ì— ë³´ì´ëŠ” 단어를 통해 세ìƒê³¼ 소통한다고 믿었어.{*EF*}{*B*}{*B*} +{*C3*}그리고 세ìƒì€ ë„ ì‚¬ëž‘í•œë‹¤ê³  ë§í–ˆì–´.{*EF*}{*B*}{*B*} +{*C2*}그리고 세ìƒì€ 네가 ë©‹ì§„ 게임 플레ì´ë¥¼ 보여줬다고 ë§í–ˆì–´.{*EF*}{*B*}{*B*} +{*C3*}그리고 세ìƒì€ 네게 필요한 모든 ê²ƒì€ ì´ë¯¸ 네 ì•ˆì— ìžˆë‹¤ê³  ë§í–ˆì–´.{*EF*}{*B*}{*B*} +{*C2*}그리고 세ìƒì€ 네가 ìƒê°í•˜ëŠ” 것보다 넌 ë” ê°•í•˜ë‹¤ê³  ë§í–ˆì–´.{*EF*}{*B*}{*B*} +{*C3*}그리고 세ìƒì€ 네가 ë‚®ì´ë¼ê³  ë§í–ˆì–´.{*EF*}{*B*}{*B*} +{*C2*}그리고 세ìƒì€ 네가 ë°¤ì´ë¼ê³  ë§í–ˆì–´.{*EF*}{*B*}{*B*} +{*C3*}그리고 세ìƒì€ 네가 싸우고 있는 ì–´ë‘ ì´ ë„¤ ì•ˆì— ì¡´ìž¬í•œë‹¤ê³  ë§í–ˆì–´.{*EF*}{*B*}{*B*} +{*C2*}그리고 세ìƒì€ 네가 찾고 있는 ë¹›ì´ ë„¤ ì•ˆì— ì¡´ìž¬í•œë‹¤ê³  ë§í–ˆì–´.{*EF*}{*B*}{*B*} +{*C3*}그리고 세ìƒì€ 네가 혼ìžê°€ 아니ë¼ê³  ë§í–ˆì–´.{*EF*}{*B*}{*B*} +{*C2*}그리고 세ìƒì€ 네가 다른 모든 것들과 떨어져 있지 않다고 ë§í–ˆì–´.{*EF*}{*B*}{*B*} +{*C3*}그리고 세ìƒì€ 네가 스스로 ë§›ì„ ëŠë¼ê³  스스로 대화하며 ìžì‹ ì˜ 코드를 ì½ëŠ” ì„¸ìƒ ê·¸ ìžì²´ë¼ê³  ë§í–ˆì–´.{*EF*}{*B*}{*B*} +{*C2*}그리고 세ìƒì€ 네가 사랑 ê·¸ ìžì²´ë‹ˆê¹Œ ë„ ì‚¬ëž‘í•œë‹¤ê³  ë§í–ˆì–´.{*EF*}{*B*}{*B*} +{*C3*}그리고 ê²Œìž„ì´ ë나고 플레ì´ì–´ê°€ 꿈ì—서 깼어. 그리고 플레ì´ì–´ëŠ” 새로운 ê¿ˆì„ ê¾¸ê¸° 시작해. 그리고 다시 ê¿ˆì„ ê¾¸ê³ , ë” ì¢‹ì€ ê¿ˆì„ ê¿”. 그리고 플레ì´ì–´ëŠ” ì„¸ìƒ ê·¸ ìžì²´ê³  사랑 ê·¸ ìžì²´ì•¼.{*EF*}{*B*}{*B*} +{*C3*}네가 바로 ê·¸ 플레ì´ì–´ì•¼.{*EF*}{*B*}{*B*} +{*C2*}ì´ì œ ì¼ì–´ë‚˜.{*EF*} + + +지하 초기화 + +ì§€í•˜ì˜ ì €ìž¥ ë°ì´í„°ë¥¼ 초기화해 기본값으로 재설정하시겠습니까? ì§€í•˜ì˜ ì§„í–‰ ìƒí™©ì´ 사ë¼ì§‘니다. + +지하 초기화 + +지하 초기화를 하지 않습니다. + +Mooshroomì˜ í„¸ì„ ìžë¥¼ 수 없습니다. ë¼ì§€, ì–‘, 소, ê³ ì–‘ì´ì˜ 수가 ìµœëŒ€ì¹˜ì— ë„달했습니다. + +ë‚³ì€ ì•Œì„ ì‚¬ìš©í•  수 없습니다. ë¼ì§€, ì–‘, 소, ê³ ì–‘ì´ì˜ 수가 ìµœëŒ€ì¹˜ì— ë„달했습니다. + +ë‚³ì€ ì•Œì„ ì‚¬ìš©í•  수 없습니다. Mooshroomì˜ ìˆ˜ê°€ ìµœëŒ€ì¹˜ì— ë„달했습니다. + +ë‚³ì€ ì•Œì„ ì‚¬ìš©í•  수 없습니다. ëŠ‘ëŒ€ì˜ ìˆ˜ê°€ ìµœëŒ€ì¹˜ì— ë„달했습니다. + +ë‚³ì€ ì•Œì„ ì‚¬ìš©í•  수 없습니다. ë‹­ì˜ ìˆ˜ê°€ ìµœëŒ€ì¹˜ì— ë„달했습니다. + +ë‚³ì€ ì•Œì„ ì‚¬ìš©í•  수 없습니다. ì˜¤ì§•ì–´ì˜ ìˆ˜ê°€ ìµœëŒ€ì¹˜ì— ë„달했습니다. + +ë‚³ì€ ì•Œì„ ì‚¬ìš©í•  수 없습니다. ì ì˜ 수가 ìµœëŒ€ì¹˜ì— ë„달했습니다. + +ë‚³ì€ ì•Œì„ ì‚¬ìš©í•  수 없습니다. ë§ˆì„ ì‚¬ëžŒì˜ ìˆ˜ê°€ ìµœëŒ€ì¹˜ì— ë„달했습니다. + +그림 ì•¡ìž/ì•„ì´í…œ ì™¸í˜•ì˜ ìˆ˜ê°€ ìµœëŒ€ì¹˜ì— ë„달했습니다. + +ë‚™ì› ëª¨ë“œì—서는 ì ì„ ìƒì„±í•  수 없습니다. + +ì´ ë™ë¬¼ì€ 사랑 모드로 만들 수 없습니다. êµë°°í•  수 있는 ë¼ì§€, ì–‘, 소, ê³ ì–‘ì´ì˜ 수가 ìµœëŒ€ì¹˜ì— ë„달했습니다. + +ì´ ë™ë¬¼ì€ 사랑 모드로 만들 수 없습니다. êµë°°í•  수 있는 ëŠ‘ëŒ€ì˜ ìˆ˜ê°€ ìµœëŒ€ì¹˜ì— ë„달했습니다. + +ì´ ë™ë¬¼ì€ 사랑 모드로 만들 수 없습니다. êµë°°í•  수 있는 ë‹­ì˜ ìˆ˜ê°€ ìµœëŒ€ì¹˜ì— ë„달했습니다. + +ì´ ë™ë¬¼ì€ 사랑 모드로 만들 수 없습니다. êµë°°í•  수 있는 Mooshroomì˜ ìˆ˜ê°€ ìµœëŒ€ì¹˜ì— ë„달했습니다. + +ë°°ì˜ ìˆ˜ê°€ ìµœëŒ€ì¹˜ì— ë„달했습니다. + +괴물 ë¨¸ë¦¬ì˜ ìˆ˜ê°€ ìµœëŒ€ì¹˜ì— ë„달했습니다. + +시야 반전 + +왼ì†ìž¡ì´ + +사ë§! + +재ìƒì„± + +다운로드 콘í…츠 íŒë§¤ + +스킨 변경 + +게임 방법 + +컨트롤 + +설정 + +제작진 + +콘í…츠 재설치 + +디버그 설정 + +불 확산 + +TNT í­ë°œ + +플레ì´ì–´ 대 플레ì´ì–´ + +플레ì´ì–´ 신뢰 + +호스트 특권 + +건물 ìƒì„± + +완전í‰ë©´ 월드 + +보너스 ìƒìž + +월드 옵션 + +건설 ë° ì±„ê´‘ 가능 + +문과 스위치 사용 가능 + +ë³´ê´€í•¨ì„ ì—´ 수 ìžˆìŒ + +플레ì´ì–´ 공격 가능 + +ë™ë¬¼ 공격 가능 + +ê´€ë¦¬ìž + +플레ì´ì–´ 추방 + +비행 가능 + +지치지 ì•ŠìŒ + +투명화 + +호스트 옵션 + +플레ì´ì–´/초대 + +온ë¼ì¸ 게임 + +초대한 사람만 참가 가능 + +추가 옵션 + +불러오기 + +새 월드 + +월드 ì´ë¦„ + +월드 ìƒì„± 시드 + +공백(무작위 시드) + +플레ì´ì–´ + +게임 참가 + +게임 시작 + +게임 ì—†ìŒ + +게임 í”Œë ˆì´ + +순위표 + +ë„ì „ 과제 + +ë„ì›€ë§ ë° ì˜µì…˜ + +ì •ì‹ ë²„ì „ 게임 구매 + +게임 계ì†í•˜ê¸° + +게임 저장 + +난ì´ë„: + +게임 유형: + +게ì´ë¨¸íƒœê·¸: + +건물: + +레벨 유형: + +플레ì´ì–´ 대 플레ì´ì–´: + +플레ì´ì–´ 신뢰: + +TNT: + +불 확산: + +테마 재설치 + +게ì´ë¨¸ì‚¬ì§„ 1 재설치 + +게ì´ë¨¸ì‚¬ì§„ 2 재설치 + +아바타 ì•„ì´í…œ 1 재설치 + +아바타 ì•„ì´í…œ 2 재설치 + +아바타 ì•„ì´í…œ 3 재설치 + +옵션 + +오디오 + +컨트롤 + +그래픽 + +ì‚¬ìš©ìž ì¸í„°íŽ˜ì´ìФ + +기본값으로 재설정 + +시야 í”들림 표시 + +힌트 + +게임 ì† ë‹¨ì¶” 설명 표시 + +게임 ë‚´ 게ì´ë¨¸íƒœê·¸ + +2 플레ì´ì–´ ìˆ˜ì§ ë¶„í•  화면 + +완료 + +서명 메시지 편집: + +스í¬ë¦°ìƒ·ê³¼ 함께 게시할 ì„¤ëª…ì„ ìž…ë ¥í•˜ì‹­ì‹œì˜¤. + +설명문 + +게임 스í¬ë¦°ìƒ· + +서명 메시지 편집: + +Minecraft: Xbox 360 Editionì—서 제가 만든 ê²ƒë“¤ì„ ë³´ì„¸ìš”! + +ê³ ì „ì ì¸ Minecraft í…스처, ì•„ì´ì½˜ ë° ì‚¬ìš©ìž ì¸í„°íŽ˜ì´ìŠ¤ìž…ë‹ˆë‹¤! + +모든 매시업 월드 ë³´ì´ê¸° + +전송할 저장 ìŠ¬ë¡¯ì„ ì„ íƒí•©ë‹ˆë‹¤. + +ìŠ¬ë¡¯ì„ ë¹„ì›ë‹ˆë‹¤. + +저장 메타ë°ì´í„°ë¥¼ 업로드 중입니다. + +저장 ë°ì´í„°ë¥¼ 업로드 중입니다. + +Xbox Oneìš© 저장 파ì¼ì„ 업로드 중입니다. + +업로드 ì·¨ì†Œë¨ + +ì´ ì €ìž¥ ë°ì´í„°ë¥¼ 저장 ë°ì´í„° ì´ì „ ì˜ì—­ì— 업로드하는 ì¤‘ì— ì·¨ì†Œí–ˆìŠµë‹ˆë‹¤. + +효과 ì—†ìŒ + +ì†ë„ + +ì†ë„ 저하 + +채굴 ì†ë„ í–¥ìƒ + +채굴 ì†ë„ 저하 + +피해 ê°•í™” + +피해 약화 + +회복 + +피해 + +ì í”„ ê°•í™” + +혼란 + +ìž¬ìƒ + +저항 + +화염 저항 + +수중 í˜¸í¡ + +투명화 + +맹목 + +야간 시야 + +ë°°ê³ í”” + +ë… + +- ì‹ ì† + +- ì†ë„ 저하 + +- 채굴 ì†ë„ í–¥ìƒ + +- 둔함 + +- 피해 ê°•í™” + +- 피해 약화 + +- 회복 + +- 피해 + +- ë„약 + +- 혼란 + +- ìž¬ìƒ + +- 저항 + +- 화염 저항 + +- 수중 í˜¸í¡ + +- 투명화 + +- 맹목 + +- 야간 시야 + +- ë°°ê³ í”” + +- ë… + + + +II + +III + +IV + +í­ë°œ + +ì¼ë°˜ì ì¸ + +시시한 + +단조로운 + +ë§‘ì€ + +우유빛 + +뿌연 + +소박한 + +ë¬½ì€ + +ì´ìƒí•œ + +ê¹€ì´ ë¹ ì§„ + +투박한 + +엉터리 + +ëŠë¼í•œ + +부드러운 + +미ëˆë¯¸ëˆí•œ + +찰랑대는 + +ì§™ì€ + +우아한 + +고급스러운 + +화려한 + +근사한 + +ì •ì œëœ + +따스한 + +ê±°í’ˆì´ ì´ëŠ” + +강력한 + +냄새나는 + +냄새 없는 + +고약한 + +거칠거칠한 + +매ìºí•œ + +역겨운 + +ì§€ë…한 + +모든 ë¬¼ì•½ì˜ ê¸°ë³¸ì´ ë©ë‹ˆë‹¤. 양조대ì—서 사용하여 ë¬¼ì•½ì„ ë§Œë“¤ 수 있습니다. + +ê·¸ ìžì²´ë¡œëŠ” 효과가 없습니다. 양조대ì—서 다른 재료를 추가로 넣어 효과를 추가할 수 있습니다. + +효과 ëŒ€ìƒ í”Œë ˆì´ì–´, ë™ë¬¼ ë° ê´´ë¬¼ì˜ ì´ë™ ì†ë„ê°€ 빨ë¼ì§‘니다. 플레ì´ì–´ì˜ 질주 ì†ë„ê°€ 빨ë¼ì§€ë©° ì í”„ 거리와 시야 거리가 늘어납니다. + +효과 ëŒ€ìƒ í”Œë ˆì´ì–´, ë™ë¬¼ ë° ê´´ë¬¼ì˜ ì´ë™ ì†ë„ê°€ ëŠë ¤ì§‘니다. 플레ì´ì–´ì˜ 질주 ì†ë„ê°€ ëŠë ¤ì§€ë©° ì í”„ 거리와 시야 거리가 줄어듭니다. + +효과 ëŒ€ìƒ í”Œë ˆì´ì–´ ë° ê´´ë¬¼ì˜ ê³µê²©ë ¥ì´ ì¦ê°€í•©ë‹ˆë‹¤. + +효과 ëŒ€ìƒ í”Œë ˆì´ì–´ ë° ê´´ë¬¼ì˜ ê³µê²©ë ¥ì´ ê°ì†Œí•©ë‹ˆë‹¤. + +효과 ëŒ€ìƒ í”Œë ˆì´ì–´, ë™ë¬¼ ë° ê´´ë¬¼ì˜ ì²´ë ¥ì´ ì¦‰ì‹œ ì¦ê°€í•©ë‹ˆë‹¤. + +효과 ëŒ€ìƒ í”Œë ˆì´ì–´, ë™ë¬¼ ë° ê´´ë¬¼ì˜ ì²´ë ¥ì´ ì¦‰ì‹œ ê°ì†Œí•©ë‹ˆë‹¤. + +효과 ëŒ€ìƒ í”Œë ˆì´ì–´, ë™ë¬¼ ë° ê´´ë¬¼ì˜ ì²´ë ¥ì´ ì„œì„œížˆ 회복합니다. + +효과 ëŒ€ìƒ í”Œë ˆì´ì–´, ë™ë¬¼ ë° ê´´ë¬¼ì´ ë¶ˆ, 용암 ë° Blazeì˜ ì›ê±°ë¦¬ ê³µê²©ì— í”¼í•´ë¥¼ 받지 않게 ë©ë‹ˆë‹¤. + +효과 ëŒ€ìƒ í”Œë ˆì´ì–´, ë™ë¬¼ ë° ê´´ë¬¼ì˜ ì²´ë ¥ì´ ì„œì„œížˆ ê°ì†Œí•©ë‹ˆë‹¤. + +예리 + +강타 + +절지ë™ë¬¼ 격파 + +타격 ë°˜ë™ + +화염 + +ë°©ì–´ + +화염 ë°©ì–´ + +낙하 ë°©ì–´ + +í­ë°œ ë°©ì–´ + +발사체 ë°©ì–´ + +í˜¸í¡ + +수분 친화력 + +효율성 + +채굴 정확성 + +견고 + +전리품 íšë“ + +í¬ê·€í’ˆ 채굴 + +ê°•í™” + +화염 + +강타 + +무한 + +I + +II + +III + +IV + +V + +VI + +VII + +VIII + +IX + +X + +ì²  ë˜ëŠ” ê·¸ ì´ìƒì˜ 곡괭ì´ë¡œ 채굴하여 ì—메랄드를 ì–»ì„ ìˆ˜ 있습니다. + +ìƒìžì™€ 비슷하지만, Ender ìƒìžì— ë„£ì€ ì•„ì´í…œì€ 플레ì´ì–´ì˜ 모든 Ender ìƒìžì— 공유ë©ë‹ˆë‹¤. 다른 ì°¨ì›ì— 있는 Ender ìƒìžë„ 마찬가지입니다. + +ì—°ê²°ëœ íŠ¸ë¦½ì™€ì´ì–´ë¥¼ 통해 엔티티가 ì´ë™í•˜ë©´ ìž‘ë™í•©ë‹ˆë‹¤. + +엔티티가 통과하면 ì—°ê²°ëœ íŠ¸ë¦½ì™€ì´ì–´ 후í¬ë¥¼ ìž‘ë™ì‹œí‚µë‹ˆë‹¤. + +ì—메랄드를 쉽게 보관할 수 있습니다. + +조약ëŒë¡œ 만들어진 벽입니다. + +ë„구나 무기, 방어구를 만드는 ë° ì‚¬ìš©í•©ë‹ˆë‹¤. + +용광로ì—서 제련하여 지하 ì„ì˜ì„ 만듭니다. + +장ì‹ìœ¼ë¡œ 사용합니다. + +ë§ˆì„ ì‚¬ëžŒê³¼ 거래할 수 있습니다. + +장ì‹ìœ¼ë¡œ 사용합니다. 꽃, 묘목, ì„ ì¸ìž¥, ë²„ì„¯ì„ ì‹¬ì„ ìˆ˜ 있습니다. + +먹으면 {*ICON_SHANK_01*}를 2ë§Œí¼ íšŒë³µí•˜ë©° 황금 ë‹¹ê·¼ì„ ë§Œë“œëŠ” ë° ì‚¬ìš©í•©ë‹ˆë‹¤. ë†ì§€ì— ì‹¬ì„ ìˆ˜ 있습니다. + +먹어서 {*ICON_SHANK_01*}를 0.5ë§Œí¼ íšŒë³µí•˜ê±°ë‚˜ 화로ì—서 조리할 수 있습니다. ë†ì§€ì— ì‹¬ì„ ìˆ˜ 있습니다. + +{*ICON_SHANK_01*}를 3ë§Œí¼ íšŒë³µí•©ë‹ˆë‹¤. 화로ì—서 ê°ìžë¥¼ 조리하여 만듭니다. + +먹어서 {*ICON_SHANK_01*}를 1ë§Œí¼ íšŒë³µí•˜ê±°ë‚˜ 화로ì—서 조리할 수 있습니다. ë†ì§€ì— ì‹¬ì„ ìˆ˜ 있으며 먹으면 중ë…ë  ìˆ˜ 있습니다. + +{*ICON_SHANK_01*}를 3ë§Œí¼ íšŒë³µí•©ë‹ˆë‹¤. 당근과 금ë©ì´ë¥¼ 사용해 만듭니다. + +안장 달린 ë¼ì§€ì— 올ë¼íƒ€ 조종할 때 사용합니다. + +{*ICON_SHANK_01*}를 4ë§Œí¼ íšŒë³µí•©ë‹ˆë‹¤. + +모루ì—서 무기, ë„구, ë°©ì–´êµ¬ì— íš¨ê³¼ë¥¼ 부여할 때 사용합니다. + +지하 ì„ì˜ ê´‘ì„ì„ ì±„êµ´í•´ì„œ 만듭니다. ì„ì˜ ë¸”ë¡ìœ¼ë¡œ 만들 수 있습니다. + +ì–‘í„¸ì„ ì‚¬ìš©í•´ 만듭니다. 장ì‹ìœ¼ë¡œ 사용합니다. + +ì—메랄드 + +화분 + +당근 + +ê°ìž + +구운 ê°ìž + +ë…성 ê°ìž + +황금 당근 + +당근 막대 + +호박 íŒŒì´ + +효과부여 ì±… + +지하 ì„ì˜ + +ì—메랄드 ê´‘ì„ + +Ender ìƒìž + +트립와ì´ì–´ í›„í¬ + +트립와ì´ì–´ + +ì—메랄드 ë¸”ë¡ + +ì¡°ì•½ëŒ ë²½ + +ì´ë¼ ë‚€ ì¡°ì•½ëŒ ë²½ + +화분 + +당근 + +ê°ìž + +모루 + +모루 + +약간 ë§ê°€ì§„ 모루 + +í¬ê²Œ ë§ê°€ì§„ 모루 + +지하 ì„ì˜ ê´‘ì„ + +ì„ì˜ ë¸”ë¡ + +ê¹Žì•„ë†“ì€ ì„ì˜ ë¸”ë¡ + +ì„ì˜ ë¸”ë¡ ê¸°ë‘¥ + +ì„ì˜ ê³„ë‹¨ + +카펫 + +ê²€ì€ìƒ‰ 카펫 + +빨간색 카펫 + +ì´ˆë¡ìƒ‰ 카펫 + +갈색 카펫 + +파란색 카펫 + +ë³´ë¼ìƒ‰ 카펫 + +ì²­ë¡ìƒ‰ 카펫 + +ë°ì€ 회색 카펫 + +회색 카펫 + +ë¶„í™ìƒ‰ 카펫 + +ë¼ìž„색 카펫 + +노란색 카펫 + +ë°ì€ 파란색 카펫 + +ìžì£¼ìƒ‰ 카펫 + +주황색 카펫 + +í°ìƒ‰ 카펫 + +ê¹Žì•„ë†“ì€ ì‚¬ì•” + +부드러운 사암 + +{*PLAYER*} {*SOURCE*} 공격 ì¤‘ì— ì‚¬ë§ + +{*PLAYER*} ëª¨ë£¨ì— ê¹”ë ¤ ì‚¬ë§ + +{*PLAYER*} 블ë¡ì— 깔려 ì‚¬ë§ + +{*PLAYER*} {*DESTINATION*}(으)로 순간ì´ë™ + +{*PLAYER*}ì˜ ìœ„ì¹˜ë¡œ 순간ì´ë™ + +{*PLAYER*}ì´(ê°€) 현재 ë‚´ 위치로 순간ì´ë™ + +가시 + +ì„ì˜ ë°œíŒ + +ì–´ë‘ìš´ ì§€ì—­ì„ ëŒ€ë‚®ì²˜ëŸ¼ ë°íž™ë‹ˆë‹¤. 물ì†ì—ì„œë„ íš¨ê³¼ê°€ 있습니다. + +ì˜í–¥ì„ ë°›ì€ í”Œë ˆì´ì–´ì™€ ë™ë¬¼, 몬스터를 투명하게 만듭니다. + +수리 ë° ì´ë¦„ + +효과부여 비용: %d + +비용 부족! + +ì´ë¦„ 바꾸기 + +소지: + +ê±°ëž˜ì— í•„ìš”í•œ ì•„ì´í…œ + +{*VILLAGER_TYPE*}ì˜ ì œì•ˆ: %s + +수리 + +거래 + +목줄 염색 + + + ì´ í™”ë©´ì€ ëª¨ë£¨ ì¸í„°íŽ˜ì´ìŠ¤ìž…ë‹ˆë‹¤. ì´ê³³ì—서 경험치를 지불하고 무기나 ë„구, 방어구 ì´ë¦„ì„ ë°”ê¾¸ê±°ë‚˜, 수리하거나, 효과를 부여합니다. + + + + {*B*} + 모루 ì¸í„°íŽ˜ì´ìŠ¤ì— ëŒ€í•´ ë” ì•Œì•„ë³´ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 모루 ì¸í„°íŽ˜ì´ìŠ¤ì— ëŒ€í•´ ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + ì•„ì´í…œìœ¼ë¡œ ìž‘ì—…ì„ ì‹œìž‘í•˜ë ¤ë©´ 첫 번째 작업 ìŠ¬ë¡¯ì— ë„£ìœ¼ì‹­ì‹œì˜¤. + + + + 올바른 ì›ìž¬ë£Œë¥¼ ë‘ ë²ˆì§¸ 작업 ìŠ¬ë¡¯ì— ë„£ìœ¼ë©´(예: ë§ê°€ì§„ ì² ì œ ê²€ 수리 시 ì²  주괴 í•„ìš”), ê²°ê³¼ ìŠ¬ë¡¯ì— ìˆ˜ë¦¬ ì •ë³´ê°€ 표시ë©ë‹ˆë‹¤. + + + + ë˜ëŠ” ë‘ ë²ˆì§¸ ìŠ¬ë¡¯ì— ê°™ì€ ì•„ì´í…œì„ 넣어 ë‘ ì•„ì´í…œì„ ì¡°í•©í•  수 있습니다. + + + + 모루ì—서 ì•„ì´í…œì— 효과를 부여하려면 íš¨ê³¼ë¶€ì—¬ì±…ì„ ë‘ ë²ˆì§¸ 작업 ìŠ¬ë¡¯ì— ë„£ìœ¼ì‹­ì‹œì˜¤. + + + + ìž‘ì—…ì— ì†Œë¹„ë˜ëŠ” 경험치는 ê²°ê³¼ ì •ë³´ ì•„ëž˜ì— í‘œì‹œë©ë‹ˆë‹¤. 경험치가 부족하면 수리를 í•  수 없습니다. + + + + í…스트 ìƒìžì— 다른 ì´ë¦„ì„ ìž…ë ¥í•˜ì—¬ ì•„ì´í…œ ì´ë¦„ì„ ë°”ê¿€ 수 있습니다. + + + + 수리한 ì•„ì´í…œì„ 집으면 ëª¨ë£¨ì— ë„£ì€ ë‘ ì•„ì´í…œê³¼ ì§€ì •ëœ ê²½í—˜ì¹˜ê°€ 소모ë©ë‹ˆë‹¤. + + + + ì´ê³³ì—는 ë„구 ë° ë¬´ê¸°ê°€ 담긴 ìƒìžì™€ 모루가 있습니다. + + + + {*B*} + ëª¨ë£¨ì— ëŒ€í•´ ë” ì•Œì•„ë³´ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + ëª¨ë£¨ì— ëŒ€í•´ ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 모루ì—서 무기와 ë„구를 수리해 내구ë„를 올리거나, ì´ë¦„ì„ ë°”ê¾¸ê±°ë‚˜, 효과부여 책으로 효과를 부여할 수 있습니다. + + + + 효과부여 ì±…ì€ ë˜ì „ì—서 찾거나 효과부여대ì—서 ì¼ë°˜ ì±…ì— íš¨ê³¼ë¥¼ 부여해 만듭니다. + + + + 모루를 사용하면 경험치를 소비하며, 사용할 때마다 모루가 ì†ìƒë  수 있습니다. + + + + ìž‘ì—…ì˜ ì¢…ë¥˜, ì•„ì´í…œ 가치, 부여 효과 수, 기존 작업 ìˆ˜ì— ë”°ë¼ ìˆ˜ë¦¬ë¹„ê°€ 달ë¼ì§‘니다. + + + + ì•„ì´í…œ ì´ë¦„ì„ ë°”ê¾¸ë©´ 모든 플레ì´ì–´ì—게 ë³´ì´ëŠ” ì´ë¦„ë„ ë³€ê²½ë˜ë©°, ì´ì „ 작업 ë¹„ìš©ì´ ì˜êµ¬ì ìœ¼ë¡œ ê°ì†Œí•©ë‹ˆë‹¤. + + + + ì´ê³³ì˜ ìƒìžì—서는 ì†ìƒëœ 곡괭ì´, ì›ìž¬ë£Œ, 경험치 병, 효과부여 ì±…ì„ ì°¾ì„ ìˆ˜ 있습니다. + + + + ì´ê³³ì€ ë§ˆì„ ì‚¬ëžŒê³¼ í•  수 있는 거래 목ë¡ì„ 보여주는 거래 ì¸í„°íŽ˜ì´ìŠ¤ìž…ë‹ˆë‹¤. + + + + {*B*} + 거래 ì¸í„°íŽ˜ì´ìŠ¤ì— ëŒ€í•´ ë” ì•Œì•„ë³´ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 거래 ì¸í„°íŽ˜ì´ìŠ¤ì— ëŒ€í•´ ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + ë§ˆì„ ì‚¬ëžŒë“¤ì´ ì›í•˜ëŠ” 거래 ë‚´ìš©ì€ ìœ„ìª½ì— í‘œì‹œë©ë‹ˆë‹¤. + + + + 필요한 ì•„ì´í…œì´ 없으면 거래가 빨간색으로 표시ë˜ë©° ì§„í–‰ì´ ë¶ˆê°€ëŠ¥í•©ë‹ˆë‹¤. + + + + ë§ˆì„ ì‚¬ëžŒì—게 제시하는 ì•„ì´í…œ 수량과 종류는 ì™¼ìª½ì˜ ìƒìž 2ê°œì— í‘œì‹œë©ë‹ˆë‹¤. + + + + ì™¼ìª½ì˜ ìƒìž 2ê°œì—서 ê±°ëž˜ì— í•„ìš”í•œ ì•„ì´í…œ ì´ ìˆ˜ëŸ‰ì„ í™•ì¸í•  수 있습니다. + + + + ë§ˆì„ ì‚¬ëžŒì´ ì›í•˜ëŠ” ì•„ì´í…œìœ¼ë¡œ 거래하려면 {*CONTROLLER_VK_A*} 단추를 누르십시오. + + + + ì´ê³³ì—는 ë§ˆì„ ì‚¬ëžŒê³¼, ì•„ì´í…œ êµ¬ë§¤ì— í•„ìš”í•œ 종ì´ê°€ 담긴 ìƒìžê°€ 있습니다. + + + + {*B*} + ê±°ëž˜ì— ëŒ€í•´ ë” ì•Œì•„ë³´ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + ê±°ëž˜ì— ëŒ€í•´ ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + ì†Œì§€í’ˆì— ìžˆëŠ” ì•„ì´í…œì„ ë§ˆì„ ì‚¬ëžŒë“¤ê³¼ 거래할 수 있습니다. + + + + ë§ˆì„ ì‚¬ëžŒì€ ìžì‹ ì˜ ì§ì—…ì— ë§žëŠ” ì•„ì´í…œì„ 거래하고 싶어합니다. + + + + 다양한 ì•„ì´í…œì„ 거래하면 ë§ˆì„ ì‚¬ëžŒì´ ì›í•˜ëŠ” 거래 목ë¡ì´ 추가ë˜ê±°ë‚˜ ì—…ë°ì´íЏë©ë‹ˆë‹¤. + + + + ê°™ì€ ê±°ëž˜ë¥¼ 너무 ìžì£¼ 하면 ì¼ì‹œì ìœ¼ë¡œ 해당 거래를 í•  수 없게 ë©ë‹ˆë‹¤. 하지만 ë§ˆì„ ì‚¬ëžŒì€ í•­ìƒ ìµœì†Œ 1ê±´ì˜ ê±°ëž˜ ì œì•ˆì„ ê°€ì§€ê³  있습니다. + + + + ìƒìžì—서 종ì´ë¥¼ 꺼내 ì´ê³³ì˜ ë§ˆì„ ì‚¬ëžŒë“¤ê³¼ 거래해 보십시오. + + + + ì´ê³³ì—는 Ender ìƒìž 2개가 있습니다. + + + + {*B*} + Ender ìƒìžì— 대해 ë” ì•Œì•„ë³´ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + Ender ìƒìžì— 대해 ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. + + + + 월드 ë‚´ì˜ Ender ìƒìžëŠ” 다른 ì°¨ì›ì— 있는 것까지 í¬í•¨í•˜ì—¬ ëª¨ë‘ ì—°ê²°ë˜ì–´ 있습니다. Ender ìƒìžì— ë„£ì€ ì•„ì´í…œì€ 다른 모든 Ender ìƒìžì—서 ì‚¬ìš©ì´ ê°€ëŠ¥í•©ë‹ˆë‹¤. + + + + 하지만 Ender ìƒìžì˜ ë‚´ìš©ë¬¼ì€ í”Œë ˆì´ì–´ë§ˆë‹¤ 다릅니다. + + + + ì´ì— ë”°ë¼ í”Œë ˆì´ì–´ëŠ” Ender ìƒìžì— ì•„ì´í…œì„ 넣고, 월드 ë‚´ 다른 ìž¥ì†Œì— ìžˆëŠ” Ender ìƒìžì—서 ì•„ì´í…œì„ 꺼낼 수 있습니다. Ender ìƒìžì— 지금 ì•„ì´í…œì„ 넣어 ì´ ê¸°ëŠ¥ì„ ì‹œí—˜í•´ë³¼ 수 있습니다. + + +{*ICON_SHANK_01*}를 2ë§Œí¼ íšŒë³µí•˜ê³  30ì´ˆ ë™ì•ˆ ì²´ë ¥ì„ íšŒë³µí•˜ë©° 5ë¶„ ë™ì•ˆ 화염 저항 ë° ë°©ì–´ë ¥ì´ ì¦ê°€í•©ë‹ˆë‹¤. 사과와 황금 블ë¡ì„ 사용해 만듭니다. + +순간ì´ë™ 가능 + +순간ì´ë™ + +플레ì´ì–´ì—게로 순간ì´ë™ + +나ì—게로 순간ì´ë™ + +지치지 않게 설정 가능 + +투명화 사용 가능 + +투명화 사용 가능 + +투명화 사용 불가능 + +비행 가능 + +비행 불가능 + +지치지 않게 설정 가능 + +지치지 않게 설정 불가능 + +순간ì´ë™ 가능 + +순간ì´ë™ 불가능 + +{*T3*}í”Œë ˆì´ ë°©ë²• : 모루{*ETW*}{*B*}{*B*} +경험치 ë ˆë²¨ì€ ëª¨ë£¨ì—서 ì•„ì´í…œì„ 수리하거나, 효과부여하거나, ì´ë¦„ì„ ë°”ê¾¸ëŠ” ë°ë„ 사용ë©ë‹ˆë‹¤.{*B*} +ì•„ì´í…œì€ 내구ë„ê°€ ìžˆì„ ë•Œë§Œ 수리할 수 있고 효과부여 ì±…ì„ í†µí•´ì„œë§Œ 효과를 얻지만, ì´ë¦„ì€ ì–´ë–¤ ì•„ì´í…œì´ë“  바꿀 수 있습니다.{*B*} +ì™¼ìª½ì˜ ìž‘ì—… ìŠ¬ë¡¯ì— ì•„ì´í…œì„ 넣고, ì›ìž¬ë£Œ(예: ì² ì œ ê²€ 수리 시 ì²  주괴)나 종류가 ê°™ì€ ë‹¤ë¥¸ ì•„ì´í…œì„ 함께 넣어 수리합니다.{*B*} +ì•„ì´í…œì€ 모루ì—서 ì¡°í•©í•  때 효과가 ë” ì¢‹ìœ¼ë©°, 조합하는 ì•„ì´í…œë“¤ì— ëª¨ë‘ íš¨ê³¼ê°€ 부여ë˜ì–´ 있다면 ê²°ê³¼ë¬¼ì€ í•´ë‹¹ íš¨ê³¼ë“¤ì„ ëª¨ë‘ ì´ì–´ë°›ì„ 수 있습니다.{*B*} +효과부여 ì±…ì€ íš¨ê³¼ê°€ ì ì ˆí•  경우 모루ì—서 다른 ì•„ì´í…œê³¼ 조합하여 ì•„ì´í…œì— 효과를 부여할 수 있습니다. 효과부여 ì±…ì€ ë˜ì „ì—서 얻거나 효과부여대ì—서 ì¼ë°˜ ì±…ì— íš¨ê³¼ë¥¼ 부여해 만듭니다.{*B*} +모루를 사용하면 ì¼ì • 확률로 ì†ìƒë˜ë©°, ì†ìƒì´ 심하면 모루가 부서집니다.{*B*} + + +{*T3*}í”Œë ˆì´ ë°©ë²• : 거래{*ETW*}{*B*}{*B*} +ë§ˆì„ ì‚¬ëžŒë“¤ê³¼ ì•„ì´í…œì„ 거래할 수 있습니다. ë§ˆì„ ì‚¬ëžŒì€ ë†ë¶€, ë„ì¶•ì—…ìž, 대장장ì´, ë„서관 사서, 사제 ë“±ì˜ ì§ì—…ì„ ê°€ì§€ê³  있으며, ì´ì— ë”°ë¼ ê°ìž 다른 ì•„ì´í…œì„ 거래합니다.{*B*} +거래 메뉴ì—서 ë§ˆì„ ì‚¬ëžŒì´ ì œì‹œí•  수 있는 모든 거래 목ë¡ì„ ë³¼ 수 있습니다. 플레ì´ì–´ì™€ 거래하면 ë§ˆì„ ì‚¬ëžŒì˜ ê±°ëž˜ 가능 목ë¡ì´ 바뀌거나 ì¶”ê°€ë  ìˆ˜ 있으며, 너무 ìžì£¼ 거래하면 ì¼ì‹œì ìœ¼ë¡œ 거래를 못 하게 ë  ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤.{*B*} +거래는 주로 ì•„ì´í…œì„ ì—메랄드로 구매하거나 íŒë§¤í•˜ëŠ” 형태로 ì´ë£¨ì–´ì§‘니다. {*B*} +ê±°ëž˜ì— í•„ìš”í•œ ì•„ì´í…œì„ 가지고 있지 않으면 ì•„ì´í…œì´ 빨간색으로 표시ë©ë‹ˆë‹¤.{*B*} + + +{*T3*}í”Œë ˆì´ ë°©ë²• : Ender ìƒìž {*ETW*}{*B*}{*B*} +월드 ì•ˆì˜ ëª¨ë“  Ender ìƒìžëŠ” ì—°ê²°ë˜ì–´ 있어, ìƒìžì— ë“  ì•„ì´í…œì€ ì–´ëŠ ê³³ì˜ Ender ìƒìžì—서든 꺼낼 수 있습니다. 하지만 ë‚´ìš©ë¬¼ì€ í”Œë ˆì´ì–´ë§ˆë‹¤ 다릅니다. 플레ì´ì–´ëŠ” 아무 Ender ìƒìžì— ì•„ì´í…œì„ 넣고, 월드 ë‚´ 다른 ìž¥ì†Œì— ìžˆëŠ” 아무 Ender ìƒìžì—서 ì•„ì´í…œì„ 꺼낼 수 있습니다. + + +ë†ë¶€ + +ë„서관 사서 + +사제 + +ëŒ€ìž¥ìž¥ì´ + +ë„ì¶•ì—…ìž + +마ì„ì—서 만날 수 있는 ë§ˆì„ ì‚¬ëžŒì€ ì§ì—…ì— ë”°ë¼ ë‹¤ì–‘í•œ ì•„ì´í…œì„ íŒë‹ˆë‹¤. + +í° ìƒìž + + + ë˜í•œ 효과부여대ì—서 효과부여 ì±…ì„ ë§Œë“¤ 수 있습니다. ë‚˜ì¤‘ì— ëª¨ë£¨ì—서 효과부여 ì±…ì„ ì‚¬ìš©í•´ ì•„ì´í…œì— 효과를 부여할 수 있습니다. + + + + 트립와ì´ì–´ í›„í¬ ì‚¬ì´ì˜ ì„ ì„ ë¬´ì–¸ê°€ê°€ ìž‘ë™ì‹œí‚¤ë©´ íšŒë¡œì— ê³„ì† ì „ë ¥ì´ ê³µê¸‰ë©ë‹ˆë‹¤. + + + + ê¸¸ë“¤ì¸ ëŠ‘ëŒ€ëŠ” í•­ìƒ ëª©ì¤„ì„ ì°©ìš©í•˜ê²Œ ë©ë‹ˆë‹¤. ëª©ì¤„ì€ ì—¼ìƒ‰í•´ì„œ ìƒ‰ì„ ë°”ê¿€ 수 있습니다. + + +당근과 ê°ìžë¥¼ 심어 재배할 수 있으며, ìž‘ë¬¼ì´ ë•… 위로 ëª¨ìŠµì„ ë“œëŸ¬ë‚´ë©´ 수확할 수 있습니다. + + + ë˜í•œ ë¼ì§€ì—게 ì•ˆìž¥ì„ ì”Œì›Œ 타고 ë‹¤ë‹ ìˆ˜ 있습니다. ë§‰ëŒ€ì— ë‹¹ê·¼ì„ ë¼ì›Œ 사용하면 ë¼ì§€ë¥¼ 조종할 수 있습니다. + + + + {*CONTROLLER_ACTION_MOVE*} 단추를 사용해 광물 수레를 천천히 움ì§ì¼ 수 있습니다. ë™ë ¥ ë ˆì¼ ìœ„ì—서 광물 수레를 움ì§ì´ëŠ” ë° ë„ì›€ì„ ì¤ë‹ˆë‹¤. + + +분활 í™”ë©´ì€ ê³ í™”ì§ˆ(HD) 모드ì—서만 ì§€ì›ë˜ë¯€ë¡œ ê²Œìž„ì— ì°¸ê°€í•  수 없습니다. 참가하려면 다른 모든 플레ì´ì–´ë¥¼ 로그아웃시킵니다. + +치유 + +Xbox 360 + +BACK + +ì´ ì˜µì…˜ì„ ì¼œë©´ ë„ì „ 과제를 íšë“í•  수 없으며 ìˆœìœ„í‘œì— ê¸°ë¡ë˜ì§€ 않습니다. í”Œë ˆì´ ë„ì¤‘ì— ì˜µì…˜ì„ ì¼œê±°ë‚˜ ì˜µì…˜ì„ ì¼  후 저장한 ê²Œìž„ì„ ë‹¤ì‹œ ë¶ˆëŸ¬ì™€ë„ ë§ˆì°¬ê°€ì§€ìž…ë‹ˆë‹¤. + +Xbox Oneìš© 저장 파ì¼ì„ 업로드합니다. + +저장 ë°ì´í„° 업로드 + +Xbox 360 본체 저장 ë°ì´í„° 하나만 ë°ì´í„° ì´ì „ ì˜ì—­ì— 보관할 수 있습니다. 다른 Xbox 360 본체 저장 ë°ì´í„°ë¥¼ 업로드하기 ì „ì—, ì´ì „ 저장 ë°ì´í„°ë¥¼ Xbox One ë³¸ì²´ì— ë‹¤ìš´ë¡œë“œí–ˆëŠ”ì§€ 확ì¸í•˜ì‹­ì‹œì˜¤. + +업로드 중... + +업로드 완료! + +업로드하지 못했습니다. ë‚˜ì¤‘ì— ë‹¤ì‹œ 시ë„하십시오. + + diff --git a/Minecraft.Client/Common/Media/languages.loc b/Minecraft.Client/Common/Media/languages.loc new file mode 100644 index 00000000..c267b1ac Binary files /dev/null and b/Minecraft.Client/Common/Media/languages.loc differ diff --git a/Minecraft.Client/Common/Media/media.txt b/Minecraft.Client/Common/Media/media.txt new file mode 100644 index 00000000..2e10707b --- /dev/null +++ b/Minecraft.Client/Common/Media/media.txt @@ -0,0 +1,5 @@ +splashes.txt +HTMLColours.col +Graphics\SaveChest.png +Graphics\MinecraftIcon.png +Graphics\TexturePackIcon.png \ No newline at end of file diff --git a/Minecraft.Client/Common/Media/movies1080.txt b/Minecraft.Client/Common/Media/movies1080.txt new file mode 100644 index 00000000..f72fa4cf --- /dev/null +++ b/Minecraft.Client/Common/Media/movies1080.txt @@ -0,0 +1,113 @@ +skinHDGraphics.swf +skinHDGraphicsHud.swf +skinHDGraphicsLabels.swf +skinHDGraphicsInGame.swf +skinHD.swf +skinHDHud.swf +skinHDLabels.swf +skinHDInGame.swf +AnvilMenu1080.swf +BrewingStandMenu1080.swf +ChestMenu1080.swf +ChestLargeMenu1080.swf +ComponentLogo1080.swf +ComponentLogoSplit1080.swf +Controls1080.swf +ControlsRemotePlay1080.swf +CreateWorldMenu1080.swf +CreativeMenu1080.swf +Credits1080.swf +Crafting2x2Menu1080.swf +Crafting3x3Menu1080.swf +DeathMenu1080.swf +DebugCreateSchematic1080.swf +DebugMenu1080.swf +DebugOptionsMenu1080.swf +DebugSetCamera1080.swf +DebugUIConsoleComponent1080.swf +DebugUIMarketingGuide1080.swf +DLCMainMenu1080.swf +DispenserMenu1080.swf +EnchantingMenu1080.swf +EndPoem1080.swf +EULA1080.swf +FullscreenProgress1080.swf +FurnaceMenu1080.swf +HelpAndOptionsMenu1080.swf +HowToPlay1080.swf +HowToPlayMenu1080.swf +HUD1080.swf +InGameHostOptions1080.swf +InGameInfoMenu1080.swf +InGamePlayerOptions1080.swf +InGameTeleportMenu1080.swf +Intro1080.swf +InventoryMenu1080.swf +JoinMenu1080.swf +LoadOrJoinMenu1080.swf +LaunchMoreOptionsMenu1080.swf +LeaderboardMenu1080.swf +LoadMenu1080.swf +MainMenu1080.swf +MenuBackground1080.swf +MessageBox1080.swf +NewUpdateMessage1080.swf +Panorama1080.swf +PauseMenu1080.swf +PressStartToPlay1080.swf +QuadrantSignin1080.swf +ReinstallMenu1080.swf +SaveMenu1080.swf +SaveMessage1080.swf +SettingsMenu1080.swf +SettingsAudioMenu1080.swf +SettingsControlMenu1080.swf +SettingsGraphicsMenu1080.swf +SettingsOptionsMenu1080.swf +SettingsUIMenu1080.swf +SignEntryMenu1080.swf +SkinSelectMenu1080.swf +Timer1080.swf +ToolTips1080.swf +TradingMenu1080.swf +TutorialPopup1080.swf +AnvilMenuSplit1080.swf +BrewingStandMenuSplit1080.swf +ChestMenuSplit1080.swf +ChestLargeMenuSplit1080.swf +ControlsSplit1080.swf +Crafting2x2MenuSplit1080.swf +Crafting3x3MenuSplit1080.swf +CreativeMenuSplit1080.swf +DeathMenuSplit1080.swf +DispenserMenuSplit1080.swf +EnchantingMenuSplit1080.swf +FurnaceMenuSplit1080.swf +FullscreenProgressSplit1080.swf +HelpAndOptionsMenuSplit1080.swf +HowToPlaySplit1080.swf +HowToPlayMenuSplit1080.swf +HUDSplit1080.swf +InGameHostOptionsSplit1080.swf +InGameInfoMenuSplit1080.swf +InGameTeleportMenuSplit1080.swf +InGamePlayerOptionsSplit1080.swf +InventoryMenuSplit1080.swf +MessageBoxSplit1080.swf +PanoramaSplit1080.swf +PauseMenuSplit1080.swf +ReinstallMenuSplit1080.swf +SettingsAudioMenuSplit1080.swf +SettingsControlMenuSplit1080.swf +SettingsGraphicsMenuSplit1080.swf +SettingsMenuSplit1080.swf +SettingsOptionsMenuSplit1080.swf +SettingsUIMenuSplit1080.swf +SignEntryMenuSplit1080.swf +SkinSelectMenuSplit1080.swf +TimerSplit1080.swf +ToolTipsSplit1080.swf +TradingMenuSplit1080.swf +TutorialPopupSplit1080.swf +Keyboard1080.swf +KeyboardSplit1080.swf \ No newline at end of file diff --git a/Minecraft.Client/Common/Media/movies480.txt b/Minecraft.Client/Common/Media/movies480.txt new file mode 100644 index 00000000..a3ab2ec6 --- /dev/null +++ b/Minecraft.Client/Common/Media/movies480.txt @@ -0,0 +1,56 @@ +AnvilMenu480.swf +BrewingStandMenu480.swf +ChestLargeMenu480.swf +ChestMenu480.swf +Controls480.swf +ComponentLogo480.swf +Crafting2x2Menu480.swf +Crafting3x3Menu480.swf +CreateWorldMenu480.swf +CreativeMenu480.swf +Credits480.swf +DeathMenu480.swf +DispenserMenu480.swf +DLCMainMenu480.swf +EnchantingMenu480.swf +EndPoem480.swf +EULA480.swf +FullscreenProgress480.swf +FurnaceMenu480.swf +HelpAndOptionsMenu480.swf +HowToPlay480.swf +HowToPlayMenu480.swf +HUD480.swf +InGameHostOptions480.swf +InGameInfoMenu480.swf +InGamePlayerOptions480.swf +Intro480.swf +InventoryMenu480.swf +JoinMenu480.swf +LaunchMoreOptionsMenu480.swf +LeaderboardMenu480.swf +LoadMenu480.swf +LoadOrJoinMenu480.swf +MainMenu480.swf +MenuBackground480.swf +MessageBox480.swf +NewUpdateMessage480.swf +Panorama480.swf +PauseMenu480.swf +PressStartToPlay480.swf +ReinstallMenu480.swf +SaveMessage480.swf +SettingsAudioMenu480.swf +SettingsControlMenu480.swf +SettingsGraphicsMenu480.swf +SettingsMenu480.swf +SettingsOptionsMenu480.swf +SettingsUIMenu480.swf +SignEntryMenu480.swf +SkinSelectMenu480.swf +InGameTeleportMenu480.swf +Timer480.swf +ToolTips480.swf +TradingMenu480.swf +TrialExitUpsell480.swf +TutorialPopup480.swf \ No newline at end of file diff --git a/Minecraft.Client/Common/Media/movies720.txt b/Minecraft.Client/Common/Media/movies720.txt new file mode 100644 index 00000000..ee89748b --- /dev/null +++ b/Minecraft.Client/Common/Media/movies720.txt @@ -0,0 +1,110 @@ +skinGraphics.swf +skinGraphicsHud.swf +skinGraphicsLabels.swf +skinGraphicsInGame.swf +skin.swf +skinHud.swf +skinLabels.swf +skinInGame.swf +AnvilMenu720.swf +BrewingStandMenu720.swf +ChestMenu720.swf +ChestLargeMenu720.swf +ComponentLogo720.swf +Controls720.swf +CreateWorldMenu720.swf +CreativeMenu720.swf +Credits720.swf +Crafting2x2Menu720.swf +Crafting3x3Menu720.swf +DeathMenu720.swf +DebugCreateSchematic720.swf +DebugMenu720.swf +DebugOptionsMenu720.swf +DebugSetCamera720.swf +DebugUIConsoleComponent720.swf +DebugUIMarketingGuide720.swf +DLCMainMenu720.swf +DispenserMenu720.swf +EnchantingMenu720.swf +EndPoem720.swf +EULA720.swf +FullscreenProgress720.swf +FurnaceMenu720.swf +HelpAndOptionsMenu720.swf +HowToPlay720.swf +HowToPlayMenu720.swf +HUD720.swf +InGameHostOptions720.swf +InGameInfoMenu720.swf +InGamePlayerOptions720.swf +InGameTeleportMenu720.swf +Intro720.swf +InventoryMenu720.swf +JoinMenu720.swf +LoadOrJoinMenu720.swf +LaunchMoreOptionsMenu720.swf +LeaderboardMenu720.swf +LoadMenu720.swf +MainMenu720.swf +MenuBackground720.swf +MessageBox720.swf +NewUpdateMessage720.swf +Panorama720.swf +PauseMenu720.swf +PressStartToPlay720.swf +QuadrantSignin720.swf +ReinstallMenu720.swf +SaveMessage720.swf +SettingsMenu720.swf +SettingsAudioMenu720.swf +SettingsControlMenu720.swf +SettingsGraphicsMenu720.swf +SettingsOptionsMenu720.swf +SettingsUIMenu720.swf +SignEntryMenu720.swf +SkinSelectMenu720.swf +Timer720.swf +ToolTips720.swf +TradingMenu720.swf +TutorialPopup720.swf +AnvilMenuSplit720.swf +BrewingStandMenuSplit720.swf +ChestMenuSplit720.swf +ChestLargeMenuSplit720.swf +ControlsSplit720.swf +ComponentLogoSplit720.swf +Crafting2x2MenuSplit720.swf +Crafting3x3MenuSplit720.swf +CreativeMenuSplit720.swf +DeathMenuSplit720.swf +DispenserMenuSplit720.swf +EnchantingMenuSplit720.swf +FurnaceMenuSplit720.swf +FullscreenProgressSplit720.swf +GamertagSplit720.swf +HelpAndOptionsMenuSplit720.swf +HowToPlaySplit720.swf +HowToPlayMenuSplit720.swf +HUDSplit720.swf +InGameHostOptionsSplit720.swf +InGameInfoMenuSplit720.swf +InGamePlayerOptionsSplit720.swf +InventoryMenuSplit720.swf +MessageBoxSplit720.swf +PanoramaSplit720.swf +PauseMenuSplit720.swf +ReinstallMenuSplit720.swf +SettingsAudioMenuSplit720.swf +SettingsControlMenuSplit720.swf +SettingsGraphicsMenuSplit720.swf +SettingsMenuSplit720.swf +SettingsOptionsMenuSplit720.swf +SettingsUIMenuSplit720.swf +SignEntryMenuSplit720.swf +InGameTeleportMenuSplit720.swf +ToolTipsSplit720.swf +TradingMenuSplit720.swf +TrialExitUpsell720.swf +TutorialPopupSplit720.swf +SkinSelectMenuSplit720.swf \ No newline at end of file diff --git a/Minecraft.Client/Common/Media/moviesVita.txt b/Minecraft.Client/Common/Media/moviesVita.txt new file mode 100644 index 00000000..7a05e006 --- /dev/null +++ b/Minecraft.Client/Common/Media/moviesVita.txt @@ -0,0 +1,70 @@ +skinGraphics.swf +skinGraphicsHud.swf +skinGraphicsLabels.swf +skinGraphicsInGame.swf +skin.swf +skinHud.swf +skinLabels.swf +skinInGame.swf +AnvilMenuVita.swf +BrewingStandMenuVita.swf +ChestLargeMenuVita.swf +ChestMenuVita.swf +ComponentLogoVita.swf +ControlsVita.swf +ControlsTVVita.swf +Crafting2x2MenuVita.swf +Crafting3x3MenuVita.swf +CreateWorldMenuVita.swf +CreativeMenuVita.swf +CreditsVita.swf +DeathMenuVita.swf +DispenserMenuVita.swf +DLCMainMenuVita.swf +EnchantingMenuVita.swf +EndPoemVita.swf +EULAVita.swf +FullscreenProgressVita.swf +FurnaceMenuVita.swf +HelpAndOptionsMenuVita.swf +HowToPlayMenuVita.swf +HowToPlayVita.swf +HUDVita.swf +InGameHostOptionsVita.swf +InGameInfoMenuVita.swf +InGamePlayerOptionsVita.swf +InGameTeleportMenuVita.swf +IntroVita.swf +InventoryMenuVita.swf +JoinMenuVita.swf +LaunchMoreOptionsMenuVita.swf +LeaderboardMenuVita.swf +LoadMenuVita.swf +LoadOrJoinMenuVita.swf +MainMenuVita.swf +MenuBackgroundVita.swf +MessageBoxVita.swf +NewUpdateMessageVita.swf +PanoramaVita.swf +PauseMenuVita.swf +PressStartToPlayVita.swf +ReinstallMenuVita.swf +SaveMessageVita.swf +SettingsAudioMenuVita.swf +SettingsControlMenuVita.swf +SettingsGraphicsMenuVita.swf +SettingsMenuVita.swf +SettingsOptionsMenuVita.swf +SettingsUIMenuVita.swf +SignEntryMenuVita.swf +SkinSelectMenuVita.swf +TimerVita.swf +ToolTipsVita.swf +TradingMenuVita.swf +TutorialPopupVita.swf +DebugCreateSchematic720.swf +DebugMenu720.swf +DebugOptionsMenu720.swf +DebugSetCamera720.swf +DebugUIConsoleComponent720.swf +DebugUIMarketingGuide720.swf \ No newline at end of file diff --git a/Minecraft.Client/Common/Media/pt-BR/4J_strings.resx b/Minecraft.Client/Common/Media/pt-BR/4J_strings.resx new file mode 100644 index 00000000..0a28078a --- /dev/null +++ b/Minecraft.Client/Common/Media/pt-BR/4J_strings.resx @@ -0,0 +1,108 @@ + +Não Usado + +OK + +Voltar + +Cancelar + +Sim + +Não + +Salvamento Corrompido + +Seus dados de salvamento parecem estar corrompidos. Criar novo salvamento e substituir o corrompido? + +Sem Espaço Livre + +O dispositivo de armazenamento selecionado não tem espaço livre suficiente para salvar um jogo. + +Selecionar novamente + +Jogar sem salvar + +Criar novo salvamento + +Substituir salvamento? + +Seu dispositivo de armazenamento selecionado já contém este salvamento. Deseja substituí-lo? + +Não substituir + +Substituir e salvar + +Falha ao salvar + +Erro dispositivo armazenamento + +O dispositivo de armazenamento está indisponível ou tem um erro + +Seu dispositivo de armazenamento está indisponível ou tem um erro. Selecione outro dispositivo de armazenamento. + +Selecione outro dispos. armazen. + +Nenhum disp. armaz. selecionado + +Se não selecionar um dispositivo de armazenamento, o salvamento de jogos será desabilitado. + +Selecionar um dispos. de armaz. + +Continuar sem salvar + +O dispositivo de armazenamento foi removido. Selecione outro dispositivo. + +Falha ao carregar + +Nomeie o salvamento + +Digite um nome para salvar o jogo + +Voltar ao Menu Xbox + +Tem certeza de que deseja sair do jogo? + +Saiu + +Você voltou à tela de título porque seu perfil do jogador foi desconectado + +A partida terminou porque um perfil do jogador foi desconectado + +Continuar jogando + +Perfil do jogador não online + +Este jogo tem recursos que exigem um perfil do jogador habilitado para Xbox Live, mas você está offline no momento. + +Este recurso exige um perfil do jogador que esteja conectado ao Xbox Live. + +Conectar ao Xbox Live + +Continuar jogando offline + +Problema com Brinde de Conquista + + Houve um problema ao acessar seu perfil de jogador. Não foi possível conceder sua conquista no momento. + +Problema no perfil do jogador + +Falha ao salvar configurações no perfil do jogador. + +Perfil do Jogador Convidado + +O perfil do jogador convidado não pode acessar este recurso. Use um perfil do jogador diferente. + +Salvando… + +Salvando conteúdo. Não desligue o console. + +Desbloquear Jogo Completo + +Esta é a versão de avaliação do jogo Minecraft. Se você já tem a versão integral do jogo, acabou de ganhar uma conquista! +Desbloqueie a versão integral do jogo para curtir a diversão de Minecraft e para jogar com amigos de todo o mundo pelo Xbox Live. +Deseja desbloquear a versão integral do jogo? + +Você está voltando ao menu principal devido a um problema para ler seu perfil. + + diff --git a/Minecraft.Client/Common/Media/pt-BR/strings.resx b/Minecraft.Client/Common/Media/pt-BR/strings.resx new file mode 100644 index 00000000..0fd411ec --- /dev/null +++ b/Minecraft.Client/Common/Media/pt-BR/strings.resx @@ -0,0 +1,4455 @@ + +O novo Conteúdo para Baixar está disponível! Acesse-o pelo botão Loja Minecraft no Menu Principal. + +Você pode mudar o aspecto de seu personagem com um Pacote de Peles da Loja Minecraft. Selecione "Loja Minecraft" no Menu Principal e veja o que está disponível. + +Se você jogar este jogo no modo Alta Definição, poderá ter até quatro jogadores em tela dividida no mesmo console! + +Conecte os controles extras ao seu console e pressione START neles para entrar em um jogo a qualquer momento. + +Altere as configurações de gama para deixar o jogo mais claro ou mais escuro. + +Se você definir a dificuldade do jogo para Pacífico, sua energia regenerará automaticamente e nenhum monstro sairá à noite! + +Dê um osso a um lobo para torná-lo amigável. Depois, poderá fazê-lo sentar ou seguir você. + +Você pode soltar itens que estão no Inventário movendo o cursor para fora do menu e pressionando{*CONTROLLER_VK_A*} + +Ao dormir em uma cama à noite, o tempo passará rapidamente no jogo até o nascer do sol, mas todos os jogadores em um jogo multijogador devem estar na cama ao mesmo tempo. + +Colha costeletas dos porcos, cozinhe e coma-as para recuperar energia. + +Extraia couro das vacas e use-o para fazer armaduras. + +Se tiver um balde vazio, poderá enchê-lo com leite de uma vaca, com água ou lava! + +Use uma enxada para preparar áreas do solo para plantar. + +As aranhas não o atacarão durante o dia, a menos que você as ataque. + +Escavar solo ou areia com uma pá é mais rápido que com a mão! + +Comer costeletas de porco cozidas dá mais energia que comê-las cruas. + +Faça algumas tochas para iluminar áreas à noite. Os monstros evitam as áreas ao redor das tochas. + +Chegue aos destinos mais rápido com um carrinho de minas e trilhos! + +Plante algumas mudas e elas crescerão e se tornarão árvores. + +Os homens-porco não o atacarão, a menos que você os ataque. + +Você pode alterar seu ponto de criação no jogo e avançar até o nascer do sol dormindo em uma cama. + +Devolva aquelas bolas de fogo para o Ghast! + +Ao construir um portal, você poderá viajar para outra dimensão: o Submundo. + +Pressione{*CONTROLLER_VK_B*} para soltar o item que está em sua mão! + +Use a ferramenta certa para o trabalho! + +Se não encontrar carvão para suas tochas, faça carvão vegetal com árvores em uma fornalha. + +Cavar diretamente para baixo ou para cima não é uma boa ideia. + +O farelo de osso (fabricado com ossos de Esqueleto) pode ser usado como fertilizante e faz as coisas crescerem imediatamente! + +Os creepers explodirão se chegarem perto de você! + +A obsidiana é criada quando a água encontra um bloco de origem de lava. + +A lava poderá demorar alguns minutos para desaparecer COMPLETAMENTE quando o bloco de origem for removido. + +O pedregulho é resistente às bolas de fogo do Ghast, o que o torna útil para proteger portais. + +Blocos que podem ser usados como fonte de luz derretem neve e gelo. Eles incluem tochas, glowstone e lanternas de abóbora. + +Tome cuidado ao construir estruturas feitas de lã ao ar livre, pois relâmpagos de tempestades podem incendiar a lã. + +Um único balde de lava pode ser usado em uma fornalha para fundir 100 blocos. + +O instrumento tocado por um bloco de nota depende do material abaixo dele. + +Zumbis e esqueletos poderão sobreviver à luz do dia se estiverem na água. + +Se você atacar um lobo, todos os lobos da vizinhança ficarão hostis e o atacarão. Isso também acontece com os homens-porco zumbis. + +Os lobos não podem entrar no Submundo. + +Os lobos não atacam os Creepers. + +As galinhas põem ovos a cada 5 ou 10 minutos. + +A obsidiana só pode ser extraída com uma picareta de diamante. + +Os Creepers são a fonte de pólvora mais fácil de se obter. + +Se colocar dois baús lado a lado você terá um baú grande. + +Lobos mansos mostram a saúde pela posição da cauda. Dê carne a eles para curá-los. + +Cozinhe o cacto na fornalha para fazer o corante verde. + +Você receberá as últimas informações sobre este jogo de 4J Studios e Kappische no twitter! + +Impressione os amigos publicando capturas de tela de suas criações Minecraft no Facebook a partir do menu Pausa do jogo! + +Leia a seção O que há de novo nos menus Como jogar para ver as últimas atualizações no jogo. + +Agora há cercas empilháveis no jogo! + +O minecraftforum tem uma seção dedicada ao Xbox 360 Edition. + +Alguns animais seguirão você se tiver trigo na mão. + +Se um animal não puder se mover mais de 20 blocos em qualquer direção, ele não se desintegrará. + +Música de C418! + +Notch tem mais de um milhão de seguidores no twitter! + +Nem todas as pessoas na Suécia têm cabelos loiros. Alguns, como Jens de Mojang, são ruivos! + +Acreditamos que a 4J Studios removeu Herobrine do jogo no console Xbox 360, mas não temos certeza. + +No futuro haverá uma atualização deste jogo! + +Quem é Notch? + +Mojang tem mais prêmios que ajudantes! + +Algumas celebridades jogam Minecraft! + +deadmau5 curte o Minecraft! + +Não olhe diretamente para os bugs. + +Os Creepers nasceram de um bug de código. + +Isso é uma galinha ou um pato? + +Você estava na Minecon? + +Ninguém da Mojang já viu o rosto do Junkboy. + +Você sabia que existe um Wiki do Minecraft? + +O novo escritório da Mojang é maneiro! + +Minecraft: Xbox 360 Edition bateu muitos recordes! + +A Minecon 2013 foi em Orlando, na Flórida, EUA! + +.party() estava excelente! + +Considere os rumores sempre falsos, em vez de considerá-los verdadeiros! + +{*T3*}COMO JOGAR: NOÇÕES BÃSICAS{*ETW*}{*B*}{*B*} +Minecraft é um jogo que consiste em colocar blocos para construir qualquer coisa que imaginar. À noite os monstros aparecem; então, construa um abrigo antes que isso aconteça.{*B*}{*B*} +Use {*CONTROLLER_ACTION_LOOK*}para olhar à sua volta.{*B*}{*B*} +Use {*CONTROLLER_ACTION_MOVE*}para se mover.{*B*}{*B*} +Pressione {*CONTROLLER_ACTION_JUMP*}para pular.{*B*}{*B*} +Pressione {*CONTROLLER_ACTION_MOVE*}duas vezes para frente rapidamente para correr. Enquanto mantiver {*CONTROLLER_ACTION_MOVE*}pressionado para a frente, o personagem continuará correndo, a não ser que o tempo de corrida acabe ou que a Barra de Alimentos tenha menos de {*ICON_SHANK_03*}.{*B*}{*B*} +Mantenha {*CONTROLLER_ACTION_ACTION*}pressionado para extrair e cortar usando a mão ou o que estiver segurando. Talvez seja necessário fabricar uma ferramenta para extrair alguns blocos.{*B*}{*B*} +Se estiver segurando um item na mão, use {*CONTROLLER_ACTION_USE*}para utilizá-lo ou pressione {*CONTROLLER_ACTION_DROP*}para soltá-lo. + +{*T3*}COMO JOGAR: HUD{*ETW*}{*B*}{*B*} +O HUD mostra informações sobre seu status; sua energia, o oxigênio restante quando está debaixo da água, seu nível de fome (é preciso comer para reabastecer) e sua armadura, se estiver usando uma. Se você perder energia, mas tiver uma barrra de alimentos com 9 ou mais {*ICON_SHANK_01*}, sua energia será reabastecida automaticamente. Comer reabastece sua barra de alimentos. {*B*} +A Barra de Experiência também é mostrada aqui, com um valor numérico que mostra seu Nível de Experiência e a barra que indica quantos Pontos de Experiência são necessários para aumentar seu Nível de Experiência. Você ganha Pontos de Experiência coletando as Esferas de Experiência liberadas por multidões quando elas morrem, ao minerar alguns tipos de blocos, ao criar animais, pescar e fundir minérios na fornalha.{*B*}{*B*} +Também mostra os itens disponíveis para uso. Use {*CONTROLLER_ACTION_LEFT_SCROLL*}e {*CONTROLLER_ACTION_RIGHT_SCROLL*}para trocar o item em sua mão. + +{*T3*}COMO JOGAR: INVENTÃRIO{*ETW*}{*B*}{*B*} +Use {*CONTROLLER_ACTION_INVENTORY*}para ver seu inventário.{*B*}{*B*} +Essa tela mostra os itens disponíveis para uso em sua mão e todos os outros itens que está carregando. Sua armadura também é mostrada aqui.{*B*}{*B*} +Use{*CONTROLLER_MENU_NAVIGATE*}para mover o ponteiro. Use {*CONTROLLER_VK_A*}para pegar um item sob o ponteiro. Se houver mais de um item aqui, ele pegará todos ou você pode usar {*CONTROLLER_VK_X*}para pegar apenas metade deles.{*B*}{*B*} +Mova o item com o ponteiro sobre outro espaço no inventário e coloque-o lá usando {*CONTROLLER_VK_A*}. Se tiver vários itens no ponteiro, use {*CONTROLLER_VK_A*}para colocar todos ou {*CONTROLLER_VK_X*}para colocar apenas um.{*B*}{*B*} +Se o item sobre o qual você estiver for uma armadura, aparecerá uma dica de ferramenta para permitir a movimentação rápida para o espaço da armadura à direita no inventário. +É possível mudar a cor da sua Armadura de Couro, tingindo-a. Faça isso no menu do estoque, segurando a tinta com o cursor, e em seguida apertando{*CONTROLLER_VK_X*} enquanto o cursor estiver sobre a peça que deseja tingir. + + +{*T3*}COMO JOGAR: BAÚ{*ETW*}{*B*}{*B*} +Depois de criar um baú, poderá colocá-lo no mundo e usá-lo com{*CONTROLLER_ACTION_USE*} para guardar itens do seu inventário.{*B*}{*B*} +Use o ponteiro para mover itens entre o inventário e o baú.{*B*}{*B*} +Os itens no baú ficarão guardados lá para você até devolvê-los ao inventário mais tarde. + + +{*T3*}COMO JOGAR: BAÚ GRANDE{*ETW*}{*B*}{*B*} +Dois baús colocados lado a lado serão combinados para formar um Baú Grande. Ele pode guardar ainda mais itens. {*B*}{*B*} +É usado da mesma maneira que um baú normal. + + +{*T3*}COMO JOGAR: FABRICAÇÃO{*ETW*}{*B*}{*B*} +Na interface de fabricação, você pode combinar itens do seu inventário para criar novos tipos de itens. Use{*CONTROLLER_ACTION_CRAFTING*}para abrir a interface de fabricação.{*B*}{*B*} +Role pelas guias na parte superior usando{*CONTROLLER_VK_LB*}e{*CONTROLLER_VK_RB*}para selecionar o tipo de item que deseja criar e, em seguida, use {*CONTROLLER_MENU_NAVIGATE*}para selecionar o item a ser criado.{*B*}{*B*} +A área de fabricação mostra os itens necessários para criar o novo item. Pressione {*CONTROLLER_VK_A*}para criar o item e colocá-lo no inventário. + + +{*T3*}COMO JOGAR: BANCADA{*ETW*}{*B*}{*B*} +Você pode criar itens maiores usando uma bancada.{*B*}{*B*} +Coloque a bancada no mundo e pressione{*CONTROLLER_ACTION_USE*} para usá-la.{*B*}{*B*} +A fabricação de itens na bancada funciona da mesma maneira que a fabricação básica, mas você terá uma área maior para trabalhar e uma variedade maior de itens para criar. + + +{*T3*}COMO JOGAR: FORNALHA{*ETW*}{*B*}{*B*} +Com a fornalha você pode alterar os itens queimando-os. Por exemplo, você pode transformar minério de ferro em barras de ferro na fornalha.{*B*}{*B*} +Coloque a fornalha no mundo e pressione{*CONTROLLER_ACTION_USE*} para usá-la.{*B*}{*B*} +Você deve colocar combustível sob a fornalha e o item a ser queimado na parte superior. A fornalha acenderá e começará a funcionar.{*B*}{*B*} +Quando os itens estiverem queimados, você poderá movê-los da área de saída para seu inventário.{*B*}{*B*} +Se o item que você estiver examinando for um ingrediente ou combustível para a fornalha, aparecerão dicas de ferramenta para permitir a movimentação rápida para a fornalha. + + +{*T3*}COMO JOGAR: DISTRIBUIDOR{*ETW*}{*B*}{*B*} +O distribuidor é usado para projetar itens. Você deve colocar um acionador, como uma alavanca, ao lado do distribuidor para acioná-lo.{*B*}{*B*} +Para encher o distribuidor com itens, pressione{*CONTROLLER_ACTION_USE*} e mova os itens desejados do inventário para ele.{*B*}{*B*} +Então, quando usar o acionador, o distribuidor projetará um item. + + +{*T3*}COMO JOGAR : POÇÕES{*ETW*}{*B*}{*B*} +A criação de poções exige uma Barraca de Poções, que pode ser construída em uma bancada. Toda poção começa com uma garrafa de água, que é feita enchendo uma Garrafa de Vidro com água de um Caldeirão, ou de uma fonte de água.{*B*} +A Barraca de Poções tem três espaços para garrafas, para fazer três poções ao mesmo tempo. Um ingrediente pode ser usado em todas as três garrafas, então sempre faça três poções ao mesmo tempo para aproveitar melhor seus recursos.{*B*} +Ao colocar um ingrediente de poção na posição superior da Barraca de Poções, você terá uma poção básica depois de algum tempo. Ela não tem nenhum efeito por si só, mas se você colocar outro ingrediente com esta poção básica, terá uma poção com efeito.{*B*} +Depois que você tiver esta poção, pode adicionar um terceiro ingrediente para fazer o efeito durar mais tempo (usando pó de Redstone), para ser mais intenso (usando Pó de Glowstone) ou para ser uma poção maligna (usando o Olho de Aranha Fermentado).{*B*} +Você também pode adicionar pólvora a qualquer poção para transformá-la em uma Poção Tchibum, que pode ser atirada. Ao ser atirada, a Poção Tchibum aplicará o efeito da poção sobre toda a área em que cair.{*B*} + +Os ingredientes de origem das poções são :{*B*}{*B*} +* {*T2*}Verruga do Submundo{*ETW*}{*B*} +* {*T2*}Olho de Aranha{*ETW*}{*B*} +* {*T2*}Açúcar{*ETW*}{*B*} +* {*T2*}Lágrima de Ghast{*ETW*}{*B*} +* {*T2*}Pó de Chamas{*ETW*}{*B*} +* {*T2*}Creme de Magma{*ETW*}{*B*} +* {*T2*}Melão Cintilante{*ETW*}{*B*} +* {*T2*}Pó de Redstone{*ETW*}{*B*} +* {*T2*}Pò de Glowstone{*ETW*}{*B*} +* {*T2*}Olho de Aranha Fermentado{*ETW*}{*B*}{*B*} + +Você deve experimentar todas as combinações de ingredientes para descobrir todas as poções que pode fazer. + + +{*T3*}INSTRUÇÕES DE JOGO: FEITIÇOS{*ETW*}{*B*}{*B*} +Os Pontos de Experiência recolhidos quando um habitante morre ou quando certos blocos são extraídos ou fundidos numa fornalha podem ser usados para enfeitiçar algumas ferramentas, armaduras e livros.{*B*} +Quando é colocada uma Espada, Arco, Machado, Picareta, Pá, Armadura ou Livro no orifício por baixo do livro na Mesa de Feitiços, os três botões à direita do orifício apresentam alguns feitiços e os respectivos custos em Níveis de Experiência.{*B*} +Se você não tem Níveis de Experiência suficientes para usar, o custo aparecerá em vermelho, caso contrário, verde.{*B*}{*B*} +O feitiço aplicado é selecionado aleatoriamente com base no custo apresentado.{*B*}{*B*} +Se a Mesa de Feitiços estiver rodeada de Estantes (até um máximo de 15 Estantes), com um bloco de intervalo entre a Estante e a Mesa de Feitiços, o poder dos feitiços irá aumentar e serão vistos glifos misteriosos saindo do livro na Mesa de Feitiços.{*B*}{*B*} +Todos os ingredientes para uma Mesa de Feitiços podem ser encontrados nas aldeias, extraindo nas minas ou cultivando no mundo.{*B*}{*B} +Os Livros Encantados são usados na Bigorna para aplicar feitiços aos itens. Desta forma você tem maior controle sobre os feitiços que deseja em seus itens.{*B*} + + +{*T3*}COMO JOGAR: CRIAÇÃO DE ANIMAIS{*ETW*}{*B*}{*B*} +Para manter seus animais em um só lugar, construa uma área cercada de menos de 20x20 blocos e coloque seus animais nela. Isso fará com que ainda estejam lá quando você voltar para vê-los. + + +{*T3*}COMO JOGAR: REPRODUÇÃO DE ANIMAIS{*ETW*}{*B*}{*B*} +Os animais do Minecraft podem se reproduzir e produzir seus próprios filhotes!{*B*} +Para que os animais se reproduzam, você deve dar a comida certa a eles para que entrem no "Modo do Amor".{*B*} +Dê Trigo para uma vaca, vacogumelo ou ovelha, dê cenouras para um porco, dê Sementes de Trigo ou Verruga do Submundo a uma galinha ou dê qualquer tipo de carne a um lobo e eles começarão a procurar outro animal da mesma espécie que também esteja no Modo do Amor.{*B*} +Quando dois animais da mesma espécie se encontrarem e ambos estiverem no Modo do Amor, eles se beijarão por alguns segundos e um filhote aparecerá. O filhote seguirá seus pais durante algum tempo, até crescer e se transformar em um animal adulto.{*B*} +Depois de ficar no Modo do Amor, o animal não poderá entrar nele de novo por cinco minutos.{*B*} +Há um limite para o número de animais que é possível ter em um mundo; portanto, os animais não se reproduzirão quando você já tiver muitos. + +{*T3*}COMO JOGAR: PORTAL DO SUBMUNDO{*ETW*}{*B*}{*B*} +Pelo Portal do Submundo, o jogador pode viajar entre o mundo da Superfície e o Submundo. O Submundo pode ser usado para viajar rapidamente na Superfície, pois a distância de viagem, um bloco no Submundo, equivale a 3 blocos na Superfície; portanto, ao construir um portal no Submundo e sair por ele, você estará 3 vezes mais longe do seu ponto de entrada.{*B*}{*B*} +São necessários no mínimo 3 blocos de Obsidiana para construir o portal, que deve ter 5 blocos de altura, 4 blocos de largura e 1 bloco de espessura. Quando a estrutura do portal estiver pronta, o espaço interno deverá ser queimado para ativá-lo. Isso pode ser feito usando o item Sílex e Aço ou o item Carga de Fogo.{*B*}{*B*} +Exemplos de construção de portais são mostrados na figura à direita. + + +{*T3*}COMO JOGAR: MULTIJOGADOR{*ETW*}{*B*}{*B*} +O Minecraft no console Xbox 360 é um jogo multijogador por padrão. Se você estiver jogando em um modo de Alta Definição, poderá incluir outros jogadores conectando os controles e pressionando START em qualquer ponto durante o jogo.{*B*}{*B*} +Ao iniciar ou participar de um jogo online, ele estará visível para as pessoas de sua lista de amigos (a não ser que você tenha selecionado Só Convidados como host do jogo) e, se eles entrarem no jogo, também estará visível para as pessoas da lista de amigos deles (se você tiver selecionado a opção Permitir Amigos dos Amigos). +Quando estiver em um jogo, você poderá pressionar o botão BACK para ver a lista de todos os outros jogadores, ver os Cartões de Jogador deles, expulsar jogadores do jogo e convidar outras pessoas. + + +{*T3*}COMO JOGAR: COMPARTILHANDO CAPTURAS DE TELA{*ETW*}{*B*}{*B*} +Você pode capturar uma tela de seu jogo abrindo o menu Pausar e pressionando{*CONTROLLER_VK_Y*} para compartilhar no Facebook. Você verá uma versão em miniatura da captura de tela e poderá editar o texto associado à postagem no Facebook.{*B*}{*B*} +Há um modo de câmera especial para essas capturas de tela, para que você possa ver a frente do seu personagem na captura: pressione {*CONTROLLER_ACTION_CAMERA*}até ter uma visão frontal do personagem antes de pressionar {*CONTROLLER_VK_Y*}para compartilhar.{*B*}{*B*} +Gamertags não serão exibidas na captura de tela. + + +{*T3*}COMO JOGAR: BANINDO NÃVEIS{*ETW*}{*B*}{*B*} +Se você encontrar conteúdo ofensivo em um nível em que estiver jogando, poderá optar por adicioná-lo à sua lista de Níveis Banidos. +Para isso, abra o menu Pausar e pressione {*CONTROLLER_VK_RB*}para selecionar a dica de ferramenta de Banir Nível. +Se você tentar entrar nesse nível no futuro, será notificado de que ele está em sua lista de Níveis Banidos e poderá removê-lo da lista e continuar no nível ou sair. + +{*T3*}COMO JOGAR: MODO CRIATIVO{*ETW*}{*B*}{*B*} +A interface do modo criativo permite que qualquer item do jogo seja movido para o inventário do jogador sem precisar minerar ou fabricar aquele item. +Os itens no inventário do jogador não serão removidos quando forem colocados ou usados no mundo, e desta forma o jogador pode se concentrar na construção, em vez de coletar recursos.{*B*} +Se você criar, carregar ou salvar um mundo no Modo Criativo, as atualizações de conquistas e de placar de líderes estarão desabilitadas nesse mundo, mesmo que ele seja carregado depois no Modo Sobrevivência.{*B*} +Para voar quando estiver no Modo Criativo, pressione {*CONTROLLER_ACTION_JUMP*}duas vezes rapidamente. Para parar de voar, repita a ação. Para voar mais rápido, pressione {*CONTROLLER_ACTION_MOVE*}rapidamente duas vezes para frente enquanto estiver voando. +No modo de voo, você pode manter pressionado {*CONTROLLER_ACTION_JUMP*}para se mover para cima e {*CONTROLLER_ACTION_SNEAK*}para se mover para baixo ou usar {*CONTROLLER_ACTION_DPAD_UP*}para se mover para cima, {*CONTROLLER_ACTION_DPAD_DOWN*}para se mover para baixo, +{*CONTROLLER_ACTION_DPAD_LEFT*}para se mover para a esquerda e {*CONTROLLER_ACTION_DPAD_RIGHT*}para se mover para a direita. + +{*T3*}COMO JOGAR: OPÇÕES DE HOST E JOGADOR{*ETW*}{*B*}{*B*} + +{*T1*}Opções de Jogo{*ETW*}{*B*} +Ao carregar ou criar um mundo, você pode pressionar o botão "Mais Opções" para entrar em um menu que permita maior controle sobre o jogo.{*B*}{*B*} + + {*T2*}Jogador x Jogador{*ETW*}{*B*} + Quando habilitado, os jogadores podem causar danos a outros jogadores. Afeta somente o modo Sobrevivência.{*B*}{*B*} + + {*T2*}Confiar nos Jogadores{*ETW*}{*B*} + Quando desabilitado, os jogadores que entram no jogo têm restrições quanto ao que podem fazer. Eles não podem minerar nem usar itens, colocar blocos, usar portas e interruptores, usar recipientes nem atacar jogadores ou animais. Você pode mudar estas opções de um jogador específico usando o menu do jogo.{*B*}{*B*} + + {*T2*}Fogo Espalha{*ETW*}{*B*} + Quando habilitado, o fogo poderá se espalhar até blocos inflamáveis próximos. Esta opção também pode ser mudada no jogo.{*B*}{*B*} + + {*T2*}TNT Explode{*ETW*}{*B*} + Quando habilitado, a TNT explodirá quando ativada. Esta opção também pode ser mudada no jogo.{*B*}{*B*} + + {*T2*}Privilégios do Host{*ETW*}{*B*} + Quando habilitado, o host pode ativar ou desativar no menu do jogo sua habilidade de voar, desativar a exaustão e ficar invisível. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + +{*T1*}Opções de Geração de Mundo{*ETW*}{*B*} +Ao criar um novo mundo, há algumas opções adicionais.{*B*}{*B*} + + {*T2*}Gerar Estruturas{*ETW*}{*B*} + Quando habilitado, estruturas como Vilas ou Fortalezas serão geradas no mundo.{*B*}{*B*} + + {*T2*}Mundo Superplano{*ETW*}{*B*} + Quando habilitado, um mundo completamente plano será gerado na Superfície e no Submundo.{*B*}{*B*} + + {*T2*}Baú de Bônus{*ETW*}{*B*} + Quando habilitado, um baú contendo alguns itens úteis será criado perto do ponto de criação do jogador.{*B*}{*B*} + + {*T2*}Reiniciar Submundo{*ETW*}{*B*} + Quando ativado, o Submundo é recriado. É útil quando se tem um jogo salvo mais antigo em que as Fortalezas do Submundo não estavam presentes.{*B*}{*B*} + + {*T1*}Opções no Jogo{*ETW*}{*B*} + Durante o jogo, várias opções podem ser acessadas pressionando BACK para abrir o menu do jogo.{*B*}{*B*} + + {*T2*}Opções do Host{*ETW*}{*B*} + O jogador host e os jogadores definidos como moderadores podem acessar o menu "Opção do Host". Neste menu, eles podem habilitar e desabilitar as opções Fogo Espalha e TNT Explode.{*B*}{*B*} + +{*T1*}Opções do Jogador{*ETW*}{*B*} +Para modificar os privilégios de um jogador, selecione o nome dele e pressione {*CONTROLLER_VK_A*} para abrir o menu privilégios do jogador, onde você poderá usar as opções a seguir.{*B*}{*B*} + + {*T2*}Pode Construir e Minerar{*ETW*}{*B*} + Esta opção só está disponível quando "Confiar nos Jogadores" está ativado. Quando esta opção está habilitada, o jogador pode interagir com o mundo normalmente. Quando está desativada, o jogador não pode colocar nem destruir blocos, nem interagir com muitos itens e blocos.{*B*}{*B*} + + {*T2*}Pode utilizar portas e interruptores{*ETW*}{*B*} + Esta opção só está disponível quando “Confiar nos Jogadores†está desativada. Quando esta opção estiver desabilitada, o jogador não poderá utilizar portas e interruptores.{*B*}{*B*} + + {*T2*}Pode abrir containers{*ETW*}{*B*} + Esta opção só está disponível quando “Confiar nos Jogadores†está desativada. Quando esta opção estiver desabilitada, o jogador não poderá abrir containers, tais como baús.{*B*}{*B*} + + {*T2*}Pode Atacar Jogadores{*ETW*}{*B*} + Esta opção só está disponível quando "Confiar nos Jogadores" está desativado. Quando esta opção estiver desabilitada o jogador não poderá causar danos a outros jogadores.{*B*}{*B*} + + {*T2*}Pode atacar animais{*ETW*}{*B*} + Esta opção só está disponível quando “Confiar nos Jogadores†está desativada. Quando a opção estiver desabilitada, o jogador não poderá causar nenhum dano em animais.{*B*}{*B*} + + {*T2*}Moderador{*ETW*}{*B*} + Quando esta opção está habilitada, o jogador pode usar algumas das opções do menu do jogo para mudar privilégios de outros jogadores e algumas opções de mundo.{*B*}{*B*} + + {*T2*}Expulsar Jogador{*ETW*}{*B*} + Para os jogadores que não estão no mesmo console {*PLATFORM_NAME*} que o jogador host, selecionar esta opção faz o jogador e todos os jogadores que estiverem no console {*PLATFORM_NAME*} dele serem expulsos do jogo. Este jogador não poderá voltar ao jogo até que ele seja reiniciado.{*B*}{*B*} + +{*T1*}Opções do Jogador Host{*ETW*}{*B*} +Se "Privilégios do Host" estiver habilitado, o jogador host poderá modificar alguns privilégios para si mesmo. Para modificar os privilégios de um jogador, selecione o nome dele e pressione {*CONTROLLER_VK_A*} para abrir o menu privilégios do jogador, onde você pode usar as opções a seguir.{*B*}{*B*} + + {*T2*}Pode Voar{*ETW*}{*B*} + Quando esta opção está habilitada, o jogador pode voar. Esta opção só afeta o modo de Sobrevivência, pois todos os jogadores podem voar no modo Criativo.{*B*}{*B*} + + {*T2*}Desabilitar Exaustão{*ETW*}{*B*} + Esta opção só afeta o modo de Sobrevivência. Quando habilitado, as atividades físicas (voar/correr/pular etc.) não diminuem a barra de alimentos. Entretanto, se o jogador estiver ferido, a barra de alimentos diminuirá lentamente enquanto ele estiver se curando.{*B*}{*B*} + + {*T2*}Invisível{*ETW*}{*B*} + Quando esta opção está habilitada, o jogador não está visível para outros jogadores e é invulnerável.{*B*}{*B*} + + {*T2*}É possível Teleportar{*ETW*}{*B*} + Isto permite que o jogador mova a si mesmo ou outros jogadores para outros jogadores no mundo. + + +Próxima Página + +Página Anterior + +Noções Básicas + +HUD + +Inventário + +Baús + +Fabricação + +Fornalha + +Distribuidor + +Criação de Animais + +Reprodução de Animais + +Poções + +Feitiços + +Portal do Submundo + +Multijogador + +Compartilhando Capturas de Tela + +Banindo Níveis + +Modo Criativo + +Opções de Host e Jogador + +Negociando + +Bigorna + +Final + +{*T3*}COMO JOGAR: O FINAL{*ETW*}{*B*}{*B*} +O Final é outra dimensão no jogo que se alcança através de um Portal Final ativo. O Portal Final pode ser encontrado em uma Fortaleza, nas profundezas da Superfície.{*B*} +Para ativar o Portal Final, você terá de colocar um Olho de Ender em qualquer Estrutura do Portal Final que não tenha um.{*B*} +Quando o portal estiver ativo, pule nele para ir para o Final.{*B*}{*B*} +No Final você encontrará o Dragão Ender, um inimigo violento e poderoso, além de muitos Endermens; então, prepare-se muito bem para a batalha antes de ir para lá!{*B*}{*B*} +Você encontrará Cristais de Ender sobre oito estacas de Obsidiana que o Dragão Ender usa para se curar; +portanto, a primeira etapa da batalha é destruir cada uma delas.{*B*} +As primeiras é possível alcançar com flechas, mas as últimas estão protegidas por uma gaiola com Cerca de Ferro e você terá de chegar até elas.{*B*}{*B*} +Enquanto estiver fazendo isso, o Dragão Ender estará atacando você, voando em você e cuspindo bolas de ácido Ender.{*B*} +Se você se aproximar do Pódio do Ovo no centro das estacas, o Dragão Ender voará para baixo e o atacará e é nesse momento que você pode realmente causar algum dano a ele!{*B*} +Evite o sopro ácido e mire nos olhos do Dragão Ender para obter os melhores resultados. Se possível, traga alguns amigos para o Final para ajudá-lo na batalha.{*B*}{*B*} +Quando você estiver no Final, seus amigos poderão ver a localização do Portal Final dentro da Fortaleza nos respectivos mapas; +portanto, poderão facilmente se juntar a você. + + +Correr + +O Que Há de Novo + + +{*T3*}Alterações e adições {*ETW*}{*B*}{*B*} +- Novos itens adicionados -Esmeralda, Minério de Esmeralda, Bloco de Esmeralda, Baú Ender, Gancho Disparador, Maçã Dourada Encantada, Bigorna, Vaso de Flor, Parede de Paralelepípedos, Paredes de Parelelepípedos com Musgo, Pintura Podre, Batata, Batata Cozida, Batata Venenosa, Cenoura, Cenoura Dourada, Cenoura na Vareta, Torta de Abóbora, Poção de Visão Noturna, Poção da Invisibilidade, Quartzo, Minério de Quartzo, Bloco de Quartzo, Laje de Quartzo, Escada de Quartzo, Bloco de Quartzo Cinzelado, Coluna de Bloco de Quartzo, Livro Encantado, Tapete.{*B*} +- Novos recipientes adicionados para arenito macio e arenito cinzelado.{*B*} +- Nova multidão adicionada - Aldeões zumbis.{*B*} +- Adicionados novos recursos de geração de terreno - Templos do Deserto, Aldeias Desertas, Templos de Selva.{*B*} +- Adicionado o comércio com aldeões.{*B*} +- Adicionada interface de bigorna.{*B*} +- Armadura de couro tingido.{*B*} +- Colar de lobo tingido.{*B*} +- Montaria no porco com uma cenoura na vareta.{*B*} +- Bônus de baú melhorado contendo mais itens.{*B*} +- Alteradas as posições de meio blocos e outros blocos em meio blocos.{*B*} +- Alteradas as posições de escadas invertidas e lajes.{*B*} +- Adicionadas profissões de cidadões.{*B*} +- Cidadãos vindos de ovos terão uma profissão aleatória.{*B*} +- Adicionado log unilateral.{*B*} +- Fornos podem usar ferramentas de madeira como combustível.{*B*} +- Painéis de gelo e vidro podem ser coletados com pequenos toques de ferramentas encantadas.{*B*} +- Botões de madeira e pratos de pressão de madeira podem ser ativados com flechas.{*B*} +- Pequenas multidões podem aparecer em portais no submundo.{*B*} +- Rastejantes e aranhas são agressivos com o último jogador que acertá-los.{*B*} +- Multidões no modo criativo ficam neutras novamente depois de um curto período.{*B*} +- Contra-ataque removido quando afogar.{*B*} +- Portas sendo quebradas por zumbis mostram danos.{*B*} +- Gelo derrete no submundo.{*B*} +- Calderões enchem quando estiver sem chuva.{*B*} +- Pistões levam o dobro de tempo para melhorar.{*B*} +- O Porco derruba a cela ao ser morto (se tiver uma).{*B*} +- Cor do céu No Fim alterada.{*B*} +- Barbante pode ser substituído (por corda).{*B*} +- Chuva pinga das folhas.{*B*} +- Alavancas podem ser colocadas em baixo dos blocos.{*B*} +- TNT causa dano variável dependendo da configuração de dificuldade.{*B*} +- Livro de receitas alterado.{*B*} +- Barcos quebram lírios, ao invés de lírios quebrarem barcos.{*B*} +- Porcos oferecem mais costeletas.{*B*} +- Lodos aparecem menos em mundos retos.{*B*} +- Rastejadores têm danos variáveis baseado na configuração de dificuldade, mais contra-ataque.{*B*} +- Endermen consertados para não abrir suas mandíbulas.{*B*} +- Adicionado teleporte de jogadores (usando o menu {*BACK_BUTTON*} no jogo).{*B*} +-Adicionados novas opções de vôo, invisibilidade e invulnerabilidade para jogadores remotos.{*B*} +- Adicionados novos tutoriais para o Mundo do Tutorial para novos itens e recursos.{*B*} +- Melhorada a posição para o baú de discos musicais no Mundo do Tutorial.{*B*} + + +{*ETB*}Bem-vindo de volta! Talvez você não tenha notado que o seu Minecraft foi atualizado.{*B*}{*B*} +Há muitos recursos novos para você e seus amigos experimentarem, aqui estão apenas alguns destaques. Dê uma lida e divirta-se!{*B*}{*B*} +{*T1*}Novos itens{*ETB*} - Esmeralda, Minério de Esmeralda, Bloco de Esmeralda, Baú Ender, Gancho Disparador, Maçã Dourada Encantada, Bigorna, Vaso de Flor, Parede de Paralelepípedos, Paredes de Parelelepípedos com Musgo, Pintura Podre, Batata, Batata Cozida, Batata Venenosa, Cenoura, Cenoura Dourada, Cenoura na Vareta, Torta de Abóbora, Poção de Visão Noturna, Poção da Invisibilidade, Quartzo, Minério de Quartzo, Bloco de Quartzo, Laje de Quartzo, Escada de Quartzo, Bloco de Quartzo Cinzelado, Coluna de Bloco de Quartzo, Livro Encantado, Tapete{*B*}{*B*} +{*T1*}Novas multidões{*ETB*} - Aldeões zumbis.{*B*}{*B*}\r\n{*T1*}Novos recursos{*ETB*} - Comércio com aldeões, consertar ou encantar armas e ferramentas com uma Bigorna, armazenar itens em um Baú Ender, controle de um porco enquanto o monta usando uma cenoura na vareta!{*B*}{*B*}\r\n{*T1*}Novos Mini-tutoriais{*ETB*} – Saiba como usar os novos recursos no Tutorial do Mundo!{*B*}{*B*}\r\n{*T1*}Novos "Ovos de Páscoa"{*ETB*} – Movemos todos os Discos de música secretos no Mundo do Tutorial. Veja se consegue encontrá-los novamente!{*B*}{*B*}\r\n + +Causa mais danos que à mão. + +Usada para cavar terra, grama, areia, cascalho e neve mais rápido que à mão. As pás são necessárias para cavar bolas de neve. + +Necessário para extrair blocos relacionados à pedra e minério. + +Usado para cortar blocos relacionados à madeira mais rápido que à mão. + +Usada para trabalhar blocos de terra e grama para preparar para plantação. + +Portas de madeira são ativadas quando usadas, atingidas ou com Redstone. + +Portas de ferro só podem ser abertas com Redstone, botões ou acionadores. + +NOT USED + +NOT USED + +NOT USED + +NOT USED + +Fornece 1 de Armadura ao usuário. + +Dá ao usuário 3 de Armadura quando usado. + +Fornece 2 de Armadura ao usuário. + +Fornece 1 de Armadura ao usuário. + +Fornece 2 de Armadura ao usuário. + +Fornece 5 de Armadura ao usuário. + +Dá ao usuário 4 de Armadura quando usado. + +Fornece 1 de Armadura ao usuário. + +Fornece 2 de Armadura ao usuário. + +Fornece 6 de Armadura ao usuário. + +Fornece 5 de Armadura ao usuário. + +Fornece 2 de Armadura ao usuário. + +Fornece 2 de Armadura ao usuário. + +Fornece 5 de Armadura ao usuário. + +Dá ao usuário 3 de Armadura quando usado. + +Fornece 1 de Armadura ao usuário. + +Dá ao usuário 3 de Armadura quando usado. + +Fornece 8 de Armadura ao usuário. + +Fornece 6 de Armadura ao usuário. + +Dá ao usuário 3 de Armadura quando usado. + +Uma barra brilhante que pode ser usada para fabricar ferramentas desse material. Criada ao fundir minério na fornalha. + +Permite fabricar barras, pedras preciosas ou corantes em blocos posicionáveis. Pode ser usado como um bloco caro de construção ou para armazenamento compacto do minério. + +Usado para enviar carga elétrica quando pisado por um jogador, animal ou monstro. As chapas de pressão de madeira também podem ser ativadas deixando algo cair sobre elas. + +Usada para obter escadas compactas. + +Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criam um bloco de degrau duplo de tamanho normal. + +Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criarão um bloco com dois degraus e com tamanho normal. + +Usada para iluminar. As tochas também derretem neve e gelo. + +Usada como material de construção; pode ser usada para fabricar muitas coisas. Pode ser fabricada com qualquer tipo de madeira. + +Usado como material de construção. Não sofre ação da gravidade como a areia normal. + +Usado como material de construção. + +Usado para fabricar tochas, flechas, placas, escadas de mão, cercas e como cabos de ferramentas e armas. + +Usada para adiantar o tempo de qualquer ponto da noite até a manhã, se todos os jogadores no mundo estiverem na cama, e mudar o ponto de criação do jogador. +As cores da cama são sempre as mesmas, independentemente da cor da lã usada. + +Permite fabricar maior variedade de itens que a fabricação normal. + +Permite fundir minério, fazer carvão e vidro e cozinhar peixe e costeletas de porco. + +Armazena blocos e itens no interior. Coloque dois baús lado a lado para criar um baú maior com o dobro da capacidade. + +Usado como barreira que não pode ser pulada. Conta como 1,5 bloco de altura para jogadores, animais e monstros, mas como 1 bloco de altura para outros blocos. + +Usada para escalar verticalmente. + +Ativados quando usados, atingidos ou com Redstone. Funcionam como portas normais, mas são blocos de um por um e são colocados diretamente no chão. + +Mostra o texto digitado por você ou por outros jogadores. + +Usado para iluminar mais que tochas. Derrete neve/gelo e pode ser usado embaixo d'água. + +Usado para causar explosões. Ativado após a colocação com ignição por Sílex e Aço ou com carga elétrica. + +Usada para guardar sopa de cogumelo. Você fica com a vasilha depois de comer a sopa. + +Usado para guardar e transportar água, lava e leite. + +Usado para armazenar e transportar água. + +Usado para armazenar e transportar lava. + +Usado para armazenar e transportar leite. + +Usado para criar fogo, detonar TNT e abrir um portal depois de construído. + +Usada para pegar peixes. + +Mostra as posições do sol e da lua. + +Aponta para seu ponto inicial. + +Cria uma imagem da área explorada enquanto você o segura. Pode ser usado para encontrar caminhos. + +Permite ataques à distância usando flechas. + +Usada como munição para arcos. + +Restaura 2,5{*ICON_SHANK_01*}. + +Restaura 1{*ICON_SHANK_01*}. Pode ser usado 6 vezes. + +Restaura 1{*ICON_SHANK_01*}. + +Restaura 1{*ICON_SHANK_01*}. + +Restaura 3{*ICON_SHANK_01*}. + +Restaura 1{*ICON_SHANK_01*}, ou pode ser cozinhado na fornalha. Comer assim pode te envenenar. + +Restaura 3{*ICON_SHANK_01*}. Criado ao cozinhar a carne crua na fornalha. + +Restaura 1,5{*ICON_SHANK_01*}, ou pode ser cozinhado na fornalha. + +Restaura 4{*ICON_SHANK_01*}. Criado ao cozinhar a carne crua na fornalha. + +Restaura 1.5{*ICON_SHANK_01*}, ou pode ser cozinhado na fornalha. + +Restaura 4{*ICON_SHANK_01*}. Criado ao cozinhar a carne crua na fornalha. + +Restaurar 1{*ICON_SHANK_01*} ou pode ser cozinhado na fornalha. Também pode ser dado para o Ocelote comer, para torná-lo amigável. + +Restaurar 2,5{*ICON_SHANK_01*}. Criado ao cozinhar a carne crua na fornalha. + +Restaura 2{*ICON_SHANK_01*} e pode ser usada para fabricar uma maçã dourada. + +Restaura 2{*ICON_SHANK_01*} e regenera a energia por 4 segundos. Criado com uma maçã e barras de ouro. + +Restaura 2{*ICON_SHANK_01*}. Comer isso pode te envenenar. + +Usado em receita de bolo, e como ingrediente de poções. + +Usado para enviar uma carga elétrica ao ser ligado ou desligado. Fica na posição ligado ou desligado até ser apertado novamente. + +Envia constantemente uma carga elétrica ou pode ser usado como receptor/transmissor quando conectado à lateral de um bloco. +Também pode ser usado para pouca iluminação. + +Usado em circuitos de Redstone como repetidor, retardador e/ou diodo. + +Usado para enviar uma carga elétrica ao ser pressionado. Continua ativado por cerca de um segundo antes de desligar novamente. + +Usado para guardar e projetar itens em ordem aleatória quando recebe uma carga de Redstone. + +Reproduz uma nota quando acionado. Acerte-o para alterar o tom da nota. Se for colocado sobre blocos diferentes, alterará o tipo de instrumento. + +Usado para guiar carrinhos de minas. + +Quando ativado, acelera os carrinhos de minas que passam sobre ele. Quando desativado, faz os carrinhos pararem nele. + +Funciona como uma chapa de pressão (envia um sinal Redstone quando ativado), mas só pode ser ativado por um carrinho de minas. + +Usado para transportar você, um animal ou um monstro sobre trilhos. + +Usado para transportar mercadorias sobre trilhos. + +Andará sobre trilhos e poderá empurrar outros carrinhos de minas, se for colocado carvão nele. + +Usado para viajar pela água mais rapidamente do que nadando. + +Coletada das ovelhas, pode ser tingida com corantes. + +Usado como material de construção e pode ser tingido com corantes. Esta receita não é recomendada porque a lã pode ser obtida facilmente das ovelhas. + +Usado como corante para criar lã preta. + +Usado como corante para criar lã verde. + +Usado como corante para criar lã marrom, como ingrediente de biscoitos ou para cultivar Vagens de Cacau. + +Usado como corante para criar lã prateada. + +Usado como corante para criar lã amarela. + +Usado como corante para criar lã vermelha. + +Usado para fazer brotar instantaneamente colheitas, árvores, grama alta, cogumelos enormes e flores. Pode ser usado em receitas de corantes. + +Usado como corante para criar lã rosa. + +Usado como corante para criar lã laranja. + +Usado como corante para criar lã verde-lima. + +Usado como corante para criar lã cinza. + +Usado como corante para criar lã cinzenta. +(Observação: o corante cinzento também pode ser criado combinando corante cinza com farelo de osso, permitindo criar quatro corantes cinzentos com cada saco de tinta, em vez de três.) + +Usado como corante para criar lã azul-claro. + +Usado como corante para criar lã ciano. + +Usado como corante para criar lã roxa. + +Usado como corante para criar lã magenta. + +Usado como corante para criar lã azul. + +Toca discos de música. + +Usado para criar ferramentas, armas ou armaduras muito fortes. + +Usado para iluminar mais que tochas. Derrete neve/gelo e pode ser usado embaixo d'água. + +Usado para criar livros e mapas. + +Usado para criar uma estante de livros ou enfeitiçado para fazer Livros Encantados. + +Permite a criação de feitiços mais poderosos quando colocado ao redor de uma Mesa de Feitiços. + +Usada como decoração. + +Pode ser extraído com uma picareta de ferro ou de material melhor e depois fundido na fornalha para produzir barras de ouro. + +Pode ser extraído com uma picareta de pedra ou de material melhor e depois fundido na fornalha para produzir barras de ferro. + +Pode ser extraído com uma picareta para coletar carvão. + +Pode ser extraído com uma picareta de pedra ou de material melhor para coletar lápis-azul. + +Pode ser extraído com uma picareta de ferro ou de material melhor para coletar diamantes. + +Pode ser extraído com uma picareta de ferro ou de material melhor para coletar pó de redstone. + +Pode ser extraída com uma picareta para coletar pedregulhos. + +Coletada com uma pá. Pode ser usada para construção. + +Pode ser plantada e quando crescer será uma árvore. + +Não pode ser quebrada. + +Ateia fogo em qualquer coisa que a toca. Pode ser coletada em um balde. + +Coletada com uma pá. Pode ser fundida em vidro usando a fornalha. Sofrerá ação da gravidade se não houver outra peça sob ela. + +Coletado com uma pá. Pode produzir sílex quando cavado. Sofrerá ação da gravidade se não houver outra peça sob ele. + +Cortada com um machado; pode ser usada para fabricar tábuas ou como combustível. + +Criado na fornalha ao fundir areia. Pode ser usado para construção, mas quebrará se tentar extraí-lo. + +Extraído de pedra usando uma picareta. Pode ser usado para construir uma fornalha ou ferramentas de pedra. + +Argila cozida na fornalha. + +Pode ser cozida na fornalha para fazer tijolos. + +Quando quebrado, derruba bolas de argila que podem ser cozidas para fazer tijolos na fornalha. + +Um modo compacto de armazenar bolas de neve. + +Pode ser cavada com uma pá para criar bolas de neve. + +Pode produzir sementes de trigo quando quebrada. + +Pode ser usada para fabricar corante. + +Pode ser combinado com uma vasilha para fabricar sopa. + +Só pode ser extraída com uma picareta de diamante. É produzida pelo encontro de água e lava parada e é usada para construir um portal. + +Gera monstros no mundo. + +É colocado no chão para transportar uma carga elétrica. Quando cozido com uma poção, aumentará a duração do efeito. + +Quando alcançarem a fase de pleno crescimento, as colheitas poderão ser coletadas para obter trigo. + +Solo que foi preparado para o plantio de sementes. + +Pode ser cozido em uma fornalha para fabricar corante verde. + +Pode ser usada para fabricar açúcar. + +Pode ser usada como capacete ou combinada com uma tocha para fabricar uma lanterna de abóbora. Também é o ingrediente principal da Torta de Abóbora. + +Queima para sempre se for acesa. + +Torna mais lento o movimento de quem anda sobre ele. + +Pare no portal para atravessar entre a Superfície e o Submundo. + +Usado como combustível na fornalha ou para fabricar uma tocha. + +Coletado ao matar uma aranha e pode ser usado para fabricar um arco ou vara de pescar, ou colocado no chão para criar um Disparador. + +Coletada ao matar uma galinha e pode ser usada para fabricar uma flecha. + +Coletada ao matar um creeper e pode ser usada para fabricar TNT, ou usada como ingrediente em poções. + +Pode ser plantada no campo para colheita. Verifique se há luz suficiente para as sementes crescerem! + +Coletado nas colheitas e pode ser usado para fabricar alimentos. + +Coletado ao cavar cascalho e pode ser usado para fabricar sílex e aço. + +Quando usada em um porco, permite montar nele. O porco poderá ser direcionado usando uma cenoura na vareta. + +Coletada ao cavar neve e pode ser atirada. + +Coletado ao matar uma vaca e pode ser usado para fabricar uma armadura ou para fazer livros. + +Coletado ao matar um slime, e usado como ingrediente de poções ou fabricar Pistões Aderentes. + +As galinhas soltam aleatoriamente e pode ser usado para fabricar alimentos. + +Coletado ao extrair Glowstone e pode ser usado para fabricar blocos de Glowstone novamente ou cozido com uma poção para aumentar a potência do efeito. + +Coletado ao matar um esqueleto. Pode ser usado para fabricar farelo de osso. Você pode alimentar um lobo com isto para domá-lo. + +Coletado ao fazer um esqueleto matar um creeper. Pode ser tocado em uma jukebox. + +Apaga o fogo e ajuda as plantações a crescerem. Pode ser coletada em um balde. + +Quando quebrada, às vezes derruba uma muda que pode ser replantada para se tornar uma árvore. + +Encontrada em masmorras, pode ser usada para construção e decoração. + +Usado para obter lã da ovelha e colher blocos de folhas. + +Quando acionado (usando um botão, alavanca, placa de pressão, tocha de redstone ou redstone com algum destes), um pistão estende-se, se possível, e empurra blocos. + +Quando acionado (usando um botão, alavanca, placa de pressão, tocha de redstone ou redstone com algum destes), um pistão estende-se, se possível, e empurra blocos. Quando se retrai, puxa o bloco novamente, tocando a parte estendida do pistão. + +Feita com blocos de pedra, geralmente encontrada em Fortalezas. + +Usado como barreira, semelhante às cercas. + +Semelhante a uma porta, mas usado principalmente com cercas. + +Pode ser fabricado com Fatias de Melão. + +Blocos transparentes que podem ser usados no lugar dos blocos de vidro. + +Podem ser plantadas para cultivar abóboras. + +Podem ser plantadas para cultivar melões. + +Derrubado pelo Enderman quando ele morre. Quando atirado, o jogador será teleportado até a posição em que a Pérola do Ender cair e perderá um pouco de energia. + +Um bloco de terra com grama crescendo sobre ela. Coletado usando uma pá. Pode ser usado para construção. + +Pode ser usada para construção e decoração. + +Deixa o movimento mais lento quando atravessada. Pode ser destruída usando tosquiadeiras para coletar fios. + +Cria uma Traça quando destruída. Também pode criar Traças se estiver perto de outra Traça que esteja sendo atacada. + +Cresce ao longo do tempo quando colocada. Pode ser coletada usando tosquiadeiras. Pode ser escalada como uma escada. + +É escorregadio. Transforma-se em água se estiver sobre outro bloco quando destruído. Derrete se estiver muito perto de uma fonte de luz ou quando colocado no Submundo. + +Pode ser usado como decoração. + +Usado para fazer poções e para localizar Fortalezas. É derrubado pelas Chamas que ficam dentro ou perto das Fortalezas do Submundo. + +Usado para fazer poções. É derrubado pelos Ghasts, quando eles morrem. + +É derrubado pelos Homens-Porco Zumbis quando eles morrem. Os Homens-Porco Zumbis podem ser encontrados no Submundo. É usado como ingrediente de poções. + +Usado para fazer poções. Pode ser encontrado naturalmente nas Fortalezas do Submundo. Também pode ser plantado na Areia Movediça. + +Quando usada pode ter vários efeitos, dependendo de onde for usada. + +Pode ser enchida com água e usada como o ingrediente inicial de uma poção na Barraca de Poções. + +Este é um alimento venenoso e item de poção. É derrubado quando uma Aranha ou Aranha de Caverna é morta por um jogador. + +Usado para fazer poções, especialmente para criar poções com efeito negativo. + +Usado para fazer poções ou fabricado com outros itens para fazer o Olho de Ender ou o Creme de Magma. + +Usado para fazer poções. + +Usado para fazer Poções e Poções Tchibum. + +Pode ser enchido com água usando um balde de água, e pode ser usado para encher Garrafas de Vidro com água. + +Quando atirado, mostrará a direção para um Portal Final. Quando doze deles forem colocados nas estruturas do Portal Final, o Portal Final será ativado. + +Usado para fazer poções. + +Similar aos Blocos de Grama, mas muito bom para cultivar cogumelos. + +Flutua na água e permite andar em cima. + +Usado para construir Fortalezas do Submundo. É imune às bolas de fogo do Ghast. + +Usado em Fortalezas do Submundo. + +Encontrado em Fortalezas do Submundo; derruba Verrugas do Submundo quando quebrado. + +Desta forma os jogadores podem enfeitiçar Espadas, Picaretas, Machados, Pás, Arcos e Armadura, usando os Pontos de Experiência do jogador. + +Isto pode ser ativado usando doze Olhos de Ender, e o jogador poderá viajar até a dimensão Final. + +Usado para formar um Portal Final. + +Um tipo de bloco encontrado no Final. Ele tem resistência muito alta a explosões, portanto, é bem útil para construções. + +Este bloco é criado ao derrotar o Dragão no Final. + +Quando atirada, derruba Esferas de Experiência que aumentam seus pontos de experiência quando coletadas. + +Útil para incendiar as coisas, ou para iniciar fogos aleatórios quando lançado de um Distribuidor. + +É semelhante a uma vitrine e exibirá o item ou bloco colocado nele. + +Quando lançado pode criar uma criatura do tipo indicado. + +Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criam um bloco de degrau duplo de tamanho normal. + +Usado para fazer escadas longas. Dois degraus colocados um sobre o outro criam um bloco de degrau duplo de tamanho normal. + +Criado pela fusão de Pedra Inflamável em uma fornalha. Pode ser transformado em Blocos do Submundo. + +Quando carregado, ele emite luz. + +Pode ser cultivado para coletar grãos de cacau. + +As Cabeças de multidão podem ser colocadas como decoração, ou usadas como máscara na abertura do capacete. + +Lula + +Solta sacos de tinta quando morta. + +Vaca + +Solta couro quando morta. Pode ser ordenhada com um balde. + +Ovelha + +Solta lã quando tosquiada (se já não tiver sido tosquiada). Pode ser tingida para produzir lã de cores diferentes. + +Galinha + +Solta penas quando morta e põe ovos aleatoriamente. + +Porco + +Solta costeletas quando morto. Pode ser montado usando uma sela. + +Lobo + +Dócil até ser atacado, quando atacará de volta. Pode ser domado usando ossos, o que faz o lobo segui-lo e atacar qualquer coisa que ataque você. + +Creeper + +Explode se você chegar muito perto! + +Esqueleto + +Dispara flechas em você. Solta flechas quando morto. + +Aranha + +Ataca quando você chega perto. Escala paredes. Solta fio quando morta. + +Zumbi + +Ataca quando você chega perto. + +Homem-porco zumbi + +Inicialmente dócil, mas ataca em grupos se você ataca um deles. + +Ghast + +Atira bolas de fogo em você, que explodem ao contato. + +Slime + +Divide-se em slimes menores quando atingido. + +Enderman + +Atacará se você olhar para ele. Também pode mover blocos. + +Traça + +Atrai as Traças próximas quando atacada. Esconde-se em blocos de pedra. + +Aranha de Caverna + +Tem uma mordida venenosa. + +Vacogumelo + +Faz sopa de cogumelo quando usada com uma vasilha. Derruba cogumelos e torna-se uma vaca normal depois de tosquiada. + +Golem de Neve + +O Golem de Neve pode ser criado pelos jogadores usando blocos de neve e uma abóbora. Ele atira bolas de neve nos inimigos dos seus criadores. + +Dragão Ender + +Este é um grande dragão negro encontrado no Final. + +Chama + +Estes são inimigos encontrados no Submundo, geralmente dentro das Fortalezas do Submundo. Derrubam Varas de Chamas quando são mortos. + +Cubo de Magma + +Eles são encontrados no Submundo. Similares aos Slimes, dividem-se em versões menores quando são mortos. + +Aldeão + +Ocelote + +Estes podem ser encontrados nas florestas. Eles podem ser domesticados, alimentando-os com Peixe Cru. Mas você deve deixar o Ocelote se aproximar, pois quaisquer movimentos bruscos podem assustá-lo e fazê-lo fugir. + +Golem de Ferro + +Aparece em vilas para protegê-las e podem ser criados usando blocos de ferro e abóboras. + +Explosives Animator + +Concept Artist + +Number Crunching and Statistics + +Bully Coordinator + +Original Design and Code by + +Project Manager/Producer + +Rest of Mojang Office + +Lead Game Programmer Minecraft PC + +Ninja Coder + +CEO + +White Collar Worker + +Customer Support + +Office DJ + +Designer/Programmer Minecraft - Pocket Edition + +Developer + +Chief Architect + +Art Developer + +Game Crafter + +Director of Fun + +Music and Sounds + +Programming + +Art + +QA + +Executive Producer + +Lead Producer + +Producer + +Test Lead + +Lead Tester + +Design Team + +Development Team + +Release Management + +Director, XBLA Publishing + +Business Development + +Portfolio Director + +Product Manager + +Marketing + + Community Manager + +Europe Localization Team + +Redmond Localization Team + +Asia Localization Team + +User Research Team + +MGS Central Teams + +Milestone Acceptance Tester + +Special Thanks + +Test Manager + +Senior Test Lead + +SDET + +Project STE + +Additional STE + +Test Associates + +Jon KÃ¥gström + +Tobias Möllstam + +Risë Lugo + +Espada de Madeira + +Espada de Pedra + +Espada de Ferro + +Espada de Diamante + +Espada de Ouro + +Pá de Madeira + +Pá de Pedra + +Pá de Ferro + +Pá de Diamante + +Pá de Ouro + +Picareta de Madeira + +Picareta de Pedra + +Picareta de Ferro + +Picareta de Diamante + +Picareta de Ouro + +Machado de Madeira + +Machado de Pedra + +Machado de Ferro + +Machado de Diamante + +Machado de Ouro + +Enxada de Madeira + +Enxada de Pedra + +Enxada de Ferro + +Enxada de Diamante + +Enxada de Ouro + +Porta de Madeira + +Porta de Ferro + +Capacete de Malha + +Peitoral de Malha + +Perneiras de Malha + +Botas de Malha + +Chapéu de Couro + +Capacete de Ferro + +Capacete de Diamante + +Capacete de Ouro + +Túnica de Couro + +Peitoral de Ferro + +Peitoral de Diamante + +Peitoral de Ouro + +Calças de Couro + +Perneiras de Ferro + +Perneiras de Diamante + +Perneiras de Ouro + +Botas de Couro + +Botas de Ferro + +Botas de Diamante + +Botas de Ouro + +Barra de Ferro + +Barra de Ouro + +Balde + +Balde de Ãgua + +Balde de Lava + +Sílex e Aço + +Maçã + +Arco + +Flecha + +Carvão + +Carvão Vegetal + +Diamante + +Vareta + +Vasilha + +Sopa de Cogumelo + +Fio + +Pena + +Pólvora + +Sementes de Trigo + +Trigo + +Pão + +Sílex + +Costeleta de Porco Crua + +Costeleta de Porco Cozida + +Pintura + +Maçã de Ouro + +Placa + +Carrinho de Minas + +Sela + +Redstone + +Bola de Neve + +Barco + +Couro + +Balde de Leite + +Tijolo + +Argila + +Cana-de-açúcar + +Papel + +Livro + +Slimeball + +Carrinho com Baú + +Carrinho com Fornalha + +Ovo + +Bússola + +Vara de Pescar + +Relógio + +Pó de Glowstone + +Peixe Cru + +Peixe Cozido + +Corante em Pó + +Saco de Tinta + +Rosa Vermelha + +Verde Cacto + +Grãos de Cacau + +Lápis-azul + +Corante Roxo + +Corante Ciano + +Corante Cinzento + +Corante Cinza + +Corante Rosa + +Corante Verde-lima + +Amarelo-narciso + +Corante Azul-claro + +Corante Magenta + +Corante Laranja + +Farelo de Osso + +Osso + +Açúcar + +Bolo + +Cama + +Repetidor de Redstone + +Biscoito + +Mapa + +Disco - "13" + +Disco de Música - "cat" + +Disco de Música - "blocks" + +Disco de Música - "chirp" + +Disco de Música - "far" + +Disco de Música - "mall" + +Disco de Música - "mellohi" + +Disco de Música - "stal" + +Disco de Música - "strad" + +Disco de Música - "ward" + +Disco - "11" + +Disco de Música - "where are we now" + +Tosquiadeira + +Sementes de Abóbora + +Sementes de Melão + +Frango Cru + +Frango Cozido + +Carne Crua + +Bife + +Carne Podre + +Pérola do Ender + +Fatia de Melão + +Vara de Chamas + +Lágrima de Ghast + +Pepita de Ouro + +Verruga do Submundo + +{*splash*}{*prefix*}Poção {*postfix*} + +Garrafa de Vidro + +Garrafa de Ãgua + +Olho de Aranha + +Olho de Aranha Fermentado + +Pó de Chamas + +Creme de Magma + +Barraca de Poções + +Caldeirão + +Olho de Ender + +Melão Cintilante + +Garrafa de Feitiços + +Carga de Fogo + +Carga de Fogo (Carvão Vegetal) + +Carga de Fogo (Carvão) + +Quadro de Item + +Criar {*CREATURE*} + +Bloco do Submundo + +Caveira + +Caveira do esqueleto + +Caveira do esqueleto murcho + +Cabeça de zumbi + +Cabeça + +Cabeça de %s + +Cabeça de creeper + +Pedra + +Bloco de Grama + +Terra + +Pedregulho + +Tábuas de Carvalho + +Tábuas de Abeto + +Tábuas de Bétula + +Tábua de madeira de floresta + +Muda + +Muda de Carvalho + +Muda de Abeto + +Muda de Bétula + +Broto de árvore da floresta + +Pedra Indestrutível + +Ãgua + +Lava + +Areia + +Arenito + +Cascalho + +Minério de Ouro + +Minério de Ferro + +Minério de Carvão + +Madeira + +Madeira de Carvalho + +Madeira de Abeto + +Madeira de Bétula + +Madeira de floresta + +Carvalho + +Abeto + +Bétula + +Folhas + +Folhas de Carvalho + +Folhas de Abeto + +Folhas de Bétula + +Folhas de floresta + +Esponja + +Vidro + +Lã + +Lã Preta + +Lã Vermelha + +Lã Verde + +Lã Marrom + +Lã Azul + +Lã Roxa + +Lã Ciano + +Lã Cinzenta + +Lã Cinza + +Lã Rosa + +Lã Verde-lima + +Lã Amarela + +Lã Azul-claro + +Lã Magenta + +Lã Laranja + +Lã Branca + +Flor + +Rosa + +Cogumelo + +Bloco de Ouro + +Uma forma compacta de armazenar ouro. + +Uma forma compacta de armazenar ferro. + +Bloco de Ferro + +Degrau de Pedra + +Degrau de Pedra + +Degrau de Arenito + +Degrau de Carvalho + +Degrau de Pedregulho + +Degrau de Tijolo + +Degrau Bloc. Pedra + +Degrau de Carvalho + +Degrau de Abeto + +Degrau de Bétula + +Chapa de madeira de floresta + +Degrau de Bloco do Submundo + +Tijolos + +TNT + +Estante de Livros + +Pedra de Musgo + +Obsidiana + +Tocha + +Tocha (Carvão) + +Tocha (Carvão Vegetal) + +Fogo + +Criador de Monstros + +Escada de Carvalho + +Baú + +Pó de Redstone + +Minério de Diamante + +Bloco de Diamante + +Uma forma compacta de armazenar diamantes. + +Bancada + +Colheitas + +Campo + +Fornalha + +Placa + +Porta de Madeira + +Escada de Mão + +Trilho + +Trilho com Propulsão + +Trilho Detector + +Escadas de Pedra + +Alavanca + +Chapa de Pressão + +Porta de Ferro + +Minério de Redstone + +Tocha de Redstone + +Botão + +Neve + +Gelo + +Cacto + +Argila + +Cana-de-açúcar + +Jukebox + +Cerca + +Abóbora + +Lanterna de Abóbora + +Pedra Inflamável + +Areia Movediça + +Glowstone + +Portal + +Minério de Lápis-azul + +Bloco Lápis-azul + +Uma forma compacta de armazenar lápis lazuli. + +Distribuidor + +Bloco de Nota + +Bolo + +Cama + +Teia + +Grama Alta + +Arbusto Seco + +Diodo + +Baú Trancado + +Alçapão + +Lã (qualquer cor) + +Pistão + +Pistão Aderente + +Bloco Traça + +Blocos de Pedra + +Blocos de Pedra com Musgo + +Blocos de Pedra Rachada + +Tijolos de pedra cinzentos + +Cogumelo + +Cogumelo + +Barras de Ferro + +Painel de Vidro + +Melão + +Broto de Abóbora + +Broto de Melão + +Vinhas + +Portão de Cerca + +Escadas de Blocos + +Escadas de Blocos de Pedra + +Pedra Traça + +Pedregulho de Traça + +Bloco de pedra de Traça + +Micélio + +Vitória Régia + +Bloco do Submundo + +Cerca de Blocos do Submundo + +Escadas de Blocos do Submundo + +Verruga do Submundo + +Bancada de Feitiços + +Barraca de Poções + +Caldeirão + +Portal Final + +Estrutura do Portal Final + +Pedra Final + +Ovo de Dragão + +Arbusto + +Samambaia + +Escada de Arenito + +Escada de Abeto + +Escada de Bétula + +Escada de madeira de floresta + +Lâmpada de Redstone + +Cacau + +Caveira + +Controles Atuais + +Estilo + +Mover/Correr + +Olhar + +Pausar + +Pular + +Pular/Voar Acima + +Inventário + +Rodízio de Itens + +Ação + +Usar + +Fabricação + +Soltar + +Esgueirar-se + +Esgueirar-se/Voar Abaixo + +Alterar Modo de Câmera + +Jogadores/Convidar + +Movimento (Ao Voar) + +Estilo 1 + +Estilo 2 + +Estilo 3 + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +{*B*}Pressione{*CONTROLLER_VK_A*} para continuar. + +{*B*}Pressione{*CONTROLLER_VK_A*} para iniciar o tutorial.{*B*} + Pressione{*CONTROLLER_VK_B*} se achar que está pronto para jogar sozinho. + +Minecraft é um jogo onde você coloca blocos para construir qualquer coisa que imaginar. +À noite os monstros aparecem; então, construa um abrigo antes que isso aconteça. + +Use{*CONTROLLER_ACTION_LOOK*} para olhar para cima, para baixo e ao redor. + +Use{*CONTROLLER_ACTION_MOVE*} para se mover. + +Para correr, pressione {*CONTROLLER_ACTION_MOVE*}para frente rapidamente duas vezes. Enquanto mantiver {*CONTROLLER_ACTION_MOVE*}pressionado, o personagem continuará a correr, a não ser que o tempo de corrida ou o alimento acabe. + +Pressione{*CONTROLLER_ACTION_JUMP*} para pular. + +Mantenha{*CONTROLLER_ACTION_ACTION*} pressionado para extrair e cortar usando a mão ou o que estiver segurando. Talvez seja necessário fabricar uma ferramenta para extrair alguns blocos... + +Mantenha{*CONTROLLER_ACTION_ACTION*} pressionado para cortar 4 blocos de madeira (troncos de árvore).{*B*}Quando um bloco quebra, você pode pegá-lo ficando perto do item flutuante exibido, fazendo-o aparecer em seu inventário. + +Pressione{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface de fabricação. + +Conforme você coleta e fabrica itens, seu inventário vai enchendo.{*B*} + Pressione{*CONTROLLER_ACTION_INVENTORY*} para abrir o inventário. + +Conforme você se move, extrai ou ataca, sua barra de alimentos vai esvaziando {*ICON_SHANK_01*}. Correr e correr pulando consomem muito mais alimento que caminhar e correr normalmente. + +Se você perder energia mas tiver uma barra de alimentos com 9 ou mais {*ICON_SHANK_01*}, sua energia será preenchida automaticamente. Comer preenche sua barra de alimentos. + +Com um item de comida na mão, mantenha pressionado {*CONTROLLER_ACTION_USE*}para comer e preencher sua barra de alimentos. Você não poderá comer se a sua barra de alimentos estiver cheia. + +Sua barra de alimentos está baixa e você perdeu energia. Coma o bife do seu inventário para preencher sua barra de alimentos e começar a cura.{*ICON*}364{*/ICON*} + +A madeira que você coletou pode ser usada para fabricar tábuas. Abra a interface de fabricação para fabricá-las.{*PlanksIcon*} + +Muitas tarefas de fabricação envolvem diversas etapas. Agora você tem algumas tábuas e pode fabricar mais itens. Crie uma bancada.{*CraftingTableIcon*} + +Para coletar blocos mais rapidamente, você pode construir ferramentas próprias para o trabalho. Algumas ferramentas têm cabo feito de varetas. Fabrique algumas varetas agora.{*SticksIcon*} + +Use {*CONTROLLER_ACTION_LEFT_SCROLL*}e {*CONTROLLER_ACTION_RIGHT_SCROLL*}para alterar o item que está segurando. + +Use{*CONTROLLER_ACTION_USE*} para usar itens, interagir com objetos e colocar alguns itens. Os itens colocados podem ser coletados novamente se extraídos com a ferramenta correta. + +Com a bancada selecionada, aponte o cursor para o local desejado e use{*CONTROLLER_ACTION_USE*} para colocar a bancada. + +Aponte o cursor para a bancada e pressione{*CONTROLLER_ACTION_USE*} para abri-la. + +A pá ajuda a cavar blocos macios, como terra e neve, mais rapidamente. Quando coletar mais materiais poderá fabricar ferramentas mais rápidas e duráveis. Crie uma pá de madeira.{*WoodenShovelIcon*} + +O machado ajuda a cortar madeira e peças de madeira mais rapidamente. Quando coletar mais materiais poderá fabricar ferramentas mais rápidas e duráveis. Crie um machado de madeira. {*WoodenHatchetIcon*} + +A picareta ajuda a cavar blocos duros, como pedra e minério, mais rapidamente. Quando coletar mais materiais poderá fabricar ferramentas mais rápidas e duráveis e poderá extrair materiais mais duros. Crie uma picareta de madeira.{*WoodenPickaxeIcon*} + +Abrir o recipiente + + + A noite pode cair rapidamente e é perigoso ficar lá fora sem estar preparado. Você pode fabricar armaduras e armas, mas é melhor ter um abrigo seguro. + + + + Aqui perto há um abrigo abandonado de mineiro que você pode concluir para passar a noite em segurança. + + + + Você precisará coletar os recursos para concluir o abrigo. As paredes e o teto podem ser feitos com peças de qualquer tipo, mas você precisará criar uma porta, algumas janelas e iluminação. + + +Use a picareta para extrair alguns blocos de pedra. Blocos de pedra produzem pedregulho quando extraídos. Se coletar 8 blocos de pedregulho poderá construir uma fornalha. Talvez seja necessário cavar a terra para chegar à pedra; então, use a pá para isso.{*StoneIcon*} + +Você coletou pedregulho suficiente para construir uma fornalha. Use a bancada para criar uma. + +Use{*CONTROLLER_ACTION_USE*} para colocar a fornalha no mundo e abra-a. + +Use a fornalha para criar carvão vegetal. Enquanto espera ficar pronto, que tal coletar mais materiais para terminar o abrigo? + +Use a fornalha para criar vidro. Enquanto espera ficar pronto, que tal coletar mais materiais para terminar o abrigo? + +Um bom abrigo precisa de porta para você poder entrar e sair sem precisar extrair e repor as paredes. Fabrique uma porta de madeira agora. {*WoodenDoorIcon*} + +Use{*CONTROLLER_ACTION_USE*} para colocar a porta. Você pode usar{*CONTROLLER_ACTION_USE*} para abrir e fechar a porta de madeira no mundo. + +À noite pode ficar bem escuro; então, é bom ter alguma iluminação no interior do abrigo para poder enxergar. Fabrique uma tocha agora com varetas e carvão vegetal, usando a interface de fabricação.{*TorchIcon*} + + + Você concluiu a primeira parte do tutorial. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para continuar o tutorial.{*B*} + Pressione{*CONTROLLER_VK_B*} se achar que está pronto para jogar sozinho. + + + + Este é seu inventário. Ele mostra os itens disponíveis para uso em sua mão e todos os outros itens que está carregando. Sua armadura também é mostrada aqui. + + +{*B*} + Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} + Pressione {*CONTROLLER_VK_B*} se já souber usar o inventário. + + + + Use{*CONTROLLER_MENU_NAVIGATE*}para mover o ponteiro. Use{*CONTROLLER_VK_A*}para pegar um item sob o ponteiro. + Se houver mais de um item aqui, esta ação pegará todos; você também pode usar{*CONTROLLER_VK_X*}para pegar apenas metade deles. + + + + Mova este item com o ponteiro sobre outro espaço no inventário e coloque-o usando{*CONTROLLER_VK_A*}. + Com vários itens no ponteiro, use{*CONTROLLER_VK_A*} para colocar todos ou{*CONTROLLER_VK_X*} para colocar apenas um. + + + + Se você mover o ponteiro para fora da borda da interface com um item nele, poderá derrubar o item. + + + + Para obter mais informações sobre um item, passe o ponteiro do mouse sobre ele e pressione {*CONTROLLER_VK_RT*}. + + + + Pressione{*CONTROLLER_VK_B*} agora para sair do inventário. + + + + Este é o inventário do modo criativo. Ele mostra os itens disponíveis para usar na sua mão e todos os outros itens que pode escolher. + + +{*B*} + Pressione {*CONTROLLER_VK_A*}para continuar.{*B*} + Pressione {*CONTROLLER_VK_B*}se já souber usar o inventário do modo criativo. + + + + Use {*CONTROLLER_MENU_NAVIGATE*}para mover o ponteiro. + Quando estiver na lista de itens, use {*CONTROLLER_VK_A*}para pegar o item sob o ponteiro e use {*CONTROLLER_VK_Y*}para pegar a pilha toda do item. + + + + O ponteiro será movido automaticamente para um espaço na linha de uso. Você pode colocá-lo usando {*CONTROLLER_VK_A*}. Depois de colocar o item, o ponteiro retornará à lista de itens, onde você poderá selecionar outro item. + + + + Se você mover o ponteiro para fora da borda da interface com um item nele, poderá derrubar o item no mundo. Para limpar todos os itens da barra de seleção rápida, pressione {*CONTROLLER_VK_X*}. + + + + Role pelas guias de Tipo de Grupo na parte superior usando {*CONTROLLER_VK_LB*}e {*CONTROLLER_VK_RB*}para selecionar o tipo de grupo do item que deseja pegar. + + + + Para obter mais informações sobre um item, passe o ponteiro do mouse sobre ele e pressione {*CONTROLLER_VK_RT*}. + + + + Pressione {*CONTROLLER_VK_B*}agora para sair do inventário do modo criativo. + + + + Esta é a interface de fabricação, onde você pode combinar os itens coletados para fazer novos itens. + + +{*B*} + Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber fabricar. + + +{*B*} + Pressione{*CONTROLLER_VK_X*} para mostrar a descrição do item. + + +{*B*} + Pressione{*CONTROLLER_VK_X*} para mostrar os ingredientes necessários para fazer o item atual. + + +{*B*} + Pressione{*CONTROLLER_VK_X*} para mostrar novamente o inventário. + + + + Role pelas guias de Tipo de Grupo na parte superior usando{*CONTROLLER_VK_LB*}e{*CONTROLLER_VK_RB*}para selecionar o tipo de grupo do item que deseja fabricar. Em seguida, use{*CONTROLLER_MENU_NAVIGATE*}para selecionar o item a ser fabricado. + + + + A área de fabricação mostra os itens necessários para fabricar o novo item. Pressione{*CONTROLLER_VK_A*} para fabricar o item e colocá-lo no inventário. + + + + Você pode fabricar uma seleção maior de itens usando uma bancada. A fabricação na bancada funciona da mesma maneira que a fabricação básica, mas você terá uma área maior de fabricação e uma variedade maior de itens para fabricar. + + + + A parte inferior direita da interface de fabricação mostra seu inventário. Essa área também pode mostrar a descrição do item selecionado e os ingredientes necessários para fabricá-lo. + + + + A descrição do item selecionado é exibida. Com a descrição você pode ter uma ideia de como o item pode ser usado. + + + + A lista dos ingredientes necessários para fabricar o item é exibida. + + +A madeira que você coletou pode ser usada para fabricar tábuas. Selecione o ícone de tábuas e pressione{*CONTROLLER_VK_A*} para criá-las.{*PlanksIcon*} + + + Você já construiu uma bancada e agora deve colocá-la no mundo para poder construir uma variedade maior de itens.{*B*} + Pressione{*CONTROLLER_VK_B*} agora para sair da interface de fabricação. + + + + Pressione{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para alterar para o tipo de grupo dos itens que deseja fabricar. Selecione o grupo de ferramentas.{*ToolsIcon*} + + + + Pressione{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para alterar para o tipo de grupo de itens que deseja fabricar. Selecione o grupo de estruturas.{*StructuresIcon*} + + + + Use{*CONTROLLER_MENU_NAVIGATE*}para alterar para o item que deseja fabricar. Alguns itens têm várias versões, dependendo dos materiais usados. Selecione a pá de madeira.{*WoodenShovelIcon*} + + + + Muitas tarefas de fabricação envolvem diversas etapas. Agora que você tem algumas tábuas, pode fabricar mais itens. Use{*CONTROLLER_MENU_NAVIGATE*}para alterar para o item que deseja fabricar. Selecione a bancada.{*CraftingTableIcon*} + + + + Com as ferramentas que construiu, você está pronto para começar bem e poderá coletar diversos materiais com mais eficiência.{*B*} + Pressione{*CONTROLLER_VK_B*} agora para sair da interface de fabricação. + + + + Alguns itens não podem ser criados usando a bancada, mas precisam da fornalha. Fabrique a fornalha agora.{*FurnaceIcon*} + + + + Coloque no mundo a fornalha que fabricou. É bom colocá-la dentro do seu abrigo.{*B*} + Pressione{*CONTROLLER_VK_B*} agora para sair da interface de fabricação. + + + + Esta é a interface da fornalha. Com ela você pode alterar os itens queimando-os. Por exemplo, nela você pode transformar minério de ferro em barras de ferro. + + +{*B*} + Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar a fornalha. + + + + Você precisa colocar um pouco de combustível na abertura inferior da fornalha e o item a ser queimado na abertura superior. A fornalha acenderá e começará a funcionar, colocando o resultado na abertura à direita. + + + + Muitos itens de madeira podem ser usados como combustível, mas nem tudo demora o mesmo tempo para queimar. Você pode descobrir outros itens no mundo que podem ser usados como combustível. + + + + Depois de queimar os itens, você poderá movê-los da área de saída para o inventário. Experimente ingredientes diferentes para ver o que pode fazer. + + + + Se usar madeira como ingrediente, você poderá fazer carvão vegetal. Coloque um pouco de combustível na fornalha e madeira na abertura do ingrediente. Pode demorar algum tempo para que a fornalha crie o carvão vegetal; se preferir, vá fazer outra coisa e volte para verificar o progresso. + + + + O carvão vegetal pode ser usado como combustível e também ser combinado com uma vareta para fabricar uma tocha. + + + + Se colocar areia na abertura do ingrediente, você poderá fazer vidro. Crie alguns blocos de vidro para usar como janelas no seu abrigo. + + + + Esta é a interface de poções. Você pode usar isto para criar poções com diversos efeitos diferentes. + + +{*B*} + Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar a barraca de poções. + + + + Para fazer poções você deve colocar um ingrediente no slot superior e uma poção ou garrafa de água nos slots de baixo (é possível fazer até 3 poções de uma vez). Depois que uma combinação válida for colocada, o processo começará e a poção será criada depois de pouco tempo. + + + + Todas as poções começam com uma Garrafa de Ãgua. A maioria das poções é criada usando primeiro uma Verruga do Submundo para fazer uma Poção Maligna, e precisa de pelo menos mais um ingrediente para fazer a poção final. + + + + Depois que tiver uma poção, você pode modificar seus efeitos. Se adicionar Pó de Redstone, a duração do efeito aumenta, e se adicionar Pó de Glowstone, o efeito será mais poderoso. + + + + A adição de Olho de Aranha Fermentado corrompe a poção e a transforma em uma poção com o efeito contrário, e a adição de Pólvora transforma a poção em uma Poção Tchibum, que pode ser atirada para aplicar seus efeitos a uma área próxima. + + + + Crie uma Poção de Resistência ao Fogo primeiro adicionando Verruga do Submundo a uma Garrafa de Ãgua, e depois adicionando Creme de Magma. + + + + Pressione {*CONTROLLER_VK_B*}agora para sair da interface de poções. + + + + Nesta área há uma Barraca de Poções, um Caldeirão e um baú cheio de itens para fazer poções. + + +{*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre como fazer poções.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber como fazer poções. + + + + A primeira etapa para fazer uma poção é criar uma Garrafa de Ãgua. Pegue uma Garrafa de Vidro no baú. + + + + Você pode encher a garrafa de vidro com um Caldeirão que tenha água dentro, ou com um bloco de água. Encha a garrafa de vidro agora apontando para uma fonte de água e pressionando{*CONTROLLER_ACTION_USE*}. + + + + Se o caldeirão ficar vazio, você pode enchê-lo com um Balde de Ãgua. + + + + Use a barraca de poções para criar uma Poção de Resistência ao Fogo. Você precisará de uma Garrafa de Ãgua, Verruga do Submundo e Creme de Magma. + + + + Com a poção na mão, segure{*CONTROLLER_ACTION_USE*} para usá-la. Se for uma poção normal, você pode bebê-la e aplicar o efeito em si mesmo, e se for uma Poção Tchibum, você pode atirá-la e aplicar o efeito nas criaturas próximas de onde ela acertar. + As poções tchibum podem ser criadas adicionando pólvora a poções normais. + + + + Use sua Poção de Resistência ao fogo em si mesmo. + + + + Agora que você está resistente ao fogo e à lava, veja se há lugares em que você consegue chegar que não conseguia antes. + + + + Esta é a interface de feitiços, que você pode usar para adicionar feitiços a armas, armadura e a algumas ferramentas. + + +{*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre a interface de feitiços.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar a interface de feitiços. + + + + Para enfeitiçar um item, primeiro coloque-o no slot de feitiços. Armas, armadura e algumas ferramentas podem ser enfeitiçados para adicionar efeitos especiais como maior resistência a danos ou aumento do número de itens produzidos ao minerar um bloco. + + + + Quando um item for colocado no slot de feitiços, os botões da direita mudarão para uma seleção de feitiços aleatórios. + + + + O número no botão representa o custo em níveis de experiência para aplicar esse feitiço ao item. Se você não tiver o nível necessário, o botão estará desabilitado. + + + + Selecione um feitiço e pressione{*CONTROLLER_VK_A*} para enfeitiçar o item. Isso irá diminuir seu nível de experiência correspondente ao custo do feitiço. + + + + Apesar dos feitiços serem aleatórios, alguns dos melhores feitiços só estarão disponíveis se você tiver um nível de experiência alto e muitas estantes ao redor da Bancada de Feitiços para aumentar seu poder. + + + + Nesta área há uma Bancada de Feitiços e alguns outros itens para você aprender mais sobre feitiços. + + +{*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre os encantos.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar os encantos. + + + + Ao usar a Bancada de Feitiços, você poderá adicionar efeitos especiais a armas, armadura e a algumas ferramentas, como o aumento do número de itens produzidos ao minerar um bloco ou a maior resistência a danos. + + + + Colocar estantes de livros ao redor da Bancada de Feitiços aumenta seu poder e permite o acesso a feitiços de nível mais alto. + + + + Enfeitiçar itens custa Níveis de Exp. que podem ser conquistados coletando Esferas de Exp. produzidas ao matar monstros e animais, minerar minérios, criar animais, pescar e fundir/cozinhar algumas coisas na fornalha. + + + + Também pode conquistar níveis de exp. usando a Garrafa de Feitiços, que ao ser atirada cria Esferas de Exp. perto de onde cair. Essas esferas podem ser coletadas. + + + + Nos baús desta área encontrará alguns itens enfeitiçados, Garrafas de Feitiços e alguns itens que ainda não foram enfeitiçados, para experimentar na Bancada de Feitiços. + + + + Agora você está andando no carrinho de minas. Para sair do carrinho, aponte o cursor para ele e pressione{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + + +{*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre os carrinhos de minas.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar os carrinhos de minas. + + + + O carrinho de minas corre sobre trilhos. Você também pode fabricar um carrinho com propulsão com uma fornalha e um carrinho de minas com um baú nele. + {*RailIcon*} + + + + Você também pode fabricar trilhos com propulsão, que usam a energia de tochas e circuitos de redstone para acelerar o carrinho. Eles podem ser conectados a acionadores, alavancas e chapas de pressão para criar sistemas complexos. + {*PoweredRailIcon*} + + + + Agora você está andando de barco. Aponte o cursor para o barco e pressione {*CONTROLLER_ACTION_USE*} para sair.{*BoatIcon*} + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre barcos.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar barcos. + + + + Com o barco é possível viajar mais rapidamente sobre a água. Você pode navegá-lo usando{*CONTROLLER_ACTION_MOVE*} e{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + + + + Agora você está usando uma vara de pescar. Pressione{*CONTROLLER_ACTION_USE*} para usá-la.{*FishingRodIcon*} + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre pesca.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber pescar. + + + + Pressione{*CONTROLLER_ACTION_USE*} para jogar a linha e começar a pescar. Pressione{*CONTROLLER_ACTION_USE*} novamente para puxar a linha de pesca. + {*FishingRodIcon*} + + + + Se esperar a boia afundar antes de puxar a linha, você poderá pegar um peixe. Os peixes podem ser comidos crus ou cozidos na fornalha para restaurar a energia. + {*FishIcon*} + + + + Como outras ferramentas, a vara de pescar tem um número determinado de utilidades. Mas elas não se limitam a pegar peixes. Experimente para ver o que mais pode ser pego ou ativado com ela... + {*FishingRodIcon*} + + + + Esta é uma cama. Pressione{*CONTROLLER_ACTION_USE*} ao apontar para ela à noite para dormir a noite toda e despertar de manhã.{*ICON*}355{*/ICON*} + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre camas.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber como funcionam as camas. + + + + A cama deve ser colocada em um lugar seguro e bem iluminado para que os monstros não o acordem no meio da noite. Depois de usar uma cama, se você morrer renascerá nela. + {*ICON*}355{*/ICON*} + + + + Se houver outros jogadores no jogo, todos deverão estar em uma cama ao mesmo tempo para poderem dormir. + {*ICON*}355{*/ICON*} + + + + Nesta área, há alguns circuitos simples de redstone e pistão, além de um baú com mais itens para ampliar esses circuitos. + + + + {*B*} + Pressione {*CONTROLLER_VK_A*}para saber mais sobre circuitos de redstone e pistões.{*B*} + Pressione {*CONTROLLER_VK_B*}se já souber usar circuitos de redstone e pistões. + + + + Alavancas, botões, chapas de pressão e tochas de redstone podem fornecer energia aos circuitos, seja conectando-os diretamente ao item a ser ativado ou conectando-os com pó de redstone. + + + + A posição e a direção em que você coloca uma fonte de energia podem mudar a maneira como ela afeta os blocos ao redor. Por exemplo, uma tocha de redstone ao lado de um bloco poderá ser apagada se o bloco for acionado por outra fonte. + + + + O pó de redstone é obtido pela extração de minério de redstone com uma picareta de ferro, diamante ou ouro. Você pode usá-lo para transmitir energia para até 15 blocos e ele pode viajar um bloco acima ou abaixo na altura. + {*ICON*}331{*/ICON*} + + + + Repetidores de redstone podem ser usados para ampliar a distância que a energia é transportada ou colocar um atraso no circuito. + {*ICON*}356{*/ICON*} + + + + Quando acionado, um pistão se estenderá, empurrando até 12 blocos. Quando retraídos, os Pistões aderentes podem puxar um bloco da maioria dos tipos. + {*ICON*}33{*/ICON*} + + + + No baú desta área há alguns componentes para fabricar circuitos com pistões. Tente usar ou completar os circuitos desta área ou formar você mesmo. Há mais exemplos fora da área do tutorial. + + + + Nesta área há um Portal para o Submundo! + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mas sobre Portais e o Submundo.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber como funcionam os Portais e o Submundo. + + + + Os portais são criados colocando blocos de Obsidiana em uma estrutura com quatro blocos de largura e cinco blocos de altura. Os blocos de canto não são necessários. + + + + Para ativar um Portal do Submundo, incendeie os blocos de Obsidiana dentro da estrutura com Sílex e Aço. Os Portais podem ser desativados se a estrutura estiver quebrada, se ocorrer uma explosão próxima ou se algum líquido fluir através deles. + + + + Para usar um Portal do Submundo, fique de pé dentro dele. Sua tela ficará roxa e um som será tocado. Depois de alguns segundos você será transportado para outra dimensão. + + + + O Submundo pode ser um lugar perigoso, cheio de lava, mas pode ser útil para coletar Pedra Inflamável, que queima para sempre quando acesa, e Glowstone, que produz luz. + + + + O mundo do Submundo pode ser usado para viajar rapidamente na Superfície - viajar a uma distância de um bloco no Submundo equivale a viajar 3 blocos na Superfície. + + + + Agora você está no Modo Criativo. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre o Modo Criativo.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber usar o Modo Criativo. + + +No modo Criativo você tem um número infinito de todos os itens e blocos disponíveis, pode destruir blocos com um clique sem uma ferramenta, você é invulnerável e pode voar. + +Se pressionar {*CONTROLLER_ACTION_JUMP*}rapidamente duas vezes você poderá voar. Para parar de voar, repita a ação. Para voar mais rápido, pressione {*CONTROLLER_ACTION_MOVE*}para a frente duas vezes rapidamente ao voar. +No modo de voo, mantenha pressionado {*CONTROLLER_ACTION_JUMP*}para se mover para cima e {*CONTROLLER_ACTION_SNEAK*}para se mover para baixo ou use o direcional para se mover para cima, para baixo, para a esquerda ou para a direita. + +Pressione{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface do inventário criativo. + +Vá até o lado oposto deste buraco para continuar. + +Você já concluiu o tutorial do modo Criativo. + + + Nesta área foi estabelecida uma fazenda. Se você a cultivar, terá uma fonte renovável de comida e outros itens. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre como cuidar de fazendas.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber cuidar de uma fazenda. + + +Trigo, abóboras e melões são cultivados a partir de sementes. As sementes de trigo são coletadas quebrando Grama Alta ou colhendo trigo, e as sementes de abóbora e melão são fabricadas a partir de abóboras e melões, respectivamente. + +Antes de plantar as sementes os blocos de terra devem ser transformados em Campo usando uma Enxada. Uma fonte próxima de água ajudará a manter o Campo hidratado e fará as colheitas crescerem mais rápido, além de manter a área iluminada. + +O trigo passa por várias etapas enquanto está crescendo, e está pronto para ser colhido quando fica mais escuro.{*ICON*}59:7{*/ICON*} + +As abóboras e melões também precisam de um bloco próximo de onde as sementes foram plantadas, para que os frutos cresçam assim que os caules estiverem crescidos. + +A cana-de-açúcar deve ser plantada em um bloco de Grama, Terra ou Areia que esteja ao lado de um bloco de água. Se você cortar um bloco de Cana-de-açúcar, também derrubará todos os blocos que estão acima dele.{*ICON*}83{*/ICON*} + +Os Cactos devem ser plantados na Areia, e crescerão com até três blocos de altura. Da mesma forma que a Cana-de-açúcar, se o bloco inferior for destruído, você também coletará os blocos que estão acima dele.{*ICON*}81{*/ICON*} + +Os Cogumelos devem ser plantados em uma área com pouca iluminação e se espalharão para os blocos próximos pouco iluminados.{*ICON*}39{*/ICON*} + +O Farelo de osso pode ser usado para as plantações chegarem à etapa mais desenvolvida, ou para fazer os Cogumelos se transformarem em Cogumelos Enormes.{*ICON*}351:15{*/ICON*} + +Agora você completou o tutorial da fazenda. + + + Nesta área os animais foram cercados. Você pode criar animais, para produzir filhotes deles mesmos. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre criação e animais.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber sobre criação e animais. + + +Para que os animais se reproduzam, você deve dar a comida certa a eles para que entrem no "Modo do Amor". + +Dê Trigo para uma vaca, vacogumelo ou ovelha, cenouras para os porcos, sementes de trigo ou verruga do Submundo para uma galinha, ou dê qualquer tipo de carne para um lobo e eles começarão a procurar outro animal da mesma espécie que também esteja no Modo do Amor. + +Quando dois animais da mesma espécie se encontrarem e ambos estiverem no Modo do Amor, eles se beijarão por alguns segundos e um filhote aparecerá. O filhote seguirá seus pais durante algum tempo, até crescer e se transformar em um animal adulto. + +Depois de ficar no Modo do Amor, o animal não poderá entrar nele de novo por cinco minutos. + +Alguns animais seguirão você se estiver com a comida deles na mão. Desta forma é mais fácil agrupar os animais para reproduzi-los.{*ICON*}296{*/ICON*} + + + Lobos selvagens podem ser domados com ossos. Assim que domados, coraçõezinhos aparecerão em torno deles. Lobos domados seguirão e defenderão o jogador, caso não tenham sido ordenados a sentar. + + +Você concluiu o tutorial de criação e de animais. + + + Nesta área há algumas abóboras e blocos para fazer um Golem de Neve e um Golem de Ferro. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre Golems.{*B*} + Pressione{*CONTROLLER_VK_B*} se já souber como usar Golems. + + +Os Gólens são criados colocando uma abóbora sobre uma pilha de blocos. + +Os Gólens de Neve são criados com dois Blocos de Neve, um sobre o outro, e uma abóbora sobre eles. Os Gólens lançam bolas de neve em seus inimigos. + +Os Gólens de Ferro são criados com quatro Blocos de Ferro no padrão mostrado, com uma abóbora sobre o bloco do meio. Os Gólens de Ferro atacam seus inimigos. + +Os Gólens de Ferro também aparecem naturalmente para proteger vilas e o atacarão se você atacar algum aldeão. + +Você só poderá sair desta área quando concluir o tutorial. + +Ferramentas diferentes são melhores para obter materiais diferentes. Você deve usar uma pá para extrair materiais macios como terra ou areia. + +Ferramentas diferentes são melhores para obter materiais diferentes. Você deve usar um machado para cortar troncos de árvores. + +Ferramentas diferentes são melhores para obter materiais diferentes. Você deve usar uma picareta para extrair pedra e minério. Talvez seja necessário fabricar sua picareta com materiais melhores para obter recursos de alguns blocos. + +Algumas ferramentas são melhores para atacar inimigos. Pense em usar uma espada para atacar. + +Dica: mantenha {*CONTROLLER_ACTION_ACTION*}pressionado para extrair e cortar usando a mão ou o que estiver segurando. Talvez seja necessário fabricar uma ferramenta para extrair alguns blocos... + +A ferramenta que está usando está danificada. Sempre que você usa uma ferramenta ela sofre danos e pode quebrar. A barra colorida abaixo do item no inventário mostra o estado atual dos danos. + +Mantenha{*CONTROLLER_ACTION_JUMP*} pressionado para nadar. + +Nesta área há um carrinho de minas sobre um trilho. Para entrar no carrinho, aponte o cursor para ele e pressione{*CONTROLLER_ACTION_USE*}. Use{*CONTROLLER_ACTION_USE*} no botão para mover o carrinho. + +No baú ao lado do rio há um barco. Para usar o barco, aponte o cursor para a água e pressione{*CONTROLLER_ACTION_USE*}. Use{*CONTROLLER_ACTION_USE*} ao apontar para o barco para entrar nele. + +No baú ao lado do lago há uma vara de pescar. Tire a vara do baú e selecione-a como o item atual em sua mão para usá-la. + +Este mecanismo de pistão mais avançado cria uma ponte que se conserta automaticamente. Pressione o botão para ativar e veja como os componentes interagem para aprender mais. + +Se você mover o ponteiro para fora da interface ao segurar um item, poderá derrubá-lo. + +Você não tem todos os ingredientes necessários para fazer este item. A caixa no canto inferior esquerdo mostra os ingredientes necessários para fabricá-lo. + + + Parabéns, você concluiu o tutorial. O tempo no jogo agora passará no ritmo normal e não falta muito para a noite, quando os monstros aparecem. Termine seu abrigo! + + +{*EXIT_PICTURE*} Quando estiver pronto para explorar mais, há uma escada nesta área perto do abrigo do mineiro que leva a um pequeno castelo. + +Lembrete: + +]]> + +Novos recursos foram adicionados ao jogo na versão mais recente, incluindo novas áreas no mundo do tutorial. + +{*B*}Pressione {*CONTROLLER_VK_A*}para jogar no tutorial normalmente.{*B*} + Pressione {*CONTROLLER_VK_B*}para pular o tutorial principal. + +Nesta área, você encontrará áreas configuradas para ajudá-lo a aprender sobre pesca, barcos, pistões e redstone. + +Fora desta área, você encontrará exemplos de construções, cultivo, carrinhos de mineração e trilhos, feitiços, poções, negócios, ferraria e muito mais! + + + Sua barra de alimentos chegou a um nível em que não há mais cura. + + + + {*B*} + Pressione {*CONTROLLER_VK_A*}para saber mais sobre a barra de alimentos e como comer.{*B*} + Pressione {*CONTROLLER_VK_B*}se já souber usar a barra de alimentos e como comer. + + +Selecionar + +Usar + +Voltar + +Sair + +Cancelar + +Cancelar Entrada + +Selec. Disp. Armazenamento + +Dispositivo de Armazenamento + +Lista de Jogos Online + +Jogos de Grupo + +Todos os Jogos + +Alterar Grupo + +Mostrar Inventário + +Mostrar Descrição + +Mostrar Ingredientes + +Fabricação + +Criar + +Pegar/Colocar + +Pegar + +Pegar tudo + +Pegar metade + +Colocar + +Colocar tudo + +Colocar um + +Soltar + +Soltar tudo + +Soltar um + +Trocar + +Mover rápido + +Limpar Seleção Rápida + +O que é isto? + +Compartilhar no Facebook + +Alterar Filtro + +Exibir Cartão de Jogador + +Exibir Perfil do Jogador + +Enviar Pedido de Amigo + +Página Abaixo + +Página Acima + +Próximo + +Anterior + +Expulsar + +Tingir + +Extrair + +Alimentar + +Domar + +Curar + +Sentar + +Seguir-me + +Ejetar + +Esvaziar + +Selar + +Colocar + +Atingir + +Ordenhar + +Coletar + +Comer + +Dormir + +Acordar + +Jogar + +Montar + +Velejar + +Cultivar + +Nadar + +Abrir + +Alterar Tom + +Detonar + +Ler + +Pendurar + +Atirar + +Plantar + +Arar + +Colher + +Continuar + +Desbloquear Jogo Completo + +Excluir Salvamento + +Excluir + +Opções + +Convidar para Grupo Xbox Live + +Convidar Amigos + +Aceitar + +Tosquiar + +Banir Nível + +Selecionar Capa + +Acender + +Navegar + +Instalar Versão Completa + +Instalar Versão de Avaliação + +Instalar + +Reinstalar + +Opções de Salvamento + +Executar Comando + +Criativo + +Mover Ingrediente + +Mover Combustível + +Ferramenta Mover + +Mover Armadura + +Mover Arma + +Equipar + +Desenhar + +Lançar + +Privilégios + +Bloco + +Página Acima + +Página Abaixo + +Modo do Amor + +Beber + +Girar + +Ocultar + +Carregar para Xbox One + +Limpar todos os slots + +Carregar jogo salvo para o Xbox One + +OK + +Cancelar + +Loja Minecraft + +Tem certeza de que deseja sair do jogo atual e entrar no novo jogo? Você perderá o progresso não salvo. + +Sair do Jogo + +Salvar Jogo + +Sair sem salvar + +Tem certeza de que deseja substituir o salvamento anterior deste mundo pela versão atual dele? + +Tem certeza de que deseja sair sem salvar? Você perderá todo o progresso neste mundo! + +Iniciar Jogo + +Se você criar, carregar ou salvar um mundo no Modo Criativo, esse mundo terá desabilitadas as atualizações de conquistas e de placares de líderes, mesmo que seja carregado no Modo Sobrevivência. Tem certeza de que deseja continuar? + +Este mundo já foi salvo no Modo Criativo e as atualizações de conquistas e de placares de líderes estarão desabilitadas nele. Tem certeza de que deseja continuar? + +Este mundo já foi salvo no Modo Criativo e terá as atualizações de conquistas e de placar de líderes desabilitadas. + +Se você criar, carregar ou salvar um mundo com os Privilégios do Host habilitados, esse mundo terá desabilitadas as atualizações de conquistas e de placares de líderes, mesmo que ele seja posteriormente carregado com essas opções desativadas. Tem certeza de que deseja continuar? + +Jogo danificado + +Este jogo salvo está corrompido ou danificado. Gostaria de excluí-lo? + +Tem certeza de que deseja sair para o menu principal e desconectar todos os jogadores do jogo? Você perderá o progresso não salvo. + +Sair e salvar + +Sair sem salvar + +Tem certeza de que deseja sair para o menu principal? Você perderá o progresso não salvo. + +Tem certeza de que deseja sair para o menu principal? Seu progresso será perdido! + +Criar Novo Mundo + +Jogar Tutorial + +Tutorial + +Nomear Mundo + +Digite um nome para o mundo. + +Insira a semente para a criação do seu mundo. + +Carregar Mundo Salvo + +Pressione START para entrar no jogo + +Saindo do jogo. + +Erro. Saindo para o menu principal. + +Falha na conexão. + +Conexão perdida + +A conexão com o servidor foi perdida. Saindo para o menu principal. + +A conexão com o Xbox Live foi perdida. Saindo para o menu principal. + +A conexão com o Xbox Live foi perdida. + +Desconectado pelo servidor. + +Você foi expulso do jogo. + +Você foi expulso do jogo por voar. + +A tentativa de conexão demorou muito. + +O servidor está cheio + +O host saiu do jogo. + +Você não pode entrar neste jogo, pois não é amigo de nenhuma pessoa no jogo. + +Você não pode entrar neste jogo, pois já foi expulso antes pelo host. + +Você não pode entrar neste jogo, pois o jogador com o qual está tentando jogar está executando uma versão anterior do jogo. + +Você não pode entrar neste jogo, pois o jogador com o qual está tentando jogar está executando uma versão mais nova do jogo. + +Novo Mundo + +Brinde Desbloqueado! + +Oba! Você ganhou uma imagem do jogador com o Steve do Minecraft! + +Oba! Você ganhou uma imagem do jogador com um Creeper! + +Oba! Você ganhou um item de avatar: uma camiseta do Minecraft: Xbox 360 Edition! +Vá até o menu para colocar a camiseta no seu avatar. + +Oba! Você ganhou um item de avatar: um relógio do Minecraft: Xbox 360 Edition! +Vá até o menu para colocar o relógio no seu avatar. + +Oba! Você ganhou um item de avatar: um boné de beisebol do Creeper! +Vá até o menu para colocar o boné no seu avatar. + +Oba! Você ganhou o tema do Minecraft: Xbox 360 Edition! +Vá até o menu para selecioná-lo. + +Desbloquear Jogo Completo + +Você está jogando a versão de avaliação, mas precisa da versão integral para poder salvar seu jogo. +Deseja desbloquear a versão integral do jogo agora? + +Esta é a versão de avaliação do jogo Minecraft: Xbox 360 Edition. Se você tivesse a versão integral do jogo, ganharia uma conquista! +Deseja desbloquear a versão integral do jogo? + +Esta é a versão de avaliação do jogo Minecraft: Xbox 360 Edition. Se você tivesse a versão integral do jogo, ganharia um brinde de avatar! +Deseja desbloquear a versão integral do jogo? + +Esta é a versão de avaliação do jogo Minecraft: Xbox 360 Edition. Se você tivesse a versão integral do jogo, ganharia uma imagem de jogador! +Deseja desbloquear a versão integral do jogo? + +Esta é a versão de avaliação do jogo Minecraft: Xbox 360 Edition. Se você tivesse a versão integral do jogo, ganharia um tema! +Deseja desbloquear a versão integral do jogo? + +Este é a versão de avaliação do jogo Minecraft: Xbox 360 Edition. Você precisa ter a versão integral do jogo para poder aceitar este convite. +Deseja desbloquear a versão integral do jogo? + +Os jogadores convidados não podem desbloquear a versão integral do jogo. Entre com uma ID de usuário do Xbox Live. + +Aguarde + +Sem resultados + +Filtro: + +Amigos + +Minha Pontuação + +Geral + +Entradas: + +Posto + +Gamertag + +Preparando para Salvar Nível + +Preparando Partes... + +Finalizando... + +Construindo Terreno + +Simulando o mundo um pouquinho + +Inicializando o servidor + +Produzindo área de criação + +Carregando área de criação + +Entrando no Submundo + +Saindo do Submundo + +Criando Novamente + +Criando nível + +Carregando nível + +Salvando jogadores + +Conectando ao host + +Baixando terreno + +Alternando para jogo offline + +Aguarde enquanto o host salva o jogo + +Entrando no FINAL + +Saindo do FINAL + +Encontrando semente para o gerador de mundos + +Esta cama está ocupada + +Você só pode dormir à noite + +%s está dormindo na cama. Para pular para o nascer do sol, todos os jogadores devem estar dormindo nas camas ao mesmo tempo. + +A cama de sua casa estava desaparecida ou obstruída. + +Você não pode descansar agora, há monstros por perto + +Você está dormindo na cama. Para pular para o nascer do sol, todos os jogadores devem estar dormindo nas camas ao mesmo tempo. + +Ferramentas e Armas + +Armas + +Alimentos + +Estruturas + +Armadura + +Mecanismos + +Transporte + +Decorações + +Blocos de Construção + +Redstone e Transporte + +Diversos + +Poções + +Poções + +Ferramentas, Armas e Armaduras + +Materiais + +Saiu + +Você retornou à tela de título porque seu perfil do jogador foi desconectado. + +Dificuldade + +Música + +Som + +Gama + +Sensibilidade do Jogo + +Sensibilidade da Interface + +Pacífico + +Fácil + +Normal + +Difícil + +Neste modo, o jogador ganha energia com o tempo e não há inimigos no ambiente. + +Neste modo, inimigos são gerados no ambiente, mas causam menos danos ao jogador que no modo Normal. + +Neste modo, inimigos são gerados no ambiente e causam uma quantidade padrão de danos ao jogador. + +Neste modo, inimigos são gerados no ambiente e causam muitos danos ao jogador. Tome cuidado também com os creepers, pois eles não podem cancelar o ataque explosivo quando você se afasta deles! + +Tempo Limite de Avaliação + +Você já jogou a versão de avaliação de Minecraft: Xbox 360 Edition pelo máximo de tempo permitido. Para continuar a diversão, gostaria de desbloquear a versão integral do jogo? + +Versão integral + +Falha ao entrar no jogo, pois não há espaços restantes + +Digitar Texto da Placa + +Digite uma linha de texto para sua placa. + +Digitar Título + +Digite um título para sua postagem. + +Digitar Legenda + +Digite uma legenda para sua postagem. + +Digitar Descrição + +Digite uma descrição para sua postagem. + +Inventário + +Ingredientes + +Barraca de Poções + +Baú + +Feitiço + +Fornalha + +Ingrediente + +Combustível + +Distribuidor + +Não há ofertas de conteúdo para baixar desse tipo disponíveis para este título no momento. + +%s entrou no jogo. + +%s saiu do jogo. + +%s foi expulso do jogo. + +Tem certeza de que deseja excluir este jogo salvo? + +A confirmar + +Censurado + +Jogando agora: + +Redefinir Configurações + +Tem certeza de que deseja redefinir suas configurações para os valores padrão? + +Erro de carregamento + +"Minecraft: Xbox 360 Edition" falhou ao carregar e não é possível continuar. + +Jogo de %s + +Jogo com host desconhecido + +Convidado saiu + +Um jogador convidado saiu, fazendo todos os jogadores convidados serem removidos do jogo. + +Entrar + +Você não está conectado. Para jogar este jogo, você deve estar conectado. Deseja conectar agora? + +Multijogador não é permitido + +Falha ao entrar no jogo, pois um ou mais jogadores não têm permissão para jogos multijogador no Xbox Live. + +Falha ao criar um jogo online, pois um ou mais jogadores não têm permissão para jogos multijogador no Xbox Live. Desmarque a caixa "Jogo Online" para começar um jogo offline. + +Você não tem permissão para entrar nesta sessão de jogo porque sua configuração de privilégio de Conteúdo de Assinante é muito restrita. Altere essa configuração na parte Configurações Privacidade & Online do menu Xbox se quiser entrar nesta sessão. + +Você não tem permissão para entrar nesta sessão de jogo porque a configuração de privilégio de Conteúdo de Assinante de um de seus jogadores locais é muito restrita. + +Você não tem permissão para entrar nesta sessão de jogo porque a configuração de privilégio de Conteúdo de Assinante de um jogador na sessão é de Somente Amigos, e você não está na Lista de Amigos dele. + +Falha ao criar jogo + +Você não tem permissão para criar esta sessão de jogo porque a configuração de privilégio de Conteúdo de Assinante de um de seus jogadores locais é muito restrita. Desmarque a caixa "Jogo Online" para começar um jogo offline, ou altere essa configuração na parte Configurações Privacidade & Online do menu Xbox. + +Seleção automática + +Nenhum Pacote: Capas Padrão + +Capas favoritas + +Nível Banido + +O jogo em que está entrando está em sua lista de níveis banidos. +Se você optar por participar desse jogo, o nível será removido de sua lista de níveis banidos. + +Banir este nível? + +Tem certeza de que deseja adicionar este nível à lista de níveis banidos? +Selecionar OK também fechará este jogo. + +Remover da Lista de Banidos + +Intervalo do Salvamento Automático + +Intervalo do salvamento automático: NÃO + +Min. + +Não é possível colocar aqui! + +Não é permitido colocar lava perto do ponto de criação do nível devido à possibilidade de morte imediata dos jogadores criados. + +Este jogo tem o recurso de salvamento automático de nível. Quando você vir o ícone acima sendo exibido, o jogo está salvando seus dados. +Não desligue o console Xbox 360 enquanto este ícone estiver na tela. + +Opacidade da Interface + +Preparando salvamento automático do nível + +Tamanho do HUD + +Tamanho do HUD (Tela Dividida) + +Semente + +Desbloquear Pacote de Capas + +Para usar a capa selecionada, você precisa desbloquear este pacote de capas. +Deseja desbloquear o pacote de capas agora? + +Desbloquear pacote de textura + +Para usar este pacote de textura no seu mundo, você precisa desbloqueá-lo. +Você deseja desbloquear ele agora? + +Pacote de texturas para avaliação + +Você está usando uma versão de avaliação do pacote de texturas. Você não poderá salvar este mundo até desbloquear a versão completa. + Gostaria de desbloquear a versão completa do pacote de texturas? + +Pacote de textura não disponível + +Desbloquear a versão completa + +Baixar versão de avaliação + +Baixar versão completa + +Este mundo usa um pacote de combinações ou pacote de texturas que você não tem! +Deseja instalar o pacote de combinações ou o pacote de texturas agora? + +Obter Versão de Avaliação + +Obter Versão Completa + +Expulsar + +Tem certeza de que deseja expulsar este jogador do jogo? Eles não poderão entrar de novo até que você reinicie o mundo. + +Pacotes de Imagens do jogador + +Temas + +Pacotes de Capas + +Permite os amigos dos amigos + +Você não pode entrar neste jogo porque ele foi limitado aos jogadores que são amigos do host. + +Não é possível entrar no jogo + +Selecionado + +Capa selecionada: + +Conteúdo para Baixar Corrompido + +Este conteúdo para baixar está corrompido e não pode ser usado. Você deve excluí-lo e reinstalá-lo a partir do menu da Loja Minecraft. + +Alguns conteúdos para baixar estão corrompidos e não podem ser usados. Você deve excluí-los e reinstalá-los a partir do menu da Loja Minecraft. + +Seu modo de jogo foi alterado + +Renomeie Seu Mundo + +Digite o novo nome para seu mundo + +Modo Jogo Sobrevivência + +Modo Jogo Criativo + +Sobrevivência + +Criativo + +Criado em Sobrevivência + +Criado em Criativo + +Renderizar Nuvens + +O que deseja fazer com este jogo salvo? + +Renomear Salvamento + +Salvando automaticamente em %d... + +Ativado + +Desativado + +Normal + +Superplano + +Quando habilitado, o jogo será um jogo online. + +Quando habilitado, apenas jogadores convidados poderão entrar. + +Quando habilitado, os amigos das pessoas em sua Lista de Amigos poderão entrar no jogo. + +Quando habilitado, os jogadores podem causar danos a outros jogadores. Afeta somente o modo Sobrevivência. + +Quando desabilitado, os jogadores que entrarem no jogo não poderão construir nem minerar sem autorização. + +Quando habilitado, o fogo poderá se espalhar até blocos inflamáveis próximos. + +Quando habilitado, a TNT explodirá quando ativada. + +Quando habilitado, o host pode alternar o vôo, desabilitar exaustão e ficar invisível pelo menu do jogo. Desabilita atualizações de conquistas e de placar de líderes. + +Quando ativado, o Submundo é recriado. É útil quando se tem um jogo salvo mais antigo em que as Fortalezas do Submundo não estavam presentes. + +Quando habilitado, estruturas como Vilas e Fortalezas serão geradas no mundo. + +Quando habilitado, um mundo completamente plano será gerado na Superfície e no Submundo. + +Quando habilitado, um baú contendo alguns itens úteis será criado perto do ponto de criação do jogador. + +Pacotes de Capas + +Temas + +Imagens do Jogador + +Itens de Avatar + +Pacotes de Texturas + +Pacotes de Combinações + +{*PLAYER*} incendiou-se + +{*PLAYER*} queimou até a morte + +{*PLAYER*} tentou nadar na lava + +{*PLAYER*} asfixiou-se em uma parede + +{*PLAYER*} afogou-se + +{*PLAYER*} morreu de fome + +{*PLAYER*} foi espetado até a morte + +{*PLAYER*} atingiu o chão com muita força + +{*PLAYER*} caiu para fora do mundo + +{*PLAYER*} morreu + +{*PLAYER*} explodiu + +{*PLAYER*} foi morto por magia + +{*PLAYER*} foi morto pelo sopro do Dragão Ender + +{*PLAYER*} foi assassinado por {*SOURCE*} + +{*PLAYER*} foi assassinado por {*SOURCE*} + +{*PLAYER*} levou um tiro de {*SOURCE*} + +{*PLAYER*} foi atingido por uma bola de fogo de {*SOURCE*} + +{*PLAYER*} foi esmurrado por {*SOURCE*} + +{*PLAYER*} foi morto por {*SOURCE*} + +Neblina Base + +Exibir HUD + +Exibir Mão + +Gamertags na Tela Dividida + +Mensagens de Morte + +Personagem Animado + +Animação pessoal de capa + +Você não pode mais minerar nem usar itens + +Agora você pode minerar e usar itens + +Você não pode mais colocar blocos + +Agora você pode colocar blocos + +Agora você pode usar portas e acionadores + +Você não pode mais usar portas e acionadores + +Agora você pode usar recipientes (por ex., baús) + +Você não pode mais usar recipientes (por ex., baús) + +Você não pode mais atacar multidões + +Agora você pode atacar multidões + +Você não pode mais atacar jogadores + +Agora você pode atacar jogadores + +Você não pode mais atacar animais + +Agora você pode atacar animais + +Agora você é um moderador + +Você não é mais um moderador + +Agora você pode voar + +Você não pode mais voar + +Você não vai mais ficar cansado + +Agora você vai ficar cansado + +Agora você é invisível + +Você não é mais invisível + +Agora você é invulnerável + +Você não é mais invulnerável + +%d MSP + +Dragão Ender + +%s entrou no Final + +%s saiu do Final + + +{*C3*}Vejo o jogador ao qual você se refere.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Sim. Tome cuidado. Ele está em um nível superior agora. Ele pode ler nossos pensamentos.{*EF*}{*B*}{*B*} +{*C2*}Mas isso não importa. Acho que faz parte do jogo.{*EF*}{*B*}{*B*} +{*C3*}Gosto desse jogador. Ele jogou bem. Não desistiu.{*EF*}{*B*}{*B*} +{*C2*}Está lendo nossos pensamentos como se fossem palavras em uma tela.{*EF*}{*B*}{*B*} +{*C3*}É como ele escolhe imaginar muitas coisas, quando vai fundo em um jogo.{*EF*}{*B*}{*B*} +{*C2*}As palavras formam uma interface maravilhosa. Muito flexível. E menos aterrorizante que a realidade por trás da tela.{*EF*}{*B*}{*B*} +{*C3*}Eles costumavam ouvir vozes. Antes de os jogadores poderem ler. Na época em que aqueles que não jogavam chamavam os jogadores de bruxos e feiticeiros. E os jogadores sonhavam em voar em vassouras movidas por demônios.{*EF*}{*B*}{*B*} +{*C2*}Qual era o sonho desse jogador?{*EF*}{*B*}{*B*} +{*C3*}Ele sonhava com luz do sol e árvores. Fogo e água. Ele sonhou e criou. E ele sonhou e destruiu. Ele sonhou e perseguiu, e foi perseguido. Ele sonhou com abrigo.{*EF*}{*B*}{*B*} +{*C2*}Ah, a interface original. Um milhão de anos atrás e ainda funciona. Mas qual foi a estrutura que esse jogador criou na realidade por trás da tela?{*EF*}{*B*}{*B*} +{*C3*}Ele trabalhou, com muitos outros, para esculpir um mundo real em uma comunidade de {*EF*}{*NOISE*}{*C3*} e criou um {*EF*}{*NOISE*}{*C3*} para {*EF*}{*NOISE*}{*C3*}, no {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}Ele não pode ler esse pensamento.{*EF*}{*B*}{*B*} +{*C3*}Não. Ele ainda não alcançou esse nível mais elevado. Deverá alcançá-lo no longo sonho da vida e não no curto sonho de um jogo.{*EF*}{*B*}{*B*} +{*C2*}Ele sabe que o adoramos? Que o universo é bom?{*EF*}{*B*}{*B*} +{*C3*}Às vezes, em meio aos seus pensamentos, ele ouve o universo.{*EF*}{*B*}{*B*} +{*C2*}Mas há vezes em que fica triste no longo sonho. Ele cria mundos que não têm verão e estremecem sob um sol negro e transforma sua criação triste em realidade.{*EF*}{*B*}{*B*} +{*C3*}Para curá-lo da aflição ele o destrói. A aflição faz parte de sua tarefa. Não podemos interferir.{*EF*}{*B*}{*B*} +{*C2*}Às vezes, quando estão mergulhados em sonhos, quero dizer a eles que estão construindo mundos reais. Às vezes, quero lhes falar da importância deles para o universo. Às vezes, quando não conseguem uma conexão real, quero lhes ajudar a dizer a palavra que temem.{*EF*}{*B*}{*B*} +{*C3*}Ele lê nossos pensamentos.{*EF*}{*B*}{*B*} +{*C2*}Algumas vezes eu não me importo. Outras vezes desejo dizer a eles que esse mundo que pensam ser verdadeiro é meramente {*EF*}{*NOISE*}{*C2*} e {*EF*}{*NOISE*}{*C2*}, quero dizer a eles que são {*EF*}{*NOISE*}{*C2*} no {*EF*}{*NOISE*}{*C2*}. Eles veem tão pouco da realidade, no longo sonho.{*EF*}{*B*}{*B*} +{*C3*}E ainda assim participam do jogo.{*EF*}{*B*}{*B*} +{*C2*}Mas seria tão fácil dizer a eles...{*EF*}{*B*}{*B*} +{*C3*}Tão forte para esse sonho. Contar que viver é impedi-los de viver.{*EF*}{*B*}{*B*} +{*C2*}Não vou dizer ao jogador como viver.{*EF*}{*B*}{*B*} +{*C3*}O jogador cresce incansavelmente.{*EF*}{*B*}{*B*} +{*C2*}Vou contar uma história ao jogador.{*EF*}{*B*}{*B*} +{*C3*}Mas não a verdade.{*EF*}{*B*}{*B*} +{*C2*}Não. A história que contém a verdade está a salvo em uma gaiola de palavras. Não a verdade nua e crua que pode queimar a qualquer distância.{*EF*}{*B*}{*B*} +{*C3*}Dar a ela um corpo novamente.{*EF*}{*B*}{*B*} +{*C2*}Sim. Jogador...{*EF*}{*B*}{*B*} +{*C3*}Use seu nome.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Jogador dos jogos.{*EF*}{*B*}{*B*} +{*C3*}Muito bom.{*EF*}{*B*}{*B*} + + + +{*C2*}Respire fundo agora. Respire novamente. Sinta o ar em seus pulmões. Deixe seus braços voltarem. Isso, mova seus dados. Sinta seu corpo novamente, sob a gravidade, no ar. Volte a existir no longo senha. Ai está você. Seu corpo tocando o universo novamente em cada ponto, como se você fosse coisas separadas. Como se nós fossemos coisas separadas.{*EF*}{*B*}{*B*} +{*C3*}Quem somos nós? Já fomos chamados de espírito da montanha. Pai sol, mãe lua. Espíritos ancestrais, espíritos animais. Jinn. Fantasmas. O homem verde. Depois deuses e demônios. Anjos. Poltergeists. Alienígenas, extraterrestres. Léptons, quarks. As palavras mudam. Nós não.{*EF*}{*B*}{*B*} +{*C2*}Somos o universo. Somos tudo o que não é você. Você está olhando para nós agora, pela pele e por seus olhos. E por que o universo toca sua pele e lança luz sobre você? Para vê-lo, jogador. Para conhecê-lo. E para ser conhecido. Quero lhe contar uma história.{*EF*}{*B*}{*B*} +{*C2*}Era uma vez um jogador.{*EF*}{*B*}{*B*} +{*C3*}Esse jogador era você, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Às vezes se julgava humano, na crosta fina de um globo girando de rocha pastosa. A bola de rocha pastosa circundava uma bola de gás flamejante 330 mil vezes mais compacta que ela. Estavam tão longe que a luz levava oito minutos para cruzar a distância. A luz era informação de uma estrela e podia queimar sua pela a 150 milhões de quilômetros de distância.{*EF*}{*B*}{*B*} +{*C2*}Às vezes o jogador sonhava que era um mineiro, na superfície de um mundo plano e infinito. O sol era um quadrado branco. Os dias eram curtos; havia muito a fazer; e a morte era uma inconveniência temporária.{*EF*}{*B*}{*B*} +{*C3*}Às vezes o jogador sonhava que estava perdido em uma história.{*EF*}{*B*}{*B*} +{*C2*}Às vezes sonhava que era outras coisas, em outros lugares. Às vezes esses sonhos eram perturbadores. Outras eram bem bonitos. Às vezes o jogador acordava de um sonho em outro, depois acordava desse em um terceiro.{*EF*}{*B*}{*B*} +{*C3*}Às vezes o jogador sonhava que via palavras em uma tela.{*EF*}{*B*}{*B*} +{*C2*}Vamos voltar.{*EF*}{*B*}{*B*} +{*C2*}Os átomos do jogador estavam espalhados na grama, nos rios, no ar, no chão. Uma mulher recolheu os átomos; ela bebeu, comeu e inalou; e a mulher montou o jogador no próprio corpo.{*EF*}{*B*}{*B*} +{*C2*}E o jogador despertou do mundo quente e escuro do corpo de sua mãe para o longo sonho.{*EF*}{*B*}{*B*} +{*C2*}E o jogador estava em uma nova história, nunca antes contada, escrita nas letras do DNA. E o jogador era um novo programa, nunca antes executado, gerado por um código-fonte de um bilhão de anos. E o jogador era um novo ser humano, que nunca viveu antes, feito de nada além de leite e amor.{*EF*}{*B*}{*B*} +{*C3*}Você é o jogador. A história. O programa. O ser humano. Feito de nada além de leite e amor.{*EF*}{*B*}{*B*} +{*C2*}Vamos retroceder um pouco mais.{*EF*}{*B*}{*B*} +{*C2*}Os sete bilhões, bilhões e bilhões de átomos do corpo do jogador foram criados, muito antes deste jogo, no coração de uma estrela. Então, o jogador também é informação de uma estrela. E o jogador move-se por uma história, que é uma floresta de informações plantadas por um homem chamado Julian, em um mundo plano e infinido criado por um homem chamado Markus, que existe dentre de um pequeno mundo particular criado pelo jogador, que habita um universo criado por...{*EF*}{*B*}{*B*} +{*C3*}Silêncio. Às vezes o jogador criava um mundo pequeno e particular que era tranquilo, quente e simples. Outras difícil, frio e complicado. Às vezes criava um modelo do universo em sua cabeça; sinais de energia movendo-se por vastos espaços vazios. Às vezes chamava esses sinais de "elétrons" e "prótons".{*EF*}{*B*}{*B*} + + + +{*C2*}Às vezes os chamavam de "planetas" e "estrelas".{*EF*}{*B*}{*B*} +{*C2*}Às vezes acreditava estar em um universo feito de energia composta de coisas ocasionais; zeros e uns; linhas de código. Outras vezes achava que estava participando de um jogo. Às vezes acreditava estar lendo palavras em uma tela.{*EF*}{*B*}{*B*} +{*C3*}Você é o jogador, lendo palavras...{*EF*}{*B*}{*B*} +{*C2*}Silêncio... Às vezes o jogador lê linhas do código em uma tela. Decodificadas em palavras; palavras decodificadas em significado; significado decodificado em sentimentos, emoções, teorias, ideias, e o jogador começou a respirar mais rápido e mais profundo e percebeu que estava vivo, era um ser vivo, aquelas milhares de mortes não eram reais, o jogador estava vivo.{*EF*}{*B*}{*B*} +{*C3*}Você. Você. Você está vivo.{*EF*}{*B*}{*B*} +{*C2*}E às vezes o jogador acreditava que o universo falara com ele através da luz do sol que atravessava as folhas das árvores do verão{*EF*}{*B*}{*B*} +{*C3*}e outras acreditava que o universo falara com ele através da luz que atravessava o céu claro da noite de inverno, onde um sinal de luz no canto do olho do jogador pode ser uma estrela um milhão de vezes maior que o sol, mergulhando seus planetas em plasma para ser vista, por um momento, pelo jogador, indo para casa no lado distante do universo, repentinamente sentindo o cheiro de comida, quase na porta familiar, prestes a sonhar novamente{*EF*}{*B*}{*B*} +{*C2*}e às vezes o jogador acreditava que o universo falara com ele através dos zeros e uns, da eletricidade do mundo, nas palavras rolando em uma tela no final de um sonho{*EF*}{*B*}{*B*} +{*C3*}e o universo disse eu amo você{*EF*}{*B*}{*B*} +{*C2*}e o universo disse que você jogou bem{*EF*}{*B*}{*B*} +{*C3*}e o universo disse que tudo o que precisa está dentro de você{*EF*}{*B*}{*B*} +{*C2*}e o universo disse que você é mais forte do que pensa{*EF*}{*B*}{*B*} +{*C3*}e o universo disse que você é a luz do dia{*EF*}{*B*}{*B*} +{*C2*}e o universo disse que você é a noite{*EF*}{*B*}{*B*} +{*C3*}e o universo disse que a escuridão contra a qual luta está dentro de você{*EF*}{*B*}{*B*} +{*C2*}e o universo disse que a luz que busca está dentro de você{*EF*}{*B*}{*B*} +{*C3*}e o universo disse que você não está sozinho{*EF*}{*B*}{*B*} +{*C2*}e o universo disse que você não está separado das demais coisas{*EF*}{*B*}{*B*} +{*C3*}e o universo disse que você é o universo se provando, conversando consigo mesmo, lendo seu próprio código{*EF*}{*B*}{*B*} +{*C2*}e o universo disse eu amo você porque você é amor.{*EF*}{*B*}{*B*} +{*C3*}E o jogo acabou e o jogador acordou do sonho. E o jogador começou um novo sonho. E o jogador sonhou novamente e sonhou melhor. E o jogador era o universo. E o jogador era amor.{*EF*}{*B*}{*B*} +{*C3*}Você é o jogador.{*EF*}{*B*}{*B*} +{*C2*}Acorde.{*EF*} + + +Reiniciar Submundo + +Tem certeza de que quer redefinir o Submundo para o estado padrão neste jogo salvo? Você perderá tudo o que construiu no Submundo! + +Reiniciar Submundo + +Não redefinir Submundo + +Não é possível cortar este Vacogumelo no momento. O número máximo de Porcos, Ovelhas, Vacas e Gatos foi alcançado. + +Não é possível usar Ovo de Geração no momento. O número máximo de Porcos, Ovelhas, Vacas e Gatos foi alcançado. + +Não é possível usar o ovo spawn no momento. O número máximo de vacogumelos foi alcançado. + +Não é possível usar o ovo spawn no momento. O número máximo de lobos em um mundo foi alcançado. + +Não é possível usar o ovo spawn no momento. O número máximo de frangos em um mundo foi alcançado. + +Não é possível usar o ovo spawn no momento. O número máximo de lulas em um mundo foi alcançado. + +Não é possível usar o Ovo de Criação no momento. O número máximo de inimigos no mundo já foi alcançado. + +Não é possível usar o Ovo de Criação no momento. O número máximo de aldeões no mundo já foi alcançado. + +O número máximo de pinturas/quadros de itens foi alcançado. + +Você não pode gerar inimigos no Modo Paz. + +Este animal não pode entrar no Modo Amor. O número máximo de Porcos, Ovelhas, Vacas e Gatos de criação foi alcançado. + +Este animal não pode entrar em Modo Amor. O número máximo de lobos foi alcançado. + +Este animal não pode entrar em Modo Amor. O número máximo de frangos foi alcançado. + +Este animal não pode entrar em Modo Amor. O número máximo de vacogumelos foi alcançado. + +O número máximo de barcos em um mundo foi alcançado. + +O número máximo de Cabeças de multidão no mundo foi alcançado. + +Inverter + +Canhoto + +Morreu! + +Gerar Novamente + +Conteúdo para Baixar + +Alterar Capa + +Como Jogar + +Controles + +Configurações + +Créditos + +Reinstalar Conteúdo + +Configurações de Depuração + +Fogo Espalha + +TNT Explode + +Jogador x Jogador + +Confiar nos Jogadores + +Privilégios do Host + +Gerar Estruturas + +Mundo Superplano + +Baú de Bônus + +Opções de Mundo + +Pode Construir e Minerar + +Pode Usar Portas e Acionadores + +Pode Abrir Recipientes + +Pode Atacar Jogadores + +Pode Atacar Animais + +Moderador + +Expulsar + +Pode Voar + +Desabilitar Exaustão + +Invisível + +Opções do Host + +Jogadores/Convidar + +Jogo online + +Só convidados + +Mais Opções + +Carregar + +Novo Mundo + +Nome do Mundo + +Semente para Criação de Mundo + +Deixar em branco para semente aleatória + +Jogadores + +Entrar no Jogo + +Iniciar Jogo + +Nenhum Jogo Encontrado + +Jogar + +Placares de Líderes + +Conquistas + +Ajuda e Opções + +Desbloquear Jogo Completo + +Continuar Jogo + +Salvar Jogo + +Dificuldade: + +Tipo de Jogo: + +Gamertags: + +Estruturas: + +Tipo de Nível: + +JxJ: + +Confiar Jogadores: + +TNT: + +Fogo Espalha: + +Reinstalar Tema + +Reinstalar Imagem do Jogador 1 + +Reinstalar Imagem do Jogador 2 + +Reinstalar Item de Avatar 1 + +Reinstalar Item de Avatar 2 + +Reinstalar Item de Avatar 3 + +Opções + +Ãudio + +Controle + +Gráficos + +Interface do Usuário + +Restaurar Padrões + +Exibir Oscilação + +Dicas + +Dicas de Ferramentas do Jogo + +Gamertags no Jogo + +Dividir Tela p/ 2 Jogadores + +Concluído + +Editar mensagem da placa: + +Preencha os detalhes que acompanharão sua captura de tela + +Legenda + +Captura de tela do jogo + +Editar mensagem da placa: + +Vejam o que fiz no Minecraft: Xbox 360 Edition! + +Texturas, ícones e interface do usuário clássicos do Minecraft! + +Mostrar todos os mundos de Combinações + +Selecionar slot para salvar transferência + +Slot vazio + +Carregando metadados salvos + +Carregando dados salvos + +Carregando jogo salvo para Xbox One + +Carregamento cancelado + +Você cancelou o carregamento deste salvamento para a área de transferência. + +Sem efeitos + +Velocidade + +Lentidão + +Pressa + +Fadiga do Minerador + +Força + +Fraqueza + +Saúde Imediata + +Dano Imediato + +Salto Turbinado + +Náuseas + +Regeneração + +Resistência + +Resistência ao Fogo + +Respirar na Ãgua + +Invisibilidade + +Cegueira + +Visão Noturna + +Fome + +Veneno + +de Rapidez + +de Lentidão + +de Pressa + +de Lentidão + +de Força + +de Fraqueza + +Cura + +de Dano + +de Salto + +de Náuseas + +de Regeneração + +de Resistência + +de Resistência ao Fogo + +de Respirar na Ãgua + +de Invisibilidade + +de Cegueira + +de Visão Noturna + +de Fome + +de Veneno + + + +II + +III + +IV + +Tchibum + +Mundano + +Desinteressante + +Tranquilo + +Limpo + +Leitoso + +Difuso + +Sem Artifícios + +Fino + +Maligno + +Plano + +Grande + +Desajeitado + +Amanteigado + +Suave + +Suave + +Sofisticado + +Grosso + +Elegante + +Chique + +Charmoso + +Ousado + +Refinado + +Cordial + +Cintilante + +Potente + +Desagradável + +Inodoro + +Classificação + +Severo + +Amargo + +Grosseiro + +Fedido + +Usada como base de todas as poções. Use em uma barraca de poções para criar poções. + +Não tem efeitos, pode ser usada em uma barraca de poções para criar poções adicionando mais ingredientes. + +Aumenta a velocidade de movimento dos jogadores, animais e monstros afetados, e a velocidade de corrida, a extensão dos saltos e o campo de visão dos jogadores. + +Reduz a velocidade de movimento dos jogadores, animais e monstros afetados, e a velocidade de corrida, a extensão dos saltos e o campo de visão dos jogadores. + +Aumenta os danos causados pelos jogadores e monstros afetados durante o ataque. + +Reduz os danos causados pelos jogadores e monstros afetados durante o ataque. + +Aumenta imediatamente a saúde dos jogadores, animais e monstros afetados. + +Reduz imediatamente a saúde dos jogadores, animais e monstros afetados. + +Restaura a saúde dos jogadores, animais e monstros afetados com o tempo. + +Torna os jogadores, animais e monstros afetados imunes a danos do fogo, lava e ataques de Chamas à distância. + +Reduz a saúde dos jogadores, animais e monstros afetados com o tempo. + +Nitidez + +Atacar + +Veneno de Artrópodes + +Coice + +Aspecto de Fogo + +Proteção + +Proteção contra Fogo + +Queda de Pena + +Proteção contra Explosão + +Proteção contra Projétil + +Respiração + +Afinidade com a Ãgua + +Eficiência + +Toque de Seda + +Inquebrável + +Pilhagem + +Sorte + +Poder + +Chama + +Soco + +Infinito + +I + +II + +III + +IV + +V + +VI + +VII + +VIII + +IX + +X + +Pode ser minerado com uma picareta de ferro ou melhor para pegar esmeraldas. + +Similar a um baú, porém os itens colocados dentro do Cofre Ender ficam disponíveis em todos os Cofres Ender do jogador, mesmo em uma dimensão diferente. + +É ativado quando uma entidade passa por um disparador conectado. + +Ativa um gancho disparador conectado quando uma entidade passa sobre ele. + +Uma maneira compacta de armazenar esmeraldas. + +Uma parede feita de paralelepípedos. + +Pode ser usado para consertar armas, ferramentas e armaduras. + +Fundido em fornalha para produzir quartzo. + +Usado como decoração. + +Pode ser negociado com os aldeões. + +Usado como decoração. Flores, mudas, cactos e cogumelos podem ser plantadas nele. + +Restaura 2{*ICON_SHANK_01*} e pode ser transformada em uma cenoura dourada. Pode ser plantada na fazenda. + +Restaura 0.5{*ICON_SHANK_01*}, ou pode ser preparado em fornalha, ou plantado na fazenda. + +Restaura 3{*ICON_SHANK_01*}. Criado ao cozinhar uma batata na fornalha. + +Restaura 1{*ICON_SHANK_01*}, ou pode ser cozinhado em uma fornalha. Pode ser plantado na fazenda. Comer isso pode te envenenar. + +Restaura 3{*ICON_SHANK_01*}. Criado com uma cenoura e barras de ouro. + +Usado para controlar um porco encilhado quando estiver montando. + +Restaura 4{*ICON_SHANK_01*}. + +Usado com uma bigorna para encantar armas, ferramentas ou armaduras. + +Criado ao minerar quartzo fundido. Pode ser moldado em um bloco de quartzo. + +Produzido com Lã. Usado como decoração. + +Esmeralda + +Vaso de Flor + +Cenoura + +Batata + +Batata Cozida + +Batata Venenosa + +Cenoura Dourada + +Cenoura na Vareta + +Torta de Abóbora + +Livro Encantado + +Quartzo do Submundo + +Minério de Esmeralda + +Cofre Ender + +Gancho Disparador + +Disparador + +Bloco de Esmeraldas + +Parede de Paralelepípedos + +Parede de Paralelepípedos com Musgo + +Vaso de Flor + +Cenouras + +Batatas + +Bigorna + +Bigorna + +Bigorna pouco danificada + +Bigorna muito danificada + +Minério de Quartzo do Submundo + +Bloco de Quartzo + +Bloco de Quartzo Cinzelado + +Pilar de Bloco de Quartzo + +Escada de Quartzo + +Tapete + +Tapete Preto + +Tapete Vermelho + +Tapete Verde + +Tapete Marrom + +Tapete Azul + +Tapete Roxo + +Tapete Ciano + +Tapete Cinza Claro + +Tapete Cinza + +Tapete Rosa + +Tapete Verde + +Tapete Amarelo + +Tapete Azul-claro + +Tapete Magenta + +Tapete Laranja + +Tapete Branco + +Arenito Cinzelado + +Arenito Macio + +{*PLAYER*} foi morto tentando machucar {*SOURCE*} + +{*PLAYER*} foi esmagado por uma Bigorna que caiu. + +{*PLAYER*} foi esmagado por um bloco que caiu. + +Teleportou {*PLAYER*} para {*DESTINATION*} + +{*PLAYER*} teleportou você até a posição dele + +{*PLAYER*} teleportou-se até você + +Espinhos + +Laje de Quartzo + +Faz as áreas escuras aparecerem claras como se fosse dia, até mesmo as submersas. + +Deixa invisíveis os jogadores, animais e monstros afetados. + +Consertar e Nomear + +Custo do Feitiço: %d + +Muito caro! + +Renomear + +Você tem: + +Itens necessários para negociar + +{*VILLAGER_TYPE*} oferece %s + +Consertar + +Negociar + +Tingir coleira + + + Esta é uma interface de bigorna, que pode ser usada para renomear, consertar e aplicar feitiços em armas, armaduras ou ferramentas ao custo de níveis de experiência. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre a interface de bigorna.{*B*} + Pressione{*CONTROLLER_VK_B*} se vocÇe já sabe usar a interface de bigorna. + + + + Para começar a trabalhar em um item, coloque-o no primeiro espaço disponível. + + + + Quando a matéria-prima correta é colocada no segundo espaço (ex.: lingotes de ferro para uma espada danificada), o reparo proposto aparece no outro espaço. + + + + Como alternativa, um segundo item idêntico pode ser colocado no segundo espaço para combinar os dois itens. + + + + Para enfeitiçar itens na bigorna, coloque um Livro Encantado no segundo espaço. + + + + O número de níveis de experiência que o trabalho custará é mostrado abaixo da saída. Se você não tiver níveis de experiência suficientes, o reparo não será concluído. + + + + É possível renomear o item editando o texto da caixa de textos. + + + + Pegar o item consertado consumirá ambos os itens usados pela bigorna e diminuirá seu nível de experiência pela quantidade informada. + + + + Nesta área há uma bigorna e um baú contendo ferramentas e armas para serem trabalhadas. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre a bigorna.{*B*} + Pressione{*CONTROLLER_VK_B*} se você já sabe o que precisa sobre a bigorna. + + + + Com uma bigorna, armas e ferramentas podem ser consertadas para restaurar sua durabilidade, renomear ou enfeitiçar com Livros Encantados. + + + + Livros Encantados podem ser encontrados dentro de Baús nas masmorras, ou encantados através de livros normais na Mesa de Feitiços. + + + + Usar a bigorna custa níveis de experiência e cada uso tem uma chance de danificá-la. + + + + O tipo de trabalho que deve ser feito, valor do item, número de feitiços e quantidade de trabalho prévio afetam no custo do reparo. + + + + Renomear um item altera o nome exibido para todos os jogadores e reduz permanentemente o custo do trabalho prévio. + + + + Dentro do baú nesta área você encontrará picaretas danificadas, matérias-primas, garrafas de feitiços e livros de encantos para serem experimentados. + + + + Esta é a interface de comércio que mostra os negócios que podem ser feitos com um aldeão. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre a interface de comércio.{*B*} + Pressione{*CONTROLLER_VK_B*} se você já sabe o que precisa sobre a interface de comércio. + + + + Todos os negócios que o aldeão quer fazer no momento são exibidos no topo. + + + + Os negócios aparecem em vermelho e não estarão disponíveis se você não tiver itens suficientes. + + + + A quantidade e tipo de itens que você fornece para o aldeão aparecem dentro das duas caixas à esquerda. + + + + Você pode ver o total de itens necessários para negociar nas duas caixas à esquerda. + + + + Pressione{*CONTROLLER_VK_A*} para negociar os itens que o aldeão quer para o item ofertado. + + + + Neste área há um aldeão e um baú contendo papel para comprar itens. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre negociar.{*B*} + Pressione{*CONTROLLER_VK_B*} se você já sabe o que precisa sobre negociar. + + + + Jogadores podem negociar itens de seus estoques com os aldeões. + + + + Os produtos de um aldeão dependem da sua profissão. + + + + Efetuar uma mistura de negócios adicionará aleatoriamente ou melhorará os produtos disponíveis do aldeão. + + + + Produtos que foram negociados frequentemente pode ser removidos temporariamente, mas um aldeão sempre terá algo para negociar. + + + + Pegue um papel do baú e tente negociar com o aldeão. + + + + Nesta área há dois Cofres Ender. + + + + {*B*} + Pressione{*CONTROLLER_VK_A*} para saber mais sobre Cofres Ender.{*B*} + Pressione{*CONTROLLER_VK_B*} se você já sabe o suficiente sobre Cofres Ender. + + + + Todos os Cofres Ender em um mundo são interconectados, até mesmo em dimensões diferentes. Os itens colocados em um Cofre Ender estarão disponíveis em qualquer outro Cofre Ender. + + + + Contudo, os conteúdos dos Baús Ender são diferentes para cada jogador. + + + + Isso permite que os jogadores armazenem itens em qualquer Cofre Ender e os recuperem em outro Cofre Ender em um lugar diferente do mundo. Você pode experimentar isso agora colocando itens em ambos os Cofres Ender. + + +Restaura 2{*ICON_SHANK_01*}, regenera saúde por 30 segundos e concede resistência ao fogo e resistência a danos por 5 minutos. Feita com uma maçã e blocos de ouro. + +Pode teleportar + +Teleportar + +Teleportar para o jogador + +Teleportar para mim + +Pode desativar a exaustão + +Pode ficar invisível + +Agora você pode ativar a invisibilidade + +Você não pode mais ativar a invisbilidade + +Agora você pode ativar voo + +Você não pode mais ativar voo + +Agora você pode desativar a exaustão + +Você não pode mais desativar a exaustão + +Agora você pode teleportar + +Você não pode mais teleportar + +{*T3*}COMO JOGAR: BIGORNA{*ETW*}{*B*}{*B*} +Níveis de experiência também podem ser utilizados para consertar, encantar ou renomear itens com a Bigorna.{*B*} +Todos os itens podem ser renomeados, embora apenas itens com durabilidade podem ser consertados ou ser encantados com Livros Encantados aplicados a eles.{*B*} +Um item pode ser consertado ao colocá-lo em um dos espaços à esquerda, junto com a matéria-prima do produto, como Lingotes de ferro para uma Espada de ferro, ou combinados com outro item do mesmo tipo.{*B*} +Combinar itens é mais eficiente quando feito com uma Bigorna, e ainda, se algun dos itens tiver sido encantado, o produto final pode ter encantos de ambas as origens.{*B*} +Livros encantados podem aplicar encantos em itens ao combiná-los em uma Bigorna, desde que o encanto dos Livros seja adequado. Livros encantados podem ser encontrados em Baús nas masmorras ou encantados a partir de livros normais na Mesa de Feitiços.{*B*} +Há uma chance da Bigorna ser danificada a cada uso, e com o uso continuado ela se destruirá.{*B*} + + +{*T3*}COMO JOGAR: NEGOCIANDO{*ETW*}{*B*}{*B*} +É possível comprar e vender itens com os aldeões. Cada aldeão tem uma profissão; eles podem ser Fazendeiros, Açougueiros, Ferreiros, Bibliotecários ou Padres, e isso afeta o tipo de itens que eles podem negociar.{*B*} +Você encontra uma lista de todos os itens que um aldeão oferece no menu de negociações. Um aldeão pode modificar ou adicionar aos seus negócios sempre que um jogador negocia com ele, embora uma negociação possa ficar temporariamente desabilitada se usada com muita frequência.{*B*} +Os negócios normalmente envolvem vender ou comprar diversos itens por esmeraldas.{*B*} +Se você não tem os itens necessários para um negócio, os espaços ficarão vermelhos.{*B*} + + +{*T3*}COMO JOGAR: BAÚ ENDER {*ETW*}{*B*}{*B*} +Todos os Baús Ender em um mundo são vinculados; itens colocados em um Baú Ender são acessíveis em qualquer outro. Porém, o conteúdo dos Baús Ender são diferentes para cada jogador. Desta forma os jogadores podem armazenar itens em um Baú Ender e recuperá-lo em outros Baús Ender em outros locais do mundo. + + +Fazendeiro + +Bibliotecário + +Padre + +Ferreiro + +Açogueiro + +Encontrados nas aldeias, os aldeões se oferecerão para vender itens para o jogador de acordo com sua profissão. + +Baú grande + + + Você também pode criar Livros Encantados na Mesa de Feitiços, que pode ser usada depois na Bigorna para aplicar seu feitiço em um item. + + + + Ganchos com Cordas também providenciarão força para um circuito enquanto algo estiver acionando a corda entre eles. + + + + Uma vez domado, um lobo usará sempre uma coleira. A cor da coleira pode ser alterada com tingimento. + + +Cenouras e Batatas são cultivadas ao plantar Cenouras ou Batatas, e estarão prontas para a colheita quando o vegetal estiver visível no solo. + + + E mais, porcos podem ser encilhados, montados e guiados pelo jogador. Controle-os atiçando com uma Cenoura na vareta. + + + + Se necessário, você pode mover seu carrinho de mina lentamente usando {*CONTROLLER_ACTION_MOVE*}. Isso ajuda a ativar o carrinho de mina colocando-o sobre um trilho com propulsão. + + +Você não pode entrar neste jogo, pois a tela dividida só é compatível com o modo de Alta Definição. Remova todos os outros jogadores se quiser entrar. + +Cura + +Xbox 360 + +Voltar + +Esta opção desativa as atualizações de Conquistas e do placar de líderes nesse mundo enquanto estiver jogando e se for carregá-lo novamente depois de salvar com esta opção ativada. + +Carregar jogo salvo para o Xbox One + +Carregar Salvamento + +Só é possível armazenar um salvamento do Xbox 360 por vez na área de transferência. Certifique-se de que baixou o salvamento atual no seu console Xbox One antes de enviar outro salvamento de Xbox 360. + +Enviando... + +Envio concluído! + +Falha no carregamento. Tente novamente mais tarde. + + diff --git a/Minecraft.Client/Common/Media/pt-PT/4J_strings.resx b/Minecraft.Client/Common/Media/pt-PT/4J_strings.resx new file mode 100644 index 00000000..a612c335 --- /dev/null +++ b/Minecraft.Client/Common/Media/pt-PT/4J_strings.resx @@ -0,0 +1,108 @@ + +Não Utilizado + +OK + +Anterior + +Cancelar + +Sim + +Não + +Dados Guardados Corrompidos + +Os teus dados guardados parecem estar corrompidos. Queres gravar novamente e substituir os dados corrompidos? + +Sem Espaço Livre + +O dispositivo de armazenamento que selecionaste não tem espaço livre suficiente para guardar os dados de jogo. + +Selecionar novamente + +Jogar sem guardar + +Guardar novos dados + +Substituir os dados? + +O dispositivo de armazenamento selecionado já contém dados guardados. Tens a certeza de que queres substituí-los? + +Não - não substituir + +Substituir e guardar + +Falha ao guardar + +Problema de disp. de armazen. + +O teu dispositivo de armazenamento não está disponível ou tem um erro + +O teu dispositivo de armazenamento não está disponível ou apresenta um erro. Seleciona um novo dispositivo de armazenamento. + +Selecionar novo dispositivo + +Nenhum disp. de arm. selecionado + +Se não selecionares um dispositivo, a opção de guardar os dados de jogo será desativada + +Selecionar disp. armazenamento + +Continuar sem guardar + +O teu dispositivo de armazenamento foi removido. Seleciona um novo dispositivo. + +Falha ao carregar + +Atrib. nome aos dados guardados + +Introduz um nome para os dados de jogo guardados + +Voltar à Interface Xbox + +Tens a certeza de que queres sair do jogo? + +Sessão terminada + +Foste reencaminhado para o ecrã principal porque o teu perfil de jogador terminou sessão + +O jogo terminou porque um perfil de jogador terminou sessão + +Continuar a jogar + +Perfil de jogador offline + +O jogo tem algumas funcionalidades que requerem um perfil de jogador ativo no Xbox Live, mas de momento estás offline. + +Esta funcionalidade requer um perfil de jogador ligado ao Xbox Live. + +Ligar ao Xbox Live + +Continuar a jogar offline + +Problema ao Obter Feito + + Ocorreu um problema ao aceder ao teu perfil de jogador. Não foi possível atribuir-te o feito neste momento. + +Problema com o perfil de jogador + +Falha ao guardar as definições no perfil de jogador. + +Perfil de Jogador Convidado + +O perfil de jogador convidado não pode aceder a esta funcionalidade. Utiliza um perfil de jogador diferente. + +A guardar… + +A guardar conteúdo. Por favor não desligue a consola. + +Desbloquear Jogo Completo + +Esta é a versão de avaliação do Minecraft. Se tivesses o jogo completo, terias acabado de ganhar um feito! +Desbloqueia o jogo completo para experimentares a diversão do Minecraft e para jogares com os teus amigos em todo o mundo através do Xbox Live. +Queres desbloquear o jogo completo? + +Estás a ser reencaminhado para o menu principal devido a um problema de leitura do teu perfil. + + diff --git a/Minecraft.Client/Common/Media/pt-PT/strings.resx b/Minecraft.Client/Common/Media/pt-PT/strings.resx new file mode 100644 index 00000000..132c30f2 --- /dev/null +++ b/Minecraft.Client/Common/Media/pt-PT/strings.resx @@ -0,0 +1,4461 @@ + +Novo Conteúdo Transferível disponível! Acede-lhe a partir do botão Loja Minecraft no Menu Principal. + +Podes mudar o aspeto da personagem com um Pacote de Skins da Loja Minecraft. Seleciona "Loja Minecraft" no Menu Principal para veres o que está ao teu dispor. + +No modo de Alta Definição, podem jogar até 4 jogadores na mesma consola com o ecrã dividido! + +Liga controladores extra à tua consola e prime START para te juntares a um jogo a qualquer altura. + +Altera as definições de gama para veres o jogo com maior ou menor luminosidade. + +Se configurares a dificuldade do jogo para Calmo, a tua saúde irá regenerar automaticamente e não surgirão monstros durante a noite! + +Dá um osso a um lobo para o domares. Depois, poderás ordenar-lhe para se sentar ou seguir-te. + +No menu Inventário, podes largar os objetos movendo o ponteiro para fora do menu e premindo{*CONTROLLER_VK_A*} + +Se dormires numa cama durante a noite irás acelerar o jogo até de madrugada, mas é necessário que todos os jogadores no jogo multijogador estejam a dormir em camas ao mesmo tempo. + +Para recuperares saúde, obtém costeletas a partir dos porcos, cozinha-as e come-as. + +Recolhe cabedal a partir das vacas e constrói armaduras. + +Se tiveres um balde vazio, poderás enchê-lo com leite de vaca, água ou lava! + +Utiliza uma enxada para preparar áreas de terreno para o cultivo. + +As aranhas não te atacam durante o dia, a não ser que as ataques. + +Utiliza uma pá para escavares terra ou areia mais rápido do que com as mãos! + +Se comeres as costeletas cozinhadas, irás ganhar mais saúde do que se as comeres cruas. + +Cria tochas para iluminares algumas zonas durante a noite. Os monstros não se aproximam das tochas. + +Chega ao destino mais rapidamente com uma vagoneta sobre carris! + +Planta alguns rebentos para que se transformem em árvores. + +Os pastores não te irão atacar, se não os atacares. + +Podes alterar o ponto de regeneração do jogo e avançar até à madrugada dormindo numa cama. + +Atira essas bolas de fogo de volta para o Ghast! + +Constrói um portal para poderes viajar até outra dimensão - o Submundo. + +Prime{*CONTROLLER_VK_B*} para largares o objeto que tens na mão! + +Usa a ferramenta certa para a tarefa! + +Se não conseguires encontrar carvão para as tochas, podes produzir carvão vegetal a partir de árvores numa fornalha. + +Não é boa ideia escavares diretamente para cima ou para baixo. + +O pó de ossos (obtido a partir de um osso de Esqueleto) pode ser utilizado como fertilizante e pode fazer com que as plantações cresçam instantaneamente! + +Os Creepers explodem quando se aproximam de ti! + +A obsidiana forma-se quando a água atinge um bloco de lava. + +A lava pode demorar vários minutos a desaparecer COMPLETAMENTE quando o bloco de origem é removido. + +A pedra arredondada resiste às bolas de fogo do Ghast, sendo muito útil para proteger portais. + +Os blocos que podem ser utilizados como fonte de luz, tais como tochas, glowstone e abóboras iluminadas, derretem a neve e o gelo. + +Tem cuidado ao construíres estruturas de lã a céu aberto, uma vez que os raios durante as trovoadas podem incendiar a lã. + +Um único balde de lava pode ser utilizado na fornalha para fundir 100 blocos. + +O instrumento tocado pelo bloco de notas depende do material sobre o qual se encontra. + +Os Mortos-vivos e Esqueletos conseguem sobreviver à luz do dia se estiverem dentro de água. + +Se atacares um lobo, todos os lobos nas redondezas irão virar-se contra ti. Isto também acontece com os Pastores Mortos-vivos. + +Os lobos não conseguem entrar no Submundo. + +Os lobos não atacam Creepers. + +As galinhas põem um ovo a cada 5 ou 10 minutos. + +A obsidiana só pode ser extraída com uma picareta de diamante. + +Os Creepers são a fonte mais comum de pólvora. + +Cria um baú grande colocando dois baús lado a lado. + +Podes ver o estado de saúde dos lobos domados pela posição da sua cauda. Dá-lhes carne para os curares. + +Cozinha catos numa fornalha para obteres tinta verde. + +Obtém as mais recentes novidades sobre este jogo do 4J Studios e do Kappische no Twitter! + +Impressiona os teus amigos publicando capturas de ecrã das tuas criações do Minecraft no Facebook a partir do menu de Pausa! + +Lê a secção Novidades nos menus Instruções de Jogo para obteres as informações mais recentes sobre o jogo. + +Cercas empilháveis já disponíveis no jogo! + +minecraftforum tem uma secção dedicada à Edição Xbox 360. + +Alguns animais seguir-te-ão se tiveres trigo na mão. + +Se um animal não se puder mover mais de 20 blocos em qualquer direção, ele não se irá desmaterializar. + +Música de C418! + +O Notch tem mais de um milhão de seguidores no Twitter! + +Nem todos os suecos são loiros. Alguns, como o Jens da Mojang, são ruivos! + +Nós pensamos que a 4J Studios retirou o Herobrine do jogo para a consola Xbox 360, mas não temos a certeza. + +Este jogo será atualizado no futuro! + +Quem é o Notch? + +A Mojang tem mais prémios do que colaboradores! + +Alguns famosos jogam Minecraft! + +deadmau5 gosta de Minecraft! + +Não olhes diretamente para os bugs. + +Os Creepers nasceram de um bug de codificação. + +É uma galinha ou um pato? + +Estiveste na Minecon? + +Nunca ninguém da Mojang viu a cara do Junkboy. + +Sabias que existe um Minecraft Wiki? + +O novo escritório do Mojang é fixe! + +Minecraft: Xbox 360 Edition bateu muitos recordes! + +O Minecon 2013 foi em Orlando, Florida, nos EUA! + +.party() foi fantástica! + +Assume sempre que os rumores são falsos e não verdadeiros! + +{*T3*}INSTRUÇÕES DE JOGO : PRINCÃPIOS BÃSICOS{*ETW*}{*B*}{*B*} +Em Minecraft, podes criar tudo aquilo que quiseres colocando blocos. À noite, os monstros andam por aí; constrói um abrigo antes que seja tarde.{*B*}{*B*} +Usa{*CONTROLLER_ACTION_LOOK*} para olhares em redor.{*B*}{*B*} +Usa{*CONTROLLER_ACTION_MOVE*} para te deslocares.{*B*}{*B*} +Prime{*CONTROLLER_ACTION_JUMP*} para saltar.{*B*}{*B*} +Prime rapidamente{*CONTROLLER_ACTION_MOVE*} para a frente duas vezes para fazeres um sprint. Enquanto manténs premido o {*CONTROLLER_ACTION_MOVE*} para a frente, a personagem irá continuar a correr até que se esgote o tempo ou que a Barra de Comida tenha menos de{*ICON_SHANK_03*}.{*B*}{*B*} +Mantém premido{*CONTROLLER_ACTION_ACTION*} para escavar e cortar utilizando as mãos ou os objetos que estiveres a segurar. Podes ter de criar uma ferramenta para colocares alguns blocos.{*B*}{*B*} +Se estiveres a segurar um objeto, usa{*CONTROLLER_ACTION_USE*} para o utilizares ou prime{*CONTROLLER_ACTION_DROP*} para o largares. + +{*T3*}INSTRUÇÕES DE JOGO : MOSTRADOR SUPERIOR{*ETW*}{*B*}{*B*} +O MOSTRADOR SUPERIOR apresenta informação sobre o teu estado; a tua saúde, o oxigénio que te resta quando estás debaixo de água, o teu nível de fome (tens de comer para reabasteceres) e a armadura, caso estejas a usar alguma. Se perderes saúde, mas tiveres uma barra de comida com 9 ou mais{*ICON_SHANK_01*}, a tua saúde será imediatamente reabastecida. Ao comeres, reabasteces a barra de comida.{*B*} +Aqui também é mostrada a Barra de Experiência, com um valor numérico que mostra o nível de Experiência, e a barra que indica quantos Pontos de Experiência te faltam para subires de nível. Ganhas Pontos de Experiência recolhendo os Orbes de Experiência que os habitantes deixam cair quando morrem, ao escavar certos tipos de blocos, ao criar animais, ao pescar e ao fundir minério na fornalha.{*B*} +Também apresenta os objetos disponíveis para usares. Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} e{*CONTROLLER_ACTION_RIGHT_SCROLL*} para mudares o objeto que estás a segurar. + +{*T3*}INSTRUÇÕES DE JOGO : INVENTÃRIO{*ETW*}{*B*}{*B*} +Usa{*CONTROLLER_ACTION_INVENTORY*} para veres o teu inventário.{*B*}{*B*} +Este ecrã mostra os objetos disponíveis que tens na mão e todos os objetos que estás a transportar. A tua armadura também é mostrada aqui.{*B*}{*B*} +Usa{*CONTROLLER_MENU_NAVIGATE*} para moveres o ponteiro. Usa{*CONTROLLER_VK_A*} para selecionares um objeto com o ponteiro. Caso exista mais do que um objeto, irás selecioná-los todos, ou poderás usar{*CONTROLLER_VK_X*} para selecionares apenas metade.{*B*}{*B*} +Move o objeto com o ponteiro sobre outro espaço no inventário e coloca-o nesse espaço utilizando{*CONTROLLER_VK_A*}. Caso tenhas selecionado vários objetos com o ponteiro, usa{*CONTROLLER_VK_A*} para os colocares todos ou{*CONTROLLER_VK_X*} para colocares apenas um.{*B*}{*B*} +Se o ponteiro estiver sobre uma armadura, verás uma descrição que te permite colocá-la rapidamente no espaço correto do inventário.{*B*}{*B*} +É possível mudar a cor da tua Armadura de Cabedal tingindo-a. Podes fazê-lo no menu de inventário mantendo a tinta no teu ponteiro e premindo{*CONTROLLER_VK_X*} enquanto o ponteiro está sobre a peça que pretendes tingir. + + +{*T3*}INSTRUÇÕES DE JOGO : BAÚ{*ETW*}{*B*}{*B*} +Depois de criares um Baú, podes colocá-lo no mundo e usá-lo com{*CONTROLLER_ACTION_USE*} para armazenar objetos do teu inventário.{*B*}{*B*} +Usa o ponteiro para mover os objetos do inventário para o baú.{*B*}{*B*} +Os objetos armazenados no baú podem ser colocados no inventário mais tarde. + + +{*T3*}INSTRUÇÕES DE JOGO : BAÚ GRANDE{*ETW*}{*B*}{*B*} +Ao colocares dois baús um ao lado do outro, estes combinam-se e formam um Baú Grande, que pode armazenar ainda mais objetos.{*B*}{*B*} +É utilizado da mesma forma que um baú normal. + + +{*T3*}INSTRUÇÕES DE JOGO : CRIAÇÃO{*ETW*}{*B*}{*B*} +Na interface de Criação, podes combinar objetos do inventário para criar novos tipos de objetos. Usa{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface de criação.{*B*}{*B*} +Desloca-te pelos separadores no topo utilizando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para selecionar o tipo de objeto que pretendes criar, depois usa{*CONTROLLER_MENU_NAVIGATE*} para selecionar o objeto a criar.{*B*}{*B*} +A área de criação mostra os objetos necessários para criar o novo objeto. Prime{*CONTROLLER_VK_A*} para criar o objeto e coloca-o no teu inventário. + + +{*T3*}INSTRUÇÕES DE JOGO : MESA DE CRIAÇÃO{*ETW*}{*B*}{*B*} +Podes criar objetos maiores utilizando uma Mesa de Criação.{*B*}{*B*} +Coloca a mesa no mundo e prime{*CONTROLLER_ACTION_USE*} para a usares.{*B*}{*B*} +A criação na mesa funciona da mesma forma que a criação básica, mas tens à tua disposição uma área maior e uma seleção de objetos mais ampla. + + +{*T3*}INSTRUÇÕES DE JOGO : FORNALHA {*ETW*}{*B*}{*B*} +A Fornalha permite-te alterar os objetos através do fogo. Por exemplo, podes transformar minério de ferro em lingotes de ferro.{*B*}{*B*} +Coloca a fornalha no mundo e prime{*CONTROLLER_ACTION_USE*} para a usares.{*B*}{*B*} +Tens de colocar o combustível na parte de baixo da fornalha e o objeto que queres alterar por cima. O fogo é ateado e a fornalha acende-se.{*B*}{*B*} +Depois de alterados os objetos, podes movê-los da área de saída para o inventário.{*B*}{*B*} +Se o objeto sobre o qual se encontra o ponteiro for um ingrediente ou combustível para a fornalha, surgirão descrições que te permitem mover o objeto para a fornalha com um movimento rápido. + + +{*T3*}INSTRUÇÕES DE JOGO : DISTRIBUIDOR{*ETW*}{*B*}{*B*} +O Distribuidor é utilizado para disparar objetos. Terás de colocar um interruptor, por exemplo, uma alavanca, junto ao distribuidor.{*B*}{*B*} +Para encheres o distribuidor prime{*CONTROLLER_ACTION_USE*}, depois move os objetos que queres distribuir do inventário para o distribuidor.{*B*}{*B*} +Quando usares o interruptor, o distribuidor irá disparar um objeto. + + +{*T3*}INSTRUÇÕES DE JOGO : PREPARAÇÃO DE POÇÕES{*ETW*}{*B*}{*B*} +Para preparares poções precisas de um Posto de Poções, que pode ser construído numa mesa de criação. Todas as poções começam com uma garrafa de água, que é criada enchendo uma Garrafa de Vidro com água de um Caldeirão ou de uma fonte de água.{*B*} +O Posto de Poções tem três orifícios para garrafas, por isso, podes preparar três poções ao mesmo tempo. Os ingredientes podem ser usados nas três garrafas, por isso, utiliza da melhor forma os teus recursos para preparares três poções em simultâneo.{*B*} +Se colocares um ingrediente na posição superior do Posto de Poções, passado pouco tempo terás criado uma poção base. Isto por si só não tem qualquer efeito, mas se colocares outro ingrediente com esta poção de base, irás obter uma poção com um efeito.{*B*} +Depois, podes adicionar um terceiro ingrediente para que o efeito dure mais tempo (utilizando Pó de Redstone), seja mais intenso (utilizando Pó de Glowstone) ou se transforme numa poção negativa (utilizando um Olho de Aranha Fermentado).{*B*} +Também podes adicionar pólvora a qualquer poção para a transformares numa Poção Explosiva, que pode ser atirada. Ao atirares uma Poção Explosiva, o seu efeito será aplicado em toda a área onde aterrar.{*B*} + +Os ingredientes para as poções são:{*B*}{*B*} +* {*T2*}Verruga do Submundo{*ETW*}{*B*} +* {*T2*}Olho de Aranha{*ETW*}{*B*} +* {*T2*}Açúcar{*ETW*}{*B*} +* {*T2*}Lágrima de Ghast{*ETW*}{*B*} +* {*T2*}Pó de Blaze{*ETW*}{*B*} +* {*T2*}Creme de Magma{*ETW*}{*B*} +* {*T2*}Melancia Brilhante{*ETW*}{*B*} +* {*T2*}Pó de Redstone{*ETW*}{*B*} +* {*T2*}Pó de Glowstone{*ETW*}{*B*} +* {*T2*}Olho de Aranha Fermentado{*ETW*}{*B*}{*B*} + +Experimenta várias combinações de ingredientes para descobrires as diferentes poções que podes preparar. + + +{*T3*}INSTRUÇÕES DE JOGO: FEITIÇOS{*ETW*}{*B*}{*B*} +Os Pontos de Experiência recolhidos quando um habitante morre, ou quando certos blocos são extraídos ou fundidos numa fornalha, podem ser usados para enfeitiçar algumas ferramentas, armas, armaduras e livros.{*B*} +Quando é colocada uma Espada, Arco, Machado, Picareta, Pá, Armadura ou Livro no orifício por baixo do livro na Mesa de Feitiços, os três botões à direita do orifício apresentam alguns feitiços e os respetivos custos em Níveis de Experiência.{*B*} +Se não tiveres Níveis de Experiência suficientes para usar alguns destes, o custo surgirá a vermelho, caso contrário surgirá a verde.{*B*}{*B*} +O feitiço aplicado é selecionado aleatoriamente com base no custo apresentado.{*B*}{*B*} +Se a Mesa de Feitiços estiver rodeada de Estantes (até um máximo de 15 Estantes), com um bloco de intervalo entre a Estante e a Mesa de Feitiços, o poder dos feitiços irá aumentar e ver-se-ão glifos misteriosos a sair do livro na Mesa de Feitiços.{*B*}{*B*} +Todos os ingredientes para uma Mesa de Feitiços podem ser encontrados nas aldeias de um mundo, ou escavando ou cultivando no mundo.{*B*} +Os Livros de Feitiços são usados na Bigorna para aplicar feitiços a itens. Isto dá-te maior controlo sobre os feitiços que gostarias de ter nos teus itens.{*B*} + + +{*T3*}INSTRUÇÕES DE JOGO : ANIMAIS DE QUINTA{*ETW*}{*B*}{*B*} +Se quiseres manter os teus animais num único sítio, constrói uma área vedada com menos de 20 blocos em cada lado e coloca lá dentro os teus animais. Assim, garantes que eles ainda lá estarão quando regressares. + + +{*T3*}INSTRUÇÕES DE JOGO : ANIMAIS DE CRIAÇÃO{*ETW*}{*B*}{*B*} +Em Minecraft, os animais podem reproduzir-se e dar origem a animais bebé!{*B*} +Para fazeres criação, precisas de os alimentar com a comida certa, para que eles entrem em 'Modo Amor'.{*B*} +Dá Trigo a Vacas, Vacogumelos ou Ovelhas, Cenouras a porcos, Sementes de Trigo ou Verrugas do Submundo a Galinhas, ou qualquer tipo de carne a um Lobo, e estes animais começarão a procurar outro animal da sua espécie que também esteja em Modo Amor.{*B*} +Quando dois animais da mesma espécie se encontram e estão ambos em Modo Amor, eles beijam-se durante uns segundos e depois aparece um animal bebé. O animal bebé seguirá os pais durante um tempo antes de se transformar num animal adulto.{*B*} +Depois de estar em Modo Amor, um animal não poderá voltar a esse estado durante cerca de cinco minutos.{*B*} +Há um limite para o número de animais que podes ter num mundo, pelo que, se já tiveres muitos, os animais podem não se reproduzir. + +{*T3*}INSTRUÇÕES DE JOGO : PORTAL DO SUBMUNDO{*ETW*}{*B*}{*B*} +O Portal do Submundo permite ao jogador viajar entre o Mundo Superior e o Submundo. O Submundo pode ser usado para viajar rapidamente no Mundo Superior - viajar um bloco no Submundo equivale a viajar 3 blocos no Mundo Superior, por isso, quando constróis um portal no Submundo e sais através do mesmo, estarás 3 vezes mais longe do teu ponto de entrada.{*B*}{*B*} +Para construir o portal são necessários pelo menos 10 blocos de Obsidiana, e o portal tem de ter 5 blocos de altura, 4 de largura e 1 de profundidade. Depois de construíres a estrutura do portal, o espaço interior da estrutura terá de ser incendiado para ser ativado. Podes fazê-lo utilizando o item de Sílex e Aço ou o item Carga de Fogo.{*B*}{*B*} +Na imagem à direita são apresentados exemplos da construção do portal. + + +{*T3*}INSTRUÇÕES DE JOGO : MULTIJOGADOR{*ETW*}{*B*}{*B*} +O Minecraft para a consola Xbox 360 é, por definição, um jogo multijogador. Se estiveres a jogar no modo de Alta Definição, podes competir com outros jogadores ligando os controladores na consola e premindo START a qualquer altura durante o jogo.{*B*}{*B*} +Ao iniciares ou participares num jogo online, essa informação ficará visível na tua lista de amigos (exceto se tiveres selecionado Apenas Por Convite ao criar o jogo) e se eles participarem no jogo, também ficará visível nas suas listas de amigos (se tiveres selecionado a opção Permitir Amigos de Amigos).{*B*} +Durante um jogo, podes premir o botão BACK para abrires uma lista de todos os outros participantes no jogo, ver os seus Gamercards, expulsar jogadores e convidar outras pessoas para participarem no jogo. + + +{*T3*}INSTRUÇÕES DE JOGO : PARTILHAR CAPTURAS DE ECRÃ{*ETW*}{*B*}{*B*} +Podes obter uma captura de ecrã do teu jogo abrindo o Menu Pausa e premindo {*CONTROLLER_VK_Y*} para Partilhar no Facebook. Surge uma versão em miniatura da captura de ecrã e podes editar o texto associado à publicação no Facebook.{*B*}{*B*} +Existe um modo de câmara especial para obter estas capturas de ecrã, que te permite ver a tua personagem de frente na imagem - prime {*CONTROLLER_ACTION_CAMERA*} até surgir a vista frontal da tua personagem antes de premires {*CONTROLLER_VK_Y*} para Partilhar.{*B*}{*B*} +Os Gamertags não são mostrados na captura de ecrã. + + +{*T3*}INSTRUÇÕES DE JOGO : NÃVEIS DE EXCLUSÃO{*ETW*}{*B*}{*B*} +Se encontrares conteúdo ofensivo num nível, podes adicioná-lo à lista de Níveis Excluídos. +Para tal, abre o menu Pausa e prime {*CONTROLLER_VK_RB*} para selecionar a descrição do Nível Excluído. +Se tentares jogar este nível no futuro, serás notificado de que este nível se encontra na tua lista de Níveis Excluídos e ser-te-á dada a opção de o remover da lista e continuar a jogar o nível ou retroceder. + +{*T3*}INSTRUÇÕES DE JOGO : MODO CRIATIVO{*ETW*}{*B*}{*B*} +A interface do modo criativo permite que qualquer objeto no jogo seja movido para o inventário do jogador sem ser necessário escavar ou criar o objeto. +Os objetos no inventário do jogador não serão removidos quando são colocados ou utilizados no mundo, o que permite ao jogador concentrar-se na construção em vez de na recolha de recursos.{*B*} +Se criares, carregares ou guardares um mundo no Modo Criativo, as atualizações de feitos e classificações serão desativadas nesse mundo, mesmo que seja carregado depois no Modo Sobrevivência.{*B*} +Para voar no Modo Criativo, prime rapidamente {*CONTROLLER_ACTION_JUMP*} duas vezes. Para parar de voar, repete a ação. Para voares mais rápido, prime rapidamente{*CONTROLLER_ACTION_MOVE*} para a frente duas vezes enquanto estiveres a voar. +No modo de voo, podes manter premido{*CONTROLLER_ACTION_JUMP*} para subires e{*CONTROLLER_ACTION_SNEAK*} para desceres, ou utilizar{*CONTROLLER_ACTION_DPAD_UP*} para subires, {*CONTROLLER_ACTION_DPAD_DOWN*} para desceres, +{*CONTROLLER_ACTION_DPAD_LEFT*} para ires para a esquerda e {*CONTROLLER_ACTION_DPAD_RIGHT*} para ires para a direita. + +{*T3*}INSTRUÇÕES DE JOGO : OPÇÕES DE ANFITRIÃO E JOGADOR{*ETW*}{*B*}{*B*} + +{*T1*}Opções de jogo{*ETW*}{*B*} +Ao carregar ou criar um mundo, prime o botão "Mais Opções" para abrir um menu que te dá maior controlo sobre o teu jogo.{*B*}{*B*} + + {*T2*}Jogador vs. Jogador{*ETW*}{*B*} + Quando ativada, os jogadores podem causar danos a outros jogadores. Esta opção afeta apenas o modo Sobrevivência.{*B*}{*B*} + + {*T2*}Confiar Jogadores{*ETW*}{*B*} + Quando desativada, os jogadores que participam no jogo ficam limitados na sua ação. Não podem obter ou usar objetos, colocar blocos, usar portas e interruptores, usar contentores, nem atacar jogadores ou animais. Podes alterar estas opções para um determinado jogador utilizando o menu do jogo.{*B*}{*B*} + + {*T2*}Propagação de Fogo{*ETW*}{*B*} + Quando ativada, o fogo pode propagar-se para os blocos inflamáveis mais próximos. Esta opção pode ser alterada dentro do jogo.{*B*}{*B*} + + {*T2*}Explosões de TNT{*ETW*}{*B*} + Quando ativada, o TNT explode quando é detonado. Esta opção pode ser alterada dentro do jogo.{*B*}{*B*} + + {*T2*}Privilégios de Anfitrião{*ETW*}{*B*} + Quando ativada, o anfitrião pode ativar a sua capacidade de voar, desativar a exaustão e tornar-se invisível a partir do menu do jogo. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + +{*T1*}Opções de Criação de Mundos{*ETW*}{*B*} +Ao criar um novo mundo, existem opções adicionais.{*B*}{*B*} + + {*T2*}Criar Estruturas{*ETW*}{*B*} + Quando ativada, são geradas Aldeias e Fortalezas no mundo.{*B*}{*B*} + + {*T2*}Mundo Superplano{*ETW*}{*B*} + Quando ativada, é gerado um mundo completamente plano no Mundo Superior e no Submundo.{*B*}{*B*} + + {*T2*}Baú de Bónus{*ETW*}{*B*} + Quando ativada, é criado um baú com objetos úteis junto ao ponto de regeneração do jogador.{*B*}{*B*} + + {*T2*}Repor Submundo{*ETW*}{*B*} + Quando ativada, o Submundo será novamente gerado. É útil no caso de ficheiros mais antigos que ainda não incluíam Fortalezas do Submundo.{*B*}{*B*} + + {*T1*}Opções de Jogo{*ETW*}{*B*} + Durante o jogo, é possível aceder a várias opções pressionando {*BACK_BUTTON*} para abrir o menu de jogo.{*B*}{*B*} + + {*T2*}Opções de Anfitrião{*ETW*}{*B*} + O anfitrião e os jogadores definidos como moderadores podem aceder ao menu "Opções de Anfitrião". Neste menu, podem ativar e desativar a propagação de fogos e as explosões de TNT.{*B*}{*B*} + +{*T1*}Opções de Jogador{*ETW*}{*B*} +Para modificar os privilégios de um jogador, seleciona o nome e prime{*CONTROLLER_VK_A*} para abrir o menu dos privilégios do jogador, onde podes usar as seguintes opções.{*B*}{*B*} + + {*T2*}Pode Construir e Escavar{*ETW*}{*B*} + Esta opção só está disponível quando "Confiar Jogadores" está desativada. Quando esta opção está ativada, o jogador pode interagir normalmente com o mundo. Quando está desativada, o jogador não poderá colocar ou destruir blocos nem interagir com muitos objetos e blocos.{*B*}{*B*} + + {*T2*}Pode Usar Portas e Interruptores{*ETW*}{*B*} + Esta opção só está disponível quando "Confiar Jogadores" está desativada. Quando esta opção está desativada, o jogador não poderá usar portas nem interruptores.{*B*}{*B*} + + {*T2*}Pode Abrir Contentores{*ETW*}{*B*} + Esta opção só está disponível quando "Confiar Jogadores" está desativada. Quando esta opção está desativada, o jogador não poderá abrir contentores nem baús.{*B*}{*B*} + + {*T2*}Pode Atacar Jogadores{*ETW*}{*B*} + Esta opção só está disponível quando "Confiar Jogadores" está desativada. Quando esta opção está desativada, o jogador não pode causar danos aos outros jogadores.{*B*}{*B*} + + {*T2*}Pode Atacar Animais{*ETW*}{*B*} + Esta opção só está disponível quando "Confiar Jogadores" está desativada. Quando esta opção está desativada, o jogador não poderá causar danos a animais.{*B*}{*B*} + + {*T2*}Moderador{*ETW*}{*B*} + Quando esta opção está ativada, o jogador pode alterar os privilégios dos outros jogadores (exceto o anfitrião) se "Confiar Jogadores" estiver desativada, expulsar jogadores e ativar ou desativar a propagação de fogo e as explosões de TNT.{*B*}{*B*} + + {*T2*}Expulsar Jogador{*ETW*}{*B*} + Selecionar esta opção faz com que jogadores que não estejam na mesma consola {*PLATFORM_NAME*} que o anfitrião sejam eliminados do jogo. Os jogadores expulsos não poderão voltar a participar no jogo até que este seja reiniciado.{*B*}{*B*} + +{*T1*}Opções de Jogador Anfitrião{*ETW*}{*B*} +Se "Privilégios de Anfitrião" estiver ativada, o jogador anfitrião pode modificar alguns dos seus privilégios. Para modificar os privilégios de um jogador, seleciona o nome e prime{*CONTROLLER_VK_A*} para abrir o menu de privilégios do jogador, onde podes usar as seguintes opções.{*B*}{*B*} + + {*T2*}Pode Voar{*ETW*}{*B*} + Quando esta opção está ativada, o jogador pode voar. Esta opção só é relevante no modo Sobrevivência, uma vez que todos os jogadores podem voar no modo Criativo.{*B*}{*B*} + + {*T2*}Desativar Exaustão{*ETW*}{*B*} + Esta opção afeta apenas o modo Sobrevivência. Quando ativada, as atividades físicas (caminhar/correr/saltar, etc.) não diminuem a barra de comida. No entanto, se o jogador for ferido, a barra de comida irá diminuir lentamente enquanto o jogador estiver a recuperar.{*B*}{*B*} + + {*T2*}Invisível{*ETW*}{*B*} + Quando esta opção está ativada, o jogador não pode ser visto pelos outros jogadores e é invulnerável.{*B*}{*B*} + + {*T2*}Pode Teletransportar{*ETW*}{*B*} + Permite que o jogador se transporte ou transporte outros jogadores até si ou até outros jogadores no mundo. + + +Página Seguinte + +Página Anterior + +Princípios Básicos + +HUD + +Inventário + +Baús + +Criar + +Fornalha + +Distribuidor + +Animais de Quinta + +Animais de Criação + +Preparação de Poções + +Feitiço + +Portal do Submundo + +Multijogador + +A Partilhar Capturas de Ecrã + +Níveis Excluídos + +Modo Criativo + +Opções de Anfitrião e Jogador + +Trocar + +Bigorna + +O Fim + +{*T3*}INSTRUÇÕES DE JOGO : O FIM{*ETW*}{*B*}{*B*} +O Fim é outra dimensão do jogo, à qual é possível chegar através de um Portal do Fim ativo. O Portal do Fim está numa Fortaleza, que está bem abaixo da terra no Mundo Superior.{*B*} +Para ativar o Portal do Fim, precisas de colocar um Olho de Ender em qualquer Estrutura de Portal do Fim que não o tenha.{*B*} +Assim que o portal estiver ativo, salta para ele e entra em O Fim.{*B*}{*B*} +Em O Fim irás encontrar o Ender Dragon, um feroz e poderoso inimigo, bem como muitos Endermen, pelo que tens de estar bem preparado para combater antes de lá entrares!{*B*}{*B*} +Descobrirás Cristais Ender em cima de oito picos Obsidianos que o Ender Dragon usa para se curar, +por isso, o primeiro passo na batalha é destruir cada um deles.{*B*} +Os primeiros podem ser alcançados com flechas, mas os últimos estão protegidos por uma jaula com Vedação de Ferro, e precisarás de subir para os alcançares.{*B*}{*B*} +Enquanto o fizeres, o Ender Dragon irá atacar-te voando na tua direção e cuspindo bolas de ácido Ender!{*B*} +Se te aproximares do Pódio de Ovos no centro dos picos, o Ender Dragon vai fazer um voo picado e atacar-te, e é nesse momento que o poderás realmente ferir!{*B*} +Evita o bafo ácido e aponta para os olhos do Ender Dragon para obteres os melhores resultados. Se possível, leva alguns amigos contigo para O Fim, para te ajudarem na batalha!{*B*}{*B*} +Assim que estiveres em O Fim, os teus amigos poderão ver nos seus mapas a localização do Portal do Fim na Fortaleza, +pelo que facilmente se juntarão a ti. + + +Sprint + +Novidades + + +{*T3*}Alterações e Adições{*ETW*}{*B*}{*B*} +- Novos objetos - Esmeralda, Minério de Esmeralda, Bloco de Esmeralda, Baú Ender, Gancho de Armadilha, Maçã Dourada Enfeitiçada, Bigorna, Vaso de Flores, Muros de Pedra Arredondada, Muros de Pedra Arredondada com Musgo, Pintura de Wither, Batata, Batata Cozida, Batata Venenosa, Cenoura, Cenoura Dourada, Cenoura num Pau, +Tarte de Abóbora, Poção de Visão Nocturna, Poção de Invisibilidade, Quartzo do Submundo, Minério de Quartzo do Submundo, Bloco de Quartzo, Placa de Quartzo, Escada de Quartzo, Bloco de Quartzo Esculpido, Bloco Pilar de Quartzo, Livro de Feitiços, Alcatifa.{*B*} +- Novas receitas para Grés Suave e Grés Esculpido.{*B*} +- Novos Habitantes - Aldeões Mortos-Vivos.{*B*} +- Novas funcionalidades de geração de terreno - Templos do Deserto, Aldeias do Deserto, Templos da Selva.{*B*} +- Trocas com aldeões.{*B*} +- Interface Bigorna.{*B*} +- Pode tingir armadura de cabedal.{*B*} +- Pode tingir coleiras de lobo.{*B*} +- Pode montar um porco e controlá-lo com uma Cenoura num Pau.{*B*} +- Conteúdo de Baú Bónus atualizado com mais objetos.{*B*} +- Alterada colocação de meios blocos e outros blocos em meios blocos.{*B*} +- Alterada colocação de placas e escadas invertidas.{*B*} +- Adicionadas profissões de aldeões diferentes.{*B*} +- Aldeões gerados a partir de ovo de geração terão uma profissão aleatória.{*B*} +- Adicionada colocação lateral de tronco.{*B*} +- Fornalhas podem usar ferramentas de madeira como combustível.{*B*} +- Painéis de Gelo e Vidro podem ser recolhidos com ferramentas enfeitiçadas com toque de seda.{*B*} +- Botões de Madeira e Placas de Pressão de Madeira podem ser ativados com Flechas.{*B*} +- Habitantes do Submundo podem ser gerados no Mundo Superior a partir de Portais.{*B*} +- Creepers e Aranhas são agressivos para com o último jogador que os tenha atingido.{*B*} +- Os habitantes no modo Criativo tornam-se novamente neutros após um curto período.{*B*} +- Remover ricochete aquando de afogamento.{*B*} +- As portas partidas por mortos-vivos apresentam danos.{*B*} +- Gelo derrete no Submundo.{*B*} +- Caldeirões enchem-se quando ficam à chuva.{*B*} +- Pistões demoram o dobro do tempo a atualizar.{*B*} +- Porco larga Sela quando é morto (se tiver sela).{*B*} +- Cor do céu alterada no Fim.{*B*} +- Corda pode ser colocada (para Armadilhas).{*B*} +- Chuva escorre das folhas.{*B*} +- Alavancas podem ser colocadas no fundo dos blocos.{*B*} +- TNT causa danos variáveis consoante a definição de dificuldade.{*B*} +- Receita de livro alterada.{*B*} +- Barcos partem Nenúfares, em vez de Nenúfares partirem Barcos.{*B*} +- Porcos largam mais Costeletas.{*B*} +- Slimes reproduzem-se menos em mundos Superplanos.{*B*} +- Dano de Creeper variável consoante a definição de dificuldade, mais ricochete.{*B*} +- Corrigida a não abertura dos maxilares dos Endermen.{*B*} +- Adicionado teletransporte de jogadores (usando o menu BACK do jogo).{*B*} +- Novas Opções Anfitrião para voar, invisibilidade e invulnerabilidade para jogadores remotos.{*B*} +- Novos tutoriais do Mundo Tutorial para novos itens e funcionalidades.{*B*} +- Posições dos Baús de Discos de Música atualizadas no Mundo Tutorial.{*B*} + + +{*ETB*}Bem-vindo de volta! Podes não ter reparado, mas o Minecraft sofreu alterações.{*B*}{*B*} +Há muitas novas funcionalidades para jogares com os teus amigos. Aqui ficam algumas. Lê e depois diverte-te!{*B*}{*B*} +{*T1*}Novos objetos{*ETB*} - Esmeralda, Minério de Esmeralda, Bloco de Esmeralda, Baú Ender, Gancho de Armadilha, Maçã Dourada Enfeitiçada, Bigorna, Vaso de Flores, Muros de Pedra Arredondada, Muros de Pedra Arredondada com Musgo, Pintura de Wither, Batata, Batata Cozida, Batata Venenosa, Cenoura, Cenoura Dourada, Cenoura num Pau, +Tarte de Abóbora, Poção de Visão Nocturna, Poção de Invisibilidade, Quartzo do Submundo, Minério de Quartzo do Submundo, Bloco de Quartzo, Placa de Quartzo, Escada de Quartzo, Bloco de Quartzo Esculpido, Bloco Pilar de Quartzo, Livro de Feitiços, Alcatifa.{*B*}{*B*} + {*T1*}Novos Habitantes{*ETB*} - Aldeões Mortos-Vivos.{*B*}{*B*} +{*T1*}Novas Funcionalidades{*ETB*} - Troca com aldeões, repara ou enfeitiça armas e ferramentas usando a Bigorna, armazena objetos num Baú Ender, controla um porco enquanto o montas usando uma Cenoura num Pau!{*B*}{*B*} +{*T1*}Novos Mini-Tutoriais{*ETB*} – Aprende a usar as novas funcionalidades no Mundo Tutorial!{*B*}{*B*} +{*T1*}Novos 'Easter Eggs'{*ETB*} – Mudámos de sítio todos os Discos de Música secretos no Mundo Tutorial. Vê se consegues voltar a encontrá-los!{*B*}{*B*} + + +Provoca mais danos do que com a mão. + +Utilizado para escavar terra, erva, areia, gravilha e neve mais rápido do que com a mão. Para escavar bolas de neve precisas de pás. + +Necessário para escavar blocos de pedra e minério. + +Utilizado para cortar blocos de madeira mais rápido do que com a mão. + +Utilizado para lavrar blocos de terra e erva para as colheitas. + +As portas de madeira são ativadas através do uso, dando um golpe ou com Redstone. + +As portas de ferro só podem ser abertas através de Redstone, botões ou interruptores. + +NOT USED + +NOT USED + +NOT USED + +NOT USED + +Dá ao utilizador 1 de Armadura quando usado. + +Dá ao utilizador 3 de Armadura quando usado. + +Dá ao utilizador 2 de Armadura quando usado. + +Dá ao utilizador 1 de Armadura quando usado. + +Dá ao utilizador 2 de Armadura quando usado. + +Dá ao utilizador 5 de Armadura quando usado. + +Dá ao utilizador 4 de Armadura quando usado. + +Dá ao utilizador 1 de Armadura quando usado. + +Dá ao utilizador 2 de Armadura quando usado. + +Dá ao utilizador 6 de Armadura quando usado. + +Dá ao utilizador 5 de Armadura quando usado. + +Dá ao utilizador 2 de Armadura quando usado. + +Dá ao utilizador 2 de Armadura quando usado. + +Dá ao utilizador 5 de Armadura quando usado. + +Dá ao utilizador 3 de Armadura quando usado. + +Dá ao utilizador 1 de Armadura quando usado. + +Dá ao utilizador 3 de Armadura quando usado. + +Dá ao utilizador 8 de Armadura quando usado. + +Dá ao utilizador 6 de Armadura quando usado. + +Dá ao utilizador 3 de Armadura quando usado. + +Um lingote brilhante que pode ser usado para criar ferramentas feitas com este material. Criado derretendo minério numa fornalha. + +Permite transformar lingotes, pedras preciosas e tintas em blocos colocáveis. Pode ser usado como bloco de construção caro ou arrumação compacta de minério. + +Utilizada para enviar uma descarga elétrica quando é pisada por um jogador, um animal ou um monstro. As Placas de Pressão de Madeira podem também ser ativadas deixando cair objetos sobre as mesmas. + +Utilizado como escadas compactas. + +Utilizado para criar escadas compridas. Duas placas colocadas uma sobre a outra criam um bloco de placa dupla de tamanho normal. + +Utilizado como escadas longas. Duas placas colocadas uma sobre a outra irão criar um bloco de placas duplo de tamanho normal. + +Utilizadas para criar luz. As tochas também derretem a neve e o gelo. + +Utilizado como material de construção, pode servir para criar várias coisas. Pode ser criado a partir de qualquer tipo de madeira. + +Utilizada como material de construção. Não é influenciada pela gravidade como a Areia normal. + +Utilizado como material de construção. + +Utilizado para criar tochas, setas, sinais, escadotes e cercas e também como pegas para ferramentas e armas. + +Utilizada para acelerar o tempo de noite até de manhã se todos os jogadores no mundo estiverem na cama, e altera o ponto de regeneração do jogador. +As cores da cama são sempre as mesmas, independentemente das cores da lã usada. + +Permite-te criar uma seleção de objetos mais ampla do que na criação normal. + +Permite-te fundir minério, criar carvão vegetal e vidro e cozinhar peixe e costeletas de porco. + +Armazena blocos e objetos no interior. Coloca dois baús lado a lado para criar um baú maior com o dobro da capacidade. + +Utilizada como barreira que não se pode saltar. Conta como 1,5 blocos de altura para jogadores, animais e monstros, e 1 bloco de altura para outros blocos. + +Utilizado para subir na vertical. + +São ativadas através do uso, dando um golpe ou com Redstone. Funcionam como portas normais, mas são um bloco único e estão no chão, na horizontal. + +Apresenta o texto introduzido por ti ou por outros jogadores. + +Utilizado para criar uma luz mais forte do que as tochas. Derrete a neve e o gelo e pode ser utilizado debaixo de água. + +Utilizado para causar explosões. É ativado depois da colocação com um objeto de Sílex e Aço ou com uma descarga elétrica. + +Utilizada para guardar guisado de cogumelos. Ficas com a tigela depois de comeres o guisado. + +Utilizado para guardar e transportar água, lava e leite. + +Utilizado para guardar e transportar água. + +Utilizado para guardar e transportar lava. + +Utilizado para guardar e transportar leite. + +Utilizada para criar fogo, explodir TNT e abrir um portal depois da sua construção. + +Utilizada para apanhar peixe. + +Mostra as posições do Sol e da Lua. + +Aponta para o ponto inicial. + +Quando seguras no mapa, poderás ver a imagem de uma área explorada. Pode ser utilizado para descobrir caminhos. + +Utilizado para ataques à distância com setas. + +Utilizadas como munição para os arcos. + +Restitui 2,5{*ICON_SHANK_01*}. + +Restitui 1{*ICON_SHANK_01*}. Podes usar até 6 vezes. + +Restitui 1{*ICON_SHANK_01*}. + +Restitui 1{*ICON_SHANK_01*}. + +Restaura 3{*ICON_SHANK_01*}. + +Restitui 1{*ICON_SHANK_01*} ou pode ser cozinhada numa fornalha. Podes ficar doente se a comeres crua. + +Restitui 3{*ICON_SHANK_01*}. Cria-se cozinhando galinha crua numa fornalha. + +Restitui 1,5{*ICON_SHANK_01*} ou pode ser cozinhado numa fornalha. + +Restitui 4{*ICON_SHANK_01*}. Cria-se cozinhando bife cru numa fornalha. + +Restituem 1,5{*ICON_SHANK_01*} ou podem ser cozinhadas numa fornalha. + +Restituem 4{*ICON_SHANK_01*}. Criadas ao cozinhar costeletas de porco cruas numa fornalha. + +Restitui 1{*ICON_SHANK_01*} ou pode ser cozinhado numa fornalha. Também pode ser dado a um Ocelote como alimento para o domar. + +Restitui 2,5{*ICON_SHANK_01*}. Criado ao cozinhar peixe cru numa fornalha. + +Restitui 2{*ICON_SHANK_01*} e pode criar uma maçã dourada. + +Restitui 2{*ICON_SHANK_01*} e regenera a saúde durante 4 segundos. Fabricada a partir de uma maçã e pepitas de ouro. + +Restitui 2{*ICON_SHANK_01*}. Se comeres isto podes ficar doente. + +Utilizado na receita do bolo e como ingrediente para fazer poções. + +Utilizada para enviar uma descarga elétrica ao ligar e desligar. Fica ligada ou desligada até ser premida novamente. + +Envia constantemente uma descarga elétrica ou pode ser utilizada como receptor/transmissor quando ligada ao lado de um bloco. +Pode também ser utilizada para iluminação reduzida. + +Utilizado em circuitos de Redstone como repetidor, retardador e/ou díodo. + +Utilizado para enviar uma descarga elétrica ao ser pressionado. Permanece ativado durante cerca de um segundo antes de se desligar. + +Utilizado para segurar e disparar objetos em ordem aleatória quando recebe uma descarga de Redstone. + +Reproduz uma nota quando ativado. Toca-lhe para alterar a altura da nota. Se o colocares sobre blocos diferentes, mudará o tipo de instrumento. + +Utilizado para conduzir vagonetas. + +Quando ativado, acelera as vagonetas que lhe passam por cima. Quando não está ativado, as vagonetas param. + +Funciona como uma Placa de Pressão (envia um sinal de Redstone quando ativado), mas só pode ser ativado por uma vagoneta. + +Utilizada para te transportar a ti, um animal ou um monstro pelos carris. + +Utilizado para transportar bens pelos carris. + +Desloca-se sobre carris e pode rebocar outras vagonetas utilizando carvão. + +Utilizado para viajar pela água mais rapidamente do que a nadar. + +Recolhida a partir de ovelhas, pode ser colorida com tintas. + +Utilizado como material de construção, pode ser colorido com tintas. Esta receita não é recomendada, porque a Lã pode ser obtida facilmente das Ovelhas. + +Utilizada como tinta para criar lã preta. + +Utilizada como tinta para criar lã verde. + +Utilizados como tinta para criar lã castanha, como ingrediente para bolachas ou para cultivar Vagens de Cacau. + +Utilizada como tinta para criar lã prateada. + +Utilizada como tinta para criar lã amarela. + +Utilizada como tinta para criar lã vermelha. + +Utilizado para o crescimento instantâneo de plantações, árvores, ervas altas, cogumelos gigantes e flores e pode ser usado em receitas de tinta. + +Utilizado como tinta para criar lã cor-de-rosa. + +Utilizado como tinta para criar lã cor-de-laranja. + +Utilizado como tinta para criar lã verde-lima. + +Utilizado como tinta para criar lã cinza. + +Tinta para criar lã cinza clara. +A tinta pode também ser feita combinando tinta cinza com farinha de ossos, permitindo criar 4 tintas cinzentas claras a partir de cada saco, em vez de 3. + +Utilizado como tinta para criar lã azul clara. + +Utilizado como tinta para criar lã ciano. + +Utilizado como tinta para criar lã roxa. + +Utilizado como tinta para criar lã magenta. + +Utilizado como tinta para criar lã azul. + +Reproduz Discos de Música. + +Utiliza-os para criar ferramentas muito duras, armas ou armaduras. + +Utilizado para criar uma luz mais forte do que as tochas. Derrete a neve e o gelo e pode ser utilizado debaixo de água. + +Utilizado para criar livros e mapas. + +Pode ser usado para criar uma estante de livros ou enfeitiçado para fazer Livros de Feitiços. + +Permite criar feitiços mais poderosos quando colocada em volta da Mesa de Feitiços. + +Utilizado como decoração. + +Pode ser extraído com uma picareta de ferro ou superior, e depois derretido numa fornalha para criar lingotes de ouro. + +Pode ser extraído com uma picareta de pedra ou superior, e depois derretido numa fornalha para criar lingotes de ferro. + +Pode ser extraído com uma picareta para recolher carvão. + +Pode ser extraído com uma picareta de pedra ou superior para recolher lápis-lazúli. + +Pode ser extraído com uma picareta de ferro ou superior para recolher diamantes. + +Pode ser extraído com uma picareta de ferro ou superior para recolher pó de Redstone. + +Pode ser extraído com uma picareta para recolher pedra arredondada. + +Recolhida com uma pá. Pode ser usada na construção. + +Pode ser plantada e irá transformar-se numa árvore. + +Não pode ser partida. + +Incendeia tudo aquilo em que toca. Pode ser recolhida num balde. + +Recolhida com uma pá. Pode ser derretida para criar vidro utilizando a fornalha. É afetada pela gravidade se não tiver um tijolo por baixo. + +Recolhida com uma pá. Por vezes produz sílex quando é escavada. É afetada pela gravidade se não tiver um tijolo por baixo. + +Cortada com um machado, pode ser usada para criar tábuas ou como combustível. + +Criado numa fornalha derretendo areia. Pode ser usado na construção, mas irá partir se o tentares escavar. + +Retirado da pedra com uma picareta. Pode ser usado para construir uma fornalha ou ferramentas de pedra. + +Cozido a partir de barro numa fornalha. + +Pode ser cozido sob a forma de tijolos numa fornalha. + +Quando partidos, produzem bolas de barro que podem ser cozidas para criar tijolos na fornalha. + +Uma forma compacta de armazenar bolas de neve. + +Pode ser escavada com uma pá para criar bolas de neve. + +Por vezes produz sementes de trigo quando partida. + +Pode ser usada para criar tinta. + +Produz guisado com uma tigela. + +Só pode ser extraída com uma picareta de diamante. É produzida através de uma combinação de água e lava e é utilizada para construir portais. + +Produz grandes quantidades de monstros. + +É colocado no chão para transportar uma descarga elétrica. Quando usado numa poção faz aumentar a duração do efeito. + +Uma vez crescidas, as plantações estão prontas para a recolha do trigo. + +Terreno preparado para semear. + +Pode ser cozinhado na fornalha para criar tinta verde. + +Pode criar açúcar. + +Pode ser usada como capacete ou transformada numa abóbora iluminada em conjunto com uma tocha. É ainda o ingrediente principal da Tarte de Abóbora. + +Queima eternamente se for acesa. + +Abranda o movimento de tudo aquilo que lhe passar por cima. + +Ficar de pé no portal permite-te passar entre o Mundo Superior e o Submundo. + +Utilizado como combustível na fornalha e pode criar tochas. + +Recolhido ao matar uma aranha, pode ser transformado num Arco ou numa Cana de Pesca, ou colocado no chão para criar uma Armadilha. + +Recolhida ao matar uma galinha, pode criar uma seta. + +Recolhida ao matar um Creeper, pode ser transformada em TNT ou usada como ingrediente em poções. + +Podem ser plantadas em terrenos de cultivo para obter colheitas. Certifica-te de que as sementes têm luz suficiente para crescer! + +Recolhido nas plantações, pode ser usado para criar alimentos. + +Recolhida ao escavar gravilha, pode ser usada para criar uma ferramenta de sílex e aço. + +Quando colocada num porco, permite-te montá-lo. O porco pode então ser guiado usando uma Cenoura num Pau. + +Recolhida ao escavar neve, pode ser atirada. + +Recolhido ao matar uma vaca, pode ser transformado numa armadura ou usado para fazer Livros. + +Recolhida ao matar um Slime e usada como ingrediente para poções ou transformada para fazer Pistões Pegajosos. + +Postos de forma aleatória pelas galinhas, podem ser usados para criar alimentos. + +Recolhido ao extrair Glowstone, pode ser usado para criar novos blocos de Glowstone ou fazer parte de uma poção que aumente a potência do efeito. + +Recolhido ao matar um esqueleto. Pode ser usado para criar farinha de ossos e para domesticar lobos. + +Recolhido quando um esqueleto mata um Creeper. Pode ser reproduzido numa jukebox. + +Extingue incêndios e ajuda as plantações a crescer. Pode ser recolhida num balde. + +Quando partidas, por vezes soltam um rebento que pode ser plantado para que cresça uma árvore. + +Encontrada nas masmorras, pode ser usada para construção e decoração. + +Usadas para obter lã das ovelhas e recolher blocos de folhas. + +Quando é ativado (utilizando um botão, alavanca, placa de pressão, tocha de Redstone ou Redstone com qualquer um destes), o pistão estica e empurra blocos. + +Quando é ativado (utilizando um botão, alavanca, placa de pressão, tocha de Redstone ou Redstone com qualquer um destes), o pistão estica e empurra blocos. Quando recolhe, puxa o bloco que está a tocar na parte esticada. + +É feito de blocos de Pedra e encontra-se habitualmente nas Fortalezas. + +Utilizado como barreira, semelhante às vedações. + +Semelhante a uma porta, mas utilizado principalmente com vedações. + +Pode ser criado a partir de Fatias de Melancia. + +Blocos transparentes que podem ser usados em vez dos Blocos de Vidro. + +Produzem abóboras. + +Produzem melões. + +Largada pelos Enderman quando morrem. Quando atirada, o jogador é teletransportado até ao local onde a Pérola de Ender aterra e perde alguma saúde. + +Um bloco de terra com erva por cima. Pode ser recolhido com uma pá e utilizado para construção. + +Pode ser usada na construção e decoração. + +Torna os movimentos mais lentos quando passas por ela. Pode ser destruída com tesouras para recolheres fio. + +Regenera um Peixe Prateado quando destruído. Também pode regenerar um Peixe Prateado se estiver perto de outro Peixe Prateado quando for atacado. + +Crescem ao longo do tempo depois de plantadas. Podem ser recolhidas com tesouras. Podem ser escaladas como escadas. + +Escorregadio, transforma-se em água se estiver sobre outro bloco quando é destruído. Derrete-se se estiver demasiado perto de uma fonte de luz ou quando colocado no Submundo. + +Pode ser usado como decoração. + +Utilizado na preparação de poções e para localizar Fortalezas. É produzido pelos Blazes, que se encontram normalmente junto ou dentro de Fortalezas Subterrâneas. + +Utilizadas na preparação de poções. Produzidas pelos Ghasts quando morrem. + +Produzidas pelos Pastores Mortos-vivos quando morrem. Os Pastores Mortos-vivos podem ser encontrados no Submundo. Usadas como ingrediente em poções. + +Utilizadas na preparação de poções. Crescem de forma selvagem nas Fortalezas Subterrâneas. Também podem ser plantadas em Areias Movediças. + +Podem ter vários efeitos consoante o uso. + +Pode ser enchida de água e usada como ingrediente inicial no Posto de Poções. + +Um alimento venenoso e ingrediente para poções. É produzido quando uma Aranha ou Aranha das Cavernas é morta por um jogador. + +Utilizado na preparação de poções, principalmente para criar poções com efeito negativo. + +Utilizado na preparação de poções ou criado juntamente com outros objetos para criar Olho de Ender ou Creme de Magma. + +Usado na preparação de poções. + +Utilizado para fazer Poções e Poções Explosivas. + +Enche-se com água por ação da chuva ou utilizando um balde e pode ser usado para encher Garrafas de Vidro com água. + +Quando atirado, mostra a direção do Portal do Fim. Se forem colocados doze destes nas Estruturas de Portal do Fim, o Portal do Fim é ativado. + +Usado na preparação de poções. + +Semelhante aos Blocos de Erva, óptimo para cultivar cogumelos. + +Flutua na água e pode caminhar-se sobre ele. + +Utilizado para construir Fortalezas Subterrâneas. Imune às bolas de fogo de Ghast. + +Utilizado em Fortalezas Subterrâneas. + +Encontra-se nas Fortalezas do Submundo e produz Verrugas do Submundo quando se parte. + +Permite aos jogadores enfeitiçarem Espadas, Picaretas, Machados, Pás, Arcos e Armaduras, utilizando os Pontos de Experiência do jogador. + +Pode ser ativado utilizando doze Olhos de Ender e permite ao jogador viajar até à dimensão do Fim. + +Usadas para formar um Portal do Fim. + +Um tipo de bloco encontrado no Fim. É altamente resistente a explosões, por isso, é útil para construir. + +Este bloco é criado quando é derrotado o Dragão no Fim. + +Quando atirada, produz Orbes de Experiência, que aumentam os teus pontos de experiência se forem recolhidos. + +Útil para incendiar coisas, ou para atear fogos indiscriminadamente quando disparada de um Dispensador. + +São similares a uma vitrina e irão apresentar o objeto ou bloco lá colocado. + +Quando lançadas podem gerar uma criatura do tipo indicado. + +Utilizado para criar escadas compridas. Duas placas colocadas uma sobre a outra criam um bloco de placa dupla de tamanho normal. + +Utilizado para criar escadas compridas. Duas placas colocadas uma sobre a outra criam um bloco de placa dupla de tamanho normal. + +Criado através da fundição de Rocha do Submundo numa fornalha. Pode ser transformado em blocos de Tijolo do Submundo. + +Quando alimentados emitem luz. + +Pode ser colhido para recolher Grãos de Cacau. + +As Cabeças de Mob podem ser colocadas como decoração ou usadas como máscara na ranhura de capacete. + +Lula + +Solta sacos de tinta quando é morta. + +Vaca + +Solta cabedal quando é morta. Pode também ser ordenhada com um balde. + +Ovelha + +Solta lã quando é tosquiada (se ainda não tiver sido tosquiada). Pode ser pintada para que a sua lã ganhe uma cor diferente. + +Galinha + +Solta penas quando é morta e também põe ovos de forma aleatória. + +Porco + +Solta costeletas quando é morto. Pode ser montado utilizando uma sela. + +Lobo + +É dócil, mas, se o atacares, ele contra-ataca. Pode ser domado utilizando ossos, o que faz com que te siga e ataque tudo o que te atacar. + +Creeper + +Explode se te aproximares demasiado! + +Esqueleto + +Dispara setas contra ti. Solta setas quando é morto. + +Aranha + +Ataca-te quando te aproximas. Pode subir paredes. Solta fios quando é morta. + +Morto-vivo + +Ataca-te quando te aproximas. + +Pastor Morto-vivo + +Inicialmente dócil, ataca em grupos se for atacado. + +Medusa + +Dispara bolas flamejantes que explodem quando entram em contacto. + +Slime + +Divide-se em Slimes mais pequenos quando sofre danos. + +Enderman + +Ataca-te se olhares para ele. Consegue movimentar blocos. + +Peixe Prateado + +Atrai os Peixes Prateados escondidos quando atacado. Esconde-se nos blocos de pedra. + +Aranha da Caverna + +A sua mordidela é venenosa. + +Vacogumelos + +Usada com uma tigela para fazer guisado de cogumelos. Produz cogumelos e torna-se uma vaca normal quando tosquiada. + +Golem de Neve + +O Golem de Neve pode ser criado pelos jogadores com blocos de neve e uma abóbora. Enviam bolas de neve aos inimigos dos seus criadores. + +Ender Dragon + +Um grande dragão preto que se encontra no Fim. + +Blaze + +Inimigos que podem ser encontrados no Submundo, principalmente dentro das Fortalezas do Submundo. Produzem Varinhas de Blaze quando são mortos. + +Cubo de Magma + +Podem ser encontrados no Submundo. Semelhantes aos Slimes, dividem-se em versões mais pequenas quando são mortos. + +Aldeão + +Ocelote + +Podem ser encontrados em Selvas. Podem ser domesticados quando alimentados com Peixe Cru. Porém, tens de ser o Ocelote a aproximar-se de ti, pois qualquer movimento brusco vai assustá-lo. + +Golem de Ferro + +Aparece nas Aldeias para as proteger e pode ser criado usando Blocos de Ferro e Abóboras. + +Explosives Animator + +Concept Artist + +Number Crunching and Statistics + +Bully Coordinator + +Original Design and Code by + +Project Manager/Producer + +Rest of Mojang Office + +Programador-Chefe de Minecraft para PC + +Ninja Coder + +CEO + +White Collar Worker + +Customer Support + +Office DJ + +Designer/Programmer Minecraft - Pocket Edition + +Developer + +Chief Architect + +Art Developer + +Game Crafter + +Director of Fun + +Music and Sounds + +Programming + +Art + +QA + +Executive Producer + +Lead Producer + +Producer + +Test Lead + +Lead Tester + +Design Team + +Development Team + +Release Management + +Director, XBLA Publishing + +Business Development + +Portfolio Director + +Product Manager + +Marketing + + Community Manager + +Europe Localization Team + +Redmond Localization Team + +Asia Localization Team + +User Research Team + +MGS Central Teams + +Milestone Acceptance Tester + +Special Thanks + +Test Manager + +Senior Test Lead + +SDET + +Project STE + +Additional STE + +Test Associates + +Jon KÃ¥gström + +Tobias Möllstam + +Risë Lugo + +Espada de Madeira + +Espada de Pedra + +Espada de Ferro + +Espada de Diamante + +Espada de Ouro + +Pá de Madeira + +Pá de Pedra + +Pá de Ferro + +Pá de Diamante + +Pá de Ouro + +Picareta de Madeira + +Picareta de Pedra + +Picareta de Ferro + +Picareta de Diamante + +Picareta de Ouro + +Machado de Madeira + +Machado de Pedra + +Machado de Ferro + +Machado de Diamante + +Machado de Ouro + +Enxada de Madeira + +Enxada de Pedra + +Enxada de Ferro + +Enxada de Diamante + +Enxada de Ouro + +Porta de Madeira + +Porta de Ferro + +Capacete Corrente + +Colete de Corrente + +Calças de Corrente + +Botas de Corrente + +Boné de Cabedal + +Capacete de Ferro + +Capacete de Diamante + +Capacete de Ouro + +Túnica de Cabedal + +Colete de Ferro + +Colete de Diamante + +Colete de Ouro + +Calças de Cabedal + +Leggings de Ferro + +Leggings de Diamante + +Leggings de Ouro + +Botas de Cabedal + +Botas de Ferro + +Botas de Diamante + +Botas de Ouro + +Lingote de Ferro + +Lingote de Ouro + +Balde + +Balde de Ãgua + +Balde de Lava + +Sílex e Aço + +Maçã + +Arco + +Seta + +Carvão + +Carvão Vegetal + +Diamante + +Pau + +Tigela + +Guisado de Cogumelos + +Fio + +Pena + +Pólvora + +Sementes de Trigo + +Trigo + +Pão + +Sílex + +Costeleta de Porco Crua + +Costeleta de Porco Cozinhada + +Pintura + +Maçã de Ouro + +Sinal + +Vagoneta + +Sela + +Redstone + +Bola de Neve + +Barco + +Cabedal + +Balde de Leite + +Tijolo + +Barro + +Canas de Açúcar + +Papel + +Livro + +Slimeball + +Vagoneta com Baú + +Vagoneta com Fornalha + +Ovo + +Bússola + +Cana de Pesca + +Relógio + +Pó de Glowstone + +Peixe Cru + +Peixe Cozinhado + +Pó de Tinta + +Saco de Tinta + +Vermelho Rosa + +Verde Cacto + +Grãos de Cacau + +Lápis-lazúli + +Tinta Roxa + +Tinta Ciano + +Tinta Cinza Clara + +Tinta Cinza + +Tinta Cor-de-rosa + +Tinta Verde-lima + +Dente-de-leão + +Tinta Azul Clara + +Tinta Magenta + +Tinta Laranja + +Farinha de Ossos + +Osso + +Açúcar + +Bolo + +Cama + +Repetidor de Redstone + +Bolacha + +Mapa + +Disco Música - "13" + +Disco Música - "cat" + +Disco Música - "blocks" + +Disco Música - "chirp" + +Disco Música - "far" + +Disco Música - "mall" + +Disco Música - "mellohi" + +Disco Música - "stal" + +Disco Música - "strad" + +Disco Música - "ward" + +Disco Música - "11" + +Disco Música - "where are we now" + +Tesouras + +Sementes de Abóbora + +Sementes de Melancia + +Galinha Crua + +Galinha Cozinhada + +Bife Cru + +Bife + +Carne Podre + +Ender Pearl + +Fatia de Melancia + +Varinha de Blaze + +Lágrima de Ghast + +Pepita de Ouro + +Verruga do Submundo + +{*splash*}{*prefix*}Poção {*postfix*} + +Garrafa de Vidro + +Garrafa de Ãgua + +Olho de Aranha + +Olho de Aranha Fermentado + +Pó de Blaze + +Creme de Magma + +Posto de Poções + +Caldeirão + +Olho de Ender + +Melancia Brilhante + +Garrafa Mágica + +Carga de Fogo + +Carga de Fogo (Carvão veg.) + +Carga de Fogo (Carvão) + +Estrutura de Item + +Gerar {*CREATURE*} + +Tijolo de Submundo + +Caveira + +Caveira de Esqueleto + +Caveira de Esqueleto Atrofiado + +Cabeça de Zombie + +Cabeça + +Cabeça de %s + +Cabeça de Creeper + +Pedra + +Bloco de Erva + +Terra + +Pedra Arredondada + +Tábuas Madeira Carvalho + +Tábuas Madeira Abeto + +Tábuas Madeira Bétula + +Tábuas Madeira Selva + +Rebento + +Carvalho Jovem + +Abeto Jovem + +Bétula Jovem + +Rebentos Ãrvores Selva + +Rocha + +Ãgua + +Lava + +Areia + +Arenito + +Gravilha + +Minério de Ouro + +Minério de Ferro + +Minério de Carvão + +Madeira + +Madeira de Carvalho + +Madeira de Abeto + +Madeira de Bétula + +Madeira da Selva + +Carvalho + +Abeto + +Bétula + +Folhas + +Folhas de Carvalho + +Folhas de Abeto + +Folhas de Bétula + +Folhas da Selva + +Esponja + +Vidro + +Lã + +Lã Preta + +Lã Vermelha + +Lã Verde + +Lã Castanha + +Lã Azul + +Lã Roxa + +Lã Ciano + +Lã Cinza Clara + +Lã Cinza + +Lã Cor-de-rosa + +Lã Verde-lima + +Lã Amarela + +Lã Azul Clara + +Lã Magenta + +Lã Cor-de-laranja + +Lã Branca + +Flor + +Rosa + +Cogumelo + +Bloco de Ouro + +Uma forma compacta de armazenar Ouro. + +Uma forma compacta de armazenar Ferro. + +Bloco de Ferro + +Placa de Pedra + +Placa de Pedra + +Placa de Arenito + +Placa Madeira Carvalho + +Placa de Cobblestone + +Placa de Tijolo + +P. Tijolos Pedra + +Placa Madeira Carvalho + +Placa Madeira Abeto + +Placa Madeira Bétula + +Placa Madeira Selva + +Placa Tijolo Submundo + +Tijolos + +TNT + +Estante de Livros + +Pedra com Musgo + +Obsidiana + +Tocha + +Tocha (Carvão) + +Tocha (Carvão Vegetal) + +Fogo + +Criador de Monstros + +Escadas Madeira Carvalho + +Baú + +Pó de Redstone + +Minério de Diamante + +Bloco de Diamante + +Uma forma compacta de armazenar Diamantes. + +Mesa de Criação + +Plantações + +Terreno de Cultivo + +Fornalha + +Sinal + +Porta de Madeira + +Escadote + +Carril + +Carril Electrificado + +Carril Detector + +Escadas de Pedra + +Alavanca + +Placa de Pressão + +Porta de Ferro + +Minério de Redstone + +Tocha Redstone + +Botão + +Neve + +Gelo + +Cacto + +Barro + +Cana de Açúcar + +Jukebox + +Cerca + +Abóbora + +Abóbora iluminada + +Bloco do Submundo + +Areia Movediça + +Glowstone + +Portal + +Minério de Lápis-lazúli + +Bloco Lápis-lazúli + +Uma forma compacta de armazenar Lápis-lazúli. + +Distribuidor + +Bloco de Notas + +Bolo + +Cama + +Teia + +Erva Alta + +Arbusto Morto + +Díodo + +Baú Fechado + +Alçapão + +Lã (qualquer cor) + +Pistão + +Pistão Pegajoso + +Bloco de Peixe Prateado + +Tijolos de Pedra + +Tijolos de Pedra com Musgo + +Tijolos de Pedra Rachada + +Tijolos de Pedra Burilados + +Cogumelo + +Cogumelo + +Barras de Ferro + +Painel de Vidro + +Melancia + +Caule de Abóbora + +Caule de Melancia + +Videiras + +Portão de Vedação + +Escadas de Tijolo + +Escad. Tijolo Pedra + +P. de Peixe Prateado + +Cobblestone com Peixe Prateado + +Tijolo de Pedra com Peixe Prateado + +Micélio + +Folha de Nenúfar + +Tijolo de Submundo + +Vedação Tijolos Sub. + +Escadas Tijolos Sub. + +Verruga do Submundo + +Mesa de Feitiços + +Posto de Poções + +Caldeirão + +Portal do Fim + +Estrutura de Portal do Fim + +Pedra do Fim + +Ovo de Dragão + +Arbusto + +Samambaia + +Escadas de Grés + +Escadas Madeira Abeto + +Escadas Madeira Bétula + +Escadas Madeira Selva + +Candeeiro de Redstone + +Cacau + +Caveira + +Controlos Atuais + +Esquema + +Mover/Sprint + +Olhar + +Pausar + +Saltar + +Saltar/Voar Para Cima + +Inventário + +Mudar de objeto Seguro + +Ação + +Usar + +Criar + +Largar + +Rastejar + +Agachar/Voar Para Baixo + +Alterar Modo Câmara + +Jogadores/Convidar + +Movimento (Ao Voar) + +Esquema 1 + +Esquema 2 + +Esquema 3 + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +{*B*}Prime{*CONTROLLER_VK_A*} para continuar. + +{*B*}Prime{*CONTROLLER_VK_A*} para iniciar o tutorial.{*B*} + Prime{*CONTROLLER_VK_B*} se achas que estás preparado para jogar sozinho. + +Em Minecraft, podes criar tudo aquilo que quiseres colocando blocos. +À noite, os monstros andam por aí; constrói um abrigo antes que seja tarde. + +Usa{*CONTROLLER_ACTION_LOOK*} para olhares para cima, para baixo e em redor. + +Usa{*CONTROLLER_ACTION_MOVE*} para te deslocares. + +Para fazeres um sprint, prime rapidamente {*CONTROLLER_ACTION_MOVE*} para a frente duas vezes. Mantém {*CONTROLLER_ACTION_MOVE*} premido para a frente para a personagem continuar o sprint até esgotar o tempo ou a comida. + +Prime{*CONTROLLER_ACTION_JUMP*} para saltar. + +Mantém premido{*CONTROLLER_ACTION_ACTION*} para escavar e cortar utilizando as mãos ou os objetos que estiveres a segurar. Podes ter de criar uma ferramenta para colocares alguns blocos... + +Mantém premido{*CONTROLLER_ACTION_ACTION*} para cortares 4 blocos de madeira (troncos de árvore).{*B*}Quando um bloco parte, podes apanhá-lo aproximando-te do objeto flutuante que surge, o que faz com que este apareça no teu inventário. + +Prime{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface de criação. + +À medida que recolhes e crias mais objetos, o teu inventário fica cheio.{*B*} + Prime{*CONTROLLER_ACTION_INVENTORY*} para abrir o inventário. + +À medida que te movimentas, escavas e atacas, vais gastando a barra de comida {*ICON_SHANK_01*}. Se fizeres sprint ou saltos em sprint, gastas muito mais comida do que ao caminhar ou saltar normalmente. + +Se perderes saúde, mas tiveres uma barra de comida com 9 ou mais{*ICON_SHANK_01*}, a tua saúde é restaurada automaticamente. Come para restaurares a barra de comida. + +Com um alimento na mão, prime{*CONTROLLER_ACTION_USE*} para comeres e restaurares a barra de comida. Não podes comer se a barra de comida estiver cheia. + +A tua barra de comida está em baixo e perdeste alguma saúde. Come o bife que se encontra no teu inventário para restaurares a barra de comida e começares a curar-te.{*ICON*}364{*/ICON*} + +A madeira que recolhes pode ser transformada em tábuas. Abre a interface de criação para as criares.{*PlanksIcon*} + +Muitas vezes, o processo de criação envolve vários passos. Agora que já tens algumas tábuas, podes criar mais objetos. Cria uma mesa de criação.{*CraftingTableIcon*} + +Para recolheres blocos mais rapidamente, podes construir ferramentas específicas para essa tarefa. Algumas ferramentas têm uma pega feita de paus. Cria agora alguns paus.{*SticksIcon*} + +Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} e{*CONTROLLER_ACTION_RIGHT_SCROLL*} para alterares o objeto segurado. + +Usa{*CONTROLLER_ACTION_USE*} para utilizar, interagir e colocar alguns objetos. Os objetos colocados podem ser recolhidos novamente escavando-os com a ferramenta certa. + +Com a mesa de criação selecionada, aponta a mira para o local onde a queres colocar e usa{*CONTROLLER_ACTION_USE*} para colocares uma mesa de criação. + +Aponta a mira para a mesa de criação e prime{*CONTROLLER_ACTION_USE*} para a abrires. + +As pás ajudam a escavar mais rapidamente os blocos moles, como terra e neve. À medida que recolhes mais materiais, podes criar ferramentas que trabalham mais rapidamente e durante mais tempo. Cria uma pá de madeira.{*WoodenShovelIcon*} + +Com um machado poderás cortar a madeira e os tijolos de madeira mais rapidamente. À medida que recolhes mais materiais, podes criar ferramentas que trabalham mais rapidamente e durante mais tempo. Cria um machado de madeira.{*WoodenHatchetIcon*} + +A picareta permite-te escavar mais rapidamente blocos mais duros, como pedra e minério. À medida que recolhes mais materiais, podes criar ferramentas que trabalham mais rapidamente, durante mais tempo e que te permitem extrair materiais mais duros. Cria uma picareta de madeira.{*WoodenPickaxeIcon*} + +Abre o contentor + + + A noite pode cair rapidamente e é perigoso estar lá fora sem se estar preparado. Podes criar armaduras e armas, mas é recomendável construíres um abrigo seguro. + + + + Nas redondezas, existe um abrigo de mineiros abandonado que podes completar para garantir a tua segurança durante a noite. + + + + Terás de recolher os recursos necessários para completar o abrigo. Podes construir as paredes e o tecto com qualquer tipo de tijolo, mas também terás de criar uma porta, algumas janelas e iluminação. + + +Utiliza a tua picareta para escavares alguns blocos de pedra. Os blocos de pedra produzem pedras arredondadas quando escavados. Se conseguires recolher 8 blocos de pedra arredondada, poderás construir uma fornalha. Pode ser necessário escavar alguma terra para chegares à pedra, por isso usa a tua pá nesta tarefa.{*StoneIcon*} + +Recolheste pedras arredondadas suficientes para construir uma fornalha. Utiliza a tua mesa de criação para criares uma. + +Usa{*CONTROLLER_ACTION_USE*} para colocares a fornalha no mundo e, em seguida, abre-a. + +Usa a fornalha para criar carvão vegetal. Enquanto esperas que acabe, porque não recolhes mais materiais para acabar o abrigo? + +Usa a fornalha para criar vidro. Enquanto esperas que acabe, porque não recolhes mais materiais para acabar o abrigo? + +Um bom abrigo tem de ter uma porta para que possas entrar e sair facilmente sem teres de escavar e substituir paredes. Cria agora uma porta de madeira.{*WoodenDoorIcon*} + +Usa{*CONTROLLER_ACTION_USE*} para colocar a porta. Podes usar{*CONTROLLER_ACTION_USE*} para abrir e fechar a porta de madeira no mundo. + +À noite pode ficar muito escuro, por isso é melhor teres alguma iluminação dentro do abrigo. Cria uma tocha a partir de paus e carvão vegetal utilizando a interface de criação.{*TorchIcon*} + + + Concluíste a primeira parte do tutorial. + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para continuares o tutorial.{*B*} + Prime{*CONTROLLER_VK_B*} se achas que estás pronto para jogar sozinho. + + + + Este é o teu inventário. Mostra os objetos disponíveis que tens na mão e todos os objetos que estás a transportar. A tua armadura também é mostrada aqui. + + +{*B*} + Prime{*CONTROLLER_VK_A*} para continuar.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes utilizar o inventário. + + + + Usa{*CONTROLLER_MENU_NAVIGATE*} para moveres o ponteiro. Usa{*CONTROLLER_VK_A*} para selecionares um objeto com o ponteiro. + Caso exista mais do que um objeto, irás selecioná-los todos, ou poderás usar{*CONTROLLER_VK_X*} para selecionares apenas metade. + + + + Move o objeto com o ponteiro sobre outro espaço no inventário e coloca-o nesse espaço utilizando{*CONTROLLER_VK_A*}. + Caso tenhas selecionado vários objetos com o ponteiro, usa{*CONTROLLER_VK_A*} para os colocares todos ou{*CONTROLLER_VK_X*} para colocares apenas um. + + + + Se deslocares o ponteiro para fora dos limites da interface com um objeto selecionado, podes largá-lo. + + + + Se quiseres saber mais sobre um determinado objeto, coloca o ponteiro sobre o objeto e prime{*CONTROLLER_VK_RT*}. + + + + Prime{*CONTROLLER_VK_B*} agora para saíres do inventário. + + + + Este é o inventário do modo criativo. Mostra os objetos disponíveis para usares com as mãos e todos os outros objetos que podes escolher. + + +{*B*} + Prime{*CONTROLLER_VK_A*} para continuar.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes utilizar o inventário do modo criativo. + + + + Usa{*CONTROLLER_MENU_NAVIGATE*} para mover o ponteiro. + Na lista de objetos, usa{*CONTROLLER_VK_A*} para recolheres um objeto sob o ponteiro e usa{*CONTROLLER_VK_Y*} para recolheres todas as unidades desse objeto. + + + + O ponteiro irá mover-se automaticamente sobre um espaço na linha em uso. Podes colocá-lo utilizando{*CONTROLLER_VK_A*}. Depois de colocares o objeto, o ponteiro regressa à lista de objetos, onde podes selecionar outro objeto. + + + + Se deslocares o ponteiro para fora dos limites da interface com um objeto selecionado, podes largá-lo no mundo. Para limpar todos os objetos na barra de seleção rápida, prime{*CONTROLLER_VK_X*}. + + + + Desloca-te nos separadores de Tipo de Grupo acima utilizando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para selecionar o tipo de grupo do objeto que queres recolher. + + + + Se quiseres saber mais sobre um determinado objeto, coloca o ponteiro sobre o objeto e prime{*CONTROLLER_VK_RT*}. + + + + Prime{*CONTROLLER_VK_B*} agora para saíres do inventário do modo criativo. + + + + Esta é a interface de criação. Permite-te combinar os objetos que recolheste para criares novos objetos. + + +{*B*} + Prime{*CONTROLLER_VK_A*} para continuar.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes criar. + + +{*B*} + Prime{*CONTROLLER_VK_X*} para apresentar a descrição do objeto. + + +{*B*} + Prime{*CONTROLLER_VK_X*} para apresentar os ingredientes necessários para criar o objeto atual. + + +{*B*} + Prime{*CONTROLLER_VK_X*} para apresentar novamente o inventário. + + + + Desloca-te pelos separadores de Tipo de Grupo no topo utilizando{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para selecionar o tipo de grupo do objeto que pretendes criar e depois usa{*CONTROLLER_MENU_NAVIGATE*} para selecionares o objeto a criar. + + + + A área de criação mostra os objetos de que necessitas para criares o próximo objeto. Prime{*CONTROLLER_VK_A*} para criar o objeto e colocá-lo no teu inventário. + + + + Podes criar uma seleção maior de objetos utilizando uma mesa de criação. A criação na mesa funciona da mesma forma que a criação básica, mas tens à tua disposição uma área maior e mais combinações de ingredientes. + + + + A parte inferior direita da interface de criação mostra o inventário. Esta área também pode mostrar uma descrição do objeto atualmente selecionado e os ingredientes necessários para o criar. + + + + A descrição do objeto atualmente selecionado é agora apresentada. A descrição pode dar-te uma ideia das funções do objeto. + + + + A lista de ingredientes necessários para criar o objeto selecionado é agora apresentada. + + +A madeira que recolheste pode ser usada para criar tábuas. seleciona o ícone das tábuas e prime{*CONTROLLER_VK_A*} para criar.{*PlanksIcon*} + + + Agora que construíste uma mesa de criação, tens de colocá-la no mundo para te permitir criar uma seleção mais ampla de objetos.{*B*} + Prime{*CONTROLLER_VK_B*} agora para saíres da interface de criação. + + + + Prime{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para mudares para o tipo de grupo de artigos que pretendes criar. seleciona o grupo de ferramentas.{*ToolsIcon*} + + + + Prime{*CONTROLLER_VK_LB*} e{*CONTROLLER_VK_RB*} para mudares para o tipo de grupo de artigos que pretendes criar. seleciona o grupo de estruturas.{*StructuresIcon*} + + + + Usa{*CONTROLLER_MENU_NAVIGATE*} para mudares para o objeto que desejas criar. Alguns objetos têm várias versões consoante os materiais utilizados. seleciona a pá de madeira.{*WoodenShovelIcon*} + + + + Muitas vezes, o processo de criação envolve vários passos. Agora que já tens algumas tábuas, podes criar mais objetos. Usa{*CONTROLLER_MENU_NAVIGATE*} para mudares para o objeto que queres criar. seleciona a mesa de criação.{*CraftingTableIcon*} + + + + Com as ferramenta que construíste estás no caminho certo e podes recolher vários materiais diferentes de forma mais eficiente.{*B*} + Prime{*CONTROLLER_VK_B*} agora para saíres da interface de criação. + + + + Alguns objetos não podem ser criados utilizando a mesa de criação, mas sim uma fornalha. Cria agora uma fornalha.{*FurnaceIcon*} + + + + Coloca a fornalha que criaste no mundo. Deves colocá-la dentro do abrigo.{*B*} + Prime{*CONTROLLER_VK_B*} agora para saíres da interface de criação. + + + + Esta é a interface da fornalha. A fornalha permite-te alterar os objetos através do fogo. Por exemplo, podes transformar minério de ferro em lingotes de ferro. + + +{*B*} + Prime{*CONTROLLER_VK_A*} para continuar.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes utilizar a fornalha. + + + + Tens de colocar o combustível na parte de baixo da fornalha e o objeto que queres alterar por cima. O fogo é ateado e a fornalha acende-se. O resultado sai pela ranhura da direita. + + + + Muitos objetos de madeira podem ser usados como combustíveis, mas nem todos queimam durante o mesmo tempo. Podes também descobrir outros objetos no mundo que podem ser usados como combustível. + + + + Depois de alterados os objetos, podes movê-los da área de saída para o inventário. Experimenta usar ingredientes diferentes para veres o que consegues criar. + + + + Se usares madeira como ingrediente, podes criar carvão vegetal. Coloca algum combustível na fornalha, ocupa o tempo da maneira que quiseres e depois regressa para verificares o progresso. + + + + O Carvão vegetal pode ser usado como combustível ou para criar tochas juntamente com um pau. + + + + Para fazeres vidro, coloca areia na ranhura dos ingredientes. Cria blocos de vidro para usares como janelas no teu abrigo. + + + + Esta é a interface de preparação de poções. Podes utilizá-la para criar poções com diferentes efeitos. + + +{*B*} + Prime{*CONTROLLER_VK_A*} para continuar.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes como usar o posto de poções. + + + + Podes preparar poções colocando um ingrediente no orifício superior e uma poção ou garrafa de água nos orifícios inferiores (podem ser preparadas até 3 poções ao mesmo tempo). Depois de introduzires uma combinação válida, o processo de preparação inicia e é criada uma poção pouco tempo depois. + + + + Todas as poções começam com uma Garrafa de Ãgua. A maioria das poções são criadas utilizando uma Verruga do Submundo para criar uma Poção Estranha e necessitam de pelo menos mais um ingrediente para criar a poção final. + + + + Depois de criares uma poção, podes modificar os seus efeitos. Se adicionares Pó de Redstone, aumentas a duração do efeito, e se adicionares Pó de Glowstone, o efeito será mais poderoso. + + + + Se adicionares Olho de Aranha Fermentado, crias uma poção com o efeito oposto. Se adicionares Pólvora, transformas a poção numa Poção Explosiva, que pode ser atirada para aplicar os seus efeitos à zona circundante. + + + + Cria uma Poção de Resistência ao Fogo juntando uma Verruga do Submundo a uma Garrafa de Ãgua e adicionando Creme de Magma. + + + + Prime{*CONTROLLER_VK_B*} agora para saíres da interface de preparação de poções. + + + + Nesta área existe um Posto de Poções, um Caldeirão e um baú cheio de ingredientes. + + +{*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre poções e a sua preparação.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre poções e a sua preparação. + + + + O primeiro passo para preparar uma poção é criar uma Garrafa de Ãgua. Retira uma Garrafa de Vidro do baú. + + + + Podes encher uma garrafa de vidro num Caldeirão com água ou a partir de um bloco de água. Enche a garrafa de vidro apontando para a fonte de água e premindo{*CONTROLLER_ACTION_USE*}. + + + + Se esvaziares o caldeirão, podes voltar a enchê-lo com um Balde de Ãgua. + + + + Utiliza o posto de poções para criar uma Poção de Resistência ao Fogo. Precisas de uma Garrafa de Ãgua, uma Verruga do Submundo e Creme de Magma. + + + + Com uma poção na mão, prime{*CONTROLLER_ACTION_USE*} para a usares. Com uma poção normal, irás bebê-la e aplicar o efeito em ti mesmo; com uma Poção Explosiva, irás atirá-la e aplicar o efeito às criaturas em torno da zona onde aterrar. + Podes criar poções explosivas adicionando pólvora às poções normais. + + + + Utiliza a Poção de Resistência ao Fogo em ti mesmo. + + + + Agora que és resistente ao fogo e à lava, poderás ir a sítios onde nunca foste. + + + + Esta é a interface dos feitiços que podes usar para enfeitiçar armas, armaduras e algumas ferramentas. + + +{*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre a interface de feitiços.{*B*} + Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre a interface de feitiços. + + + + Para enfeitiçares um objeto, em primeiro lugar coloca-o no orifício da mesa de feitiços. Podes enfeitiçar armas, armaduras e algumas ferramentas para adicionar-lhes efeitos especiais, como maior resistência aos danos ou aumentar o número de objetos produzidos ao escavar um bloco. + + + + Quando colocas um objeto no orifício da mesa de feitiços, os botões à direita irão apresentar uma seleção de feitiços aleatórios. + + + + O número no botão representa o custo em pontos de experiência para enfeitiçar o objeto. Se não tiveres um nível de experiência suficientemente alto, o botão será desativado. + + + + seleciona um feitiço e prime{*CONTROLLER_VK_A*} para enfeitiçar o objeto. Isto irá diminuir o teu nível de experiência consoante o custo do feitiço. + + + + Apesar de os feitiços serem aleatórios, alguns dos melhores feitiços só estão disponíveis quando atingires um alto nível de experiência e tiveres várias estantes em redor da Mesa de Feitiços para aumentar o seu poder. + + + + Nesta área existe uma Mesa de Feitiços e outros objetos que te ajudarão a aprender tudo sobre feitiços. + + +{*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre feitiços.{*B*} + Prime{*CONTROLLER_VK_B*} se já conheceres os feitiços. + + + + Utilizar uma Mesa de Feitiços permite-te adicionar efeitos especiais tais como aumentar o número de objetos produzidos ao escavar um bloco ou melhorar a resistência a armas, armaduras e algumas ferramentas. + + + + Colocar estantes em redor da Mesa de Feitiços aumenta o seu poder e permite o acesso a feitiços de nível mais alto. + + + + Enfeitiçar objetos tem um custo em Níveis de Exp. que podem ser obtidos recolhendo Orbes de Exp. produzidos quando matas monstros e animais, escavas minério, crias animais, pescas e fundes/cozinhas coisas numa fornalha. + + + + Também podes ganhar níveis de exp. utilizando uma Garrafa Mágica que, quando atirada, cria Orbes de Exp. em torno da zona onde aterra. Estes orbes podem ser recolhidos. + + + + Nos baús nesta área podes encontrar alguns objetos enfeitiçados, Garrafas Mágicas e alguns objetos que ainda não foram enfeitiçados para fazeres experiencias na Mesa de Feitiços. + + + + Estás a conduzir uma vagoneta. Para saíres da vagoneta, coloca o ponteiro sobre a mesma e prime{*CONTROLLER_ACTION_USE*}.{*MinecartIcon*} + + +{*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre vagonetas.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre vagonetas. + + + + As vagonetas andam sobre carris. Podes criar um carril electrificado com a fornalha e uma vagoneta com baú. + {*RailIcon*} + + + + Também podes criar carris electrificados, que recebem energia das tochas de Redstone e dos circuitos para acelerar a vagoneta. Estes são ligados a interruptores, alavancas e placas de pressão para formar sistemas complexos. + {*PoweredRailIcon*} + + + + Estás a conduzir um barco. Para saíres do barco, coloca o ponteiro sobre o mesmo e prime{*CONTROLLER_ACTION_USE*}.{*BoatIcon*} + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre barcos.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre barcos. + + + + O barco permite-te viajar mais rapidamente sobre água. Podes conduzi-lo utilizando{*CONTROLLER_ACTION_MOVE*} e{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + + + + Estás a usar uma cana de pesca. Prime{*CONTROLLER_ACTION_USE*} para a usares.{*FishingRodIcon*} + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre pesca.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre pesca. + + + + Prime{*CONTROLLER_ACTION_USE*} para lançares a linha e começares a pescar. Prime{*CONTROLLER_ACTION_USE*} novamente para enrolares a linha de pesca. + {*FishingRodIcon*} + + + + Para apanhares peixe, espera até que o flutuador mergulhe na água e depois enrola a linha. O peixe pode ser comido cru ou cozinhado na fornalha, para restituir saúde. + {*FishIcon*} + + + + Tal como acontece com outras ferramentas, a cana de pesca tem um número limitado de utilizações. Mas estas não se limitam à pesca. Faz experiências para veres que outras coisas podes apanhar ou ativar... + {*FishingRodIcon*} + + + + Esta é uma cama. De noite, prime{*CONTROLLER_ACTION_USE*} enquanto apontas para a cama para dormires e acordares de manhã.{*ICON*}355{*/ICON*} + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre camas.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre camas. + + + + A cama deve ser colocada num local seguro e bem iluminado para que os monstros não te acordem a meio da noite. Depois de usares a cama, se morreres serás ressuscitado na cama. + {*ICON*}355{*/ICON*} + + + + Se existirem outros jogadores no teu jogo, todos têm de estar na cama ao mesmo tempo para poderem dormir. + {*ICON*}355{*/ICON*} + + + + Nesta área existem alguns circuitos simples de Redstone e Pistões e um baú com mais objetos para aumentar estes circuitos. + + + + {*B*} + Prime {*CONTROLLER_VK_A*} para saberes mais sobre os circuitos de Redstone e pistões.{*B*} + Prime {*CONTROLLER_VK_B*} se já sabes tudo sobre os circuitos de Redstone e pistões. + + + + As Alavancas, Botões, Placas de Pressão e Tochas de Redstone podem fornecer energia aos circuitos, ligando-os diretamente ao objeto que queres ativar ou com pó de Redstone. + + + + A posição e direção em que colocas uma fonte de energia pode alterar a forma como afeta os blocos circundantes. Por exemplo, uma tocha de Redstone ao lado de um bloco pode ser apagada se o bloco for alimentado por outra fonte. + + + + O pó de Redstone é recolhido através da extração de Redstone com uma picareta em Ferro, Diamante ou Ouro. Podes utilizá-lo para alimentar até 15 blocos e pode subir ou descer um bloco em altura. + {*ICON*}331{*/ICON*} + + + + Os repetidores de Redstone podem ser usados para aumentar o alcance da energia ou colocar um retardador no circuito. + {*ICON*}356{*/ICON*} + + + + Quando é ativado, o Pistão estica e empurra até 12 blocos. Quando recolhem, os Pistões Pegajosos conseguem puxar um bloco de quase todos os tipos. + {*ICON*}33{*/ICON*} + + + + No baú nesta área existem alguns componentes para criar circuitos com pistões. Experimenta usar ou completar os circuitos nesta área ou cria o teu próprio circuito. Existem mais exemplos fora da área do tutorial. + + + + Nesta área existe um Portal para o Submundo! + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para saber mais sobre Portais e sobre o Submundo.{*B*} + Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre Portais e o Submundo. + + + + Os Portais são criados colocando blocos de Obsidiana numa estrutura com quatro blocos de largura e cinco blocos de altura. Não são necessários blocos de canto. + + + + Para ativar um Portal do Submundo, incendeia os blocos de Obsidiana dentro da estrutura com Sílex e Aço. Os Portais podem ser desativados se a sua estrutura se partir, se ocorrer uma explosão nas proximidades ou se escorrer líquido sobre os blocos. + + + + Para utilizar um Portal do Submundo, entra no mesmo. O ecrã fica roxo e ouves um som. Alguns segundos depois, serás transportado para outra dimensão. + + + + O Submundo pode ser um local perigoso, cheio de lava, mas também pode ser útil para recolher Blocos do Submundo, que ardem para sempre depois de acesos, e Glowstone, que produz luz. + + + + O Submundo pode ser usado para viajar rapidamente no Mundo Superior - um bloco no Submundo equivale a viajar 3 blocos no Mundo Superior. + + + + Agora estás em Modo Criativo. + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre o modo Criativo.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre o modo Criativo. + + +No modo Criativo, tens um número infinito de objetos e blocos disponíveis, podes destruir blocos com um clique sem serem necessárias ferramentas, és invulnerável e podes voar. + +Prime rapidamente{*CONTROLLER_ACTION_JUMP*} duas vezes para voares. Para parares de voar, repete a ação. Para voares mais rápido, prime{*CONTROLLER_ACTION_MOVE*} para a frente duas vezes em rápida sucessão enquanto voas. +No modo de voo, podes manter premido{*CONTROLLER_ACTION_JUMP*} para subires e{*CONTROLLER_ACTION_SNEAK*} para desceres ou utilizar o botão direcional para subires e desceres, para ires para a esquerda ou para a direita. + +Prime{*CONTROLLER_ACTION_CRAFTING*} para abrir a interface do inventário criativo. + +Atravessa este buraco para continuares. + +Concluíste o tutorial do modo Criativo. + + + Nesta área foi criada uma quinta. As quintas permitem-te criar uma fonte renovável de alimentos e outros objetos. + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre quintas.{*B*} + Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre quintas. + + +O Trigo, as Abóboras e as Melancias crescem a partir de sementes. As sementes de Trigo obtêm-se partindo Erva Alta ou colhendo trigo e as sementes de Abóbora e Melancia são criadas a partir de Abóboras e Melancias, respetivamente. + +Antes de plantares sementes, tens de transformar os blocos de terra em Terra Cultivável, utilizando uma Enxada. Uma fonte de água nas proximidades irá manter a Terra Cultivável hidratada e irá fazer com que as sementes cresçam mais depressa, tal como manter a área iluminada. + +O Trigo passa por várias fases de crescimento e está pronto para ser colhido quando fica mais escuro.{*ICON*}59:7{*/ICON*} + +Para que as Abóboras e os Melões cresçam, é necessário colocar um bloco junto ao local onde plantaste a semente, depois de ter crescido o caule. + +A Cana de Açúcar tem de ser plantada em blocos de Erva, Terra ou Areia ao lado de um bloco de água. Cortar um bloco de Cana de Açúcar também fará cair todos os blocos por cima dele.{*ICON*}83{*/ICON*} + +Os Cactos têm de ser plantados em Areia e crescem até três blocos de altura. Tal como a Cana de Açúcar, se destruíres o bloco inferior, poderás recolher também os blocos acima deste.{*ICON*}81{*/ICON*} + +Os Cogumelos têm de ser plantados numa área com pouca luz e irão espalhar-se pelos blocos pouco iluminados em redor.{*ICON*}39{*/ICON*} + +Podes usar Pó de Ossos para fazer crescer as plantações ou transformar Cogumelos em Cogumelos Enormes.{*ICON*}351:15{*/ICON*} + +Concluíste o tutorial sobre quintas. + + + Nesta área, os animais foram colocados dentro de uma cerca. Podes criar animais para produzir crias dos mesmos. + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre animais e criação.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes tudo sobre animais e criação. + + +Para que os animais procriem, terás de lhes dar os alimentos certos para que entrem em "Modo Amor". + +Dá Trigo a vacas, vacogumelos ou ovelhas, Cenouras a porcos, Sementes de Trigo ou Verrugas do Submundo a galinhas, ou qualquer tipo de carne a lobos, e estes irão começar a procurar outro animal da sua espécie que também esteja em Modo Amor. + +Quando dois animais da mesma espécie se encontram, e ambos estão em Modo Amor, irão beijar-se durante alguns segundos e surgirá um animal bebé. O animal bebé irá seguir os pais durante algum tempo antes de se transformar num animal adulto. + +Os animais só podem voltar a entrar no Modo Amor ao fim de cerca de cinco minutos. + +Alguns animais irão seguir-te se tiveres o alimento deles na mão. Isto facilita a tarefa de reunir os animais para que procriem.{*ICON*}296{*/ICON*} + + + Os lobos selvagens podem ser domesticados se lhes deres ossos. Quando estiverem domesticados surgem Corações de Amor à volta deles. Os lobos domesticados vão seguir o jogador e defendê-lo se não lhes tiver sido dada uma ordem para se sentarem. + + +Concluíste o tutorial sobre criação e animais. + + + Nesta zona há algumas abóboras e blocos para fazer um Golem de Neve e um Golem de Ferro. + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para saber mais sobre Golems.{*B*} + Prime{*CONTROLLER_VK_B*} se já sabes o que precisas sobre Golems. + + +Os Golems são criados colocando uma abóbora no topo de uma pilha de blocos. + +Os Golems de Neve são criados com dois Blocos de Neve, um por cima do outro, com uma abóbora em cima. Os Golems de Neve atiram bolas de neve aos inimigos. + +Os Golems de Ferro são criados com quatro Blocos de Ferro no padrão apresentado, com uma abóbora no topo do bloco central. Os Golems de Ferro atacam os inimigos. + +Os Golems de Ferro também aparecem naturalmente para proteger as aldeias e, caso ataques quaisquer aldeões, eles atacam-te. + +Não podes sair desta área até teres completado o tutorial. + +Diferentes ferramentas adaptam-se a diferentes materiais. Deves usar uma pá para escavar materiais moles como terra e areia. + +Diferentes ferramentas adaptam-se a diferentes materiais. Deves usar um machado para cortar troncos de árvore. + +Diferentes ferramentas adaptam-se a diferentes materiais. Deves usar uma picareta para extrair pedra e minério. Podes ter de construir uma picareta em materiais melhores para obter recursos de certos blocos. + +Algumas ferramentas são melhores para atacar inimigos. Experimenta usar uma espada para atacares. + +Sugestão: Mantém premido {*CONTROLLER_ACTION_ACTION*}para escavar e cortar com a mão ou com o objeto que estiveres a segurar. Pode ser necessário criar uma ferramenta para escavares alguns blocos... + +A ferramenta que estás a usar ficou danificada. Sempre que isto acontece, a ferramenta acabará por partir. A barra colorida sob o objeto no teu inventário indica o estado atual dos danos. + +Mantém premido{*CONTROLLER_ACTION_JUMP*} para nadares para cima. + +Nesta área, existe uma vagoneta sobre carris. Para entrares na vagoneta, aponta o ponteiro para a mesma e prime{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} no botão para fazeres a vagoneta andar. + +No baú junto ao rio encontra-se um barco. Para usares o barco, aponta o ponteiro para a água e prime{*CONTROLLER_ACTION_USE*}. Usa{*CONTROLLER_ACTION_USE*} enquanto apontas para o barco para entrares. + +No baú junto ao lago encontra-se uma cana de pesca. Retira-a do baú e seleciona-a como objeto atual na tua mão para a usares. + +Este mecanismo de pistão mais avançado cria uma ponte que se repara automaticamente! Prime o botão para ativar e descobre como interagem os componentes. + +Se deslocares o ponteiro para fora dos limites da interface quando estiveres a transportar um objeto, poderás largá-lo. + +Não tens todos os ingredientes necessários para criar este objeto. A caixa em baixo à esquerda mostra os ingredientes de que precisas. + + + Parabéns, concluíste o tutorial. Agora, o tempo de jogo passa normalmente e não tens muito tempo até que anoiteça e os monstros saiam para a rua! Acaba o teu abrigo! + + +{*EXIT_PICTURE*} Quando estiveres preparado para explorar mais, existe uma escadaria nesta área junto ao abrigo dos mineiros que conduz a um pequeno castelo. + +Lembrete: + +]]> + +Foram adicionadas novas funcionalidades na última versão do jogo, incluindo novas áreas no mundo do tutorial. + +{*B*}Prime {*CONTROLLER_VK_A*} para jogares o tutorial normalmente.{*B*} + Prime {*CONTROLLER_VK_B*} para ignorar o tutorial principal. + +Nesta área, poderás saber mais sobre pesca, barcos, pistões e Redstone. + +Fora desta área irás encontrar exemplos de edifícios, quintas, vagonetas e carris, feitiços, poções, trocas, forjas e muito mais! + + + O nível da tua barra de comida está demasiado baixo para restaurar a tua saúde. + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para saberes mais sobre a barra de comida e a alimentação.{*B*} + Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre a barra de comida e a alimentação. + + +Selecionar + +Usar + +Anterior + +Sair + +Cancelar + +Cancelar Participação + +Selec. Disp. Armaz. + +Mudar Disp. Armaz. + +Lista Jogos Online + +Jogos Party + +Todos os Jogos + +Alterar Grupo + +Mostrar Inventário + +Mostrar Descrição + +Mostrar Ingredientes + +Criar + +Criar + +Retirar/Colocar + +Retirar + +Retirar tudo + +Retirar metade + +Colocar + +Colocar tudo + +Colocar um + +Largar + +Largar tudo + +Largar um + +Trocar + +Mover rápido + +Limpar Seleção Rápida + +Que é isto? + +Partilhar no Facebook + +Alterar Filtro + +Ver Gamercard + +Ver Perfil de Jogador + +Enviar Pedido de Amizade + +Página Abaixo + +Página Acima + +Seguinte + +Anterior + +Expulsar Jogador + +Tingir + +Escavar + +Alimentar + +Domar + +Curar + +Senta + +Segue-me + +Ejectar + +Esvaziar + +Sela + +Colocar + +Atingir + +Leite + +Recolher + +Comer + +Dormir + +Acorda + +Jogar + +Montar + +Velejar + +Crescer + +Nadar + +Abrir + +Alterar Tom + +Detonar + +Ler + +Pendurar + +Atirar + +Plantar + +Lavrar + +Colher + +Continuar + +Desbloquear Jogo Completo + +Eliminar Jogo Guardado + +Eliminar + +Opções + +Convidar Xbox Live Party + +Convidar Amigos + +Aceitar + +Tosquia + +Excluir Nível + +selecionar Skin + +Acender + +Navegar + +Instalar Versão Completa + +Instalar Versão de Avaliação + +Instalar + +Reinstalar + +Op. Jogo Guardado + +Executar Comando + +Criativo + +Mover Ingrediente + +Mover Combustível + +Mover Ferramenta + +Mover Armadura + +Mover Arma + +Equipar + +Puxar + +Soltar + +Privilégios + +Bloco + +Página Acima + +Página Abaixo + +Modo Amor + +Beber + +Rodar + +Ocultar + +Carregar Grav. Xbox One + +Limpar Todas as Ranhuras + +Carregar Gravação para Xbox One + +OK + +Cancelar + +Loja Minecraft + +Tens a certeza de que queres sair do jogo atual e entrar num novo jogo? O progresso não guardado será perdido. + +Sair do Jogo + +Guardar Jogo + +Sair sem guardar + +Tens a certeza de que queres substituir os jogos guardados anteriormente pela versão atual deste mundo? + +Tens a certeza de que queres sair sem guardar? Irás perder todo o progresso neste mundo! + +Iniciar Jogo + +Se criares, carregares ou guardares um mundo no Modo Criativo, as atualizações de feitos e classificações serão desativadas nesse mundo, mesmo que seja carregado depois no Modo Sobrevivência. Tens a certeza de que queres continuar? + +Este mundo foi guardado anteriormente no Modo Criativo e as atualizações de feitos e classificações serão desativadas. Tens a certeza de que queres continuar? + +Este mundo já foi guardado no Modo Criativo, pelo que as atualizações de feitos e classificações estão desativadas. + +Se criares, carregares ou guardares um mundo com os Privilégios de Anfitrião ativados, as atualizações de feitos e classificações serão desativadas, mesmo que depois seja carregado com estas opções desligadas. Tens a certeza de que queres continuar? + +Jogo Danificado + +O jogo guardado está corrompido ou danificado. Queres apagá-lo? + +Tens a certeza de que queres sair para o menu principal e desligar todos os jogadores do jogo? O progresso não guardado será perdido. + +Sair e guardar + +Sair sem guardar + +Tens a certeza de que queres sair para o menu principal? O progresso não guardado será perdido. + +Tens a certeza de que queres sair para o menu principal? Perderás o teu progresso! + +Criar Mundo Novo + +Jogar Tutorial + +Tutorial + +Nomeia o Teu Mundo + +Introduz um nome para o teu mundo + +Deposita a semente para a criação do teu mundo + +Carregar Mundo Guardado + +Prime START para te juntares ao jogo + +A sair do jogo + +Ocorreu um erro. A sair para o menu principal. + +Falha na ligação + +Ligação perdida + +Perdeste a ligação ao servidor. A sair para o menu principal. + +Perdeste a ligação ao Xbox Live. A sair para o menu principal. + +Perdeste a ligação ao Xbox Live. + +Desligado pelo servidor + +Foste expulso do jogo + +Foste expulso do jogo por voares + +A tentativa de ligação excedeu o tempo + +O servidor está cheio + +O anfitrião saiu do jogo. + +Não podes participar neste jogo porque não és amigo de nenhum dos participantes. + +Não podes participar neste jogo porque foste expulso pelo anfitrião anteriormente. + +Não podes juntar-te a este jogo, pois o jogador a que te estás a tentar juntar possui uma versão mais antiga do jogo. + +Não podes juntar-te a este jogo, pois o jogador a que te estás a tentar juntar possui uma versão mais recente do jogo. + +Novo Mundo + +Prémio Desbloqueado! + +Parabéns - recebeste uma imagem de jogador com o Steve do Minecraft! + +Parabéns - recebeste uma imagem de jogador com um Creeper! + +Parabéns - recebeste um item de avatar - uma t-shirt Minecraft: Edição Xbox 360! +Acede à interface para vestires a t-shirt ao teu avatar. + +Parabéns - recebeste um item de avatar - um relógio Minecraft: Edição Xbox 360! +Acede à interface para colocares o relógio no teu avatar. + +Parabéns - recebeste um item de avatar - um boné de Creeper! +Acede à interface para colocares o boné no teu avatar. + +Parabéns - recebeste o tema do Minecraft: Edição Xbox 360! +Acede à interface para selecionares este tema. + +Desbloquear Jogo Completo + +Estás a jogar a versão de avaliação, mas precisas do jogo completo para poderes guardar o jogo. +Queres desbloquear o jogo completo agora? + +Esta é a versão de avaliação do Minecraft: Edição Xbox 360. Se tivesses o jogo completo, terias acabado de ganhar um feito! +Queres desbloquear o jogo completo? + +Esta é a versão de avaliação do Minecraft: Edição Xbox 360. Se tivesses o jogo completo, terias acabado de ganhar um prémio avatar! +Queres desbloquear o jogo completo? + +Esta é a versão de avaliação do Minecraft: Edição Xbox 360. Se tivesses o jogo completo, terias acabado de ganhar uma imagem de jogador! +Queres desbloquear o jogo completo? + +Esta é a versão de avaliação do Minecraft: Edição Xbox 360. Se tivesses o jogo completo, terias acabado de ganhar um tema! +Queres desbloquear o jogo completo? + +Esta é a versão de avaliação do Minecraft: Edição Xbox 360. Precisas do jogo completo para poderes aceitar este convite. +Queres desbloquear o jogo completo? + +Os jogadores convidados não podem desbloquear o jogo completo. Inicia sessão com um ID de utilizador Xbox Live. + +Por favor aguarda + +Sem resultados + +Filtro: + +Amigos + +A Minha Pontuação + +Geral + +Entradas: + +Lugar + +Gamertag + +A Preparar para Guardar Nível + +A Preparar Blocos... + +A Finalizar... + +A Construir Terreno + +A simular o mundo + +A iniciar o servidor + +A gerar área de criação + +A carregar área de criação + +A entrar no Submundo + +A Sair do Submundo + +A criar novamente + +A gerar nível + +A carregar nível + +A guardar jogadores + +A ligar ao anfitrião + +A transferir terreno + +A mudar para jogo offline + +Aguarda enquanto o anfitrião guarda o jogo + +Entrar no FIM + +Sair do FIM + +Encontrar Sementes para o Gerador de Mundos + +Esta cama está ocupada + +Só podes dormir à noite + +%s está a dormir numa cama. Para acelerares até de manhã, todos os jogadores têm de estar a dormir em camas ao mesmo tempo. + +A tua cama desapareceu ou está bloqueada + +Não podes descansar agora, existem monstros nas redondezas + +Estás a dormir numa cama. Para acelerares até de manhã, todos os jogadores têm de estar a dormir em camas ao mesmo tempo. + +Ferramentas e Armas + +Armas + +Alimentos + +Estruturas + +Armadura + +Mecanismos + +Transporte + +Decorações + +Blocos de Construção + +Redstone e Transporte + +Vários + +Preparação de Poções + +Poções + +Ferramentas, Armas e Armadura + +Materiais + +Sessão terminada + +Foste reencaminhado para o ecrã principal porque o teu perfil de jogador terminou sessão + +Dificuldade + +Música + +Som + +Gama + +Sensibilidade do Jogo + +Sensibilidade da Interface + +Calmo + +Fácil + +Normal + +Difícil + +Neste modo, o jogador recupera a saúde com o passar do tempo e não há inimigos no horizonte. + +Neste modo, existem inimigos nas redondezas, mas irão provocar menos danos ao jogador do que no modo Normal. + +Neste modo, existem inimigos nas redondezas e podem provocar uma quantidade de danos normal ao jogador. + +Neste modo, existem inimigos nas redondezas e irão provocar graves danos ao jogador. Presta atenção aos Creepers também, uma vez que é pouco provável que cancelem o seu ataque explosivo quando te afastas! + +Tempo Limite da Avaliação Excedido + +Jogaste a versão de avaliação do Minecraft: Xbox 360 Edition durante o tempo máximo permitido! Para continuares a divertir-te, queres desbloquear o jogo completo? + +Jogo cheio + +Falha ao entrar no jogo, não existem espaços livres + +Introduzir Texto de Sinal + +Introduz uma linha de texto para o teu sinal + +Introduzir Título + +Introduz um título para a tua publicação + +Introduzir Legenda + +Introduz uma legenda para a tua publicação + +Introduzir Descrição + +Introduz uma descrição da tua publicação + +Inventário + +Ingredientes + +Posto de Poções + +Baú + +Encantar + +Fornalha + +Ingrediente + +Combustível + +Distribuidor + +De momento, não existem ofertas de conteúdo transferível deste tipo disponíveis para este título. + +%s juntou-se ao jogo. + +%s saiu do jogo. + +%s foi expulso do jogo. + +Tens a certeza de que queres eliminar os dados de jogo gravados? + +A confirmar + +Censurado + +A jogar: + +Repor Definições + +Tens a certeza de que queres repor as definições para os valores predefinidos? + +Erro de Carregamento + +Não foi possível carregar "Minecraft: Edição Xbox 360" e não é possível continuar. + +Jogo de %s + +Anfitrião de jogo desconhecido + +Um convidado terminou sessão + +Um jogador convidado terminou sessão e todos os jogadores convidados foram removidos do jogo. + +Iniciar Sessão + +Não tens sessão iniciada. Para jogares este jogo, tens de iniciar sessão. Queres iniciar sessão agora? + +Multijogador não permitido + +Falha ao participar no jogo. Um ou mais jogadores não têm permissão para jogar no modo multijogador no Xbox Live. + +Falha ao criar um jogo online. Um ou mais jogadores não têm permissão para jogar no modo multijogador no Xbox Live. Desmarca a caixa "Jogo Online" para iniciares um jogo offline. + +Não tens autorização para participar nesta sessão de jogo porque os teus privilégios de Conteúdo de Assinante são demasiado limitados. Altera esta definição em Configurações Privacidade e Online na interface Xbox se quiseres participar nesta sessão. + +Não tens autorização para participar nesta sessão de jogo porque um dos jogadores locais tem privilégios de Conteúdo de Assinante demasiado limitados. + +Não tens autorização para participar nesta sessão de jogo porque um dos jogadores da sessão tem privilégios de Conteúdo de Assinante para Somente Amigos e tu não estás na Lista de Amigos deles. + +Falha ao criar jogo + +Não tens autorização para criar esta sessão de jogo porque um dos jogadores locais tem privilégios de Conteúdo de Assinante demasiado limitados. Desmarca a caixa "Jogo Online" para iniciar um jogo offline ou altera esta definição em Configurações Privacidade e Online na interface Xbox. + +Auto Selecionado + +Sem Pacote: Skins Pred. + +Skins Favoritas + +Nível Excluído + +O jogo no qual pretendes participar encontra-se na tua lista de níveis excluídos. +Se quiseres participar neste jogo, o nível será removido da lista de níveis excluídos. + +Excluir este nível? + +Tens a certeza de que queres adicionar este nível à lista de níveis excluídos? +Se selecionares OK, irás sair do jogo. + +Removido da Lista de Excluídos + +Intervalo de Gravação Automática + +Intervalo de Gravação Automática: Desl. + +Minutos + +Não é possível colocar aqui! + +Não é possível colocar lava junto a um ponto de regeneração devido à possibilidade de morte instantânea dos jogadores regenerados. + +Este jogo tem uma funcionalidade de gravação automática. Quando vires o ícone acima, o jogo está a guardar os dados. +Não desligues a consola Xbox 360 enquanto este ícone estiver visível. + +Opacidade da Interface + +A preparar gravação automática do nível + +Tamanho HUD + +Tamanho HUD (Ecrã dividido) + +Semear + +Desbloquear Pacote de Skins + +Para utilizares a skin selecionada, tens de desbloquear este pacote de skins. +Queres desbloquear agora este pacote de skins? + +Desbloquear Pacote de Texturas + +Para usar este pacote de texturas no teu mundo, precisas de o desbloquear. +Queres desbloqueá-lo agora? + +Pacote de Texturas de Avaliação + +Estás a usar uma versão de avaliação do pacote de texturas. Não poderás guardar este mundo sem desbloqueares a versão completa. +Gostarias de desbloquear a versão completa deste pacote de texturas? + +Pacote de Texturas Não Disponível + +Desbloquear Versão Completa + +Transferir Versão de Avaliação + +Transferir Versão Completa + +Este mundo usa um pacote de mistura ou pacote de texturas que não tens! +Queres instalar o pacote de mistura ou pacote de texturas agora? + +Obtém a Versão de Avaliação + +Obtém a Versão Completa + +Expulsar Jogador + +Tens a certeza de que queres expulsar este jogador do jogo? Ele não poderá voltar a participar até reiniciares o mundo. + +Pacotes de Imagens de Jogador + +Temas + +Pacotes de Skins + +Permitir amigos de amigos + +Não podes participar neste jogo porque está limitado a amigos do anfitrião. + +Impossível Participar no Jogo + +Selecionado + +Skin selecionada: + +Conteúdo Transferível Corrupto + +Este conteúdo transferível está danificado e não pode ser usado. Tens de eliminá-lo e reinstalá-lo a partir do menu Loja Minecraft. + +Algum conteúdo transferível está danificado e não pode ser usado. Tens de eliminá-lo e reinstalá-lo a partir do menu Loja Minecraft. + +O teu modo de jogo foi alterado + +Muda o Nome do Teu Mundo + +Introduz o novo nome para o teu mundo + +Modo Sobrevivência + +Modo Criativo + +Sobrevivência + +Criativo + +Criado em Sobrevivência + +Criado em Criativo + +Compor Nuvens + +O que queres fazer com o jogo guardado? + +Mudar o Nome + +Guardar automaticamente dentro de %d... + +Ligado + +Desligado + +Normal + +Superplano + +Quando ativado, o jogo ficará online. + +Quando ativado, só os jogadores convidados podem aderir. + +Quando ativado, amigos de pessoas na tua Lista de Amigos podem aderir. + +Quando ativada, os jogadores podem infligir danos aos outros jogadores. Afeta apenas o modo Sobrevivência. + +Quando desativada, os jogadores que participam no jogo não podem construir ou escavar até receberem autorização. + +Quando ativada, o fogo pode propagar-se aos blocos inflamáveis mais próximos. + +Quando ativada, o TNT explode ao ser acionado. + +Quando ativada, o anfitrião pode voar, desativar a exaustão e tornar-se invisível no menu do jogo. Desativa as atualizações dos feitos e das classificações. + +Quando ativado, o Submundo será regenerado. É útil se tiveres um ficheiro mais antigo em que não existissem Fortalezas do Submundo. + +Quando ativada, são geradas Aldeias e Fortalezas no mundo. + +Quando ativada, é gerado um mundo completamente plano no Mundo Superior e no Submundo. + +Quanto ativada, é criado um baú com objetos úteis junto ao ponto de regeneração do jogador. + +Pacotes de Skins + +Temas + +Imagens de Jogador + +Itens de Avatar + +Pacotes de Textura + +Pacotes de Mistura + +{*PLAYER*} foi consumido pelas chamas + +{*PLAYER*} morreu carbonizado + +{*PLAYER*} tentou nadar na lava + +{*PLAYER*} sufocou numa parede + +{*PLAYER*} afogou-se + +{*PLAYER*} morreu à fome + +{*PLAYER*} foi picado até à morte + +{*PLAYER*} embateu no chão com muita força + +{*PLAYER*} caiu do mundo + +{*PLAYER*} morreu + +{*PLAYER*} explodiu + +{*PLAYER*} foi morto por magia + +{*PLAYER*} foi morto pela respiração do Ender Dragon + +{*PLAYER*} foi assassinado por {*SOURCE*} + +{*PLAYER*} foi assassinado por {*SOURCE*} + +{*PLAYER*} foi atingido por {*SOURCE*} + +{*PLAYER*} foi atingido por uma bola de fogo de {*SOURCE*} + +{*PLAYER*} foi agredido por {*SOURCE*} + +{*PLAYER*} foi morto por {*SOURCE*} + +Rochas Enevoadas + +Mostrar HUD + +Mostrar Mão + +Gamertags Ecrã Dividido + +Mensagens de Morte + +Personagem Animada + +Animação de Skin Personalizada + +Já não podes escavar ou usar objetos + +Já podes escavar e usar objetos + +Já não podes colocar blocos + +Já podes colocar blocos + +Agora podes usar portas e interruptores + +Já não podes usar portas e interruptores + +Agora podes usar contentores (tais como baús) + +Já não podes usar contentores (tais como baús) + +Já não podes atacar habitantes + +Já podes atacar habitantes + +Já não podes atacar jogadores + +Já podes atacar jogadores + +Já não podes atacar animais + +Já podes atacar animais + +Já és um moderador + +Já não és um moderador + +Já podes voar + +Já não podes voar + +Já não podes ficar cansado + +Já podes ficar cansado + +Já estás invisível + +Já não estás invisível + +Já és invulnerável + +Já não és invulnerável + +%d MSP + +Ender Dragon + +%s entrou em O Fim + +%s abandonou O Fim + + +{*C3*}Sei a que jogador te referes.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Sim. Toma cuidado. Alcançou um nível mais elevado agora. Consegue ler os nossos pensamentos.{*EF*}{*B*}{*B*} +{*C2*}Isso não interessa. Pensa que fazemos parte do jogo.{*EF*}{*B*}{*B*} +{*C3*}Gosto deste jogador. Jogou bem. Não desistiu.{*EF*}{*B*}{*B*} +{*C2*}Lê os nossos pensamentos como se fossem palavras num ecrã.{*EF*}{*B*}{*B*} +{*C3*}É assim que escolhe imaginar muitas coisas, quando está imerso no sonho de um jogo.{*EF*}{*B*}{*B*} +{*C2*}As palavras são uma excelente interface. Muito flexível. E menos aterrorizadoras do que olhar para a realidade atrás do ecrã.{*EF*}{*B*}{*B*} +{*C3*}Eles costumavam ouvir vozes. Antes de os jogadores saberem ler. No tempo em que aqueles que não jogavam chamavam bruxas e feiticeiros aos jogadores. E os jogadores sonhavam que voavam pelo ar, em vassouras movidas por demónios.{*EF*}{*B*}{*B*} +{*C2*}O que sonhou este jogador?{*EF*}{*B*}{*B*} +{*C3*}Este jogador sonhou com a luz do sol e árvores. Fogo e água. Sonhou que criava. E sonhou que destruía. Sonhou que caçava e era caçado. Sonhou com abrigos.{*EF*}{*B*}{*B*} +{*C2*}Ah, a interface original. Com um milhão de anos e ainda funciona. Mas que estrutura verdadeira criou este jogador, na realidade por detrás do ecrã?{*EF*}{*B*}{*B*} +{*C3*}Trabalhou, com um milhão de outros, na criação de um mundo verdadeiro numa dobra de {*EF*}{*NOISE*}{*C3*}, e criou um {*EF*}{*NOISE*}{*C3*} para {*EF*}{*NOISE*}{*C3*}, em {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}Não consegue ler esse pensamento.{*EF*}{*B*}{*B*} +{*C3*}Não. Ainda não alcançou o nível mais elevado. Esse, terá de o alcançar no sonho longo da vida, não no sonho curto de um jogo.{*EF*}{*B*}{*B*} +{*C2*}Sabe que o amamos? Que o universo é bondoso?{*EF*}{*B*}{*B*} +{*C3*}Às vezes, através do ruído dos seus pensamentos, sim, ouve o universo.{*EF*}{*B*}{*B*} +{*C2*}Mas por vezes está triste, no sonho longo. Cria mundos que não têm verão, e treme sob um sol negro, confundindo a sua triste criação com a realidade.{*EF*}{*B*}{*B*} +{*C3*}Curá-lo da tristeza destruí-lo-ia. A tristeza é parte da sua missão privada. Não podemos interferir.{*EF*}{*B*}{*B*} +{*C2*}Por vezes, quando estão imersos em sonhos, quero dizer-lhes que estão a construir mundos verdadeiros na realidade. Por vezes, quero falar-lhes da sua importância para o universo. Por vezes, quando passou algum tempo e ainda não estabeleceram uma ligação verdadeira, quero ajudá-los a proferir a palavra que temem.{*EF*}{*B*}{*B*} +{*C3*}Lê os nossos pensamentos.{*EF*}{*B*}{*B*} +{*C2*}Por vezes, não me importo. Por vezes, desejo dizer-lhes que este mundo que tomam por verdade não passa de {*EF*}{*NOISE*}{*C2*} e {*EF*}{*NOISE*}{*C2*}, quero dizer-lhes que são {*EF*}{*NOISE*}{*C2*} no {*EF*}{*NOISE*}{*C2*}. Observam tão pouco da realidade, no seu sonho longo.{*EF*}{*B*}{*B*} +{*C3*}E, contudo, jogam o jogo.{*EF*}{*B*}{*B*} +{*C2*}Mas seria tão fácil dizer-lhes...{*EF*}{*B*}{*B*} +{*C3*}É demais para este sonho. Dizer-lhes como viver é impedi-los de viver.{*EF*}{*B*}{*B*} +{*C2*}Não direi ao jogador como viver.{*EF*}{*B*}{*B*} +{*C3*}O jogador está a ficar impaciente.{*EF*}{*B*}{*B*} +{*C2*}Vou contar-lhe uma história.{*EF*}{*B*}{*B*} +{*C3*}Mas não a verdade.{*EF*}{*B*}{*B*} +{*C2*}Não. Uma história que contenha seguramente a verdade, numa jaula de palavras. Não a verdade nua, capaz de queimar a qualquer distância.{*EF*}{*B*}{*B*} +{*C3*}Dá-lhe corpo, mais uma vez.{*EF*}{*B*}{*B*} +{*C2*}Sim. Jogador...{*EF*}{*B*}{*B*} +{*C3*}Usa o nome.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Jogador de jogos.{*EF*}{*B*}{*B*} +{*C3*}Boa.{*EF*}{*B*}{*B*} + + + +{*C2*}Agora, inspira. Mais uma vez. Sente o ar nos teus pulmões. Deixa os teus membros regressarem. Sim, mexe os dedos. Tens corpo novamente, sob a gravidade, no ar. Rematerializa-te no sonho longo. Aí estás. O teu corpo a tocar novamente no universo em todos os pontos, como se fossem coisas distintas. Como se fôssemos coisas distintas.{*EF*}{*B*}{*B*} +{*C3*}Como estamos? Em tempos chamavam-nos espírito da montanha. Pai sol, mãe lua. Espíritos ancestrais, espíritos animais. Génios. Fantasmas. Duendes. Depois deuses, demónios. Anjos. Poltergeists. Alienígenas, extra-terrestres. Leptões, quarks. As palavras mudam. Nós não mudamos.{*EF*}{*B*}{*B*} +{*C2*}Somos o universo. Somos tudo o que pensas que não és. Olhas para nós agora, através da tua pele e dos teus olhos. E porque é que o universo toca a tua pele e emite luz sobre ti? Para te ver, jogador. para te conhecer. E ser conhecido. Vou contar-te uma história.{*EF*}{*B*}{*B*} +{*C2*}Era uma vez um jogador.{*EF*}{*B*}{*B*} +{*C3*}O jogador eras tu, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Por vezes, considerava-se humano, na fina crosta de um globo de rocha fundida em rotação. A bola de rocha fundida girava em torno de uma bola de gás abrasador trezentas e trinta mil vezes maior do que ela. Estavam tão afastadas que a luz levava oito minutos a percorrer a distância. A luz era informação de uma estrela, e era capaz de queimar a tua pele a cento e cinquenta milhões de quilómetros de distância.{*EF*}{*B*}{*B*} +{*C2*}Por vezes, o jogador sonhava que era mineiro, na superfície de um mundo que era plano e infinito. O sol era um quadrado branco. Os dias eram curtos; havia muito que fazer; e a morte era um inconveniente temporário.{*EF*}{*B*}{*B*} +{*C3*}Por vezes, o jogador sonhava que estava perdido numa história.{*EF*}{*B*}{*B*} +{*C2*}Por vezes, o jogador sonhava que era outras coisas, noutros lugares. Às vezes, esses sonhos eram perturbadores. Outras eram mesmo muito bonitos. Por vezes, o jogador acordava de um sonho e partia para outro, e depois acordava desse e ia para um terceiro.{*EF*}{*B*}{*B*} +{*C3*}Por vezes, o jogador sonhava que via palavras num ecrã.{*EF*}{*B*}{*B*} +{*C2*}Vamos voltar atrás.{*EF*}{*B*}{*B*} +{*C2*}Os átomos do jogador estavam dispersos na relva, nos rios, no ar, no solo. Uma mulher juntou os átomos; bebeu-os, comeu-os e inalou-os; e a mulher montou o jogador, no seu corpo.{*EF*}{*B*}{*B*} +{*C2*}E o jogador acordou, do mundo escuro e quente do corpo da sua mãe, para o sonho longo.{*EF*}{*B*}{*B*} +{*C2*}E o jogador era uma nova história, nunca antes contada, escrita em letras de ADN. E o jogador era um novo programa, nunca antes executado, gerado por um código-fonte com mil milhões de anos. E o jogador era um novo humano, nunca antes vivo, feito apenas de leite e amor.{*EF*}{*B*}{*B*} +{*C3*}Tu és o jogador. A história. O programa. O humano. Feito apenas de leite e amor.{*EF*}{*B*}{*B*} +{*C2*}Vamos recuar ainda mais.{*EF*}{*B*}{*B*} +{*C2*}Os sete mil quatriliões de átomos do corpo do jogador foram criados, muito antes deste jogo, no coração de uma estrela. Por isso, o jogador é, em si, informação de uma estrela. E o jogador move-se através de uma história, que é uma floresta de informação plantada por um homem chamado Julian num apartamento, mundo infinito criado por um homem chamado Markus, que existe num mundo pequeno e privado criado pelo jogador, que habita um universo criado por...{*EF*}{*B*}{*B*} +{*C3*}Caluda. Por vezes, o jogador criou um pequeno mundo privado suave, quente e simples. Outras vezes duro, frio e complexo. Por vezes, construiu um modelo de universo na sua cabeça; salpicos de energia, salpicos de energia movendo-se através de vastos espaços vazios. Por vezes, chamava a esses salpicos "electrões" e "protões".{*EF*}{*B*}{*B*} + + + +{*C2*}Por vezes, chamava-lhes "planetas" e "estrelas".{*EF*}{*B*}{*B*} +{*C2*}Por vezes, acreditava estar num universo feito de energia, que era feita de ligados e desligados; zeros e uns; linhas de código. Por vezes, acreditava que estava a jogar um jogo. Por vezes, acreditava que estava a ler palavras num ecrã.{*EF*}{*B*}{*B*} +{*C3*}Tu és o jogador, a ler palavras...{*EF*}{*B*}{*B*} +{*C2*}Caluda... Por vezes, o jogador lia linhas de código num ecrã. Descodificava-as em palavras; descodificava as palavras e dava-lhes sentido; descodificava sentidos e transformava-os em sentimentos, emoções, teorias, ideias, e o jogador começava a respirar mais depressa e mais profundamente e percebia que estava vivo, vivo, que aquelas mil mortes não tinham sido reais, o jogador estava vivo{*EF*}{*B*}{*B*} +{*C3*}Tu. Sim, tu. Tu estás vivo.{*EF*}{*B*}{*B*} +{*C2*}e, por vezes, o jogador acreditava que o universo lhe falara através da luz do sol que atravessava as folhas das árvores num dia de verão{*EF*}{*B*}{*B*} +{*C3*}e, por vezes, o jogador acreditava que o universo lhe falara através da luz emitida pelo nítido céu de inverno, onde um salpico de luz no canto do olho do jogador podia ser uma estrela um milhão de vezes maior do que o sol, a ferver os seus planetas até se transformarem em plasma de modo a ser vista pelo jogador por um momento, enquanto ia a caminho de casa no outro extremo do universo, com um súbito odor a comida, quase à porta de casa, prestes a sonhar de novo{*EF*}{*B*}{*B*} +{*C2*}e, por vezes, o jogador acreditava que o universo lhe falara através dos zeros e uns, através da electricidade do mundo, através das palavras que passavam num ecrã no final de um sonho{*EF*}{*B*}{*B*} +{*C3*}e o universo dizia amo-te{*EF*}{*B*}{*B*} +{*C2*}e o universo dizia jogaste bem{*EF*}{*B*}{*B*} +{*C3*}e o universo dizia tudo o que precisas está em ti{*EF*}{*B*}{*B*} +{*C2*}e o universo dizia que és mais forte do que pensas{*EF*}{*B*}{*B*} +{*C3*}e o universo dizia que és a luz do dia{*EF*}{*B*}{*B*} +{*C2*}e o universo dizia que és a noite{*EF*}{*B*}{*B*} +{*C3*}e o universo dizia que as trevas contra as quais lutas estão dentro de ti{*EF*}{*B*}{*B*} +{*C2*}e o universo dizia que a luz que procuras está em ti{*EF*}{*B*}{*B*} +{*C3*}e o universo dizia que não estás só{*EF*}{*B*}{*B*} +{*C2*}e o universo dizia que não estás separado de tudo o resto{*EF*}{*B*}{*B*} +{*C3*}e o universo dizia que és o universo que se prova a si mesmo, que fala consigo próprio, que lê o seu próprio código{*EF*}{*B*}{*B*} +{*C2*}e o universo dizia amo-te porque és o amor.{*EF*}{*B*}{*B*} +{*C3*}E o jogo terminava e o jogador acordava do sonho. E o jogador começava um novo sonho. E o jogador sonhava de novo, sonhava melhor. E o jogador era o universo. E o jogador era amor.{*EF*}{*B*}{*B*} +{*C3*}Tu és o jogador.{*EF*}{*B*}{*B*} +{*C2*}Acorda.{*EF*} + + +Repor Submundo + +Queres mesmo repor o Submundo no seu estado predefinido? Vais perder tudo o que construíste no Submundo! + +Repor Submundo + +Não Repor Submundo + +De momento, não é possível tosquiar este Vacogumelo. Foi alcançado o número máximo de Porcos, Ovelhas, Vacas e Gatos. + +De momento, não é possível usar o Ovo de Geração. O número máximo de Porcos, Ovelhas, Vacas e Gatos foi alcançado. + +De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de Vacogumelos. + +De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de Lobos num mundo. + +De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de Galinhas num mundo. + +De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de Lulas num mundo. + +De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de inimigos num mundo. + +De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de aldeões num mundo. + +O número máximo de Pinturas/Estruturas de Itens num mundo foi atingido. + +Não podes produzir inimigos no modo Calmo. + +Este animal não pode entrar no Modo Amor. O número máximo de Porcos, Ovelhas, Vacas e Gatos de criação foi alcançado. + +Este animal não pode entrar no Modo Amor. Foi alcançado o número máximo de Lobos de criação. + +Este animal não pode entrar no Modo Amor. Foi alcançado o número máximo de Galinhas de criação. + +Este animal não pode entrar no Modo Amor. Foi alcançado o número máximo de Vacogumelos de criação. + +Foi alcançado o número máximo de Barcos num mundo. + +O número máximo de Cabeças de Mob num mundo foi alcançado. + +Inverter + +Esquerdino + +Morreste! + +Regenerar + +Conteúdo transferível + +Alterar Skin + +Instruções de Jogo + +Controlos + +Definições + +Ficha técnica + +Reinstalar Conteúdo + +Definições de Depuração + +Fogos Propagados + +Explosões de TNT + +Jogador vs. Jogador + +Confiar nos Jogadores + +Privilégios de Anfitrião + +Gerar Estruturas + +Mundo Superplano + +Baú de Bónus + +Opções de Mundo + +Pode Construir e Escavar + +Pode Usar Portas e Interruptores + +Pode Abrir Caixas + +Pode Atacar Jogadores + +Pode Atacar Animais + +Moderador + +Expulsar Jogador + +Pode Voar + +Desativar Exaustão + +Invisível + +Opções de Anfitrião + +Jogadores/Convidar + +Jogo online + +Apenas por convite + +Mais Opções + +Carrega + +Novo Mundo + +Nome do Mundo + +Semente para o Gerador de Mundos + +Deixar livre para uma semente aleatória + +Jogadores + +Participar no Jogo + +Iniciar Jogo + +Não foram encontrados jogos + +Jogar + +Classificações + +Feitos + +Ajuda e Opções + +Desbloquear Jogo Completo + +Retomar Jogo + +Guardar Jogo + +Dificuldade: + +Tipo de Jogo: + +Gamertags: + +Estruturas: + +Tipo de Nível: + +JvJ: + +Confiar Jogadores: + +TNT: + +Fogos Propagados: + +Reinstalar Tema + +Reinstalar Imagem de Jogador 1 + +Reinstalar Imagem de Jogador 2 + +Reinstalar Item de Avatar 1 + +Reinstalar Item de Avatar 2 + +Reinstalar Item de Avatar 3 + +Opções + +Ãudio + +Controlo + +Gráficos + +Interface de Utilizador + +Repor Predefinições + +Ver Saltos + +Sugestões + +Descrições do Jogo + +Gamertags do Jogo + +Ecrã Divido Vertical 2 Jogadores + +Concluído + +Editar mensagem do sinal: + +Preenche os detalhes da tua captura de ecrã + +Legenda + +Captura de ecrã do jogo + +Editar mensagem do sinal: + +Olha o que eu fiz no Minecraft: Edição Xbox 360! + +As texturas, os ícones e a interface de utilizador clássicos do Minecraft! + +Mostrar todos os Mundos Mash-up + +Selecionar Ranhura de Gravação de Transferência + +Ranhura Vazia + +A Carregar Gravação de Metadados + +A Carregar Gravação de Dados + +A Carregar Gravação para Xbox One + +Carregamento Cancelado + +Cancelaste o carregamento deste ficheiro para a área de transferência de gravações. + +Sem Efeitos + +Velocidade + +Lentidão + +Rapidez + +Cansaço por Escavação + +Força + +Fraqueza + +Saúde Instantânea + +Danos Instantâneos + +Impulso de Salto + +Náusea + +Regeneração + +Resistência + +Resistência ao Fogo + +Inalação de Ãgua + +Invisibilidade + +Cegueira + +Visão Nocturna + +Fome + +Veneno + +de Velocidade + +de Lentidão + +de Rapidez + +de Sonolência + +de Força + +de Fraqueza + +de Saúde + +de Danos + +de Salto + +de Náusea + +de Regeneração + +de Resistência + +de Resistência ao Fogo + +de Inalação de Ãgua + +de Invisibilidade + +de Cegueira + +de Visão Nocturna + +de Fome + +de Veneno + + + +II + +III + +IV + +Explosiva + +Mundano + +Desinteressante + +Suave + +Clara + +Leitosa + +Difusa + +Simples + +Fina + +Estranha + +Plana + +Pesada + +Estragada + +Amanteigada + +Macia + +Suave + +Alegre + +Espessa + +Elegante + +Pomposa + +Charmosa + +Enérgica + +Sofisticada + +Cordial + +Brilhante + +Potente + +Repugnante + +Sem Cheiro + +Grosseira + +Severa + +Acre + +Nojenta + +Mal Cheirosa + +Usada como base em todas as poções. Usa-a num posto de poções para criares poções. + +Não tem efeitos, pode ser usada num posto de poções para criar poções adicionando mais ingredientes. + +Aumenta a velocidade dos movimentos dos jogadores, animais e monstros afetados, e a velocidade de sprint, comprimento do salto e campo de visão dos jogadores. + +Reduz a velocidade dos movimentos dos jogadores, animais e monstros afetados, e a velocidade de sprint, comprimento do salto e campo de visão dos jogadores. + +Aumenta os danos causados pelos jogadores e monstros quando atacam. + +Reduz os danos causados pelos jogadores e monstros quando atacam. + +Aumenta instantaneamente a saúde dos jogadores, animais e monstros afetados. + +Reduz instantaneamente a saúde dos jogadores, animais e monstros afetados. + +Restitui a saúde dos jogadores, animais e monstros afetados ao longo do tempo. + +Faz com que os jogadores, animais e monstros afetados fiquem imunes ao fogo, lava e ataques de Blaze à distância. + +Reduz a saúde dos jogadores, animais e monstros afetados ao longo do tempo. + +Precisão + +Golpear + +Veneno de Artrópodes + +Coice + +Aspeto do Fogo + +Proteção + +Proteção contra Fogos + +Queda de Penas + +Proteção contra Explosões + +Proteção contra Projécteis + +Respiração + +Afinidade Aquática + +Eficiência + +Toque de Seda + +Inquebrável + +Saque + +Sorte + +Poder + +Chama + +Soco + +Infinidade + +I + +II + +III + +IV + +V + +VI + +VII + +VIII + +IX + +X + +Pode ser extraído com uma Picareta de Ferro ou melhor para obter Esmeraldas. + +Similar a um Baú, com a exceção de que os itens colocados num Baú Ender estão disponíveis em cada um dos Baús Ender do jogador, mesmo em dimensões diferentes. + +Ativa-se quando uma entidade passa por uma Armadilha ligada. + +Ativa um Gancho de Armadilha ligado quando uma entidade passa por ele. + +Uma forma compacta de armazenar Esmeraldas. + +Um muro feito de Pedras Arredondadas. + +Pode ser usada para reparar armas, ferramentas e armaduras. + +Fundido numa fornalha para produzir Quartzo do Submundo. + +Usado como decoração. + +Pode ser trocado com aldeões. + +Usado como decoração. É possível plantar Flores, Mudas, Cactos e Cogumelos nele. + +Restitui 2{*ICON_SHANK_01*} e pode ser transformada numa cenoura dourada. Pode ser plantada na terra. + +Restitui 0,5{*ICON_SHANK_01*} ou pode ser cozida numa fornalha. Pode ser plantada na terra. + +Restitui 3{*ICON_SHANK_01*}. Cria-se cozendo uma batata numa fornalha. + +Restitui 1{*ICON_SHANK_01*} ou pode ser cozida numa fornalha. Pode ser plantada na terra. Se comeres isto podes ficar doente. + +Restitui 3{*ICON_SHANK_01*}. Fabricada a partir de uma cenoura e de pepitas de ouro. + +Usada para controlar um porco com sela quando estás a montá-lo. + +Restaura 4{*ICON_SHANK_01*}. + +Usado com uma Bigorna para enfeitiçar armas, ferramentas ou armaduras. + +Criado através da extração de Minério de Quartzo do Submundo. Pode ser transformado num Bloco de Quartzo. + +Fabricada a partir da Lã. Usada como decoração. + +Esmeralda + +Vaso de Flores + +Cenoura + +Batata + +Batata Cozida + +Batata Venenosa + +Cenoura Dourada + +Cenoura num Pau + +Tarte de Abóbora + +Livro de Feitiços + +Quartzo do Submundo + +Minério de Esmeralda + +Baú Ender + +Gancho de Armadilha + +Armadilha + +Bloco de Esmeralda + +Muro Pedra Arredondada + +Muro Pedra Arr. e Musgo + +Vaso de Flores + +Cenouras + +Batatas + +Bigorna + +Bigorna + +Bigorna Ligeiramente Danificada + +Bigorna Muito Danificada + +Minério de Quartzo do Submundo + +Bloco de Quartzo + +Bloco de Quartzo Esculpido + +Bloco Pilar de Quartzo + +Escadas de Quartzo + +Alcatifa + +Alcatifa Preta + +Alcatifa Vermelha + +Alcatifa Verde + +Alcatifa Castanha + +Alcatifa Azul + +Alcatifa Roxa + +Alcatifa Ciano + +Alcatifa Cinzenta-clara + +Alcatifa Cinzenta + +Alcatifa Rosa + +Alcatifa Lima + +Alcatifa Amarela + +Alcatifa Azul-clara + +Alcatifa Magenta + +Alcatifa Laranja + +Alcatifa Branca + +Grés Esculpido + +Grés Suave + +{*PLAYER*} foi morto ao tentar ferir {*SOURCE*} + +{*PLAYER*} foi esmagado por uma Bigorna. + +{*PLAYER*} foi esmagado por um bloco. + +{*PLAYER*} teletransportado/a para {*DESTINATION*} + +{*PLAYER*} teletransportou-te para a sua posição + +{*PLAYER*} teletransportado/a até ti + +Espinhos + +Placa de Quartzo + +Ilumina as zonas escuras, mesmo debaixo de água. + +Torna invisíveis os jogadores, animais e monstros afetados. + +Reparar & Nomear + +Custo do Feitiço: %d + +Demasiado Caro! + +Renomear + +Tens: + +Necessário para Troca + +{*VILLAGER_TYPE*} oferece %s + +Reparar + +Trocar + +Tingir coleira + + + Esta é a interface da Bigorna, que podes usar para renomear, reparar e aplicar feitiços a armas, armaduras ou ferramentas, às custas de Níveis de Experiência. + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre a interface da Bigorna.{*B*} + Prime{*CONTROLLER_VK_B*} se já conheceres a interface da Bigorna. + + + + Para começar a trabalhar num objeto, coloca-o no primeiro orifício. + + + + Quando a matéria-prima correta é colocada no segundo orifício (exemplo: Lingotes de Ferro para uma Espada de Ferro danificada), a reparação proposta surge no orifício de saída. + + + + Em alternativa, um segundo objeto idêntico pode ser colocado no segundo orifício para combinar os dois objetos. + + + + Para enfeitiçar objetos na Bigorna, coloca um Livro de Feitiços no segundo orifício. + + + + O número de Níveis de Experiência que o trabalho vai custar é apresentado por baixo da saída. Se não tiveres Níveis de Experiência suficientes, a reparação não será concluída. + + + + É possível renomear o objeto editando o nome apresentado na caixa de texto. + + + + Pegar no objeto reparado irá consumir os dois objetos usados na Bigorna e diminuir o teu Nível de Experiência na quantidade indicada. + + + + Nesta zona há uma Bigorna e um Baú com ferramentas e armas para trabalhar. + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre a Bigorna.{*B*} + Prime{*CONTROLLER_VK_B*} se já conheceres a Bigorna. + + + + Usando uma Bigorna, podes reparar armas e ferramentas para restaurar a sua durabilidade, renomeá-las ou enfeitiçá-las com Livros de Feitiços. + + + + Os Livros de Feitiços estão dentro de Baús nas masmorras, ou são enfeitiçados a partir de Livros normais na Mesa de Feitiços. + + + + Usar a Bigorna custa Níveis de Experiência e cada utilização poderá danificar a Bigorna. + + + + O tipo de trabalho a fazer, o valor do objeto, o número de feitiços e o uso prévio afetam o custo da reparação. + + + + Renomear um objeto muda o nome apresentado a todos os jogadores e reduz permanentemente o custo do trabalho prévio. + + + + No Baú desta zona vais encontrar Picaretas, matérias-primas, Frascos de Feitiços e Livros de Feitiços para experimentares. + + + + Esta é a interface de troca que apresenta as trocas que podem ser feitas com um aldeão. + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre a interface de troca.{*B*} + Prime{*CONTROLLER_VK_B*} se já conheceres a interface de troca. + + + + Todas as trocas que o aldeão está disposto a fazer de momento são apresentadas no topo. + + + + As trocas surgirão a vermelho e estarão indisponíveis se não tiveres os objetos necessários. + + + + A quantidade e o tipo de objetos que dás ao aldeão surge nas duas caixas à esquerda. + + + + Podes ver o número total de objetos necessários para a troca nas duas caixas à esquerda. + + + + Prime{*CONTROLLER_VK_A*} para trocar os objetos que o aldeão pretende pelo objeto que ele disponibiliza. + + + + Nesta zona há um aldeão e um Baú com Papel para comprar objetos. + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre trocas.{*B*} + Prime{*CONTROLLER_VK_B*} se já conheceres as trocas. + + + + Os jogadores podem trocar objetos do seu inventário com os aldeões. + + + + As trocas que um aldeão poderá disponibilizar dependem da sua profissão. + + + + Desempenhar uma mistura de trocas irá adicionar ou atualizar aleatoriamente as trocas disponíveis do aldeão. + + + + As trocas que tenham sido usadas frequentemente podem ser temporariamente removidas, mas o aldeão irá sempre oferecer pelo menos uma troca. + + + + Tira algum Papel do Baú e tenta trocar com este aldeão. + + + + Nesta zona há dois Baús Ender. + + + + {*B*} + Prime{*CONTROLLER_VK_A*} para aprenderes mais sobre Baús Ender.{*B*} + Prime{*CONTROLLER_VK_B*} se já conheceres os Baús Ender. + + + + Todos os Baús Ender num mundo estão ligados, mesmo através de dimensões. Os objetos colocados num Baú Ender estão acessíveis noutro Baú Ender. + + + + Todavia, os conteúdos dos Baús Ender são diferentes para cada jogador. + + + + Isto permite que os jogadores armazenem objetos em qualquer Baú Ender e os recuperem noutros Baús Ender em diferentes posições no mundo. Podes tentar isto agora, colocando objetos num dos Baús Ender. + + +Restitui 2{*ICON_SHANK_01*}, regenera a saúde durante 30 segundos e concede resistência ao fogo e a danos durante 5 minutos. Fabricada a partir de uma maçã e blocos de ouro. + +Pode Teletransportar + +Teletransportar + +Teletransportar Para Jogador + +Teletransportar Para Mim + +Pode Desativar Exaustão + +Pode Tornar-se Invisível + +Agora podes ativar a invisibilidade + +Já não podes ativar a invisibilidade + +Agora podes ativar o voo + +Já não podes ativar o voo + +Agora podes desativar a exaustão + +Já não podes desativar a exaustão + +Agora podes teletransportar + +Já não podes teletransportar + +{*T3*}COMO JOGAR : BIGORNAS{*ETW*}{*B*}{*B*} +Os níveis de experiência também podem ser usados para reparar, enfeitiçar ou renomear objetos com a Bigorna.{*B*} +Todos os objetos podem ser renomeados, embora só objetos com durabilidade possam ser reparados ou ser alvo de feitiços dos Livros de Feitiços.{*B*} +Um objeto pode ser reparado se for colocado num dos orifícios à esquerda, juntamente com alguma matéria-prima do objeto, como Lingotes de Ferro para uma Espada de Ferro, ou combinado com outro objeto do mesmo tipo.{*B*} +Combinar objetos é mais eficiente quando usas uma Bigorna e, se algum dos objetos tiver sido enfeitiçado, o produto final poderá ter feitiços de qualquer dos materiais usados.{*B*} +Os Livros de Feitiços podem aplicar feitiços aos objetos, ao combinarem-nos numa Bigorna, desde que o feitiço do Livro seja adequado. Os Livros de Feitiços podem ser encontrados em Baús nas masmorras, ou ser enfeitiçados a partir de Livros normais na Mesa de Feitiços.{*B*} +Há a possibilidade de a Bigorna ficar danificada após cada utilização, e até de se destruir caso seja demasiado castigada.{*B*} + + +{*T3*}COMO JOGAR : TROCAR{*ETW*}{*B*}{*B*} +É possível trocar objetos com aldeões. Cada aldeão tem uma profissão. Eles podem ser Agricultores, Açougueiros, Ferreiros, Bibliotecários ou Padres, e isto afeta o tipo de objetos que podem trocar.{*B*} +Podes encontrar uma lista de todas as trocas que podes fazer com um aldeão no menu de trocas. Um aldeão pode modificar ou adicionar o que tem para troca sempre que um jogador faça negócio com ele, embora uma troca possa ficar temporariamente desativada se for usada com demasiada frequência.{*B*} +As trocas geralmente implicam comprar ou vender uns quantos objetos por esmeraldas.{*B*} +Se não tiveres os objetos necessários para uma troca, os objetos surgem a vermelho.{*B*} + + +{*T3*}COMO JOGAR : BAÚ ENDER {*ETW*}{*B*}{*B*} +Todos os Baús Ender de um mundo estão ligados. Os objetos colocados num Baú Ender estão acessíveis em qualquer outro. Todavia, os conteúdos dos Baús Ender diferem de jogador para jogador. Isto permite que os Jogadores armazenem objetos em qualquer Baú Ender e os recolham de outros Baús Ender em locais distintos do mundo. + + +Agricultor + +Bibliotecário + +Padre + +Ferreiro + +Açougueiro + +Presentes nas aldeias, os aldeões oferecem-se para vender objetos ao jogador dependendo da sua profissão. + +Baú Grande + + + Também podes criar Livros de Feitiços na Mesa de Feitiços, os quais podem ser usados mais tarde na Bigorna para aplicar o seu feitiço a um objeto. + + + + Ganchos de Armadilha também fornecem energia constante a um circuito enquanto algo está a despoletar a corda entre eles. + + + + Depois de domesticado, um lobo terá sempre a sua coleira. Podes mudar a cor da coleira tingindo-a. + + +Cenouras e Batatas são cultivadas plantando Cenouras ou Batatas, e ficam prontas a colher quando o vegetal é visível acima do solo. + + + Além disso, os jogadores podem colocar selas em porcos e montá-los. Eles são controlados se os tentares com uma Cenoura num Pau. + + + + Em caso de necessidade, podes mover lentamente a tua vagoneta usando {*CONTROLLER_ACTION_MOVE*}. Pô-la num carril com energia ajuda a vagoneta a arrancar. + + +Não podes juntar-te a este jogo porque o ecrã dividido só é suportado no modo de Alta Definição. Faz com que todos os outros jogadores terminem a sessão se quiseres aderir. + +Cura + +Xbox 360 + +BACK + +Esta opção desativa as atualizações dos feitos e das classificações para este mundo durante o jogo e também ao carregá-lo novamente após guardar com esta opção ativa. + +Carregar Gravação para Xbox One + +Carregar Gravação + +Na área de transferência de gravações só pode ser armazenada uma gravação Xbox 360 de cada vez. Por favor, confirma se transferiste a gravação na tua consola Xbox One antes de carregares outra gravação Xbox 360. + +A carregar... + +Carregamento Concluído! + +Carregamento Falhou. Volta a tentar mais tarde, por favor. + + diff --git a/Minecraft.Client/Common/Media/skin.swf b/Minecraft.Client/Common/Media/skin.swf new file mode 100644 index 00000000..c4660d59 Binary files /dev/null and b/Minecraft.Client/Common/Media/skin.swf differ diff --git a/Minecraft.Client/Common/Media/skinGraphics.swf b/Minecraft.Client/Common/Media/skinGraphics.swf new file mode 100644 index 00000000..8438f11d Binary files /dev/null and b/Minecraft.Client/Common/Media/skinGraphics.swf differ diff --git a/Minecraft.Client/Common/Media/skinGraphicsHud.swf b/Minecraft.Client/Common/Media/skinGraphicsHud.swf new file mode 100644 index 00000000..55123e69 Binary files /dev/null and b/Minecraft.Client/Common/Media/skinGraphicsHud.swf differ diff --git a/Minecraft.Client/Common/Media/skinGraphicsInGame.swf b/Minecraft.Client/Common/Media/skinGraphicsInGame.swf new file mode 100644 index 00000000..6612beaf Binary files /dev/null and b/Minecraft.Client/Common/Media/skinGraphicsInGame.swf differ diff --git a/Minecraft.Client/Common/Media/skinGraphicsLabels.swf b/Minecraft.Client/Common/Media/skinGraphicsLabels.swf new file mode 100644 index 00000000..0538ced9 Binary files /dev/null and b/Minecraft.Client/Common/Media/skinGraphicsLabels.swf differ diff --git a/Minecraft.Client/Common/Media/skinHD.swf b/Minecraft.Client/Common/Media/skinHD.swf new file mode 100644 index 00000000..c80fa406 Binary files /dev/null and b/Minecraft.Client/Common/Media/skinHD.swf differ diff --git a/Minecraft.Client/Common/Media/skinHDGraphics.swf b/Minecraft.Client/Common/Media/skinHDGraphics.swf new file mode 100644 index 00000000..27e3798a Binary files /dev/null and b/Minecraft.Client/Common/Media/skinHDGraphics.swf differ diff --git a/Minecraft.Client/Common/Media/skinHDGraphicsHud.swf b/Minecraft.Client/Common/Media/skinHDGraphicsHud.swf new file mode 100644 index 00000000..2c467474 Binary files /dev/null and b/Minecraft.Client/Common/Media/skinHDGraphicsHud.swf differ diff --git a/Minecraft.Client/Common/Media/skinHDGraphicsInGame.swf b/Minecraft.Client/Common/Media/skinHDGraphicsInGame.swf new file mode 100644 index 00000000..7a39b099 Binary files /dev/null and b/Minecraft.Client/Common/Media/skinHDGraphicsInGame.swf differ diff --git a/Minecraft.Client/Common/Media/skinHDGraphicsLabels.swf b/Minecraft.Client/Common/Media/skinHDGraphicsLabels.swf new file mode 100644 index 00000000..abb3194e Binary files /dev/null and b/Minecraft.Client/Common/Media/skinHDGraphicsLabels.swf differ diff --git a/Minecraft.Client/Common/Media/skinHDHud.swf b/Minecraft.Client/Common/Media/skinHDHud.swf new file mode 100644 index 00000000..fcdbe396 Binary files /dev/null and b/Minecraft.Client/Common/Media/skinHDHud.swf differ diff --git a/Minecraft.Client/Common/Media/skinHDInGame.swf b/Minecraft.Client/Common/Media/skinHDInGame.swf new file mode 100644 index 00000000..cfc91228 Binary files /dev/null and b/Minecraft.Client/Common/Media/skinHDInGame.swf differ diff --git a/Minecraft.Client/Common/Media/skinHDLabels.swf b/Minecraft.Client/Common/Media/skinHDLabels.swf new file mode 100644 index 00000000..5ed2b349 Binary files /dev/null and b/Minecraft.Client/Common/Media/skinHDLabels.swf differ diff --git a/Minecraft.Client/Common/Media/skinHud.swf b/Minecraft.Client/Common/Media/skinHud.swf new file mode 100644 index 00000000..c98bf708 Binary files /dev/null and b/Minecraft.Client/Common/Media/skinHud.swf differ diff --git a/Minecraft.Client/Common/Media/skinInGame.swf b/Minecraft.Client/Common/Media/skinInGame.swf new file mode 100644 index 00000000..bee85d33 Binary files /dev/null and b/Minecraft.Client/Common/Media/skinInGame.swf differ diff --git a/Minecraft.Client/Common/Media/skinLabels.swf b/Minecraft.Client/Common/Media/skinLabels.swf new file mode 100644 index 00000000..04a41d33 Binary files /dev/null and b/Minecraft.Client/Common/Media/skinLabels.swf differ diff --git a/Minecraft.Client/Common/Media/skin_Minecraft.xui b/Minecraft.Client/Common/Media/skin_Minecraft.xui new file mode 100644 index 00000000..5d4517d2 --- /dev/null +++ b/Minecraft.Client/Common/Media/skin_Minecraft.xui @@ -0,0 +1,42772 @@ + + +1280.000000 +720.000000 +[LayerFolders]5|+How To Play|34|+|0|+ControllerIcons|3|+|0|+Creative Inventory|8|+|0|+Crafting Scene|16|+|0|+Scenes, Panels,etc|14|+|0|+Main Menu|4|+|0|+DLC|4|+|0|+Skin Select Scene|15|+|0|+HTML|4|+|0|+HUD|18|+|0|+Inventory Containers Special|34|+|0|+Inventory Containers Shared|22|+|0|+Lists|0|+Leaderboard|4|+|0|+Players|6|+|25|+|0|+Tooltips|20|+|0|+Credits|8|+|0|-Labels and Text|53|+|0|-Other|11|+|0|+ImagePresenters|2|+|0|-Default Controls|18|+|0[/LayerFolders] + + + +XuiCheckboxSmall +265.000000 +20.000000 + + + +text_Button +240.000000 +20.000000 +25.000000,1.000000,0.000000 +5 +0xff323232 +0xff0f0f0f +11.000000 +4112 + + + + +text_Button1 +240.000000 +20.000000 +24.000000,0.000000,0.000000 +5 +false +0xff323232 +0xff0f0f0f +11.000000 +4112 + + + + +TickBox_Norm +18.000000 +18.000000 +2.000000,1.000000,0.000000 +16 +Graphics\Tickbox_Norm.png +48 + + + + +TickBox_Over +18.000000 +18.000000 +2.000000,1.000000,0.000000 +false +16 +Graphics\Tickbox_Over.png +48 + + + + +Tick +28.000000 +24.000000 +0.000000,-1.000000,0.000000 +false +Graphics\Tick.png +48 + + + + +XuiSoundXACT +15.000000 +14.000000 +70.000000,21.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + +NormalCheck + + + +EndNormalCheck + +stop + + +FocusCheck + + + +EndFocusCheck + +stop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +NormalCheckDisable + + + +EndNormalCheckDisable + +stop + + +FocusCheckDisable + + + +EndFocusCheckDisable + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +NormalSelCheck + + + +EndNormalSelCheck + +stop + + +NormalSelCheckDisable + + + +EndNormalSelCheckDisable + +stop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +TickBox_Over +Show +Opacity + + +0 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +false +0.500000 + + + +0 +false +0.500000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +0 +false +0.500000 + + + +0 +false +0.500000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +0 +false +0.500000 + + + +0 +false +0.500000 + + + +Tick +Show +Opacity + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +0 +false +0.500000 + + + +0 +false +0.500000 + + + +TickBox_Norm +Show +Opacity + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +0 +false +0.500000 + + + +0 +false +0.500000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +0 +false +0.500000 + + + +0 +false +0.500000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +text_Button1 +TextColor +Opacity +DropShadowColor +Show + + +1 +0xff323232 +1.000000 +0xff0f0f0f +false + + + +0 +0xff323232 +1.000000 +0xff0f0f0f +false + + + +1 +0xffebcc0f +1.000000 +0xff0f0f0f +true + + + +0 +0xffebcc0f +1.000000 +0xff0f0f0f +true + + + +1 +0xff323232 +1.000000 +0xff0f0f0f +false + + + +0 +0xff323232 +1.000000 +0xff0f0f0f +false + + + +1 +0xffebcc0f +1.000000 +0xff0f0f0f +true + + + +0 +0xffebcc0f +1.000000 +0xff0f0f0f +true + + + +1 +0xff8c8c8c +0.500000 +0x7f0f0f0f +false + + + +0 +0xff8c8c8c +0.500000 +0x7f0f0f0f +false + + + +1 +0xffebcc0f +0.500000 +0x7f0f0f0f +true + + + +0 +0xffebcc0f +0.500000 +0x7f0f0f0f +true + + + +1 +0xff323232 +0.500000 +0x7e0f0f0f +false + + + +0 +0xff323232 +0.500000 +0x7e0f0f0f +false + + + +1 +0xffebcc0f +0.500000 +0x7f0f0f0f +true + + + +0 +0xffebcc0f +0.500000 +0x7f0f0f0f +true + + + +0 +0xffebcc0f +0.500000 +0x7f0f0f0f +false + + + +0 +0xffebcc0f +0.500000 +0x7f0f0f0f +false + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonFocus + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonFocus + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +text_Button +Opacity + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + + + + +XuiSliderVertical +33.000000 +270.000000 + + + +XuiSoundXACT +53.000000 +56.000000 +-15.459526,85.765701,0.000000 +0.000000,0.000000,0.707107,-0.707107 +144.996216,20.499901,0.000000 + + + + +Background +24.000000 +270.000000 +6.000000,2.000000,0.000000 +PanelRecessed + + + + +SliderBody +33.777779 +32.296295 + + + +SliderButton +32.000000 +32.000000 +2.000000,0.000000,0.000000 +GraphicPanel4grid + + + + + +Normal + + + +EndNormal + + + + +SliderButton +Position + + +0 +2.000000,0.000000,0.000000 + + + +0 +2.000008,242.000000,0.000000 + + + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + +NormalDisable + + + +EndNormalDisable + +stop + + +InitFocus + + + +EndInitFocus + +stop + + + +XuiSoundXACT +SoundBank +WaveBank +Cue +Position + + +0 + + + +-15.459526,85.765701,0.000000 + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonFocus +-15.459526,85.765701,0.000000 + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + +-105.459526,45.765701,0.000000 + + + +SliderBody +Opacity + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +Background +Opacity + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + + + + +XuiSliderVerticalSmall +32.000000 +162.000000 + + + +XuiSoundXACT +53.000000 +56.000000 +-15.459526,85.765701,0.000000 +0.000000,0.000000,0.707107,-0.707107 +144.996216,20.499901,0.000000 + + + + +Background +23.000000 +162.000000 +6.000000,2.000000,0.000000 +PanelRecessed + + + + +SliderBody +32.000000 +32.000000 +1.000000,0.000000,0.000000 + + + +XuiControl1 +32.000000 +32.000000 +0.000000,0.000004,0.000000 +GraphicPanel4grid + + + + + +Normal + + + +EndNormal + + + + +XuiControl1 +Position + + +0 +0.000000,0.000004,0.000000 + + + +0 +0.000000,132.000000,0.000000 + + + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + +NormalDisable + + + +EndNormalDisable + +stop + + +InitFocus + + + +EndInitFocus + +stop + + + +XuiSoundXACT +SoundBank +WaveBank +Cue +Position + + +0 + + + +-15.459526,85.765701,0.000000 + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonFocus +-15.459526,85.765701,0.000000 + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + +-105.459526,45.765701,0.000000 + + + +SliderBody +Opacity + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +Background +Opacity + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + + + + +XuiSlider +606.000000 +38.000000 + + + +GraphicGroup +606.000000 +38.000000 +5 + + +0xff0f0f80 + + + + +0x28ebebeb +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,129.000000,0.000000,0,129.000000,0.000000,129.000000,0.000000,129.000000,30.000000,0,129.000000,30.000000,129.000000,30.000000,0.000000,30.000000,0,0.000000,30.000000,0.000000,30.000000,0.000000,0.000000,0, + + + + +Slider_Track +600.000000 +32.000000 +3.000000,3.000000,0.000000 +5 +true + + + +XuiImage1 +600.000000 +32.000000 +Graphics\Slider_Track.png + + + + + +TrackEndCap +2.000000 +32.000000 +601.000000,3.000000,0.000000 +4 + + +0xff0f0f80 + + + + +0xff000000 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,3.000000,0.000000,0,3.000000,0.000000,3.000000,0.000000,3.000000,32.000000,0,3.000000,32.000000,3.000000,32.000000,0.000000,32.000000,0,0.000000,32.000000,0.000000,32.000000,0.000000,0.000000,0, + + + + +SliderTint +596.000000 +28.000000 +5.000000,5.000000,0.000000 +207 +false + + +0xff0f76eb + + + + +0x8c4f7bc3 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,294.000000,0.000000,0,294.000000,0.000000,294.000000,0.000000,294.000000,53.000000,0,294.000000,53.000000,294.000000,53.000000,0.000000,53.000000,0,0.000000,53.000000,0.000000,53.000000,0.000000,0.000000,0, + + + + +SliderBody +584.000000 +32.000000 +3.000000,3.000000,0.000000 +5 + + + +XuiImage1 +16.000000 +32.000000 +true +Graphics\Slider_Button.png + + + + + +Normal + + + +EndNormal + + + +Focus + + + +EndFocus + + + + +XuiImage1 +Position +DisableTimelineRecursion + + +0 +0.000000,0.000000,0.000000 +true + + + +0 +584.000000,0.000000,0.000000 +false + + + +0 +0.000000,0.000000,0.000000 +true + + + +0 +584.000000,0.000000,0.000000 +true + + + + + + +Text_Value +50.000000 +26.000000 +550.000000,6.000000,0.000000 +4 +0xffebebeb +0xff0f0f0f +4369 +1 + + + + +text_Label +606.000000 +38.000000 +5 +0xffebebeb +0xff0f0f0f +5137 + + + + +XuiSoundXACT +53.000000 +56.000000 +158.000000,15.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + +NormalDisable + + + +EndNormalDisable + +stop + + +InitFocus + + + +EndInitFocus + +stop + + + +text_Label +TextColor +Anchor + + +0 +0xffebebeb +5 + + + +0 +0xffebebeb +1 + + + +0 +0xffebcc0f +1 + + + +0 +0xffebcc0f +1 + + + +0 +0xffa0a0a0 +1 + + + +0 +0xffa0a0a0 +5 + + + +0 +0xffebeb0f +5 + + + +0 +0xffebeb0f +5 + + + +Text_Value +TextColor + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +0 +0xffa0a0a0 + + + +0 +0xffa0a0a0 + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +SliderTint +Show + + +0 +false + + + +0 +false + + + +0 +true + + + +0 +true + + + +0 +true + + + +0 +true + + + +0 +true + + + +0 +true + + + +TrackEndCap +Opacity + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.750000 + + + +0 +0.750000 + + + +0 +0.750000 + + + +0 +0.750000 + + + +Slider_Track +Opacity + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.750000 + + + +0 +0.750000 + + + +0 +0.750000 + + + +0 +0.750000 + + + +GraphicGroup +Fill.FillColor + + +0 +0x28ebebeb + + + +0 +0x28ebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonFocus + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + + + + +XuiRadioGroup +298.000000 +86.000000 + + + +graphic_groupfocusbackground +298.000000 +86.000000 +15 +false + + + + + +Normal + + + +EndNormal + + + +Focus + + + +EndFocus + +stop + + + +graphic_groupfocusbackground +Show + + +1 +false + + + +0 +true + + + + + + +FadeIn +300.000000 +300.000000 + + + +box +300.000000 +300.000000 +0.000000 +false + + +1.000000 +0xff787878 + + + + +0xffc8c8c8 + + +true +4,0.000000,0.000000,0.000000,0.000000,640.000000,0.000000,0,640.000000,0.000000,640.000000,0.000000,640.000000,480.000000,0,640.000000,480.000000,640.000000,480.000000,0.000000,480.000000,0,0.000000,480.000000,0.000000,480.000000,0.000000,0.000000,0, + + + + +box +Opacity +Show + + +0 +0.000000 +false + + + +2 +-100 +100 +50 +0.000000 +true + + + +0 +1.000000 +true + + + + + + +XuiVisualImagePresenter +46.000000 +46.000000 + + + +XuiImagePresenter +46.000000 +46.000000 +15 +4 + + + + + +XuiEditSmall +250.000000 +24.925926 + + + +Border +254.000000 +34.000000 +-2.000000,-2.000000,0.000000 +0.850000 +15 + + +0xff323232 + + + + +0xff323232 + + +2 +0xff787878 +0xffafafaf +0.000000 +1.000000 + + +-90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,245.000000,0.000000,1,245.000000,0.000000,245.000000,0.000000,245.000000,50.000000,1,245.000000,50.000000,245.000000,50.000000,0.000000,50.000000,1,0.000000,50.000000,0.000000,50.000000,0.000000,0.000000,1, + + + + +Background +250.000000 +0.850000 +15 + + +0xff323232 + + + + +0xff646464 + + +2 +0xff787878 +0xffafafaf +0.000000 +1.000000 + + +-90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,245.000000,0.000000,1,245.000000,0.000000,245.000000,0.000000,245.000000,50.000000,1,245.000000,50.000000,245.000000,50.000000,0.000000,50.000000,1,0.000000,50.000000,0.000000,50.000000,0.000000,0.000000,1, + + + + +Text +240.000000 +20.000000 +6.000000,6.000000,0.000000 +15 +0xffebebeb +12.000000 + + + + +Caret +10.000000 +20.592592 +6.000000,3.000000,0.000000 +false + + + + +ScrollRight +26.000000 +22.000000 +250.296295,2.129630,0.000000 +14 +XuiScrollEndRight +3 + + + + +ScrollDown +32.000000 +22.000000 +214.000000,30.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +ScrollUp +32.000000 +22.000000 +214.000000,-22.000000,0.000000 +6 +XuiScrollEndUp + + + + +ScrollLeft +26.000000 +22.000000 +-26.000000,2.425926,0.000000 +11 +XuiScrollEndLeft +2 + + + + +XuiSoundXACT +36.000000 +31.000000 +97.000000,27.000000,0.000000 + + + + +XuiImage1 +250.000000 +25.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + +InitFocus + + + +EndInitFocus + +stop + + + +Background +Stroke.StrokeColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Opacity +Fill.FillColor + + +0 +0xff323232 +0xff787878 +0xffafafaf +0.850000 +0xff646464 + + + +0 +0xff323232 +0xff787878 +0xffafafaf +0.850000 +0xff646464 + + + +0 +0xff323232 +0xff787878 +0xffafafaf +0.850000 +0xff646464 + + + +0 +0xffebcc0f +0xffc8c8c8 +0xffebebeb +1.000000 +0xff64719f + + + +Caret +Show + + +0 +false + + + +0 +false + + + +0 +true + + + +0 +true + + + +Border +Stroke.StrokeColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Opacity +Fill.FillColor + + +0 +0xff323232 +0xff787878 +0xffafafaf +0.850000 +0xff323232 + + + +0 +0xff323232 +0xff787878 +0xffafafaf +0.850000 +0xff323232 + + + +0 +0xff323232 +0xff787878 +0xffafafaf +0.850000 +0xff323232 + + + +0 +0xffebcc0f +0xffc8c8c8 +0xffebebeb +1.000000 +0xffebcc0f + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonFocus + + + +0 + + + + + + +0 + + + + + + +0 + + + + + + + + + +XuiEdit +250.000000 +32.000000 + + + +Border +256.000000 +38.000000 +-3.000000,-3.000000,0.000000 +0.850000 +15 + + +0xff323232 + + + + +0xff323232 + + +2 +0xff787878 +0xffafafaf +0.000000 +1.000000 + + +-90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,245.000000,0.000000,1,245.000000,0.000000,245.000000,0.000000,245.000000,50.000000,1,245.000000,50.000000,245.000000,50.000000,0.000000,50.000000,1,0.000000,50.000000,0.000000,50.000000,0.000000,0.000000,1, + + + + +Background +250.000000 +32.000000 +0.850000 +15 + + +0xff323232 + + + + +0xff646464 + + +2 +0xff787878 +0xffafafaf +0.000000 +1.000000 + + +-90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,245.000000,0.000000,1,245.000000,0.000000,245.000000,0.000000,245.000000,50.000000,1,245.000000,50.000000,245.000000,50.000000,0.000000,50.000000,1,0.000000,50.000000,0.000000,50.000000,0.000000,0.000000,1, + + + + +Text +240.000000 +25.000000 +6.000000,5.000000,0.000000 +15 +0xffebebeb + + + + +Caret +10.000000 +28.000000 +6.000000,2.000000,0.000000 +false + + + + +ScrollRight +26.000000 +22.000000 +250.000000,4.500000,0.000000 +14 +XuiScrollEndRight +3 + + + + +ScrollDown +32.000000 +22.000000 +214.000000,32.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +ScrollUp +32.000000 +22.000000 +214.000000,-22.000000,0.000000 +6 +XuiScrollEndUp + + + + +ScrollLeft +26.000000 +22.000000 +-26.000000,4.500000,0.000000 +11 +XuiScrollEndLeft +2 + + + + +XuiSoundXACT +36.000000 +31.000000 +97.000000,27.000000,0.000000 + + + + +XuiImage1 +255.666672 +38.111111 +-2.666667,-3.111111,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + +InitFocus + + + +EndInitFocus + +stop + + + +Background +Stroke.StrokeColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Opacity +Fill.FillColor + + +0 +0xff323232 +0xff787878 +0xffafafaf +0.850000 +0xff646464 + + + +0 +0xff323232 +0xff787878 +0xffafafaf +0.850000 +0xff646464 + + + +0 +0xff323232 +0xff787878 +0xffafafaf +0.850000 +0xff646464 + + + +0 +0xffebcc0f +0xffc8c8c8 +0xffebebeb +1.000000 +0xff64719f + + + +Caret +Show + + +0 +false + + + +0 +false + + + +0 +true + + + +0 +true + + + +Border +Stroke.StrokeColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Opacity +Fill.FillColor + + +0 +0xff323232 +0xff787878 +0xffafafaf +0.850000 +0xff323232 + + + +0 +0xff323232 +0xff787878 +0xffafafaf +0.850000 +0xff323232 + + + +0 +0xff323232 +0xff787878 +0xffafafaf +0.850000 +0xff323232 + + + +0 +0xffebcc0f +0xffc8c8c8 +0xffebebeb +1.000000 +0xffebcc0f + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonFocus + + + +0 + + + + + + +0 + + + + + + +0 + + + + + + + + + +XuiScrollEndRight +26.000000 +22.000000 +207 + + + +GlowArrow +26.000000 +22.000000 +0.300000 +15 +false +8 +Graphics\scrollRight.png + + + + +StdArrow +26.000000 +22.000000 +0.800000 +15 +false +8 +Graphics\scrollRight.png + + + + + +Normal + + + +EndNormal + +stop + + +ScrollMore + + + +EndScrollMore + +stop + + +Scrolling + + + +EndScrolling + +gotoandplay +Scrolling + + + +GlowArrow +Opacity + + +1 +0.300000 + + + +0 +0.250000 + + + +0 +1.000000 + + + +1 +0.250000 + + + +StdArrow +Show +Opacity + + +1 +false +0.800000 + + + +1 +true +0.800000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +1.000000 + + + + + + +XuiScrollEndUp +26.000000 +22.000000 +207 +[VisualClass]XuiScrollEnd[/VisualClass] + + + +GlowArrow +26.000000 +22.000000 +0.300000 +15 +false +8 +Graphics\scrollUp.png + + + + +StdArrow +32.000000 +22.000000 +0.800000 +15 +false +8 +Graphics\scrollUp.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +ScrollMore + + + +EndScrollMore + +stop + + +Scrolling + + + +EndScrolling + +gotoandplay +Scrolling + + + +StdArrow +Show +Opacity + + +1 +false +0.800000 + + + +1 +true +0.800000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +1.000000 + + + +GlowArrow +Opacity + + +1 +0.300000 + + + +0 +0.250000 + + + +0 +1.000000 + + + +1 +0.250000 + + + + + + +XuiScrollEndLeft +26.000000 +22.000000 +207 + + + +GlowArrow +26.000000 +22.000000 +0.300000 +15 +false +8 +Graphics\scrollLeft.png + + + + +StdArrow +26.000000 +22.000000 +0.800000 +15 +false +8 +Graphics\scrollLeft.png + + + + + +Normal + + + +EndNormal + +stop + + +ScrollMore + + + +EndScrollMore + +stop + + +Scrolling + + + +EndScrolling + +gotoandplay +Scrolling + + + +GlowArrow +Opacity + + +1 +0.300000 + + + +0 +0.250000 + + + +0 +1.000000 + + + +1 +0.250000 + + + +StdArrow +Show +Opacity + + +1 +false +0.800000 + + + +1 +true +0.800000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +1.000000 + + + + + + +XuiScrollEnd +26.000000 +22.000000 +207 + + + +GlowArrow +32.000000 +22.000000 +0.300000 +15 +false +8 + + + + +StdArrow +32.000000 +22.000000 +0.800000 +15 +false +8 +Graphics\scrollDown.png + + + + + +Normal + + + +EndNormal + +stop + + +ScrollMore + + + +EndScrollMore + +stop + + +Scrolling + + + +EndScrolling + +gotoandplay +Scrolling + + + +GlowArrow +Opacity +ImagePath + + +1 +0.300000 + + + + +0 +0.250000 +scrollDown.png + + + +0 +1.000000 +scrollDown.png + + + +1 +0.250000 +scrollDown.png + + + +StdArrow +Show +Opacity + + +1 +false +0.800000 + + + +1 +true +0.800000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +1.000000 + + + + + + +XuiControl +100.000000 +100.000000 +3.000000,0.000000,0.000000 + + + + +XuiCaret +10.000000 +28.000000 + + + +Caret +10.000000 +2.000000 +0.000000,24.000000,0.000000 + + +0xffebebeb + + +true +4,0.000000,0.000000,0.000000,0.000000,15.000000,0.000000,1,15.000000,0.000000,15.000000,0.000000,15.000000,37.000000,1,15.000000,37.000000,15.000000,37.000000,0.000000,37.000000,1,0.000000,37.000000,0.000000,37.000000,0.000000,0.000000,1, + + + + + +Normal + + + +EndNormal + + + +Focus + + + +EndFocus + + + + +Caret +Show +Fill.FillColor + + +0 +true +0xffebebeb + + + +0 +false +0xff808080 + + + +0 +true +0xffafafaf + + + +0 +true +0xffafafaf + + + +0 +false +0xff808080 + + + +0 +true +0xffafafaf + + + + + + +XuiHtmlControl +50.000000 +50.000000 +15 + + + +HtmlPresenter +50.000000 +50.000000 +15 +true + + + + +ScrollDown +32.000000 +24.000000 +14.000000,56.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +ScrollUp +32.000000 +24.000000 +-16.000000,56.000000,0.000000 +12 +XuiScrollEndUp + + + + + +Normal + + + +EndNormal + +stop + + +ScrollMore + + + +EndScrollMore + +stop + + +Scrolling + + + +EndScrolling + +gotoandplay +Scrolling + + + + + + +XuiCheckbox +270.000000 +32.000000 + + + +text_Button +240.000000 +32.000000 +27.000000,1.000000,0.000000 +5 +0xff323232 +0xff0f0f0f +4112 + + + + +text_Button1 +240.000000 +32.000000 +26.000000,0.000000,0.000000 +5 +false +0xff323232 +0xff0f0f0f +4112 + + + + +TickBox_Norm +24.000000 +24.000000 +2.000000,4.000000,0.000000 +2 +Graphics\Tickbox_Norm.png +48 + + + + +TickBox_Over +24.000000 +24.000000 +2.000000,4.000000,0.000000 +false +2 +Graphics\Tickbox_Over.png +48 + + + + +Tick +28.000000 +24.000000 +2.000000,4.000000,0.000000 +false +Graphics\Tick.png +48 + + + + +XuiSoundXACT +15.000000 +14.000000 +70.000000,21.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + +NormalCheck + + + +EndNormalCheck + +stop + + +FocusCheck + + + +EndFocusCheck + +stop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +NormalCheckDisable + + + +EndNormalCheckDisable + +stop + + +FocusCheckDisable + + + +EndFocusCheckDisable + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +NormalSelCheck + + + +EndNormalSelCheck + +stop + + +NormalSelCheckDisable + + + +EndNormalSelCheckDisable + +stop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +TickBox_Over +Show +Opacity + + +0 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +false +0.500000 + + + +0 +false +0.500000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +0 +false +0.500000 + + + +0 +false +0.500000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +0 +false +0.500000 + + + +0 +false +0.500000 + + + +Tick +Show +Opacity + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +0 +false +0.500000 + + + +0 +false +0.500000 + + + +TickBox_Norm +Show +Opacity + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +0 +false +0.500000 + + + +0 +false +0.500000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +0 +false +0.500000 + + + +0 +false +0.500000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.500000 + + + +0 +true +0.500000 + + + +text_Button1 +TextColor +Opacity +DropShadowColor +Show + + +1 +0xff323232 +1.000000 +0xff0f0f0f +false + + + +1 +0xffebcc0f +1.000000 +0xff0f0f0f +true + + + +1 +0xff323232 +1.000000 +0xff0f0f0f +false + + + +1 +0xffebcc0f +1.000000 +0xff0f0f0f +true + + + +1 +0xff8c8c8c +0.500000 +0x7f0f0f0f +false + + + +1 +0xffebcc0f +0.500000 +0x7f0f0f0f +true + + + +1 +0xff323232 +0.500000 +0x7e0f0f0f +false + + + +1 +0xffebcc0f +0.500000 +0x7f0f0f0f +true + + + +1 +0xff323232 +1.000000 +0xff0f0f0f +false + + + +1 +0xff323232 +1.000000 +0xff0f0f0f +false + + + +0 +0xff323232 +1.000000 +0x7b0f0f0f +false + + + +0 +0xff8c8c8c +1.000000 +0x7b0f0f0f +false + + + +0 +0xff8c8c8c +1.000000 +0x7b0f0f0f +false + + + +0 +0xff8c8c8c +1.000000 +0x7b0f0f0f +false + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonFocus + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonFocus + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +text_Button +Opacity + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + + + + +XuiButton +400.000000 +40.000000 +15 + + + +highlight_graphic +400.000000 +40.000000 +15 +false +Graphics\MainMenuButton_Over.png + + + + +button_graphic +400.000000 +40.000000 +15 +Graphics\MainMenuButton_Norm.png + + + + +text_Label +380.000000 +28.000000 +10.000000,6.000000,0.000000 +15 +0xffebebeb +0xff0f0f0f +16.000000 +21525 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +1 +true +0.250000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +false + + + +0 +1.000000 +false + + + +0 +1.000000 +false + + + +1 +1.000000 +false + + + +0 +0.000000 +false + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +text_Label +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffa0a0a0 + + + +0 +0xffa0a0a0 + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb80 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + + + + +XuiVisualImagePresenterCentre +48.000000 +48.000000 + + + +XuiImagePresenter +48.000000 +48.000000 +15 +16 +48 + + + + + +XuiVisImPresenterCentreNoScale +48.000000 +48.000000 + + + +XuiImagePresenter +48.000000 +48.000000 +15 +2 +48 + + + + + +PlayerColourIcon +40.000000 +40.000000 +15 + + + +Icon +40.000000 +40.000000 +15 +true +16 +Graphics\InGameInfo\MapIcon_0.png +48 + + + + + +P0 + +stop + + +P1 + +stop + + +P2 + +stop + + +P3 + +stop + + +P4 + +stop + + +P5 + +stop + + +P6 + +stop + + +P7 + +stop + + +P8 + +stop + + +P9 + +stop + + +P10 + +stop + + +P11 + +stop + + +P12 + +stop + + +P13 + +stop + + +P14 + +stop + + +P15 + +stop + + + +Icon +ImagePath + + +0 +Graphics\InGameInfo\MapIcon_0.png + + + +0 +Graphics\InGameInfo\MapIcon_1.png + + + +0 +Graphics\InGameInfo\MapIcon_2.png + + + +0 +Graphics\InGameInfo\MapIcon_3.png + + + +0 +Graphics\InGameInfo\MapIcon_4.png + + + +0 +Graphics\InGameInfo\MapIcon_5.png + + + +0 +Graphics\InGameInfo\MapIcon_6.png + + + +0 +Graphics\InGameInfo\MapIcon_7.png + + + +0 +Graphics\InGameInfo\MapIcon_8.png + + + +0 +Graphics\InGameInfo\MapIcon_9.png + + + +0 +Graphics\InGameInfo\MapIcon_10.png + + + +0 +Graphics\InGameInfo\MapIcon_11.png + + + +0 +Graphics\InGameInfo\MapIcon_12.png + + + +0 +Graphics\InGameInfo\MapIcon_13.png + + + +0 +Graphics\InGameInfo\MapIcon_14.png + + + +0 +Graphics\InGameInfo\MapIcon_15.png + + + + + + +DLCOffersOfferBackground +460.000000 +196.000000 + + + +XuiIDLCBackground +460.000000 +196.000000 +15 +4 +Graphics\DLCBackground.png + + + + + +ControllerGraphic +400.000000 +270.000000 + + + +Image +400.000000 +270.000000 +Graphics\X360ControllerIcons\360ctrl.png +48 + + + + + +MenuTitleLogo +571.000000 +138.000000 + + + +Logo +571.000000 +138.000000 +15 +16 +Graphics\MenuTitle.png + + + + + +TipPanel +214.000000 +42.000000 + + + +graphic_groupbackground +216.000000 +44.000000 +15 + + + +Bot_R +8.000000 +8.000000 +208.000000,36.000000,0.000000 +12 +Graphics\PanelsAndTabs\PointerTextPanel_BR.png +48 + + + + +Bot_M +200.000000 +8.000000 +8.000000,36.000000,0.000000 +13 +4 +Graphics\PanelsAndTabs\PointerTextPanel_BM.png +48 + + + + +Bot_L +8.000000 +8.000000 +0.000000,36.000000,0.000000 +9 +Graphics\PanelsAndTabs\PointerTextPanel_BL.png +48 + + + + +Top_R +8.000000 +8.000000 +208.000000,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\PointerTextPanel_TR.png +48 + + + + +Top_M +200.000000 +8.000000 +8.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\PointerTextPanel_TM.png +48 + + + + +Top_L +8.000000 +8.000000 +3 +Graphics\PanelsAndTabs\PointerTextPanel_TL.png +48 + + + + +Mid_R +8.000000 +28.000000 +208.000000,8.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MR.png +48 + + + + +Mid_M +200.000000 +28.000000 +8.000000,8.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MM.png +48 + + + + +Mid_L +8.000000 +28.000000 +0.000000,8.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\PointerTextPanel_ML.png +48 + + + + + +HtmlPresenter +195.000000 +26.000000 +10.000000,8.000000,0.000000 +15 + + + + + +QuadrantJoinGame +304.000000 +88.000000 +15 + + + +graphic_groupbackground +304.000000 +88.000000 +15 + + + +Bot_R +16.000000 +16.000000 +288.000000,72.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +272.000000 +16.000000 +16.000000,72.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,72.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +288.000000,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +272.000000 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +56.000000 +288.000000,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +272.000000 +56.000000 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +56.000000 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + +Mid +292.000000 +76.000000 +6.000000,6.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +MidDark +292.000000 +76.000000 +6.000000,6.000000,0.000000 +0.400000 +15 + + +0xff0f0f80 + + + + +0xff0f0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,127.000000,0.000000,0,127.000000,0.000000,127.000000,0.000000,127.000000,72.000000,0,127.000000,72.000000,127.000000,72.000000,0.000000,72.000000,0,0.000000,72.000000,0.000000,72.000000,0.000000,0.000000,0, + + + + + +QuadrantBox +68.000000 +68.000000 +10.000000,10.000000,0.000000 +1 +Graphics\Controller_Message_Frame_L.png +48 + + + + +text_ButtonText +200.000000 +85.000000,28.000000,0.000000 +5 +0xffffffff +0xff000000 +16.000000 +20753 + + + + +Empty_Quadrants +64.000000 +64.000000 +12.000000,12.000000,0.000000 +0.800000 +16 +Graphics\Controller_Quadrant_Icon_Empty.png +48 + + + + +Quadrant1 +64.000000 +64.000000 +12.000000,12.000000,0.000000 +0.800000 +false +16 +Graphics\Controller_Quadrant_Icon_Segment.png +48 + + + + +Quadrant2 +64.000000 +64.000000 +12.000000,12.000000,0.000000 +-1.000000,1.000000,1.000000 +0.800000 +32.000000,32.000000,0.000000 +false +16 +Graphics\Controller_Quadrant_Icon_Segment.png +48 + + + + +Quadrant3 +64.000000 +64.000000 +12.000000,12.000000,0.000000 +1.000000,-1.000000,1.000000 +0.800000 +32.000000,32.000000,0.000000 +false +16 +Graphics\Controller_Quadrant_Icon_Segment.png +48 + + + + +Quadrant4 +64.000000 +64.000000 +12.000000,12.000000,0.000000 +-1.000000,-1.000000,1.000000 +0.800000 +32.000000,32.000000,0.000000 +false +16 +Graphics\Controller_Quadrant_Icon_Segment.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +StartFlash + + + +EndFlash + +gotoandplay +StartFlash + + + +Empty_Quadrants +Opacity + + +1 +0.800000 + + + +1 +1.000000 + + + +Quadrant1 +Opacity + + +1 +0.800000 + + + +0 +0.000000 + + + +0 +1.000000 + + + +0 +0.000000 + + + +Quadrant2 +Opacity + + +1 +0.800000 + + + +0 +0.000000 + + + +0 +1.000000 + + + +0 +0.000000 + + + +Quadrant3 +Opacity + + +1 +0.800000 + + + +0 +0.000000 + + + +0 +1.000000 + + + +0 +0.000000 + + + +Quadrant4 +Opacity + + +1 +0.800000 + + + +0 +0.000000 + + + +0 +1.000000 + + + +0 +0.000000 + + + + + + +SaveIcon +48.000000 +73.000000 + + + +ProgressBody +48.000000 +73.000000 +15 + + + +Chest +48.000000 +48.000000 +0.000000,25.000000,0.000000 +2 +Graphics\SaveChest.png +48 + + + + +Arrow +48.000000 +48.000000 +Graphics\SaveArrow.png +48 + + + + +Arrow +Position + + +0 +0.000000,0.000000,0.000000 + + + +0 +0.000000,5.000000,0.000000 + + + +0 +0.000000,0.000000,0.000000 + + + + + + + +XuiSliderWrapper +306.000000 +38.000000 +5 + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +XuiEditSign +250.000000 +32.000000 + + + +Text +240.000000 +6.000000,1.000000,0.000000 +15 +0xff0f0f0f +18.000000 +5136 + + + + +Right +25.000000 +25.000000 +221.000000,2.000000,0.000000 +4 +false +< +0xff0f0f0f +0x800f0f0f +20.000000 +4624 + + + + +Left +25.000000 +25.000000 +4.000000,2.000000,0.000000 +1 +false +> +0xff0f0f0f +0x800f0f0f +20.000000 +4112 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +gotoandplay +Focus + + +InitFocus + + + +EndInitFocus + +gotoandplay +InitFocus + + + +Right +Show + + +0 +false + + + +0 +false + + + +0 +true + + + +0 +false + + + +0 +true + + + +0 +true + + + +0 +false + + + +0 +true + + + +Left +Show + + +0 +false + + + +0 +false + + + +0 +true + + + +0 +false + + + +0 +true + + + +0 +true + + + +0 +false + + + +0 +true + + + + + + +DebugButton +469.000000 +40.000000 +15 + + + +highlight_graphic +469.000000 +40.000000 +15 +false +Graphics\ListButton_Over.png + + + + +button_graphic +469.000000 +40.000000 +15 +Graphics\ListButton_Norm.png + + + + +text_Label +469.000000 +40.000000 +15 +0xffffffff +0xff0f0f0f +20.000000 +21525 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.250000 + + + +0 +true +0.000000 + + + +0 +true +0.250000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.250000 + + + +0 +true +0.000000 + + + +0 +true +0.250000 + + + +1 +false +1.000000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +false + + + +1 +1.000000 +false + + + +0 +1.000000 +false + + + +0 +1.000000 +false + + + +1 +1.000000 +false + + + +0 +0.000000 +false + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +false + + + +1 +1.000000 +false + + + + + + +LoadingProgressState +150.000000 +5.000000 + + + +ProgressBody +150.000000 +5.000000 +15 + + + +barStroke +152.000000 +7.000000 +-1.000000,-1.000000,0.000000 +15 +false + + +0xffa0a0a0 + + + + +0xff4b4b4b + + +2 +0xff00eb00 +0xff0f0f0f +0.992157 +0.992157 + + + + +true +4,0.000000,0.000000,0.000000,0.000000,170.000000,0.000000,0,170.000000,0.000000,170.000000,0.000000,170.000000,19.000000,0,170.000000,19.000000,170.000000,19.000000,0.000000,19.000000,0,0.000000,19.000000,0.000000,19.000000,0.000000,0.000000,0, + + + + +back +150.000000 +5.000000 +15 +false + + +0xffa0a0a0 + + + + +0xff828282 + + +2 +0xff00eb00 +0xff0f0f0f +0.992157 +0.992157 + + + + +true +4,0.000000,0.000000,0.000000,0.000000,170.000000,0.000000,0,170.000000,0.000000,170.000000,0.000000,170.000000,19.000000,0,170.000000,19.000000,170.000000,19.000000,0.000000,19.000000,0,0.000000,19.000000,0.000000,19.000000,0.000000,0.000000,0, + + + + +design_time_display +150.000000 +5.000000 +15 +false +true + + +1.000000 +0xff646464 + + + + +2 +0xffffffff + + +2 +0xffebebeb +0xff7d7d7d +0.000000 +0.000000 + + + + +true +4,0.000000,0.000000,0.000000,0.000000,170.000000,0.000000,0,170.000000,0.000000,170.000000,0.000000,170.000000,19.000000,0,170.000000,19.000000,170.000000,19.000000,0.000000,19.000000,0,0.000000,19.000000,0.000000,19.000000,0.000000,0.000000,0, + + + + +bar +150.000000 +5.000000 +15 +false + + +0xff646464 + + + + +0xffffffff + + +2 +0xff00eb00 +0xff0f0f0f +0.992157 +0.992157 + + + + +true +4,0.000000,0.000000,0.000000,0.000000,170.000000,0.000000,0,170.000000,0.000000,170.000000,0.000000,170.000000,19.000000,0,170.000000,19.000000,170.000000,19.000000,0.000000,19.000000,0,0.000000,19.000000,0.000000,19.000000,0.000000,0.000000,0, + + + + +bar +Fill.Gradient.StopPos +Show +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.FillColor +Width + + +0 +0.992157 +false +0xff00eb00 +0xff646464 +0.992157 +0xff0f0f0f +0xffffffff +150.000000 + + + +0 +0.372549 +true +0xff808080 +0xffebebeb +0.780392 +0xff80ff80 +0xff0fb90f +0.000000 + + + +0 +0.917647 +true +0xff80ff80 +0xff0f0f0f +0.925490 +0xff808080 +0xff0fb90f +150.000000 + + + +0 +0.015686 +false +0xff0feb13 +0xff646464 +0.992157 +0xff0f0f0f +0xffffffff +150.000000 + + + +back +Show + + +0 +false + + + +0 +true + + + +0 +true + + + +0 +false + + + +barStroke +Show + + +0 +false + + + +0 +true + + + +0 +true + + + +0 +false + + + + + + +control_for_data_binding_only +155.000000 +23.000000 +0.000000,8.185186,0.000000 +13 +0xff323232 +13.000000 +5136 + + + + + +Normal + + + +EndNormal + + + + + + + +XuiLabelAffordableSmall +640.000000 +5 + + + +Text +640.000000 +5 +0xff80eb20 +0xff0f340f +12.000000 +529 + + + + + +XuiLabelExpensiveSmall +640.000000 +5 + + + +Text +640.000000 +15 +0xffeb0f0f +0xff420f0f +12.000000 +529 + + + + + +XuiLabelAffordable +640.000000 +5 + + + +Text +640.000000 +15 +0xff80eb20 +0xff0f340f +18.000000 +529 + + + + + +XuiLabelExpensive +640.000000 +5 + + + +Text +640.000000 +15 +0xffeb0f0f +0xff420f0f +18.000000 +529 + + + + + +LabelLeaderboardTitle +200.000000 + + + +Text +200.000000 +15 +0xffebebeb +0xff0f0f0f +12.000000 +5137 + + + + + +LabelLeaderboardTitleSmall +200.000000 + + + +Text +200.000000 +15 +0xffebebeb +0xff0f0f0f +11.000000 +5120 + + + + + +LabelLeaderboardWaitingText +200.000000 + + + +Text +200.000000 +15 +0xff606060 +0xff0f0f0f +18.000000 +5120 + + + + + +LabelLeaderboardWaitingTextSmall +200.000000 + + + +Text +200.000000 +15 +0xff606060 +0xff0f0f0f +5120 + + + + + +LabelControlsSceneActionSmall +200.000000 + + + +Text +200.000000 +15 +0xffebebeb +0xff0f0f0f +10.000000 +273 + + + + + +LabelControlsSceneAction +200.000000 + + + +Text +200.000000 +15 +0xffebebeb +0xff0f0f0f +273 + + + + + +LabelContainerSceneRightSmall +200.000000 + + + +Text +200.000000 +15 +0xff323232 +12.000000 +528 + + + + + +LabelContainerSceneCentreSmall +200.000000 + + + +Text +200.000000 +15 +0xff323232 +12.000000 +1040 + + + + + +LabelContainerSceneLeftSmall +200.000000 + + + +Text +200.000000 +15 +0xff323232 +12.000000 +272 + + + + + +LabelContainerSceneRight +200.000000 + + + +Text +200.000000 +15 +0xff323232 +18.000000 +528 + + + + + +LabelContainerSceneCentre +200.000000 + + + +Text +200.000000 +15 +0xff323232 +18.000000 +1040 + + + + + +LabelContainerSceneLeft +200.000000 + + + +Text +200.000000 +15 +0xff323232 +18.000000 +272 + + + + + +XuiTitleSmall +400.000000 +50.000000 + + + +Text1 +400.000000 +50.000000 +1.000000,1.000000,0.000000 +15 +0xff0f0f0f +0xff0f0f0f +20.000000 +21505 + + + + +Text2 +400.000000 +50.000000 +-1.000000,1.000000,0.000000 +15 +0xff0f0f0f +20.000000 +21505 + + + + +Text3 +400.000000 +50.000000 +1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +20.000000 +21505 + + + + +Text4 +400.000000 +50.000000 +-1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +20.000000 +21504 + + + + +Text +400.000000 +50.000000 +15 +0xffebebeb +20.000000 +21504 + + + + + +XuiTitle +400.000000 +100.000000 + + + +Text1 +400.000000 +100.000000 +2.000000,2.000000,0.000000 +15 +0xff0f0f0f +0xff0f0f0f +32.000000 +21504 + + + + +Text2 +400.000000 +100.000000 +-2.000000,2.000000,0.000000 +15 +0xff0f0f0f +32.000000 +21504 + + + + +Text3 +400.000000 +100.000000 +2.000000,-2.000000,0.000000 +15 +0xff0f0f0f +32.000000 +21504 + + + + +Text4 +400.000000 +100.000000 +-2.000000,-2.000000,0.000000 +15 +0xff0f0f0f +32.000000 +21504 + + + + +Text5 +400.000000 +100.000000 +2.000000,0.000000,0.000000 +15 +0xff0f0f0f +0xff0f0f0f +32.000000 +21504 + + + + +Text6 +400.000000 +100.000000 +-2.000000,0.000000,0.000000 +15 +0xff0f0f0f +32.000000 +21504 + + + + +Text7 +400.000000 +100.000000 +0.000000,-2.000000,0.000000 +15 +0xff0f0f0f +32.000000 +21504 + + + + +Text8 +400.000000 +100.000000 +0.000000,2.000000,0.000000 +15 +0xff0f0f0f +32.000000 +21504 + + + + +Text +400.000000 +100.000000 +15 +0xffebebeb +32.000000 +21504 + + + + + +XuiLabel +320.000000 +32.000000 + + + +Text +320.000000 +40.000000 +15 +0xffebebeb +12.000000 +16400 + + + + + +XuiLabel12_Shadowed +320.000000 +32.000000 +1.000000,1.000000,0.000000 + + + +Text +320.000000 +40.000000 +1.000000,0.000000,0.000000 +15 +0xffebebeb +12.000000 +20737 + + + + + +XuiLabelLightFaded_C_ShadowedSmall +400.000000 +140.000000 +5.000000,3.000000,0.000000 + + + +XuiTextPresenter1 +400.000000 +140.000000 +15 +0xffcfcfcf +0xff6d6d6d +17425 + + + + + +XuiLabelLight_C_ShadowedSmall +400.000000 +140.000000 +5.000000,3.000000,0.000000 + + + +XuiTextPresenter1 +400.000000 +140.000000 +15 +0xffffffff +0xff000000 +17425 + + + + + +XuiLabelChat +640.000000 +35.000000 + + + +Text +640.000000 +35.000000 +15 +0xffebebeb +0xff0f0f0f +20.000000 +16656 + + + + + +XuiLabelChat_Small +640.000000 +20.000000 +5 + + + +Text +640.000000 +20.000000 +15 +0xffebebeb +0xff0f0f0f +13.000000 +16656 + + + + + +XuiLabelChatBackground +100.000000 +20.000000 +15 + + + +100.000000 +20.000000 +0.500000 +15 + + +0xff0f0f80 + + + + +0xff0f0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,979.000000,0.000000,0,979.000000,0.000000,979.000000,0.000000,979.000000,97.000000,0,979.000000,97.000000,979.000000,97.000000,0.000000,97.000000,0,0.000000,97.000000,0.000000,97.000000,0.000000,0.000000,0, + + + + + +XuiLabelListening +640.000000 +20.000000 +15 + + + +Text +640.000000 +35.000000 +15 +0xffebebeb +0xff0f0f0f +20.000000 +17424 + + + + + +XuiLabelListening_Small +640.000000 +20.000000 +5 + + + +Text +640.000000 +20.000000 +15 +0xffebebeb +0xff0f0f0f +13.000000 +17424 + + + + + +XuiLabelLight_FRONT_END_Shd_Wrp_Small +400.000000 +140.000000 + + + +XuiTextPresenter1 +400.000000 +140.000000 +15 +0xffffffff +0xff000000 +16385 + + + + + +XuiLabelLight_FRONT_END_Shd_Wrp +400.000000 +140.000000 + + + +XuiTextPresenter1 +400.000000 +140.000000 +15 +0xffffffff +0xff000000 +18.000000 +16385 + + + + + +XuiLabelLight_ShadowedSmall +400.000000 +140.000000 + + + +XuiTextPresenter1 +400.000000 +140.000000 +15 +0xffffffff +0xff000000 +16401 + + + + + +XuiLabelLight_Shadowed +400.000000 +140.000000 + + + +XuiTextPresenter1 +400.000000 +140.000000 +15 +0xffffffff +0xff000000 +18.000000 +16401 + + + + + +XuiLabelLightFaded_ShadowCentred +400.000000 +140.000000 + + + +XuiTextPresenter1 +400.000000 +140.000000 +15 +0xffcfcfcf +0xff6d6d6d +18.000000 +21521 + + + + + +XuiLabelLight_ShadowCentred +400.000000 +140.000000 + + + +XuiTextPresenter1 +400.000000 +140.000000 +15 +0xffffffff +0xff000000 +18.000000 +21521 + + + + + +XuiLabelLight_ShadowedRight +400.000000 +140.000000 + + + +XuiTextPresenter1 +400.000000 +140.000000 +15 +0xffffffff +0xff000000 +18.000000 +16913 + + + + + +XuiLabelLightCentred +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xffebebeb +17424 + + + + + +XuiLabelDarkCentred +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +5.000000,0.000000,0.000000 +15 +0xff323232 +17424 + + + + + +XuiLabelDarkLeftWrap +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +16640 + + + + + +XuiLabelDarkCentredWrapSmall +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +12.000000 +17408 + + + + + +XuiLabelDarkLeftWrapSmall +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +12.000000 +16640 + + + + + +XuiLabelDarkSmallRight +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +12.000000 +16896 + + + + + +XuiLabelDarkCentredSmall +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +12.000000 +5136 + + + + + +XuiLabelDarkSmall +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +12.000000 +16384 + + + + + +XuiLabelDark +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +16384 + + + + + +XuiLabelDarkRight +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +16912 + + + + + +XuiLabelDarkCentredHowtoSmall +404.000000 +180.000000 +1.000000,1.000000,0.000000 + + + +Text +404.000000 +180.000000 +15 +0xff323232 +8.000000 +5136 + + + + + +XuiLabelDark14_1Line +400.000000 +26.000000 + + + +Text +400.000000 +26.000000 +15 +0xff323232 +16400 + + + + + +XuiLabelDarkLeftWrapSmall10 +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +10.000000 +16640 + + + + + +XuiLabelDarkLeftWrapSmall8 +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +8.000000 +16640 + + + + + +XuiLabelDarkLeftWrap16 +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +16.000000 +16640 + + + + + +XuiLabelDarkLeftWrap18 +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +18.000000 +16640 + + + + + +XuiLabelDarkCentredWrap +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +17408 + + + + + +XuiLabelDesc_LftWrp_Small +640.000000 +20.000000 +5 + + + +Text +640.000000 +20.000000 +15 +0xffebebeb +0xff0f0f0f +13.000000 +16640 + + + + + +XuiLabelDesc_LftWrp +640.000000 +35.000000 + + + +Text +640.000000 +35.000000 +15 +0xffebebeb +0xff0f0f0f +16.000000 +16640 + + + + + +XuiCreditsText_480_S +400.000000 +100.000000 + + + +Text1 +400.000000 +100.000000 +1.000000,1.000000,0.000000 +15 +0xff0f0f0f +0xff0f0f0f +15.000000 +5136 + + + + +Text2 +400.000000 +100.000000 +-1.000000,1.000000,0.000000 +15 +0xff0f0f0f +15.000000 +5136 + + + + +Text3 +400.000000 +100.000000 +1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +15.000000 +5136 + + + + +Text4 +400.000000 +100.000000 +-1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +15.000000 +5136 + + + + +Text +400.000000 +100.000000 +15 +0xffead44d +15.000000 +5136 + + + + + +XuiCreditsText_480_M +400.000000 +100.000000 + + + +Text1 +400.000000 +100.000000 +1.000000,1.000000,0.000000 +15 +0xff0f0f0f +0xff0f0f0f +16.000000 +5136 + + + + +Text2 +400.000000 +100.000000 +-1.000000,1.000000,0.000000 +15 +0xff0f0f0f +16.000000 +5136 + + + + +Text3 +400.000000 +100.000000 +1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +16.000000 +5136 + + + + +Text4 +400.000000 +100.000000 +-1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +16.000000 +5136 + + + + +Text +400.000000 +100.000000 +15 +0xffebebeb +16.000000 +5136 + + + + + +XuiCreditsText_480_14_L +400.000000 +100.000000 + + + +Text1 +400.000000 +100.000000 +1.000000,1.000000,0.000000 +15 +0xff0f0f0f +0xff0f0f0f +5136 + + + + +Text2 +400.000000 +100.000000 +-1.000000,1.000000,0.000000 +15 +0xff0f0f0f +5136 + + + + +Text3 +400.000000 +100.000000 +1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +5136 + + + + +Text4 +400.000000 +100.000000 +-1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +5136 + + + + +Text +400.000000 +100.000000 +15 +0xffebebeb +5136 + + + + + +XuiCreditsText_480_20_XL +400.000000 +100.000000 + + + +Text1 +400.000000 +100.000000 +1.000000,1.000000,0.000000 +15 +0xff0f0f0f +0xff0f0f0f +18.000000 +5136 + + + + +Text2 +400.000000 +100.000000 +-1.000000,1.000000,0.000000 +15 +0xff0f0f0f +18.000000 +5136 + + + + +Text3 +400.000000 +100.000000 +1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +18.000000 +5136 + + + + +Text4 +400.000000 +100.000000 +-1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +18.000000 +5136 + + + + +Text +400.000000 +100.000000 +15 +0xffebebeb +18.000000 +5136 + + + + + +XuiCreditsText_S +400.000000 +100.000000 + + + +Text1 +400.000000 +100.000000 +1.000000,1.000000,0.000000 +15 +0xff0f0f0f +0xff0f0f0f +17.000000 +5136 + + + + +Text2 +400.000000 +100.000000 +-1.000000,1.000000,0.000000 +15 +0xff0f0f0f +17.000000 +5136 + + + + +Text3 +400.000000 +100.000000 +1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +17.000000 +5136 + + + + +Text4 +400.000000 +100.000000 +-1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +17.000000 +5136 + + + + +Text +400.000000 +100.000000 +15 +0xffead44d +17.000000 +5136 + + + + + +XuiCreditsText_M +400.000000 +100.000000 + + + +Text1 +400.000000 +100.000000 +1.000000,1.000000,0.000000 +15 +0xff0f0f0f +0xff0f0f0f +18.000000 +5136 + + + + +Text2 +400.000000 +100.000000 +-1.000000,1.000000,0.000000 +15 +0xff0f0f0f +18.000000 +5136 + + + + +Text3 +400.000000 +100.000000 +1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +18.000000 +5136 + + + + +Text4 +400.000000 +100.000000 +-1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +18.000000 +5136 + + + + +Text +400.000000 +100.000000 +15 +0xffebebeb +18.000000 +5136 + + + + + +XuiCreditsText_L +400.000000 +100.000000 + + + +Text1 +400.000000 +100.000000 +1.000000,1.000000,0.000000 +15 +0xff0f0f0f +0xff0f0f0f +16.000000 +5136 + + + + +Text2 +400.000000 +100.000000 +-1.000000,1.000000,0.000000 +15 +0xff0f0f0f +16.000000 +5136 + + + + +Text3 +400.000000 +100.000000 +1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +16.000000 +5136 + + + + +Text4 +400.000000 +100.000000 +-1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +16.000000 +5136 + + + + +Text +400.000000 +100.000000 +15 +0xffebebeb +16.000000 +5136 + + + + + +XuiCreditsText_XL +400.000000 +100.000000 + + + +Text1 +400.000000 +100.000000 +1.000000,1.000000,0.000000 +15 +0xff0f0f0f +0xff0f0f0f +22.000000 +5136 + + + + +Text2 +400.000000 +100.000000 +-1.000000,1.000000,0.000000 +15 +0xff0f0f0f +22.000000 +5136 + + + + +Text3 +400.000000 +100.000000 +1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +22.000000 +5136 + + + + +Text4 +400.000000 +100.000000 +-1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +22.000000 +5136 + + + + +Text +400.000000 +100.000000 +15 +0xffebebeb +22.000000 +5136 + + + + + +LB_Button +350.000000 +36.000000 + + + +text_ButtonText +300.000000 +36.000000 +52.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +16.000000 +20497 + + + + +lb_graphic +49.000000 +45.000000 +0.000000,-3.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonLeftBumper_TT.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + +lb_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +1.500000,1.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + + + + +LB_ButtonSmall +350.000000 +25.000000 + + + +text_ButtonText +300.000000 +25.000000 +40.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +11.000000 +20497 + + + + +lb_graphic +37.000000 +34.000000 +0.000000,-3.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonLeftBumper_TT.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + +lb_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +1.500000,1.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + + + + +RB_Button +350.000000 +36.000000 + + + +text_ButtonText +300.000000 +36.000000 +52.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +16.000000 +20497 + + + + +rb_graphic +49.000000 +45.000000 +0.000000,-3.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonRightBumper_TT.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + +rb_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +1.500000,1.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + + + + +RB_ButtonSmall +350.000000 +25.000000 + + + +text_ButtonText +300.000000 +25.000000 +40.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +11.000000 +20497 + + + + +rb_graphic +37.000000 +34.000000 +0.000000,-3.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonRightBumper_TT.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + +rb_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +1.500000,1.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + + + + +Y_Button +350.000000 +36.000000 + + + +graphic_button_disable +33.000000 +33.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Disable.png + + + + +graphic_button_focus +33.000000 +33.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Yello_Focus.png + + + + +graphic_button_normal +33.000000 +33.000000 +8 +Graphics\X360ControllerIcons\Legend_Button_Yello_Normal.png + + + + +text_ButtonText +300.000000 +36.000000 +36.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +16.000000 +20497 + + + + +y_graphic +15.000000 +15.000000 +9.460000,9.500000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\y_graphic.png + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +y_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +9.460000,9.500000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +9.460000,9.500000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +9.460000,9.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +9.460000,9.500000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +9.460000,9.500000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +10.500000,13.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +9.460000,9.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +9.460000,9.500000,0.000000 + + + +graphic_button_normal +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +0.000000 +false + + + +graphic_button_focus +Show +Opacity + + +1 +false +1.000000 + + + +1 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +1 +true +1.000000 + + + +0 +false +0.000000 + + + +graphic_button_disable +Show + + +1 +false + + + +1 +true + + + +0 +false + + + +1 +true + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + + + + +Y_ButtonSmall +350.000000 +25.000000 + + + +graphic_button_disable +25.000000 +25.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Disable.png + + + + +graphic_button_focus +25.000000 +25.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Yello_Focus.png + + + + +graphic_button_normal +25.000000 +25.000000 +8 +Graphics\X360ControllerIcons\Legend_Button_Yello_Normal.png + + + + +text_ButtonText +300.000000 +25.000000 +25.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +11.000000 +20497 + + + + +y_graphic +11.000000 +11.000000 +7.460000,7.500000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\y_graphic.png + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +y_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +7.460000,7.500000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +7.460000,7.500000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +7.460000,7.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +7.460000,7.500000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +7.460000,7.500000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +8.500000,11.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +7.460000,7.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +7.460000,7.500000,0.000000 + + + +graphic_button_normal +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +0.000000 +false + + + +graphic_button_focus +Show +Opacity + + +1 +false +1.000000 + + + +1 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +1 +true +1.000000 + + + +0 +false +0.000000 + + + +graphic_button_disable +Show + + +1 +false + + + +1 +true + + + +0 +false + + + +1 +true + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + + + + +X_Button +350.000000 +36.000000 + + + +graphic_button_disable +33.000000 +33.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Disable.png + + + + +graphic_button_focus +33.000000 +33.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Blu_Focus.png + + + + +graphic_button_normal +33.000000 +33.000000 +8 +Graphics\X360ControllerIcons\Legend_Button_Blu_Normal.png + + + + +text_ButtonText +300.000000 +36.000000 +36.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +16.000000 +20497 + + + + +x_graphic +15.000000 +15.000000 +9.600000,9.500000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\x_graphic.png + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +x_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +9.600000,9.500000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +9.600000,9.500000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +9.600000,9.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +9.600000,9.500000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +9.600000,9.500000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +10.500000,12.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +9.600000,9.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +9.600000,9.500000,0.000000 + + + +graphic_button_normal +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +0.000000 +false + + + +graphic_button_focus +Show +Opacity + + +1 +false +1.000000 + + + +1 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +1 +true +1.000000 + + + +0 +false +0.000000 + + + +graphic_button_disable +Show + + +1 +false + + + +1 +true + + + +1 +false + + + +1 +true + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + + + + +X_ButtonSmall +350.000000 +25.000000 + + + +graphic_button_disable +25.000000 +25.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Disable.png + + + + +graphic_button_focus +25.000000 +25.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Blu_Focus.png + + + + +graphic_button_normal +25.000000 +25.000000 +8 +Graphics\X360ControllerIcons\Legend_Button_Blu_Normal.png + + + + +text_ButtonText +300.000000 +25.000000 +28.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +11.000000 +20497 + + + + +x_graphic +11.000000 +11.000000 +7.600000,7.500000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\x_graphic.png + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +x_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +7.600000,7.500000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +7.600000,7.500000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +7.600000,7.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +7.600000,7.500000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +7.600000,7.500000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +8.500000,10.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +7.600000,7.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +7.600000,7.500000,0.000000 + + + +graphic_button_normal +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +0.000000 +false + + + +graphic_button_focus +Show +Opacity + + +1 +false +1.000000 + + + +1 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +1 +true +1.000000 + + + +0 +false +0.000000 + + + +graphic_button_disable +Show + + +1 +false + + + +1 +true + + + +1 +false + + + +1 +true + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + + + + +B_Button +350.000000 +36.000000 + + + +graphic_button_disable +33.000000 +33.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Disable.png + + + + +graphic_button_focus +33.000000 +33.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Red_Focus.png + + + + +graphic_button_normal +33.000000 +33.000000 +8 +Graphics\X360ControllerIcons\Legend_Button_Red_Normal.png + + + + +text_ButtonText +300.000000 +36.000000 +36.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +16.000000 +20497 + + + + +B_graphic +15.000000 +15.000000 +9.500000,9.500000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\b_graphic.png + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocus + +stop + + + +B_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +10.500000,12.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +graphic_button_normal +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +0.000000 +false + + + +graphic_button_focus +Show + + +1 +false + + + +1 +true + + + +0 +true + + + +1 +false + + + +1 +true + + + +1 +false + + + +graphic_button_disable +Show + + +1 +false + + + +1 +true + + + +1 +false + + + +1 +true + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + + + + +B_ButtonSmall +350.000000 +25.000000 + + + +graphic_button_disable +25.000000 +25.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Disable.png + + + + +graphic_button_focus +25.000000 +25.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Red_Focus.png + + + + +graphic_button_normal +25.000000 +25.000000 +8 +Graphics\X360ControllerIcons\Legend_Button_Red_Normal.png + + + + +text_ButtonText +300.000000 +25.000000 +28.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +11.000000 +20497 + + + + +B_graphic +11.000000 +11.000000 +7.500000,7.500000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\b_graphic.png + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocus + +stop + + + +B_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +8.500000,10.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +graphic_button_normal +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +0.000000 +false + + + +graphic_button_focus +Show + + +1 +false + + + +1 +true + + + +0 +true + + + +1 +false + + + +1 +true + + + +1 +false + + + +graphic_button_disable +Show + + +1 +false + + + +1 +true + + + +1 +false + + + +1 +true + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + + + + +A_Button +350.000000 +36.000000 + + + +graphic_button_disable +33.000000 +33.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Disable.png + + + + +graphic_button_focus +33.000000 +33.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Green_Focus.png + + + + +graphic_button_normal +33.000000 +33.000000 +8 +Graphics\X360ControllerIcons\Legend_Button_Green_Normal.png + + + + +text_ButtonText +300.000000 +36.000000 +36.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +16.000000 +20497 + + + + +A_graphic +15.000000 +15.000000 +9.500000,9.500000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\a_graphic.png + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocus + +stop + + + +A_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +10.500000,12.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +9.500000,9.500000,0.000000 + + + +graphic_button_normal +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +0.000000 +false + + + +graphic_button_focus +Show + + +1 +false + + + +1 +true + + + +0 +true + + + +1 +false + + + +1 +true + + + +1 +false + + + +graphic_button_disable +Show + + +1 +false + + + +1 +true + + + +1 +false + + + +1 +true + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffebebeb + + + + + + +A_ButtonSmall +350.000000 +25.000000 + + + +graphic_button_disable +25.000000 +25.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Disable.png + + + + +graphic_button_focus +25.000000 +25.000000 +false +8 +Graphics\X360ControllerIcons\Legend_Button_Green_Focus.png + + + + +graphic_button_normal +25.000000 +25.000000 +8 +Graphics\X360ControllerIcons\Legend_Button_Green_Normal.png + + + + +text_ButtonText +300.000000 +25.000000 +28.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +11.000000 +20497 + + + + +A_graphic +11.000000 +11.000000 +7.500000,7.500000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\a_graphic.png + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocus + +stop + + + +A_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +8.500000,10.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +7.500000,7.500000,0.000000 + + + +graphic_button_normal +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +0.000000 +false + + + +graphic_button_focus +Show + + +1 +false + + + +1 +true + + + +0 +true + + + +1 +false + + + +1 +true + + + +1 +false + + + +graphic_button_disable +Show + + +1 +false + + + +1 +true + + + +1 +false + + + +1 +true + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffebebeb + + + + + + +LTrigger +350.000000 +36.000000 + + + +text_ButtonText +300.000000 +36.000000 +40.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +16.000000 +20497 + + + + +lt_graphic +37.000000 +45.000000 +0.000000,-3.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonLeftTrigger_TT.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +lt_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +1.500000,1.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + + + + +LTriggerSmall +350.000000 +25.000000 + + + +text_ButtonText +300.000000 +25.000000 +31.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +11.000000 +20497 + + + + +lt_graphic +28.000000 +34.000000 +0.000000,-4.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonLeftTrigger_TT.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +lt_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +1.500000,1.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + + + + +LTriggerSmall480 +350.000000 +25.000000 + + + +text_ButtonText +300.000000 +25.000000 +31.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +11.000000 +20497 + + + + +lt_graphic +28.000000 +34.000000 +0.000000,-2.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonLeftTrigger_TT.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +lt_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +1.500000,1.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + + + + +RTrigger +350.000000 +36.000000 + + + +text_ButtonText +300.000000 +36.000000 +40.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +16.000000 +20497 + + + + +rt_graphic +37.000000 +45.000000 +0.000000,-3.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonRightTrigger_TT.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + +rt_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +1.500000,1.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + + + + +RTriggerSmall +350.000000 +25.000000 + + + +text_ButtonText +300.000000 +25.000000 +31.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +11.000000 +20497 + + + + +rt_graphic +28.000000 +34.000000 +0.000000,-4.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonRightTrigger_TT.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + +rt_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +1.500000,1.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-4.000000,0.000000 + + + + + + +RTriggerSmall480 +350.000000 +25.000000 + + + +text_ButtonText +300.000000 +25.000000 +31.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +11.000000 +20497 + + + + +rt_graphic +28.000000 +34.000000 +0.000000,-2.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonRightTrigger_TT.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + +rt_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +1.500000,1.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-2.000000,0.000000 + + + + + + +LStick_Nav +350.000000 +36.000000 + + + +text_ButtonText +300.000000 +36.000000 +61.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +16.000000 +20497 + + + + +ls_graphic +58.000000 +48.000000 +0.000000,-5.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonLeftStick_Navigate.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + +ls_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +0.000000,-5.000000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-5.000000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +0.000000,-5.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-5.000000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-5.000000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +1.500000,-0.750000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-5.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + + + + +LStick_NavSmall +350.000000 +25.000000 + + + +text_ButtonText +300.000000 +25.000000 +43.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +11.000000 +20497 + + + + +rb_graphic +40.000000 +34.000000 +0.000000,-3.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonLeftStick_Navigate.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + +rb_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +1.500000,1.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + + + + +XuiListTexturePackButtonSmall +40.000000 +40.000000 +15 + + + +highlight_graphic +40.000000 +40.000000 +15 +false + + +0xffebeb0f + + + + +0xffebeb0f +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,89.000000,0.000000,0,89.000000,0.000000,89.000000,0.000000,89.000000,37.000000,0,89.000000,37.000000,89.000000,37.000000,0.000000,37.000000,0,0.000000,37.000000,0.000000,37.000000,0.000000,0.000000,0, + + + + +highlight_cutout +36.000000 +36.000000 +2.000000,2.000000,0.000000 +15 + + +0xffebeb0f + + + + +0xff8b8b8b +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,89.000000,0.000000,0,89.000000,0.000000,89.000000,0.000000,89.000000,37.000000,0,89.000000,37.000000,89.000000,37.000000,0.000000,37.000000,0,0.000000,37.000000,0.000000,37.000000,0.000000,0.000000,0, + + + + +XuiImagePresenter +36.000000 +36.000000 +2.000000,2.000000,0.000000 +138 +16 +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.250000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +1.000000 + + + +0 +true +0.250000 + + + +0 +true +1.000000 + + + +0 +true +0.250000 + + + + + + +XuiListTexturePackSmall +440.000000 +75.000000 + + + +graphic_groupbackground +440.000000 +67.000000 +0.000000,14.000000,0.000000 +15 + + + +Bot_R +16.000000 +16.000000 +424.344818,45.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Recess_Bot_R.png +48 + + + + +Bot_M +408.344818 +16.000000 +16.000000,45.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Recess_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,45.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Recess_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +424.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Recess_Top_R.png +48 + + + + +Top_M +408.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Recess_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Recess_Top_L.png +48 + + + + +Mid_R +16.000000 +29.001961 +424.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_R.png +48 + + + + +Mid_M +408.344818 +29.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_M.png +48 + + + + +Mid_L +16.000000 +29.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_L.png +48 + + + + + +control_ScrollUp +22.000000 +22.000000 +11.000000,34.000000,0.000000 +33 +XuiScrollEndLeft +2 + + + + +control_ScrollDown +22.000000 +22.000000 +406.000000,34.000000,0.000000 +36 +XuiScrollEndRight +3 + + + + +control_ListItem +40.000000 +40.000000 +35.000000,24.000000,0.000000 +37 +XuiListTexturePackButtonSmall +1 + + + + +Title +400.000000 +20.000000 +2.000019,-6.000000,0.000000 +5 +0xff323232 +0xff0f0f0f +272 + + + + +TitleHighlight +400.000000 +20.000000 +1.000019,-8.000000,0.000000 +5 +0xffebeb0f +0xff0f0f0f +272 + + + + + +KillFocus + + + +EndKillFocus + +stop + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +TitleHighlight +Opacity + + +0 +1.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +1.000000 + + + + + + +XuiListTexturePackButton +60.000000 +15 + + + +highlight_graphic +60.000000 +15 +false + + +0xffebeb0f + + + + +0xffebeb0f +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,89.000000,0.000000,0,89.000000,0.000000,89.000000,0.000000,89.000000,37.000000,0,89.000000,37.000000,89.000000,37.000000,0.000000,37.000000,0,0.000000,37.000000,0.000000,37.000000,0.000000,0.000000,0, + + + + +highlight_cutout +54.000000 +54.000000 +3.000000,3.000000,0.000000 +15 + + +0xffebeb0f + + + + +0xff8b8b8b +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,89.000000,0.000000,0,89.000000,0.000000,89.000000,0.000000,89.000000,37.000000,0,89.000000,37.000000,89.000000,37.000000,0.000000,37.000000,0,0.000000,37.000000,0.000000,37.000000,0.000000,0.000000,0, + + + + +XuiImagePresenter +54.000000 +54.000000 +3.000000,3.000000,0.000000 +138 +16 +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.250000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +1.000000 + + + +0 +true +0.250000 + + + +0 +true +1.000000 + + + +0 +true +0.250000 + + + + + + +XuiListTexturePack +440.000000 +108.333336 + + + +graphic_groupbackground +440.000000 +92.000000 +0.000000,18.000000,0.000000 +15 + + + +Bot_R +16.000000 +16.000000 +424.344818,70.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Recess_Bot_R.png +48 + + + + +Bot_M +408.344818 +16.000000 +16.000000,70.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Recess_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,70.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Recess_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +424.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Recess_Top_R.png +48 + + + + +Top_M +408.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Recess_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Recess_Top_L.png +48 + + + + +Mid_R +16.000000 +54.001961 +424.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_R.png +48 + + + + +Mid_M +408.344818 +54.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_M.png +48 + + + + +Mid_L +16.000000 +54.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_L.png +48 + + + + + +control_ScrollUp +22.000000 +32.000000 +12.000000,49.000000,0.000000 +33 +XuiScrollEndLeft +2 + + + + +control_ScrollDown +22.000000 +32.000000 +406.000000,49.000000,0.000000 +36 +XuiScrollEndRight +3 + + + + +control_ListItem +60.000000 +34.000000,30.000000,0.000000 +37 +XuiListTexturePackButton +1 + + + + +Title +400.000000 +32.000000 +2.000019,-6.000000,0.000000 +5 +0xff323232 +0xff0f0f0f +16.000000 +272 + + + + +TitleHighlight +400.000000 +32.000000 +1.000019,-8.000000,0.000000 +5 +0xffebeb0f +0xff0f0f0f +16.000000 +272 + + + + + +KillFocus + + + +EndKillFocus + +stop + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +TitleHighlight +Opacity + + +0 +1.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +1.000000 + + + + + + +XuiHowToList480 +330.000000 +80.000000 + + + +graphic_groupbackground +330.000000 +80.000000 +15 + + + +Bot_R +16.000000 +16.000000 +314.344818,64.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +298.344818 +16.000000 +16.000000,64.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,64.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +314.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +298.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +48.001961 +314.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +298.344818 +48.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +48.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + + +control_ScrollUp +32.000000 +22.000000 +249.000000,50.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ScrollDown +32.000000 +22.000000 +281.000000,50.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +control_ListItem +300.000000 +36.000000 +15.000000,15.000000,0.000000 +5 +XuiMainMenuButton_L_Thin +0.000000,10.000000,0.000000 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiHowToList +480.000000 +90.000000 + + + +graphic_groupbackground +480.000000 +90.000000 +15 + + + +Bot_R +16.000000 +16.000000 +464.344818,74.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +448.344818 +16.000000 +16.000000,74.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,74.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +464.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +448.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +58.001961 +464.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +448.344818 +58.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +58.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + + +control_ScrollUp +32.000000 +22.000000 +399.000000,60.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ScrollDown +32.000000 +22.000000 +431.000000,60.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +control_ListItem +450.000000 +50.000000 +15.000000,15.000000,0.000000 +5 +XuiMainMenuButton_List + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiListRecessed_NoIcon +440.000000 +140.000000 + + + +graphic_groupbackground +440.000000 +134.000000 +15 + + + +Bot_R +16.000000 +16.000000 +424.344818,118.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Recess_Bot_R.png +48 + + + + +Bot_M +408.344818 +16.000000 +16.000000,118.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Recess_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,118.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Recess_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +424.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Recess_Top_R.png +48 + + + + +Top_M +408.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Recess_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Recess_Top_L.png +48 + + + + +Mid_R +16.000000 +102.001961 +424.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_R.png +48 + + + + +Mid_M +408.344818 +102.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_M.png +48 + + + + +Mid_L +16.000000 +102.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_L.png +48 + + + + + +control_ScrollUp +32.000000 +22.000000 +355.000000,104.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ScrollDown +32.000000 +22.000000 +387.000000,104.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +XuiListButton_L_NoIcon + + + + +XuiImagePresenter +40.000000 +40.000000 +30.000000,52.000000,0.000000 +16 + + + + +Title +400.000000 +20.000019,10.000000,0.000000 +5 +0xff323232 +0xff0f0f0f +16.000000 +1040 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiListRecessedThin_NoIcon +440.000000 +100.000000 + + + +graphic_groupbackground +440.000000 +100.000000 +15 + + + +Bot_R +16.000000 +16.000000 +424.344818,84.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Recess_Bot_R.png +48 + + + + +Bot_M +408.344818 +16.000000 +16.000000,84.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Recess_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,84.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Recess_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +424.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Recess_Top_R.png +48 + + + + +Top_M +408.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Recess_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Recess_Top_L.png +48 + + + + +Mid_R +16.000000 +68.001961 +424.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_R.png +48 + + + + +Mid_M +408.344818 +68.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_M.png +48 + + + + +Mid_L +16.000000 +68.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_L.png +48 + + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +XuiListButton_LThin_NoIcon + + + + +control_ScrollUp +22.000000 +15.000000 +381.000000,76.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ScrollDown +22.000000 +15.000000 +403.000000,76.000008,0.000000 +12 +XuiScrollEnd +1 + + + + +XuiImagePresenter +22.000000 +22.000000 +30.000000,33.517746,0.000000 +16 + + + + +Title +410.000000 +18.000000 +15.000000,8.000000,0.000000 +5 +0xff323232 +0xff0f0f0f +12.000000 +1040 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiListRecessed +440.000000 +140.000000 + + + +graphic_groupbackground +440.000000 +134.000000 +15 + + + +Bot_R +16.000000 +16.000000 +424.344818,118.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Recess_Bot_R.png +48 + + + + +Bot_M +408.344818 +16.000000 +16.000000,118.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Recess_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,118.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Recess_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +424.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Recess_Top_R.png +48 + + + + +Top_M +408.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Recess_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Recess_Top_L.png +48 + + + + +Mid_R +16.000000 +102.001961 +424.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_R.png +48 + + + + +Mid_M +408.344818 +102.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_M.png +48 + + + + +Mid_L +16.000000 +102.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_L.png +48 + + + + + +control_ScrollUp +32.000000 +22.000000 +355.000000,104.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ScrollDown +32.000000 +22.000000 +387.000000,104.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +XuiListButton_L + + + + +XuiImagePresenter +40.000000 +40.000000 +30.000000,52.000000,0.000000 +16 + + + + +Title +400.000000 +20.000019,10.000000,0.000000 +5 +0xff323232 +0xff0f0f0f +16.000000 +1040 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiListRecessedThin +440.000000 +100.000000 + + + +graphic_groupbackground +440.000000 +100.000000 +15 + + + +Bot_R +16.000000 +16.000000 +424.344818,84.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Recess_Bot_R.png +48 + + + + +Bot_M +408.344818 +16.000000 +16.000000,84.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Recess_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,84.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Recess_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +424.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Recess_Top_R.png +48 + + + + +Top_M +408.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Recess_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Recess_Top_L.png +48 + + + + +Mid_R +16.000000 +68.001961 +424.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_R.png +48 + + + + +Mid_M +408.344818 +68.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_M.png +48 + + + + +Mid_L +16.000000 +68.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_L.png +48 + + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +XuiListButton_LThin + + + + +control_ScrollUp +22.000000 +15.000000 +381.000000,76.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ScrollDown +22.000000 +15.000000 +403.000000,76.000008,0.000000 +12 +XuiScrollEnd +1 + + + + +XuiImagePresenter +22.000000 +22.000000 +30.000000,33.517746,0.000000 +16 + + + + +Title +410.000000 +18.000000 +15.000000,8.000000,0.000000 +5 +0xff323232 +0xff0f0f0f +12.000000 +1040 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiListRecessedDLCThin +440.000000 +100.000000 + + + +graphic_groupbackground +440.000000 +100.000000 +15 + + + +Bot_R +16.000000 +16.000000 +424.344818,84.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Recess_Bot_R.png +48 + + + + +Bot_M +408.344818 +16.000000 +16.000000,84.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Recess_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,84.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Recess_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +424.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Recess_Top_R.png +48 + + + + +Top_M +408.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Recess_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Recess_Top_L.png +48 + + + + +Mid_R +16.000000 +68.001961 +424.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_R.png +48 + + + + +Mid_M +408.344818 +68.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_M.png +48 + + + + +Mid_L +16.000000 +68.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_L.png +48 + + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +XuiListButton_DLC_LThin + + + + +control_ScrollUp +22.000000 +15.000000 +381.000000,76.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ScrollDown +22.000000 +15.000000 +403.000000,76.000008,0.000000 +12 +XuiScrollEnd +1 + + + + +XuiImagePresenter +22.000000 +22.000000 +30.000000,33.517746,0.000000 +16 + + + + +Title +410.000000 +18.000000 +15.000000,8.000000,0.000000 +5 +0xff323232 +0xff0f0f0f +12.000000 +1040 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiListRecessedDLC +440.000000 +140.000000 + + + +graphic_groupbackground +440.000000 +134.000000 +15 + + + +Bot_R +16.000000 +16.000000 +424.344818,118.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Recess_Bot_R.png +48 + + + + +Bot_M +408.344818 +16.000000 +16.000000,118.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Recess_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,118.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Recess_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +424.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Recess_Top_R.png +48 + + + + +Top_M +408.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Recess_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Recess_Top_L.png +48 + + + + +Mid_R +16.000000 +102.001961 +424.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_R.png +48 + + + + +Mid_M +408.344818 +102.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_M.png +48 + + + + +Mid_L +16.000000 +102.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Recess_Mid_L.png +48 + + + + + +control_ScrollUp +32.000000 +22.000000 +355.000000,104.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ScrollDown +32.000000 +22.000000 +387.000000,104.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +XuiListButton_DLC_L + + + + +XuiImagePresenter +40.000000 +40.000000 +30.000000,52.000000,0.000000 +16 + + + + +Title +400.000000 +20.000019,10.000000,0.000000 +5 +0xff323232 +0xff0f0f0f +16.000000 +1040 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiList +440.000000 +140.000000 + + + +graphic_groupbackground +440.000000 +140.000000 +15 + + + +Bot_R +16.000000 +16.000000 +424.344818,124.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +408.344818 +16.000000 +16.000000,124.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,124.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +424.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +408.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +108.001961 +424.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +408.344818 +108.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +108.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + + +control_ScrollUp +32.000000 +22.000000 +355.000000,110.000000,0.000000 +6 +XuiScrollEndUp + + + + +control_ScrollDown +32.000000 +22.000000 +387.000000,110.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +XuiListButton_L + + + + +XuiImagePresenter +40.000000 +40.000000 +30.000000,60.000000,0.000000 +16 + + + + +Title +400.000000 +32.000000 +20.000019,12.000000,0.000000 +5 +0xffebebeb +0xff0f0f0f +18.000000 +1041 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiListButton_L +400.000000 +60.000000 +15 + + + +highlight_graphic +400.000000 +60.000000 +15 +false +Graphics\ListButton_Over.png + + + + +button_graphic +400.000000 +60.000000 +15 +Graphics\ListButton_Norm.png + + + + +text_Label +320.000000 +28.000000 +66.000000,16.000000,0.000000 +15 +0xffebebeb +0xff0f0f0f +16.000000 +20757 + + + + +XuiImagePresenter +40.000000 +40.000000 +12.000000,10.000000,0.000000 +138 +16 +48 + + + + +XuiSoundXACT +99.000000 +66.000000 +101.000000,14.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +1 +true +0.250000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +false + + + +0 +1.000000 +false + + + +0 +1.000000 +false + + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +text_Label +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffa0a0a0 + + + +0 +0xffa0a0a0 + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb80 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonPress + + + +0 + + + + + + + + + +XuiListButton_LThin +400.000000 +36.000000 +15 + + + +highlight_graphic +400.000000 +36.000000 +15 +false +Graphics\ListButton_Over.png + + + + +button_graphic +400.000000 +36.000000 +15 +Graphics\ListButton_Norm.png + + + + +text_Label +346.000000 +28.000000 +46.000000,4.000000,0.000000 +15 +0xffebebeb +0xff0f0f0f +11.000000 +20757 + + + + +XuiImagePresenter +28.000000 +28.000000 +8.000000,4.000000,0.000000 +11 +16 +48 + + + + +XuiSoundXACT +99.000000 +66.000000 +101.000000,14.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +1 +true +0.250000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +false + + + +0 +1.000000 +false + + + +0 +1.000000 +false + + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +text_Label +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffa0a0a0 + + + +0 +0xffa0a0a0 + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb80 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonPress + + + +0 + + + + + + + + + +XuiListButton_L_NoIcon +400.000000 +60.000000 +15 + + + +highlight_graphic +400.000000 +60.000000 +15 +false +Graphics\ListButton_Over.png + + + + +button_graphic +400.000000 +60.000000 +15 +Graphics\ListButton_Norm.png + + + + +text_Label +374.000000 +28.000000 +12.000000,16.000000,0.000000 +15 +0xffebebeb +0xff0f0f0f +16.000000 +20757 + + + + +XuiSoundXACT +99.000000 +66.000000 +101.000000,14.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +1 +true +0.250000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +false + + + +0 +1.000000 +false + + + +0 +1.000000 +false + + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +text_Label +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffa0a0a0 + + + +0 +0xffa0a0a0 + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb80 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonPress + + + +0 + + + + + + + + + +XuiListButton_LThin_NoIcon +400.000000 +40.000000 +15 + + + +highlight_graphic +400.000000 +40.000000 +15 +false +Graphics\ListButton_Over.png + + + + +button_graphic +400.000000 +40.000000 +15 +Graphics\ListButton_Norm.png + + + + +text_Label +384.000000 +28.000000 +8.000000,6.000000,0.000000 +15 +0xffebebeb +0xff0f0f0f +11.000000 +20757 + + + + +XuiSoundXACT +99.000000 +66.000000 +101.000000,14.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +1 +true +0.250000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +false + + + +0 +1.000000 +false + + + +0 +1.000000 +false + + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +text_Label +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffa0a0a0 + + + +0 +0xffa0a0a0 + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb80 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonPress + + + +0 + + + + + + + + + +XuiLayoutListButtonSmall +84.000000 +24.000000 +15 + + + +Border +88.000000 +28.000000 +-2.000000,-2.000000,0.000000 +false + + +0xff0f0f80 + + + + +0xffebeb0f +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,89.000000,0.000000,0,89.000000,0.000000,89.000000,0.000000,89.000000,37.000000,0,89.000000,37.000000,89.000000,37.000000,0.000000,37.000000,0,0.000000,37.000000,0.000000,37.000000,0.000000,0.000000,0, + + + + +highlight_graphic +84.000000 +24.000000 +false +Graphics\LayoutButton_Over.png + + + + +button_graphic +84.000000 +24.000000 +Graphics\LayoutButton_Norm.png + + + + +text_Label +84.000000 +24.000000 +0xffebebeb +0xff0f0f0f +13.000000 +21525 + + + + +XuiSoundXACT +28.000000 +38.000000 +57.000000,17.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +EndInitFocus + +stop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +false +0.000000 + + + +0 +false +0.000000 + + + +0 +false +0.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +false +0.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +true +1.000000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +1 +1.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.750000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +1 +1.000000 +false + + + +1 +1.000000 +false + + + +1 +0.500000 +true + + + +0 +0.500000 +true + + + +1 +0.500000 +true + + + +1 +0.500000 +true + + + +text_Label +TextColor +DropShadowColor +Position + + +1 +0xffebebeb +0xff0f0f0f +0.000000,0.000000,0.000000 + + + +0 +0xffebeb0f +0xff0f0f0f +0.000000,0.000000,0.000000 + + + +0 +0xffebeb0f +0xff0f0f0f +0.000000,0.000000,0.000000 + + + +0 +0xffa0a0a0 +0x800f0f0f +0.000000,0.000000,0.000000 + + + +0 +0xffa0a0a0 +0x800f0f0f +0.000000,0.000000,0.000000 + + + +1 +0xffebebeb +0xff0f0f0f +0.000000,0.000000,0.000000 + + + +1 +0xffebebeb +0xff0f0f0f +0.000000,0.000000,0.000000 + + + +0 +0xffebeb0f +0xff0f0f0f +0.000000,0.000000,0.000000 + + + +0 +0xffebebaf +0xff0f0f0f +0.000000,1.000000,0.000000 + + + +0 +0xffebeb0f +0xff0f0f0f +0.000000,0.000000,0.000000 + + + +1 +0xffebebeb +0xff0f0f0f +0.000000,0.000000,0.000000 + + + +1 +0xffebebeb +0xff0f0f0f +0.000000,0.000000,0.000000 + + + +0 +0xffebeb0f +0xff0f0f0f +0.000000,0.000000,0.000000 + + + +0 +0xffebeb0f +0xff0f0f0f +0.000000,0.000000,0.000000 + + + +0 +0xffa0a0a0 +0xff0f0f0f +0.000000,0.000000,0.000000 + + + +1 +0xffa0a0a0 +0x800f0f0f +0.000000,0.000000,0.000000 + + + +0 +0xffa0a0a0 +0x800f0f0f +0.000000,0.000000,0.000000 + + + +0 +0xffa0a0a0 +0x800f0f0f +0.000000,0.000000,0.000000 + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonPress + + + +0 + + + + + + + + + +XuiLayoutListButton +140.000000 +40.000000 +15 + + + +Border +148.000000 +48.000000 +-4.000000,-4.000000,0.000000 +false + + +0xff0f0f80 + + + + +0xffebeb0f +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,89.000000,0.000000,0,89.000000,0.000000,89.000000,0.000000,89.000000,37.000000,0,89.000000,37.000000,89.000000,37.000000,0.000000,37.000000,0,0.000000,37.000000,0.000000,37.000000,0.000000,0.000000,0, + + + + +highlight_graphic +140.000000 +40.000000 +false +Graphics\LayoutButton_Over.png + + + + +button_graphic +140.000000 +40.000000 +Graphics\LayoutButton_Norm.png + + + + +text_Label +120.000000 +28.000000 +10.000000,6.000000,0.000000 +0xffebebeb +0xff0f0f0f +16.000000 +21525 + + + + +XuiSoundXACT +28.000000 +38.000000 +57.000000,17.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +EndInitFocus + +stop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +false +1.000000 + + + +0 +false +0.000000 + + + +0 +false +0.000000 + + + +0 +false +0.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +false +0.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +true +1.000000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +1 +1.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.750000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +1 +1.000000 +false + + + +1 +1.000000 +false + + + +1 +0.500000 +true + + + +0 +0.500000 +true + + + +1 +0.500000 +true + + + +1 +0.500000 +true + + + +text_Label +TextColor +DropShadowColor +Position + + +1 +0xffebebeb +0xff0f0f0f +10.000000,6.000000,0.000000 + + + +0 +0xffebeb0f +0xff0f0f0f +10.000000,6.000000,0.000000 + + + +0 +0xffebeb0f +0xff0f0f0f +10.000000,6.000000,0.000000 + + + +0 +0xffa0a0a0 +0x800f0f0f +10.000000,6.000000,0.000000 + + + +0 +0xffa0a0a0 +0x800f0f0f +10.000000,6.000000,0.000000 + + + +1 +0xffebebeb +0xff0f0f0f +10.000000,6.000000,0.000000 + + + +1 +0xffebebeb +0xff0f0f0f +10.000000,6.000000,0.000000 + + + +0 +0xffebeb0f +0xff0f0f0f +10.000000,6.000000,0.000000 + + + +0 +0xffebebaf +0xff0f0f0f +11.000000,7.000000,0.000000 + + + +0 +0xffebeb0f +0xff0f0f0f +10.000000,6.000000,0.000000 + + + +1 +0xffebebeb +0xff0f0f0f +10.000000,6.000000,0.000000 + + + +1 +0xffebebeb +0xff0f0f0f +10.000000,6.000000,0.000000 + + + +0 +0xffebeb0f +0xff0f0f0f +10.000000,6.000000,0.000000 + + + +0 +0xffebeb0f +0xff0f0f0f +10.000000,6.000000,0.000000 + + + +0 +0xffa0a0a0 +0xff0f0f0f +10.000000,6.000000,0.000000 + + + +1 +0xffa0a0a0 +0x800f0f0f +10.000000,6.000000,0.000000 + + + +0 +0xffa0a0a0 +0x800f0f0f +10.000000,6.000000,0.000000 + + + +0 +0xffa0a0a0 +0x800f0f0f +10.000000,6.000000,0.000000 + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonPress + + + +0 + + + + + + + + + +DebugList +500.000000 +80.000000 + + + +graphic_groupbackground +500.000000 +80.000000 +15 + + + +Bot_R +16.000000 +16.000000 +484.344818,64.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +468.344818 +16.000000 +16.000000,64.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,64.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +484.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +468.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +48.001961 +484.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +468.344818 +48.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +48.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + + +control_ScrollUp +32.000000 +22.000000 +415.000000,52.000000,0.000000 +6 +XuiScrollEndUp + + + + +control_ScrollDown +32.000000 +22.000000 +447.000000,52.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +control_ListItem +469.000000 +40.000000 +10.000000,14.000000,0.000000 +5 +DebugButton + + + + +XuiImagePresenter +85.000000 +68.000000 +41.000000,45.000000,0.000000 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiMainMenuButton_List +400.000000 +50.000000 +15 + + + +highlight_graphic +400.000000 +40.000000 +15 +false +Graphics\MainMenuButton_Over.png + + + + +button_graphic +400.000000 +40.000000 +15 +Graphics\MainMenuButton_Norm.png + + + + +text_Label +380.000000 +28.000000 +10.000000,6.000000,0.000000 +15 +0xffebebeb +0xff0f0f0f +16.000000 +21525 + + + + +XuiSoundXACT +99.000000 +66.000000 +101.000000,14.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +1 +true +0.250000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +false + + + +0 +1.000000 +false + + + +0 +1.000000 +false + + + +1 +1.000000 +false + + + +0 +0.000000 +false + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +text_Label +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffa0a0a0 + + + +0 +0xffa0a0a0 + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb80 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonPress + + + +0 + + + + + + + + + +XuiLayoutListSmall +366.000000 +88.000000 + + + +graphic_groupbackground +366.000000 +88.000000 +15 + + + +Bot_R +16.000000 +16.000000 +350.344818,72.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +334.344818 +16.000000 +16.000000,72.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,72.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +350.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +334.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +56.001953 +350.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +334.344818 +56.001953 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +56.001953 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + + +control_ListItem +84.000000 +24.000000 +40.000000,30.000000,0.000000 +5 +XuiLayoutListButtonSmall +1 +84.000000,24.000000,0.000000 +17.000000,0.000000,0.000000 + + + + +Title +348.564850 +21.299248 +20.000000,7.000000,0.000000 +7 +false +0xffebebeb +0xff0f0f0f +18.000000 +1041 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +XuiLayoutList +480.000000 +124.000000 + + + +graphic_groupbackground +480.000000 +124.000000 +15 + + + +Bot_R +16.000000 +16.000000 +464.344818,108.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +448.344818 +16.000000 +16.000000,108.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,108.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +464.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +448.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +92.001953 +464.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +448.344818 +92.001953 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +92.001953 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + + +control_ListItem +140.000000 +40.000000 +20.000000,40.000000,0.000000 +5 +XuiLayoutListButton +1 +140.000000,40.000000,0.000000 +10.000000,0.000000,0.000000 + + + + +Title +440.000031 +32.000000 +20.000000,7.000000,0.000000 +7 +false +0xffebebeb +0xff0f0f0f +18.000000 +1041 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +XuiListButton_DLC_LThin +400.000000 +36.000000 +15 + + + +highlight_graphic +400.000000 +36.000000 +15 +false +Graphics\ListButton_Over.png + + + + +button_graphic +400.000000 +36.000000 +15 +Graphics\ListButton_Norm.png + + + + +text_Label +352.000000 +28.000000 +10.000000,4.000000,0.000000 +15 +0xffebebeb +0xff0f0f0f +11.000000 +20757 + + + + +XuiImagePresenter +28.000000 +28.000000 +364.000000,4.000000,0.000000 +14 +16 +48 + + + + +XuiSoundXACT +99.000000 +66.000000 +101.000000,14.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +1 +true +0.250000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +false + + + +0 +1.000000 +false + + + +0 +1.000000 +false + + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +text_Label +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffa0a0a0 + + + +0 +0xffa0a0a0 + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb80 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonPress + + + +0 + + + + + + + + + +XuiListButton_DLC_L +400.000000 +60.000000 +15 + + + +highlight_graphic +400.000000 +60.000000 +15 +false +Graphics\ListButton_Over.png + + + + +button_graphic +400.000000 +60.000000 +15 +Graphics\ListButton_Norm.png + + + + +text_Label +330.000000 +28.000000 +16.000000,16.000000,0.000000 +15 +0xffebebeb +0xff0f0f0f +16.000000 +20757 + + + + +XuiImagePresenter +40.000000 +40.000000 +348.000000,10.000000,0.000000 +142 +16 +48 + + + + +XuiSoundXACT +99.000000 +66.000000 +101.000000,14.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +1 +true +0.250000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +false + + + +0 +1.000000 +false + + + +0 +1.000000 +false + + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +text_Label +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffa0a0a0 + + + +0 +0xffa0a0a0 + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb80 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonPress + + + +0 + + + + + + + + + +XuiPlayerList_NoIcon +440.000000 +148.000000 + + + +graphic_groupbackground +440.000000 +148.000000 +15 + + + +Bot_R +16.000000 +16.000000 +424.344818,132.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +408.344818 +16.000000 +16.000000,132.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,132.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +424.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +408.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +116.001953 +424.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +408.344818 +116.001953 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +116.001953 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + + +control_ScrollUp +32.000000 +22.000000 +355.000000,114.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ScrollDown +32.000000 +22.000000 +387.000000,114.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +XuiListButton_L_NoIcon + + + + +XuiImagePresenter +40.000000 +40.000000 +30.000000,55.000000,0.000000 +16 + + + + +Title +400.000000 +20.000019,12.000000,0.000000 +7 +true +0xff323232 +0xff0f0f0f +18.000000 +272 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiPlayerListSmall_NoIcon +440.000000 +128.000000 + + + +graphic_groupbackground +440.000000 +128.000000 +15 + + + +Bot_R +16.000000 +16.000000 +424.344818,112.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +408.344818 +16.000000 +16.000000,112.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,112.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +424.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +408.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +96.001953 +424.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +408.344818 +96.001953 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +96.001953 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + + +control_ScrollUp +32.000000 +22.000000 +355.000000,96.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ScrollDown +32.000000 +22.000000 +387.000000,96.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +XuiListButton_LThin_NoIcon + + + + +XuiImagePresenter +32.000000 +32.000000 +30.000000,46.000000,0.000000 +false +16 + + + + +Title +400.000000 +26.000000 +20.000019,12.000000,0.000000 +7 +true +0xff323232 +0xff0f0f0f +16.000000 +272 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiPlayerListButton_LThin +400.000000 +36.000000 +15 +true + + + +highlight_graphic +400.000000 +36.000000 +15 +false +Graphics\ListButton_Over.png + + + + +button_graphic +400.000000 +36.000000 +15 +Graphics\ListButton_Norm.png + + + + +text_Label +290.000000 +28.000000 +102.000000,4.000000,0.000000 +15 +0xffebebeb +0xff0f0f0f +11.000000 +20757 + + + + +XuiSoundXACT +99.000000 +66.000000 +101.000000,14.000000,0.000000 + + + + +IconGroup +28.000000 +28.000000 +8.000000,4.000000,0.000000 +true + + + +Icon +28.000000 +28.000000 +true +16 +Graphics\InGameInfo\MapIcon_0.png +48 + + + + + +P0 + +stop + + +P1 + +stop + + +P2 + +stop + + +P3 + +stop + + +P4 + +stop + + +P5 + +stop + + +P6 + +stop + + +P7 + +stop + + +P8 + +stop + + +P9 + +stop + + +P10 + +stop + + +P11 + +stop + + +P12 + +stop + + +P13 + +stop + + +P14 + +stop + + +P15 + +stop + + + +Icon +ImagePath + + +0 +Graphics\InGameInfo\MapIcon_0.png + + + +0 +Graphics\InGameInfo\MapIcon_1.png + + + +0 +Graphics\InGameInfo\MapIcon_2.png + + + +0 +Graphics\InGameInfo\MapIcon_3.png + + + +0 +Graphics\InGameInfo\MapIcon_4.png + + + +0 +Graphics\InGameInfo\MapIcon_5.png + + + +0 +Graphics\InGameInfo\MapIcon_6.png + + + +0 +Graphics\InGameInfo\MapIcon_7.png + + + +0 +Graphics\InGameInfo\MapIcon_8.png + + + +0 +Graphics\InGameInfo\MapIcon_9.png + + + +0 +Graphics\InGameInfo\MapIcon_10.png + + + +0 +Graphics\InGameInfo\MapIcon_11.png + + + +0 +Graphics\InGameInfo\MapIcon_12.png + + + +0 +Graphics\InGameInfo\MapIcon_13.png + + + +0 +Graphics\InGameInfo\MapIcon_14.png + + + +0 +Graphics\InGameInfo\MapIcon_15.png + + + + + + +VoiceGroup +28.000000 +28.000000 +36.000000,4.000000,0.000000 +true + + + +Icon +28.000000 +28.000000 +false +16 +48 + + + + + +Normal + +stop + + +Muted + +stop + + +Speaking + +stop + + +NotSpeaking + +stop + + + +Icon +ImagePath +Show + + +0 + +false + + + +0 +Graphics\InGameInfo\voiceMuted.png +true + + + +0 +Graphics\InGameInfo\voiceSpeaking.png +true + + + +0 +Graphics\InGameInfo\voiceNotSpeaking.png +true + + + + + + +OpsGroup +28.000000 +28.000000 +64.000000,4.000000,0.000000 +true + + + +OpsPresenter +28.000000 +28.000000 +0.000008,0.000001,0.000000 +128 +16 +2 +48 + + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +1 +true +0.250000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +false + + + +0 +1.000000 +false + + + +0 +1.000000 +false + + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +text_Label +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffa0a0a0 + + + +0 +0xffa0a0a0 + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb80 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonPress + + + +0 + + + + + + + + + +XuiPlayerListButton_L +400.000000 +60.000000 +15 +true + + + +highlight_graphic +400.000000 +60.000000 +15 +false +Graphics\ListButton_Over.png + + + + +button_graphic +400.000000 +60.000000 +15 +Graphics\ListButton_Norm.png + + + + +text_Label +240.000000 +28.000000 +146.000000,16.000000,0.000000 +15 +0xffebebeb +0xff0f0f0f +16.000000 +20757 + + + + +XuiSoundXACT +99.000000 +66.000000 +101.000000,14.000000,0.000000 + + + + +IconGroup +40.000000 +40.000000 +11.999999,9.999999,0.000000 +true + + + +Icon +40.000000 +40.000000 +true +16 +Graphics\InGameInfo\MapIcon_0.png +48 + + + + + +P0 + +stop + + +P1 + +stop + + +P2 + +stop + + +P3 + +stop + + +P4 + +stop + + +P5 + +stop + + +P6 + +stop + + +P7 + +stop + + +P8 + +stop + + +P9 + +stop + + +P10 + +stop + + +P11 + +stop + + +P12 + +stop + + +P13 + +stop + + +P14 + +stop + + +P15 + +stop + + + +Icon +ImagePath + + +0 +Graphics\InGameInfo\MapIcon_0.png + + + +0 +Graphics\InGameInfo\MapIcon_1.png + + + +0 +Graphics\InGameInfo\MapIcon_2.png + + + +0 +Graphics\InGameInfo\MapIcon_3.png + + + +0 +Graphics\InGameInfo\MapIcon_4.png + + + +0 +Graphics\InGameInfo\MapIcon_5.png + + + +0 +Graphics\InGameInfo\MapIcon_6.png + + + +0 +Graphics\InGameInfo\MapIcon_7.png + + + +0 +Graphics\InGameInfo\MapIcon_8.png + + + +0 +Graphics\InGameInfo\MapIcon_9.png + + + +0 +Graphics\InGameInfo\MapIcon_10.png + + + +0 +Graphics\InGameInfo\MapIcon_11.png + + + +0 +Graphics\InGameInfo\MapIcon_12.png + + + +0 +Graphics\InGameInfo\MapIcon_13.png + + + +0 +Graphics\InGameInfo\MapIcon_14.png + + + +0 +Graphics\InGameInfo\MapIcon_15.png + + + + + + +VoiceGroup +39.999992 +40.000000 +52.000000,9.999999,0.000000 +true + + + +Icon +40.000000 +40.000000 +false +16 +48 + + + + + +Normal + +stop + + +Muted + +stop + + +Speaking + +stop + + +NotSpeaking + +stop + + + +Icon +ImagePath +Show + + +0 + +false + + + +0 +Graphics\InGameInfo\voiceMuted.png +true + + + +0 +Graphics\InGameInfo\voiceSpeaking.png +true + + + +0 +Graphics\InGameInfo\voiceNotSpeaking.png +true + + + + + + +OpsGroup +39.999992 +40.000000 +91.999992,9.999999,0.000000 +true + + + +OpsPresenter +40.000000 +40.000000 +0.000008,0.000001,0.000000 +138 +16 +2 +48 + + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +1 +true +0.250000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +false + + + +0 +1.000000 +false + + + +0 +1.000000 +false + + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +text_Label +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffa0a0a0 + + + +0 +0xffa0a0a0 + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb80 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +XuiSoundXACT +SoundBank +WaveBank +Cue + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +0 + + + + + + +0 + + + + + + +0 +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb +ButtonPress + + + +0 + + + + + + + + + +XuiPlayerListSmall +440.000000 +128.000000 + + + +graphic_groupbackground +440.000000 +128.000000 +15 + + + +Bot_R +16.000000 +16.000000 +424.344818,112.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +408.344818 +16.000000 +16.000000,112.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,112.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +424.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +408.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +96.001953 +424.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +408.344818 +96.001953 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +96.001953 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + + +control_ScrollUp +32.000000 +22.000000 +355.000000,96.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ScrollDown +32.000000 +22.000000 +387.000000,96.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +XuiPlayerListButton_LThin + + + + +Title +400.000000 +26.000000 +20.000019,12.000000,0.000000 +7 +true +0xff323232 +0xff0f0f0f +16.000000 +272 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiPlayerList +440.000000 +148.000000 + + + +graphic_groupbackground +440.000000 +148.000000 +15 + + + +Bot_R +16.000000 +16.000000 +424.344818,132.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +408.344818 +16.000000 +16.000000,132.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,132.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +424.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +408.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +116.001953 +424.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +408.344818 +116.001953 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +116.001953 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + + +control_ScrollUp +32.000000 +22.000000 +355.000000,114.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ScrollDown +32.000000 +22.000000 +387.000000,114.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +XuiPlayerListButton_L + + + + +Title +400.000000 +20.000019,12.000000,0.000000 +7 +true +0xff323232 +0xff0f0f0f +18.000000 +272 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +graphic_groupbackground +Opacity + + +0 +1.000000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +0.500000 + + + +0 +1.000000 + + + + + + +XuiLeaderboardEntry +940.000000 +44.000000 +15 + + + +button_graphic +940.000000 +40.000000 +15 +Graphics\LeaderboardButton_Norm.png + + + + +highlight_graphic +940.000000 +40.000000 +15 +false +Graphics\LeaderboardButton_Over.png + + + + +text_Ranking +116.000000 +40.000000 +9.000000,0.000000,0.000000 +10 +0xffffffff +0xff0f0f0f +16.000000 +5141 + + + + +text_Gamertag +272.000000 +40.000000 +127.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +15 +0xffffffff +0xff0f0f0f +16.000000 +21525 +1 + + + + +text_Column1 +75.000000 +40.000000 +405.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffffffff +0xff0f0f0f +16.000000 +5141 +3 + + + + +text_Column2 +75.000000 +40.000000 +480.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffffffff +0xff0f0f0f +16.000000 +5141 +4 + + + + +text_Column3 +75.000000 +40.000000 +555.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffffffff +0xff0f0f0f +16.000000 +5141 +5 + + + + +text_Column4 +75.000000 +40.000000 +630.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffffffff +0xff0f0f0f +16.000000 +5141 +6 + + + + +text_Column5 +75.000000 +40.000000 +705.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffffffff +0xff0f0f0f +16.000000 +5141 +7 + + + + +text_Column6 +75.000000 +40.000000 +780.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffffffff +0xff0f0f0f +16.000000 +5141 +8 + + + + +text_Column7 +75.000000 +40.000000 +855.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffffffff +0xff0f0f0f +16.000000 +5141 +9 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +text_Ranking +TextColor + + +1 +0xffffffff + + + +0 +0xffffffff + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Gamertag +TextColor + + +1 +0xffffffff + + + +0 +0xffffffff + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column1 +TextColor + + +1 +0xffffffff + + + +0 +0xffffffff + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column2 +TextColor + + +1 +0xffffffff + + + +0 +0xffffffff + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column3 +TextColor + + +1 +0xffffffff + + + +0 +0xffffffff + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column4 +TextColor + + +1 +0xffffffff + + + +0 +0xffffffff + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column5 +TextColor + + +1 +0xffffffff + + + +0 +0xffffffff + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column6 +TextColor + + +1 +0xffffffff + + + +0 +0xffffffff + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column7 +TextColor + + +1 +0xffffffff + + + +0 +0xffffffff + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +highlight_graphic +Show +Height + + +0 +false +40.000000 + + + +0 +false +50.000000 + + + +0 +true +40.000000 + + + +0 +true +40.000000 + + + +button_graphic +Show + + +0 +true + + + +0 +true + + + +0 +false + + + +0 +false + + + + + + +XuiListLeaderboard +980.000000 +120.000000 + + + +graphic_groupbackground +980.000000 +150.000000 +15 + + + +Bot_R +16.000000 +16.000000 +964.344849,134.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +948.344849 +16.000000 +16.000000,134.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,134.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +964.344849,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +948.344849 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +118.001961 +964.344849,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +948.344849 +118.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +118.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + + +control_ScrollDown +32.000000 +22.000000 +928.000000,118.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +control_ScrollUp +32.000000 +22.000000 +896.000000,118.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ListItem +940.000000 +44.000000 +20.000032,71.000000,0.000000 +15 +XuiLeaderboardEntry +22594 + + + + +XuiLabel_Rank +116.000000 +22.000000 +29.000000,26.000000,0.000000 +10 +false +XuiLabelDarkCentred + + + + +XuiLabel_Gamertag +272.000000 +22.000000 +147.000000,26.000000,0.000000 +15 +false +XuiLabelDarkCentred + + + + +XuiHSlot1 +46.000000 +46.000000 +439.500000,16.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton + + + + +XuiHSlot2 +46.000000 +46.000000 +514.500000,16.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton + + + + +XuiHSlot3 +46.000000 +46.000000 +589.500000,16.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton + + + + +XuiHSlot4 +46.000000 +46.000000 +664.500000,16.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton + + + + +XuiHSlot5 +46.000000 +46.000000 +739.500000,16.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton + + + + +XuiHSlot6 +46.000000 +46.000000 +814.500000,16.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton + + + + +XuiHSlot7 +46.000000 +46.000000 +889.500000,16.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +XuiLeaderboardEntrySmall +540.000000 +22.000000 +15 + + + +button_graphic +540.000000 +20.000000 +15 +Graphics\LeaderboardButton_Norm.png + + + + +highlight_graphic +540.000000 +20.000000 +15 +false +Graphics\LeaderboardButton_Over.png + + + + +text_Ranking +52.000000 +20.000000 +4.000000,0.000000,0.000000 +11 +0xffebebeb +0xff0f0f0f +8.000000 +5140 + + + + +text_Gamertag +186.000000 +20.000000 +58.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +15 +0xffebebeb +0xff0f0f0f +8.000000 +21524 +1 + + + + +text_Column1 +40.000000 +20.000000 +246.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffebebeb +0xff0f0f0f +8.000000 +5140 +3 + + + + +text_Column2 +40.000000 +20.000000 +288.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffebebeb +0xff0f0f0f +8.000000 +5140 +4 + + + + +text_Column3 +40.000000 +20.000000 +330.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffebebeb +0xff0f0f0f +8.000000 +5140 +5 + + + + +text_Column4 +40.000000 +20.000000 +372.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffebebeb +0xff0f0f0f +8.000000 +5140 +6 + + + + +text_Column5 +40.000000 +20.000000 +414.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffebebeb +0xff0f0f0f +8.000000 +5140 +7 + + + + +text_Column6 +40.000000 +20.000000 +456.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffebebeb +0xff0f0f0f +8.000000 +5140 +8 + + + + +text_Column7 +40.000000 +20.000000 +498.000000,0.000000,0.000000 +0.000000,-0.000000,0.000000,0.999999 +14 +0xffebebeb +0xff0f0f0f +8.000000 +5140 +9 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + +text_Ranking +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Gamertag +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column1 +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column2 +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column3 +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column4 +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column5 +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column6 +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +text_Column7 +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebcc0f + + + +0 +0xffebcc0f + + + +highlight_graphic +Show + + +0 +false + + + +0 +false + + + +0 +true + + + +0 +true + + + +button_graphic +Show + + +0 +true + + + +0 +true + + + +0 +false + + + +0 +false + + + + + + +XuiListLeaderboardSmall +560.000000 +100.000000 + + + +graphic_groupbackground +560.000000 +100.000000 +15 + + + +Bot_R +16.000000 +16.000000 +544.344849,84.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +528.344849 +16.000000 +16.000000,84.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,84.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +544.344849,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +528.344849 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +68.001961 +544.344849,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +528.344849 +68.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +68.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + + +control_ScrollUp +22.000000 +15.000000 +506.000000,76.000000,0.000000 +12 +XuiScrollEndUp + + + + +control_ScrollDown +22.000000 +15.000000 +528.000000,76.000008,0.000000 +12 +XuiScrollEnd +1 + + + + +control_ListItem +540.000000 +22.000000 +10.000000,52.000000,0.000000 +15 +XuiLeaderboardEntrySmall +22594 +0.000000,2.000000,0.000000 + + + + +XuiLabel_Rank +20.000000 +10.000000,21.000000,0.000000 +2 +false +XuiLabelDarkCentredSmall + + + + +XuiLabel_Gamertag +186.000000 +20.000000 +68.000000,21.000000,0.000000 +2 +false +XuiLabelDarkCentredSmall + + + + +XuiHSlot1 +32.000000 +32.000000 +260.000000,15.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton32 + + + + +XuiHSlot2 +32.000000 +32.000000 +301.999969,15.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton32 + + + + +XuiHSlot3 +32.000000 +32.000000 +343.999969,15.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton32 + + + + +XuiHSlot4 +32.000000 +32.000000 +385.999939,15.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton32 + + + + +XuiHSlot5 +32.000000 +32.000000 +427.999939,15.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton32 + + + + +XuiHSlot6 +32.000000 +32.000000 +469.999939,15.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton32 + + + + +XuiHSlot7 +32.000000 +32.000000 +512.000000,16.000000,0.000000 +4 +false +7 +CXuiCtrlCraftIngredientSlot +ItemButton32 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemButtonRed72 +72.000000 +72.000000 + + + +Box +72.000000 +72.000000 +15 +4 +Graphics\IconHolder.png +48 + + + + +BoxRed +72.000000 +72.000000 +15 +false +4 +Graphics\IconHolderRed.png +48 + + + + +image +65.000000 +65.000000 +4.000000,4.000000,0.000000 +207 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +64.000000 +64.000000 +4.000000,4.000000,0.000000 +0.000000 +207 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + +text_name +191.041656 +27.000000 +12.000000,-12.000000,1.000000 +3 +false +0xffebebeb +0xdc0f0f0f +18.000000 +273 +2 + + + + +Exclaim +16.000000 +16.000000 +2.000000,2.000000,0.000000 +3 +false +Graphics\Warning.png + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + +text_name +Show + + +0 +false + + + +0 +false + + + +0 +true + + + +0 +true + + + +0 +true + + + +0 +false + + + +0 +false + + + +0 +false + + + +0 +false + + + +0 +false + + + +0 +true + + + +0 +true + + + +0 +false + + + +0 +false + + + + + + +ItemButtonRedSmall +38.000000 +38.000000 + + + +Box +38.000000 +38.000000 +15 +4 +Graphics\IconHolder_Small.png +48 + + + + +BoxRed +38.000000 +38.000000 +15 +false +4 +Graphics\IconHolderRed_Small.png +48 + + + + +image +34.000000 +34.000000 +2.000000,2.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +34.000000 +34.000000 +2.000000,2.000000,0.000000 +0.000000 +207 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + +text_name +321.000000 +34.000000 +42.000000,2.000000,1.000000 +15 +false +0xff323232 +0xdc0f0f0f +12.000000 +4368 +2 + + + + +Exclaim +16.000000 +16.000000 +1.000000,1.000000,0.000000 +3 +false +Graphics\Warning.png + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +ItemButtonRed +42.000000 +42.000000 + + + +Box +42.000000 +42.000000 +15 +4 +Graphics\IconHolder.png + + + + +BoxRed +42.000000 +42.000000 +15 +false +4 +Graphics\IconHolderRed.png +48 + + + + +image +38.000000 +38.000000 +2.000000,2.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +38.000000 +38.000000 +2.000000,2.000000,0.000000 +0.000000 +207 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + +text_name +320.000000 +42.000000 +42.000000,0.000000,1.000000 +15 +false +0xff3c3c3c +0xdc0f0f0f +4368 +2 + + + + +Exclaim +16.000000 +16.000000 +2.000000,2.000000,0.000000 +3 +false +Graphics\Warning.png + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +ItemGridVerticalSmall +32.000000 +32.000000 + + + +control_ListItem +34.000000 +34.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemButton22 +22.000000 +22.000000 + + + +Box +22.000000 +22.000000 +15 +4 +Graphics\IconHolder_Small.png +48 + + + + +image +20.000000 +20.000000 +1.000000,1.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +20.000000 +20.000000 +1.000000,1.000000,0.000000 +0.000000 +15 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +ItemButton24 +24.000000 +24.000000 + + + +Box +24.000000 +24.000000 +15 +4 +Graphics\IconHolder_Small.png +48 + + + + +image +22.000000 +22.000000 +1.000000,1.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +22.000000 +22.000000 +1.000000,1.000000,0.000000 +0.000000 +15 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +ItemButton26 +26.000000 +26.000000 + + + +Box +26.000000 +26.000000 +15 +4 +Graphics\IconHolder_Small.png +48 + + + + +image +22.000000 +22.000000 +2.000000,2.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +24.000000 +24.000000 +1.000000,1.000000,0.000000 +0.000000 +15 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +ItemButton32 +32.000000 +32.000000 + + + +Box +32.000000 +32.000000 +15 +4 +Graphics\IconHolder_Small.png +48 + + + + +image +28.000000 +28.000000 +2.000000,2.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +28.000000 +28.000000 +2.000000,2.000000,0.000000 +0.000000 +15 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +ItemButton54 +54.000000 +54.000000 + + + +Box +54.000000 +54.000000 +15 +4 +Graphics\IconHolder.png +48 + + + + +image +48.000000 +48.000000 +2.000000,2.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +48.000000 +48.000000 +2.000000,2.000000,0.000000 +0.000000 +15 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +ItemGridVertical22 +22.000000 +22.000000 + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemGridVertical24 +24.000000 +24.000000 + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemGridVertical54 +54.000000 +54.000000 + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemGridVertical26 +26.000000 +26.000000 + + + +control_ListItem +26.000000 +26.000000 +7 +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemGridVertical32 +32.000000 +32.000000 + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemGridVertical +60.000000 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemButton +42.000000 +42.000000 + + + +Box +42.000000 +42.000000 +15 +4 +Graphics\IconHolder.png +48 + + + + +image +38.000000 +38.000000 +2.000000,2.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +38.000000 +38.000000 +2.000000,2.000000,0.000000 +0.000000 +15 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +ItemPointer +42.000000 +42.000000 + + + +item_image +42.000000 +42.000000 +5.000000,2.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +pointer_image +42.000000 +42.000000 +15 +2 +Graphics\Pointer.png +48 + + + + +text_panel +32.000000 +32.000000 +24.000000,-12.000000,0.000000 +15 +PointerTextPanel + + + + +text_name +22.000000 +21.000000 +28.000000,-7.000000,0.000000 +33 + + + + +text_measurer +240.000000 +40.000000 +-16.435925,-75.812302,0.000000 +false +0xff0f0f0f +0x800f0f0f +1041 + + + + + +PointerTextPanel +32.000000 +32.000000 + + + +graphic_groupbackground +32.000000 +32.000000 +15 + + + +Bot_R +8.000000 +8.000000 +24.000000,24.000000,0.000000 +12 +Graphics\PanelsAndTabs\PointerTextPanel_BR.png +48 + + + + +Bot_M +16.000000 +8.000000 +8.000000,24.000000,0.000000 +13 +4 +Graphics\PanelsAndTabs\PointerTextPanel_BM.png +48 + + + + +Bot_L +8.000000 +8.000000 +0.000000,24.000000,0.000000 +9 +Graphics\PanelsAndTabs\PointerTextPanel_BL.png +48 + + + + +Top_R +8.000000 +8.000000 +24.000000,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\PointerTextPanel_TR.png +48 + + + + +Top_M +16.000000 +8.000000 +8.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\PointerTextPanel_TM.png +48 + + + + +Top_L +8.000000 +8.000000 +3 +Graphics\PanelsAndTabs\PointerTextPanel_TL.png +48 + + + + +Mid_R +8.000000 +16.000000 +24.000000,8.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MR.png +48 + + + + +Mid_M +16.000000 +16.000000 +8.000000,8.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MM.png +48 + + + + +Mid_L +8.000000 +16.000000 +0.000000,8.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\PointerTextPanel_ML.png +48 + + + + + + +ItemPointerSmall +26.000000 +26.000000 + + + +item_image +26.000000 +26.000000 +7.000000,3.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +pointer_image +26.000000 +26.000000 +15 +2 +Graphics\Pointer.png +48 + + + + +text_panel +32.000000 +32.000000 +24.000000,-12.000000,0.000000 +15 +PointerTextPanel + + + + +text_name +22.000000 +21.000000 +28.000000,-7.000000,0.000000 +33 + + + + +text_measurer +240.000000 +40.000000 +-16.435925,-75.812302,0.000000 +false +0xff0f0f0f +0x800f0f0f +12.000000 +1041 + + + + + +ItemGridVertical64 +64.000000 +64.000000 + + + +control_ListItem +64.000000 +64.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButton64 +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemButton64 +64.000000 +64.000000 + + + +Box +64.000000 +64.000000 +15 +4 +Graphics\IconHolder.png +48 + + + + +image +58.000000 +58.000000 +3.000000,3.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +58.000000 +58.000000 +3.000000,3.000000,0.000000 +0.000000 +15 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +ItemIcon +64.000000 +64.000000 + + + +Box +64.000000 +64.000000 +15 +4 +Graphics\IconHolder.png +48 + + + + +image +58.000000 +58.000000 +3.000000,3.000000,0.000000 +15 +CXuiCtrl4JIcon +XuiVisualImagePresenter + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + + + + +HtmlItemDescriptionSmall +32.000000 +32.000000 + + + +text_panel +32.000000 +32.000000 +15 +PointerTextPanel + + + + +text_name +22.000000 +21.000000 +4.000000,5.000000,0.000000 +15 + + + + +text_measurer +240.000000 +40.000000 +-16.435925,-75.812302,0.000000 +false +0xff0f0f0f +0x800f0f0f +12.000000 +1041 + + + + + +HtmlItemDescription +32.000000 +32.000000 + + + +text_panel +32.000000 +32.000000 +15 +PointerTextPanel + + + + +text_name +22.000000 +21.000000 +4.000000,5.000000,0.000000 +15 + + + + +text_measurer +240.000000 +40.000000 +-16.435925,-75.812302,0.000000 +false +0xff0f0f0f +0x800f0f0f +1041 + + + + + +InventoryArmourBackground +42.000000 +168.000000 + + + +FeetBox +42.000000 +42.000000 +0.000107,126.000000,0.000000 +4 +Graphics\IconHolder.png + + + + +LegsBox +42.000000 +42.000000 +0.000107,84.000000,0.000000 +4 +Graphics\IconHolder.png + + + + +BodyBox +42.000000 +42.000000 +0.000107,42.000004,0.000000 +4 +Graphics\IconHolder.png + + + + +HeadBox +42.000000 +42.000000 +0.000107,0.000004,0.000000 +4 +Graphics\IconHolder.png + + + + +FeetIcon +38.000000 +38.000000 +2.000000,128.000000,0.000000 +4 +Graphics\Armour_Slot_Feet.png +48 + + + + +LegsIcon +38.000000 +38.000000 +2.000000,86.000000,0.000000 +4 +Graphics\Armour_Slot_Legs.png +48 + + + + +BodyIcon +38.000000 +38.000000 +2.000000,44.000000,0.000000 +4 +Graphics\Armour_Slot_Body.png +48 + + + + +HeadIcon +38.000000 +38.000000 +2.000000,2.000000,0.000000 +4 +Graphics\Armour_Slot_Head.png +48 + + + + + +InventoryArmourBackgroundSmall +26.000000 +104.000000 + + + +FeetBox +26.000000 +26.000000 +0.000107,78.000000,0.000000 +4 +Graphics\IconHolder_Small.png + + + + +LegsBox +26.000000 +26.000000 +0.000107,52.000000,0.000000 +4 +Graphics\IconHolder_Small.png + + + + +BodyBox +26.000000 +26.000000 +0.000107,26.000004,0.000000 +4 +Graphics\IconHolder_Small.png + + + + +HeadBox +26.000000 +26.000000 +0.000107,0.000004,0.000000 +4 +Graphics\IconHolder_Small.png + + + + +FeetIcon +26.000000 +26.000000 +0.000000,78.000000,0.000000 +4 +Graphics\Armour_Slot_Feet.png +48 + + + + +LegsIcon +26.000000 +26.000000 +0.000000,52.000000,0.000000 +4 +Graphics\Armour_Slot_Legs.png +48 + + + + +BodyIcon +26.000000 +26.000000 +0.000000,26.000000,0.000000 +4 +Graphics\Armour_Slot_Body.png +48 + + + + +HeadIcon +26.000000 +26.000000 +4 +Graphics\Armour_Slot_Head.png +48 + + + + + +MobEffect +260.000000 +58.000000 +15 + + + +graphic_groupbackground +260.000000 +58.000000 +15 + + + +Bot_R +8.000000 +8.000000 +252.000000,50.000000,0.000000 +12 +Graphics\PanelsAndTabs\PointerTextPanel_BR.png +48 + + + + +Bot_M +244.000000 +8.000000 +8.000000,50.000000,0.000000 +13 +4 +Graphics\PanelsAndTabs\PointerTextPanel_BM.png +48 + + + + +Bot_L +8.000000 +8.000000 +0.000000,50.000000,0.000000 +9 +Graphics\PanelsAndTabs\PointerTextPanel_BL.png +48 + + + + +Top_R +8.000000 +8.000000 +252.000000,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\PointerTextPanel_TR.png +48 + + + + +Top_M +244.000000 +8.000000 +8.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\PointerTextPanel_TM.png +48 + + + + +Top_L +8.000000 +8.000000 +3 +Graphics\PanelsAndTabs\PointerTextPanel_TL.png +48 + + + + +Mid_R +8.000000 +42.000000 +252.000000,8.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MR.png +48 + + + + +Mid_M +244.000000 +42.000000 +8.000000,8.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MM.png +48 + + + + +Mid_L +8.000000 +42.000000 +0.000000,8.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\PointerTextPanel_ML.png +48 + + + + + +Icon +36.000000 +36.000000 +7.000000,10.000000,0.000000 +false +16 +48 + + + + +EffectName +204.000000 +22.000000 +47.000000,5.000000,0.000000 +4 +0xffebebeb +0xff606060 +17 +1 + + + + +EffectDuration +204.000000 +22.000000 +47.000000,27.000000,0.000000 +4 +0xffa0a0a0 +0xff0f0f0f +17 +2 + + + + + +Normal + +stop + + +Blindness + +stop + + +Fire_Resistance + +stop + + +Haste + +stop + + +Hunger + +stop + + +Invisibility + +stop + + +Jump_Boost + +stop + + +Mining_Fatigue + +stop + + +Nausea + +stop + + +Night_Vision + +stop + + +Poison + +stop + + +Regeneration + +stop + + +Resistance + +stop + + +Slowness + +stop + + +Speed + +stop + + +Strength + +stop + + +Water_Breathing + +stop + + +Weakness + +stop + + + +Icon +Show +ImagePath + + +0 +false + + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Blindness.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Fire_Resistance.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Haste.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Hunger.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Invisibility.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Jump_Boost.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Mining_Fatigue.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Nausea.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Night_Vision.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Poison.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Regeneration.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Resistance.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Slowness.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Speed.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Strength.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Water_Breathing.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Weakness.png + + + + + + +MobEffect_Small +160.000000 +36.000000 +15 + + + +graphic_groupbackground +160.000000 +36.000000 +15 + + + +Bot_R +8.000000 +8.000000 +152.000000,28.000000,0.000000 +12 +Graphics\PanelsAndTabs\PointerTextPanel_BR.png +48 + + + + +Bot_M +144.000000 +8.000000 +8.000000,28.000000,0.000000 +13 +4 +Graphics\PanelsAndTabs\PointerTextPanel_BM.png +48 + + + + +Bot_L +8.000000 +8.000000 +0.000000,28.000000,0.000000 +9 +Graphics\PanelsAndTabs\PointerTextPanel_BL.png +48 + + + + +Top_R +8.000000 +8.000000 +152.000000,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\PointerTextPanel_TR.png +48 + + + + +Top_M +144.000000 +8.000000 +8.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\PointerTextPanel_TM.png +48 + + + + +Top_L +8.000000 +8.000000 +3 +Graphics\PanelsAndTabs\PointerTextPanel_TL.png +48 + + + + +Mid_R +8.000000 +20.000000 +152.000000,8.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MR.png +48 + + + + +Mid_M +144.000000 +20.000000 +8.000000,8.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MM.png +48 + + + + +Mid_L +8.000000 +20.000000 +0.000000,8.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\PointerTextPanel_ML.png +48 + + + + + +Icon +18.000000 +18.000000 +6.000000,8.000000,0.000000 +false +16 +48 + + + + +EffectName +125.000000 +20.000000 +27.000000,1.000000,0.000000 +4 +0xffebebeb +0xff606060 +12.000000 +17 +1 + + + + +EffectDuration +125.000000 +20.000000 +27.000000,15.000000,0.000000 +4 +0xffa0a0a0 +0xff0f0f0f +12.000000 +17 +2 + + + + + +Normal + +stop + + +Blindness + +stop + + +Fire_Resistance + +stop + + +Haste + +stop + + +Hunger + +stop + + +Invisibility + +stop + + +Jump_Boost + +stop + + +Mining_Fatigue + +stop + + +Nausea + +stop + + +Night_Vision + +stop + + +Poison + +stop + + +Regeneration + +stop + + +Resistance + +stop + + +Slowness + +stop + + +Speed + +stop + + +Strength + +stop + + +Water_Breathing + +stop + + +Weakness + +stop + + + +Icon +Show +ImagePath + + +0 +false + + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Blindness.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Fire_Resistance.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Haste.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Hunger.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Invisibility.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Jump_Boost.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Mining_Fatigue.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Nausea.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Night_Vision.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Poison.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Regeneration.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Resistance.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Slowness.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Speed.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Strength.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Water_Breathing.png + + + +0 +true +Graphics\PotionEffect\Potion_Effect_Icon_Weakness.png + + + + + + +CharacterPanel +283.000000 +36.000000 + + + +graphic_Middle +282.000000 +35.000000 +15 + + +0xff646464 + + + + +0xff0f0f0f + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + +graphic_BottomEdge +283.000000 +2.000000 +0.000000,34.000000,0.000000 +13 + + +0xffebebeb + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119690,0.000000,0,242.119690,0.000000,242.119690,0.000000,242.119690,2.000000,0,242.119690,2.000000,242.119690,2.000000,0.000000,2.000000,0,0.000000,2.000000,0.000000,2.000000,0.000000,0.000000,0, + + + + +graphic_CapLeft +2.000000 +36.000000 +11 + + +0xff646464 + + + + +0xff373737 + + +true +4 +0xff7d7d7d +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.086275 +0.466667 +0.494118 +0.682353 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,3.000000,0.000000,0,3.000000,0.000000,3.000000,0.000000,3.000000,35.000000,0,3.000000,35.000000,3.000000,35.000000,0.000000,35.000000,0,0.000000,35.000000,0.000000,35.000000,0.000000,0.000000,0, + + + + +graphic_CapRight +2.000000 +35.000000 +281.000000,0.000000,0.000000 +14 + + +0xff646464 + + + + +0xffebebeb + + +true +4 +0xff7d7d7d +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.086275 +0.466667 +0.494118 +0.682353 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,3.000000,0.000000,0,3.000000,0.000000,3.000000,0.000000,3.000000,35.000000,0,3.000000,35.000000,3.000000,35.000000,0.000000,35.000000,0,0.000000,35.000000,0.000000,35.000000,0.000000,0.000000,0, + + + + +graphic_TopEdge +283.000000 +2.000000 +7 + + +0xff373737 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119720,0.000000,0,242.119720,0.000000,242.119720,0.000000,242.119720,2.000000,0,242.119720,2.000000,242.119720,2.000000,0.000000,2.000000,0,0.000000,2.000000,0.000000,2.000000,0.000000,0.000000,0, + + + + +PlayerControl +283.000000 +36.000000 +15 +CXuiCtrlMinecraftPlayer + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Middle +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Fill.Gradient.StopPos + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.592157 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.592157 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.592157 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +0.592157 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.592157 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.592157 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.592157 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.592157 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.592157 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.592157 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.592157 + + + +1 +0.490196 +0xff8cb48c +0xff8cb48c +0xff8ca08c +0xff649664 +0xff8cb48c +0.376471 + + + +2 +0 +0 +50 +0.490196 +0xff8cb48c +0xff8cb48c +0xff8ca08c +0xff649664 +0xff8cb48c +0.376471 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.592157 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.592157 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.592157 + + + +graphic_BottomEdge +Fill.FillColor + + +1 +0xffebebeb + + + +0 +0xff0f0f0f + + + +1 +0xff0f0f0f + + + +0 +0xff0f0f0f + + + +1 +0xffb4b4b4 + + + +0 +0xffebebeb + + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +1 +0xffebebeb + + + +0 +0xff0f0f0f + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +graphic_TopEdge +Fill.FillColor + + +1 +0xff373737 + + + +0 +0xffebebeb + + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +1 +0xffb4b4b4 + + + +0 +0xff0f0f0f + + + +1 +0xff0f0f0f + + + +0 +0xff0f0f0f + + + +1 +0xff0f0f0f + + + +0 +0xffebebeb + + + +0 +0xff0f0f0f + + + +0 +0xff0f0f0f + + + +graphic_CapLeft +Fill.FillColor + + +1 +0xff373737 + + + +0 +0xffebebeb + + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xff0f0f0f + + + +0 +0xff0f0f0f + + + +0 +0xff0f0f0f + + + +0 +0xff0f0f0f + + + +0 +0xff0f0f0f + + + +0 +0xff0f0f0f + + + +0 +0xff0f0f0f + + + +0 +0xff0f0f0f + + + +graphic_CapRight +Fill.FillColor + + +1 +0xffebebeb + + + +0 +0xff0f0f0f + + + +1 +0xff0f0f0f + + + +0 +0xff0f0f0f + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebebeb + + + + + + +ArrowProgressState +72.000000 +48.000000 + + + +control_for_data_binding_only +155.000000 +23.000000 +8.000000,85.185188,0.000000 +13 +0xff323232 +13.000000 +5136 + + + + +ProgressBody +72.000000 +48.000000 +15 + + + +ArrowOff +72.000000 +48.000000 +Graphics\Arrow_Off.png + + + + +ArrowOn +0.000000 +48.000000 +false +Graphics\Arrow_On.png + + + + +ArrowOn +Anchor +Width +Show + + +0 +0 +0.000000 +false + + + +0 +0 +2.400000 +true + + + +0 +8 +72.000000 +true + + + + + + + +Normal + + + +EndNormal + + + + + + + +FlameProgressState +48.000000 +48.000000 + + + +ProgressBody +48.000000 +48.000000 +207 + + + +FlameOff +48.000000 +48.000000 +Graphics\Flame_Off.png + + + + +FlameOn +48.000000 +0.000000 +48.000000,48.000000,0.000000 +0.000000,-0.000000,-1.000000,0.000000 +false +Graphics\Flame_On.png + + + + +FlameOn +Height +Anchor +Show + + +0 +0.000000 +0 +false + + + +0 +1.600000 +0 +true + + + +0 +48.000000 +8 +true + + + + + + +control_for_data_binding_only +155.000000 +23.000000 +15.000001,80.185188,0.000000 +13 +0xff323232 +13.000000 +5136 + + + + + +Normal + + + +EndNormal + + + + + + + +ItemGridArmour +60.000000 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButtonArmour +..\Images\img1.png +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemButtonArmour +42.000000 +42.000000 + + + +image +38.000000 +38.000000 +2.000000,2.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +38.000000 +38.000000 +2.000000,2.000000,0.000000 +0.000000 +15 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +CraftingProgressArrowSmall +32.000000 +32.000000 + + + +ProgressBody +32.000000 +32.000000 +15 + + + +Arrow_Off +32.000000 +32.000000 +Graphics\Arrow_Small_Off.png + + + + +Arrow_On +32.000000 +32.000000 +1 +false +Graphics\Arrow_Small_On.png + + + + +Arrow_On +Show +Width + + +0 +false +32.000000 + + + +0 +true +0.000000 + + + +0 +true +32.000000 + + + +0 +false +32.000000 + + + + + + + +Normal + + + +EndNormal + + + + + + + +FlameProgressStateSmall +32.000000 +32.000000 + + + +ProgressBody +32.000000 +32.000000 +207 + + + +FlameOff +32.000000 +32.000000 +4 +Graphics\Flame_Off_Small.png + + + + +FlameOn +32.000000 +0.000000 +32.000000,32.000000,0.000000 +0.000000,-0.000000,-1.000000,0.000000 +false +Graphics\Flame_On_Small.png + + + + +FlameOn +Height +Anchor +Show + + +0 +0.000000 +0 +false + + + +0 +1.600000 +0 +true + + + +0 +32.000000 +8 +true + + + + + + +control_for_data_binding_only +155.000000 +23.000000 +15.000001,80.185188,0.000000 +13 +0xff323232 +13.000000 +5136 + + + + + +Normal + + + +EndNormal + + + + + + + +ItemButtonArmour26 +26.000000 +26.000000 + + + +image +24.000000 +24.000000 +1.000000,1.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +24.000000 +24.000000 +1.000000,1.000000,0.000000 +0.000000 +15 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +ItemGridArmour26 +26.000000 +26.000000 + + + +control_ListItem +26.000000 +26.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButtonArmour26 +..\Images\img1.png +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ArrowProgressStateSmall +32.000000 +32.000000 + + + +control_for_data_binding_only +155.000000 +23.000000 +8.000000,85.185188,0.000000 +13 +0xff323232 +13.000000 +5136 + + + + +ProgressBody +32.000000 +32.000000 +15 + + + +ArrowOff +32.000000 +32.000000 +Graphics\Arrow_Small_Off.png + + + + +ArrowOn +0.000000 +32.000000 +false +Graphics\Arrow_Small_On.png + + + + +ArrowOn +Anchor +Width +Show + + +0 +0 +0.000000 +false + + + +0 +0 +2.400000 +true + + + +0 +8 +32.000000 +true + + + + + + + +Normal + + + +EndNormal + +stop + + + + + + +EnchantmentButton +240.000000 +42.000000 +15 + + + +button_graphic_disabled +240.000000 +42.000000 +15 +false +Graphics\EnchantmentButtonEmpty.png +48 + + + + +button_graphic +240.000000 +42.000000 +15 +Graphics\EnchantmentButtonActive.png +48 + + + + +button_graphic_selected +240.000000 +42.000000 +15 +false +Graphics\EnchantmentButtonActive.png +48 + + + + +EnchantText +218.000000 +32.000000 +6.000000,5.000000,0.000000 +CXuiCtrlEnchantmentButtonText + + + + +text_Label +40.000000 +26.000000 +194.000000,16.000000,0.000000 +15 +0xff80eb20 +0xff0f0f0f +16.000000 +21013 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + + +text_Label +TextColor + + +1 +0xff80eb20 + + + +1 +0xffc6110f + + + +1 +0xffc6110f + + + +1 +0xffc6110f + + + +button_graphic +Show + + +0 +true + + + +0 +true + + + +0 +false + + + +button_graphic_selected +Show +ImagePath + + +0 +false +Graphics\EnchantmentButtonActive.png + + + +0 +false +Graphics\EnchantmentButtonActive.png + + + +0 +true +Graphics\EnchantmentButtonSelected.png + + + +0 +true +Graphics\EnchantmentButtonSelected.png + + + +0 +false +Graphics\EnchantmentButtonSelected.png + + + +button_graphic_disabled +Show + + +0 +false + + + +0 +true + + + +0 +true + + + +0 +true + + + + + + +EnchantmentButton_Small +140.000000 +15 + + + +button_graphic_disabled +140.000000 +15 +false +Graphics\EnchantmentButtonEmpty_small.png +48 + + + + +button_graphic +140.000000 +15 +Graphics\EnchantmentButtonActive_small.png +48 + + + + +button_graphic_selected +140.000000 +15 +false +Graphics\EnchantmentButtonSelected_small.png +48 + + + + +EnchantText +132.000000 +24.000000 +3.000000,3.000000,0.000000 +CXuiCtrlEnchantmentButtonText + + + + +text_Label +30.000000 +18.000000 +106.000000,12.000000,0.000000 +15 +0xff80eb20 +0xff0f0f0f +12.000000 +21013 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + + +button_graphic_disabled +Show + + +0 +false + + + +0 +true + + + +0 +true + + + +0 +true + + + +button_graphic +Show + + +0 +true + + + +0 +true + + + +0 +false + + + +button_graphic_selected +Show + + +0 +false + + + +0 +false + + + +0 +true + + + +0 +true + + + +0 +false + + + +text_Label +TextColor + + +1 +0xff80eb20 + + + +1 +0xffc6110f + + + +0 +0xffc6110f + + + +0 +0xffc6110f + + + + + + +ItemGridEnchant +42.000000 +42.000000 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButtonEnchant +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemButtonEnchant +42.000000 +42.000000 + + + +Box +42.000000 +42.000000 +15 +4 +Graphics\IconHolder.png +48 + + + + +Icon +38.000000 +38.000000 +2.000000,2.000000,0.000000 +15 +2 +Graphics\Enchant_Slot.png +48 + + + + +image +38.000000 +38.000000 +2.000000,2.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +38.000000 +38.000000 +2.000000,2.000000,0.000000 +0.000000 +15 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +ItemGridEnchant32 +32.000000 +32.000000 + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButtonEnchant32 +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemButtonEnchant32 +32.000000 +32.000000 + + + +Box +32.000000 +32.000000 +15 +4 +Graphics\IconHolder_Small.png +48 + + + + +Icon +28.000000 +28.000000 +2.000000,2.000000,0.000000 +15 +2 +Graphics\Enchant_Slot_Small.png +48 + + + + +image +28.000000 +28.000000 +2.000000,2.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +28.000000 +28.000000 +2.000000,2.000000,0.000000 +0.000000 +15 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +ItemButtonBrewing +52.000000 +52.000000 + + + +image +48.000000 +48.000000 +2.000000,2.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +graphic_Highlight +48.000000 +48.000000 +2.000000,2.000000,0.000000 +0.000000 +15 + + +0xff646464 + + + + +0xb4ebebeb + + +4 +0xff828282 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0.000000 +0.592157 +0.627451 +1.000000 + + +90.000000 + + +true +4,0.000000,0.000000,0.000000,0.000000,242.119705,0.000000,1,242.119705,0.000000,242.119705,0.000000,242.119705,31.004648,1,242.119705,31.004648,242.119705,31.004648,0.000000,31.006342,1,0.000000,31.006342,0.000000,31.006342,0.000000,0.000000,1, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +graphic_Highlight +Fill.Gradient.StopPos +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Fill.Gradient.StopColor +Stroke.StrokeColor +Fill.Gradient.StopColor +Opacity + + +1 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +0.000000 + + + +0 +0.627451 +0xff828282 +0xffd2d2d2 +0xffebebeb +0xff646464 +0xffb4b4b4 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +0 +0.619608 +0xff829682 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff96c896 +1.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +1.000000 + + + +1 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.627451 +0xffb4b4b4 +0xffd2d2d2 +0xffebebeb +0xffb4b4b4 +0xffc8c8c8 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +0 +0.619608 +0xff8cb48c +0xffc3cdc3 +0xffdaebda +0xff648464 +0xff91b18c +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff647264 +0xffaaafa0 +0.000000 + + + +2 +0 +0 +50 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff648264 +0xffc8d2c8 +0xffc8ebc8 +0xff649664 +0xff78b478 +0.000000 + + + +0 +0.619608 +0xff8c968c +0xffbec8be +0xffebebeb +0xff649664 +0xffaaafa0 +0.000000 + + + + + + +ItemGridBrewing36 +36.000000 +36.000000 + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +ItemGridBrewing +52.000000 +52.000000 + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +KillFocus + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +BrewingBackground_Small +128.000000 +108.000000 + + + +Image +128.000000 +108.000000 +Graphics\BrewingStand_small.png +48 + + + + + +BrewingBackground +192.000000 +192.000000 + + + +BrewingStand +192.000000 +192.000000 +15 +Graphics\BrewingStand.png +48 + + + + + +BrewingBubblesProgressState +36.000000 +84.000000 + + + +ProgressBody +36.000000 +84.000000 +207 + + + +BubbleOff +36.000000 +84.000000 +Graphics\BrewingBubbles_Off.png + + + + +BubbleOn +36.000000 +0.000000 +36.000000,84.000000,0.000000 +0.000000,0.000000,-1.000000,0.000000 +false +Graphics\BrewingBubbles_On.png + + + + +BubbleOn +Height +Anchor +Show + + +0 +0.000000 +0 +false + + + +0 +0.000000 +0 +true + + + +0 +84.000000 +8 +true + + + + + + +control_for_data_binding_only +155.000000 +23.000000 +15.000001,80.185188,0.000000 +13 +0xff323232 +13.000000 +5136 + + + + + +Normal + + + +EndNormal + + + + + + + +BrewingBubblesProgressStateSmall +24.000000 +56.000000 + + + +ProgressBody +24.000000 +56.000000 +207 + + + +BubbleOff +36.000000 +84.000000 +Graphics\BrewingBubbles_Small_Off.png +48 + + + + +BubbleOn +24.000000 +0.000000 +24.000000,56.000000,0.000000 +0.000000,0.000000,-1.000000,0.000000 +false +Graphics\BrewingBubbles_Small_On.png +48 + + + + +BubbleOn +Height +Anchor +Show + + +0 +0.000000 +0 +false + + + +0 +0.000000 +0 +true + + + +0 +56.000000 +8 +true + + + + + + +control_for_data_binding_only +155.000000 +23.000000 +15.000001,80.185188,0.000000 +13 +0xff323232 +13.000000 +5136 + + + + + +Normal + + + +EndNormal + + + + + + + +BrewingArrowProgressStateSmall +18.000000 +56.000000 +15 + + + +control_for_data_binding_only +155.000000 +23.000000 +8.000000,85.185188,0.000000 +13 +0xff323232 +13.000000 +5136 + + + + +ProgressBody +18.000000 +56.000000 +15 + + + +ArrowOff +18.000000 +56.000000 +15 +Graphics\BrewingArrow_Small_Off.png +48 + + + + +ArrowOn +18.000000 +0.000000 +15 +false +Graphics\BrewingArrow_Small_On.png +48 + + + + +ArrowOn +Show +Height + + +0 +false +0.000000 + + + +0 +true +56.000000 + + + +0 +true +0.000000 + + + + + + + +Normal + + + +EndNormal + + + + + + + +BrewingArrowProgressState +27.000000 +84.000000 +15 + + + +control_for_data_binding_only +155.000000 +23.000000 +8.000000,85.185188,0.000000 +13 +0xff323232 +13.000000 +5136 + + + + +ProgressBody +27.000000 +84.000000 +15 + + + +ArrowOff +27.000000 +84.000000 +15 +Graphics\BrewingArrow_Off.png +48 + + + + +ArrowOn +27.000000 +0.000000 +15 +false +Graphics\BrewingArrow_On.png +48 + + + + +ArrowOn +Show +Height + + +0 +false +0.000000 + + + +0 +true +84.000000 + + + +0 +true +0.000000 + + + + + + + +Normal + + + +EndNormal + + + + + + + +AnvilCross +15.000000 +15.000000 + + + +AnvilCross +15.000000 +15.000000 +15 +4 +Graphics\AnvilCross.png +48 + + + + + +AnvilPlus +15.000000 +15.000000 + + + +AnvilPlus +15.000000 +15.000000 +15 +4 +Graphics\AnvilPlus.png +48 + + + + + +AnvilHammer +15.000000 +15.000000 + + + +AnvilHammer +15.000000 +15.000000 +15 +4 +Graphics\AnvilHammer.png +48 + + + + + +BossHealthLabel +500.000000 +66.000000 + + + +Text +500.000000 +66.000000 +15 +0xffeb0feb +16.000000 +5137 + + + + + +BossHealthProgress3_480 +400.000000 +15.000000 + + + +ProgressBody +400.000000 +15.000000 + + + +back +406.000000 +15.000000 +-3.000000,0.000000,0.000000 +Graphics\HUD\DragonHealth_Empty3.png +48 + + + + +bar +400.000000 +15.000000 +false +true + + + +bar +400.000000 +15.000000 +Graphics\HUD\DragonHealth_Full3.png +48 + + + + + +design_time_display +400.000000 +15.000000 +15 +false +true + + +1.000000 +0xff646464 + + + + +2 +0xffffffff + + +2 +0xffebebeb +0xff7d7d7d +0.000000 +0.000000 + + + + +true +4,0.000000,0.000000,0.000000,0.000000,170.000000,0.000000,0,170.000000,0.000000,170.000000,0.000000,170.000000,19.000000,0,170.000000,19.000000,170.000000,19.000000,0.000000,19.000000,0,0.000000,19.000000,0.000000,19.000000,0.000000,0.000000,0, + + + + +bar +Show +Width + + +0 +false +400.000000 + + + +0 +true +2.300000 + + + +0 +true +400.000000 + + + + + + + +Normal + + + +EndNormal + + + + + + + +BossHealthProgress2_480 +333.000000 +10.000000 + + + +ProgressBody +333.000000 +10.000000 + + + +back +337.000000 +10.000000 +-2.000000,0.000000,0.000000 +Graphics\HUD\DragonHealth_Empty2.png +48 + + + + +bar +333.000000 +10.000000 +false +true + + + +bar +333.000000 +10.000000 +Graphics\HUD\DragonHealth_Full2.png +48 + + + + + +design_time_display +333.000000 +10.000000 +15 +false +true + + +1.000000 +0xff646464 + + + + +2 +0xffffffff + + +2 +0xffebebeb +0xff7d7d7d +0.000000 +0.000000 + + + + +true +4,0.000000,0.000000,0.000000,0.000000,170.000000,0.000000,0,170.000000,0.000000,170.000000,0.000000,170.000000,19.000000,0,170.000000,19.000000,170.000000,19.000000,0.000000,19.000000,0,0.000000,19.000000,0.000000,19.000000,0.000000,0.000000,0, + + + + +bar +Show +Width + + +0 +false +333.000000 + + + +0 +true +1.665000 + + + +0 +true +333.000000 + + + + + + + +Normal + + + +EndNormal + + + + + + + +BossHealthProgress1_480 +167.000000 +5.000000 + + + +ProgressBody +167.000000 +5.000000 + + + +back +169.000000 +5.000000 +-1.000000,0.000000,0.000000 +Graphics\HUD\DragonHealth_Empty.png +48 + + + + +bar +167.000000 +5.000000 +false +true + + + +bar +167.000000 +5.000000 +Graphics\HUD\DragonHealth_Full.png +48 + + + + + +design_time_display +167.000000 +5.000000 +15 +false +true + + +1.000000 +0xff646464 + + + + +2 +0xffffffff + + +2 +0xffebebeb +0xff7d7d7d +0.000000 +0.000000 + + + + +true +4,0.000000,0.000000,0.000000,0.000000,170.000000,0.000000,0,170.000000,0.000000,170.000000,0.000000,170.000000,19.000000,0,170.000000,19.000000,170.000000,19.000000,0.000000,19.000000,0,0.000000,19.000000,0.000000,19.000000,0.000000,0.000000,0, + + + + +bar +Show +Width + + +0 +false +167.000000 + + + +0 +true +0.835000 + + + +0 +true +167.000000 + + + + + + + +Normal + + + +EndNormal + + + + + + + +BossHealthProgress3 +940.000000 + + + +ProgressBody +940.000000 + + + +back +952.000000 +-6.000000,0.000000,0.000000 +Graphics\HUD\DragonHealth_Empty6.png +48 + + + + +bar +940.000000 +false +true + + + +bar +940.000000 +Graphics\HUD\DragonHealth_Full6.png +48 + + + + + +design_time_display +940.000000 +15 +false +true + + +1.000000 +0xff646464 + + + + +2 +0xffffffff + + +2 +0xffebebeb +0xff7d7d7d +0.000000 +0.000000 + + + + +true +4,0.000000,0.000000,0.000000,0.000000,170.000000,0.000000,0,170.000000,0.000000,170.000000,0.000000,170.000000,19.000000,0,170.000000,19.000000,170.000000,19.000000,0.000000,19.000000,0,0.000000,19.000000,0.000000,19.000000,0.000000,0.000000,0, + + + + +bar +Show +Width + + +0 +false +940.000000 + + + +0 +true +4.700000 + + + +0 +true +940.000000 + + + + + + + +Normal + + + +EndNormal + + + + + + + +BossHealthProgress2 +666.000000 +15.000000 + + + +ProgressBody +666.000000 +15.000000 + + + +back +674.000000 +20.000000 +-4.000000,0.000000,0.000000 +Graphics\HUD\DragonHealth_Empty4.png +48 + + + + +bar +666.000000 +20.000000 +false +true + + + +bar +666.000000 +20.000000 +Graphics\HUD\DragonHealth_Full4.png +48 + + + + + +design_time_display +666.000000 +15.000000 +15 +false +true + + +1.000000 +0xff646464 + + + + +2 +0xffffffff + + +2 +0xffebebeb +0xff7d7d7d +0.000000 +0.000000 + + + + +true +4,0.000000,0.000000,0.000000,0.000000,170.000000,0.000000,0,170.000000,0.000000,170.000000,0.000000,170.000000,19.000000,0,170.000000,19.000000,170.000000,19.000000,0.000000,19.000000,0,0.000000,19.000000,0.000000,19.000000,0.000000,0.000000,0, + + + + +bar +Show +Width + + +0 +false +666.000000 + + + +0 +true +3.330000 + + + +0 +true +666.000000 + + + + + + + +Normal + + + +EndNormal + + + + + + + +BossHealthProgress1 +334.000000 +10.000000 + + + +ProgressBody +334.000000 +10.000000 + + + +back +338.000000 +10.000000 +-2.000000,0.000000,0.000000 +Graphics\HUD\DragonHealth_Empty2.png +48 + + + + +bar +334.000000 +10.000000 +false +true + + + +bar +334.000000 +10.000000 +Graphics\HUD\DragonHealth_Full2.png +48 + + + + + +design_time_display +334.000000 +10.000000 +15 +false +true + + +1.000000 +0xff646464 + + + + +2 +0xffffffff + + +2 +0xffebebeb +0xff7d7d7d +0.000000 +0.000000 + + + + +true +4,0.000000,0.000000,0.000000,0.000000,170.000000,0.000000,0,170.000000,0.000000,170.000000,0.000000,170.000000,19.000000,0,170.000000,19.000000,170.000000,19.000000,0.000000,19.000000,0,0.000000,19.000000,0.000000,19.000000,0.000000,0.000000,0, + + + + +bar +Show +Width + + +0 +false +334.000000 + + + +0 +true +1.670000 + + + +0 +true +334.000000 + + + + + + + +Normal + + + +EndNormal + + + + + + + +HUDHotBarBack +182.000000 +22.000000 + + + +Bar +182.000000 +22.000000 +15 +8 +Graphics\HUD\hotbar_item_back.png +48 + + + + + +ItemHUDHotbar +24.000000 +24.000000 +15 + + + +image +16.000000 +16.000000 +4.000000,4.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +Box1 +24.000000 +24.000000 +15 +false +4 +Graphics\HUD\hotbar_item_selected.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + +Box1 +Show + + +0 +false + + + +0 +false + + + +0 +true + + + +0 +true + + + + + + +ExperienceProgress +548.000000 +15.000000 + + + +ProgressBody +548.000000 +15.000000 + + + +back +182.000000 +5.000000 +15 +4 +Graphics\HUD\experience_bar_empty.png +48 + + + + +bar +182.000000 +5.000000 +15 +false +true + + + +bar +182.000000 +5.000000 +4 +Graphics\HUD\experience_bar_full.png +48 + + + + + +design_time_display +458.000000 +15.000000 +15 +false +true + + +1.000000 +0xff646464 + + + + +2 +0xffffffff + + +2 +0xffebebeb +0xff7d7d7d +0.000000 +0.000000 + + + + +true +4,0.000000,0.000000,0.000000,0.000000,170.000000,0.000000,0,170.000000,0.000000,170.000000,0.000000,170.000000,19.000000,0,170.000000,19.000000,170.000000,19.000000,0.000000,19.000000,0,0.000000,19.000000,0.000000,19.000000,0.000000,0.000000,0, + + + + +bar +Show +Width + + +0 +false +182.000000 + + + +0 +true +3.330000 + + + +0 +true +182.000000 + + + + + + + +Normal + + + +EndNormal + + + + + + + +ExperienceProgressSmall +274.000000 +7.500000 + + + +ProgressBody +274.000000 +7.500000 + + + +back +274.000000 +7.500000 +15 +4 +Graphics\HUD\experience_bar_empty.png +48 + + + + +bar +548.000000 +7.500000 +15 +false +true + + + +bar +274.000000 +7.500000 +4 +Graphics\HUD\experience_bar_full.png +48 + + + + + +design_time_display +184.000000 +7.500000 +15 +false +true + + +1.000000 +0xff646464 + + + + +2 +0xffffffff + + +2 +0xffebebeb +0xff7d7d7d +0.000000 +0.000000 + + + + +true +4,0.000000,0.000000,0.000000,0.000000,170.000000,0.000000,0,170.000000,0.000000,170.000000,0.000000,170.000000,19.000000,0,170.000000,19.000000,170.000000,19.000000,0.000000,19.000000,0,0.000000,19.000000,0.000000,19.000000,0.000000,0.000000,0, + + + + +bar +Show +Width + + +0 +false +548.000000 + + + +0 +true +3.330000 + + + +0 +true +274.000000 + + + + + + + +Normal + + + +EndNormal + + + + + + + +ExperienceProgress480 +365.000000 +10.000000 + + + +ProgressBody +365.000000 +10.000000 + + + +back +365.000000 +10.000000 +15 +4 +Graphics\HUD\experience_bar_empty.png +48 + + + + +bar +365.000000 +10.000000 +15 +false +true + + + +bar +365.000000 +10.000000 +4 +Graphics\HUD\experience_bar_full.png +48 + + + + + +design_time_display +275.000000 +10.000000 +15 +false +true + + +1.000000 +0xff646464 + + + + +2 +0xffffffff + + +2 +0xffebebeb +0xff7d7d7d +0.000000 +0.000000 + + + + +true +4,0.000000,0.000000,0.000000,0.000000,170.000000,0.000000,0,170.000000,0.000000,170.000000,0.000000,170.000000,19.000000,0,170.000000,19.000000,170.000000,19.000000,0.000000,19.000000,0,0.000000,19.000000,0.000000,19.000000,0.000000,0.000000,0, + + + + +bar +Show +Width + + +0 +false +365.000000 + + + +0 +true +3.330000 + + + +0 +true +274.000000 + + + + + + + +Normal + + + +EndNormal + + + + + + + +HudHealth +9.000000 +9.000000 + + + +Border +9.000000 +9.000000 +15 +8 +Graphics\HUD\Health_Background.png +48 + + + + +Heart +9.000000 +9.000000 +15 +false +8 +48 + + + + + +Normal + +stop + + +Half + +stop + + +Full + +stop + + +HalfPoison + +stop + + +FullPoison + +stop + + +NormalFlash + +stop + + +HalfFlash + +stop + + +FullFlash + +stop + + +HalfPoisonFlash + +stop + + +FullPoisonFlash + +stop + + + +Border +ImagePath + + +0 +Graphics\HUD\Health_Background.png + + + +0 +Graphics\HUD\Health_Background_Flash.png + + + +Heart +Show +ImagePath + + +0 +false + + + + +0 +true +Graphics\HUD\Health_Half.png + + + +0 +true +Graphics\HUD\Health_Full.png + + + +0 +true +Graphics\HUD\Health_Half_Poison.png + + + +0 +true +Graphics\HUD\Health_Full_Poison.png + + + +0 +false + + + + +0 +true +Graphics\HUD\Health_Half_Flash.png + + + +0 +true +Graphics\HUD\Health_Full_Flash.png + + + +0 +true +Graphics\HUD\Health_Half_Poison_Flash.png + + + +0 +true +Graphics\HUD\Health_Full_Poison_Flash.png + + + + + + +HudArmour +9.000000 +9.000000 + + + +Icon +9.000000 +9.000000 +15 +8 +Graphics\HUD\HUD_Armour_Empty.png +48 + + + + + +Normal + +stop + + +Half + +stop + + +Full + +stop + + + +Icon +ImagePath + + +0 +Graphics\HUD\HUD_Armour_Empty.png + + + +0 +Graphics\HUD\HUD_Armour_Half.png + + + +0 +Graphics\HUD\HUD_Armour_Full.png + + + + + + +HudFood +9.000000 +9.000000 + + + +Border +9.000000 +9.000000 +15 +8 +Graphics\HUD\HUD_Food_Background.png +48 + + + + +Shank +9.000000 +9.000000 +15 +false +8 +48 + + + + + +Normal + +stop + + +Half + +stop + + +Full + +stop + + +HalfPoison + +stop + + +FullPoison + +stop + + +NormalFlash + +stop + + +HalfFlash + +stop + + +FullFlash + +stop + + +HalfPoisonFlash + +stop + + +FullPoisonFlash + +stop + + +NormalPoison + +stop + + + +Border +ImagePath + + +0 +Graphics\HUD\HUD_Food_Background.png + + + +0 +Graphics\HUD\HUD_Food_Background_Poison.png + + + +0 +Graphics\HUD\HUD_Food_Background_Flash.png + + + +0 +Graphics\HUD\HUD_Food_Background_Poison.png + + + +Shank +Show +ImagePath + + +0 +false + + + + +0 +true +Graphics\HUD\HUD_Food_Half.png + + + +0 +true +Graphics\HUD\HUD_Food_Full.png + + + +0 +true +Graphics\HUD\HUD_Food_Half_Poison.png + + + +0 +true +Graphics\HUD\HUD_Food_Full_Poison.png + + + +0 +false + + + + +0 +true +Graphics\HUD\HUD_Food_Half_Flash.png + + + +0 +true +Graphics\HUD\HUD_Food_Full_Flash.png + + + +0 +true +Graphics\HUD\HUD_Food_Half_Poison_Flash.png + + + +0 +true +Graphics\HUD\HUD_Food_Full_Poison_Flash.png + + + +0 +false +Graphics\HUD\HUD_Food_Full_Poison_Flash.png + + + + + + +HudAir +9.000000 +9.000000 + + + +Icon +9.000000 +9.000000 +15 +8 +Graphics\HUD\HUD_Air_Bubble.png +48 + + + + + +Bubble + +stop + + +Pop + +stop + + + +Icon +ImagePath + + +0 +Graphics\HUD\HUD_Air_Bubble.png + + + +0 +Graphics\HUD\HUD_Air_Pop.png + + + + + + +HudCrosshair +15.000000 +15.000000 + + + +Icon +15.000000 +15.000000 +15 +8 +Graphics\HUD\HUD_Crosshair.png +48 + + + + + +HudXPLevel +116.000000 +16.000000 + + + +Text1 +116.000000 +16.000000 +1.000000,1.000000,0.000000 +15 +0xff0f0f0f +0xff0f0f0f +8.000000 +21504 + + + + +Text2 +116.000000 +16.000000 +-1.000000,1.000000,0.000000 +15 +0xff0f0f0f +8.000000 +21504 + + + + +Text3 +116.000000 +16.000000 +1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +8.000000 +21504 + + + + +Text4 +116.000000 +16.000000 +-1.000000,-1.000000,0.000000 +15 +0xff0f0f0f +8.000000 +21504 + + + + +Text5 +116.000000 +16.000000 +1.000000,0.000000,0.000000 +15 +0xff0f0f0f +0xff0f0f0f +8.000000 +21504 + + + + +Text6 +116.000000 +16.000000 +-1.000000,0.000000,0.000000 +15 +0xff0f0f0f +8.000000 +21504 + + + + +Text7 +116.000000 +16.000000 +0.000000,-1.000000,0.000000 +15 +0xff0f0f0f +8.000000 +21504 + + + + +Text8 +116.000000 +16.000000 +0.000000,1.000000,0.000000 +15 +0xff0f0f0f +8.000000 +21504 + + + + +Text +116.000000 +16.000000 +15 +0xff80eb20 +8.000000 +21504 + + + + + +XuiHtmlControl_H2P +50.000000 +50.000000 +15 + + + +graphic_groupbackground +92.000000 +102.000000 +-20.000000,-20.000000,0.000000 +15 + + + +Bot_R +8.000000 +8.000000 +84.000000,94.000000,0.000000 +12 +Graphics\PanelsAndTabs\PointerTextPanel_BR.png +48 + + + + +Bot_M +76.000000 +8.000000 +8.000000,94.000000,0.000000 +13 +4 +Graphics\PanelsAndTabs\PointerTextPanel_BM.png +48 + + + + +Bot_L +8.000000 +8.000000 +0.000000,94.000000,0.000000 +9 +Graphics\PanelsAndTabs\PointerTextPanel_BL.png +48 + + + + +Top_R +8.000000 +8.000000 +84.000000,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\PointerTextPanel_TR.png +48 + + + + +Top_M +76.000000 +8.000000 +8.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\PointerTextPanel_TM.png +48 + + + + +Top_L +8.000000 +8.000000 +3 +Graphics\PanelsAndTabs\PointerTextPanel_TL.png +48 + + + + +Mid_R +8.000000 +86.000000 +84.000000,8.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MR.png +48 + + + + +Mid_M +76.000000 +86.000000 +8.000000,8.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MM.png +48 + + + + +Mid_L +8.000000 +86.000000 +0.000000,8.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\PointerTextPanel_ML.png +48 + + + + + +HtmlPresenter +50.000000 +52.000000 +15 +true + + + + +ScrollUp +32.000000 +22.000000 +-12.000000,51.000000,0.000000 +12 +XuiScrollEndUp + + + + +ScrollDown +32.000000 +22.000000 +20.000000,51.000000,0.000000 +12 +XuiScrollEnd +1 + + + + + +Normal + + + +EndNormal + +stop + + +ScrollMore + + + +EndScrollMore + +stop + + +Scrolling + + + +EndScrolling + +gotoandplay +Scrolling + + + + + + +XuiHtmlControl_H2P_Small +50.000000 +50.000000 +15 + + + +graphic_groupbackground +72.000000 +98.000000 +-10.000000,-10.000000,0.000000 +15 + + + +Bot_R +8.000000 +8.000000 +64.000000,90.000000,0.000000 +12 +Graphics\PanelsAndTabs\PointerTextPanel_BR.png +48 + + + + +Bot_M +56.000000 +8.000000 +8.000000,90.000000,0.000000 +13 +4 +Graphics\PanelsAndTabs\PointerTextPanel_BM.png +48 + + + + +Bot_L +8.000000 +8.000000 +0.000000,90.000000,0.000000 +9 +Graphics\PanelsAndTabs\PointerTextPanel_BL.png +48 + + + + +Top_R +8.000000 +8.000000 +64.000000,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\PointerTextPanel_TR.png +48 + + + + +Top_M +56.000000 +8.000000 +8.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\PointerTextPanel_TM.png +48 + + + + +Top_L +8.000000 +8.000000 +3 +Graphics\PanelsAndTabs\PointerTextPanel_TL.png +48 + + + + +Mid_R +8.000000 +82.000000 +64.000000,8.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MR.png +48 + + + + +Mid_M +56.000000 +82.000000 +8.000000,8.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MM.png +48 + + + + +Mid_L +8.000000 +82.000000 +0.000000,8.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\PointerTextPanel_ML.png +48 + + + + + +HtmlPresenter +50.000000 +50.000000 +15 +true + + + + +ScrollDown +32.000000 +22.000000 +19.000000,56.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +ScrollUp +32.000000 +22.000000 +-15.000000,56.000000,0.000000 +12 +XuiScrollEndUp + + + + + +XuiHtmlControl_Small +50.000000 +50.000000 +15 + + + +HtmlPresenter +50.000000 +50.000000 +15 +true + + + + +ScrollDown +22.000000 +15.000000 +24.000000,54.000000,0.000000 +12 +XuiScrollEnd +1 + + + + +ScrollUp +22.000000 +15.000000 +0.000000,54.000000,0.000000 +12 +XuiScrollEndUp + + + + + +Normal + + + +EndNormal + +stop + + +ScrollMore + + + +EndScrollMore + +stop + + +Scrolling + + + +EndScrolling + +gotoandplay +Scrolling + + + + + + +XuiHtmlControl_EndStory +50.000000 +50.000000 +15 + + + +HtmlPresenter +50.000000 +50.000000 +15 +true + + + + + +SkinSelectSelectedBackgroundSmall +224.000000 +25.000000 + + + +BorderTextPanel +220.000000 +21.000000 +2.000027,2.000000,0.000000 + + +0xff0fc70f + + + + +0xc80fa2eb +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,5.000000,0.000000,0,5.000000,0.000000,5.000000,0.000000,5.000000,345.000000,0,5.000000,345.000000,5.000000,345.000000,0.000000,345.000000,0,0.000000,345.000000,0.000000,345.000000,0.000000,0.000000,0, + + + + +BorderLeft +2.000000 +21.000000 +222.000015,2.000000,0.000000 + + +0xff0fc70f + + + + +0xc8b4b4b4 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,5.000000,0.000000,0,5.000000,0.000000,5.000000,0.000000,5.000000,345.000000,0,5.000000,345.000000,5.000000,345.000000,0.000000,345.000000,0,0.000000,345.000000,0.000000,345.000000,0.000000,0.000000,0, + + + + +BorderRight +2.000000 +21.000000 +0.000019,2.000000,0.000000 + + +0xff0fc70f + + + + +0xc8323232 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,5.000000,0.000000,0,5.000000,0.000000,5.000000,0.000000,5.000000,345.000000,0,5.000000,345.000000,5.000000,345.000000,0.000000,345.000000,0,0.000000,345.000000,0.000000,345.000000,0.000000,0.000000,0, + + + + +BorderBottom +224.000000 +2.000000 +0.000019,0.000000,0.000000 + + +0xff0fc70f + + + + +0xc8323232 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,5.000000,0.000000,0,5.000000,0.000000,5.000000,0.000000,5.000000,345.000000,0,5.000000,345.000000,5.000000,345.000000,0.000000,345.000000,0,0.000000,345.000000,0.000000,345.000000,0.000000,0.000000,0, + + + + +BorderTop +224.000000 +2.000000 +0.000019,23.000000,0.000000 + + +0xff0fc70f + + + + +0xc8b4b4b4 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,5.000000,0.000000,0,5.000000,0.000000,5.000000,0.000000,5.000000,345.000000,0,5.000000,345.000000,5.000000,345.000000,0.000000,345.000000,0,0.000000,345.000000,0.000000,345.000000,0.000000,0.000000,0, + + + + + +SkinSelectSelectedBackground +224.000000 +32.000000 + + + +BorderTextPanel +220.000000 +28.000000 +2.000008,2.000000,0.000000 + + +0xff0fc70f + + + + +0xc80fa2eb +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,5.000000,0.000000,0,5.000000,0.000000,5.000000,0.000000,5.000000,345.000000,0,5.000000,345.000000,5.000000,345.000000,0.000000,345.000000,0,0.000000,345.000000,0.000000,345.000000,0.000000,0.000000,0, + + + + +BorderLeft +2.000000 +28.000000 +222.000000,2.000000,0.000000 + + +0xff0fc70f + + + + +0xc8b4b4b4 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,5.000000,0.000000,0,5.000000,0.000000,5.000000,0.000000,5.000000,345.000000,0,5.000000,345.000000,5.000000,345.000000,0.000000,345.000000,0,0.000000,345.000000,0.000000,345.000000,0.000000,0.000000,0, + + + + +BorderRight +2.000000 +28.000000 +0.000000,2.000000,0.000000 + + +0xff0fc70f + + + + +0xc8323232 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,5.000000,0.000000,0,5.000000,0.000000,5.000000,0.000000,5.000000,345.000000,0,5.000000,345.000000,5.000000,345.000000,0.000000,345.000000,0,0.000000,345.000000,0.000000,345.000000,0.000000,0.000000,0, + + + + +BorderBottom +224.000000 +2.000000 + + +0xff0fc70f + + + + +0xc8323232 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,5.000000,0.000000,0,5.000000,0.000000,5.000000,0.000000,5.000000,345.000000,0,5.000000,345.000000,5.000000,345.000000,0.000000,345.000000,0,0.000000,345.000000,0.000000,345.000000,0.000000,0.000000,0, + + + + +BorderTop +224.000000 +2.000000 +0.000000,30.000000,0.000000 + + +0xff0fc70f + + + + +0xc8b4b4b4 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,5.000000,0.000000,0,5.000000,0.000000,5.000000,0.000000,5.000000,345.000000,0,5.000000,345.000000,5.000000,345.000000,0.000000,345.000000,0,0.000000,345.000000,0.000000,345.000000,0.000000,0.000000,0, + + + + + +SkinSelectTabBarNormal +1280.000000 +62.000000 + + + +Image +1280.000000 +62.000000 +5 +4 +Graphics\PanelsAndTabs\SkinSelect_TabBar.png +48 + + + + + +SkinSelectTabBarSelected +1280.000000 +62.000000 + + + +Image +1280.000000 +62.000000 +-0.000008,0.000000,0.000000 +5 +4 +Graphics\PanelsAndTabs\SkinSelect_TabBar_Selected.png +48 + + + + + +SkinSelectTabBarSelectedSmall +640.000000 +44.000000 + + + +Image +640.000000 +44.000000 +-0.000008,0.000000,0.000000 +5 +4 +Graphics\PanelsAndTabs\SkinSelect_TabBarSmall_Selected.png +48 + + + + + +SkinSelectTabBarNormalSmall +640.000000 +44.000000 + + + +Image +640.000000 +44.000000 +5 +4 +Graphics\PanelsAndTabs\SkinSelect_TabBarSmall.png +48 + + + + + +SkinSelectPadlock +32.000000 +32.000000 + + + +Locked +32.000000 +32.000000 +Graphics\Padlock_Small.png + + + + + +SkinSelectTabNormalSmall +580.000000 +270.000000 + + + +Image +580.000000 +270.000000 +15 +Graphics\PanelsAndTabs\SkinSelect_TabBarSmallPanel.png +48 + + + + + +SkinSelectTabSelectedSmall +580.000000 +270.000000 + + + +Image +580.000000 +270.000000 +15 +Graphics\PanelsAndTabs\SkinSelect_TabBarSmallPanel_Selected.png +48 + + + + + +XuiSkinSelectSectionBackground +100.000000 +100.000000 +15 + + + +Background +108.000000 +108.000000 +-4.000000,-4.000000,0.000000 +0.000000 +15 + + +0xff0f0f80 + + + + +0xffa0a0a0 +2 +2 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,89.000000,0.000000,0,89.000000,0.000000,89.000000,0.000000,89.000000,37.000000,0,89.000000,37.000000,89.000000,37.000000,0.000000,37.000000,0,0.000000,37.000000,0.000000,37.000000,0.000000,0.000000,0, + + + + +graphic_groupbackground +100.000000 +100.000000 +15 + + + +Bot_R +16.000000 +16.000000 +84.000000,84.001953,0.000000 +12 +Graphics\PanelsAndTabs\Square_Recess_Bot_R.png +48 + + + + +Bot_M +68.000000 +16.000000 +16.000000,84.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Square_Recess_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,84.001953,0.000000 +9 +Graphics\PanelsAndTabs\Square_Recess_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +84.000000,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Square_Recess_Top_R.png +48 + + + + +Top_M +68.000000 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Square_Recess_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Square_Recess_Top_L.png +48 + + + + +Mid_R +16.000000 +68.000000 +84.000000,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Square_Recess_Mid_R.png +48 + + + + +Mid_M +68.000000 +68.000000 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Square_Recess_Mid_M.png +48 + + + + +Mid_L +16.000000 +68.000000 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Square_Recess_Mid_L.png +48 + + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + +InitFocus + + + +EndInitFocus + +stop + + + +Background +Fill.FillColor +Opacity + + +0 +0xffa0a0a0 +0.000000 + + + +0 +0xffa0a0a0 +0.000000 + + + +0 +0xffebeb0f +1.000000 + + + +0 +0xffebeb0f +1.000000 + + + +0 +0xffebeb0f +1.000000 + + + +0 +0xffebeb0f +1.000000 + + + + + + +XuiSkinPackButton +348.000000 +42.000000 +15 + + + +button_graphicTab +348.000000 +42.000000 +false +Graphics\PanelsAndTabs\SkinSelect_TabNormal.png +48 + + + + +button_graphicTabSelected +348.000000 +42.000000 +Graphics\PanelsAndTabs\SkinSelect_TabNormal_Selected.png +48 + + + + +text_Label +334.000000 +32.000000 +7.000016,6.000000,0.000000 +5 +0xff323232 +0xff0f0f0f +16.000000 +21524 + + + + + +Normal + + + +EndNormal + +stop + + +NormalDisable + + + +EndNormalDisable + +stop + + +Focus + + + +EndFocus + +stop + + + +text_Label +TextColor +Position + + +0 +0xff323232 +7.000016,6.000000,0.000000 + + + +0 +0xff323232 +7.000016,6.000000,0.000000 + + + +0 +0xff646464 +7.000017,6.000000,0.000000 + + + +0 +0xff646464 +7.000017,6.000000,0.000000 + + + +0 +0xff323232 +7.000016,6.000000,0.000000 + + + +0 +0xff323232 +7.000016,6.000000,0.000000 + + + +button_graphicTab +Show + + +0 +false + + + +0 +false + + + +0 +true + + + +0 +true + + + +0 +false + + + +0 +false + + + +button_graphicTabSelected +Show +ImagePath + + +0 +true +Graphics\PanelsAndTabs\SkinSelect_TabNormal_Selected.png + + + +0 +true +Graphics\PanelsAndTabs\SkinSelect_TabNormal_Selected.png + + + +0 +false +Graphics\PanelsAndTabs\SkinSelect_TabNormal.png + + + +0 +false +Graphics\PanelsAndTabs\SkinSelect_TabNormal.png + + + +0 +true +Graphics\PanelsAndTabs\SkinSelect_TabNormal_Selected.png + + + +0 +true +Graphics\PanelsAndTabs\SkinSelect_TabNormal_Selected.png + + + + + + +XuiSkinPackButtonCenter +348.000000 +42.000000 +15 + + + +highlight_graphicTab +376.000000 +54.000000 +-14.000015,-6.000000,0.000000 +Graphics\PanelsAndTabs\SkinSelect_TabOver.png +48 + + + + +highlight_graphicTabSelected +376.000000 +54.000000 +-14.000015,-6.000000,0.000000 +false +Graphics\PanelsAndTabs\SkinSelect_TabOver_Selected.png +48 + + + + +Mask +376.000000 +18.000000 +-14.000015,30.000000,0.000000 +true + + + +highlight_graphicTab1 +376.000000 +58.000000 +0.000000,-40.000000,0.000000 +0.000000,58.000000,0.000000 +Graphics\PanelsAndTabs\SkinSelect_TabOver.png +48 + + + + + +MaskSelected +376.000000 +18.000000 +-14.000015,30.000000,0.000000 +false +true + + + +highlight_graphicTab1 +376.000000 +58.000000 +0.000000,-40.000000,0.000000 +0.000000,58.000000,0.000000 +Graphics\PanelsAndTabs\SkinSelect_TabOver_Selected.png +48 + + + + + +text_Label +334.000000 +32.000000 +7.000016,8.000000,0.000000 +5 +0xff505050 +0xff0f0f0f +16.000000 +21524 + + + + +text_Label1 +334.000000 +32.000000 +7.000016,8.000000,0.000000 +5 +false +0xff505050 +0xff0f0f0f +16.000000 +21524 + + + + + +Normal + + + +EndNormal + +stop + + +NormalDisable + + + +EndNormalDisable + +stop + + +Focus + + + +EndFocus + +stop + + + +text_Label +TextColor +Position + + +0 +0xff505050 +7.000016,8.000000,0.000000 + + + +0 +0xff505050 +7.000016,8.000000,0.000000 + + + +0 +0xff8c8c8c +7.000017,8.000000,0.000000 + + + +0 +0xff8c8c8c +7.000017,8.000000,0.000000 + + + +0 +0xff0f0f0f +7.000016,-2.000000,0.000000 + + + +0 +0xff0f0f0f +7.000016,-2.000000,0.000000 + + + +highlight_graphicTab +Opacity +Position + + +0 +1.000000 +-14.000015,-6.000000,0.000000 + + + +0 +1.000000 +-14.000015,-6.000000,0.000000 + + + +0 +1.000000 +-14.000015,-6.000000,0.000000 + + + +0 +1.000000 +-14.000015,-6.000000,0.000000 + + + +0 +1.000000 +-13.999986,-14.000000,0.000000 + + + +0 +100000.000000 +-14.000015,-14.000000,0.000000 + + + +highlight_graphicTabSelected +Opacity +Position +Show + + +0 +1.000000 +-14.000015,-6.000000,0.000000 +false + + + +0 +1.000000 +-14.000015,-6.000000,0.000000 +false + + + +0 +1.000000 +-14.000015,-6.000000,0.000000 +false + + + +0 +1.000000 +-14.000015,-6.000000,0.000000 +false + + + +0 +1.000000 +-13.999986,-16.000000,0.000000 +true + + + +0 +100000.000000 +-14.000015,-16.000000,0.000000 +true + + + +Mask +Show + + +0 +true + + + +0 +true + + + +0 +false + + + +0 +false + + + +MaskSelected +Show + + +0 +false + + + +0 +false + + + +0 +true + + + +0 +true + + + +text_Label1 +TextColor +Position + + +0 +0xff505050 +7.000016,8.000000,0.000000 + + + +0 +0xff505050 +7.000016,8.000000,0.000000 + + + +0 +0xff8c8c8c +7.000017,8.000000,0.000000 + + + +0 +0xff8c8c8c +7.000017,8.000000,0.000000 + + + +0 +0xffebeb0f +5.000016,-2.000000,0.000000 + + + +0 +0xffebeb0f +5.000016,-2.000000,0.000000 + + + + + + +XuiSkinPackButtonSmall +180.000000 +40.000000 +15 + + + +ButtonGraphic +180.000000 +31.000000 +false +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall.png +48 + + + + +ButtonGraphicSelected +180.000000 +31.000000 +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall_Selected.png +48 + + + + +text_Label +168.000000 +28.000000 +5.000000,2.000000,0.000000 +5 +0xff323232 +0xff0f0f0f +13.000000 +21524 + + + + + +Normal + + + +EndNormal + +stop + + +NormalDisable + + + +EndNormalDisable + +stop + + +Focus + + + +EndFocus + +stop + + + +text_Label +TextColor + + +1 +0xff323232 + + + +1 +0xff323232 + + + +1 +0xff646464 + + + +1 +0xff646464 + + + +0 +0xff323232 + + + +0 +0xff323232 + + + +ButtonGraphic +ImagePath +Show + + +0 +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall.png +false + + + +0 +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall.png +false + + + +0 +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall.png +true + + + +0 +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall.png +true + + + +0 +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall_Selected.png +false + + + +0 +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall_Selected.png +false + + + +ButtonGraphicSelected +ImagePath +Show + + +0 +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall_Selected.png +true + + + +0 +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall_Selected.png +true + + + +0 +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall_Selected.png +false + + + +0 +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall.png +false + + + +0 +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall_Selected.png +true + + + +0 +Graphics\PanelsAndTabs\SkinSelect_TabNormalSmall_Selected.png +true + + + + + + +XuiSkinPackButtonCentreSmall +180.000000 +40.000000 +15 + + + +XuiImage1 +180.000000 +38.000000 +0.000000,2.000000,0.000000 +Graphics\PanelsAndTabs\SkinSelect_TabOverSmall.png +48 + + + + +Mask +180.000000 +10.000000 +0.000000,30.000000,0.000000 +true + + + +XuiImage2 +180.000000 +40.000000 +0.000000,-30.000000,0.000000 +Graphics\PanelsAndTabs\SkinSelect_TabOverSmall.png +48 + + + + + +Mask1 +180.000000 +10.000000 +0.000000,30.000000,0.000000 +false +true + + + +XuiImage2 +180.000000 +40.000000 +0.000000,-30.000000,0.000000 +Graphics\PanelsAndTabs\SkinSelect_TabOverSmall_Selected.png +48 + + + + + +text_Label +168.000000 +28.000000 +6.000000,8.000000,0.000000 +5 +0xff323232 +0xff0f0f0f +13.000000 +21524 + + + + +text_Label1 +168.000000 +28.000000 +5.000000,8.000000,0.000000 +5 +false +0xff505050 +0xff0f0f0f +13.000000 +21524 + + + + + +Normal + + + +EndNormal + +stop + + +NormalDisable + + + +EndNormalDisable + +stop + + +Focus + + + +EndFocus + +stop + + + +text_Label +TextColor +Position + + +1 +0xff323232 +6.000000,8.000000,0.000000 + + + +1 +0xff323232 +6.000000,8.000000,0.000000 + + + +1 +0xff787878 +6.000000,8.000000,0.000000 + + + +1 +0xff787878 +6.000000,8.000000,0.000000 + + + +0 +0xff323232 +6.000000,2.000000,0.000000 + + + +0 +0xff323232 +6.000000,2.000000,0.000000 + + + +XuiImage1 +Height +Position +ImagePath + + +0 +38.000000 +0.000000,2.000000,0.000000 +Graphics\PanelsAndTabs\SkinSelect_TabOverSmall.png + + + +0 +38.000000 +0.000000,2.000000,0.000000 +Graphics\PanelsAndTabs\SkinSelect_TabOverSmall.png + + + +0 +40.000000 +0.000000,-4.000000,0.000000 +Graphics\PanelsAndTabs\SkinSelect_TabOverSmall_Selected.png + + + +0 +40.000000 +0.000000,-4.000000,0.000000 +Graphics\PanelsAndTabs\SkinSelect_TabOverSmall_Selected.png + + + +Mask1 +Show + + +0 +false + + + +0 +false + + + +0 +true + + + +0 +true + + + +text_Label1 +TextColor +Position + + +1 +0xff505050 +5.000000,8.000000,0.000000 + + + +1 +0xff505050 +5.000000,8.000000,0.000000 + + + +1 +0xff8c8c8c +5.000000,8.000000,0.000000 + + + +1 +0xff8c8c8c +5.000000,8.000000,0.000000 + + + +0 +0xffebeb0f +3.000000,2.000000,0.000000 + + + +0 +0xffebeb0f +3.000000,2.000000,0.000000 + + + + + + +XuiSkinSelectSBckgrndSmall +100.000000 +100.000000 +15 + + + +Background +104.000000 +104.000000 +-2.000000,-2.000000,0.000000 +0.000000 +15 + + +0xff0f0f80 + + + + +0xffa0a0a0 +2 +2 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,89.000000,0.000000,0,89.000000,0.000000,89.000000,0.000000,89.000000,37.000000,0,89.000000,37.000000,89.000000,37.000000,0.000000,37.000000,0,0.000000,37.000000,0.000000,37.000000,0.000000,0.000000,0, + + + + +graphic_groupbackground +100.000000 +100.000000 +15 +true + + + +Bot_R +16.000000 +16.000000 +84.000000,84.001953,0.000000 +12 +Graphics\PanelsAndTabs\Square_Recess_Bot_R.png +48 + + + + +Bot_M +68.000000 +16.000000 +16.000000,84.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Square_Recess_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,84.001953,0.000000 +9 +Graphics\PanelsAndTabs\Square_Recess_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +84.000000,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Square_Recess_Top_R.png +48 + + + + +Top_M +68.000000 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Square_Recess_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Square_Recess_Top_L.png +48 + + + + +Mid_R +16.000000 +68.000000 +84.000000,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Square_Recess_Mid_R.png +48 + + + + +Mid_M +68.000000 +68.000000 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Square_Recess_Mid_M.png +48 + + + + +Mid_L +16.000000 +68.000000 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Square_Recess_Mid_L.png +48 + + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + +InitFocus + + + +EndInitFocus + +stop + + + +Background +Fill.FillColor +Opacity + + +0 +0xffa0a0a0 +0.000000 + + + +0 +0xffa0a0a0 +0.000000 + + + +0 +0xffebeb0f +1.000000 + + + +0 +0xffebeb0f +1.000000 + + + +0 +0xffebeb0f +1.000000 + + + +0 +0xffebeb0f +1.000000 + + + + + + +ItemBanner +64.000000 +64.000000 + + + +image +64.000000 +64.000000 +15 +CXuiCtrl4JIcon +XuiVisImPresenterCentreNoScale + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + + + + +DLC_PriceTag +440.000000 +36.000000 + + + +PlainBox +440.000000 +36.000000 + + +0xff0f0f80 + + + + +0xffeb8b0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,92.000000,0.000000,0,92.000000,0.000000,92.000000,0.000000,92.000000,63.000000,0,92.000000,63.000000,92.000000,63.000000,0.000000,63.000000,0,0.000000,63.000000,0.000000,63.000000,0.000000,0.000000,0, + + + + +Text +160.000000 +270.000000,2.000000,0.000000 +15 +0xffffffff +0xff000000 +16.000000 +4625 + + + + + +ItemBanner480 +64.000000 +64.000000 + + + +image +64.000000 +64.000000 +15 +CXuiCtrl4JIcon +XuiVisualImagePresenterCentre + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + + + + +DLC_PriceTag480 +224.000000 +26.000000 + + + +PlainBox +226.000000 +26.000000 + + +0xff0f0f80 + + + + +0xffeb8b0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,92.000000,0.000000,0,92.000000,0.000000,92.000000,0.000000,92.000000,63.000000,0,92.000000,63.000000,92.000000,63.000000,0.000000,63.000000,0,0.000000,63.000000,0.000000,63.000000,0.000000,0.000000,0, + + + + +Text +110.000000 +18.000000 +102.000000,4.000000,0.000000 +15 +0xffffffff +0xff000000 +12.000000 +4625 + + + + + +TitleString +500.000000 +50.000000 +15 +250.000000,25.000000,0.000000 + + + +Pulser +500.000000 +50.000000 +15 +250.000000,25.000000,0.000000 + + + +SubTitle +500.000000 +50.000000 +15 +250.000000,25.000000,0.000000 + + + +Text_Shadow +500.000000 +50.000000 +2.000002,2.000000,0.000000 +0.970978,1.000000,1.000000 +15 +0xff50500f +0xff50500f +18.000000 +5140 + + + + +Text_String +500.000000 +50.000000 +0.970978,1.000000,1.000000 +15 +0xffebeb0f +0xff50500f +18.000000 +5141 + + + + + + +Normal + + + +EndNormal + +gotoandplay +Normal + + + +SubTitle +Scale + + +2 +-100 +100 +50 +1.000000,1.000000,1.000000 + + + +2 +-100 +100 +50 +0.950000,0.950000,1.000000 + + + +0 +1.000000,1.000000,1.000000 + + + + + + + +TitleStringSmall +250.000000 +25.000000 +125.000000,12.000000,0.000000 + + + +Pulser +250.000000 +25.000000 +15 +125.000000,12.000000,0.000000 + + + +SubTitle +250.000000 +25.000000 +15 +125.000000,12.000000,0.000000 + + + +Text_Shadow +250.000000 +25.000000 +1.000000,1.000000,0.000000 +15 +0xff50500f +0xff50500f +10.000000 +5140 + + + + +Text_String +250.000000 +25.000000 +15 +0xffebeb0f +0xff50500f +10.000000 +5140 + + + + + + +Normal + + + +EndNormal + +gotoandplay +Normal + + + +SubTitle +Scale + + +2 +100 +-100 +50 +1.000000,1.000000,1.000000 + + + +2 +100 +-100 +50 +0.950000,0.950000,1.000000 + + + +0 +1.000000,1.000000,1.000000 + + + + + + + +XuiMainMenuButton_L +400.000000 +40.000000 +15 + + + +highlight_graphic +400.000000 +40.000000 +15 +false +Graphics\MainMenuButton_Over.png + + + + +button_graphic +400.000000 +40.000000 +15 +Graphics\MainMenuButton_Norm.png + + + + +text_Label +380.000000 +28.000000 +10.000000,6.000000,0.000000 +15 +0xffebebeb +0xff0f0f0f +16.000000 +21525 + + + + +XuiSoundXACT +41.000000 +11.000000 +170.000000,11.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +false +0.000000 + + + +0 +false +0.500000 + + + +0 +false +0.000000 + + + +0 +false +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +1 +true +0.250000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +false + + + +0 +1.000000 +false + + + +1 +1.000000 +false + + + +0 +0.000000 +false + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +text_Label +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffa0a0a0 + + + +0 +0xffa0a0a0 + + + +0 +0xff969696 + + + +0 +0xff969696 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb80 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +XuiSoundXACT +Cue +SoundBank +WaveBank + + +0 + + + + + + +0 +ButtonFocus +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + +0 + +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + +0 + +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + +0 + +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + +0 +ButtonPress +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + +0 + +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + + + +XuiMainMenuButton_L_Thin +300.000000 +36.000000 +15 + + + +highlight_graphic +300.000000 +36.000000 +15 +false +Graphics\MainMenuButton_Over.png + + + + +button_graphic +300.000000 +36.000000 +15 +Graphics\MainMenuButton_Norm.png + + + + +text_Label +280.000000 +28.000000 +10.000000,4.000000,0.000000 +15 +0xffebebeb +0xff0f0f0f +21525 + + + + +XuiSoundXACT +41.000000 +11.000000 +170.000000,11.000000,0.000000 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +InitFocusDisableLoop + + + +EndInitFocusDisable + +gotoandplay +InitFocusDisableLoop + + +NormalSelDisable + + + +EndNormalSelDisable + +stop + + + +text_Label +TextColor + + +1 +0xffebebeb + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffa0a0a0 + + + +0 +0xffa0a0a0 + + + +0 +0xff969696 + + + +0 +0xff969696 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +0 +0xffebeb0f + + + +0 +0xffebeb80 + + + +0 +0xffebeb0f + + + +0 +0xffebebeb + + + +highlight_graphic +Show +Opacity + + +1 +false +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +false +1.000000 + + + +0 +false +0.000000 + + + +0 +false +0.500000 + + + +0 +false +0.000000 + + + +0 +false +0.500000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +1 +true +1.000000 + + + +1 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +1.000000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +0 +true +0.000000 + + + +0 +true +0.500000 + + + +1 +true +0.250000 + + + +button_graphic +Opacity +Show + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +1 +0.000000 +true + + + +1 +1.000000 +true + + + +1 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +false + + + +0 +1.000000 +false + + + +1 +1.000000 +false + + + +0 +0.000000 +false + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +1 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +true + + + +0 +0.500000 +true + + + +0 +0.000000 +true + + + +1 +1.000000 +true + + + +XuiSoundXACT +Cue +SoundBank +WaveBank + + +0 + + + + + + +0 +ButtonFocus +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + +0 + +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + +0 + +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + +0 + +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + +0 +ButtonPress +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + +0 + +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + + + +SignEntrySceneBackground +288.000000 +312.000000 + + + +Image +288.000000 +312.000000 +15 +Graphics\SignEditBackground.png + + + + + +LeaderboardHeaderPanel +32.000000 +32.000000 + + + +graphic_groupbackground +32.000000 +32.000000 +15 + + + +Bot_R +8.000000 +8.000000 +24.000000,24.000000,0.000000 +12 +Graphics\PanelsAndTabs\PointerTextPanel_BR.png +48 + + + + +Bot_M +16.000000 +8.000000 +8.000000,24.000000,0.000000 +13 +4 +Graphics\PanelsAndTabs\PointerTextPanel_BM.png +48 + + + + +Bot_L +8.000000 +8.000000 +0.000000,24.000000,0.000000 +9 +Graphics\PanelsAndTabs\PointerTextPanel_BL.png +48 + + + + +Top_R +8.000000 +8.000000 +24.000000,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\PointerTextPanel_TR.png +48 + + + + +Top_M +16.000000 +8.000000 +8.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\PointerTextPanel_TM.png +48 + + + + +Top_L +8.000000 +8.000000 +3 +Graphics\PanelsAndTabs\PointerTextPanel_TL.png +48 + + + + +Mid_R +8.000000 +16.000000 +24.000000,8.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MR.png +48 + + + + +Mid_M +16.000000 +16.000000 +8.000000,8.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\PointerTextPanel_MM.png +48 + + + + +Mid_L +8.000000 +16.000000 +0.000000,8.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\PointerTextPanel_ML.png +48 + + + + + + +CreditsBackground +1280.000000 +720.000000 + + + +Image +1280.000000 +720.000000 +15 +16 +Graphics\CreditBackground.png + + + + + +PanelRecessed +6.000000 +6.000000 +15 + + + +graphic_groupbackground +6.000000 +6.000000 +15 + + + +TL +2.000000 +2.000000 +3 + + +0xff0f0f80 + + + + +0xff323232 + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,8.000000,0.000000,0,8.000000,0.000000,8.000000,0.000000,8.000000,7.000000,0,8.000000,7.000000,8.000000,7.000000,0.000000,7.000000,0,0.000000,7.000000,0.000000,7.000000,0.000000,0.000000,0, + + + + +TR +2.000000 +2.000000 +4.000000,0.000000,0.000000 +6 + + +0xff0f0f80 + + + + +0x0a323232 + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,8.000000,0.000000,0,8.000000,0.000000,8.000000,0.000000,8.000000,7.000000,0,8.000000,7.000000,8.000000,7.000000,0.000000,7.000000,0,0.000000,7.000000,0.000000,7.000000,0.000000,0.000000,0, + + + + +TM +2.000000 +2.000000 +2.000000,0.000000,0.000000 +7 + + +0xff0f0f80 + + + + +0xff323232 + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,8.000000,0.000000,0,8.000000,0.000000,8.000000,0.000000,8.000000,7.000000,0,8.000000,7.000000,8.000000,7.000000,0.000000,7.000000,0,0.000000,7.000000,0.000000,7.000000,0.000000,0.000000,0, + + + + +BL +2.000000 +2.000000 +0.000000,4.000000,0.000000 +9 + + +0xff0f0f80 + + + + +0x0a323232 + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,8.000000,0.000000,0,8.000000,0.000000,8.000000,0.000000,8.000000,7.000000,0,8.000000,7.000000,8.000000,7.000000,0.000000,7.000000,0,0.000000,7.000000,0.000000,7.000000,0.000000,0.000000,0, + + + + +BR +2.000000 +2.000000 +4.000000,4.000000,0.000000 +12 + + +0xff0f0f80 + + + + +0xffebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,8.000000,0.000000,0,8.000000,0.000000,8.000000,0.000000,8.000000,7.000000,0,8.000000,7.000000,8.000000,7.000000,0.000000,7.000000,0,0.000000,7.000000,0.000000,7.000000,0.000000,0.000000,0, + + + + +BM +2.000000 +2.000000 +2.000000,4.000000,0.000000 +13 + + +0xff0f0f80 + + + + +0xffebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,8.000000,0.000000,0,8.000000,0.000000,8.000000,0.000000,8.000000,7.000000,0,8.000000,7.000000,8.000000,7.000000,0.000000,7.000000,0,0.000000,7.000000,0.000000,7.000000,0.000000,0.000000,0, + + + + +ML +2.000000 +2.000000 +0.000000,2.000000,0.000000 +11 + + +0xff0f0f80 + + + + +0xff323232 + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,8.000000,0.000000,0,8.000000,0.000000,8.000000,0.000000,8.000000,7.000000,0,8.000000,7.000000,8.000000,7.000000,0.000000,7.000000,0,0.000000,7.000000,0.000000,7.000000,0.000000,0.000000,0, + + + + +MR +2.000000 +2.000000 +4.000000,2.000000,0.000000 +14 + + +0xff0f0f80 + + + + +0xffebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,8.000000,0.000000,0,8.000000,0.000000,8.000000,0.000000,8.000000,7.000000,0,8.000000,7.000000,8.000000,7.000000,0.000000,7.000000,0,0.000000,7.000000,0.000000,7.000000,0.000000,0.000000,0, + + + + +MM +2.000000 +2.000000 +2.000000,2.000000,0.000000 +15 + + +0xff0f0f80 + + + + +0xff8c8c8c + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,8.000000,0.000000,0,8.000000,0.000000,8.000000,0.000000,8.000000,7.000000,0,8.000000,7.000000,8.000000,7.000000,0.000000,7.000000,0,0.000000,7.000000,0.000000,7.000000,0.000000,0.000000,0, + + + + + + +GraphicPanel +272.000000 +110.000000 +15 + + + +graphic_groupbackground +272.000000 +110.000000 +15 + + + +Bot_R +16.000000 +16.000000 +256.344818,94.001953,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_M +240.344818 +16.000000 +16.000000,94.001953,0.000000 +13 +4 +Graphics\PanelsAndTabs\Panel_Bot_M.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,94.001953,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +256.344818,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_M +240.344818 +16.000000 +16.000000,0.000000,0.000000 +7 +4 +Graphics\PanelsAndTabs\Panel_Top_M.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + +Mid_R +16.000000 +78.001961 +256.344818,16.000000,0.000000 +14 +4 +Graphics\PanelsAndTabs\Panel_Mid_R.png +48 + + + + +Mid_M +240.344818 +78.001961 +16.000000,16.000000,0.000000 +15 +4 +Graphics\PanelsAndTabs\Panel_Mid_M.png +48 + + + + +Mid_L +16.000000 +78.001961 +0.000000,16.000000,0.000000 +11 +4 +Graphics\PanelsAndTabs\Panel_Mid_L.png +48 + + + + + + +XuiBackgroundPan +1280.000000 +720.000000 + + + +DayGroup +4099.999512 +719.999939 + + + +Pan1 +820.000000 +144.000000 +5.000000,5.000000,1.000000 +15 +false +1 +Graphics\Panorama_Background_S.png + + + + +Pan +820.000000 +144.000000 +5.000000,5.000000,1.000000 +15 +1 +Graphics\Panorama_Background_S.png + + + + +Pan +Position +SizeMode + + +0 +0.000000,0.000000,0.000000 +1 + + + +0 +-4100.000000,-0.000004,0.000000 +16 + + + +Pan1 +Position +SizeMode +Show + + +0 +0.000000,0.000000,0.000000 +1 +false + + + +0 +-879.765869,-0.000003,0.000000 +1 +false + + + +0 +1280.000000,-0.000003,0.000000 +1 +true + + + +0 +0.000000,-0.000004,0.000000 +16 +true + + + + + + +NightGroup +4099.999512 +719.999939 +false + + + +NightPan +820.000000 +144.000000 +5.000000,5.000000,1.000000 +15 +false +1 +Graphics\Panorama_Background_N.png + + + + +NightPan1 +820.000000 +144.000000 +5.000000,5.000000,1.000000 +15 +1 +Graphics\Panorama_Background_N.png + + + + +NightPan1 +Position +SizeMode + + +0 +0.000000,0.000000,0.000000 +1 + + + +0 +-4100.000000,-0.000004,0.000000 +16 + + + +NightPan +Position +SizeMode +Show + + +0 +0.000000,0.000000,0.000000 +1 +false + + + +0 +-879.765869,-0.000003,0.000000 +1 +false + + + +0 +1280.000000,-0.000003,0.000000 +1 +true + + + +0 +0.000000,-0.000004,0.000000 +16 +true + + + + + + +Darken +1280.000000 +720.000000 +0.750000 +false + + +0xff0f0f80 + + + + +0xff0f1562 + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,637.000000,0.000000,0,637.000000,0.000000,637.000000,0.000000,637.000000,755.000000,0,637.000000,755.000000,637.000000,755.000000,0.000000,755.000000,0,0.000000,755.000000,0.000000,755.000000,0.000000,0.000000,0, + + + + + +XuiDarkOverlay +1280.000000 +720.000000 + + + +1280.000000 +720.000000 +0.400000 +15 + + +1.000000 +0xff0f0f0f + + + + +0xff0f0f0f + + +3 +0xff0f0f0f +0xffe5e5e5 +0xff0f0f0f +0.000000 +0.000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,300.000000,0.000000,0,300.000000,0.000000,300.000000,0.000000,300.000000,234.000000,0,300.000000,234.000000,300.000000,234.000000,0.000000,234.000000,0,0.000000,234.000000,0.000000,234.000000,0.000000,0.000000,0, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +XuiBackgroundPan480 +1280.000000 +720.000000 + + + +DayGroup +4099.999512 +719.999939 + + + +Pan1 +820.000000 +144.000000 +640.000000,0.000000,0.000000 +3.400000,3.400000,1.000000 +15 +false +1 +Graphics\Panorama_Background_S.png + + + + +Pan +820.000000 +144.000000 +3.400000,3.400000,1.000000 +15 +1 +Graphics\Panorama_Background_S.png + + + + +Darken +640.000000 +480.000000 +0.300000 + + +0xff0f0f80 + + + + +0xff19195a + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,637.000000,0.000000,0,637.000000,0.000000,637.000000,0.000000,637.000000,755.000000,0,637.000000,755.000000,637.000000,755.000000,0.000000,755.000000,0,0.000000,755.000000,0.000000,755.000000,0.000000,0.000000,0, + + + + +Pan +Position + + +0 +0.000000,0.000000,0.000000 + + + +0 +-2788.000000,-0.000003,0.000000 + + + +Pan1 +Position +Show + + +0 +640.000000,0.000000,0.000000 +false + + + +0 +640.000000,-0.000003,0.000000 +false + + + +0 +637.000000,-0.000003,0.000000 +true + + + +0 +0.000000,-0.000004,0.000000 +true + + + + + + +NightGroup +4099.999512 +719.999939 +false + + + +Pan1 +820.000000 +144.000000 +640.000000,0.000000,0.000000 +3.400000,3.400000,1.000000 +15 +false +1 +Graphics\Panorama_Background_N.png + + + + +Pan +820.000000 +144.000000 +3.400000,3.400000,1.000000 +15 +1 +Graphics\Panorama_Background_N.png + + + + +Pan +Position + + +0 +0.000000,0.000000,0.000000 + + + +0 +-2788.000000,-0.000003,0.000000 + + + +Pan1 +Position +Show + + +0 +640.000000,0.000000,0.000000 +false + + + +0 +640.000000,-0.000003,0.000000 +false + + + +0 +637.000000,-0.000003,0.000000 +true + + + +0 +0.000000,-0.000004,0.000000 +true + + + + + + +Darken +640.000000 +480.000000 +0.750000 +false + + +0xff0f0f80 + + + + +0xff0f1562 + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,637.000000,0.000000,0,637.000000,0.000000,637.000000,0.000000,637.000000,755.000000,0,637.000000,755.000000,637.000000,755.000000,0.000000,755.000000,0,0.000000,755.000000,0.000000,755.000000,0.000000,0.000000,0, + + + + + +XuiBackgroundScroll +1280.000000 +720.000000 + + + +TileGroup1 +1280.000000 +160.000000 +0.000000,720.000000,0.000000 + + + +XuiImage1 +160.000000 +160.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage2 +160.000000 +160.000000 +160.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage3 +160.000000 +160.000000 +320.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage4 +160.000000 +160.000000 +480.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage5 +160.000000 +160.000000 +640.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage6 +160.000000 +160.000000 +800.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage7 +160.000000 +160.000000 +960.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage8 +160.000000 +160.000000 +1120.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + + +TileGroup2 +1280.000000 +160.000000 +0.000000,560.000000,0.000000 + + + +XuiImage1 +160.000000 +160.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage2 +160.000000 +160.000000 +160.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage3 +160.000000 +160.000000 +320.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage4 +160.000000 +160.000000 +480.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage5 +160.000000 +160.000000 +640.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage6 +160.000000 +160.000000 +800.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage7 +160.000000 +160.000000 +960.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage8 +160.000000 +160.000000 +1120.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + + +TileGroup3 +1280.000000 +160.000000 +0.000000,400.000000,0.000000 + + + +XuiImage1 +160.000000 +160.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage2 +160.000000 +160.000000 +160.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage3 +160.000000 +160.000000 +320.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage4 +160.000000 +160.000000 +480.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage5 +160.000000 +160.000000 +640.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage6 +160.000000 +160.000000 +800.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage7 +160.000000 +160.000000 +960.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage8 +160.000000 +160.000000 +1120.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + + +TileGroup4 +1280.000000 +160.000000 +0.000000,240.000000,0.000000 + + + +XuiImage1 +160.000000 +160.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage2 +160.000000 +160.000000 +160.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage3 +160.000000 +160.000000 +320.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage4 +160.000000 +160.000000 +480.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage5 +160.000000 +160.000000 +640.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage6 +160.000000 +160.000000 +800.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage7 +160.000000 +160.000000 +960.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage8 +160.000000 +160.000000 +1120.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + + +TileGroup5 +1280.000000 +160.000000 +0.000000,80.000000,0.000000 + + + +XuiImage1 +160.000000 +160.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage2 +160.000000 +160.000000 +160.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage3 +160.000000 +160.000000 +320.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage4 +160.000000 +160.000000 +480.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage5 +160.000000 +160.000000 +640.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage6 +160.000000 +160.000000 +800.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage7 +160.000000 +160.000000 +960.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage8 +160.000000 +160.000000 +1120.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + + +TileGroup6 +1280.000000 +160.000000 +0.000000,-80.000000,0.000000 + + + +XuiImage1 +160.000000 +160.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage2 +160.000000 +160.000000 +160.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage3 +160.000000 +160.000000 +320.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage4 +160.000000 +160.000000 +480.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage5 +160.000000 +160.000000 +640.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage6 +160.000000 +160.000000 +800.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage7 +160.000000 +160.000000 +960.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + +XuiImage8 +160.000000 +160.000000 +1120.000000,0.000000,0.000000 +Graphics\Dirt_Tile.png +48 + + + + + +TileGroup1 +Position + + +0 +0.000000,720.000000,0.000000 + + + +0 +0.000000,560.000000,0.000000 + + + +TileGroup2 +Position + + +0 +0.000000,560.000000,0.000000 + + + +0 +0.000000,400.000000,0.000000 + + + +TileGroup3 +Position + + +0 +0.000000,400.000000,0.000000 + + + +0 +0.000000,240.000000,0.000000 + + + +TileGroup5 +Position + + +0 +0.000000,80.000000,0.000000 + + + +0 +0.000000,-80.000000,0.000000 + + + +TileGroup4 +Position + + +0 +0.000000,240.000000,0.000000 + + + +0 +0.000000,80.000000,0.000000 + + + +TileGroup6 +Position + + +0 +0.000000,-80.000000,0.000000 + + + +0 +0.000000,-160.000000,0.000000 + + + +0 +0.000000,720.000000,0.000000 + + + +0 +0.000000,720.000000,0.000000 + + + + + + +XuiBlankScene +405.000000 +244.000000 + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +XuiScene +96.000000 +96.000000 +0.000000,3.000000,0.000000 +15 + + + +graphic_groupbackground +96.000000 +96.000000 +15 + + + +Graphic_TL +32.000000 +32.000000 +3 +Graphics\PanelsAndTabs\Panel_TL.png + + + + +Graphic_TM +32.000000 +32.000000 +32.000000,0.000000,0.000000 +71 +Graphics\PanelsAndTabs\Panel_TM.png + + + + +Graphic_TR +32.000000 +32.000000 +64.000000,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_TR.png + + + + +Graphic_ML +32.000000 +32.000000 +0.000000,32.000000,0.000000 +139 +Graphics\PanelsAndTabs\Panel_ML.png + + + + +Graphic_MM +32.000000 +32.000000 +32.000000,32.000000,0.000000 +207 +Graphics\PanelsAndTabs\Panel_MM.png + + + + +Graphic_MR +32.000000 +32.000000 +64.000000,32.000000,0.000000 +142 +Graphics\PanelsAndTabs\Panel_MR.png + + + + +Graphic_BL +32.000000 +32.000000 +0.000000,64.000000,0.000000 +9 +Graphics\PanelsAndTabs\Panel_BL.png + + + + +Graphic_BM +32.000000 +32.000000 +32.000000,64.000000,0.000000 +77 +Graphics\PanelsAndTabs\Panel_BM.png + + + + +Graphic_BR +32.000000 +32.000000 +64.000000,64.000000,0.000000 +12 +Graphics\PanelsAndTabs\Panel_BR.png + + + + + +XuiTextPresenter +66.000000 +40.000000 +14.999996,14.000000,0.000000 +15 +0xff0f0f0f +18.000000 +1024 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +XuiMenuScene +96.000000 +96.000000 +15 + + + +XuiTextPresenter +66.000000 +40.000000 +14.999996,14.000000,0.000000 +5 +0xff0f0f0f +18.000000 +1040 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +XuiBlackScene +405.000000 +244.000000 + + + +1280.000000 +720.000000 + + +1.000000 +0xff0f0f80 + + + + +0xff0f0f0f + + +3 +0xff0f0f0f +0xffe5e5e5 +0xff0f0f0f +0.000000 +0.000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,300.000000,0.000000,0,300.000000,0.000000,300.000000,0.000000,300.000000,234.000000,0,300.000000,234.000000,300.000000,234.000000,0.000000,234.000000,0,0.000000,234.000000,0.000000,234.000000,0.000000,0.000000,0, + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +EndFocus + +stop + + + + + + +GraphicPanel4grid +32.000000 +32.000000 +15 + + + +graphic_groupbackground +32.000000 +32.000000 +15 + + + +Bot_R +16.000000 +16.000000 +16.000000,16.000000,0.000000 +12 +Graphics\PanelsAndTabs\Panel_Bot_R.png +48 + + + + +Bot_L +16.000000 +16.000000 +0.000000,16.000000,0.000000 +9 +Graphics\PanelsAndTabs\Panel_Bot_L.png +48 + + + + +Top_R +16.000000 +16.000000 +16.000000,0.000000,0.000000 +6 +Graphics\PanelsAndTabs\Panel_Top_R.png +48 + + + + +Top_L +16.000000 +16.000000 +3 +Graphics\PanelsAndTabs\Panel_Top_L.png +48 + + + + + + +CraftingCategoryIcon +48.000000 +48.000000 + + + +Icon +48.000000 +48.000000 +15 +8 +Graphics\CraftIcons\icon_armour.png +48 + + + + + +Armour + +stop + + +Brewing + +stop + + +Decoration + +stop + + +Food + +stop + + +Materials + +stop + + +Mechanisms + +stop + + +Misc + +stop + + +RedstoneAndTransport + +stop + + +Structures + +stop + + +Tools + +stop + + +Transport + +stop + + + +Icon +ImagePath + + +0 +Graphics\CraftIcons\icon_armour.png + + + +0 +Graphics\CraftIcons\icon_brewing.png + + + +0 +Graphics\CraftIcons\icon_decoration.png + + + +0 +Graphics\CraftIcons\icon_food.png + + + +0 +Graphics\CraftIcons\icon_Materials.png + + + +0 +Graphics\CraftIcons\icon_mechanisms.png + + + +0 +Graphics\CraftIcons\icon_misc.png + + + +0 +Graphics\CraftIcons\icon_Redstone_and_Transport.png + + + +0 +Graphics\CraftIcons\icon_structures.png + + + +0 +Graphics\CraftIcons\icon_tools.png + + + +0 +Graphics\CraftIcons\icon_transport.png + + + + + + +CraftingPanelTabRightSmall +72.000000 +56.000000 + + + +Image +72.000000 +56.000000 +Graphics\PanelsAndTabs\Tab_Small_Right.png +48 + + + + + +CraftingPanelTabRight +107.000000 +85.000000 + + + +Image +107.000000 +85.000000 +Graphics\PanelsAndTabs\Tab_Right.png +48 + + + + + +CraftingPanelTabMiddleSmall +72.000000 +56.000000 + + + +TabImage2 +72.000000 +56.000000 +Graphics\PanelsAndTabs\Tab_Small_Middle.png +48 + + + + + +CraftingPanelTabMiddle +107.000000 +85.000000 + + + +Image +107.000000 +85.000000 +Graphics\PanelsAndTabs\Tab_Middle.png +48 + + + + + +CraftingPanelTabLeftSmall +72.000000 +56.000000 + + + +Image +72.000000 +56.000000 +Graphics\PanelsAndTabs\Tab_Small_Left.png +48 + + + + + +CraftingPanelTabLeft +107.000000 +85.000000 + + + +Image +107.000000 +85.000000 +Graphics\PanelsAndTabs\Tab_Left.png +48 + + + + + +CraftingPanelVScrollSmall +22.000000 +67.000000 + + + +Image +22.000000 +67.000000 +1 +Graphics\CraftScene\Crafting_2SlotSmallV.png +48 + + + + + +CraftingPanelVScroll3 +80.000000 +258.000000 + + + +Image +80.000000 +258.000000 +2 +Graphics\CraftScene\Crafting_3SlotLargeV.png +48 + + + + + +CraftingPanelVScroll2 +80.000000 +204.000000 + + + +Image +80.000000 +204.000000 +Graphics\CraftScene\Crafting_2SlotLargeV.png +48 + + + + + +CraftingPanelHighlightSmall +43.000000 +43.000000 + + + +Image +43.000000 +43.000000 +4 +Graphics\CraftScene\Craft_Highlight_L_ExtraSmall.png +48 + + + + + +CraftingPanelHighlight +72.000000 +72.000000 + + + +Image +72.000000 +72.000000 +Graphics\CraftScene\Craft_Highlight_L_Small.png +48 + + + + + +CraftingPanel3x3Small +490.000000 +284.000000 + + + +Image +490.000000 +284.000000 +Graphics\PanelsAndTabs\Crafting_Panel_Small.png +48 + + + + + +CraftingPanel3x3 +689.000000 +490.000000 + + + +Image +689.000000 +490.000000 +1 +Graphics\PanelsAndTabs\Crafting_Panel.png +48 + + + + + +CraftingPanel2x2Small +420.000000 +284.000000 + + + +Image +420.000000 +284.000000 +Graphics\PanelsAndTabs\Crafting_Panel_Small_2x2.png +48 + + + + + +CraftingPanel2x2 +591.000000 +490.000000 + + + +Image +591.000000 +490.000000 +Graphics\PanelsAndTabs\Crafting_Panel2x2.png +48 + + + + + +CreativeInventoryTabRightSmall +54.000000 +56.000000 + + + +Image +54.000000 +56.000000 +1 +Graphics\PanelsAndTabs\Tab_Creative8_Small_R.png +48 + + + + + +CreativeInventoryTabRight +83.000000 +78.000000 + + + +Image +83.000000 +78.000000 +1 +Graphics\PanelsAndTabs\Tab_Creative8_R.png +48 + + + + + +CreativeInventoryTabMiddleSmall +54.000000 +56.000000 + + + +Image +54.000000 +56.000000 +1 +Graphics\PanelsAndTabs\Tab_Creative8_Small_M.png +48 + + + + + +CreativeInventoryTabMiddle +83.000000 +78.000000 + + + +Image +83.000000 +78.000000 +1 +Graphics\PanelsAndTabs\Tab_Creative8_M.png +48 + + + + + +CreativeInventoryTabLeftSmall +54.000000 +56.000000 + + + +Image +54.000000 +56.000000 +1 +Graphics\PanelsAndTabs\Tab_Creative8_Small_L.png +48 + + + + + +CreativeInventoryTabLeft +83.000000 +78.000000 + + + +Image +83.000000 +78.000000 +1 +Graphics\PanelsAndTabs\Tab_Creative8_L.png +48 + + + + + +CreativeInventorySmall +418.000000 +294.000000 + + + +Image +418.000000 +294.000000 +0.000015,0.000015,0.000000 +1 +Graphics\PanelsAndTabs\Creative_Panel_8_Small.png +48 + + + + + +CreativeInventory +643.000000 +490.000000 + + + +image +643.000000 +490.000000 +1 +Graphics\PanelsAndTabs\Creative_Panel_8.png +48 + + + + + +IconLStickSides +97.000000 +64.000000 + + + +Image +97.000000 +64.000000 +15 +8 +Graphics\X360ControllerIcons\ButtonLeftStick_sides.png + + + + + +IconLBumper +70.000000 +64.000000 + + + +Image +70.000000 +64.000000 +15 +8 +Graphics\X360ControllerIcons\ButtonLeftBumper.png + + + + + +IconRBumper +70.000000 +64.000000 + + + +Image +70.000000 +64.000000 +15 +8 +Graphics\X360ControllerIcons\ButtonRightBumper.png + + + + + +ImHowToPlayTrading +588.000000 +360.000000 + + + +Image +588.000000 +360.000000 +Graphics\HowToPlay\HowToPlay_Trading.png + + + + + +ImHowToPlayTradingSmall +260.000000 +174.000000 + + + +Image1 +260.000000 +174.000000 +1 +Graphics\HowToPlay\HowToPlay_Trading_Small.png + + + + + +ImHowToPlayAnvilSmall +260.000000 +290.000000 + + + +Image +260.000000 +290.000000 +1 +Graphics\HowToPlay\HowToPlay_Anvil_Small.png + + + + + +ImHowToPlayAnvil +430.000000 +430.000000 + + + +Image +430.000000 +430.000000 +Graphics\HowToPlay\HowToPlay_Anvil.png + + + + + +ImHowToPlayEnchantment +339.000000 +342.000000 + + + +Image +451.000000 +455.000000 +0.750000,0.750000,0.750000 +1 +Graphics\HowToPlay\HowToPlay_Enchantment.png + + + + + +ImHowToPlayBrewing +339.000000 +342.000000 + + + +XuiImageBrewing +451.000000 +455.000000 +0.750000,0.750000,0.750000 +1 +Graphics\HowToPlay\HowToPlay_Brewing.png + + + + + +ImHowToPlayFarmingAnimals +339.000000 +342.000000 + + + +XuiImageFarmingAnimals +451.000000 +455.000000 +0.750000,0.750000,0.750000 +1 +Graphics\HowToPlay\HowToPlay_FarmingAnimals.png + + + + + +ImHowToPlayBreeding +339.000000 +342.000000 + + + +XuiImageBreeding +451.000000 +455.000000 +0.750000,0.750000,0.750000 +1 +Graphics\HowToPlay\HowToPlay_Breeding.png + + + + + +ImHowToPlayCreative +491.000000 +371.000000 + + + +Image +654.000000 +494.000000 +0.750000,0.750000,0.750000 +1 +Graphics\HowToPlay\HowToPlay_Creative.png + + + + + +ImHowToPlayCraftingTable +517.000000 +371.000000 + + + +Image +689.000000 +494.000000 +0.750000,0.750000,0.750000 +1 +Graphics\HowToPlay\HowToPlay_CraftTable.png + + + + + +ImHowToPlayCrafting +563.000000 +428.000000 + + + +Image +563.000000 +428.000000 +8 +Graphics\HowToPlay\HowToPlay_Crafting.png + + + + + +ImHowToPlayFurnace +444.000000 +448.000000 + + + +Image +444.000000 +448.000000 +Graphics\HowToPlay\HowToPlay_Furnace.png + + + + + +ImHowToPlayLargeChest +335.000000 +417.000000 + + + +Image +446.000000 +556.000000 +0.750000,0.750000,1.000000 +8 +Graphics\HowToPlay\HowToPlay_LargeChest.png + + + + + +ImHowToPlayChest +449.000000 +434.000000 + + + +Image +449.000000 +434.000000 +1 +Graphics\HowToPlay\HowToPlay_Chest.png + + + + + +ImHowToPlayInventory +451.000000 +455.000000 + + + +Image +451.000000 +455.000000 +Graphics\HowToPlay\HowToPlay_Inventory.png + + + + + +ImHowToPlayHUD +583.000000 +157.000000 + + + +Image +583.000000 +157.000000 +1 +Graphics\HowToPlay\HowToPlay_HUD.png + + + + + +ImHowToPlayDispenser +453.000000 +431.000000 + + + +Image +453.000000 +431.000000 +1 +Graphics\HowToPlay\HowToPlay_Dispenser.png + + + + + +ImHowToPlayNetherPortal +525.000000 +308.000000 + + + +Image +750.000000 +440.000000 +0.700000,0.700000,1.000000 +1 +Graphics\HowToPlay\HowToPlay_NetherPortal.png + + + + + +ImHowToPlayTheEnd +525.000000 +308.000000 + + + +Image +750.000000 +440.000000 +0.700000,0.700000,1.000000 +1 +Graphics\HowToPlay\HowToPlay_TheEnd.png + + + + + +ImHowToPlayTheEndSmall +248.000000 +146.000000 + + + +Image +248.000000 +146.000000 +1 +Graphics\HowToPlay\HowToPlay_TheEnd_Small.png +48 + + + + + +ImHowToPlayNetherPortalSmall +248.000000 +146.000000 + + + +Image +248.000000 +146.000000 +1 +Graphics\HowToPlay\HowToPlay_NetherPortal_Small.png +48 + + + + + +ImHowToPlayDispenserSmall +262.000000 +280.000000 + + + +Image +262.000000 +280.000000 +1 +Graphics\HowToPlay\HowToPlay_Dispenser_Small.png + + + + + +ImHowToPlayHUDSmall +364.000000 +84.000000 + + + +Image +364.000000 +84.000000 +1 +Graphics\HowToPlay\HowToPlay_HUD_Small.png +48 + + + + + +ImHowToPlayInventorySmall +262.000000 +280.000000 + + + +Image +262.000000 +280.000000 +1 +Graphics\HowToPlay\HowToPlay_Inventory_Small.png + + + + + +ImHowToPlayChestSmall +258.000000 +260.000000 + + + +Image +258.000000 +260.000000 +1 +Graphics\HowToPlay\HowToPlay_Chest_Small.png + + + + + +ImHowToPlayLargeChestSmall +213.000000 +270.000000 + + + +Image +142.000000 +180.000000 +1.500000,1.500000,1.000000 +1 +Graphics\HowToPlay\HowToPlay_LargeChest_Small.png +48 + + + + + +ImHowToPlayFurnaceSmall +262.000000 +290.000000 + + + +Image +262.000000 +290.000000 +1 +Graphics\HowToPlay\HowToPlay_Furnace_Small.png + + + + + +ImHowToPlayCraftingSmall +252.000000 +170.000000 + + + +Image +252.000000 +170.000000 +1 +Graphics\HowToPlay\HowToPlay_Crafting_Small.png +48 + + + + + +ImHowToPlayCraftingTableSmall +245.000000 +142.000000 + + + +Image +245.000000 +142.000000 +1 +Graphics\HowToPlay\HowToPlay_CraftTable_Small.png +48 + + + + + +ImHowToPlayCreativeSmall +258.000000 +194.000000 + + + +Image +258.000000 +194.000000 +1 +Graphics\HowToPlay\HowToPlay_Creative_Small.png + + + + + +ImHowToPlayBreedingSmall +262.000000 +280.000000 + + + +Image +262.000000 +280.000000 +1 +Graphics\HowToPlay\HowToPlay_Breeding_Small.png + + + + + +ImHowToPlayFarmingAnimalsSmall +262.000000 +280.000000 + + + +Image +262.000000 +280.000000 +1 +Graphics\HowToPlay\HowToPlay_FarmingAnimals_Small.png + + + + + +ImHowToPlayBrewingSmall +260.000000 +290.000000 + + + +Image +260.000000 +290.000000 +1 +Graphics\HowToPlay\HowToPlay_Brewing_Small.png + + + + + +ImHowToPlayEnchantmentSmall +262.000000 +280.000000 + + + +Image +262.000000 +280.000000 +1 +Graphics\HowToPlay\HowToPlay_Enchantment_Small.png + + + + + +ImHowToPlayEnderchestSmall +262.000000 +280.000000 + + + +Image +262.000000 +280.000000 +1 +Graphics\HowToPlay\HowToPlay_Enderchest_small.png + + + + + +ImHowToPlayEnderchest +339.000000 +342.000000 + + + +XuiImageBreeding +451.000000 +455.000000 +0.750000,0.750000,0.750000 +1 +Graphics\HowToPlay\HowToPlay_Enderchest.png + + + + + +XuiLabelDarkCentred8 +404.000000 +180.000000 +1.000000,1.000000,0.000000 + + + +Text +404.000000 +180.000000 +15 +0xff323232 +8.000000 +5120 + + + + + +XuiLabelVertCentDarkLeftWrap18 +405.000000 +180.000000 + + + +Text +405.000000 +180.000000 +15 +0xff323232 +18.000000 +20736 + + + + + +XuiLabelVertCentDarkLeft8 +404.000000 +180.000000 +1.000000,1.000000,0.000000 + + + +Text +404.000000 +180.000000 +15 +0xff323232 +8.000000 +4352 + + + + diff --git a/Minecraft.Client/Common/Media/splashes.txt b/Minecraft.Client/Common/Media/splashes.txt new file mode 100644 index 00000000..c12a2f9c --- /dev/null +++ b/Minecraft.Client/Common/Media/splashes.txt @@ -0,0 +1,312 @@ +Happy birthday, ez! +Happy birthday, Notch! +Merry X-mas! +Happy New Year! +Hobo humping slobo babe! +This text is hard to read if you play the game at the default resolution, but at 1080p it's fine! +As seen on TV! +Awesome! +100% pure! +May contain nuts! +Better than Prey! +More polygons! +Sexy! +Limited edition! +Flashing letters! +Made by Notch! +It's here! +Best in class! +It's finished! +Kind of dragon free! +Excitement! +More than 500 sold! +One of a kind! +Heaps of hits on YouTube! +Indev! +Spiders everywhere! +Check it out! +Holy cow, man! +It's a game! +Made in Sweden! +Uses LWJGL! +Reticulating splines! +Minecraft! +Yaaay! +Singleplayer! +Keyboard compatible! +Undocumented! +Ingots! +Exploding creepers! +That's no moon! +l33t! +Create! +Survive! +Dungeon! +Exclusive! +The bee's knees! +Down with O.P.P.! +Closed source! +Classy! +Wow! +Not on steam! +Oh man! +Awesome community! +Pixels! +Teetsuuuuoooo! +Kaaneeeedaaaa! +Now with difficulty! +Enhanced! +90% bug free! +Pretty! +12 herbs and spices! +Fat free! +Absolutely no memes! +Free dental! +Ask your doctor! +Minors welcome! +Cloud computing! +Legal in Finland! +Hard to label! +Technically good! +Bringing home the bacon! +Indie! +GOTY! +Ceci n'est pas une title screen! +Euclidian! +Now in 3D! +Inspirational! +Herregud! +Complex cellular automata! +Yes, sir! +Played by cowboys! +Thousands of colors! +Try it! +Age of Wonders is better! +Try the mushroom stew! +Sensational! +Hot tamale, hot hot tamale! +Play him off, keyboard cat! +Guaranteed! +Macroscopic! +Bring it on! +Random splash! +Call your mother! +Monster infighting! +Loved by millions! +Ultimate edition! +Freaky! +You've got a brand new key! +Water proof! +Uninflammable! +Whoa, dude! +All inclusive! +Tell your friends! +NP is not in P! +Notch <3 ez! +Music by C418! +Livestreamed! +Haunted! +Polynomial! +Terrestrial! +All is full of love! +Full of stars! +Scientific! +Cooler than Spock! +Collaborate and listen! +Never dig down! +Take frequent breaks! +Not linear! +Han shot first! +Nice to meet you! +Buckets of lava! +Ride the pig! +Larger than Earth! +sqrt(-1) love you! +Phobos anomaly! +Punching wood! +Falling off cliffs! +0% sugar! +150% hyperbole! +Synecdoche! +Let's danec! +Reference implementation! +Lewd with two dudes with food! +Kiss the sky! +20 GOTO 10! +Verlet intregration! +Peter Griffin! +Do not distribute! +Cogito ergo sum! +4815162342 lines of code! +A skeleton popped out! +The Work of Notch! +The sum of its parts! +BTAF used to be good! +I miss ADOM! +umop-apisdn! +OICU812! +Bring me Ray Cokes! +Finger-licking! +Thematic! +Pneumatic! +Sublime! +Octagonal! +Une baguette! +Gargamel plays it! +Rita is the new top dog! +SWM forever! +Representing Edsbyn! +Matt Damon! +Supercalifragilisticexpialidocious! +Consummate V's! +Cow Tools! +Double buffered! +Fan fiction! +Flaxkikare! +Jason! Jason! Jason! +Hotter than the sun! +Internet enabled! +Autonomous! +Engage! +Fantasy! +DRR! DRR! DRR! +Kick it root down! +Regional resources! +Woo, facepunch! +Woo, somethingawful! +Woo, /v/! +Woo, tigsource! +Woo, minecraftforum! +Woo, worldofminecraft! +Woo, reddit! +Woo, 2pp! +Google anlyticsed! +Now supports åäö! +Give us Gordon! +Tip your waiter! +Very fun! +12345 is a bad password! +Vote for net neutrality! +Lives in a pineapple under the sea! +MAP11 has two names! +Omnipotent! +Gasp! +...! +Bees, bees, bees, bees! +Jag känner en bot! +Haha, LOL! +Hampsterdance! +Switches and ores! +Menger sponge! +idspispopd! +Eple (original edit)! +So fresh, so clean! +Slow acting portals! +Try the Nether! +Don't look directly at the bugs! +Oh, ok, Pigmen! +Finally with ladders! +Scary! +Play Minecraft, Watch Topgear, Get Pig! +Twittered about! +Jump up, jump up, and get down! +Joel is neat! +A riddle, wrapped in a mystery! +Huge tracts of land! +Welcome to your Doom! +Stay a while, stay forever! +Stay a while and listen! +Treatment for your rash! +"Autological" is! +Information wants to be free! +"Almost never" is an interesting concept! +Lots of truthiness! +The creeper is a spy! +Turing complete! +It's groundbreaking! +Let our battle's begin! +The sky is the limit! +Jeb has amazing hair! +Casual gaming! +Undefeated! +Kinda like Lemmings! +Follow the train, CJ! +Leveraging synergy! +DungeonQuest is unfair! +110813! +90210! +Check out the far lands! +Tyrion would love it! +Also try VVVVVV! +Also try Super Meat Boy! +Also try Terraria! +Also try Mount And Blade! +Also try Project Zomboid! +Also try World of Goo! +Also try Limbo! +Also try Pixeljunk Shooter! +Also try Braid! +That's super! +Bread is pain! +Read more books! +Khaaaaaaaaan! +Less addictive than TV Tropes! +More addictive than lemonade! +Bigger than a bread box! +Millions of peaches! +Fnord! +This is my true form! +Totally forgot about Dre! +Don't bother with the clones! +Pumpkinhead! +Made by Jeb! +Has an ending! +Finally complete! +Feature packed! +Boots with the fur! +Stop, hammertime! +Testificates! +Conventional! +Homeomorphic to a 3-sphere! +Doesn't avoid double negatives! +Place ALL the blocks! +Does barrel rolls! +Meeting expectations! +PC gaming since 1873! +Ghoughpteighbteau tchoghs! +Déjà vu! +Déjà vu! +Got your nose! +Haley loves Elan! +Afraid of the big, black bat! +Doesn't use the U-word! +Child's play! +See you next Friday or so! +From the streets of Södermalm! +150 bpm for 400000 minutes! +Technologic! +Funk soul brother! +Pumpa kungen! +My life for Aiur! +Lennart lennart = new Lennart(); +I see your vocabulary has improved! +Who put it there? +You can't explain that! +if not ok then return end +§1C§2o§3l§4o§5r§6m§7a§8t§9i§ac +§kFUNKY LOL +SOPA means LOSER in Swedish +Big Pointy Teeth! +Bekarton guards the gate! +Mmmph, mmph! +Don't feed avocados to parrots! +Swords for everyone! +Plz reply to my tweet! +.party()! +Take her pillow! +Put that cookie down! +Pretty scary! +I have a suggestion. +Now with extra hugs! +Almost java 6! +Woah. \ No newline at end of file diff --git a/Minecraft.Client/Common/Media/strings.resx b/Minecraft.Client/Common/Media/strings.resx new file mode 100644 index 00000000..21a7078a --- /dev/null +++ b/Minecraft.Client/Common/Media/strings.resx @@ -0,0 +1,6587 @@ + + + + + New Downloadable Content is available! Access it from the Minecraft Store button on the Main Menu. + + + You can change the look of your character with a Skin Pack from the Minecraft Store. Select 'Minecraft Store' on the Main Menu to see what's available. + + + + If you play this game in High Definition mode, you can have up to four players in split-screen on the same console! + + + Connect extra controllers to your console and press START on them to join a game at any point. + + + Alter the gamma settings to make the game brighter or darker. + + + If you set the game difficulty to Peaceful, your health will automatically regenerate, and no monsters will come out at night! + + + Feed a bone to a wolf to tame it. You can then make it sit or follow you. + + + You can drop items when in the Inventory menu by moving the cursor off the menu and pressing{*CONTROLLER_VK_A*} + + + Sleeping in a bed at night will fast forward the game to dawn, but all players in a multiplayer game need to sleep in beds at the same time. + + + Harvest pork chops from pigs, and cook and eat them to regain health. + + + Harvest leather from cows, and use it to make armor. + + + If you have an empty bucket, you can fill it with milk from a cow, or water, or lava! + + + Use a hoe to prepare areas of ground for planting. + + + Spiders won't attack you during the day - unless you attack them. + + + Digging soil or sand with a spade is faster than with your hand! + + + Eating cooked pork chops gives more health than eating raw pork chops. + + + Make some torches to light up areas at night. Monsters will avoid the areas around these torches. + + + Get to destinations faster with a minecart and rail! + + + Plant some saplings and they'll grow into trees. + + + Pigmen won't attack you, unless you attack them. + + + You can change your game spawn point and skip to dawn by sleeping in a bed. + + + Hit those fireballs back at the Ghast! + + + Building a portal will allow you to travel to another dimension - The Nether. + + + Press{*CONTROLLER_VK_B*} to drop the item currently in your hand! + + + Use the right tool for the job! + + + If you can't find any coal for your torches, you can always make charcoal from trees in a furnace. + + + Digging straight down or straight up is not a great idea. + + + Bonemeal (crafted from a Skeleton bone) can be used as a fertilizer, and can make things grow instantly! + + + Creepers explode when they get close to you! + + + Obsidian is created when water hits a lava source block. + + + Lava can take minutes to disappear COMPLETELY when the source block is removed. + + + Cobblestone is resistant to Ghast fireballs, making it useful for guarding portals. + + + Blocks that can be used as a light source will melt snow and ice. This includes torches, glowstone, and Jack-O-Lanterns. + + + Take caution when building structures made of wool in open air, as lightning from thunderstorms can set wool on fire. + + + A single bucket of lava can be used in a furnace to smelt 100 blocks. + + + The instrument played by a note block depends on the material beneath it. + + + Zombies and Skeletons can survive daylight if they are in water. + + + Attacking a wolf will cause any wolves in the immediate vicinity to turn hostile and attack you. This trait is also shared by Zombie Pigmen. + + + Wolves cannot enter the Nether. + + + Wolves won't attack Creepers. + + + Chickens lay an egg every 5 to 10 minutes. + + + Obsidian can only be mined with a diamond pickaxe. + + + Creepers are the easiest obtainable source of gunpowder. + + + Placing two chests side by side will make one large chest. + + + Tame wolves show their health with the position of their tail. Feed them meat to heal them. + + + Cook cactus in a furnace to get green dye. + + + You'll get the latest info on this game from 4J Studios and Kappische on twitter! + + + Impress your friends by posting screenshots of your Minecraft creations to Facebook from the in-game Pause menu! + + + Read the What's New section in the How To Play menus to see the latest update information about the game. + + + Stackable fences are in the game now! + + + minecraftforum has a section dedicated to the Xbox 360 Edition. + + + Some animals will follow you if you have wheat in your hand. + + + If an animal can't move more than 20 blocks in any direction, it won't despawn. + + + + Music by C418! + + + Notch has over a million followers on twitter! + + + Not all Swedish people have blonde hair. Some, like Jens from Mojang, even have ginger hair! + + + We think 4J Studios has removed Herobrine from the Xbox 360 console game, but we're not too sure. + + + There will be an update to this game eventually! + + + Who is Notch? + + + Mojang has more awards than staff! + + + Some famous people play Minecraft! + + + deadmau5 likes Minecraft! + + + Do not look directly at the bugs. + + + Creepers were born from a coding bug. + + + Is it a chicken or is it a duck? + + + Were you at Minecon? + + + No-one at Mojang has ever seen junkboy's face. + + + Did you know there's a Minecraft Wiki? + + + Mojang's new office is cool! + + + Minecraft: Xbox 360 Edition broke lots of records! + + + Minecon 2013 was in Orlando, Florida, USA! + + + .party() was excellent! + + + Always assume rumors are false, rather than assuming they're true! + + + + {*T3*}HOW TO PLAY : BASICS{*ETW*}{*B*}{*B*} +Minecraft is a game about placing blocks to build anything you can imagine. At night monsters come out, make sure to build a shelter before that happens.{*B*}{*B*} +Use{*CONTROLLER_ACTION_LOOK*} to look around.{*B*}{*B*} +Use{*CONTROLLER_ACTION_MOVE*} to move around.{*B*}{*B*} +Press{*CONTROLLER_ACTION_JUMP*} to jump.{*B*}{*B*} +Push{*CONTROLLER_ACTION_MOVE*} forward twice in rapid succession to sprint. While you hold {*CONTROLLER_ACTION_MOVE*} forward, the character will continue to sprint unless they run out of sprint time or the Food Bar has less than{*ICON_SHANK_03*}.{*B*}{*B*} +Hold{*CONTROLLER_ACTION_ACTION*} to mine and chop using your hand or whatever you are holding. You may need to craft a tool to mine some blocks.{*B*}{*B*} +If you are holding an item in your hand, use{*CONTROLLER_ACTION_USE*} to use that item, or press{*CONTROLLER_ACTION_DROP*} to drop that item. + + + {*T3*}HOW TO PLAY : HUD{*ETW*}{*B*}{*B*} +The HUD shows information about your status; your health, your remaining oxygen when you are under water, your hunger level (you need to eat to replenish this), and your armor if you are wearing any. If you lose some health, but have a food bar with 9 or more{*ICON_SHANK_01*} in it, your health will automatically replenish. Eating food will replenish your food bar.{*B*} +The Experience Bar is also shown here, with a numeric value to show your Experience Level, and the bar indicating how many Experience Points are required to increase your Experience Level. Experience Points are gained by collecting the Experience Orbs dropped by mobs when they die, mining certain block types, breeding animals, fishing, and smelting ores in a furnace.{*B*}{*B*} +It also shows the items that are available to use. Use{*CONTROLLER_ACTION_LEFT_SCROLL*} and{*CONTROLLER_ACTION_RIGHT_SCROLL*} to change the item in your hand. + + + {*T3*}HOW TO PLAY : INVENTORY{*ETW*}{*B*}{*B*} +Use{*CONTROLLER_ACTION_INVENTORY*} to view your inventory.{*B*}{*B*} +This screen shows items available for use in your hand, and all the other items that you are carrying. Your armor is also shown here.{*B*}{*B*} +Use{*CONTROLLER_MENU_NAVIGATE*} to move the pointer. Use{*CONTROLLER_VK_A*} to pick an item under the pointer. If there is more than one item here this will pick them all up, or you can use{*CONTROLLER_VK_X*} to pick up just half of them.{*B*}{*B*} +Move the item with the pointer over another space in the inventory and place it there using{*CONTROLLER_VK_A*}. With multiple items on the pointer, use{*CONTROLLER_VK_A*} to place them all, or{*CONTROLLER_VK_X*} to place just one.{*B*}{*B*} +If an item you are over is armor, you will be shown a tooltip to enable a quick move of this to the right armor slot in the inventory.{*B*}{*B*} +It is possible to change the color of your Leather Armor by dying it, you can do this in the inventory menu by holding the dye in your pointer, then pressing{*CONTROLLER_VK_X*} whilst the pointer is over the piece you wish to dye. + + + + {*T3*}HOW TO PLAY : CHEST{*ETW*}{*B*}{*B*} +Once you have crafted a Chest, you can place this in the world and then use it with{*CONTROLLER_ACTION_USE*} to store items from your inventory.{*B*}{*B*} +Use the pointer to move items between your inventory and the chest.{*B*}{*B*} +Items in the chest will be stored there for you to swap back into your inventory again later. + + + + {*T3*}HOW TO PLAY : LARGE CHEST{*ETW*}{*B*}{*B*} +Two chests placed next to each other will be combined to form a Large Chest. This can store even more items.{*B*}{*B*} +It is used in the same way as a normal chest. + + + + + {*T3*}HOW TO PLAY : CRAFTING{*ETW*}{*B*}{*B*} +In the Crafting interface, you can combine items from your inventory to create new types of items. Use{*CONTROLLER_ACTION_CRAFTING*} to open the crafting interface.{*B*}{*B*} +Scroll through the tabs at the top using{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*} to select the type of item you wish to craft, then use{*CONTROLLER_MENU_NAVIGATE*} to select the item to craft.{*B*}{*B*} +The crafting area shows the items required to craft the new item. Press{*CONTROLLER_VK_A*} to craft the item and place it in your inventory. + + + + {*T3*}HOW TO PLAY : CRAFTING TABLE{*ETW*}{*B*}{*B*} +You can craft larger items using a Crafting Table.{*B*}{*B*} +Place the table in the world and press{*CONTROLLER_ACTION_USE*} to use it.{*B*}{*B*} +Crafting on a table works in the same way as basic crafting, but you have a larger crafting area, and a more varied selection of items to craft. + + + + {*T3*}HOW TO PLAY : FURNACE{*ETW*}{*B*}{*B*} +A Furnace allows you to change items by firing them. For example, you can turn iron ore into iron ingots in the furnace.{*B*}{*B*} +Place the furnace in the world and press{*CONTROLLER_ACTION_USE*} to use it.{*B*}{*B*} +You need to put some fuel into the bottom of the furnace, and the item to be fired in the top. The furnace will then fire up and start working.{*B*}{*B*} +When your items have been fired, you can move them from the output area into your inventory.{*B*}{*B*} +If an item you are over is an ingredient or fuel for the furnace, you will be shown tooltips to enable a quick move of this to the furnace. + + + + {*T3*}HOW TO PLAY : DISPENSER{*ETW*}{*B*}{*B*} +A Dispenser is used to shoot out items. You will need to place a switch, for example a lever, next to the dispenser to trigger it.{*B*}{*B*} +To fill the dispenser with items press{*CONTROLLER_ACTION_USE*}, then move the items that you want to dispense from your inventory into the dispenser.{*B*}{*B*} +Now when you use the switch, the dispenser will shoot out an item. + + + + + {*T3*}HOW TO PLAY : BREWING{*ETW*}{*B*}{*B*} +Brewing potions requires a Brewing Stand, which can be built at a crafting table. Every potion starts off with a bottle of water, which is made by filling a Glass Bottle with water from a Cauldron, or a water source.{*B*} +A Brewing Stand has three slots for bottles, so can make three potions at the same time. One ingredient can be used over all three bottles, so always brew three potions at the same time to best use your resources.{*B*} +Putting a potion ingredient in the top position at the Brewing Stand will make a base potion after a short time. This doesn't have any effect by itself, but brewing another ingredient with this base potion will give you a potion with an effect.{*B*} +Once you have this potion you can add a third ingredient to make the effect last longer (using Redstone Dust), be more intense (using Glowstone Dust), or turn into a harmful potion (using a Fermented Spider Eye).{*B*} +You can also add gunpowder to any potion to turn it into a Splash Potion, which can then be thrown. The thrown Splash Potion will cause the potion effect to apply over the area it lands in.{*B*} + +The source ingredients for potions are :-{*B*}{*B*} +* {*T2*}Nether Wart{*ETW*}{*B*} +* {*T2*}Spider Eye{*ETW*}{*B*} +* {*T2*}Sugar{*ETW*}{*B*} +* {*T2*}Ghast Tear{*ETW*}{*B*} +* {*T2*}Blaze Powder{*ETW*}{*B*} +* {*T2*}Magma Cream{*ETW*}{*B*} +* {*T2*}Glistering Melon{*ETW*}{*B*} +* {*T2*}Redstone Dust{*ETW*}{*B*} +* {*T2*}Glowstone Dust{*ETW*}{*B*} +* {*T2*}Fermented Spider Eye{*ETW*}{*B*}{*B*} + +You'll need to experiment with combinations of ingredients in order to find out all the different potions you can make. + + + + + {*T3*}HOW TO PLAY : ENCHANTING{*ETW*}{*B*}{*B*} +The Experience Points collected when a mob dies, or when certain blocks are mined or smelted in a furnace, can be used to enchant some tools, weapons, armor and books.{*B*} +When a Sword, Bow, Axe, Pickaxe, Shovel, Armor or Book is placed in the slot below the book in the Enchantment Table, the three buttons to the right of the slot will display some enchantments and their Experience Levels costs.{*B*} +If you do not have enough Experience Levels to use some of these, the cost will appear in red, otherwise it will be shown in green.{*B*}{*B*} +The actual enchantment applied is randomly selected based on the cost displayed.{*B*}{*B*} +If the Enchantment Table is surrounded by Bookshelves (up to a maximum of 15 Bookshelves), with a one block gap between the Bookcase and the Enchantment Table, the potency of the enchantments will be increased, and arcane glyphs will be seen coming from the book on the Enchantment Table.{*B*}{*B*} +All the ingredients for an Enchantment Table can be found within the villages in a world, or by mining and cultivation of the world.{*B*}{*B*} +Enchanted Books are used at the Anvil to apply enchantments to items. This gives you more control over which enchantments you would like on your items.{*B*} + + + + + + + {*T3*}HOW TO PLAY : FARMING ANIMALS{*ETW*}{*B*}{*B*} +If you want to keep your animals in the one place, build a fenced area of less than 20x20 blocks and have your animals inside it. This ensures they will still be there when you come back to see them. + + + + + {*T3*}HOW TO PLAY : BREEDING ANIMALS{*ETW*}{*B*}{*B*} +The animals in Minecraft can breed, and will produce baby versions of themselves!{*B*} +To get the animals to breed, you will need to feed them with the right food to get them to go into 'Love Mode'.{*B*} +Feed Wheat to a cow, mooshroom or sheep, Carrots to a pig, Wheat Seeds or Nether Wart to a chicken, or any kind of meat to a wolf, and they'll start looking for another animal of the same species near them that is also in Love Mode.{*B*} +When two animals of the same species meet, and both are in Love Mode, they will kiss for a few seconds, and then a baby animal will appear. The baby animal will follow their parents for a while before growing into a full sized animal itself.{*B*} +After being in Love Mode, an animal will not be able to enter it again for about five minutes.{*B*} +There is a limit on the number of animals it is possible to have in a world, so you may find the animals don't breed when you have a lot of them. + + + + {*T3*}HOW TO PLAY : NETHER PORTAL{*ETW*}{*B*}{*B*} +A Nether Portal allows the player to travel between the Overworld and the Nether world. The Nether world can be used to fast-travel in the Overworld - traveling one block distance in the Nether is equivalent to traveling 3 blocks in the Overworld, so when you build a portal in the Nether world and exit through it, you will be 3 times further away from your entry point.{*B*}{*B*} +A minimum of 10 Obsidian blocks are required to build the portal, and the portal needs to be 5 blocks high by 4 blocks wide by 1 block deep. Once the portal frame is built, the space inside the frame needs to be set on fire to activate it. This can be done using the Flint and Steel item, or the Fire Charge item.{*B*}{*B*} +Examples of portal construction are shown in the picture to the right. + + + + + {*T3*}HOW TO PLAY : MULTIPLAYER{*ETW*}{*B*}{*B*} +Minecraft on the Xbox 360 console is a multiplayer game by default. If you are playing in a High Definition mode, you can have local players join your game by attaching controllers and pressing START at any point during the game.{*B*}{*B*} +When you start or join an online game, it will be visible to people in your friends list (unless you've selected Invite Only when hosting the game), and if they join the game, it will also be visible to people in their friends list (if you have selected the Allow Friends of Friends option).{*B*} +When you are in a game, you can press the BACK button to bring up a list of all other players in the game, view their Gamer Cards, Kick players from the game, and invite others to the game. + + + + + {*T3*}HOW TO PLAY : SHARING SCREENSHOTS{*ETW*}{*B*}{*B*} +You can capture a screenshot from your game by bringing up the Pause Menu, and pressing{*CONTROLLER_VK_Y*} to Share to Facebook. You'll be presented with a miniature version of your screenshot, and can edit the text associated with the Facebook post.{*B*}{*B*} +There's a camera mode especially for taking these screenshots, so that you can see the front of your character in the shot - press{*CONTROLLER_ACTION_CAMERA*} until you can see the front view of your character before pressing{*CONTROLLER_VK_Y*} to Share.{*B*}{*B*} +Gamertags will not be displayed in the screenshot. + + + + + {*T3*}HOW TO PLAY : BANNING LEVELS{*ETW*}{*B*}{*B*} +If you find offensive content within a level you are playing, you can choose to add the level to your Banned Levels list. +If you would like to do this, bring up the Pause menu, then press{*CONTROLLER_VK_RB*} to select the Ban Level tooltip. +When you attempt to join this level in future, you will be notified that the level is in your Banned Levels list, and given the option to remove it from the list and continue into the level, or back out. + + + {*T3*}HOW TO PLAY : CREATIVE MODE{*ETW*}{*B*}{*B*} +The creative mode interface allows any item in the game to be moved into the player’s inventory without the need for mining or crafting the item. +The items in the player's inventory will not be removed when they are placed or used in the world, and this allows the player to focus on building rather than resource gathering.{*B*} +If you create, load or save a world in Creative Mode, that world will have achievements and leaderboard updates disabled, even if it is then loaded in Survival Mode.{*B*} +To fly when in Creative Mode, press{*CONTROLLER_ACTION_JUMP*} twice quickly. To exit flying, repeat the action. To fly faster, push{*CONTROLLER_ACTION_MOVE*} forward twice in rapid succession while flying. +When in flying mode, you can hold down{*CONTROLLER_ACTION_JUMP*} to move up and{*CONTROLLER_ACTION_SNEAK*} to move down, or use{*CONTROLLER_ACTION_DPAD_UP*} to move up, {*CONTROLLER_ACTION_DPAD_DOWN*} to move down, +{*CONTROLLER_ACTION_DPAD_LEFT*} to move left, and {*CONTROLLER_ACTION_DPAD_RIGHT*} to move right. + + + {*T3*}HOW TO PLAY : HOST AND PLAYER OPTIONS{*ETW*}{*B*}{*B*} + +{*T1*}Game Options{*ETW*}{*B*} +When loading or creating a world, you can press the "More Options" button to enter a menu that allows more control over your game.{*B*}{*B*} + + {*T2*}Player vs Player{*ETW*}{*B*} + When enabled, players can inflict damage on other players. This option only affects Survival mode.{*B*}{*B*} + + {*T2*}Trust Players{*ETW*}{*B*} + When disabled, players joining the game are restricted in what they can do. They are not able to mine or use items, place blocks, use doors and switches, use containers, attack players or attack animals. You can change these options for a specific player using the in-game menu.{*B*}{*B*} + + {*T2*}Fire Spreads{*ETW*}{*B*} + When enabled, fire may spread to nearby flammable blocks. This option can also be changed from within the game.{*B*}{*B*} + + {*T2*}TNT Explodes{*ETW*}{*B*} + When enabled, TNT will explode when detonated. This option can also be changed from within the game.{*B*}{*B*} + + {*T2*}Host Privileges{*ETW*}{*B*} + When enabled, the host can toggle their ability to fly, disable exhaustion, and make themselves invisible from the in-game menu. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + +{*T1*}World Generation Options{*ETW*}{*B*} +When creating a new world there are some additional options.{*B*}{*B*} + + {*T2*}Generate Structures{*ETW*}{*B*} + When enabled, structures such as Villages and Strongholds will generate in the world.{*B*}{*B*} + + {*T2*}Superflat World{*ETW*}{*B*} + When enabled, a completely flat world will be generated in the Overworld and in the Nether.{*B*}{*B*} + + {*T2*}Bonus Chest{*ETW*}{*B*} + When enabled, a chest containing some useful items will be created near the player spawn point.{*B*}{*B*} + + {*T2*}Reset Nether{*ETW*}{*B*} + When enabled, the Nether will be re-generated. This is useful if you have an older save where Nether Fortresses were not present.{*B*}{*B*} + + {*T1*}In-Game Options{*ETW*}{*B*} + While in the game a number of options can be accessed by pressing {*BACK_BUTTON*} to bring up the in-game menu.{*B*}{*B*} + + {*T2*}Host Options{*ETW*}{*B*} + The host player, and any players set as moderators can access the "Host Option" menu. In this menu they can enable and disable fire spreading and TNT exploding.{*B*}{*B*} + +{*T1*}Player Options{*ETW*}{*B*} +To modify the privileges for a player, select their name and press{*CONTROLLER_VK_A*} to bring up the player privileges menu where you can use the following options.{*B*}{*B*} + + {*T2*}Can Build And Mine{*ETW*}{*B*} + This option is only available when "Trust Players" is turned off. When this option is enabled, the player is able to interact with the world as normal. When disabled the player will not be able to place or destroy blocks, or interact with many items and blocks.{*B*}{*B*} + + {*T2*}Can Use Doors and Switches{*ETW*}{*B*} + This option is only available when "Trust Players" is turned off. When this option is disabled, the player will not be able to use doors and switches.{*B*}{*B*} + + {*T2*}Can Open Containers{*ETW*}{*B*} + This option is only available when "Trust Players" is turned off. When this option is disabled, the player will not be able to open containers, such as chests.{*B*}{*B*} + + {*T2*}Can Attack Players{*ETW*}{*B*} + This option is only available when "Trust Players" is turned off. When this option is disabled the player will not be able to cause damage to other players.{*B*}{*B*} + + {*T2*}Can Attack Animals{*ETW*}{*B*} + This option is only available when "Trust Players" is turned off. When this option is disabled the player will not be able to cause damage to animals.{*B*}{*B*} + + {*T2*}Moderator{*ETW*}{*B*} + When this option is enabled, the player is able to change privileges for other players (except the host) if "Trust Players" is turned off, kick players and they can enable and disable fire spreading and TNT exploding.{*B*}{*B*} + + {*T2*}Kick Player{*ETW*}{*B*} + For players that are not on the same {*PLATFORM_NAME*} console as the host player, selecting this option will kick the player from the game and any other players on their {*PLATFORM_NAME*} console. This player will not be able to rejoin the game until it is restarted.{*B*}{*B*} + +{*T1*}Host Player Options{*ETW*}{*B*} +If "Host Privileges" is enabled the host player can modify some privileges for themselves. To modify the privileges for a player, select their name and press{*CONTROLLER_VK_A*} to bring up the player privileges menu where you can use the following options.{*B*}{*B*} + + {*T2*}Can Fly{*ETW*}{*B*} + When this option is enabled, the player is able to fly. This option is only relevant to Survival mode, as flying is enabled for all players in Creative mode.{*B*}{*B*} + + {*T2*}Disable Exhaustion{*ETW*}{*B*} + This option only affects Survival mode. When enabled, physical activities (walking/sprinting/jumping etc.) do not decrease the food bar. However, if the player becomes injured, the food bar will slowly decrease while the player is healing.{*B*}{*B*} + + {*T2*}Invisible{*ETW*}{*B*} + When this option is enabled, the player is not visible to other players and is invulnerable.{*B*}{*B*} + + {*T2*}Can Teleport{*ETW*}{*B*} + This allows the player to move players or themselves to other players in the world. + + + + + Next Page + + + Previous Page + + + Basics + + + HUD + + + Inventory + + + Chests + + + Crafting + + + Furnace + + + Dispenser + + + + Farming Animals + + + Breeding Animals + + + Brewing + + + Enchantment + + + + Nether Portal + + + Multiplayer + + + Sharing Screenshots + + + Banning Levels + + + Creative Mode + + + Host and Player Options + + + + Trading + + + Anvil + + + + The End + + + + {*T3*}HOW TO PLAY : THE END{*ETW*}{*B*}{*B*} +The End is another dimension in the game, which is reached through an active End Portal. The End Portal can be found in a Stronghold, which is deep underground in the Overworld.{*B*} +To activate the End Portal, you'll need to put an Eye of Ender into any End Portal Frame without one.{*B*} +Once the portal is active, jump in to it to go to The End.{*B*}{*B*} +In The End you will meet the Ender Dragon, a fierce and powerful enemy, along with many Enderman, so you will have to be well prepared for the battle before going there!{*B*}{*B*} +You'll find that there are Ender Crystals on top of eight Obsidian spikes that the Ender Dragon uses to heal itself, +so the first step in the battle is to destroy each of these.{*B*} +The first few can be reached with arrows, but the later ones are protected by an Iron Fence cage, and you will need to build up to them.{*B*}{*B*} +While you are doing this, the Ender Dragon will be attacking you by flying at you and spitting Ender acid balls!{*B*} +If you approach the Egg Podium in the centre of the spikes, the Ender Dragon will fly down and attack you and this is where you can really do some damage to it!{*B*} +Avoid the acid breath, and target the Ender Dragon's eyes for the best results. If possible, bring some friends in to The End to help you with the battle!{*B*}{*B*} +Once you are in The End, your friends will be able to see the location of the End Portal within the Stronghold on their maps, +so they can easily join you. + + + + Sprint + + + + What's New + + + + +{*T3*}Changes and Additions{*ETW*}{*B*}{*B*} +- Added new items - Emerald, Emerald Ore, Block of Emerald, Ender Chest, Tripwire Hook, Enchanted Golden Apple, Anvil, Flower Pot, Cobblestone Walls, Mossy Cobblestone Walls, Wither Painting, Potato, Baked Potato, Poisonous Potato, Carrot, Golden Carrot, Carrot on a Stick, +Pumpkin Pie, Night Vision Potion, Invisibility Potion, Nether Quartz, Nether Quartz Ore, Block of Quartz, Quartz Slab, Quartz Stair, Chiseled Quartz Block, Pillar Quartz Block, Enchanted Book, Carpet.{*B*} +- Added new recipes for Smooth Sandstone and Chiselled Sandstone.{*B*} +- Added new Mobs - Zombie Villagers.{*B*} +- Added new terrain generation features - Desert Temples, Desert Villages, Jungle Temples.{*B*} +- Added Trading with villagers.{*B*} +- Added Anvil interface.{*B*} +- Can dye leather armor.{*B*} +- Can dye wolf collars.{*B*} +- Can control riding a pig with a Carrot on a Stick.{*B*} +- Updated Bonus Chest content with more items.{*B*} +- Changed placement of half blocks and other blocks on half blocks.{*B*} +- Changed placement of upside down stairs and slabs.{*B*} +- Added different villager professions.{*B*} +- Villagers spawned from a spawn egg will have a random profession.{*B*} +- Added sideways log placement.{*B*} +- Furnaces can use wooden tools as a fuel.{*B*} +- Ice and Glass panes can be collected with silk touch enchanted tools.{*B*} +- Wooden Buttons and Wooden Pressure Plates can be activated with Arrows.{*B*} +- Nether mobs can spawn in the Overworld from Portals.{*B*} +- Creepers and Spiders are aggressive towards the last player that hit them.{*B*} +- Mobs in Creative mode become neutral again after a short period.{*B*} +- Remove knockback when drowning.{*B*} +- Doors being broken by zombies show damage.{*B*} +- Ice melts in the nether.{*B*} +- Cauldrons fill up when out in the rain.{*B*} +- Pistons take twice as long to update.{*B*} +- Pig drops Saddle when killed (if has one).{*B*} +- Sky color in The End changed.{*B*} +- String can be placed (for Tripwires).{*B*} +- Rain drips through leaves.{*B*} +- Levers can be placed on the bottom of blocks.{*B*} +- TNT does variable damage depending on difficulty setting.{*B*} +- Book recipe changed.{*B*} +- Boats break Lilypads, instead of Lilypads breaking Boats.{*B*} +- Pigs drop more Porkchops.{*B*} +- Slimes spawn less in Superflat worlds.{*B*} +- Creeper damage variable based on difficulty setting, more knockback.{*B*} +- Fixed Endermen not opening their jaws.{*B*} +- Added teleporting of players (using the {*BACK_BUTTON*} menu in-game).{*B*} +- Added new Host Options for flying, invisibility and invulnerability for remote players.{*B*} +- Added new tutorials to the Tutorial World for new items and features.{*B*} +- Updated the positions of the Music Disc Chests in the Tutorial World.{*B*} + + + + + {*ETB*}Welcome back! You may not have noticed but your Minecraft has just been updated.{*B*}{*B*} +There are lots of new features for you and friends to play with so here’s just a few highlights. Have a read and then go and have fun!{*B*}{*B*} +{*T1*}New Items{*ETB*} - Emerald, Emerald Ore, Block of Emerald, Ender Chest, Tripwire Hook, Enchanted Golden Apple, Anvil, Flower Pot, Cobblestone Walls, Mossy Cobblestone Walls, Wither Painting, Potato, Baked Potato, Poisonous Potato, Carrot, Golden Carrot, Carrot on a Stick, +Pumpkin Pie, Night Vision Potion, Invisibility Potion, Nether Quartz, Nether Quartz Ore, Block of Quartz, Quartz Slab, Quartz Stair, Chiseled Quartz Block, Pillar Quartz Block, Enchanted Book, Carpet.{*B*}{*B*} + {*T1*}New Mobs{*ETB*} - Zombie Villagers.{*B*}{*B*} +{*T1*}New Features{*ETB*} - Trade with villagers, repair or enchant weapons and tools with an Anvil, store items in an Ender Chest, control a pig while riding it using a Carrot on a Stick!{*B*}{*B*} +{*T1*}New Mini-Tutorials{*ETB*} – Learn how to use the new features in the Tutorial World!{*B*}{*B*} +{*T1*}New 'Easter Eggs'{*ETB*} – We've moved all the secret Music Discs in the Tutorial World. See if you can find them again!{*B*}{*B*} + + + + + + Deals more damage than by hand. + + + Used to dig dirt, grass, sand, gravel and snow faster than by hand. Shovels are required to dig snowballs. + + + Required to mine stone-related blocks and ore. + + + Used to chop wood-related blocks faster than by hand. + + + Used to till dirt and grass blocks to prepare for crops. + + + Wooden doors are activated by using, hitting them or with Redstone. + + + Iron doors can only be opened by Redstone, buttons or switches. + + + + NOT USED + + + NOT USED + + + NOT USED + + + NOT USED + + + + Gives the user 1 Armor when worn. + + + + Gives the user 3 Armor when worn. + + + + Gives the user 2 Armor when worn. + + + + Gives the user 1 Armor when worn. + + + + Gives the user 2 Armor when worn. + + + + Gives the user 5 Armor when worn. + + + + Gives the user 4 Armor when worn. + + + + Gives the user 1 Armor when worn. + + + + Gives the user 2 Armor when worn. + + + + Gives the user 6 Armor when worn. + + + + Gives the user 5 Armor when worn. + + + + Gives the user 2 Armor when worn. + + + + Gives the user 2 Armor when worn. + + + + Gives the user 5 Armor when worn. + + + + Gives the user 3 Armor when worn. + + + + Gives the user 1 Armor when worn. + + + + Gives the user 3 Armor when worn. + + + + Gives the user 8 Armor when worn. + + + + Gives the user 6 Armor when worn. + + + + Gives the user 3 Armor when worn. + + + A shiny ingot which can be used to craft tools made from this material. Created by smelting ore in a furnace. + + + Allows ingots, gems, or dyes to be crafted into placeable blocks. Can be used as an expensive building block or compact storage of the ore. + + + Used to send an electrical charge when stepped on by a player, an animal, or a monster. Wooden Pressure Plates can also be activated by dropping something on them. + + + Used for compact staircases. + + + Used for making long staircases. Two slabs placed on top of each other will create a normal-sized double slab block. + + + Used for making long staircases. Two slabs placed on top of each other will create a normal-sized double slab block. + + + Used to create light. Torches also melt snow and ice. + + + + Used as a building material and can be crafted into many things. Can be crafted from any form of wood. + + + Used as a building material. Is not influenced by gravity like normal Sand. + + + Used as a building material. + + + Used to craft torches, arrows, signs, ladders, fences and as handles for tools and weapons. + + + Used to forward time from any time at night to morning if all the players in the world are in bed, and changes the spawn point of the player. +The colors of the bed are always the same, regardless of the colors of wool used. + + + Allows you to craft a more varied selection of items than the normal crafting. + + + Allows you to smelt ore, create charcoal and glass, and cook fish and porkchops. + + + Stores blocks and items inside. Place two chests side by side to create a larger chest with double the capacity. + + + Used as a barrier that cannot be jumped over. Counts as 1.5 blocks high for players, animals and monsters, but 1 block high for other blocks. + + + Used to climb vertically. + + + Activated by using, hitting them or with redstone. They function as normal doors, but are a one by one block and lay flat on the ground. + + + Shows text entered by you or other players. + + + + Used to create brighter light than torches. Melts snow/ice and can be used underwater. + + + Used to cause explosions. Activated after placing by igniting with Flint and Steel item, or with an electrical charge. + + + Used to hold mushroom stew. You keep the bowl when the stew has been eaten. + + + Used to hold and transport water, lava and milk. + + + Used to hold and transport water. + + + Used to hold and transport lava. + + + Used to hold and transport milk. + + + + Used to create fire, ignite TNT, and open a portal once it has been built. + + + Used to catch fish. + + + Displays positions of the Sun and Moon. + + + Points to your start point. + + + Will create an image of an area explored while held. This can be used for path-finding. + + + + Allows for ranged attacks by using arrows. + + + Used as ammunition for bows. + + + + Restores 2.5{*ICON_SHANK_01*}. + + + Restores 1{*ICON_SHANK_01*}. Can be used 6 times. + + + Restores 1{*ICON_SHANK_01*}. + + + Restores 1{*ICON_SHANK_01*}. + + + Restores 3{*ICON_SHANK_01*}. + + + Restores 1{*ICON_SHANK_01*}, or can be cooked in a furnace. Eating this can cause you to be poisoned. + + + Restores 3{*ICON_SHANK_01*}. Created by cooking raw chicken in a furnace. + + + Restores 1.5{*ICON_SHANK_01*}, or can be cooked in a furnace. + + + Restores 4{*ICON_SHANK_01*}. Created by cooking raw beef in a furnace. + + + Restores 1.5{*ICON_SHANK_01*}, or can be cooked in a furnace. + + + Restores 4{*ICON_SHANK_01*}. Created by cooking a raw porkchop in a furnace. + + + Restores 1{*ICON_SHANK_01*}, or can be cooked in a furnace. Can be fed to an Ocelot to tame it. + + + Restores 2.5{*ICON_SHANK_01*}. Created by cooking a raw fish in a furnace. + + + Restores 2{*ICON_SHANK_01*}, and can be crafted into a golden apple. + + + Restores 2{*ICON_SHANK_01*}, and regenerates health for 4 seconds. Crafted from an apple and gold nuggets. + + + + Restores 2{*ICON_SHANK_01*}. Eating this can cause you to be poisoned. + + + + Used in the cake recipe, and as an ingredient for brewing potions. + + + Used to send an electrical charge by being turned on or off. Stays in the on or off state until pressed again. + + + Constantly sends an electrical charge, or can be used as a receiver/transmitter when connected to the side of a block. +Can also be used for low-level lighting. + + + Used in Redstone circuits as repeater, a delayer, and/or a diode. + + + Used to send an electrical charge by being pressed. Stays activated for approximately a second before shutting off again. + + + Used to hold and shoot out items in a random order when given a Redstone charge. + + + Plays a note when triggered. Hit it to change the pitch of the note. Placing this on top of different blocks will change the type of instrument. + + + + Used to guide minecarts. + + + When powered, accelerates minecarts that pass over it. When unpowered, causes minecarts to stop on it. + + + Functions like a Pressure Plate (sends a Redstone signal when powered) but can only be activated by a minecart. + + + Used to transport you, an animal, or a monster along rails. + + + Used to transport goods along rails. + + + Will move along rails and can push other minecarts when coal is put in it. + + + Used to travel in water more quickly than swimming. + + + + Collected from sheep, and can be colored with dyes. + + + Used as a building material and can be colored with dyes. This recipe is not recommended because Wool can be easily obtained from Sheep. + + + Used as a dye to create black wool. + + + Used as a dye to create green wool. + + + Used as a dye to create brown wool, as an ingredient in cookies, or to grow Cocoa Pods. + + + Used as a dye to create silver wool. + + + Used as a dye to create yellow wool. + + + Used as a dye to create red wool. + + + Used to instantly grow crops, trees, tall grass, huge mushrooms and flowers, and can be used in dye recipes. + + + Used as a dye to create pink wool. + + + Used as a dye to create orange wool. + + + Used as a dye to create lime wool. + + + Used as a dye to create gray wool. + + + Used as a dye to create light gray wool. +(Note: light gray dye can also be made by combining gray dye with bone meal, letting you make four light gray dyes from every ink sac instead of three.) + + + Used as a dye to create light blue wool. + + + Used as a dye to create cyan wool. + + + Used as a dye to create purple wool. + + + Used as a dye to create magenta wool. + + + Used as dye to create Blue Wool. + + + Plays Music Discs. + + + Use these to create very strong tools, weapons or armor. + + + Used to create brighter light than torches. Melts snow/ice and can be used underwater. + + + Used to create books and maps. + + + Can be used to create a bookshelves or enchanted to make Enchanted Books. + + + Allows the creation of more powerful enchantments when placed around the Enchantment Table. + + + Used as decoration. + + + + Can be mined with an iron pickaxe or better, then smelted in a furnace to produce gold ingots. + + + Can be mined with a stone pickaxe or better, then smelted in a furnace to produce iron ingots. + + + Can be mined with a pickaxe to collect coal. + + + Can be mined with a stone pickaxe or better to collect lapis lazuli. + + + Can be mined with an iron pickaxe or better to collect diamonds. + + + Can be mined with an iron pickaxe or better to collect redstone dust. + + + Can be mined with a pickaxe to collect cobblestone. + + + Collected using a shovel. Can be used for construction. + + + Can be planted and it will eventually grow into a tree. + + + This cannot be broken. + + + Sets fire to anything that touches it. Can be collected in a bucket. + + + Collected using a shovel. Can be smelted into glass using the furnace. Is affected by gravity if there is no other tile underneath it. + + + Collected using a shovel. Sometimes produces flint when dug up. Is affected by gravity if there is no other tile underneath it. + + + Chopped using an axe, and can be crafted into planks or used as a fuel. + + + Created in a furnace by smelting sand. Can be used for construction, but will break if you try to mine it. + + + Mined from stone using a pickaxe. Can be used to construct a furnace or stone tools. + + + Baked from clay in a furnace. + + + Can be baked into bricks in a furnace. + + + When broken drops clay balls which can be baked into bricks in a furnace. + + + A compact way to store snowballs. + + + Can be dug with a shovel to create snowballs. + + + Sometimes produces wheat seeds when broken. + + + Can be crafted into a dye. + + + Can be crafted with a bowl to make stew. + + + Can only be mined with a diamond pickaxe. Is produced by the meeting of water and still lava, and is used to build a portal. + + + Spawns monsters into the world. + + + Is placed on the ground to carry an electrical charge. When brewed with a potion it will increase the duration of the effect. + + + When fully grown, crops can be harvested to collect wheat. + + + Ground that has been prepared ready to plant seeds. + + + Can be cooked in a furnace to create a green dye. + + + Can be crafted to create sugar. + + + Can be worn as a helmet or crafted with a torch to create a Jack-O-Lantern. It is also the main ingredient in Pumpkin Pie. + + + Burns forever if set alight. + + + Slows the movement of anything walking over it. + + + Standing in the portal allows you to pass between the Overworld and the Nether. + + + + Used as a fuel in a furnace, or crafted to make a torch. + + + Collected by killing a spider, and can be crafted into a Bow or Fishing Rod, or placed on the ground to create Tripwire. + + + Collected by killing a chicken, and can be crafted into an arrow. + + + Collected by killing a Creeper, and can be crafted into TNT or used as an ingredient for brewing potions. + + + Can be planted in farmland to grow crops. Make sure there's enough light for the seeds to grow! + + + Harvested from crops, and can be used to craft food items. + + + Collected by digging gravel, and can be used to craft a flint and steel. + + + When used on a pig it allows you to ride the pig. The pig can then be steered using a Carrot on a Stick. + + + Collected by digging snow, and can be thrown. + + + Collected by killing a cow, and can be crafted into armor or used to make Books. + + + Collected by killing a Slime, and used as an ingredient for brewing potions or crafted to make Sticky Pistons. + + + Dropped randomly by chickens, and can be crafted into food items. + + + Collected by mining Glowstone, and can be crafted to make Glowstone blocks again or brewed with a potion to increase the potency of the effect. + + + Collected by killing a Skeleton. Can be crafted into bone meal. Can be fed to a wolf to tame it. + + + Collected by getting a Skeleton to kill a Creeper. Can be played in a jukebox. + + + Extinguishes fire and helps crops grow. Can be collected in a bucket. + + + When broken sometimes drops a sapling which can then be replanted to grow into a tree. + + + Found in dungeons, can be used for construction and decoration. + + + Used to obtain wool from sheep and harvest leaf blocks. + + + When powered (using a button, a lever, a pressure plate, a redstone torch, or redstone with any one of these), a piston extends if it can and pushes blocks. + + + When powered (using a button, a lever, a pressure plate, a redstone torch, or redstone with any one of these), a piston extends if it can and pushes blocks. When it retracts it pulls back the block touching the extended part of the piston. + + + Made from Stone blocks, and commonly found in Strongholds. + + + Used as a barrier, similar to fences. + + + Similar to a door, but used primarily with fences. + + + Can be crafted from Melon Slices. + + + Transparent blocks that can be used as an alternative to Glass Blocks. + + + Can be planted to grow pumpkins. + + + Can be planted to grow melons. + + + Dropped by Enderman when they die. When thrown, the player will be teleported to the position the Ender Pearl lands at, and will lose some health. + + + A block of dirt with grass growing on top. Collected using a shovel. Can be used for construction. + + + Can be used for construction and decoration. + + + Slows movement when walking through it. Can be destroyed using shears to collect string. + + + Spawns a Silverfish when destroyed. May also spawn Silverfish if nearby to another Silverfish being attacked. + + + Grows over time when placed. Can be collected using shears. Can be climbed like a ladder. + + + Slippery when walked on. Turns into water if above another block when destroyed. Melts if close enough to a light source or when placed in The Nether. + + + Can be used as decoration. + + + Used in potion brewing, and for locating Strongholds. Dropped by Blazes who tend to be found near or in Nether Fortresses. + + + Used in potion brewing. Dropped by Ghasts when they die. + + + Dropped by Zombie Pigmen when they die. Zombie Pigmen can be found in the Nether. Used as an ingredient for brewing potions. + + + Used in potion brewing. This can be found naturally growing in Nether Fortresses. It can also be planted on Soul Sand. + + + When used, can have various effects, depending on what it is used on. + + + Can be filled with water, and used as the starting ingredient for a potion in the Brewing Stand. + + + This is a poisonous food and brewing item. Dropped when a Spider or Cave Spider is killed by a player. + + + Used in potion brewing, mainly to create potions with a negative effect. + + + Used in potion brewing, or crafted with other items to make Eye of Ender or Magma Cream. + + + Used in potion brewing. + + + Used for making Potions and Splash Potions. + + + Filled with water by rain or with a bucket of water, and can then be used to fill Glass Bottles with water. + + + When thrown, will show the direction to an End Portal. When twelve of these are placed in the End Portal Frames, the End Portal will be activated. + + + Used in potion brewing. + + + Similar to Grass Blocks, but very good for growing mushrooms on. + + + Floats on water, and can be walked on. + + + Used to build Nether Fortresses. Immune to Ghast's fireballs. + + + Used in Nether Fortresses. + + + Found in Nether Fortresses, and will drop Nether Wart when broken. + + + This allows players to enchant Swords, Pickaxes, Axes, Shovels, Bows and Armor, using the player's Experience Points. + + + This can be activated using twelve Eye of Ender, and will allow the player to travel to The End dimension. + + + Used to form an End Portal. + + + A block type found in The End. It has a very high blast resistance, so is useful for building with. + + + This block is created by the defeat of the Dragon in The End. + + + When thrown, it drops Experience Orbs which increase your experience points when collected. + + + Useful for setting things on fire, or for indiscriminately starting fires when fired from a Dispenser. + + + These are similar to a display case, and will display the item or block placed in it. + + + When thrown can spawn a creature of the type indicated. + + + Used for making long staircases. Two slabs placed on top of each other will create a normal-sized double slab block. + + + Used for making long staircases. Two slabs placed on top of each other will create a normal-sized double slab block. + + + Created by smelting Netherrack in a furnace. Can be crafted into Nether Brick blocks. + + + When powered they emit light. + + + Can be farmed to collect Cocoa Beans. + + + Mob Heads can be placed as a decoration, or worn as a mask in the helmet slot. + + + Squid + + + Drops ink sacs when killed. + + + Cow + + + Drops leather when killed. Can also be milked with a bucket. + + + Sheep + + + Drops wool when sheared (if it has not already been sheared). Can be dyed to make its wool a different color. + + + Chicken + + + Drops feathers when killed, and also randomly lays eggs. + + + Pig + + + Drops porkchops when killed. Can be ridden by using a saddle. + + + Wolf + + + Docile until attacked, when they will attack you back. Can be tamed using bones which causes the wolf to follow you around and attack anything that attacks you. + + + Creeper + + + Explodes if you get too close! + + + Skeleton + + + Fires arrows at you. Drops arrows when killed. + + + Spider + + + Attacks you when you are close to it. Can climb walls. Drops string when killed. + + + Zombie + + + Attacks you when you are close to it. + + + Zombie Pigman + + + Initially docile, but will attack in groups if you attack one. + + + Ghast + + + Fires flaming balls at you that explode on contact. + + + Slime + + + Split into smaller Slimes when damaged. + + + Enderman + + + Will attack you if you look at it. Can also move blocks around. + + + Silverfish + + + Attracts nearby hidden Silverfish when attacked. Hides in stone blocks. + + + Cave Spider + + + Has a venomous bite. + + + Mooshroom + + + Makes mushroom stew when used with a bowl. Drops mushrooms and becomes a normal cow when sheared. + + + Snow Golem + + + The Snow Golem can be created by players using snow blocks and a pumpkin. They will throw snowballs at their creators enemies. + + + Ender Dragon + + + This is a large black dragon found in The End. + + + Blaze + + + These are enemies found in the Nether, mostly inside Nether Fortresses. They will drop Blaze Rods when killed. + + + Magma Cube + + + These can be found in The Nether. Similar to Slimes, they will break up into smaller versions when killed. + + + Villager + + + + + Ocelot + + + These can be found in Jungles. They can be tamed by feeding them Raw Fish. You will need to let the Ocelot approach you though, since any sudden movements will scare it away. + + + Iron Golem + + + Appear in Villages to protect them, and can be created using Iron Blocks and Pumpkins. + + + + + Explosives Animator + + + Concept Artist + + + + Number Crunching and Statistics + + + + Bully Coordinator + + + + Original Design and Code by + + + Project Manager/Producer + + + Rest of Mojang Office + + + Lead Game Programmer Minecraft PC + + + Ninja Coder + + + CEO + + + White Collar Worker + + + Customer Support + + + Office DJ + + + Designer/Programmer Minecraft - Pocket Edition + + + Developer + + + Chief Architect + + + Art Developer + + + Game Crafter + + + Director of Fun + + + Music and Sounds + + + Programming + + + Art + + + QA + + + Executive Producer + + + Lead Producer + + + Producer + + + Test Lead + + + Lead Tester + + + Design Team + + + Development Team + + + Release Management + + + Director, XBLA Publishing + + + Business Development + + + Portfolio Director + + + Product Manager + + + Marketing + + + Community Manager + + + Europe Localization Team + + + Redmond Localization Team + + + Asia Localization Team + + + User Research Team + + + MGS Central Teams + + + Milestone Acceptance Tester + + + Special Thanks + + + Test Manager + + + Senior Test Lead + + + SDET + + + Project STE + + + Additional STE + + + Test Associates + + + Jon Kågström + + + Tobias Möllstam + + + Risë Lugo + + + + Wooden Sword + + + + Stone Sword + + + Iron Sword + + + Diamond Sword + + + Golden Sword + + + Wooden Shovel + + + Stone Shovel + + + Iron Shovel + + + Diamond Shovel + + + Golden Shovel + + + Wooden Pickaxe + + + Stone Pickaxe + + + Iron Pickaxe + + + Diamond Pickaxe + + + Golden Pickaxe + + + Wooden Axe + + + Stone Axe + + + Iron Axe + + + Diamond Axe + + + Golden Axe + + + Wooden Hoe + + + Stone Hoe + + + Iron Hoe + + + Diamond Hoe + + + Golden Hoe + + + Wooden Door + + + Iron Door + + + Chain Helmet + + + Chain Chestplate + + + Chain Leggings + + + Chain Boots + + + Leather Cap + + + Iron Helmet + + + Diamond Helmet + + + Golden Helmet + + + Leather Tunic + + + Iron Chestplate + + + Diamond Chestplate + + + Golden Chestplate + + + Leather Pants + + + Iron Leggings + + + Diamond Leggings + + + Golden Leggings + + + Leather Boots + + + Iron Boots + + + Diamond Boots + + + Golden Boots + + + Iron Ingot + + + Gold Ingot + + + Bucket + + + Water Bucket + + + Lava Bucket + + + Flint and Steel + + + Apple + + + Bow + + + Arrow + + + Coal + + + Charcoal + + + Diamond + + + Stick + + + Bowl + + + Mushroom Stew + + + String + + + Feather + + + Gunpowder + + + Wheat Seeds + + + Wheat + + + Bread + + + Flint + + + Raw Porkchop + + + Cooked Porkchop + + + Painting + + + Golden Apple + + + Sign + + + Minecart + + + Saddle + + + Redstone + + + Snowball + + + Boat + + + Leather + + + Milk Bucket + + + Brick + + + Clay + + + Sugar Canes + + + Paper + + + Book + + + Slimeball + + + Minecart with Chest + + + Minecart with Furnace + + + Egg + + + Compass + + + Fishing Rod + + + Clock + + + Glowstone Dust + + + Raw Fish + + + Cooked Fish + + + Dye Powder + + + Ink Sac + + + Rose Red + + + Cactus Green + + + Cocoa Beans + + + Lapis Lazuli + + + Purple Dye + + + Cyan Dye + + + Light Gray Dye + + + Gray Dye + + + Pink Dye + + + Lime Dye + + + Dandelion Yellow + + + Light Blue Dye + + + Magenta Dye + + + Orange Dye + + + Bone Meal + + + Bone + + + Sugar + + + Cake + + + Bed + + + Redstone Repeater + + + Cookie + + + Map + + + Music Disc - "13" + + + Music Disc - "cat" + + + Music Disc - "blocks" + + + Music Disc - "chirp" + + + Music Disc - "far" + + + Music Disc - "mall" + + + Music Disc - "mellohi" + + + Music Disc - "stal" + + + Music Disc - "strad" + + + Music Disc - "ward" + + + Music Disc - "11" + + + Music Disc - "where are we now" + + + Shears + + + Pumpkin Seeds + + + Melon Seeds + + + Raw Chicken + + + Cooked Chicken + + + Raw Beef + + + Steak + + + Rotten Flesh + + + Ender Pearl + + + Melon Slice + + + Blaze Rod + + + Ghast Tear + + + Gold Nugget + + + Nether Wart + + + {*splash*}{*prefix*}Potion {*postfix*} + + + Glass Bottle + + + Water Bottle + + + Spider Eye + + + Fermented Spider Eye + + + Blaze Powder + + + Magma Cream + + + Brewing Stand + + + Cauldron + + + Eye of Ender + + + Glistering Melon + + + Bottle o' Enchanting + + + Fire Charge + + + Fire Charge (Charcoal) + + + Fire Charge (Coal) + + + Item Frame + + + Spawn {*CREATURE*} + + + Nether Brick + + + Skull + + + Skeleton Skull + + + Wither Skeleton Skull + + + Zombie Head + + + Head + + + %s's Head + + + Creeper Head + + + Stone + + + Grass Block + + + Dirt + + + Cobblestone + + + Oak Wood Planks + + + Spruce Wood Planks + + + Birch Wood Planks + + + Jungle Wood Planks + + + Sapling + + + Oak Sapling + + + Spruce Sapling + + + Birch Sapling + + + Jungle Tree Sapling + + + Bedrock + + + Water + + + Lava + + + Sand + + + Sandstone + + + Gravel + + + Gold Ore + + + Iron Ore + + + Coal Ore + + + Wood + + + Oak Wood + + + Spruce Wood + + + Birch Wood + + + Jungle Wood + + + Oak + + + Spruce + + + Birch + + + Leaves + + + Oak Leaves + + + Spruce Leaves + + + Birch Leaves + + + Jungle Leaves + + + Sponge + + + Glass + + + Wool + + + Black Wool + + + Red Wool + + + Green Wool + + + Brown Wool + + + Blue Wool + + + Purple Wool + + + Cyan Wool + + + Light Gray Wool + + + Gray Wool + + + Pink Wool + + + Lime Wool + + + Yellow Wool + + + Light Blue Wool + + + Magenta Wool + + + Orange Wool + + + White Wool + + + Flower + + + Rose + + + Mushroom + + + Block of Gold + + + + A compact way of storing Gold. + + + + A compact way of storing Iron. + + + + + Block of Iron + + + Stone Slab + + + Stone Slab + + + Sandstone Slab + + + Oak Wood Slab + + + Cobblestone Slab + + + Bricks Slab + + + Stone Bricks Slab + + + Oak Wood Slab + + + Spruce Wood Slab + + + Birch Wood Slab + + + Jungle Wood Slab + + + Nether Brick Slab + + + + Bricks + + + TNT + + + Bookshelf + + + Moss Stone + + + Obsidian + + + Torch + + + + Torch (Coal) + + + Torch (Charcoal) + + + Fire + + + Monster Spawner + + + Oak Wood Stairs + + + Chest + + + Redstone Dust + + + Diamond Ore + + + Block of Diamond + + + + A compact way of storing Diamonds. + + + + Crafting Table + + + Crops + + + Farmland + + + Furnace + + + Sign + + + Wooden Door + + + Ladder + + + Rail + + + Powered Rail + + + Detector Rail + + + Stone Stairs + + + Lever + + + Pressure Plate + + + Iron Door + + + Redstone Ore + + + Redstone Torch + + + Button + + + Snow + + + Ice + + + Cactus + + + Clay + + + Sugar Cane + + + Jukebox + + + Fence + + + Pumpkin + + + Jack-O-Lantern + + + Netherrack + + + Soul Sand + + + Glowstone + + + Portal + + + Lapis Lazuli Ore + + + Lapis Lazuli Block + + + + A compact way of storing Lapis Lazuli. + + + + Dispenser + + + Note Block + + + Cake + + + Bed + + + Web + + + Tall Grass + + + Dead Bush + + + Diode + + + Locked Chest + + + Trapdoor + + + Wool (any color) + + + Piston + + + Sticky Piston + + + Silverfish Block + + + Stone Bricks + + + Mossy Stone Bricks + + + Cracked Stone Bricks + + + Chiseled Stone Bricks + + + Mushroom + + + Mushroom + + + Iron Bars + + + Glass Pane + + + Melon + + + Pumpkin Stem + + + Melon Stem + + + Vines + + + Fence Gate + + + Brick Stairs + + + Stone Brick Stairs + + + Silverfish Stone + + + Silverfish Cobblestone + + + Silverfish Stone Brick + + + Mycelium + + + Lily Pad + + + Nether Brick + + + Nether Brick Fence + + + Nether Brick Stairs + + + Nether Wart + + + Enchantment Table + + + Brewing Stand + + + Cauldron + + + End Portal + + + End Portal Frame + + + End Stone + + + Dragon Egg + + + Shrub + + + Fern + + + Sandstone Stairs + + + Spruce Wood Stairs + + + Birch Wood Stairs + + + Jungle Wood Stairs + + + Redstone Lamp + + + Cocoa + + + Skull + + + + Current Controls + + + Layout + + + Move/Sprint + + + Look + + + Pause + + + Jump + + + Jump/Fly Up + + + Inventory + + + Cycle Held Item + + + Action + + + Use + + + Crafting + + + Drop + + + Sneak + + + Sneak/Fly Down + + + Change Camera Mode + + + Players/Invite + + + Movement (When Flying) + + + Layout 1 + + + Layout 2 + + + Layout 3 + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + ]]> + + + + ]]> + + + ]]> + + + + + {*B*}Press{*CONTROLLER_VK_A*} to continue. + + + {*B*}Press{*CONTROLLER_VK_A*} to start the tutorial.{*B*} + Press{*CONTROLLER_VK_B*} if you think you are ready to play on your own. + + + + Minecraft is a game about placing blocks to build anything you can imagine. +At night monsters come out, make sure to build a shelter before that happens. + + + Use{*CONTROLLER_ACTION_LOOK*} to look up, down and around. + + + Use{*CONTROLLER_ACTION_MOVE*} to move around. + + + To sprint, push{*CONTROLLER_ACTION_MOVE*} forward twice quickly. While you hold{*CONTROLLER_ACTION_MOVE*} forward, the character will continue to sprint unless they run out of sprint time or food. + + + Press{*CONTROLLER_ACTION_JUMP*} to jump. + + + Hold{*CONTROLLER_ACTION_ACTION*} to mine and chop using your hand or whatever you are holding. You may need to craft a tool to mine some blocks... + + + Hold{*CONTROLLER_ACTION_ACTION*} to chop down 4 blocks of wood (tree trunks).{*B*}When a block breaks you can pick it up by standing near to the floating item that appears, causing it to appear in your inventory. + + + Press{*CONTROLLER_ACTION_CRAFTING*} to open the crafting interface. + + + As you collect and craft more items, your inventory will fill up.{*B*} + Press{*CONTROLLER_ACTION_INVENTORY*} to open the inventory. + + + As you move around, mine and attack, you will deplete your food bar{*ICON_SHANK_01*}. Sprinting and sprint jumping use a lot more food than walking and jumping normally. + + + If you lose some health, but have a food bar with 9 or more{*ICON_SHANK_01*} in it, your health will automatically replenish. Eating food will replenish your food bar. + + + With a food item in your hand, hold{*CONTROLLER_ACTION_USE*} to eat it and replenish your food bar. You cannot eat if your food bar is full. + + + Your food bar is low, and you have lost some health. Eat the steak in your inventory to replenish your food bar and start healing.{*ICON*}364{*/ICON*} + + + The wood that you have collected can be crafted into planks. Open the crafting interface to craft them.{*PlanksIcon*} + + + A lot of crafting can involve multiple steps. Now that you have some planks there are more items that you can craft. Create a crafting table.{*CraftingTableIcon*} + + + To make collecting blocks faster you can build tools designed for the job. Some tools have a handle made of sticks. Craft some sticks now.{*SticksIcon*} + + + Use{*CONTROLLER_ACTION_LEFT_SCROLL*} and{*CONTROLLER_ACTION_RIGHT_SCROLL*} to change the current held item. + + + Use{*CONTROLLER_ACTION_USE*} to use items, interact with objects and place some items. Items that have been placed can be picked up again by mining them with the right tool. + + + With the crafting table selected, point the crosshair where you want it and use{*CONTROLLER_ACTION_USE*} to place a crafting table. + + + Point the crosshair at the crafting table and press{*CONTROLLER_ACTION_USE*} to open it. + + + A shovel helps dig soft blocks, like dirt and snow, faster. As you collect more materials you can craft tools that work faster and last longer. Create a wooden shovel.{*WoodenShovelIcon*} + + + An axe helps chop wood and wooden tiles, faster. As you collect more materials you can craft tools that work faster and last longer. Create a wooden axe.{*WoodenHatchetIcon*} + + + A pickaxe helps dig hard blocks, like stone and ore, faster. As you collect more materials you can craft tools that work faster and last longer, and allow you to mine harder materials. Create a wooden pickaxe.{*WoodenPickaxeIcon*} + + + Open the container + + + + Night time can approach quickly, and it is dangerous to be outside unprepared. You can craft armor and weapons, but it is sensible to have a safe shelter. + + + + + Nearby there is an abandoned Miner's shelter that you can complete to be safe overnight. + + + + + You will need to collect the resources to complete the shelter. Walls and roof can be made of any tile type, but you will want to create a door, some windows and lighting. + + + + Use your pickaxe to mine some stone blocks. Stone blocks will produce cobblestone when mined. If you collect 8 cobblestone blocks you can build a furnace. You may need to dig through some dirt to reach the stone, so use your shovel for this.{*StoneIcon*} + + + You have collected enough cobblestone to build a furnace. Use your crafting table to create one. + + + Use{*CONTROLLER_ACTION_USE*} to place the furnace in the world, and then open it. + + + Use the furnace to create some charcoal. If you are waiting for it to finish how about using the time to collect more materials to finish the shelter? + + + Use the furnace to create some glass. If you are waiting for it to finish how about using the time to collect more materials to finish the shelter? + + + A good shelter will have a door so that you can easily go in and out without having to mine and replace the walls. Craft a wooden door now.{*WoodenDoorIcon*} + + + Use{*CONTROLLER_ACTION_USE*} to place the door. You can use{*CONTROLLER_ACTION_USE*} to open and close a wooden door in the world. + + + It can get very dark at night, so you will want some lighting inside your shelter so that you can see. Craft a torch now from sticks and charcoal using the crafting interface.{*TorchIcon*} + + + + You have completed the first part of the tutorial. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to continue with the tutorial.{*B*} + Press{*CONTROLLER_VK_B*} if you think you are ready to play on your own. + + + + + + This is your inventory. It shows items available for use in your hand, and all the other items that you are carrying. Your armor is also shown here. + + + + {*B*} + Press{*CONTROLLER_VK_A*} to continue.{*B*} + Press{*CONTROLLER_VK_B*} if you already know how to use the inventory. + + + + + Use{*CONTROLLER_MENU_NAVIGATE*} to move the pointer. Use{*CONTROLLER_VK_A*} to pick an item under the pointer. + If there is more than one item here this will pick them all up, or you can use{*CONTROLLER_VK_X*} to pick up just half of them. + + + + + Move this item with the pointer over another space in the inventory and place it down using{*CONTROLLER_VK_A*}. + With multiple items on the pointer, use{*CONTROLLER_VK_A*} to place them all, or{*CONTROLLER_VK_X*} to place just one. + + + + + If you move the pointer outside the edge of the interface with an item on the pointer, you can drop the item. + + + + + If you want more information about an item, move the pointer over the item and press{*CONTROLLER_VK_RT*} . + + + + + Press{*CONTROLLER_VK_B*} now to exit the inventory. + + + + + + + + This is the creative mode inventory. It shows items available for use in your hand, and all the other items that you can choose from. + + + + {*B*} + Press{*CONTROLLER_VK_A*} to continue.{*B*} + Press{*CONTROLLER_VK_B*} if you already know how to use the creative mode inventory. + + + + + Use{*CONTROLLER_MENU_NAVIGATE*} to move the pointer. + When on the item list, use{*CONTROLLER_VK_A*} to pick an item under the pointer, and use{*CONTROLLER_VK_Y*} to pick up a full stack of that item. + + + + + The pointer will automatically move over a space in the use row. You can place it down using{*CONTROLLER_VK_A*}. Once you have placed the item, the pointer will return to the item list where you can select another item. + + + + + If you move the pointer outside the edge of the interface with an item on the pointer, you can drop the item into the world. To clear all items in the quick select bar, press{*CONTROLLER_VK_X*}. + + + + + Scroll through the Group Type tabs at the top using{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*} to select the group type of the item you wish to pickup. + + + + + If you want more information about an item, move the pointer over the item and press{*CONTROLLER_VK_RT*} . + + + + + Press{*CONTROLLER_VK_B*} now to exit the creative mode inventory. + + + + + + This is the crafting interface. This interface allows you to combine the items you've collected to make new items. + + + + {*B*} + Press{*CONTROLLER_VK_A*} to continue.{*B*} + Press{*CONTROLLER_VK_B*} if you already know how to craft. + + + + {*B*} + Press{*CONTROLLER_VK_X*} to show the item description. + + + + {*B*} + Press{*CONTROLLER_VK_X*} to show the ingredients required to make the current item. + + + + {*B*} + Press{*CONTROLLER_VK_X*} to show the inventory again. + + + + + Scroll through the Group Type tabs at the top using{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*} to select the group type of the item you wish to craft, then use{*CONTROLLER_MENU_NAVIGATE*} to select the item to craft. + + + + + The crafting area shows the items you require in order to craft the new item. Press{*CONTROLLER_VK_A*} to craft the item and place it in your inventory. + + + + + You can craft a larger selection of items using a crafting table. Crafting on a table works in the same way as basic crafting, but you have a larger crafting area allowing more combinations of ingredients. + + + + + The bottom right part of the crafting interface shows your inventory. This area can also show a description of the currently selected item, and the ingredients required to craft it. + + + + + The description of the currently selected item is now displayed. The description can give you an idea of what the item can be used for. + + + + + The list of ingredients required to craft the selected item are now displayed. + + + + The wood that you have collected can be crafted into planks. Select the planks icon and press{*CONTROLLER_VK_A*} to create them.{*PlanksIcon*} + + + + Now you have built a crafting table you should place it in the world to enable you to build a larger selection of items.{*B*} + Press{*CONTROLLER_VK_B*} now to exit the crafting interface. + + + + + Press{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*} to change to the group type of the items you wish to craft. Select the tools group.{*ToolsIcon*} + + + + + Press{*CONTROLLER_VK_LB*} and{*CONTROLLER_VK_RB*} to change to the group type of the items you wish to craft. Select the structures group.{*StructuresIcon*} + + + + + Use{*CONTROLLER_MENU_NAVIGATE*} to change to the item you wish to craft. Some items have multiple versions depending on the materials used. Select the wooden shovel.{*WoodenShovelIcon*} + + + + + A lot of crafting can involve multiple steps. Now that you have some planks there are more items that you can craft. Use{*CONTROLLER_MENU_NAVIGATE*} to change to the item you wish to craft. Select the crafting table.{*CraftingTableIcon*} + + + + + With the tools you have built you are off to a great start, and are able to collect a variety of different materials more efficiently.{*B*} + Press{*CONTROLLER_VK_B*} now to exit the crafting interface. + + + + + Some items can not be created using the crafting table, but require a furnace. Craft a furnace now.{*FurnaceIcon*} + + + + + Place the furnace you have crafted in the world. You will want to put this inside your shelter.{*B*} + Press{*CONTROLLER_VK_B*} now to exit the crafting interface. + + + + + + This is the furnace interface. A furnace allows you to change items by firing them. For example, you can turn iron ore into iron ingots in the furnace. + + + + {*B*} + Press{*CONTROLLER_VK_A*} to continue.{*B*} + Press{*CONTROLLER_VK_B*} if you already know how to use a furnace. + + + + + You need to put some fuel into the bottom slot of the furnace, and the item to be changed in the top slot. The furnace will then fire up and start working, putting the result in the right-hand slot. + + + + + Many wooden items can be used as fuels, but not everything burns for the same time. You may also discover other items in the world that can be used as a fuel. + + + + + When your items have been fired, you can move them from the output area into your inventory. You should experiment with different ingredients to see what you can make. + + + + + If you use wood as the ingredient then you can make charcoal. Put some fuel in the furnace and wood in the ingredient slot. It can take some time for the furnace to create the charcoal, so feel free to do something else and come back to check the progress. + + + + + Charcoal can be used as a fuel, as well as being crafted into a torch with a stick. + + + + + Placing sand in the ingredient slot allows you to make glass. Create some glass blocks to use as windows in your shelter. + + + + + + This is the brewing interface. You can use this to create potions that have a variety of different effects. + + + + {*B*} + Press{*CONTROLLER_VK_A*} to continue.{*B*} + Press{*CONTROLLER_VK_B*} if you already know how to use the brewing stand. + + + + + You brew potions by placing an ingredient in the top slot, and a potion or water bottle in the bottom slots (up to 3 can be brewed at one time). Once a valid combination is entered the brewing process will start and create the potion after a short time. + + + + + All potions start with a Water Bottle. Most potions are created by first using a Nether Wart to make an Awkward Potion, and will require at least one more ingredient to make the final potion. + + + + + Once you have a potion you can modify its effects. Adding Redstone Dust increases the duration of its effect and adding Glowstone Dust can make its effect more powerful. + + + + + Adding Fermented Spider Eye corrupts the potion and can turn it into a potion with the opposite effect, and adding Gunpowder turns the potion into a Splash Potion which can be thrown to apply its affect to a nearby area. + + + + + Create a Potion of Fire Resistance by first adding Nether Wart to a Water Bottle, and then adding Magma Cream. + + + + + Press{*CONTROLLER_VK_B*} now to exit the brewing interface. + + + + + + In this area there is a Brewing Stand, a Cauldron and a chest full of items for brewing. + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about brewing and potions.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about brewing and potions. + + + + + The first step in brewing a potion is to create a Water Bottle. Take a Glass Bottle from the chest. + + + + + You can fill a glass bottle from a Cauldron that has water in it, or from a block of water. Fill your glass bottle now by pointing at a water source and pressing{*CONTROLLER_ACTION_USE*}. + + + + + If a cauldron becomes empty, you can refill it with a Water Bucket. + + + + + Use the Brewing Stand to create a Potion of Fire Resistance. You will need a Water Bottle, Nether Wart and Magma Cream. + + + + + With a potion in your hand, hold{*CONTROLLER_ACTION_USE*} to use it. For a normal potion you will drink it and apply the effect to yourself, and for a Splash potion you will throw it and apply the effect to creatures near where it hits. + Splash potions can be created by adding gunpowder to normal potions. + + + + + Use your Potion of Fire Resistance on yourself. + + + + + Now that you are resistant to fire and lava, you should see if there are places you can get to that you couldn't before. + + + + + + This is the enchanting interface which you can use to add enchantments to weapons, armor and some tools. + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about the enchanting interface.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about the enchanting interface. + + + + + To enchant an item, first place it in the enchanting slot. Weapons, armor and some tools can be enchanted to add special effects such as improved damage resistance or increasing the number of items produced when mining a block. + + + + + When an item is placed in the enchanting slot, the buttons on the right will change to show a selection of random enchantments. + + + + + The number on the button represents the cost in experience levels to apply that enchantment to the item. If you do not have a high enough level the button will be disabled. + + + + + Select an enchantment and press{*CONTROLLER_VK_A*} to enchant the item. This will decrease your experience level by the cost of the enchantment. + + + + + Although the enchantments are all random, some of the better enchantments are only available when you have a high experience level and have lots of bookcases around the Enchantment Table to increase its power. + + + + + + In this area there is an Enchantment Table and some other items to help you learn about enchanting. + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about enchanting.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about enchanting. + + + + + Using an Enchantment Table allows you to add special effects such as increasing the number of items produced when mining a block, or improved damage resistance for weapons, armor and some tools. + + + + + Placing bookcases around the Enchantment Table increases its power and allows access to higher level enchantments. + + + + + Enchanting items costs Experience Levels, which can be built up by collecting Experience Orbs which are produced by killing monsters and animals, mining ores, breeding animals, fishing and smelting/cooking some things in a furnace. + + + + + You can also build experience levels using a Bottle O' Enchanting, which, when thrown, creates Experience Orbs around where it lands. These orbs can then be collected. + + + + + In the chests in this area you can find some enchanted items, Bottles O' Enchanting, and some items that have yet to be enchanted for you to experiment with at the Enchantment Table. + + + + + + + + You are now riding in a minecart. To exit the minecart, point the cursor at it and press{*CONTROLLER_ACTION_USE*} .{*MinecartIcon*} + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about minecarts.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about minecarts. + + + + + A minecart runs on rails. You can also craft a powered minecart with a furnace and a minecart with a chest in it. + {*RailIcon*} + + + + + You can also craft powered rails, which take power from redstone torches and circuits to accelerate the cart. These can be connected to switches, levers and pressure plates to make complex systems. + {*PoweredRailIcon*} + + + + + You are now sailing a boat. To exit the boat, point the cursor at it and press{*CONTROLLER_ACTION_USE*} .{*BoatIcon*} + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about boats.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about boats. + + + + + A boat allows you to travel quicker over water. You can steer it using{*CONTROLLER_ACTION_MOVE*} and{*CONTROLLER_ACTION_LOOK*}. + {*BoatIcon*} + + + + + + You are now using a fishing rod. Press{*CONTROLLER_ACTION_USE*} to use it.{*FishingRodIcon*} + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about fishing.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about fishing. + + + + + Press{*CONTROLLER_ACTION_USE*} to cast your line and start fishing. Press{*CONTROLLER_ACTION_USE*} again to reel in the fishing line. + {*FishingRodIcon*} + + + + + If you wait until the float sinks below the surface of the water before reeling in you can catch a fish. Fish can be eaten raw, or cooked by a furnace, to restore health. + {*FishIcon*} + + + + + As with many other tools a fishing rod has a fixed number of uses. Those uses are not limited to catching fish though. You should experiment with it to see what else can be caught or activated... + {*FishingRodIcon*} + + + + + + This is a bed. Press{*CONTROLLER_ACTION_USE*} while pointing at it at night to sleep through the night and awake in the morning.{*ICON*}355{*/ICON*} + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about beds.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about beds. + + + + + A bed should be placed in a safe, well-lit place so that monsters do not wake you in the middle of the night. Once you have used a bed, if you die you will respawn at that bed. + {*ICON*}355{*/ICON*} + + + + + If there are other players in your game, everyone must be in a bed at the same time to be able to sleep. + {*ICON*}355{*/ICON*} + + + + + + In this area there are some simple Redstone and Piston circuits, and a chest with more items to extend these circuits. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about Redstone circuits and Pistons.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about Redstone circuits and Pistons. + + + + + Levers, Buttons, Pressure Plates and Redstone Torches can all provide power to circuits, either by directly attaching them to the item you want to activate or by connecting them with Redstone dust. + + + + + + The position and direction that you place a power source can change how it affects the surrounding blocks. For example a Redstone torch on the side of a block can be turned off if the block is powered by another source. + + + + + Redstone dust is collected by mining redstone ore with a pickaxe made of Iron, Diamond or Gold. You can use it to carry power up to 15 blocks, and it can travel up or down one block in height. + {*ICON*}331{*/ICON*} + + + + + Redstone repeaters can be used to extend the distance that the power is carried, or put a delay in a circuit. + {*ICON*}356{*/ICON*} + + + + + When powered, a Piston will extend, pushing up to 12 blocks. When they retract, Sticky Pistons can pull back one block of most types. + {*ICON*}33{*/ICON*} + + + + + In the chest in this area there are some components for making circuits with pistons. Try using or completing the circuits in this area, or put together your own. There are more examples outside the tutorial area. + + + + + + In this area there is a Portal to the Nether! + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about Portals and The Nether.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about Portals and The Nether. + + + + + Portals are created by placing Obsidian blocks into a frame four blocks wide and five blocks tall. The corner blocks are not required. + + + + + To activate a Nether Portal, set fire to the Obisidian blocks inside the frame with a Flint and Steel. Portals can be deactivated if their frame is broken, an explosion happens nearby or a liquid flows through them. + + + + + To use a Nether Portal, stand inside it. Your screen will go purple and a sound will play. After a few seconds you will be transported to another dimension. + + + + + The Nether can be a dangerous place, full of lava, but can be useful to collect Netherrack which burns forever when lit, and Glowstone which produces light. + + + + + The Nether world can be used to fast-travel in the Overworld - traveling one block distance in the Nether is equivalent to traveling 3 blocks in the Overworld. + + + + + + You are now in Creative mode. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about Creative mode.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about Creative mode. + + + + When in Creative mode you have in infinite number of all available items and blocks, you can destroy blocks with one click without a tool, you are invulnerable and you can fly. + + + Pressing{*CONTROLLER_ACTION_JUMP*} twice quickly will allow you to fly. To exit flying, repeat the action. To fly faster, push{*CONTROLLER_ACTION_MOVE*} forward twice in rapid succession while flying. +When in flying mode, you can hold down{*CONTROLLER_ACTION_JUMP*} to move up and{*CONTROLLER_ACTION_SNEAK*} to move down, or use the D-pad to move up, down, left or right. + + + Press{*CONTROLLER_ACTION_CRAFTING*} to open the creative inventory interface. + + + Make your way to the opposite side of this hole to continue. + + + You have now completed the Creative mode tutorial. + + + + + In this area a farm has been set up. Farming enables you to create a renewable source of food and other items. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about farming.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about farming. + + + + Wheat, Pumpkins and Melons are grown from seeds. Wheat seeds are collected by breaking Tall Grass or harvesting wheat, and Pumpkin and Melon seeds are crafted from Pumpkins and Melons respectively. + + + Before planting seeds the dirt blocks need to be turned into Farmland by using a Hoe. A nearby source of water will help keep the Farmland hydrated and make the crops grow faster, as will keeping the area lit. + + + Wheat goes through several stages when growing, and is ready to be harvested when it appears darker.{*ICON*}59:7{*/ICON*} + + + Pumpkins and Melons also need a block next to where you planted the seed for the fruit to grow once the stem has fully grown. + + + Sugarcane must be planted on a Grass, Dirt or Sand block that is right next to water block. Chopping a Sugarcane block will also drop all blocks that are above it.{*ICON*}83{*/ICON*} + + + Cacti must be planted on Sand, and will grow up to three blocks high. Like Sugarcane, destroying the lowest block will also allow you to collect the blocks that are above it.{*ICON*}81{*/ICON*} + + + Mushrooms should be planted in a dimly lit area, and will spread to nearby dimly lit blocks.{*ICON*}39{*/ICON*} + + + Bonemeal can be used to grow crops to their fully grown state, or grow Mushrooms into Huge Mushrooms.{*ICON*}351:15{*/ICON*} + + + You have now completed the farming tutorial. + + + + + In this area animals have been penned in. You can breed animals to produce baby versions of themselves. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about animals and breeding.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about animals and breeding. + + + + To get the animals to breed, you will need to feed them with the right food to get them to go into 'Love Mode'. + + + Feed Wheat to a cow, mooshroom or sheep, Carrots to pigs, Wheat Seeds or Nether Wart to a chicken, or any kind of meat to a wolf, and they'll start looking for another animal of the same species near them that is also in Love Mode. + + + When two animals of the same species meet, and both are in Love Mode, they will kiss for a few seconds, and then a baby animal will appear. The baby animal will follow their parents for a while before growing into a full sized animal itself. + + + After being in Love Mode, an animal will not be able to enter it again for about five minutes. + + + Some animals will follow you if you are holding their food in your hand. This makes it easier to group animals together to breed them.{*ICON*}296{*/ICON*} + + + + + Wild wolves can be tamed by giving them bones. Once tamed Love Hearts will appear around them. Tamed wolves will follow the player and defend them if they haven't been commanded to sit. + + + + + You have now completed the animal and breeding tutorial. + + + + + In this area are some pumpkins and blocks to make a Snow Golem and an Iron Golem. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about Golems.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about Golems. + + + + Golems are created by placing a pumpkin on top of a stack of blocks. + + + Snow Golems are created with two Snow Blocks, one of top of the other, with a pumpkin on top. Snow Golems throw snowballs at your enemies. + + + Iron Golems are created with four Iron Blocks in the pattern shown, with a pumpkin on top of the middle block. Iron Golems attack your enemies. + + + Iron Golems also appear naturally to protect villages, and will attack you if you attack any villagers. + + + + You cannot leave this area until you have completed the tutorial. + + + + Different tools are better for different materials. You should use a shovel to mine soft materials like earth and sand. + + + Different tools are better for different materials. You should use an axe to chop tree trunks. + + + Different tools are better for different materials. You should use a pickaxe to mine stone and ore. You may need to make your pickaxe from better materials to get resources from some blocks. + + + Certain tools are better for attacking enemies. Consider using a sword to attack. + + + Hint: Hold {*CONTROLLER_ACTION_ACTION*}to mine and chop using your hand or whatever you are holding. You may need to craft a tool to mine some blocks... + + + The tool you are using has become damaged. Every time you use a tool it becomes damaged, and will eventually break. The colored bar below the item in your inventory shows the current damage state. + + + Hold{*CONTROLLER_ACTION_JUMP*} to swim up. + + + In this area there is a minecart on a track. To enter the minecart, point the cursor at it and press{*CONTROLLER_ACTION_USE*}. Use{*CONTROLLER_ACTION_USE*} on the button to make the minecart move. + + + In the chest beside the river there is a boat. To use the boat, point the cursor at water and press{*CONTROLLER_ACTION_USE*}. Use{*CONTROLLER_ACTION_USE*} while pointing at the boat to enter it. + + + In the chest beside the pond there is a fishing rod. Take the fishing rod from the chest and select it as the current item in your hand to use it. + + + This more advanced piston mechanism creates a self-repairing bridge! Push the button to activate, then investigate how the components interact to learn more. + + + + If you move the pointer outside of the interface while carrying an item, you can drop that item. + + + + You do not have all the ingredients required to make this item. The box on the bottom left shows the ingredients required to craft this. + + + + + Congratulations, you have completed the tutorial. Time in the game is now passing normally, and you don't have long until night time and the monsters come out! Finish your shelter! + + + + {*EXIT_PICTURE*} When you are ready to explore further, there is a stairway in this area near the Miner's shelter that leads to a small castle. + + + Reminder: + + + + ]]> + + + + + New features have been added to the game in the latest version, including new areas in the tutorial world. + + + {*B*}Press{*CONTROLLER_VK_A*} to play through the tutorial as normal.{*B*} + Press{*CONTROLLER_VK_B*} to skip the main tutorial. + + + In this area you will find areas setup to help you learn about fishing, boats, pistons and redstone. + + + Outside of this area you will find examples of buildings, farming, minecarts and tracks, enchanting, brewing, trading, smithing and more! + + + + + Your food bar has depleted to a level where you will no longer heal. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about the food bar and eating food.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about the food bar and eating food. + + + + + + Select + + + Use + + + Back + + + Exit + + + Cancel + + + Cancel Join + + + Select Storage Device + + + Change Storage Device + + + Refresh Online Games List + + + Party Games + + + All Games + + + Change Group + + + Show Inventory + + + Show Description + + + Show Ingredients + + + Crafting + + + Create + + + Take/Place + + + Take + + + Take All + + + Take Half + + + Place + + + Place All + + + Place One + + + Drop + + + Drop All + + + Drop One + + + Swap + + + Quick Move + + + Clear Quick Select + + + What's This? + + + Share To Facebook + + + Change Filter + + + View Gamer Card + + + View Gamer Profile + + + Send Friend Request + + + Page Down + + + Page Up + + + Next + + + Previous + + + Kick Player + + + Dye + + + Mine + + + Feed + + + Tame + + + Heal + + + Sit + + + Follow Me + + + Eject + + + Empty + + + Saddle + + + Place + + + Hit + + + Milk + + + Collect + + + Eat + + + Sleep + + + Wake Up + + + Play + + + Ride + + + Sail + + + Grow + + + Swim Up + + + Open + + + Change Pitch + + + Detonate + + + Read + + + Hang + + + Throw + + + Plant + + + Till + + + Harvest + + + Continue + + + Unlock Full Game + + + Delete Save + + + Delete + + + Options + + + Invite Xbox Live Party + + + Invite Friends + + + Accept + + + Shear + + + Ban Level + + + Select Skin + + + Ignite + + + Navigate + + + Install Full Version + + + Install Trial Version + + + Install + + + Reinstall + + + + Save Options + + + Execute Command + + + Creative + + + Move Ingredient + + + Move Fuel + + + Move Tool + + + Move Armor + + + Move Weapon + + + + Equip + + + Draw + + + Release + + + Privileges + + + Block + + + Page Up + + + Page Down + + + Love Mode + + + Drink + + + Rotate + + + Hide + + + Upload Save For Xbox One + + + Clear All Slots + + + Upload Save for Xbox One + + + + OK + + + Cancel + + + Minecraft Store + + + + Are you sure you want to leave your current game and join the new one? Any unsaved progress will be lost. + + + Exit Game + + + + Save Game + + + Exit Without Saving + + + + Are you sure you want to overwrite any previous save for this world with the current version of this world? + + + Are you sure you want to exit without saving? You will lose all progress in this world! + + + + Start Game + + + If you create, load or save a world in Creative Mode, that world will have achievements and leaderboard updates disabled, even if it is then loaded in Survival Mode. Are you sure you want to continue? + + + This world has previously been saved in Creative Mode, and it will have achievements and leaderboard updates disabled. Are you sure you want to continue? + + + This world has previously been saved in Creative Mode, and it will have achievements and leaderboard updates disabled. + + + If you create, load or save a world with Host Privileges enabled, that world will have achievements and leaderboard updates disabled, even if it is then loaded with those options off. Are you sure you want to continue? + + + + Damaged Save + + + This save is corrupt or damaged. Would you like to delete it? + + + + Are you sure you want to exit to the main menu and disconnect all players from the game? Any unsaved progress will be lost. + + + + Exit and save + + + Exit without saving + + + + Are you sure you want to exit to the main menu? Any unsaved progress will be lost. + + + Are you sure you want to exit to the main menu? Your progress will be lost! + + + Create New World + + + Play Tutorial + + + Tutorial + + + Name Your World + + + + Enter a name for your world + + + Input the seed for your world generation + + + + Load Saved World + + + Press START to join game + + + + Exiting the game + + + + An error occurred. Exiting to the main menu. + + + + Connection failed + + + Connection lost + + + + Connection to the server was lost. Exiting to the main menu. + + + Connection to Xbox Live was lost. Exiting to the main menu. + + + Connection to Xbox Live was lost. + + + + Disconnected by the server + + + You were kicked from the game + + + You were kicked from the game for flying + + + Connection attempt took too long + + + The server is full + + + The host has exited the game. + + + You cannot join this game as you are not friends with anybody in the game. + + + You cannot join this game as you have previously been kicked by the host. + + + You cannot join this game as the player you are trying to join is running an older version of the game. + + + You cannot join this game as the player you are trying to join is running a newer version of the game. + + + + New World + + + Award Unlocked! + + + + Hurray - you've been awarded a gamerpic featuring Steve from Minecraft! + + + Hurray - you've been awarded a gamerpic featuring a Creeper! + + + Hurray - you've been awarded an avatar item - a Minecraft: Xbox 360 Edition t-shirt! +Go to the dashboard to put the t-shirt on your avatar. + + + Hurray - you've been awarded an avatar item - a Minecraft: Xbox 360 Edition watch! +Go to the dashboard to put the watch on your avatar. + + + Hurray - you've been awarded an avatar item - a Creeper baseball cap! +Go to the dashboard to put the cap on your avatar. + + + Hurray - you've been awarded the Minecraft: Xbox 360 Edition theme! +Go to the dashboard to select this theme. + + + + Unlock Full Game + + + You're playing the trial game, but you'll need the full game to be able to save your game. +Would you like to unlock the full game now? + + + This is the Minecraft: Xbox 360 Edition trial game. If you had the full game, you would just have earned an achievement! +Would you like to unlock the full game? + + + This is the Minecraft: Xbox 360 Edition trial game. If you had the full game, you would just have earned an avatar award! +Would you like to unlock the full game? + + + This is the Minecraft: Xbox 360 Edition trial game. If you had the full game, you would just have earned a gamerpic! +Would you like to unlock the full game? + + + This is the Minecraft: Xbox 360 Edition trial game. If you had the full game, you would just have earned a theme! +Would you like to unlock the full game? + + + This is the Minecraft: Xbox 360 Edition trial game. You need the full game to be able to accept this invite. +Would you like to unlock the full game? + + + Guest players cannot unlock the full game. Please sign in with an Xbox Live user ID. + + + + Please wait + + + No results + + + Filter: + + + Friends + + + My Score + + + Overall + + + Entries: + + + Rank + + + Gamertag + + + + Preparing to Save Level + + + Preparing Chunks... + + + Finalizing... + + + Building Terrain + + + Simulating world for a bit + + + Initializing server + + + Generating spawn area + + + Loading spawn area + + + Entering The Nether + + + Leaving The Nether + + + Respawning + + + Generating level + + + Loading level + + + Saving players + + + Connecting to host + + + Downloading terrain + + + Switching to offline game + + + Please wait while the host saves the game + + + Entering The END + + + Leaving The END + + + Finding Seed for the World Generator + + + + This bed is occupied + + + You can only sleep at night + + + %s is sleeping in a bed. To skip to dawn, all players need to sleep in beds at the same time. + + + Your home bed was missing or obstructed + + + You may not rest now, there are monsters nearby + + + + You are sleeping in a bed. To skip to dawn, all players need to sleep in beds at the same time. + + + + Tools and Weapons + + + Weapons + + + Food + + + Structures + + + Armor + + + Mechanisms + + + Transport + + + Decorations + + + Building Blocks + + + Redstone & Transportation + + + Miscellaneous + + + Brewing + + + Brewing + + + + Tools, Weapons & Armor + + + Materials + + + + Signed out + + + You have been returned to the title screen because your gamer profile was signed out + + + + Difficulty + + + Music + + + Sound + + + Gamma + + + Game Sensitivity + + + Interface Sensitivity + + + Peaceful + + + Easy + + + Normal + + + Hard + + + + In this mode, the player regains health over time, and there are no enemies in the environment. + + + In this mode, enemies spawn in the environment, but will do less damage to the player than in the Normal mode. + + + In this mode, enemies spawn in the environment and will do a standard amount of damage to the player. + + + In this mode, enemies will spawn in the environment, and will do a great deal of damage to the player. Watch out for the Creepers too, since they are unlikely to cancel their exploding attack when you move away from them! + + + + Trial Timeout + + + You've been playing the Minecraft: Xbox 360 Edition Trial Game for the maximum time allowed! To continue the fun, would you like to unlock the full game? + + + + Game full + + + Failed to join game as there are no spaces left + + + + Enter Sign Text + + + Enter a line of text for your sign + + + + Enter Title + + + Enter a title for your post + + + Enter Caption + + + Enter a caption for your post + + + Enter Description + + + Enter a description for your post + + + + Inventory + + + Ingredients + + + Brewing Stand + + + Chest + + + + Enchant + + + Furnace + + + Ingredient + + + Fuel + + + Dispenser + + + There are no downloadable content offers of this type available for this title at the moment. + + + %s has joined the game. + + + %s has left the game. + + + %s was kicked from the game. + + + Are you sure you want to delete this save game? + + + Awaiting approval + + + Censored + + + + Now playing: + + + + Reset Settings + + + Are you sure you would like to reset your settings to their default values? + + + + Loading Error + + + + "Minecraft: Xbox 360 Edition" has failed to load, and cannot continue. + + + + %s's Game + + + Unknown host game + + + + Guest signed out + + + A guest player has signed out causing all guest players to be removed from the game. + + + Sign in + + + You are not signed in. In order to play this game, you will need to be signed in. Do you want to sign in now? + + + Multiplayer not allowed + + + Failed to join the game as one or more players are not allowed to play multiplayer games on Xbox Live. + + + Failed to create an online game as one or more players are not allowed to play multiplayer games on Xbox Live. Uncheck the "Online Game" box to start an offline game. + + + You are not allowed to join this game session because your Member Content privilege setting is too restrictive. Please change this setting in the Privacy and Online Settings portion of the Xbox dashboard if you would like to join this session. + + + You are not allowed to join this game session because one of your local players has a Member Content privilege setting that is too restrictive. + + + You are not allowed to join this game session because a player in the session has a Member Content privilege setting of Friends Only, and you are not on their Friends List. + + + Failed to create game + + + You are not allowed to create this game session because one of your local players has a Member Content privilege setting that is too restrictive. Uncheck the "Online Game" box to start an offline game, or change this setting in the Privacy and Online Settings portion of the Xbox dashboard. + + + + Auto Selected + + + No Pack: Default Skins + + + Favorite Skins + + + + + Banned Level + + + + The game you are joining is in your banned level list. +If you choose to join this game, the level will be removed from your banned level list. + + + + Ban This Level? + + + + Are you sure you want to add this level to your banned level list? +Selecting OK will also exit this game. + + + + Remove from Banned List + + + + Autosave Interval + + + + Autosave Interval: OFF + + + Mins + + + Can't Place Here! + + + Placing lava close to the level spawn point is not allowed due to the possibility of instant death for spawning players. + + + + This game has a level autosave feature. When you see the icon above displayed, the game is saving your data. +Please do not turn off your Xbox 360 console while this icon is on-screen. + + + + Interface Opacity + + + + Preparing to Autosave Level + + + + HUD Size + + + HUD Size (Splitscreen) + + + + Seed + + + + Unlock Skin Pack + + + To use the skin you have selected, you need to unlock this skin pack. +Would you like to unlock this skin pack now? + + + Unlock Texture Pack + + + To use this texture pack for your world, you need to unlock it. +Would you like to unlock it now? + + + Trial Texture Pack + + + You are using a trial version of the texture pack. You will not be able to save this world unless you unlock the full version. +Would you like to unlock the full version of the texture pack? + + + + Texture Pack Not Present + + + + Unlock Full Version + + + + Download Trial Version + + + Download Full Version + + + This world uses a mash-up pack or texture pack you don't have! +Would you like to install the mash-up pack or texture pack now? + + + + Get Trial Version + + + Get Full Version + + + + Kick player + + + Are you sure you want to kick this player from the game? They will not be able to rejoin until you restart the world. + + + + Gamerpics Packs + + + Themes + + + Skins Packs + + + Allow friends of friends + + + You cannot join this game because it has been limited to players who are friends of the host. + + + Can't Join Game + + + + Selected + + + Selected skin: + + + + Corrupt Downloadable Content + + + This downloadable content is corrupt and cannot be used. You need to delete it, then re-install it from the Minecraft Store menu. + + + Some of your downloadable content is corrupt and cannot be used. You need to delete them, then re-install them from the Minecraft Store menu. + + + Your game mode has been changed + + + Rename Your World + + + Enter the new name for your world + + + + Game Mode: Survival + + + Game Mode: Creative + + + Survival + + + Creative + + + Created in Survival Mode + + + Created in Creative Mode + + + Render Clouds + + + What would you like to do with this save game? + + + Rename Save + + + Autosaving in %d... + + + + On + + + Off + + + Normal + + + Superflat + + + When enabled, the game will be an online game. + + + When enabled, only invited players can join. + + + When enabled, friends of people on your Friends List can join the game. + + + When enabled, players can inflict damage on other players. Only affects Survival mode. + + + When disabled, players joining the game cannot build or mine until authorised. + + + When enabled, fire may spread to nearby flammable blocks. + + + When enabled, TNT will explode when activated. + + + When enabled, the host can toggle their ability to fly, disable exhaustion, and make themselves invisible from the in-game menu. Disables achievements and leaderboard updates. + + + When enabled, the Nether world will be re-generated. This is useful if you have an older save where Nether Fortresses were not present. + + + When enabled, structures such as Villages and Strongholds will generate in the world. + + + When enabled, a completely flat world will be generated in the Overworld and in the Nether. + + + When enabled, a chest containing some useful items will be created near the player spawn point. + + + Skin Packs + + + Themes + + + Gamerpics + + + Avatar Items + + + Texture Packs + + + Mash-Up Packs + + + + + {*PLAYER*} went up in flames + + + {*PLAYER*} burned to death + + + {*PLAYER*} tried to swim in lava + + + {*PLAYER*} suffocated in a wall + + + {*PLAYER*} drowned + + + {*PLAYER*} starved to death + + + {*PLAYER*} was pricked to death + + + {*PLAYER*} hit the ground too hard + + + {*PLAYER*} fell out of the world + + + {*PLAYER*} died + + + {*PLAYER*} blew up + + + {*PLAYER*} was killed by magic + + + {*PLAYER*} was killed by Ender Dragon breath + + + {*PLAYER*} was slain by {*SOURCE*} + + + {*PLAYER*} was slain by {*SOURCE*} + + + {*PLAYER*} was shot by {*SOURCE*} + + + {*PLAYER*} was fireballed by {*SOURCE*} + + + {*PLAYER*} was pummeled by {*SOURCE*} + + + {*PLAYER*} was killed by {*SOURCE*} + + + + Bedrock Fog + + + + Display HUD + + + + Display Hand + + + + Splitscreen Gamertags + + + + Death Messages + + + + Animated Character + + + + Custom Skin Animation + + + + You can no longer mine or use items + + + You can now mine and use items + + + You can no longer place blocks + + + You can now place blocks + + + You can now use doors and switches + + + You can no longer use doors and switches + + + You can now use containers (e.g. chests) + + + You can no longer use containers (e.g. chests) + + + You can no longer attack mobs + + + You can now attack mobs + + + You can no longer attack players + + + You can now attack players + + + You can no longer attack animals + + + You can now attack animals + + + You are now a moderator + + + You are no longer a moderator + + + You can now fly + + + You can no longer fly + + + You will no longer get exhausted + + + You will now get exhausted + + + You are now invisible + + + You are no longer invisible + + + You are now invulnerable + + + You are no longer invulnerable + + + + %d MSP + + + Ender Dragon + + + %s has entered The End + + + %s has left The End + + + + +{*C3*}I see the player you mean.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}Yes. Take care. It has reached a higher level now. It can read our thoughts.{*EF*}{*B*}{*B*} +{*C2*}That doesn't matter. It thinks we are part of the game.{*EF*}{*B*}{*B*} +{*C3*}I like this player. It played well. It did not give up.{*EF*}{*B*}{*B*} +{*C2*}It is reading our thoughts as though they were words on a screen.{*EF*}{*B*}{*B*} +{*C3*}That is how it chooses to imagine many things, when it is deep in the dream of a game.{*EF*}{*B*}{*B*} +{*C2*}Words make a wonderful interface. Very flexible. And less terrifying than staring at the reality behind the screen.{*EF*}{*B*}{*B*} +{*C3*}They used to hear voices. Before players could read. Back in the days when those who did not play called the players witches, and warlocks. And players dreamed they flew through the air, on sticks powered by demons.{*EF*}{*B*}{*B*} +{*C2*}What did this player dream?{*EF*}{*B*}{*B*} +{*C3*}This player dreamed of sunlight and trees. Of fire and water. It dreamed it created. And it dreamed it destroyed. It dreamed it hunted, and was hunted. It dreamed of shelter.{*EF*}{*B*}{*B*} +{*C2*}Hah, the original interface. A million years old, and it still works. But what true structure did this player create, in the reality behind the screen?{*EF*}{*B*}{*B*} +{*C3*}It worked, with a million others, to sculpt a true world in a fold of the {*EF*}{*NOISE*}{*C3*}, and created a {*EF*}{*NOISE*}{*C3*} for {*EF*}{*NOISE*}{*C3*}, in the {*EF*}{*NOISE*}{*C3*}.{*EF*}{*B*}{*B*} +{*C2*}It cannot read that thought.{*EF*}{*B*}{*B*} +{*C3*}No. It has not yet achieved the highest level. That, it must achieve in the long dream of life, not the short dream of a game.{*EF*}{*B*}{*B*} +{*C2*}Does it know that we love it? That the universe is kind?{*EF*}{*B*}{*B*} +{*C3*}Sometimes, through the noise of its thoughts, it hears the universe, yes.{*EF*}{*B*}{*B*} +{*C2*}But there are times it is sad, in the long dream. It creates worlds that have no summer, and it shivers under a black sun, and it takes its sad creation for reality.{*EF*}{*B*}{*B*} +{*C3*}To cure it of sorrow would destroy it. The sorrow is part of its own private task. We cannot interfere.{*EF*}{*B*}{*B*} +{*C2*}Sometimes when they are deep in dreams, I want to tell them, they are building true worlds in reality. Sometimes I want to tell them of their importance to the universe. Sometimes, when they have not made a true connection in a while, I want to help them to speak the word they fear.{*EF*}{*B*}{*B*} +{*C3*}It reads our thoughts.{*EF*}{*B*}{*B*} +{*C2*}Sometimes I do not care. Sometimes I wish to tell them, this world you take for truth is merely {*EF*}{*NOISE*}{*C2*} and {*EF*}{*NOISE*}{*C2*}, I wish to tell them that they are {*EF*}{*NOISE*}{*C2*} in the {*EF*}{*NOISE*}{*C2*}. They see so little of reality, in their long dream.{*EF*}{*B*}{*B*} +{*C3*}And yet they play the game.{*EF*}{*B*}{*B*} +{*C2*}But it would be so easy to tell them...{*EF*}{*B*}{*B*} +{*C3*}Too strong for this dream. To tell them how to live is to prevent them living.{*EF*}{*B*}{*B*} +{*C2*}I will not tell the player how to live.{*EF*}{*B*}{*B*} +{*C3*}The player is growing restless.{*EF*}{*B*}{*B*} +{*C2*}I will tell the player a story.{*EF*}{*B*}{*B*} +{*C3*}But not the truth.{*EF*}{*B*}{*B*} +{*C2*}No. A story that contains the truth safely, in a cage of words. Not the naked truth that can burn over any distance.{*EF*}{*B*}{*B*} +{*C3*}Give it a body, again.{*EF*}{*B*}{*B*} +{*C2*}Yes. Player...{*EF*}{*B*}{*B*} +{*C3*}Use its name.{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}. Player of games.{*EF*}{*B*}{*B*} +{*C3*}Good.{*EF*}{*B*}{*B*} + + + + + +{*C2*}Take a breath, now. Take another. Feel air in your lungs. Let your limbs return. Yes, move your fingers. Have a body again, under gravity, in air. Respawn in the long dream. There you are. Your body touching the universe again at every point, as though you were separate things. As though we were separate things.{*EF*}{*B*}{*B*} +{*C3*}Who are we? Once we were called the spirit of the mountain. Father sun, mother moon. Ancestral spirits, animal spirits. Jinn. Ghosts. The green man. Then gods, demons. Angels. Poltergeists. Aliens, extraterrestrials. Leptons, quarks. The words change. We do not change.{*EF*}{*B*}{*B*} +{*C2*}We are the universe. We are everything you think isn't you. You are looking at us now, through your skin and your eyes. And why does the universe touch your skin, and throw light on you? To see you, player. To know you. And to be known. I shall tell you a story.{*EF*}{*B*}{*B*} +{*C2*}Once upon a time, there was a player.{*EF*}{*B*}{*B*} +{*C3*}The player was you, {*PLAYER*}.{*EF*}{*B*}{*B*} +{*C2*}Sometimes it thought itself human, on the thin crust of a spinning globe of molten rock. The ball of molten rock circled a ball of blazing gas that was three hundred and thirty thousand times more massive than it. They were so far apart that light took eight minutes to cross the gap. The light was information from a star, and it could burn your skin from a hundred and fifty million kilometres away.{*EF*}{*B*}{*B*} +{*C2*}Sometimes the player dreamed it was a miner, on the surface of a world that was flat, and infinite. The sun was a square of white. The days were short; there was much to do; and death was a temporary inconvenience.{*EF*}{*B*}{*B*} +{*C3*}Sometimes the player dreamed it was lost in a story.{*EF*}{*B*}{*B*} +{*C2*}Sometimes the player dreamed it was other things, in other places. Sometimes these dreams were disturbing. Sometimes very beautiful indeed. Sometimes the player woke from one dream into another, then woke from that into a third.{*EF*}{*B*}{*B*} +{*C3*}Sometimes the player dreamed it watched words on a screen.{*EF*}{*B*}{*B*} +{*C2*}Let's go back.{*EF*}{*B*}{*B*} +{*C2*}The atoms of the player were scattered in the grass, in the rivers, in the air, in the ground. A woman gathered the atoms; she drank and ate and inhaled; and the woman assembled the player, in her body.{*EF*}{*B*}{*B*} +{*C2*}And the player awoke, from the warm, dark world of its mother's body, into the long dream.{*EF*}{*B*}{*B*} +{*C2*}And the player was a new story, never told before, written in letters of DNA. And the player was a new program, never run before, generated by a sourcecode a billion years old. And the player was a new human, never alive before, made from nothing but milk and love.{*EF*}{*B*}{*B*} +{*C3*}You are the player. The story. The program. The human. Made from nothing but milk and love.{*EF*}{*B*}{*B*} +{*C2*}Let's go further back.{*EF*}{*B*}{*B*} +{*C2*}The seven billion billion billion atoms of the player's body were created, long before this game, in the heart of a star. So the player, too, is information from a star. And the player moves through a story, which is a forest of information planted by a man called Julian, on a flat, infinite world created by a man called Markus, that exists inside a small, private world created by the player, who inhabits a universe created by...{*EF*}{*B*}{*B*} +{*C3*}Shush. Sometimes the player created a small, private world that was soft and warm and simple. Sometimes hard, and cold, and complicated. Sometimes it built a model of the universe in its head; flecks of energy, moving through vast empty spaces. Sometimes it called those flecks "electrons" and "protons".{*EF*}{*B*}{*B*} + + + + + +{*C2*}Sometimes it called them "planets" and "stars".{*EF*}{*B*}{*B*} +{*C2*}Sometimes it believed it was in a universe that was made of energy that was made of offs and ons; zeros and ones; lines of code. Sometimes it believed it was playing a game. Sometimes it believed it was reading words on a screen.{*EF*}{*B*}{*B*} +{*C3*}You are the player, reading words...{*EF*}{*B*}{*B*} +{*C2*}Shush... Sometimes the player read lines of code on a screen. Decoded them into words; decoded words into meaning; decoded meaning into feelings, emotions, theories, ideas, and the player started to breathe faster and deeper and realised it was alive, it was alive, those thousand deaths had not been real, the player was alive{*EF*}{*B*}{*B*} +{*C3*}You. You. You are alive.{*EF*}{*B*}{*B*} +{*C2*}and sometimes the player believed the universe had spoken to it through the sunlight that came through the shuffling leaves of the summer trees{*EF*}{*B*}{*B*} +{*C3*}and sometimes the player believed the universe had spoken to it through the light that fell from the crisp night sky of winter, where a fleck of light in the corner of the player's eye might be a star a million times as massive as the sun, boiling its planets to plasma in order to be visible for a moment to the player, walking home at the far side of the universe, suddenly smelling food, almost at the familiar door, about to dream again{*EF*}{*B*}{*B*} +{*C2*}and sometimes the player believed the universe had spoken to it through the zeros and ones, through the electricity of the world, through the scrolling words on a screen at the end of a dream{*EF*}{*B*}{*B*} +{*C3*}and the universe said I love you{*EF*}{*B*}{*B*} +{*C2*}and the universe said you have played the game well{*EF*}{*B*}{*B*} +{*C3*}and the universe said everything you need is within you{*EF*}{*B*}{*B*} +{*C2*}and the universe said you are stronger than you know{*EF*}{*B*}{*B*} +{*C3*}and the universe said you are the daylight{*EF*}{*B*}{*B*} +{*C2*}and the universe said you are the night{*EF*}{*B*}{*B*} +{*C3*}and the universe said the darkness you fight is within you{*EF*}{*B*}{*B*} +{*C2*}and the universe said the light you seek is within you{*EF*}{*B*}{*B*} +{*C3*}and the universe said you are not alone{*EF*}{*B*}{*B*} +{*C2*}and the universe said you are not separate from every other thing{*EF*}{*B*}{*B*} +{*C3*}and the universe said you are the universe tasting itself, talking to itself, reading its own code{*EF*}{*B*}{*B*} +{*C2*}and the universe said I love you because you are love.{*EF*}{*B*}{*B*} +{*C3*}And the game was over and the player woke up from the dream. And the player began a new dream. And the player dreamed again, dreamed better. And the player was the universe. And the player was love.{*EF*}{*B*}{*B*} +{*C3*}You are the player.{*EF*}{*B*}{*B*} +{*C2*}Wake up.{*EF*} + + + + + Reset Nether + + + + Are you sure you want to reset the Nether in this savegame to its default state? You will lose anything you have built in the Nether! + + + + Reset Nether + + + Don't Reset Nether + + + + Can't shear this Mooshroom at the moment. The maximum number of Pigs, Sheep, Cows and Cats has been reached. + + + Can't use Spawn Egg at the moment. The maximum number of Pigs, Sheep, Cows and Cats has been reached. + + + Can't use Spawn Egg at the moment. The maximum number of Mooshrooms has been reached. + + + + Can't use Spawn Egg at the moment. The maximum number of Wolves in a world has been reached. + + + Can't use Spawn Egg at the moment. The maximum number of Chickens in a world has been reached. + + + + Can't use Spawn Egg at the moment. The maximum number of Squid in a world has been reached. + + + + Can't use Spawn Egg at the moment. The maximum number of enemies in a world has been reached. + + + Can't use Spawn Egg at the moment. The maximum number of villagers in a world has been reached. + + + The maximum number of Paintings/Item Frames in a world has been reached. + + + You can't spawn enemies in Peaceful mode. + + + This animal can't enter Love Mode. The maximum number of breeding Pigs, Sheep, Cows and Cats has been reached. + + + This animal can't enter Love Mode. The maximum number of breeding Wolves has been reached. + + + This animal can't enter Love Mode. The maximum number of breeding Chickens has been reached. + + + + This animal can't enter Love Mode. The maximum number of breeding Mooshrooms has been reached. + + + The maximum number of Boats in a world has been reached. + + + The maximum number of Mob Heads in a world has been reached. + + + + Invert Look + + + Southpaw + + + You Died! + + + Respawn + + + Downloadable Content Offers + + + + Change Skin + + + How To Play + + + Controls + + + Settings + + + Credits + + + Reinstall Content + + + Debug Settings + + + + Fire Spreads + + + TNT Explodes + + + Player vs Player + + + Trust Players + + + Host Privileges + + + Generate Structures + + + Superflat World + + + Bonus Chest + + + World Options + + + + Can Build and Mine + + + Can Use Doors and Switches + + + Can Open Containers + + + Can Attack Players + + + Can Attack Animals + + + Moderator + + + Kick Player + + + Can Fly + + + Disable Exhaustion + + + Invisible + + + Host Options + + + Players/Invite + + + + Online Game + + + Invite Only + + + More Options + + + Load + + + New World + + + World Name + + + Seed for the World Generator + + + Leave blank for a random seed + + + Players + + + Join Game + + + Start Game + + + No Games Found + + + + Play Game + + + Leaderboards + + + Achievements + + + Help & Options + + + Unlock Full Game + + + Resume Game + + + Save Game + + + + Difficulty: + + + Game Type: + + + Gamertags: + + + Structures: + + + Level Type: + + + PvP: + + + Trust Players: + + + TNT: + + + Fire Spreads: + + + + + Reinstall Theme + + + Reinstall Gamerpic 1 + + + Reinstall Gamerpic 2 + + + Reinstall Avatar Item 1 + + + Reinstall Avatar Item 2 + + + Reinstall Avatar Item 3 + + + + Options + + + Audio + + + Control + + + Graphics + + + User Interface + + + Reset to Defaults + + + + View Bobbing + + + Hints + + + In-Game Tooltips + + + In-Game Gamertags + + + 2 Player Split-screen Vertical + + + + Done + + + Edit sign message: + + + + Fill in the details to accompany your screenshot + + + Caption + + + Screenshot from in-game + + + Edit sign message: + + + Look what I made in Minecraft: Xbox 360 Edition! + + + + + The classic Minecraft textures, icons and user interface! + + + + Show all Mash-up Worlds + + + Select Transfer Save Slot + + + Empty Slot + + + Uploading Save Metadata + + + Uploading Save Data + + + Uploading Save For Xbox One + + + + Upload Canceled + + + You have canceled uploading this save to the save transfer area. + + + No Effects + + + Speed + + + Slowness + + + Haste + + + Mining Fatigue + + + Strength + + + Weakness + + + Instant Health + + + Instant Damage + + + Jump Boost + + + Nausea + + + Regeneration + + + Resistance + + + Fire Resistance + + + Water Breathing + + + Invisibility + + + Blindness + + + Night Vision + + + Hunger + + + Poison + + + + of Swiftness + + + of Slowness + + + of Haste + + + of Dullness + + + of Strength + + + of Weakness + + + of Healing + + + of Harming + + + of Leaping + + + of Nausea + + + of Regeneration + + + of Resistance + + + of Fire Resistance + + + of Water Breathing + + + of Invisibility + + + of Blindness + + + of Night Vision + + + of Hunger + + + of Poison + + + + + + + II + + + III + + + IV + + + + + Splash + + + Mundane + + + Uninteresting + + + Bland + + + Clear + + + Milky + + + Diffuse + + + Artless + + + Thin + + + Awkward + + + Flat + + + Bulky + + + Bungling + + + Buttered + + + Smooth + + + Suave + + + Debonair + + + Thick + + + Elegant + + + Fancy + + + Charming + + + Dashing + + + Refined + + + Cordial + + + Sparkling + + + Potent + + + Foul + + + Odorless + + + Rank + + + Harsh + + + Acrid + + + Gross + + + Stinky + + + + Used as the base of all potions. Use in a brewing stand to create potions. + + + Has no effects, can be used in a brewing stand to create potions by adding more ingredients. + + + Increases affected players, animals and monsters movement speed, and players sprinting speed, jumping length and field of view. + + + Reduces affected players, animals and monsters movement speed, and players sprinting speed, jumping length and field of view. + + + Increase the damage caused by affected players and monsters when attacking. + + + Reduces the damage cause by affected players and monsters when attacking. + + + Instantly increases the affected players, animals and monsters health. + + + Instantly reduces the affected players, animals and monsters health. + + + Restores health to the affected players, animals and monsters over time. + + + Makes the affected players, animals and monsters immune to damage from fire, lava, and ranged Blaze attacks. + + + Reduces health of the affected players, animals and monsters over time. + + + + Sharpness + + + Smite + + + Bane of Arthropods + + + Knockback + + + Fire Aspect + + + Protection + + + Fire Protection + + + Feather Falling + + + Blast Protection + + + Projectile Protection + + + Respiration + + + Aqua Affinity + + + Efficiency + + + Silk Touch + + + Unbreaking + + + Looting + + + Fortune + + + Power + + + Flame + + + Punch + + + Infinity + + + + I + + + II + + + III + + + IV + + + V + + + VI + + + VII + + + VIII + + + IX + + + X + + + + + + Can be mined with an Iron pickaxe or better to collect Emeralds. + + + Similar to a Chest except that items placed in an Ender Chest are available in every one of the player's Ender Chests, even in different dimensions. + + + Is activated when an entity passes through a connected Tripwire. + + + Activates a connected Tripwire Hook when an entity passes through it. + + + A compact way of storing Emeralds. + + + A wall made of Cobblestone. + + + Can be used to repair weapons, tools and armor. + + + Smelted in a furnace to produce Nether Quartz. + + + Used as a decoration. + + + + Can be traded with villagers. + + + Used as a decoration. Flowers, Saplings, Cacti and Mushrooms can be planted in it. + + + Restores 2{*ICON_SHANK_01*}, and can be crafted into a golden carrot. Can be planted in farmland. + + + Restores 0.5{*ICON_SHANK_01*}, or can be cooked in a furnace. This can be planted in farmland. + + + Restores 3{*ICON_SHANK_01*}. Created by cooking a potato in a furnace. + + + Restores 1{*ICON_SHANK_01*}, or can be cooked in a furnace. This can be planted in farmland. Eating this can cause you to be poisoned. + + + Restores 3{*ICON_SHANK_01*}. Crafted from a carrot and gold nuggets. + + + Used to control a saddled pig when riding on it. + + + Restores 4{*ICON_SHANK_01*}. + + + Used with an Anvil to enchant weapons, tools or armor. + + + Created by mining Nether Quartz Ore. Can be crafted into a Block of Quartz. + + + Crafted from Wool. Used as a decoration. + + + Emerald + + + Flower Pot + + + Carrot + + + Potato + + + Baked Potato + + + Poisonous Potato + + + Golden Carrot + + + Carrot on a Stick + + + Pumpkin Pie + + + Enchanted Book + + + Nether Quartz + + + Emerald Ore + + + Ender Chest + + + Tripwire Hook + + + Tripwire + + + Block of Emerald + + + Cobblestone Wall + + + Mossy Cobblestone Wall + + + Flower Pot + + + Carrots + + + Potatoes + + + Anvil + + + Anvil + + + Slightly Damaged Anvil + + + Very Damaged Anvil + + + Nether Quartz Ore + + + Block of Quartz + + + Chiseled Quartz Block + + + Pillar Quartz Block + + + Quartz Stairs + + + Carpet + + + Black Carpet + + + Red Carpet + + + Green Carpet + + + Brown Carpet + + + Blue Carpet + + + Purple Carpet + + + Cyan Carpet + + + Light Gray Carpet + + + Gray Carpet + + + Pink Carpet + + + Lime Carpet + + + Yellow Carpet + + + Light Blue Carpet + + + Magenta Carpet + + + Orange Carpet + + + White Carpet + + + Chiseled Sandstone + + + Smooth Sandstone + + + {*PLAYER*} was killed trying to hurt {*SOURCE*} + + + {*PLAYER*} was squashed by a falling Anvil. + + + {*PLAYER*} was squashed by a falling block. + + + + Teleported {*PLAYER*} to {*DESTINATION*} + + + {*PLAYER*} teleported you to their position + + + {*PLAYER*} teleported to you + + + Thorns + + + Quartz Slab + + + Makes dark areas appear as if in daylight, even under water. + + + Makes affected players, animals and monsters invisible. + + + Repair & Name + + + Enchantment Cost: %d + + + Too Expensive! + + + Rename + + + You have: + + + Required Items For Trade + + + {*VILLAGER_TYPE*} offers %s + + + Repair + + + Trade + + + Dye collar + + + + + + + This is the Anvil interface, which you can use to rename, repair and apply enchantments to weapons, armor, or tools, at the cost of Experience Levels. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about the Anvil interface.{*B*} + Press{*CONTROLLER_VK_B*} if you already know the Anvil interface. + + + + + To begin working on an item, place it in the first input slot. + + + + + When the correct raw material is placed in the second input slot (e.g. Iron Ingots for a damaged Iron Sword), the proposed repair appears in the output slot. + + + + + Alternatively, a second identical item can be placed into the second slot to combine the two items. + + + + + To enchant items on the Anvil, place an Enchanted Book in the second input slot. + + + + + The number of Experience Levels that the work will cost is shown beneath the output. If you do not have enough Experience Levels, the repair cannot be completed. + + + + + It is possible to rename the item by editing the name shown in the textbox. + + + + + Picking up the repaired item will consume both items used by the Anvil and decrease your Experience Level by the given amount. + + + + + + + + + In this area there is an Anvil and a Chest containing tools and weapons to work on. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about the Anvil.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about the Anvil. + + + + + Using an Anvil, weapons and tools can be repaired to restore their durability, renamed, or enchanted with Enchanted Books. + + + + + Enchanted Books can be found inside Chests within dungeons, or enchanted from normal Books at the Enchantment Table. + + + + + Using the Anvil costs Experience Levels, and each use has a chance to damage the Anvil. + + + + + The type of work to be done, value of the item, number of enchantments, and amount of prior work all affect the cost of repair. + + + + + Renaming an item changes the displayed name for all players and permanently reduces the prior work cost. + + + + + In the Chest in this area you will find damaged Pickaxes, raw materials, Bottles O' Enchanting, and Enchanted Books to experiment with. + + + + + + + + + This is the trading interface which displays trades that can be made with a villager. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about the trading interface.{*B*} + Press{*CONTROLLER_VK_B*} if you already know the trading interface. + + + + + All trades that the villager is willing to make at the moment are displayed along the top. + + + + + Trades will appear red and be unavailable if you do not have the required items. + + + + + The amount and type of items you are giving to the villager are shown in the two boxes on the left. + + + + + You can see the total number of the items required for the trade in the two boxes on the left. + + + + + Press{*CONTROLLER_VK_A*} to trade the items the villager requires for the item on offer. + + + + + + + + + In this area there is a villager and a Chest containing Paper to purchase items. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about trading.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about trading. + + + + + Players can trade items from their inventory with villagers. + + + + + The trades a villager is likely to offer depends on their profession. + + + + + Performing a mix of trades will randomly add to or update the villager's available trades. + + + + + Trades that have been used frequently may be removed temporarily, but the villager will always offer at least one trade. + + + + + Take some Paper from the Chest and try trading with the villager here. + + + + + + + + + In this area there are two Ender Chests. + + + + + {*B*} + Press{*CONTROLLER_VK_A*} to learn more about Ender Chests.{*B*} + Press{*CONTROLLER_VK_B*} if you already know about Ender Chests. + + + + + All Ender Chests in a world are linked, even across dimensions. Items placed into an Ender Chest are accessible in any other Ender Chest. + + + + + However, the contents of the Ender Chests are different for each player. + + + + + This allows players to store items in any Ender Chest, and retrieve them from other Ender Chests in different positions in the world. You can try this now by placing items in either Ender Chest. + + + + Restores 2{*ICON_SHANK_01*}, regenerates health for 30 seconds, and grants fire resistance and damage resistance for 5 minutes. Crafted from an apple and gold blocks. + + + Can Teleport + + + Teleport + + + Teleport To Player + + + Teleport To Me + + + Can Disable Exhaustion + + + Can Become Invisible + + + You can now enable invisibility + + + You can no longer enable invisibility + + + You can now enable flying + + + You can no longer enable flying + + + You can now disable exhaustion + + + You can no longer disable exhaustion + + + You can now teleport + + + You can no longer teleport + + + {*T3*}HOW TO PLAY : ANVIL{*ETW*}{*B*}{*B*} +Experience Levels can be used to repair, enchant or rename items with the Anvil.{*B*} +All items can be renamed, although only items with durability can be repaired or have enchantments from Enchanted Books applied to them.{*B*} +An item can be repaired by placing it in one of the input slots on the left, along with either some raw materials of the item, like Iron Ingots for an Iron Sword, or combined with another item of the same type.{*B*} +Combining items is more efficient when done with an Anvil, and additionally, if either of the items were enchanted, the finished product may have enchantments from either of the inputs.{*B*} +Enchanted Books can apply enchantments to items by combining them at an Anvil if the Book's enchantment is suitable. Enchanted Books can be found in Chests within dungeons, or enchanted from normal Books at the Enchantment Table.{*B*} +There is a chance that the Anvil will be damaged with each use and after enough punishment it will be destroyed.{*B*} + + + + + {*T3*}HOW TO PLAY : TRADING{*ETW*}{*B*}{*B*} +It is possible to trade items with villagers. Each villager has a profession; they can be Farmers, Butchers, Blacksmiths, Librarians or Priests, and this affects the type of items they might trade.{*B*} +You can find a list of all the trades a villager is offering in the trading menu. A villager may modify or add to its trades whenever a player trades with it, although a trade might become temporarily disabled if it is used too frequently.{*B*} +Trades usually involve buying or selling a number of items for emeralds.{*B*} +If you do not have the items required for a trade, the items are shown in red.{*B*} + + + + {*T3*}HOW TO PLAY : ENDER CHEST {*ETW*}{*B*}{*B*} +All Ender Chests in a world are linked. Items placed into an Ender Chest are accessible in any other. However, the contents of the Ender Chests are different for each player. This allows players to store items in any Ender Chest, and retrieve them from other Ender Chests in different positions in the world. + + + + Farmer + + + Librarian + + + Priest + + + Blacksmith + + + Butcher + + + Found in villages, villagers will offer to sell items to the player depending on their profession. + + + Large Chest + + + + You can also create Enchanted Books at the Enchantment Table, which can be used later at the Anvil to apply their enchantment to an item. + + + + + Tripwire Hooks will also provide constant power to a circuit while something is triggering the string between them. + + + + + Once tamed, a wolf will always have its collar on. The color of their collar can be changed by dying it. + + + + Carrots and Potatoes are farmed by planting Carrots or Potatoes, and are ready for harvesting when the vegetable is visible above the ground. + + + + Additionally, pigs can be saddled and then ridden by players. They are controlled by tempting them with a Carrot on a Stick. + + + + + + If necessary you can slowly move your minecart along using {*CONTROLLER_ACTION_MOVE*}. This helps to start the minecart by getting it onto a powered rail. + + + + You cannot join this game as split-screen is only supported when in High Definition mode. Sign out all other players if you wish to join. + + + Cure + + + + Xbox 360 + + + Back + + + + This option disables achievements and leaderboard updates for this world while playing, and if loading it again after saving with this option on. + + + + Upload Save For Xbox One + + + + Upload Save + + + + Only one Xbox 360 console save can be stored in the save transfer area at a time. Please ensure you have downloaded the save on your Xbox One console before uploading another Xbox 360 console save. + + + + + Uploading... + + + + Upload Complete! + + + + Upload Failed. Please try again later. + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_DLCMain.h b/Minecraft.Client/Common/Media/xuiscene_DLCMain.h new file mode 100644 index 00000000..012bb71c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_DLCMain.h @@ -0,0 +1,37 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_XuiOffersList L"XuiOffersList" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_DLCMain L"DLCMain" diff --git a/Minecraft.Client/Common/Media/xuiscene_DLCMain.xui b/Minecraft.Client/Common/Media/xuiscene_DLCMain.xui new file mode 100644 index 00000000..8c92a3e8 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_DLCMain.xui @@ -0,0 +1,1092 @@ + + +1280.000000 +720.000000 + + + +DLCMain +620.000000 +440.000000 +330.000092,194.000000,0.000000 +CScene_DLCMain +XuiScene +OffersList + + + +XuiOffersList +576.000000 +390.000000 +22.000032,24.000000,0.000000 +CXuiCtrl4JList +XuiListRecessedDLC + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + + +Timer +182.000000 +168.000000 +208.000000,134.000000,0.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + + +Logo +1280.000000 +138.000000 +0.000000,56.000000,0.000000 +true +MenuTitleLogo + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_DLCMain_480.h b/Minecraft.Client/Common/Media/xuiscene_DLCMain_480.h new file mode 100644 index 00000000..1e7591c1 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_DLCMain_480.h @@ -0,0 +1,32 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_XuiOffersList L"XuiOffersList" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_DLCMain L"DLCMain" diff --git a/Minecraft.Client/Common/Media/xuiscene_DLCMain_480.xui b/Minecraft.Client/Common/Media/xuiscene_DLCMain_480.xui new file mode 100644 index 00000000..763a8813 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_DLCMain_480.xui @@ -0,0 +1,1021 @@ + + +640.000000 +480.000000 + + + +DLCMain +400.000000 +290.000000 +120.000046,124.000046,0.000000 +CScene_DLCMain +GraphicPanel +OffersList + + + +XuiOffersList +376.000000 +261.000000 +12.000000,11.999996,0.000000 +CXuiCtrl4JList +XuiListRecessedDLCThin + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_LThin + + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + + +Timer +184.000000 +170.000000 +150.000000,104.639999,0.000000 +0.500000,0.500000,1.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_DLCOffers.h b/Minecraft.Client/Common/Media/xuiscene_DLCOffers.h new file mode 100644 index 00000000..58245d3d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_DLCOffers.h @@ -0,0 +1,61 @@ +#define IDC_XuiDLCPriceTag L"XuiDLCPriceTag" +#define IDC_XuiDLCBackground L"XuiDLCBackground" +#define IDC_XuiDLCBanner L"XuiDLCBanner" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_XuiOffersList L"XuiOffersList" +#define IDC_XuiHTMLSellText L"XuiHTMLSellText" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_DLCOffers L"DLCOffers" diff --git a/Minecraft.Client/Common/Media/xuiscene_DLCOffers.xui b/Minecraft.Client/Common/Media/xuiscene_DLCOffers.xui new file mode 100644 index 00000000..1960133e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_DLCOffers.xui @@ -0,0 +1,1355 @@ + + +1280.000000 +720.000000 + + + +DLCOffers +960.000000 +448.000000 +160.000000,196.000000,0.000000 +CScene_DLCOffers +XuiScene +OffersList + + + +XuiDLCPriceTag +440.000000 +36.000000 +494.000000,224.000000,0.000000 +DLC_PriceTag + + + + +XuiDLCBackground +440.000000 +196.000000 +494.000000,28.000000,0.000000 +DLCOffersOfferBackground + + + + +XuiDLCBanner +440.000000 +196.000000 +494.000000,28.000000,0.000000 +CXuiCtrl4JIcon +ItemBanner + + + + +XuiOffersList +456.000000 +400.000000 +22.000032,25.999996,0.000000 +CXuiCtrl4JList +XuiListRecessedDLC +XuiCheckboxAvatar +XuiCheckboxThemes + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_DLC_L + + + + + +XuiHTMLSellText +440.000000 +130.000000 +494.000000,260.000000,0.000000 +false +XuiHtmlControl + + + + +Timer +182.000000 +168.000000 +150.000031,134.000000,0.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + + +Logo +1280.000000 +138.000000 +0.000000,56.000000,0.000000 +true +MenuTitleLogo + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_DLCOffers_480.h b/Minecraft.Client/Common/Media/xuiscene_DLCOffers_480.h new file mode 100644 index 00000000..61262c85 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_DLCOffers_480.h @@ -0,0 +1,50 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_XuiOffersList L"XuiOffersList" +#define IDC_XuiHTMLSellText L"XuiHTMLSellText" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_XuiDLCBackground L"XuiDLCBackground" +#define IDC_XuiDLCPriceTag L"XuiDLCPriceTag" +#define IDC_XuiDLCBanner L"XuiDLCBanner" +#define IDC_DLCOffers L"DLCOffers" diff --git a/Minecraft.Client/Common/Media/xuiscene_DLCOffers_480.xui b/Minecraft.Client/Common/Media/xuiscene_DLCOffers_480.xui new file mode 100644 index 00000000..ab6685d4 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_DLCOffers_480.xui @@ -0,0 +1,1211 @@ + + +640.000000 +480.000000 + + + +DLCOffers +540.000000 +286.000000 +50.000000,124.000046,0.000000 +CScene_DLCOffers +GraphicPanel +OffersList + + + +XuiOffersList +284.000000 +264.000000 +10.000004,9.999996,0.000000 +CXuiCtrl4JList +XuiListRecessedDLCThin + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_LThin + + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_DLC_LThin + + + + + +XuiHTMLSellText +226.000000 +102.000000 +300.000000,152.000000,0.000000 +false +XuiHtmlControl_Small + + + + +Timer +184.000000 +170.000000 +102.000000,104.000000,0.000000 +0.500000,0.500000,1.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + +XuiDLCBackground +226.000000 +96.000000 +300.000000,22.000000,0.000000 +DLCOffersOfferBackground + + + + +XuiDLCPriceTag +226.000000 +26.000000 +300.000000,118.000000,0.000000 +DLC_PriceTag480 + + + + +XuiDLCBanner +226.000000 +96.000000 +300.000000,22.000000,0.000000 +CXuiCtrl4JIcon +ItemBanner480 + + + + + +Logo +640.000000 +70.000000 +0.000000,48.000000,0.000000 +true +MenuTitleLogo + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage.h b/Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage.h new file mode 100644 index 00000000..88ecc4a7 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage.h @@ -0,0 +1,2 @@ +#define IDC_XuiHTMLMessage L"XuiHTMLMessage" +#define IDC_NewUpdate L"NewUpdate" diff --git a/Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage.xui b/Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage.xui new file mode 100644 index 00000000..4af4cfdd --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage.xui @@ -0,0 +1,36 @@ + + +1280.000000 +720.000000 + + + +NewUpdate +800.000000 +430.000000 +240.000046,200.000000,0.000000 +CScene_NewUpdateMessage +XuiScene +OffersList + + + +XuiHTMLMessage +744.000000 +364.000000 +28.000034,24.000000,0.000000 +XuiHtmlControl + + + + + +Logo +1280.000000 +138.000000 +0.000000,56.000000,0.000000 +true +MenuTitleLogo + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage_480.h b/Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage_480.h new file mode 100644 index 00000000..88ecc4a7 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage_480.h @@ -0,0 +1,2 @@ +#define IDC_XuiHTMLMessage L"XuiHTMLMessage" +#define IDC_NewUpdate L"NewUpdate" diff --git a/Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage_480.xui b/Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage_480.xui new file mode 100644 index 00000000..467b4b41 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_NewUpdateMessage_480.xui @@ -0,0 +1,37 @@ + + +640.000000 +480.000000 + + + +NewUpdate +500.000000 +286.000000 +70.000000,124.000046,0.000000 +CScene_NewUpdateMessage +GraphicPanel +OffersList + + + +XuiHTMLMessage +470.000000 +239.000000 +16.000000,20.000000,0.000000 +false +XuiHtmlControl + + + + + +Logo +640.000000 +70.000000 +0.000000,48.000000,0.000000 +true +MenuTitleLogo + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_anvil.h b/Minecraft.Client/Common/Media/xuiscene_anvil.h new file mode 100644 index 00000000..cc116d19 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_anvil.h @@ -0,0 +1,312 @@ +#define IDC_AnvilText L"AnvilText" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Ingredient L"Ingredient" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Ingredient2 L"Ingredient2" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Result L"Result" +#define IDC_AnvilTextInput L"AnvilTextInput" +#define IDC_LabelAffordable L"LabelAffordable" +#define IDC_LabelExpensive L"LabelExpensive" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryText L"InventoryText" +#define IDC_AnvilHammer L"AnvilHammer" +#define IDC_AnvilPlus L"AnvilPlus" +#define IDC_AnvilArrow L"AnvilArrow" +#define IDC_AnvilCross L"AnvilCross" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneAnvil L"XuiSceneAnvil" diff --git a/Minecraft.Client/Common/Media/xuiscene_anvil.xui b/Minecraft.Client/Common/Media/xuiscene_anvil.xui new file mode 100644 index 00000000..53e686fe --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_anvil.xui @@ -0,0 +1,4396 @@ + + +1280.000000 +720.000000 + + + +XuiSceneAnvil +1280.000000 +720.000000 +CXuiSceneAnvil +XuiBlankScene +Pointer + + + +Group +430.000000 +430.000000 +435.000000,91.000000,0.000000 +15 +XuiScene +Pointer + + + +AnvilText +264.000000 +34.000000 +135.000031,18.000000,0.000000 +LabelContainerSceneCentre + + + + +Ingredient +54.000000 +54.000000 +42.000000,110.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridVertical54 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + + +Ingredient2 +54.000000 +54.000000 +176.000000,110.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridVertical54 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + + +Result +54.000000 +54.000000 +342.000000,110.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridVertical54 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + + +AnvilTextInput +254.000000 +137.000000,59.000000,0.000000 +CXuiCtrl4JEdit + + + + +LabelAffordable +320.000000 +24.000000 +82.000000,170.000000,0.000000 +XuiLabelAffordable + + + + +LabelExpensive +320.000000 +27.000000 +82.000000,170.000000,0.000000 +XuiLabelExpensive + + + + +Inventory +382.000000 +150.000000 +24.000000,225.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +UseRow +381.000000 +50.000000 +24.000000,364.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +InventoryText +375.000000 +32.000000 +26.000000,194.000000,0.000000 +LabelContainerSceneLeft + + + + +AnvilHammer +75.000000 +75.000000 +36.000000,28.000000,0.000000 +3 +AnvilHammer + + + + +AnvilPlus +39.000000 +39.000000 +116.000000,116.000000,0.000000 +3 +AnvilPlus + + + + +AnvilArrow +72.000000 +48.000000 +250.000000,112.000000,0.000000 +ArrowProgressState + + + + +AnvilCross +39.000000 +39.000000 +268.000000,118.000000,0.000000 +3 +AnvilCross + + + + +Pointer +42.000000 +42.000000 +-185.000000,-83.000015,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointer + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +435.000000,91.000000,0.000000 + + + +0 +435.000000,91.000000,0.000000 + + + +2 +100 +-100 +50 +435.000000,91.000000,0.000000 + + + +0 +160.000000,91.000000,0.000000 + + + +2 +100 +-100 +50 +160.000000,91.000000,0.000000 + + + +0 +435.000000,91.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_anvil_480.xui b/Minecraft.Client/Common/Media/xuiscene_anvil_480.xui new file mode 100644 index 00000000..0a92620b --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_anvil_480.xui @@ -0,0 +1,4907 @@ + + +640.000000 +480.000000 + + + +XuiSceneAnvil +640.000000 +480.000000 +CXuiSceneAnvil +XuiBlankScene +Pointer + + + +Group +260.000000 +290.000000 +190.000000,96.000000,0.000000 +15 +GraphicPanel +Pointer + + + +AnvilText +156.000000 +26.000000 +75.500008,12.000000,0.000000 +LabelContainerSceneCentreSmall + + + + +Ingredient +32.000000 +32.000000 +21.000000,80.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + +Ingredient2 +32.000000 +32.000000 +103.999985,80.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + +Result +32.000000 +32.000000 +201.000000,80.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + +AnvilTextInput +152.000000 +25.000000 +78.000000,38.000008,0.000000 +CXuiCtrl4JEdit +XuiEditSmall + + + + +LabelAffordable +175.000000 +18.000000 +70.000000,118.000000,0.000000 +XuiLabelAffordableSmall + + + + +LabelExpensive +175.000000 +18.000000 +70.000000,118.000000,0.000000 +XuiLabelExpensiveSmall + + + + +Inventory +234.000000 +78.000000 +13.000000,162.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +234.000000 +13.000000,250.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +InventoryText +234.000000 +25.000000 +12.000000,140.000000,0.000000 +9 +LabelContainerSceneLeftSmall + + + + +AnvilHammer +45.000000 +45.000000 +15.000000,22.000000,0.000000 +AnvilHammer + + + + +AnvilPlus +25.000000 +25.000000 +68.000000,84.000000,0.000000 +3 +AnvilPlus + + + + +AnvilArrow +32.000000 +32.000000 +146.000000,80.000000,0.000000 +3 +ArrowProgressStateSmall + + + + +AnvilCross +30.000000 +148.000000,80.000000,0.000000 +3 +AnvilCross + + + + +Pointer +26.000000 +26.000000 +-50.000000,-50.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000000,96.000000,0.000000 + + + +0 +190.000000,96.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,96.000000,0.000000 + + + +0 +33.750000,96.000000,0.000000 + + + +2 +100 +-100 +50 +60.000000,96.000000,0.000000 + + + +0 +190.000000,96.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_anvil_small.xui b/Minecraft.Client/Common/Media/xuiscene_anvil_small.xui new file mode 100644 index 00000000..1ec8572f --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_anvil_small.xui @@ -0,0 +1,5183 @@ + + +640.000000 +360.000000 + + + +XuiSceneAnvil +640.000000 +360.000000 +CXuiSceneAnvil +XuiBlankScene +Pointer + + + +Group +260.000000 +290.000000 +190.000000,2.000000,0.000000 +15 +GraphicPanel +Pointer + + + +AnvilText +156.000000 +26.000000 +75.500008,12.000000,0.000000 +LabelContainerSceneCentreSmall + + + + +Ingredient +32.000000 +32.000000 +21.000000,80.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + +Ingredient2 +32.000000 +32.000000 +103.999985,80.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + +Result +32.000000 +32.000000 +201.000000,80.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + +AnvilTextInput +152.000000 +25.000000 +78.000000,38.000008,0.000000 +CXuiCtrl4JEdit +XuiEditSmall + + + + +LabelAffordable +175.000000 +18.000000 +70.000000,118.000000,0.000000 +XuiLabelAffordableSmall + + + + +LabelExpensive +175.000000 +18.000000 +70.000000,118.000000,0.000000 +XuiLabelExpensiveSmall + + + + +Inventory +234.000000 +78.000000 +13.000000,162.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +234.000000 +13.000000,250.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +InventoryText +234.000000 +25.000000 +12.000000,140.000000,0.000000 +9 +LabelContainerSceneLeftSmall + + + + +AnvilHammer +45.000000 +45.000000 +15.000000,22.000000,0.000000 +AnvilHammer + + + + +AnvilPlus +25.000000 +25.000000 +68.000000,84.000000,0.000000 +3 +AnvilPlus + + + + +AnvilArrow +32.000000 +32.000000 +146.000000,80.000000,0.000000 +3 +ArrowProgressStateSmall + + + + +AnvilCross +30.000000 +148.000000,80.000000,0.000000 +3 +AnvilCross + + + + +Pointer +26.000000 +26.000000 +-50.000000,-50.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000000,2.000000,0.000000 + + + +0 +190.000000,2.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,2.000000,0.000000 + + + +0 +33.750000,2.000000,0.000000 + + + +2 +100 +-100 +50 +60.000000,2.000000,0.000000 + + + +0 +190.000000,2.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_base.h b/Minecraft.Client/Common/Media/xuiscene_base.h new file mode 100644 index 00000000..a4e71ad6 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_base.h @@ -0,0 +1,176 @@ +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" +#define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_TooltipsSmall L"TooltipsSmall" +#define IDC_SelectedItem L"SelectedItem" +#define IDC_SelectedItemSmall L"SelectedItemSmall" +#define IDC_TitleText L"TitleText" +#define IDC_ProgressBar1 L"ProgressBar1" +#define IDC_ProgressBar2 L"ProgressBar2" +#define IDC_ProgressBar3 L"ProgressBar3" +#define IDC_ProgressBar1_small L"ProgressBar1_small" +#define IDC_ProgressBar2_small L"ProgressBar2_small" +#define IDC_ProgressBar3_small L"ProgressBar3_small" +#define IDC_BossHealth L"BossHealth" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_XuiGamertag L"XuiGamertag" +#define IDC_BasePlayer3 L"BasePlayer3" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" +#define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_TooltipsSmall L"TooltipsSmall" +#define IDC_SelectedItem L"SelectedItem" +#define IDC_SelectedItemSmall L"SelectedItemSmall" +#define IDC_TitleText L"TitleText" +#define IDC_ProgressBar1 L"ProgressBar1" +#define IDC_ProgressBar2 L"ProgressBar2" +#define IDC_ProgressBar3 L"ProgressBar3" +#define IDC_ProgressBar1_small L"ProgressBar1_small" +#define IDC_ProgressBar2_small L"ProgressBar2_small" +#define IDC_ProgressBar3_small L"ProgressBar3_small" +#define IDC_BossHealth L"BossHealth" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_XuiGamertag L"XuiGamertag" +#define IDC_BasePlayer2 L"BasePlayer2" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" +#define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_TooltipsSmall L"TooltipsSmall" +#define IDC_SelectedItem L"SelectedItem" +#define IDC_SelectedItemSmall L"SelectedItemSmall" +#define IDC_TitleText L"TitleText" +#define IDC_ProgressBar1 L"ProgressBar1" +#define IDC_ProgressBar2 L"ProgressBar2" +#define IDC_ProgressBar3 L"ProgressBar3" +#define IDC_ProgressBar1_small L"ProgressBar1_small" +#define IDC_ProgressBar2_small L"ProgressBar2_small" +#define IDC_ProgressBar3_small L"ProgressBar3_small" +#define IDC_BossHealth L"BossHealth" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_XuiGamertag L"XuiGamertag" +#define IDC_BasePlayer1 L"BasePlayer1" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" +#define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_TooltipsSmall L"TooltipsSmall" +#define IDC_SelectedItem L"SelectedItem" +#define IDC_SelectedItemSmall L"SelectedItemSmall" +#define IDC_TitleText L"TitleText" +#define IDC_ProgressBar1 L"ProgressBar1" +#define IDC_ProgressBar2 L"ProgressBar2" +#define IDC_ProgressBar3 L"ProgressBar3" +#define IDC_ProgressBar1_small L"ProgressBar1_small" +#define IDC_ProgressBar2_small L"ProgressBar2_small" +#define IDC_ProgressBar3_small L"ProgressBar3_small" +#define IDC_BossHealth L"BossHealth" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_XuiGamertag L"XuiGamertag" +#define IDC_BasePlayer0 L"BasePlayer0" +#define IDC_XuiPressStartMessage L"XuiPressStartMessage" +#define IDC_XuiSceneDebugContainer L"XuiSceneDebugContainer" +#define IDC_XuiSavingIcon L"XuiSavingIcon" +#define IDC_XuiTrialTimer L"XuiTrialTimer" +#define IDC_SafeArea L"SafeArea" +#define IDC_XuiSoundXACTBack L"XuiSoundXACTBack" +#define IDC_XuiSoundXACTCraft L"XuiSoundXACTCraft" +#define IDC_XuiSoundXACTCraftFail L"XuiSoundXACTCraftFail" +#define IDC_XuiSoundXACTFocus L"XuiSoundXACTFocus" +#define IDC_XuiSoundXACTPress L"XuiSoundXACTPress" +#define IDC_XuiSoundXACTScroll L"XuiSoundXACTScroll" +#define IDC_XuiBaseScene L"XuiBaseScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_base.xui b/Minecraft.Client/Common/Media/xuiscene_base.xui new file mode 100644 index 00000000..fcc7881d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_base.xui @@ -0,0 +1,2017 @@ + + +1280.000000 +720.000000 + + + +XuiBaseScene +1280.000000 +720.000000 +CXuiSceneBase +XuiBlankScene +FadeIn + + + +BasePlayer3 +1280.000000 +720.000000 +15 +true +XuiBlankScene + + + +BottomLeftAnchorPoint +0.000000 +0.000000 +64.000000,648.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TopLeftAnchorPoint +0.000000 +0.000000 +64.000000,36.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +XuiDarkOverlay +1280.000000 +720.000000 +false +XuiDarkOverlay + + + + +Background +1280.000000 +720.000000 +15 +false +true +XuiBackgroundPan + + + + +Logo +1280.000000 +138.000000 +0.000000,56.000000,0.000000 +MenuTitleLogo + + + + +XuiSceneHudRoot +1280.000000 +720.000000 +207 +true +XuiBlankScene + + + + +XuiSceneChatRoot +1280.000000 +720.000000 +true +XuiBlankScene + + + + +XuiSceneContainer +1280.000000 +720.000000 +207 +XuiBlankScene + + + + +Tooltips +200.000000 +40.000000 +0.000000,0.000061,0.000000 + + + +LStick +200.000000 +40.000000 +15 +false +LStick_Nav +true +22532 + + + + +LBButton +200.000000 +40.000000 +15 +false +LB_Button +true +22532 + + + + +RBButton +200.000000 +40.000000 +15 +false +RB_Button +true +22532 + + + + +RTrigger +200.000000 +40.000000 +15 +false +RTrigger +true +22535 + + + + +LTrigger +200.000000 +40.000000 +15 +false +LTrigger +true +22534 + + + + +YButton +200.000000 +40.000000 +15 +false +Y_Button +true +22531 + + + + +XButton +200.000000 +40.000000 +15 +false +X_Button +true +22530 + + + + +BButton +200.000000 +40.000000 +15 +false +B_Button +true +22529 + + + + +AButton +200.000000 +40.000000 +15 +false +A_Button +true +22528 + + + + + +TooltipsSmall +200.000000 +28.000000 +0.000000,0.000061,0.000000 + + + +LStick +200.000000 +28.000000 +15 +false +LStick_NavSmall +true +22532 + + + + +LBButton +200.000000 +28.000000 +15 +false +LB_ButtonSmall +true +22532 + + + + +RBButton +200.000000 +28.000000 +15 +false +RB_ButtonSmall +true +22532 + + + + +RTrigger +200.000000 +28.000000 +15 +false +RTriggerSmall +true +22535 + + + + +LTrigger +200.000000 +28.000000 +15 +false +LTriggerSmall +true +22534 + + + + +YButton +200.000000 +28.000000 +15 +false +Y_ButtonSmall +true +22531 + + + + +XButton +200.000000 +28.000000 +15 +false +X_ButtonSmall +true +22530 + + + + +BButton +200.000000 +28.000000 +15 +false +B_ButtonSmall +true +22529 + + + + +AButton +200.000000 +28.000000 +15 +false +A_ButtonSmall +true +22528 + + + + + +SelectedItem +400.000000 +440.000061,36.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +SelectedItemSmall +400.000000 +145.000031,240.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +BossHealth +1000.000000 +51.000000 +140.000000,36.000000,0.000000 +false + + + +TitleText +1000.000000 +36.000000 +5 +BossHealthLabel + + + + +ProgressBar1 +334.000000 +15.000000 +333.000000,36.000000,0.000000 +BossHealthProgress1 +200 + + + + +ProgressBar2 +666.000000 +15.000000 +167.000000,36.000000,0.000000 +BossHealthProgress2 +200 + + + + +ProgressBar3 +940.000000 +15.000000 +30.000031,36.000000,0.000000 +BossHealthProgress3 +200 + + + + +ProgressBar1_small +167.000000 +15.000000 +416.000000,36.000000,0.000000 +BossHealthProgress1_480 +200 + + + + +ProgressBar2_small +333.000000 +15.000000 +333.000000,36.000000,0.000000 +BossHealthProgress2_480 +200 + + + + +ProgressBar3_small +400.000000 +15.000000 +300.000031,36.000000,0.000000 +BossHealthProgress3_480 +200 + + + + + +XuiSceneTutorialContainer +1280.000000 +720.000000 +207 +true +XuiBlankScene + + + + +XuiGamertag +290.000000 +926.000000,36.000000,0.000000 +0.800000 +XuiLabelLight_ShadowedRight + + + + + +BasePlayer2 +1280.000000 +720.000000 +15 +true +XuiBlankScene + + + +BottomLeftAnchorPoint +0.000000 +0.000000 +64.000000,648.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TopLeftAnchorPoint +0.000000 +0.000000 +64.000000,36.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +XuiDarkOverlay +1280.000000 +720.000000 +false +XuiDarkOverlay + + + + +Background +1280.000000 +720.000000 +15 +false +true +XuiBackgroundPan + + + + +Logo +1280.000000 +138.000000 +0.000000,56.000000,0.000000 +MenuTitleLogo + + + + +XuiSceneHudRoot +1280.000000 +720.000000 +207 +true +XuiBlankScene + + + + +XuiSceneChatRoot +1280.000000 +720.000000 +true +XuiBlankScene + + + + +XuiSceneContainer +1280.000000 +720.000000 +207 +XuiBlankScene + + + + +Tooltips +200.000000 +40.000000 +0.000000,0.000061,0.000000 + + + +LStick +200.000000 +40.000000 +15 +false +LStick_Nav +true +22532 + + + + +LBButton +200.000000 +40.000000 +15 +false +LB_Button +true +22532 + + + + +RBButton +200.000000 +40.000000 +15 +false +RB_Button +true +22532 + + + + +RTrigger +200.000000 +40.000000 +15 +false +RTrigger +true +22535 + + + + +LTrigger +200.000000 +40.000000 +15 +false +LTrigger +true +22534 + + + + +YButton +200.000000 +40.000000 +15 +false +Y_Button +true +22531 + + + + +XButton +200.000000 +40.000000 +15 +false +X_Button +true +22530 + + + + +BButton +200.000000 +40.000000 +15 +false +B_Button +true +22529 + + + + +AButton +200.000000 +40.000000 +15 +false +A_Button +true +22528 + + + + + +TooltipsSmall +200.000000 +28.000000 +0.000000,0.000061,0.000000 + + + +LStick +200.000000 +28.000000 +15 +false +LStick_NavSmall +true +22532 + + + + +LBButton +200.000000 +28.000000 +15 +false +LB_ButtonSmall +true +22532 + + + + +RBButton +200.000000 +28.000000 +15 +false +RB_ButtonSmall +true +22532 + + + + +RTrigger +200.000000 +28.000000 +15 +false +RTriggerSmall +true +22535 + + + + +LTrigger +200.000000 +28.000000 +15 +false +LTriggerSmall +true +22534 + + + + +YButton +200.000000 +28.000000 +15 +false +Y_ButtonSmall +true +22531 + + + + +XButton +200.000000 +28.000000 +15 +false +X_ButtonSmall +true +22530 + + + + +BButton +200.000000 +28.000000 +15 +false +B_ButtonSmall +true +22529 + + + + +AButton +200.000000 +28.000000 +15 +false +A_ButtonSmall +true +22528 + + + + + +SelectedItem +400.000000 +440.000061,36.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +SelectedItemSmall +400.000000 +145.000031,240.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +BossHealth +1000.000000 +51.000000 +140.000000,36.000000,0.000000 +false + + + +TitleText +1000.000000 +36.000000 +5 +BossHealthLabel + + + + +ProgressBar1 +334.000000 +15.000000 +333.000000,36.000000,0.000000 +BossHealthProgress1 +200 + + + + +ProgressBar2 +666.000000 +15.000000 +167.000000,36.000000,0.000000 +BossHealthProgress2 +200 + + + + +ProgressBar3 +940.000000 +15.000000 +30.000031,36.000000,0.000000 +BossHealthProgress3 +200 + + + + +ProgressBar1_small +167.000000 +15.000000 +416.000000,36.000000,0.000000 +BossHealthProgress1_480 +200 + + + + +ProgressBar2_small +333.000000 +15.000000 +333.000000,36.000000,0.000000 +BossHealthProgress2_480 +200 + + + + +ProgressBar3_small +400.000000 +15.000000 +300.000031,36.000000,0.000000 +BossHealthProgress3_480 +200 + + + + + +XuiSceneTutorialContainer +1280.000000 +720.000000 +207 +true +XuiBlankScene + + + + +XuiGamertag +290.000000 +926.000000,36.000000,0.000000 +0.800000 +XuiLabelLight_ShadowedRight + + + + + +BasePlayer1 +1280.000000 +720.000000 +15 +true +XuiBlankScene + + + +BottomLeftAnchorPoint +0.000000 +0.000000 +64.000000,648.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TopLeftAnchorPoint +0.000000 +0.000000 +64.000000,36.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +XuiDarkOverlay +1280.000000 +720.000000 +false +XuiDarkOverlay + + + + +Background +1280.000000 +720.000000 +15 +false +true +XuiBackgroundPan + + + + +Logo +1280.000000 +138.000000 +0.000000,56.000000,0.000000 +MenuTitleLogo + + + + +XuiSceneHudRoot +1280.000000 +720.000000 +207 +true +XuiBlankScene + + + + +XuiSceneChatRoot +1280.000000 +720.000000 +true +XuiBlankScene + + + + +XuiSceneContainer +1280.000000 +720.000000 +207 +XuiBlankScene + + + + +Tooltips +200.000000 +40.000000 +0.000000,0.000061,0.000000 + + + +LStick +200.000000 +40.000000 +15 +false +LStick_Nav +true +22532 + + + + +LBButton +200.000000 +40.000000 +15 +false +LB_Button +true +22532 + + + + +RBButton +200.000000 +40.000000 +15 +false +RB_Button +true +22532 + + + + +RTrigger +200.000000 +40.000000 +15 +false +RTrigger +true +22535 + + + + +LTrigger +200.000000 +40.000000 +15 +false +LTrigger +true +22534 + + + + +YButton +200.000000 +40.000000 +15 +false +Y_Button +true +22531 + + + + +XButton +200.000000 +40.000000 +15 +false +X_Button +true +22530 + + + + +BButton +200.000000 +40.000000 +15 +false +B_Button +true +22529 + + + + +AButton +200.000000 +40.000000 +15 +false +A_Button +true +22528 + + + + + +TooltipsSmall +200.000000 +28.000000 +0.000000,0.000061,0.000000 + + + +LStick +200.000000 +28.000000 +15 +false +LStick_NavSmall +true +22532 + + + + +LBButton +200.000000 +28.000000 +15 +false +LB_ButtonSmall +true +22532 + + + + +RBButton +200.000000 +28.000000 +15 +false +RB_ButtonSmall +true +22532 + + + + +RTrigger +200.000000 +28.000000 +15 +false +RTriggerSmall +true +22535 + + + + +LTrigger +200.000000 +28.000000 +15 +false +LTriggerSmall +true +22534 + + + + +YButton +200.000000 +28.000000 +15 +false +Y_ButtonSmall +true +22531 + + + + +XButton +200.000000 +28.000000 +15 +false +X_ButtonSmall +true +22530 + + + + +BButton +200.000000 +28.000000 +15 +false +B_ButtonSmall +true +22529 + + + + +AButton +200.000000 +28.000000 +15 +false +A_ButtonSmall +true +22528 + + + + + +SelectedItem +400.000000 +440.000061,36.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +SelectedItemSmall +400.000000 +145.000031,240.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +BossHealth +1000.000000 +51.000000 +140.000000,36.000000,0.000000 +false + + + +TitleText +1000.000000 +36.000000 +5 +BossHealthLabel + + + + +ProgressBar1 +334.000000 +15.000000 +333.000000,36.000000,0.000000 +BossHealthProgress1 +200 + + + + +ProgressBar2 +666.000000 +15.000000 +167.000000,36.000000,0.000000 +BossHealthProgress2 +200 + + + + +ProgressBar3 +940.000000 +15.000000 +30.000031,36.000000,0.000000 +BossHealthProgress3 +200 + + + + +ProgressBar1_small +167.000000 +15.000000 +416.000000,36.000000,0.000000 +BossHealthProgress1_480 +200 + + + + +ProgressBar2_small +333.000000 +15.000000 +333.000000,36.000000,0.000000 +BossHealthProgress2_480 +200 + + + + +ProgressBar3_small +400.000000 +15.000000 +300.000031,36.000000,0.000000 +BossHealthProgress3_480 +200 + + + + + +XuiSceneTutorialContainer +1280.000000 +720.000000 +207 +true +XuiBlankScene + + + + +XuiGamertag +290.000000 +926.000000,36.000000,0.000000 +0.800000 +XuiLabelLight_ShadowedRight + + + + + +BasePlayer0 +1280.000000 +720.000000 +15 +true +XuiBlankScene + + + +BottomLeftAnchorPoint +0.000000 +0.000000 +64.000000,648.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TopLeftAnchorPoint +0.000000 +0.000000 +64.000000,36.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +XuiDarkOverlay +1280.000000 +720.000000 +false +XuiDarkOverlay + + + + +Background +1280.000000 +720.000000 +15 +false +true +XuiBackgroundPan + + + + +Logo +1280.000000 +138.000000 +0.000000,56.000000,0.000000 +MenuTitleLogo + + + + +XuiSceneHudRoot +1280.000000 +720.000000 +207 +true +XuiBlankScene + + + + +XuiSceneChatRoot +1280.000000 +720.000000 +true +XuiBlankScene + + + + +XuiSceneContainer +1280.000000 +720.000000 +207 +XuiBlankScene + + + + +Tooltips +200.000000 +40.000000 +0.000000,0.000061,0.000000 + + + +LStick +200.000000 +40.000000 +15 +false +LStick_Nav +true +22532 + + + + +LBButton +200.000000 +40.000000 +15 +false +LB_Button +true +22532 + + + + +RBButton +200.000000 +40.000000 +15 +false +RB_Button +true +22532 + + + + +RTrigger +200.000000 +40.000000 +15 +false +RTrigger +true +22535 + + + + +LTrigger +200.000000 +40.000000 +15 +false +LTrigger +true +22534 + + + + +YButton +200.000000 +40.000000 +15 +false +Y_Button +true +22531 + + + + +XButton +200.000000 +40.000000 +15 +false +X_Button +true +22530 + + + + +BButton +200.000000 +40.000000 +15 +false +B_Button +true +22529 + + + + +AButton +200.000000 +40.000000 +15 +false +A_Button +true +22528 + + + + + +TooltipsSmall +200.000000 +28.000000 +0.000000,0.000061,0.000000 + + + +LStick +200.000000 +28.000000 +15 +false +LStick_NavSmall +true +22532 + + + + +LBButton +200.000000 +28.000000 +15 +false +LB_ButtonSmall +true +22532 + + + + +RBButton +200.000000 +28.000000 +15 +false +RB_ButtonSmall +true +22532 + + + + +RTrigger +200.000000 +28.000000 +15 +false +RTriggerSmall +true +22535 + + + + +LTrigger +200.000000 +28.000000 +15 +false +LTriggerSmall +true +22534 + + + + +YButton +200.000000 +28.000000 +15 +false +Y_ButtonSmall +true +22531 + + + + +XButton +200.000000 +28.000000 +15 +false +X_ButtonSmall +true +22530 + + + + +BButton +200.000000 +28.000000 +15 +false +B_ButtonSmall +true +22529 + + + + +AButton +200.000000 +28.000000 +15 +false +A_ButtonSmall +true +22528 + + + + + +SelectedItem +400.000000 +440.000061,36.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +SelectedItemSmall +400.000000 +145.000031,240.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +BossHealth +1000.000000 +51.000000 +140.000000,36.000000,0.000000 +false + + + +TitleText +1000.000000 +36.000000 +5 +BossHealthLabel + + + + +ProgressBar1 +334.000000 +15.000000 +333.000000,36.000000,0.000000 +BossHealthProgress1 +200 + + + + +ProgressBar2 +666.000000 +15.000000 +167.000000,36.000000,0.000000 +BossHealthProgress2 +200 + + + + +ProgressBar3 +940.000000 +15.000000 +30.000031,36.000000,0.000000 +BossHealthProgress3 +200 + + + + +ProgressBar1_small +167.000000 +15.000000 +416.000000,36.000000,0.000000 +BossHealthProgress1_480 +200 + + + + +ProgressBar2_small +333.000000 +15.000000 +333.000000,36.000000,0.000000 +BossHealthProgress2_480 +200 + + + + +ProgressBar3_small +400.000000 +15.000000 +300.000031,36.000000,0.000000 +BossHealthProgress3_480 +200 + + + + + +XuiSceneTutorialContainer +1280.000000 +720.000000 +207 +true +XuiBlankScene + + + + +XuiGamertag +290.000000 +926.000000,36.000000,0.000000 +0.800000 +XuiLabelLight_ShadowedRight + + + + + +XuiPressStartMessage +400.000000 +88.000000 +440.000061,316.000031,0.000000 +0.800000 +false +QuadrantJoinGame + + + + +XuiSceneDebugContainer +1280.000000 +720.000000 +207 +true +XuiBlankScene + + + + +XuiSavingIcon +48.000000 +73.000000 +1168.000000,36.000000,0.000000 +false +SaveIcon + + + + +XuiTrialTimer +1280.000000 +47.000000 +0.000000,64.000000,0.000000 +false +XuiLabelLight_ShadowCentred + + + + +SafeArea +1280.000000 +720.000000 +48 +false + + + +1280.000000 +36.000000 +0.000000,683.000000,0.000000 +0.700000 + + +0xff0f0f80 + + + + +0xffeb0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +1280.000000 +36.000000 +0.700000 + + +0xff0f0f80 + + + + +0xffeb0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +64.000000 +720.000000 +0.700000 + + +0xff0f0f80 + + + + +0xffeb0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +64.000000 +720.000000 +1215.000000,0.000000,0.000000 +0.700000 + + +0xff0f0f80 + + + + +0xffeb0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +XuiSoundXACTBack +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonBack +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTCraft +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonCraft +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTCraftFail +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonCraftFail +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTFocus +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonFocus +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTPress +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonPress +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTScroll +17.000000 +11.000000 +114.000000,25.000000,0.000000 +Scroll +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + + +Normal + + + +EndNormal + +stop + + +StartFlash + + + +EndFlash + +gotoandplay +StartFlash + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_base_480.h b/Minecraft.Client/Common/Media/xuiscene_base_480.h new file mode 100644 index 00000000..ae2129db --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_base_480.h @@ -0,0 +1,172 @@ +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" +#define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_TooltipsSmall L"TooltipsSmall" +#define IDC_SelectedItem L"SelectedItem" +#define IDC_SelectedItemSmall L"SelectedItemSmall" +#define IDC_TitleText L"TitleText" +#define IDC_ProgressBar1 L"ProgressBar1" +#define IDC_ProgressBar2 L"ProgressBar2" +#define IDC_ProgressBar3 L"ProgressBar3" +#define IDC_ProgressBar1_small L"ProgressBar1_small" +#define IDC_ProgressBar2_small L"ProgressBar2_small" +#define IDC_ProgressBar3_small L"ProgressBar3_small" +#define IDC_BossHealth L"BossHealth" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_BasePlayer3 L"BasePlayer3" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" +#define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_TooltipsSmall L"TooltipsSmall" +#define IDC_SelectedItem L"SelectedItem" +#define IDC_SelectedItemSmall L"SelectedItemSmall" +#define IDC_TitleText L"TitleText" +#define IDC_ProgressBar1 L"ProgressBar1" +#define IDC_ProgressBar2 L"ProgressBar2" +#define IDC_ProgressBar3 L"ProgressBar3" +#define IDC_ProgressBar1_small L"ProgressBar1_small" +#define IDC_ProgressBar2_small L"ProgressBar2_small" +#define IDC_ProgressBar3_small L"ProgressBar3_small" +#define IDC_BossHealth L"BossHealth" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_BasePlayer2 L"BasePlayer2" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" +#define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_TooltipsSmall L"TooltipsSmall" +#define IDC_SelectedItem L"SelectedItem" +#define IDC_SelectedItemSmall L"SelectedItemSmall" +#define IDC_TitleText L"TitleText" +#define IDC_ProgressBar1 L"ProgressBar1" +#define IDC_ProgressBar2 L"ProgressBar2" +#define IDC_ProgressBar3 L"ProgressBar3" +#define IDC_ProgressBar1_small L"ProgressBar1_small" +#define IDC_ProgressBar2_small L"ProgressBar2_small" +#define IDC_ProgressBar3_small L"ProgressBar3_small" +#define IDC_BossHealth L"BossHealth" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_BasePlayer1 L"BasePlayer1" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" +#define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_TooltipsSmall L"TooltipsSmall" +#define IDC_SelectedItem L"SelectedItem" +#define IDC_SelectedItemSmall L"SelectedItemSmall" +#define IDC_TitleText L"TitleText" +#define IDC_ProgressBar1 L"ProgressBar1" +#define IDC_ProgressBar2 L"ProgressBar2" +#define IDC_ProgressBar3 L"ProgressBar3" +#define IDC_ProgressBar1_small L"ProgressBar1_small" +#define IDC_ProgressBar2_small L"ProgressBar2_small" +#define IDC_ProgressBar3_small L"ProgressBar3_small" +#define IDC_BossHealth L"BossHealth" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_BasePlayer0 L"BasePlayer0" +#define IDC_XuiPressStartMessage L"XuiPressStartMessage" +#define IDC_XuiSceneDebugContainer L"XuiSceneDebugContainer" +#define IDC_XuiSavingIcon L"XuiSavingIcon" +#define IDC_XuiTrialTimer L"XuiTrialTimer" +#define IDC_SafeArea L"SafeArea" +#define IDC_XuiSoundXACTBack L"XuiSoundXACTBack" +#define IDC_XuiSoundXACTCraft L"XuiSoundXACTCraft" +#define IDC_XuiSoundXACTCraftFail L"XuiSoundXACTCraftFail" +#define IDC_XuiSoundXACTFocus L"XuiSoundXACTFocus" +#define IDC_XuiSoundXACTPress L"XuiSoundXACTPress" +#define IDC_XuiSoundXACTScroll L"XuiSoundXACTScroll" +#define IDC_XuiBaseScene L"XuiBaseScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_base_480.xui b/Minecraft.Client/Common/Media/xuiscene_base_480.xui new file mode 100644 index 00000000..461421bf --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_base_480.xui @@ -0,0 +1,1994 @@ + + +640.000000 +480.000000 + + + +XuiBaseScene +640.000000 +480.000000 +CXuiSceneBase +XuiBlankScene +FadeIn + + + +BasePlayer3 +640.000000 +480.000000 +15 +true +XuiBlankScene + + + +XuiDarkOverlay +640.000000 +480.000000 +false +XuiDarkOverlay + + + + +Background +640.000000 +480.000000 +15 +false +true +XuiBackgroundPan480 + + + + +Logo +640.000000 +70.000000 +0.000000,48.000000,0.000000 +MenuTitleLogo + + + + +XuiSceneHudRoot +640.000000 +480.000000 +true +XuiBlankScene + + + + +XuiSceneChatRoot +640.000000 +480.000000 +true +XuiBlankScene + + + + +XuiSceneContainer +640.000000 +480.000000 +207 +XuiBlankScene + + + + +Tooltips +200.000000 +40.000000 +50.000000,424.000061,0.000000 +0.500000,0.500000,1.000000 + + + +LStick +200.000000 +40.000000 +15 +false +LStick_Nav +true +22532 + + + + +LBButton +200.000000 +40.000000 +15 +false +LB_Button +true +22532 + + + + +RBButton +200.000000 +40.000000 +15 +false +RB_Button +true +22532 + + + + +RTrigger +200.000000 +40.000000 +15 +false +RTrigger +true +22535 + + + + +LTrigger +200.000000 +40.000000 +15 +false +LTrigger +true +22534 + + + + +YButton +200.000000 +40.000000 +15 +false +Y_Button +true +22531 + + + + +XButton +200.000000 +40.000000 +15 +false +X_Button +true +22530 + + + + +BButton +200.000000 +40.000000 +15 +false +B_Button +true +22529 + + + + +AButton +200.000000 +40.000000 +15 +false +A_Button +true +22528 + + + + + +BottomLeftAnchorPoint +0.000000 +0.000000 +48.000000,444.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TopLeftAnchorPoint +0.000000 +0.000000 +48.000000,36.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TooltipsSmall +200.000000 +25.000000 +46.000000,420.000000,0.000000 + + + +LStick +200.000000 +25.000000 +15 +false +LStick_NavSmall +true +22532 + + + + +LBButton +200.000000 +25.000000 +15 +false +LB_ButtonSmall +true +22532 + + + + +RBButton +200.000000 +25.000000 +15 +false +RB_ButtonSmall +true +22532 + + + + +RTrigger +200.000000 +25.000000 +15 +false +RTriggerSmall480 +true +22535 + + + + +LTrigger +200.000000 +25.000000 +15 +false +LTriggerSmall480 +true +22534 + + + + +YButton +200.000000 +25.000000 +15 +false +Y_ButtonSmall +true +22531 + + + + +XButton +200.000000 +25.000000 +15 +false +X_ButtonSmall +true +22530 + + + + +BButton +200.000000 +25.000000 +15 +false +B_ButtonSmall +true +22529 + + + + +AButton +200.000000 +25.000000 +15 +false +A_ButtonSmall +true +22528 + + + + + +SelectedItem +400.000000 +120.000061,36.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +SelectedItemSmall +400.000000 +145.000031,240.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +BossHealth +500.000000 +51.000000 +70.000000,36.000000,0.000000 +false + + + +TitleText +500.000000 +36.000000 +5 +BossHealthLabel + + + + +ProgressBar1 +167.000000 +15.000000 +166.000000,36.000000,0.000000 +BossHealthProgress1_480 +200 + + + + +ProgressBar2 +333.000000 +15.000000 +83.000000,36.000000,0.000000 +BossHealthProgress2_480 +200 + + + + +ProgressBar3 +400.000000 +15.000000 +50.000000,36.000000,0.000000 +BossHealthProgress3_480 +200 + + + + +ProgressBar1_small +167.000000 +15.000000 +166.000031,36.000000,0.000000 +false +BossHealthProgress1_480 +200 + + + + +ProgressBar2_small +333.000000 +15.000000 +83.000031,36.000000,0.000000 +false +BossHealthProgress2_480 +200 + + + + +ProgressBar3_small +400.000000 +15.000000 +50.000061,36.000000,0.000000 +false +BossHealthProgress3_480 +200 + + + + + +XuiSceneTutorialContainer +640.000000 +480.000000 +207 +true +XuiBlankScene + + + + + +BasePlayer2 +640.000000 +480.000000 +15 +true +XuiBlankScene + + + +XuiDarkOverlay +640.000000 +480.000000 +false +XuiDarkOverlay + + + + +Background +640.000000 +480.000000 +15 +false +true +XuiBackgroundPan480 + + + + +Logo +640.000000 +70.000000 +0.000000,48.000000,0.000000 +MenuTitleLogo + + + + +XuiSceneHudRoot +640.000000 +480.000000 +true +XuiBlankScene + + + + +XuiSceneChatRoot +640.000000 +480.000000 +true +XuiBlankScene + + + + +XuiSceneContainer +640.000000 +480.000000 +207 +XuiBlankScene + + + + +Tooltips +200.000000 +40.000000 +50.000000,424.000061,0.000000 +0.500000,0.500000,1.000000 + + + +LStick +200.000000 +40.000000 +15 +false +LStick_Nav +true +22532 + + + + +LBButton +200.000000 +40.000000 +15 +false +LB_Button +true +22532 + + + + +RBButton +200.000000 +40.000000 +15 +false +RB_Button +true +22532 + + + + +RTrigger +200.000000 +40.000000 +15 +false +RTrigger +true +22535 + + + + +LTrigger +200.000000 +40.000000 +15 +false +LTrigger +true +22534 + + + + +YButton +200.000000 +40.000000 +15 +false +Y_Button +true +22531 + + + + +XButton +200.000000 +40.000000 +15 +false +X_Button +true +22530 + + + + +BButton +200.000000 +40.000000 +15 +false +B_Button +true +22529 + + + + +AButton +200.000000 +40.000000 +15 +false +A_Button +true +22528 + + + + + +BottomLeftAnchorPoint +0.000000 +0.000000 +48.000000,444.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TopLeftAnchorPoint +0.000000 +0.000000 +48.000000,36.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TooltipsSmall +200.000000 +25.000000 +46.000000,420.000000,0.000000 + + + +LStick +200.000000 +25.000000 +15 +false +LStick_NavSmall +true +22532 + + + + +LBButton +200.000000 +25.000000 +15 +false +LB_ButtonSmall +true +22532 + + + + +RBButton +200.000000 +25.000000 +15 +false +RB_ButtonSmall +true +22532 + + + + +RTrigger +200.000000 +25.000000 +15 +false +RTriggerSmall480 +true +22535 + + + + +LTrigger +200.000000 +25.000000 +15 +false +LTriggerSmall480 +true +22534 + + + + +YButton +200.000000 +25.000000 +15 +false +Y_ButtonSmall +true +22531 + + + + +XButton +200.000000 +25.000000 +15 +false +X_ButtonSmall +true +22530 + + + + +BButton +200.000000 +25.000000 +15 +false +B_ButtonSmall +true +22529 + + + + +AButton +200.000000 +25.000000 +15 +false +A_ButtonSmall +true +22528 + + + + + +SelectedItem +400.000000 +120.000061,36.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +SelectedItemSmall +400.000000 +145.000031,240.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +BossHealth +500.000000 +51.000000 +70.000000,36.000000,0.000000 +false + + + +TitleText +500.000000 +36.000000 +5 +BossHealthLabel + + + + +ProgressBar1 +167.000000 +15.000000 +166.000000,36.000000,0.000000 +BossHealthProgress1_480 +200 + + + + +ProgressBar2 +333.000000 +15.000000 +83.000000,36.000000,0.000000 +BossHealthProgress2_480 +200 + + + + +ProgressBar3 +400.000000 +15.000000 +50.000000,36.000000,0.000000 +BossHealthProgress3_480 +200 + + + + +ProgressBar1_small +167.000000 +15.000000 +166.000031,36.000000,0.000000 +false +BossHealthProgress1_480 +200 + + + + +ProgressBar2_small +333.000000 +15.000000 +83.000031,36.000000,0.000000 +false +BossHealthProgress2_480 +200 + + + + +ProgressBar3_small +400.000000 +15.000000 +50.000061,36.000000,0.000000 +false +BossHealthProgress3_480 +200 + + + + + +XuiSceneTutorialContainer +640.000000 +480.000000 +207 +true +XuiBlankScene + + + + + +BasePlayer1 +640.000000 +480.000000 +15 +true +XuiBlankScene + + + +XuiDarkOverlay +640.000000 +480.000000 +false +XuiDarkOverlay + + + + +Background +640.000000 +480.000000 +15 +false +true +XuiBackgroundPan480 + + + + +Logo +640.000000 +70.000000 +0.000000,48.000000,0.000000 +MenuTitleLogo + + + + +XuiSceneHudRoot +640.000000 +480.000000 +true +XuiBlankScene + + + + +XuiSceneChatRoot +640.000000 +480.000000 +true +XuiBlankScene + + + + +XuiSceneContainer +640.000000 +480.000000 +207 +XuiBlankScene + + + + +Tooltips +200.000000 +40.000000 +50.000000,424.000061,0.000000 +0.500000,0.500000,1.000000 + + + +LStick +200.000000 +40.000000 +15 +false +LStick_Nav +true +22532 + + + + +LBButton +200.000000 +40.000000 +15 +false +LB_Button +true +22532 + + + + +RBButton +200.000000 +40.000000 +15 +false +RB_Button +true +22532 + + + + +RTrigger +200.000000 +40.000000 +15 +false +RTrigger +true +22535 + + + + +LTrigger +200.000000 +40.000000 +15 +false +LTrigger +true +22534 + + + + +YButton +200.000000 +40.000000 +15 +false +Y_Button +true +22531 + + + + +XButton +200.000000 +40.000000 +15 +false +X_Button +true +22530 + + + + +BButton +200.000000 +40.000000 +15 +false +B_Button +true +22529 + + + + +AButton +200.000000 +40.000000 +15 +false +A_Button +true +22528 + + + + + +BottomLeftAnchorPoint +0.000000 +0.000000 +48.000000,444.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TopLeftAnchorPoint +0.000000 +0.000000 +48.000000,36.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TooltipsSmall +200.000000 +25.000000 +46.000000,420.000000,0.000000 + + + +LStick +200.000000 +25.000000 +15 +false +LStick_NavSmall +true +22532 + + + + +LBButton +200.000000 +25.000000 +15 +false +LB_ButtonSmall +true +22532 + + + + +RBButton +200.000000 +25.000000 +15 +false +RB_ButtonSmall +true +22532 + + + + +RTrigger +200.000000 +25.000000 +15 +false +RTriggerSmall480 +true +22535 + + + + +LTrigger +200.000000 +25.000000 +15 +false +LTriggerSmall480 +true +22534 + + + + +YButton +200.000000 +25.000000 +15 +false +Y_ButtonSmall +true +22531 + + + + +XButton +200.000000 +25.000000 +15 +false +X_ButtonSmall +true +22530 + + + + +BButton +200.000000 +25.000000 +15 +false +B_ButtonSmall +true +22529 + + + + +AButton +200.000000 +25.000000 +15 +false +A_ButtonSmall +true +22528 + + + + + +SelectedItem +400.000000 +120.000061,36.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +SelectedItemSmall +400.000000 +145.000031,240.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +BossHealth +500.000000 +51.000000 +70.000000,36.000000,0.000000 +false + + + +TitleText +500.000000 +36.000000 +5 +BossHealthLabel + + + + +ProgressBar1 +167.000000 +15.000000 +166.000000,36.000000,0.000000 +BossHealthProgress1_480 +200 + + + + +ProgressBar2 +333.000000 +15.000000 +83.000000,36.000000,0.000000 +BossHealthProgress2_480 +200 + + + + +ProgressBar3 +400.000000 +15.000000 +50.000000,36.000000,0.000000 +BossHealthProgress3_480 +200 + + + + +ProgressBar1_small +167.000000 +15.000000 +166.000031,36.000000,0.000000 +false +BossHealthProgress1_480 +200 + + + + +ProgressBar2_small +333.000000 +15.000000 +83.000031,36.000000,0.000000 +false +BossHealthProgress2_480 +200 + + + + +ProgressBar3_small +400.000000 +15.000000 +50.000061,36.000000,0.000000 +false +BossHealthProgress3_480 +200 + + + + + +XuiSceneTutorialContainer +640.000000 +480.000000 +207 +true +XuiBlankScene + + + + + +BasePlayer0 +640.000000 +480.000000 +15 +true +XuiBlankScene + + + +XuiDarkOverlay +640.000000 +480.000000 +false +XuiDarkOverlay + + + + +Background +640.000000 +480.000000 +15 +false +true +XuiBackgroundPan480 + + + + +Logo +640.000000 +70.000000 +0.000000,48.000000,0.000000 +MenuTitleLogo + + + + +XuiSceneHudRoot +640.000000 +480.000000 +true +XuiBlankScene + + + + +XuiSceneChatRoot +640.000000 +480.000000 +true +XuiBlankScene + + + + +XuiSceneContainer +640.000000 +480.000000 +207 +XuiBlankScene + + + + +Tooltips +200.000000 +40.000000 +50.000000,424.000061,0.000000 +0.500000,0.500000,1.000000 + + + +LStick +200.000000 +40.000000 +15 +false +LStick_Nav +true +22532 + + + + +LBButton +200.000000 +40.000000 +15 +false +LB_Button +true +22532 + + + + +RBButton +200.000000 +40.000000 +15 +false +RB_Button +true +22532 + + + + +RTrigger +200.000000 +40.000000 +15 +false +RTrigger +true +22535 + + + + +LTrigger +200.000000 +40.000000 +15 +false +LTrigger +true +22534 + + + + +YButton +200.000000 +40.000000 +15 +false +Y_Button +true +22531 + + + + +XButton +200.000000 +40.000000 +15 +false +X_Button +true +22530 + + + + +BButton +200.000000 +40.000000 +15 +false +B_Button +true +22529 + + + + +AButton +200.000000 +40.000000 +15 +false +A_Button +true +22528 + + + + + +BottomLeftAnchorPoint +0.000000 +0.000000 +48.000000,444.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TopLeftAnchorPoint +0.000000 +0.000000 +48.000000,36.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TooltipsSmall +200.000000 +25.000000 +46.000000,420.000000,0.000000 + + + +LStick +200.000000 +25.000000 +15 +false +LStick_NavSmall +true +22532 + + + + +LBButton +200.000000 +25.000000 +15 +false +LB_ButtonSmall +true +22532 + + + + +RBButton +200.000000 +25.000000 +15 +false +RB_ButtonSmall +true +22532 + + + + +RTrigger +200.000000 +25.000000 +15 +false +RTriggerSmall480 +true +22535 + + + + +LTrigger +200.000000 +25.000000 +15 +false +LTriggerSmall480 +true +22534 + + + + +YButton +200.000000 +25.000000 +15 +false +Y_ButtonSmall +true +22531 + + + + +XButton +200.000000 +25.000000 +15 +false +X_ButtonSmall +true +22530 + + + + +BButton +200.000000 +25.000000 +15 +false +B_ButtonSmall +true +22529 + + + + +AButton +200.000000 +25.000000 +15 +false +A_ButtonSmall +true +22528 + + + + + +SelectedItem +400.000000 +120.000061,36.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +SelectedItemSmall +400.000000 +145.000031,240.000000,0.000000 +0.800000 +XuiLabelLight_ShadowCentred + + + + +BossHealth +500.000000 +51.000000 +70.000000,36.000000,0.000000 +false + + + +TitleText +500.000000 +36.000000 +5 +BossHealthLabel + + + + +ProgressBar1 +167.000000 +15.000000 +166.000000,36.000000,0.000000 +BossHealthProgress1_480 +200 + + + + +ProgressBar2 +333.000000 +15.000000 +83.000000,36.000000,0.000000 +BossHealthProgress2_480 +200 + + + + +ProgressBar3 +400.000000 +15.000000 +50.000000,36.000000,0.000000 +BossHealthProgress3_480 +200 + + + + +ProgressBar1_small +167.000000 +15.000000 +166.000031,36.000000,0.000000 +false +BossHealthProgress1_480 +200 + + + + +ProgressBar2_small +333.000000 +15.000000 +83.000031,36.000000,0.000000 +false +BossHealthProgress2_480 +200 + + + + +ProgressBar3_small +400.000000 +15.000000 +50.000061,36.000000,0.000000 +false +BossHealthProgress3_480 +200 + + + + + +XuiSceneTutorialContainer +640.000000 +480.000000 +207 +true +XuiBlankScene + + + + + +XuiPressStartMessage +400.000000 +88.000000 +120.000046,196.000015,0.000000 +0.800000 +false +QuadrantJoinGame + + + + +XuiSceneDebugContainer +640.000000 +480.000000 +207 +true +XuiBlankScene + + + + +XuiSavingIcon +48.000000 +73.000000 +560.000000,36.000000,0.000000 +0.600000,0.600000,1.000000 +false +SaveIcon + + + + +XuiTrialTimer +640.000000 +47.000000 +0.000000,130.000000,0.000000 +false +XuiLabelLight_C_ShadowedSmall + + + + +SafeArea +640.000000 +360.000000 +false + + + +640.000000 +36.000000 +0.000000,444.000000,0.000000 +0.700000 + + +0xff0f0f80 + + + + +0xffeb0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +640.000000 +36.000000 +0.700000 +192 + + +0xff0f0f80 + + + + +0xffeb0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +48.000000 +480.000000 +0.700000 + + +0xff0f0f80 + + + + +0xffeb0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +48.000000 +480.000000 +592.000000,0.000000,0.000000 +0.700000 + + +0xff0f0f80 + + + + +0xffeb0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +XuiSoundXACTBack +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonBack +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTCraft +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonCraft +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTCraftFail +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonCraftFail +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTFocus +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonFocus +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTPress +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonPress +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTScroll +17.000000 +11.000000 +114.000000,25.000000,0.000000 +Scroll +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + + +Normal + + + +EndNormal + +stop + + +StartFlash + + + +EndFlash + +gotoandplay +StartFlash + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_base_small.h b/Minecraft.Client/Common/Media/xuiscene_base_small.h new file mode 100644 index 00000000..340ae31b --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_base_small.h @@ -0,0 +1,80 @@ +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_BasePlayer3 L"BasePlayer3" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_BasePlayer2 L"BasePlayer2" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_BasePlayer1 L"BasePlayer1" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_BasePlayer0 L"BasePlayer0" +#define IDC_XuiPressStartMessage L"XuiPressStartMessage" +#define IDC_XuiSceneDebugContainer L"XuiSceneDebugContainer" +#define IDC_XuiSavingIcon L"XuiSavingIcon" +#define IDC_XuiTrialTimer L"XuiTrialTimer" +#define IDC_SafeArea L"SafeArea" +#define IDC_XuiSoundXACTBack L"XuiSoundXACTBack" +#define IDC_XuiSoundXACTCraft L"XuiSoundXACTCraft" +#define IDC_XuiSoundXACTCraftFail L"XuiSoundXACTCraftFail" +#define IDC_XuiSoundXACTFocus L"XuiSoundXACTFocus" +#define IDC_XuiSoundXACTPress L"XuiSoundXACTPress" +#define IDC_XuiSoundXACTScroll L"XuiSoundXACTScroll" +#define IDC_XuiBaseScene L"XuiBaseScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_base_small.xui b/Minecraft.Client/Common/Media/xuiscene_base_small.xui new file mode 100644 index 00000000..a0c56105 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_base_small.xui @@ -0,0 +1,1021 @@ + + +640.000000 +360.000000 + + + +XuiBaseScene +640.000000 +360.000000 +CXuiSceneBase +XuiBlankScene +FadeIn + + + +BasePlayer3 +640.000000 +360.000000 +15 +true +CScene_BasePlayer +XuiBlankScene + + + +XuiDarkOverlay +640.000000 +360.000000 +false +XuiDarkOverlay + + + + +Background +640.000000 +360.000000 +15 +false +true +XuiBackgroundPan + + + + +Logo +640.000000 +70.000000 +0.000000,36.000000,0.000000 +16 +MenuTitle.png +48 + + + + +XuiSceneContainer +640.000000 +360.000000 +207 +XuiBlankScene + + + + +XuiSceneTutorialContainer +640.000000 +360.000000 +207 +XuiBlankScene + + + + +Tooltips +200.000000 +40.000000 +0.000000,0.000061,0.000000 +0.500000,0.500000,1.000000 + + + +LBButton +200.000000 +40.000000 +15 +false +LB_Button +true +22532 + + + + +RBButton +200.000000 +40.000000 +15 +false +RB_Button +true +22532 + + + + +RTrigger +200.000000 +40.000000 +15 +false +RTrigger +true +22535 + + + + +LTrigger +200.000000 +40.000000 +15 +false +LTrigger +true +22534 + + + + +YButton +200.000000 +40.000000 +15 +false +Y_Button +true +22531 + + + + +XButton +200.000000 +40.000000 +15 +false +X_Button +true +22530 + + + + +BButton +200.000000 +40.000000 +15 +false +B_Button +true +22529 + + + + +AButton +200.000000 +40.000000 +15 +false +A_Button +true +22528 + + + + + +BottomLeftAnchorPoint +0.000000 +0.000000 +40.000000,325.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TopLeftAnchorPoint +0.000000 +0.000000 +40.000000,36.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + + +BasePlayer2 +640.000000 +360.000000 +15 +true +CScene_BasePlayer +XuiBlankScene + + + +XuiDarkOverlay +640.000000 +360.000000 +false +XuiDarkOverlay + + + + +Background +640.000000 +360.000000 +15 +false +true +XuiBackgroundPan + + + + +Logo +640.000000 +70.000000 +0.000000,36.000000,0.000000 +16 +MenuTitle.png +48 + + + + +XuiSceneContainer +640.000000 +360.000000 +207 +XuiBlankScene + + + + +XuiSceneTutorialContainer +640.000000 +360.000000 +207 +XuiBlankScene + + + + +Tooltips +200.000000 +40.000000 +0.000000,0.000061,0.000000 +0.500000,0.500000,1.000000 + + + +LBButton +200.000000 +40.000000 +15 +false +LB_Button +true +22532 + + + + +RBButton +200.000000 +40.000000 +15 +false +RB_Button +true +22532 + + + + +RTrigger +200.000000 +40.000000 +15 +false +RTrigger +true +22535 + + + + +LTrigger +200.000000 +40.000000 +15 +false +LTrigger +true +22534 + + + + +YButton +200.000000 +40.000000 +15 +false +Y_Button +true +22531 + + + + +XButton +200.000000 +40.000000 +15 +false +X_Button +true +22530 + + + + +BButton +200.000000 +40.000000 +15 +false +B_Button +true +22529 + + + + +AButton +200.000000 +40.000000 +15 +false +A_Button +true +22528 + + + + + +BottomLeftAnchorPoint +0.000000 +0.000000 +40.000000,325.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TopLeftAnchorPoint +0.000000 +0.000000 +40.000000,36.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + + +BasePlayer1 +640.000000 +360.000000 +15 +true +CScene_BasePlayer +XuiBlankScene + + + +XuiDarkOverlay +640.000000 +360.000000 +false +XuiDarkOverlay + + + + +Background +640.000000 +360.000000 +15 +false +true +XuiBackgroundPan + + + + +Logo +640.000000 +70.000000 +0.000000,36.000000,0.000000 +16 +MenuTitle.png +48 + + + + +XuiSceneContainer +640.000000 +360.000000 +207 +XuiBlankScene + + + + +XuiSceneTutorialContainer +640.000000 +360.000000 +207 +XuiBlankScene + + + + +Tooltips +200.000000 +40.000000 +0.000000,0.000061,0.000000 +0.500000,0.500000,1.000000 + + + +LBButton +200.000000 +40.000000 +15 +false +LB_Button +true +22532 + + + + +RBButton +200.000000 +40.000000 +15 +false +RB_Button +true +22532 + + + + +RTrigger +200.000000 +40.000000 +15 +false +RTrigger +true +22535 + + + + +LTrigger +200.000000 +40.000000 +15 +false +LTrigger +true +22534 + + + + +YButton +200.000000 +40.000000 +15 +false +Y_Button +true +22531 + + + + +XButton +200.000000 +40.000000 +15 +false +X_Button +true +22530 + + + + +BButton +200.000000 +40.000000 +15 +false +B_Button +true +22529 + + + + +AButton +200.000000 +40.000000 +15 +false +A_Button +true +22528 + + + + + +BottomLeftAnchorPoint +0.000000 +0.000000 +40.000000,325.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TopLeftAnchorPoint +0.000000 +0.000000 +40.000000,36.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + + +BasePlayer0 +640.000000 +360.000000 +15 +true +CScene_BasePlayer +XuiBlankScene + + + +XuiDarkOverlay +640.000000 +360.000000 +false +XuiDarkOverlay + + + + +Background +640.000000 +360.000000 +15 +false +true +XuiBackgroundPan + + + + +Logo +640.000000 +70.000000 +0.000000,36.000000,0.000000 +16 +MenuTitle.png +48 + + + + +XuiSceneContainer +640.000000 +360.000000 +207 +XuiBlankScene + + + + +XuiSceneTutorialContainer +640.000000 +360.000000 +207 +XuiBlankScene + + + + +Tooltips +200.000000 +40.000000 +0.000000,0.000061,0.000000 +0.500000,0.500000,1.000000 + + + +LBButton +200.000000 +40.000000 +15 +false +LB_Button +true +22532 + + + + +RBButton +200.000000 +40.000000 +15 +false +RB_Button +true +22532 + + + + +RTrigger +200.000000 +40.000000 +15 +false +RTrigger +true +22535 + + + + +LTrigger +200.000000 +40.000000 +15 +false +LTrigger +true +22534 + + + + +YButton +200.000000 +40.000000 +15 +false +Y_Button +true +22531 + + + + +XButton +200.000000 +40.000000 +15 +false +X_Button +true +22530 + + + + +BButton +200.000000 +40.000000 +15 +false +B_Button +true +22529 + + + + +AButton +200.000000 +40.000000 +15 +false +A_Button +true +22528 + + + + + +BottomLeftAnchorPoint +0.000000 +0.000000 +40.000000,325.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + +TopLeftAnchorPoint +0.000000 +0.000000 +40.000000,36.000000,0.000000 +false +true +XuiVisualImagePresenter +false + + + + + +XuiPressStartMessage +400.000000 +88.000000 +120.000046,136.000015,0.000000 +0.800000 +false +QuadrantJoinGame + + + + +XuiSceneDebugContainer +640.000000 +360.000000 +207 +true +XuiBlankScene + + + + +XuiSavingIcon +48.000000 +73.000000 +552.000000,35.000000,0.000000 +false +SaveIcon + + + + +XuiTrialTimer +640.000000 +47.000000 +0.000000,64.000000,0.000000 +false +XuiLabelLight_C_ShadowedSmall + + + + +SafeArea +640.000000 +360.000000 +false + + + +640.000000 +35.000000 +0.000000,325.000000,0.000000 +0.700000 + + +0xff0f0f80 + + + + +0xffeb0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +640.000000 +35.000000 +0.700000 +192 + + +0xff0f0f80 + + + + +0xffeb0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +40.000000 +360.000000 +0.700000 + + +0xff0f0f80 + + + + +0xffeb0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +40.000000 +360.000000 +600.000000,0.000000,0.000000 +0.700000 + + +0xff0f0f80 + + + + +0xffeb0f0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +XuiSoundXACTBack +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonBack +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTCraft +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonCraft +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTCraftFail +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonCraftFail +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTFocus +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonFocus +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTPress +17.000000 +11.000000 +114.000000,25.000000,0.000000 +ButtonPress +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + +XuiSoundXACTScroll +17.000000 +11.000000 +114.000000,25.000000,0.000000 +Scroll +Sound\Xbox\MenuSounds.xsb +Sound\Xbox\MenuSounds.xwb + + + + + +Normal + + + +EndNormal + +stop + + +StartFlash + + + +EndFlash + +gotoandplay +StartFlash + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_brewingstand.h b/Minecraft.Client/Common/Media/xuiscene_brewingstand.h new file mode 100644 index 00000000..64dca590 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_brewingstand.h @@ -0,0 +1,204 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryText L"InventoryText" +#define IDC_BrewingStandText L"BrewingStandText" +#define IDC_BrewingStand L"BrewingStand" +#define IDC_Progress L"Progress" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Ingredient L"Ingredient" +#define IDC_Bubbles L"Bubbles" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Bottle1 L"Bottle1" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Bottle2 L"Bottle2" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Bottle3 L"Bottle3" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneBrewingStand L"XuiSceneBrewingStand" diff --git a/Minecraft.Client/Common/Media/xuiscene_brewingstand.xui b/Minecraft.Client/Common/Media/xuiscene_brewingstand.xui new file mode 100644 index 00000000..da3d8491 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_brewingstand.xui @@ -0,0 +1,2899 @@ + + +1280.000000 +720.000000 + + + +XuiSceneBrewingStand +1280.000000 +720.000000 +CXuiSceneBrewingStand +XuiBlankScene +Pointer + + + +Group +428.000000 +450.000000 +426.000000,95.000000,0.000000 +15 +XuiScene +Pointer + + + +Inventory +382.000000 +150.000000 +25.000000,240.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +UseRow +381.000000 +50.000000 +25.000000,379.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +InventoryText +378.000000 +34.000000 +24.000000,210.000000,0.000000 +12 +LabelContainerSceneLeft + + + + +BrewingStandText +380.000000 +34.000000 +24.000000,12.000000,0.000000 +LabelContainerSceneCentre + + + + +BrewingStand +192.000000 +172.000000 +117.000000,42.000000,0.000000 +BrewingBackground + + + + +Progress +27.000000 +84.000000 +244.000000,44.000000,0.000000 +CXuiCtrlBrewProgress +BrewingArrowProgressState +600 + + + + +Ingredient +54.000000 +54.000000 +187.000015,45.000015,0.000000 +3 +CXuiCtrlSlotList +ItemGridBrewing + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +Bubbles +36.000000 +84.000000 +148.000061,44.000015,0.000000 +CXuiCtrlBubblesProgress +BrewingBubblesProgressState +30 + + + + +Bottle1 +54.000000 +54.000000 +118.000053,132.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridBrewing + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +Bottle2 +54.000000 +54.000000 +187.000000,153.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridBrewing + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +Bottle3 +54.000000 +54.000000 +256.000000,132.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridBrewing + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +Pointer +42.000000 +42.000000 +-185.000000,-63.000015,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointer + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +426.000000,95.000000,0.000000 + + + +0 +426.000000,95.000000,0.000000 + + + +2 +100 +-100 +50 +424.500031,95.000000,0.000000 + + + +0 +160.000000,95.000000,0.000000 + + + +2 +100 +-100 +50 +160.000000,95.000000,0.000000 + + + +0 +426.000000,95.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_brewingstand_480.h b/Minecraft.Client/Common/Media/xuiscene_brewingstand_480.h new file mode 100644 index 00000000..a6bd3341 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_brewingstand_480.h @@ -0,0 +1,232 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryText L"InventoryText" +#define IDC_BrewingStandText L"BrewingStandText" +#define IDC_BrewingStand L"BrewingStand" +#define IDC_Progress L"Progress" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Ingredient L"Ingredient" +#define IDC_Bubbles L"Bubbles" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Bottle1 L"Bottle1" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Bottle2 L"Bottle2" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Bottle3 L"Bottle3" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneBrewingStand L"XuiSceneBrewingStand" diff --git a/Minecraft.Client/Common/Media/xuiscene_brewingstand_480.xui b/Minecraft.Client/Common/Media/xuiscene_brewingstand_480.xui new file mode 100644 index 00000000..6bea0597 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_brewingstand_480.xui @@ -0,0 +1,3144 @@ + + +640.000000 +480.000000 + + + +XuiSceneBrewingStand +640.000000 +480.000000 +CXuiSceneBrewingStand +XuiBlankScene +Pointer + + + +Group +260.000000 +290.000000 +190.000000,96.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Inventory +234.000000 +78.000000 +13.000000,162.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +234.000000 +13.000000,250.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +InventoryText +234.000000 +25.000000 +12.000000,140.000000,0.000000 +9 +LabelContainerSceneLeftSmall + + + + +BrewingStandText +229.000000 +26.000000 +15.500000,7.000000,0.000000 +LabelContainerSceneCentreSmall + + + + +BrewingStand +128.000000 +108.000000 +66.000000,30.000000,0.000000 +BrewingBackground_Small + + + + +Progress +18.000000 +56.000000 +151.000000,29.000000,0.000000 +CXuiCtrlBrewProgress +BrewingArrowProgressStateSmall +600 + + + + +Ingredient +36.000000 +36.000000 +112.000000,30.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridBrewing36 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +Bubbles +24.000000 +56.000000 +84.000061,29.000015,0.000000 +CXuiCtrlBubblesProgress +BrewingBubblesProgressStateSmall +30 + + + + +Bottle1 +36.000000 +36.000000 +66.000000,88.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridBrewing36 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +Bottle2 +36.000000 +36.000000 +112.000000,102.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridBrewing36 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +Bottle3 +36.000000 +36.000000 +157.999985,88.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridBrewing36 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +Pointer +26.000000 +26.000000 +-50.000000,-50.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000000,96.000000,0.000000 + + + +0 +190.000000,96.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,96.000000,0.000000 + + + +0 +33.750000,96.000000,0.000000 + + + +2 +100 +-100 +50 +60.000000,96.000000,0.000000 + + + +0 +190.000000,96.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_brewingstand_Small.h b/Minecraft.Client/Common/Media/xuiscene_brewingstand_Small.h new file mode 100644 index 00000000..e45fa2b5 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_brewingstand_Small.h @@ -0,0 +1,170 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryText L"InventoryText" +#define IDC_BrewingStandText L"BrewingStandText" +#define IDC_BrewingStand L"BrewingStand" +#define IDC_Progress L"Progress" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Ingredient L"Ingredient" +#define IDC_Bubbles L"Bubbles" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Bottle1 L"Bottle1" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Bottle2 L"Bottle2" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Bottle3 L"Bottle3" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneBrewingStand L"XuiSceneBrewingStand" diff --git a/Minecraft.Client/Common/Media/xuiscene_brewingstand_Small.xui b/Minecraft.Client/Common/Media/xuiscene_brewingstand_Small.xui new file mode 100644 index 00000000..dfff4df1 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_brewingstand_Small.xui @@ -0,0 +1,2321 @@ + + +640.000000 +360.000000 + + + +XuiSceneBrewingStand +640.000000 +360.000000 +CXuiSceneBrewingStand +XuiBlankScene +Pointer + + + +Group +260.000000 +290.000000 +190.000000,2.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Inventory +234.000000 +80.000000 +12.000000,161.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +234.000000 +12.000000,250.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +InventoryText +233.000000 +12.000000,139.000000,0.000000 +9 +LabelContainerSceneLeftSmall + + + + +BrewingStandText +229.000000 +26.000000 +15.500000,7.000000,0.000000 +LabelContainerSceneCentreSmall + + + + +BrewingStand +128.000000 +108.000000 +66.000000,30.000000,0.000000 +BrewingBackground_Small + + + + +Progress +18.000000 +56.000000 +151.000000,29.000000,0.000000 +CXuiCtrlBrewProgress +BrewingArrowProgressStateSmall +600 + + + + +Ingredient +36.000000 +36.000000 +112.000000,30.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridBrewing36 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +Bubbles +24.000000 +56.000000 +84.000061,29.000015,0.000000 +CXuiCtrlBubblesProgress +BrewingBubblesProgressStateSmall +30 + + + + +Bottle1 +36.000000 +36.000000 +66.000000,88.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridBrewing36 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +Bottle2 +36.000000 +36.000000 +112.000000,102.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridBrewing36 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +Bottle3 +36.000000 +36.000000 +157.999985,88.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridBrewing36 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +52.000000 +52.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + +control_ListItem +36.000000 +36.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonBrewing +..\Images\img1.png +22594 +4 + + + + + +Pointer +26.000000 +26.000000 +-50.000000,-50.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000000,2.000000,0.000000 + + + +0 +190.000000,2.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,2.000000,0.000000 + + + +0 +64.000000,2.000000,0.000000 + + + +2 +100 +-100 +50 +92.000000,2.000000,0.000000 + + + +0 +190.000000,2.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_chat.h b/Minecraft.Client/Common/Media/xuiscene_chat.h new file mode 100644 index 00000000..67566e0e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_chat.h @@ -0,0 +1,22 @@ +#define IDC_XuiBack1 L"XuiBack1" +#define IDC_XuiLabel1 L"XuiLabel1" +#define IDC_XuiBack2 L"XuiBack2" +#define IDC_XuiLabel2 L"XuiLabel2" +#define IDC_XuiBack3 L"XuiBack3" +#define IDC_XuiLabel3 L"XuiLabel3" +#define IDC_XuiBack4 L"XuiBack4" +#define IDC_XuiLabel4 L"XuiLabel4" +#define IDC_XuiBack5 L"XuiBack5" +#define IDC_XuiLabel5 L"XuiLabel5" +#define IDC_XuiBack6 L"XuiBack6" +#define IDC_XuiLabel6 L"XuiLabel6" +#define IDC_XuiBack7 L"XuiBack7" +#define IDC_XuiLabel7 L"XuiLabel7" +#define IDC_XuiBack8 L"XuiBack8" +#define IDC_XuiLabel8 L"XuiLabel8" +#define IDC_XuiBack9 L"XuiBack9" +#define IDC_XuiLabel9 L"XuiLabel9" +#define IDC_XuiBack10 L"XuiBack10" +#define IDC_XuiLabel10 L"XuiLabel10" +#define IDC_XuiLabelJukebox L"XuiLabelJukebox" +#define IDC_ChatScene L"ChatScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_chat.xui b/Minecraft.Client/Common/Media/xuiscene_chat.xui new file mode 100644 index 00000000..b6eb89b3 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_chat.xui @@ -0,0 +1,226 @@ + + +1280.000000 +720.000000 + + + +ChatScene +1280.000000 +720.000000 +true +CScene_Chat +XuiBlankScene + + + +XuiBack1 +1280.000000 +35.000000 +0.000000,472.000000,0.000000 +0.000000 +XuiLabelChatBackground + + + + +XuiLabel1 +1280.000000 +35.000000 +0.000000,472.000000,0.000000 +0.000000 +XuiLabelChat + + + + +XuiBack2 +1280.000000 +35.000000 +0.000000,437.000000,0.000000 +0.000000 +XuiLabelChatBackground + + + + +XuiLabel2 +1280.000000 +35.000000 +0.000000,437.000000,0.000000 +0.000000 +XuiLabelChat + + + + +XuiBack3 +1280.000000 +35.000000 +0.000000,402.000000,0.000000 +0.000000 +XuiLabelChatBackground + + + + +XuiLabel3 +1280.000000 +35.000000 +0.000000,402.000000,0.000000 +0.000000 +XuiLabelChat + + + + +XuiBack4 +1280.000000 +35.000000 +0.000000,367.000000,0.000000 +0.000000 +XuiLabelChatBackground + + + + +XuiLabel4 +1280.000000 +35.000000 +0.000000,367.000000,0.000000 +0.000000 +XuiLabelChat + + + + +XuiBack5 +1280.000000 +35.000000 +0.000000,332.000000,0.000000 +0.000000 +XuiLabelChatBackground + + + + +XuiLabel5 +1280.000000 +35.000000 +0.000000,332.000000,0.000000 +0.000000 +XuiLabelChat + + + + +XuiBack6 +1280.000000 +35.000000 +0.000000,297.000000,0.000000 +0.000000 +XuiLabelChatBackground + + + + +XuiLabel6 +1280.000000 +35.000000 +0.000000,297.000000,0.000000 +0.000000 +XuiLabelChat + + + + +XuiBack7 +1280.000000 +35.000000 +0.000000,262.000000,0.000000 +0.000000 +XuiLabelChatBackground + + + + +XuiLabel7 +1280.000000 +35.000000 +0.000000,262.000000,0.000000 +0.000000 +XuiLabelChat + + + + +XuiBack8 +1280.000000 +35.000000 +0.000000,227.000000,0.000000 +0.000000 +XuiLabelChatBackground + + + + +XuiLabel8 +1280.000000 +35.000000 +0.000000,227.000000,0.000000 +0.000000 +XuiLabelChat + + + + +XuiBack9 +1280.000000 +35.000000 +0.000000,192.000000,0.000000 +0.000000 +XuiLabelChatBackground + + + + +XuiLabel9 +1280.000000 +35.000000 +0.000000,192.000000,0.000000 +0.000000 +XuiLabelChat + + + + +XuiBack10 +1280.000000 +35.000000 +0.000000,157.000000,0.000000 +0.000000 +XuiLabelChatBackground + + + + +XuiLabel10 +1280.000000 +35.000000 +0.000000,157.000000,0.000000 +0.000000 +XuiLabelChat + + + + +XuiLabelJukebox +640.000000 +35.000000 +320.000031,472.000000,0.000000 +0.000000 +XuiLabelListening + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_chat_480.h b/Minecraft.Client/Common/Media/xuiscene_chat_480.h new file mode 100644 index 00000000..67566e0e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_chat_480.h @@ -0,0 +1,22 @@ +#define IDC_XuiBack1 L"XuiBack1" +#define IDC_XuiLabel1 L"XuiLabel1" +#define IDC_XuiBack2 L"XuiBack2" +#define IDC_XuiLabel2 L"XuiLabel2" +#define IDC_XuiBack3 L"XuiBack3" +#define IDC_XuiLabel3 L"XuiLabel3" +#define IDC_XuiBack4 L"XuiBack4" +#define IDC_XuiLabel4 L"XuiLabel4" +#define IDC_XuiBack5 L"XuiBack5" +#define IDC_XuiLabel5 L"XuiLabel5" +#define IDC_XuiBack6 L"XuiBack6" +#define IDC_XuiLabel6 L"XuiLabel6" +#define IDC_XuiBack7 L"XuiBack7" +#define IDC_XuiLabel7 L"XuiLabel7" +#define IDC_XuiBack8 L"XuiBack8" +#define IDC_XuiLabel8 L"XuiLabel8" +#define IDC_XuiBack9 L"XuiBack9" +#define IDC_XuiLabel9 L"XuiLabel9" +#define IDC_XuiBack10 L"XuiBack10" +#define IDC_XuiLabel10 L"XuiLabel10" +#define IDC_XuiLabelJukebox L"XuiLabelJukebox" +#define IDC_ChatScene L"ChatScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_chat_480.xui b/Minecraft.Client/Common/Media/xuiscene_chat_480.xui new file mode 100644 index 00000000..6c68039a --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_chat_480.xui @@ -0,0 +1,247 @@ + + +640.000000 +480.000000 + + + +ChatScene +640.000000 +480.000000 +true +CScene_Chat +XuiBlankScene + + + +XuiBack1 +640.000000 +20.000000 +0.000000,325.000000,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel1 +640.000000 +20.000000 +0.000000,325.000000,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack2 +640.000000 +20.000000 +0.000000,305.000000,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel2 +640.000000 +20.000000 +0.000000,305.000000,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack3 +640.000000 +20.000000 +0.000000,285.000000,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel3 +640.000000 +20.000000 +0.000000,285.000000,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack4 +640.000000 +20.000000 +0.000000,265.000000,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel4 +640.000000 +20.000000 +0.000000,265.000000,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack5 +640.000000 +20.000000 +0.000000,245.000000,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel5 +640.000000 +20.000000 +0.000000,245.000000,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack6 +640.000000 +20.000000 +0.000000,225.000000,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel6 +640.000000 +20.000000 +0.000000,225.000000,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack7 +640.000000 +20.000000 +0.000000,205.000015,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel7 +640.000000 +20.000000 +0.000000,205.000015,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack8 +640.000000 +20.000000 +0.000000,185.000015,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel8 +640.000000 +20.000000 +0.000000,185.000015,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack9 +640.000000 +20.000000 +0.000000,165.000015,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel9 +640.000000 +20.000000 +0.000000,165.000015,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack10 +640.000000 +20.000000 +0.000000,145.000015,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel10 +640.000000 +20.000000 +0.000000,145.000015,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiLabelJukebox +640.000000 +20.000000 +0.000031,325.000000,0.000000 +0.000000 +5 +XuiLabelListening_Small + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_chat_small.h b/Minecraft.Client/Common/Media/xuiscene_chat_small.h new file mode 100644 index 00000000..67566e0e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_chat_small.h @@ -0,0 +1,22 @@ +#define IDC_XuiBack1 L"XuiBack1" +#define IDC_XuiLabel1 L"XuiLabel1" +#define IDC_XuiBack2 L"XuiBack2" +#define IDC_XuiLabel2 L"XuiLabel2" +#define IDC_XuiBack3 L"XuiBack3" +#define IDC_XuiLabel3 L"XuiLabel3" +#define IDC_XuiBack4 L"XuiBack4" +#define IDC_XuiLabel4 L"XuiLabel4" +#define IDC_XuiBack5 L"XuiBack5" +#define IDC_XuiLabel5 L"XuiLabel5" +#define IDC_XuiBack6 L"XuiBack6" +#define IDC_XuiLabel6 L"XuiLabel6" +#define IDC_XuiBack7 L"XuiBack7" +#define IDC_XuiLabel7 L"XuiLabel7" +#define IDC_XuiBack8 L"XuiBack8" +#define IDC_XuiLabel8 L"XuiLabel8" +#define IDC_XuiBack9 L"XuiBack9" +#define IDC_XuiLabel9 L"XuiLabel9" +#define IDC_XuiBack10 L"XuiBack10" +#define IDC_XuiLabel10 L"XuiLabel10" +#define IDC_XuiLabelJukebox L"XuiLabelJukebox" +#define IDC_ChatScene L"ChatScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_chat_small.xui b/Minecraft.Client/Common/Media/xuiscene_chat_small.xui new file mode 100644 index 00000000..3869e189 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_chat_small.xui @@ -0,0 +1,247 @@ + + +640.000000 +360.000000 + + + +ChatScene +640.000000 +360.000000 +true +CScene_Chat +XuiBlankScene + + + +XuiBack1 +640.000000 +20.000000 +0.000000,215.000000,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel1 +640.000000 +20.000000 +0.000000,215.000000,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack2 +640.000000 +20.000000 +0.000000,195.000000,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel2 +640.000000 +20.000000 +0.000000,195.000000,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack3 +640.000000 +20.000000 +0.000000,175.000000,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel3 +640.000000 +20.000000 +0.000000,175.000000,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack4 +640.000000 +20.000000 +0.000000,155.000000,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel4 +640.000000 +20.000000 +0.000000,155.000000,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack5 +640.000000 +20.000000 +0.000000,135.000000,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel5 +640.000000 +20.000000 +0.000000,135.000000,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack6 +640.000000 +20.000000 +0.000000,115.000008,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel6 +640.000000 +20.000000 +0.000000,115.000008,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack7 +640.000000 +20.000000 +0.000000,95.000008,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel7 +640.000000 +20.000000 +0.000000,95.000008,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack8 +640.000000 +20.000000 +0.000000,75.000008,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel8 +640.000000 +20.000000 +0.000000,75.000008,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack9 +640.000000 +20.000000 +0.000000,55.000008,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel9 +640.000000 +20.000000 +0.000000,55.000008,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiBack10 +640.000000 +20.000000 +0.000000,35.000008,0.000000 +0.000000 +5 +XuiLabelChatBackground + + + + +XuiLabel10 +640.000000 +20.000000 +0.000000,35.000008,0.000000 +0.000000 +5 +XuiLabelChat_Small + + + + +XuiLabelJukebox +640.000000 +20.000000 +0.000031,215.000000,0.000000 +0.000000 +5 +XuiLabelListening_Small + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_connectingprogress.h b/Minecraft.Client/Common/Media/xuiscene_connectingprogress.h new file mode 100644 index 00000000..0dc7f5dd --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_connectingprogress.h @@ -0,0 +1,22 @@ +#define IDC_Status L"Status" +#define IDC_Title L"Title" +#define IDC_Progress L"Progress" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_ButtonConfirm L"ButtonConfirm" +#define IDC_ConnectingProgressScene L"ConnectingProgressScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_connectingprogress.xui b/Minecraft.Client/Common/Media/xuiscene_connectingprogress.xui new file mode 100644 index 00000000..a8efa1e9 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_connectingprogress.xui @@ -0,0 +1,923 @@ + + +1280.000000 +720.000000 + + + +ConnectingProgressScene +1280.000000 +720.000000 +CScene_ConnectingProgress +XuiMenuScene +ButtonConfirm + + + +Status +383.000000 +26.000000 +319.000000,360.000000,0.000000 +XuiLabel + + + + +Title +700.000000 +100.000000 +290.000061,250.000000,0.000000 +XuiTitle + + + + +Progress +640.000000 +15.000000 +320.000000,390.000000,0.000000 +false +CXuiCtrlLoadingProgress +LoadingProgressState +50 + + + + +Timer +183.000000 +169.000000 +548.500061,330.000000,0.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + +ButtonConfirm +320.000000 +50.000000 +480.000031,530.000000,0.000000 +false + + + + + +Normal + + + +EndNormal + +gotoandplay +Normal + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_connectingprogress_480.h b/Minecraft.Client/Common/Media/xuiscene_connectingprogress_480.h new file mode 100644 index 00000000..bbaa077c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_connectingprogress_480.h @@ -0,0 +1,22 @@ +#define IDC_Status L"Status" +#define IDC_Title L"Title" +#define IDC_Progress L"Progress" +#define IDC_ButtonConfirm L"ButtonConfirm" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_ConnectingProgressScene L"ConnectingProgressScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_connectingprogress_480.xui b/Minecraft.Client/Common/Media/xuiscene_connectingprogress_480.xui new file mode 100644 index 00000000..8ae84411 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_connectingprogress_480.xui @@ -0,0 +1,923 @@ + + +640.000000 +480.000000 + + + +ConnectingProgressScene +640.000000 +480.000000 +CScene_ConnectingProgress +XuiMenuScene +ButtonConfirm + + + +Status +383.000000 +26.000000 +70.000000,232.666656,0.000000 +XuiLabel + + + + +Title +500.000000 +50.000000 +70.000015,130.000000,0.000000 +XuiTitleSmall + + + + +Progress +500.000000 +15.000000 +70.000046,259.000000,0.000000 +false +CXuiCtrlLoadingProgress +LoadingProgressState +50 + + + + +ButtonConfirm +160.000000 +36.000000 +240.000000,348.000000,0.000000 +false + + + + +Timer +72.000000 +72.000000 +284.000000,177.000000,0.000000 +15 +false +XuiBlankScene + + + +Timer_Square_1 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + + +Normal + + + +EndNormal + +gotoandplay +Normal + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_connectingprogress_small.h b/Minecraft.Client/Common/Media/xuiscene_connectingprogress_small.h new file mode 100644 index 00000000..0dc7f5dd --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_connectingprogress_small.h @@ -0,0 +1,22 @@ +#define IDC_Status L"Status" +#define IDC_Title L"Title" +#define IDC_Progress L"Progress" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_ButtonConfirm L"ButtonConfirm" +#define IDC_ConnectingProgressScene L"ConnectingProgressScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_connectingprogress_small.xui b/Minecraft.Client/Common/Media/xuiscene_connectingprogress_small.xui new file mode 100644 index 00000000..3b71d539 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_connectingprogress_small.xui @@ -0,0 +1,923 @@ + + +640.000000 +360.000000 + + + +ConnectingProgressScene +640.000000 +360.000000 +CScene_ConnectingProgress +XuiMenuScene +ButtonConfirm + + + +Status +383.000000 +26.000000 +70.000000,194.666656,0.000000 +XuiLabel + + + + +Title +500.000000 +50.000000 +70.000015,120.000000,0.000000 +XuiTitleSmall + + + + +Progress +500.000000 +15.000000 +70.000046,221.000000,0.000000 +false +CXuiCtrlLoadingProgress +LoadingProgressState +50 + + + + +Timer +91.000000 +84.000000 +275.000000,174.000000,0.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +-29.999992,-9.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +24.499992,-9.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +79.000008,-9.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +79.000008,46.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +79.000008,101.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +24.499992,101.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +-29.999992,101.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +-29.999992,46.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +-29.999992,-9.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +24.499992,-9.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +79.000008,-9.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +79.000008,46.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +79.000008,101.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +24.499992,101.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +-29.999992,101.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +-29.999992,46.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + +ButtonConfirm +160.000000 +25.000000 +240.000000,267.000000,0.000000 +false + + + + + +Normal + + + +EndNormal + +gotoandplay +Normal + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_container.h b/Minecraft.Client/Common/Media/xuiscene_container.h new file mode 100644 index 00000000..1316672e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_container.h @@ -0,0 +1,65 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Container L"Container" +#define IDC_InventoryText L"InventoryText" +#define IDC_ChestText L"ChestText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneContainer L"XuiSceneContainer" diff --git a/Minecraft.Client/Common/Media/xuiscene_container.xui b/Minecraft.Client/Common/Media/xuiscene_container.xui new file mode 100644 index 00000000..7e6230e8 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_container.xui @@ -0,0 +1,961 @@ + + +1280.000000 +720.000000 + + + +XuiSceneContainer +1280.000000 +720.000000 +15 +CXuiSceneContainer +XuiBlankScene +Pointer + + + +Group +430.000000 +415.000000 +425.000000,138.000000,0.000000 +15 +XuiScene +Pointer + + + +Inventory +382.000000 +150.000000 +25.000000,212.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +UseRow +381.000000 +50.000000 +25.000000,352.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +Container +383.000000 +128.000015 +25.000000,50.000000,0.000000 +10 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +InventoryText +340.000000 +32.000000 +26.000000,182.000000,0.000000 +12 +LabelContainerSceneLeft + + + + +ChestText +340.000000 +26.000000 +26.000000,17.000000,0.000000 +LabelContainerSceneLeft + + + + +Pointer +42.000000 +42.000000 +-185.000000,-80.000015,0.000000 +9 +CXuiCtrlSlotItem +ItemPointer + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +425.000000,138.000000,0.000000 + + + +0 +425.000000,138.000000,0.000000 + + + +2 +100 +-100 +50 +425.000000,138.000000,0.000000 + + + +0 +160.000000,138.000000,0.000000 + + + +2 +100 +-100 +50 +160.000000,138.000000,0.000000 + + + +0 +425.000000,138.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_container_480.h b/Minecraft.Client/Common/Media/xuiscene_container_480.h new file mode 100644 index 00000000..7ba593b0 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_container_480.h @@ -0,0 +1,119 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Container L"Container" +#define IDC_InventoryText L"InventoryText" +#define IDC_ChestText L"ChestText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneContainer L"XuiSceneContainer" diff --git a/Minecraft.Client/Common/Media/xuiscene_container_480.xui b/Minecraft.Client/Common/Media/xuiscene_container_480.xui new file mode 100644 index 00000000..f7ce2cb1 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_container_480.xui @@ -0,0 +1,1610 @@ + + +640.000000 +480.000000 + + + +XuiSceneContainer +640.000000 +480.000000 +15 +CXuiSceneContainer +XuiBlankScene +Pointer + + + +Group +258.000000 +260.000000 +191.000000,110.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Inventory +234.000000 +78.000000 +12.000000,132.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +234.000000 +26.000000 +12.000000,222.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +Container +234.000000 +78.000000 +12.000000,30.000000,0.000000 +10 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +InventoryText +234.000000 +22.000000 +12.000000,110.000000,0.000000 +12 +LabelContainerSceneLeftSmall + + + + +ChestText +234.000000 +22.000000 +12.000000,8.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +Pointer +26.000000 +26.000000 +-50.000000,-50.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +191.000000,110.000000,0.000000 + + + +0 +191.000000,110.000000,0.000000 + + + +2 +100 +-100 +50 +191.000000,110.000000,0.000000 + + + +0 +33.750000,110.000000,0.000000 + + + +2 +100 +-100 +50 +60.000000,110.000000,0.000000 + + + +0 +191.000000,110.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_container_large_480.h b/Minecraft.Client/Common/Media/xuiscene_container_large_480.h new file mode 100644 index 00000000..6d8258f8 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_container_large_480.h @@ -0,0 +1,173 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Container L"Container" +#define IDC_InventoryText L"InventoryText" +#define IDC_ChestText L"ChestText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneContainer L"XuiSceneContainer" diff --git a/Minecraft.Client/Common/Media/xuiscene_container_large_480.xui b/Minecraft.Client/Common/Media/xuiscene_container_large_480.xui new file mode 100644 index 00000000..89c28558 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_container_large_480.xui @@ -0,0 +1,2474 @@ + + +640.000000 +480.000000 + + + +XuiSceneContainer +640.000000 +480.000000 +15 +CXuiSceneContainer +XuiBlankScene +Pointer + + + +Group +238.000000 +240.000000 +201.000000,80.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Inventory +216.000000 +72.000000 +12.000000,126.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical24 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + + +UseRow +216.000000 +24.000000 +12.000000,206.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical24 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + + +Container +216.000000 +78.000000 +12.000000,28.000000,0.000000 +10 +CXuiCtrlSlotList +ItemGridVertical24 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + +control_ListItem +24.000000 +24.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton24 +22594 +4 + + + + + +InventoryText +210.000000 +22.000000 +13.000000,104.000000,0.000000 +12 +LabelContainerSceneLeftSmall + + + + +ChestText +210.000000 +20.000000 +12.000000,8.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +Pointer +26.000000 +26.000000 +-50.000000,-114.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +201.000000,80.000000,0.000000 + + + +0 +201.000000,80.000000,0.000000 + + + +2 +100 +-100 +50 +201.000000,80.000000,0.000000 + + + +0 +33.750000,80.000000,0.000000 + + + +2 +100 +-100 +50 +60.000000,80.000000,0.000000 + + + +0 +201.000000,80.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_container_large_Small.h b/Minecraft.Client/Common/Media/xuiscene_container_large_Small.h new file mode 100644 index 00000000..1316672e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_container_large_Small.h @@ -0,0 +1,65 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Container L"Container" +#define IDC_InventoryText L"InventoryText" +#define IDC_ChestText L"ChestText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneContainer L"XuiSceneContainer" diff --git a/Minecraft.Client/Common/Media/xuiscene_container_large_Small.xui b/Minecraft.Client/Common/Media/xuiscene_container_large_Small.xui new file mode 100644 index 00000000..daa12031 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_container_large_Small.xui @@ -0,0 +1,962 @@ + + +640.000000 +360.000000 + + + +XuiSceneContainer +640.000000 +360.000000 +15 +CXuiSceneContainer +XuiBlankScene +Pointer + + + +Group +222.000000 +228.000000 +201.000000,34.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Inventory +216.000000 +72.000000 +12.000000,118.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + +UseRow +216.000000 +22.000000 +12.000000,197.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + +Container +216.000000 +72.000000 +12.000000,33.000000,0.000000 +10 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + +InventoryText +195.000000 +22.000000 +12.000000,100.000000,0.000000 +12 +LabelContainerSceneLeftSmall + + + + +ChestText +198.000000 +20.000000 +12.000000,11.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +Pointer +22.000000 +22.000000 +-50.000000,-77.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +201.000000,34.000000,0.000000 + + + +0 +201.000000,34.000000,0.000000 + + + +2 +100 +-100 +50 +201.000000,34.000000,0.000000 + + + +0 +64.000000,34.000000,0.000000 + + + +2 +100 +-100 +50 +92.000000,34.000000,0.000000 + + + +0 +201.000000,34.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_container_small.h b/Minecraft.Client/Common/Media/xuiscene_container_small.h new file mode 100644 index 00000000..1316672e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_container_small.h @@ -0,0 +1,65 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Container L"Container" +#define IDC_InventoryText L"InventoryText" +#define IDC_ChestText L"ChestText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneContainer L"XuiSceneContainer" diff --git a/Minecraft.Client/Common/Media/xuiscene_container_small.xui b/Minecraft.Client/Common/Media/xuiscene_container_small.xui new file mode 100644 index 00000000..8a837956 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_container_small.xui @@ -0,0 +1,907 @@ + + +640.000000 +360.000000 + + + +XuiSceneContainer +640.000000 +360.000000 +15 +CXuiSceneContainer +XuiBlankScene +Pointer + + + +Group +258.000000 +260.000000 +190.000000,2.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Inventory +234.000000 +80.000000 +12.000000,132.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +234.000000 +12.000000,222.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +Container +234.000000 +85.000000 +12.000000,30.000000,0.000000 +10 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +InventoryText +234.000000 +22.000000 +12.000000,110.000000,0.000000 +12 +LabelContainerSceneLeftSmall + + + + +ChestText +234.000000 +22.000000 +12.000000,8.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +Pointer +26.000000 +26.000000 +-50.000000,-45.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000000,2.000000,0.000000 + + + +0 +190.000000,2.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,2.000000,0.000000 + + + +0 +64.000000,2.000000,0.000000 + + + +2 +100 +-100 +50 +92.000000,2.000000,0.000000 + + + +0 +190.000000,2.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_controls.h b/Minecraft.Client/Common/Media/xuiscene_controls.h new file mode 100644 index 00000000..f86df2ae --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_controls.h @@ -0,0 +1,65 @@ +#define IDC_Controller L"Controller" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_SchemeList L"SchemeList" +#define IDC_InvertLook L"InvertLook" +#define IDC_SouthPaw L"SouthPaw" +#define IDC_FigDpad L"FigDpad" +#define IDC_Dpad L"Dpad" +#define IDC_FigDpadL L"FigDpadL" +#define IDC_DpadL L"DpadL" +#define IDC_FigDpadR L"FigDpadR" +#define IDC_DpadR L"DpadR" +#define IDC_FigLT L"FigLT" +#define IDC_LT L"LT" +#define IDC_FigRT L"FigRT" +#define IDC_RT L"RT" +#define IDC_FigLStick L"FigLStick" +#define IDC_LStick L"LStick" +#define IDC_FigRStick L"FigRStick" +#define IDC_RStick L"RStick" +#define IDC_FigLStickButton L"FigLStickButton" +#define IDC_LStickButton L"LStickButton" +#define IDC_FigRStickButton L"FigRStickButton" +#define IDC_RStickButton L"RStickButton" +#define IDC_FigLB L"FigLB" +#define IDC_LB L"LB" +#define IDC_FigRB L"FigRB" +#define IDC_RB L"RB" +#define IDC_FigBack L"FigBack" +#define IDC_Back L"Back" +#define IDC_FigStart L"FigStart" +#define IDC_Start L"Start" +#define IDC_FigY L"FigY" +#define IDC_Y L"Y" +#define IDC_FigX L"FigX" +#define IDC_X L"X" +#define IDC_FigB L"FigB" +#define IDC_B L"B" +#define IDC_FigA L"FigA" +#define IDC_A L"A" +#define IDC_FigGroup L"FigGroup" +#define IDC_CurrentLayout L"CurrentLayout" +#define IDC_XuiBuildVer L"XuiBuildVer" +#define IDC_XuiLabel1 L"XuiLabel1" +#define IDC_XuiLabel2 L"XuiLabel2" +#define IDC_XuiLabel3 L"XuiLabel3" +#define IDC_XuiLabel4 L"XuiLabel4" +#define IDC_XuiLabel5 L"XuiLabel5" +#define IDC_XuiLabel6 L"XuiLabel6" +#define IDC_XuiLabel7 L"XuiLabel7" +#define IDC_XuiLabel8 L"XuiLabel8" +#define IDC_XuiLabel9 L"XuiLabel9" +#define IDC_XuiLabel10 L"XuiLabel10" +#define IDC_XuiLabel11 L"XuiLabel11" +#define IDC_XuiLabel12 L"XuiLabel12" +#define IDC_XuiLabel13 L"XuiLabel13" +#define IDC_XuiLabel14 L"XuiLabel14" +#define IDC_XuiLabel15 L"XuiLabel15" +#define IDC_XuiLabel16 L"XuiLabel16" +#define IDC_XuiLabel17 L"XuiLabel17" +#define IDC_SceneControls L"SceneControls" diff --git a/Minecraft.Client/Common/Media/xuiscene_controls.xui b/Minecraft.Client/Common/Media/xuiscene_controls.xui new file mode 100644 index 00000000..734f8718 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_controls.xui @@ -0,0 +1,1272 @@ + + +1280.000000 +720.000000 + + + +SceneControls +1280.000000 +720.000000 +CScene_Controls +XuiMenuScene +SchemeList + + + +Controller +400.000000 +270.000000 +448.000000,338.000000,0.000000 +ControllerGraphic + + + + +SchemeList +480.000000 +128.000000 +400.000031,194.000000,0.000000 +CXuiCtrl4JList +XuiLayoutList +InvertLook + + + +control_ListItem +100.000000 +20.000000 +16.000000,32.000000,0.000000 +5 +false + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +140.000000 +40.000000 +20.000000,40.000000,0.000000 +5 +false +XuiLayoutListButton +1 +140.000000,40.000000,0.000000 +10.000000,0.000000,0.000000 + + + + +control_ListItem +140.000000 +40.000000 +20.000000,40.000000,0.000000 +5 +false +XuiLayoutListButton +1 +140.000000,40.000000,0.000000 +10.000000,0.000000,0.000000 + + + + +control_ListItem +140.000000 +40.000000 +20.000000,40.000000,0.000000 +5 +false +XuiLayoutListButton +1 +140.000000,40.000000,0.000000 +10.000000,0.000000,0.000000 + + + + +control_ListItem +140.000000 +40.000000 +20.000000,40.000000,0.000000 +5 +false +XuiLayoutListButton +1 +140.000000,40.000000,0.000000 +10.000000,0.000000,0.000000 + + + + + +InvertLook +216.000000 +32.000000 +420.000031,282.000000,0.000000 +5 +XuiCheckbox +SouthPaw +SouthPaw +SchemeList +22528 + + + + +SouthPaw +215.000000 +32.000000 +644.000000,282.000000,0.000000 +5 +XuiCheckbox +InvertLook +InvertLook +SchemeList +22528 + + + + +FigGroup +1280.000000 +720.000000 +48 + + + +Dpad +1280.000000 +720.000000 +48 + + + +FigDpad +155.000000 +4.000000 +432.000000,606.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +4.000000 +85.000000 +584.000000,525.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +DpadL +1280.000000 +720.000000 +48 + + + +4.000000 +102.000000 +599.000000,522.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigDpadL +170.000000 +4.000000 +432.000000,620.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +DpadR +1280.000000 +720.000000 +48 + + + +FigDpadR +140.000000 +4.000000 +432.000000,590.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +4.000000 +72.000000 +569.000000,522.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +LT +1280.000000 +720.000000 +48 + + + +FigLT +110.000000 +4.000000 +432.000000,370.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +RT +1280.000000 +720.000000 +48 + + + +FigRT +112.000000 +4.000000 +738.000000,370.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +LStick +1280.000000 +720.000000 +48 + + + +4.000000 +533.000000,470.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigLStick +105.000000 +4.000000 +432.000000,496.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +RStick +1280.000000 +720.000000 +48 + + + +4.000000 +65.000000 +690.000000,529.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigRStick +160.000000 +4.000000 +690.000000,590.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +LStickButton +1280.000000 +720.000000 +48 + + + +4.000000 +533.000000,500.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigLStickButton +105.000000 +4.000000 +432.000000,526.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +RStickButton +1280.000000 +720.000000 +48 + + + +4.000000 +690.000000,594.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigRStickButton +160.000000 +4.000000 +690.000000,620.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +LB +1280.000000 +720.000000 +48 + + + +FigLB +100.000000 +4.000000 +432.000000,399.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +RB +1280.000000 +720.000000 +48 + + + +FigRB +100.000000 +4.000000 +750.000000,399.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +Back +1280.000000 +720.000000 +48 + + + +4.000000 +130.000000 +599.000000,341.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigBack +170.000000 +4.000000 +432.000000,341.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +Start +1280.000000 +720.000000 +48 + + + +4.000000 +130.000000 +677.000000,341.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigStart +173.000000 +4.000000 +677.000000,341.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +Y +1280.000000 +720.000000 +48 + + + +FigY +100.000000 +4.000000 +750.000000,436.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +X +1280.000000 +720.000000 +48 + + + +FigX +131.000000 +4.000000 +719.000000,526.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +4.000000 +63.000000 +719.000000,466.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +B +1280.000000 +720.000000 +48 + + + +FigB +70.000000 +4.000000 +780.000000,466.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +A +1280.000000 +720.000000 +48 + + + +FigA +100.000000 +4.000000 +750.000000,496.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +XuiText1 +421.000000 +86.583344 +433.000000,256.416656,0.000000 +true +The names of these groups and the Fig name inside them is used in the code for placement - don't change the names! +0xff0f0f0f +0x800f0f0f +0 + + + + + +CurrentLayout +460.000000 +22.000000 +410.000031,206.000000,0.000000 +XuiLabelDarkCentred + + + + +XuiBuildVer +238.000000 +28.000000 +93.000000,616.000000,0.000000 +XuiLabelDark + + + + +2.000000 +408.000000 +850.000000,236.000000,0.000000 +true + + +0xff0f0f80 + + + + +0xff0f0f0f +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,112.000000,0.000000,0,112.000000,0.000000,112.000000,0.000000,112.000000,408.000000,0,112.000000,408.000000,112.000000,408.000000,0.000000,408.000000,0,0.000000,408.000000,0.000000,408.000000,0.000000,0.000000,0, + + + + +2.000000 +408.000000 +430.000000,236.000000,0.000000 +true + + +0xff0f0f80 + + + + +0xff0f0f0f +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,112.000000,0.000000,0,112.000000,0.000000,112.000000,0.000000,112.000000,408.000000,0,112.000000,408.000000,112.000000,408.000000,0.000000,408.000000,0,0.000000,408.000000,0.000000,408.000000,0.000000,0.000000,0, + + + + +XuiLabel1 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel2 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel3 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel4 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel5 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel6 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel7 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel8 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel9 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel10 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel11 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel12 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel13 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel14 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel15 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel16 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + +XuiLabel17 +109.000000 +36.000000 +228.000000,232.000000,0.000000 +false +LabelControlsSceneAction + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_controls_480.h b/Minecraft.Client/Common/Media/xuiscene_controls_480.h new file mode 100644 index 00000000..c7f69bde --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_controls_480.h @@ -0,0 +1,67 @@ +#define IDC_Controller L"Controller" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_SchemeList L"SchemeList" +#define IDC_InvertLook L"InvertLook" +#define IDC_SouthPaw L"SouthPaw" +#define IDC_FigDpad L"FigDpad" +#define IDC_Dpad L"Dpad" +#define IDC_FigDpadL L"FigDpadL" +#define IDC_DpadL L"DpadL" +#define IDC_FigDpadR L"FigDpadR" +#define IDC_DpadR L"DpadR" +#define IDC_FigLT L"FigLT" +#define IDC_LT L"LT" +#define IDC_FigRT L"FigRT" +#define IDC_RT L"RT" +#define IDC_FigLStick L"FigLStick" +#define IDC_LStick L"LStick" +#define IDC_FigRStick L"FigRStick" +#define IDC_RStick L"RStick" +#define IDC_FigLStickButton L"FigLStickButton" +#define IDC_LStickButton L"LStickButton" +#define IDC_FigRStickButton L"FigRStickButton" +#define IDC_RStickButton L"RStickButton" +#define IDC_FigLB L"FigLB" +#define IDC_LB L"LB" +#define IDC_FigRB L"FigRB" +#define IDC_RB L"RB" +#define IDC_FigBack L"FigBack" +#define IDC_Back L"Back" +#define IDC_FigStart L"FigStart" +#define IDC_Start L"Start" +#define IDC_FigY L"FigY" +#define IDC_Y L"Y" +#define IDC_FigX L"FigX" +#define IDC_X L"X" +#define IDC_FigB L"FigB" +#define IDC_B L"B" +#define IDC_FigA L"FigA" +#define IDC_A L"A" +#define IDC_FigGroup L"FigGroup" +#define IDC_CurrentLayout L"CurrentLayout" +#define IDC_XuiBuildVer L"XuiBuildVer" +#define IDC_XuiLabel1 L"XuiLabel1" +#define IDC_XuiLabel2 L"XuiLabel2" +#define IDC_XuiLabel3 L"XuiLabel3" +#define IDC_XuiLabel4 L"XuiLabel4" +#define IDC_XuiLabel5 L"XuiLabel5" +#define IDC_XuiLabel6 L"XuiLabel6" +#define IDC_XuiLabel7 L"XuiLabel7" +#define IDC_XuiLabel8 L"XuiLabel8" +#define IDC_XuiLabel9 L"XuiLabel9" +#define IDC_XuiLabel10 L"XuiLabel10" +#define IDC_XuiLabel11 L"XuiLabel11" +#define IDC_XuiLabel12 L"XuiLabel12" +#define IDC_XuiLabel13 L"XuiLabel13" +#define IDC_XuiLabel14 L"XuiLabel14" +#define IDC_XuiLabel15 L"XuiLabel15" +#define IDC_XuiLabel16 L"XuiLabel16" +#define IDC_XuiLabel17 L"XuiLabel17" +#define IDC_SceneControls L"SceneControls" diff --git a/Minecraft.Client/Common/Media/xuiscene_controls_480.xui b/Minecraft.Client/Common/Media/xuiscene_controls_480.xui new file mode 100644 index 00000000..d34f10ac --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_controls_480.xui @@ -0,0 +1,1254 @@ + + +640.000000 +480.000000 + + + +SceneControls +640.000000 +480.000000 +CScene_Controls +XuiMenuScene +SchemeList + + + +Controller +400.000000 +270.000000 +224.000000,249.000000,0.000000 +0.500000,0.500000,1.000000 +ControllerGraphic + + + + +SchemeList +366.000000 +90.000000 +137.000000,136.000000,0.000000 +CXuiCtrl4JList +XuiLayoutListSmall +InvertLook + + + +control_ListItem +100.000000 +20.000000 +16.000000,32.000000,0.000000 +5 +false + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +84.000000 +24.000000 +40.000000,30.000000,0.000000 +5 +false +XuiLayoutListButtonSmall +1 +84.000000,24.000000,0.000000 +17.000000,0.000000,0.000000 + + + + +control_ListItem +84.000000 +24.000000 +40.000000,30.000000,0.000000 +5 +false +XuiLayoutListButtonSmall +1 +84.000000,24.000000,0.000000 +17.000000,0.000000,0.000000 + + + + +control_ListItem +84.000000 +24.000000 +40.000000,30.000000,0.000000 +5 +false +XuiLayoutListButtonSmall +1 +84.000000,24.000000,0.000000 +17.000000,0.000000,0.000000 + + + + +control_ListItem +84.000000 +24.000000 +40.000000,30.000000,0.000000 +5 +false +XuiLayoutListButtonSmall +1 +84.000000,24.000000,0.000000 +17.000000,0.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + + +InvertLook +156.000000 +20.000000 +156.999969,195.000000,0.000000 +XuiCheckboxSmall +SouthPaw +SouthPaw +SchemeList +22528 + + + + +SouthPaw +156.000000 +20.000000 +324.000000,195.000000,0.000000 +XuiCheckboxSmall +InvertLook +InvertLook +SchemeList +22528 + + + + +FigGroup +1280.000000 +720.000000 +0.500000,0.500000,0.500000 +48 + + + +Dpad +1280.000000 +720.000000 +48 + + + +FigDpad +155.000000 +4.000000 +432.000000,766.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +4.000000 +85.000000 +584.000000,684.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +DpadL +1280.000000 +720.000000 +48 + + + +4.000000 +102.000000 +599.000000,682.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigDpadL +170.000000 +4.000000 +432.000000,780.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +DpadR +1280.000000 +720.000000 +48 + + + +FigDpadR +140.000000 +4.000000 +432.000000,750.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +4.000000 +72.000000 +569.000000,682.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +LT +1280.000000 +720.000000 +48 + + + +FigLT +110.000000 +4.000000 +432.000000,530.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +RT +1280.000000 +720.000000 +48 + + + +FigRT +112.000000 +4.000000 +738.000000,530.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +LStick +1280.000000 +720.000000 +48 + + + +4.000000 +533.000000,630.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigLStick +105.000000 +4.000000 +432.000000,656.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +RStick +1280.000000 +720.000000 +48 + + + +4.000000 +65.000000 +690.000000,689.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigRStick +160.000000 +4.000000 +690.000000,750.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +LStickButton +1280.000000 +720.000000 +48 + + + +4.000000 +533.000000,660.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigLStickButton +105.000000 +4.000000 +432.000000,686.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +RStickButton +1280.000000 +720.000000 +48 + + + +4.000000 +690.000000,754.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigRStickButton +160.000000 +4.000000 +690.000000,780.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +LB +1280.000000 +720.000000 +48 + + + +FigLB +100.000000 +4.000000 +432.000000,559.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +RB +1280.000000 +720.000000 +48 + + + +FigRB +100.000000 +4.000000 +750.000000,559.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +Back +1280.000000 +720.000000 +48 + + + +4.000000 +130.000000 +599.000000,501.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigBack +170.000000 +4.000000 +432.000000,501.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +Start +1280.000000 +720.000000 +48 + + + +4.000000 +130.000000 +677.000000,501.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigStart +173.000000 +4.000000 +677.000000,501.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +Y +1280.000000 +720.000000 +48 + + + +FigY +100.000000 +4.000000 +750.000000,596.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +X +1280.000000 +720.000000 +48 + + + +FigX +131.000000 +4.000000 +719.000000,686.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +4.000000 +63.000000 +719.000000,626.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +B +1280.000000 +720.000000 +48 + + + +FigB +70.000000 +4.000000 +780.000000,626.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +A +1280.000000 +720.000000 +48 + + + +FigA +100.000000 +4.000000 +750.000000,656.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +XuiText1 +421.000000 +86.583344 +429.500031,331.416656,0.000000 +true +The names of these groups and the Fig name inside them is used in the code for placement - don't change the names! +0xff0f0f0f +0x800f0f0f +0 + + + + + +CurrentLayout +344.000000 +20.000000 +148.000000,144.000000,0.000000 +XuiLabelDarkCentredSmall + + + + +XuiBuildVer +238.000000 +28.000000 +93.000000,398.000000,0.000000 +XuiLabelDarkSmall + + + + +XuiLabel1 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel2 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel3 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel4 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel5 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel6 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel7 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel8 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel9 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel10 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel11 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel12 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel13 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel14 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel15 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel16 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel17 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_controls_small.h b/Minecraft.Client/Common/Media/xuiscene_controls_small.h new file mode 100644 index 00000000..f86df2ae --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_controls_small.h @@ -0,0 +1,65 @@ +#define IDC_Controller L"Controller" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_SchemeList L"SchemeList" +#define IDC_InvertLook L"InvertLook" +#define IDC_SouthPaw L"SouthPaw" +#define IDC_FigDpad L"FigDpad" +#define IDC_Dpad L"Dpad" +#define IDC_FigDpadL L"FigDpadL" +#define IDC_DpadL L"DpadL" +#define IDC_FigDpadR L"FigDpadR" +#define IDC_DpadR L"DpadR" +#define IDC_FigLT L"FigLT" +#define IDC_LT L"LT" +#define IDC_FigRT L"FigRT" +#define IDC_RT L"RT" +#define IDC_FigLStick L"FigLStick" +#define IDC_LStick L"LStick" +#define IDC_FigRStick L"FigRStick" +#define IDC_RStick L"RStick" +#define IDC_FigLStickButton L"FigLStickButton" +#define IDC_LStickButton L"LStickButton" +#define IDC_FigRStickButton L"FigRStickButton" +#define IDC_RStickButton L"RStickButton" +#define IDC_FigLB L"FigLB" +#define IDC_LB L"LB" +#define IDC_FigRB L"FigRB" +#define IDC_RB L"RB" +#define IDC_FigBack L"FigBack" +#define IDC_Back L"Back" +#define IDC_FigStart L"FigStart" +#define IDC_Start L"Start" +#define IDC_FigY L"FigY" +#define IDC_Y L"Y" +#define IDC_FigX L"FigX" +#define IDC_X L"X" +#define IDC_FigB L"FigB" +#define IDC_B L"B" +#define IDC_FigA L"FigA" +#define IDC_A L"A" +#define IDC_FigGroup L"FigGroup" +#define IDC_CurrentLayout L"CurrentLayout" +#define IDC_XuiBuildVer L"XuiBuildVer" +#define IDC_XuiLabel1 L"XuiLabel1" +#define IDC_XuiLabel2 L"XuiLabel2" +#define IDC_XuiLabel3 L"XuiLabel3" +#define IDC_XuiLabel4 L"XuiLabel4" +#define IDC_XuiLabel5 L"XuiLabel5" +#define IDC_XuiLabel6 L"XuiLabel6" +#define IDC_XuiLabel7 L"XuiLabel7" +#define IDC_XuiLabel8 L"XuiLabel8" +#define IDC_XuiLabel9 L"XuiLabel9" +#define IDC_XuiLabel10 L"XuiLabel10" +#define IDC_XuiLabel11 L"XuiLabel11" +#define IDC_XuiLabel12 L"XuiLabel12" +#define IDC_XuiLabel13 L"XuiLabel13" +#define IDC_XuiLabel14 L"XuiLabel14" +#define IDC_XuiLabel15 L"XuiLabel15" +#define IDC_XuiLabel16 L"XuiLabel16" +#define IDC_XuiLabel17 L"XuiLabel17" +#define IDC_SceneControls L"SceneControls" diff --git a/Minecraft.Client/Common/Media/xuiscene_controls_small.xui b/Minecraft.Client/Common/Media/xuiscene_controls_small.xui new file mode 100644 index 00000000..2f4c968b --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_controls_small.xui @@ -0,0 +1,1230 @@ + + +640.000000 +360.000000 + + + +SceneControls +1280.000000 +720.000000 +CScene_Controls +XuiMenuScene +SchemeList + + + +Controller +400.000000 +270.000000 +224.000000,139.000000,0.000000 +0.500000,0.500000,1.000000 +ControllerGraphic + + + + +SchemeList +366.000000 +90.000000 +137.000000,35.000000,0.000000 +CXuiCtrl4JList +XuiLayoutListSmall +InvertLook + + + +control_ListItem +100.000000 +20.000000 +16.000000,32.000000,0.000000 +5 +false + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +84.000000 +24.000000 +40.000000,30.000000,0.000000 +5 +false +XuiLayoutListButtonSmall +1 +84.000000,24.000000,0.000000 +17.000000,0.000000,0.000000 + + + + +control_ListItem +84.000000 +24.000000 +40.000000,30.000000,0.000000 +5 +false +XuiLayoutListButtonSmall +1 +84.000000,24.000000,0.000000 +17.000000,0.000000,0.000000 + + + + +control_ListItem +84.000000 +24.000000 +40.000000,30.000000,0.000000 +5 +false +XuiLayoutListButtonSmall +1 +84.000000,24.000000,0.000000 +17.000000,0.000000,0.000000 + + + + +control_ListItem +84.000000 +24.000000 +40.000000,30.000000,0.000000 +5 +false +XuiLayoutListButtonSmall +1 +84.000000,24.000000,0.000000 +17.000000,0.000000,0.000000 + + + + + +InvertLook +156.000000 +20.000000 +156.999969,95.000000,0.000000 +XuiCheckboxSmall +SouthPaw +SouthPaw +SchemeList +22528 + + + + +SouthPaw +156.000000 +20.000000 +324.000000,95.000000,0.000000 +XuiCheckboxSmall +InvertLook +InvertLook +SchemeList +22528 + + + + +FigGroup +1280.000000 +720.000000 +0.500000,0.500000,0.500000 +48 + + + +Dpad +1280.000000 +720.000000 +48 + + + +FigDpad +155.000000 +4.000000 +432.000000,542.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +4.000000 +82.000000 +584.000000,464.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +DpadL +1280.000000 +720.000000 +48 + + + +4.000000 +102.000000 +599.000000,462.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigDpadL +170.000000 +4.000000 +432.000000,560.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +DpadR +1280.000000 +720.000000 +48 + + + +FigDpadR +140.000000 +4.000000 +432.000000,530.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +4.000000 +72.000000 +569.000000,462.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +LT +1280.000000 +720.000000 +48 + + + +FigLT +110.000000 +4.000000 +432.000000,310.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +RT +1280.000000 +720.000000 +48 + + + +FigRT +112.000000 +4.000000 +738.000000,310.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +LStick +1280.000000 +720.000000 +48 + + + +4.000000 +533.000000,410.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigLStick +105.000000 +4.000000 +432.000000,436.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +RStick +1280.000000 +720.000000 +48 + + + +4.000000 +65.000000 +690.000000,469.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigRStick +160.000000 +4.000000 +690.000000,530.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +LStickButton +1280.000000 +720.000000 +48 + + + +4.000000 +533.000000,440.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigLStickButton +105.000000 +4.000000 +432.000000,466.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +RStickButton +1280.000000 +720.000000 +48 + + + +4.000000 +690.000000,534.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigRStickButton +160.000000 +4.000000 +690.000000,560.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +LB +1280.000000 +720.000000 +48 + + + +FigLB +100.000000 +4.000000 +432.000000,339.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +RB +1280.000000 +720.000000 +48 + + + +FigRB +100.000000 +4.000000 +750.000000,339.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +Back +1280.000000 +720.000000 +48 + + + +4.000000 +130.000000 +599.000000,281.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigBack +170.000000 +4.000000 +432.000000,281.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +Start +1280.000000 +720.000000 +48 + + + +4.000000 +130.000000 +677.000000,281.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +FigStart +173.000000 +4.000000 +677.000000,281.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +Y +1280.000000 +720.000000 +48 + + + +FigY +100.000000 +4.000000 +750.000000,376.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +X +1280.000000 +720.000000 +48 + + + +FigX +131.000000 +4.000000 +719.000000,466.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + +4.000000 +63.000000 +719.000000,406.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +B +1280.000000 +720.000000 +48 + + + +FigB +70.000000 +4.000000 +780.000000,406.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +A +1280.000000 +720.000000 +48 + + + +FigA +100.000000 +4.000000 +750.000000,436.000000,0.000000 + + +0xff0f0f80 + + + + +0xffebcc0f + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,187.000000,0.000000,0,187.000000,0.000000,187.000000,0.000000,187.000000,8.000000,0,187.000000,8.000000,187.000000,8.000000,0.000000,8.000000,0,0.000000,8.000000,0.000000,8.000000,0.000000,0.000000,0, + + + + + +XuiText1 +421.000000 +86.583344 +433.000000,256.416656,0.000000 +true +The names of these groups and the Fig name inside them is used in the code for placement - don't change the names! +0xff0f0f0f +0x800f0f0f +0 + + + + + +CurrentLayout +344.000000 +20.000000 +148.000000,44.000000,0.000000 +XuiLabelDarkCentredSmall + + + + +XuiBuildVer +238.000000 +28.000000 +93.000000,331.000000,0.000000 +XuiLabelDark + + + + +XuiLabel1 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel2 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel3 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel4 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel5 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel6 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel7 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel8 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel9 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel10 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel11 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel12 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel13 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel14 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel15 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel16 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + +XuiLabel17 +109.000000 +36.000000 +17.000000,232.000000,0.000000 +false +LabelControlsSceneActionSmall + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2.h b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2.h new file mode 100644 index 00000000..1aae9c9c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2.h @@ -0,0 +1,197 @@ +#define IDC_MainPanel L"MainPanel" +#define IDC_TabImage1 L"TabImage1" +#define IDC_TabImage2 L"TabImage2" +#define IDC_TabImage3 L"TabImage3" +#define IDC_TabImage4 L"TabImage4" +#define IDC_TabImage5 L"TabImage5" +#define IDC_TabImage6 L"TabImage6" +#define IDC_TabImage7 L"TabImage7" +#define IDC_Group_Tab_Images L"Group_Tab_Images" +#define IDC_Icon_1 L"Icon_1" +#define IDC_Icon_2 L"Icon_2" +#define IDC_Icon_3 L"Icon_3" +#define IDC_Icon_4 L"Icon_4" +#define IDC_Icon_5 L"Icon_5" +#define IDC_Icon_6 L"Icon_6" +#define IDC_Icon_7 L"Icon_7" +#define IDC_Group_Tab_Icons L"Group_Tab_Icons" +#define IDC_XuiGroupName L"XuiGroupName" +#define IDC_XuiHSlot0 L"XuiHSlot0" +#define IDC_XuiHSlot1 L"XuiHSlot1" +#define IDC_XuiHSlot2 L"XuiHSlot2" +#define IDC_XuiHSlot3 L"XuiHSlot3" +#define IDC_XuiHSlot4 L"XuiHSlot4" +#define IDC_XuiHSlot5 L"XuiHSlot5" +#define IDC_XuiHSlot6 L"XuiHSlot6" +#define IDC_XuiHSlot7 L"XuiHSlot7" +#define IDC_XuiHSlot8 L"XuiHSlot8" +#define IDC_XuiHSlot9 L"XuiHSlot9" +#define IDC_XuiImageScrollBar L"XuiImageScrollBar" +#define IDC_XuiImageScrollBar2Slot L"XuiImageScrollBar2Slot" +#define IDC_XuiVSlot0 L"XuiVSlot0" +#define IDC_XuiVSlot1 L"XuiVSlot1" +#define IDC_XuiHighlight L"XuiHighlight" +#define IDC_XuiVSlot2 L"XuiVSlot2" +#define IDC_XuiHSlot10 L"XuiHSlot10" +#define IDC_XuiHSlot11 L"XuiHSlot11" +#define IDC_SceneCraftScrollGroup L"SceneCraftScrollGroup" +#define IDC_CraftingInput1 L"CraftingInput1" +#define IDC_CraftingInput2 L"CraftingInput2" +#define IDC_CraftingInput3 L"CraftingInput3" +#define IDC_CraftingInput4 L"CraftingInput4" +#define IDC_CraftingArrow L"CraftingArrow" +#define IDC_CraftingOutputRed L"CraftingOutputRed" +#define IDC_XuiHTMLText L"XuiHTMLText" +#define IDC_XuiItemName L"XuiItemName" +#define IDC_Inventory L"Inventory" +#define IDC_Ingredient4 L"Ingredient4" +#define IDC_Ingredient3 L"Ingredient3" +#define IDC_Ingredient2 L"Ingredient2" +#define IDC_Ingredient1 L"Ingredient1" +#define IDC_CraftingInput5 L"CraftingInput5" +#define IDC_CraftingInput6 L"CraftingInput6" +#define IDC_CraftingInput7 L"CraftingInput7" +#define IDC_CraftingInput8 L"CraftingInput8" +#define IDC_CraftingInput9 L"CraftingInput9" +#define IDC_Grid L"Grid" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryGrid L"InventoryGrid" +#define IDC_Group L"Group" +#define IDC_XuiCraftingPanel L"XuiCraftingPanel" diff --git a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2.xui b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2.xui new file mode 100644 index 00000000..1f619cc3 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2.xui @@ -0,0 +1,2605 @@ + + +1280.000000 +720.000000 + + + +XuiCraftingPanel +1280.000000 +720.000000 +CXuiSceneCraftingPanel +XuiMenuScene + + + +Group +1280.000000 +720.000000 +15 + + + +MainPanel +591.000000 +490.000000 +344.000000,114.000000,0.000000 +CraftingPanel2x2 + + + + +Group_Tab_Images +1280.000000 +200.000000 +0.000000,20.000000,0.000000 +48 + + + +TabImage1 +107.000000 +85.000000 +341.000000,89.000000,0.000000 +false +CraftingPanelTabLeft + + + + +TabImage2 +107.000000 +85.000000 +439.000000,89.000000,0.000000 +false +CraftingPanelTabMiddle + + + + +TabImage3 +107.000000 +85.000000 +537.000000,89.000000,0.000000 +false +CraftingPanelTabMiddle + + + + +TabImage4 +107.000000 +85.000000 +635.000000,89.000000,0.000000 +false +CraftingPanelTabMiddle + + + + +TabImage5 +107.000000 +85.000000 +733.000000,89.000000,0.000000 +false +CraftingPanelTabMiddle + + + + +TabImage6 +107.000000 +85.000000 +831.000000,89.000000,0.000000 +false +CraftingPanelTabRight + + + + +TabImage7 +107.000000 +85.000000 +929.000000,89.000000,0.000000 +false +CraftingPanelTabRight + + + + + +Group_Tab_Icons +1280.000000 +200.000000 +0.000000,-24.000000,0.000000 +48 + + + +Icon_1 +48.000000 +48.000000 +370.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_2 +48.000000 +48.000000 +468.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_3 +48.000000 +48.000000 +566.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_4 +48.000000 +48.000000 +664.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_5 +48.000000 +48.000000 +763.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_6 +48.000000 +48.000000 +861.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_7 +48.000000 +48.000000 +959.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + + +XuiGroupName +568.000000 +27.000000 +356.000000,208.000000,0.000000 +XuiLabelDarkCentred + + + + +SceneCraftScrollGroup +1280.000000 +720.000000 +48 + + + +XuiHSlot0 +46.000000 +46.000000 +375.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot1 +46.000000 +46.000000 +429.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot2 +46.000000 +46.000000 +483.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot3 +46.000000 +46.000000 +537.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot4 +46.000000 +46.000000 +591.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot5 +46.000000 +46.000000 +645.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot6 +46.000000 +46.000000 +699.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot7 +46.000000 +46.000000 +753.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot8 +46.000000 +46.000000 +807.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot9 +46.000000 +46.000000 +861.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiImageScrollBar +80.000000 +258.000000 +357.000000,153.000000,0.000000 +CraftingPanelVScroll3 + + + + +XuiImageScrollBar2Slot +80.000000 +204.000000 +357.000000,207.000000,0.000000 +CraftingPanelVScroll2 + + + + +XuiVSlot0 +46.000000 +46.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiVSlot1 +46.000000 +46.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHighlight +72.000000 +72.000000 +361.000000,245.000000,0.000000 +CraftingPanelHighlight + + + + +XuiVSlot2 +46.000000 +46.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot10 +46.000000 +46.000000 +861.000000,259.000000,0.000000 +4 +false +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot11 +46.000000 +46.000000 +861.000000,259.000000,0.000000 +4 +false +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + + +Grid +242.000000 +96.000000 +363.000000,457.000000,0.000000 + + + +CraftingInput1 +48.000000 +48.000000 +10.000000,0.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput2 +48.000000 +48.000000 +58.000000,0.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput3 +48.000000 +48.000000 +10.000000,48.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput4 +48.000000 +48.000000 +58.000000,48.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingArrow +32.000000 +32.000000 +118.000000,30.000000,0.000000 +CraftingProgressArrowSmall + + + + +CraftingOutputRed +72.000000 +72.000000 +160.000000,10.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed72 + + + + +XuiHTMLText +283.000000 +156.000000 +262.000000,-49.000000,0.000000 +false +XuiHtmlControl + + + + +XuiItemName +246.000000 +50.000000 +-3.000000,-52.000000,0.000000 +XuiLabelDarkCentredWrap + + + + +Inventory +298.000000 +27.000000 +255.000000,-52.000000,0.000000 +false +XuiLabelDarkCentred + + + + +Ingredient4 +32.000000 +32.000000 +269.000000,87.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +Ingredient3 +32.000000 +32.000000 +269.000000,53.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +Ingredient2 +32.000000 +32.000000 +269.000000,17.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +Ingredient1 +32.000000 +32.000000 +269.000000,-19.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput5 +48.000000 +48.000000 +53.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput6 +48.000000 +48.000000 +53.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput7 +48.000000 +48.000000 +53.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput8 +48.000000 +48.000000 +53.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput9 +48.000000 +48.000000 +53.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + + +InventoryGrid +290.000000 +144.000000 +622.000000,439.000000,0.000000 + + + +Inventory +288.000000 +96.000000 +8 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + +UseRow +288.000000 +32.000000 +-0.000000,112.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +0.000000,0.000000,0.000000 + + + +0 +0.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +0.000000,0.000000,0.000000 + + + +0 +-261.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +-261.000000,0.000000,0.000000 + + + +0 +0.000000,0.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_480.h b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_480.h new file mode 100644 index 00000000..087e891d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_480.h @@ -0,0 +1,211 @@ +#define IDC_MainPanel L"MainPanel" +#define IDC_TabImage1 L"TabImage1" +#define IDC_TabImage2 L"TabImage2" +#define IDC_TabImage3 L"TabImage3" +#define IDC_TabImage4 L"TabImage4" +#define IDC_TabImage5 L"TabImage5" +#define IDC_TabImage6 L"TabImage6" +#define IDC_TabImage7 L"TabImage7" +#define IDC_Group_Tab_Images L"Group_Tab_Images" +#define IDC_Icon_1 L"Icon_1" +#define IDC_Icon_2 L"Icon_2" +#define IDC_Icon_3 L"Icon_3" +#define IDC_Icon_4 L"Icon_4" +#define IDC_Icon_5 L"Icon_5" +#define IDC_Icon_6 L"Icon_6" +#define IDC_Icon_7 L"Icon_7" +#define IDC_Group_Tab_Icons L"Group_Tab_Icons" +#define IDC_XuiImageScrollBar L"XuiImageScrollBar" +#define IDC_XuiImageScrollBar2Slot L"XuiImageScrollBar2Slot" +#define IDC_XuiVSlot0 L"XuiVSlot0" +#define IDC_XuiVSlot1 L"XuiVSlot1" +#define IDC_XuiHighlight L"XuiHighlight" +#define IDC_XuiVSlot2 L"XuiVSlot2" +#define IDC_XuiHSlot0 L"XuiHSlot0" +#define IDC_XuiHSlot1 L"XuiHSlot1" +#define IDC_XuiHSlot2 L"XuiHSlot2" +#define IDC_XuiHSlot3 L"XuiHSlot3" +#define IDC_XuiHSlot4 L"XuiHSlot4" +#define IDC_XuiHSlot5 L"XuiHSlot5" +#define IDC_XuiHSlot6 L"XuiHSlot6" +#define IDC_XuiHSlot7 L"XuiHSlot7" +#define IDC_XuiHSlot8 L"XuiHSlot8" +#define IDC_XuiHSlot9 L"XuiHSlot9" +#define IDC_XuiHSlot10 L"XuiHSlot10" +#define IDC_XuiHSlot11 L"XuiHSlot11" +#define IDC_SceneCraftScrollGroup L"SceneCraftScrollGroup" +#define IDC_CraftingArrow L"CraftingArrow" +#define IDC_CraftingInput1 L"CraftingInput1" +#define IDC_CraftingInput2 L"CraftingInput2" +#define IDC_CraftingInput3 L"CraftingInput3" +#define IDC_CraftingInput4 L"CraftingInput4" +#define IDC_CraftingOutputRed L"CraftingOutputRed" +#define IDC_XuiHTMLText L"XuiHTMLText" +#define IDC_XuiItemName L"XuiItemName" +#define IDC_Inventory L"Inventory" +#define IDC_Ingredient4 L"Ingredient4" +#define IDC_Ingredient3 L"Ingredient3" +#define IDC_Ingredient2 L"Ingredient2" +#define IDC_Ingredient1 L"Ingredient1" +#define IDC_CraftingInput5 L"CraftingInput5" +#define IDC_CraftingInput6 L"CraftingInput6" +#define IDC_CraftingInput7 L"CraftingInput7" +#define IDC_CraftingInput8 L"CraftingInput8" +#define IDC_CraftingInput9 L"CraftingInput9" +#define IDC_Grid L"Grid" +#define IDC_XuiGroupName L"XuiGroupName" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryGrid L"InventoryGrid" +#define IDC_Group L"Group" +#define IDC_XuiCraftingPanel L"XuiCraftingPanel" diff --git a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_480.xui b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_480.xui new file mode 100644 index 00000000..1793b086 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_480.xui @@ -0,0 +1,2772 @@ + + +640.000000 +480.000000 + + + +XuiCraftingPanel +640.000000 +480.000000 +CXuiSceneCraftingPanel +XuiMenuScene + + + +Group +640.000000 +480.000000 +15 + + + +MainPanel +420.000000 +284.000000 +110.000000,98.000000,0.000000 +CraftingPanel2x2Small + + + + +Group_Tab_Images +640.000000 +50.000000 +0.000000,96.000000,0.000000 +48 + + + +TabImage1 +72.000000 +56.000000 +110.000000,0.000000,0.000000 +false +CraftingPanelTabLeftSmall + + + + +TabImage2 +72.000000 +56.000000 +180.000000,0.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage3 +72.000000 +56.000000 +249.000000,0.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage4 +72.000000 +56.000000 +319.000000,0.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage5 +72.000000 +56.000000 +389.000000,0.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage6 +72.000000 +56.000000 +458.000000,0.000000,0.000000 +false +CraftingPanelTabRightSmall + + + + +TabImage7 +72.000000 +56.000000 +528.000000,0.000000,0.000000 +false +CraftingPanelTabRightSmall + + + + + +Group_Tab_Icons +640.000000 +50.000000 +0.000000,96.000000,0.000000 +48 + + + +Icon_1 +32.000000 +32.000000 +130.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_2 +32.000000 +32.000000 +200.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_3 +32.000000 +32.000000 +270.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_4 +32.000000 +32.000000 +339.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_5 +32.000000 +32.000000 +409.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_6 +32.000000 +32.000000 +479.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_7 +32.000000 +32.000000 +549.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + + +SceneCraftScrollGroup +640.000000 +135.000000 +0.000000,94.000000,0.000000 +48 + + + +XuiImageScrollBar +22.000000 +67.000000 +134.000000,72.000000,0.000000 +CraftingPanelVScrollSmall + + + + +XuiImageScrollBar2Slot +22.000000 +67.000000 +134.000000,72.000000,0.000000 +CraftingPanelVScrollSmall + + + + +XuiVSlot0 +34.000000 +34.000000 +620.000000,90.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiVSlot1 +34.000000 +34.000000 +620.000000,90.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHighlight +43.000000 +43.000000 +123.000000,84.000000,0.000000 +CraftingPanelHighlightSmall + + + + +XuiVSlot2 +34.000000 +34.000000 +620.000000,90.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot0 +34.000000 +34.000000 +128.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot1 +34.000000 +34.000000 +167.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot2 +34.000000 +34.000000 +206.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot3 +34.000000 +34.000000 +245.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot4 +34.000000 +34.000000 +284.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot5 +34.000000 +34.000000 +323.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot6 +34.000000 +34.000000 +362.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot7 +34.000000 +34.000000 +401.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot8 +34.000000 +34.000000 +439.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot9 +34.000000 +34.000000 +478.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot10 +34.000000 +34.000000 +515.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot11 +34.000000 +34.000000 +529.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + + +Grid +170.000000 +132.000000 +123.000000,235.000000,0.000000 + + + +CraftingArrow +32.000000 +32.000000 +82.000000,70.000000,0.000000 +CraftingProgressArrowSmall + + + + +CraftingInput1 +38.000000 +38.000000 +3.000000,49.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput2 +38.000000 +38.000000 +41.000000,49.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput3 +38.000000 +38.000000 +3.000000,87.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput4 +38.000000 +38.000000 +41.000000,87.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingOutputRed +50.000000 +50.000000 +117.000000,62.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +XuiHTMLText +207.177460 +114.567886 +182.893524,2.411270,0.000000 +false +XuiHtmlControl + + + + +XuiItemName +160.283936 +49.035492 +4.858025,0.000000,0.000000 +XuiLabelDarkCentredWrapSmall + + + + +Inventory +212.000000 +21.000000 +180.000000,0.000000,0.000000 +false +XuiLabelDarkCentredWrapSmall + + + + +Ingredient4 +26.000000 +26.000000 +182.000000,105.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Ingredient3 +26.000000 +26.000000 +182.000000,77.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Ingredient2 +26.000000 +26.000000 +182.000000,49.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Ingredient1 +26.000000 +26.000000 +182.000000,21.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput5 +38.000000 +38.000000 +43.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput6 +38.000000 +38.000000 +43.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput7 +38.000000 +38.000000 +43.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput8 +38.000000 +38.000000 +43.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput9 +38.000000 +38.000000 +43.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + + +XuiGroupName +408.000000 +27.000000 +116.000000,153.000000,0.000000 +XuiLabelDarkCentredSmall + + + + +InventoryGrid +207.000000 +99.000000 +306.000000,260.000000,0.000000 + + + +Inventory +198.000000 +66.000000 +4.000000,0.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + +UseRow +198.000000 +22.000000 +4.000000,76.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_small.h b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_small.h new file mode 100644 index 00000000..6d525034 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_small.h @@ -0,0 +1,193 @@ +#define IDC_MainPanel L"MainPanel" +#define IDC_TabImage1 L"TabImage1" +#define IDC_TabImage2 L"TabImage2" +#define IDC_TabImage3 L"TabImage3" +#define IDC_TabImage4 L"TabImage4" +#define IDC_TabImage5 L"TabImage5" +#define IDC_TabImage6 L"TabImage6" +#define IDC_TabImage7 L"TabImage7" +#define IDC_Group_Tab_Images L"Group_Tab_Images" +#define IDC_Icon_1 L"Icon_1" +#define IDC_Icon_2 L"Icon_2" +#define IDC_Icon_3 L"Icon_3" +#define IDC_Icon_4 L"Icon_4" +#define IDC_Icon_5 L"Icon_5" +#define IDC_Icon_6 L"Icon_6" +#define IDC_Icon_7 L"Icon_7" +#define IDC_Group_Tab_Icons L"Group_Tab_Icons" +#define IDC_XuiImageScrollBar L"XuiImageScrollBar" +#define IDC_XuiImageScrollBar2Slot L"XuiImageScrollBar2Slot" +#define IDC_XuiVSlot0 L"XuiVSlot0" +#define IDC_XuiVSlot1 L"XuiVSlot1" +#define IDC_XuiHighlight L"XuiHighlight" +#define IDC_XuiVSlot2 L"XuiVSlot2" +#define IDC_XuiHSlot0 L"XuiHSlot0" +#define IDC_XuiHSlot1 L"XuiHSlot1" +#define IDC_XuiHSlot2 L"XuiHSlot2" +#define IDC_XuiHSlot3 L"XuiHSlot3" +#define IDC_XuiHSlot4 L"XuiHSlot4" +#define IDC_XuiHSlot5 L"XuiHSlot5" +#define IDC_XuiHSlot6 L"XuiHSlot6" +#define IDC_XuiHSlot7 L"XuiHSlot7" +#define IDC_XuiHSlot8 L"XuiHSlot8" +#define IDC_XuiHSlot9 L"XuiHSlot9" +#define IDC_XuiHSlot10 L"XuiHSlot10" +#define IDC_XuiHSlot11 L"XuiHSlot11" +#define IDC_SceneCraftScrollGroup L"SceneCraftScrollGroup" +#define IDC_CraftingArrow L"CraftingArrow" +#define IDC_CraftingInput1 L"CraftingInput1" +#define IDC_CraftingInput2 L"CraftingInput2" +#define IDC_CraftingInput3 L"CraftingInput3" +#define IDC_CraftingInput4 L"CraftingInput4" +#define IDC_CraftingOutputRed L"CraftingOutputRed" +#define IDC_XuiHTMLText L"XuiHTMLText" +#define IDC_XuiItemName L"XuiItemName" +#define IDC_Inventory L"Inventory" +#define IDC_Ingredient4 L"Ingredient4" +#define IDC_Ingredient3 L"Ingredient3" +#define IDC_Ingredient2 L"Ingredient2" +#define IDC_Ingredient1 L"Ingredient1" +#define IDC_CraftingInput5 L"CraftingInput5" +#define IDC_CraftingInput6 L"CraftingInput6" +#define IDC_CraftingInput7 L"CraftingInput7" +#define IDC_CraftingInput8 L"CraftingInput8" +#define IDC_CraftingInput9 L"CraftingInput9" +#define IDC_Grid L"Grid" +#define IDC_XuiGroupName L"XuiGroupName" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryGrid L"InventoryGrid" +#define IDC_Group L"Group" +#define IDC_XuiCraftingPanel L"XuiCraftingPanel" diff --git a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_small.xui b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_small.xui new file mode 100644 index 00000000..12d44c35 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_2x2_small.xui @@ -0,0 +1,2557 @@ + + +530.000000 +290.000000 + + + +XuiCraftingPanel +640.000000 +360.000000 +CXuiSceneCraftingPanel +XuiMenuScene + + + +Group +640.000000 +360.000000 +15 + + + +MainPanel +420.000000 +284.000000 +110.000000,3.000000,0.000000 +CraftingPanel2x2Small + + + + +Group_Tab_Images +640.000000 +50.000000 +48 + + + +TabImage1 +72.000000 +56.000000 +110.000000,1.000000,0.000000 +false +CraftingPanelTabLeftSmall + + + + +TabImage2 +72.000000 +56.000000 +180.000000,1.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage3 +72.000000 +56.000000 +249.000000,1.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage4 +72.000000 +56.000000 +319.000000,1.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage5 +72.000000 +56.000000 +389.000000,1.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage6 +72.000000 +56.000000 +458.000000,1.000000,0.000000 +false +CraftingPanelTabRightSmall + + + + +TabImage7 +72.000000 +56.000000 +528.000000,1.000000,0.000000 +false +CraftingPanelTabRightSmall + + + + + +Group_Tab_Icons +640.000000 +50.000000 +48 + + + +Icon_1 +32.000000 +32.000000 +130.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_2 +32.000000 +32.000000 +200.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_3 +32.000000 +32.000000 +270.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_4 +32.000000 +32.000000 +339.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_5 +32.000000 +32.000000 +409.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_6 +32.000000 +32.000000 +479.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_7 +32.000000 +32.000000 +549.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + + +SceneCraftScrollGroup +640.000000 +135.000000 +48 + + + +XuiImageScrollBar +22.000000 +67.000000 +134.000000,72.000000,0.000000 +CraftingPanelVScrollSmall + + + + +XuiImageScrollBar2Slot +22.000000 +67.000000 +134.000000,72.000000,0.000000 +CraftingPanelVScrollSmall + + + + +XuiVSlot0 +34.000000 +34.000000 +620.000000,93.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiVSlot1 +34.000000 +34.000000 +620.000000,93.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHighlight +43.000000 +43.000000 +123.000000,84.000000,0.000000 +CraftingPanelHighlightSmall + + + + +XuiVSlot2 +34.000000 +34.000000 +620.000000,93.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot0 +34.000000 +34.000000 +128.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot1 +34.000000 +34.000000 +167.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot2 +34.000000 +34.000000 +206.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot3 +34.000000 +34.000000 +245.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot4 +34.000000 +34.000000 +284.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot5 +34.000000 +34.000000 +323.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot6 +34.000000 +34.000000 +362.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot7 +34.000000 +34.000000 +401.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot8 +34.000000 +34.000000 +439.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot9 +34.000000 +34.000000 +478.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot10 +34.000000 +34.000000 +515.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot11 +34.000000 +34.000000 +529.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + + +Grid +170.000000 +132.000000 +123.000000,140.000000,0.000000 + + + +CraftingArrow +32.000000 +32.000000 +82.000000,75.000000,0.000000 +CraftingProgressArrowSmall + + + + +CraftingInput1 +38.000000 +38.000000 +3.000000,54.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput2 +38.000000 +38.000000 +41.000000,54.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput3 +38.000000 +38.000000 +3.000000,92.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput4 +38.000000 +38.000000 +41.000000,92.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingOutputRed +50.000000 +50.000000 +117.000000,67.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +XuiHTMLText +204.000000 +108.000000 +184.000000,0.000000,0.000000 +false +XuiHtmlControl + + + + +XuiItemName +168.000000 +50.000000 +1.000000,0.000000,0.000000 +XuiLabelDarkCentredWrapSmall + + + + +Inventory +212.000000 +21.000000 +180.000000,0.000000,0.000000 +false +XuiLabelDarkCentredWrapSmall + + + + +Ingredient4 +26.000000 +26.000000 +187.000000,105.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Ingredient3 +26.000000 +26.000000 +187.000000,77.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Ingredient2 +26.000000 +26.000000 +187.000000,49.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Ingredient1 +26.000000 +26.000000 +187.000000,21.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput5 +38.000000 +38.000000 +43.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput6 +38.000000 +38.000000 +43.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput7 +38.000000 +38.000000 +43.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput8 +38.000000 +38.000000 +43.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput9 +38.000000 +38.000000 +43.000000,48.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + + +XuiGroupName +408.000000 +27.000000 +116.000000,58.000000,0.000000 +XuiLabelDarkCentredSmall + + + + +InventoryGrid +207.000000 +99.000000 +306.000000,170.000000,0.000000 + + + +Inventory +198.000000 +66.000000 +4.000000,0.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + +UseRow +198.000000 +22.000000 +4.000000,76.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +0.000000,0.000000,0.000000 + + + +0 +0.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +0.000000,0.000000,0.000000 + + + +0 +-261.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +-261.000000,0.000000,0.000000 + + + +0 +0.000000,0.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3.h b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3.h new file mode 100644 index 00000000..9400ba1e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3.h @@ -0,0 +1,213 @@ +#define IDC_MainPanel L"MainPanel" +#define IDC_TabImage1 L"TabImage1" +#define IDC_TabImage2 L"TabImage2" +#define IDC_TabImage3 L"TabImage3" +#define IDC_TabImage4 L"TabImage4" +#define IDC_TabImage5 L"TabImage5" +#define IDC_TabImage6 L"TabImage6" +#define IDC_TabImage7 L"TabImage7" +#define IDC_Group_Tab_Images L"Group_Tab_Images" +#define IDC_Icon_1 L"Icon_1" +#define IDC_Icon_2 L"Icon_2" +#define IDC_Icon_3 L"Icon_3" +#define IDC_Icon_4 L"Icon_4" +#define IDC_Icon_5 L"Icon_5" +#define IDC_Icon_6 L"Icon_6" +#define IDC_Icon_7 L"Icon_7" +#define IDC_Group_Tab_Icons L"Group_Tab_Icons" +#define IDC_XuiGroupName L"XuiGroupName" +#define IDC_XuiHSlot0 L"XuiHSlot0" +#define IDC_XuiHSlot1 L"XuiHSlot1" +#define IDC_XuiHSlot2 L"XuiHSlot2" +#define IDC_XuiHSlot3 L"XuiHSlot3" +#define IDC_XuiHSlot4 L"XuiHSlot4" +#define IDC_XuiHSlot5 L"XuiHSlot5" +#define IDC_XuiHSlot6 L"XuiHSlot6" +#define IDC_XuiHSlot7 L"XuiHSlot7" +#define IDC_XuiHSlot8 L"XuiHSlot8" +#define IDC_XuiHSlot9 L"XuiHSlot9" +#define IDC_XuiHSlot10 L"XuiHSlot10" +#define IDC_XuiHSlot11 L"XuiHSlot11" +#define IDC_XuiImageScrollBar L"XuiImageScrollBar" +#define IDC_XuiImageScrollBar2Slot L"XuiImageScrollBar2Slot" +#define IDC_XuiVSlot0 L"XuiVSlot0" +#define IDC_XuiVSlot1 L"XuiVSlot1" +#define IDC_XuiHighlight L"XuiHighlight" +#define IDC_XuiVSlot2 L"XuiVSlot2" +#define IDC_SceneCraftScrollGroup L"SceneCraftScrollGroup" +#define IDC_CraftingArrow L"CraftingArrow" +#define IDC_CraftingOutputRed L"CraftingOutputRed" +#define IDC_CraftingInput1 L"CraftingInput1" +#define IDC_CraftingInput2 L"CraftingInput2" +#define IDC_CraftingInput3 L"CraftingInput3" +#define IDC_CraftingInput4 L"CraftingInput4" +#define IDC_CraftingInput5 L"CraftingInput5" +#define IDC_CraftingInput6 L"CraftingInput6" +#define IDC_CraftingInput7 L"CraftingInput7" +#define IDC_CraftingInput8 L"CraftingInput8" +#define IDC_CraftingInput9 L"CraftingInput9" +#define IDC_XuiHTMLText L"XuiHTMLText" +#define IDC_XuiItemName L"XuiItemName" +#define IDC_Inventory L"Inventory" +#define IDC_Ingredient4 L"Ingredient4" +#define IDC_Ingredient3 L"Ingredient3" +#define IDC_Ingredient2 L"Ingredient2" +#define IDC_Ingredient1 L"Ingredient1" +#define IDC_Grid L"Grid" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryGrid L"InventoryGrid" +#define IDC_Group L"Group" +#define IDC_XuiCraftingPanel L"XuiCraftingPanel" diff --git a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3.xui b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3.xui new file mode 100644 index 00000000..b3386eda --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3.xui @@ -0,0 +1,2828 @@ + + +1280.000000 +720.000000 + + + +XuiCraftingPanel +1280.000000 +720.000000 +CXuiSceneCraftingPanel +XuiMenuScene + + + +Group +1280.000000 +720.000000 +15 + + + +MainPanel +689.000000 +490.000000 +295.000000,115.000000,0.000000 +CraftingPanel3x3 + + + + +Group_Tab_Images +1280.000000 +200.000000 +0.000000,20.000000,0.000000 +48 + + + +TabImage1 +107.000000 +85.000000 +292.000000,90.000000,0.000000 +false +CraftingPanelTabLeft + + + + +TabImage2 +107.000000 +85.000000 +390.000000,90.000000,0.000000 +false +CraftingPanelTabMiddle + + + + +TabImage3 +107.000000 +85.000000 +488.000000,90.000000,0.000000 +false +CraftingPanelTabMiddle + + + + +TabImage4 +107.000000 +85.000000 +586.000000,90.000000,0.000000 +false +CraftingPanelTabMiddle + + + + +TabImage5 +107.000000 +85.000000 +684.000000,90.000000,0.000000 +false +CraftingPanelTabMiddle + + + + +TabImage6 +107.000000 +85.000000 +782.000000,90.000000,0.000000 +false +CraftingPanelTabMiddle + + + + +TabImage7 +107.000000 +85.000000 +880.000000,90.000000,0.000000 +false +CraftingPanelTabRight + + + + + +Group_Tab_Icons +1280.000000 +200.000000 +0.000000,-24.000000,0.000000 +48 + + + +Icon_1 +48.000000 +48.000000 +321.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_2 +48.000000 +48.000000 +419.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_3 +48.000000 +48.000000 +517.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_4 +48.000000 +48.000000 +615.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_5 +48.000000 +48.000000 +714.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_6 +48.000000 +48.000000 +812.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_7 +48.000000 +48.000000 +910.000000,152.000000,0.000000 +false +CraftingCategoryIcon + + + + + +XuiGroupName +568.000000 +27.000000 +355.630280,208.000000,0.000000 +XuiLabelDarkCentred + + + + +SceneCraftScrollGroup +1280.000000 +720.000000 +48 + + + +XuiHSlot0 +46.000000 +46.000000 +320.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot1 +46.000000 +46.000000 +374.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot2 +46.000000 +46.000000 +428.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot3 +46.000000 +46.000000 +482.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot4 +46.000000 +46.000000 +536.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot5 +46.000000 +46.000000 +590.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot6 +46.000000 +46.000000 +644.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot7 +46.000000 +46.000000 +698.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot8 +46.000000 +46.000000 +752.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot9 +46.000000 +46.000000 +806.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot10 +46.000000 +46.000000 +860.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot11 +46.000000 +46.000000 +914.000000,259.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiImageScrollBar +80.000000 +258.000000 +303.000000,153.000000,0.000000 +CraftingPanelVScroll3 + + + + +XuiImageScrollBar2Slot +80.000000 +204.000000 +303.000000,207.000000,0.000000 +CraftingPanelVScroll2 + + + + +XuiVSlot0 +46.000000 +46.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiVSlot1 +46.000000 +46.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHighlight +72.000000 +72.000000 +307.000000,246.000000,0.000000 +CraftingPanelHighlight + + + + +XuiVSlot2 +46.000000 +46.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + + +Grid +262.000000 +144.000000 +318.000000,427.000000,0.000000 + + + +CraftingArrow +32.000000 +32.000000 +152.000000,70.000000,0.000000 +CraftingProgressArrowSmall + + + + +CraftingOutputRed +72.000000 +72.000000 +206.000000,52.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed72 + + + + +CraftingInput1 +46.000000 +46.000000 +0.000000,20.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput2 +46.000000 +46.000000 +46.000000,20.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput3 +46.000000 +46.000000 +92.000000,20.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput4 +46.000000 +46.000000 +0.000000,66.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput5 +46.000000 +46.000000 +46.000000,66.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput6 +46.000000 +46.000000 +92.000000,66.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput7 +46.000000 +46.000000 +0.000000,112.000031,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput8 +46.000000 +46.000000 +46.000031,112.000031,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput9 +46.000000 +46.000000 +92.000031,112.000031,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +XuiHTMLText +332.000000 +170.000000 +305.000000,-19.000000,0.000000 +false +XuiHtmlControl + + + + +XuiItemName +281.000000 +50.000000 +-2.000000,-24.000000,0.000000 +XuiLabelDarkCentredWrap +yyyyyyWWWWWWWWWWWWWWWW +yyyyyyWWWWWWWWWWWWWW + + + + +Inventory +344.000000 +27.000000 +298.000000,-24.000000,0.000000 +false +XuiLabelDarkCentred + + + + +Ingredient4 +32.000000 +32.000000 +310.000000,117.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +Ingredient3 +32.000000 +32.000000 +310.000000,81.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +Ingredient2 +32.000000 +32.000000 +310.000000,45.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +Ingredient1 +32.000000 +32.000000 +310.000000,9.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + + +InventoryGrid +290.000000 +144.000000 +646.000000,439.000000,0.000000 + + + +Inventory +288.000000 +96.000000 +8 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + +UseRow +288.000000 +32.000000 +0.000000,112.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +0.000000,0.000000,0.000000 + + + +0 +0.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +0.000000,0.000000,0.000000 + + + +0 +-212.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +-212.000000,0.000000,0.000000 + + + +0 +0.000000,0.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_480.h b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_480.h new file mode 100644 index 00000000..424b28e8 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_480.h @@ -0,0 +1,211 @@ +#define IDC_MainPanel L"MainPanel" +#define IDC_TabImage1 L"TabImage1" +#define IDC_TabImage2 L"TabImage2" +#define IDC_TabImage3 L"TabImage3" +#define IDC_TabImage4 L"TabImage4" +#define IDC_TabImage5 L"TabImage5" +#define IDC_TabImage6 L"TabImage6" +#define IDC_TabImage7 L"TabImage7" +#define IDC_Group_Tab_Images L"Group_Tab_Images" +#define IDC_Icon_1 L"Icon_1" +#define IDC_Icon_2 L"Icon_2" +#define IDC_Icon_3 L"Icon_3" +#define IDC_Icon_4 L"Icon_4" +#define IDC_Icon_5 L"Icon_5" +#define IDC_Icon_6 L"Icon_6" +#define IDC_Icon_7 L"Icon_7" +#define IDC_Group_Tab_Icons L"Group_Tab_Icons" +#define IDC_XuiImageScrollBar L"XuiImageScrollBar" +#define IDC_XuiImageScrollBar2Slot L"XuiImageScrollBar2Slot" +#define IDC_XuiVSlot0 L"XuiVSlot0" +#define IDC_XuiVSlot1 L"XuiVSlot1" +#define IDC_XuiHighlight L"XuiHighlight" +#define IDC_XuiVSlot2 L"XuiVSlot2" +#define IDC_XuiHSlot0 L"XuiHSlot0" +#define IDC_XuiHSlot1 L"XuiHSlot1" +#define IDC_XuiHSlot2 L"XuiHSlot2" +#define IDC_XuiHSlot3 L"XuiHSlot3" +#define IDC_XuiHSlot4 L"XuiHSlot4" +#define IDC_XuiHSlot5 L"XuiHSlot5" +#define IDC_XuiHSlot6 L"XuiHSlot6" +#define IDC_XuiHSlot7 L"XuiHSlot7" +#define IDC_XuiHSlot8 L"XuiHSlot8" +#define IDC_XuiHSlot9 L"XuiHSlot9" +#define IDC_XuiHSlot10 L"XuiHSlot10" +#define IDC_XuiHSlot11 L"XuiHSlot11" +#define IDC_SceneCraftScrollGroup L"SceneCraftScrollGroup" +#define IDC_CraftingArrow L"CraftingArrow" +#define IDC_CraftingOutputRed L"CraftingOutputRed" +#define IDC_CraftingInput1 L"CraftingInput1" +#define IDC_CraftingInput2 L"CraftingInput2" +#define IDC_CraftingInput3 L"CraftingInput3" +#define IDC_CraftingInput4 L"CraftingInput4" +#define IDC_CraftingInput5 L"CraftingInput5" +#define IDC_CraftingInput6 L"CraftingInput6" +#define IDC_CraftingInput7 L"CraftingInput7" +#define IDC_CraftingInput8 L"CraftingInput8" +#define IDC_CraftingInput9 L"CraftingInput9" +#define IDC_XuiHTMLText L"XuiHTMLText" +#define IDC_XuiItemName L"XuiItemName" +#define IDC_Inventory L"Inventory" +#define IDC_Ingredient4 L"Ingredient4" +#define IDC_Ingredient3 L"Ingredient3" +#define IDC_Ingredient2 L"Ingredient2" +#define IDC_Ingredient1 L"Ingredient1" +#define IDC_Grid L"Grid" +#define IDC_XuiGroupName L"XuiGroupName" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryGrid L"InventoryGrid" +#define IDC_Group L"Group" +#define IDC_XuiCraftingPanel L"XuiCraftingPanel" diff --git a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_480.xui b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_480.xui new file mode 100644 index 00000000..35d58dd1 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_480.xui @@ -0,0 +1,2767 @@ + + +640.000000 +480.000000 + + + +XuiCraftingPanel +640.000000 +480.000000 +CXuiSceneCraftingPanel +XuiMenuScene + + + +Group +640.000000 +480.000000 +15 + + + +MainPanel +490.000000 +284.000000 +72.000000,98.000000,0.000000 +CraftingPanel3x3Small + + + + +Group_Tab_Images +640.000000 +50.000000 +0.000000,96.000000,0.000000 +48 + + + +TabImage1 +72.000000 +56.000000 +72.000000,0.000000,0.000000 +false +CraftingPanelTabLeftSmall + + + + +TabImage2 +72.000000 +56.000000 +142.000000,0.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage3 +72.000000 +56.000000 +211.000000,0.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage4 +72.000000 +56.000000 +281.000000,0.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage5 +72.000000 +56.000000 +351.000000,0.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage6 +72.000000 +56.000000 +420.000000,0.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage7 +72.000000 +56.000000 +490.000000,0.000000,0.000000 +false +CraftingPanelTabRightSmall + + + + + +Group_Tab_Icons +640.000000 +50.000000 +0.000000,96.000000,0.000000 +48 + + + +Icon_1 +32.000000 +32.000000 +91.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_2 +32.000000 +32.000000 +162.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_3 +32.000000 +32.000000 +231.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_4 +32.000000 +32.000000 +301.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_5 +32.000000 +32.000000 +371.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_6 +32.000000 +32.000000 +441.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_7 +32.000000 +32.000000 +509.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + + +SceneCraftScrollGroup +640.000000 +480.000000 +0.000000,94.000000,0.000000 +48 + + + +XuiImageScrollBar +22.000000 +67.000000 +92.000000,72.000000,0.000000 +CraftingPanelVScrollSmall + + + + +XuiImageScrollBar2Slot +22.000000 +67.000000 +92.000000,72.000000,0.000000 +CraftingPanelVScrollSmall + + + + +XuiVSlot0 +34.000000 +34.000000 +620.000000,90.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiVSlot1 +34.000000 +34.000000 +620.000000,90.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHighlight +43.000000 +43.000000 +81.000000,84.000000,0.000000 +CraftingPanelHighlightSmall + + + + +XuiVSlot2 +34.000000 +34.000000 +620.000000,90.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot0 +34.000000 +34.000000 +85.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot1 +34.000000 +34.000000 +124.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot2 +34.000000 +34.000000 +163.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot3 +34.000000 +34.000000 +202.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot4 +34.000000 +34.000000 +241.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot5 +34.000000 +34.000000 +280.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot6 +34.000000 +34.000000 +319.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot7 +34.000000 +34.000000 +358.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot8 +34.000000 +34.000000 +397.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot9 +34.000000 +34.000000 +436.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot10 +34.000000 +34.000000 +475.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot11 +34.000000 +34.000000 +514.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + + +Grid +190.307205 +133.200012 +86.000000,236.000000,0.000000 + + + +CraftingArrow +32.000000 +32.000000 +102.000000,65.000000,0.000000 +CraftingProgressArrowSmall + + + + +CraftingOutputRed +50.000000 +50.000000 +137.000000,57.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput1 +32.000000 +32.000000 +3.000000,34.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput2 +32.000000 +32.000000 +35.000000,34.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput3 +32.000000 +32.000000 +67.000000,34.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput4 +32.000000 +32.000000 +3.000000,66.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput5 +32.000000 +32.000000 +35.000000,66.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput6 +32.000000 +32.000000 +67.000000,66.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput7 +32.000000 +32.000000 +3.000000,98.000031,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput8 +32.000000 +32.000000 +35.000031,98.000031,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput9 +32.000000 +32.000000 +67.000031,98.000031,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +XuiHTMLText +254.191498 +112.307999 +204.018768,3.616898,0.000000 +false +XuiHtmlControl + + + + +XuiItemName +182.373703 +50.000000 +3.616897,0.000000,0.000000 +XuiLabelDarkCentredWrapSmall + + + + +Inventory +262.000000 +27.000000 +200.000000,0.000000,0.000000 +false +XuiLabelDarkCentredWrapSmall + + + + +Ingredient4 +24.000000 +24.000000 +202.000000,106.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Ingredient3 +24.000000 +24.000000 +202.000000,78.999992,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Ingredient2 +24.000000 +24.000000 +202.000000,52.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Ingredient1 +24.000000 +24.000000 +202.000000,25.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + + +XuiGroupName +400.000000 +27.000000 +117.000000,154.000000,0.000000 +XuiLabelDarkCentredSmall + + + + +InventoryGrid +207.000000 +99.000000 +314.000000,262.000000,0.000000 + + + +Inventory +198.000000 +66.000000 +4.000000,0.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + +UseRow +198.000000 +22.000000 +4.000000,76.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_small.h b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_small.h new file mode 100644 index 00000000..424b28e8 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_small.h @@ -0,0 +1,211 @@ +#define IDC_MainPanel L"MainPanel" +#define IDC_TabImage1 L"TabImage1" +#define IDC_TabImage2 L"TabImage2" +#define IDC_TabImage3 L"TabImage3" +#define IDC_TabImage4 L"TabImage4" +#define IDC_TabImage5 L"TabImage5" +#define IDC_TabImage6 L"TabImage6" +#define IDC_TabImage7 L"TabImage7" +#define IDC_Group_Tab_Images L"Group_Tab_Images" +#define IDC_Icon_1 L"Icon_1" +#define IDC_Icon_2 L"Icon_2" +#define IDC_Icon_3 L"Icon_3" +#define IDC_Icon_4 L"Icon_4" +#define IDC_Icon_5 L"Icon_5" +#define IDC_Icon_6 L"Icon_6" +#define IDC_Icon_7 L"Icon_7" +#define IDC_Group_Tab_Icons L"Group_Tab_Icons" +#define IDC_XuiImageScrollBar L"XuiImageScrollBar" +#define IDC_XuiImageScrollBar2Slot L"XuiImageScrollBar2Slot" +#define IDC_XuiVSlot0 L"XuiVSlot0" +#define IDC_XuiVSlot1 L"XuiVSlot1" +#define IDC_XuiHighlight L"XuiHighlight" +#define IDC_XuiVSlot2 L"XuiVSlot2" +#define IDC_XuiHSlot0 L"XuiHSlot0" +#define IDC_XuiHSlot1 L"XuiHSlot1" +#define IDC_XuiHSlot2 L"XuiHSlot2" +#define IDC_XuiHSlot3 L"XuiHSlot3" +#define IDC_XuiHSlot4 L"XuiHSlot4" +#define IDC_XuiHSlot5 L"XuiHSlot5" +#define IDC_XuiHSlot6 L"XuiHSlot6" +#define IDC_XuiHSlot7 L"XuiHSlot7" +#define IDC_XuiHSlot8 L"XuiHSlot8" +#define IDC_XuiHSlot9 L"XuiHSlot9" +#define IDC_XuiHSlot10 L"XuiHSlot10" +#define IDC_XuiHSlot11 L"XuiHSlot11" +#define IDC_SceneCraftScrollGroup L"SceneCraftScrollGroup" +#define IDC_CraftingArrow L"CraftingArrow" +#define IDC_CraftingOutputRed L"CraftingOutputRed" +#define IDC_CraftingInput1 L"CraftingInput1" +#define IDC_CraftingInput2 L"CraftingInput2" +#define IDC_CraftingInput3 L"CraftingInput3" +#define IDC_CraftingInput4 L"CraftingInput4" +#define IDC_CraftingInput5 L"CraftingInput5" +#define IDC_CraftingInput6 L"CraftingInput6" +#define IDC_CraftingInput7 L"CraftingInput7" +#define IDC_CraftingInput8 L"CraftingInput8" +#define IDC_CraftingInput9 L"CraftingInput9" +#define IDC_XuiHTMLText L"XuiHTMLText" +#define IDC_XuiItemName L"XuiItemName" +#define IDC_Inventory L"Inventory" +#define IDC_Ingredient4 L"Ingredient4" +#define IDC_Ingredient3 L"Ingredient3" +#define IDC_Ingredient2 L"Ingredient2" +#define IDC_Ingredient1 L"Ingredient1" +#define IDC_Grid L"Grid" +#define IDC_XuiGroupName L"XuiGroupName" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryGrid L"InventoryGrid" +#define IDC_Group L"Group" +#define IDC_XuiCraftingPanel L"XuiCraftingPanel" diff --git a/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_small.xui b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_small.xui new file mode 100644 index 00000000..8d9f1fd4 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_craftingpanel_3x3_small.xui @@ -0,0 +1,2804 @@ + + +530.000000 +290.000000 + + + +XuiCraftingPanel +640.000000 +360.000000 +CXuiSceneCraftingPanel +XuiMenuScene + + + +Group +640.000000 +360.000000 +15 + + + +MainPanel +490.000000 +284.000000 +72.000000,3.000000,0.000000 +CraftingPanel3x3Small + + + + +Group_Tab_Images +640.000000 +50.000000 +48 + + + +TabImage1 +72.000000 +56.000000 +72.000000,1.000000,0.000000 +false +CraftingPanelTabLeftSmall + + + + +TabImage2 +72.000000 +56.000000 +142.000000,1.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage3 +72.000000 +56.000000 +211.000000,1.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage4 +72.000000 +56.000000 +281.000000,1.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage5 +72.000000 +56.000000 +351.000000,1.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage6 +72.000000 +56.000000 +420.000000,1.000000,0.000000 +false +CraftingPanelTabMiddleSmall + + + + +TabImage7 +72.000000 +56.000000 +490.000000,1.000000,0.000000 +false +CraftingPanelTabRightSmall + + + + + +Group_Tab_Icons +640.000000 +50.239975 +48 + + + +Icon_1 +32.000000 +32.000000 +90.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_2 +32.000000 +32.000000 +160.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_3 +32.000000 +32.000000 +230.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_4 +32.000000 +32.000000 +299.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_5 +32.000000 +32.000000 +369.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_6 +32.000000 +32.000000 +439.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_7 +32.000000 +32.000000 +509.000000,14.000000,0.000000 +false +CraftingCategoryIcon + + + + + +SceneCraftScrollGroup +640.000000 +360.000000 +48 + + + +XuiImageScrollBar +22.000000 +67.000000 +92.000000,72.000000,0.000000 +CraftingPanelVScrollSmall + + + + +XuiImageScrollBar2Slot +22.000000 +67.000000 +92.000000,72.000000,0.000000 +CraftingPanelVScrollSmall + + + + +XuiVSlot0 +34.000000 +34.000000 +620.000000,93.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiVSlot1 +34.000000 +34.000000 +620.000000,93.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHighlight +43.000000 +43.000000 +81.000000,84.000000,0.000000 +CraftingPanelHighlightSmall + + + + +XuiVSlot2 +34.000000 +34.000000 +620.000000,93.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot0 +34.000000 +34.000000 +85.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot1 +34.000000 +34.000000 +124.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot2 +34.000000 +34.000000 +163.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot3 +34.000000 +34.000000 +202.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot4 +34.000000 +34.000000 +241.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot5 +34.000000 +34.000000 +280.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot6 +34.000000 +34.000000 +319.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot7 +34.000000 +34.000000 +358.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot8 +34.000000 +34.000000 +397.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot9 +34.000000 +34.000000 +436.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot10 +34.000000 +34.000000 +475.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + +XuiHSlot11 +34.000000 +34.000000 +514.000000,88.000000,0.000000 +4 +7 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + + +Grid +190.307205 +133.200012 +86.000000,141.000000,0.000000 + + + +CraftingArrow +32.000000 +32.000000 +102.000000,65.000000,0.000000 +CraftingProgressArrowSmall + + + + +CraftingOutputRed +50.000000 +50.000000 +137.000000,57.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +CraftingInput1 +32.000000 +32.000000 +3.000000,34.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput2 +32.000000 +32.000000 +35.000000,34.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput3 +32.000000 +32.000000 +67.000000,34.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput4 +32.000000 +32.000000 +3.000000,66.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput5 +32.000000 +32.000000 +35.000000,66.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput6 +32.000000 +32.000000 +67.000000,66.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput7 +32.000000 +32.000000 +3.000000,98.000031,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput8 +32.000000 +32.000000 +35.000031,98.000031,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +CraftingInput9 +32.000000 +32.000000 +67.000031,98.000031,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +XuiHTMLText +252.000000 +108.000000 +204.000000,0.000000,0.000000 +false +XuiHtmlControl + + + + +XuiItemName +182.775574 +50.000000 +3.215019,0.000000,0.000000 +XuiLabelDarkCentredWrapSmall + + + + +Inventory +262.000000 +27.000000 +200.000000,0.000000,0.000000 +false +XuiLabelDarkCentredWrapSmall + + + + +Ingredient4 +24.000000 +24.000000 +210.000000,106.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Ingredient3 +24.000000 +24.000000 +210.000000,78.999992,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Ingredient2 +24.000000 +24.000000 +210.000000,52.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Ingredient1 +24.000000 +24.000000 +210.000000,25.000000,0.000000 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + + +XuiGroupName +400.000000 +27.000000 +117.000000,58.000000,0.000000 +XuiLabelDarkCentredSmall + + + + +InventoryGrid +207.000000 +99.000000 +314.000000,172.000000,0.000000 + + + +Inventory +198.000000 +66.000000 +4.000000,0.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + +UseRow +198.000000 +22.000000 +4.000000,76.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +0.000000,0.000000,0.000000 + + + +0 +0.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +0.000000,0.000000,0.000000 + + + +0 +-212.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +-212.000000,0.000000,0.000000 + + + +0 +0.000000,0.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_credits.h b/Minecraft.Client/Common/Media/xuiscene_credits.h new file mode 100644 index 00000000..bd04240c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_credits.h @@ -0,0 +1,31 @@ +#define IDC_Background L"Background" +#define IDC_XuiText1 L"XuiText1" +#define IDC_XuiText2 L"XuiText2" +#define IDC_XuiText3 L"XuiText3" +#define IDC_XuiText4 L"XuiText4" +#define IDC_XuiText5 L"XuiText5" +#define IDC_XuiText6 L"XuiText6" +#define IDC_XuiText7 L"XuiText7" +#define IDC_XuiText8 L"XuiText8" +#define IDC_XuiText9 L"XuiText9" +#define IDC_XuiText10 L"XuiText10" +#define IDC_XuiText11 L"XuiText11" +#define IDC_XuiText12 L"XuiText12" +#define IDC_XuiText13 L"XuiText13" +#define IDC_XuiText14 L"XuiText14" +#define IDC_XuiText15 L"XuiText15" +#define IDC_XuiText16 L"XuiText16" +#define IDC_XuiText17 L"XuiText17" +#define IDC_XuiText18 L"XuiText18" +#define IDC_XuiText19 L"XuiText19" +#define IDC_XuiText20 L"XuiText20" +#define IDC_XuiText21 L"XuiText21" +#define IDC_XuiText22 L"XuiText22" +#define IDC_XuiText23 L"XuiText23" +#define IDC_XuiText24 L"XuiText24" +#define IDC_XuiText25 L"XuiText25" +#define IDC_XuiText26 L"XuiText26" +#define IDC_XuiText27 L"XuiText27" +#define IDC_XuiText28 L"XuiText28" +#define IDC_Logo L"Logo" +#define IDC_SceneCredits L"SceneCredits" diff --git a/Minecraft.Client/Common/Media/xuiscene_credits.xui b/Minecraft.Client/Common/Media/xuiscene_credits.xui new file mode 100644 index 00000000..caacf6f1 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_credits.xui @@ -0,0 +1,285 @@ + + +1280.000000 +720.000000 + + + +SceneCredits +1280.000000 +720.000000 +CScene_Credits +XuiMenuScene +XuiSliderVolume + + + +Background +1280.000000 +720.000000 +CreditsBackground + + + + +XuiText1 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_XL + + + + +XuiText2 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_XL + + + + +XuiText3 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_XL + + + + +XuiText4 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_L + + + + +XuiText5 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_L + + + + +XuiText6 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_L + + + + +XuiText7 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_L + + + + +XuiText8 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_L + + + + +XuiText9 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_M + + + + +XuiText10 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_L + + + + +XuiText11 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_L + + + + +XuiText12 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_L + + + + +XuiText13 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_L + + + + +XuiText14 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText15 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText16 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText17 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText18 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText19 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText20 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText21 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText22 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText23 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText24 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText25 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText26 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText27 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +XuiText28 +1279.000000 +43.000000 +1.000000,16.000000,0.000000 +XuiCreditsText_S + + + + +Logo +1280.000000 +138.000000 +0.000000,56.000000,0.000000 +MenuTitleLogo + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_credits_480.h b/Minecraft.Client/Common/Media/xuiscene_credits_480.h new file mode 100644 index 00000000..bd04240c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_credits_480.h @@ -0,0 +1,31 @@ +#define IDC_Background L"Background" +#define IDC_XuiText1 L"XuiText1" +#define IDC_XuiText2 L"XuiText2" +#define IDC_XuiText3 L"XuiText3" +#define IDC_XuiText4 L"XuiText4" +#define IDC_XuiText5 L"XuiText5" +#define IDC_XuiText6 L"XuiText6" +#define IDC_XuiText7 L"XuiText7" +#define IDC_XuiText8 L"XuiText8" +#define IDC_XuiText9 L"XuiText9" +#define IDC_XuiText10 L"XuiText10" +#define IDC_XuiText11 L"XuiText11" +#define IDC_XuiText12 L"XuiText12" +#define IDC_XuiText13 L"XuiText13" +#define IDC_XuiText14 L"XuiText14" +#define IDC_XuiText15 L"XuiText15" +#define IDC_XuiText16 L"XuiText16" +#define IDC_XuiText17 L"XuiText17" +#define IDC_XuiText18 L"XuiText18" +#define IDC_XuiText19 L"XuiText19" +#define IDC_XuiText20 L"XuiText20" +#define IDC_XuiText21 L"XuiText21" +#define IDC_XuiText22 L"XuiText22" +#define IDC_XuiText23 L"XuiText23" +#define IDC_XuiText24 L"XuiText24" +#define IDC_XuiText25 L"XuiText25" +#define IDC_XuiText26 L"XuiText26" +#define IDC_XuiText27 L"XuiText27" +#define IDC_XuiText28 L"XuiText28" +#define IDC_Logo L"Logo" +#define IDC_SceneCredits L"SceneCredits" diff --git a/Minecraft.Client/Common/Media/xuiscene_credits_480.xui b/Minecraft.Client/Common/Media/xuiscene_credits_480.xui new file mode 100644 index 00000000..07fdb75a --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_credits_480.xui @@ -0,0 +1,286 @@ + + +640.000000 +480.000000 + + + +SceneCredits +640.000000 +480.000000 +CScene_Credits +XuiMenuScene +XuiSliderVolume + + + +Background +854.000000 +480.000000 +-107.000000,0.000000,0.000000 +CreditsBackground + + + + +XuiText1 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_20_XL + + + + +XuiText2 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_20_XL + + + + +XuiText3 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_20_XL + + + + +XuiText4 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_14_L + + + + +XuiText5 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_14_L + + + + +XuiText6 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_14_L + + + + +XuiText7 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_14_L + + + + +XuiText8 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_14_L + + + + +XuiText9 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_M + + + + +XuiText10 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_14_L + + + + +XuiText11 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_14_L + + + + +XuiText12 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_14_L + + + + +XuiText13 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_14_L + + + + +XuiText14 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText15 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText16 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText17 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText18 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText19 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText20 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText21 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText22 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText23 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText24 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText25 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText26 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText27 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +XuiText28 +640.000000 +43.000000 +0.000000,16.000000,0.000000 +XuiCreditsText_480_S + + + + +Logo +640.000000 +70.000000 +0.000000,48.000000,0.000000 +MenuTitleLogo + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_death.h b/Minecraft.Client/Common/Media/xuiscene_death.h new file mode 100644 index 00000000..422608e6 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_death.h @@ -0,0 +1,4 @@ +#define IDC_ExitGame L"ExitGame" +#define IDC_Respawn L"Respawn" +#define IDC_Title L"Title" +#define IDC_SceneDeath L"SceneDeath" diff --git a/Minecraft.Client/Common/Media/xuiscene_death.xui b/Minecraft.Client/Common/Media/xuiscene_death.xui new file mode 100644 index 00000000..28582083 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_death.xui @@ -0,0 +1,49 @@ + + +1280.000000 +720.000000 + + + +SceneDeath +1280.000000 +720.000000 +CScene_Death +XuiMenuScene +Respawn + + + +ExitGame +400.000000 +40.000000 +440.000000,450.000000,0.000000 +XuiMainMenuButton_L +Respawn +Respawn +22528 + + + + +Respawn +400.000000 +40.000000 +440.000000,400.000000,0.000000 +XuiMainMenuButton_L +ExitGame +ExitGame +22528 + + + + +Title +400.000000 +100.000000 +440.000061,92.000000,0.000000 +XuiTitle + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_death_480.h b/Minecraft.Client/Common/Media/xuiscene_death_480.h new file mode 100644 index 00000000..422608e6 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_death_480.h @@ -0,0 +1,4 @@ +#define IDC_ExitGame L"ExitGame" +#define IDC_Respawn L"Respawn" +#define IDC_Title L"Title" +#define IDC_SceneDeath L"SceneDeath" diff --git a/Minecraft.Client/Common/Media/xuiscene_death_480.xui b/Minecraft.Client/Common/Media/xuiscene_death_480.xui new file mode 100644 index 00000000..189cf93a --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_death_480.xui @@ -0,0 +1,49 @@ + + +640.000000 +480.000000 + + + +SceneDeath +640.000000 +480.000000 +CScene_Death +XuiMenuScene +Respawn + + + +ExitGame +300.000000 +36.000000 +170.000031,340.000000,0.000000 +XuiMainMenuButton_L_Thin +Respawn +Respawn +22528 + + + + +Respawn +300.000000 +36.000000 +170.000031,300.000000,0.000000 +XuiMainMenuButton_L_Thin +ExitGame +ExitGame +22528 + + + + +Title +400.000000 +100.000000 +120.000061,150.000000,0.000000 +XuiTitle + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_death_small.h b/Minecraft.Client/Common/Media/xuiscene_death_small.h new file mode 100644 index 00000000..422608e6 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_death_small.h @@ -0,0 +1,4 @@ +#define IDC_ExitGame L"ExitGame" +#define IDC_Respawn L"Respawn" +#define IDC_Title L"Title" +#define IDC_SceneDeath L"SceneDeath" diff --git a/Minecraft.Client/Common/Media/xuiscene_death_small.xui b/Minecraft.Client/Common/Media/xuiscene_death_small.xui new file mode 100644 index 00000000..bb5b155b --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_death_small.xui @@ -0,0 +1,49 @@ + + +640.000000 +360.000000 + + + +SceneDeath +640.000000 +360.000000 +CScene_Death +XuiMenuScene +Respawn + + + +ExitGame +400.000000 +40.000000 +120.000000,233.000000,0.000000 +XuiMainMenuButton_L +Respawn +Respawn +22528 + + + + +Respawn +400.000000 +40.000000 +120.000000,188.000000,0.000000 +XuiMainMenuButton_L +ExitGame +ExitGame +22528 + + + + +Title +400.000000 +60.000000 +120.000061,120.000000,0.000000 +XuiTitle + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_debug.h b/Minecraft.Client/Common/Media/xuiscene_debug.h new file mode 100644 index 00000000..9d24be6b --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debug.h @@ -0,0 +1,6 @@ +#define IDC_XuiImage1 L"XuiImage1" +#define IDC_XuiCheckbox1 L"XuiCheckbox1" +#define IDC_XuiCheckbox2 L"XuiCheckbox2" +#define IDC_XuiCheckbox3 L"XuiCheckbox3" +#define IDC_XuiCheckbox4 L"XuiCheckbox4" +#define IDC_SceneDebug L"SceneDebug" diff --git a/Minecraft.Client/Common/Media/xuiscene_debug.xui b/Minecraft.Client/Common/Media/xuiscene_debug.xui new file mode 100644 index 00000000..4e9b87fb --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debug.xui @@ -0,0 +1,60 @@ + + +1280.000000 +720.000000 + + + +SceneDebug +1280.000000 +720.000000 +CScene_Debug +XuiSliderVolume + + + +XuiImage1 +556.000061 +97.000008 +361.000061,60.000000,0.000000 +Graphics\MenuTitle.png + + + + +XuiCheckbox1 +198.000000 +50.000000 +376.000000,218.999985,0.000000 +false + + + + +XuiCheckbox2 +198.000000 +50.000000 +376.000000,291.999969,0.000000 +false + + + + +XuiCheckbox3 +198.000000 +50.000000 +376.000000,365.000000,0.000000 +false + + + + +XuiCheckbox4 +198.000000 +50.000000 +376.000000,438.000031,0.000000 +false + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_debug_480.h b/Minecraft.Client/Common/Media/xuiscene_debug_480.h new file mode 100644 index 00000000..0189ed44 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debug_480.h @@ -0,0 +1,5 @@ +#define IDC_XuiCheckbox1 L"XuiCheckbox1" +#define IDC_XuiCheckbox2 L"XuiCheckbox2" +#define IDC_XuiCheckbox3 L"XuiCheckbox3" +#define IDC_XuiCheckbox4 L"XuiCheckbox4" +#define IDC_SceneDebug L"SceneDebug" diff --git a/Minecraft.Client/Common/Media/xuiscene_debug_480.xui b/Minecraft.Client/Common/Media/xuiscene_debug_480.xui new file mode 100644 index 00000000..b548b1de --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debug_480.xui @@ -0,0 +1,51 @@ + + +640.000000 +480.000000 + + + +SceneDebug +640.000000 +480.000000 +CScene_Debug +XuiSliderVolume + + + +XuiCheckbox1 +198.000000 +50.000000 +221.000000,103.999985,0.000000 +false + + + + +XuiCheckbox2 +198.000000 +50.000000 +221.000000,176.999969,0.000000 +false + + + + +XuiCheckbox3 +198.000000 +50.000000 +221.000000,250.000000,0.000000 +false + + + + +XuiCheckbox4 +198.000000 +50.000000 +221.000000,323.000031,0.000000 +false + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_debug_item_editor.h b/Minecraft.Client/Common/Media/xuiscene_debug_item_editor.h new file mode 100644 index 00000000..0508e92a --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debug_item_editor.h @@ -0,0 +1,12 @@ +#define IDC_icon L"icon" +#define IDC_itemName L"itemName" +#define IDC_itemId L"itemId" +#define IDC_XuiLabel1 L"XuiLabel1" +#define IDC_itemAuxValue L"itemAuxValue" +#define IDC_XuiLabel2 L"XuiLabel2" +#define IDC_itemCount L"itemCount" +#define IDC_XuiLabel3 L"XuiLabel3" +#define IDC_item4JData L"item4JData" +#define IDC_XuiLabel4 L"XuiLabel4" +#define IDC_ruleXml L"ruleXml" +#define IDC_DebugItemEditor L"DebugItemEditor" diff --git a/Minecraft.Client/Common/Media/xuiscene_debug_item_editor.xui b/Minecraft.Client/Common/Media/xuiscene_debug_item_editor.xui new file mode 100644 index 00000000..0a69a9a6 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debug_item_editor.xui @@ -0,0 +1,132 @@ + + +1280.000000 +720.000000 + + + +DebugItemEditor +685.000061 +400.000000 +297.500031,195.000046,0.000000 +CScene_DebugItemEditor +itemId + + + +icon +46.000000 +46.000000 +23.000000,28.999985,0.000000 +1 +7 +CXuiCtrlCraftIngredientSlot +XuiVisualImagePresenter + + + + +itemName +339.000000 +34.000000 +83.000000,32.000000,0.000000 +XuiLabelDark + + + + +itemId +200.000000 +23.000000,107.000000,0.000000 +CXuiCtrl4JEdit +itemCount +itemAuxValue +0123456789 + + + + +XuiLabel1 +257.000000 +34.000000 +23.000000,77.000000,0.000000 +XuiLabelDarkLeftWrap +Item Id + + + + +itemAuxValue +200.000000 +23.000000,169.999985,0.000000 +CXuiCtrl4JEdit +item4JData +itemId +itemCount +0123456789 + + + + +XuiLabel2 +257.000000 +34.000000 +23.000000,143.000000,0.000000 +XuiLabelDarkLeftWrap +Aux Value + + + + +itemCount +200.000000 +346.000000,102.999962,0.000000 +CXuiCtrl4JEdit +itemId +itemAuxValue +item4JData +0123456789 + + + + +XuiLabel3 +257.000000 +34.000000 +346.000000,76.999992,0.000000 +XuiLabelDarkLeftWrap +Item Count + + + + +item4JData +200.000000 +346.000000,163.000000,0.000000 +CXuiCtrl4JEdit +itemAuxValue +itemCount +0123456789 + + + + +XuiLabel4 +257.000000 +34.000000 +346.000000,134.000000,0.000000 +XuiLabelDarkLeftWrap +4J Data + + + + +ruleXml +644.000000 +156.000000 +18.000000,218.000000,0.000000 +XuiLabelDarkLeftWrap + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_debug_schematic_create.h b/Minecraft.Client/Common/Media/xuiscene_debug_schematic_create.h new file mode 100644 index 00000000..00555f9d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debug_schematic_create.h @@ -0,0 +1,19 @@ +#define IDC_StartX L"StartX" +#define IDC_StartY L"StartY" +#define IDC_StartZ L"StartZ" +#define IDC_EndX L"EndX" +#define IDC_EndY L"EndY" +#define IDC_EndZ L"EndZ" +#define IDC_XuiLabel1 L"XuiLabel1" +#define IDC_XuiLabel2 L"XuiLabel2" +#define IDC_XuiLabel3 L"XuiLabel3" +#define IDC_XuiLabel4 L"XuiLabel4" +#define IDC_XuiLabel5 L"XuiLabel5" +#define IDC_XuiLabel6 L"XuiLabel6" +#define IDC_CreateButton L"CreateButton" +#define IDC_Name L"Name" +#define IDC_XuiLabel7 L"XuiLabel7" +#define IDC_XuiLabel8 L"XuiLabel8" +#define IDC_SaveMobs L"SaveMobs" +#define IDC_UseXboxCompression L"UseXboxCompression" +#define IDC_XuiDebugSchematic L"XuiDebugSchematic" diff --git a/Minecraft.Client/Common/Media/xuiscene_debug_schematic_create.xui b/Minecraft.Client/Common/Media/xuiscene_debug_schematic_create.xui new file mode 100644 index 00000000..0916c038 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debug_schematic_create.xui @@ -0,0 +1,220 @@ + + +1280.000000 +720.000000 + + + +XuiDebugSchematic +823.000000 +510.000000 +228.000000,105.000046,0.000000 +CScene_DebugSchematicCreator +Name + + + +StartX +245.000000 +33.000000 +34.000015,158.000000,0.000000 +CXuiCtrl4JEdit +EndX +Name +StartY +0123456789- + + + + +StartY +245.000000 +33.000000 +34.000015,243.000000,0.000000 +CXuiCtrl4JEdit +EndY +StartX +StartZ +0123456789- + + + + +StartZ +245.000000 +33.000000 +34.000015,328.000000,0.000000 +CXuiCtrl4JEdit +EndZ +StartY +EndX +0123456789- + + + + +EndX +245.000000 +33.000000 +308.000000,158.000000,0.000000 +CXuiCtrl4JEdit +StartX +Name +EndY +0123456789- + + + + +EndY +245.000000 +33.000000 +308.000000,243.000000,0.000000 +CXuiCtrl4JEdit +StartY +EndX +EndZ +0123456789- + + + + +EndZ +245.000000 +33.000000 +308.000000,328.000000,0.000000 +CXuiCtrl4JEdit +StartZ +EndY +SaveMobs +0123456789- + + + + +XuiLabel1 +233.000000 +24.000000 +33.000000,128.000015,0.000000 +XuiLabelDark +StartX + + + + +XuiLabel2 +233.000000 +24.000000 +34.000000,212.000015,0.000000 +XuiLabelDark +StartY + + + + +XuiLabel3 +233.000000 +24.000000 +35.000000,293.000000,0.000000 +XuiLabelDark +StartZ + + + + +XuiLabel4 +233.000000 +24.000000 +305.000061,125.000000,0.000000 +XuiLabelDark +EndX + + + + +XuiLabel5 +233.000000 +24.000000 +314.000061,212.000015,0.000000 +XuiLabelDark +EndY + + + + +XuiLabel6 +233.000000 +24.000000 +306.000061,295.000000,0.000000 +XuiLabelDark +EndZ + + + + +CreateButton +734.000000 +52.000000 +38.000000,437.000000,0.000000 +SaveMobs +Create + + + + +Name +759.000000 +47.000000 +32.000031,64.000000,0.000000 +CXuiCtrl4JEdit +StartX +schematic +64 + + + + +XuiLabel7 +480.000000 +42.000000 +31.000000,13.000000,0.000000 +XuiLabelDark +Name + + + + +XuiLabel8 +222.000000 +236.000000 +570.000000,124.000000,0.000000 +XuiLabelDarkLeftWrap +Start co-ords should be even, end co-ords should be odd. If they are not the area included will be expanded. + + + + +SaveMobs +309.000000 +39.000000 +43.000000,388.000000,0.000000 +UseXboxCompression +EndZ +CreateButton +Save Mobs + + + + +UseXboxCompression +309.000000 +39.000000 +353.000000,388.000000,0.000000 +SaveMobs +EndZ +CreateButton +Use Xbox Compression + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_debug_set_camera.h b/Minecraft.Client/Common/Media/xuiscene_debug_set_camera.h new file mode 100644 index 00000000..f09bfb5e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debug_set_camera.h @@ -0,0 +1,13 @@ +#define IDC_CamX L"CamX" +#define IDC_CamZ L"CamZ" +#define IDC_YRot L"YRot" +#define IDC_CamY L"CamY" +#define IDC_Elevation L"Elevation" +#define IDC_XuiLabel1 L"XuiLabel1" +#define IDC_XuiLabel2 L"XuiLabel2" +#define IDC_XuiLabel3 L"XuiLabel3" +#define IDC_XuiLabel4 L"XuiLabel4" +#define IDC_XuiLabel7 L"XuiLabel7" +#define IDC_LockPlayer L"LockPlayer" +#define IDC_Teleport L"Teleport" +#define IDC_XuiDebugSetCamera L"XuiDebugSetCamera" diff --git a/Minecraft.Client/Common/Media/xuiscene_debug_set_camera.xui b/Minecraft.Client/Common/Media/xuiscene_debug_set_camera.xui new file mode 100644 index 00000000..33c64fc9 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debug_set_camera.xui @@ -0,0 +1,160 @@ + + +1280.000000 +720.000000 + + + +XuiDebugSetCamera +267.275146 +360.700745 +993.158508,15.835232,0.000000 +true +CScene_DebugSetCamera +LockPlayer + + + +CamX +80.000000 +33.000000 +20.000000,100.000000,0.000000 +CXuiCtrl4JEdit +CamZ +CamY +Teleport +YRot +0123456789.- + + + + +CamZ +80.000000 +33.000000 +180.000000,100.000000,0.000000 +CXuiCtrl4JEdit +CamY +CamX +Teleport +Elevation +0123456789.- + + + + +YRot +80.000000 +33.000000 +20.000000,185.000000,0.000000 +CXuiCtrl4JEdit +Elevation +Elevation +CamX +LockPlayer +0123456789.- + + + + +CamY +80.000000 +33.000000 +100.000000,100.000000,0.000000 +CXuiCtrl4JEdit +CamX +CamZ +Teleport +Elevation +0123456789.- + + + + +Elevation +80.000000 +33.000000 +100.000000,185.000000,0.000000 +CXuiCtrl4JEdit +YRot +YRot +CamY +LockPlayer +0123456789.- + + + + +XuiLabel1 +80.000000 +24.000000 +20.000000,70.000015,0.000000 +XuiLabelDark +Cam-X + + + + +XuiLabel2 +140.000000 +24.000000 +180.000000,67.000000,0.000000 +XuiLabelDark +Cam-Z + + + + +XuiLabel3 +236.599915 +24.000000 +10.000000,150.000000,0.000000 +XuiLabelDark +Y-Rot & Elevation (Degs) + + + + +XuiLabel4 +80.000000 +24.000000 +100.000000,70.000000,0.000000 +XuiLabelDark +Cam-Y + + + + +XuiLabel7 +183.599976 +42.000000 +20.000000,14.000000,0.000000 +XuiLabelDark +Set Camera Position + + + + +LockPlayer +180.129578 +39.000000 +21.000000,240.399994,0.000000 +CXuiCheckbox +YRot +Teleport +Lock Player + + + + +Teleport +180.928040 +40.000000 +20.320000,296.820038,0.000000 +LockPlayer +CamX +Teleport + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_debug_small.h b/Minecraft.Client/Common/Media/xuiscene_debug_small.h new file mode 100644 index 00000000..2af4a6e0 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debug_small.h @@ -0,0 +1,2 @@ +#define IDC_XuiCheckbox1 L"XuiCheckbox1" +#define IDC_SceneDebug L"SceneDebug" diff --git a/Minecraft.Client/Common/Media/xuiscene_debug_small.xui b/Minecraft.Client/Common/Media/xuiscene_debug_small.xui new file mode 100644 index 00000000..2642e787 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debug_small.xui @@ -0,0 +1,24 @@ + + +1280.000000 +720.000000 + + + +SceneDebug +640.000000 +360.000000 +CScene_Debug +XuiSliderVolume + + + +XuiCheckbox1 +198.000000 +50.000000 +22.000000,23.999969,0.000000 +false + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_debugoverlay.h b/Minecraft.Client/Common/Media/xuiscene_debugoverlay.h new file mode 100644 index 00000000..3afbf714 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debugoverlay.h @@ -0,0 +1,25 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_ItemsList L"ItemsList" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_EnchantmentsList L"EnchantmentsList" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_MobList L"MobList" +#define IDC_SliderFov L"SliderFov" +#define IDC_SliderTime L"SliderTime" +#define IDC_SetNight L"SetNight" +#define IDC_SetDay L"SetDay" +#define IDC_ToggleThunder L"ToggleThunder" +#define IDC_ToggleRain L"ToggleRain" +#define IDC_CreateSchematic L"CreateSchematic" +#define IDC_ResetTutorial L"ResetTutorial" +#define IDC_SetCamera L"SetCamera" +#define IDC_SaveToFile L"SaveToFile" +#define IDC_ChunkRadius L"ChunkRadius" +#define IDC_DebugOverlay L"DebugOverlay" diff --git a/Minecraft.Client/Common/Media/xuiscene_debugoverlay.xui b/Minecraft.Client/Common/Media/xuiscene_debugoverlay.xui new file mode 100644 index 00000000..3326003b --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debugoverlay.xui @@ -0,0 +1,323 @@ + + +1280.000000 +720.000000 + + + +DebugOverlay +859.000000 +718.000000 +422.000031,1.000000,0.000000 +CScene_DebugOverlay +ItemsList + + + +ItemsList +413.000000 +274.000000 +431.000000,404.000000,0.000000 +DebugList +SliderFov +SliderFov +EnchantmentsList +MobList + + + +control_ListItem +469.000000 +40.000000 +10.000000,14.000000,0.000000 +5 +false +DebugButton + + + + +control_ListItem +469.000000 +40.000000 +10.000000,14.000000,0.000000 +5 +false +DebugButton + + + + +control_ListItem +469.000000 +40.000000 +10.000000,14.000000,0.000000 +5 +false +DebugButton + + + + + +EnchantmentsList +413.000000 +180.000000 +428.000000,213.999954,0.000000 +DebugList +SetNight +SetNight +MobList +ItemsList + + + +control_ListItem +469.000000 +40.000000 +10.000000,14.000000,0.000000 +5 +false +DebugButton + + + + +control_ListItem +469.000000 +40.000000 +10.000000,14.000000,0.000000 +5 +false +DebugButton + + + + +control_ListItem +469.000000 +40.000000 +10.000000,14.000000,0.000000 +5 +false +DebugButton + + + + +control_ListItem +469.000000 +40.000000 +10.000000,14.000000,0.000000 +5 +false +DebugButton + + + + + +MobList +413.000000 +180.000000 +428.000000,24.999954,0.000000 +DebugList +SetCamera +SetCamera +ItemsList +EnchantmentsList + + + +control_ListItem +469.000000 +40.000000 +10.000000,14.000000,0.000000 +5 +false +DebugButton + + + + +control_ListItem +469.000000 +40.000000 +10.000000,14.000000,0.000000 +5 +false +DebugButton + + + + +control_ListItem +469.000000 +40.000000 +10.000000,14.000000,0.000000 +5 +false +DebugButton + + + + + +SliderFov +365.000000 +36.000000 +26.000000,309.000031,0.000000 +EnchantmentsList +EnchantmentsList +SliderTime +SetCamera +Set fov + + + + +SliderTime +365.000000 +36.000000 +26.000000,265.000000,0.000000 +EnchantmentsList +EnchantmentsList +SetDay +SliderFov +Set time (unsafe) +24000 +100 +50 +10 + + + + +SetNight +190.000000 +40.000000 +203.000000,224.000000,0.000000 +XuiMainMenuButton_L +SetDay +EnchantmentsList +ToggleThunder +SliderTime +Night + + + + +SetDay +168.000000 +40.000000 +28.000000,224.000000,0.000000 +XuiMainMenuButton_L +EnchantmentsList +SetNight +ToggleRain +SliderTime +Day + + + + +ToggleThunder +190.000000 +40.000000 +203.000061,165.000000,0.000000 +XuiMainMenuButton_L +ToggleRain +MobList +CreateSchematic +SetNight +Toggle Thunder + + + + +ToggleRain +168.000000 +40.000000 +28.000000,165.000000,0.000000 +XuiMainMenuButton_L +MobList +ToggleThunder +CreateSchematic +SetDay +Toggle Rain + + + + +CreateSchematic +365.000000 +40.000000 +26.000000,118.000015,0.000000 +XuiMainMenuButton_L +MobList +MobList +ResetTutorial +ToggleRain +Create Schematic + + + + +ResetTutorial +365.000000 +40.000000 +26.000000,73.000000,0.000000 +XuiMainMenuButton_L +MobList +MobList +SetCamera +CreateSchematic +Reset profile tutorial progress + + + + +SetCamera +365.000000 +40.000000 +25.000000,29.000002,0.000000 +XuiMainMenuButton_L +MobList +MobList +SliderFov +ResetTutorial +Set camera + + + + +SaveToFile +229.000000 +40.000000 +38.000000,36.000000,0.000000 +false +XuiMainMenuButton_L +false +ChunkRadius +ItemsList +SetSpawn +Save Level To File + + + + +ChunkRadius +195.999985 +87.000000 +263.000061,14.000000,0.000000 +false +false +SaveToFile +ItemsList +SetSpawn +Radius (chunks > 0) +64 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_debugoverlay_480.h b/Minecraft.Client/Common/Media/xuiscene_debugoverlay_480.h new file mode 100644 index 00000000..0417fc0e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debugoverlay_480.h @@ -0,0 +1,13 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_ItemsList L"ItemsList" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_MobList L"MobList" +#define IDC_SliderFov L"SliderFov" +#define IDC_SliderTime L"SliderTime" +#define IDC_ToggleThunder L"ToggleThunder" +#define IDC_ToggleRain L"ToggleRain" +#define IDC_SetSpawn L"SetSpawn" +#define IDC_ResetTutorial L"ResetTutorial" +#define IDC_SaveToFile L"SaveToFile" +#define IDC_ChunkRadius L"ChunkRadius" +#define IDC_DebugOverlay L"DebugOverlay" diff --git a/Minecraft.Client/Common/Media/xuiscene_debugoverlay_480.xui b/Minecraft.Client/Common/Media/xuiscene_debugoverlay_480.xui new file mode 100644 index 00000000..1c94d25e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debugoverlay_480.xui @@ -0,0 +1,161 @@ + + +640.000000 +480.000000 + + + +DebugOverlay +300.000000 +480.000000 +340.000000,1.000000,0.000000 +CScene_DebugOverlay +ItemsList + + + +ItemsList +223.000000 +125.999969 +35.000000,329.000000,0.000000 +DebugList +MobList +ResetTutorial + + + +control_ListItem +469.000000 +40.000000 +10.000000,14.000000,0.000000 +5 +false +DebugButton + + + + + +MobList +225.000000 +90.999969 +33.000000,238.999969,0.000000 +DebugList +SliderFov +ItemsList + + + +control_ListItem +469.000000 +40.000000 +10.000000,14.000000,0.000000 +5 +false +DebugButton + + + + + +SliderFov +200.000000 +38.000000 +46.000046,201.000000,0.000000 +SliderTime +MobList +Set fov + + + + +SliderTime +200.000000 +38.000000 +45.000046,164.000000,0.000000 +ToggleRain +SliderFov +Set time (unsafe) +24000 +100 +50 +10 + + + + +ToggleThunder +100.000000 +150.000061,132.000000,0.000000 +XuiMainMenuButton_L +ToggleRain +SetSpawn +SliderTime +Toggle Thunder + + + + +ToggleRain +100.000000 +41.000000,132.000000,0.000000 +XuiMainMenuButton_L +ToggleThunder +SetSpawn +SliderTime +Toggle Rain + + + + +SetSpawn +210.000000 +41.000000,95.000000,0.000000 +XuiMainMenuButton_L +false +ResetTutorial +ToggleRain +Set Level Spawn Point To Here + + + + +ResetTutorial +210.000000 +41.000000,57.999996,0.000000 +XuiMainMenuButton_L +ItemsList +SetSpawn +Reset profile tutorial progress + + + + +SaveToFile +100.000000 +38.000000,29.000000,0.000000 +false +XuiMainMenuButton_L +false +ChunkRadius +ItemsList +SetSpawn +Save Level To File + + + + +ChunkRadius +100.000000 +150.000061,29.000000,0.000000 +false +false +SaveToFile +ItemsList +SetSpawn +Radius (chunks > 0) +64 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_debugtips.h b/Minecraft.Client/Common/Media/xuiscene_debugtips.h new file mode 100644 index 00000000..9bf5ae71 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debugtips.h @@ -0,0 +1,2 @@ +#define IDC_Tip L"Tip" +#define IDC_DebugTips L"DebugTips" diff --git a/Minecraft.Client/Common/Media/xuiscene_debugtips.xui b/Minecraft.Client/Common/Media/xuiscene_debugtips.xui new file mode 100644 index 00000000..7eead8d7 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debugtips.xui @@ -0,0 +1,39 @@ + + +1280.000000 +720.000000 + + + +DebugTips +1280.000000 +720.000000 +CScene_DebugTips +XuiMenuScene +ButtonConfirm + + + +Tip +800.000000 +100.000000 +240.000061,520.000000,0.000000 +TipPanel + + + + + +Normal + + + +EndNormal + +gotoandplay +Normal + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_debugtips_480.h b/Minecraft.Client/Common/Media/xuiscene_debugtips_480.h new file mode 100644 index 00000000..9bf5ae71 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debugtips_480.h @@ -0,0 +1,2 @@ +#define IDC_Tip L"Tip" +#define IDC_DebugTips L"DebugTips" diff --git a/Minecraft.Client/Common/Media/xuiscene_debugtips_480.xui b/Minecraft.Client/Common/Media/xuiscene_debugtips_480.xui new file mode 100644 index 00000000..73a3c759 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debugtips_480.xui @@ -0,0 +1,39 @@ + + +1280.000000 +720.000000 + + + +DebugTips +640.000000 +480.000000 +CScene_DebugTips +XuiMenuScene +ButtonConfirm + + + +Tip +500.000000 +120.000000 +70.000000,256.000061,0.000000 +TipPanel + + + + + +Normal + + + +EndNormal + +gotoandplay +Normal + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_debugtips_small.h b/Minecraft.Client/Common/Media/xuiscene_debugtips_small.h new file mode 100644 index 00000000..9bf5ae71 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debugtips_small.h @@ -0,0 +1,2 @@ +#define IDC_Tip L"Tip" +#define IDC_DebugTips L"DebugTips" diff --git a/Minecraft.Client/Common/Media/xuiscene_debugtips_small.xui b/Minecraft.Client/Common/Media/xuiscene_debugtips_small.xui new file mode 100644 index 00000000..b12d9409 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_debugtips_small.xui @@ -0,0 +1,39 @@ + + +1280.000000 +720.000000 + + + +DebugTips +640.000000 +480.000000 +CScene_DebugTips +XuiMenuScene +ButtonConfirm + + + +Tip +500.000000 +120.000000 +70.000000,180.000061,0.000000 +TipPanel + + + + + +Normal + + + +EndNormal + +gotoandplay +Normal + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_enchant.h b/Minecraft.Client/Common/Media/xuiscene_enchant.h new file mode 100644 index 00000000..a074055a --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_enchant.h @@ -0,0 +1,203 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Ingredient L"Ingredient" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_EnchantText L"EnchantText" +#define IDC_InventoryText L"InventoryText" +#define IDC_EnchantmentBook L"EnchantmentBook" +#define IDC_EnchantPanel L"EnchantPanel" +#define IDC_EnchantButton3 L"EnchantButton3" +#define IDC_EnchantButton2 L"EnchantButton2" +#define IDC_EnchantButton1 L"EnchantButton1" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneInventory L"XuiSceneInventory" diff --git a/Minecraft.Client/Common/Media/xuiscene_enchant.xui b/Minecraft.Client/Common/Media/xuiscene_enchant.xui new file mode 100644 index 00000000..615a17d6 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_enchant.xui @@ -0,0 +1,3155 @@ + + +1280.000000 +720.000000 + + + +XuiSceneInventory +1280.000000 +720.000000 +CXuiSceneEnchant +XuiBlankScene +Pointer + + + +Group +431.000000 +435.000000 +424.000000,95.000000,0.000000 +15 +XuiScene +Pointer + + + +Ingredient +42.000000 +42.000000 +66.000000,132.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridEnchant + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant +22594 +4 + + + + + +Inventory +382.000000 +150.000000 +25.000000,230.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +UseRow +381.000000 +50.000000 +25.000000,369.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +EnchantText +375.000000 +33.000000 +25.000000,14.000000,0.000000 +9 +LabelContainerSceneLeft + + + + +InventoryText +375.000000 +33.000000 +25.000000,200.000000,0.000000 +9 +LabelContainerSceneLeft + + + + +EnchantmentBook +122.000000 +78.000000 +25.999998,48.000000,0.000000 +3 +CXuiCtrlEnchantmentBook + + + + +EnchantPanel +244.000000 +130.000000 +160.000000,46.000000,0.000000 +PanelRecessed +false + + + + +EnchantButton3 +240.000000 +42.000000 +162.000000,132.000000,0.000000 +CXuiCtrlEnchantmentButton +EnchantmentButton +false + + + + +EnchantButton2 +240.000000 +42.000000 +162.000000,90.000000,0.000000 +CXuiCtrlEnchantmentButton +EnchantmentButton +false + + + + +EnchantButton1 +240.000000 +42.000000 +162.000000,48.000000,0.000000 +CXuiCtrlEnchantmentButton +EnchantmentButton +false + + + + +Pointer +42.000000 +42.000000 +-185.000000,-84.000015,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointer + + + + + +Normal + + + +EndNormal + + + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +424.000000,95.000000,0.000000 + + + +0 +424.000000,95.000000,0.000000 + + + +2 +100 +-100 +50 +424.000000,95.000000,0.000000 + + + +0 +160.000000,95.000000,0.000000 + + + +2 +100 +-100 +50 +160.000000,95.000000,0.000000 + + + +0 +424.000000,95.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_enchant_480.h b/Minecraft.Client/Common/Media/xuiscene_enchant_480.h new file mode 100644 index 00000000..463291c0 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_enchant_480.h @@ -0,0 +1,199 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_EnchantText L"EnchantText" +#define IDC_InventoryText L"InventoryText" +#define IDC_EnchantPanel L"EnchantPanel" +#define IDC_EnchantButton3 L"EnchantButton3" +#define IDC_EnchantButton2 L"EnchantButton2" +#define IDC_EnchantButton1 L"EnchantButton1" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Ingredient L"Ingredient" +#define IDC_EnchantmentBook L"EnchantmentBook" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneInventory L"XuiSceneInventory" diff --git a/Minecraft.Client/Common/Media/xuiscene_enchant_480.xui b/Minecraft.Client/Common/Media/xuiscene_enchant_480.xui new file mode 100644 index 00000000..d382a347 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_enchant_480.xui @@ -0,0 +1,2650 @@ + + +640.000000 +480.000000 + + + +XuiSceneInventory +640.000000 +480.000000 +CXuiSceneEnchant +XuiBlankScene +Pointer + + + +Group +260.000000 +290.000000 +190.000015,96.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Inventory +234.000000 +80.000000 +13.000001,160.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +234.000000 +13.000001,250.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +EnchantText +232.000000 +22.000000 +12.000000,12.000000,0.000000 +9 +LabelContainerSceneLeftSmall + + + + +InventoryText +232.000000 +22.000000 +12.000000,138.000000,0.000000 +9 +LabelContainerSceneLeftSmall + + + + +EnchantPanel +144.000000 +94.000000 +103.000000,34.000000,0.000000 +PanelRecessed +false + + + + +EnchantButton3 +140.000000 +105.000000,96.000000,0.000000 +CXuiCtrlEnchantmentButton +EnchantmentButton_Small +false + + + + +EnchantButton2 +140.000000 +105.000000,66.000000,0.000000 +CXuiCtrlEnchantmentButton +EnchantmentButton_Small +false + + + + +EnchantButton1 +140.000000 +105.000000,36.000000,0.000000 +CXuiCtrlEnchantmentButton +EnchantmentButton_Small +false + + + + +Ingredient +32.000000 +32.000000 +38.000000,96.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridEnchant32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant32 +22594 +4 + + + + + +EnchantmentBook +88.000000 +54.000000 +11.000000,34.000000,0.000000 +3 +CXuiCtrlEnchantmentBook +..\Images\img1.png + + + + +Pointer +26.000000 +26.000000 +-50.000000,-50.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000015,96.000000,0.000000 + + + +0 +190.000000,96.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,96.000000,0.000000 + + + +0 +32.000000,96.000000,0.000000 + + + +2 +100 +-100 +50 +60.000000,96.000000,0.000000 + + + +0 +190.000000,96.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_enchant_small.h b/Minecraft.Client/Common/Media/xuiscene_enchant_small.h new file mode 100644 index 00000000..f90d3fce --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_enchant_small.h @@ -0,0 +1,216 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Ingredient L"Ingredient" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_EnchantText L"EnchantText" +#define IDC_InventoryText L"InventoryText" +#define IDC_EnchantmentBook L"EnchantmentBook" +#define IDC_EnchantPanel L"EnchantPanel" +#define IDC_EnchantButton3 L"EnchantButton3" +#define IDC_EnchantButton2 L"EnchantButton2" +#define IDC_EnchantButton1 L"EnchantButton1" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneEnchant L"XuiSceneEnchant" diff --git a/Minecraft.Client/Common/Media/xuiscene_enchant_small.xui b/Minecraft.Client/Common/Media/xuiscene_enchant_small.xui new file mode 100644 index 00000000..7a248b2f --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_enchant_small.xui @@ -0,0 +1,2870 @@ + + +640.000000 +360.000000 + + + +XuiSceneEnchant +640.000000 +360.000000 +CXuiSceneEnchant +XuiBlankScene +Pointer + + + +Group +260.000000 +280.000000 +190.000000,0.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Ingredient +32.000000 +32.000000 +38.000000,96.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridEnchant32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonEnchant32 +22594 +4 + + + + + +Inventory +234.000000 +80.000000 +13.000001,153.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +234.000000 +13.000001,243.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +EnchantText +232.000000 +22.000000 +12.000000,12.000000,0.000000 +9 +LabelContainerSceneLeftSmall + + + + +InventoryText +232.000000 +22.000000 +12.000000,131.000000,0.000000 +9 +LabelContainerSceneLeftSmall + + + + +EnchantmentBook +88.000000 +54.000000 +11.000000,34.000000,0.000000 +3 +CXuiCtrlEnchantmentBook +..\Images\img1.png + + + + +EnchantPanel +144.000000 +94.000000 +103.000000,34.000000,0.000000 +PanelRecessed +false + + + + +EnchantButton3 +140.000000 +105.000000,96.000000,0.000000 +CXuiCtrlEnchantmentButton +EnchantmentButton_Small +false + + + + +EnchantButton2 +140.000000 +105.000000,66.000000,0.000000 +CXuiCtrlEnchantmentButton +EnchantmentButton_Small +false + + + + +EnchantButton1 +140.000000 +105.000000,36.000000,0.000000 +CXuiCtrlEnchantmentButton +EnchantmentButton_Small +false + + + + +Pointer +26.000000 +26.000000 +-50.000000,-50.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000000,0.000000,0.000000 + + + +0 +190.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,0.000000,0.000000 + + + +0 +64.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +92.000000,0.000000,0.000000 + + + +0 +190.000000,0.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress.h b/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress.h new file mode 100644 index 00000000..867ae7a8 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress.h @@ -0,0 +1,23 @@ +#define IDC_Tip L"Tip" +#define IDC_Status L"Status" +#define IDC_Title L"Title" +#define IDC_Progress L"Progress" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_ButtonConfirm L"ButtonConfirm" +#define IDC_FullscreenProgressScene L"FullscreenProgressScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress.xui b/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress.xui new file mode 100644 index 00000000..4dd7c067 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress.xui @@ -0,0 +1,932 @@ + + +1280.000000 +720.000000 + + + +FullscreenProgressScene +1280.000000 +720.000000 +CScene_FullscreenProgress +XuiMenuScene +ButtonConfirm + + + +Tip +800.000000 +100.000000 +240.000061,520.000000,0.000000 +TipPanel + + + + +Status +640.000000 +26.000000 +320.000031,360.000000,0.000000 +XuiLabel12_Shadowed + + + + +Title +960.000000 +100.000000 +160.000076,250.000000,0.000000 +XuiTitle + + + + +Progress +640.000000 +15.000000 +320.000000,390.000000,0.000000 +CXuiCtrlLoadingProgress +LoadingProgressState +50 + + + + +Timer +183.000000 +169.000000 +548.000000,328.000000,0.000000 +false +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + +ButtonConfirm +320.000000 +50.000000 +480.000031,446.000000,0.000000 +false + + + + + +Normal + + + +EndNormal + +gotoandplay +Normal + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_480.h b/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_480.h new file mode 100644 index 00000000..70c6c3cf --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_480.h @@ -0,0 +1,23 @@ +#define IDC_Tip L"Tip" +#define IDC_Status L"Status" +#define IDC_Title L"Title" +#define IDC_Progress L"Progress" +#define IDC_ButtonConfirm L"ButtonConfirm" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_FullscreenProgressScene L"FullscreenProgressScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_480.xui b/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_480.xui new file mode 100644 index 00000000..9c5c7fbf --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_480.xui @@ -0,0 +1,931 @@ + + +640.000000 +480.000000 + + + +FullscreenProgressScene +640.000000 +480.000000 +CScene_FullscreenProgress +XuiMenuScene +ButtonConfirm + + + +Tip +500.000000 +120.000000 +70.000000,256.000061,0.000000 +TipPanel + + + + +Status +500.000000 +26.000000 +70.000000,177.000046,0.000000 +XuiLabel12_Shadowed + + + + +Title +500.000000 +50.000000 +70.000000,130.000000,0.000000 +XuiTitleSmall + + + + +Progress +500.000000 +15.000000 +70.000000,207.000046,0.000000 +CXuiCtrlLoadingProgress +LoadingProgressState +50 + + + + +ButtonConfirm +320.000000 +50.000000 +160.000000,382.000061,0.000000 +false + + + + +Timer +72.000000 +72.000000 +284.000000,177.000000,0.000000 +15 +false +XuiBlankScene + + + +Timer_Square_1 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + + +Normal + + + +EndNormal + +gotoandplay +Normal + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_small.h b/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_small.h new file mode 100644 index 00000000..867ae7a8 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_small.h @@ -0,0 +1,23 @@ +#define IDC_Tip L"Tip" +#define IDC_Status L"Status" +#define IDC_Title L"Title" +#define IDC_Progress L"Progress" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_ButtonConfirm L"ButtonConfirm" +#define IDC_FullscreenProgressScene L"FullscreenProgressScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_small.xui b/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_small.xui new file mode 100644 index 00000000..5f728ada --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_fullscreenprogress_small.xui @@ -0,0 +1,931 @@ + + +640.000000 +360.000000 + + + +FullscreenProgressScene +640.000000 +360.000000 +CScene_FullscreenProgress +XuiMenuScene +ButtonConfirm + + + +Tip +500.000000 +120.000000 +70.000000,180.000061,0.000000 +TipPanel + + + + +Status +500.000000 +26.000000 +70.000000,130.000046,0.000000 +XuiLabel12_Shadowed + + + + +Title +500.000000 +32.000000 +70.000000,100.000000,0.000000 +XuiTitleSmall + + + + +Progress +500.000000 +15.000000 +70.000000,160.000046,0.000000 +CXuiCtrlLoadingProgress +LoadingProgressState +50 + + + + +Timer +72.000000 +72.000000 +284.000000,140.000000,0.000000 +15 +false +XuiBlankScene + + + +Timer_Square_1 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + +ButtonConfirm +320.000000 +50.000000 +160.000000,212.000061,0.000000 +false + + + + + +Normal + + + +EndNormal + +gotoandplay +Normal + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_furnace.h b/Minecraft.Client/Common/Media/xuiscene_furnace.h new file mode 100644 index 00000000..285e3b89 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_furnace.h @@ -0,0 +1,45 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Result L"Result" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Fuel L"Fuel" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Ingredient L"Ingredient" +#define IDC_Burn L"Burn" +#define IDC_Lit L"Lit" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryText L"InventoryText" +#define IDC_FurnaceText L"FurnaceText" +#define IDC_FuelText L"FuelText" +#define IDC_IngredientText L"IngredientText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneFurnace L"XuiSceneFurnace" diff --git a/Minecraft.Client/Common/Media/xuiscene_furnace.xui b/Minecraft.Client/Common/Media/xuiscene_furnace.xui new file mode 100644 index 00000000..e89682c5 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_furnace.xui @@ -0,0 +1,650 @@ + + +1280.000000 +720.000000 + + + +XuiSceneFurnace +1280.000000 +720.000000 +CXuiSceneFurnace +XuiBlankScene +Pointer + + + +Group +428.000000 +430.000000 +426.000000,95.000000,0.000000 +15 +XuiScene +Pointer + + + +Result +64.000000 +64.000000 +308.000000,86.000000,0.000000 +CXuiCtrlSlotList +ItemGridVertical64 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +64.000000 +64.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton64 +22594 +4 + + + + + +Fuel +52.000000 +52.000000 +152.000031,142.000015,0.000000 +3 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +Ingredient +66.000000 +62.000000 +153.000031,48.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +Burn +72.000000 +48.000000 +225.000000,94.000000,0.000000 +CXuiCtrlBurnProgress +ArrowProgressState +24 + + + + +Lit +51.000000 +50.000000 +148.000000,90.000000,0.000000 +CXuiCtrlFireProgress +FlameProgressState +12 + + + + +Inventory +382.000000 +150.000000 +25.000000,220.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +UseRow +381.000000 +50.000000 +25.000000,359.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +InventoryText +378.000000 +34.000000 +24.000000,190.000000,0.000000 +12 +LabelContainerSceneLeft + + + + +FurnaceText +380.000000 +34.000000 +26.000000,12.000000,0.000000 +LabelContainerSceneLeft + + + + +FuelText +125.000000 +20.000000 +18.000000,152.000000,0.000000 +3 +LabelContainerSceneRight + + + + +IngredientText +125.000000 +20.000000 +18.000000,58.000000,0.000000 +3 +LabelContainerSceneRight + + + + +Pointer +42.000000 +42.000000 +-185.000000,-83.000015,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointer + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +426.000000,95.000000,0.000000 + + + +0 +426.000000,95.000000,0.000000 + + + +2 +100 +-100 +50 +424.500031,95.000000,0.000000 + + + +0 +160.000000,95.000000,0.000000 + + + +2 +100 +-100 +50 +160.000000,95.000000,0.000000 + + + +0 +426.000000,95.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_furnace_480.h b/Minecraft.Client/Common/Media/xuiscene_furnace_480.h new file mode 100644 index 00000000..4489ca7f --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_furnace_480.h @@ -0,0 +1,103 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Result L"Result" +#define IDC_Lit L"Lit" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Fuel L"Fuel" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Ingredient L"Ingredient" +#define IDC_Burn L"Burn" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryText L"InventoryText" +#define IDC_FurnaceText L"FurnaceText" +#define IDC_FuelText L"FuelText" +#define IDC_IngredientText L"IngredientText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneFurnace L"XuiSceneFurnace" diff --git a/Minecraft.Client/Common/Media/xuiscene_furnace_480.xui b/Minecraft.Client/Common/Media/xuiscene_furnace_480.xui new file mode 100644 index 00000000..bb4c7d93 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_furnace_480.xui @@ -0,0 +1,1399 @@ + + +640.000000 +480.000000 + + + +XuiSceneFurnace +640.000000 +480.000000 +CXuiSceneFurnace +XuiBlankScene +Pointer + + + +Group +260.000000 +290.000000 +190.000000,96.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Result +44.000000 +44.000000 +200.000000,60.000000,0.000000 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +Lit +32.000000 +32.000000 +124.000000,66.000000,0.000000 +CXuiCtrlFireProgress +FlameProgressStateSmall +12 + + + + +Fuel +34.000000 +34.000000 +124.000000,98.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridVerticalSmall + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +34.000000 +34.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +34.000000 +34.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +34.000000 +34.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +34.000000 +34.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +Ingredient +36.000000 +36.000000 +124.000000,32.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridVerticalSmall + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +34.000000 +34.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +34.000000 +34.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +34.000000 +34.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +34.000000 +34.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +Burn +32.000000 +32.000000 +164.000000,64.000000,0.000000 +CXuiCtrlBurnProgress +ArrowProgressStateSmall +24 + + + + +Inventory +234.000000 +78.000000 +13.000000,162.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +234.000000 +13.000000,250.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +InventoryText +234.000000 +25.000000 +12.000000,140.000000,0.000000 +9 +LabelContainerSceneLeftSmall + + + + +FurnaceText +234.000000 +26.000000 +12.000000,8.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +FuelText +114.000000 +20.000000 +6.000000,108.000000,0.000000 +3 +LabelContainerSceneRightSmall + + + + +IngredientText +114.000000 +20.000000 +6.000000,42.000000,0.000000 +3 +LabelContainerSceneRightSmall + + + + +Pointer +26.000000 +26.000000 +-50.000000,-50.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000000,96.000000,0.000000 + + + +0 +190.000000,96.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,96.000000,0.000000 + + + +0 +33.750000,96.000000,0.000000 + + + +2 +100 +-100 +50 +60.000000,96.000000,0.000000 + + + +0 +190.000000,96.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_furnace_Small.h b/Minecraft.Client/Common/Media/xuiscene_furnace_Small.h new file mode 100644 index 00000000..61c09fc1 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_furnace_Small.h @@ -0,0 +1,61 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Result L"Result" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Fuel L"Fuel" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Ingredient L"Ingredient" +#define IDC_Burn L"Burn" +#define IDC_Lit L"Lit" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryText L"InventoryText" +#define IDC_FurnaceText L"FurnaceText" +#define IDC_FuelText L"FuelText" +#define IDC_IngredientText L"IngredientText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneFurnace L"XuiSceneFurnace" diff --git a/Minecraft.Client/Common/Media/xuiscene_furnace_Small.xui b/Minecraft.Client/Common/Media/xuiscene_furnace_Small.xui new file mode 100644 index 00000000..e301d409 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_furnace_Small.xui @@ -0,0 +1,847 @@ + + +640.000000 +360.000000 + + + +XuiSceneFurnace +640.000000 +360.000000 +CXuiSceneFurnace +XuiBlankScene +Pointer + + + +Group +260.000000 +290.000000 +190.000000,2.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Result +45.639984 +46.888008 +201.991943,58.343994,0.000000 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +Fuel +39.712006 +40.479996 +122.991974,98.344009,0.000000 +3 +CXuiCtrlSlotList +ItemGridVerticalSmall + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +34.000000 +34.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +34.000000 +34.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +Ingredient +38.352005 +37.960014 +123.991974,31.343994,0.000000 +3 +CXuiCtrlSlotList +ItemGridVerticalSmall + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +34.000000 +34.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +34.000000 +34.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +Burn +32.000000 +32.639999 +163.991943,63.343994,0.000000 +CXuiCtrlBurnProgress +ArrowProgressStateSmall +24 + + + + +Lit +34.104004 +33.435295 +121.991943,64.908691,0.000000 +CXuiCtrlFireProgress +FlameProgressStateSmall +12 + + + + +Inventory +234.000000 +80.000000 +12.000000,161.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +234.000000 +12.000000,250.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +InventoryText +233.000000 +12.000000,139.000000,0.000000 +9 +LabelContainerSceneLeftSmall + + + + +FurnaceText +229.000000 +26.000000 +12.000000,7.000000,0.000000 +3 +LabelContainerSceneLeftSmall + + + + +FuelText +114.000000 +20.000000 +6.000000,108.000000,0.000000 +3 +LabelContainerSceneRightSmall + + + + +IngredientText +114.000000 +20.000000 +6.000000,42.000000,0.000000 +3 +LabelContainerSceneRightSmall + + + + +Pointer +26.000000 +26.000000 +-50.000000,-50.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000000,2.000000,0.000000 + + + +0 +190.000000,2.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,2.000000,0.000000 + + + +0 +64.000000,2.000000,0.000000 + + + +2 +100 +-100 +50 +92.000000,2.000000,0.000000 + + + +0 +190.000000,2.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_helpandoptions.h b/Minecraft.Client/Common/Media/xuiscene_helpandoptions.h new file mode 100644 index 00000000..357dc1ea --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_helpandoptions.h @@ -0,0 +1,25 @@ +#define IDC_XuiButton1 L"XuiButton1" +#define IDC_XuiButton2 L"XuiButton2" +#define IDC_XuiButton3 L"XuiButton3" +#define IDC_XuiButton4 L"XuiButton4" +#define IDC_XuiButton5 L"XuiButton5" +#define IDC_XuiButton6 L"XuiButton6" +#define IDC_XuiButton7 L"XuiButton7" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_SceneHelpAndOptions L"SceneHelpAndOptions" diff --git a/Minecraft.Client/Common/Media/xuiscene_helpandoptions.xui b/Minecraft.Client/Common/Media/xuiscene_helpandoptions.xui new file mode 100644 index 00000000..e18afb14 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_helpandoptions.xui @@ -0,0 +1,949 @@ + + +1280.000000 +720.000000 + + + +SceneHelpAndOptions +1280.000000 +720.000000 +CScene_HelpAndOptions +XuiMenuScene +XuiButton1 + + + +XuiButton1 +450.000000 +40.000000 +414.000000,250.000000,0.000000 +XuiMainMenuButton_L +XuiButton7 +XuiButton2 + + + + +XuiButton2 +450.000000 +40.000000 +414.000000,300.000000,0.000000 +XuiMainMenuButton_L +XuiButton1 +XuiButton3 + + + + +XuiButton3 +450.000000 +40.000000 +414.000000,350.000000,0.000000 +XuiMainMenuButton_L +XuiButton2 +XuiButton4 + + + + +XuiButton4 +450.000000 +40.000000 +414.000000,400.000000,0.000000 +XuiMainMenuButton_L +XuiButton3 +XuiButton5 + + + + +XuiButton5 +450.000000 +40.000000 +414.000000,450.000000,0.000000 +XuiMainMenuButton_L +XuiButton4 +XuiButton6 + + + + +XuiButton6 +450.000000 +40.000000 +414.000000,500.000000,0.000000 +false +XuiMainMenuButton_L +XuiButton5 +XuiButton7 + + + + +XuiButton7 +450.000000 +40.000000 +414.000000,550.000000,0.000000 +false +XuiMainMenuButton_L +XuiButton6 +XuiButton1 + + + + +Timer +182.000000 +168.000000 +549.000000,288.000000,0.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_helpandoptions_480.h b/Minecraft.Client/Common/Media/xuiscene_helpandoptions_480.h new file mode 100644 index 00000000..357dc1ea --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_helpandoptions_480.h @@ -0,0 +1,25 @@ +#define IDC_XuiButton1 L"XuiButton1" +#define IDC_XuiButton2 L"XuiButton2" +#define IDC_XuiButton3 L"XuiButton3" +#define IDC_XuiButton4 L"XuiButton4" +#define IDC_XuiButton5 L"XuiButton5" +#define IDC_XuiButton6 L"XuiButton6" +#define IDC_XuiButton7 L"XuiButton7" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_SceneHelpAndOptions L"SceneHelpAndOptions" diff --git a/Minecraft.Client/Common/Media/xuiscene_helpandoptions_480.xui b/Minecraft.Client/Common/Media/xuiscene_helpandoptions_480.xui new file mode 100644 index 00000000..cea101d6 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_helpandoptions_480.xui @@ -0,0 +1,950 @@ + + +640.000000 +480.000000 + + + +SceneHelpAndOptions +640.000000 +480.000000 +CScene_HelpAndOptions +XuiMenuScene +XuiButton1 + + + +XuiButton1 +300.000000 +36.000000 +170.000031,140.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton8 +XuiButton2 + + + + +XuiButton2 +300.000000 +36.000000 +170.000031,180.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton1 +XuiButton3 + + + + +XuiButton3 +300.000000 +36.000000 +170.000031,220.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton2 +XuiButton4 + + + + +XuiButton4 +300.000000 +36.000000 +170.000031,260.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton3 +XuiButton5 + + + + +XuiButton5 +300.000000 +36.000000 +170.000031,300.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton4 +XuiButton6 + + + + +XuiButton6 +300.000000 +36.000000 +170.000031,340.000000,0.000000 +false +XuiMainMenuButton_L_Thin +XuiButton5 +XuiButton7 + + + + +XuiButton7 +300.000000 +36.000000 +170.000031,380.000000,0.000000 +false +XuiMainMenuButton_L_Thin +XuiButton6 +XuiButton1 + + + + +Timer +184.000000 +170.000000 +274.000000,195.000000,0.000000 +0.500000,0.500000,1.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_helpandoptions_small.h b/Minecraft.Client/Common/Media/xuiscene_helpandoptions_small.h new file mode 100644 index 00000000..357dc1ea --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_helpandoptions_small.h @@ -0,0 +1,25 @@ +#define IDC_XuiButton1 L"XuiButton1" +#define IDC_XuiButton2 L"XuiButton2" +#define IDC_XuiButton3 L"XuiButton3" +#define IDC_XuiButton4 L"XuiButton4" +#define IDC_XuiButton5 L"XuiButton5" +#define IDC_XuiButton6 L"XuiButton6" +#define IDC_XuiButton7 L"XuiButton7" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_SceneHelpAndOptions L"SceneHelpAndOptions" diff --git a/Minecraft.Client/Common/Media/xuiscene_helpandoptions_small.xui b/Minecraft.Client/Common/Media/xuiscene_helpandoptions_small.xui new file mode 100644 index 00000000..fac4714f --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_helpandoptions_small.xui @@ -0,0 +1,950 @@ + + +640.000000 +360.000000 + + + +SceneHelpAndOptions +640.000000 +360.000000 +CScene_HelpAndOptions +XuiMenuScene +XuiButton1 + + + +XuiButton1 +400.000000 +40.000000 +120.000023,48.000000,0.000000 +XuiMainMenuButton_L +XuiButton7 +XuiButton2 + + + + +XuiButton2 +400.000000 +40.000000 +120.000023,93.000000,0.000000 +XuiMainMenuButton_L +XuiButton1 +XuiButton3 + + + + +XuiButton3 +400.000000 +40.000000 +120.000023,138.000000,0.000000 +XuiMainMenuButton_L +XuiButton2 +XuiButton4 + + + + +XuiButton4 +400.000000 +40.000000 +120.000023,183.000000,0.000000 +XuiMainMenuButton_L +XuiButton3 +XuiButton5 + + + + +XuiButton5 +400.000000 +40.000000 +120.000023,228.000000,0.000000 +XuiMainMenuButton_L +XuiButton4 +XuiButton6 + + + + +XuiButton6 +400.000000 +40.000000 +120.000000,273.000000,0.000000 +false +XuiMainMenuButton_L +XuiButton5 +XuiButton7 + + + + +XuiButton7 +400.000000 +40.000000 +120.000000,318.000000,0.000000 +false +XuiMainMenuButton_L +XuiButton6 +XuiButton1 + + + + +Timer +184.000000 +170.000000 +274.000000,118.000000,0.000000 +0.500000,0.500000,1.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_howtoplay.h b/Minecraft.Client/Common/Media/xuiscene_howtoplay.h new file mode 100644 index 00000000..488aec69 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay.h @@ -0,0 +1,73 @@ +#define IDC_XuiImageNetherPortal L"XuiImageNetherPortal" +#define IDC_XuiHtmlControlNetherPortal L"XuiHtmlControlNetherPortal" +#define IDC_XuiImageTheEnd L"XuiImageTheEnd" +#define IDC_XuiHtmlControlTheEnd L"XuiHtmlControlTheEnd" +#define IDC_XuiImageDispenser L"XuiImageDispenser" +#define IDC_XuiHtmlControlDispenser L"XuiHtmlControlDispenser" +#define IDC_DInventory L"DInventory" +#define IDC_DText L"DText" +#define IDC_XuiHtmlControlHUD L"XuiHtmlControlHUD" +#define IDC_XuiImageHUD L"XuiImageHUD" +#define IDC_XuiHtmlControlBasics L"XuiHtmlControlBasics" +#define IDC_XuiImageInventory L"XuiImageInventory" +#define IDC_IInventory L"IInventory" +#define IDC_XuiHtmlControlInventory L"XuiHtmlControlInventory" +#define IDC_XuiImageChest L"XuiImageChest" +#define IDC_SCChest L"SCChest" +#define IDC_SCInventory L"SCInventory" +#define IDC_XuiHtmlControlChest L"XuiHtmlControlChest" +#define IDC_XuiHtmlControlLargeChest L"XuiHtmlControlLargeChest" +#define IDC_XuiImageLargeChest L"XuiImageLargeChest" +#define IDC_LCChest L"LCChest" +#define IDC_LCInventory L"LCInventory" +#define IDC_XuiImageFurnace L"XuiImageFurnace" +#define IDC_FChest L"FChest" +#define IDC_FIngredient L"FIngredient" +#define IDC_FInventory L"FInventory" +#define IDC_FFuel L"FFuel" +#define IDC_XuiHtmlControlFurnace L"XuiHtmlControlFurnace" +#define IDC_XuiImageCrafting L"XuiImageCrafting" +#define IDC_CInventory L"CInventory" +#define IDC_CGroup L"CGroup" +#define IDC_CItem L"CItem" +#define IDC_XuiHtmlControlCrafting L"XuiHtmlControlCrafting" +#define IDC_XuiImageCraftingTable L"XuiImageCraftingTable" +#define IDC_CTInventory3x3 L"CTInventory3x3" +#define IDC_CTGroup L"CTGroup" +#define IDC_CTItem L"CTItem" +#define IDC_XuiHtmlControlCraftingTable L"XuiHtmlControlCraftingTable" +#define IDC_XuiHtmlControlMultiplayer L"XuiHtmlControlMultiplayer" +#define IDC_XuiHtmlControlSocialMedia L"XuiHtmlControlSocialMedia" +#define IDC_XuiHtmlControlBanList L"XuiHtmlControlBanList" +#define IDC_XuiHtmlControlWhatsNew L"XuiHtmlControlWhatsNew" +#define IDC_XuiHtmlControlCreative L"XuiHtmlControlCreative" +#define IDC_XuiImageCreative L"XuiImageCreative" +#define IDC_CIGroup L"CIGroup" +#define IDC_XuiHtmlControlHostOptions L"XuiHtmlControlHostOptions" +#define IDC_XuiHtmlControlBreeding L"XuiHtmlControlBreeding" +#define IDC_XuiImageBreeding L"XuiImageBreeding" +#define IDC_XuiHtmlControlFarmingAnimals L"XuiHtmlControlFarmingAnimals" +#define IDC_XuiImageFarmingAnimals L"XuiImageFarmingAnimals" +#define IDC_XuiHtmlControlBrewing L"XuiHtmlControlBrewing" +#define IDC_XuiImageBrewing L"XuiImageBrewing" +#define IDC_BInventory L"BInventory" +#define IDC_BBrew L"BBrew" +#define IDC_XuiHtmlControlEnchantment L"XuiHtmlControlEnchantment" +#define IDC_XuiImageEnchantment L"XuiImageEnchantment" +#define IDC_EInventory L"EInventory" +#define IDC_EEnchant L"EEnchant" +#define IDC_XuiHtmlControlAnvil L"XuiHtmlControlAnvil" +#define IDC_XuiImageAnvil L"XuiImageAnvil" +#define IDC_ACost L"ACost" +#define IDC_AInventory L"AInventory" +#define IDC_ARepairAndName L"ARepairAndName" +#define IDC_XuiHtmlControlTrading L"XuiHtmlControlTrading" +#define IDC_XuiImageTrading L"XuiImageTrading" +#define IDC_TVillagerOffers L"TVillagerOffers" +#define IDC_TNeededForTrade L"TNeededForTrade" +#define IDC_TOffer1Label L"TOffer1Label" +#define IDC_TOffer2Label L"TOffer2Label" +#define IDC_TInventory L"TInventory" +#define IDC_XuiHtmlControlEnderchest L"XuiHtmlControlEnderchest" +#define IDC_XuiImageEnderchest L"XuiImageEnderchest" +#define IDC_SceneHowToPlay L"SceneHowToPlay" diff --git a/Minecraft.Client/Common/Media/xuiscene_howtoplay.xui b/Minecraft.Client/Common/Media/xuiscene_howtoplay.xui new file mode 100644 index 00000000..09960371 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay.xui @@ -0,0 +1,665 @@ + + +1280.000000 +720.000000 + + + +SceneHowToPlay +1280.000000 +720.000000 +[LayerFolders]0|-Enderchest|2|+|0|-Trading|7|+|0|-Anvil|5|+|0|-Enchantment|4|+|0|+Brewing|4|+|0|+FarmingAnimals|2|+|0|-Breeding|2|+|1|+Creative Mode|3|+|0|+What's New|1|+|1|+SocialMedia|1|+|0|-Multiplayer|1|+|0|+CraftingTable|5|+|0|+Crafting|5|+|0|+Furnace|6|+|0|+Large Chest|4|+|0|+SmallChest|4|+|0|+Inventory|3|+|0|+Basics|1|+|0|+HUD|2|+|0|+Dispenser|4|+|0|+TheEnd|2|+|0|-Nether Portal|2|+|0[/LayerFolders] +CScene_HowToPlay +XuiBlankScene +XuiSliderVolume + + + +XuiImageNetherPortal +525.000000 +308.000000 +596.000000,252.000000,0.000000 +ImHowToPlayNetherPortal + + + + +XuiHtmlControlNetherPortal +380.000000 +296.000000 +180.000000,252.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageTheEnd +525.000000 +308.000000 +596.000000,252.000000,0.000000 +ImHowToPlayTheEnd + + + + +XuiHtmlControlTheEnd +380.000000 +296.000000 +180.000000,252.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageDispenser +453.000000 +431.000000 +658.000000,186.000000,0.000000 +ImHowToPlayDispenser + + + + +XuiHtmlControlDispenser +380.000000 +296.000000 +220.000000,252.000000,0.000000 +XuiHtmlControl_H2P + + + + +DInventory +372.000000 +28.000000 +696.000000,376.000000,0.000000 +LabelContainerSceneLeft + + + + +DText +260.000000 +32.000000 +820.000000,214.000000,0.000000 +LabelContainerSceneLeft + + + + +XuiHtmlControlHUD +706.000000 +188.000000 +286.000000,218.000046,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageHUD +583.000000 +157.000000 +348.000000,444.000000,0.000000 +ImHowToPlayHUD + + + + +XuiHtmlControlBasics +634.000000 +384.000000 +322.000000,218.000046,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageInventory +451.000000 +455.000000 +654.000000,196.000000,0.000000 +ImHowToPlayInventory + + + + +IInventory +372.000000 +28.000000 +692.000000,406.000000,0.000000 +LabelContainerSceneLeft + + + + +XuiHtmlControlInventory +404.000000 +380.000000 +204.000046,226.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageChest +449.000000 +434.000000 +626.000000,196.000000,0.000000 +ImHowToPlayChest + + + + +SCChest +376.000000 +28.000000 +662.000000,220.000000,0.000000 +LabelContainerSceneLeft + + + + +SCInventory +376.000000 +32.000000 +662.000000,388.000000,0.000000 +LabelContainerSceneLeft + + + + +XuiHtmlControlChest +362.000000 +271.000000 +231.000000,272.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlLargeChest +364.000000 +260.000000 +280.000000,262.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageLargeChest +335.000000 +417.000000 +686.000000,196.000000,0.000000 +ImHowToPlayLargeChest + + + + +LCChest +280.000000 +24.000000 +712.000000,212.000000,0.000000 +LabelContainerSceneLeft + + + + +LCInventory +280.000000 +24.000000 +712.000000,430.000000,0.000000 +LabelContainerSceneLeft + + + + +XuiImageFurnace +444.000000 +448.000000 +639.000000,194.000000,0.000000 +ImHowToPlayFurnace + + + + +FChest +325.000000 +34.000000 +666.000000,206.000000,0.000000 +LabelContainerSceneLeft + + + + +FIngredient +125.000000 +20.000000 +661.000000,258.000000,0.000000 +LabelContainerSceneRight + + + + +FInventory +320.000000 +34.000000 +666.000000,384.000000,0.000000 +LabelContainerSceneLeft + + + + +FFuel +125.000000 +20.000000 +661.000000,352.000000,0.000000 +LabelContainerSceneRight + + + + +XuiHtmlControlFurnace +380.000000 +359.000000 +217.750015,222.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageCrafting +563.000000 +428.000000 +599.000000,206.000000,0.000000 +ImHowToPlayCrafting + + + + +CInventory +242.000000 +20.000000 +844.000000,458.000000,0.000000 +XuiLabelDarkCentred + + + + +CGroup +492.000000 +27.000000 +610.000000,282.000000,0.000000 +XuiLabelDarkCentred + + + + +CItem +215.000000 +20.000000 +612.000000,458.000000,0.000000 +XuiLabelDarkCentred + + + + +XuiHtmlControlCrafting +380.000000 +331.000000 +188.000000,246.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageCraftingTable +517.000000 +371.000000 +590.000000,224.000000,0.000000 +ImHowToPlayCraftingTable + + + + +CTInventory3x3 +264.000000 +20.000000 +827.000000,442.000000,0.000000 +XuiLabelDarkCentred + + + + +CTGroup +340.000000 +27.000000 +680.000000,294.000000,0.000000 +XuiLabelDarkCentred + + + + +CTItem +209.678864 +20.000000 +607.000000,442.000000,0.000000 +XuiLabelDarkCentred + + + + +XuiHtmlControlCraftingTable +365.000000 +322.000000 +194.000000,242.000031,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlMultiplayer +633.000000 +384.000000 +324.000000,218.000046,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlSocialMedia +633.000000 +384.000000 +324.000000,218.000046,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlBanList +633.000000 +384.000000 +324.000000,218.000046,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlWhatsNew +633.000000 +384.000000 +324.000000,218.000046,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlCreative +380.000000 +331.000000 +198.000000,242.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageCreative +491.000000 +371.000000 +611.000000,226.000000,0.000000 +ImHowToPlayCreative + + + + +CIGroup +340.000000 +27.000000 +687.000000,290.000000,0.000000 +XuiLabelDarkCentred + + + + +XuiHtmlControlHostOptions +633.000000 +384.000000 +324.000000,218.000046,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlBreeding +380.000000 +331.000000 +198.000000,242.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageBreeding +339.000000 +342.000000 +611.000000,246.000000,0.000000 +ImHowToPlayBreeding + + + + +XuiHtmlControlFarmingAnimals +380.000000 +331.000000 +198.000000,242.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageFarmingAnimals +339.000000 +342.000000 +611.000000,246.000000,0.000000 +ImHowToPlayFarmingAnimals + + + + +XuiHtmlControlBrewing +380.000000 +331.000000 +198.000000,242.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageBrewing +339.000000 +342.000000 +611.000000,241.000000,0.000000 +ImHowToPlayBrewing + + + + +BInventory +300.000000 +34.000000 +630.000000,396.000000,0.000000 +LabelContainerSceneLeft + + + + +BBrew +300.000000 +34.000000 +630.000000,249.000000,0.000000 +LabelContainerSceneCentre + + + + +XuiHtmlControlEnchantment +380.000000 +331.000000 +198.000000,224.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageEnchantment +339.000000 +342.000000 +611.000000,226.000000,0.000000 +ImHowToPlayEnchantment + + + + +EInventory +300.000000 +34.000000 +638.000000,376.000000,0.000000 +LabelContainerSceneLeft + + + + +EEnchant +300.000000 +34.000000 +638.000000,240.000000,0.000000 +LabelContainerSceneLeft + + + + +XuiHtmlControlAnvil +380.000000 +359.000000 +217.750015,222.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageAnvil +430.000000 +430.000000 +680.000000,198.000000,0.000000 +ImHowToPlayAnvil + + + + +ACost +232.000000 +848.000000,360.000000,0.000000 +XuiLabelAffordable + + + + +AInventory +260.000000 +34.000000 +703.333313,385.333344,0.000000 +LabelContainerSceneLeft + + + + +ARepairAndName +260.000000 +34.000000 +814.000000,210.666672,0.000000 +LabelContainerSceneCentre + + + + +XuiHtmlControlTrading +380.000000 +359.000000 +142.000000,222.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageTrading +588.000000 +360.000000 +552.000000,230.000000,0.000000 +ImHowToPlayTrading + + + + +TVillagerOffers +588.000000 +34.000000 +552.000000,246.000000,0.000000 +LabelContainerSceneCentre + + + + +TNeededForTrade +216.000000 +43.000000 +578.000000,385.000000,0.000000 +false +XuiLabelDarkCentredWrapSmall + + + + +TOffer1Label +144.000000 +24.000000 +634.000000,436.000000,0.000000 +XuiLabelDarkLeftWrapSmall10 + + + + +TOffer2Label +144.000000 +24.000000 +633.125061,489.000000,0.000000 +XuiLabelDarkLeftWrapSmall10 + + + + +TInventory +312.000000 +24.000000 +799.125061,380.000000,0.000000 +XuiLabelDarkCentredSmall + + + + +XuiHtmlControlEnderchest +380.000000 +331.000000 +198.000000,242.000000,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageEnderchest +339.000000 +342.000000 +611.000000,246.000000,0.000000 +ImHowToPlayEnderchest + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_howtoplay_480.h b/Minecraft.Client/Common/Media/xuiscene_howtoplay_480.h new file mode 100644 index 00000000..8ef840c6 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay_480.h @@ -0,0 +1,72 @@ +#define IDC_XuiHtmlControlTheEnd L"XuiHtmlControlTheEnd" +#define IDC_XuiImageTheEnd L"XuiImageTheEnd" +#define IDC_XuiHtmlControlNetherPortal L"XuiHtmlControlNetherPortal" +#define IDC_XuiImageNetherPortal L"XuiImageNetherPortal" +#define IDC_XuiHtmlControlDispenser L"XuiHtmlControlDispenser" +#define IDC_XuiImageDispenser L"XuiImageDispenser" +#define IDC_DInventory L"DInventory" +#define IDC_DText L"DText" +#define IDC_XuiHtmlControlHUD L"XuiHtmlControlHUD" +#define IDC_XuiImageHUD L"XuiImageHUD" +#define IDC_XuiHtmlControlBasics L"XuiHtmlControlBasics" +#define IDC_XuiHtmlControlInventory L"XuiHtmlControlInventory" +#define IDC_XuiImageInventory L"XuiImageInventory" +#define IDC_IInventory L"IInventory" +#define IDC_XuiHtmlControlChest L"XuiHtmlControlChest" +#define IDC_XuiImageChest L"XuiImageChest" +#define IDC_SCChest L"SCChest" +#define IDC_SCInventory L"SCInventory" +#define IDC_XuiHtmlControlLargeChest L"XuiHtmlControlLargeChest" +#define IDC_XuiImageLargeChest L"XuiImageLargeChest" +#define IDC_LCChest L"LCChest" +#define IDC_LCInventory L"LCInventory" +#define IDC_XuiHtmlControlFurnace L"XuiHtmlControlFurnace" +#define IDC_XuiImageFurnace L"XuiImageFurnace" +#define IDC_FChest L"FChest" +#define IDC_FIngredient L"FIngredient" +#define IDC_FInventory L"FInventory" +#define IDC_FFuel L"FFuel" +#define IDC_XuiHtmlControlCrafting L"XuiHtmlControlCrafting" +#define IDC_XuiImageCrafting L"XuiImageCrafting" +#define IDC_CInventory L"CInventory" +#define IDC_CGroup L"CGroup" +#define IDC_CItem L"CItem" +#define IDC_XuiHtmlControlCraftingTable L"XuiHtmlControlCraftingTable" +#define IDC_XuiImageCraftingTable L"XuiImageCraftingTable" +#define IDC_CTInventory3x3 L"CTInventory3x3" +#define IDC_CTGroup L"CTGroup" +#define IDC_CTItem L"CTItem" +#define IDC_XuiHtmlControlSocialMedia L"XuiHtmlControlSocialMedia" +#define IDC_XuiHtmlControlMultiplayer L"XuiHtmlControlMultiplayer" +#define IDC_XuiHtmlControlWhatsNew L"XuiHtmlControlWhatsNew" +#define IDC_XuiHtmlControlBanList L"XuiHtmlControlBanList" +#define IDC_XuiImageCreative L"XuiImageCreative" +#define IDC_XuiHtmlControlCreative L"XuiHtmlControlCreative" +#define IDC_CIGroup L"CIGroup" +#define IDC_XuiHtmlControlHostOptions L"XuiHtmlControlHostOptions" +#define IDC_XuiHtmlControlBreeding L"XuiHtmlControlBreeding" +#define IDC_XuiImageBreeding L"XuiImageBreeding" +#define IDC_XuiHtmlControlFarmingAnimals L"XuiHtmlControlFarmingAnimals" +#define IDC_XuiImageFarmingAnimals L"XuiImageFarmingAnimals" +#define IDC_XuiHtmlControlBrewing L"XuiHtmlControlBrewing" +#define IDC_XuiImageBrewing L"XuiImageBrewing" +#define IDC_BInventory L"BInventory" +#define IDC_BBrew L"BBrew" +#define IDC_XuiImageEnchantment L"XuiImageEnchantment" +#define IDC_XuiHtmlControlEnchantment L"XuiHtmlControlEnchantment" +#define IDC_EInventory L"EInventory" +#define IDC_EEnchant L"EEnchant" +#define IDC_XuiImageAnvil L"XuiImageAnvil" +#define IDC_XuiHtmlControlAnvil L"XuiHtmlControlAnvil" +#define IDC_ACost L"ACost" +#define IDC_AInventory L"AInventory" +#define IDC_ARepairAndName L"ARepairAndName" +#define IDC_XuiHtmlControlTrading L"XuiHtmlControlTrading" +#define IDC_XuiImageTrading L"XuiImageTrading" +#define IDC_TInventory L"TInventory" +#define IDC_TOffer1Label L"TOffer1Label" +#define IDC_TNeededForTrade L"TNeededForTrade" +#define IDC_TVillagerOffers L"TVillagerOffers" +#define IDC_XuiHtmlControlEnderchest L"XuiHtmlControlEnderchest" +#define IDC_XuiImageEnderchest L"XuiImageEnderchest" +#define IDC_SceneHowToPlay L"SceneHowToPlay" diff --git a/Minecraft.Client/Common/Media/xuiscene_howtoplay_480.xui b/Minecraft.Client/Common/Media/xuiscene_howtoplay_480.xui new file mode 100644 index 00000000..f0d5790f --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay_480.xui @@ -0,0 +1,668 @@ + + +640.000000 +480.000000 + + + +SceneHowToPlay +640.000000 +480.000000 +[LayerFolders]0|-Enderchest|2|+|0|-Trading|6|+|0|-Anvil|5|+|0|+Enchantment|4|+|0|+Brewing|4|+|0|-FarmingAnimals|2|+|0|+Breeding|2|+|1|+Creative Mode|3|+|1|+What's New|1|+|0|+Multiplayer|1|+|0|+SocialMedia|1|+|0|+CraftingTable|5|+|0|+Crafting|5|+|0|-Furnace|6|+|0|+Large Chest|4|+|0|+SmallChest|4|+|0|+Inventory|3|+|0|+Basics|1|+|0|+HUD|2|+|0|+Dispenser|4|+|0|+Nether Portal|2|+|0|-TheEnd|2|+|0[/LayerFolders] +CScene_HowToPlay +XuiBlankScene +XuiSliderVolume + + + +XuiHtmlControlTheEnd +270.000000 +240.000000 +52.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageTheEnd +248.000000 +146.000000 +346.000000,172.000000,0.000000 +ImHowToPlayTheEndSmall + + + + +XuiHtmlControlNetherPortal +270.000000 +240.000000 +52.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageNetherPortal +248.000000 +146.000000 +346.000000,172.000000,0.000000 +ImHowToPlayNetherPortalSmall + + + + +XuiHtmlControlDispenser +270.000000 +240.000000 +52.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageDispenser +262.000000 +280.000000 +336.000000,126.000000,0.000000 +ImHowToPlayDispenserSmall + + + + +DInventory +230.000000 +17.000000 +355.000000,258.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +DText +160.000000 +23.000000 +390.000000,140.000000,0.000000 +2 +LabelContainerSceneCentreSmall + + + + +XuiHtmlControlHUD +520.000000 +152.000000 +60.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageHUD +364.000000 +84.000000 +138.000000,322.000000,0.000000 +ImHowToPlayHUDSmall + + + + +XuiHtmlControlBasics +526.000000 +240.000000 +57.000000,132.000046,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiHtmlControlInventory +270.000000 +240.000000 +52.000046,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageInventory +262.000000 +280.000000 +336.000000,126.000000,0.000000 +ImHowToPlayInventorySmall + + + + +IInventory +230.000000 +18.000000 +353.000000,258.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +XuiHtmlControlChest +270.000000 +240.000000 +54.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageChest +258.000000 +260.000000 +340.000000,134.000000,0.000000 +ImHowToPlayChestSmall + + + + +SCChest +230.000000 +23.000000 +352.000000,140.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +SCInventory +230.000000 +19.000000 +352.000000,244.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +XuiHtmlControlLargeChest +280.000000 +240.000000 +60.000038,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageLargeChest +213.000000 +270.000000 +364.000000,130.000000,0.000000 +ImHowToPlayLargeChestSmall + + + + +LCChest +189.000000 +17.000000 +377.000000,138.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +LCInventory +189.000000 +14.000000 +377.000000,282.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +XuiHtmlControlFurnace +264.000000 +240.000000 +56.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageFurnace +262.000000 +290.000000 +336.000000,120.000000,0.000000 +ImHowToPlayFurnaceSmall + + + + +FChest +218.000000 +21.000000 +352.000000,130.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +FIngredient +114.000000 +18.000000 +344.000000,164.000000,0.000000 +LabelContainerSceneRightSmall + + + + +FInventory +218.000000 +18.000000 +352.000000,262.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +FFuel +114.000000 +18.000000 +344.000000,234.000000,0.000000 +LabelContainerSceneRightSmall + + + + +XuiHtmlControlCrafting +270.000000 +240.000000 +52.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageCrafting +252.000000 +170.000000 +342.000000,176.000000,0.000000 +ImHowToPlayCraftingSmall + + + + +CInventory +128.000000 +14.000000 +458.000000,258.000000,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +CGroup +200.000000 +14.000000 +368.000000,208.000000,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +CItem +100.000000 +14.000000 +350.000000,258.000000,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +XuiHtmlControlCraftingTable +270.000000 +240.000000 +57.000000,132.000031,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageCraftingTable +245.000000 +142.000000 +342.000000,182.000000,0.000000 +ImHowToPlayCraftingTableSmall + + + + +CTInventory3x3 +132.000000 +14.000000 +448.000000,250.000000,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +CTGroup +160.000000 +14.000000 +384.000000,208.000000,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +CTItem +98.000000 +14.000000 +346.000000,250.000000,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +XuiHtmlControlSocialMedia +520.000000 +244.000000 +60.000000,138.000031,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlMultiplayer +520.000000 +244.000000 +60.000000,138.000046,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlWhatsNew +520.000000 +244.000000 +60.000000,138.000046,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlBanList +520.000000 +244.000000 +60.000000,138.000046,0.000000 +XuiHtmlControl_H2P + + + + +XuiImageCreative +258.000000 +194.000000 +340.000000,177.000000,0.000000 +ImHowToPlayCreativeSmall + + + + +XuiHtmlControlCreative +270.000000 +240.000000 +54.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +CIGroup +160.000000 +14.000000 +390.000000,208.000000,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +XuiHtmlControlHostOptions +520.000000 +244.000000 +60.000000,138.000046,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlBreeding +270.000000 +240.000000 +54.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageBreeding +262.000000 +280.000000 +340.000000,126.000000,0.000000 +ImHowToPlayBreedingSmall + + + + +XuiHtmlControlFarmingAnimals +270.000000 +240.000000 +54.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageFarmingAnimals +262.000000 +280.000000 +340.000000,126.000000,0.000000 +ImHowToPlayFarmingAnimalsSmall + + + + +XuiHtmlControlBrewing +270.000000 +240.000000 +54.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageBrewing +260.000000 +290.000000 +340.000000,122.000000,0.000000 +ImHowToPlayBrewingSmall + + + + +BInventory +210.000000 +18.000000 +354.000000,262.000000,0.000000 +8 +LabelContainerSceneLeftSmall + + + + +BBrew +210.000000 +18.000000 +365.000000,131.000000,0.000000 +8 +LabelContainerSceneCentreSmall + + + + +XuiImageEnchantment +262.000000 +280.000000 +340.000000,122.000000,0.000000 +ImHowToPlayEnchantmentSmall + + + + +XuiHtmlControlEnchantment +270.000000 +240.000000 +54.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +EInventory +210.000000 +18.000000 +356.000000,254.000000,0.000000 +8 +LabelContainerSceneLeftSmall + + + + +EEnchant +210.000000 +18.000000 +356.000000,130.000000,0.000000 +8 +LabelContainerSceneLeftSmall + + + + +XuiImageAnvil +260.000000 +290.000000 +340.000000,122.000000,0.000000 +ImHowToPlayAnvilSmall + + + + +XuiHtmlControlAnvil +264.000000 +240.000000 +56.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +ACost +156.000000 +18.000000 +430.000000,238.000000,0.000000 +8 +XuiLabelAffordableSmall + + + + +AInventory +156.370361 +18.000000 +353.037048,264.814819,0.000000 +8 +LabelContainerSceneCentreSmall + + + + +ARepairAndName +156.370361 +18.000000 +415.851868,130.000000,0.000000 +8 +LabelContainerSceneCentreSmall + + + + +XuiHtmlControlTrading +264.000000 +240.000000 +56.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageTrading +260.000000 +174.000000 +342.000000,125.000000,0.000000 +ImHowToPlayTradingSmall + + + + +TInventory +142.000000 +11.000000 +447.000000,207.000000,0.000000 +8 +XuiLabelDarkCentred8 + + + + +TOffer1Label +56.000000 +11.000000 +381.000000,240.000000,0.000000 +8 +XuiLabelDarkLeftWrapSmall8 + + + + +TNeededForTrade +88.000000 +24.000000 +349.000000,211.000000,0.000000 +8 +XuiLabelDarkCentred8 + + + + +TVillagerOffers +260.000000 +18.000000 +342.000000,140.000000,0.000000 +8 +XuiLabelDarkCentred8 + + + + +XuiHtmlControlEnderchest +270.000000 +240.000000 +54.000000,132.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageEnderchest +262.000000 +280.000000 +340.000000,126.000000,0.000000 +ImHowToPlayEnderchestSmall + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu.h b/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu.h new file mode 100644 index 00000000..409fbdb0 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu.h @@ -0,0 +1,9 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_HowToListButtons L"HowToListButtons" +#define IDC_SceneHowToPlayMenu L"SceneHowToPlayMenu" diff --git a/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu.xui b/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu.xui new file mode 100644 index 00000000..d66b3995 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu.xui @@ -0,0 +1,115 @@ + + +1280.000000 +720.000000 + + + +SceneHowToPlayMenu +1280.000000 +720.000000 +true +CScene_HowToPlayMenu +XuiMenuScene +XuiButton1 + + + +HowToListButtons +480.000000 +396.000000 +400.000031,200.000000,0.000000 +CXuiCtrlPassThroughList +XuiHowToList +JoinGame + + + +control_ListItem +469.000000 +86.000000 +16.000000,32.000000,0.000000 +5 +false +XuiButton + + + + +control_ListItem +450.000000 +50.000000 +15.000000,15.000000,0.000000 +5 +false +XuiMainMenuButton_List + + + + +control_ListItem +450.000000 +50.000000 +15.000000,15.000000,0.000000 +5 +false +XuiMainMenuButton_List + + + + +control_ListItem +450.000000 +50.000000 +15.000000,15.000000,0.000000 +5 +false +XuiMainMenuButton_List + + + + +control_ListItem +450.000000 +50.000000 +15.000000,15.000000,0.000000 +5 +false +XuiMainMenuButton_List + + + + +control_ListItem +450.000000 +50.000000 +15.000000,15.000000,0.000000 +5 +false +XuiMainMenuButton_List + + + + +control_ListItem +450.000000 +50.000000 +15.000000,15.000000,0.000000 +5 +false +XuiMainMenuButton_List + + + + + +Logo +1280.000000 +138.000000 +0.000000,56.000000,0.000000 +true +MenuTitleLogo + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_480.h b/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_480.h new file mode 100644 index 00000000..c393a1c3 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_480.h @@ -0,0 +1,5 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_HowToListButtons L"HowToListButtons" +#define IDC_SceneHowToPlayMenu L"SceneHowToPlayMenu" diff --git a/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_480.xui b/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_480.xui new file mode 100644 index 00000000..cd929626 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_480.xui @@ -0,0 +1,63 @@ + + +640.000000 +480.000000 + + + +SceneHowToPlayMenu +640.000000 +480.000000 +true +CScene_HowToPlayMenu +XuiMenuScene +XuiButton1 + + + +HowToListButtons +480.000000 +268.000000 +80.000000,120.000000,0.000000 +CXuiCtrlPassThroughList +XuiHowToList480 +JoinGame + + + +control_ListItem +469.000000 +86.000000 +16.000000,32.000000,0.000000 +5 +false +XuiButton + + + + +control_ListItem +300.000000 +36.000000 +15.000000,15.000000,0.000000 +5 +false +XuiMainMenuLButton_Thin +0.000000,10.000000,0.000000 + + + + +control_ListItem +300.000000 +36.000000 +15.000000,15.000000,0.000000 +5 +false +XuiMainMenuLButton_Thin +0.000000,10.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_small.h b/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_small.h new file mode 100644 index 00000000..f04d3146 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_small.h @@ -0,0 +1,4 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_HowToListButtons L"HowToListButtons" +#define IDC_SceneHowToPlayMenu L"SceneHowToPlayMenu" diff --git a/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_small.xui b/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_small.xui new file mode 100644 index 00000000..d37f6d1f --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay_menu_small.xui @@ -0,0 +1,50 @@ + + +640.000000 +360.000000 + + + +SceneHowToPlayMenu +640.000000 +360.000000 +true +CScene_HowToPlayMenu +XuiMenuScene +XuiButton1 + + + +HowToListButtons +480.000000 +243.000015 +80.000038,35.000000,0.000000 +CXuiCtrlPassThroughList +XuiHowToList +JoinGame + + + +control_ListItem +469.000000 +86.000000 +16.000000,32.000000,0.000000 +5 +false +XuiButton + + + + +control_ListItem +450.000000 +50.000000 +15.000000,15.000000,0.000000 +5 +false +XuiMainMenuButton_List + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_howtoplay_small.h b/Minecraft.Client/Common/Media/xuiscene_howtoplay_small.h new file mode 100644 index 00000000..29f6a8a2 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay_small.h @@ -0,0 +1,72 @@ +#define IDC_XuiHtmlControlTheEnd L"XuiHtmlControlTheEnd" +#define IDC_XuiImageTheEnd L"XuiImageTheEnd" +#define IDC_XuiHtmlControlNetherPortal L"XuiHtmlControlNetherPortal" +#define IDC_XuiImageNetherPortal L"XuiImageNetherPortal" +#define IDC_XuiHtmlControlDispenser L"XuiHtmlControlDispenser" +#define IDC_XuiImageDispenser L"XuiImageDispenser" +#define IDC_DInventory L"DInventory" +#define IDC_DText L"DText" +#define IDC_XuiImageHUD L"XuiImageHUD" +#define IDC_XuiHtmlControlHUD L"XuiHtmlControlHUD" +#define IDC_XuiHtmlControlBasics L"XuiHtmlControlBasics" +#define IDC_XuiImageInventory L"XuiImageInventory" +#define IDC_XuiHtmlControlInventory L"XuiHtmlControlInventory" +#define IDC_IInventory L"IInventory" +#define IDC_XuiImageChest L"XuiImageChest" +#define IDC_XuiHtmlControlChest L"XuiHtmlControlChest" +#define IDC_SCChest L"SCChest" +#define IDC_SCInventory L"SCInventory" +#define IDC_XuiImageLargeChest L"XuiImageLargeChest" +#define IDC_XuiHtmlControlLargeChest L"XuiHtmlControlLargeChest" +#define IDC_LCChest L"LCChest" +#define IDC_LCInventory L"LCInventory" +#define IDC_XuiHtmlControlFurnace L"XuiHtmlControlFurnace" +#define IDC_XuiImageFurnace L"XuiImageFurnace" +#define IDC_FChest L"FChest" +#define IDC_FIngredient L"FIngredient" +#define IDC_FInventory L"FInventory" +#define IDC_FFuel L"FFuel" +#define IDC_XuiHtmlControlCrafting L"XuiHtmlControlCrafting" +#define IDC_XuiImageCrafting L"XuiImageCrafting" +#define IDC_CInventory L"CInventory" +#define IDC_CGroup L"CGroup" +#define IDC_CItem L"CItem" +#define IDC_XuiHtmlControlCraftingTable L"XuiHtmlControlCraftingTable" +#define IDC_XuiImageCraftingTable L"XuiImageCraftingTable" +#define IDC_CTInventory3x3 L"CTInventory3x3" +#define IDC_CTGroup L"CTGroup" +#define IDC_CTItem L"CTItem" +#define IDC_XuiHtmlControlMultiplayer L"XuiHtmlControlMultiplayer" +#define IDC_XuiHtmlControlSocialMedia L"XuiHtmlControlSocialMedia" +#define IDC_XuiHtmlControlWhatsNew L"XuiHtmlControlWhatsNew" +#define IDC_XuiHtmlControlBanList L"XuiHtmlControlBanList" +#define IDC_XuiHtmlControlCreative L"XuiHtmlControlCreative" +#define IDC_XuiImageCreative L"XuiImageCreative" +#define IDC_CIGroup L"CIGroup" +#define IDC_XuiHtmlControlHostOptions L"XuiHtmlControlHostOptions" +#define IDC_XuiHtmlControlBreeding L"XuiHtmlControlBreeding" +#define IDC_XuiImageBreeding L"XuiImageBreeding" +#define IDC_XuiHtmlControlFarmingAnimals L"XuiHtmlControlFarmingAnimals" +#define IDC_XuiImageFarmingAnimals L"XuiImageFarmingAnimals" +#define IDC_XuiHtmlControlBrewing L"XuiHtmlControlBrewing" +#define IDC_XuiImageBrewing L"XuiImageBrewing" +#define IDC_BBrew L"BBrew" +#define IDC_BInventory L"BInventory" +#define IDC_XuiImageEnchantment L"XuiImageEnchantment" +#define IDC_XuiHtmlControlEnchantment L"XuiHtmlControlEnchantment" +#define IDC_EInventory L"EInventory" +#define IDC_EEnchant L"EEnchant" +#define IDC_XuiHtmlControlAnvil L"XuiHtmlControlAnvil" +#define IDC_XuiImageAnvil L"XuiImageAnvil" +#define IDC_ACost L"ACost" +#define IDC_AInventory L"AInventory" +#define IDC_ARepairAndName L"ARepairAndName" +#define IDC_XuiHtmlControlTrading L"XuiHtmlControlTrading" +#define IDC_XuiImageTrading L"XuiImageTrading" +#define IDC_TVillagerOffers L"TVillagerOffers" +#define IDC_TNeededForTrade L"TNeededForTrade" +#define IDC_TOffer1Label L"TOffer1Label" +#define IDC_TInventory L"TInventory" +#define IDC_XuiImageEnderchest L"XuiImageEnderchest" +#define IDC_XuiHtmlControlEnderchest L"XuiHtmlControlEnderchest" +#define IDC_SceneHowToPlay L"SceneHowToPlay" diff --git a/Minecraft.Client/Common/Media/xuiscene_howtoplay_small.xui b/Minecraft.Client/Common/Media/xuiscene_howtoplay_small.xui new file mode 100644 index 00000000..359860d1 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_howtoplay_small.xui @@ -0,0 +1,669 @@ + + +640.000000 +360.000000 + + + +SceneHowToPlay +640.000000 +360.000000 +[LayerFolders]0|-Enderchest|2|+|0|-Trading|6|+|0|+Anvil|5|+|0|-Enchantment|4|+|0|+Brewing|4|+|0|+FarmingAnimals|2|+|0|-Breeding|2|+|1|+Creative Mode|3|+|4|+CraftingTable|5|+|0|+Crafting|5|+|0|-Furnace|6|+|0|+Large Chest|4|+|0|+SmallChest|4|+|0|+Inventory|3|+|0|+Basics|1|+|0|+HUD|2|+|0|+Dispenser|4|+|0|-Nether Portal|2|+|0|+TheEnd|2|+|0[/LayerFolders] +CScene_HowToPlay +XuiBlankScene +XuiSliderVolume + + + +XuiHtmlControlTheEnd +280.000000 +240.000000 +82.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageTheEnd +248.000000 +146.000000 +382.000000,54.000000,0.000000 +ImHowToPlayTheEndSmall + + + + +XuiHtmlControlNetherPortal +280.000000 +240.000000 +82.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageNetherPortal +248.000000 +146.000000 +382.000000,54.000000,0.000000 +ImHowToPlayNetherPortalSmall + + + + +XuiHtmlControlDispenser +280.000000 +240.000000 +76.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageDispenser +262.000000 +280.000000 +371.000000,3.000000,0.000000 +ImHowToPlayDispenserSmall + + + + +DInventory +230.000000 +17.000000 +388.000000,137.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +DText +160.000000 +23.000000 +422.000000,18.000000,0.000000 +2 +LabelContainerSceneCentreSmall + + + + +XuiImageHUD +364.000000 +84.000000 +157.000000,204.000000,0.000000 +ImHowToPlayHUDSmall + + + + +XuiHtmlControlHUD +540.000000 +152.000000 +82.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiHtmlControlBasics +540.000000 +240.000000 +82.000000,12.000046,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageInventory +262.000000 +280.000000 +372.000000,6.000000,0.000000 +ImHowToPlayInventorySmall + + + + +XuiHtmlControlInventory +280.000000 +240.000000 +76.000046,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +IInventory +214.000000 +18.000000 +389.000000,138.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +XuiImageChest +258.000000 +260.000000 +375.000000,15.000000,0.000000 +ImHowToPlayChestSmall + + + + +XuiHtmlControlChest +280.000000 +240.000000 +80.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +SCChest +230.000000 +23.000000 +388.000000,23.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +SCInventory +230.000000 +19.000000 +388.000000,128.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +XuiImageLargeChest +213.000000 +270.000000 +398.000000,6.000000,0.000000 +ImHowToPlayLargeChestSmall + + + + +XuiHtmlControlLargeChest +280.000000 +240.000000 +97.000038,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +LCChest +189.000000 +17.000000 +415.000000,12.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +LCInventory +189.000000 +14.000000 +415.000000,158.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +XuiHtmlControlFurnace +280.000000 +240.000000 +75.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageFurnace +262.000000 +290.000000 +371.000000,0.000000,0.000000 +ImHowToPlayFurnaceSmall + + + + +FChest +219.000000 +21.000000 +385.000000,11.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +FIngredient +114.000000 +18.000000 +381.000000,44.000000,0.000000 +LabelContainerSceneRightSmall + + + + +FInventory +219.000000 +18.000000 +385.000000,143.000000,0.000000 +12 +LabelContainerSceneLeftSmall + + + + +FFuel +114.000000 +18.000000 +381.000000,113.000000,0.000000 +LabelContainerSceneRightSmall + + + + +XuiHtmlControlCrafting +280.000000 +240.000000 +82.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageCrafting +252.000000 +170.000000 +376.000000,56.000000,0.000000 +ImHowToPlayCraftingSmall + + + + +CInventory +128.000000 +14.000000 +493.000000,140.000000,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +CGroup +200.000000 +18.000000 +403.000000,90.000000,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +CItem +101.000000 +14.000000 +385.000000,140.000000,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +XuiHtmlControlCraftingTable +280.000000 +240.000000 +82.000000,12.000031,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageCraftingTable +245.000000 +142.000000 +376.000000,60.000000,0.000000 +ImHowToPlayCraftingTableSmall + + + + +CTInventory3x3 +128.000000 +14.000000 +488.000000,128.000000,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +CTGroup +160.000000 +14.000000 +421.222229,86.777779,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +CTItem +95.000000 +14.000000 +386.000000,128.000000,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +XuiHtmlControlMultiplayer +520.000000 +244.000000 +85.000008,24.000038,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlSocialMedia +520.000000 +244.000000 +87.000008,23.000023,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlWhatsNew +520.000000 +244.000000 +87.000008,23.000023,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlBanList +520.000000 +244.000000 +87.000008,23.000023,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlCreative +280.000000 +240.000000 +80.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageCreative +258.000000 +194.000000 +375.000000,15.000000,0.000000 +ImHowToPlayCreativeSmall + + + + +CIGroup +160.000000 +14.000000 +425.000000,46.000000,0.000000 +XuiLabelDarkCentredHowtoSmall + + + + +XuiHtmlControlHostOptions +520.000000 +244.000000 +87.000008,23.000023,0.000000 +XuiHtmlControl_H2P + + + + +XuiHtmlControlBreeding +280.000000 +240.000000 +80.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageBreeding +262.000000 +280.000000 +375.000000,6.000000,0.000000 +ImHowToPlayBreedingSmall + + + + +XuiHtmlControlFarmingAnimals +280.000000 +240.000000 +80.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageFarmingAnimals +262.000000 +280.000000 +375.000000,6.000000,0.000000 +ImHowToPlayFarmingAnimalsSmall + + + + +XuiHtmlControlBrewing +280.000000 +240.000000 +80.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageBrewing +260.000000 +290.000000 +375.000000,2.000000,0.000000 +ImHowToPlayBrewingSmall + + + + +BBrew +210.000000 +18.000000 +399.000000,12.000000,0.000000 +8 +LabelContainerSceneCentreSmall + + + + +BInventory +210.000000 +18.000000 +388.000000,142.000000,0.000000 +8 +LabelContainerSceneLeftSmall + + + + +XuiImageEnchantment +262.000000 +280.000000 +375.000000,6.000000,0.000000 +ImHowToPlayEnchantmentSmall + + + + +XuiHtmlControlEnchantment +280.000000 +240.000000 +80.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +EInventory +210.000000 +18.000000 +388.000000,138.000000,0.000000 +8 +LabelContainerSceneLeftSmall + + + + +EEnchant +210.000000 +18.000000 +388.000000,14.000000,0.000000 +8 +LabelContainerSceneLeftSmall + + + + +XuiHtmlControlAnvil +280.000000 +240.000000 +75.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageAnvil +260.000000 +290.000000 +372.000000,6.000000,0.000000 +ImHowToPlayAnvilSmall + + + + +ACost +156.000000 +18.000000 +461.000000,120.999992,0.000000 +8 +XuiLabelAffordableSmall + + + + +AInventory +156.000000 +18.000000 +384.000000,148.000000,0.000000 +8 +LabelContainerSceneLeftSmall + + + + +ARepairAndName +156.000000 +18.000000 +448.000000,18.999992,0.000000 +8 +LabelContainerSceneCentreSmall + + + + +XuiHtmlControlTrading +280.000000 +240.000000 +75.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + +XuiImageTrading +260.000000 +174.000000 +372.000000,56.000000,0.000000 +ImHowToPlayTradingSmall + + + + +TVillagerOffers +260.000000 +18.000000 +372.000000,71.000000,0.000000 +8 +XuiLabelDarkCentred8 + + + + +TNeededForTrade +88.000000 +24.000000 +379.000000,138.000000,0.000000 +8 +XuiLabelDarkCentred8 + + + + +TOffer1Label +56.000000 +11.000000 +411.000000,171.000000,0.000000 +8 +XuiLabelDarkLeftWrapSmall8 + + + + +TInventory +142.000000 +11.000000 +477.000000,138.000000,0.000000 +8 +XuiLabelDarkCentred8 + + + + +XuiImageEnderchest +262.000000 +280.000000 +375.000000,6.000000,0.000000 +ImHowToPlayEnderchestSmall + + + + +XuiHtmlControlEnderchest +280.000000 +240.000000 +80.000000,12.000000,0.000000 +XuiHtmlControl_H2P_Small + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_hud.h b/Minecraft.Client/Common/Media/xuiscene_hud.h new file mode 100644 index 00000000..8bf537f5 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_hud.h @@ -0,0 +1,62 @@ +#define IDC_Crosshair L"Crosshair" +#define IDC_Box L"Box" +#define IDC_Inventory1 L"Inventory1" +#define IDC_Inventory2 L"Inventory2" +#define IDC_Inventory3 L"Inventory3" +#define IDC_Inventory4 L"Inventory4" +#define IDC_Inventory5 L"Inventory5" +#define IDC_Inventory6 L"Inventory6" +#define IDC_Inventory7 L"Inventory7" +#define IDC_Inventory8 L"Inventory8" +#define IDC_Inventory9 L"Inventory9" +#define IDC_Hotbar L"Hotbar" +#define IDC_ExperienceProgress L"ExperienceProgress" +#define IDC_Health0 L"Health0" +#define IDC_Health1 L"Health1" +#define IDC_Health2 L"Health2" +#define IDC_Health3 L"Health3" +#define IDC_Health4 L"Health4" +#define IDC_Health5 L"Health5" +#define IDC_Health6 L"Health6" +#define IDC_Health7 L"Health7" +#define IDC_Health8 L"Health8" +#define IDC_Health9 L"Health9" +#define IDC_Health L"Health" +#define IDC_Armour0 L"Armour0" +#define IDC_Armour1 L"Armour1" +#define IDC_Armour2 L"Armour2" +#define IDC_Armour3 L"Armour3" +#define IDC_Armour4 L"Armour4" +#define IDC_Armour5 L"Armour5" +#define IDC_Armour6 L"Armour6" +#define IDC_Armour7 L"Armour7" +#define IDC_Armour8 L"Armour8" +#define IDC_Armour9 L"Armour9" +#define IDC_Armour L"Armour" +#define IDC_Food9 L"Food9" +#define IDC_Food8 L"Food8" +#define IDC_Food7 L"Food7" +#define IDC_Food6 L"Food6" +#define IDC_Food5 L"Food5" +#define IDC_Food4 L"Food4" +#define IDC_Food3 L"Food3" +#define IDC_Food2 L"Food2" +#define IDC_Food1 L"Food1" +#define IDC_Food0 L"Food0" +#define IDC_Food L"Food" +#define IDC_Air9 L"Air9" +#define IDC_Air8 L"Air8" +#define IDC_Air7 L"Air7" +#define IDC_Air6 L"Air6" +#define IDC_Air5 L"Air5" +#define IDC_Air4 L"Air4" +#define IDC_Air3 L"Air3" +#define IDC_Air2 L"Air2" +#define IDC_Air1 L"Air1" +#define IDC_Air0 L"Air0" +#define IDC_Air L"Air" +#define IDC_XPLevel L"XPLevel" +#define IDC_HudScaleGroup L"HudScaleGroup" +#define IDC_HudGroup L"HudGroup" +#define IDC_HudHolder L"HudHolder" +#define IDC_HUDScene L"HUDScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_hud.xui b/Minecraft.Client/Common/Media/xuiscene_hud.xui new file mode 100644 index 00000000..13986320 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_hud.xui @@ -0,0 +1,653 @@ + + +1280.000000 +720.000000 + + + +HUDScene +1280.000000 +720.000000 +CXuiSceneHud +XuiBlankScene + + + +Crosshair +15.000000 +15.000000 +616.000000,336.000000,0.000000 +3.000000,3.000000,3.000000 +HudCrosshair + + + + +HudHolder +548.000000 +150.000000 +366.000031,480.000000,0.000000 + + + +HudGroup +548.000000 +150.000000 + + + +HudScaleGroup +182.000000 +54.000000 +0.000038,3.000057,0.000000 +3.000000,3.000000,3.000000 + + + +Hotbar +182.000000 +24.000000 +0.000000,26.000000,0.000000 + + + +Box +182.000000 +22.000000 +0.000000,1.000000,0.000000 +15 +HUDHotBarBack + + + + +Inventory1 +24.000000 +24.000000 +-0.999939,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory2 +24.000000 +24.000000 +19.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory3 +24.000000 +24.000000 +39.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory4 +24.000000 +24.000000 +59.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory5 +24.000000 +24.000000 +79.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory6 +24.000000 +24.000000 +99.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory7 +24.000000 +24.000000 +119.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory8 +24.000000 +24.000000 +139.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory9 +24.000000 +24.000000 +159.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + + +ExperienceProgress +182.000000 +5.000000 +0.000031,20.000031,0.000000 +ExperienceProgress +200 + + + + +Health +81.000000 +9.000000 +0.000000,10.000031,0.000000 + + + +Health0 +9.000000 +9.000000 +0.000031,0.000061,0.000000 +HudHealth + + + + +Health1 +9.000000 +9.000000 +8.000000,0.000061,0.000000 +HudHealth + + + + +Health2 +9.000000 +9.000000 +16.000000,0.000061,0.000000 +HudHealth + + + + +Health3 +9.000000 +9.000000 +24.000000,0.000061,0.000000 +HudHealth + + + + +Health4 +9.000000 +9.000000 +32.000000,0.000061,0.000000 +HudHealth + + + + +Health5 +9.000000 +9.000000 +40.000000,0.000061,0.000000 +HudHealth + + + + +Health6 +9.000000 +9.000000 +48.000000,0.000061,0.000000 +HudHealth + + + + +Health7 +9.000000 +9.000000 +56.000000,0.000061,0.000000 +HudHealth + + + + +Health8 +9.000000 +9.000000 +64.000000,0.000061,0.000000 +HudHealth + + + + +Health9 +9.000000 +9.000000 +72.000031,0.000061,0.000000 +HudHealth + + + + + +Armour +81.000000 +9.000000 + + + +Armour0 +9.000000 +9.000000 +0.000031,0.000061,0.000000 +HudArmour + + + + +Armour1 +9.000000 +9.000000 +8.000031,0.000061,0.000000 +HudArmour + + + + +Armour2 +9.000000 +9.000000 +16.000029,0.000061,0.000000 +HudArmour + + + + +Armour3 +9.000000 +9.000000 +24.000027,0.000061,0.000000 +HudArmour + + + + +Armour4 +9.000000 +9.000000 +32.000027,0.000061,0.000000 +HudArmour + + + + +Armour5 +9.000000 +9.000000 +40.000027,0.000061,0.000000 +HudArmour + + + + +Armour6 +9.000000 +9.000000 +48.000023,0.000061,0.000000 +HudArmour + + + + +Armour7 +9.000000 +9.000000 +56.000023,0.000061,0.000000 +HudArmour + + + + +Armour8 +9.000000 +9.000000 +64.000023,0.000061,0.000000 +HudArmour + + + + +Armour9 +9.000000 +9.000000 +72.000031,0.000061,0.000000 +HudArmour + + + + + +Food +81.000000 +9.000000 +101.000031,10.000031,0.000000 + + + +Food9 +9.000000 +9.000000 +0.000000,0.000061,0.000000 +HudFood + + + + +Food8 +9.000000 +9.000000 +7.999992,0.000061,0.000000 +HudFood + + + + +Food7 +9.000000 +9.000000 +15.999992,0.000061,0.000000 +HudFood + + + + +Food6 +9.000000 +9.000000 +23.999992,0.000061,0.000000 +HudFood + + + + +Food5 +9.000000 +9.000000 +31.999996,0.000061,0.000000 +HudFood + + + + +Food4 +9.000000 +9.000000 +39.999996,0.000061,0.000000 +HudFood + + + + +Food3 +9.000000 +9.000000 +47.999996,0.000061,0.000000 +HudFood + + + + +Food2 +9.000000 +9.000000 +56.000000,0.000061,0.000000 +HudFood + + + + +Food1 +9.000000 +9.000000 +64.000000,0.000061,0.000000 +HudFood + + + + +Food0 +9.000000 +9.000000 +72.000000,0.000061,0.000000 +HudFood + + + + + +Air +81.000000 +9.000000 +101.000031,0.000000,0.000000 + + + +Air9 +9.000000 +9.000000 +0.000031,0.000061,0.000000 +HudAir + + + + +Air8 +9.000000 +9.000000 +8.000031,0.000061,0.000000 +HudAir + + + + +Air7 +9.000000 +9.000000 +16.000031,0.000061,0.000000 +HudAir + + + + +Air6 +9.000000 +9.000000 +24.000031,0.000061,0.000000 +HudAir + + + + +Air5 +9.000000 +9.000000 +32.000031,0.000061,0.000000 +HudAir + + + + +Air4 +9.000000 +9.000000 +40.000031,0.000061,0.000000 +HudAir + + + + +Air3 +9.000000 +9.000000 +48.000031,0.000061,0.000000 +HudAir + + + + +Air2 +9.000000 +9.000000 +56.000031,0.000061,0.000000 +HudAir + + + + +Air1 +9.000000 +9.000000 +64.000031,0.000061,0.000000 +HudAir + + + + +Air0 +9.000000 +9.000000 +72.000031,0.000061,0.000000 +HudAir + + + + + +XPLevel +20.000000 +9.000000 +81.000000,10.000000,0.000000 +HudXPLevel + + + + + +Normal + +stop + + +ScaleSmall + +stop + + +ScaleLarge + +stop + + + + + + +HudScaleGroup +Scale +Position + + +0 +3.000000,3.000000,3.000000 +0.000038,3.000057,0.000000 + + + +0 +2.000000,2.000000,2.000000 +90.999992,46.000057,0.000000 + + + +0 +4.000000,4.000000,4.000000 +-90.999962,-43.999943,0.000000 + + + + + + + + +Normal + +stop + + +ScaleSmall + +stop + + +ScaleLarge + +stop + + + +Crosshair +Scale +Position + + +0 +3.000000,3.000000,3.000000 +616.000000,336.000000,0.000000 + + + +0 +2.000000,2.000000,2.000000 +624.000000,344.000000,0.000000 + + + +0 +4.000000,4.000000,1.000000 +610.000000,330.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_hud_480.h b/Minecraft.Client/Common/Media/xuiscene_hud_480.h new file mode 100644 index 00000000..8bf537f5 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_hud_480.h @@ -0,0 +1,62 @@ +#define IDC_Crosshair L"Crosshair" +#define IDC_Box L"Box" +#define IDC_Inventory1 L"Inventory1" +#define IDC_Inventory2 L"Inventory2" +#define IDC_Inventory3 L"Inventory3" +#define IDC_Inventory4 L"Inventory4" +#define IDC_Inventory5 L"Inventory5" +#define IDC_Inventory6 L"Inventory6" +#define IDC_Inventory7 L"Inventory7" +#define IDC_Inventory8 L"Inventory8" +#define IDC_Inventory9 L"Inventory9" +#define IDC_Hotbar L"Hotbar" +#define IDC_ExperienceProgress L"ExperienceProgress" +#define IDC_Health0 L"Health0" +#define IDC_Health1 L"Health1" +#define IDC_Health2 L"Health2" +#define IDC_Health3 L"Health3" +#define IDC_Health4 L"Health4" +#define IDC_Health5 L"Health5" +#define IDC_Health6 L"Health6" +#define IDC_Health7 L"Health7" +#define IDC_Health8 L"Health8" +#define IDC_Health9 L"Health9" +#define IDC_Health L"Health" +#define IDC_Armour0 L"Armour0" +#define IDC_Armour1 L"Armour1" +#define IDC_Armour2 L"Armour2" +#define IDC_Armour3 L"Armour3" +#define IDC_Armour4 L"Armour4" +#define IDC_Armour5 L"Armour5" +#define IDC_Armour6 L"Armour6" +#define IDC_Armour7 L"Armour7" +#define IDC_Armour8 L"Armour8" +#define IDC_Armour9 L"Armour9" +#define IDC_Armour L"Armour" +#define IDC_Food9 L"Food9" +#define IDC_Food8 L"Food8" +#define IDC_Food7 L"Food7" +#define IDC_Food6 L"Food6" +#define IDC_Food5 L"Food5" +#define IDC_Food4 L"Food4" +#define IDC_Food3 L"Food3" +#define IDC_Food2 L"Food2" +#define IDC_Food1 L"Food1" +#define IDC_Food0 L"Food0" +#define IDC_Food L"Food" +#define IDC_Air9 L"Air9" +#define IDC_Air8 L"Air8" +#define IDC_Air7 L"Air7" +#define IDC_Air6 L"Air6" +#define IDC_Air5 L"Air5" +#define IDC_Air4 L"Air4" +#define IDC_Air3 L"Air3" +#define IDC_Air2 L"Air2" +#define IDC_Air1 L"Air1" +#define IDC_Air0 L"Air0" +#define IDC_Air L"Air" +#define IDC_XPLevel L"XPLevel" +#define IDC_HudScaleGroup L"HudScaleGroup" +#define IDC_HudGroup L"HudGroup" +#define IDC_HudHolder L"HudHolder" +#define IDC_HUDScene L"HUDScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_hud_480.xui b/Minecraft.Client/Common/Media/xuiscene_hud_480.xui new file mode 100644 index 00000000..4364039e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_hud_480.xui @@ -0,0 +1,653 @@ + + +640.000000 +480.000000 + + + +HUDScene +640.000000 +480.000000 +CXuiSceneHud +XuiBlankScene + + + +Crosshair +15.000000 +15.000000 +306.000031,226.000015,0.000000 +2.000000,2.000000,1.000000 +HudCrosshair + + + + +HudHolder +273.000000 +81.000000 +183.500015,336.000000,0.000000 + + + +HudGroup +273.000000 +81.000000 + + + +HudScaleGroup +182.000000 +54.000000 +-45.000000,-17.999977,0.000000 +2.000000,2.000000,1.000000 + + + +Hotbar +182.000000 +24.000000 +0.000000,26.000000,0.000000 + + + +Box +182.000000 +22.000000 +0.000000,1.000000,0.000000 +15 +HUDHotBarBack + + + + +Inventory1 +24.000000 +24.000000 +-0.999939,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory2 +24.000000 +24.000000 +19.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory3 +24.000000 +24.000000 +39.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory4 +24.000000 +24.000000 +59.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory5 +24.000000 +24.000000 +79.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory6 +24.000000 +24.000000 +99.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory7 +24.000000 +24.000000 +119.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory8 +24.000000 +24.000000 +139.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory9 +24.000000 +24.000000 +159.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + + +ExperienceProgress +182.000000 +5.000000 +0.000031,20.000031,0.000000 +ExperienceProgress +200 + + + + +Health +81.000000 +9.000000 +0.000000,10.000031,0.000000 + + + +Health0 +9.000000 +9.000000 +0.000031,0.000061,0.000000 +HudHealth + + + + +Health1 +9.000000 +9.000000 +8.000000,0.000061,0.000000 +HudHealth + + + + +Health2 +9.000000 +9.000000 +16.000000,0.000061,0.000000 +HudHealth + + + + +Health3 +9.000000 +9.000000 +24.000000,0.000061,0.000000 +HudHealth + + + + +Health4 +9.000000 +9.000000 +32.000000,0.000061,0.000000 +HudHealth + + + + +Health5 +9.000000 +9.000000 +40.000000,0.000061,0.000000 +HudHealth + + + + +Health6 +9.000000 +9.000000 +48.000000,0.000061,0.000000 +HudHealth + + + + +Health7 +9.000000 +9.000000 +56.000000,0.000061,0.000000 +HudHealth + + + + +Health8 +9.000000 +9.000000 +64.000000,0.000061,0.000000 +HudHealth + + + + +Health9 +9.000000 +9.000000 +72.000031,0.000061,0.000000 +HudHealth + + + + + +Armour +81.000000 +9.000000 + + + +Armour0 +9.000000 +9.000000 +0.000031,0.000061,0.000000 +HudArmour + + + + +Armour1 +9.000000 +9.000000 +8.000031,0.000061,0.000000 +HudArmour + + + + +Armour2 +9.000000 +9.000000 +16.000029,0.000061,0.000000 +HudArmour + + + + +Armour3 +9.000000 +9.000000 +24.000027,0.000061,0.000000 +HudArmour + + + + +Armour4 +9.000000 +9.000000 +32.000027,0.000061,0.000000 +HudArmour + + + + +Armour5 +9.000000 +9.000000 +40.000027,0.000061,0.000000 +HudArmour + + + + +Armour6 +9.000000 +9.000000 +48.000023,0.000061,0.000000 +HudArmour + + + + +Armour7 +9.000000 +9.000000 +56.000023,0.000061,0.000000 +HudArmour + + + + +Armour8 +9.000000 +9.000000 +64.000023,0.000061,0.000000 +HudArmour + + + + +Armour9 +9.000000 +9.000000 +72.000031,0.000061,0.000000 +HudArmour + + + + + +Food +81.000000 +9.000000 +101.000031,10.000031,0.000000 + + + +Food9 +9.000000 +9.000000 +0.000000,0.000061,0.000000 +HudFood + + + + +Food8 +9.000000 +9.000000 +7.999992,0.000061,0.000000 +HudFood + + + + +Food7 +9.000000 +9.000000 +15.999992,0.000061,0.000000 +HudFood + + + + +Food6 +9.000000 +9.000000 +23.999992,0.000061,0.000000 +HudFood + + + + +Food5 +9.000000 +9.000000 +31.999996,0.000061,0.000000 +HudFood + + + + +Food4 +9.000000 +9.000000 +39.999996,0.000061,0.000000 +HudFood + + + + +Food3 +9.000000 +9.000000 +47.999996,0.000061,0.000000 +HudFood + + + + +Food2 +9.000000 +9.000000 +56.000000,0.000061,0.000000 +HudFood + + + + +Food1 +9.000000 +9.000000 +64.000000,0.000061,0.000000 +HudFood + + + + +Food0 +9.000000 +9.000000 +72.000000,0.000061,0.000000 +HudFood + + + + + +Air +81.000000 +9.000000 +101.000031,0.000000,0.000000 + + + +Air9 +9.000000 +9.000000 +0.000031,0.000061,0.000000 +HudAir + + + + +Air8 +9.000000 +9.000000 +8.000031,0.000061,0.000000 +HudAir + + + + +Air7 +9.000000 +9.000000 +16.000031,0.000061,0.000000 +HudAir + + + + +Air6 +9.000000 +9.000000 +24.000031,0.000061,0.000000 +HudAir + + + + +Air5 +9.000000 +9.000000 +32.000031,0.000061,0.000000 +HudAir + + + + +Air4 +9.000000 +9.000000 +40.000031,0.000061,0.000000 +HudAir + + + + +Air3 +9.000000 +9.000000 +48.000031,0.000061,0.000000 +HudAir + + + + +Air2 +9.000000 +9.000000 +56.000031,0.000061,0.000000 +HudAir + + + + +Air1 +9.000000 +9.000000 +64.000031,0.000061,0.000000 +HudAir + + + + +Air0 +9.000000 +9.000000 +72.000031,0.000061,0.000000 +HudAir + + + + + +XPLevel +20.000000 +9.000000 +81.000000,10.000000,0.000000 +HudXPLevel + + + + + +Normal + +stop + + +ScaleSmall + +stop + + +ScaleLarge + +stop + + + + + + +HudScaleGroup +Scale +Position + + +0 +2.000000,2.000000,1.000000 +-45.000000,-17.999977,0.000000 + + + +0 +1.500000,1.500000,1.000000 +0.000011,8.000023,0.000000 + + + +0 +2.500000,2.500000,1.000000 +-90.999985,-41.999977,0.000000 + + + + + + + + +Normal + +stop + + +ScaleSmall + +stop + + +ScaleLarge + +stop + + + +Crosshair +Scale +Position + + +0 +2.000000,2.000000,1.000000 +306.000031,226.000015,0.000000 + + + +0 +1.000000,1.000000,1.000000 +312.000000,232.000000,0.000000 + + + +0 +3.000000,3.000000,1.000000 +298.000000,218.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_hud_small.h b/Minecraft.Client/Common/Media/xuiscene_hud_small.h new file mode 100644 index 00000000..8bf537f5 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_hud_small.h @@ -0,0 +1,62 @@ +#define IDC_Crosshair L"Crosshair" +#define IDC_Box L"Box" +#define IDC_Inventory1 L"Inventory1" +#define IDC_Inventory2 L"Inventory2" +#define IDC_Inventory3 L"Inventory3" +#define IDC_Inventory4 L"Inventory4" +#define IDC_Inventory5 L"Inventory5" +#define IDC_Inventory6 L"Inventory6" +#define IDC_Inventory7 L"Inventory7" +#define IDC_Inventory8 L"Inventory8" +#define IDC_Inventory9 L"Inventory9" +#define IDC_Hotbar L"Hotbar" +#define IDC_ExperienceProgress L"ExperienceProgress" +#define IDC_Health0 L"Health0" +#define IDC_Health1 L"Health1" +#define IDC_Health2 L"Health2" +#define IDC_Health3 L"Health3" +#define IDC_Health4 L"Health4" +#define IDC_Health5 L"Health5" +#define IDC_Health6 L"Health6" +#define IDC_Health7 L"Health7" +#define IDC_Health8 L"Health8" +#define IDC_Health9 L"Health9" +#define IDC_Health L"Health" +#define IDC_Armour0 L"Armour0" +#define IDC_Armour1 L"Armour1" +#define IDC_Armour2 L"Armour2" +#define IDC_Armour3 L"Armour3" +#define IDC_Armour4 L"Armour4" +#define IDC_Armour5 L"Armour5" +#define IDC_Armour6 L"Armour6" +#define IDC_Armour7 L"Armour7" +#define IDC_Armour8 L"Armour8" +#define IDC_Armour9 L"Armour9" +#define IDC_Armour L"Armour" +#define IDC_Food9 L"Food9" +#define IDC_Food8 L"Food8" +#define IDC_Food7 L"Food7" +#define IDC_Food6 L"Food6" +#define IDC_Food5 L"Food5" +#define IDC_Food4 L"Food4" +#define IDC_Food3 L"Food3" +#define IDC_Food2 L"Food2" +#define IDC_Food1 L"Food1" +#define IDC_Food0 L"Food0" +#define IDC_Food L"Food" +#define IDC_Air9 L"Air9" +#define IDC_Air8 L"Air8" +#define IDC_Air7 L"Air7" +#define IDC_Air6 L"Air6" +#define IDC_Air5 L"Air5" +#define IDC_Air4 L"Air4" +#define IDC_Air3 L"Air3" +#define IDC_Air2 L"Air2" +#define IDC_Air1 L"Air1" +#define IDC_Air0 L"Air0" +#define IDC_Air L"Air" +#define IDC_XPLevel L"XPLevel" +#define IDC_HudScaleGroup L"HudScaleGroup" +#define IDC_HudGroup L"HudGroup" +#define IDC_HudHolder L"HudHolder" +#define IDC_HUDScene L"HUDScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_hud_small.xui b/Minecraft.Client/Common/Media/xuiscene_hud_small.xui new file mode 100644 index 00000000..cea7e2bd --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_hud_small.xui @@ -0,0 +1,672 @@ + + +640.000000 +360.000000 + + + +HUDScene +640.000000 +360.000000 +CXuiSceneHud +XuiBlankScene + + + +Crosshair +15.000000 +15.000000 +304.000000,164.000000,0.000000 +2.000000,2.000000,1.000000 +HudCrosshair + + + + +HudHolder +273.000000 +81.000000 +182.000000,240.000000,0.000000 + + + +HudGroup +273.000000 +81.000000 + + + +HudScaleGroup +182.000000 +54.000000 +0.000015,8.000008,0.000000 +1.520000,1.520000,1.020000 + + + +Hotbar +182.000000 +24.000000 +0.000000,30.000000,0.000000 + + + +Box +182.000000 +22.000000 +-0.000000,1.000000,0.000000 +15 +HUDHotBarBack + + + + +Inventory1 +24.000000 +24.000000 +-0.999939,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory2 +24.000000 +24.000000 +19.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory3 +24.000000 +24.000000 +39.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory4 +24.000000 +24.000000 +59.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory5 +24.000000 +24.000000 +79.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory6 +24.000000 +24.000000 +99.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory7 +24.000000 +24.000000 +119.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory8 +24.000000 +24.000000 +139.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + +Inventory9 +24.000000 +24.000000 +159.000061,0.000061,0.000000 +CXuiCtrlSlotItem +ItemHUDHotbar + + + + + +ExperienceProgress +182.000000 +5.000000 +0.000031,20.000031,0.000000 +ExperienceProgress +200 + + + + +Health +81.000000 +9.000000 +0.000000,10.000031,0.000000 + + + +Health0 +9.000000 +9.000000 +0.000031,0.000061,0.000000 +HudHealth + + + + +Health1 +9.000000 +9.000000 +8.000000,0.000061,0.000000 +HudHealth + + + + +Health2 +9.000000 +9.000000 +16.000000,0.000061,0.000000 +HudHealth + + + + +Health3 +9.000000 +9.000000 +24.000000,0.000061,0.000000 +HudHealth + + + + +Health4 +9.000000 +9.000000 +32.000000,0.000061,0.000000 +HudHealth + + + + +Health5 +9.000000 +9.000000 +40.000000,0.000061,0.000000 +HudHealth + + + + +Health6 +9.000000 +9.000000 +48.000000,0.000061,0.000000 +HudHealth + + + + +Health7 +9.000000 +9.000000 +56.000000,0.000061,0.000000 +HudHealth + + + + +Health8 +9.000000 +9.000000 +64.000000,0.000061,0.000000 +HudHealth + + + + +Health9 +9.000000 +9.000000 +72.000031,0.000061,0.000000 +HudHealth + + + + + +Armour +81.000000 +9.000000 + + + +Armour0 +9.000000 +9.000000 +0.000031,0.000061,0.000000 +HudArmour + + + + +Armour1 +9.000000 +9.000000 +8.000031,0.000061,0.000000 +HudArmour + + + + +Armour2 +9.000000 +9.000000 +16.000029,0.000061,0.000000 +HudArmour + + + + +Armour3 +9.000000 +9.000000 +24.000027,0.000061,0.000000 +HudArmour + + + + +Armour4 +9.000000 +9.000000 +32.000027,0.000061,0.000000 +HudArmour + + + + +Armour5 +9.000000 +9.000000 +40.000027,0.000061,0.000000 +HudArmour + + + + +Armour6 +9.000000 +9.000000 +48.000023,0.000061,0.000000 +HudArmour + + + + +Armour7 +9.000000 +9.000000 +56.000023,0.000061,0.000000 +HudArmour + + + + +Armour8 +9.000000 +9.000000 +64.000023,0.000061,0.000000 +HudArmour + + + + +Armour9 +9.000000 +9.000000 +72.000031,0.000061,0.000000 +HudArmour + + + + + +Food +81.000000 +9.000000 +101.000031,10.000031,0.000000 + + + +Food9 +9.000000 +9.000000 +0.000000,0.000061,0.000000 +HudFood + + + + +Food8 +9.000000 +9.000000 +7.999992,0.000061,0.000000 +HudFood + + + + +Food7 +9.000000 +9.000000 +15.999992,0.000061,0.000000 +HudFood + + + + +Food6 +9.000000 +9.000000 +23.999992,0.000061,0.000000 +HudFood + + + + +Food5 +9.000000 +9.000000 +31.999996,0.000061,0.000000 +HudFood + + + + +Food4 +9.000000 +9.000000 +39.999996,0.000061,0.000000 +HudFood + + + + +Food3 +9.000000 +9.000000 +47.999996,0.000061,0.000000 +HudFood + + + + +Food2 +9.000000 +9.000000 +56.000000,0.000061,0.000000 +HudFood + + + + +Food1 +9.000000 +9.000000 +64.000000,0.000061,0.000000 +HudFood + + + + +Food0 +9.000000 +9.000000 +72.000000,0.000061,0.000000 +HudFood + + + + + +Air +81.000000 +9.000000 +101.000031,0.000000,0.000000 + + + +Air9 +9.000000 +9.000000 +0.000031,0.000061,0.000000 +HudAir + + + + +Air8 +9.000000 +9.000000 +8.000031,0.000061,0.000000 +HudAir + + + + +Air7 +9.000000 +9.000000 +16.000031,0.000061,0.000000 +HudAir + + + + +Air6 +9.000000 +9.000000 +24.000031,0.000061,0.000000 +HudAir + + + + +Air5 +9.000000 +9.000000 +32.000031,0.000061,0.000000 +HudAir + + + + +Air4 +9.000000 +9.000000 +40.000031,0.000061,0.000000 +HudAir + + + + +Air3 +9.000000 +9.000000 +48.000031,0.000061,0.000000 +HudAir + + + + +Air2 +9.000000 +9.000000 +56.000031,0.000061,0.000000 +HudAir + + + + +Air1 +9.000000 +9.000000 +64.000031,0.000061,0.000000 +HudAir + + + + +Air0 +9.000000 +9.000000 +72.000031,0.000061,0.000000 +HudAir + + + + + +XPLevel +20.000000 +9.000000 +81.000000,10.000000,0.000000 +HudXPLevel + + + + + +Normal + +stop + + +ScaleSmall + +stop + + +ScaleLarge + +stop + + + +Hotbar +Position + + +0 +0.000000,30.000000,0.000000 + + + +0 +0.000000,30.000000,0.000000 + + + +0 +0.000000,27.000000,0.000000 + + + + + + +HudScaleGroup +Scale +Position + + +0 +1.520000,1.520000,1.020000 +0.000015,8.000008,0.000000 + + + +0 +1.000000,1.000000,1.000000 +46.000015,2.000008,0.000000 + + + +0 +2.000000,2.000000,3.000000 +-45.999969,-13.999992,0.000000 + + + + + + + + +Normal + +stop + + +ScaleSmall + +stop + + +ScaleLarge + +stop + + + +Crosshair +Scale +Position + + +0 +2.000000,2.000000,1.000000 +304.000000,164.000000,0.000000 + + + +0 +1.000000,1.000000,1.000000 +312.000000,172.000000,0.000000 + + + +0 +3.000000,3.000000,1.000000 +296.000000,156.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_ingame_host_options.h b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options.h new file mode 100644 index 00000000..330eac41 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options.h @@ -0,0 +1,6 @@ +#define IDC_CheckboxTNT L"CheckboxTNT" +#define IDC_CheckboxFireSpreads L"CheckboxFireSpreads" +#define IDC_ButtonTeleportToPlayer L"ButtonTeleportToPlayer" +#define IDC_ButtonTeleportPlayerToMe L"ButtonTeleportPlayerToMe" +#define IDC_GameOptions L"GameOptions" +#define IDC_InGameHostOptions L"InGameHostOptions" diff --git a/Minecraft.Client/Common/Media/xuiscene_ingame_host_options.xui b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options.xui new file mode 100644 index 00000000..af2b53ca --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options.xui @@ -0,0 +1,69 @@ + + +1280.000000 +720.000000 + + + +InGameHostOptions +454.666687 +196.000000 +412.666718,262.000031,0.000000 +CScene_InGameHostOptions +XuiScene +GameOptions\CheckboxFireSpreads + + + +GameOptions +450.000000 +173.000000 +0.000000,18.000000,0.000000 +2 +XuiBlankScene + + + +CheckboxTNT +402.000000 +34.000000 +22.000000,34.000000,0.000000 +2 +XuiCheckbox +CheckboxFireSpreads +ButtonTeleportToPlayer + + + + +CheckboxFireSpreads +402.000000 +34.000000 +22.000000,0.000000,0.000000 +2 +XuiCheckbox +CheckboxTNT + + + + +ButtonTeleportToPlayer +412.000000 +40.000000 +22.000000,72.999985,0.000000 +CheckboxTNT +ButtonTeleportPlayerToMe + + + + +ButtonTeleportPlayerToMe +412.000000 +40.000000 +22.000000,119.999985,0.000000 +ButtonTeleportToPlayer + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_480.h b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_480.h new file mode 100644 index 00000000..330eac41 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_480.h @@ -0,0 +1,6 @@ +#define IDC_CheckboxTNT L"CheckboxTNT" +#define IDC_CheckboxFireSpreads L"CheckboxFireSpreads" +#define IDC_ButtonTeleportToPlayer L"ButtonTeleportToPlayer" +#define IDC_ButtonTeleportPlayerToMe L"ButtonTeleportPlayerToMe" +#define IDC_GameOptions L"GameOptions" +#define IDC_InGameHostOptions L"InGameHostOptions" diff --git a/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_480.xui b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_480.xui new file mode 100644 index 00000000..df6888f3 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_480.xui @@ -0,0 +1,71 @@ + + +640.000000 +480.000000 + + + +InGameHostOptions +462.444458 +189.444443 +88.777794,145.277802,0.000000 +CScene_InGameHostOptions +XuiScene +GameOptions\CheckboxFireSpreads + + + +GameOptions +450.000000 +170.999985 +0.000000,18.000000,0.000000 +2 +XuiBlankScene + + + +CheckboxTNT +402.000000 +34.000000 +22.000000,34.000000,0.000000 +2 +XuiCheckbox +CheckboxFireSpreads +ButtonTeleportToPlayer + + + + +CheckboxFireSpreads +402.000000 +34.000000 +22.000000,0.000000,0.000000 +2 +XuiCheckbox +CheckboxTNT + + + + +ButtonTeleportToPlayer +410.000000 +36.000000 +26.000004,72.000015,0.000000 +XuiMainMenuButton_L_Thin +CheckboxTNT +ButtonTeleportPlayerToMe + + + + +ButtonTeleportPlayerToMe +410.000000 +36.000000 +26.000004,116.000015,0.000000 +XuiMainMenuButton_L_Thin +ButtonTeleportToPlayer + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_small.h b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_small.h new file mode 100644 index 00000000..330eac41 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_small.h @@ -0,0 +1,6 @@ +#define IDC_CheckboxTNT L"CheckboxTNT" +#define IDC_CheckboxFireSpreads L"CheckboxFireSpreads" +#define IDC_ButtonTeleportToPlayer L"ButtonTeleportToPlayer" +#define IDC_ButtonTeleportPlayerToMe L"ButtonTeleportPlayerToMe" +#define IDC_GameOptions L"GameOptions" +#define IDC_InGameHostOptions L"InGameHostOptions" diff --git a/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_small.xui b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_small.xui new file mode 100644 index 00000000..0b759663 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_host_options_small.xui @@ -0,0 +1,71 @@ + + +640.000000 +360.000000 + + + +InGameHostOptions +462.444458 +189.444443 +88.777809,85.277794,0.000000 +CScene_InGameHostOptions +XuiScene +GameOptions\CheckboxFireSpreads + + + +GameOptions +450.000000 +170.999985 +0.000000,18.000000,0.000000 +2 +XuiBlankScene + + + +CheckboxTNT +402.000000 +34.000000 +22.000000,34.000000,0.000000 +2 +XuiCheckbox +CheckboxFireSpreads +ButtonTeleportToPlayer + + + + +CheckboxFireSpreads +402.000000 +34.000000 +22.000000,0.000000,0.000000 +2 +XuiCheckbox +CheckboxTNT + + + + +ButtonTeleportToPlayer +410.000000 +36.000000 +26.000004,72.000015,0.000000 +XuiMainMenuButton_L_Thin +CheckboxTNT +ButtonTeleportPlayerToMe + + + + +ButtonTeleportPlayerToMe +410.000000 +36.000000 +26.000004,116.000015,0.000000 +XuiMainMenuButton_L_Thin +ButtonTeleportToPlayer + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_ingame_player_options.h b/Minecraft.Client/Common/Media/xuiscene_ingame_player_options.h new file mode 100644 index 00000000..c089b51d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_player_options.h @@ -0,0 +1,14 @@ +#define IDC_CheckboxHostInvisible L"CheckboxHostInvisible" +#define IDC_CheckboxHostHunger L"CheckboxHostHunger" +#define IDC_CheckboxHostFly L"CheckboxHostFly" +#define IDC_ButtonKick L"ButtonKick" +#define IDC_CheckboxTeleport L"CheckboxTeleport" +#define IDC_CheckboxOp L"CheckboxOp" +#define IDC_CheckboxAttackAnimals L"CheckboxAttackAnimals" +#define IDC_CheckboxAttackPlayers L"CheckboxAttackPlayers" +#define IDC_CheckboxUseContainers L"CheckboxUseContainers" +#define IDC_CheckboxUseDoorsAndSwitches L"CheckboxUseDoorsAndSwitches" +#define IDC_CheckboxBuildAndMine L"CheckboxBuildAndMine" +#define IDC_Gamertag L"Gamertag" +#define IDC_Icon L"Icon" +#define IDC_InGamePlayerOptions L"InGamePlayerOptions" diff --git a/Minecraft.Client/Common/Media/xuiscene_ingame_player_options.xui b/Minecraft.Client/Common/Media/xuiscene_ingame_player_options.xui new file mode 100644 index 00000000..64d90886 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_player_options.xui @@ -0,0 +1,163 @@ + + +1280.000000 +720.000000 + + + +InGamePlayerOptions +450.000000 +470.000000 +414.000000,125.000000,0.000000 +CScene_InGamePlayerOptions +XuiScene +CheckboxBuildAndMine + + + +CheckboxHostInvisible +402.000000 +34.000000 +20.000000,362.000000,0.000000 +2 +XuiCheckbox +CheckboxHostHunger +ButtonKick + + + + +CheckboxHostHunger +402.000000 +34.000000 +20.000000,328.000000,0.000000 +2 +XuiCheckbox +CheckboxHostFly +CheckboxHostInvisible + + + + +CheckboxHostFly +402.000000 +34.000000 +20.000000,294.000000,0.000000 +2 +XuiCheckbox +CheckboxTeleport +CheckboxHostHunger + + + + +ButtonKick +412.000000 +40.000000 +20.000013,410.000000,0.000000 +CheckboxHostInvisible + + + + +CheckboxTeleport +402.000000 +34.000000 +20.000000,258.000000,0.000000 +2 +XuiCheckbox +CheckboxOp +CheckboxHostFly + + + + +CheckboxOp +402.000000 +34.000000 +20.000000,224.000000,0.000000 +2 +XuiCheckbox +CheckboxAttackAnimals +CheckboxTeleport + + + + +CheckboxAttackAnimals +402.000000 +34.000000 +20.000000,190.000000,0.000000 +2 +XuiCheckbox +CheckboxAttackPlayers +CheckboxOp + + + + +CheckboxAttackPlayers +402.000000 +34.000000 +20.000000,156.000000,0.000000 +2 +XuiCheckbox +CheckboxUseContainers +CheckboxAttackAnimals + + + + +CheckboxUseContainers +402.000000 +34.000000 +20.000000,122.000000,0.000000 +2 +XuiCheckbox +CheckboxUseDoorsAndSwitches +CheckboxAttackPlayers + + + + +CheckboxUseDoorsAndSwitches +402.000000 +34.000000 +20.000000,88.000000,0.000000 +2 +XuiCheckbox +CheckboxBuildAndMine +CheckboxUseContainers + + + + +CheckboxBuildAndMine +402.000000 +34.000000 +20.000000,54.000000,0.000000 +2 +XuiCheckbox +CheckboxUseDoorsAndSwitches + + + + +Gamertag +362.000000 +40.000000 +56.000000,14.000000,0.000000 +XuiLabelDarkLeftWrap + + + + +Icon +40.000000 +40.000000 +16.000000,14.000000,0.000000 +PlayerColourIcon + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_ingame_player_options_480.h b/Minecraft.Client/Common/Media/xuiscene_ingame_player_options_480.h new file mode 100644 index 00000000..c089b51d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_player_options_480.h @@ -0,0 +1,14 @@ +#define IDC_CheckboxHostInvisible L"CheckboxHostInvisible" +#define IDC_CheckboxHostHunger L"CheckboxHostHunger" +#define IDC_CheckboxHostFly L"CheckboxHostFly" +#define IDC_ButtonKick L"ButtonKick" +#define IDC_CheckboxTeleport L"CheckboxTeleport" +#define IDC_CheckboxOp L"CheckboxOp" +#define IDC_CheckboxAttackAnimals L"CheckboxAttackAnimals" +#define IDC_CheckboxAttackPlayers L"CheckboxAttackPlayers" +#define IDC_CheckboxUseContainers L"CheckboxUseContainers" +#define IDC_CheckboxUseDoorsAndSwitches L"CheckboxUseDoorsAndSwitches" +#define IDC_CheckboxBuildAndMine L"CheckboxBuildAndMine" +#define IDC_Gamertag L"Gamertag" +#define IDC_Icon L"Icon" +#define IDC_InGamePlayerOptions L"InGamePlayerOptions" diff --git a/Minecraft.Client/Common/Media/xuiscene_ingame_player_options_480.xui b/Minecraft.Client/Common/Media/xuiscene_ingame_player_options_480.xui new file mode 100644 index 00000000..ba91445f --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_player_options_480.xui @@ -0,0 +1,164 @@ + + +640.000000 +480.000000 + + + +InGamePlayerOptions +450.000000 +335.000000 +95.000061,72.500015,0.000000 +CScene_InGamePlayerOptions +GraphicPanel +CheckboxBuildAndMine + + + +CheckboxHostInvisible +402.000000 +22.000000 +20.000000,258.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxHostHunger +ButtonKick + + + + +CheckboxHostHunger +402.000000 +22.000000 +20.000000,236.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxHostFly +CheckboxHostInvisible + + + + +CheckboxHostFly +402.000000 +22.000000 +20.000000,214.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxTeleport +CheckboxHostHunger + + + + +ButtonKick +408.000000 +36.000000 +20.000013,284.000000,0.000000 +XuiMainMenuButton_L_Thin +CheckboxHostInvisible + + + + +CheckboxTeleport +402.000000 +22.000000 +20.000000,191.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxOp +CheckboxHostFly + + + + +CheckboxOp +402.000000 +22.000000 +20.000000,169.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxAttackAnimals +CheckboxTeleport + + + + +CheckboxAttackAnimals +402.000000 +22.000000 +20.000000,147.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxAttackPlayers +CheckboxOp + + + + +CheckboxAttackPlayers +402.000000 +22.000000 +20.000000,125.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxUseContainers +CheckboxAttackAnimals + + + + +CheckboxUseContainers +402.000000 +22.000000 +20.000000,103.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxUseDoorsAndSwitches +CheckboxAttackPlayers + + + + +CheckboxUseDoorsAndSwitches +402.000000 +22.000000 +20.000000,81.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxBuildAndMine +CheckboxUseContainers + + + + +CheckboxBuildAndMine +402.000000 +22.000000 +20.000000,59.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxUseDoorsAndSwitches + + + + +Gamertag +362.000000 +40.000000 +56.000000,14.000000,0.000000 +XuiLabelDarkLeftWrap + + + + +Icon +40.000000 +40.000000 +16.000000,14.000000,0.000000 +PlayerColourIcon + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_ingame_player_options_small.h b/Minecraft.Client/Common/Media/xuiscene_ingame_player_options_small.h new file mode 100644 index 00000000..c089b51d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_player_options_small.h @@ -0,0 +1,14 @@ +#define IDC_CheckboxHostInvisible L"CheckboxHostInvisible" +#define IDC_CheckboxHostHunger L"CheckboxHostHunger" +#define IDC_CheckboxHostFly L"CheckboxHostFly" +#define IDC_ButtonKick L"ButtonKick" +#define IDC_CheckboxTeleport L"CheckboxTeleport" +#define IDC_CheckboxOp L"CheckboxOp" +#define IDC_CheckboxAttackAnimals L"CheckboxAttackAnimals" +#define IDC_CheckboxAttackPlayers L"CheckboxAttackPlayers" +#define IDC_CheckboxUseContainers L"CheckboxUseContainers" +#define IDC_CheckboxUseDoorsAndSwitches L"CheckboxUseDoorsAndSwitches" +#define IDC_CheckboxBuildAndMine L"CheckboxBuildAndMine" +#define IDC_Gamertag L"Gamertag" +#define IDC_Icon L"Icon" +#define IDC_InGamePlayerOptions L"InGamePlayerOptions" diff --git a/Minecraft.Client/Common/Media/xuiscene_ingame_player_options_small.xui b/Minecraft.Client/Common/Media/xuiscene_ingame_player_options_small.xui new file mode 100644 index 00000000..5c7f270e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingame_player_options_small.xui @@ -0,0 +1,164 @@ + + +640.000000 +360.000000 + + + +InGamePlayerOptions +450.000000 +335.000000 +95.000061,-7.000000,0.000000 +CScene_InGamePlayerOptions +GraphicPanel +CheckboxBuildAndMine + + + +CheckboxHostInvisible +402.000000 +22.000000 +20.000000,258.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxHostHunger +ButtonKick + + + + +CheckboxHostHunger +402.000000 +22.000000 +20.000000,236.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxHostFly +CheckboxHostInvisible + + + + +CheckboxHostFly +402.000000 +22.000000 +20.000000,214.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxTeleport +CheckboxHostHunger + + + + +ButtonKick +410.000000 +36.000000 +20.000000,284.000000,0.000000 +XuiMainMenuButton_L_Thin +CheckboxHostInvisible + + + + +CheckboxTeleport +402.000000 +22.000000 +20.000000,191.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxOp +CheckboxHostFly + + + + +CheckboxOp +402.000000 +22.000000 +20.000000,169.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxAttackAnimals +CheckboxTeleport + + + + +CheckboxAttackAnimals +402.000000 +22.000000 +20.000000,147.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxAttackPlayers +CheckboxOp + + + + +CheckboxAttackPlayers +402.000000 +22.000000 +20.000000,125.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxUseContainers +CheckboxAttackAnimals + + + + +CheckboxUseContainers +402.000000 +22.000000 +20.000000,103.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxUseDoorsAndSwitches +CheckboxAttackPlayers + + + + +CheckboxUseDoorsAndSwitches +402.000000 +22.000000 +20.000000,81.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxBuildAndMine +CheckboxUseContainers + + + + +CheckboxBuildAndMine +402.000000 +22.000000 +20.000000,59.000000,0.000000 +2 +XuiCheckboxSmall +CheckboxUseDoorsAndSwitches + + + + +Gamertag +362.000000 +40.000000 +56.000000,14.000000,0.000000 +XuiLabelDarkLeftWrap + + + + +Icon +40.000000 +40.000000 +16.000000,14.000000,0.000000 +PlayerColourIcon + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_ingameinfo.h b/Minecraft.Client/Common/Media/xuiscene_ingameinfo.h new file mode 100644 index 00000000..82696e20 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingameinfo.h @@ -0,0 +1,7 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_GamePlayers L"GamePlayers" +#define IDC_Title L"Title" +#define IDC_GameOptionsButton L"GameOptionsButton" +#define IDC_InGameInfo L"InGameInfo" diff --git a/Minecraft.Client/Common/Media/xuiscene_ingameinfo.xui b/Minecraft.Client/Common/Media/xuiscene_ingameinfo.xui new file mode 100644 index 00000000..0b33f42d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingameinfo.xui @@ -0,0 +1,78 @@ + + +1280.000000 +720.000000 + + + +InGameInfo +1280.000000 +720.000000 +CScene_InGameInfo +XuiBlankScene +GamePlayers + + + +GamePlayers +500.000000 +336.000000 +390.000000,192.000046,0.000000 +CXuiCtrlPassThroughList +XuiPlayerList +GameOptionsButton + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +false +XuiPlayerListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +false +XuiPlayerListButton_L + + + + + +Title +400.000000 +412.000000,202.000046,0.000000 +XuiLabelDarkLeftWrap18 + + + + +GameOptionsButton +500.000000 +60.000000 +390.000000,122.000000,0.000000 +XuiMainMenuButton_L +GamePlayers + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_ingameinfo_480.h b/Minecraft.Client/Common/Media/xuiscene_ingameinfo_480.h new file mode 100644 index 00000000..82696e20 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingameinfo_480.h @@ -0,0 +1,7 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_GamePlayers L"GamePlayers" +#define IDC_Title L"Title" +#define IDC_GameOptionsButton L"GameOptionsButton" +#define IDC_InGameInfo L"InGameInfo" diff --git a/Minecraft.Client/Common/Media/xuiscene_ingameinfo_480.xui b/Minecraft.Client/Common/Media/xuiscene_ingameinfo_480.xui new file mode 100644 index 00000000..57ff7a6b --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingameinfo_480.xui @@ -0,0 +1,79 @@ + + +640.000000 +480.000000 + + + +InGameInfo +640.000000 +480.000000 +CScene_InGameInfo +XuiBlankScene +GameOptionsButton + + + +GamePlayers +340.000000 +272.000000 +150.000031,130.000015,0.000000 +CXuiCtrlPassThroughList +XuiPlayerListSmall +GameOptionsButton + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + + +Title +300.000000 +22.000000 +170.000000,144.000000,0.000000 +XuiLabelDark + + + + +GameOptionsButton +340.000000 +36.000000 +150.000000,89.000000,0.000000 +XuiMainMenuButton_L_Thin +GamePlayers + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_ingameinfo_small.h b/Minecraft.Client/Common/Media/xuiscene_ingameinfo_small.h new file mode 100644 index 00000000..591517fb --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingameinfo_small.h @@ -0,0 +1,8 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_GamePlayers L"GamePlayers" +#define IDC_Title L"Title" +#define IDC_GameOptionsButton L"GameOptionsButton" +#define IDC_InGameInfo L"InGameInfo" diff --git a/Minecraft.Client/Common/Media/xuiscene_ingameinfo_small.xui b/Minecraft.Client/Common/Media/xuiscene_ingameinfo_small.xui new file mode 100644 index 00000000..ac5837e7 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_ingameinfo_small.xui @@ -0,0 +1,90 @@ + + +640.000000 +360.000000 + + + +InGameInfo +640.000000 +360.000000 +CScene_InGameInfo +XuiBlankScene +GameOptionsButton + + + +GamePlayers +400.000000 +236.000000 +120.000023,52.000011,0.000000 +CXuiCtrlPassThroughList +XuiPlayerListSmall +GameOptionsButton + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + + +Title +358.000000 +26.000000 +140.000000,61.999969,0.000000 +XuiLabelDarkLeftWrap16 + + + + +GameOptionsButton +400.000000 +36.000000 +120.000000,11.000000,0.000000 +XuiMainMenuButton_L_Thin +GamePlayers + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_intro.h b/Minecraft.Client/Common/Media/xuiscene_intro.h new file mode 100644 index 00000000..85f35ed0 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_intro.h @@ -0,0 +1,6 @@ +#define IDC_Logo4J L"Logo4J" +#define IDC_LogoMojang L"LogoMojang" +#define IDC_LogoMicrosoft L"LogoMicrosoft" +#define IDC_LogoXLA L"LogoXLA" +#define IDC_LogoESRB L"LogoESRB" +#define IDC_SceneIntro L"SceneIntro" diff --git a/Minecraft.Client/Common/Media/xuiscene_intro.xui b/Minecraft.Client/Common/Media/xuiscene_intro.xui new file mode 100644 index 00000000..d1337cc0 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_intro.xui @@ -0,0 +1,382 @@ + + +1280.000000 +720.000000 + + + +SceneIntro +1280.000000 +720.000000 +CScene_Intro +XuiBlackScene + + + +1280.000000 +960.000000 + + +0xff0f0f80 + + + + +0xffffffff + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,278.000000,0.000000,0,278.000000,0.000000,278.000000,0.000000,278.000000,174.000000,0,278.000000,174.000000,278.000000,174.000000,0.000000,174.000000,0,0.000000,174.000000,0.000000,174.000000,0.000000,0.000000,0, + + + + +Logo4J +1280.000000 +720.000000 +0.000000 +false +Graphics\Logos\4JStudios_logo.png +48 + + + + +LogoMojang +1280.000000 +720.000000 +0.000000 +false +true +Graphics\Logos\mojang.png +48 + + + + +LogoMicrosoft +1280.000000 +720.000000 +0.000000 +false +true +Graphics\Logos\MS_Studios_MC.png +48 + + + + +LogoXLA +1280.000000 +720.000000 +0.000000 +true +Graphics\Logos\XBLA_MC.png +48 + + + + +LogoESRB +1280.000000 +720.000000 +0.000000 +false +Graphics\Logos\ESRB_10_Large.png + + + + + +Normal + + + +EndNormal + +stop + + +ESRBFade + + + +ESRBFadeEnd + +stop + + +StartFade + + + +EndFade + +stop + + + +LogoMojang +Opacity +Show + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +LogoMicrosoft +Opacity +Show + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +LogoXLA +Opacity +Show + + +0 +0.000000 +true + + + +0 +0.000000 +true + + + +0 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +Logo4J +Opacity +Show + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +false + + + +LogoESRB +Opacity +Show + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +false + + + + + + + +StartFade + + + +EndFade + +stop + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_intro_480.h b/Minecraft.Client/Common/Media/xuiscene_intro_480.h new file mode 100644 index 00000000..85f35ed0 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_intro_480.h @@ -0,0 +1,6 @@ +#define IDC_Logo4J L"Logo4J" +#define IDC_LogoMojang L"LogoMojang" +#define IDC_LogoMicrosoft L"LogoMicrosoft" +#define IDC_LogoXLA L"LogoXLA" +#define IDC_LogoESRB L"LogoESRB" +#define IDC_SceneIntro L"SceneIntro" diff --git a/Minecraft.Client/Common/Media/xuiscene_intro_480.xui b/Minecraft.Client/Common/Media/xuiscene_intro_480.xui new file mode 100644 index 00000000..535c9319 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_intro_480.xui @@ -0,0 +1,389 @@ + + +640.000000 +480.000000 + + + +SceneIntro +640.000000 +480.000000 +CScene_Intro +XuiBlankScene + + + +640.000000 +480.000000 + + +0xff0f0f80 + + + + +0xffffffff + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,278.000000,0.000000,0,278.000000,0.000000,278.000000,0.000000,278.000000,174.000000,0,278.000000,174.000000,278.000000,174.000000,0.000000,174.000000,0,0.000000,174.000000,0.000000,174.000000,0.000000,0.000000,0, + + + + +Logo4J +640.000000 +480.000000 +0.000000 +false +16 +Graphics\Logos\4JStudios_logo.png +48 + + + + +LogoMojang +640.000000 +480.000000 +0.000000 +false +true +16 +Graphics\Logos\mojang.png +48 + + + + +LogoMicrosoft +640.000000 +480.000000 +0.000000 +false +true +16 +Graphics\Logos\MS_Studios_MC.png +48 + + + + +LogoXLA +640.000000 +480.000000 +0.000000 +true +16 +Graphics\Logos\XBLA_MC.png +48 + + + + +LogoESRB +1280.000000 +720.000000 +-89.599922,8.600021,0.000000 +0.640000,0.640000,1.000000 +0.000000 +false +16 +Graphics\Logos\ESRB_10_Large.png + + + + + +Normal + + + +EndNormal + +stop + + +ESRBFade + + + +ESRBFadeEnd + +stop + + +StartFade + + + +EndFade + +stop + + + +LogoMojang +Opacity +Show + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +LogoMicrosoft +Opacity +Show + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +LogoXLA +Opacity +Show + + +0 +0.000000 +true + + + +0 +0.000000 +true + + + +0 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +Logo4J +Opacity +Show + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +false + + + +LogoESRB +Opacity +Show + + +0 +0.000000 +false + + + +0 +0.000000 +false + + + +0 +0.000000 +true + + + +0 +1.000000 +true + + + +0 +1.000000 +true + + + +0 +0.000000 +false + + + + + + + +StartFade + + + +EndFade + +stop + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_inventory.h b/Minecraft.Client/Common/Media/xuiscene_inventory.h new file mode 100644 index 00000000..9e10ad3e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_inventory.h @@ -0,0 +1,99 @@ +#define IDC_Effect10 L"Effect10" +#define IDC_Effect9 L"Effect9" +#define IDC_Effect8 L"Effect8" +#define IDC_Effect7 L"Effect7" +#define IDC_Effect6 L"Effect6" +#define IDC_Effect5 L"Effect5" +#define IDC_Effect4 L"Effect4" +#define IDC_Effect3 L"Effect3" +#define IDC_Effect2 L"Effect2" +#define IDC_Effect1 L"Effect1" +#define IDC_EffectsGroup L"EffectsGroup" +#define IDC_ArmourBackground L"ArmourBackground" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Armor L"Armor" +#define IDC_Character L"Character" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryText L"InventoryText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneInventory L"XuiSceneInventory" diff --git a/Minecraft.Client/Common/Media/xuiscene_inventory.xui b/Minecraft.Client/Common/Media/xuiscene_inventory.xui new file mode 100644 index 00000000..1b3ae9d4 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_inventory.xui @@ -0,0 +1,1431 @@ + + +1280.000000 +720.000000 + + + +XuiSceneInventory +1280.000000 +720.000000 +CXuiSceneInventory +XuiBlankScene +Pointer + + + +EffectsGroup +260.000000 +435.000000 +859.999878,94.000000,0.000000 + + + +Effect10 +260.000000 +58.000000 +0.000000,5.000000,0.000000 +CXuiCtrlMobEffect +MobEffect + + + + +Effect9 +260.000000 +58.000000 +0.000000,5.000000,0.000000 +CXuiCtrlMobEffect +MobEffect + + + + +Effect8 +260.000000 +58.000000 +0.000000,5.000000,0.000000 +CXuiCtrlMobEffect +MobEffect + + + + +Effect7 +260.000000 +58.000000 +0.000000,5.000000,0.000000 +CXuiCtrlMobEffect +MobEffect + + + + +Effect6 +260.000000 +58.000000 +0.000000,67.000000,0.000000 +CXuiCtrlMobEffect +MobEffect + + + + +Effect5 +260.000000 +58.000000 +0.000000,129.000000,0.000000 +CXuiCtrlMobEffect +MobEffect + + + + +Effect4 +260.000000 +58.000000 +0.000000,191.000000,0.000000 +CXuiCtrlMobEffect +MobEffect + + + + +Effect3 +260.000000 +58.000000 +0.000000,253.000000,0.000000 +CXuiCtrlMobEffect +MobEffect + + + + +Effect2 +260.000000 +58.000000 +0.000000,315.000000,0.000000 +CXuiCtrlMobEffect +MobEffect + + + + +Effect1 +260.000000 +58.000000 +0.000000,377.000000,0.000000 +CXuiCtrlMobEffect +MobEffect + + + + + +Group +431.000000 +435.000000 +424.000000,94.000000,0.000000 +15 +XuiScene +Pointer + + + +ArmourBackground +42.000000 +168.000000 +125.000000,26.000000,0.000000 +InventoryArmourBackground + + + + +Armor +71.000000 +172.000000 +125.000023,26.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridArmour + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour +..\Images\img1.png +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour +..\Images\img1.png +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour +..\Images\img1.png +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour +..\Images\img1.png +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour +..\Images\img1.png +22594 +4 + + + + + +Character +126.000000 +168.000000 +180.000000,26.000000,0.000000 +3 +CharacterPanel +..\Images\img1.png + + + + +Inventory +382.000000 +150.000000 +25.000000,230.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +UseRow +381.000000 +50.000000 +25.000000,370.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +InventoryText +375.000000 +32.000000 +25.000000,200.000000,0.000000 +LabelContainerSceneLeft + + + + +Pointer +42.000000 +42.000000 +-185.000000,-84.000015,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointer + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +424.000000,94.000000,0.000000 + + + +0 +424.000000,94.000000,0.000000 + + + +2 +100 +-100 +50 +424.000000,94.000000,0.000000 + + + +0 +160.000000,94.000000,0.000000 + + + +2 +100 +-100 +50 +160.000000,94.000000,0.000000 + + + +0 +424.000000,94.000000,0.000000 + + + +EffectsGroup +Opacity + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +1.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_inventory_480.h b/Minecraft.Client/Common/Media/xuiscene_inventory_480.h new file mode 100644 index 00000000..554e120d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_inventory_480.h @@ -0,0 +1,137 @@ +#define IDC_Effect10 L"Effect10" +#define IDC_Effect9 L"Effect9" +#define IDC_Effect8 L"Effect8" +#define IDC_Effect7 L"Effect7" +#define IDC_Effect6 L"Effect6" +#define IDC_Effect5 L"Effect5" +#define IDC_Effect4 L"Effect4" +#define IDC_Effect3 L"Effect3" +#define IDC_Effect2 L"Effect2" +#define IDC_Effect1 L"Effect1" +#define IDC_EffectsGroup L"EffectsGroup" +#define IDC_ArmourBackground L"ArmourBackground" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Armor L"Armor" +#define IDC_Character L"Character" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryText L"InventoryText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneInventory L"XuiSceneInventory" diff --git a/Minecraft.Client/Common/Media/xuiscene_inventory_480.xui b/Minecraft.Client/Common/Media/xuiscene_inventory_480.xui new file mode 100644 index 00000000..3e2235e4 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_inventory_480.xui @@ -0,0 +1,1856 @@ + + +640.000000 +480.000000 + + + +XuiSceneInventory +640.000000 +480.000000 +CXuiSceneInventory +XuiBlankScene +Pointer + + + +EffectsGroup +160.000000 +280.000000 +454.999878,105.000000,0.000000 + + + +Effect10 +160.000000 +36.000000 +0.000000,4.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect9 +160.000000 +36.000000 +0.000000,4.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect8 +160.000000 +36.000000 +0.000000,4.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect7 +160.000000 +36.000000 +0.000000,4.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect6 +160.000000 +36.000000 +0.000000,44.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect5 +160.000000 +36.000000 +0.000000,84.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect4 +160.000000 +36.000000 +0.000000,124.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect3 +160.000000 +36.000000 +0.000000,164.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect2 +160.000000 +36.000000 +0.000000,204.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect1 +160.000000 +36.000000 +0.000000,244.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + + +Group +260.000000 +290.000000 +190.000015,96.000000,0.000000 +15 +GraphicPanel +Pointer + + + +ArmourBackground +26.000000 +104.000000 +74.000000,18.000000,0.000000 +InventoryArmourBackgroundSmall + + + + +Armor +26.000000 +104.000000 +74.000000,18.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridArmour26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour +..\Images\img1.png +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour26 +..\Images\img1.png +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour26 +..\Images\img1.png +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour26 +..\Images\img1.png +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour26 +..\Images\img1.png +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour26 +..\Images\img1.png +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour26 +..\Images\img1.png +22594 +4 + + + + + +Character +78.000000 +104.000000 +108.000000,18.000000,0.000000 +3 +CharacterPanel +..\Images\img1.png + + + + +Inventory +234.000000 +80.000000 +12.000000,160.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +235.000000 +12.000000,250.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +InventoryText +230.000000 +22.000000 +12.000000,139.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +Pointer +26.000000 +26.000000 +-50.000000,-50.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000015,96.000000,0.000000 + + + +0 +190.000000,96.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,96.000000,0.000000 + + + +0 +32.000000,96.000000,0.000000 + + + +2 +100 +-100 +50 +32.000000,96.000000,0.000000 + + + +0 +190.000000,96.000000,0.000000 + + + +EffectsGroup +Opacity + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +1.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_inventory_creative.h b/Minecraft.Client/Common/Media/xuiscene_inventory_creative.h new file mode 100644 index 00000000..12dfbaf8 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_inventory_creative.h @@ -0,0 +1,518 @@ +#define IDC_MainPanel L"MainPanel" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Container L"Container" +#define IDC_TabImage1 L"TabImage1" +#define IDC_TabImage2 L"TabImage2" +#define IDC_TabImage3 L"TabImage3" +#define IDC_TabImage4 L"TabImage4" +#define IDC_TabImage5 L"TabImage5" +#define IDC_TabImage6 L"TabImage6" +#define IDC_TabImage7 L"TabImage7" +#define IDC_TabImage8 L"TabImage8" +#define IDC_Group_Tab_Images L"Group_Tab_Images" +#define IDC_Icon_1 L"Icon_1" +#define IDC_Icon_2 L"Icon_2" +#define IDC_Icon_3 L"Icon_3" +#define IDC_Icon_4 L"Icon_4" +#define IDC_Icon_5 L"Icon_5" +#define IDC_Icon_6 L"Icon_6" +#define IDC_Icon_7 L"Icon_7" +#define IDC_Icon_8 L"Icon_8" +#define IDC_Group_Tab_Icons L"Group_Tab_Icons" +#define IDC_InventoryText L"InventoryText" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_ScrollUp L"ScrollUp" +#define IDC_ScrollDown L"ScrollDown" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneInventory L"XuiSceneInventory" diff --git a/Minecraft.Client/Common/Media/xuiscene_inventory_creative.xui b/Minecraft.Client/Common/Media/xuiscene_inventory_creative.xui new file mode 100644 index 00000000..0163464d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_inventory_creative.xui @@ -0,0 +1,7197 @@ + + +1280.000000 +720.000000 + + + +XuiSceneInventory +1280.000000 +720.000000 +CXuiSceneInventoryCreative +XuiBlankScene +Pointer + + + +Group +643.000000 +490.000000 +319.000000,115.000000,0.000000 +15 +XuiBlankScene +Pointer + + + +MainPanel +643.000000 +490.000000 +CreativeInventory + + + + +UseRow +486.000000 +54.000000 +52.000000,411.000000,0.000000 +CXuiCtrlSlotList +ItemGridVertical54 + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + + +Container +542.000000 +270.000000 +24.000000,121.000000,0.000000 +CXuiCtrlSlotList +ItemGridVertical54 + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +54.000000 +54.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton54 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + + +Group_Tab_Images +1280.000000 +200.000000 +-319.300049,-48.999992,0.000000 + + + +TabImage1 +83.000000 +78.000000 +319.000000,46.000000,0.000000 +CreativeInventoryTabLeft + + + + +TabImage2 +83.000000 +78.000000 +399.000000,46.000000,0.000000 +CreativeInventoryTabMiddle + + + + +TabImage3 +83.000000 +78.000000 +479.000000,46.000000,0.000000 +CreativeInventoryTabMiddle + + + + +TabImage4 +83.000000 +78.000000 +559.000000,46.000000,0.000000 +CreativeInventoryTabMiddle + + + + +TabImage5 +83.000000 +78.000000 +639.000000,46.000000,0.000000 +CreativeInventoryTabMiddle + + + + +TabImage6 +83.000000 +78.000000 +719.000000,46.000000,0.000000 +CreativeInventoryTabMiddle + + + + +TabImage7 +83.000000 +78.000000 +799.000000,46.000000,0.000000 +CreativeInventoryTabMiddle + + + + +TabImage8 +83.000000 +78.000000 +879.000000,46.000000,0.000000 +CreativeInventoryTabRight + + + + + +Group_Tab_Icons +1280.000000 +200.000000 +-320.000000,-92.000000,0.000000 + + + +Icon_1 +48.000000 +48.000000 +337.000000,108.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_2 +48.000000 +48.000000 +417.000000,108.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_3 +48.000000 +48.000000 +497.000000,108.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_4 +48.000000 +48.000000 +577.000000,108.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_5 +48.000000 +48.000000 +657.000000,108.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_6 +48.000000 +48.000000 +737.000000,108.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_7 +48.000000 +48.000000 +817.000000,108.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_8 +48.000000 +48.000000 +897.000000,108.000000,0.000000 +false +CraftingCategoryIcon + + + + + +InventoryText +540.000000 +32.000000 +51.000000,85.000000,0.000000 +false +XuiLabelDarkCentred + + + + +XuiSlider +34.000000 +270.000000 +582.000000,120.000000,0.000000 +true +XuiSliderVertical +true + + + + +ScrollUp +32.000000 +22.000000 +583.000000,100.000000,0.000000 +XuiScrollEndUp + + + + +ScrollDown +32.000000 +22.000000 +583.000000,391.000000,0.000000 +XuiScrollEnd + + + + +Pointer +42.000000 +42.000000 +-504.000000,86.059990,0.000000 +false +CXuiCtrlSlotItem +ItemPointer + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +319.000000,115.000000,0.000000 + + + +0 +319.000000,115.000000,0.000000 + + + +2 +100 +-100 +50 +319.000000,115.000000,0.000000 + + + +0 +100.000000,115.000000,0.000000 + + + +2 +100 +-100 +50 +100.000000,115.000000,0.000000 + + + +0 +319.000000,115.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_inventory_creative_480.h b/Minecraft.Client/Common/Media/xuiscene_inventory_creative_480.h new file mode 100644 index 00000000..56abd8ce --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_inventory_creative_480.h @@ -0,0 +1,508 @@ +#define IDC_MainPanel L"MainPanel" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Container L"Container" +#define IDC_TabImage1 L"TabImage1" +#define IDC_TabImage2 L"TabImage2" +#define IDC_TabImage3 L"TabImage3" +#define IDC_TabImage4 L"TabImage4" +#define IDC_TabImage5 L"TabImage5" +#define IDC_TabImage6 L"TabImage6" +#define IDC_TabImage7 L"TabImage7" +#define IDC_TabImage8 L"TabImage8" +#define IDC_Group_Tab_Images L"Group_Tab_Images" +#define IDC_Icon_1 L"Icon_1" +#define IDC_Icon_2 L"Icon_2" +#define IDC_Icon_3 L"Icon_3" +#define IDC_Icon_4 L"Icon_4" +#define IDC_Icon_5 L"Icon_5" +#define IDC_Icon_6 L"Icon_6" +#define IDC_Icon_7 L"Icon_7" +#define IDC_Icon_8 L"Icon_8" +#define IDC_Group_Tab_Icons L"Group_Tab_Icons" +#define IDC_InventoryText L"InventoryText" +#define IDC_ScrollDown L"ScrollDown" +#define IDC_ScrollUp L"ScrollUp" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneCreativeInventory L"XuiSceneCreativeInventory" diff --git a/Minecraft.Client/Common/Media/xuiscene_inventory_creative_480.xui b/Minecraft.Client/Common/Media/xuiscene_inventory_creative_480.xui new file mode 100644 index 00000000..cb6b1561 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_inventory_creative_480.xui @@ -0,0 +1,7020 @@ + + +640.000000 +480.000000 + + + +XuiSceneCreativeInventory +640.000000 +480.000000 +CXuiSceneInventoryCreative +XuiBlankScene +Pointer + + + +Group +418.000000 +294.000000 +111.000000,80.000000,0.000000 +15 +XuiBlankScene +Pointer + + + +MainPanel +418.000000 +294.000000 +CreativeInventorySmall + + + + +UseRow +292.000000 +32.000000 +47.000000,246.000000,0.000000 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + + +Container +322.000000 +162.000000 +32.000008,75.000015,0.000000 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + + +Group_Tab_Images +412.000000 +60.000000 +3.999992,-5.999985,0.000000 + + + +TabImage1 +54.000000 +56.000000 +-4.000000,4.000000,0.000000 +CreativeInventoryTabLeftSmall + + + + +TabImage2 +54.000000 +56.000000 +48.000000,4.000000,0.000000 +CreativeInventoryTabMiddleSmall + + + + +TabImage3 +54.000000 +56.000000 +100.000000,4.000000,0.000000 +CreativeInventoryTabMiddleSmall + + + + +TabImage4 +54.000000 +56.000000 +152.000000,4.000000,0.000000 +CreativeInventoryTabMiddleSmall + + + + +TabImage5 +54.000000 +56.000000 +204.000000,4.000000,0.000000 +CreativeInventoryTabMiddleSmall + + + + +TabImage6 +54.000000 +56.000000 +256.000000,4.000000,0.000000 +CreativeInventoryTabMiddleSmall + + + + +TabImage7 +54.000000 +56.000000 +308.000000,4.000000,0.000000 +CreativeInventoryTabMiddleSmall + + + + +TabImage8 +54.000000 +56.000000 +360.000000,4.000000,0.000000 +CreativeInventoryTabRightSmall + + + + + +Group_Tab_Icons +412.000000 +60.000000 +3.999992,-5.999985,0.000000 + + + +Icon_1 +32.000000 +32.000000 +8.000000,18.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_2 +32.000000 +32.000000 +60.000000,18.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_3 +32.000000 +32.000000 +112.000000,18.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_4 +32.000000 +32.000000 +164.000000,18.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_5 +32.000000 +32.000000 +216.000000,18.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_6 +32.000000 +32.000000 +268.000000,18.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_7 +32.000000 +32.000000 +320.000000,18.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_8 +32.000000 +32.000000 +372.000000,18.000000,0.000000 +false +CraftingCategoryIcon + + + + + +InventoryText +360.000000 +22.000000 +29.000000,55.000000,0.000000 +false +XuiLabelDarkCentredSmall + + + + +ScrollDown +32.000000 +22.000000 +368.000000,238.000000,0.000000 +XuiScrollEnd + + + + +ScrollUp +32.000000 +22.000000 +368.000000,56.000000,0.000000 +XuiScrollEndUp + + + + +XuiSlider +32.000000 +162.000000 +368.000000,76.000000,0.000000 +XuiSliderVerticalSmall +true + + + + +Pointer +26.000000 +26.000000 +-161.000000,60.000015,0.000000 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +111.000000,80.000000,0.000000 + + + +0 +111.000000,80.000000,0.000000 + + + +2 +100 +-100 +50 +111.000000,80.000000,0.000000 + + + +0 +31.000000,80.000000,0.000000 + + + +2 +100 +-100 +50 +31.000000,80.000000,0.000000 + + + +0 +111.000000,80.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_inventory_creative_small.h b/Minecraft.Client/Common/Media/xuiscene_inventory_creative_small.h new file mode 100644 index 00000000..d20c8788 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_inventory_creative_small.h @@ -0,0 +1,447 @@ +#define IDC_MainPanel L"MainPanel" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Container L"Container" +#define IDC_TabImage1 L"TabImage1" +#define IDC_TabImage2 L"TabImage2" +#define IDC_TabImage3 L"TabImage3" +#define IDC_TabImage4 L"TabImage4" +#define IDC_TabImage5 L"TabImage5" +#define IDC_TabImage6 L"TabImage6" +#define IDC_TabImage7 L"TabImage7" +#define IDC_TabImage8 L"TabImage8" +#define IDC_Group_Tab_Images L"Group_Tab_Images" +#define IDC_Icon_1 L"Icon_1" +#define IDC_Icon_2 L"Icon_2" +#define IDC_Icon_3 L"Icon_3" +#define IDC_Icon_4 L"Icon_4" +#define IDC_Icon_5 L"Icon_5" +#define IDC_Icon_6 L"Icon_6" +#define IDC_Icon_7 L"Icon_7" +#define IDC_Icon_8 L"Icon_8" +#define IDC_Group_Tab_Icons L"Group_Tab_Icons" +#define IDC_InventoryText L"InventoryText" +#define IDC_ScrollDown L"ScrollDown" +#define IDC_ScrollUp L"ScrollUp" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneCreativeInventory L"XuiSceneCreativeInventory" diff --git a/Minecraft.Client/Common/Media/xuiscene_inventory_creative_small.xui b/Minecraft.Client/Common/Media/xuiscene_inventory_creative_small.xui new file mode 100644 index 00000000..f673a6bc --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_inventory_creative_small.xui @@ -0,0 +1,6166 @@ + + +640.000000 +360.000000 + + + +XuiSceneCreativeInventory +640.000000 +360.000000 +CXuiSceneInventoryCreative +XuiBlankScene +Pointer + + + +Group +418.000000 +294.000000 +111.000000,0.000000,0.000000 +15 +XuiBlankScene +Pointer + + + +MainPanel +418.000000 +294.000000 +CreativeInventorySmall + + + + +UseRow +292.000000 +32.000000 +47.000000,247.000000,0.000000 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + +Container +322.000000 +162.000000 +32.000008,76.000000,0.000000 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + +Group_Tab_Images +412.000000 +60.000000 +3.999992,-5.999998,0.000000 + + + +TabImage1 +54.000000 +56.000000 +-4.000000,4.000000,0.000000 +CreativeInventoryTabLeftSmall + + + + +TabImage2 +54.000000 +56.000000 +48.000000,4.000000,0.000000 +CreativeInventoryTabMiddleSmall + + + + +TabImage3 +54.000000 +56.000000 +100.000000,4.000000,0.000000 +CreativeInventoryTabMiddleSmall + + + + +TabImage4 +54.000000 +56.000000 +152.000000,4.000000,0.000000 +CreativeInventoryTabMiddleSmall + + + + +TabImage5 +54.000000 +56.000000 +204.000000,4.000000,0.000000 +CreativeInventoryTabMiddleSmall + + + + +TabImage6 +54.000000 +56.000000 +256.000000,4.000000,0.000000 +CreativeInventoryTabMiddleSmall + + + + +TabImage7 +54.000000 +56.000000 +308.000000,4.000000,0.000000 +CreativeInventoryTabMiddleSmall + + + + +TabImage8 +54.000000 +56.000000 +360.000000,4.000000,0.000000 +CreativeInventoryTabRightSmall + + + + + +Group_Tab_Icons +412.000000 +60.000000 +3.999992,-5.999998,0.000000 + + + +Icon_1 +32.000000 +32.000000 +8.000000,20.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_2 +32.000000 +32.000000 +60.000000,20.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_3 +32.000000 +32.000000 +112.000000,20.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_4 +32.000000 +32.000000 +164.000000,20.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_5 +32.000000 +32.000000 +216.000000,20.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_6 +32.000000 +32.000000 +268.000000,20.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_7 +32.000000 +32.000000 +320.000000,20.000000,0.000000 +false +CraftingCategoryIcon + + + + +Icon_8 +32.000000 +32.000000 +372.000000,20.000000,0.000000 +false +CraftingCategoryIcon + + + + + +InventoryText +360.000000 +22.000000 +29.000000,56.000000,0.000000 +false +XuiLabelDarkCentredSmall + + + + +ScrollDown +32.000000 +22.000000 +368.000000,238.000000,0.000000 +XuiScrollEnd + + + + +ScrollUp +32.000000 +22.000000 +368.000000,56.000000,0.000000 +XuiScrollEndUp + + + + +XuiSlider +32.000000 +162.000000 +368.000000,76.000000,0.000000 +XuiSliderVerticalSmall +true + + + + +Pointer +26.000000 +26.000000 +-161.000000,6.000002,0.000000 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +111.000000,0.000000,0.000000 + + + +0 +111.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +111.000000,0.000000,0.000000 + + + +0 +31.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +31.000000,0.000000,0.000000 + + + +0 +111.000000,0.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_inventory_small.h b/Minecraft.Client/Common/Media/xuiscene_inventory_small.h new file mode 100644 index 00000000..fc2f2ba4 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_inventory_small.h @@ -0,0 +1,121 @@ +#define IDC_Effect10 L"Effect10" +#define IDC_Effect9 L"Effect9" +#define IDC_Effect8 L"Effect8" +#define IDC_Effect7 L"Effect7" +#define IDC_Effect6 L"Effect6" +#define IDC_Effect5 L"Effect5" +#define IDC_Effect4 L"Effect4" +#define IDC_Effect3 L"Effect3" +#define IDC_Effect2 L"Effect2" +#define IDC_Effect1 L"Effect1" +#define IDC_EffectsGroup L"EffectsGroup" +#define IDC_ArmourBackground L"ArmourBackground" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Armor L"Armor" +#define IDC_Character L"Character" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryText L"InventoryText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_XuiSceneInventory L"XuiSceneInventory" diff --git a/Minecraft.Client/Common/Media/xuiscene_inventory_small.xui b/Minecraft.Client/Common/Media/xuiscene_inventory_small.xui new file mode 100644 index 00000000..b9883535 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_inventory_small.xui @@ -0,0 +1,1643 @@ + + +640.000000 +360.000000 + + + +XuiSceneInventory +640.000000 +360.000000 +CXuiSceneInventory +XuiBlankScene +Pointer + + + +EffectsGroup +160.000000 +280.000000 +454.999878,0.000000,0.000000 + + + +Effect10 +160.000000 +36.000000 +0.000000,4.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect9 +160.000000 +36.000000 +0.000000,4.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect8 +160.000000 +36.000000 +0.000000,4.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect7 +160.000000 +36.000000 +0.000000,4.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect6 +160.000000 +36.000000 +0.000000,44.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect5 +160.000000 +36.000000 +0.000000,84.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect4 +160.000000 +36.000000 +0.000000,124.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect3 +160.000000 +36.000000 +0.000000,164.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect2 +160.000000 +36.000000 +0.000000,204.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + +Effect1 +160.000000 +36.000000 +0.000000,244.000000,0.000000 +CXuiCtrlMobEffect +MobEffect_Small + + + + + +Group +260.000000 +280.000000 +190.000000,0.000000,0.000000 +15 +GraphicPanel +Pointer + + + +ArmourBackground +26.000000 +104.000000 +74.000000,17.000000,0.000000 +InventoryArmourBackgroundSmall + + + + +Armor +27.377594 +106.259193 +74.000000,17.000000,0.000000 +3 +CXuiCtrlSlotList +ItemGridArmour26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour +..\Images\img1.png +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour26 +..\Images\img1.png +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +26.000000 +26.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour26 +..\Images\img1.png +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour26 +..\Images\img1.png +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour26 +..\Images\img1.png +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButtonArmour26 +..\Images\img1.png +22594 +4 + + + + + +Character +78.000000 +104.000000 +108.000000,17.000000,0.000000 +3 +CharacterPanel +..\Images\img1.png + + + + +Inventory +234.000000 +80.000000 +12.000000,151.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +235.000000 +12.000000,240.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +InventoryText +230.000000 +22.000000 +12.000000,130.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +Pointer +26.000000 +26.000000 +-50.000000,-50.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000000,0.000000,0.000000 + + + +0 +190.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,0.000000,0.000000 + + + +0 +104.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +104.000000,0.000000,0.000000 + + + +0 +190.000000,0.000000,0.000000 + + + +EffectsGroup +Opacity + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +1.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_leaderboards.h b/Minecraft.Client/Common/Media/xuiscene_leaderboards.h new file mode 100644 index 00000000..094878f4 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_leaderboards.h @@ -0,0 +1,17 @@ +#define IDC_Background3 L"Background3" +#define IDC_Background2 L"Background2" +#define IDC_Background1 L"Background1" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_XuiListGamers L"XuiListGamers" +#define IDC_XuiTextFilter L"XuiTextFilter" +#define IDC_XuiTextLeaderboard L"XuiTextLeaderboard" +#define IDC_XuiTextEntries L"XuiTextEntries" +#define IDC_XuiTextInfo L"XuiTextInfo" +#define IDC_LSIcon L"LSIcon" +#define IDC_RBIcon L"RBIcon" +#define IDC_LBIcon L"LBIcon" +#define IDC_SceneLeaderboards L"SceneLeaderboards" diff --git a/Minecraft.Client/Common/Media/xuiscene_leaderboards.xui b/Minecraft.Client/Common/Media/xuiscene_leaderboards.xui new file mode 100644 index 00000000..1bbaa65b --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_leaderboards.xui @@ -0,0 +1,176 @@ + + +1280.000000 +720.000000 + + + +SceneLeaderboards +1280.000000 +720.000000 +CScene_Leaderboards +XuiMenuScene +XuiListGamers + + + +Background3 +320.000000 +36.000000 +846.000000,54.000000,0.000000 +LeaderboardHeaderPanel + + + + +Background2 +398.000000 +36.000000 +441.000000,54.000000,0.000000 +LeaderboardHeaderPanel + + + + +Background1 +320.000000 +36.000000 +114.000000,54.000000,0.000000 +LeaderboardHeaderPanel + + + + +XuiListGamers +1084.000000 +518.000000 +98.000000,90.000015,0.000000 +4 +CXuiCtrlPassThroughList +XuiListLeaderboard + + + +control_ListItem +469.000000 +86.000000 +16.000000,32.000000,0.000000 +5 +false +XuiLeaderboardEntry + + + + +control_ListItem +940.000000 +44.000000 +20.000032,71.000000,0.000000 +15 +false +XuiLeaderboardEntry +22594 + + + + +control_ListItem +940.000000 +44.000000 +20.000032,71.000000,0.000000 +15 +false +XuiLeaderboardEntry +22594 + + + + +control_ListItem +940.000000 +44.000000 +20.000032,71.000000,0.000000 +15 +false +XuiLeaderboardEntry +22594 + + + + +control_ListItem +940.000000 +44.000000 +20.000032,71.000000,0.000000 +15 +false +XuiLeaderboardEntry +22594 + + + + + +XuiTextFilter +300.000000 +20.000000 +124.000000,62.000000,0.000000 +LabelLeaderboardTitle + + + + +XuiTextLeaderboard +266.000000 +20.000000 +496.000000,62.000000,0.000000 +LabelLeaderboardTitle + + + + +XuiTextEntries +300.000000 +20.000000 +856.000000,62.000000,0.000000 +LabelLeaderboardTitle + + + + +XuiTextInfo +366.000000 +106.000000 +457.000000,304.000000,0.000000 +LabelLeaderboardWaitingText + + + + +LSIcon +50.000000 +32.000000 +446.000000,54.000000,0.000000 +IconLStickSides + + + + +RBIcon +32.000000 +32.000000 +800.000000,58.000000,0.000000 +IconRBumper + + + + +LBIcon +32.000000 +32.000000 +764.000000,58.000000,0.000000 +IconLBumper + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_leaderboards_480.h b/Minecraft.Client/Common/Media/xuiscene_leaderboards_480.h new file mode 100644 index 00000000..094878f4 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_leaderboards_480.h @@ -0,0 +1,17 @@ +#define IDC_Background3 L"Background3" +#define IDC_Background2 L"Background2" +#define IDC_Background1 L"Background1" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_XuiListGamers L"XuiListGamers" +#define IDC_XuiTextFilter L"XuiTextFilter" +#define IDC_XuiTextLeaderboard L"XuiTextLeaderboard" +#define IDC_XuiTextEntries L"XuiTextEntries" +#define IDC_XuiTextInfo L"XuiTextInfo" +#define IDC_LSIcon L"LSIcon" +#define IDC_RBIcon L"RBIcon" +#define IDC_LBIcon L"LBIcon" +#define IDC_SceneLeaderboards L"SceneLeaderboards" diff --git a/Minecraft.Client/Common/Media/xuiscene_leaderboards_480.xui b/Minecraft.Client/Common/Media/xuiscene_leaderboards_480.xui new file mode 100644 index 00000000..4b7f0b08 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_leaderboards_480.xui @@ -0,0 +1,180 @@ + + +640.000000 +480.000000 + + + +SceneLeaderboards +640.000000 +480.000000 +CScene_Leaderboards +XuiMenuScene +XuiListGamers + + + +Background3 +170.000000 +50.000000 +422.000000,36.000000,0.000000 +LeaderboardHeaderPanel + + + + +Background2 +200.000000 +50.000000 +222.000000,36.000000,0.000000 +LeaderboardHeaderPanel + + + + +Background1 +170.000000 +50.000000 +50.000000,36.000000,0.000000 +LeaderboardHeaderPanel + + + + +XuiListGamers +560.000000 +313.000000 +40.000000,90.000000,0.000000 +4 +CXuiCtrlPassThroughList +XuiListLeaderboardSmall + + + +control_ListItem +469.000000 +86.000000 +16.000000,32.000000,0.000000 +5 +false +XuiLeaderboardEntry + + + + +control_ListItem +540.000000 +22.000000 +10.000000,52.000000,0.000000 +15 +false +XuiLeaderboardEntrySmall +22594 +0.000000,2.000000,0.000000 + + + + +control_ListItem +540.000000 +22.000000 +10.000000,52.000000,0.000000 +15 +false +XuiLeaderboardEntrySmall +22594 +0.000000,2.000000,0.000000 + + + + +control_ListItem +540.000000 +22.000000 +10.000000,52.000000,0.000000 +15 +false +XuiLeaderboardEntrySmall +22594 +0.000000,2.000000,0.000000 + + + + +control_ListItem +540.000000 +22.000000 +10.000000,52.000000,0.000000 +15 +false +XuiLeaderboardEntrySmall +22594 +0.000000,2.000000,0.000000 + + + + + +XuiTextFilter +154.000000 +40.000000 +58.000000,40.000000,0.000000 +LabelLeaderboardTitleSmall + + + + +XuiTextLeaderboard +120.000000 +40.000000 +252.000000,40.000000,0.000000 +LabelLeaderboardTitleSmall + + + + +XuiTextEntries +154.000000 +40.000000 +432.000000,40.000000,0.000000 +LabelLeaderboardTitleSmall + + + + +XuiTextInfo +366.000000 +106.000000 +137.000000,187.000000,0.000000 +LabelLeaderboardWaitingTextSmall + + + + +LSIcon +28.000000 +20.000000 +224.000000,40.000000,0.000000 +IconLStickSides + + + + +RBIcon +24.000000 +20.000000 +395.000000,40.000000,0.000000 +IconRBumper + + + + +LBIcon +24.000000 +20.000000 +373.000000,40.000000,0.000000 +IconLBumper + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_load_settings.h b/Minecraft.Client/Common/Media/xuiscene_load_settings.h new file mode 100644 index 00000000..fdacf6fd --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_load_settings.h @@ -0,0 +1,37 @@ +#define IDC_ComparisonPic L"ComparisonPic" +#define IDC_Icon L"Icon" +#define IDC_TexturePackName L"TexturePackName" +#define IDC_TexturePackDescription L"TexturePackDescription" +#define IDC_TexturePackDetails L"TexturePackDetails" +#define IDC_Background L"Background" +#define IDC_XuiLoadSettings L"XuiLoadSettings" +#define IDC_XuiMoreOptions L"XuiMoreOptions" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_TexturePacksList L"TexturePacksList" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderDifficulty L"XuiSliderDifficulty" +#define IDC_XuiGameModeToggle L"XuiGameModeToggle" +#define IDC_XuiGameIcon L"XuiGameIcon" +#define IDC_XuiGameName L"XuiGameName" +#define IDC_XuiGameSeed L"XuiGameSeed" +#define IDC_XuiCreatedMode L"XuiCreatedMode" +#define IDC_MainScene L"MainScene" +#define IDC_LoadGameSettings L"LoadGameSettings" diff --git a/Minecraft.Client/Common/Media/xuiscene_load_settings.xui b/Minecraft.Client/Common/Media/xuiscene_load_settings.xui new file mode 100644 index 00000000..8cf791a0 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_load_settings.xui @@ -0,0 +1,477 @@ + + +1280.000000 +720.000000 + + + +LoadGameSettings +770.000000 +450.000000 +255.000092,140.000000,0.000000 +CScene_LoadGameSettings +XuiBlankScene +MainScene\XuiLoadSettings + + + +TexturePackDetails +334.000000 +432.000000 +260.000000,10.000000,0.000000 +LeaderboardHeaderPanel + + + +ComparisonPic +292.000000 +160.000000 +26.000000,256.000000,0.000000 +CXuiCtrl4JIcon +XuiVisualImagePresenter + + + + +Icon +64.000000 +64.000000 +26.000000,14.000000,0.000000 +CXuiCtrl4JIcon +XuiVisualImagePresenter + + + + +TexturePackName +222.000000 +64.000000 +96.000000,14.000000,0.000000 +XuiLabelLight_FRONT_END_Shd_Wrp + + + + +TexturePackDescription +292.000000 +160.000000 +26.000000,86.000000,0.000000 +XuiLabelDesc_LftWrp + + + + + +MainScene +490.000000 +450.000000 +140.000031,0.000000,0.000000 + + + +Background +490.000000 +450.000000 +15 +XuiScene + + + + +XuiLoadSettings +440.000000 +40.000000 +25.000015,384.000000,0.000000 +XuiMainMenuButton_L +XuiMoreOptions + + + + +XuiMoreOptions +440.000000 +40.000000 +25.000015,334.000000,0.000000 +XuiMainMenuButton_L +TexturePacksList +XuiLoadSettings +22528 + + + + +TexturePacksList +428.000000 +98.000000 +32.000000,226.000000,0.000000 +CXuiCtrl4JList +XuiListTexturePack +XuiSliderDifficulty\XuiSlider +XuiMoreOptions +true + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +10.000000,10.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +10.000000,10.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +10.000000,10.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +10.000000,10.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +34.000000,28.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +34.000000,30.000000,0.000000 +37 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +34.000000,30.000000,0.000000 +37 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +34.000000,30.000000,0.000000 +37 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +34.000000,30.000000,0.000000 +37 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +34.000000,30.000000,0.000000 +37 +false +XuiListTexturePackButton +1 + + + + + +XuiSliderDifficulty +446.000000 +38.000000 +22.000000,177.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiGameModeToggle +TexturePacksList +FocusSink + + + +XuiSlider +446.000000 +38.000000 +XuiSlider +3 + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiGameModeToggle +440.000000 +40.000000 +25.000015,129.000000,0.000000 +XuiMainMenuButton_L +XuiSliderDifficulty\XuiSlider +22528 + + + + +XuiGameIcon +64.000000 +64.000000 +25.000000,18.000000,0.000000 +CXuiCtrl4JIcon +ItemIcon + + + + +XuiGameName +363.000000 +26.000000 +97.000000,18.000000,0.000000 +XuiLabelDark14_1Line + + + + +XuiGameSeed +440.000000 +26.000000 +25.000000,92.000000,0.000000 +XuiLabelDark14_1Line + + + + +XuiCreatedMode +363.000000 +26.000000 +97.000000,54.000000,0.000000 +XuiLabelDark14_1Line + + + + + + +Normal + +stop + + +SlideOut + + + +SlideOutEnd + +stop + + +SlideBack + + + +SlideBackEnd + +stop + + + +MainScene +Position + + +0 +140.000031,0.000000,0.000000 + + + +0 +140.000031,0.000000,0.000000 + + + +0 +-44.000000,0.000000,0.000000 + + + +0 +-44.000000,0.000000,0.000000 + + + +0 +140.000031,0.000000,0.000000 + + + +TexturePackDetails +Position + + +0 +260.000000,10.000000,0.000000 + + + +0 +260.000000,10.000000,0.000000 + + + +0 +434.000000,10.000000,0.000000 + + + +0 +434.000000,10.000000,0.000000 + + + +0 +260.000000,10.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_load_settings_480.h b/Minecraft.Client/Common/Media/xuiscene_load_settings_480.h new file mode 100644 index 00000000..9942515e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_load_settings_480.h @@ -0,0 +1,37 @@ +#define IDC_ComparisonPic L"ComparisonPic" +#define IDC_TexturePackDescription L"TexturePackDescription" +#define IDC_TexturePackName L"TexturePackName" +#define IDC_Icon L"Icon" +#define IDC_TexturePackDetails L"TexturePackDetails" +#define IDC_Background L"Background" +#define IDC_XuiLoadSettings L"XuiLoadSettings" +#define IDC_XuiMoreOptions L"XuiMoreOptions" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_TexturePacksList L"TexturePacksList" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderDifficulty L"XuiSliderDifficulty" +#define IDC_XuiGameModeToggle L"XuiGameModeToggle" +#define IDC_XuiGameSeed L"XuiGameSeed" +#define IDC_XuiGameIcon L"XuiGameIcon" +#define IDC_XuiGameName L"XuiGameName" +#define IDC_XuiCreatedMode L"XuiCreatedMode" +#define IDC_MainScene L"MainScene" +#define IDC_LoadGameSettings L"LoadGameSettings" diff --git a/Minecraft.Client/Common/Media/xuiscene_load_settings_480.xui b/Minecraft.Client/Common/Media/xuiscene_load_settings_480.xui new file mode 100644 index 00000000..fd9eaa91 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_load_settings_480.xui @@ -0,0 +1,481 @@ + + +640.000000 +480.000000 + + + +LoadGameSettings +597.000000 +375.000000 +21.500046,30.000000,0.000000 +CScene_LoadGameSettings +XuiBlankScene +MainScene\XuiLoadSettings + + + +TexturePackDetails +230.000000 +358.000000 +183.500015,9.999999,0.000000 +LeaderboardHeaderPanel + + + +ComparisonPic +196.000000 +112.000000 +20.000000,234.000000,0.000000 +CXuiCtrl4JIcon +XuiVisualImagePresenter + + + + +TexturePackDescription +196.000000 +96.000000 +20.000010,132.000000,0.000000 +XuiLabelDesc_LftWrp_Small + + + + +TexturePackName +196.000000 +43.000000 +20.000000,82.000008,0.000000 +XuiLabelLight_FRONT_END_Shd_Wrp_Small + + + + +Icon +64.000000 +64.000000 +90.000000,10.000000,0.000000 +CXuiCtrl4JIcon +XuiVisualImagePresenter + + + + + +MainScene +380.000000 +375.000000 +108.500015,0.000000,0.000000 + + + +Background +380.000000 +375.000000 +15 +XuiScene + + + + +XuiLoadSettings +344.000000 +36.000000 +18.000000,326.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiMoreOptions +22528 + + + + +XuiMoreOptions +344.000000 +36.000000 +18.000000,281.000000,0.000000 +XuiMainMenuButton_L_Thin +TexturePacksList +XuiLoadSettings +22528 + + + + +TexturePacksList +344.000000 +74.000000 +18.000000,194.000000,0.000000 +CXuiCtrl4JList +XuiListTexturePackSmall +XuiSliderDifficulty\XuiSlider +XuiMoreOptions +true + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +10.000000,10.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +10.000000,10.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +10.000000,10.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +10.000000,10.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +40.000000 +40.000000 +10.000000,10.000000,0.000000 +false +XuiListTexturePackButtonSmall +1 + + + + +control_ListItem +40.000000 +40.000000 +10.000000,10.000000,0.000000 +false +XuiListTexturePackButtonSmall +1 + + + + +control_ListItem +40.000000 +40.000000 +35.000000,22.000000,0.000000 +5 +false +XuiListTexturePackButtonSmall +1 + + + + +control_ListItem +40.000000 +40.000000 +35.000000,24.000000,0.000000 +37 +false +XuiListTexturePackButtonSmall +1 + + + + +control_ListItem +40.000000 +40.000000 +35.000000,24.000000,0.000000 +37 +false +XuiListTexturePackButtonSmall +1 + + + + +control_ListItem +40.000000 +40.000000 +35.000000,24.000000,0.000000 +37 +false +XuiListTexturePackButtonSmall +1 + + + + + +XuiSliderDifficulty +350.000000 +38.000000 +15.000000,142.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiGameModeToggle +TexturePacksList +FocusSink + + + +XuiSlider +350.000000 +38.000000 +XuiSlider +3 + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiGameModeToggle +344.000000 +36.000000 +18.000000,99.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiSliderDifficulty\XuiSlider +22528 + + + + +XuiGameSeed +350.000000 +26.000000 +18.000000,64.000000,0.000000 +XuiLabelDark14_1Line + + + + +XuiGameIcon +42.000000 +42.000000 +18.000000,18.000000,0.000000 +CXuiCtrl4JIcon +ItemIcon + + + + +XuiGameName +300.000000 +23.000000 +66.000000,15.000000,0.000000 +XuiLabelDark14_1Line + + + + +XuiCreatedMode +300.000000 +19.000000 +66.000000,39.000000,0.000000 +XuiLabelDark14_1Line + + + + + + +Normal + +stop + + +SlideOut + + + +SlideOutEnd + +stop + + +SlideBack + + + +SlideBackEnd + + + + +MainScene +Position + + +0 +108.500015,0.000000,0.000000 + + + +0 +108.500008,0.000000,0.000000 + + + +0 +0.000000,0.000000,0.000000 + + + +0 +0.000000,0.000000,0.000000 + + + +0 +108.500015,0.000000,0.000000 + + + +TexturePackDetails +Position + + +0 +183.500015,9.999999,0.000000 + + + +0 +183.500015,9.999999,0.000000 + + + +0 +366.000000,9.999999,0.000000 + + + +0 +366.000000,9.999999,0.000000 + + + +0 +183.500015,9.999999,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_main.h b/Minecraft.Client/Common/Media/xuiscene_main.h new file mode 100644 index 00000000..b43ec0a1 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_main.h @@ -0,0 +1,26 @@ +#define IDC_XuiButton1 L"XuiButton1" +#define IDC_XuiButton2 L"XuiButton2" +#define IDC_XuiButton3 L"XuiButton3" +#define IDC_XuiButton4 L"XuiButton4" +#define IDC_XuiButton5 L"XuiButton5" +#define IDC_XuiButton6 L"XuiButton6" +#define IDC_XuiSplash L"XuiSplash" +#define IDC_XuiSplashMCFont L"XuiSplashMCFont" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_SceneMain L"SceneMain" diff --git a/Minecraft.Client/Common/Media/xuiscene_main.xui b/Minecraft.Client/Common/Media/xuiscene_main.xui new file mode 100644 index 00000000..46a623ee --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_main.xui @@ -0,0 +1,956 @@ + + +1280.000000 +720.000000 + + + +SceneMain +1280.000000 +720.000000 +CScene_Main +XuiMenuScene +XuiButton1 + + + +XuiButton1 +450.000000 +40.000000 +415.000000,250.000000,0.000000 +XuiMainMenuButton_L +XuiButton6 +XuiButton2 + + + + +XuiButton2 +450.000000 +40.000000 +415.000000,299.999969,0.000000 +XuiMainMenuButton_L +XuiButton1 +XuiButton3 + + + + +XuiButton3 +450.000000 +40.000000 +415.000000,349.999939,0.000000 +XuiMainMenuButton_L +XuiButton2 +XuiButton4 + + + + +XuiButton4 +450.000000 +40.000000 +415.000000,399.999939,0.000000 +XuiMainMenuButton_L +XuiButton3 +XuiButton5 + + + + +XuiButton5 +450.000000 +40.000000 +415.000000,449.999939,0.000000 +XuiMainMenuButton_L +XuiButton4 +XuiButton6 + + + + +XuiButton6 +450.000000 +40.000000 +415.000000,500.000000,0.000000 +XuiMainMenuButton_L +XuiButton5 +XuiButton1 + + + + +XuiSplash +500.000000 +50.000000 +605.000061,210.000000,0.000000 +0.000000,0.000000,-0.173648,0.984808 +TitleString + + + + +XuiSplashMCFont +500.000000 +50.000000 +612.000061,126.000000,0.000000 +CXuiCtrlSplashPulser +XuiLabel + + + + +Timer +182.000000 +168.000000 +549.000000,312.000000,0.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_main_480.h b/Minecraft.Client/Common/Media/xuiscene_main_480.h new file mode 100644 index 00000000..b43ec0a1 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_main_480.h @@ -0,0 +1,26 @@ +#define IDC_XuiButton1 L"XuiButton1" +#define IDC_XuiButton2 L"XuiButton2" +#define IDC_XuiButton3 L"XuiButton3" +#define IDC_XuiButton4 L"XuiButton4" +#define IDC_XuiButton5 L"XuiButton5" +#define IDC_XuiButton6 L"XuiButton6" +#define IDC_XuiSplash L"XuiSplash" +#define IDC_XuiSplashMCFont L"XuiSplashMCFont" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_SceneMain L"SceneMain" diff --git a/Minecraft.Client/Common/Media/xuiscene_main_480.xui b/Minecraft.Client/Common/Media/xuiscene_main_480.xui new file mode 100644 index 00000000..29565a32 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_main_480.xui @@ -0,0 +1,956 @@ + + +640.000000 +480.000000 + + + +SceneMain +640.000000 +480.000000 +CScene_Main +XuiMenuScene +XuiButton1 + + + +XuiButton1 +300.000000 +36.000000 +170.000031,140.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton6 +XuiButton2 + + + + +XuiButton2 +300.000000 +36.000000 +170.000031,179.999969,0.000000 +XuiMainMenuButton_L_Thin +XuiButton1 +XuiButton3 + + + + +XuiButton3 +300.000000 +36.000000 +170.000031,219.999939,0.000000 +XuiMainMenuButton_L_Thin +XuiButton2 +XuiButton4 + + + + +XuiButton4 +300.000000 +36.000000 +170.000031,259.999939,0.000000 +XuiMainMenuButton_L_Thin +XuiButton3 +XuiButton5 + + + + +XuiButton5 +300.000000 +36.000000 +170.000031,299.999939,0.000000 +XuiMainMenuButton_L_Thin +XuiButton4 +XuiButton6 + + + + +XuiButton6 +300.000000 +36.000000 +170.000031,340.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton5 +XuiButton1 + + + + +XuiSplash +250.000000 +25.000000 +331.000061,110.000000,0.000000 +0.000000,0.000000,-0.113203,0.993572 +TitleStringSmall + + + + +XuiSplashMCFont +250.000000 +25.000000 +331.000061,74.000000,0.000000 +CXuiCtrlSplashPulser + + + + +Timer +184.000000 +170.000000 +274.000000,216.000000,0.000000 +0.500000,0.500000,1.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_create.h b/Minecraft.Client/Common/Media/xuiscene_multi_create.h new file mode 100644 index 00000000..69e78136 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_create.h @@ -0,0 +1,35 @@ +#define IDC_ComparisonPic L"ComparisonPic" +#define IDC_Icon L"Icon" +#define IDC_TexturePackName L"TexturePackName" +#define IDC_TexturePackDescription L"TexturePackDescription" +#define IDC_TexturePackDetails L"TexturePackDetails" +#define IDC_Background L"Background" +#define IDC_XuiNewWorld L"XuiNewWorld" +#define IDC_XuiMoreOptions L"XuiMoreOptions" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderDifficulty L"XuiSliderDifficulty" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_TexturePacksList L"TexturePacksList" +#define IDC_XuiGameModeToggle L"XuiGameModeToggle" +#define IDC_XuiLabelRandomSeed L"XuiLabelRandomSeed" +#define IDC_XuiEditSeed L"XuiEditSeed" +#define IDC_XuiEditWorldName L"XuiEditWorldName" +#define IDC_XuiLabelWorldName L"XuiLabelWorldName" +#define IDC_XuiLabelSeed L"XuiLabelSeed" +#define IDC_MainScene L"MainScene" +#define IDC_MultiGameCreate L"MultiGameCreate" diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_create.xui b/Minecraft.Client/Common/Media/xuiscene_multi_create.xui new file mode 100644 index 00000000..81e03066 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_create.xui @@ -0,0 +1,460 @@ + + +1280.000000 +720.000000 + + + +MultiGameCreate +810.000000 +498.000000 +235.000092,110.000000,0.000000 +CScene_MultiGameCreate +XuiBlankScene +MainScene\XuiEditWorldName + + + +TexturePackDetails +334.000000 +432.000000 +287.000000,48.000000,0.000000 +LeaderboardHeaderPanel + + + +ComparisonPic +292.000000 +160.000000 +26.000000,256.000000,0.000000 +CXuiCtrl4JIcon +XuiVisualImagePresenter + + + + +Icon +64.000000 +64.000000 +26.000000,14.000000,0.000000 +CXuiCtrl4JIcon +XuiVisualImagePresenter + + + + +TexturePackName +222.000000 +64.000000 +96.000000,14.000000,0.000000 +XuiLabelLight_FRONT_END_Shd_Wrp + + + + +TexturePackDescription +292.000000 +160.000000 +26.000000,86.000000,0.000000 +XuiLabelDesc_LftWrp + + + + + +MainScene +490.000000 +498.000000 +159.000000,0.000000,0.000000 + + + +Background +490.000000 +498.000000 +15 +XuiScene + + + + +XuiNewWorld +440.000000 +40.000000 +25.000015,438.000000,0.000000 +XuiMainMenuButton_L +XuiMoreOptions +22528 + + + + +XuiMoreOptions +440.000000 +40.000000 +25.000015,388.000000,0.000000 +XuiMainMenuButton_L +XuiSliderDifficulty\XuiSlider +XuiNewWorld +22528 + + + + +XuiSliderDifficulty +446.000000 +38.000000 +22.000017,344.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +TexturePacksList +XuiMoreOptions +FocusSink + + + +XuiSlider +446.000000 +38.000000 +XuiSlider +3 + + + + +FocusSink +1.000000 +1.000000 + + + + + +TexturePacksList +428.000000 +96.000000 +32.000000,244.000000,0.000000 +CXuiCtrl4JList +XuiListTexturePack +XuiGameModeToggle +XuiSliderDifficulty\XuiSlider +true + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +10.000000,10.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +10.000000,10.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +34.000000,28.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +34.000000,28.000000,0.000000 +37 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +34.000000,30.000000,0.000000 +37 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +34.000000,30.000000,0.000000 +37 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +34.000000,30.000000,0.000000 +37 +false +XuiListTexturePackButton +1 + + + + + +XuiGameModeToggle +440.000000 +40.000000 +25.000015,194.000000,0.000000 +XuiMainMenuButton_L +XuiEditSeed +TexturePacksList +22528 + + + + +XuiLabelRandomSeed +439.000000 +31.000000 +25.000000,162.000000,0.000000 +XuiLabelDarkLeftWrap + + + + +XuiEditSeed +434.000000 +32.000000 +28.000000,124.000000,0.000000 +CXuiCtrl4JEdit +XuiEdit +XuiEditWorldName +XuiGameModeToggle + + + + +XuiEditWorldName +434.000000 +32.000000 +28.000000,52.000000,0.000000 +CXuiCtrl4JEdit +XuiEdit +CheckboxAllowFoF +XuiEditSeed + + + + +XuiLabelWorldName +440.000000 +26.000008 +25.000000,24.000000,0.000000 +XuiLabelDark + + + + +XuiLabelSeed +440.000000 +26.172791 +25.000000,96.000000,0.000000 +XuiLabelDark + + + + + + +Normal + +stop + + +SlideOut + + + +SlideOutEnd + +stop + + +SlideBack + + + +SlideBackEnd + +stop + + + +MainScene +Position + + +0 +159.000000,0.000000,0.000000 + + + +0 +159.000000,0.000000,0.000000 + + + +0 +0.000000,0.000000,0.000000 + + + +0 +0.000000,0.000000,0.000000 + + + +0 +159.000000,0.000000,0.000000 + + + +TexturePackDetails +Position + + +0 +287.000000,48.000000,0.000000 + + + +0 +287.000000,48.000000,0.000000 + + + +0 +477.000000,48.000000,0.000000 + + + +0 +477.000000,48.000000,0.000000 + + + +0 +287.000000,48.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_create_480.h b/Minecraft.Client/Common/Media/xuiscene_multi_create_480.h new file mode 100644 index 00000000..41ef7a17 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_create_480.h @@ -0,0 +1,38 @@ +#define IDC_ComparisonPic L"ComparisonPic" +#define IDC_TexturePackDescription L"TexturePackDescription" +#define IDC_TexturePackName L"TexturePackName" +#define IDC_Icon L"Icon" +#define IDC_TexturePackDetails L"TexturePackDetails" +#define IDC_Background L"Background" +#define IDC_XuiNewWorld L"XuiNewWorld" +#define IDC_XuiMoreOptions L"XuiMoreOptions" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderDifficulty L"XuiSliderDifficulty" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_TexturePacksList L"TexturePacksList" +#define IDC_XuiGameModeToggle L"XuiGameModeToggle" +#define IDC_XuiLabelRandomSeed L"XuiLabelRandomSeed" +#define IDC_XuiEditSeed L"XuiEditSeed" +#define IDC_XuiLabelSeed L"XuiLabelSeed" +#define IDC_XuiEditWorldName L"XuiEditWorldName" +#define IDC_XuiLabelWorldName L"XuiLabelWorldName" +#define IDC_MainScene L"MainScene" +#define IDC_MultiGameCreate L"MultiGameCreate" diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_create_480.xui b/Minecraft.Client/Common/Media/xuiscene_multi_create_480.xui new file mode 100644 index 00000000..12efc6e6 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_create_480.xui @@ -0,0 +1,497 @@ + + +640.000000 +480.000000 + + + +MultiGameCreate +557.000000 +410.000000 +41.500046,20.000023,0.000000 +CScene_MultiGameCreate +XuiBlankScene +MainScene\XuiEditWorldName + + + +TexturePackDetails +230.000000 +382.000000 +163.500046,7.999999,0.000000 +LeaderboardHeaderPanel + + + +ComparisonPic +196.000000 +112.000000 +20.000000,258.000000,0.000000 +CXuiCtrl4JIcon +XuiVisualImagePresenter + + + + +TexturePackDescription +196.000000 +122.000000 +20.000010,130.000000,0.000000 +XuiLabelDesc_LftWrp_Small + + + + +TexturePackName +196.000000 +43.000000 +20.000000,80.000008,0.000000 +XuiLabelLight_FRONT_END_Shd_Wrp_Small + + + + +Icon +64.000000 +64.000000 +88.000000,10.000000,0.000000 +CXuiCtrl4JIcon +XuiVisualImagePresenter + + + + + +MainScene +340.000000 +400.000000 +108.500015,0.000000,0.000000 + + + +Background +340.000000 +398.000000 +15 +XuiScene + + + + +XuiNewWorld +304.000000 +36.000000 +18.000000,344.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiMoreOptions +22528 + + + + +XuiMoreOptions +304.000000 +36.000000 +18.000000,302.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiSliderDifficulty\XuiSlider +XuiNewWorld +22528 + + + + +XuiSliderDifficulty +310.000000 +38.000000 +15.000000,260.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +TexturePacksList +XuiMoreOptions +FocusSink + + + +XuiSlider +310.000000 +38.000000 +XuiSlider +3 + + + + +FocusSink +1.000000 +1.000000 + + + + + +TexturePacksList +304.000000 +74.000000 +18.000000,186.000000,0.000000 +CXuiCtrl4JList +XuiListTexturePackSmall +XuiGameModeToggle +XuiSliderDifficulty\XuiSlider +true + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +10.000000,10.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +60.000000 +10.000000,10.000000,0.000000 +5 +false +XuiListTexturePackButton +1 + + + + +control_ListItem +40.000000 +40.000000 +10.000000,10.000000,0.000000 +false +XuiListTexturePackButtonSmall +1 + + + + +control_ListItem +40.000000 +40.000000 +10.000000,10.000000,0.000000 +false +XuiListTexturePackButtonSmall +1 + + + + +control_ListItem +40.000000 +40.000000 +35.000000,22.000000,0.000000 +5 +false +XuiListTexturePackButtonSmall +1 + + + + +control_ListItem +40.000000 +40.000000 +35.000000,24.000000,0.000000 +37 +false +XuiListTexturePackButtonSmall +1 + + + + +control_ListItem +40.000000 +40.000000 +35.000000,24.000000,0.000000 +37 +false +XuiListTexturePackButtonSmall +1 + + + + +control_ListItem +40.000000 +40.000000 +35.000000,24.000000,0.000000 +37 +false +XuiListTexturePackButtonSmall +1 + + + + +control_ListItem +40.000000 +40.000000 +35.000000,24.000000,0.000000 +37 +false +XuiListTexturePackButtonSmall +1 + + + + +control_ListItem +40.000000 +40.000000 +35.000000,24.000000,0.000000 +37 +false +XuiListTexturePackButtonSmall +1 + + + + + +XuiGameModeToggle +304.000000 +36.000000 +18.000000,144.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiEditSeed +TexturePacksList +22528 + + + + +XuiLabelRandomSeed +304.000000 +21.924896 +18.000000,122.000000,0.000000 +XuiLabelDarkLeftWrapSmall8 + + + + +XuiEditSeed +298.000000 +21.000000,88.000000,0.000000 +CXuiCtrl4JEdit +XuiEdit +XuiEditWorldName +XuiGameModeToggle + + + + +XuiLabelSeed +303.444427 +28.000000 +18.000000,70.000000,0.000000 +XuiLabelDarkLeftWrapSmall10 + + + + +XuiEditWorldName +298.000000 +21.000000,32.000000,0.000000 +CXuiCtrl4JEdit +XuiEdit +CheckboxAllowFoF +XuiEditSeed + + + + +XuiLabelWorldName +303.444427 +28.000000 +18.000000,14.000000,0.000000 +XuiLabelDarkLeftWrapSmall10 + + + + + + +Normal + +stop + + +SlideOut + + + +SlideOutEnd + +stop + + +SlideBack + + + +SlideBackEnd + +stop + + + +MainScene +Position + + +0 +108.500015,0.000000,0.000000 + + + +0 +108.500015,0.000000,0.000000 + + + +0 +0.000000,0.000000,0.000000 + + + +0 +0.000000,0.000000,0.000000 + + + +0 +108.500015,0.000000,0.000000 + + + +TexturePackDetails +Position + + +0 +163.500046,7.999999,0.000000 + + + +0 +163.500046,8.000000,0.000000 + + + +0 +327.000000,8.000000,0.000000 + + + +0 +327.000000,8.000000,0.000000 + + + +0 +163.500046,8.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_gameinfo.h b/Minecraft.Client/Common/Media/xuiscene_multi_gameinfo.h new file mode 100644 index 00000000..0a2a509d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_gameinfo.h @@ -0,0 +1,29 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_GamePlayers L"GamePlayers" +#define IDC_JoinGame L"JoinGame" +#define IDC_LabelDifficulty L"LabelDifficulty" +#define IDC_Difficulty L"Difficulty" +#define IDC_LabelGameType L"LabelGameType" +#define IDC_GameType L"GameType" +#define IDC_LabelGamertagsOn L"LabelGamertagsOn" +#define IDC_GamertagsOn L"GamertagsOn" +#define IDC_LabelStructuresOn L"LabelStructuresOn" +#define IDC_StructuresOn L"StructuresOn" +#define IDC_LabelLevelType L"LabelLevelType" +#define IDC_LevelType L"LevelType" +#define IDC_LabelPvP L"LabelPvP" +#define IDC_PvP L"PvP" +#define IDC_LabelTrust L"LabelTrust" +#define IDC_Trust L"Trust" +#define IDC_LabelTNTOn L"LabelTNTOn" +#define IDC_TNTOn L"TNTOn" +#define IDC_LabelFireOn L"LabelFireOn" +#define IDC_FireOn L"FireOn" +#define IDC_GameSettings L"GameSettings" +#define IDC_MultiGameInfo L"MultiGameInfo" diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_gameinfo.xui b/Minecraft.Client/Common/Media/xuiscene_multi_gameinfo.xui new file mode 100644 index 00000000..d903d749 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_gameinfo.xui @@ -0,0 +1,285 @@ + + +1280.000000 +720.000000 + + + +MultiGameInfo +1280.000000 +720.000000 +CScene_MultiGameInfo +XuiBlankScene +JoinGame + + + +GamePlayers +450.000000 +342.000000 +228.000046,250.000000,0.000000 +XuiPlayerList_NoIcon +JoinGame + + + +control_ListItem +469.000000 +86.000000 +16.000000,32.000000,0.000000 +5 +false +XuiButton + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +false +XuiListButton_L_NoIcon + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +false +XuiListButton_L_NoIcon + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +false +XuiListButton_L_NoIcon + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +false +XuiListButton_L_NoIcon + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +false +XuiListButton_L_NoIcon + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +false +XuiListButton_L_NoIcon + + + + + +JoinGame +450.000000 +40.000000 +414.000000,200.000000,0.000000 +XuiMainMenuButton_L +GamePlayers +22528 + + + + +GameSettings +364.000000 +342.000000 +688.000061,250.000000,0.000000 +GraphicPanel + + + +LabelDifficulty +326.000000 +32.000000 +20.000000,12.000000,0.000000 +XuiLabelDark + + + + +Difficulty +326.000000 +32.000000 +20.000000,12.000000,0.000000 +XuiLabelDarkRight + + + + +LabelGameType +326.000000 +32.000000 +20.000000,44.000000,0.000000 +XuiLabelDark + + + + +GameType +326.000000 +32.000000 +20.000000,44.000000,0.000000 +XuiLabelDarkRight + + + + +LabelGamertagsOn +326.000000 +32.000000 +20.000000,76.000000,0.000000 +XuiLabelDark + + + + +GamertagsOn +326.000000 +32.000000 +20.000000,76.000000,0.000000 +XuiLabelDarkRight + + + + +LabelStructuresOn +326.000000 +32.000000 +20.000000,108.000000,0.000000 +XuiLabelDark + + + + +StructuresOn +326.000000 +32.000000 +20.000000,108.000000,0.000000 +XuiLabelDarkRight + + + + +LabelLevelType +326.000000 +32.000000 +20.000000,140.000000,0.000000 +XuiLabelDark + + + + +LevelType +326.000000 +32.000000 +20.000000,140.000000,0.000000 +XuiLabelDarkRight + + + + +LabelPvP +326.000000 +32.000000 +20.000000,172.000000,0.000000 +XuiLabelDarkLeftWrap16 + + + + +PvP +326.000000 +32.000000 +20.000000,172.000000,0.000000 +XuiLabelDarkRight + + + + +LabelTrust +326.000000 +32.000000 +20.000000,204.000000,0.000000 +XuiLabelDarkLeftWrap16 + + + + +Trust +326.000000 +32.000000 +20.000000,204.000000,0.000000 +XuiLabelDarkRight + + + + +LabelTNTOn +326.000000 +32.000000 +20.000000,236.000000,0.000000 +XuiLabelDarkLeftWrap16 + + + + +TNTOn +326.000000 +32.000000 +20.000000,236.000000,0.000000 +XuiLabelDarkRight + + + + +LabelFireOn +326.000000 +32.000000 +20.000000,268.000000,0.000000 +XuiLabelDarkLeftWrap16 + + + + +FireOn +326.000000 +32.000000 +20.000000,268.000000,0.000000 +XuiLabelDarkRight + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_gameinfo_480.h b/Minecraft.Client/Common/Media/xuiscene_multi_gameinfo_480.h new file mode 100644 index 00000000..32758c5f --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_gameinfo_480.h @@ -0,0 +1,28 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_GamePlayers L"GamePlayers" +#define IDC_JoinGame L"JoinGame" +#define IDC_LabelDifficulty L"LabelDifficulty" +#define IDC_Difficulty L"Difficulty" +#define IDC_LabelGameType L"LabelGameType" +#define IDC_GameType L"GameType" +#define IDC_LabelGamertagsOn L"LabelGamertagsOn" +#define IDC_GamertagsOn L"GamertagsOn" +#define IDC_LabelStructuresOn L"LabelStructuresOn" +#define IDC_StructuresOn L"StructuresOn" +#define IDC_LabelLevelType L"LabelLevelType" +#define IDC_LevelType L"LevelType" +#define IDC_LabelPvP L"LabelPvP" +#define IDC_PvP L"PvP" +#define IDC_LabelTrust L"LabelTrust" +#define IDC_Trust L"Trust" +#define IDC_LabelTNTOn L"LabelTNTOn" +#define IDC_TNTOn L"TNTOn" +#define IDC_LabelFireOn L"LabelFireOn" +#define IDC_FireOn L"FireOn" +#define IDC_GameSettings L"GameSettings" +#define IDC_MultiGameInfo L"MultiGameInfo" diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_gameinfo_480.xui b/Minecraft.Client/Common/Media/xuiscene_multi_gameinfo_480.xui new file mode 100644 index 00000000..86edfc0f --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_gameinfo_480.xui @@ -0,0 +1,292 @@ + + +640.000000 +480.000000 + + + +MultiGameInfo +640.000000 +480.000000 +CScene_MultiGameInfo +XuiBlankScene +JoinGame + + + +GamePlayers +300.000000 +240.000000 +44.000004,180.000046,0.000000 +XuiPlayerListSmall_NoIcon +JoinGame + + + +control_ListItem +469.000000 +86.000000 +16.000000,32.000000,0.000000 +5 +false +XuiButton + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_LThin_NoIcon + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_LThin_NoIcon + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_LThin_NoIcon + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_LThin_NoIcon + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_LThin_NoIcon + + + + + +JoinGame +300.000000 +36.000000 +170.000015,140.000046,0.000000 +XuiMainMenuButton_L_Thin +GamePlayers +22528 + + + + +GameSettings +245.000000 +240.000000 +351.000061,180.000000,0.000000 +GraphicPanel + + + +LabelDifficulty +207.000000 +22.000000 +20.000000,12.000000,0.000000 +5 +XuiLabelDarkLeftWrapSmall + + + + +Difficulty +207.000000 +22.000000 +20.000000,12.000000,0.000000 +5 +XuiLabelDarkSmallRight + + + + +LabelGameType +207.000000 +22.000000 +20.000000,34.000000,0.000000 +5 +XuiLabelDarkLeftWrapSmall + + + + +GameType +207.000000 +22.000000 +20.000000,34.000000,0.000000 +5 +XuiLabelDarkSmallRight + + + + +LabelGamertagsOn +207.000000 +22.000000 +20.000000,56.000000,0.000000 +5 +XuiLabelDarkLeftWrapSmall + + + + +GamertagsOn +207.000000 +22.000000 +20.000000,56.000000,0.000000 +5 +XuiLabelDarkSmallRight + + + + +LabelStructuresOn +207.000000 +22.000000 +20.000000,78.000000,0.000000 +5 +XuiLabelDarkLeftWrapSmall + + + + +StructuresOn +207.000000 +22.000000 +20.000000,78.000000,0.000000 +5 +XuiLabelDarkSmallRight + + + + +LabelLevelType +207.000000 +22.000000 +20.000000,100.000000,0.000000 +5 +XuiLabelDarkLeftWrapSmall + + + + +LevelType +207.000000 +22.000000 +20.000000,100.000000,0.000000 +5 +XuiLabelDarkSmallRight + + + + +LabelPvP +207.000000 +22.000000 +20.000000,122.000000,0.000000 +5 +XuiLabelDarkLeftWrapSmall + + + + +PvP +207.000000 +22.000000 +20.000000,122.000000,0.000000 +5 +XuiLabelDarkSmallRight + + + + +LabelTrust +207.000000 +22.000000 +20.000000,144.000000,0.000000 +5 +XuiLabelDarkLeftWrapSmall + + + + +Trust +207.000000 +22.000000 +20.000000,144.000000,0.000000 +5 +XuiLabelDarkSmallRight + + + + +LabelTNTOn +207.000000 +22.000000 +20.000000,166.000000,0.000000 +5 +XuiLabelDarkLeftWrapSmall + + + + +TNTOn +207.000000 +22.000000 +20.000000,166.000000,0.000000 +5 +XuiLabelDarkSmallRight + + + + +LabelFireOn +207.000000 +22.000000 +20.000000,188.000000,0.000000 +5 +XuiLabelDarkLeftWrapSmall + + + + +FireOn +207.000000 +22.000000 +20.000000,188.000000,0.000000 +5 +XuiLabelDarkSmallRight + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_joinload.h b/Minecraft.Client/Common/Media/xuiscene_multi_joinload.h new file mode 100644 index 00000000..a7f3d753 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_joinload.h @@ -0,0 +1,46 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_GamesList L"GamesList" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_LabelNoGames L"LabelNoGames" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_SavesList L"SavesList" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_SavesTimer L"SavesTimer" +#define IDC_MultiGameJoinLoad L"MultiGameJoinLoad" diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_joinload.xui b/Minecraft.Client/Common/Media/xuiscene_multi_joinload.xui new file mode 100644 index 00000000..cc34f0ca --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_joinload.xui @@ -0,0 +1,1851 @@ + + +1280.000000 +720.000000 + + + +MultiGameJoinLoad +1040.000000 +426.000000 +120.000000,206.000000,0.000000 +CScene_MultiGameJoinLoad +XuiScene +SavesList + + + +GamesList +500.000000 +386.000000 +524.000000,22.000008,0.000000 +CXuiCtrl4JList +XuiListRecessed +SavesList +SavesList + + + +control_ListItem +469.000000 +86.000000 +16.000000,32.000000,0.000000 +5 +false +XuiButton + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L_NoIcon + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + + +Timer +184.000000 +170.000000 +682.000000,170.000000,0.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + +LabelNoGames +342.000000 +56.000000 +580.000000,210.000000,0.000000 +false +XuiLabelDarkCentred + + + + +SavesList +500.000000 +386.000000 +18.000000,22.000008,0.000000 +CXuiCtrl4JList +XuiListRecessed +GamesList +GamesList + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,42.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + + +SavesTimer +184.000000 +170.000000 +178.000000,170.000000,0.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_joinload_480.h b/Minecraft.Client/Common/Media/xuiscene_multi_joinload_480.h new file mode 100644 index 00000000..e8d14c9d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_joinload_480.h @@ -0,0 +1,52 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_GamesList L"GamesList" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_LabelNoGames L"LabelNoGames" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_SavesList L"SavesList" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_SavesTimer L"SavesTimer" +#define IDC_MultiGameJoinLoad L"MultiGameJoinLoad" diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_joinload_480.xui b/Minecraft.Client/Common/Media/xuiscene_multi_joinload_480.xui new file mode 100644 index 00000000..10f0f93d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_joinload_480.xui @@ -0,0 +1,1917 @@ + + +640.000000 +480.000000 + + + +MultiGameJoinLoad +596.000000 +290.000000 +24.000000,124.000000,0.000000 +CScene_MultiGameJoinLoad +XuiScene +SavesList + + + +GamesList +320.000000 +266.000000 +262.000000,14.000000,0.000000 +CXuiCtrl4JList +XuiListRecessedThin +SavesList +SavesList + + + +control_ListItem +469.000000 +86.000000 +16.000000,32.000000,0.000000 +5 +false +XuiButton + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_LThin_NoIcon + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_LThin_NoIcon + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_LThin_NoIcon + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_LThin_NoIcon + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + + +Timer +72.000000 +72.000000 +388.000000,112.000000,0.000000 +15 +XuiBlankScene + + + +Timer_Square_1 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + +LabelNoGames +200.000000 +78.000000 +322.000000,136.000000,0.000000 +false +XuiLabelDarkCentredWrapSmall + + + + +SavesList +250.000000 +265.000000 +12.000000,14.000000,0.000000 +CXuiCtrl4JList +XuiListRecessedThin +GamesList +GamesList + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_LThin + + + + +control_ListItem +410.000000 +15.000000,30.000000,0.000000 +5 +false +XuiListButton_LThin + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + + +SavesTimer +72.000000 +72.000000 +102.000000,112.000000,0.000000 +15 +XuiBlankScene + + + +Timer_Square_1 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + + +Logo +640.000000 +70.000000 +0.000000,48.000000,0.000000 +true +MenuTitleLogo + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options.h b/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options.h new file mode 100644 index 00000000..ac9daa38 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options.h @@ -0,0 +1,18 @@ +#define IDC_CheckboxResetNether L"CheckboxResetNether" +#define IDC_CheckboxHostPrivileges L"CheckboxHostPrivileges" +#define IDC_CheckboxTNT L"CheckboxTNT" +#define IDC_CheckboxFireSpreads L"CheckboxFireSpreads" +#define IDC_CheckboxTrustSystem L"CheckboxTrustSystem" +#define IDC_CheckboxPVP L"CheckboxPVP" +#define IDC_CheckboxAllowFoF L"CheckboxAllowFoF" +#define IDC_CheckboxInviteOnly L"CheckboxInviteOnly" +#define IDC_CheckboxOnline L"CheckboxOnline" +#define IDC_HostOptions L"HostOptions" +#define IDC_CheckboxBonusChest L"CheckboxBonusChest" +#define IDC_CheckboxFlatWorld L"CheckboxFlatWorld" +#define IDC_CheckboxStructures L"CheckboxStructures" +#define IDC_WorldOptions L"WorldOptions" +#define IDC_WO_Box L"WO_Box" +#define IDC_GenerationOptions L"GenerationOptions" +#define IDC_Description L"Description" +#define IDC_MultiGameLaunchMoreOptions L"MultiGameLaunchMoreOptions" diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options.xui b/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options.xui new file mode 100644 index 00000000..339ae0a4 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options.xui @@ -0,0 +1,282 @@ + + +1280.000000 +720.000000 + + + +MultiGameLaunchMoreOptions +450.000000 +486.000000 +415.000031,55.000000,0.000000 +CScene_MultiGameLaunchMoreOptions +XuiScene +HostOptions\CheckboxOnline + + + +HostOptions +450.000000 +306.000000 +0.000000,10.000000,0.000000 +2 +XuiBlankScene + + + +CheckboxResetNether +402.000000 +34.000000 +23.000000,272.000000,0.000000 +2 +XuiCheckbox +CheckboxHostPrivileges +..\GenerationOptions\CheckboxStructures + + + + +CheckboxHostPrivileges +402.000000 +34.000000 +23.000000,238.000000,0.000000 +2 +XuiCheckbox +CheckboxTNT +CheckboxResetNether + + + + +CheckboxTNT +402.000000 +34.000000 +23.000000,204.000000,0.000000 +2 +XuiCheckbox +CheckboxFireSpreads +CheckboxHostPrivileges + + + + +CheckboxFireSpreads +402.000000 +34.000000 +23.000000,170.000000,0.000000 +2 +XuiCheckbox +CheckboxTrustSystem +CheckboxTNT + + + + +CheckboxTrustSystem +402.000000 +34.000000 +23.000000,136.000000,0.000000 +2 +XuiCheckbox +CheckboxPVP +CheckboxFireSpreads + + + + +CheckboxPVP +402.000000 +34.000000 +23.000000,101.999992,0.000000 +2 +XuiCheckbox +CheckboxAllowFoF +CheckboxTrustSystem + + + + +CheckboxAllowFoF +402.000000 +34.000000 +23.000000,68.000000,0.000000 +XuiCheckbox +CheckboxInviteOnly +CheckboxPVP + + + + +CheckboxInviteOnly +402.000000 +34.000000 +23.000000,34.000000,0.000000 +XuiCheckbox +CheckboxOnline +CheckboxAllowFoF + + + + +CheckboxOnline +402.000000 +34.000000 +23.000000,0.000000,0.000000 +XuiCheckbox +CheckboxInviteOnly + + + + + +GenerationOptions +450.000000 +138.000000 +0.000000,334.000000,0.000000 +XuiBlankScene + + + +CheckboxBonusChest +402.000000 +34.000000 +33.000000,98.000000,0.000000 +XuiCheckbox +false +CheckboxFlatWorld + + + + +CheckboxFlatWorld +402.000000 +34.000000 +33.000000,63.999992,0.000000 +XuiCheckbox +false +CheckboxStructures +CheckboxBonusChest + + + + +CheckboxStructures +402.000000 +34.000000 +33.000000,29.999992,0.000000 +XuiCheckbox +false +..\HostOptions\CheckboxResetNether +CheckboxFlatWorld + + + + +WorldOptions +402.000000 +26.000000 +23.000000,0.000000,0.000000 +XuiLabelDark + + + + +WO_Box +405.000000 +112.000000 +22.999971,23.999985,0.000000 + + + +2.000000 +112.000000 +401.000031,0.000015,0.000000 + + +0xff000000 + + + + +0xff505050 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,49.000000,0.000000,0,49.000000,0.000000,49.000000,0.000000,49.000000,70.000000,0,49.000000,70.000000,49.000000,70.000000,0.000000,70.000000,0,0.000000,70.000000,0.000000,70.000000,0.000000,0.000000,0, + + + + +2.000000 +112.000000 +0.000029,0.000015,0.000000 + + +0xff000000 + + + + +0xff505050 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,49.000000,0.000000,0,49.000000,0.000000,49.000000,0.000000,49.000000,70.000000,0,49.000000,70.000000,49.000000,70.000000,0.000000,70.000000,0,0.000000,70.000000,0.000000,70.000000,0.000000,0.000000,0, + + + + +402.000000 +2.000000 +0.000029,0.000015,0.000000 + + +0xff000000 + + + + +0xff505050 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,49.000000,0.000000,0,49.000000,0.000000,49.000000,0.000000,49.000000,70.000000,0,49.000000,70.000000,49.000000,70.000000,0.000000,70.000000,0,0.000000,70.000000,0.000000,70.000000,0.000000,0.000000,0, + + + + +402.000000 +2.000000 +0.000029,110.000015,0.000000 + + +0xff000000 + + + + +0xff505050 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,49.000000,0.000000,0,49.000000,0.000000,49.000000,0.000000,49.000000,70.000000,0,49.000000,70.000000,49.000000,70.000000,0.000000,70.000000,0,0.000000,70.000000,0.000000,70.000000,0.000000,0.000000,0, + + + + + + +Description +450.000000 +140.000000 +0.000015,496.000000,0.000000 +8 +TipPanel + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options_480.h b/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options_480.h new file mode 100644 index 00000000..b2de27dd --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options_480.h @@ -0,0 +1,18 @@ +#define IDC_CheckboxBonusChest L"CheckboxBonusChest" +#define IDC_CheckboxFlatWorld L"CheckboxFlatWorld" +#define IDC_CheckboxStructures L"CheckboxStructures" +#define IDC_WorldOptions L"WorldOptions" +#define IDC_WO_Box L"WO_Box" +#define IDC_GenerationOptions L"GenerationOptions" +#define IDC_CheckboxResetNether L"CheckboxResetNether" +#define IDC_CheckboxHostPrivileges L"CheckboxHostPrivileges" +#define IDC_CheckboxTNT L"CheckboxTNT" +#define IDC_CheckboxFireSpreads L"CheckboxFireSpreads" +#define IDC_CheckboxTrustSystem L"CheckboxTrustSystem" +#define IDC_CheckboxPVP L"CheckboxPVP" +#define IDC_CheckboxAllowFoF L"CheckboxAllowFoF" +#define IDC_CheckboxInviteOnly L"CheckboxInviteOnly" +#define IDC_CheckboxOnline L"CheckboxOnline" +#define IDC_HostOptions L"HostOptions" +#define IDC_Description L"Description" +#define IDC_MultiGameLaunchMoreOptions L"MultiGameLaunchMoreOptions" diff --git a/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options_480.xui b/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options_480.xui new file mode 100644 index 00000000..976f9260 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_multi_launch_more_options_480.xui @@ -0,0 +1,278 @@ + + +640.000000 +480.000000 + + + +MultiGameLaunchMoreOptions +340.000000 +356.000000 +150.000031,8.500015,0.000000 +CScene_MultiGameLaunchMoreOptions +XuiScene +HostOptions\CheckboxOnline + + + +GenerationOptions +340.000000 +104.000000 +0.000000,244.000000,0.000000 +XuiBlankScene + + + +CheckboxBonusChest +304.000000 +26.000000 +19.000000,77.000000,0.000000 +XuiCheckboxSmall +false +CheckboxFlatWorld + + + + +CheckboxFlatWorld +304.000000 +26.000000 +19.000000,50.999992,0.000000 +XuiCheckboxSmall +false +CheckboxStructures +CheckboxBonusChest + + + + +CheckboxStructures +304.000000 +26.000000 +19.000000,24.999992,0.000000 +XuiCheckboxSmall +false +..\HostOptions\CheckboxResetNether +CheckboxFlatWorld + + + + +WorldOptions +304.000000 +19.000000 +16.000000,0.000000,0.000000 +XuiLabelDarkSmall + + + + +WO_Box +307.000000 +85.000000 +15.999971,18.999985,0.000000 + + + +2.000000 +82.000000 +302.000031,0.000015,0.000000 + + +0xff000000 + + + + +0xff505050 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,49.000000,0.000000,0,49.000000,0.000000,49.000000,0.000000,49.000000,70.000000,0,49.000000,70.000000,49.000000,70.000000,0.000000,70.000000,0,0.000000,70.000000,0.000000,70.000000,0.000000,0.000000,0, + + + + +2.000000 +82.000000 +0.000029,0.000015,0.000000 + + +0xff000000 + + + + +0xff505050 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,49.000000,0.000000,0,49.000000,0.000000,49.000000,0.000000,49.000000,70.000000,0,49.000000,70.000000,49.000000,70.000000,0.000000,70.000000,0,0.000000,70.000000,0.000000,70.000000,0.000000,0.000000,0, + + + + +304.000000 +2.000000 +0.000029,0.000015,0.000000 + + +0xff000000 + + + + +0xff505050 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,49.000000,0.000000,0,49.000000,0.000000,49.000000,0.000000,49.000000,70.000000,0,49.000000,70.000000,49.000000,70.000000,0.000000,70.000000,0,0.000000,70.000000,0.000000,70.000000,0.000000,0.000000,0, + + + + +304.000000 +2.000000 +0.000029,80.000015,0.000000 + + +0xff000000 + + + + +0xff505050 +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,49.000000,0.000000,0,49.000000,0.000000,49.000000,0.000000,49.000000,70.000000,0,49.000000,70.000000,49.000000,70.000000,0.000000,70.000000,0,0.000000,70.000000,0.000000,70.000000,0.000000,0.000000,0, + + + + + + +HostOptions +340.000000 +233.000000 +0.000000,11.000000,0.000000 +XuiBlankScene + + + +CheckboxResetNether +304.000000 +26.000000 +16.000000,207.000000,0.000000 +XuiCheckboxSmall +CheckboxHostPrivileges +..\GenerationOptions\CheckboxStructures + + + + +CheckboxHostPrivileges +304.000000 +26.000000 +16.000000,181.000000,0.000000 +XuiCheckboxSmall +CheckboxTNT +CheckboxResetNether + + + + +CheckboxTNT +304.000000 +26.000000 +16.000000,155.000000,0.000000 +XuiCheckboxSmall +CheckboxFireSpreads +CheckboxHostPrivileges + + + + +CheckboxFireSpreads +304.000000 +26.000000 +16.000000,129.000000,0.000000 +XuiCheckboxSmall +CheckboxTrustSystem +CheckboxTNT + + + + +CheckboxTrustSystem +304.000000 +26.000000 +16.000000,102.999992,0.000000 +XuiCheckboxSmall +CheckboxPVP +CheckboxFireSpreads + + + + +CheckboxPVP +304.000000 +26.000000 +16.000000,76.999992,0.000000 +XuiCheckboxSmall +CheckboxAllowFoF +CheckboxTrustSystem + + + + +CheckboxAllowFoF +304.000000 +25.000000 +16.000000,52.000000,0.000000 +XuiCheckboxSmall +CheckboxInviteOnly +CheckboxPVP + + + + +CheckboxInviteOnly +304.000000 +26.000000 +16.000000,25.999992,0.000000 +XuiCheckboxSmall +CheckboxOnline +CheckboxAllowFoF + + + + +CheckboxOnline +304.000000 +26.000000 +16.000000,-0.000008,0.000000 +XuiCheckboxSmall +CheckboxInviteOnly + + + + + +Description +500.000000 +64.000000 +-80.000000,358.000000,0.000000 +8 +TipPanel +6666666666666666666666 +666666666666666666666666 +6666666666666666666666666 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_partnernetpassword.h b/Minecraft.Client/Common/Media/xuiscene_partnernetpassword.h new file mode 100644 index 00000000..1879db94 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_partnernetpassword.h @@ -0,0 +1,4 @@ +#define IDC_XuiEditPartnernetPassword L"XuiEditPartnernetPassword" +#define IDC_XuiLabel1 L"XuiLabel1" +#define IDC_XuiOK L"XuiOK" +#define IDC_PartnernetPassword L"PartnernetPassword" diff --git a/Minecraft.Client/Common/Media/xuiscene_partnernetpassword.xui b/Minecraft.Client/Common/Media/xuiscene_partnernetpassword.xui new file mode 100644 index 00000000..da9996e7 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_partnernetpassword.xui @@ -0,0 +1,50 @@ + + +1280.000000 +720.000000 + + + +PartnernetPassword +450.000000 +206.000000 +415.000031,210.000031,0.000000 +CScene_PartnernetPassword +XuiScene +XuiEditPartnernetPassword + + + +XuiEditPartnernetPassword +400.000000 +42.000000 +25.000019,54.250000,0.000000 +CXuiCtrl4JEdit +XuiEdit +XuiOK + + + + +XuiLabel1 +341.000000 +32.000008 +24.500015,19.250000,0.000000 +XuiLabelDark +Enter Partnernet Password + + + + +XuiOK +400.000000 +40.000000 +25.000046,140.750031,0.000000 +XuiMainMenuButton_L +XuiEditPartnernetPassword +OK +22528 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_partnernetpassword_480.h b/Minecraft.Client/Common/Media/xuiscene_partnernetpassword_480.h new file mode 100644 index 00000000..1879db94 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_partnernetpassword_480.h @@ -0,0 +1,4 @@ +#define IDC_XuiEditPartnernetPassword L"XuiEditPartnernetPassword" +#define IDC_XuiLabel1 L"XuiLabel1" +#define IDC_XuiOK L"XuiOK" +#define IDC_PartnernetPassword L"PartnernetPassword" diff --git a/Minecraft.Client/Common/Media/xuiscene_partnernetpassword_480.xui b/Minecraft.Client/Common/Media/xuiscene_partnernetpassword_480.xui new file mode 100644 index 00000000..58f68b9c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_partnernetpassword_480.xui @@ -0,0 +1,49 @@ + + +1280.000000 +720.000000 + + + +PartnernetPassword +340.000000 +160.000000 +470.000061,240.000000,0.000000 +CScene_PartnernetPassword +XuiScene +XuiEditPartnernetPassword + + + +XuiEditPartnernetPassword +300.000000 +32.000000 +20.000019,44.000000,0.000000 +CXuiCtrl4JEdit +XuiEdit +XuiOK + + + + +XuiLabel1 +300.000000 +25.000000 +20.000019,14.000000,0.000000 +XuiLabelDarkLeftWrapSmall +Enter Partnernet Password + + + + +XuiOK +300.000000 +20.000015,110.000000,0.000000 +XuiMainMenuButton_L +XuiEditPartnernetPassword +OK +22528 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_pause.h b/Minecraft.Client/Common/Media/xuiscene_pause.h new file mode 100644 index 00000000..6c1b3358 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_pause.h @@ -0,0 +1,7 @@ +#define IDC_XuiButton1 L"XuiButton1" +#define IDC_XuiButton2 L"XuiButton2" +#define IDC_XuiButton3 L"XuiButton3" +#define IDC_XuiButton4 L"XuiButton4" +#define IDC_XuiButton5 L"XuiButton5" +#define IDC_XuiButton6 L"XuiButton6" +#define IDC_ScenePause L"ScenePause" diff --git a/Minecraft.Client/Common/Media/xuiscene_pause.xui b/Minecraft.Client/Common/Media/xuiscene_pause.xui new file mode 100644 index 00000000..679de337 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_pause.xui @@ -0,0 +1,88 @@ + + +1280.000000 +720.000000 + + + +ScenePause +1280.000000 +720.000000 +CScene_Pause +XuiMenuScene +XuiButton1 + + + +XuiButton1 +400.000000 +40.000000 +440.000031,250.000000,0.000000 +XuiMainMenuButton_L +XuiButton6 +XuiButton2 +22528 + + + + +XuiButton2 +400.000000 +40.000000 +440.000092,300.000000,0.000000 +XuiMainMenuButton_L +XuiButton1 +XuiButton3 +22528 + + + + +XuiButton3 +400.000000 +40.000000 +440.000092,350.000000,0.000000 +XuiMainMenuButton_L +XuiButton2 +XuiButton4 +22528 + + + + +XuiButton4 +400.000000 +40.000000 +440.000092,400.000000,0.000000 +XuiMainMenuButton_L +XuiButton3 +XuiButton5 +22528 + + + + +XuiButton5 +400.000000 +40.000000 +440.000092,450.000000,0.000000 +XuiMainMenuButton_L +XuiButton4 +XuiButton6 +22528 + + + + +XuiButton6 +400.000000 +40.000000 +440.000031,500.000000,0.000000 +XuiMainMenuButton_L +XuiButton5 +XuiButton1 +22528 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_pause_480.h b/Minecraft.Client/Common/Media/xuiscene_pause_480.h new file mode 100644 index 00000000..6c1b3358 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_pause_480.h @@ -0,0 +1,7 @@ +#define IDC_XuiButton1 L"XuiButton1" +#define IDC_XuiButton2 L"XuiButton2" +#define IDC_XuiButton3 L"XuiButton3" +#define IDC_XuiButton4 L"XuiButton4" +#define IDC_XuiButton5 L"XuiButton5" +#define IDC_XuiButton6 L"XuiButton6" +#define IDC_ScenePause L"ScenePause" diff --git a/Minecraft.Client/Common/Media/xuiscene_pause_480.xui b/Minecraft.Client/Common/Media/xuiscene_pause_480.xui new file mode 100644 index 00000000..8a0eac2c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_pause_480.xui @@ -0,0 +1,88 @@ + + +640.000000 +480.000000 + + + +ScenePause +640.000000 +480.000000 +CScene_Pause +XuiMenuScene +XuiButton1 + + + +XuiButton1 +300.000000 +36.000000 +170.000000,140.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton6 +XuiButton2 +22528 + + + + +XuiButton2 +300.000000 +36.000000 +170.000061,180.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton1 +XuiButton3 +22528 + + + + +XuiButton3 +300.000000 +36.000000 +170.000061,220.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton2 +XuiButton4 +22528 + + + + +XuiButton4 +300.000000 +36.000000 +170.000061,260.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton3 +XuiButton5 +22528 + + + + +XuiButton5 +300.000000 +36.000000 +170.000061,300.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton4 +XuiButton6 +22528 + + + + +XuiButton6 +300.000000 +36.000000 +170.000000,340.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton5 +XuiButton1 +22528 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_pause_small.h b/Minecraft.Client/Common/Media/xuiscene_pause_small.h new file mode 100644 index 00000000..6c1b3358 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_pause_small.h @@ -0,0 +1,7 @@ +#define IDC_XuiButton1 L"XuiButton1" +#define IDC_XuiButton2 L"XuiButton2" +#define IDC_XuiButton3 L"XuiButton3" +#define IDC_XuiButton4 L"XuiButton4" +#define IDC_XuiButton5 L"XuiButton5" +#define IDC_XuiButton6 L"XuiButton6" +#define IDC_ScenePause L"ScenePause" diff --git a/Minecraft.Client/Common/Media/xuiscene_pause_small.xui b/Minecraft.Client/Common/Media/xuiscene_pause_small.xui new file mode 100644 index 00000000..a384c331 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_pause_small.xui @@ -0,0 +1,88 @@ + + +640.000000 +360.000000 + + + +ScenePause +640.000000 +360.000000 +CScene_Pause +XuiMenuScene +XuiButton1 + + + +XuiButton1 +400.000000 +40.000000 +120.000031,48.000000,0.000000 +XuiMainMenuButton_L +XuiButton6 +XuiButton2 +22528 + + + + +XuiButton2 +400.000000 +40.000000 +120.000092,93.000000,0.000000 +XuiMainMenuButton_L +XuiButton1 +XuiButton3 +22528 + + + + +XuiButton3 +400.000000 +40.000000 +120.000092,138.000000,0.000000 +XuiMainMenuButton_L +XuiButton2 +XuiButton4 +22528 + + + + +XuiButton4 +400.000000 +40.000000 +120.000092,183.000000,0.000000 +XuiMainMenuButton_L +XuiButton3 +XuiButton5 +22528 + + + + +XuiButton5 +400.000000 +40.000000 +120.000092,228.000000,0.000000 +XuiMainMenuButton_L +XuiButton4 +XuiButton6 +22528 + + + + +XuiButton6 +400.000000 +40.000000 +120.000031,273.000000,0.000000 +XuiMainMenuButton_L +XuiButton5 +XuiButton1 +22528 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_reinstall.h b/Minecraft.Client/Common/Media/xuiscene_reinstall.h new file mode 100644 index 00000000..acf50516 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_reinstall.h @@ -0,0 +1,8 @@ +#define IDC_XuiButton1 L"XuiButton1" +#define IDC_XuiButton2 L"XuiButton2" +#define IDC_XuiButton3 L"XuiButton3" +#define IDC_XuiButton4 L"XuiButton4" +#define IDC_XuiButton5 L"XuiButton5" +#define IDC_XuiButton6 L"XuiButton6" +#define IDC_FocusSink L"FocusSink" +#define IDC_SceneReinstall L"SceneReinstall" diff --git a/Minecraft.Client/Common/Media/xuiscene_reinstall.xui b/Minecraft.Client/Common/Media/xuiscene_reinstall.xui new file mode 100644 index 00000000..d8bd92e5 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_reinstall.xui @@ -0,0 +1,89 @@ + + +1280.000000 +720.000000 + + + +SceneReinstall +1280.000000 +720.000000 +CScene_Reinstall +XuiMenuScene +FocusSink + + + +XuiButton1 +450.000000 +40.000000 +415.000000,250.000000,0.000000 +XuiMainMenuButton_L +XuiButton6 +XuiButton2 + + + + +XuiButton2 +450.000000 +40.000000 +415.000000,299.999969,0.000000 +XuiMainMenuButton_L +XuiButton1 +XuiButton3 + + + + +XuiButton3 +450.000000 +40.000000 +415.000000,349.999939,0.000000 +XuiMainMenuButton_L +XuiButton2 +XuiButton4 + + + + +XuiButton4 +450.000000 +40.000000 +415.000000,399.999939,0.000000 +XuiMainMenuButton_L +XuiButton3 +XuiButton5 + + + + +XuiButton5 +450.000000 +40.000000 +415.000000,449.999939,0.000000 +XuiMainMenuButton_L +XuiButton4 +XuiButton6 + + + + +XuiButton6 +450.000000 +40.000000 +415.000000,500.000000,0.000000 +XuiMainMenuButton_L +XuiButton5 +XuiButton1 + + + + +FocusSink +145.000000 +31.000000 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_reinstall_480.h b/Minecraft.Client/Common/Media/xuiscene_reinstall_480.h new file mode 100644 index 00000000..acf50516 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_reinstall_480.h @@ -0,0 +1,8 @@ +#define IDC_XuiButton1 L"XuiButton1" +#define IDC_XuiButton2 L"XuiButton2" +#define IDC_XuiButton3 L"XuiButton3" +#define IDC_XuiButton4 L"XuiButton4" +#define IDC_XuiButton5 L"XuiButton5" +#define IDC_XuiButton6 L"XuiButton6" +#define IDC_FocusSink L"FocusSink" +#define IDC_SceneReinstall L"SceneReinstall" diff --git a/Minecraft.Client/Common/Media/xuiscene_reinstall_480.xui b/Minecraft.Client/Common/Media/xuiscene_reinstall_480.xui new file mode 100644 index 00000000..3778f86c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_reinstall_480.xui @@ -0,0 +1,95 @@ + + +640.000000 +480.000000 + + + +SceneReinstall +640.000000 +480.000000 +CScene_Reinstall +XuiMenuScene +FocusSink + + + +XuiButton1 +300.000000 +36.000000 +170.000000,140.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton6 +XuiButton2 +22528 + + + + +XuiButton2 +300.000000 +36.000000 +170.000061,180.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton1 +XuiButton3 +22528 + + + + +XuiButton3 +300.000000 +36.000000 +170.000061,220.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton2 +XuiButton4 +22528 + + + + +XuiButton4 +300.000000 +36.000000 +170.000061,260.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton3 +XuiButton5 +22528 + + + + +XuiButton5 +300.000000 +36.000000 +170.000061,300.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton4 +XuiButton6 +22528 + + + + +XuiButton6 +300.000000 +36.000000 +170.000000,340.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButton5 +XuiButton1 +22528 + + + + +FocusSink +145.000000 +31.000000 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_reinstall_small.h b/Minecraft.Client/Common/Media/xuiscene_reinstall_small.h new file mode 100644 index 00000000..acf50516 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_reinstall_small.h @@ -0,0 +1,8 @@ +#define IDC_XuiButton1 L"XuiButton1" +#define IDC_XuiButton2 L"XuiButton2" +#define IDC_XuiButton3 L"XuiButton3" +#define IDC_XuiButton4 L"XuiButton4" +#define IDC_XuiButton5 L"XuiButton5" +#define IDC_XuiButton6 L"XuiButton6" +#define IDC_FocusSink L"FocusSink" +#define IDC_SceneReinstall L"SceneReinstall" diff --git a/Minecraft.Client/Common/Media/xuiscene_reinstall_small.xui b/Minecraft.Client/Common/Media/xuiscene_reinstall_small.xui new file mode 100644 index 00000000..bca469e3 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_reinstall_small.xui @@ -0,0 +1,95 @@ + + +640.000000 +360.000000 + + + +SceneReinstall +640.000000 +360.000000 +CScene_Reinstall +XuiMenuScene +FocusSink + + + +XuiButton1 +400.000000 +40.000000 +120.000031,48.000000,0.000000 +XuiMainMenuButton_L +XuiButton6 +XuiButton2 +22528 + + + + +XuiButton2 +400.000000 +40.000000 +120.000092,93.000000,0.000000 +XuiMainMenuButton_L +XuiButton1 +XuiButton3 +22528 + + + + +XuiButton3 +400.000000 +40.000000 +120.000092,138.000000,0.000000 +XuiMainMenuButton_L +XuiButton2 +XuiButton4 +22528 + + + + +XuiButton4 +400.000000 +40.000000 +120.000092,183.000000,0.000000 +XuiMainMenuButton_L +XuiButton3 +XuiButton5 +22528 + + + + +XuiButton5 +400.000000 +40.000000 +120.000092,228.000000,0.000000 +XuiMainMenuButton_L +XuiButton4 +XuiButton6 +22528 + + + + +XuiButton6 +400.000000 +40.000000 +120.000031,273.000000,0.000000 +XuiMainMenuButton_L +XuiButton5 +XuiButton1 +22528 + + + + +FocusSink +145.000000 +31.000000 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_savemessage.h b/Minecraft.Client/Common/Media/xuiscene_savemessage.h new file mode 100644 index 00000000..430e3048 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_savemessage.h @@ -0,0 +1,4 @@ +#define IDC_ConfirmButton L"ConfirmButton" +#define IDC_Description L"Description" +#define IDC_XuiSavingIcon L"XuiSavingIcon" +#define IDC_SceneSaveMessage L"SceneSaveMessage" diff --git a/Minecraft.Client/Common/Media/xuiscene_savemessage.xui b/Minecraft.Client/Common/Media/xuiscene_savemessage.xui new file mode 100644 index 00000000..36a7a975 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_savemessage.xui @@ -0,0 +1,44 @@ + + +1280.000000 +720.000000 + + + +SceneSaveMessage +520.000000 +420.000000 +380.000000,200.000000,0.000000 +CScene_SaveMessage +XuiScene +ConfirmButton + + + +ConfirmButton +410.000000 +40.000000 +55.000000,340.000000,0.000000 +XuiMainMenuButton_L + + + + +Description +450.000000 +190.000000 +35.000000,130.000000,0.000000 +XuiLabelDarkLeftWrap + + + + +XuiSavingIcon +48.000000 +73.000000 +236.000000,37.999996,0.000000 +SaveIcon + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_savemessage_480.h b/Minecraft.Client/Common/Media/xuiscene_savemessage_480.h new file mode 100644 index 00000000..430e3048 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_savemessage_480.h @@ -0,0 +1,4 @@ +#define IDC_ConfirmButton L"ConfirmButton" +#define IDC_Description L"Description" +#define IDC_XuiSavingIcon L"XuiSavingIcon" +#define IDC_SceneSaveMessage L"SceneSaveMessage" diff --git a/Minecraft.Client/Common/Media/xuiscene_savemessage_480.xui b/Minecraft.Client/Common/Media/xuiscene_savemessage_480.xui new file mode 100644 index 00000000..1bc6b610 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_savemessage_480.xui @@ -0,0 +1,44 @@ + + +640.000000 +480.000000 + + + +SceneSaveMessage +400.000000 +280.000000 +119.000000,130.000000,0.000000 +CScene_SaveMessage +XuiScene +ConfirmButton + + + +ConfirmButton +300.000000 +36.000000 +50.000019,218.000000,0.000000 +XuiMainMenuButton_L_Thin + + + + +Description +352.000000 +116.000000 +25.000015,100.000000,0.000000 +XuiLabelDarkLeftWrapSmall + + + + +XuiSavingIcon +48.000000 +73.000000 +176.000092,18.000000,0.000000 +SaveIcon + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_All.h b/Minecraft.Client/Common/Media/xuiscene_settings_All.h new file mode 100644 index 00000000..35da4409 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_All.h @@ -0,0 +1,7 @@ +#define IDC_XuiButtonResetToDefaults L"XuiButtonResetToDefaults" +#define IDC_XuiButtonUI L"XuiButtonUI" +#define IDC_XuiButtonGraphics L"XuiButtonGraphics" +#define IDC_XuiButtonControl L"XuiButtonControl" +#define IDC_XuiButtonAudio L"XuiButtonAudio" +#define IDC_XuiButtonOptions L"XuiButtonOptions" +#define IDC_SceneSettings L"SceneSettings" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_All.xui b/Minecraft.Client/Common/Media/xuiscene_settings_All.xui new file mode 100644 index 00000000..7f02d01c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_All.xui @@ -0,0 +1,91 @@ + + +1280.000000 +720.000000 + + + +SceneSettings +1280.000000 +720.000000 +16 +CScene_SettingsAll +XuiBlankScene +XuiButtonOptions + + + +XuiButtonResetToDefaults +450.000000 +40.000000 +415.000031,500.000000,0.000000 +XuiMainMenuButton_L +XuiButtonUI + + + + +XuiButtonUI +450.000000 +40.000000 +415.000031,450.000000,0.000000 +XuiMainMenuButton_L +XuiButtonGraphics +XuiButtonResetToDefaults + + + + +XuiButtonGraphics +450.000000 +40.000000 +415.000031,400.000000,0.000000 +XuiMainMenuButton_L +XuiButtonControl +XuiButtonUI + + + + +XuiButtonControl +450.000000 +40.000000 +415.000031,350.000000,0.000000 +XuiMainMenuButton_L +XuiButtonAudio +XuiButtonGraphics + + + + +XuiButtonAudio +450.000000 +40.000000 +415.000031,300.000000,0.000000 +XuiMainMenuButton_L +XuiButtonOptions +XuiButtonControl + + + + +XuiButtonOptions +450.000000 +40.000000 +415.000031,250.000015,0.000000 +XuiMainMenuButton_L +XuiButtonAudio + + + + + +Logo +1280.000000 +138.000000 +0.000000,56.000000,0.000000 +true +MenuTitleLogo + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_All_480.h b/Minecraft.Client/Common/Media/xuiscene_settings_All_480.h new file mode 100644 index 00000000..35da4409 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_All_480.h @@ -0,0 +1,7 @@ +#define IDC_XuiButtonResetToDefaults L"XuiButtonResetToDefaults" +#define IDC_XuiButtonUI L"XuiButtonUI" +#define IDC_XuiButtonGraphics L"XuiButtonGraphics" +#define IDC_XuiButtonControl L"XuiButtonControl" +#define IDC_XuiButtonAudio L"XuiButtonAudio" +#define IDC_XuiButtonOptions L"XuiButtonOptions" +#define IDC_SceneSettings L"SceneSettings" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_All_480.xui b/Minecraft.Client/Common/Media/xuiscene_settings_All_480.xui new file mode 100644 index 00000000..6fc8f4c6 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_All_480.xui @@ -0,0 +1,90 @@ + + +640.000000 +480.000000 + + + +SceneSettings +640.000000 +480.000000 +CScene_SettingsAll +XuiBlankScene +XuiButtonOptions + + + +XuiButtonResetToDefaults +300.000000 +36.000000 +170.000015,340.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButtonUI + + + + +XuiButtonUI +300.000000 +36.000000 +170.000015,300.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButtonGraphics +XuiButtonResetToDefaults + + + + +XuiButtonGraphics +300.000000 +36.000000 +170.000015,260.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButtonControl +XuiButtonUI + + + + +XuiButtonControl +300.000000 +36.000000 +170.000015,220.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButtonAudio +XuiButtonGraphics + + + + +XuiButtonAudio +300.000000 +36.000000 +170.000015,180.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButtonOptions +XuiButtonControl + + + + +XuiButtonOptions +300.000000 +36.000000 +170.000015,140.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiButtonAudio + + + + + +Logo +640.000000 +70.000000 +0.000000,48.000000,0.000000 +true +MenuTitleLogo + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_All_small.h b/Minecraft.Client/Common/Media/xuiscene_settings_All_small.h new file mode 100644 index 00000000..35da4409 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_All_small.h @@ -0,0 +1,7 @@ +#define IDC_XuiButtonResetToDefaults L"XuiButtonResetToDefaults" +#define IDC_XuiButtonUI L"XuiButtonUI" +#define IDC_XuiButtonGraphics L"XuiButtonGraphics" +#define IDC_XuiButtonControl L"XuiButtonControl" +#define IDC_XuiButtonAudio L"XuiButtonAudio" +#define IDC_XuiButtonOptions L"XuiButtonOptions" +#define IDC_SceneSettings L"SceneSettings" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_All_small.xui b/Minecraft.Client/Common/Media/xuiscene_settings_All_small.xui new file mode 100644 index 00000000..d0e43651 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_All_small.xui @@ -0,0 +1,82 @@ + + +640.000000 +360.000000 + + + +SceneSettings +320.000000 +263.000000 +160.000000,10.000000,0.000000 +16 +CScene_SettingsAll +XuiBlankScene +XuiButtonOptions + + + +XuiButtonResetToDefaults +297.000000 +40.000000 +11.000000,236.000000,0.000000 +XuiMainMenuButton_L +XuiButtonUI + + + + +XuiButtonUI +297.000000 +40.000000 +11.000000,190.000000,0.000000 +XuiMainMenuButton_L +XuiButtonGraphics +XuiButtonResetToDefaults + + + + +XuiButtonGraphics +297.000000 +40.000000 +11.000000,144.000000,0.000000 +XuiMainMenuButton_L +XuiButtonControl +XuiButtonUI + + + + +XuiButtonControl +297.000000 +40.000000 +11.000000,98.000000,0.000000 +XuiMainMenuButton_L +XuiButtonAudio +XuiButtonGraphics + + + + +XuiButtonAudio +297.000000 +40.000000 +11.000000,52.000000,0.000000 +XuiMainMenuButton_L +XuiButtonOptions +XuiButtonControl + + + + +XuiButtonOptions +297.000000 +40.000000 +11.000000,6.000000,0.000000 +XuiMainMenuButton_L +XuiButtonAudio + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Audio.h b/Minecraft.Client/Common/Media/xuiscene_settings_Audio.h new file mode 100644 index 00000000..fae52564 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Audio.h @@ -0,0 +1,7 @@ +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderSound L"XuiSliderSound" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderMusic L"XuiSliderMusic" +#define IDC_SceneSettingsAudio L"SceneSettingsAudio" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Audio.xui b/Minecraft.Client/Common/Media/xuiscene_settings_Audio.xui new file mode 100644 index 00000000..45ef2912 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Audio.xui @@ -0,0 +1,81 @@ + + +1280.000000 +720.000000 + + + +SceneSettingsAudio +330.000000 +106.000000 +474.000000,250.000000,0.000000 +16 +CScene_SettingsAudio +GraphicPanel +XuiSliderMusic\XuiSlider + + + +XuiSliderSound +306.000000 +38.000000 +12.000031,56.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderMusic\XuiSlider +XuiSliderGamma\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +SchemeList +XuiSliderMusic +XuiSliderGamma + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiSliderMusic +306.000000 +38.000000 +12.000031,12.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiButtonOptions +XuiSliderSound\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider + + + + +FocusSink +520.000000 +70.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Audio_480.h b/Minecraft.Client/Common/Media/xuiscene_settings_Audio_480.h new file mode 100644 index 00000000..fae52564 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Audio_480.h @@ -0,0 +1,7 @@ +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderSound L"XuiSliderSound" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderMusic L"XuiSliderMusic" +#define IDC_SceneSettingsAudio L"SceneSettingsAudio" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Audio_480.xui b/Minecraft.Client/Common/Media/xuiscene_settings_Audio_480.xui new file mode 100644 index 00000000..e4b146c8 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Audio_480.xui @@ -0,0 +1,76 @@ + + +640.000000 +480.000000 + + + +SceneSettingsAudio +320.000000 +108.000000 +160.000031,180.000000,0.000000 +CScene_SettingsAudio +GraphicPanel +XuiSliderMusic\XuiSlider + + + +XuiSliderSound +306.000000 +38.000000 +6.000031,57.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderMusic\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +XuiSlider +SchemeList +XuiSliderMusic +XuiSliderGamma + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiSliderMusic +306.000000 +38.000000 +6.000031,12.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderSound\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +XuiSlider + + + + +FocusSink +320.000000 +70.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Audio_small.h b/Minecraft.Client/Common/Media/xuiscene_settings_Audio_small.h new file mode 100644 index 00000000..fae52564 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Audio_small.h @@ -0,0 +1,7 @@ +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderSound L"XuiSliderSound" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderMusic L"XuiSliderMusic" +#define IDC_SceneSettingsAudio L"SceneSettingsAudio" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Audio_small.xui b/Minecraft.Client/Common/Media/xuiscene_settings_Audio_small.xui new file mode 100644 index 00000000..257a43cc --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Audio_small.xui @@ -0,0 +1,79 @@ + + +640.000000 +360.000000 + + + +SceneSettingsAudio +320.000000 +120.000000 +160.000000,74.000000,0.000000 +16 +CScene_SettingsAudio +GraphicPanel +XuiSliderMusic\XuiSlider + + + +XuiSliderSound +306.000000 +38.000000 +6.000031,61.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderMusic\XuiSlider +XuiSliderGamma\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +XuiSlider +SchemeList +XuiSliderMusic +XuiSliderGamma + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiSliderMusic +306.000000 +38.000000 +6.000031,16.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiButtonOptions +XuiSliderSound\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +XuiSlider + + + + +FocusSink +320.000000 +70.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Control.h b/Minecraft.Client/Common/Media/xuiscene_settings_Control.h new file mode 100644 index 00000000..6fe32d8a --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Control.h @@ -0,0 +1,7 @@ +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderSensitivityInMenu L"XuiSliderSensitivityInMenu" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderSensitivityInGame L"XuiSliderSensitivityInGame" +#define IDC_SceneSettingsControl L"SceneSettingsControl" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Control.xui b/Minecraft.Client/Common/Media/xuiscene_settings_Control.xui new file mode 100644 index 00000000..53a433dc --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Control.xui @@ -0,0 +1,78 @@ + + +1280.000000 +720.000000 + + + +SceneSettingsControl +330.000000 +106.000000 +474.000000,307.000000,0.000000 +16 +CScene_SettingsControl +GraphicPanel +XuiSliderSensitivityInGame\XuiSlider + + + +XuiSliderSensitivityInMenu +306.000000 +38.000000 +12.000031,56.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderSensitivityInGame\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +200 + + + + +FocusSink +306.000000 +38.000000 + + + + + +XuiSliderSensitivityInGame +306.000000 +38.000000 +12.000031,12.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderSensitivityInMenu\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +200 + + + + +FocusSink +306.000000 +38.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Control_480.h b/Minecraft.Client/Common/Media/xuiscene_settings_Control_480.h new file mode 100644 index 00000000..6fe32d8a --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Control_480.h @@ -0,0 +1,7 @@ +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderSensitivityInMenu L"XuiSliderSensitivityInMenu" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderSensitivityInGame L"XuiSliderSensitivityInGame" +#define IDC_SceneSettingsControl L"SceneSettingsControl" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Control_480.xui b/Minecraft.Client/Common/Media/xuiscene_settings_Control_480.xui new file mode 100644 index 00000000..ed23dbb9 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Control_480.xui @@ -0,0 +1,75 @@ + + +640.000000 +480.000000 + + + +SceneSettingsControl +320.000000 +106.000000 +160.000031,187.000015,0.000000 +CScene_SettingsControl +GraphicPanel +XuiSliderSensitivityInGame\XuiSlider + + + +XuiSliderSensitivityInMenu +306.000000 +38.000000 +6.000031,55.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderSensitivityInGame\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +XuiSlider +200 + + + + +FocusSink +306.000000 +38.000000 + + + + + +XuiSliderSensitivityInGame +306.000000 +38.000000 +6.000031,10.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderSensitivityInMenu\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +XuiSlider +200 + + + + +FocusSink +306.000000 +38.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Control_small.h b/Minecraft.Client/Common/Media/xuiscene_settings_Control_small.h new file mode 100644 index 00000000..6fe32d8a --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Control_small.h @@ -0,0 +1,7 @@ +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderSensitivityInMenu L"XuiSliderSensitivityInMenu" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderSensitivityInGame L"XuiSliderSensitivityInGame" +#define IDC_SceneSettingsControl L"SceneSettingsControl" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Control_small.xui b/Minecraft.Client/Common/Media/xuiscene_settings_Control_small.xui new file mode 100644 index 00000000..0fa4bdb3 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Control_small.xui @@ -0,0 +1,76 @@ + + +640.000000 +360.000000 + + + +SceneSettingsControl +320.000000 +120.000000 +160.000015,120.000015,0.000000 +16 +CScene_SettingsControl +GraphicPanel +XuiSliderSensitivityInGame\XuiSlider + + + +XuiSliderSensitivityInMenu +306.000000 +38.000000 +6.000031,55.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderSensitivityInGame\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +XuiSlider +200 + + + + +FocusSink +306.000000 +38.000000 + + + + + +XuiSliderSensitivityInGame +306.000000 +38.000000 +6.000031,10.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderSensitivityInMenu\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +XuiSlider +200 + + + + +FocusSink +306.000000 +38.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Graphics.h b/Minecraft.Client/Common/Media/xuiscene_settings_Graphics.h new file mode 100644 index 00000000..d6553d86 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Graphics.h @@ -0,0 +1,10 @@ +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderInterfaceOpacity L"XuiSliderInterfaceOpacity" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderGamma L"XuiSliderGamma" +#define IDC_XuiCustomSkinAnim L"XuiCustomSkinAnim" +#define IDC_XuiBedrockFog L"XuiBedrockFog" +#define IDC_XuiClouds L"XuiClouds" +#define IDC_SceneSettingsGraphics L"SceneSettingsGraphics" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Graphics.xui b/Minecraft.Client/Common/Media/xuiscene_settings_Graphics.xui new file mode 100644 index 00000000..41252b65 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Graphics.xui @@ -0,0 +1,112 @@ + + +1280.000000 +720.000000 + + + +SceneSettingsGraphics +330.000000 +222.000000 +474.000000,249.000015,0.000000 +16 +CScene_SettingsGraphics +GraphicPanel +XuiClouds + + + +XuiSliderInterfaceOpacity +306.000000 +38.000000 +12.000000,168.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderGamma\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider + + + + +FocusSink +306.000000 +38.000000 + + + + + +XuiSliderGamma +306.000000 +38.000000 +12.000000,124.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiCustomSkinAnim +XuiSliderInterfaceOpacity\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +SchemeList +XuiSliderSound +XuiSliderSensitivity + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiCustomSkinAnim +300.000000 +32.000000 +14.000000,84.000000,0.000000 +5 +XuiBedrockFog +XuiSliderGamma\XuiSlider + + + + +XuiBedrockFog +300.000000 +32.000000 +14.000000,48.000000,0.000000 +5 +XuiClouds +XuiCustomSkinAnim + + + + +XuiClouds +300.000000 +32.000000 +14.000000,12.000000,0.000000 +5 +XuiBedrockFog + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Graphics_480.h b/Minecraft.Client/Common/Media/xuiscene_settings_Graphics_480.h new file mode 100644 index 00000000..d6553d86 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Graphics_480.h @@ -0,0 +1,10 @@ +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderInterfaceOpacity L"XuiSliderInterfaceOpacity" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderGamma L"XuiSliderGamma" +#define IDC_XuiCustomSkinAnim L"XuiCustomSkinAnim" +#define IDC_XuiBedrockFog L"XuiBedrockFog" +#define IDC_XuiClouds L"XuiClouds" +#define IDC_SceneSettingsGraphics L"SceneSettingsGraphics" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Graphics_480.xui b/Minecraft.Client/Common/Media/xuiscene_settings_Graphics_480.xui new file mode 100644 index 00000000..f1080610 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Graphics_480.xui @@ -0,0 +1,111 @@ + + +640.000000 +480.000000 + + + +SceneSettingsGraphics +320.000000 +192.000000 +160.000000,144.000015,0.000000 +CScene_SettingsGraphics +GraphicPanel +XuiClouds + + + +XuiSliderInterfaceOpacity +306.000000 +38.000000 +6.000000,138.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderGamma\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +XuiSlider + + + + +FocusSink +306.000000 +38.000000 + + + + + +XuiSliderGamma +306.000000 +38.000000 +6.000000,94.000000,0.000000 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiCustomSkinAnim +XuiSliderInterfaceOpacity\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +XuiSlider +SchemeList +XuiSliderSound +XuiSliderSensitivity + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiCustomSkinAnim +300.000000 +20.000000 +9.000000,62.000000,0.000000 +5 +XuiCheckboxSmall +XuiBedrockFog +XuiSliderGamma\XuiSlider + + + + +XuiBedrockFog +300.000000 +20.000000 +9.000000,38.000000,0.000000 +5 +XuiCheckboxSmall +XuiClouds +XuiCustomSkinAnim + + + + +XuiClouds +300.000000 +20.000000 +9.000000,14.000000,0.000000 +5 +XuiCheckboxSmall +XuiBedrockFog + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Graphics_small.h b/Minecraft.Client/Common/Media/xuiscene_settings_Graphics_small.h new file mode 100644 index 00000000..d6553d86 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Graphics_small.h @@ -0,0 +1,10 @@ +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderInterfaceOpacity L"XuiSliderInterfaceOpacity" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderGamma L"XuiSliderGamma" +#define IDC_XuiCustomSkinAnim L"XuiCustomSkinAnim" +#define IDC_XuiBedrockFog L"XuiBedrockFog" +#define IDC_XuiClouds L"XuiClouds" +#define IDC_SceneSettingsGraphics L"SceneSettingsGraphics" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_Graphics_small.xui b/Minecraft.Client/Common/Media/xuiscene_settings_Graphics_small.xui new file mode 100644 index 00000000..ea12d77b --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_Graphics_small.xui @@ -0,0 +1,112 @@ + + +640.000000 +360.000000 + + + +SceneSettingsGraphics +320.000000 +224.000000 +160.000000,68.000015,0.000000 +16 +CScene_SettingsGraphics +GraphicPanel +XuiClouds + + + +XuiSliderInterfaceOpacity +306.000000 +38.000000 +6.000000,158.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderGamma\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +XuiSlider + + + + +FocusSink +306.000000 +38.000000 + + + + + +XuiSliderGamma +306.000000 +38.000000 +6.000000,112.000000,0.000000 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiCustomSkinAnim +XuiSliderInterfaceOpacity\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +XuiSlider +SchemeList +XuiSliderSound +XuiSliderSensitivity + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiCustomSkinAnim +300.000000 +20.000000 +9.000000,68.000000,0.000000 +5 +XuiCheckboxSmall +XuiBedrockFog +XuiSliderGamma\XuiSlider + + + + +XuiBedrockFog +300.000000 +20.000000 +9.000000,38.000000,0.000000 +5 +XuiCheckboxSmall +XuiClouds +XuiCustomSkinAnim + + + + +XuiClouds +300.000000 +20.000000 +9.000000,8.000000,0.000000 +5 +XuiCheckboxSmall +XuiBedrockFog + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_UI.h b/Minecraft.Client/Common/Media/xuiscene_settings_UI.h new file mode 100644 index 00000000..f766a610 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_UI.h @@ -0,0 +1,13 @@ +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderUISizeSplitscreen L"XuiSliderUISizeSplitscreen" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderUISize L"XuiSliderUISize" +#define IDC_XuiShowSplitscreenGamertags L"XuiShowSplitscreenGamertags" +#define IDC_XuiSplitScreen L"XuiSplitScreen" +#define IDC_XuiShowAnimatedCharacter L"XuiShowAnimatedCharacter" +#define IDC_XuiDisplayDeathMessages L"XuiDisplayDeathMessages" +#define IDC_XuiDisplayHand L"XuiDisplayHand" +#define IDC_XuiDisplayHUD L"XuiDisplayHUD" +#define IDC_SceneSettingsUI L"SceneSettingsUI" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_UI.xui b/Minecraft.Client/Common/Media/xuiscene_settings_UI.xui new file mode 100644 index 00000000..a51c2ed2 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_UI.xui @@ -0,0 +1,152 @@ + + +1280.000000 +720.000000 + + + +SceneSettingsUI +330.000000 +328.000000 +474.000000,214.000000,0.000000 +16 +CScene_SettingsUI +GraphicPanel +XuiDisplayHUD + + + +XuiSliderUISizeSplitscreen +306.000000 +38.000000 +12.000000,274.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderUISize\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +1 +3 +1 + + + + +FocusSink +306.000000 +38.000000 + + + + + +XuiSliderUISize +306.000000 +38.000000 +12.000000,230.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiShowSplitscreenGamertags +XuiSliderUISizeSplitscreen\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +SchemeList +XuiSliderSound +XuiSliderSensitivity +1 +3 +1 + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiShowSplitscreenGamertags +300.000000 +32.000000 +14.000000,188.000000,0.000000 +5 +XuiSplitScreen +XuiSliderUISize\XuiSlider + + + + +XuiSplitScreen +300.000000 +32.000000 +14.000000,156.000000,0.000000 +5 +XuiShowAnimatedCharacter +XuiShowSplitscreenGamertags + + + + +XuiShowAnimatedCharacter +300.000000 +32.000000 +14.000000,120.000000,0.000000 +5 +XuiDisplayDeathMessages +XuiSplitScreen + + + + +XuiDisplayDeathMessages +300.000000 +32.000000 +14.000000,84.000000,0.000000 +5 +XuiDisplayHand +XuiShowAnimatedCharacter + + + + +XuiDisplayHand +300.000000 +32.000000 +14.000000,48.000000,0.000000 +5 +XuiDisplayHUD +XuiDisplayDeathMessages + + + + +XuiDisplayHUD +300.000000 +32.000000 +14.000000,12.000000,0.000000 +5 +XuiDisplayHand +XuiDisplayHand + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_UI_480.h b/Minecraft.Client/Common/Media/xuiscene_settings_UI_480.h new file mode 100644 index 00000000..f766a610 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_UI_480.h @@ -0,0 +1,13 @@ +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderUISizeSplitscreen L"XuiSliderUISizeSplitscreen" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderUISize L"XuiSliderUISize" +#define IDC_XuiShowSplitscreenGamertags L"XuiShowSplitscreenGamertags" +#define IDC_XuiSplitScreen L"XuiSplitScreen" +#define IDC_XuiShowAnimatedCharacter L"XuiShowAnimatedCharacter" +#define IDC_XuiDisplayDeathMessages L"XuiDisplayDeathMessages" +#define IDC_XuiDisplayHand L"XuiDisplayHand" +#define IDC_XuiDisplayHUD L"XuiDisplayHUD" +#define IDC_SceneSettingsUI L"SceneSettingsUI" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_UI_480.xui b/Minecraft.Client/Common/Media/xuiscene_settings_UI_480.xui new file mode 100644 index 00000000..028377f0 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_UI_480.xui @@ -0,0 +1,157 @@ + + +640.000000 +480.000000 + + + +SceneSettingsUI +320.000000 +250.000000 +160.000000,134.000000,0.000000 +16 +CScene_SettingsUI +GraphicPanel +XuiDisplayHUD + + + +XuiSliderUISizeSplitscreen +306.000000 +38.000000 +6.000000,204.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderUISize\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +1 +3 +1 + + + + +FocusSink +306.000000 +38.000000 + + + + + +XuiSliderUISize +306.000000 +38.000000 +6.000000,162.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiShowSplitscreenGamertags +XuiSliderUISizeSplitscreen\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +SchemeList +XuiSliderSound +XuiSliderSensitivity +1 +3 +1 + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiShowSplitscreenGamertags +300.000000 +20.000000 +9.000000,136.000000,0.000000 +5 +XuiCheckboxSmall +XuiSplitScreen +XuiSliderUISize\XuiSlider + + + + +XuiSplitScreen +300.000000 +20.000000 +9.000000,112.000000,0.000000 +5 +XuiCheckboxSmall +XuiShowAnimatedCharacter +XuiShowSplitscreenGamertags + + + + +XuiShowAnimatedCharacter +300.000000 +20.000000 +9.000000,88.000000,0.000000 +5 +XuiCheckboxSmall +XuiDisplayDeathMessages +XuiSplitScreen + + + + +XuiDisplayDeathMessages +300.000000 +20.000000 +9.000000,64.000000,0.000000 +5 +XuiCheckboxSmall +XuiDisplayHand +XuiShowAnimatedCharacter + + + + +XuiDisplayHand +300.000000 +20.000000 +9.000000,40.000000,0.000000 +5 +XuiCheckboxSmall +XuiDisplayHUD +XuiDisplayDeathMessages + + + + +XuiDisplayHUD +300.000000 +20.000000 +9.000000,16.000000,0.000000 +5 +XuiCheckboxSmall +XuiDisplayHand + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_UI_small.h b/Minecraft.Client/Common/Media/xuiscene_settings_UI_small.h new file mode 100644 index 00000000..f766a610 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_UI_small.h @@ -0,0 +1,13 @@ +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderUISizeSplitscreen L"XuiSliderUISizeSplitscreen" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderUISize L"XuiSliderUISize" +#define IDC_XuiShowSplitscreenGamertags L"XuiShowSplitscreenGamertags" +#define IDC_XuiSplitScreen L"XuiSplitScreen" +#define IDC_XuiShowAnimatedCharacter L"XuiShowAnimatedCharacter" +#define IDC_XuiDisplayDeathMessages L"XuiDisplayDeathMessages" +#define IDC_XuiDisplayHand L"XuiDisplayHand" +#define IDC_XuiDisplayHUD L"XuiDisplayHUD" +#define IDC_SceneSettingsUI L"SceneSettingsUI" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_UI_small.xui b/Minecraft.Client/Common/Media/xuiscene_settings_UI_small.xui new file mode 100644 index 00000000..973b2c72 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_UI_small.xui @@ -0,0 +1,157 @@ + + +640.000000 +360.000000 + + + +SceneSettingsUI +320.000000 +294.000000 +160.000000,10.000000,0.000000 +16 +CScene_SettingsUI +GraphicPanel +XuiDisplayHUD + + + +XuiSliderUISizeSplitscreen +306.000000 +38.000000 +6.000000,242.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderUISize\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +1 +3 +1 + + + + +FocusSink +306.000000 +38.000000 + + + + + +XuiSliderUISize +306.000000 +38.000000 +6.000000,196.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiShowSplitscreenGamertags +XuiSliderUISizeSplitscreen\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +SchemeList +XuiSliderSound +XuiSliderSensitivity +1 +3 +1 + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiShowSplitscreenGamertags +300.000000 +20.000000 +9.000000,164.000000,0.000000 +5 +XuiCheckboxSmall +XuiSplitScreen +XuiSliderUISize\XuiSlider + + + + +XuiSplitScreen +300.000000 +20.000000 +9.000000,134.000000,0.000000 +5 +XuiCheckboxSmall +XuiShowAnimatedCharacter +XuiShowSplitscreenGamertags + + + + +XuiShowAnimatedCharacter +300.000000 +20.000000 +9.000000,104.000000,0.000000 +5 +XuiCheckboxSmall +XuiDisplayDeathMessages +XuiSplitScreen + + + + +XuiDisplayDeathMessages +300.000000 +20.000000 +9.000000,74.000000,0.000000 +5 +XuiCheckboxSmall +XuiDisplayHand +XuiShowAnimatedCharacter + + + + +XuiDisplayHand +300.000000 +20.000000 +9.000000,44.000000,0.000000 +5 +XuiCheckboxSmall +XuiDisplayHUD +XuiDisplayDeathMessages + + + + +XuiDisplayHUD +300.000000 +20.000000 +9.000000,14.000000,0.000000 +5 +XuiCheckboxSmall +XuiDisplayHand + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_options.h b/Minecraft.Client/Common/Media/xuiscene_settings_options.h new file mode 100644 index 00000000..3c2c6140 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_options.h @@ -0,0 +1,13 @@ +#define IDC_XuiDifficultyText L"XuiDifficultyText" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderDifficulty L"XuiSliderDifficulty" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderAutosave L"XuiSliderAutosave" +#define IDC_XuiMashUpWorlds L"XuiMashUpWorlds" +#define IDC_XuiInGameGamertags L"XuiInGameGamertags" +#define IDC_XuiShowTooltips L"XuiShowTooltips" +#define IDC_XuiShowHints L"XuiShowHints" +#define IDC_XuiViewBob L"XuiViewBob" +#define IDC_SceneSettingsOptions L"SceneSettingsOptions" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_options.xui b/Minecraft.Client/Common/Media/xuiscene_settings_options.xui new file mode 100644 index 00000000..86311f20 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_options.xui @@ -0,0 +1,144 @@ + + +1280.000000 +720.000000 + + + +SceneSettingsOptions +330.000000 +266.000000 +474.000000,250.000000,0.000000 +16 +CScene_SettingsOptions +GraphicPanel +XuiViewBob + + + +XuiDifficultyText +900.000000 +100.000000 +-285.000000,275.000000,0.000000 +16 +TipPanel + + + + +XuiSliderDifficulty +306.000000 +38.000000 +12.000000,214.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderAutosave\XuiSlider +XuiSliderMusic\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +3 + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiSliderAutosave +306.000000 +38.000000 +12.000000,170.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiMashUpWorlds +XuiSliderDifficulty\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +8 + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiMashUpWorlds +300.000000 +32.000000 +14.000000,132.000000,0.000000 +5 +XuiInGameGamertags +XuiSliderAutosave\XuiSlider + + + + +XuiInGameGamertags +300.000000 +32.000000 +14.000000,102.000000,0.000000 +5 +XuiShowTooltips +XuiMashUpWorlds + + + + +XuiShowTooltips +300.000000 +32.000000 +14.000000,72.000000,0.000000 +5 +XuiShowHints +XuiInGameGamertags + + + + +XuiShowHints +300.000000 +32.000000 +14.000000,42.000000,0.000000 +5 +XuiViewBob +XuiShowTooltips + + + + +XuiViewBob +300.000000 +32.000000 +14.000000,12.000000,0.000000 +5 +XuiShowHints + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_options_480.h b/Minecraft.Client/Common/Media/xuiscene_settings_options_480.h new file mode 100644 index 00000000..3c2c6140 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_options_480.h @@ -0,0 +1,13 @@ +#define IDC_XuiDifficultyText L"XuiDifficultyText" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderDifficulty L"XuiSliderDifficulty" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderAutosave L"XuiSliderAutosave" +#define IDC_XuiMashUpWorlds L"XuiMashUpWorlds" +#define IDC_XuiInGameGamertags L"XuiInGameGamertags" +#define IDC_XuiShowTooltips L"XuiShowTooltips" +#define IDC_XuiShowHints L"XuiShowHints" +#define IDC_XuiViewBob L"XuiViewBob" +#define IDC_SceneSettingsOptions L"SceneSettingsOptions" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_options_480.xui b/Minecraft.Client/Common/Media/xuiscene_settings_options_480.xui new file mode 100644 index 00000000..a5b0d5d1 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_options_480.xui @@ -0,0 +1,146 @@ + + +640.000000 +480.000000 + + + +SceneSettingsOptions +320.000000 +230.000000 +160.000000,120.000000,0.000000 +CScene_SettingsOptions +GraphicPanel +XuiViewBob + + + +XuiDifficultyText +512.000000 +62.000000 +-104.000000,234.000000,0.000000 +TipPanel + + + + +XuiSliderDifficulty +306.000000 +38.000000 +8.000000,180.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderAutosave\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +3 + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiSliderAutosave +306.000000 +38.000000 +8.000000,138.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiMashUpWorlds +XuiSliderDifficulty\XuiSlider +FocusSink + + + +XuiSlider +306.000000 +38.000000 +5 +XuiSlider +8 + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiMashUpWorlds +300.000000 +20.000000 +9.000000,110.000000,0.000000 +5 +XuiCheckboxSmall +XuiInGameGamertags +XuiSliderAutosave\XuiSlider + + + + +XuiInGameGamertags +300.000000 +20.000000 +9.000000,86.000000,0.000000 +5 +XuiCheckboxSmall +XuiShowTooltips +XuiMashUpWorlds + + + + +XuiShowTooltips +300.000000 +20.000000 +9.000000,62.000000,0.000000 +5 +XuiCheckboxSmall +XuiShowHints +XuiInGameGamertags + + + + +XuiShowHints +300.000000 +20.000000 +9.000000,38.000000,0.000000 +5 +XuiCheckboxSmall +XuiViewBob +XuiShowTooltips + + + + +XuiViewBob +300.000000 +20.000000 +9.000000,14.000000,0.000000 +5 +XuiCheckboxSmall +XuiShowHints + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_options_small.h b/Minecraft.Client/Common/Media/xuiscene_settings_options_small.h new file mode 100644 index 00000000..3c2c6140 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_options_small.h @@ -0,0 +1,13 @@ +#define IDC_XuiDifficultyText L"XuiDifficultyText" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderDifficulty L"XuiSliderDifficulty" +#define IDC_XuiSlider L"XuiSlider" +#define IDC_FocusSink L"FocusSink" +#define IDC_XuiSliderAutosave L"XuiSliderAutosave" +#define IDC_XuiMashUpWorlds L"XuiMashUpWorlds" +#define IDC_XuiInGameGamertags L"XuiInGameGamertags" +#define IDC_XuiShowTooltips L"XuiShowTooltips" +#define IDC_XuiShowHints L"XuiShowHints" +#define IDC_XuiViewBob L"XuiViewBob" +#define IDC_SceneSettingsOptions L"SceneSettingsOptions" diff --git a/Minecraft.Client/Common/Media/xuiscene_settings_options_small.xui b/Minecraft.Client/Common/Media/xuiscene_settings_options_small.xui new file mode 100644 index 00000000..230fc264 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_settings_options_small.xui @@ -0,0 +1,148 @@ + + +640.000000 +360.000000 + + + +SceneSettingsOptions +320.000000 +250.000000 +160.000000,69.000015,0.000000 +16 +CScene_SettingsOptions +GraphicPanel +XuiViewBob + + + +XuiDifficultyText +540.000000 +110.000000 +-109.999969,254.000000,0.000000 +false +TipPanel + + + + +XuiSliderDifficulty +300.000000 +38.000000 +9.000000,192.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiSliderAutosave\XuiSlider +FocusSink + + + +XuiSlider +300.000000 +38.000000 +5 +XuiSlider +3 + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiSliderAutosave +300.000000 +38.000000 +9.000000,150.000000,0.000000 +5 +CXuiCtrlSliderWrapper +XuiSliderWrapper +XuiMashUpWorlds +XuiSliderDifficulty\XuiSlider +FocusSink + + + +XuiSlider +300.000000 +38.000000 +5 +XuiSlider +8 + + + + +FocusSink +1.000000 +1.000000 + + + + + +XuiMashUpWorlds +300.000000 +20.000000 +9.000000,120.000000,0.000000 +5 +XuiCheckboxSmall +XuiInGameGamertags +XuiSliderAutosave\XuiSlider + + + + +XuiInGameGamertags +300.000000 +20.000000 +9.000000,92.000000,0.000000 +5 +XuiCheckboxSmall +XuiShowTooltips +XuiMashUpWorlds + + + + +XuiShowTooltips +300.000000 +20.000000 +9.000000,64.000000,0.000000 +5 +XuiCheckboxSmall +XuiShowHints +XuiInGameGamertags + + + + +XuiShowHints +300.000000 +20.000000 +9.000000,36.000000,0.000000 +5 +XuiCheckboxSmall +XuiViewBob +XuiShowTooltips + + + + +XuiViewBob +300.000000 +20.000000 +9.000000,8.000000,0.000000 +5 +XuiCheckboxSmall +XuiShowHints + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_signentry.h b/Minecraft.Client/Common/Media/xuiscene_signentry.h new file mode 100644 index 00000000..e1825936 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_signentry.h @@ -0,0 +1,8 @@ +#define IDC_BackgroundImage L"BackgroundImage" +#define IDC_EditLineOne L"EditLineOne" +#define IDC_EditLineTwo L"EditLineTwo" +#define IDC_EditLineThree L"EditLineThree" +#define IDC_EditLineFour L"EditLineFour" +#define IDC_ButtonDone L"ButtonDone" +#define IDC_EditSignMessage L"EditSignMessage" +#define IDC_SceneSignEntry L"SceneSignEntry" diff --git a/Minecraft.Client/Common/Media/xuiscene_signentry.xui b/Minecraft.Client/Common/Media/xuiscene_signentry.xui new file mode 100644 index 00000000..ab77aa1e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_signentry.xui @@ -0,0 +1,110 @@ + + +1280.000000 +720.000000 + + + +SceneSignEntry +1280.000000 +720.000000 +CScene_SignEntry +XuiMenuScene +EditLineOne + + + +BackgroundImage +288.000000 +312.000000 +496.000000,200.000000,0.000000 +SignEntrySceneBackground + + + + +EditLineOne +268.000000 +42.000000 +506.000000,206.000000,0.000000 +CXuiCtrl4JEdit +XuiEditSign +EditLineTwo +EditLineTwo +ButtonDone +15 + !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»ã + + + + +EditLineTwo +268.000000 +42.000000 +506.000000,236.000000,0.000000 +CXuiCtrl4JEdit +XuiEditSign +EditLineOne +EditLineThree +EditLineThree +EditLineOne +15 + !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»ã + + + + +EditLineThree +268.000000 +42.000000 +506.000000,266.000000,0.000000 +CXuiCtrl4JEdit +XuiEditSign +EditLineTwo +EditLineFour +EditLineFour +EditLineTwo +15 + !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»ã + + + + +EditLineFour +268.000000 +42.000000 +506.000000,296.000000,0.000000 +CXuiCtrl4JEdit +XuiEditSign +EditLineThree +ButtonDone +ButtonDone +EditLineThree +15 + !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»ã + + + + +ButtonDone +400.000000 +40.000000 +440.000000,520.000000,0.000000 +XuiMainMenuButton_L +EditLineFour +EditLineOne +EditLineFour +22528 + + + + +EditSignMessage +372.000000 +47.000000 +454.000031,150.000000,0.000000 +XuiLabelLight_ShadowCentred + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_signentry_480.h b/Minecraft.Client/Common/Media/xuiscene_signentry_480.h new file mode 100644 index 00000000..e1825936 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_signentry_480.h @@ -0,0 +1,8 @@ +#define IDC_BackgroundImage L"BackgroundImage" +#define IDC_EditLineOne L"EditLineOne" +#define IDC_EditLineTwo L"EditLineTwo" +#define IDC_EditLineThree L"EditLineThree" +#define IDC_EditLineFour L"EditLineFour" +#define IDC_ButtonDone L"ButtonDone" +#define IDC_EditSignMessage L"EditSignMessage" +#define IDC_SceneSignEntry L"SceneSignEntry" diff --git a/Minecraft.Client/Common/Media/xuiscene_signentry_480.xui b/Minecraft.Client/Common/Media/xuiscene_signentry_480.xui new file mode 100644 index 00000000..64537c63 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_signentry_480.xui @@ -0,0 +1,110 @@ + + +640.000000 +480.000000 + + + +SceneSignEntry +640.000000 +480.000000 +CScene_SignEntry +XuiMenuScene +EditLineOne + + + +BackgroundImage +288.000000 +187.000000 +176.000000,140.000000,0.000000 +SignEntrySceneBackground + + + + +EditLineOne +266.000000 +42.000000 +187.000015,146.000000,0.000000 +CXuiCtrl4JEdit +XuiEditSign +EditLineTwo +EditLineTwo +ButtonDone +15 + !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»ã + + + + +EditLineTwo +266.000000 +42.000000 +187.000015,176.000000,0.000000 +CXuiCtrl4JEdit +XuiEditSign +EditLineOne +EditLineThree +EditLineThree +EditLineOne +15 + !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»ã + + + + +EditLineThree +266.000000 +42.000000 +187.000015,206.000000,0.000000 +CXuiCtrl4JEdit +XuiEditSign +EditLineTwo +EditLineFour +EditLineFour +EditLineTwo +15 + !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»ã + + + + +EditLineFour +266.000000 +42.000000 +187.000031,236.000000,0.000000 +CXuiCtrl4JEdit +XuiEditSign +EditLineThree +ButtonDone +ButtonDone +EditLineThree +15 + !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»ã + + + + +ButtonDone +300.000000 +36.000000 +170.000031,340.000000,0.000000 +XuiMainMenuButton_L_Thin +EditLineFour +EditLineOne +EditLineFour +22528 + + + + +EditSignMessage +372.000000 +47.000000 +134.000015,96.000000,0.000000 +XuiLabelLight_ShadowCentred + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_signentry_small.h b/Minecraft.Client/Common/Media/xuiscene_signentry_small.h new file mode 100644 index 00000000..e1825936 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_signentry_small.h @@ -0,0 +1,8 @@ +#define IDC_BackgroundImage L"BackgroundImage" +#define IDC_EditLineOne L"EditLineOne" +#define IDC_EditLineTwo L"EditLineTwo" +#define IDC_EditLineThree L"EditLineThree" +#define IDC_EditLineFour L"EditLineFour" +#define IDC_ButtonDone L"ButtonDone" +#define IDC_EditSignMessage L"EditSignMessage" +#define IDC_SceneSignEntry L"SceneSignEntry" diff --git a/Minecraft.Client/Common/Media/xuiscene_signentry_small.xui b/Minecraft.Client/Common/Media/xuiscene_signentry_small.xui new file mode 100644 index 00000000..82502f68 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_signentry_small.xui @@ -0,0 +1,109 @@ + + +640.000000 +360.000000 + + + +SceneSignEntry +640.000000 +360.000000 +CScene_SignEntry +XuiMenuScene +EditLineOne + + + +BackgroundImage +288.000000 +187.000000 +176.000000,45.000000,0.000000 +SignEntrySceneBackground + + + + +EditLineOne +266.200012 +28.000000 +186.900055,50.000000,0.000000 +CXuiCtrl4JEdit +XuiEditSign +EditLineTwo +EditLineTwo +ButtonDone +15 + !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»ã + + + + +EditLineTwo +266.200012 +28.000000 +186.900055,84.000000,0.000000 +CXuiCtrl4JEdit +XuiEditSign +EditLineOne +EditLineThree +EditLineThree +EditLineOne +15 + !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»ã + + + + +EditLineThree +266.200012 +28.000000 +186.900055,118.000000,0.000000 +CXuiCtrl4JEdit +XuiEditSign +EditLineTwo +EditLineFour +EditLineFour +EditLineTwo +15 + !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»ã + + + + +EditLineFour +266.200012 +28.000000 +186.900055,152.000000,0.000000 +CXuiCtrl4JEdit +XuiEditSign +EditLineThree +ButtonDone +ButtonDone +EditLineThree +15 + !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»ã + + + + +ButtonDone +300.000000 +40.000000 +170.000031,240.000000,0.000000 +XuiMainMenuButton_L +EditLineFour +EditLineOne +EditLineFour +22528 + + + + +EditSignMessage +447.000000 +96.000015,14.000000,0.000000 +XuiLabelLight_ShadowCentred + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_skinselect.h b/Minecraft.Client/Common/Media/xuiscene_skinselect.h new file mode 100644 index 00000000..525388bf --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_skinselect.h @@ -0,0 +1,45 @@ +#define IDC_BackgroundTint L"BackgroundTint" +#define IDC_CharacterPrevious4 L"CharacterPrevious4" +#define IDC_CharacterPrevious3 L"CharacterPrevious3" +#define IDC_CharacterPrevious2 L"CharacterPrevious2" +#define IDC_CharacterPrevious1 L"CharacterPrevious1" +#define IDC_CharacterNext4 L"CharacterNext4" +#define IDC_CharacterNext3 L"CharacterNext3" +#define IDC_CharacterNext2 L"CharacterNext2" +#define IDC_CharacterNext1 L"CharacterNext1" +#define IDC_Character L"Character" +#define IDC_Characters L"Characters" +#define IDC_Baseline L"Baseline" +#define IDC_Normal L"Normal" +#define IDC_BaselineSelected L"BaselineSelected" +#define IDC_NormalSelected L"NormalSelected" +#define IDC_Selected L"Selected" +#define IDC_TabBar L"TabBar" +#define IDC_Left L"Left" +#define IDC_Right L"Right" +#define IDC_Center L"Center" +#define IDC_PackGroup L"PackGroup" +#define IDC_SkinName L"SkinName" +#define IDC_OriginName L"OriginName" +#define IDC_SkinDetails L"SkinDetails" +#define IDC_Locked L"Locked" +#define IDC_SelectedText L"SelectedText" +#define IDC_SelectedGroup L"SelectedGroup" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_SceneSkinSelect L"SceneSkinSelect" diff --git a/Minecraft.Client/Common/Media/xuiscene_skinselect.xui b/Minecraft.Client/Common/Media/xuiscene_skinselect.xui new file mode 100644 index 00000000..0d5019d4 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_skinselect.xui @@ -0,0 +1,1575 @@ + + +1280.000000 +720.000000 + + + +SceneSkinSelect +1280.000000 +720.000000 +CScene_SkinSelect +XuiBlankScene +SkinDetails + + + +BackgroundTint +1280.000000 +464.000000 +0.000000,142.000000,0.000000 + + +0xff0f0f80 + + + + +0x800f0f0f +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,1221.000000,0.000000,0,1221.000000,0.000000,1221.000000,0.000000,1221.000000,352.000000,0,1221.000000,352.000000,1221.000000,352.000000,0.000000,352.000000,0,0.000000,352.000000,0.000000,352.000000,0.000000,0.000000,0, + + + + +Characters +1280.000000 +350.000000 +0.000000,198.000000,0.000000 +XuiBlankScene + + + +CharacterPrevious4 +97.000000 +120.000000 +-83.999886,90.000046,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterPrevious3 +122.000000 +150.000000 +23.000114,75.000046,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterPrevious2 +153.000000 +188.000000 +155.000092,56.000046,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterPrevious1 +192.000000 +235.000000 +318.000092,33.000046,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterNext4 +97.000000 +120.000000 +1267.000000,90.000046,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterNext3 +122.000000 +150.000000 +1135.000000,75.000046,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterNext2 +153.000000 +188.000000 +971.999878,56.000046,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterNext1 +192.000000 +235.000000 +769.999939,33.000046,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +Character +240.000000 +294.000000 +520.000000,3.000046,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + + +Normal + +stop + + +CycleLeft + + + +EndCycleLeft + +stop + + +CycleRight + + + +EndCycleRight + +stop + + + +Character +Position +Width +Height + + +0 +520.000000,3.000046,0.000000 +240.000000 +294.000000 + + + +0 +520.000000,3.000046,0.000000 +240.000000 +294.000000 + + + +0 +318.000000,33.000046,0.000000 +192.000000 +235.000000 + + + +0 +520.000000,3.000046,0.000000 +240.000000 +294.000000 + + + +0 +770.000000,33.000046,0.000000 +192.000000 +235.000000 + + + +CharacterNext1 +Position +Width +Height + + +0 +769.999939,33.000046,0.000000 +192.000000 +235.000000 + + + +0 +769.999939,32.991196,0.000000 +192.000000 +235.000000 + + + +0 +520.000000,3.000046,0.000000 +240.000000 +294.000000 + + + +0 +769.999939,33.000046,0.000000 +192.000000 +235.000000 + + + +0 +972.000000,56.000046,0.000000 +153.000000 +188.000000 + + + +CharacterNext2 +Position +Width +Height + + +0 +971.999878,56.000046,0.000000 +153.000000 +188.000000 + + + +0 +971.999878,55.991196,0.000000 +153.000000 +188.000000 + + + +0 +770.000000,33.000046,0.000000 +192.000000 +235.000000 + + + +0 +971.999878,56.000046,0.000000 +153.000000 +188.000000 + + + +0 +1135.000000,75.000046,0.000000 +122.000000 +150.000000 + + + +CharacterNext3 +Position +Width +Height + + +0 +1135.000000,75.000046,0.000000 +122.000000 +150.000000 + + + +0 +1135.000000,74.991196,0.000000 +122.000000 +150.000000 + + + +0 +972.000000,56.000046,0.000000 +153.000000 +188.000000 + + + +0 +1135.000000,75.000046,0.000000 +122.000000 +150.000000 + + + +0 +1267.000000,90.000046,0.000000 +97.000000 +120.000000 + + + +CharacterNext4 +Position +Width +Height + + +0 +1267.000000,90.000046,0.000000 +97.000000 +120.000000 + + + +0 +1267.000000,89.991196,0.000000 +97.000000 +120.000000 + + + +0 +1135.000000,75.000046,0.000000 +122.000000 +150.000000 + + + +0 +1267.000000,90.000046,0.000000 +97.000000 +120.000000 + + + +0 +1555.000000,90.000046,0.000000 +97.000000 +120.000000 + + + +CharacterPrevious1 +Position +Width +Height + + +0 +318.000092,33.000046,0.000000 +192.000000 +235.000000 + + + +0 +318.000092,32.991196,0.000000 +192.000000 +235.000000 + + + +0 +155.000000,56.000046,0.000000 +153.000000 +188.000000 + + + +0 +318.000092,33.000046,0.000000 +192.000000 +235.000000 + + + +0 +520.000000,3.000046,0.000000 +240.000000 +294.000000 + + + +CharacterPrevious2 +Position +Width +Height + + +0 +155.000092,56.000046,0.000000 +153.000000 +188.000000 + + + +0 +155.000092,55.991196,0.000000 +153.000000 +188.000000 + + + +0 +23.000000,75.000046,0.000000 +122.000000 +150.000000 + + + +0 +155.000092,56.000046,0.000000 +153.000000 +188.000000 + + + +0 +318.000000,33.000046,0.000000 +192.000000 +235.000000 + + + +CharacterPrevious3 +Position +Width +Height + + +0 +23.000114,75.000046,0.000000 +122.000000 +150.000000 + + + +0 +23.000114,74.991196,0.000000 +122.000000 +150.000000 + + + +0 +-84.000000,90.000046,0.000000 +97.000000 +120.000000 + + + +0 +23.000114,75.000046,0.000000 +122.000000 +150.000000 + + + +0 +155.000000,56.000046,0.000000 +153.000000 +188.000000 + + + +CharacterPrevious4 +Position +Width +Height + + +0 +-83.999886,90.000046,0.000000 +97.000000 +120.000000 + + + +0 +-83.999886,89.991196,0.000000 +97.000000 +120.000000 + + + +0 +-310.999878,90.000046,0.000000 +97.000000 +120.000000 + + + +0 +-83.999886,90.000046,0.000000 +97.000000 +120.000000 + + + +0 +23.000000,75.000046,0.000000 +122.000000 +150.000000 + + + + + + +TabBar +1280.000000 +532.000000 +0.000000,90.000000,0.000000 +true + + + +Baseline +1680.000000 +62.000000 +-200.000000,460.000000,0.000000 +SkinSelectTabBarNormal + + + + +Normal +1280.000000 +62.000000 +SkinSelectTabBarNormal + + + + +Selected +1680.000000 +528.000000 +-200.000000,-0.000008,0.000000 + + + +BaselineSelected +1680.000000 +62.000000 +-0.000000,460.000000,0.000000 +SkinSelectTabBarSelected + + + + +NormalSelected +1280.000000 +62.000000 +200.000000,0.000000,0.000000 +SkinSelectTabBarSelected + + + + + + +PackGroup +1280.000000 +40.000000 +0.000000,90.000000,0.000000 +XuiBlankScene + + + +Left +348.000000 +42.000000 +104.000000,0.000003,0.000000 +XuiSkinPackButton +false + + + + +Right +348.000000 +42.000000 +828.000000,0.000003,0.000000 +XuiSkinPackButton +false + + + + +Center +348.000000 +42.000000 +466.000061,0.000003,0.000000 +XuiSkinPackButtonCenter + + + + + +SkinDetails +380.000000 +50.000000 +450.000000,524.000000,0.000000 +XuiSkinSelectSectionBackground + + + +SkinName +340.000000 +25.000000 +20.000000,2.000000,0.000000 +5 +XuiLabelLight_ShadowCentred + + + + +OriginName +340.000000 +25.000000 +20.000000,22.000000,0.000000 +5 +XuiLabelLight_ShadowCentred + + + + + +Selected + +stop + + +Unselected + +stop + + + +OriginName +Visual + + +0 +XuiLabelLight_ShadowCentred + + + +0 +XuiLabelLightFaded_ShadowCentred + + + +SkinName +Visual + + +0 +XuiLabelLight_ShadowCentred + + + +0 +XuiLabelLightFaded_ShadowCentred + + + + + + +Locked +32.000000 +32.000000 +794.000000,532.000000,0.000000 +SkinSelectPadlock + + + + +SelectedGroup +224.000000 +32.000000 +528.000000,479.999969,0.000000 +SkinSelectSelectedBackground + + + +SelectedText +150.000000 +24.000000 +37.000011,4.000000,0.000000 +5 +XuiLabelLightCentred + + + + + +Timer +184.000000 +170.000000 +548.000061,290.000000,0.000000 +XuiBlankScene + + + +Timer_Square_1 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +42.000000 +42.000000 +14.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +42.000000 +42.000000 +68.499985,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +42.000000 +42.000000 +123.000000,3.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +42.000000 +42.000000 +123.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +42.000000 +42.000000 +123.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +42.000000 +42.000000 +68.499985,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +42.000000 +42.000000 +14.000000,113.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +42.000000 +42.000000 +14.000000,58.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_skinselect_480.h b/Minecraft.Client/Common/Media/xuiscene_skinselect_480.h new file mode 100644 index 00000000..4f75dd27 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_skinselect_480.h @@ -0,0 +1,45 @@ +#define IDC_BackgroundTint L"BackgroundTint" +#define IDC_CharacterPrevious4 L"CharacterPrevious4" +#define IDC_CharacterPrevious3 L"CharacterPrevious3" +#define IDC_CharacterPrevious2 L"CharacterPrevious2" +#define IDC_CharacterPrevious1 L"CharacterPrevious1" +#define IDC_CharacterNext4 L"CharacterNext4" +#define IDC_CharacterNext3 L"CharacterNext3" +#define IDC_CharacterNext2 L"CharacterNext2" +#define IDC_CharacterNext1 L"CharacterNext1" +#define IDC_Character L"Character" +#define IDC_Characters L"Characters" +#define IDC_Baseline L"Baseline" +#define IDC_Normal L"Normal" +#define IDC_BaselineSelected L"BaselineSelected" +#define IDC_NormalSelected L"NormalSelected" +#define IDC_Selected L"Selected" +#define IDC_TabBar L"TabBar" +#define IDC_Left L"Left" +#define IDC_Right L"Right" +#define IDC_Center L"Center" +#define IDC_PackGroup L"PackGroup" +#define IDC_OriginName L"OriginName" +#define IDC_SkinName L"SkinName" +#define IDC_SkinDetails L"SkinDetails" +#define IDC_Locked L"Locked" +#define IDC_SelectedText L"SelectedText" +#define IDC_SelectedGroup L"SelectedGroup" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_SceneSkinSelect480 L"SceneSkinSelect480" diff --git a/Minecraft.Client/Common/Media/xuiscene_skinselect_480.xui b/Minecraft.Client/Common/Media/xuiscene_skinselect_480.xui new file mode 100644 index 00000000..3479feac --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_skinselect_480.xui @@ -0,0 +1,1574 @@ + + +640.000000 +480.000000 + + + +SceneSkinSelect480 +640.000000 +480.000000 +CScene_SkinSelect +XuiBlankScene +SkinDetails + + + +BackgroundTint +640.000000 +284.000000 +0.000000,102.000000,0.000000 + + +0xff0f0f80 + + + + +0x800f0f0f +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,1221.000000,0.000000,0,1221.000000,0.000000,1221.000000,0.000000,1221.000000,352.000000,0,1221.000000,352.000000,1221.000000,352.000000,0.000000,352.000000,0,0.000000,352.000000,0.000000,352.000000,0.000000,0.000000,0, + + + + +Characters +640.000000 +210.000000 +0.000000,135.000000,0.000000 +XuiBlankScene + + + +CharacterPrevious4 +49.000000 +60.000000 +-63.000000,46.000000,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterPrevious3 +61.000000 +75.000000 +-4.000000,39.000000,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterPrevious2 +77.000000 +94.000000 +67.000000,29.000000,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterPrevious1 +96.000000 +118.000000 +154.000000,17.000000,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterNext4 +49.000000 +60.000000 +654.000000,46.000000,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterNext3 +61.000000 +75.000000 +583.000000,39.000000,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterNext2 +77.000000 +94.000000 +496.000000,29.000000,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterNext1 +96.000000 +118.000000 +390.000000,17.000000,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + +Character +120.000000 +147.000000 +260.000000,3.000000,0.000000 +15 +CXuiCtrlMinecraftSkinPreview + + + + + +Normal + +stop + + +CycleLeft + + + +EndCycleLeft + +stop + + +CycleRight + + + +EndCycleRight + +stop + + + +Character +Position +Width +Height + + +0 +260.000000,3.000000,0.000000 +120.000000 +147.000000 + + + +0 +260.000000,3.000000,0.000000 +120.000000 +147.000000 + + + +0 +154.000000,17.000000,0.000000 +96.000000 +118.000000 + + + +0 +260.000000,3.000000,0.000000 +120.000000 +147.000000 + + + +0 +390.000000,17.000000,0.000000 +96.000000 +118.000000 + + + +CharacterNext1 +Position +Width +Height + + +0 +390.000000,17.000000,0.000000 +96.000000 +118.000000 + + + +0 +390.000000,17.000000,0.000000 +96.000000 +118.000000 + + + +0 +260.000000,3.000000,0.000000 +120.000000 +147.000000 + + + +0 +390.000000,17.000000,0.000000 +96.000000 +118.000000 + + + +0 +496.000000,29.000000,0.000000 +77.000000 +94.000000 + + + +CharacterNext2 +Position +Width +Height + + +0 +496.000000,29.000000,0.000000 +77.000000 +94.000000 + + + +0 +496.000000,29.000000,0.000000 +77.000000 +94.000000 + + + +0 +390.000000,17.000000,0.000000 +96.000000 +118.000000 + + + +0 +496.000000,29.000000,0.000000 +77.000000 +94.000000 + + + +0 +583.000000,39.000000,0.000000 +61.000000 +75.000000 + + + +CharacterNext3 +Position +Width +Height + + +0 +583.000000,39.000000,0.000000 +61.000000 +75.000000 + + + +0 +583.000000,39.000000,0.000000 +61.000000 +75.000000 + + + +0 +496.000000,29.000000,0.000000 +77.000000 +94.000000 + + + +0 +583.000000,39.000000,0.000000 +61.000000 +75.000000 + + + +0 +654.000000,46.000000,0.000000 +49.000000 +60.000000 + + + +CharacterNext4 +Position +Width +Height + + +0 +654.000000,46.000000,0.000000 +49.000000 +60.000000 + + + +0 +654.000000,46.000000,0.000000 +49.000000 +60.000000 + + + +0 +583.000000,39.000000,0.000000 +61.000000 +75.000000 + + + +0 +654.000000,46.000000,0.000000 +49.000000 +60.000000 + + + +0 +654.000000,46.000000,0.000000 +49.000000 +60.000000 + + + +CharacterPrevious1 +Position +Width +Height + + +0 +154.000000,17.000000,0.000000 +96.000000 +118.000000 + + + +0 +154.000000,17.000000,0.000000 +96.000000 +118.000000 + + + +0 +67.000000,29.000000,0.000000 +77.000000 +94.000000 + + + +0 +154.000000,17.000000,0.000000 +96.000000 +118.000000 + + + +0 +260.000000,3.000000,0.000000 +120.000000 +147.000000 + + + +CharacterPrevious2 +Position +Width +Height + + +0 +67.000000,29.000000,0.000000 +77.000000 +94.000000 + + + +0 +67.000000,29.000000,0.000000 +77.000000 +94.000000 + + + +0 +-4.000000,39.000000,0.000000 +61.000000 +75.000000 + + + +0 +67.000000,29.000000,0.000000 +77.000000 +94.000000 + + + +0 +154.000000,17.000000,0.000000 +96.000000 +118.000000 + + + +CharacterPrevious3 +Position +Width +Height + + +0 +-4.000000,39.000000,0.000000 +61.000000 +75.000000 + + + +0 +-4.000000,39.000000,0.000000 +61.000000 +75.000000 + + + +0 +-63.000000,46.000000,0.000000 +49.000000 +60.000000 + + + +0 +-4.000000,39.000000,0.000000 +61.000000 +75.000000 + + + +0 +67.000000,29.000000,0.000000 +77.000000 +94.000000 + + + +CharacterPrevious4 +Position +Width +Height + + +0 +-63.000000,46.000000,0.000000 +49.000000 +60.000000 + + + +0 +-63.000000,46.000000,0.000000 +49.000000 +60.000000 + + + +0 +-63.000000,46.000000,0.000000 +49.000000 +60.000000 + + + +0 +-63.000000,46.000000,0.000000 +49.000000 +60.000000 + + + +0 +-4.000000,39.000000,0.000000 +61.000000 +75.000000 + + + + + + +TabBar +640.000000 +348.833313 +0.000000,66.000000,0.000000 +true + + + +Baseline +780.000000 +44.000000 +-70.000000,284.000000,0.000000 +SkinSelectTabBarNormalSmall + + + + +Normal +640.000000 +44.000000 +SkinSelectTabBarNormalSmall + + + + +Selected +779.999939 +327.999969 +-69.999992,-0.000008,0.000000 + + + +BaselineSelected +780.000000 +44.000000 +-0.000000,284.000000,0.000000 +SkinSelectTabBarSelectedSmall + + + + +NormalSelected +640.000000 +44.000000 +70.000000,0.000000,0.000000 +SkinSelectTabBarSelectedSmall + + + + + + +PackGroup +640.000000 +40.000000 +0.000000,62.000000,0.000000 +XuiBlankScene + + + +Left +180.000000 +31.000000 +50.000031,4.000003,0.000000 +XuiSkinPackButtonSmall +false + + + + +Right +180.000000 +31.000000 +409.000031,4.000003,0.000000 +XuiSkinPackButtonSmall +false + + + + +Center +180.000000 +40.000000 +230.000092,-1.999997,0.000000 +XuiSkinPackButtonCentreSmall + + + + + +SkinDetails +380.000000 +54.000000 +130.000046,315.000000,0.000000 +XuiSkinSelectSectionBackground + + + +OriginName +368.000000 +25.000000 +6.000061,22.000000,0.000000 +5 +XuiLabelLight_C_ShadowedSmall + + + + +SkinName +368.000000 +25.000000 +6.000061,0.000000,0.000000 +5 +XuiLabelLight_C_ShadowedSmall + + + + + +Selected + +stop + + +Unselected + +stop + + + +SkinName +Visual + + +0 +XuiLabelLight_C_ShadowedSmall + + + +0 +XuiLabelLightFaded_C_ShadowedSmall + + + +OriginName +Visual + + +0 +XuiLabelLight_C_ShadowedSmall + + + +0 +XuiLabelLightFaded_C_ShadowedSmall + + + + + + +Locked +32.000000 +32.000000 +475.000000,328.000000,0.000000 +SkinSelectPadlock + + + + +SelectedGroup +224.000000 +25.000000 +208.000015,276.000000,0.000000 +SkinSelectSelectedBackgroundSmall + + + +SelectedText +150.000000 +20.000000 +37.000011,3.000000,0.000000 +5 +XuiLabelListening_Small + + + + + +Timer +72.000000 +72.000000 +284.000031,210.000000,0.000000 +15 +XuiBlankScene + + + +Timer_Square_1 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_skinselect_small.h b/Minecraft.Client/Common/Media/xuiscene_skinselect_small.h new file mode 100644 index 00000000..9ead89bd --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_skinselect_small.h @@ -0,0 +1,42 @@ +#define IDC_BackgroundTint L"BackgroundTint" +#define IDC_CharacterPrevious4 L"CharacterPrevious4" +#define IDC_CharacterPrevious3 L"CharacterPrevious3" +#define IDC_CharacterPrevious2 L"CharacterPrevious2" +#define IDC_CharacterPrevious1 L"CharacterPrevious1" +#define IDC_CharacterNext4 L"CharacterNext4" +#define IDC_CharacterNext3 L"CharacterNext3" +#define IDC_CharacterNext2 L"CharacterNext2" +#define IDC_CharacterNext1 L"CharacterNext1" +#define IDC_Character L"Character" +#define IDC_Characters L"Characters" +#define IDC_Normal L"Normal" +#define IDC_Selected L"Selected" +#define IDC_TabBar L"TabBar" +#define IDC_Left L"Left" +#define IDC_Right L"Right" +#define IDC_Center L"Center" +#define IDC_PackGroup L"PackGroup" +#define IDC_SkinName L"SkinName" +#define IDC_OriginName L"OriginName" +#define IDC_SkinDetails L"SkinDetails" +#define IDC_Locked L"Locked" +#define IDC_SelectedText L"SelectedText" +#define IDC_SelectedGroup L"SelectedGroup" +#define IDC_Timer_Square_1 L"Timer_Square_1" +#define IDC_Timer_Square_2 L"Timer_Square_2" +#define IDC_Timer_Square_3 L"Timer_Square_3" +#define IDC_Timer_Square_4 L"Timer_Square_4" +#define IDC_Timer_Square_5 L"Timer_Square_5" +#define IDC_Timer_Square_6 L"Timer_Square_6" +#define IDC_Timer_Square_7 L"Timer_Square_7" +#define IDC_Timer_Square_8 L"Timer_Square_8" +#define IDC_Timer_Square_9 L"Timer_Square_9" +#define IDC_Timer_Square_10 L"Timer_Square_10" +#define IDC_Timer_Square_11 L"Timer_Square_11" +#define IDC_Timer_Square_12 L"Timer_Square_12" +#define IDC_Timer_Square_13 L"Timer_Square_13" +#define IDC_Timer_Square_14 L"Timer_Square_14" +#define IDC_Timer_Square_15 L"Timer_Square_15" +#define IDC_Timer_Square_16 L"Timer_Square_16" +#define IDC_Timer L"Timer" +#define IDC_SceneSkinSelectSmall L"SceneSkinSelectSmall" diff --git a/Minecraft.Client/Common/Media/xuiscene_skinselect_small.xui b/Minecraft.Client/Common/Media/xuiscene_skinselect_small.xui new file mode 100644 index 00000000..a5ecf235 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_skinselect_small.xui @@ -0,0 +1,1656 @@ + + +640.000000 +360.000000 + + + +SceneSkinSelectSmall +640.000000 +360.000000 +CScene_SkinSelect +XuiBlankScene +SkinDetails + + + +BackgroundTint +570.000000 +220.000000 +35.000031,62.000000,0.000000 + + +0xff0f0f80 + + + + +0x800f0f0f +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,1221.000000,0.000000,0,1221.000000,0.000000,1221.000000,0.000000,1221.000000,352.000000,0,1221.000000,352.000000,1221.000000,352.000000,0.000000,352.000000,0,0.000000,352.000000,0.000000,352.000000,0.000000,0.000000,0, + + + + +Characters +570.000000 +210.000000 +35.000031,68.000000,0.000000 +true +XuiBlankScene + + + +CharacterPrevious4 +49.000000 +60.000000 +-98.000000,66.000000,0.000000 +0.000000 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterPrevious3 +61.000000 +75.000000 +-39.000000,59.000000,0.000000 +0.250000 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterPrevious2 +77.000000 +94.000000 +32.000000,49.000000,0.000000 +0.500000 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterPrevious1 +96.000000 +118.000000 +119.000000,37.000000,0.000000 +0.750000 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterNext4 +49.000000 +60.000000 +619.000000,66.000000,0.000000 +0.000000 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterNext3 +61.000000 +75.000000 +548.000000,59.000000,0.000000 +0.250000 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterNext2 +77.000000 +94.000000 +461.000000,49.000000,0.000000 +0.500000 +CXuiCtrlMinecraftSkinPreview + + + + +CharacterNext1 +96.000000 +118.000000 +355.000000,37.000000,0.000000 +0.750000 +CXuiCtrlMinecraftSkinPreview + + + + +Character +120.000000 +147.000000 +225.000000,23.000000,0.000000 +CXuiCtrlMinecraftSkinPreview + + + + + +Normal + +stop + + +CycleLeft + + + +EndCycleLeft + +stop + + +CycleRight + + + +EndCycleRight + +stop + + + +Character +Position +Width +Height +Opacity +Anchor + + +0 +225.000000,23.000000,0.000000 +120.000000 +147.000000 +1.000000 +0 + + + +0 +225.000031,23.000000,0.000000 +120.000000 +147.000000 +1.000000 +0 + + + +0 +119.000000,37.000000,0.000000 +96.000000 +118.000000 +0.750000 +15 + + + +0 +225.000000,23.000000,0.000000 +120.000000 +147.000000 +1.000000 +0 + + + +0 +355.000000,37.000000,0.000000 +96.000000 +118.000000 +0.750000 +0 + + + +CharacterNext1 +Position +Width +Height +Opacity +Anchor + + +0 +355.000000,37.000000,0.000000 +96.000000 +118.000000 +0.750000 +0 + + + +0 +355.000031,37.000000,0.000000 +96.000000 +118.000000 +0.750000 +0 + + + +0 +225.000000,23.000000,0.000000 +120.000000 +147.000000 +1.000000 +15 + + + +0 +355.000000,37.000000,0.000000 +96.000000 +118.000000 +0.750000 +0 + + + +0 +461.000000,49.000000,0.000000 +77.000000 +94.000000 +0.500000 +0 + + + +CharacterNext2 +Position +Width +Height +Opacity +Anchor + + +0 +461.000000,49.000000,0.000000 +77.000000 +94.000000 +0.500000 +0 + + + +0 +461.000031,49.000000,0.000000 +77.000000 +94.000000 +0.500000 +0 + + + +0 +355.000000,37.000000,0.000000 +96.000000 +118.000000 +0.750000 +15 + + + +0 +461.000000,49.000000,0.000000 +77.000000 +94.000000 +0.500000 +0 + + + +0 +548.000000,59.000000,0.000000 +61.000000 +75.000000 +0.250000 +0 + + + +CharacterNext3 +Position +Width +Height +Opacity +Anchor + + +0 +548.000000,59.000000,0.000000 +61.000000 +75.000000 +0.250000 +0 + + + +0 +548.000000,59.000000,0.000000 +61.000000 +75.000000 +0.250000 +0 + + + +0 +461.000000,49.000000,0.000000 +77.000000 +94.000000 +0.500000 +15 + + + +0 +548.000000,59.000000,0.000000 +61.000000 +75.000000 +0.250000 +0 + + + +0 +619.000000,66.000000,0.000000 +49.000000 +60.000000 +0.000000 +0 + + + +CharacterNext4 +Position +Width +Height +Opacity +Anchor + + +0 +619.000000,66.000000,0.000000 +49.000000 +60.000000 +0.000000 +0 + + + +0 +619.000000,66.000000,0.000000 +49.000000 +60.000000 +0.000000 +0 + + + +0 +548.000000,59.000000,0.000000 +61.000000 +75.000000 +0.250000 +15 + + + +0 +619.000000,66.000000,0.000000 +49.000000 +60.000000 +0.000000 +0 + + + +0 +619.000000,66.000000,0.000000 +49.000000 +60.000000 +0.000000 +0 + + + +CharacterPrevious1 +Position +Width +Height +Opacity +Anchor + + +0 +119.000000,37.000000,0.000000 +96.000000 +118.000000 +0.750000 +0 + + + +0 +119.000031,37.000000,0.000000 +96.000000 +118.000000 +0.750000 +0 + + + +0 +32.000000,49.000000,0.000000 +77.000000 +94.000000 +0.500000 +37 + + + +0 +119.000000,37.000000,0.000000 +96.000000 +118.000000 +0.750000 +0 + + + +0 +225.000000,23.000000,0.000000 +120.000000 +147.000000 +1.000000 +0 + + + +CharacterPrevious2 +Position +Width +Height +Opacity +Anchor + + +0 +32.000000,49.000000,0.000000 +77.000000 +94.000000 +0.500000 +0 + + + +0 +32.000027,49.000000,0.000000 +77.000000 +94.000000 +0.500000 +0 + + + +0 +-39.000000,59.000000,0.000000 +61.000000 +75.000000 +0.250000 +15 + + + +0 +32.000000,49.000000,0.000000 +77.000000 +94.000000 +0.500000 +0 + + + +0 +119.000000,37.000000,0.000000 +96.000000 +118.000000 +0.750000 +0 + + + +CharacterPrevious3 +Position +Width +Height +Opacity +Anchor + + +0 +-39.000000,59.000000,0.000000 +61.000000 +75.000000 +0.250000 +0 + + + +0 +-38.999973,59.000000,0.000000 +61.000000 +75.000000 +0.250000 +0 + + + +0 +-98.000000,66.000000,0.000000 +49.000000 +60.000000 +0.000000 +15 + + + +0 +-39.000000,59.000000,0.000000 +61.000000 +75.000000 +0.250000 +0 + + + +0 +32.000000,49.000000,0.000000 +77.000000 +94.000000 +0.500000 +0 + + + +CharacterPrevious4 +Position +Width +Height +Opacity +Anchor + + +0 +-98.000000,66.000000,0.000000 +49.000000 +60.000000 +0.000000 +0 + + + +0 +-97.999969,66.000000,0.000000 +49.000000 +60.000000 +0.000000 +0 + + + +0 +-98.000000,66.000000,0.000000 +49.000000 +60.000000 +0.000000 +15 + + + +0 +-98.000000,66.000000,0.000000 +49.000000 +60.000000 +0.000000 +0 + + + +0 +-39.000000,59.000000,0.000000 +61.000000 +75.000000 +0.250000 +0 + + + + + + +TabBar +580.000000 +270.000000 +30.000032,21.000000,0.000000 +15 + + + +Normal +580.000000 +270.000000 +SkinSelectTabNormalSmall + + + + +Selected +580.000000 +270.000000 +SkinSelectTabSelectedSmall + + + + + +PackGroup +640.000000 +40.000000 +0.000032,15.000000,0.000000 +XuiBlankScene + + + +Left +180.000000 +31.000000 +50.000031,5.000003,0.000000 +XuiSkinPackButtonSmall +false + + + + +Right +180.000000 +31.000000 +409.000031,5.000003,0.000000 +XuiSkinPackButtonSmall +false + + + + +Center +180.000000 +40.000000 +230.000092,0.000003,0.000000 +XuiSkinPackButtonCentreSmall + + + + + +SkinDetails +380.000000 +48.000000 +130.000046,219.000000,0.000000 +XuiSkinSelectSBckgrndSmall + + + +SkinName +368.000000 +22.000000 +6.000061,-2.000000,0.000000 +5 +XuiLabelLight_C_ShadowedSmall + + + + +OriginName +368.000000 +22.000000 +6.000061,18.000000,0.000000 +5 +XuiLabelLight_C_ShadowedSmall + + + + + +Selected + +stop + + +Unselected + +stop + + + +OriginName +Visual + + +0 +XuiLabelLight_C_ShadowedSmall + + + +0 +XuiLabelLightFaded_C_ShadowedSmall + + + +SkinName +Visual + + +0 +XuiLabelLight_C_ShadowedSmall + + + +0 +XuiLabelLightFaded_C_ShadowedSmall + + + + + + +Locked +32.000000 +32.000000 +471.000000,227.000000,0.000000 +SkinSelectPadlock + + + + +SelectedGroup +224.000000 +25.000000 +208.000015,187.000000,0.000000 +SkinSelectSelectedBackgroundSmall + + + +SelectedText +150.000000 +20.000000 +37.000011,3.000000,0.000000 +5 +XuiLabelListening_Small + + + + + +Timer +72.000000 +72.000000 +284.000031,130.000000,0.000000 +15 +false +XuiBlankScene + + + +Timer_Square_1 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_2 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_3 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_4 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_5 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_6 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_7 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_8 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_9 +21.000000 +21.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_10 +21.000000 +21.000000 +25.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_11 +21.000000 +21.000000 +50.000000,0.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_12 +21.000000 +21.000000 +50.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_13 +21.000000 +21.000000 +50.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_14 +21.000000 +21.000000 +25.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_15 +21.000000 +21.000000 +0.000000,50.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + +Timer_Square_16 +21.000000 +21.000000 +0.000000,25.000000,0.000000 + + +0xff0f0f80 + + + + +0x00ebebeb + + +1 +0x00000000 +0.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,42.000000,0.000000,0,42.000000,0.000000,42.000000,0.000000,42.000000,42.000000,0,42.000000,42.000000,42.000000,42.000000,0.000000,42.000000,0,0.000000,42.000000,0.000000,42.000000,0.000000,0.000000,0, + + + + + +LoadStart + + + +LoopStart + + + +LoopEnd + +gotoandplay +LoopStart + + + +Timer_Square_1 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_3 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_8 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_4 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_7 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_6 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_5 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_2 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_9 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_10 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_11 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_12 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_13 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x00ebebeb + + + +Timer_Square_14 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x07ebebeb + + + +Timer_Square_15 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x49ebebeb + + + +Timer_Square_16 +Fill.FillColor + + +0 +0x00ebebeb + + + +0 +0x00ebebeb + + + +0 +0xc8ebebeb + + + +0 +0x8cebebeb + + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_socialpost.h b/Minecraft.Client/Common/Media/xuiscene_socialpost.h new file mode 100644 index 00000000..550668e7 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_socialpost.h @@ -0,0 +1,7 @@ +#define IDC_XuiOK L"XuiOK" +#define IDC_XuiEditDescription L"XuiEditDescription" +#define IDC_XuiLabelDescription L"XuiLabelDescription" +#define IDC_XuiEditCaption L"XuiEditCaption" +#define IDC_XuiLabelCaption L"XuiLabelCaption" +#define IDC_XuiLabelText L"XuiLabelText" +#define IDC_SceneSocialPost L"SceneSocialPost" diff --git a/Minecraft.Client/Common/Media/xuiscene_socialpost.xui b/Minecraft.Client/Common/Media/xuiscene_socialpost.xui new file mode 100644 index 00000000..a67f038a --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_socialpost.xui @@ -0,0 +1,88 @@ + + +1280.000000 +720.000000 + + + +SceneSocialPost +450.000000 +335.000000 +415.000000,204.000000,0.000000 +CScene_SocialPost +GraphicPanel +SceneNewWorld\XuiEditWorldName +SceneNewWorld\XuiNewWorld +XuiEditCaption + + + +XuiOK +382.000000 +40.000000 +34.000000,268.000000,0.000000 +XuiMainMenuButton_L +XuiEditDescription +XuiDescription +22528 + + + + +XuiEditDescription +376.000000 +32.000000 +37.000000,198.000000,0.000000 +CXuiCtrl4JEdit +XuiEdit +XuiEditCaption +XuiOK +XuiOK +XuiEditCaption +100 + + + + +XuiLabelDescription +380.000000 +26.000000 +35.000000,172.000000,0.000000 +XuiLabelDarkLeftWrap + + + + +XuiEditCaption +376.000000 +32.000000 +37.000000,124.000000,0.000000 +CXuiCtrl4JEdit +XuiEdit +XuiEditTitle +XuiEditDescription +XuiEditTitle +XuiDescription +60 + + + + +XuiLabelCaption +380.000000 +26.000000 +35.000000,98.000000,0.000000 +XuiLabelDarkLeftWrap + + + + +XuiLabelText +380.000000 +80.000000 +35.000000,20.000000,0.000000 +XuiLabelDarkLeftWrap16 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_socialpost_480.h b/Minecraft.Client/Common/Media/xuiscene_socialpost_480.h new file mode 100644 index 00000000..550668e7 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_socialpost_480.h @@ -0,0 +1,7 @@ +#define IDC_XuiOK L"XuiOK" +#define IDC_XuiEditDescription L"XuiEditDescription" +#define IDC_XuiLabelDescription L"XuiLabelDescription" +#define IDC_XuiEditCaption L"XuiEditCaption" +#define IDC_XuiLabelCaption L"XuiLabelCaption" +#define IDC_XuiLabelText L"XuiLabelText" +#define IDC_SceneSocialPost L"SceneSocialPost" diff --git a/Minecraft.Client/Common/Media/xuiscene_socialpost_480.xui b/Minecraft.Client/Common/Media/xuiscene_socialpost_480.xui new file mode 100644 index 00000000..04d5eb17 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_socialpost_480.xui @@ -0,0 +1,87 @@ + + +640.000000 +480.000000 + + + +SceneSocialPost +354.000000 +267.000000 +143.000000,123.000000,0.000000 +CScene_SocialPost +GraphicPanel +SceneNewWorld\XuiEditWorldName +SceneNewWorld\XuiNewWorld +XuiEditCaption + + + +XuiOK +304.000000 +36.000000 +25.000000,211.000000,0.000000 +XuiMainMenuButton_L_Thin +XuiEditDescription +XuiDescription +22528 + + + + +XuiEditDescription +300.000000 +27.000000,156.000000,0.000000 +CXuiCtrl4JEdit +XuiEdit +XuiEditCaption +XuiOK +XuiOK +XuiEditCaption +100 + + + + +XuiLabelDescription +300.000000 +20.000000 +27.000000,133.000000,0.000000 +XuiLabelDarkLeftWrapSmall + + + + +XuiEditCaption +300.000000 +27.000000,93.000000,0.000000 +CXuiCtrl4JEdit +XuiEdit +XuiEditTitle +XuiEditDescription +XuiEditTitle +XuiDescription +60 + + + + +XuiLabelCaption +300.000000 +20.000000 +27.000000,69.000000,0.000000 +XuiLabelDarkLeftWrapSmall + + + + +XuiLabelText +300.000000 +57.999992 +27.000000,9.000000,0.000000 +XuiLabelDarkLeftWrapSmall +false + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_socialpost_small.h b/Minecraft.Client/Common/Media/xuiscene_socialpost_small.h new file mode 100644 index 00000000..550668e7 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_socialpost_small.h @@ -0,0 +1,7 @@ +#define IDC_XuiOK L"XuiOK" +#define IDC_XuiEditDescription L"XuiEditDescription" +#define IDC_XuiLabelDescription L"XuiLabelDescription" +#define IDC_XuiEditCaption L"XuiEditCaption" +#define IDC_XuiLabelCaption L"XuiLabelCaption" +#define IDC_XuiLabelText L"XuiLabelText" +#define IDC_SceneSocialPost L"SceneSocialPost" diff --git a/Minecraft.Client/Common/Media/xuiscene_socialpost_small.xui b/Minecraft.Client/Common/Media/xuiscene_socialpost_small.xui new file mode 100644 index 00000000..25294893 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_socialpost_small.xui @@ -0,0 +1,88 @@ + + +640.000000 +360.000000 + + + +SceneSocialPost +424.000000 +290.000000 +108.000000,0.000000,0.000000 +CScene_SocialPost +GraphicPanel +SceneNewWorld\XuiEditWorldName +SceneNewWorld\XuiNewWorld +XuiEditCaption + + + +XuiOK +362.000000 +40.000000 +31.000008,236.000000,0.000000 +XuiMainMenuButton_L +XuiEditDescription +XuiDescription +22528 + + + + +XuiEditDescription +356.000000 +32.000000 +34.250069,178.000000,0.000000 +CXuiCtrl4JEdit +XuiEdit +XuiEditCaption +XuiOK +XuiOK +XuiEditCaption +100 + + + + +XuiLabelDescription +360.000000 +24.000000 +34.000023,154.000000,0.000000 +XuiLabelDarkLeftWrap + + + + +XuiEditCaption +356.000000 +32.000000 +33.749977,110.000000,0.000000 +CXuiCtrl4JEdit +XuiEdit +XuiEditTitle +XuiEditDescription +XuiEditTitle +XuiDescription +60 + + + + +XuiLabelCaption +360.000000 +24.000000 +34.000023,86.000000,0.000000 +XuiLabelDarkLeftWrap + + + + +XuiLabelText +358.000000 +64.000000 +34.000023,16.000000,0.000000 +XuiLabelDarkLeftWrap + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_teleportmenu.h b/Minecraft.Client/Common/Media/xuiscene_teleportmenu.h new file mode 100644 index 00000000..9042ac8c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_teleportmenu.h @@ -0,0 +1,9 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_GamePlayers L"GamePlayers" +#define IDC_Title L"Title" +#define IDC_Teleport L"Teleport" diff --git a/Minecraft.Client/Common/Media/xuiscene_teleportmenu.xui b/Minecraft.Client/Common/Media/xuiscene_teleportmenu.xui new file mode 100644 index 00000000..3b747f6e --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_teleportmenu.xui @@ -0,0 +1,100 @@ + + +1280.000000 +720.000000 + + + +Teleport +1280.000000 +720.000000 +CScene_Teleport +XuiBlankScene +GamePlayers + + + +GamePlayers +500.000000 +336.000000 +390.000000,192.000046,0.000000 +CXuiCtrlPassThroughList +XuiPlayerList + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +false +XuiPlayerListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +false +XuiPlayerListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +false +XuiPlayerListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +false +XuiPlayerListButton_L + + + + +control_ListItem +400.000000 +60.000000 +20.000000,46.000000,0.000000 +5 +false +XuiPlayerListButton_L + + + + + +Title +400.000000 +412.000000,202.000046,0.000000 +XuiLabelDarkLeftWrap18 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_teleportmenu_480.h b/Minecraft.Client/Common/Media/xuiscene_teleportmenu_480.h new file mode 100644 index 00000000..9042ac8c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_teleportmenu_480.h @@ -0,0 +1,9 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_GamePlayers L"GamePlayers" +#define IDC_Title L"Title" +#define IDC_Teleport L"Teleport" diff --git a/Minecraft.Client/Common/Media/xuiscene_teleportmenu_480.xui b/Minecraft.Client/Common/Media/xuiscene_teleportmenu_480.xui new file mode 100644 index 00000000..dced9633 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_teleportmenu_480.xui @@ -0,0 +1,101 @@ + + +640.000000 +480.000000 + + + +Teleport +640.000000 +480.000000 +CScene_Teleport +XuiBlankScene +GamePlayers + + + +GamePlayers +340.000000 +272.000000 +150.000031,130.000015,0.000000 +CXuiCtrlPassThroughList +XuiPlayerListSmall + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + + +Title +300.000000 +22.000000 +170.000000,144.000000,0.000000 +XuiLabelDark + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_teleportmenu_small.h b/Minecraft.Client/Common/Media/xuiscene_teleportmenu_small.h new file mode 100644 index 00000000..9042ac8c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_teleportmenu_small.h @@ -0,0 +1,9 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_GamePlayers L"GamePlayers" +#define IDC_Title L"Title" +#define IDC_Teleport L"Teleport" diff --git a/Minecraft.Client/Common/Media/xuiscene_teleportmenu_small.xui b/Minecraft.Client/Common/Media/xuiscene_teleportmenu_small.xui new file mode 100644 index 00000000..b9afb847 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_teleportmenu_small.xui @@ -0,0 +1,101 @@ + + +640.000000 +360.000000 + + + +Teleport +640.000000 +360.000000 +CScene_Teleport +XuiBlankScene +GamePlayers + + + +GamePlayers +400.000000 +236.000000 +120.000023,52.000011,0.000000 +CXuiCtrlPassThroughList +XuiPlayerListSmall + + + +control_ListItem +400.000000 +60.000000 +20.000000,50.000000,0.000000 +5 +false +XuiListButton_L + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + +control_ListItem +400.000000 +40.000000 +20.000000,42.000000,0.000000 +5 +false +XuiPlayerListButton_LThin + + + + + +Title +358.000000 +26.000000 +140.000000,61.999969,0.000000 +XuiLabelDarkLeftWrap16 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_text_entry.h b/Minecraft.Client/Common/Media/xuiscene_text_entry.h new file mode 100644 index 00000000..f8d9c364 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_text_entry.h @@ -0,0 +1,2 @@ +#define IDC_XuiEditText L"XuiEditText" +#define IDC_TextEntry L"TextEntry" diff --git a/Minecraft.Client/Common/Media/xuiscene_text_entry.xui b/Minecraft.Client/Common/Media/xuiscene_text_entry.xui new file mode 100644 index 00000000..c71b6090 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_text_entry.xui @@ -0,0 +1,29 @@ + + +1280.000000 +720.000000 + + + +TextEntry +450.000000 +74.000000 +415.000031,568.000000,0.000000 +CScene_TextEntry +XuiScene +XuiEditText + + + +XuiEditText +394.000000 +32.000000 +31.000000,20.000000,0.000000 +CXuiCtrl4JEdit +XuiEdit +CheckboxAllowFoF +XuiEditSeed + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_trading.h b/Minecraft.Client/Common/Media/xuiscene_trading.h new file mode 100644 index 00000000..940527a3 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trading.h @@ -0,0 +1,485 @@ +#define IDC_RequiredWindow L"RequiredWindow" +#define IDC_TradingWindow L"TradingWindow" +#define IDC_RequiredLabel L"RequiredLabel" +#define IDC_VillagerText L"VillagerText" +#define IDC_Request1 L"Request1" +#define IDC_Request2 L"Request2" +#define IDC_Offer1Label L"Offer1Label" +#define IDC_Offer2Label L"Offer2Label" +#define IDC_ScrollLeftArrow L"ScrollLeftArrow" +#define IDC_ScrollRightArrow L"ScrollRightArrow" +#define IDC_TradingBar0 L"TradingBar0" +#define IDC_TradingBar1 L"TradingBar1" +#define IDC_TradingBar2 L"TradingBar2" +#define IDC_TradingBar3 L"TradingBar3" +#define IDC_TradingBar4 L"TradingBar4" +#define IDC_TradingBar5 L"TradingBar5" +#define IDC_TradingBar6 L"TradingBar6" +#define IDC_TradingSelector L"TradingSelector" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_InventoryGrid L"InventoryGrid" +#define IDC_InventoryLabel L"InventoryLabel" +#define IDC_HtmlTextPanel L"HtmlTextPanel" +#define IDC_Group L"Group" +#define IDC_XuiSceneTrading L"XuiSceneTrading" diff --git a/Minecraft.Client/Common/Media/xuiscene_trading.xui b/Minecraft.Client/Common/Media/xuiscene_trading.xui new file mode 100644 index 00000000..1bfc0a64 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trading.xui @@ -0,0 +1,6765 @@ + + +1280.000000 +720.000000 + + + +XuiSceneTrading +1280.000000 +720.000000 +CXuiSceneTrading +XuiBlankScene +Pointer + + + +Group +588.000000 +360.000000 +346.000031,180.000046,0.000000 +15 +XuiScene +Pointer + + + +RequiredWindow +216.000000 +186.000000 +25.000031,148.000000,0.000000 +8 +XuiSkinSelectSectionBackground + + + + +TradingWindow +312.000000 +186.000000 +249.000031,148.000000,0.000000 +8 +XuiSkinSelectSectionBackground + + + + +RequiredLabel +212.000000 +26.000000 +27.000031,152.000000,0.000000 +9 +XuiLabelDarkCentredWrapSmall + + + + +VillagerText +588.000000 +26.000000 +0.000000,25.000000,0.000000 +LabelContainerSceneCentre + + + + +Request1 +42.000000 +42.000000 +35.000031,200.000000,0.000000 +3 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +Request2 +42.000000 +42.000000 +35.000031,254.000000,0.000000 +3 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +Offer1Label +141.000000 +42.000000 +87.000031,200.000000,0.000000 +9 +XuiLabelVertCentDarkLeftWrap18 + + + + +Offer2Label +141.000000 +42.000000 +86.000031,254.000015,0.000000 +9 +XuiLabelVertCentDarkLeftWrap18 + + + + +ScrollLeftArrow +32.000000 +48.000000 +56.000000,68.000000,0.000000 +XuiScrollEndLeft + + + + +ScrollRightArrow +32.000000 +48.000000 +476.000000,68.000000,0.000000 +XuiScrollEndRight + + + + +TradingBar0 +54.000000 +54.000000 +91.000000,64.000000,0.000000 +3 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +TradingBar1 +54.000000 +54.000000 +145.000000,64.000000,0.000000 +3 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +TradingBar2 +54.000000 +54.000000 +199.000000,64.000000,0.000000 +3 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +TradingBar3 +54.000000 +54.000000 +253.000000,64.000000,0.000000 +3 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +TradingBar4 +54.000000 +54.000000 +307.000000,64.000000,0.000000 +3 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +TradingBar5 +54.000000 +54.000000 +361.000000,64.000000,0.000000 +3 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +TradingBar6 +54.000000 +54.000000 +415.000000,64.000000,0.000000 +3 +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +TradingSelector +72.000000 +72.000000 +82.000000,55.000000,0.000000 +CraftingPanelHighlight + + + + +InventoryGrid +290.000000 +144.000000 +260.000031,180.000000,0.000000 + + + +Inventory +288.000000 +96.000000 +8 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + +UseRow +288.000000 +32.000000 +-0.000000,112.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical32 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +226.000000 +45.000000 +7.000000,22.000000,0.000000 +5 +false +XuiButton +0.000000,10.000000,0.000000 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + + + +InventoryLabel +310.000000 +26.000000 +251.000031,152.000000,0.000000 +9 +XuiLabelDarkCentredWrap + + + + +HtmlTextPanel +42.000000 +42.000000 +85.000000,118.000000,0.000000 +false +HtmlItemDescription + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +346.000031,180.000046,0.000000 + + + +0 +346.000061,180.000046,0.000000 + + + +2 +100 +-100 +50 +346.000061,180.000046,0.000000 + + + +0 +160.000000,180.000046,0.000000 + + + +2 +100 +-100 +50 +160.000000,180.000046,0.000000 + + + +0 +346.000061,180.000046,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_trading_480.xui b/Minecraft.Client/Common/Media/xuiscene_trading_480.xui new file mode 100644 index 00000000..a84496e2 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trading_480.xui @@ -0,0 +1,6457 @@ + + +640.000000 +480.000000 + + + +XuiSceneTrading +640.000000 +480.000000 +CXuiSceneTrading +XuiBlankScene +Pointer + + + +Group +364.000000 +243.000000 +138.000015,118.500008,0.000000 +15 +GraphicPanel +Pointer + + + +TradingWindow +126.777763 +121.000000 +10.000000,113.000000,0.000000 +8 +XuiSkinSelectSectionBackground + + + + +TradingWindow1 +215.666595 +121.000000 +139.555573,113.000000,0.000000 +8 +XuiSkinSelectSectionBackground + + + + +RequiredLabel +120.000000 +27.000000 +12.000000,118.000000,0.000000 +9 +XuiLabelDarkCentred8 + + + + +VillagerText +364.000000 +24.000000 +0.000000,16.000000,0.000000 +LabelContainerSceneCentreSmall + + + + +Offer2Label +72.000000 +38.000000 +56.000000,192.000000,0.000000 +9 +XuiLabelVertCentDarkLeft8 + + + + +Offer1Label +72.000000 +38.000000 +57.000000,151.000000,0.000000 +9 +XuiLabelVertCentDarkLeft8 + + + + +ScrollLeftArrow +16.000000 +24.000000 +32.000000,56.000000,0.000000 +XuiScrollEndLeft + + + + +ScrollRightArrow +16.000000 +24.000000 +318.000000,56.000000,0.000000 +XuiScrollEndRight + + + + +Request1 +38.000000 +38.000000 +15.000000,151.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Request2 +38.000000 +38.000000 +15.000000,192.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar0 +38.000000 +38.000000 +48.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar1 +38.000000 +38.000000 +86.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar2 +38.000000 +38.000000 +124.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar3 +38.000000 +38.000000 +162.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar4 +38.000000 +38.000000 +200.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar5 +38.000000 +38.000000 +238.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar6 +38.000000 +38.000000 +276.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingSelector +43.000000 +43.000000 +45.000000,47.000000,0.000000 +CraftingPanelHighlightSmall + + + + +InventoryGrid +207.000000 +99.000000 +144.000000,131.000000,0.000000 + + + +Inventory +198.000000 +66.000000 +4.000000,0.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + +UseRow +198.000000 +22.000000 +4.000000,76.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + + +InventoryLabel +212.000000 +14.000000 +141.000000,116.000000,0.000000 +9 +XuiLabelDarkCentred8 + + + + +HtmlTextPanel +42.000000 +42.000000 +50.000000,85.000000,0.000000 +false +HtmlItemDescriptionSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +138.000015,118.500008,0.000000 + + + +0 +138.000000,118.500008,0.000000 + + + +2 +100 +-100 +50 +138.000000,118.500008,0.000000 + + + +0 +34.000000,118.500008,0.000000 + + + +2 +100 +-100 +50 +34.000000,118.500008,0.000000 + + + +0 +138.000000,118.500008,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_trading_small.xui b/Minecraft.Client/Common/Media/xuiscene_trading_small.xui new file mode 100644 index 00000000..23dbc5e4 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trading_small.xui @@ -0,0 +1,6205 @@ + + +640.000000 +360.000000 + + + +XuiSceneTrading +640.000000 +360.000000 +CXuiSceneTrading +XuiBlankScene +Pointer + + + +Group +364.000000 +243.000000 +138.000015,3.000000,0.000000 +15 +GraphicPanel +Pointer + + + +TradingWindow +126.777763 +121.000000 +10.000000,113.000000,0.000000 +8 +XuiSkinSelectSectionBackground + + + + +TradingWindow1 +215.666595 +121.000000 +139.555573,113.000000,0.000000 +8 +XuiSkinSelectSectionBackground + + + + +RequiredLabel +120.000000 +27.000000 +12.000000,117.222229,0.000000 +9 +XuiLabelDarkCentred8 + + + + +VillagerText +364.000000 +24.000000 +0.000000,15.000000,0.000000 +LabelContainerSceneCentreSmall + + + + +Offer2Label +72.000000 +38.000000 +56.000000,192.000000,0.000000 +9 +XuiLabelVertCentDarkLeft8 + + + + +Offer1Label +72.000000 +38.000000 +56.000000,151.000000,0.000000 +9 +XuiLabelVertCentDarkLeft8 + + + + +ScrollLeftArrow +16.000000 +24.000000 +32.000000,56.000000,0.000000 +XuiScrollEndLeft + + + + +ScrollRightArrow +16.000000 +24.000000 +318.000000,56.000000,0.000000 +XuiScrollEndRight + + + + +Request1 +38.000000 +38.000000 +14.000000,151.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +Request2 +38.000000 +38.000000 +14.000000,192.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar0 +38.000000 +38.000000 +48.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar1 +38.000000 +38.000000 +86.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar2 +38.000000 +38.000000 +124.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar3 +38.000000 +38.000000 +162.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar4 +38.000000 +38.000000 +200.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar5 +38.000000 +38.000000 +238.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingBar6 +38.000000 +38.000000 +276.000000,50.000000,0.000000 +CXuiCtrlCraftIngredientSlot +ItemButtonRedSmall + + + + +TradingSelector +43.000000 +43.000000 +45.000000,47.000000,0.000000 +CraftingPanelHighlightSmall + + + + +InventoryGrid +207.000000 +99.000000 +144.000000,131.000000,0.000000 + + + +Inventory +198.000000 +66.000000 +4.000000,0.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + +UseRow +198.000000 +22.000000 +4.000000,76.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical22 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +32.000000 +32.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton32 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + +control_ListItem +22.000000 +22.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton22 +22594 +4 + + + + + + +InventoryLabel +212.000000 +14.000000 +141.000000,116.000000,0.000000 +9 +XuiLabelDarkCentred8 + + + + +HtmlTextPanel +42.000000 +42.000000 +58.000000,87.000000,0.000000 +false +HtmlItemDescriptionSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +138.000015,3.000000,0.000000 + + + +0 +138.000000,3.000000,0.000000 + + + +2 +100 +-100 +50 +138.000000,3.000000,0.000000 + + + +0 +34.000000,3.000000,0.000000 + + + +2 +100 +-100 +50 +34.000000,3.000000,0.000000 + + + +0 +138.000000,3.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_trap.h b/Minecraft.Client/Common/Media/xuiscene_trap.h new file mode 100644 index 00000000..1bb7a7eb --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trap.h @@ -0,0 +1,53 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Trap L"Trap" +#define IDC_InventoryText L"InventoryText" +#define IDC_DispenserText L"DispenserText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_DispenserScene L"DispenserScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_trap.xui b/Minecraft.Client/Common/Media/xuiscene_trap.xui new file mode 100644 index 00000000..ec0f6b72 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trap.xui @@ -0,0 +1,790 @@ + + +1280.000000 +720.000000 + + + +DispenserScene +1280.000000 +720.000000 +CXuiSceneTrap +XuiBlankScene +Pointer + + + +Group +430.000000 +405.000000 +425.000000,128.000000,0.000000 +15 +XuiScene +Pointer + + + +Inventory +383.000000 +129.000000 +25.000000,208.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +UseRow +382.000000 +45.000000 +25.000000,346.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +Trap +130.000000 +131.000000 +151.000031,46.000000,0.000000 +2 +CXuiCtrlSlotList +ItemGridVertical + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + + +InventoryText +374.000000 +26.000000,178.000000,0.000000 +LabelContainerSceneLeft + + + + +DispenserText +268.000000 +150.000000,16.000000,0.000000 +LabelContainerSceneLeft + + + + +Pointer +42.000000 +42.000000 +-185.000000,-176.000015,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointer + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +425.000000,128.000000,0.000000 + + + +0 +425.000000,128.000000,0.000000 + + + +2 +100 +-100 +50 +425.000000,128.000000,0.000000 + + + +0 +160.000000,128.000000,0.000000 + + + +2 +100 +-100 +50 +160.000000,128.000000,0.000000 + + + +0 +425.000000,128.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_trap_480.h b/Minecraft.Client/Common/Media/xuiscene_trap_480.h new file mode 100644 index 00000000..dbf9c0f5 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trap_480.h @@ -0,0 +1,95 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Trap L"Trap" +#define IDC_InventoryText L"InventoryText" +#define IDC_DispenserText L"DispenserText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_DispenserScene L"DispenserScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_trap_480.xui b/Minecraft.Client/Common/Media/xuiscene_trap_480.xui new file mode 100644 index 00000000..b40f7608 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trap_480.xui @@ -0,0 +1,1295 @@ + + +640.000000 +480.000000 + + + +DispenserScene +1280.000000 +720.000000 +CXuiSceneTrap +XuiBlankScene +Pointer + + + +Group +260.000000 +280.000000 +190.000000,100.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Inventory +234.000000 +80.000000 +13.000009,152.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +234.000000 +13.000009,240.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +Trap +80.000000 +80.000000 +91.000031,36.000000,0.000000 +2 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +InventoryText +232.000000 +22.000000 +12.000000,132.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +DispenserText +160.000000 +25.000000 +90.000000,14.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +Pointer +26.000000 +26.000000 +-50.000000,-40.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000000,100.000000,0.000000 + + + +0 +190.000000,100.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,100.000000,0.000000 + + + +0 +33.750000,100.000000,0.000000 + + + +2 +100 +-100 +50 +60.000000,100.000000,0.000000 + + + +0 +190.000000,100.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_trap_small.h b/Minecraft.Client/Common/Media/xuiscene_trap_small.h new file mode 100644 index 00000000..1bb7a7eb --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trap_small.h @@ -0,0 +1,53 @@ +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Inventory L"Inventory" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_UseRow L"UseRow" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_control_ListItem L"control_ListItem" +#define IDC_Trap L"Trap" +#define IDC_InventoryText L"InventoryText" +#define IDC_DispenserText L"DispenserText" +#define IDC_Pointer L"Pointer" +#define IDC_Group L"Group" +#define IDC_DispenserScene L"DispenserScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_trap_small.xui b/Minecraft.Client/Common/Media/xuiscene_trap_small.xui new file mode 100644 index 00000000..cf6db849 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trap_small.xui @@ -0,0 +1,749 @@ + + +640.000000 +360.000000 + + + +DispenserScene +640.000000 +360.000000 +CXuiSceneTrap +XuiBlankScene +Pointer + + + +Group +260.000000 +280.000000 +190.000000,0.000000,0.000000 +15 +GraphicPanel +Pointer + + + +Inventory +234.000000 +80.000000 +12.000000,151.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +UseRow +234.000000 +12.000000,240.000000,0.000000 +8 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +Trap +80.000000 +80.000000 +91.000031,36.000000,0.000000 +2 +CXuiCtrlSlotList +ItemGridVertical26 + + + +control_ListItem +42.000000 +42.000000 +7 +0.000000,50.000000,0.000000 +false +CXuiCtrlSlotItemListItem +ItemButton +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + +control_ListItem +26.000000 +26.000000 +7 +false +CXuiCtrlSlotItemListItem +ItemButton26 +22594 +4 + + + + + +InventoryText +232.000000 +22.000000 +12.000000,130.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +DispenserText +162.000000 +25.000000 +90.000000,14.000000,0.000000 +LabelContainerSceneLeftSmall + + + + +Pointer +26.000000 +26.000000 +-50.000000,-50.000000,0.000000 +9 +false +CXuiCtrlSlotItem +ItemPointerSmall + + + + + + +Normal + + + +EndNormal + +stop + + +MoveLeft + + + +EndMoveLeft + +stop + + +MoveRight + + + +EndMoveRight + +gotoandstop +EndNormal + + + +Group +Position + + +0 +190.000000,0.000000,0.000000 + + + +0 +190.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +190.000000,0.000000,0.000000 + + + +0 +64.000000,0.000000,0.000000 + + + +2 +100 +-100 +50 +92.000000,0.000000,0.000000 + + + +0 +190.000000,0.000000,0.000000 + + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_trialexitupsell.h b/Minecraft.Client/Common/Media/xuiscene_trialexitupsell.h new file mode 100644 index 00000000..ff96c45c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trialexitupsell.h @@ -0,0 +1,3 @@ +#define IDC_XuiImage2 L"XuiImage2" +#define IDC_XuiImage1 L"XuiImage1" +#define IDC_TrialExitUpsell L"TrialExitUpsell" diff --git a/Minecraft.Client/Common/Media/xuiscene_trialexitupsell.xui b/Minecraft.Client/Common/Media/xuiscene_trialexitupsell.xui new file mode 100644 index 00000000..8980372f --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trialexitupsell.xui @@ -0,0 +1,127 @@ + + +1280.000000 +720.000000 + + + +TrialExitUpsell +1280.000000 +720.000000 +CScene_TrialExitUpsell +XuiBlackScene + + + +XuiImage2 +1280.000000 +720.000000 +Graphics\UpsellScreenshots\Screenshot2.png + + + + +XuiImage1 +1280.000000 +720.000000 +Graphics\UpsellScreenshots\Screenshot1.png + + + + + +Normal + + + +EndNormal + +stop + + +Fade1to2 + + + +EndFade1to2 + +stop + + +Fade2to1 + + + +EndFade2to1 + +stop + + + +XuiImage1 +Opacity + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +1.000000 + + + + + + + +Normal + + + +EndNormal + +stop + + +Fade1to2 + + + +EndFade1to2 + +stop + + +Fade2to1 + + + +EndFade2to1 + +stop + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_trialexitupsell_480.h b/Minecraft.Client/Common/Media/xuiscene_trialexitupsell_480.h new file mode 100644 index 00000000..ff96c45c --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trialexitupsell_480.h @@ -0,0 +1,3 @@ +#define IDC_XuiImage2 L"XuiImage2" +#define IDC_XuiImage1 L"XuiImage1" +#define IDC_TrialExitUpsell L"TrialExitUpsell" diff --git a/Minecraft.Client/Common/Media/xuiscene_trialexitupsell_480.xui b/Minecraft.Client/Common/Media/xuiscene_trialexitupsell_480.xui new file mode 100644 index 00000000..423da0bf --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_trialexitupsell_480.xui @@ -0,0 +1,131 @@ + + +640.000000 +480.000000 + + + +TrialExitUpsell +640.000000 +480.000000 +CScene_TrialExitUpsell +XuiBlackScene + + + +XuiImage2 +860.000000 +480.000000 +-109.999969,0.000000,0.000000 +16 +Graphics\UpsellScreenshots\Screenshot2.png + + + + +XuiImage1 +860.000000 +480.000000 +-109.999969,0.000000,0.000000 +16 +Graphics\UpsellScreenshots\Screenshot1.png + + + + + +Normal + + + +EndNormal + +stop + + +Fade1to2 + + + +EndFade1to2 + +stop + + +Fade2to1 + + + +EndFade2to1 + +stop + + + +XuiImage1 +Opacity + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +1.000000 + + + +0 +0.000000 + + + +0 +0.000000 + + + +0 +1.000000 + + + + + + + +Normal + + + +EndNormal + +stop + + +Fade1to2 + + + +EndFade1to2 + +stop + + +Fade2to1 + + + +EndFade2to1 + +stop + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_tutorialpopup.h b/Minecraft.Client/Common/Media/xuiscene_tutorialpopup.h new file mode 100644 index 00000000..d6c9924d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_tutorialpopup.h @@ -0,0 +1,6 @@ +#define IDC_Description L"Description" +#define IDC_XuiInventoryPic L"XuiInventoryPic" +#define IDC_XuiImage L"XuiImage" +#define IDC_Title L"Title" +#define IDC_FontSize L"FontSize" +#define IDC_TutorialPopup L"TutorialPopup" diff --git a/Minecraft.Client/Common/Media/xuiscene_tutorialpopup.xui b/Minecraft.Client/Common/Media/xuiscene_tutorialpopup.xui new file mode 100644 index 00000000..17828a27 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_tutorialpopup.xui @@ -0,0 +1,83 @@ + + +1280.000000 +720.000000 + + + +TutorialPopup +497.000000 +210.000000 +719.000000,53.000000,0.000000 +true +CScene_TutorialPopup +PointerTextPanel + + + +Description +447.000000 +170.000000 +25.000000,20.000000,0.000000 +5 +XuiHtmlControl + + + + +XuiInventoryPic +64.000000 +64.000000 +216.000000,126.000000,0.000000 +24 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +XuiImage +320.000000 +180.000000 +88.000000,10.000000,0.000000 +24 +false +TutorialExitScreenshot.png + + + + +Title +447.000000 +43.000000 +25.000000,20.000000,0.000000 +5 +false +XuiLabelLight_Shadowed + + + + +FontSize +205.000000 +74.000000 +-198.000000,524.000000,0.000000 +18 + + + + +XuiText1 +657.000000 +139.000000 +-209.000000,442.000000,0.000000 +true +To change the font size of the text in the HTML control, change the value of the "FontSize" control to the size required. +0xff0f0f0f +0x800f0f0f +0 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_tutorialpopup_480.h b/Minecraft.Client/Common/Media/xuiscene_tutorialpopup_480.h new file mode 100644 index 00000000..d6c9924d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_tutorialpopup_480.h @@ -0,0 +1,6 @@ +#define IDC_Description L"Description" +#define IDC_XuiInventoryPic L"XuiInventoryPic" +#define IDC_XuiImage L"XuiImage" +#define IDC_Title L"Title" +#define IDC_FontSize L"FontSize" +#define IDC_TutorialPopup L"TutorialPopup" diff --git a/Minecraft.Client/Common/Media/xuiscene_tutorialpopup_480.xui b/Minecraft.Client/Common/Media/xuiscene_tutorialpopup_480.xui new file mode 100644 index 00000000..38b6e07f --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_tutorialpopup_480.xui @@ -0,0 +1,83 @@ + + +640.000000 +480.000000 + + + +TutorialPopup +250.000000 +230.000000 +340.000000,40.000000,0.000000 +true +CScene_TutorialPopup +PointerTextPanel + + + +Description +225.000000 +185.000000 +12.000000,12.000000,0.000000 +5 +XuiHtmlControl + + + + +XuiInventoryPic +32.000000 +32.000000 +108.000000,186.000000,0.000000 +24 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +XuiImage +160.000000 +90.000000 +45.000000,156.000000,0.000000 +24 +false +TutorialExitScreenshot.png + + + + +Title +225.000000 +44.000000 +12.000000,20.000000,0.000000 +5 +false +XuiLabelLight_Shadowed + + + + +FontSize +205.000000 +74.000000 +-198.000000,524.000000,0.000000 +12 + + + + +XuiText1 +657.000000 +139.000000 +-209.000000,442.000000,0.000000 +true +To change the font size of the text in the HTML control, change the value of the "FontSize" control to the size required. +0xff0f0f0f +0x800f0f0f +0 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_tutorialpopup_small.h b/Minecraft.Client/Common/Media/xuiscene_tutorialpopup_small.h new file mode 100644 index 00000000..d6c9924d --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_tutorialpopup_small.h @@ -0,0 +1,6 @@ +#define IDC_Description L"Description" +#define IDC_XuiInventoryPic L"XuiInventoryPic" +#define IDC_XuiImage L"XuiImage" +#define IDC_Title L"Title" +#define IDC_FontSize L"FontSize" +#define IDC_TutorialPopup L"TutorialPopup" diff --git a/Minecraft.Client/Common/Media/xuiscene_tutorialpopup_small.xui b/Minecraft.Client/Common/Media/xuiscene_tutorialpopup_small.xui new file mode 100644 index 00000000..62f741d9 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_tutorialpopup_small.xui @@ -0,0 +1,84 @@ + + +1280.000000 +720.000000 + + + +TutorialPopup +250.000000 +210.000000 +390.000000,4.000000,0.000000 +true +CScene_TutorialPopup +PointerTextPanel + + + +Description +230.000000 +190.000000 +10.000000,10.000000,0.000000 +5 +XuiHtmlControl + + + + +XuiInventoryPic +32.000000 +32.000000 +108.000000,168.000000,0.000000 +24 +false +CXuiCtrlCraftIngredientSlot +ItemButtonRed + + + + +XuiImage +160.000000 +90.000000 +45.000000,110.000000,0.000000 +24 +false +TutorialExitScreenshot.png + + + + +Title +230.000000 +44.000000 +10.000000,10.000000,0.000000 +5 +false +XuiLabelLight_ShadowedSmall + + + + +FontSize +205.000000 +74.000000 +-198.000000,524.000000,0.000000 +12 + + + + + +XuiText1 +657.000000 +139.000000 +-209.000000,442.000000,0.000000 +true +To change the font size of the text in the HTML control, change the value of the "FontSize" control to the size required. +0xff0f0f0f +0x800f0f0f +0 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_win.h b/Minecraft.Client/Common/Media/xuiscene_win.h new file mode 100644 index 00000000..53d37dd5 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_win.h @@ -0,0 +1,4 @@ +#define IDC_HtmlControl L"HtmlControl" +#define IDC_Darken L"Darken" +#define IDC_FocusSink L"FocusSink" +#define IDC_WinScene L"WinScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_win.xui b/Minecraft.Client/Common/Media/xuiscene_win.xui new file mode 100644 index 00000000..fcfdf820 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_win.xui @@ -0,0 +1,68 @@ + + +1280.000000 +720.000000 + + + +WinScene +1280.000000 +720.000000 +CScene_Win +XuiBackgroundScroll +FocusSink + + + +HtmlControl +532.000000 +720.000000 +374.000031,0.000000,0.000000 +XuiHtmlControl_EndStory +false + + + + +Darken +1280.000000 +1280.000000 +-63.999886,-23.999947,0.000000 +1.100000,0.600000,1.000000 +15 + + +0xff0f0f80 + + + + +3 +0x0f0f0f0f + + +true +3 +0x230f0f0f +0x2d0f0f0f +0xe10f0f0f +0.000000 +0.537255 +1.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,1131.000000,0.000000,0,1131.000000,0.000000,1131.000000,0.000000,1131.000000,719.000000,0,1131.000000,719.000000,1131.000000,719.000000,0.000000,719.000000,0,0.000000,719.000000,0.000000,719.000000,0.000000,0.000000,0, + + + + +FocusSink +1320.000000,98.000000,0.000000 + + + + diff --git a/Minecraft.Client/Common/Media/xuiscene_win_480.h b/Minecraft.Client/Common/Media/xuiscene_win_480.h new file mode 100644 index 00000000..53d37dd5 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_win_480.h @@ -0,0 +1,4 @@ +#define IDC_HtmlControl L"HtmlControl" +#define IDC_Darken L"Darken" +#define IDC_FocusSink L"FocusSink" +#define IDC_WinScene L"WinScene" diff --git a/Minecraft.Client/Common/Media/xuiscene_win_480.xui b/Minecraft.Client/Common/Media/xuiscene_win_480.xui new file mode 100644 index 00000000..4492b7e2 --- /dev/null +++ b/Minecraft.Client/Common/Media/xuiscene_win_480.xui @@ -0,0 +1,69 @@ + + +640.000000 +480.000000 + + + +WinScene +640.000000 +480.000000 +0.000031,0.000000,0.000000 +CScene_Win +XuiBackgroundScroll +FocusSink + + + +HtmlControl +380.000000 +480.000000 +130.000031,-0.000000,0.000000 +XuiHtmlControl_EndStory +false + + + + +Darken +640.000000 +640.000000 +-19.199951,-15.999989,0.000000 +1.060000,0.800000,1.000000 +15 + + +0xff0f0f80 + + + + +3 +0x0f0f0f0f + + +true +3 +0x230f0f0f +0x2d0f0f0f +0xe10f0f0f +0.000000 +0.537255 +1.000000 + + +1 + + +true +4,0.000000,0.000000,0.000000,0.000000,1131.000000,0.000000,0,1131.000000,0.000000,1131.000000,0.000000,1131.000000,719.000000,0,1131.000000,719.000000,1131.000000,719.000000,0.000000,719.000000,0,0.000000,719.000000,0.000000,719.000000,0.000000,0.000000,0, + + + + +FocusSink +1320.000000,98.000000,0.000000 + + + + diff --git a/Minecraft.Client/Common/Media/zh-CHT/4J_strings.resx b/Minecraft.Client/Common/Media/zh-CHT/4J_strings.resx new file mode 100644 index 00000000..90cddc7f --- /dev/null +++ b/Minecraft.Client/Common/Media/zh-CHT/4J_strings.resx @@ -0,0 +1,108 @@ + +未使用 + +確定 + +返回 + +å–æ¶ˆ + +是 + +å¦ + +å­˜æª”å·²ææ¯€ + +æ‚¨çš„éŠæˆ²å­˜æª”å·²ææ¯€ã€‚è¦å»ºç«‹æ–°çš„å­˜æª”ï¼Œä¸¦è¦†å¯«ææ¯€çš„存檔嗎? + +沒有å¯ç”¨ç©ºé–“ + +å·²é¸å–儲存è£ç½®æ²’有足夠的å¯ç”¨ç©ºé–“ä¾†å»ºç«‹éŠæˆ²å­˜æª”。 + +å†é¸å–一次 + +ä¸å„²å­˜å³é€²è¡ŒéŠæˆ² + +建立新存檔 + +è¦è¦†å¯«å­˜æª”嗎? + +å·²é¸å–儲存è£ç½®å·²ç¶“有這個存檔,確定è¦è¦†å¯«è©²å­˜æª”嗎? + +å¦ï¼šä¸è¦è¦†å¯« + +覆寫並儲存 + +儲存失敗 + +儲存è£ç½®çš„å•題 + +儲存è£ç½®ç„¡æ³•使用,或儲存è£ç½®ç™¼ç”ŸéŒ¯èª¤ + +儲存è£ç½®ç„¡æ³•使用,或儲存è£ç½®ç™¼ç”ŸéŒ¯èª¤ã€‚è«‹é¸å–新的儲存è£ç½®ã€‚ + +é¸å–新的儲存è£ç½® + +尚未é¸å–儲存è£ç½® + +如果您ä¸é¸å–儲存è£ç½®ï¼Œç³»çµ±å°‡æœƒåœç”¨å„²å­˜éŠæˆ²çš„功能 + +é¸å–儲存è£ç½® + +ä¸å„²å­˜å³ç¹¼çºŒ + +儲存è£ç½®å·²é­ç§»é™¤ï¼Œè«‹é¸å–新的儲存è£ç½®ã€‚ + +載入失敗 + +為存檔命å + +è«‹è¼¸å…¥éŠæˆ²å­˜æª”çš„å稱 + +返回 Xbox è¨­å®šç•«é¢ + +確定è¦é›¢é–‹éŠæˆ²å—Žï¼Ÿ + +已登出 + +您的玩家設定檔已登出,因此您å³å°‡è¿”å›žæ¨™é¡Œç•«é¢ + +æŸå€‹çŽ©å®¶è¨­å®šæª”å·²ç™»å‡ºï¼Œå› æ­¤é…å°éŠæˆ²å³å°‡çµæŸ + +ç¹¼çºŒé€²è¡ŒéŠæˆ² + +玩家設定檔沒有登入 + +é€™å€‹éŠæˆ²æœ‰æŸäº›åŠŸèƒ½éœ€è¦ä½¿ç”¨å·²å•Ÿç”¨ Xbox LIVE åŠŸèƒ½çš„çŽ©å®¶è¨­å®šæª”ï¼Œä½†æ‚¨çš„çŽ©å®¶è¨­å®šæª”ç›®å‰æ²’有登入 Xbox LIVE。 + +這個功能需è¦ä½¿ç”¨å·²ç™»å…¥ Xbox LIVE 的玩家設定檔。 + +連線至 Xbox LIVE + +ç¹¼çºŒé›¢ç·šé€²è¡ŒéŠæˆ² + +æˆå°±çŽé …å•題 + +ç³»çµ±åœ¨è®€å–æ‚¨çš„玩家設定檔時發生å•題,因此您目å‰ç„¡æ³•ç²å¾—æˆå°±ã€‚ + +玩家設定檔的å•題 + +無法將設定儲存至玩家設定檔。 + +訪客玩家設定檔 + +訪客玩家設定檔無法使用這個功能,請使用ä¸åŒçš„玩家設定檔。 + +正在儲存... + +正在儲存,請勿關閉主機。 + +è§£é™¤å®Œæ•´ç‰ˆéŠæˆ²éŽ–å®š + +這是 Minecraft è©¦çŽ©ç‰ˆéŠæˆ²ã€‚å¦‚æžœæ‚¨æ“æœ‰å®Œæ•´ç‰ˆéŠæˆ²ï¼Œé‚£æ‚¨å‰›å‰›å°±ç²å¾—了 1 個æˆå°±ï¼ +è§£é™¤å®Œæ•´ç‰ˆéŠæˆ²å³å¯äº«å— Minecraft çš„éŠæˆ²æ­¡æ¨‚,而且還能é€éŽ Xbox LIVE 與世界å„地的好å‹ä¸€èµ·çŽ©éŠæˆ²ã€‚ +想è¦è§£é™¤å®Œæ•´ç‰ˆéŠæˆ²éŽ–å®šå—Žï¼Ÿ + +ç³»çµ±åœ¨è®€å–æ‚¨çš„設定檔時發生å•題。å³å°‡è¿”回主畫é¢ã€‚ + + diff --git a/Minecraft.Client/Common/Media/zh-CHT/strings.resx b/Minecraft.Client/Common/Media/zh-CHT/strings.resx new file mode 100644 index 00000000..7c9861f8 --- /dev/null +++ b/Minecraft.Client/Common/Media/zh-CHT/strings.resx @@ -0,0 +1,4464 @@ + +新的下載內容ç¾å·²æŽ¨å‡ºï¼è«‹é¸å–主畫é¢çš„ [Minecraft 商店] 按鈕來å–得下載內容。 + +您å¯ä»¥ç”¨ Minecraft 商店裡的角色外觀套件來變更角色的外觀喔。é¸å–主畫é¢ä¸­çš„ [Minecraft 商店] 按鈕,去看看有哪些好æ±è¥¿å§ã€‚ + +å¦‚æžœæ‚¨é¸æ“‡é«˜ç•«è³ªæ¨¡å¼ï¼Œå°±èƒ½è®“最多 4 ä½çŽ©å®¶åœ¨åŒä¸€å°ä¸»æ©Ÿä¸Šä»¥åˆ†å‰²ç•«é¢åŒæ™‚é€²è¡ŒéŠæˆ²ï¼ + +將其他控制器連接至您的主機,然後按下這些控制器的 START éµå°±èƒ½éš¨æ™‚åŠ å…¥éŠæˆ²ã€‚ + +調整 [色差補正] è¨­å®šå°±èƒ½è®“éŠæˆ²ç•«é¢è®Šäº®æˆ–變暗。 + +å¦‚æžœæ‚¨å°‡éŠæˆ²å›°é›£åº¦è¨­å®šç‚º [和平]ï¼Œæ‚¨çš„ç”Ÿå‘½å€¼å°±æœƒè‡ªå‹•å›žå¾©ï¼Œè€Œä¸”å¤œæ™šä¸æœƒå‡ºç¾æ€ªç‰©ï¼ + +用骨頭來餵狼來馴æœç‰ ï¼Œç„¶å¾Œå°±èƒ½è®“牠å下或是跟著您走。 + +ç•¶æ‚¨é–‹å•Ÿç‰©å“æ¬„é¸å–®æ™‚,åªè¦æŠŠæ¸¸æ¨™ç§»å‹•到é¸å–®å¤–é¢ï¼Œç„¶å¾ŒæŒ‰ä¸‹ {*CONTROLLER_VK_A*} å³å¯ä¸Ÿæ£„物å“。 + +夜晚時,在床舖上ç¡è¦ºå°±èƒ½è®“éŠæˆ²æ™‚é–“å¿«è½‰åˆ°æ—¥å‡ºï¼›ä½†åœ¨å¤šäººéŠæˆ²ä¸­ï¼Œæ‰€æœ‰çŽ©å®¶å¿…é ˆåŒæ™‚ç¡åœ¨åºŠèˆ–ä¸Šï¼Œæ‰æœƒæœ‰é€™ç¨®æ•ˆæžœã€‚ + +您å¯ä»¥æ®ºæ­»è±¬ä¾†ç²å¾—ç”Ÿè±¬è‚‰ï¼Œç„¶å¾Œåœ¨çƒ¹ç…®å¾ŒåƒæŽ‰ç†Ÿè±¬è‚‰ä¾†å›žå¾©ç”Ÿå‘½å€¼ã€‚ + +您å¯ä»¥æ®ºæ­»ä¹³ç‰›ä¾†ç²å¾—çš®é©ï¼Œç„¶å¾Œç”¨ä¾†è£½ä½œè­·ç”²ã€‚ + +如果您有空的桶å­ï¼Œå¯ä»¥ç”¨åœ¨ä¹³ç‰›èº«ä¸Šä¾†è£ç‰›å¥¶ã€è£æ°´ï¼Œæˆ–是è£ç†”岩。 + +您å¯ä»¥ç”¨é‹¤é ­å¢¾åœ°ï¼Œä¾†æº–備栽種作物用的地é¢ã€‚ + +èœ˜è››ä¸æœƒåœ¨ç™½å¤©æ”»æ“Šæ‚¨ï¼Œé™¤éžæ‚¨å…ˆå±•開攻擊。 + +用éŸå­ä¾†æŒ–泥土或沙å­ï¼Œæœƒæ¯”ç”¨æ‰‹ä¾†æŒ–å¿«å¤šäº†ï¼ + +åƒä¸‹ç†Ÿè±¬è‚‰æ‰€å›žå¾©çš„生命值,會比åƒä¸‹ç”Ÿè±¬è‚‰æ‰€å›žå¾©çš„å¤šï¼ + +åˆ¥å¿˜äº†è£½é€ äº›ç«æŠŠï¼Œä»¥ä¾¿åœ¨å¤œæ™šæ™‚ç…§äº®å››å‘¨çš„ç’°å¢ƒï¼Œè€Œä¸”æ€ªç‰©æœƒé¿é–‹ç«æŠŠé™„è¿‘çš„å€åŸŸã€‚ + +您å¯ä»¥åˆ©ç”¨ç¤¦è»Šèˆ‡è»Œé“,來快速抵é”ç›®çš„åœ°ï¼ + +åªè¦æ ½ç¨®æ¨¹è‹—ï¼Œæ¨¹è‹—å°±æœƒé•·æˆæ¨¹æœ¨ã€‚ + +æ®­å± Pigmen 䏿œƒæ”»æ“Šæ‚¨ï¼Œé™¤éžæ‚¨å…ˆå±•開攻擊。 + +åªè¦åœ¨åºŠèˆ–上ç¡è¦ºï¼Œå°±èƒ½è®Šæ›´æ™‚é–“å†ç”Ÿé»žï¼Œä¸¦è®“éŠæˆ²æ™‚間快轉到日出。 + +把 Ghast 發射的ç«çƒæ‰“å›žåŽ»ï¼ + +建造傳é€é–€å°±èƒ½è®“您å‰å¾€åœ°ç„。 + +按下 {*CONTROLLER_VK_B*} å³å¯ä¸Ÿæ£„您手上æ¡è‘—的物å“ï¼ + +別忘了è¦ä½¿ç”¨æ­£ç¢ºçš„工具來åšäº‹ï¼ + +如果您找ä¸åˆ°ç…¤å¡Šä¾†è£½é€ ç«æŠŠï¼Œå¯ä»¥ç”¨ç†”çˆç«ç‡’木頭來製造木炭。 + +我們ä¸å»ºè­°æ‚¨ç›´ç›´å¾€ä¸‹æŒ–,或是直直往上挖。 + +從骷é«çš„骨頭精製出來的骨粉å¯ä»¥ç•¶åšè‚¥æ–™ï¼Œè®“æ¤ç‰©ç«‹åˆ»é•·å¤§å–”ï¼ + +ç•¶ Creeper é è¿‘æ‚¨æ™‚ï¼Œå°±æœƒè‡ªçˆ†ï¼ + +ç•¶æ°´ç¢°åˆ°ç†”å²©æºæ–¹å¡Šæ™‚,就會產生黑曜石。 + +ç•¶æ‚¨ç§»é™¤ç†”å²©æºæ–¹å¡Šå¾Œï¼Œç†”岩在好幾分é˜å¾Œæ‰æœƒå®Œå…¨æ¶ˆå¤±ã€‚ + +Ghast çš„ç«çƒç„¡æ³•破壞éµåµçŸ³ï¼Œå› æ­¤éµåµçŸ³å¾ˆé©åˆç”¨ä¾†ä¿è­·å‚³é€é–€ã€‚ + +å¯åšç‚ºå…‰æºçš„æ–¹å¡Šèƒ½å¤ èžåŒ–ç™½é›ªå’Œå†°å¡Šï¼Œé€™äº›æ–¹å¡ŠåŒ…æ‹¬ç«æŠŠã€é–ƒçŸ³åŠå—瓜燈。 + +在野外以羊毛åšç‚ºå»ºç¯‰ææ–™ä¾†è“‹æ±è¥¿æ™‚,åƒè¬è¦å°å¿ƒï¼Œå› ç‚ºé›·é›¨çš„閃電會讓羊毛著ç«ã€‚ + +ä½¿ç”¨ç†”çˆæ™‚,1 個熔岩桶å¯è®“您熔煉 100 個方塊。 + +音符方塊所演å¥çš„æ¨‚器種類,是根據底下方塊的æè³ªè€Œå®šã€‚ + +白天時,如果殭å±å’Œéª·é«åœ¨æ°´ä¸­å°±èƒ½æ´»ä¸‹åŽ»ã€‚ + +如果您攻擊æŸéš»ç‹¼ï¼Œå››å‘¨çš„æ‰€æœ‰ç‹¼å°±æœƒé–‹å§‹æ”»æ“Šæ‚¨ã€‚è€Œæ®­å± Pigmen 也有這種特點。 + +狼無法進入地ç„。 + +ç‹¼ä¸æœƒæ”»æ“Š Creeper。 + +é›žæ¯ 5 到 10 分é˜å°±æœƒä¸‹ä¸€æ¬¡è›‹ã€‚ + +黑曜石åªèƒ½ç”¨é‘½çŸ³éŽ¬ä¾†é–‹æŽ¡ã€‚ + +最容易å–å¾—ç«è—¥çš„來æºå°±æ˜¯ Creeper。 + +把 2 個箱å­ä¸¦æŽ’放置,就能製造出 1 個大箱å­ã€‚ + +馴æœçš„狼的生命值高低,會以尾巴的ä½ç½®ä¾†è¡¨ç¤ºã€‚åªè¦é¤µç‹¼åƒè‚‰ï¼Œå°±èƒ½æ²»ç™‚狼。 + +在熔çˆçƒ¹ç…®ä»™äººæŽŒï¼Œå³å¯ç²å¾—綠色染料。 + +åªè¦åœ¨ Twitter 上關注 4J Studios å’Œ Kappische 的動態,就能ç²å¾— Minecraft 的最新消æ¯ï¼ + +é€éŽæš«åœé¸å–®æŠŠèž¢å¹•æ“·å–ç•«é¢åˆ†äº«åˆ° Facebook 上,讓好å‹é©šå˜†æ‚¨åœ¨ Minecraft ä¸­çš„å‰µä½œï¼ + +閱讀 [éŠæˆ²æ–¹å¼] é¸å–®ä¸­çš„ [最新資訊] 部分,å³å¯ç²å¾— Minecraft 的最新更新資訊。 + +ç¾åœ¨æŸµæ¬„å¯ä»¥å †ç–Šå›‰ï¼ + +Minecraft 的論壇上有個特別ä¿ç•™çµ¦ Xbox 360 Edition çš„åœ°æ–¹å–”ï¼ + +如果您的手中有å°éº¥ï¼Œæœ‰äº›å‹•物會跟著您。 + +åªè¦å‹•物無法æœä»»ä¸€æ–¹å‘ç§»å‹•è¶…éŽ 20 個方塊的è·é›¢ï¼Œç‰ å°±ä¸æœƒæ¶ˆå¤±ã€‚ + +音樂是由 C418 æ‰€è£½ä½œï¼ + +Notch 在 Twitter ä¸Šå·²ç¶“æœ‰è¶…éŽ 100 è¬ä½çš„é—œæ³¨è€…äº†ï¼ + +ä¸¦éžæ‰€æœ‰ç‘žå…¸äººéƒ½æœ‰é‡‘髮,有些瑞典人 (åƒæ˜¯ Mojang 裡的 Jens) å°±æ“æœ‰ç´…é«®ï¼ + +我們èªç‚º 4J Studios 已經把 Xbox 360 版本中的 Herobrine 拿掉了,ä¸éŽæˆ‘們ä¸ç¢ºå®šé€™å€‹æ¶ˆæ¯æ˜¯çœŸæ˜¯å‡ã€‚ + +æˆ‘å€‘æœƒç‚ºé€™å€‹éŠæˆ²æŽ¨å‡ºæ›´æ–°ç¨‹å¼ï¼ + +Notch 是誰? + +Mojang ç²å¾—çš„çŽé …數目比員工數目還è¦å¤šï¼ + +有些å人很喜歡玩 Minecraft å–”ï¼ + +deadmau5 喜歡玩 Minecraftï¼ + +åˆ¥ç›´è¦–éŠæˆ²çš„程å¼éŒ¯èª¤ã€‚ + +Creeper 就是從æŸå€‹ç¨‹å¼éŒ¯èª¤ä¸­èª•生的。 + +這是雞?還是鴨å­ï¼Ÿ + +您有去 Minecon 嗎? + +在 Mojang è£¡ï¼Œæ²’äººçœ‹éŽ Junkboy 的臉。 + +æ‚¨çŸ¥é“ Minecraft Wiki 嗎? + +Mojang 的新 office å¾ˆé…·å–”ï¼ + +Minecraft: Xbox 360 Edition æ‰“ç ´äº†è¨±å¤šç´€éŒ„ï¼ + +2013 å¹´çš„ Minecon 於美國佛羅里é”å·žå¥§è˜­å¤šèˆ‰è¾¦ï¼ + +.party() æ£’æ¥µäº†ï¼ + +è¦æ°¸é å‡è¨­è¬ è¨€æ˜¯éŒ¯èª¤çš„,ä¸è¦ç•¶çœŸï¼ + +{*T3*}éŠæˆ²æ–¹å¼ï¼šåŸºæœ¬ä»‹ç´¹{*ETW*}{*B*}{*B*} +Minecraft 是一款å¯è®“æ‚¨æ”¾ç½®æ–¹å¡Šä¾†å»ºé€ å¤¢æƒ³ä¸–ç•Œçš„éŠæˆ²ã€‚但åƒè¬åˆ¥å¿˜äº†è¦åœ¨å¤œè¡Œæ€ªç‰©å‡ºç¾ä¹‹å‰ï¼Œå…ˆè“‹å¥½ä¸€å€‹æ£²èº«è™•喔。{*B*}{*B*} +使用 {*CONTROLLER_ACTION_LOOK*} å³å¯å››è™•觀看。{*B*}{*B*} +使用 {*CONTROLLER_ACTION_MOVE*} å³å¯å››è™•移動。{*B*}{*B*} +按下 {*CONTROLLER_ACTION_JUMP*} å³å¯è·³èºã€‚{*B*}{*B*} +å¿«é€Ÿå¾€å‰æŒ‰å…©ä¸‹ {*CONTROLLER_ACTION_MOVE*} å³å¯å¥”è·‘ã€‚ç•¶æ‚¨å¾€å‰æŒ‰ä½ {*CONTROLLER_ACTION_MOVE*} æ™‚ï¼Œè§’è‰²å°‡æœƒç¹¼çºŒå¥”è·‘ï¼Œç›´åˆ°å¥”è·‘æ™‚é–“çµæŸï¼Œæˆ–是食物列少於 {*ICON_SHANK_03*} 為止。{*B*}{*B*} +æŒ‰ä½ {*CONTROLLER_ACTION_ACTION*} å³å¯ç”¨æ‚¨çš„æ‰‹ï¼Œæˆ–是手中æ¡ä½çš„æ±è¥¿ä¾†é–‹æŽ¡åŠåŠˆç ã€‚但您å¯èƒ½éœ€è¦ç²¾è£½å‡ºå·¥å…·ä¾†é–‹æŽ¡æŸäº›æ–¹å¡Šã€‚{*B*}{*B*} +當您手中æ¡è‘—æŸæ¨£ç‰©å“時,使用 {*CONTROLLER_ACTION_USE*} å³å¯ä½¿ç”¨è©²ç‰©å“;您也å¯ä»¥æŒ‰ä¸‹ {*CONTROLLER_ACTION_DROP*} 來丟棄該物å“。 + +{*T3*}éŠæˆ²æ–¹å¼ï¼šæŠ¬é ­é¡¯ç¤ºå™¨{*ETW*}{*B*}{*B*} +抬頭顯示器會顯示您的相關資訊,例如狀態ã€ç”Ÿå‘½å€¼ã€åœ¨æ°´ä¸­æ™‚的剩餘氧氣é‡ã€æ‚¨çš„飢餓程度 (需è¦åƒæ±è¥¿ä¾†è£œå……),以åŠç©¿æˆ´è­·ç”²æ™‚的護甲值。 如果您失去部分生命值,但是食物列有 9 個以上的 {*ICON_SHANK_01*},您的生命值將會自動回復。åªè¦åƒä¸‹é£Ÿç‰©ï¼Œå°±èƒ½è£œå……食物列。{*B*} +ç¶“é©—å€¼åˆ—åŒæ™‚也顯示在此處,經驗等級將以數字顯示,列æ¢åœ–示則顯示出æå‡è‡³ä¸‹ä¸€ç­‰ç´šæ‰€éœ€çš„經驗值。 收集生物被殺死時掉è½çš„å…‰çƒã€é–‹æŽ¡ç‰¹å®šçš„æ–¹å¡Šã€ç¹æ®–動物ã€é‡£é­šï¼Œæˆ–使用熔çˆç†”煉或烹煮皆å¯ç´¯ç©ç¶“驗值。{*B*}{*B*} +抬頭顯示器也會顯示您å¯ä»¥ä½¿ç”¨çš„物å“。使用 {*CONTROLLER_ACTION_LEFT_SCROLL*} å’Œ {*CONTROLLER_ACTION_RIGHT_SCROLL*} å³å¯è®Šæ›´æ‚¨æ‰‹ä¸­çš„物å“。 + +{*T3*}éŠæˆ²æ–¹å¼ï¼šç‰©å“欄{*ETW*}{*B*}{*B*} +使用 {*CONTROLLER_ACTION_INVENTORY*} å³å¯æª¢è¦–æ‚¨çš„ç‰©å“æ¬„。{*B*}{*B*} +é€™å€‹ç•«é¢æœƒé¡¯ç¤ºæ‚¨æ‰‹ä¸­å¯ä½¿ç”¨çš„物å“ï¼Œä»¥åŠæ‚¨èº«ä¸Šçš„æ‰€æœ‰å…¶ä»–物å“。您穿戴的護甲也會顯示在這裡。{*B*}{*B*} +使用 {*CONTROLLER_MENU_NAVIGATE*} å³å¯ç§»å‹•游標。使用 {*CONTROLLER_VK_A*} å³å¯æ’¿èµ·æ¸¸æ¨™ä¸‹çš„物å“。如果游標下有數個物å“,您將會撿起所有物å“,但您也å¯ä»¥ä½¿ç”¨ {*CONTROLLER_VK_X*} 撿起一åŠçš„物å“。{*B*}{*B*} +您å¯ä»¥ä½¿ç”¨ {*CONTROLLER_VK_A*} 用游標把物å“ç§»å‹•åˆ°ç‰©å“æ¬„çš„å¦ä¸€å€‹ç©ºæ ¼ä¸Šï¼Œç„¶å¾ŒæŠŠç‰©å“放置在那裡。如果游標上有數個物å“,使用 {*CONTROLLER_VK_A*} å³å¯æ”¾ç½®æ‰€æœ‰ç‰©å“,但您也å¯ä»¥ä½¿ç”¨ {*CONTROLLER_VK_X*} åªæ”¾ç½® 1 個物å“。{*B*}{*B*} +å¦‚æžœæ¸¸æ¨™ä¸‹çš„ç‰©å“æ˜¯è­·ç”²ï¼Œç•«é¢æœƒå‡ºç¾å·¥å…·æç¤ºï¼Œè®“æ‚¨èƒ½å¤ å¿«é€Ÿåœ°æŠŠè­·ç”²ç§»å‹•è‡³ç‰©å“æ¬„中正確的護甲空格。{*B*}{*B*} +您也å¯ä»¥è—‰ç”±æŸ“色來改變您的皮甲é¡è‰²ï¼Œæ‚¨å¯ä»¥åœ¨ç‰©å“欄中使用游標撿起染色劑並將其移動到您想染色的目標上然後按下 {*CONTROLLER_VK_X*} 來染色。 + + +{*T3*}éŠæˆ²æ–¹å¼ï¼šç®±å­{*ETW*}{*B*}{*B*} +ç•¶æ‚¨ç²¾è£½å‡ºç®±å­æ™‚ï¼Œå°±èƒ½å°‡ç®±å­æ”¾ç½®åœ¨éŠæˆ²ä¸–界中,然後用 {*CONTROLLER_ACTION_USE*} 來使用箱å­ï¼Œä»¥ä¾¿å­˜æ”¾æ‚¨ç‰©å“欄中的物å“。{*B*}{*B*} +您å¯ä»¥ä½¿ç”¨æ¸¸æ¨™åœ¨ç‰©å“欄與箱å­ä¹‹é–“移動物å“。{*B*}{*B*} +ç®±å­æœƒä¿å­˜æ‚¨çš„物å“ï¼Œç­‰æ‚¨ä¹‹å¾Œæœ‰éœ€è¦æ™‚å†å°‡ç‰©å“ç§»å‹•åˆ°ç‰©å“æ¬„中。 + + +{*T3*}éŠæˆ²æ–¹å¼ï¼šå¤§ç®±å­{*ETW*}{*B*}{*B*} +把 2 個箱å­ä¸¦æŽ’æ”¾ç½®å°±èƒ½çµ„åˆæˆ 1 個大箱å­ï¼Œè®“您能存放更多物å“。{*B*}{*B*} +大箱å­çš„使用方å¼å°±è·Ÿæ™®é€šç®±å­ä¸€æ¨£ã€‚ + + +{*T3*}éŠæˆ²æ–¹å¼ï¼šç²¾è£½ç‰©å“{*ETW*}{*B*}{*B*} +您å¯ä»¥åœ¨ç²¾è£½ä»‹é¢ä¸­ï¼ŒæŠŠç‰©å“欄中的物å“組åˆèµ·ä¾†ï¼Œç²¾è£½å‡ºæ–°é¡žåž‹çš„物å“。使用 {*CONTROLLER_ACTION_CRAFTING*} å³å¯é–‹å•Ÿç²¾è£½ä»‹é¢ã€‚{*B*}{*B*} +使用 {*CONTROLLER_VK_LB*} å’Œ {*CONTROLLER_VK_RB*} 來ä¾åºåˆ‡æ›é ‚端的索引標籤,以便é¸å–您想è¦è£½ä½œçš„物å“類型,然後使用 {*CONTROLLER_MENU_NAVIGATE*} 來é¸å–您è¦ç²¾è£½çš„物å“。{*B*}{*B*} +精製å€åŸŸæœƒé¡¯ç¤ºç²¾è£½æ–°ç‰©å“æ‰€éœ€çš„ææ–™ã€‚按下 {*CONTROLLER_VK_A*} å³å¯ç²¾è£½ç‰©å“ï¼Œä¸¦å°‡è©²ç‰©å“æ”¾ç½®åœ¨ç‰©å“欄中。 + + +{*T3*}éŠæˆ²æ–¹å¼ï¼šç²¾è£½å°{*ETW*}{*B*}{*B*} +精製å°å¯è®“您精製出種類較多的物å“。{*B*}{*B*} +å…ˆå°‡ç²¾è£½å°æ”¾ç½®åœ¨éŠæˆ²ä¸–界中,然後按下 {*CONTROLLER_ACTION_USE*} å³å¯ä½¿ç”¨ã€‚{*B*}{*B*} +精製å°çš„é‹ä½œæ–¹æ³•è·ŸåŸºæœ¬çš„ç²¾è£½ä»‹é¢æ˜¯ä¸€æ¨£çš„ï¼Œä½†æ‚¨æœƒæ“æœ‰è¼ƒå¤§çš„精製空間,能精製出的物å“種類也較多。 + + +{*T3*}éŠæˆ²æ–¹å¼ï¼šç†”çˆ{*ETW*}{*B*}{*B*} +熔çˆå¯è®“您é€éŽç«ç‡’來改變物å“。舉例來說,您å¯ä»¥ä½¿ç”¨ç†”çˆæŠŠéµç¤¦çŸ³è½‰è®ŠæˆéµéŒ å¡Šã€‚{*B*}{*B*} +å…ˆå°‡ç†”çˆæ”¾ç½®åœ¨éŠæˆ²ä¸–界中,然後按下 {*CONTROLLER_ACTION_USE*} å³å¯ä½¿ç”¨ã€‚{*B*}{*B*} +您必須把燃料放在熔çˆçš„底部,熔çˆé ‚ç«¯çš„ç‰©å“æ‰æœƒç‡ƒç‡’。{*B*}{*B*} +當物å“ç«ç‡’完畢後,您就能把物å“從æˆå“å€ç§»å‹•åˆ°ç‰©å“æ¬„中。{*B*}{*B*} +å¦‚æžœæ¸¸æ¨™ä¸‹çš„ç‰©å“æ˜¯é©åˆç†”çˆä½¿ç”¨çš„ææ–™æˆ–ç‡ƒæ–™ï¼Œç•«é¢æœƒå‡ºç¾å·¥å…·æç¤ºï¼Œè®“您能夠快速將物å“移動至熔çˆã€‚ + + +{*T3*}éŠæˆ²æ–¹å¼ï¼šç™¼å°„器{*ETW*}{*B*}{*B*} +發射器å¯ç”¨ä¾†å°„出物å“,但您必須在發射器æ—邊放置開關 (例如拉桿),æ‰èƒ½å•Ÿå‹•發射器。{*B*}{*B*} +如è¦ç”¨ç‰©å“è£å¡«ç™¼å°„器,åªè¦å…ˆæŒ‰ä¸‹ {*CONTROLLER_ACTION_USE*}ï¼Œå†æŠŠæ‚¨è¦å°„出的物å“å¾žç‰©å“æ¬„移動到發射器å³å¯ã€‚{*B*}{*B*} +ç¾åœ¨ï¼Œç•¶æ‚¨ä½¿ç”¨é–‹é—œæ™‚,發射器就會射出 1 個物å“。 + + +{*T3*}éŠæˆ²æ–¹å¼ï¼šé‡€è£½{*ETW*}{*B*}{*B*} +æ‚¨å¿…é ˆä½¿ç”¨é‡€è£½å°æ‰èƒ½é‡€è£½è—¥æ°´ï¼Œè€Œé‡€è£½å°å¯åœ¨ç²¾è£½å°å»ºé€ ã€‚ä¸è«–您想釀製哪一種藥水,都必須先使用水瓶。您å¯å°‡çŽ»ç’ƒç“¶è£å…¥æ°´æ§½æˆ–å…¶ä»–æ°´æºçš„æ°´ä¾†è£½ä½œæ°´ç“¶ã€‚{*B*} +æ¯å€‹é‡€è£½å°ä¸­éƒ½æœ‰ä¸‰å€‹æ”¾ç½®ç“¶å­çš„空格,代表您å¯ä»¥åŒæ™‚釀製三瓶藥水。而åŒä¸€ç¨®ææ–™å¯åŒæ™‚讓三個瓶å­ä½¿ç”¨ï¼Œæ‰€ä»¥æœ€æœ‰æ•ˆçŽ‡çš„ä½œæ³•å°±æ˜¯æ¯ä¸€æ¬¡éƒ½åŒæ™‚釀製三瓶藥水。{*B*} +åªè¦å°‡è—¥æ°´æ‰€éœ€çš„ææ–™æ”¾åœ¨é‡€è£½å°çš„上方,經éŽä¸€æ®µæ™‚間後å³å¯é‡€è£½å‡ºåŸºæœ¬è—¥æ°´ã€‚基本藥水本身並ä¸å…·å‚™ä»»ä½•效果,但您åªéœ€å†ä½¿ç”¨å¦ä¸€é …ææ–™ï¼Œå³å¯é‡€è£½å‡ºå…·å‚™æ•ˆåŠ›çš„è—¥æ°´ã€‚{*B*} +釀製出藥水後,您å¯ä»¥å†åŠ å…¥ç´…çŸ³å¡µè®“è—¥æ°´çš„æ•ˆåŠ›æ›´æŒä¹…,或加入閃石塵讓藥水更具å¨åŠ›ï¼Œæˆ–æ˜¯ç”¨ç™¼é…µèœ˜è››çœ¼è®“è—¥æ°´çš„å‚·å®³æ€§æ›´å¼·ã€‚{*B*} +您也å¯åŠ å…¥ç«è—¥ï¼Œå°‡è—¥æ°´è®Šæˆå¯ç”¨ä¾†æŠ•擲的噴濺藥水。投擲噴濺藥水å³å¯å°‡è—¥æ°´çš„æ•ˆåŠ›æ³¢åŠå…¶è½é»žé™„è¿‘çš„å€åŸŸã€‚{*B*} + +å¯ç”¨ä¾†è£½ä½œè—¥æ°´çš„ææ–™åŒ…括:-{*B*}{*B*} +* {*T2*}地ç„çµç¯€{*ETW*}{*B*} +* {*T2*}蜘蛛眼{*ETW*}{*B*} +* {*T2*}ç ‚ç³–{*ETW*}{*B*} +* {*T2*}Ghast æ·šæ°´{*ETW*}{*B*} +* {*T2*}Blaze 粉{*ETW*}{*B*} +* {*T2*}熔岩çƒ{*ETW*}{*B*} +* {*T2*}發光西瓜{*ETW*}{*B*} +* {*T2*}紅石塵{*ETW*}{*B*} +* {*T2*}閃石塵{*ETW*}{*B*} +* {*T2*}發酵蜘蛛眼{*ETW*}{*B*}{*B*} + +請試著組åˆå„種ä¸åŒçš„ææ–™ï¼Œæ‰¾å‡ºé‡€è£½å„種ä¸åŒè—¥æ°´æ‰€éœ€çš„æ–¹ç¨‹å¼ã€‚ + + +{*T3*}éŠæˆ²æ–¹å¼ï¼šé™„加能力{*ETW*}{*B*}{*B*} +收集生物被殺死時掉è½çš„å…‰çƒã€é–‹æŽ¡ç‰¹å®šçš„æ–¹å¡Šï¼Œæˆ–使用熔çˆç†”煉或烹煮皆å¯ç´¯ç©ç¶“驗值,您必須使用經驗值æ‰èƒ½å°‡ç‰¹æ®Šèƒ½åŠ›é™„åŠ åˆ°æ­¦å™¨ã€æ›¸æœ¬ã€è­·ç”²æˆ–特定工具上。{*B*} +當您將åŠã€å¼“ã€æ–§ã€éެã€éŸã€æ›¸æœ¬å’Œè­·ç”²æ”¾åˆ°é™„加能力å°çš„æ›¸ä¸‹æ–¹çš„空格後,空格å³é‚Šçš„三個按鈕會顯示一些附加能力,以åŠä½¿ç”¨è©²é™„加能力所需的經驗等級。{*B*} +當您的經驗等級ä¸è¶³æ™‚,所需的經驗等級會以紅色呈ç¾ï¼›è¶³å¤ æ™‚則以綠色呈ç¾ã€‚{*B*}{*B*} +被附加的能力是根據所顯示經驗等級多寡隨機挑é¸å‡ºä¾†ã€‚{*B*}{*B*} +當附加能力å°çš„周åœè¢«æ›¸æž¶åœä½ (æœ€å¤šå¯æœ‰ 15 個書架),且書架和附加能力å°çš„ä¸­é–“æœ‰ä¸€å€‹æ–¹å¡Šçš„ç©ºé–“æ™‚ï¼Œé™„åŠ èƒ½åŠ›çš„æ•ˆæžœæœƒå¢žå¼·ï¼ŒåŒæ™‚附加能力å°çš„æ›¸ä¸Šæœƒé¡¯ç¤ºç¥žç§˜çš„圖示。{*B*}{*B*} +é™„åŠ èƒ½åŠ›å°æ‰€éœ€ä½¿ç”¨çš„ææ–™éƒ½å¯åœ¨è©²ä¸–界的æ‘è½ä¸­è¢«æ‰¾åˆ°ï¼Œæˆ–經由開採或栽種而得到。{*B*}{*B*} +在éµç §ä¸Šä½¿ç”¨é™„é­”å°å†Šä¾†å°ç‰©å“使用附加能力。這能讓您有更多自由決定è¦å°ç‰©å“使用何種附加能力。{*B*} + + +{*T3*}éŠæˆ²æ–¹å¼ï¼šè±¢é¤Šå‹•物{*ETW*}{*B*}{*B*} +當您想è¦å°‡å‹•物èšé›†åœ¨åŒä¸€å€‹åœ°æ–¹è±¢é¤Šæ™‚,å¯ä»¥å»ºé€ ä¸€å€‹å¤§å°ä¸è¶…éŽ 20x20 個方塊的柵欄å€åŸŸï¼Œç„¶å¾Œå°‡æ‚¨çš„動物放置在裡é¢ã€‚這樣就能確ä¿ç‰ å€‘在您回來的時候還在那裡。 + + +{*T3*}éŠæˆ²æ–¹å¼ï¼šç¹æ®–動物{*ETW*}{*B*}{*B*} +ç¾åœ¨ Minecraft éŠæˆ²ä¸­çš„動物å¯ä»¥ç¹æ®–,生出å°å‹•物了ï¼{*B*} +您必須餵動物åƒç‰¹å®šçš„食物,讓動物進入戀愛模å¼ï¼Œå‹•物æ‰èƒ½ç¹æ®–。{*B*} +餵乳牛ã€Mooshroomã€æˆ–綿羊åƒå°éº¥ï¼Œé¤µè±¬åƒç´…蘿蔔,餵雞åƒå°éº¥ç¨®å­æˆ–地ç„çµç¯€ï¼Œé¤µç‹¼åƒè‚‰ï¼Œç„¶å¾Œé€™äº›å‹•物就會開始尋找也在戀愛模å¼ä¸­çš„åŒç¨®é¡žå‹•物。{*B*} +ç•¶åŒåœ¨æˆ€æ„›æ¨¡å¼ä¸­çš„å…©éš»åŒç¨®é¡žå‹•物相é‡ï¼Œç‰ å€‘æœƒå…ˆè¦ªå»æ•¸ç§’,剛出生的å°å‹•物就會出ç¾ã€‚å°å‹•物在長æˆä¸€èˆ¬æˆå¹´å‹•物大å°å‰éƒ½æœƒè·Ÿåœ¨çˆ¶æ¯èº«æ—。{*B*} +å‰›çµæŸæˆ€æ„›æ¨¡å¼çš„動物必須等待大約五分é˜å¾Œï¼Œæ‰èƒ½å†æ¬¡é€²å…¥æˆ€æ„›æ¨¡å¼ã€‚{*B*} +åœ¨éŠæˆ²ä¸–界中有動物數é‡é™åˆ¶ï¼Œå› æ­¤åœ¨æ‚¨æ“有很多動物的時候會發ç¾ç‰ å€‘ä¸å†ç¹æ®–了。 + +{*T3*}éŠæˆ²æ–¹å¼ï¼šåœ°ç„傳é€é–€{*ETW*}{*B*}{*B*} +地ç„傳é€é–€å¯è®“玩家在地上世界與地ç„世界之間往返。您å¯ä»¥åˆ©ç”¨åœ°ç„世界在地上世界中快速移動,因為在地ç„世界移動 1 個方塊的è·é›¢ï¼Œå°±ç­‰æ–¼åœ¨åœ°ä¸Šä¸–界移動 3 個方塊的è·é›¢ã€‚ +因此當您在地ç„世界建造傳é€é–€ä¸¦é€šéŽå®ƒæ™‚,您出ç¾åœ¨åœ°ä¸Šä¸–界的移動è·é›¢ï¼Œå°‡æœƒæ˜¯ä»¥é€²å…¥å‚³é€é–€ç‚ºèµ·é»žæ™‚çš„ 3 å€ã€‚{*B*}{*B*} +è¦å»ºé€ å‚³é€é–€è‡³å°‘éœ€è¦ 10 個黑曜石方塊,且傳é€é–€å¿…é ˆè¦æœ‰ 5 個方塊高,4 個方塊寬,1 個方塊厚。當您建造好傳é€é–€çš„æ¡†æž¶å¾Œï¼Œå¿…é ˆè¦ç”¨ç«å½ˆç‰©å“讓框架中的空間著ç«ï¼Œæ‰èƒ½å•Ÿå‹•傳é€é–€ã€‚{*B*}{*B*} +å³é‚Šåœ–片中有數種傳é€é–€çš„範例。 + + +{*T3*}éŠæˆ²æ–¹å¼ï¼šå¤šäººéŠæˆ²{*ETW*}{*B*}{*B*} +Xbox One 主機上的 Minecraft é è¨­ç‚ºå¤šäººéŠæˆ²ã€‚å¦‚æžœæ‚¨é¸æ“‡é«˜ç•«è³ªæ¨¡å¼ï¼Œå°±èƒ½éš¨æ™‚è®“æœ¬æ©ŸçŽ©å®¶åŠ å…¥éŠæˆ²ï¼Œåªè¦åœ¨éŠæˆ²é€²è¡Œæ™‚連接控制器並按下 {*CONTROLLER_VK_START*} éµå³å¯ã€‚{*B*}{*B*} +ç•¶æ‚¨é–‹å§‹æˆ–åŠ å…¥ç·šä¸ŠéŠæˆ²æ™‚,您好å‹å單上的玩家就能看到您正在玩 Minecraft (é™¤éžæ‚¨åœ¨ä¸»æŒéŠæˆ²æ™‚é¸å–「僅é™é‚€è«‹ã€);而當好å‹åŠ å…¥æ‚¨çš„éŠæˆ²å¾Œï¼Œå¥½å‹çš„好å‹å單上的玩家也會看到他正在玩 Minecraft (如果您é¸å–了「å…許好å‹çš„好å‹åŠ å…¥ã€é¸é …)。{*B*} +ç•¶æ‚¨é€²è¡ŒéŠæˆ²æ™‚,按下 {*CONTROLLER_VK_BACK*} éµå³å¯è®“æ‚¨çœ‹åˆ°éŠæˆ²ä¸­æ‰€æœ‰å…¶ä»–玩家的åå–®ï¼Œä¸¦å¯æª¢è¦–他們的玩家å¡ã€æŠŠçŽ©å®¶è¸¢å‡ºéŠæˆ²ï¼Œä»¥åŠé‚€è«‹å…¶ä»–çŽ©å®¶åŠ å…¥éŠæˆ²ã€‚ + + +{*T3*}éŠæˆ²æ–¹å¼ï¼šåˆ†äº«èž¢å¹•æ“·å–ç•«é¢{*ETW*}{*B*}{*B*} +åªè¦åœ¨æš«åœé¸å–®æŒ‰ä¸‹ {*CONTROLLER_VK_Y*} å³å¯æ‹æ”螢幕擷å–ç•«é¢ä¸¦åˆ†äº«åˆ° Facebook。您會看到螢幕擷å–ç•«é¢çš„縮圖,還能編輯與該 Facebook 文章相關的文字。{*B*}{*B*} +éŠæˆ²æœ‰å°ˆç‚ºæ‹æ”螢幕擷å–ç•«é¢è€Œè¨­è¨ˆçš„視角模å¼ï¼Œå¯è®“您看到自己角色的正é¢ã€‚先按下 {*CONTROLLER_ACTION_CAMERA*} 直到您看到自己角色的正é¢ï¼Œç„¶å¾ŒæŒ‰ä¸‹ {*CONTROLLER_VK_Y*} å³å¯åˆ†äº«èž¢å¹•æ“·å–ç•«é¢ã€‚{*B*}{*B*} +çŽ©å®¶ä»£è™Ÿä¸æœƒå‡ºç¾åœ¨èž¢å¹•æ“·å–ç•«é¢ä¸­ã€‚ + + +{*T3*}éŠæˆ²æ–¹å¼ï¼šç¦ç”¨é—œå¡{*ETW*}{*B*}{*B*} +如果您在進行æŸå€‹é—œå¡æ™‚看到有冒犯æ„味的內容,å¯ä»¥é¸æ“‡æŠŠé€™å€‹é—œå¡åŠ å…¥æ‚¨çš„ç¦ç”¨é—œå¡æ¸…單。 +方法是先å‰å¾€æš«åœé¸å–®ï¼Œç„¶å¾ŒæŒ‰ä¸‹ {*CONTROLLER_VK_RB*} 來é¸å– [ç¦ç”¨é—œå¡] 工具æç¤ºã€‚ +之後當您è¦åŠ å…¥é€™å€‹é—œå¡æ™‚,系統會æç¤ºæ‚¨è©²é—œå¡å·²åœ¨æ‚¨çš„ç¦ç”¨é—œå¡æ¸…å–®ä¸­ï¼Œç„¶å¾Œè®“æ‚¨é¸æ“‡æ˜¯å¦æŠŠè©²é—œå¡å¾žæ¸…單中移除並進入關å¡ï¼Œæˆ–是è¦é€€å‡ºã€‚ + +{*T3*}éŠæˆ²æ–¹å¼ï¼šå‰µé€ æ¨¡å¼{*ETW*}{*B*}{*B*} +創造模å¼çš„介é¢å¯è®“çŽ©å®¶æŠŠéŠæˆ²ä¸­çš„物å“ç§»å‹•åˆ°è‡ªå·±çš„ç‰©å“æ¬„,ä¸éœ€è¦å…ˆé–‹æŽ¡æˆ–是精製。 +ç•¶çŽ©å®¶åœ¨éŠæˆ²ä¸–ç•Œä¸­æ”¾ç½®æˆ–ä½¿ç”¨é€™äº›ç‰©å“æ™‚,這些物å“䏦䏿œƒå¾žçŽ©å®¶çš„ç‰©å“æ¬„中消失,讓玩家å¯å°ˆæ³¨åœ¨å»ºé€ ä¸Šï¼Œä¸éœ€è¦é–‹æŽ¡æˆ–精製物å“。{*B*} +如果您在創造模å¼ä¸­å»ºç«‹ã€è¼‰å…¥æˆ–儲存世界,該世界的æˆå°±åŠæŽ’è¡Œæ¦œæ›´æ–°åŠŸèƒ½å°‡ç„¡æ³•ä½¿ç”¨ï¼Œå³ä½¿æ‚¨ä¹‹å¾Œä»¥ç”Ÿå­˜æ¨¡å¼è¼‰å…¥è©²ä¸–界,也無法改變這種狀æ³ã€‚{*B*} +在創造模å¼ä¸­ï¼Œå¿«é€ŸæŒ‰å…©ä¸‹ {*CONTROLLER_ACTION_JUMP*} å³å¯é£›ç¿”。如è¦åœæ­¢é£›ç¿”,åªè¦é‡è¤‡é€™å€‹å‹•作å³å¯ã€‚é£›è¡Œæ™‚ï¼Œå¿«é€Ÿå¾€å‰æŒ‰å…©ä¸‹ {*CONTROLLER_ACTION_MOVE*} å³å¯åŠ å¿«é£›è¡Œé€Ÿåº¦ã€‚ +åœ¨é£›ç¿”æ¨¡å¼æ™‚ï¼ŒæŒ‰ä½ {*CONTROLLER_ACTION_JUMP*} å³å¯å¾€ä¸Šé£›ï¼ŒæŒ‰ä½ {*CONTROLLER_ACTION_SNEAK*} å³å¯å¾€ä¸‹é£›ã€‚您也å¯ä»¥ä½¿ç”¨ {*CONTROLLER_ACTION_DPAD_UP*} 來往上飛,使用 {*CONTROLLER_ACTION_DPAD_DOWN*} 來往下飛, +使用 {*CONTROLLER_ACTION_DPAD_LEFT*} 來往左飛,使用 {*CONTROLLER_ACTION_DPAD_RIGHT*} 來往å³é£›ã€‚ + +{*T3*}éŠæˆ²æ–¹å¼ï¼šä¸»æŒäººèˆ‡çީ家é¸é …{*ETW*}{*B*}{*B*} + +{*T1*}éŠæˆ²é¸é …{*ETW*}{*B*} +當載入或建立世界時,您å¯ä»¥æŒ‰ä¸‹ [更多é¸é …] æŒ‰éˆ•ï¼Œä¾†é¸æ“‡æ›´å¤šéŠæˆ²çš„相關設定。{*B*}{*B*} + + {*T2*}玩家 vs 玩家{*ETW*}{*B*} + 啟用此é¸é …時,玩家å°å…¶ä»–玩家å¯ä»¥é€ æˆå‚·å®³ã€‚æ­¤é¸é …åªåœ¨ç”Ÿå­˜æ¨¡å¼ä¸‹å¯ä½¿ç”¨ã€‚{*B*}{*B*} + + {*T2*}信任玩家{*ETW*}{*B*} + åœç”¨æ­¤é¸é …時,會é™åˆ¶åŠ å…¥éŠæˆ²çš„玩家åªèƒ½å¾žäº‹é™å®šçš„æ´»å‹•ã€‚ä»–å€‘ç„¡æ³•é€²è¡Œé–‹æŽ¡æˆ–ä½¿ç”¨é …ç›®ã€æ”¾ç½®æ–¹å¡Šã€ä½¿ç”¨é–€èˆ‡é–‹é—œã€ä½¿ç”¨å®¹å™¨ã€æ”»æ“ŠçŽ©å®¶ï¼Œæˆ–æ”»æ“Šå‹•ç‰©ã€‚æ‚¨å¯ä»¥ä½¿ç”¨éŠæˆ²é¸å–®ç‚ºç‰¹å®šçŽ©å®¶è®Šæ›´ä¸Šè¿°çš„é¸é …。{*B*}{*B*} + + {*T2*}ç«æœƒè”“å»¶{*ETW*}{*B*} + 啟用此é¸é …æ™‚ï¼Œç«æœƒè”“延到附近易燃的方塊。å¯ä»¥å¾žéŠæˆ²ä¸­è®Šæ›´æ­¤é¸é …。{*B*}{*B*} + + {*T2*}炸藥會爆炸{*ETW*}{*B*} + 啟用此é¸é …時,引爆炸藥時會爆炸。å¯ä»¥å¾žéŠæˆ²ä¸­è®Šæ›´æ­¤é¸é …。{*B*}{*B*} + + {*T2*}主æŒäººç‰¹æ¬Š{*ETW*}{*B*} + 啟用此é¸é …時,主æŒäººå¯ä»¥åœ¨éŠæˆ²ä¸­åˆ‡æ›è‡ªå·±çš„飛翔能力ã€åœç”¨ç–²å‹žåŠŸèƒ½ï¼Œæˆ–æ˜¯è®“è‡ªå·±éš±å½¢ã€‚{*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + +{*T1*}產生新世界é¸é …{*ETW*}{*B*} +建立新世界時,有些é¡å¤–çš„é¸é …å¯ä½¿ç”¨ã€‚{*B*}{*B*} + + {*T2*}產生建築{*ETW*}{*B*} + 啟用此é¸é …時,會在世界中產生如æ‘è½èˆ‡åœ°ä¸‹è¦å¡žç­‰å»ºç¯‰ã€‚{*B*}{*B*} + + {*T2*}éžå¸¸å¹³å¦çš„世界{*ETW*}{*B*} + 啟用此é¸é …時,會在地上世界與地ç„世界中產生完全平å¦çš„世界。{*B*}{*B*} + + {*T2*}è´ˆå“ç®±{*ETW*}{*B*} + 啟用此é¸é …時,會在玩家å†ç”Ÿé»žé™„近創造內å«ä¸€äº›æœ‰ç”¨é …目的贈å“箱。{*B*}{*B*} + + {*T2*}é‡è¨­åœ°ç„{*ETW*}{*B*} + 啟用此é¸é …時,會å†åº¦ç”¢ç”Ÿåœ°ç„。如果您的舊存檔中沒有地ç„è¦å¡žï¼Œé€™å°‡æœƒå¾ˆæœ‰ç”¨ã€‚{*B*}{*B*} + + {*T1*}éŠæˆ²ä¸­é¸é …{*ETW*}{*B*} + çŽ©éŠæˆ²æ™‚,按下 BACK éµå¯ä»¥å«å‡ºéŠæˆ²ä¸­åŠŸèƒ½è¡¨ï¼Œå­˜å–æŸäº›é¸é …。{*B*}{*B*} + + {*T2*}主æŒäººé¸é …{*ETW*}{*B*} + 玩家主æŒäººæˆ–設定為管ç†å“¡çš„玩家,å¯ä»¥å­˜å– [主æŒäººé¸é …] 功能表。這些人å¯ä»¥å•Ÿç”¨æˆ–å–æ¶ˆã€Œç«æœƒè”“å»¶ã€åŠã€Œç‚¸è—¥æœƒçˆ†ç‚¸ã€çš„é¸é …。{*B*}{*B*} + +{*T1*}玩家é¸é …{*ETW*}{*B*} +è‹¥è¦ä¿®æ”¹çŽ©å®¶çš„ç‰¹æ¬Šï¼Œå¯ä»¥é¸å–玩家的å字並按下 {*CONTROLLER_VK_A*},這會å«å‡ºçŽ©å®¶ç‰¹æ¬ŠåŠŸèƒ½è¡¨ï¼Œæ‚¨å¯ä»¥ä½¿ç”¨åˆ—出的é¸é …。{*B*}{*B*} + + {*T2*}å¯ä»¥å»ºé€ å’Œé–‹æŽ¡{*ETW*}{*B*} + åªæœ‰åœ¨é—œé–‰ä¿¡ä»»çŽ©å®¶æ™‚æ‰å¯ä»¥ä½¿ç”¨æ­¤é¸é …。啟用此é¸é …時,玩家å¯ä»¥åƒæ˜¯åœ¨æ­£å¸¸ç‹€æ³ä¸‹ä¸€æ¨£èˆ‡ä¸–ç•Œäº’å‹•ã€‚å–æ¶ˆä½¿ç”¨æ­¤é¸é …æ™‚ï¼ŒçŽ©å®¶å°‡ç„¡æ³•æ”¾ç½®æˆ–æ‘§æ¯€æ–¹å¡Šï¼Œä¸¦ç„¡æ³•èˆ‡è¨±å¤šé …ç›®åŠæ–¹å¡Šäº’動。{*B*}{*B*} + + {*T2*}å¯ä»¥ä½¿ç”¨é–€èˆ‡é–‹é—œ{*ETW*}{*B*} + åªæœ‰åœ¨é—œé–‰ä¿¡ä»»çŽ©å®¶æ™‚æ‰å¯ä»¥ä½¿ç”¨æ­¤é¸é …。åœç”¨æ­¤é¸é …時,玩家將無法使用門與開關。{*B*}{*B*} + + {*T2*}å¯ä»¥æ‰“開容器{*ETW*}{*B*} + åªæœ‰åœ¨é—œé–‰ä¿¡ä»»çŽ©å®¶æ™‚æ‰å¯ä»¥ä½¿ç”¨æ­¤é¸é …。åœç”¨æ­¤é¸é …時,玩家將無法打開箱å­ç­‰å®¹å™¨ã€‚{*B*}{*B*} + + {*T2*}å¯ä»¥æ”»æ“Šçީ家{*ETW*}{*B*} + åªæœ‰åœ¨é—œé–‰ä¿¡ä»»çŽ©å®¶æ™‚æ‰å¯ä»¥ä½¿ç”¨æ­¤é¸é …ã€‚å–æ¶ˆä½¿ç”¨æ­¤é¸é …時,玩家將無法å°å…¶ä»–玩家造æˆå‚·å®³ã€‚{*B*}{*B*} + + {*T2*}å¯ä»¥æ”»æ“Šå‹•物{*ETW*}{*B*} + åªæœ‰åœ¨é—œé–‰ä¿¡ä»»çŽ©å®¶æ™‚æ‰å¯ä»¥ä½¿ç”¨æ­¤é¸é …。åœç”¨æ­¤é¸é …時,玩家將無法å°å‹•物造æˆå‚·å®³ã€‚{*B*}{*B*} + + {*T2*}管ç†å“¡{*ETW*}{*B*} + 啟用此é¸é …時,玩家å¯ä»¥ä¿®æ”¹ä¸»æŒäººä»¥å¤–其他玩家的特權 (在「信任玩家ã€é—œé–‰çš„狀態下)ã€è¸¢å‡ºçŽ©å®¶ï¼Œä¸¦å•Ÿç”¨æˆ–åœç”¨ã€Œç«æœƒè”“å»¶ã€åŠã€Œç‚¸è—¥æœƒçˆ†ç‚¸ã€åŠŸèƒ½ã€‚{*B*}{*B*} + + {*T2*}踢出玩家{*ETW*}{*B*} + å°ä½¿ç”¨èˆ‡ä¸»æŒäººçީ家ä¸åŒ {*PLATFORM_NAME*} 主機的玩家é¸å–æ­¤é¸é …,會將該玩家或使用其他 {*PLATFORM_NAME*} ä¸»æ©Ÿçš„çŽ©å®¶è¸¢å‡ºéŠæˆ²ã€‚除éžé‡æ–°å•Ÿå‹•,å¦å‰‡è¢«è¸¢å‡ºçš„玩家無法å†åŠ å…¥éŠæˆ²ã€‚{*B*}{*B*} + +{*T1*}主æŒäººçީ家é¸é …{*ETW*}{*B*} +如果已經啟用主æŒäººç‰¹æ¬Šï¼Œå‰‡ä¸»æŒäººçީ家å¯ä»¥ä¿®æ”¹è‡ªå·±çš„æŸäº›ç‰¹æ¬Šã€‚è‹¥è¦ä¿®æ”¹çŽ©å®¶çš„ç‰¹æ¬Šï¼Œå¯ä»¥é¸å–玩家的å字並按下 {*CONTROLLER_VK_A*},這會å«å‡ºçŽ©å®¶ç‰¹æ¬ŠåŠŸèƒ½è¡¨ï¼Œæ‚¨å¯ä»¥ä½¿ç”¨åˆ—出的é¸é …。{*B*}{*B*} + + {*T2*}å¯ä»¥é£›ç¿”{*ETW*}{*B*} + 啟用此é¸é …時,玩家å¯ä»¥æ“有飛翔的能力。åªèƒ½åœ¨ç”Ÿå­˜æ¨¡å¼ä¸­é¸æ“‡æ˜¯å¦ä½¿ç”¨æ­¤é¸é …。在創造模å¼ä¸­ï¼Œæ‰€æœ‰çš„玩家都有飛翔的能力。{*B*}{*B*} + + {*T2*}åœç”¨ç–²å‹ž{*ETW*}{*B*} + åªèƒ½åœ¨ç”Ÿå­˜æ¨¡å¼ä¸­é¸æ“‡æ˜¯å¦ä½¿ç”¨æ­¤é¸é …。啟用時,消耗體力的活動 (行走/奔跑/è·³èºç­‰ç­‰) 䏿œƒè®“食物列減少。然而,如果玩家å—傷,在玩家回復生命值期間,食物列會緩慢減少。{*B*}{*B*} + + {*T2*}隱形{*ETW*}{*B*} + 啟用此é¸é …時,其他玩家將無法看見玩家,且玩家會變æˆåˆ€æ§ä¸å…¥ã€‚{*B*}{*B*} + {*T2*}å¯ä»¥å‚³é€{*ETW*}{*B*} + 這å¯ä»¥è®“玩家傳é€å…¶ä»–玩家或者他自己到其他玩家身邊。 + + +ä¸‹ä¸€é  + +ä¸Šä¸€é  + +基本介紹 + +抬頭顯示器 + +ç‰©å“æ¬„ + +ç®±å­ + +精製 + +ç†”çˆ + +發射器 + +豢養動物 + +ç¹æ®–動物 + +釀製 + +附加能力 + +地ç„傳é€é–€ + +å¤šäººéŠæˆ² + +分享螢幕擷å–ç•«é¢ + +ç¦ç”¨é—œå¡ + +å‰µé€ æ¨¡å¼ + +主æŒäººèˆ‡çީ家é¸é … + +交易 + +éµç § + +終界 + +{*T3*}éŠæˆ²æ–¹å¼ï¼šçµ‚界{*ETW*}{*B*}{*B*} +çµ‚ç•Œæ˜¯éŠæˆ²ä¸­çš„å¦ä¸€å€‹ä¸–界,åªè¦é€²å…¥å·²å•Ÿå‹•的終界入å£å°±èƒ½åˆ°é”。終界入å£ä½æ–¼åœ°ä¸Šä¸–界的地下深處è¦å¡žã€‚{*B*} +æŠŠçµ‚ç•Œä¹‹çœ¼æ”¾å…¥æ²’æœ‰çµ‚ç•Œä¹‹çœ¼çš„çµ‚ç•Œå…¥å£æ¡†æž¶ä¸­å°±èƒ½å•Ÿå‹•終界入å£ã€‚{*B*} +跳進已啟動的入å£å³å¯å‰å¾€çµ‚界。{*B*}{*B*} +æ‚¨å°‡åœ¨çµ‚ç•Œä¸­å°æŠ—è¨±å¤šçš„ Enderman 以åŠå‡¶ç‹ å¼·å¤§çš„終界é¾ï¼Œæ‰€ä»¥è«‹åœ¨é€²å…¥çµ‚界之å‰åšå¥½æº–å‚™ï¼ {*B*}{*B*} +æ‚¨æœƒç™¼ç¾ 8 æ ¹é»‘æ›œçŸ³æŸ±ï¼Œå…¶é ‚ç«¯éƒ½æœ‰çµ‚ç•Œæ°´æ™¶ï¼Œçµ‚ç•Œé¾æœƒç”¨æ°´æ™¶ä¾†æ²»ç™‚自己, +å› æ­¤æˆ°é¬¥çš„ç¬¬ä¸€æ­¥å°±æ˜¯è¦æ‘§æ¯€é€™äº›æ°´æ™¶ã€‚{*B*} +åªè¦ç”¨ç®­å°±èƒ½æ‘§æ¯€å‰é¢å¹¾é¡†æ°´æ™¶ï¼Œä¸éŽå¾Œé¢å¹¾é¡†æ°´æ™¶å—åˆ°éµæŸµæ¬„ç± å­çš„ä¿è­·ï¼Œéœ€è¦å»ºé€ æ–¹å¡ŠæŠµé”çŸ³æŸ±é ‚ç«¯æ‰æœ‰è¾¦æ³•摧毀。{*B*}{*B*} +çµ‚ç•Œé¾æœƒåœ¨æ‚¨å»ºé€ çš„æ™‚候飛éŽä¾†é€²è¡Œæ”»æ“Šä¸¦å‘您å終界酸液çƒï¼{*B*} +åªè¦ä¸€æŽ¥è¿‘被石柱包åœçš„é¾è›‹å°ï¼Œçµ‚界é¾å°±æœƒé£›ä¸‹ä¾†æ”»æ“Šæ‚¨ï¼Œé€™æœƒæ˜¯å°çµ‚界é¾ä½¿å‡ºå¼·åŠ›æ”»æ“Šçš„å¥½æ©Ÿæœƒï¼{*B*} +é–ƒé¿é…¸æ¶²æ°£æ”»æ“Šçš„åŒæ™‚並攻擊終界é¾çš„çœ¼ç›æœƒæœ‰æœ€ä½³çš„æ”»æ“Šæ•ˆæžœã€‚如果å¯ä»¥çš„話,帶好å‹ä¸€èµ·é€²å…¥çµ‚ç•Œå¹«åŠ©æ‚¨ä½œæˆ°ï¼ {*B*}{*B*} +æ‚¨çš„å¥½å‹æœƒåœ¨æ‚¨é€²å…¥çµ‚ç•Œä¹‹å¾Œï¼Œåœ¨ä»–å€‘çš„åœ°åœ–ä¸Šçœ‹åˆ°ä½æ–¼è¦å¡žä¸­çš„終界入å£ï¼Œ +這樣他們就能輕鬆地加入您。 + + +奔跑 + +最新資訊 + +{*T3*}è®Šæ›´åŠæ–°å¢žåŠŸèƒ½{*ETW*}{*B*}{*B*} +- 新增物å“:翡翠ã€ç¿¡ç¿ åŽŸç¤¦ã€ç¿¡ç¿ æ–¹å¡Šã€çµ‚界箱ã€çµ†ç·šé‰¤ã€é™„魔金蘋果ã€éµç §ã€éµåµçŸ³ç‰†ã€é’è‹”åµçŸ³ç‰†ã€å‡‹é›¶éª·é«çš„ç•«åƒã€é¦¬éˆ´è–¯ã€çƒ¤é¦¬éˆ´è–¯ã€æœ‰æ¯’馬鈴薯ã€é‡‘色胡蘿蔔ã€ã€Œé¡˜è€…上鉤〠+å—瓜派ã€å¤œè¦–藥水ã€éš±å½¢è—¥æ°´ã€ç„石英ã€ç„石英原礦ã€çŸ³è‹±æ–¹å¡Šã€çŸ³è‹±æ¿ã€çŸ³è‹±éšŽæ¢¯ã€é›•刻石英方塊ã€å¸Œè‡˜åœ“柱石英方塊ã€é™„é­”å°å†Šã€å„種地毯。{*B*} +- æ–°å¢žå¹³æ»‘æ²™å²©å’Œé›•åˆ»æ²™å²©çš„é…æ–¹ã€‚{*B*} +- æ–°å¢žæ€ªç‰©ï¼šæ®­å±æ‘民。{*B*} +- 新增生æˆåœ°å½¢ç‰¹è‰²å»ºç¯‰ï¼šæ²™æ¼ ç¥žå»Ÿã€æ²™æ¼ æ‘è½ã€å¢æž—神廟。{*B*} +- æ–°å¢žæ‘æ°‘交易功能。{*B*} +- 新增éµç §ä»‹é¢{*B*} +- å¯ä»¥å°‡çš®ç”²æŸ“色。{*B*} +- å¯ä»¥å°‡ç‹¼é …圈染色。{*B*} +- 在騎乘豬隻時å¯ä»¥ä½¿ç”¨ã€Œé¡˜è€…上鉤ã€ä¾†æŽ§åˆ¶æ–¹å‘。{*B*} +- 在贈å“箱中加入更多物å“。{*B*} +- è®Šæ›´ä¸€èˆ¬æ“ºè¨­åŠæ ¼æ–¹å¡Šä»¥åŠå…©å€‹åŠæ ¼æ–¹å¡Šçš„æ“ºè¨­æ©Ÿåˆ¶ã€‚{*B*} +- 變更樓梯以åŠçŸ³ã€æœ¨æ¿ä¸Šä¸‹é¡›å€’的擺設。{*B*} +- 新增ä¸åŒçš„æ‘æ°‘è·æ¥­ã€‚{*B*} +- è‹¥ä½¿ç”¨è§’è‰²è›‹ç”¢ç”Ÿæ‘æ°‘ï¼Œå…¶è·æ¥­å°‡ç‚ºäº‚數設置。{*B*} +- 新增木頭的橫擺é…置。{*B*} +- å¯åœ¨ç†”çˆä¸­ä½¿ç”¨æœ¨è³ªå·¥å…·ä½œç‚ºç‡ƒæ–™ã€‚{*B*} +- å¯ä»¥ä½¿ç”¨èšå¯¶ç‰¹æ®Šèƒ½åŠ›æ”¶å–冰塊和玻璃片。{*B*} +- 木質按鈕和木質壓æ¿å¯ä»¥é€éŽå°„箭啟動。{*B*} +- 地ç„中的怪物å¯ä»¥ç©¿éŽå‚³é€é–€ä¾†åˆ°åœ°ä¸Šä¸–界。{*B*} +- Creeper 和蜘蛛會攻擊最後一個å°ä»–們出手的玩家。{*B*} +- 創造模å¼ä¸‹çš„æ€ªç‰©çŸ­æ™‚間後會回到中立特性。{*B*} +- 移除溺水時發生的擊退效果。{*B*} +- è¢«æ®­å±æ‰“壞的門會顯示傷害。{*B*} +- 冰塊會在地ç„中èžåŒ–。{*B*} +- 水槽在大雨中會自動補水。{*B*} +- 活塞動作的更新時間延長一å€ã€‚{*B*} +- 殺掉豬後會得到馬éžï¼ˆå¦‚果豬身上è£äº†é¦¬éžï¼‰ã€‚{*B*} +- 變更終界天空的é¡è‰²ã€‚{*B*} +- å¯ä»¥æ“ºç½®çµ²ç·šä½¿æˆç‚ºçµ†ç·šã€‚{*B*} +- é›¨æ»´æœƒç©¿éŽæ¨¹è‘‰äº†ã€‚{*B*} +- 拉桿å¯ä»¥å®‰è£åœ¨æ–¹å¡Šçš„底部。{*B*} +- ç‚¸è—¥çš„å‚·å®³æœƒä¾æ“šéŠæˆ²é›£åº¦æ”¹è®Šã€‚{*B*} +- è®Šæ›´æ›¸æœ¬çš„è£½ä½œé…æ–¹ã€‚{*B*} +- 船撞上ç¡è“®è‘‰ä¸æœƒæå£žäº†ï¼Œè€Œä¸æ˜¯èˆ¹æ’žä¸Šç¡è“®è‘‰å°±è§£é«”。{*B*} +- 殺死豬後會得到更多豬肉。{*B*} +- å²èŠå§†ç¾åœ¨æ¯”è¼ƒä¸æœƒåœ¨éžå¸¸å¹³å¦é¡žåž‹çš„世界中出ç¾ã€‚{*B*} +- Creeper 自爆造æˆçš„傷害會ä¾éŠæˆ²é›£åº¦è€Œè®Šå‹•,擊退è·é›¢ä¹Ÿæœƒæ›´é ã€‚{*B*} +- 修正 Endermen 䏿œƒå¼µé–‹å˜´å·´çš„å•題。{*B*} +- 新增玩家傳é€çš„功能 (è«‹è¦‹éŠæˆ²å…§çš„ BACK éµé¸å–®)。{*B*} +- 新增é ç«¯è¨­å®šçŽ©å®¶é£›è¡Œã€éš±èº«ã€ç„¡æ•µçš„主æŒäººé¸é …功能。{*B*} +- 因應本次更新新增物å“,在教學模å¼ä¸­åŠ å…¥æ–°çš„ç‰©å“與功能教學。{*B*} +- 更新唱片箱å­åœ¨æ•™å­¸æ¨¡å¼ä¸­çš„ä½ç½®ã€‚{*B*} + + +{*ETB*}æ­¡è¿Žå›žä¾†ï¼æˆ–許您還沒有注æ„到,您的 Minecraft 已經更新了。{*B*}{*B*} +æˆ‘å€‘ç‚ºæ‚¨å’Œæ‚¨çš„å¥½å‹æ–°å¢žäº†è¨±å¤šåŠŸèƒ½ï¼Œæˆ‘å€‘åœ¨æ­¤ç‚ºæ‚¨é‡é»žåˆ—èˆ‰å¹¾ï¼Œè¶•å¿«çž­è§£ä¸¦é–‹å§‹éŠæˆ²å§ï¼{*B*}{*B*} +{*T1*}新物å“{*ETB*} - ç¿¡ç¿ ã€ç¿¡ç¿ åŽŸç¤¦ã€ç¿¡ç¿ æ–¹å¡Šã€çµ‚界箱ã€çµ†ç·šé‰¤ã€é™„魔金蘋果ã€éµç §ã€èŠ±ç›†ã€éµåµçŸ³ç‰†ã€é’è‹”åµçŸ³ç‰†ã€å‡‹é›¶éª·é«çš„ç•«åƒã€é¦¬éˆ´è–¯ã€çƒ¤é¦¬éˆ´è–¯ã€æœ‰æ¯’馬鈴薯ã€é‡‘色胡蘿蔔ã€ã€Œé¡˜è€…上鉤ã€ã€ +å—瓜派ã€å¤œè¦–藥水ã€éš±å½¢è—¥æ°´ã€ç„石英ã€ç„石英原礦ã€çŸ³è‹±æ–¹å¡Šã€çŸ³è‹±æ¿ã€çŸ³è‹±éšŽæ¢¯ã€é›•刻石英方塊ã€å¸Œè‡˜åœ“柱石英方塊ã€é™„é­”å°å†Šã€å„種地毯。{*B*}{*B*} +{*T1*}新生物{*ETB*} - æ®­å±æ‘æ°‘.{*B*}{*B*} +{*T1*}新功能{*ETB*} - å’Œæ‘æ°‘交易ã€é€éŽéµç §ä¿®ç†æ­¦å™¨å’Œå·¥å…·ï¼Œæˆ–是增加特殊能力,在終界箱裡儲存物å“ã€åœ¨é¨Žä¹˜å°è±¬çš„æ™‚候使用「願者上鉤ã€ä¾†æŽ§åˆ¶è±¬çš„移動方å‘ï¼{*B*}{*B*} +{*T1*}新的迷你教學課程{*ETB*} – 在教學世界裡學習如何使用新功能ï¼{*B*}{*B*} +{*T1*}新的彩蛋{*ETB*} – 我們已經移動了在教學世界裡的秘密唱片,看看您是å¦èƒ½å†æ¬¡æ‰¾å‡ºå®ƒå€‘ï¼{*B*}{*B*} + + +èƒ½é€ æˆæ¯”ç”¨æ‰‹åŠˆç æ›´å¤§çš„傷害。 + +用來挖泥土ã€é’è‰ã€æ²™å­ã€ç¤«çŸ³åŠç™½é›ªæ™‚的速度,會比用手挖還è¦å¿«ã€‚您需è¦ç”¨éŸå­æ‰èƒ½æŒ–雪çƒã€‚ + +您需è¦ç”¨å字鎬æ‰èƒ½é–‹æŽ¡çŸ³é ­ç›¸é—œæ–¹å¡Šå’Œç¤¦çŸ³ã€‚ + +ç”¨ä¾†åŠˆç æœ¨é ­ç›¸é—œæ–¹å¡Šçš„速度,會比用手劈ç é‚„è¦å¿«ã€‚ + +用來在泥土和é’è‰æ–¹å¡Šä¸Šæ•´åœ°ï¼Œä»¥ä¾¿æº–備耕種。 + +木門åªè¦é€éŽä½¿ç”¨æˆ–敲擊,或是使用紅石就能啟動。 + +éµé–€åªèƒ½é€éŽç´…çŸ³ã€æŒ‰éˆ•或開關來開啟。 + +未使用 + +未使用 + +未使用 + +未使用 + +ç©¿æˆ´æ™‚æœƒè®“ä½¿ç”¨è€…æ“æœ‰ 1 點護甲值。 + +ç©¿æˆ´æ™‚æœƒè®“ä½¿ç”¨è€…æ“æœ‰ 3 點護甲值。 + +ç©¿æˆ´æ™‚æœƒè®“ä½¿ç”¨è€…æ“æœ‰ 2 點護甲值。 + +ç©¿æˆ´æ™‚æœƒè®“ä½¿ç”¨è€…æ“æœ‰ 1 點護甲值。 + +ç©¿æˆ´æ™‚æœƒè®“ä½¿ç”¨è€…æ“æœ‰ 2 點護甲值。 + +ç©¿æˆ´æ™‚æœƒè®“ä½¿ç”¨è€…æ“æœ‰ 5 點護甲值。 + +ç©¿æˆ´æ™‚æœƒè®“ä½¿ç”¨è€…æ“æœ‰ 4 點護甲值。 + +ç©¿æˆ´æ™‚æœƒè®“ä½¿ç”¨è€…æ“æœ‰ 1 點護甲值。 + +ç©¿æˆ´æ™‚æœƒè®“ä½¿ç”¨è€…æ“æœ‰ 2 點護甲值。 + +ç©¿æˆ´æ™‚æœƒè®“ä½¿ç”¨è€…æ“æœ‰ 6 點護甲值。 + +ç©¿æˆ´æ™‚æœƒè®“ä½¿ç”¨è€…æ“æœ‰ 5 點護甲值。 + +ç©¿æˆ´æ™‚æœƒè®“ä½¿ç”¨è€…æ“æœ‰ 2 點護甲值。 + +ç©¿æˆ´æ™‚æœƒè®“ä½¿ç”¨è€…æ“æœ‰ 2 點護甲值。 + +ç©¿æˆ´æ™‚æœƒè®“ä½¿ç”¨è€…æ“æœ‰ 5 點護甲值。 + +ç©¿æˆ´æ™‚æœƒè®“ä½¿ç”¨è€…æ“æœ‰ 3 點護甲值。 + +ç©¿æˆ´æ™‚æœƒè®“ä½¿ç”¨è€…æ“æœ‰ 1 點護甲值。 + +ç©¿æˆ´æ™‚æœƒè®“ä½¿ç”¨è€…æ“æœ‰ 3 點護甲值。 + +ç©¿æˆ´æ™‚æœƒè®“ä½¿ç”¨è€…æ“æœ‰ 8 點護甲值。 + +ç©¿æˆ´æ™‚æœƒè®“ä½¿ç”¨è€…æ“æœ‰ 6 點護甲值。 + +ç©¿æˆ´æ™‚æœƒè®“ä½¿ç”¨è€…æ“æœ‰ 3 點護甲值。 + +åªè¦åœ¨ç†”çˆä¸­ç†”煉礦石,就能å–得閃亮的錠塊。錠塊å¯ç”¨ä¾†ç²¾è£½æˆç›¸åŒæè³ªçš„工具。 + +您å¯ä»¥å°‡éŒ å¡Šã€å¯¶çŸ³æˆ–染料精製æˆå¯æ”¾ç½®çš„æ–¹å¡Šï¼Œç„¶å¾Œæ‹¿ä¾†ç•¶åšæ˜‚è²´çš„å»ºç¯‰ææ–™ï¼Œæˆ–是壓縮的礦石存放方å¼ã€‚ + +當玩家ã€å‹•物或怪物è¸ä¸Šå£“æ¿æ™‚,壓æ¿å°±æœƒé€å‡ºé›»æµã€‚如果您讓æ±è¥¿æŽ‰è½åœ¨æœ¨å£“æ¿ä¸Šï¼Œä¹Ÿèƒ½å•Ÿå‹•é€å‡ºé›»æµã€‚ + +å¯ç”¨ä¾†çµ„æˆæ¨“梯。 + +å¯ç”¨ä¾†çµ„æˆé•·é•·çš„æ¨“梯。把 2 個æ¿å­ä¸Šä¸‹é‡ç–Šï¼Œå°±æœƒç”¢ç”Ÿæ™®é€šå¤§å°çš„é›™å±¤æ¿æ–¹å¡Šã€‚ + +å¯ç”¨ä¾†çµ„æˆé•·é•·çš„æ¨“梯。把 2 個æ¿å­ä¸Šä¸‹é‡ç–Šï¼Œå°±æœƒç”¢ç”Ÿæ™®é€šå¤§å°çš„é›™å±¤æ¿æ–¹å¡Šã€‚ + +å¯ç”¨ä¾†ç”¢ç”Ÿå…‰ç·šï¼Œé‚„能用來èžåŒ–白雪和冰塊。 + +無論是哪種木頭,都å¯ä»¥ç²¾è£½æˆæœ¨æ¿ã€‚木æ¿å¯ç•¶åšå»ºç¯‰ææ–™ï¼Œé‚„能用來精製出許多種物å“。 + +å¯ç•¶åšå»ºç¯‰ææ–™ã€‚æ²™å²©ä¸æœƒå—到é‡åŠ›çš„å½±éŸ¿ï¼Œä¸åƒæ™®é€šçš„æ²™å­æœƒå› ç‚ºé‡åŠ›è€Œå¾€ä¸‹æŽ‰ã€‚ + +å¯ç•¶åšå»ºç¯‰ææ–™ã€‚ + +å¯ç”¨ä¾†ç²¾è£½å‡ºç«æŠŠã€ç®­ã€ç‰Œå­ã€æ¢¯å­ã€æŸµæ¬„,還能當åšå·¥å…·èˆ‡æ­¦å™¨çš„æŠŠæ‰‹ã€‚ + +ç•¶éŠæˆ²ä¸–界進入夜晚時,åªè¦ä¸–界中的所有玩家都使用床舖ç¡è¦ºï¼Œå°±èƒ½è®“時間立刻從夜晚跳到早晨。而且使用床舖也會改變玩家的å†ç”Ÿé»žã€‚ +無論您用哪種色彩的羊毛來精製床舖,床舖的色彩都會是一樣的。 + +與一般的精製介é¢ç›¸è¼ƒä¹‹ä¸‹ï¼Œç²¾è£½å°å¯è®“您精製出更多種類的物å“。 + +å¯è®“您熔煉礦石ã€è£½é€ æœ¨ç‚­èˆ‡çŽ»ç’ƒï¼Œé‚„èƒ½çƒ¹ç…®ç”Ÿé­šå’Œç”Ÿè±¬è‚‰ã€‚ + +å¯è®“您在裡é¢å­˜æ”¾æ–¹å¡Šå’Œç‰©å“。把 2 個箱å­ä¸¦æŽ’放置,就能製造出有 2 å€å®¹é‡çš„大箱å­ã€‚ + +å¯ç•¶åšç„¡æ³•èºéŽçš„å±éšœã€‚å°çީ家ã€å‹•ç‰©åŠæ€ªç‰©è€Œè¨€ï¼ŒæŸµæ¬„有 1.5 å€‹æ–¹å¡Šé«˜ï¼›ä½†å°æ–¼å…¶ä»–æ–¹å¡Šä¾†èªªï¼ŒæŸµæ¬„åªæœ‰ 1 個方塊高。 + +å¯è®“您上下攀爬。 + +åªè¦é€éŽä½¿ç”¨æˆ–敲擊,或是使用紅石就能啟動。活æ¿é–€çš„功用與一般的門相åŒï¼Œä½†å¤§å°æ˜¯ 1 x 1 的方塊,而且放置後會平躺在地é¢ä¸Šã€‚ + +å¯é¡¯ç¤ºæ‚¨æˆ–其他玩家輸入的文字。 + +æ¯”ç«æŠŠæ›´äº®çš„å…‰æºã€‚å¯ä»¥ç”¨ä¾†èžåŒ–白雪和冰塊,還能在水é¢ä¸‹ä½¿ç”¨ã€‚ + +å¯ç”¨ä¾†ç”¢ç”Ÿçˆ†ç‚¸ã€‚炸藥放置後,åªè¦ç”¨æ‰“ç«é®é»žç‡ƒï¼Œæˆ–利用電æµå³å¯å•Ÿå‹•。 + +å¯ç”¨ä¾†è£ç‡‰è˜‘è‡ã€‚ç•¶æ‚¨åƒæŽ‰ç‡‰è˜‘è‡æ™‚,碗會ä¿ç•™ä¸‹ä¾†ã€‚ + +å¯ç”¨ä¾†è£æ°´ã€ç†”岩åŠç‰›å¥¶ï¼Œè®“您能夠把這些物å“é‹é€åˆ°å…¶ä»–地方。 + +å¯ç”¨ä¾†è£æ°´ï¼Œè®“您能夠把水é‹é€åˆ°å…¶ä»–地方。 + +å¯ç”¨ä¾†è£ç†”岩,讓您能夠把熔岩é‹é€åˆ°å…¶ä»–地方。 + +å¯ç”¨ä¾†è£ç‰›å¥¶ï¼Œè®“您能夠把牛奶é‹é€åˆ°å…¶ä»–地方。 + +å¯ç”¨ä¾†ç”Ÿç«ã€é»žç‡ƒç‚¸è—¥ï¼Œä»¥åŠå•Ÿå‹•蓋好的傳é€é–€ã€‚ + +å¯ç”¨ä¾†é‡£é­šã€‚ + +會顯示目å‰å¤ªé™½èˆ‡æœˆäº®çš„ä½ç½®ã€‚ + +會æŒçºŒæŒ‡å‘您的起點。 + +用手æ¡ä½æ™‚,會顯示æŸå€‹åœ°å€ä¸­å·²æŽ¢ç´¢å€åŸŸçš„å½±åƒã€‚å¯è®“您用來尋找能å‰å¾€æŸå€‹åœ°é»žçš„路。 + +å¯å°„出箭來é è·æ”»æ“Šã€‚ + +å¯èˆ‡å¼“çµ„æˆæ­¦å™¨ã€‚ + +å¯å›žå¾© 2.5 個 {*ICON_SHANK_01*}。 + +使用 1 次å¯å›žå¾© 1 個 {*ICON_SHANK_01*},總共能使用 6 次。 + +å¯å›žå¾© 1 個 {*ICON_SHANK_01*}。 + +å¯å›žå¾© 1 個 {*ICON_SHANK_01*}。 + +å¯å›žå¾© 3 個 {*ICON_SHANK_01*}。 + +å¯å›žå¾© 1 個 {*ICON_SHANK_01*},或å¯åœ¨ç†”çˆä¸­çƒ¹ç…®ã€‚食用å¯èƒ½æœƒè®“您中毒。 + +å¯å›žå¾© 3 個 {*ICON_SHANK_01*}。在熔çˆçƒ¹ç…®ç”Ÿé›žè‚‰å³å¯ç²å¾—。 + +å¯å›žå¾© 1.5 個 {*ICON_SHANK_01*},或å¯åœ¨ç†”çˆä¸­çƒ¹ç…®ã€‚ + +å¯å›žå¾© 4 個 {*ICON_SHANK_01*}。在熔çˆçƒ¹ç…®ç”Ÿç‰›è‚‰å³å¯ç²å¾—。 + +å¯å›žå¾© 1.5 個 {*ICON_SHANK_01*},或å¯åœ¨ç†”çˆä¸­çƒ¹ç…®ã€‚ + +å¯å›žå¾© 4 個 {*ICON_SHANK_01*}。在熔çˆçƒ¹ç…®ç”Ÿè±¬è‚‰å³å¯ç²å¾—。 + +å¯å›žå¾© 1 個 {*ICON_SHANK_01*},或å¯åœ¨ç†”çˆä¸­çƒ¹ç…®ã€‚也å¯ç”¨ä¾†é¤µé£Ÿè±¹è²“以馴æœç‰ å€‘。 + +å¯å›žå¾© 2.5 個 {*ICON_SHANK_01*}。在熔çˆçƒ¹ç…®ç”Ÿé­šå³å¯ç²å¾—。 + +å¯å›žå¾© 2 個 {*ICON_SHANK_01*},還能精製æˆé‡‘蘋果。 + +å¯å›žå¾© 2 個 {*ICON_SHANK_01*},並在 4 ç§’å…§æŒçºŒå›žå¾©ç”Ÿå‘½å€¼ã€‚用蘋果和碎金塊精製而æˆã€‚ + +å¯å›žå¾© 2 個 {*ICON_SHANK_01*}。食用å¯èƒ½æœƒè®“您中毒。 + +å¯ç”¨ä¾†è£½ä½œè›‹ç³•或當åšé‡€è£½è—¥æ°´çš„ææ–™ã€‚ + +開啟時會é€å‡ºé›»æµã€‚ç•¶æ‹‰æ¡¿é–‹å•Ÿæˆ–é—œé–‰å¾Œï¼Œå°±æœƒä¿æŒåœ¨é€™å€‹ç‹€æ…‹ï¼Œç›´åˆ°ä¸‹æ¬¡é–‹å•Ÿæˆ–關閉為止。 + +ç´…çŸ³ç«æŠŠæœƒæŒçºŒé€å‡ºé›»æµï¼Œä¹Ÿå¯ä»¥åœ¨é€£æŽ¥åˆ°æ–¹å¡Šå´é‚Šæ™‚åšç‚ºæŽ¥æ”¶å™¨æˆ–傳é€å™¨ã€‚ +ç´…çŸ³ç«æŠŠé‚„å¯ä»¥ç•¶åšäº®åº¦è¼ƒä½Žçš„å…‰æºã€‚ + +å¯åœ¨ç´…石電路中當åšä¸­ç¹¼å™¨ã€å»¶é²å™¨ï¼ŒåŠ/或真空管。 + +æŒ‰ä¸‹å¾Œå³æœƒå•Ÿå‹•並é€å‡ºé›»æµï¼ŒæŒçºŒæ™‚間大約 1 ç§’é˜ï¼Œç„¶å¾Œå°±æœƒå†æ¬¡é—œé–‰ã€‚ + +å¯ç”¨ä¾†è£å¡«ç‰©å“,並在收到紅石é€å‡ºçš„é›»æµæ™‚隨機射出其中的物å“。 + +啟動後會播放 1 個音符的è²éŸ³ï¼Œå—到敲擊後就會變更音符的音調。把音符方塊放在ä¸åŒçš„æ–¹å¡Šä¸Šé¢ï¼Œå°±æœƒæ”¹è®Šæ¨‚器的類型。 + +å¯ç”¨ä¾†å¼•導礦車的行進路線。 + +有動力時,會讓經éŽçš„礦車加速。沒有動力時,會讓碰到的礦車åœåœ¨ä¸Šé¢ã€‚ + +功能跟壓æ¿ä¸€æ¨£ (會在啟動時é€å‡ºç´…石信號),但åªèƒ½é ç¤¦è»Šä¾†å•Ÿå‹•。 + +å¯ç”¨ä¾†æ²¿è‘—軌é“é‹é€æ‚¨ã€å‹•物或怪物。 + +å¯ç”¨ä¾†æ²¿è‘—軌é“é‹é€ç‰©å“。 + +ç•¶è£¡é¢æœ‰ç…¤å¡Šæ™‚,å¯è‡ªå‹•在軌é“上移動,或是推動其他礦車。 + +å¯è®“您在水é¢ä¸Šç§»å‹•,而且速度會比游泳快。 + +å¯å¾žç¶¿ç¾Šèº«ä¸Šæ”¶é›†ï¼Œé‚„能用染料染色。 + +å¯ç•¶åšå»ºç¯‰ææ–™ï¼Œé‚„能用染料染色。但我們ä¸å»ºè­°æ‚¨ä½¿ç”¨é€™å€‹è£½ä½œæ–¹æ³•,因為您å¯ä»¥è¼•易地從綿羊身上å–得羊毛。 + +ç•¶åšæŸ“料來製造黑色羊毛。 + +å¯ç•¶åšæŸ“æ–™ä¾†è£½é€ ç¶ è‰²ç¾Šæ¯›ã€‚ + +å¯ç•¶åšæŸ“æ–™ä¾†è£½é€ æ£•è‰²ç¾Šæ¯›ï¼Œè£½ä½œé¤…ä¹¾çš„ææ–™æˆ–者用來栽種å¯å¯æ¨¹ã€‚ + +å¯ç•¶åšæŸ“æ–™ä¾†è£½é€ éŠ€è‰²ç¾Šæ¯›ã€‚ + +å¯ç•¶åšæŸ“æ–™ä¾†è£½é€ é»ƒè‰²ç¾Šæ¯›ã€‚ + +å¯ç•¶åšæŸ“æ–™ä¾†è£½é€ ç´…è‰²ç¾Šæ¯›ã€‚ + +å¯ç”¨ä¾†è®“ä½œç‰©ã€æ¨¹æœ¨ã€èŒ‚密é’è‰ã€å·¨åž‹è˜‘è‡åŠèŠ±æœµç«‹åˆ»é•·å¤§ï¼Œé‚„èƒ½èˆ‡æŸäº›æŸ“æ–™çµ„åˆæˆæ–°çš„æŸ“料。 + +å¯ç•¶åšæŸ“æ–™ä¾†è£½é€ ç²‰ç´…è‰²ç¾Šæ¯›ã€‚ + +å¯ç•¶åšæŸ“æ–™ä¾†è£½é€ æ©˜è‰²ç¾Šæ¯›ã€‚ + +å¯ç•¶åšæŸ“æ–™ä¾†è£½é€ äº®ç¶ è‰²ç¾Šæ¯›ã€‚ + +å¯ç•¶åšæŸ“æ–™ä¾†è£½é€ ç°è‰²ç¾Šæ¯›ã€‚ + +å¯ç•¶åšæŸ“æ–™ä¾†è£½é€ æ·ºç°è‰²ç¾Šæ¯›ã€‚ +(注æ„:您å¯ä»¥æŠŠç°è‰²æŸ“æ–™èˆ‡éª¨ç²‰çµ„åˆæˆæ·ºç°è‰²æŸ“料,讓您å¯ä»¥ç”¨ 1 個墨囊製造出 4 個淺ç°è‰²æŸ“æ–™ï¼Œè€Œä¸æ˜¯ 3 個。) + +å¯ç•¶åšæŸ“æ–™ä¾†è£½é€ æ·ºè—色羊毛。 + +å¯ç•¶åšæŸ“æ–™ä¾†è£½é€ æ°´è—色羊毛。 + +å¯ç•¶åšæŸ“æ–™ä¾†è£½é€ ç´«è‰²ç¾Šæ¯›ã€‚ + +å¯ç•¶åšæŸ“æ–™ä¾†è£½é€ ç´«ç´…è‰²ç¾Šæ¯›ã€‚ + +å¯ç•¶åšæŸ“æ–™ä¾†è£½é€ è—色羊毛。 + +å¯ç”¨ä¾†æ’­æ”¾å”±ç‰‡ã€‚ + +å¯ç”¨ä¾†è£½é€ éžå¸¸å¼·éŸŒã€å …ç¡¬çš„å·¥å…·ã€æ­¦å™¨æˆ–護甲。 + +æ¯”ç«æŠŠæ›´äº®çš„å…‰æºã€‚å¯ä»¥ç”¨ä¾†èžåŒ–白雪和冰塊,還能在水é¢ä¸‹ä½¿ç”¨ã€‚ + +å¯ç”¨ä¾†è£½é€ æ›¸æœ¬å’Œåœ°åœ–。 + +å¯ç”¨ä¾†è£½é€ æ›¸æž¶æˆ–者是附魔來製作附魔å°å†Šã€‚ + +放置在附加能力å°é™„近的時候å¯ä»¥è®“å‰µä½œæ“æœ‰æ›´å¼·åŠ›çš„é™„åŠ æ•ˆæžœã€‚ + +å¯ç•¶åšè£é£¾å“。 + +å¯ç”¨éµéŽ¬æˆ–æ›´å …ç¡¬çš„å字鎬開採,然後在熔çˆä¸­ç†”ç…‰æˆé»ƒé‡‘錠塊。 + +å¯ç”¨çŸ³éŽ¬æˆ–æ›´å …ç¡¬çš„å字鎬開採,然後在熔çˆä¸­ç†”ç…‰æˆéµéŒ å¡Šã€‚ + +å¯ç”¨å字鎬開採來收集煤塊。 + +å¯ç”¨çŸ³éŽ¬æˆ–æ›´å …ç¡¬çš„å字鎬開採來收集é’金石。 + +å¯ç”¨éµéŽ¬æˆ–æ›´å …ç¡¬çš„å字鎬開採來收集鑽石。 + +å¯ç”¨éµéŽ¬æˆ–æ›´å …ç¡¬çš„å字鎬開採來收集紅石塵。 + +å¯ç”¨å字鎬開採來收集éµåµçŸ³ã€‚ + +å¯ç”¨éŸå­ä¾†æ”¶é›†ï¼Œèƒ½ç•¶åšå»ºç¯‰ææ–™ã€‚ + +å¯è®“æ‚¨æ ½ç¨®ï¼Œæœ€å¾Œæœƒé•·æˆæ¨¹æœ¨ã€‚ + +這䏿œƒç ´è£‚。 + +會讓接觸到的任何æ±è¥¿è‘—ç«ã€‚å¯ä»¥ç”¨æ¡¶å­ä¾†æ”¶é›†ã€‚ + +å¯ç”¨éŸå­ä¾†æ”¶é›†ï¼Œèƒ½åœ¨ç†”çˆä¸­ç†”ç…‰æˆçŽ»ç’ƒã€‚ç•¶ä¸‹æ–¹æ²’æœ‰æ±è¥¿æ™‚,會å—é‡åŠ›çš„å½±éŸ¿è€Œå¾€ä¸‹æŽ‰ã€‚ + +å¯ç”¨éŸå­ä¾†æ”¶é›†ï¼ŒæŒ–掘時å¶çˆ¾æœƒæŒ–出打ç«çŸ³ã€‚當下方沒有æ±è¥¿æ™‚,會å—é‡åŠ›çš„å½±éŸ¿è€Œå¾€ä¸‹æŽ‰ã€‚ + +å¯ç”¨æ–§é ­åŠˆç ä¾†æ”¶é›†ï¼Œèƒ½ç²¾è£½æˆæœ¨æ¿ï¼Œæˆ–是當åšç‡ƒæ–™ä½¿ç”¨ã€‚ + +在熔çˆä¸­ç†”煉沙å­å³å¯ç²å¾—。å¯ç•¶åšå»ºç¯‰ææ–™ï¼Œä½†ç•¶æ‚¨é–‹æŽ¡çŽ»ç’ƒæ™‚ï¼ŒçŽ»ç’ƒæœƒç ´ç¢Žã€‚ + +用å字鎬開採石頭å³å¯ç²å¾—,å¯ç”¨ä¾†å»ºé€ ç†”çˆæˆ–石製工具。 + +用熔çˆç‡’é»åœŸä¹‹å¾Œå³å¯ç²å¾—。 + +å¯åœ¨ç†”çˆä¸­ç‡’æˆç£šå¡Šã€‚ + +破裂之後會掉è½é»åœŸçƒï¼Œå¯åœ¨ç†”çˆä¸­å°‡é»åœŸçƒçƒ¤æˆç£šå¡Šã€‚ + +壓縮的雪çƒå­˜æ”¾æ–¹å¼ã€‚ + +å¯ç”¨éŸå­æŒ–掘來製造雪çƒã€‚ + +破裂時å¶çˆ¾æœƒå‡ºç¾å°éº¥ç¨®å­ã€‚ + +å¯ç²¾è£½æˆæŸ“料。 + +å¯èˆ‡ç¢—一起精製æˆç‡‰è˜‘è‡ã€‚ + +å¯ç”¨é‘½çŸ³éŽ¬ä¾†é–‹æŽ¡ã€‚ç•¶éœæ­¢çš„熔岩碰到水時,就會產生黑曜石。黑曜石å¯ç”¨ä¾†å»ºé€ å‚³é€é–€ã€‚ + +å¯ç”¢ç”Ÿæ€ªç‰©ã€‚ + +坿”¾ç½®åœ¨åœ°ä¸Šä¾†å‚³é€é›»æµã€‚當與藥水一起釀製時,將會增加效果的æŒçºŒæ™‚間。 + +完全æˆç†Ÿå¾Œï¼Œå³å¯æ”¶æˆä¾†æ”¶é›†å°éº¥ã€‚ + +已經準備好能栽種種å­çš„地é¢ã€‚ + +å¯ç”¨ç†”çˆçƒ¹ç…®ä¾†å–得綠色染料。 + +å¯ç²¾è£½æˆç ‚糖。 + +å¯ç•¶åšé ­ç›”ä½¿ç”¨ï¼Œæˆ–æ˜¯èˆ‡ç«æŠŠä¸€èµ·ç²¾è£½æˆå—瓜燈。也是製作å—ç“œæ´¾çš„ä¸»è¦ææ–™ã€‚ + +點燃後會永é ç‡ƒç‡’。 + +會讓任何經éŽå…¶ä¸Šæ–¹çš„æ±è¥¿æ¸›é€Ÿã€‚ + +站在傳é€é–€ä¸­ï¼Œå³å¯è®“您在地上世界與地ç„世界之間往返。 + +å¯ç•¶åšç†”çˆçš„燃料,或是精製æˆç«æŠŠã€‚ + +殺死蜘蛛å³å¯ç²å¾—,å¯ç”¨ä¾†ç²¾è£½æˆå¼“或釣魚竿,或者是放置於地é¢ä¾†è£½ä½œçµ†ç·šã€‚ + +殺死雞å³å¯ç²å¾—,å¯ç”¨ä¾†ç²¾è£½æˆç®­ã€‚ + +殺死 Creeper å³å¯ç²å¾—,å¯ç”¨ä¾†ç²¾è£½æˆç‚¸è—¥æˆ–è€…ç•¶ä½œé‡€è£½è—¥æ°´çš„ææ–™ã€‚ + +在農田栽種å³å¯é•·æˆä½œç‰©ã€‚切記:種å­éœ€è¦è¶³å¤ çš„光線æ‰èƒ½æˆé•·ï¼ + +æ”¶æˆä½œç‰©å³å¯ç²å¾—,å¯ç”¨ä¾†ç²¾è£½æˆé£Ÿç‰©ã€‚ + +挖掘礫石å³å¯ç²å¾—,å¯ç”¨ä¾†ç²¾è£½æˆæ‰“ç«é®ã€‚ + +用在豬身上時,å¯è®“您騎豬。您å¯ä»¥ä½¿ç”¨ã€Œé¡˜è€…上鉤ã€é€™é …é“å…·ä¾†æ“æŽ§è±¬çš„ç§»å‹•æ–¹å‘。 + +挖掘白雪å³å¯ç²å¾—,å¯è®“您投擲。 + +殺死乳牛å³å¯ç²å¾—,å¯ç”¨ä¾†ç²¾è£½æˆè­·ç”²æˆ–用來製作書本。 + +殺死å²èŠå§†å³å¯ç²å¾—,並å¯ç•¶åšé‡€è£½è—¥æ°´çš„ææ–™æˆ–è€…æ˜¯ç”¨ä¾†è£½ä½œé»æ€§æ´»å¡žã€‚ + +雞會隨機生蛋,而蛋å¯ç”¨ä¾†ç²¾è£½æˆé£Ÿç‰©ã€‚ + +開採閃石å³å¯ç²å¾—,å¯é€éŽç²¾è£½è®Šå›žé–ƒçŸ³æ–¹å¡Šæˆ–者與藥水釀製來æé«˜é™„加能力的效果。 + +殺死骷é«å¾Œå³å¯æ”¶é›†ï¼Œå¯ç”¨ä¾†ç²¾è£½æˆéª¨ç²‰ï¼Œé¤µç‹¼åƒé‚„å¯é¦´æœç‹¼ã€‚ + +è¨­æ³•è®“éª·é«æ®ºæ­» Creeper 後å³å¯æ”¶é›†ï¼Œå¯åˆ©ç”¨é»žå”±æ©Ÿä¾†æ’­æ”¾ã€‚ + +å¯ç”¨ä¾†æ»…ç«ï¼Œæˆ–å”助作物生長。您å¯ç”¨æ¡¶å­ä¾†è£æ°´ã€‚ + +破碎時å¶çˆ¾æœƒæŽ‰è½æ¨¹è‹—ï¼Œè®“æ‚¨èƒ½é‡æ–°æ ½ç¨®ä¸¦é•·æˆæ¨¹æœ¨ã€‚ + +å¯åœ¨åœ°ä¸‹è¿·å®®æ‰¾åˆ°ï¼Œå¯ç•¶åšå»ºç¯‰ææ–™å’Œè£é£¾å“。 + +å¯ç”¨ä¾†å–得綿羊身上的羊毛,以åŠç²å¾—樹葉方塊。 + +當活塞有動力時 (ä½¿ç”¨æŒ‰éˆ•ã€æ‹‰æ¡¿ã€å£“æ¿ã€ç´…çŸ³ç«æŠŠï¼Œæˆ–æ˜¯ç´…çŸ³ä¾†å•Ÿå‹•æ´»å¡ž),會在情æ³å…許下延伸出去推動方塊。 + +當活塞有動力時 (ä½¿ç”¨æŒ‰éˆ•ã€æ‹‰æ¡¿ã€å£“æ¿ã€ç´…çŸ³ç«æŠŠï¼Œæˆ–æ˜¯ç´…çŸ³ä¾†å•Ÿå‹•æ´»å¡ž),會在情æ³å…è¨±ä¸‹å»¶ä¼¸å‡ºåŽ»æŽ¨å‹•æ–¹å¡Šã€‚é»æ€§æ´»å¡žç¸®å›žæ™‚,會把接觸到活塞延伸部分的方塊一起拉回。 + +由石頭方塊製造而æˆï¼Œé€šå¸¸èƒ½åœ¨åœ°ä¸‹è¦å¡žä¸­æ‰¾åˆ°ã€‚ + +å¯ç•¶åšå±éšœï¼Œé¡žä¼¼æŸµæ¬„。 + +類似門,但主è¦èˆ‡æŸµæ¬„æ­é…使用。 + +精製西瓜片å³å¯ç²å¾—。 + +å¯ç”¨ä¾†å–ä»£çŽ»ç’ƒæ–¹å¡Šçš„é€æ˜Žæ–¹å¡Šã€‚ + +栽種å³å¯é•·æˆå—瓜。 + +栽種å³å¯é•·æˆè¥¿ç“œã€‚ + +會在 Enderman 死亡時掉è½ï¼ŒæŠ•æ“²å¾ŒçŽ©å®¶å³æœƒåœ¨å¤±åŽ»äº›è¨±ç”Ÿå‘½å€¼çš„åŒæ™‚,被傳é€åˆ°çµ‚界çç æ‰€åœ¨ä¹‹è™•。 + +上é¢é•·è‰çš„æ³¥åœŸæ–¹å¡Šã€‚å¯ç”¨éŸå­ä¾†æ”¶é›†ï¼Œèƒ½ç•¶åšå»ºç¯‰ææ–™ã€‚ + +å¯ç•¶åšå»ºç¯‰ææ–™å’Œè£é£¾å“。 + +ç•¶æ‚¨é€šéŽæ™‚,行走速度會變慢。å¯ä½¿ç”¨ç¾Šæ¯›å‰ªæ‘§æ¯€ï¼Œä¸¦æ”¶é›†çµ²ç·šã€‚ + +摧毀時會產生 Silverfish。如果附近有隻 Silverfish é­åˆ°æ”»æ“Šï¼Œä¹Ÿå¯èƒ½æœƒç”¢ç”Ÿå¦ä¸€éš» Silverfish。 + +放置後會隨著時間生長。使用羊毛剪å³å¯æ”¶é›†ã€‚å¯åƒæ¢¯å­ä¸€æ¨£æ”€çˆ¬ã€‚ + +在上é¢è¡Œèµ°æ™‚æœƒæ„Ÿè¦ºæ»‘æºœã€‚å¦‚æžœå†°å¡Šä¸‹é¢æœ‰å…¶ä»–æ–¹å¡Šï¼Œç•¶æ‚¨æ‘§æ¯€å†°å¡Šæ™‚ï¼Œå†°å¡Šå°±æœƒè®Šæˆæ°´ã€‚如果冰塊太é è¿‘å…‰æºæˆ–地ç„,就會èžåŒ–。 + +å¯ç•¶åšè£é£¾å“。 + +å¯ç”¨ä¾†é‡€è£½è—¥æ°´æˆ–尋找地下è¦å¡žã€‚ç”± Blaze 掉è½ï¼Œè€Œ Blaze 多åŠå‡ºæ²’於地ç„è¦å¡žçš„è£¡é¢æˆ–附近。 + +å¯ç”¨ä¾†é‡€è£½è—¥æ°´ï¼Œæœƒåœ¨ Ghast 死亡時掉è½ã€‚ + +æœƒåœ¨æ®­å± Pigmen 死亡時掉è½ï¼Œå¯åœ¨åœ°ç„æ‰¾åˆ°æ®­å± Pigmenã€‚æ˜¯é‡€è£½è—¥æ°´çš„ææ–™ã€‚ + +å¯ç”¨ä¾†é‡€è£½è—¥æ°´ã€‚生長在地ç„è¦å¡žä¸­ï¼Œä¹Ÿå¯ä»¥ç¨®æ¤åœ¨é­‚沙上。 + +便“šä½¿ç”¨å°è±¡çš„ä¸åŒï¼Œä½¿ç”¨æ™‚會有å„種ä¸åŒçš„æ•ˆæžœã€‚ + +å¯ç”¨ä¾†è£æ°´ï¼Œä¸¦å¯åœ¨é‡€è£½å°ç•¶æˆè£½ä½œè—¥æ°´ä¸€é–‹å§‹æ™‚å°±å¿…é ˆç”¨åˆ°çš„ææ–™ã€‚ + +這是有毒的食物和釀製物å“,會在蜘蛛或穴蜘蛛被玩家殺死時掉è½ã€‚ + +å¯ç”¨ä¾†é‡€è£½è—¥æ°´ï¼Œä¸”çµ•å¤§éƒ¨åˆ†ç”¨ä¾†è£½é€ å…·å‚™è² é¢æ•ˆæžœçš„藥水。 + +å¯ç”¨ä¾†é‡€è£½è—¥æ°´ï¼Œæˆ–與其他物å“一起精製æˆçµ‚界之眼或熔岩çƒã€‚ + +å¯ç”¨ä¾†é‡€è£½è—¥æ°´ã€‚ + +å¯ç”¨ä¾†è£½ä½œè—¥æ°´å’Œå™´æ¿ºè—¥æ°´ã€‚ + +å¯ä½¿ç”¨é›¨æ°´æˆ–æ°´æ¡¶æ›¿æ°´æ§½è£æ°´ï¼Œç„¶å¾Œå³å¯ç”¨ä¾†æ›¿æ°´ç“¶è£æ°´ã€‚ + +æŠ•æ“²å¾Œå³æœƒé¡¯ç¤ºå‰å¾€çµ‚界入å£çš„æ–¹å‘。將åäºŒå€‹çµ‚ç•Œä¹‹çœ¼æ”¾ç½®æ–¼çµ‚ç•Œå…¥å£æ¡†æž¶ä¸Šå¾Œï¼Œå³å¯å•Ÿå‹•終界入å£ã€‚ + +å¯ç”¨ä¾†é‡€è£½è—¥æ°´ã€‚ + +è·Ÿé’è‰æ–¹å¡Šå¾ˆåƒï¼Œä½†éžå¸¸é©æ–¼åœ¨ä¸Šé¢æ ½ç¨®è˜‘è‡ã€‚ + +會浮在水é¢ï¼Œä¸”å¯åœ¨ä¸Šé¢è¡Œèµ°ã€‚ + +å¯ç”¨ä¾†å»ºé€ åœ°ç„è¦å¡žï¼Œä¸”ä¸å— Ghast çš„ç«çƒå‚·å®³ã€‚ + +用在地ç„è¦å¡žã€‚ + +å‡ºç¾æ–¼åœ°ç„è¦å¡žï¼Œæœƒåœ¨åœ°ç„çµç¯€ç ´è£‚後掉è½ã€‚ + +您å¯åœ¨é™„加能力å°ä½¿ç”¨æ‚¨çš„經驗值,將特殊能力附加到åŠã€éŽ¬ã€æ–§ã€éŸã€å¼“和護甲上。 + +終界入å£å¯ç”±å二個終界之眼啟動,玩家å¯ç¶“由終界入å£é€²å…¥çµ‚界。 + +å¯ç”¨ä¾†è£½ä½œçµ‚界入å£ã€‚ + +é€™æ˜¯ä¸€ç¨®åªæœƒåœ¨çµ‚界出ç¾çš„æ–¹å¡Šï¼Œé˜²çˆ†æ€§å¾ˆé«˜ï¼Œå¾ˆé©åˆæ‹¿ä¾†å»ºé€ ã€‚ + +擊敗終界的é¾å°±æœƒç”¢ç”Ÿé€™å€‹æ–¹å¡Šã€‚ + +æŠ•æ“²å¾Œç¶“é©—å€¼å…‰çƒæœƒæŽ‰è½ï¼Œæ”¶é›†å…‰çƒå³å¯å¢žåŠ æ‚¨çš„ç¶“é©—å€¼ã€‚ + +很é©åˆç”¨ä¾†è®“æ±è¥¿è‘—ç«ï¼Œæˆ–者是點燃發射器的ç«ç„°ã€‚ + +類似展示櫃,å¯å°‡ç‰©å“或方塊放置在裡é¢å±•示。 + +投擲出去時å¯å†ç”Ÿå‡ºç•¶ä¸­æ‰€é¡¯ç¤ºçš„生物類型。 + +å¯ç”¨ä¾†çµ„æˆé•·é•·çš„æ¨“梯。把 2 個æ¿å­ä¸Šä¸‹é‡ç–Šï¼Œå°±æœƒç”¢ç”Ÿæ™®é€šå¤§å°çš„é›™å±¤æ¿æ–¹å¡Šã€‚ + +å¯ç”¨ä¾†çµ„æˆé•·é•·çš„æ¨“梯。把 2 個æ¿å­ä¸Šä¸‹é‡ç–Šï¼Œå°±æœƒç”¢ç”Ÿæ™®é€šå¤§å°çš„é›™å±¤æ¿æ–¹å¡Šã€‚ + +在熔çˆä¸­ç†”煉地ç„血石å³å¯ç²å¾—。能精製æˆåœ°ç„磚塊方塊。 + +有動力時會發出光線。 + +耕種å³å¯æ”¶é›†å¯å¯è±†ã€‚ + +生物頭顱å¯ç•¶è£é£¾å“或當åšé¢å…·æˆ´åœ¨é ­ç›”空格中。 + +çƒè³Š + +被殺死時會掉è½å¢¨å›Šã€‚ + +乳牛 + +被殺死時會掉è½çš®é©ã€‚您也å¯ä»¥ç”¨æ¡¶å­ä¾†æ“ ç‰›å¥¶ã€‚ + +綿羊 + +被剪羊毛時會掉è½ç¾Šæ¯› (å‰ææ˜¯ç‰ çš„ç¾Šæ¯›é‚„æ²’è¢«å‰ªæŽ‰)ã€‚å¯æŸ“è‰²ä¾†è®“ç¶¿ç¾Šæ“æœ‰ä¸åŒè‰²å½©çš„羊毛。 + +雞 + +被殺死時會掉è½ç¾½æ¯›ï¼Œé‚„會隨機生蛋。 + +豬 + +被殺死時會掉è½è±¬è‚‰ã€‚您還å¯ä»¥ä½¿ç”¨éžåº§ä¾†é¨Žåœ¨è±¬ä¸Šã€‚ + +狼 + +狼是溫馴的動物,但當您攻擊牠時,牠就會攻擊您。您å¯ä»¥ä½¿ç”¨éª¨é ­ä¾†é¦´æœç‹¼ï¼Œé€™æœƒè®“牠跟著您走,並攻擊任何在攻擊您的æ±è¥¿ã€‚ + +Creeper + +如果您é å¤ªè¿‘å°±æœƒçˆ†ç‚¸ï¼ + +éª·é« + +æœƒå°æ‚¨å°„箭,被殺死時會掉è½ç®­ã€‚ + +蜘蛛 + +如果您é è¿‘蜘蛛,牠就會攻擊您。蜘蛛會爬牆,被殺死時會掉è½çµ²ç·šã€‚ + +æ®­å± + +如果您é è¿‘æ®­å±ï¼Œæ®­å±å°±æœƒæ”»æ“Šæ‚¨ã€‚ + +æ®­å± Pigman + +æ®­å± Pigman æ˜¯æº«é¦´çš„æ€ªç‰©ï¼Œä½†å¦‚æžœæ‚¨æ”»æ“Šæ•´ç¾¤æ®­å± Pigman ä¸­çš„ä¸€å€‹ï¼Œæ•´ç¾¤æ®­å± Pigman 就會開始攻擊您。 + +Ghast + +æœƒå°æ‚¨ç™¼å°„ç«çƒï¼Œè€Œä¸”ç«çƒç¢°åˆ°æ±è¥¿æ™‚會爆炸。 + +å²èŠå§† + +å—å‚·å®³æ™‚æœƒåˆ†è£‚æˆæ•¸å€‹å°å²èŠå§†ã€‚ + +Enderman + +如果您直視 Enderman,Enderman 就會攻擊您,而且還會到處移動方塊。 + +Silverfish + +ç•¶ Silverfish å—到攻擊時,會引來躲在附近的 Silverfish。牠們會躲在石頭方塊中。 + +穴蜘蛛 + +æ“æœ‰æ¯’牙。 + +Mooshroom + +與碗一起使用å¯ç”¨ä¾†ç‡‰è˜‘è‡ï¼Œå‰ªæ¯›å¾ŒæœƒæŽ‰è½è˜‘è‡ï¼Œä¸”æœƒè®Šæˆæ™®é€šçš„乳牛。 + +雪人 + +玩家å¯ç”¨ç™½é›ªæ–¹å¡Šå’Œå—瓜製作雪人。雪人會å°è£½ä½œè€…的敵人投擲雪çƒã€‚ + +çµ‚ç•Œé¾ + +這是出ç¾åœ¨çµ‚界的巨大黑é¾ã€‚ + +Blaze + +Blaze 是地ç„裡的敵人,絕大部分皆分布在地ç„è¦å¡žä¸­ã€‚ç•¶ Blaze è¢«æ®ºæ­»æ™‚æœƒæŽ‰è½ Blaze 棒。 + +熔岩怪 + +ç†”å²©æ€ªå‡ºç¾æ–¼åœ°ç„,被殺死時會分裂æˆå¾ˆå¤šå°ç†”岩怪,這點跟å²è˜­å§†å¾ˆåƒã€‚ + +æ‘æ°‘ + +豹貓 + +åˆ†å¸ƒåœ¨ç†±å¸¶å¢æž—中,餵生魚就能馴æœç‰ å€‘ã€‚ä½†å‰ææ˜¯å¿…é ˆè®“è±¹è²“é è¿‘您,畢竟任何一個çªç„¶çš„動作都會嚇跑牠們。 + +éµå‚€å„¡ + +出ç¾ä¾†ä¿è­·æ‘è½ï¼Œå¯ä»¥ç”¨éµå¡Šè·Ÿå—瓜製作。 + +Explosives Animator + +Concept Artist + +Number Crunching and Statistics + +Bully Coordinator + +Original Design and Code by + +Project Manager/Producer + +Rest of Mojang Office + +Lead Game Programmer Minecraft PC + +Ninja Coder + +CEO + +White Collar Worker + +Customer Support + +Office DJ + +Designer/Programmer Minecraft - Pocket Edition + +Developer + +Chief Architect + +Art Developer + +Game Crafter + +Director of Fun + +Music and Sounds + +Programming + +Art + +QA + +Executive Producer + +Lead Producer + +Producer + +Test Lead + +Lead Tester + +Design Team + +Development Team + +Release Management + +Director, XBLA Publishing + +Business Development + +Portfolio Director + +Product Manager + +Marketing + + Community Manager + +Europe Localization Team + +Redmond Localization Team + +Asia Localization Team + +User Research Team + +MGS Central Teams + +Milestone Acceptance Tester + +Special Thanks + +Test Manager + +Senior Test Lead + +SDET + +Project STE + +Additional STE + +Test Associates + +Jon Kagstrom + +Tobias Mollstam + +Rise Lugo + +æœ¨åŠ + +çŸ³åŠ + +éµåŠ + +é‘½çŸ³åŠ + +é»ƒé‡‘åŠ + +æœ¨éŸ + +çŸ³éŸ + +éµéŸ + +é‘½çŸ³éŸ + +é»ƒé‡‘éŸ + +木鎬 + +石鎬 + +éµéެ + +鑽石鎬 + +黃金鎬 + +木斧 + +石斧 + +鵿–§ + +鑽石斧 + +黃金斧 + +木鋤 + +石鋤 + +éµé‹¤ + +鑽石鋤 + +黃金鋤 + +木門 + +éµé–€ + +鎖éˆç›” + +鎖éˆè­·ç”² + +鎖éˆè­·è„› + +鎖éˆé´ + +皮帽 + +éµç›” + +鑽石盔 + +黃金盔 + +皮衣 + +éµè­·ç”² + +鑽石護甲 + +黃金護甲 + +皮褲 + +éµè­·è„› + +鑽石護脛 + +黃金護脛 + +çš®é´ + +éµé´ + +é‘½çŸ³é´ + +é»ƒé‡‘é´ + +éµéŒ å¡Š + +黃金錠塊 + +æ¡¶å­ + +æ°´æ¡¶ + +熔岩桶 + +打ç«é® + +蘋果 + +弓 + +ç®­ + +煤塊 + +木炭 + +鑽石 + +æœ¨æ£ + +碗 + +ç‡‰è˜‘è‡ + +絲線 + +羽毛 + +ç«è—¥ + +å°éº¥ç¨®å­ + +å°éº¥ + +麵包 + +打ç«çŸ³ + +生豬肉 + +熟豬肉 + +圖畫 + +金蘋果 + +招牌 + +礦車 + +éžåº§ + +紅石 + +é›ªçƒ + +å°èˆ¹ + +çš®é© + +牛奶桶 + +磚塊 + +é»åœŸ + +甘蔗 + +紙張 + +書本 + +å²èŠå§†çƒ + +ç®±å­ç¤¦è»Š + +熔çˆç¤¦è»Š + +蛋 + +指å—é‡ + +釣魚竿 + +æ™‚é˜ + +閃石塵 + +生魚 + +熟魚 + +染粉 + +墨囊 + +玫瑰紅 + +仙人掌綠 + +å¯å¯è±† + +é’金石 + +紫色染料 + +æ°´è—色染料 + +æ·ºç°è‰²æŸ“æ–™ + +ç°è‰²æŸ“æ–™ + +粉紅色染料 + +亮綠色染料 + +蒲公英黃 + +æ·ºè—色染料 + +紫紅色染料 + +橘色染料 + +骨粉 + +骨頭 + +ç ‚ç³– + +蛋糕 + +床舖 + +紅石中繼器 + +餅乾 + +地圖 + +唱片:13 + +唱片:Cat + +唱片:Blocks + +唱片:Chirp + +唱片:Far + +唱片:Mall + +唱片:Mellohi + +唱片:Stal + +唱片:Strad + +唱片:Ward + +唱片:11 + +唱片:Where are we now + +羊毛剪 + +å—ç“œå­ + +è¥¿ç“œå­ + +生雞肉 + +熟雞肉 + +生牛肉 + +牛排 + +è…肉 + +終界çç  + +西瓜片 + +Blaze 棒 + +Ghast æ·šæ°´ + +碎金塊 + +地ç„çµç¯€ + +{*splash*}{*prefix*}{*postfix*}藥水 + +玻璃瓶 + +æ°´ç“¶ + +蜘蛛眼 + +發酵蜘蛛眼 + +Blaze 粉 + +ç†”å²©çƒ + +é‡€è£½å° + +æ°´æ§½ + +終界之眼 + +發光西瓜 + +經驗藥水瓶 + +ç«å½ˆ + +ç«å½ˆ (木炭) + +ç«å½ˆ (煤塊) + +ç‰©å“æ¡†æž¶ + +å†ç”Ÿ {*CREATURE*} + +地ç„磚塊 + +éª·é« + +骷é«é ­ + +å‡‹é›¶éª·é« + +æ®­å±é ­é¡± + +頭顱 + +%s 頭顱 + +Creeper 頭顱 + +石頭 + +é’è‰æ–¹å¡Š + +泥土 + +éµåµçŸ³ + +æ©¡æ¨¹åŽšæœ¨æ¿ + +æ‰æ¨¹åŽšæœ¨æ¿ + +æ¨ºæ¨¹åŽšæœ¨æ¿ + +ç†±å¸¶å¢æž—åŽšæœ¨æ¿ + +樹苗 + +橡樹樹苗 + +æ‰æ¨¹æ¨¹è‹— + +樺樹樹苗 + +ç†±å¸¶å¢æž—樹苗 + +基岩 + +æ°´é«” + +熔岩 + +æ²™å­ + +沙岩 + +礫石 + +黃金礦石 + +éµç¤¦çŸ³ + +煤礦石 + +木頭 + +橡樹木頭 + +æ‰æ¨¹æœ¨é ­ + +樺樹木頭 + +ç†±å¸¶å¢æž—木頭 + +橡樹 + +æ‰æ¨¹ + +樺樹 + +樹葉 + +橡樹樹葉 + +æ‰æ¨¹æ¨¹è‘‰ + +樺樹樹葉 + +ç†±å¸¶å¢æž—樹葉 + +æµ·ç¶¿ + +玻璃 + +羊毛 + +黑色羊毛 + +紅色羊毛 + +綠色羊毛 + +棕色羊毛 + +è—色羊毛 + +紫色羊毛 + +æ°´è—色羊毛 + +æ·ºç°è‰²ç¾Šæ¯› + +ç°è‰²ç¾Šæ¯› + +粉紅色羊毛 + +亮綠色羊毛 + +黃色羊毛 + +æ·ºè—色羊毛 + +紫紅色羊毛 + +橘色羊毛 + +白色羊毛 + +花朵 + +玫瑰 + +è˜‘è‡ + +黃金方塊 + +一種精簡儲存黃金的方å¼ã€‚ + +一種精簡儲存éµçš„æ–¹å¼ã€‚ + +鵿–¹å¡Š + +çŸ³æ¿ + +çŸ³æ¿ + +æ²™å²©æ¿ + +æ©¡æ¨¹æœ¨æ¿ + +éµåµçŸ³æ¿ + +ç£šå¡Šæ¿ + +çŸ³ç£šå¡Šæ¿ + +æ©¡æ¨¹æœ¨æ¿ + +æ‰æ¨¹æœ¨æ¿ + +æ¨ºæ¨¹æœ¨æ¿ + +ç†±å¸¶å¢æž—æœ¨æ¿ + +地ç„ç£šå¡Šæ¿ + +磚塊 + +炸藥 + +書架 + +苔蘚石 + +黑曜石 + +ç«æŠŠ + +ç«æŠŠ (煤塊) + +ç«æŠŠ (木炭) + +ç« + +怪物產生器 + +橡樹木梯 + +ç®±å­ + +紅石塵 + +鑽石礦石 + +鑽石方塊 + +一種精簡儲存鑽石的方å¼ã€‚ + +ç²¾è£½å° + +作物 + +農地 + +ç†”çˆ + +ç‰Œå­ + +木門 + +æ¢¯å­ + +è»Œé“ + +å‹•åŠ›è»Œé“ + +嵿¸¬å™¨è»Œé“ + +石梯 + +拉桿 + +å£“æ¿ + +éµé–€ + +紅石礦石 + +ç´…çŸ³ç«æŠŠ + +按鈕 + +白雪 + +冰塊 + +仙人掌 + +é»åœŸ + +甘蔗 + +點唱機 + +柵欄 + +å—瓜 + +å—瓜燈 + +地ç„血石 + +é­‚æ²™ + +閃石 + +傳é€é–€ + +é’金石礦石 + +é’金石方塊 + +一種精簡儲存é’金石的方å¼ã€‚ + +發射器 + +音符方塊 + +蛋糕 + +床舖 + +蜘蛛網 + +茂密é’è‰ + +æž¯çŒæœ¨ + +真空管 + +ä¸ŠéŽ–çš„ç®±å­ + +æ´»æ¿é–€ + +羊毛 (ä¸é™è‰²å½©) + +活塞 + +黿€§æ´»å¡ž + +Silverfish 方塊 + +石磚塊 + +長滿é’苔的石磚塊 + +裂開的石磚塊 + +刻紋石磚塊 + +è˜‘è‡ + +è˜‘è‡ + +鵿¢ + +玻璃片 + +西瓜 + +å—瓜莖 + +西瓜莖 + +藤蔓 + +柵欄門 + +磚塊梯 + +石磚塊梯 + +Silverfish 石 + +Silverfish éµåµçŸ³ + +Silverfish 石磚塊 + +èŒçµ²é«” + +ç¡è“® + +地ç„磚塊 + +地ç„磚塊柵欄 + +地ç„磚塊梯 + +地ç„çµç¯€ + +é™„åŠ èƒ½åŠ›å° + +é‡€è£½å° + +æ°´æ§½ + +çµ‚ç•Œå…¥å£ + +çµ‚ç•Œå…¥å£æ¡†æž¶ + +終界石 + +é¾è›‹ + +矮樹 + +蕨 + +沙岩梯 + +æ‰æ¨¹æœ¨æ¢¯ + +樺樹木梯 + +ç†±å¸¶å¢æž—木梯 + +紅石燈 + +å¯å¯ + +éª·é« + +ç›®å‰çš„æŽ§åˆ¶æ–¹å¼ + +é…ç½® + +移動/奔跑 + +觀看 + +æš«åœ + +è·³èº + +è·³èº/往上飛 + +ç‰©å“æ¬„ + +ä¾åºæ›´æ›æ‰‹ä¸­çš„ç‰©å“ + +動作 + +使用 + +精製 + +丟棄 + +潛行 + +潛行/往下飛 + +è®Šæ›´è¦–è§’æ¨¡å¼ + +玩家/邀請 + +移動 (飛行時) + +é…ç½® 1 + +é…ç½® 2 + +é…ç½® 3 + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +]]> + +{*B*}請按下 {*CONTROLLER_VK_A*} 來繼續。 + +{*B*}請按下 {*CONTROLLER_VK_A*} 來開始教學課程。{*B*} + 如果您覺得自己已經準備好,å¯ä»¥ç¨è‡ªçŽ©éŠæˆ²äº†ï¼Œè«‹æŒ‰ä¸‹ {*CONTROLLER_VK_B*}。 + +Minecraft 是一款å¯è®“æ‚¨æ”¾ç½®æ–¹å¡Šä¾†å»ºé€ å¤¢æƒ³ä¸–ç•Œçš„éŠæˆ²ã€‚ +但åƒè¬åˆ¥å¿˜äº†è¦åœ¨å¤œè¡Œæ€ªç‰©å‡ºç¾ä¹‹å‰ï¼Œå…ˆè“‹å¥½ä¸€å€‹æ£²èº«è™•喔。 + +使用 {*CONTROLLER_ACTION_LOOK*} å³å¯å¾€ä¸Šã€ä¸‹åŠå››å‘¨è§€çœ‹ã€‚ + +使用 {*CONTROLLER_ACTION_MOVE*} å³å¯å››è™•移動。 + +如è¦å¥”跑,åªè¦å¿«é€Ÿå¾€å‰æŒ‰å…©ä¸‹ {*CONTROLLER_ACTION_MOVE*} å³å¯ã€‚ç•¶æ‚¨å¾€å‰æŒ‰ä½ {*CONTROLLER_ACTION_MOVE*} æ™‚ï¼Œè§’è‰²å°‡æœƒç¹¼çºŒå¥”è·‘ï¼Œç›´åˆ°å¥”è·‘æ™‚é–“çµæŸæˆ–是食物消耗完畢為止。 + +按下 {*CONTROLLER_ACTION_JUMP*} å³å¯è·³èºã€‚ + +æŒ‰ä½ {*CONTROLLER_ACTION_ACTION*} å³å¯ç”¨æ‚¨çš„æ‰‹ï¼Œæˆ–是手中æ¡ä½çš„æ±è¥¿ä¾†é–‹æŽ¡åŠåŠˆç ã€‚但您å¯èƒ½éœ€è¦ç²¾è£½å‡ºå·¥å…·ä¾†é–‹æŽ¡æŸäº›æ–¹å¡Šã€‚ + +è«‹æŒ‰ä½ {*CONTROLLER_ACTION_ACTION*} 來ç ä¸‹ 4 個木頭方塊 (樹幹)。{*B*}當方塊被劈ç ä¸‹ä¾†å¾Œï¼Œåªè¦ç«™åœ¨éš¨å¾Œå‡ºç¾çš„æµ®ç©ºç‰©å“æ—邊,該物å“å°±æœƒé€²å…¥æ‚¨çš„ç‰©å“æ¬„。 + +按下 {*CONTROLLER_ACTION_CRAFTING*} å³å¯é–‹å•Ÿç²¾è£½ä»‹é¢ã€‚ + +åœ¨æ‚¨ä¸æ–·æ”¶é›†å’Œç²¾è£½ç‰©å“çš„åŒæ™‚ï¼Œç‰©å“æ¬„ä¹Ÿæœƒé€æ¼¸å¡«æ»¿ã€‚{*B*} + 請按下 {*CONTROLLER_ACTION_INVENTORY*} ä¾†é–‹å•Ÿç‰©å“æ¬„。 + +當您四處移動ã€é–‹æŽ¡å’Œæ”»æ“Šæ™‚,就會消耗食物列 {*ICON_SHANK_01*}ã€‚å¥”è·‘å’Œå¿«é€Ÿè·³èºæ™‚所消耗的食物é‡ï¼Œæœƒæ¯”è¡Œèµ°å’Œæ­£å¸¸è·³èºæ™‚所消耗的多。 + +如果您失去部分生命值,但是食物列有 9 個以上的 {*ICON_SHANK_01*},您的生命值將會自動回復。åªè¦åƒä¸‹é£Ÿç‰©ï¼Œå°±èƒ½è£œå……食物列。 + +åªè¦æŠŠé£Ÿç‰©æ¡åœ¨æ‰‹ä¸­ï¼Œç„¶å¾ŒæŒ‰ä½ {*CONTROLLER_ACTION_USE*} å³å¯åƒä¸‹è©²é£Ÿç‰©ä¾†è£œå……您的食物列。當食物列全滿時,您無法å†åƒæ±è¥¿ã€‚ + +您的食物列å³å°‡è€—盡,而且您失去了部分生命值。請åƒä¸‹ç‰©å“欄中的牛排來補充食物列,並開始回復生命值。{*ICON*}364{*/ICON*} + +您收集來的木頭å¯ä»¥ç²¾è£½æˆæœ¨æ¿ã€‚請開啟精製介é¢ä¾†ç²¾è£½æœ¨æ¿ã€‚{*PlanksIcon*} + +許多精製éŽç¨‹åŒ…å«å¥½å¹¾å€‹æ­¥é©Ÿã€‚ç¾åœ¨æ‚¨å·²ç¶“有幾片木æ¿ï¼Œå°±èƒ½å¤ ç²¾è£½å‡ºæ›´å¤šç‰©å“了。請建造 1 個精製å°ã€‚{*CraftingTableIcon*} + +如果您想è¦åŠ å¿«æ”¶é›†æ–¹å¡Šçš„é€Ÿåº¦ï¼Œå¯ä»¥å»ºé€ å°ˆç‚ºè©²å·¥ä½œæ‰€è¨­è¨ˆçš„工具。æŸäº›å·¥å…·ä¸Šæœ‰ç”¨æœ¨æ£åšæˆçš„æŠŠæ‰‹ã€‚請立刻精製出幾根木æ£ã€‚{*SticksIcon*} + +使用 {*CONTROLLER_ACTION_LEFT_SCROLL*} å’Œ {*CONTROLLER_ACTION_RIGHT_SCROLL*} å³å¯è®Šæ›´æ‰‹ä¸­æ¡ä½çš„物å“。 + +使用 {*CONTROLLER_ACTION_USE*} å³å¯ä½¿ç”¨ç‰©å“ã€èˆ‡ç‰©é«”äº’å‹•ï¼Œä»¥åŠæ”¾ç½®æŸäº›ç‰©å“ã€‚å¦‚æžœæ‚¨æƒ³è¦æ’¿èµ·å·²ç¶“放置的物å“,åªè¦ä½¿ç”¨æ­£ç¢ºçš„工具敲擊該物å“å³å¯æ’¿èµ·ã€‚ + +當您é¸å–ç²¾è£½å°æ™‚ï¼Œè«‹å°‡æ¸¸æ¨™å°æº–æ‚¨è¦æ”¾ç½®ç²¾è£½å°çš„地方,然後使用 {*CONTROLLER_ACTION_USE*} 來放置。 + +è«‹å°‡æ¸¸æ¨™å°æº–精製å°ï¼Œç„¶å¾ŒæŒ‰ä¸‹ {*CONTROLLER_ACTION_USE*} 來打開。 + +éŸå­å¯åŠ å¿«æ‚¨æŒ–æŽ˜è¼ƒè»Ÿæ–¹å¡Š (例如泥土åŠç™½é›ª) 的速度。當您收集了更多ä¸åŒæè³ªçš„æ–¹å¡Šå¾Œï¼Œå°±èƒ½ç²¾è£½å‡ºå¯åŠ å¿«å·¥ä½œé€Ÿåº¦ï¼Œä¸”æ›´ä¸å®¹æ˜“æå£žçš„工具。請製造 1 個木éŸã€‚{*WoodenShovelIcon*} + +æ–§é ­å¯åŠ å¿«åŠˆç æœ¨é ­åŠæœ¨è£½æ–¹å¡Šçš„速度。當您收集了更多ä¸åŒæè³ªçš„æ–¹å¡Šå¾Œï¼Œå°±èƒ½ç²¾è£½å‡ºå¯åŠ å¿«å·¥ä½œé€Ÿåº¦ï¼Œä¸”æ›´ä¸å®¹æ˜“æå£žçš„工具。請製造 1 個木斧。{*WoodenHatchetIcon*} + +å字鎬å¯åŠ å¿«æ‚¨æŒ–æŽ˜è¼ƒç¡¬æ–¹å¡Š (例如石頭åŠç¤¦çŸ³) 的速度。當您收集了更多ä¸åŒæè³ªçš„æ–¹å¡Šå¾Œï¼Œå°±èƒ½ç²¾è£½å‡ºå¯åŠ å¿«å·¥ä½œé€Ÿåº¦ï¼Œä¸”æ›´ä¸å®¹æ˜“æå£žçš„工具。請製造 1 個木鎬。{*WoodenPickaxeIcon*} + +請打開容器 + + + 夜晚很快就會來臨,沒有åšå¥½æº–備就在夜晚外出是很å±éšªçš„事。您å¯ä»¥ç²¾è£½å‡ºè­·ç”²åŠæ­¦å™¨ä¾†ä¿è­·è‡ªå·±ï¼Œä½†æœ€å¯¦ç”¨çš„æ–¹æ³•就是建造安全的棲身處。 + + + + 附近有個廢棄的礦工棲身處,您å¯ä»¥å®Œæˆè©²å»ºç¯‰ç•¶åšæ‚¨å¤œæ™šæ™‚çš„å®‰å…¨æ£²èº«è™•ã€‚ + + + + æ‚¨é‚„éœ€è¦æ”¶é›†è³‡æºæ‰èƒ½è“‹å¥½é€™å€‹æ£²èº«è™•。您å¯ä»¥ç”¨ä»»ä½•æè³ªçš„æ–¹å¡Šä¾†è“‹ç‰†å£å’Œå±‹é ‚,但您還必須製作 1 個門ã€å¹¾å€‹çª—戶,還有光æºã€‚ + + +請使用å字鎬來開採石頭方塊。石頭方塊在開採後會挖出éµåµçŸ³ã€‚åªè¦æ”¶é›† 8 個éµåµçŸ³æ–¹å¡Šï¼Œå°±èƒ½å»ºé€  1 個熔çˆã€‚您å¯èƒ½éœ€è¦æŒ–開一些泥土æ‰èƒ½æ‰¾åˆ°çŸ³é ­ï¼Œåˆ¥å¿˜äº†è¦ç”¨éŸå­ä¾†æŒ–泥土喔。{*StoneIcon*} + +您已經收集到足夠的éµåµçŸ³ä¾†å»ºé€ ç†”çˆäº†ã€‚請使用精製å°ä¾†å»ºé€ ç†”çˆã€‚ + +請使用 {*CONTROLLER_ACTION_USE*} æŠŠç†”çˆæ”¾ç½®åœ¨éŠæˆ²ä¸–界中,然後打開熔çˆã€‚ + +請使用熔çˆä¾†è£½ä½œæœ¨ç‚­ã€‚如果您正在等待木炭製作完æˆï¼Œæˆ‘å€‘å»ºè­°æ‚¨åˆ©ç”¨é€™æ®µç­‰å¾…æ™‚é–“æ”¶é›†æ›´å¤šå»ºç¯‰ææ–™ä¾†è“‹å¥½æ£²èº«è™•。 + +請使用熔çˆä¾†è£½ä½œçŽ»ç’ƒã€‚å¦‚æžœæ‚¨æ­£åœ¨ç­‰å¾…çŽ»ç’ƒè£½ä½œå®Œæˆï¼Œæˆ‘å€‘å»ºè­°æ‚¨åˆ©ç”¨é€™æ®µç­‰å¾…æ™‚é–“æ”¶é›†æ›´å¤šå»ºç¯‰ææ–™ä¾†è“‹å¥½æ£²èº«è™•。 + +良好的棲身處是有門的,讓您能夠輕易地進出棲身處,ä¸ç”¨è²»åŠ›æŠŠç‰†å£æŒ–é–‹å†è£œå¥½ç‰†å£ä¾†é€²å‡ºã€‚請立刻精製 1 個木門。{*WoodenDoorIcon*} + +請使用 {*CONTROLLER_ACTION_USE*} 來放置門。您å¯ä»¥ä½¿ç”¨ {*CONTROLLER_ACTION_USE*} 來開ã€é—œéŠæˆ²ä¸–界中的門。 + +當夜晚來臨時,棲身處裡é¢å¯èƒ½æœƒå¾ˆé»‘,因此您必須放置光æºï¼Œå¥½è®“您能看見周é­çš„環境。請立刻使用精製å°ï¼ŒæŠŠæœ¨æ£è·Ÿæœ¨ç‚­ç²¾è£½æˆç«æŠŠã€‚{*TorchIcon*} + + + æ‚¨å·²ç¶“å®Œæˆæ•™å­¸èª²ç¨‹çš„第一部份。 + + + + {*B*} + 請按下 {*CONTROLLER_VK_A*} 來繼續教學課程。{*B*} + 如果您覺得自己已經準備好,å¯ä»¥ç¨è‡ªçŽ©éŠæˆ²äº†ï¼Œè«‹æŒ‰ä¸‹ {*CONTROLLER_VK_B*}。 + + + + é€™æ˜¯æ‚¨çš„ç‰©å“æ¬„。這裡會顯示å¯åœ¨æ‚¨æ‰‹ä¸­ä½¿ç”¨çš„物å“ï¼Œä»¥åŠæ‚¨èº«ä¸Šçš„æ‰€æœ‰å…¶ä»–物å“。您穿戴的護甲也會顯示在這裡。 + + +{*B*} + 請按下 {*CONTROLLER_VK_A*} 來繼續。{*B*} + å¦‚æžœæ‚¨å·²ç¶“äº†è§£ç‰©å“æ¬„的使用方å¼ï¼Œè«‹æŒ‰ä¸‹ {*CONTROLLER_VK_B*}。 + + + + 請使用 {*CONTROLLER_MENU_NAVIGATE*} 來移動游標,然後用 {*CONTROLLER_VK_A*} 來撿起游標下的物å“。 + 如果游標下有數個物å“,您將會撿起所有物å“,但您也å¯ä»¥ä½¿ç”¨ {*CONTROLLER_VK_X*} 來撿起剛剛好一åŠçš„物å“。 + + + + 請用游標把這個物å“ç§»å‹•åˆ°ç‰©å“æ¬„çš„å¦ä¸€å€‹ç©ºæ ¼ï¼Œç„¶å¾Œä½¿ç”¨ {*CONTROLLER_VK_A*} æŠŠç‰©å“æ”¾ç½®åœ¨é‚£å€‹ç©ºæ ¼ã€‚ + 如果游標上有數個物å“,使用 {*CONTROLLER_VK_A*} å³å¯æ”¾ç½®æ‰€æœ‰ç‰©å“,但您也å¯ä»¥ä½¿ç”¨ {*CONTROLLER_VK_X*} ä¾†åªæ”¾ç½® 1 個物å“。 + + + + ç•¶æ¸¸æ¨™ä¸Šæœ‰ç‰©å“æ™‚ï¼Œå¦‚æžœæ‚¨æŠŠæ¸¸æ¨™ç§»å‹•åˆ°ç‰©å“æ¬„的外é¢ï¼Œå°±èƒ½ä¸Ÿæ£„游標上的物å“。 + + + + å¦‚æžœæ‚¨æƒ³çŸ¥é“æŸå€‹ç‰©å“的詳細資訊,åªè¦æŠŠæ¸¸æ¨™ç§»å‹•到該物å“上é¢ï¼Œç„¶å¾ŒæŒ‰ä¸‹ {*CONTROLLER_VK_RT*} å³å¯ã€‚ + + + + 請立刻按下 {*CONTROLLER_VK_B*} ä¾†é›¢é–‹ç‰©å“æ¬„。 + + + + 這是您的創造模å¼ç‰©å“欄,會顯示å¯åœ¨æ‚¨æ‰‹ä¸­ä½¿ç”¨çš„物å“,以åŠå¯ä¾›æ‚¨é¸æ“‡çš„物å“。 + + +{*B*} + 請按下 {*CONTROLLER_VK_A*} 來繼續。{*B*} + 如果您已經了解創造模å¼ç‰©å“欄的使用方å¼ï¼Œè«‹æŒ‰ä¸‹ {*CONTROLLER_VK_B*}。 + + + + 請使用 {*CONTROLLER_MENU_NAVIGATE*} 來移動游標。 + ç•¶æ‚¨åœ¨ç‰©å“æ¸…單時,使用 {*CONTROLLER_VK_A*} å³å¯æ’¿èµ·æ¸¸æ¨™ä¸‹çš„物å“,使用 {*CONTROLLER_VK_Y*} å³å¯æ’¿èµ·æ¸…單裡的所有物å“。 + + + + 游標會自動移動到使用列,您åªè¦ä½¿ç”¨ {*CONTROLLER_VK_A*} å³å¯æ”¾ç½®ç‰©å“。當您放置好物å“å¾Œï¼Œæ¸¸æ¨™æœƒè¿”å›žç‰©å“æ¸…單,讓您能é¸å–å¦ä¸€å€‹ç‰©å“。 + + + + ç•¶æ¸¸æ¨™ä¸Šæœ‰ç‰©å“æ™‚ï¼Œå¦‚æžœæ‚¨æŠŠæ¸¸æ¨™ç§»å‹•åˆ°ç‰©å“æ¬„的外é¢ï¼Œå°±èƒ½æŠŠæ¸¸æ¨™ä¸Šçš„物å“ä¸Ÿæ£„åˆ°éŠæˆ²ä¸–ç•Œä¸­ã€‚è‹¥è¦æ¸…除快速é¸å–列中的所有項目,請按下 {*CONTROLLER_VK_X*}。 + + + + 請使用 {*CONTROLLER_VK_LB*} å’Œ {*CONTROLLER_VK_RB*} 來切æ›é ‚端的群組類型索引標籤,以便é¸å–æ‚¨æƒ³è¦æ’¿èµ·çš„物å“。 + + + + å¦‚æžœæ‚¨æƒ³çŸ¥é“æŸå€‹ç‰©å“的詳細資訊,åªè¦æŠŠæ¸¸æ¨™ç§»å‹•到該物å“上é¢ï¼Œç„¶å¾ŒæŒ‰ä¸‹ {*CONTROLLER_VK_RT*} å³å¯ã€‚ + + + + 請立刻按下 {*CONTROLLER_VK_B*} 來離開創造模å¼ç‰©å“欄。 + + + + 這是精製介é¢ï¼Œå¯è®“您把收集到的物å“çµ„åˆæˆå„種新物å“。 + + +{*B*} + 請按下 {*CONTROLLER_VK_A*} 來繼續。{*B*} + 如果您已經了解精製物å“的方å¼ï¼Œè«‹æŒ‰ä¸‹ {*CONTROLLER_VK_B*}。 + + +{*B*} + 按下 {*CONTROLLER_VK_X*} å³å¯é¡¯ç¤ºç‰©å“說明。 + + +{*B*} + 按下 {*CONTROLLER_VK_X*} å³å¯é¡¯ç¤ºè¦ç²¾è£½å‡ºç›®å‰ç‰©å“æ‰€éœ€çš„ææ–™ã€‚ + + +{*B*} + 請按下 {*CONTROLLER_VK_X*} 來冿¬¡é¡¯ç¤ºç‰©å“欄。 + + + + 請使用 {*CONTROLLER_VK_LB*} å’Œ {*CONTROLLER_VK_RB*} 來切æ›é ‚端的群組類型索引標籤,以便é¸å–您想è¦ç²¾è£½çš„物å“群組類型,然後使用 {*CONTROLLER_MENU_NAVIGATE*} 來é¸å–您è¦ç²¾è£½çš„物å“。 + + + + 精製å€åŸŸæœƒé¡¯ç¤ºç²¾è£½æ–°ç‰©å“æ‰€éœ€çš„ææ–™ã€‚按下 {*CONTROLLER_VK_A*} å³å¯ç²¾è£½ç‰©å“ï¼Œä¸¦å°‡è©²ç‰©å“æ”¾ç½®åœ¨ç‰©å“欄中。 + + + + 精製å°å¯è®“您精製出種類較多的物å“。精製å°çš„é‹ä½œæ–¹æ³•è·ŸåŸºæœ¬çš„ç²¾è£½ä»‹é¢æ˜¯ä¸€æ¨£çš„ï¼Œä½†æ‚¨æœƒæ“æœ‰è¼ƒå¤§çš„ç²¾è£½ç©ºé–“ï¼Œè®“æ‚¨èƒ½ä½¿ç”¨æ›´å¤šç¨®çš„ææ–™çµ„åˆã€‚ + + + + 精製介é¢çš„å³ä¸‹å€åŸŸæœƒé¡¯ç¤ºæ‚¨çš„ç‰©å“æ¬„。這裡也會顯示您目å‰é¸å–物å“的說明,以åŠç²¾è£½å‡ºè©²ç‰©å“æ‰€éœ€çš„ææ–™ã€‚ + + + + 精製介é¢é¡¯ç¤ºäº†æ‚¨ç›®å‰é¸å–物å“的說明,告訴您該物å“的用途。 + + + + 精製介é¢é¡¯ç¤ºäº†è¦ç²¾è£½å‡ºå·²é¸å–物å“çš„æ‰€éœ€ææ–™ã€‚ + + +æ‚¨ä¹‹å‰æ”¶é›†çš„æœ¨é ­å¯ç”¨ä¾†ç²¾è£½æˆæœ¨æ¿ã€‚è«‹é¸å–木æ¿åœ–示,然後按下 {*CONTROLLER_VK_A*} 來製造木æ¿ã€‚{*PlanksIcon*} + + + 既然您已經製造出精製å°ï¼Œå°±æ‡‰è©²å°‡å…¶æ”¾ç½®åœ¨éŠæˆ²ä¸–界中,以便讓您能夠精製出更多種類的物å“。{*B*} + 請立刻按下 {*CONTROLLER_VK_B*} 來離開精製介é¢ã€‚ + + + + 按下 {*CONTROLLER_VK_LB*} å’Œ {*CONTROLLER_VK_RB*} å³å¯è®Šæ›´æ‚¨æƒ³è¦ç²¾è£½çš„物å“群組類型。請é¸å–工具群組。{*ToolsIcon*} + + + + 按下 {*CONTROLLER_VK_LB*} å’Œ {*CONTROLLER_VK_RB*} å³å¯è®Šæ›´æ‚¨æƒ³è¦ç²¾è£½çš„物å“的群組類型。請é¸å–建築群組。{*StructuresIcon*} + + + + 使用 {*CONTROLLER_MENU_NAVIGATE*} å³å¯è®Šæ›´æ‚¨æƒ³è¦ç²¾è£½çš„物å“。æŸäº›ç‰©å“æœƒå› ç‚ºææ–™çš„æè³ªä¸åŒï¼Œè€Œæœ‰å„種ä¸åŒçš„版本。請é¸å–木éŸã€‚{*WoodenShovelIcon*} + + + + 許多精製éŽç¨‹åŒ…å«å¥½å¹¾å€‹æ­¥é©Ÿã€‚ç¾åœ¨æ‚¨å·²ç¶“有幾片木æ¿ï¼Œå°±èƒ½å¤ ç²¾è£½å‡ºæ›´å¤šç‰©å“了。使用 {*CONTROLLER_MENU_NAVIGATE*} å³å¯è®Šæ›´æ‚¨æƒ³è¦ç²¾è£½çš„物å“。請é¸å–精製å°ã€‚{*CraftingTableIcon*} + + + + 有了您製造的這些工具,您就能更有效率地收集å„種ä¸åŒçš„æ–¹å¡Šã€‚{*B*} + 請立刻按下 {*CONTROLLER_VK_B*} 來離開精製介é¢ã€‚ + + + + æŸäº›ç‰©å“無法用精製å°ä¾†è£½é€ ï¼Œå¿…é ˆé ç†”çˆä¾†ç”¢ç”Ÿã€‚請立刻製造 1 個熔çˆã€‚{*FurnaceIcon*} + + + + è«‹å°‡æ‚¨ç²¾è£½å‡ºçš„ç†”çˆæ”¾ç½®åœ¨éŠæˆ²ä¸–界中,最好是放置在您的棲身處裡é¢ã€‚{*B*} + 請立刻按下 {*CONTROLLER_VK_B*} 來離開精製介é¢ã€‚ + + + + 這是熔çˆä»‹é¢ã€‚熔çˆå¯è®“您é€éŽç‡ƒç‡’來改變物å“。舉例來說,您å¯ä»¥ä½¿ç”¨ç†”çˆæŠŠéµç¤¦çŸ³è½‰è®ŠæˆéµéŒ å¡Šã€‚ + + +{*B*} + 請按下 {*CONTROLLER_VK_A*} 來繼續。{*B*} + 如果您已經了解熔çˆçš„使用方å¼ï¼Œè«‹æŒ‰ä¸‹ {*CONTROLLER_VK_B*}。 + + + + 您必須把燃料放在熔çˆåº•部的空格中,熔çˆé ‚ç«¯ç©ºæ ¼è£¡çš„ç‰©å“æ‰æœƒå—熱。然後熔çˆå°±æœƒèµ·ç«ï¼Œé–‹å§‹ç«ç‡’上é¢çš„物å“,並把æˆå“放在å³é‚Šçš„空格中。 + + + + 許多木頭物å“能拿來當åšç‡ƒæ–™ï¼Œä½†ä¸¦éžæ¯æ¨£æ±è¥¿çš„燃燒時間都是相åŒçš„。還有其他物å“也能拿來當åšç‡ƒæ–™ï¼Œæ‚¨ä¸å¦¨å¤šè©¦è©¦çœ‹ã€‚ + + + + 當物å“ç«ç‡’完畢後,您就能把物å“從æˆå“å€ç§»å‹•åˆ°ç‰©å“æ¬„中。您å¯ä»¥å˜—試ç«ç‡’ä¸åŒçš„物å“,看看會得到什麼æˆå“。 + + + + å¦‚æžœæ‚¨æŠŠæœ¨é ­ç•¶åšææ–™ï¼Œå°±æœƒè£½é€ å‡ºæœ¨ç‚­ã€‚è«‹åœ¨ç†”çˆè£¡æ”¾äº›ç‡ƒæ–™ï¼Œç„¶å¾ŒæŠŠæœ¨é ­æ”¾åœ¨ææ–™æ ¼è£¡ã€‚熔çˆéœ€è¦èŠ±äº›æ™‚é–“æ‰èƒ½è£½é€ æœ¨ç‚­ï¼Œæ‚¨å¯ä»¥è¶é€™æ©ŸæœƒåŽ»åšå…¶ä»–的事,ç¨å¾Œå†å›žä¾†æŸ¥çœ‹é€²åº¦ã€‚ + + + + 木炭å¯ç•¶åšç‡ƒæ–™ä½¿ç”¨ï¼Œé‚„能與木æ£ä¸€èµ·ç²¾è£½æˆç«æŠŠã€‚ + + + + æŠŠæ²™å­æ”¾åœ¨ææ–™æ ¼è£¡ï¼Œå°±èƒ½è£½é€ å‡ºçŽ»ç’ƒã€‚è«‹è£½é€ äº›çŽ»ç’ƒä¾†ç•¶åšæ£²èº«è™•的窗戶。 + + + + 這是釀製介é¢ï¼Œæ‚¨å¯åœ¨æ­¤è£½ä½œå…·å‚™å„種ä¸åŒæ•ˆæžœçš„藥水。 + + +{*B*} + 按下 {*CONTROLLER_VK_A*} å³å¯ç¹¼çºŒã€‚{*B*} + 如果您已經了解應如何使用釀製å°ï¼Œè«‹æŒ‰ä¸€ä¸‹ {*CONTROLLER_VK_B*}。 + + + + è«‹å°‡ææ–™æ”¾åœ¨ä¸Šæ–¹ç©ºæ ¼ï¼Œå†å°‡è—¥æ°´æˆ–水瓶置於下方空格,å³å¯é‡€è£½è—¥æ°´ï¼Œæœ€å¤šå¯åŒæ™‚釀製三樣。當您完æˆé©ç•¶çš„組åˆå¾Œï¼Œé‡€è£½å³é–‹å§‹é€²è¡Œï¼Œä¸ä¹…å³å¯è£½å‡ºè—¥æ°´ã€‚ + + + + 釀製藥水必須先從水瓶著手。大部分的藥水都是先用地ç„çµç¯€åšå‡ºç²—劣藥水,å†ä½¿ç”¨è‡³å°‘ä¸€æ¨£å…¶ä»–ææ–™ï¼Œé‡€è£½å‡ºæœ€å¾Œçš„æˆå“。 + + + + 您å¯ä»¥è®Šæ›´è—¥æ°´çš„æ•ˆæžœï¼šåŠ å…¥ç´…çŸ³å¡µå³å¯å¢žåŠ æ•ˆæžœçš„æŒä¹…度;加入閃石塵則å¯è®“效果更具å¨åŠ›ã€‚ + + + + 加入發酵蜘蛛眼會破壞藥水,讓藥水出ç¾å效果;加入ç«è—¥å‰‡å¯å°‡è—¥æ°´è®Šæˆå™´æ¿ºè—¥æ°´ï¼ŒæŠ•擲噴濺藥水å³å¯ä½¿è—¥æ°´æ•ˆåŠ›å½±éŸ¿é™„è¿‘å€åŸŸã€‚ + + + + 先將地ç„çµç¯€åŠ å…¥æ°´ç“¶ï¼Œå†åŠ å…¥ç†”å²©çƒï¼Œå³å¯è£½é€ é˜²ç«è—¥æ°´ã€‚ + + + + 按下 {*CONTROLLER_VK_B*} å³å¯é›¢é–‹é‡€è£½ä»‹é¢ã€‚ + + + + 您å¯åœ¨é€™å€‹å€åŸŸæ‰¾åˆ°é‡€è£½è—¥æ°´æ‰€éœ€çš„釀製å°ã€æ°´æ§½å’Œè£æ»¿ç‰©å“的箱å­ã€‚ + + +{*B*} + 按下 {*CONTROLLER_VK_A*} å³å¯äº†è§£æ›´å¤šé—œæ–¼é‡€è£½å’Œè—¥æ°´çš„相關資訊。{*B*} + 如果您已經了解如何釀製和使用藥水,請按下 {*CONTROLLER_VK_B*}。 + + + + 釀製藥水的第一步就是製造水瓶。請從箱å­ä¸­æ‹¿å‡ºçŽ»ç’ƒç“¶ã€‚ + + + + 您å¯ä»¥å¾žè£äº†æ°´çš„æ°´æ§½æˆ–æ°´æ–¹å¡Šä¸­å–æ°´è£å…¥çŽ»ç’ƒç“¶ã€‚è«‹å°‡æ¸¸æ¨™æŒ‡å‘æ°´æºï¼Œå†æŒ‰ä¸‹ {*CONTROLLER_ACTION_USE*},å³å¯åœ¨çŽ»ç’ƒç“¶ä¸­è£å…¥æ°´ã€‚ + + + + 如果水槽空了,您å¯ç”¨æ°´æ¡¶æ›¿æ°´æ§½åŠ æ°´ã€‚ + + + + 使用水瓶ã€åœ°ç„çµç¯€å’Œç†”岩çƒï¼Œå³å¯é‡€è£½é˜²ç«è—¥æ°´ã€‚ + + + + 有了藥水時,åªè¦æŒ‰ä½ {*CONTROLLER_ACTION_USE*} å³å¯ä½¿ç”¨è—¥æ°´ã€‚使用一般藥水時,您必須å–下藥水,å³å¯åœ¨è‡ªå·±èº«ä¸Šç™¼æ®è—¥æ°´çš„æ•ˆæžœã€‚使用噴濺藥水時,您則必須投擲藥水,讓藥水的效果發æ®åœ¨ä½æ–¼æ“Šä¸­è™•附近的生物上。 + 在一般藥水內加入ç«è—¥ï¼Œå³å¯è£½é€ å™´æ¿ºè—¥æ°´ã€‚ + + + + 將防ç«è—¥æ°´ç”¨åœ¨è‡ªå·±èº«ä¸Šã€‚ + + + + 既然您ç¾åœ¨å·²å¯æŠ—ç«å’Œç†”岩,ä¸å¦¨å‰å¾€ä¹‹å‰å› ç«æˆ–熔岩的阻礙而無法到é”之處。 + + + + 這是附加能力介é¢ï¼Œå¯è®“您將附加能力加至武器ã€è­·ç”²ä»¥åŠç‰¹å®šçš„工具。 + + +{*B*} + 按下 {*CONTROLLER_VK_A*} å³å¯äº†è§£æ›´å¤šé—œæ–¼é™„加能力介é¢çš„資訊。{*B*} + 如果您已經了解應如何附加能力,請按下 {*CONTROLLER_VK_B*}。 + + + + è«‹å…ˆå°‡ç‰©å“æ”¾åˆ°é™„加能力空格中,æ‰èƒ½é–‹å§‹é™„加能力。武器ã€è­·ç”²å’Œç‰¹å®šå·¥å…·åœ¨é™„加能力後,å³å¯æ“æœ‰å¦‚æ›´èƒ½æŠµæŠ—å‚·å®³ï¼Œæˆ–é–‹æŽ¡æ™‚å¯æ”¶é›†æ›´å¤šç‰©å“等特殊效果。 + + + + ç•¶æ‚¨å°‡ç‰©å“æ”¾åˆ°é™„加能力空格後,畫é¢å³é‚Šçš„æŒ‰éˆ•會顯示多種隨機挑é¸çš„附加能力。 + + + + æŒ‰éˆ•ä¸Šçš„è™Ÿç¢¼ä»£è¡¨é™„åŠ è©²èƒ½åŠ›åˆ°ç‰©å“æ‰€éœ€çš„經驗值。如果您的經驗等級ä¸å¤ é«˜ï¼Œæ‚¨å°±ç„¡æ³•使用該按鈕。 + + + + è«‹é¸å–您è¦çš„附加能力,然後按一下 {*CONTROLLER_VK_A*},å³å¯å°‡èƒ½åŠ›é™„åŠ è‡³ç‰©å“上。使用該附加能力會é™ä½Žæ‚¨çš„經驗等級。 + + + + é›–ç„¶å¯ä¾›æ‚¨ä½¿ç”¨çš„附加能力為隨機出ç¾ï¼Œä½†æŸäº›æ•ˆæžœè¼ƒå¥½çš„é™„åŠ èƒ½åŠ›ï¼Œåªæœƒåœ¨æ‚¨ç¶“驗等級較高,且附加能力å°é™„近有許多書架讓附加能力å°çš„力é‡å¢žåŠ æ™‚ï¼Œæ‰æœƒå‡ºç¾ã€‚ + + + + 您å¯åœ¨é€™å€‹å€åŸŸè£¡æ‰¾åˆ°é™„加能力å°ï¼Œä»¥åŠå…¶ä»–能幫助您了解如何附加能力的物å“。 + + +{*B*} +  請按下 {*CONTROLLER_VK_A*} å³å¯äº†è§£æ›´å¤šé—œæ–¼é™„加能力的資訊。{*B*} +  如果您已å分了解如何使用附加能力,請按下 {*CONTROLLER_VK_B*}。 + + + + 您å¯ä½¿ç”¨é™„加能力å°ï¼ŒæŠŠä¾‹å¦‚é–‹æŽ¡æ™‚å¯æ”¶é›†æ›´å¤šç‰©å“,或更能抵抗傷害等特殊的效果附加到武器ã€è­·ç”²å’Œç‰¹å®šå·¥å…·ä¸Šã€‚ + + + + 在附加能力å°çš„附近放置書架,å³å¯å¢žåŠ é™„åŠ èƒ½åŠ›å°çš„力é‡ï¼Œæ‚¨ä¹Ÿå› æ­¤å¯ä½¿ç”¨æ›´é«˜ç­‰ç´šçš„附加能力。 + + + + 使用附加能力會é™ä½Žæ‚¨çš„經驗等級。您å¯ä»¥è—‰ç”±æ”¶é›†æ®ºæ­»æ€ªç‰©æˆ–動物ã€é–‹æŽ¡ç¤¦ã€ç¹æ®–動物ã€é‡£é­šï¼Œä»¥åŠä½¿ç”¨ç†”çˆç†”煉或烹煮所產生的經驗值光çƒï¼Œä¾†æå‡ç¶“驗等級。 + + + + 您也å¯ä½¿ç”¨ç¶“驗藥水瓶增加經驗等級。åªè¦æŠ•擲經驗藥水瓶,掉è½è™•就會產生å¯ä»¥æ”¶é›†çš„經驗值光çƒã€‚ + + + + 您å¯åœ¨ç®±å­ä¸­æ‰¾åˆ°ï¼šå·²é™„加能力的物å“ã€ç¶“驗藥水瓶,以åŠå¾…您使用附加能力å°ä¾†å˜—試進行附加能力的物å“。 + + + + 您ç¾åœ¨å在礦車中。如è¦é›¢é–‹ç¤¦è»Šï¼Œè«‹æŠŠæ¸¸æ¨™æŒ‡å‘礦車,然後按下 {*CONTROLLER_ACTION_USE*}。{*MinecartIcon*} + + +{*B*} + 請按下 {*CONTROLLER_VK_A*} 來學習礦車的相關知識。{*B*} + 如果您已經了解礦車的使用方å¼ï¼Œè«‹æŒ‰ä¸‹ {*CONTROLLER_VK_B*}。 + + + + 礦車會在軌é“上å‰é€²ã€‚您也å¯ä»¥è£½ä½œå…§æœ‰ç†”çˆçš„動力礦車,以åŠå…§æœ‰ç®±å­çš„礦車。 + {*RailIcon*} + + + + 您也å¯ä»¥ç²¾è£½å‡ºå‹•力軌é“ï¼Œé€™æœƒä½¿ç”¨ç´…çŸ³ç«æŠŠåŠé›»è·¯å‚³ä¾†çš„動力,使礦車速度加快。動力軌é“é‚„èƒ½èˆ‡é–‹é—œã€æ‹‰æ¡¿åŠå£“æ¿é€£æŽ¥ï¼Œè£½é€ å‡ºæ›´è¤‡é›œçš„軌é“系統。 + {*PoweredRailIcon*} + + + + 您ç¾åœ¨å在å°èˆ¹ä¸Šã€‚如è¦é›¢é–‹å°èˆ¹ï¼Œè«‹æŠŠæ¸¸æ¨™æŒ‡å‘å°èˆ¹ï¼Œç„¶å¾ŒæŒ‰ä¸‹ {*CONTROLLER_ACTION_USE*}。{*BoatIcon*} + + + + {*B*} + 請按下 {*CONTROLLER_VK_A*} 來學習å°èˆ¹çš„相關知識。{*B*} + 如果您已經了解å°èˆ¹çš„使用方å¼ï¼Œè«‹æŒ‰ä¸‹ {*CONTROLLER_VK_B*}。 + + + + å°èˆ¹å¯è®“您在水é¢ä¸Šå¿«é€Ÿç§»å‹•。您å¯ä»¥ä½¿ç”¨ {*CONTROLLER_ACTION_MOVE*} å’Œ {*CONTROLLER_ACTION_LOOK*} 來控制方å‘。 + {*BoatIcon*} + + + + 您ç¾åœ¨æ‰‹ä¸­æ¡è‘—釣魚竿。請按下 {*CONTROLLER_ACTION_USE*} 來使用釣魚竿。{*FishingRodIcon*} + + + + {*B*} + 請按下 {*CONTROLLER_VK_A*} 來學習釣魚。{*B*} + 如果您已經知é“釣魚的方法,請按下 {*CONTROLLER_VK_B*}。 + + + + 按下 {*CONTROLLER_ACTION_USE*} å³å¯æ‹‹ç·šä¾†é–‹å§‹é‡£é­šã€‚冿¬¡æŒ‰ä¸‹ {*CONTROLLER_ACTION_USE*} å³å¯æ²ç·šã€‚ + {*FishingRodIcon*} + + + + 如果您等到浮標沈到水é¢ä¸‹æ™‚冿²ç·šï¼Œå°±èƒ½é‡£åˆ°é­šã€‚您å¯ä»¥åƒç”Ÿé­šï¼Œä¹Ÿå¯ä»¥å…ˆç”¨ç†”çˆæŠŠé­šç…®ç†Ÿå¾Œå†åƒã€‚ä¸è«–是生魚還是熟魚,åƒä¸‹å¾Œéƒ½èƒ½å›žå¾©æ‚¨çš„生命值。 + {*FishIcon*} + + + + 釣魚竿就跟許多其他工具一樣,有使用次數的é™åˆ¶ï¼Œä½†ç”¨é€”å¯ä¸é™æ–¼é‡£é­šå–”ï¼æ‚¨å¯ä»¥å¤šå¤šå¯¦é©—,看看釣魚竿還能釣上或啟動什麼æ±è¥¿ã€‚ + {*FishingRodIcon*} + + + + 這是床舖。當夜晚來臨時,把游標指å‘床舖並按下 {*CONTROLLER_ACTION_USE*} å³å¯ç¡è¦ºï¼Œä¸¦åœ¨æ—©æ™¨é†’來。{*ICON*}355{*/ICON*} + + + + {*B*} + 請按下 {*CONTROLLER_VK_A*} 來學習床舖的相關知識。{*B*} + 如果您已經了解床舖的使用方å¼ï¼Œè«‹æŒ‰ä¸‹ {*CONTROLLER_VK_B*}。 + + + + åºŠèˆ–æ‡‰è©²è¦æ”¾ç½®åœ¨å®‰å…¨ã€æ˜Žäº®çš„åœ°æ–¹ï¼Œä»¥å…æ€ªç‰©åœ¨åŠå¤œåµé†’您。當您使用éŽåºŠèˆ–後,您下次死亡時就會在那張床舖å†ç”Ÿã€‚ + {*ICON*}355{*/ICON*} + + + + å¦‚æžœæ‚¨çš„éŠæˆ²ä¸­æœ‰å…¶ä»–玩家,æ¯ä½çŽ©å®¶éƒ½å¿…é ˆåŒæ™‚躺在床上æ‰èƒ½ç¡è¦ºã€‚ + {*ICON*}355{*/ICON*} + + + + 在這個地å€è£¡ï¼Œæœ‰äº›ç°¡å–®çš„紅石和活塞電路,還有個箱å­ï¼Œè£¡é¢è£äº†å…¶ä»–å¯ç”¨ä¾†æ“´å¤§é›»è·¯ç³»çµ±çš„物å“。 + + + + {*B*} + 請按下 {*CONTROLLER_VK_A*} 來學習紅石電路和活塞的相關知識。{*B*} + 如果您已經了解紅石電路和活塞的使用方å¼ï¼Œè«‹æŒ‰ä¸‹ {*CONTROLLER_VK_B*}。 + + + + æ‹‰æ¡¿ã€æŒ‰éˆ•ã€å£“æ¿å’Œç´…çŸ³ç«æŠŠéƒ½å¯ç‚ºé›»è·¯æä¾›å‹•力。您å¯ç›´æŽ¥æŠŠé€™äº›æ±è¥¿é€£æŽ¥åˆ°æ‚¨æƒ³è¦å•Ÿå‹•的物å“上,或是利用紅石塵將這些æ±è¥¿é€£æŽ¥åˆ°ç‰©å“上。 + + + + 動力來æºçš„æ”¾ç½®ä½ç½®å’Œæ–¹å‘,會變更å°å‘¨é­æ–¹å¡Šçš„影響方å¼ã€‚èˆ‰ä¾‹ä¾†èªªï¼Œå¦‚æžœæ‚¨æŠŠç´…çŸ³ç«æŠŠé€£æŽ¥åˆ°æ–¹å¡Šå´é‚Šï¼Œç•¶é€™å€‹æ–¹å¡Šå¾žå…¶ä»–來æºç²å¾—å‹•åŠ›æ™‚ï¼Œç´…çŸ³ç«æŠŠå°±æœƒé—œé–‰ã€‚ + + + + åªè¦ç”¨éµã€é‘½çŸ³æˆ–是黃金æè³ªçš„å字鎬開採紅石礦石,就能ç²å¾—紅石塵。紅石塵å¯ç”¨ä¾†å‚³é€å‹•力,最多å¯é” 15 個方塊,還å¯åƒæ–œå¡èˆ¬å¾€ä¸Šæˆ–往下移動 1 個方塊的高度。 + {*ICON*}331{*/ICON*} + + + + 紅石中繼器å¯ç”¨ä¾†å»¶é•·å‹•力傳é€çš„è·é›¢ï¼Œæˆ–是延é²é›»è·¯ã€‚ + {*ICON*}356{*/ICON*} + + + + 當活塞有動力時會延伸出去,並推動最多 12 å€‹æ–¹å¡Šã€‚ç•¶é»æ€§æ´»å¡žç¸®å›žæ™‚,會拉回 1 個方塊,而且幾乎所有æè³ªçš„æ–¹å¡Šéƒ½å¯æ‹‰å›žã€‚ + {*ICON*}33{*/ICON*} + + + + 在這個地å€çš„ç®±å­ä¸­æœ‰äº›é›¶ä»¶ï¼Œå¯ç”¨ä¾†çµ„æˆæœ‰æ´»å¡žçš„電路。請使用或完æˆé€™å€‹åœ°å€è£¡çš„é›»è·¯ï¼Œæˆ–æ˜¯çµ„æˆæ‚¨è‡ªå·±çš„電路。在教學課程地å€å¤–,還有更多的範例å¯è®“您åƒè€ƒã€‚ + + + + 在這個地å€è£¡ï¼Œæœ‰å€‹é€šå¾€åœ°ç„的傳é€é–€ï¼ + + + + {*B*} + 請按下 {*CONTROLLER_VK_A*} 來學習傳é€é–€å’Œåœ°ç„的相關知識。 {*B*} + 如果您已經了解傳é€é–€å’Œåœ°ç„的使用方å¼ï¼Œè«‹æŒ‰ä¸‹ {*CONTROLLER_VK_B*}。 + + + + åªè¦åˆ©ç”¨é»‘æ›œçŸ³æ–¹å¡Šçµ„åˆæˆæœ‰ 4 個方塊寬ã€5 個方塊高的框架,就能製造傳é€é–€ã€‚框架的 4 個邊角ä¸éœ€è¦æ”¾ç½®æ–¹å¡Šã€‚ + + + + 如è¦å•Ÿå‹•地ç„傳é€é–€ï¼Œåªè¦ç”¨æ‰“ç«é®é»žç‡ƒæ¡†æž¶å…§å´çš„黑曜石方塊å³å¯ã€‚當傳é€é–€çš„æ¡†æž¶æå£žã€é™„近發生爆炸,或是有液體æµéŽå‚³é€é–€æ™‚,傳é€é–€å°±æœƒé—œé–‰ã€‚ + + + + 如è¦ä½¿ç”¨åœ°ç„傳é€é–€ï¼Œè«‹ç«™åœ¨å‚³é€é–€è£¡é¢ã€‚此時您會看到畫é¢è®Šæˆç´«è‰²ï¼Œé‚„會è½åˆ°æŸç¨®è²éŸ³ã€‚幾秒é˜å¾Œï¼Œæ‚¨å°±æœƒè¢«å‚³é€åˆ°åœ°ç„。 + + + + åœ°ç„æ˜¯å€‹å±éšªçš„地方,到處都是熔岩,但也是收集地ç„血石和閃石的好地方。地ç„血石åªè¦ä¸€é»žç‡ƒå°±æœƒæ°¸é ç‡ƒç‡’,而閃石則å¯åšç‚ºå…‰æºã€‚ + + + + 您å¯ä»¥åˆ©ç”¨åœ°ç„世界在地上世界中快速移動,因為在地ç„世界移動 1 個方塊的è·é›¢ï¼Œå°±ç­‰æ–¼åœ¨åœ°ä¸Šä¸–界移動 3 個方塊的è·é›¢ã€‚ + + + + 您正以創造模å¼é€²è¡ŒéŠæˆ²ã€‚ + + + + {*B*} + 按下 {*CONTROLLER_VK_A*} å³å¯äº†è§£æ›´å¤šé—œæ–¼å‰µé€ æ¨¡å¼çš„資訊。{*B*} + 如果您已經了解如何使用創造模å¼ï¼Œè«‹æŒ‰ä¸‹ {*CONTROLLER_VK_B*}。 + + +在創造模å¼ä¸­ï¼Œæ‚¨æ“有無é™å¤šçš„物å“和方塊,且ä¸éœ€ä½¿ç”¨ä»»ä½•特殊工具,åªè¦æŒ‰ä¸€ä¸‹å³å¯æ‘§æ¯€æ–¹å¡Šã€‚您是無敵的,並且å¯ä»¥é£›ç¿”。 + +快速按兩次 {*CONTROLLER_ACTION_JUMP*} å³å¯é£›ç¿”,é‡è¤‡é€™å€‹å‹•作則å¯åœæ­¢é£›ç¿”ã€‚å¿«é€Ÿå¾€å‰æŒ‰å…©ä¸‹ {*CONTROLLER_ACTION_MOVE*} å³å¯åœ¨é£›è¡Œä¸­åŠ å¿«é£›è¡Œçš„é€Ÿåº¦ã€‚ +在飛翔模å¼ä¸‹ï¼Œåªè¦æŒ‰ä½ {*CONTROLLER_ACTION_JUMP*} å³å¯å¾€ä¸Šé£›ï¼ŒæŒ‰ä½ {*CONTROLLER_ACTION_SNEAK*} 則å¯å¾€ä¸‹é£›ã€‚您也å¯ç”¨æ–¹å‘鵿“控方å‘,往上ã€ä¸‹ã€å·¦æˆ–å³é£›ã€‚ + +按下 {*CONTROLLER_ACTION_CRAFTING*} å³å¯é–‹å•Ÿå‰µé€ æ¨¡å¼ç‰©å“欄介é¢ã€‚ + +您必須設法移到這個洞的å¦ä¸€é‚Šï¼Œæ‰èƒ½ç¹¼çºŒé€²è¡ŒéŠæˆ²ã€‚ + +您已完æˆå‰µé€ æ¨¡å¼çš„æ•™å­¸èª²ç¨‹ã€‚ + + + 這個地å€å·²ç¶“準備好一塊農田。耕種能夠讓您建立一個å¯ä»¥é‡è¤‡æä¾›é£Ÿç‰©èˆ‡å…¶ä»–物å“çš„å¯å†ç”Ÿä¾†æºã€‚ + + + + {*B*} + 按下 {*CONTROLLER_VK_A*} 來學習耕種的相關知識。{*B*} + 如果您已經了解耕種的方法,請按下 {*CONTROLLER_VK_B*} 。 + + +å°éº¥ã€å—ç“œå’Œè¥¿ç“œçš†å¿…é ˆåˆ©ç”¨ç¨®å­æ ½ç¨®ã€‚å°éº¥ç¨®å­å¯ä»¥è—‰ç”±ç ´å£žèŒ‚密é’è‰ï¼Œæˆ–æ”¶æˆå°éº¥ä¾†é€²è¡Œæ”¶é›†ã€‚相å°åœ°ï¼Œæ”¶æˆå—ç“œå’Œè¥¿ç“œï¼ŒåŒæ¨£ä¹Ÿèƒ½æ”¶é›†åˆ°å—瓜和西瓜種å­ã€‚ + +在栽種種å­å‰ï¼Œéœ€è¦å…ˆä½¿ç”¨é‹¤é ­å°‡æ³¥åœŸæ–¹å¡Šè®Šæˆè¾²ç”°ã€‚在附近放置水æºå’Œå…‰æºï¼Œä¸ä½†èƒ½ä½¿è¾²ç”°ä¿æŒæ°´åˆ†ï¼Œä¸”能讓作物生長得較快。 + +å°éº¥çš„生長éŽç¨‹åŒ…å«äº†æ•¸å€‹éšŽæ®µï¼Œç•¶é¡è‰²è½‰æ·±å¾Œï¼Œå°±ä»£è¡¨å¯ä»¥æ”¶æˆäº†ã€‚{*ICON*}59:7{*/ICON*} + +å—ç“œå’Œè¥¿ç“œåŒæ™‚也需è¦åœ¨æ—邊空出一格的空間,讓完全長æˆçš„莖葉能夠在上é¢é•·å‡ºæžœå¯¦ã€‚ + +甘蔗必須栽種在é’è‰ã€æ³¥åœŸï¼Œæˆ–æ²™å­æ–¹å¡Šä¸Šï¼Œä¸¦ä¸”需è¦å’Œæ°´é«”方塊相鄰。劈ç ç”˜è”—方塊將會連帶使上方所有方塊一起掉è½ã€‚{*ICON*}83{*/ICON*} + +仙人掌必須栽種在沙å­ä¸Šï¼Œæœ€é«˜å¯ä»¥é•·åˆ°ä¸‰å€‹æ–¹å¡Šçš„高度。和甘蔗一樣,破壞最底層的方塊,就能夠連帶一起收集上方所有的方塊。{*ICON*}81{*/ICON*} + +蘑è‡å¿…é ˆæ ½ç¨®åœ¨å…‰ç·šæ˜æš—的地å€ï¼Œä¸¦ä¸”æœƒè”“å»¶è‡³é™„è¿‘å…¶ä»–å…‰ç·šæ˜æš—的方塊上。{*ICON*}39{*/ICON*} + +骨粉å¯ä»¥ç”¨ä¾†è®“作物立刻é”到完全æˆç†Ÿçš„階段,或是讓蘑è‡é•·æˆå·¨åž‹è˜‘è‡ã€‚{*ICON*}351:15{*/ICON*} + +您已完æˆè€•種的教學課程。 + + + 這個å€åŸŸè£¡ï¼Œå·²è±¢é¤Šæ•¸éš»å‹•物。您å¯ä»¥è®“å‹•ç‰©é€²è¡Œç¹æ®–,培育å°å‹•物。 + + + +  {*B*} +  按下 {*CONTROLLER_VK_A*} ä¾†å­¸ç¿’ç¹æ®–的相關知識。{*B*} +ã€€ã€€å¦‚æžœæ‚¨å·²ç¶“äº†è§£ç¹æ®–的方法,請按下 {*CONTROLLER_VK_B*}。 + + +您必須餵動物åƒç‰¹å®šçš„食物,讓動物進入「戀愛模å¼ã€ï¼Œå‹•物æ‰èƒ½ç¹æ®–。 + +餵乳牛ã€è˜‘è‡ç‰›æˆ–綿羊åƒå°éº¥ï¼Œé¤µè±¬åƒèƒ¡è˜¿è””ã€é¤µé›žåƒå°éº¥ç¨®å­æˆ–地ç„çµç¯€ï¼Œé¤µç‹¼åƒä»»ä½•一種肉類,這些動物就會開始尋找也在戀愛模å¼ä¸­çš„åŒç¨®é¡žå‹•物。 + +ç•¶åŒåœ¨æˆ€æ„›æ¨¡å¼ä¸­çš„å…©éš»åŒç¨®é¡žå‹•物相é‡ï¼Œç‰ å€‘æœƒå…ˆè¦ªå»æ•¸ç§’,剛出生的å°å‹•物就會出ç¾ã€‚å°å‹•物一開始會跟在父æ¯èº«æ—,之後就會長æˆä¸€èˆ¬æˆå¹´å‹•物的大å°ã€‚ + +å‰›çµæŸæˆ€æ„›æ¨¡å¼çš„動物必須等待大約五分é˜å¾Œï¼Œæ‰èƒ½å†æ¬¡é€²å…¥æˆ€æ„›æ¨¡å¼ã€‚ + +當您手中æ¡è‘—牠們的食物時,有些動物會尾隨在後,這å¯ä»¥å”助您將一群動物èšé›†èµ·ä¾†ç¹æ®–。{*ICON*}296{*/ICON*} + + +  您å¯ä»¥é€éŽé¤µé£Ÿéª¨é ­ä¾†é¦´æœé‡Žç‹¼ï¼Œé¦´æœç•¶ä¸‹å¯ä»¥åœ¨ç‹¼çš„身邊看到愛心顯示。除éžçީ家命令馴æœçš„狼å下,這些狼會æŒçºŒè·Ÿéš¨ä¸¦ä¿è­·çŽ©å®¶ã€‚ + + +您已完æˆå‹•ç‰©èˆ‡ç¹æ®–的教學課程。 + + + 這個å€åŸŸæœ‰ä¸€äº›å—瓜和方塊å¯ä»¥ç”¨ä¾†è£½ä½œé›ªäººå’Œéµå‚€å„¡ã€‚ + + + {*B*} + 按下 {*CONTROLLER_VK_A*} 深入了解。{*B*} + 若您已經å分熟悉就按下{*CONTROLLER_VK_B*}。 + + +放å—瓜在方塊堆頂端就å¯ä»¥è£½ä½œå‡ºå‚€å„¡ã€‚ + +è£½ä½œé›ªäººéœ€è¦ 2 個白雪方塊,疊在一起,最頂端放 1 個å—ç“œã€‚é›ªäººæœƒå‘æ‚¨çš„æ•µäººä¸Ÿé›ªçƒã€‚ + +製作éµå‚€å„¡éœ€è¦ 4 å€‹æœ‰åœ–æ¡ˆçš„éµæ–¹å¡Šï¼Œåœ¨ä¸­é–“的方塊上方放 1 個å—瓜。éµå‚€å„¡æœƒæ”»æ“Šæ‚¨çš„æ•µäººã€‚ + +éµå‚€å„¡ä¹Ÿæœƒè‡ªç„¶å‡ºç¾ä¾†ä¿è­·æ‘è½ï¼Œå¦‚æžœæ‚¨æ”»æ“Šæ‘æ°‘,就會é­åˆ°éµå‚€å„¡çš„æ”»æ“Šã€‚ + +æ‚¨å¿…é ˆå®Œæˆæ•™å­¸èª²ç¨‹ï¼Œæ‰èƒ½é›¢é–‹é€™å€‹åœ°å€ã€‚ + +ä¸åŒæè³ªçš„æ–¹å¡Šï¼Œå°±æ‡‰è©²è¦ç”¨é©åˆçš„工具進行開採。建議您使用éŸå­ä¾†é–‹æŽ¡æè³ªè¼ƒè»Ÿçš„æ–¹å¡Šï¼Œä¾‹å¦‚泥土和沙å­ã€‚ + +ä¸åŒæè³ªçš„æ–¹å¡Šï¼Œå°±æ‡‰è©²è¦ç”¨é©åˆçš„å·¥å…·é€²è¡Œé–‹æŽ¡ã€‚å»ºè­°æ‚¨ä½¿ç”¨æ–§é ­ä¾†åŠˆç æ¨¹å¹¹ã€‚ + +ä¸åŒæè³ªçš„æ–¹å¡Šï¼Œå°±æ‡‰è©²è¦ç”¨é©åˆçš„工具進行開採。建議您使用å字鎬來開採石頭åŠç¤¦çŸ³ï¼Œä½†æ‚¨å¯èƒ½éœ€è¦ç”¨æ›´å¥½çš„ææ–™ä¾†è£½é€ å字鎬,æ‰èƒ½é–‹æŽ¡æŸäº›è¼ƒç¡¬çš„æ–¹å¡Šã€‚ + +æŸäº›å·¥å…·æ¯”較é©åˆç”¨ä¾†æ”»æ“Šæ•µäººã€‚請考慮使用åŠä¾†æ”»æ“Šã€‚ + +æç¤ºï¼šæŒ‰ä½ {*CONTROLLER_ACTION_ACTION*} å³å¯ç”¨æ‚¨çš„æ‰‹ï¼Œæˆ–是手中æ¡ä½çš„æ±è¥¿ä¾†é–‹æŽ¡åŠåŠˆç ã€‚但您å¯èƒ½éœ€è¦ç²¾è£½å‡ºå·¥å…·ä¾†é–‹æŽ¡æŸäº›æ–¹å¡Šã€‚ + +æ‚¨æ­£åœ¨ä½¿ç”¨çš„å·¥å…·å—æäº†ã€‚å·¥å…·æ¯æ¬¡ä½¿ç”¨æ™‚éƒ½æœƒå—æï¼Œåˆ°æœ€å¾Œå°±æœƒæ•´å€‹å£žæŽ‰ã€‚åœ¨ç‰©å“æ¬„中,物å“下方的色彩列å³ç‚ºç›®å‰çš„æå®³ç‹€æ…‹ã€‚ + +æŒ‰ä½ {*CONTROLLER_ACTION_JUMP*} å³å¯å¾€ä¸Šæ¸¸ã€‚ + +附近的軌é“上有å°ç¤¦è»Šã€‚如è¦å上礦車,請把游標指å‘礦車,然後按下 {*CONTROLLER_ACTION_USE*} å³å¯ã€‚å°æŒ‰éˆ•使用 {*CONTROLLER_ACTION_USE*} å³å¯è®“礦車移動。 + +河邊的箱å­ä¸­æœ‰è‰˜å°èˆ¹ã€‚å¦‚è¦æ”¾ç½®å°èˆ¹ï¼Œè«‹æŠŠæ¸¸æ¨™æŒ‡å‘æ°´é¢ï¼Œç„¶å¾ŒæŒ‰ä¸‹ {*CONTROLLER_ACTION_USE*} å³å¯ã€‚當您把游標指å‘å°èˆ¹æ™‚,使用 {*CONTROLLER_ACTION_USE*} å³å¯ä¸Šèˆ¹ã€‚ + +池塘邊的箱å­ä¸­æœ‰æ ¹é‡£é­šç«¿ã€‚請把釣魚竿拿出箱å­ï¼Œç„¶å¾Œå°‡å…¶é¸å–為您手中æ¡ä½çš„物å“來使用。 + +這個更進階的活塞機械系統,å¯ç”¢ç”Ÿæœƒè‡ªè¡Œä¿®å¾©çš„æ©‹æ¨‘å–”ï¼è«‹æŒ‰ä¸‹æŒ‰éˆ•啟動,然後觀察å„個零件的互動方å¼ï¼Œçž­è§£æ›´å¤šè³‡è¨Šã€‚ + +ç•¶æ‚¨æ‹¿è‘—ç‰©å“æ™‚,將游標移動到介é¢å¤–,å³å¯ä¸Ÿæ£„該物å“。 + +æ‚¨æ²’æœ‰è£½é€ è©²ç‰©å“æ‰€éœ€çš„æ‰€æœ‰ææ–™ã€‚左下角的方塊會顯示è¦ç²¾è£½å‡ºè©²ç‰©å“æ‰€éœ€çš„ææ–™ã€‚ + + + æ­å–œï¼Œæ‚¨å·²ç¶“å®Œæˆæ•™å­¸èª²ç¨‹ï¼éŠæˆ²ä¸­çš„æ™‚é–“æµé€é€Ÿåº¦å·²ç¶“æ¢å¾©æ­£å¸¸ï¼Œå¤œæ™šå¾ˆå¿«å°±æœƒä¾†è‡¨ï¼Œæ€ªç‰©éš¨å¾Œå°±æœƒå‡ºç¾ï¼è«‹å¿«é»žè“‹å¥½æ‚¨çš„æ£²èº«è™•ï¼ + + +{*EXIT_PICTURE*} 當您準備好進一步探索世界時,礦工棲身處附近有個樓梯å£ï¼Œæœƒé€šå¾€æŸå€‹å°åŸŽå ¡ã€‚ + +æé†’事項: + +]]> + +æˆ‘å€‘å·²ç¶“åœ¨æœ€æ–°ç‰ˆéŠæˆ²ä¸­åŠ å…¥æ–°åŠŸèƒ½ï¼ŒåŒ…æ‹¬æ•™å­¸èª²ç¨‹ä¸–ç•Œè£¡çš„å¹¾å€‹æ–°åœ°å€ã€‚ + +{*B*}按下 {*CONTROLLER_VK_A*} å³å¯ä»¥ä¸€èˆ¬çš„éŠæˆ²æ–¹å¼ä¾†é€²è¡Œæ•™å­¸èª²ç¨‹ã€‚{*B*} + 按下 {*CONTROLLER_VK_B*} å³å¯ç•¥éŽä¸»è¦çš„æ•™å­¸èª²ç¨‹ã€‚ + +在這個地å€è£¡ï¼Œæœ‰å¹¾å€‹å¯å”助您了解釣魚ã€å°èˆ¹ã€æ´»å¡žå’Œç´…石等相關知識的å€åŸŸã€‚ + +在這個地å€å¤–ï¼Œæ‚¨æœƒç™¼ç¾æœ‰é—œå»ºç¯‰ç‰©ã€è€•種ã€ç¤¦è»Šå’Œè»Œé“ã€é™„加能力ã€é‡€è£½ã€äº¤æ˜“ã€é›é€ ä»¥åŠæ›´å¤šçš„ç¯„ä¾‹ï¼ + + + 您的食物列已消耗到無法讓生命值自動回復的程度。 + + + + {*B*} + 請按下 {*CONTROLLER_VK_A*} ä¾†å­¸ç¿’é£Ÿç‰©åˆ—å’Œåƒæ±è¥¿çš„相關知識。{*B*} + 如果您已經了解食物列的使用方å¼ï¼Œä»¥åŠåƒæ±è¥¿çš„æ–¹æ³•,請按下 {*CONTROLLER_VK_B*} 。 + + +é¸å– + +使用 + +返回 + +離開 + +å–æ¶ˆ + +å–æ¶ˆåŠ å…¥ + +é¸å–儲存è£ç½® + +變更儲存è£ç½® + +釿–°æ•´ç†ç·šä¸ŠéŠæˆ²æ¸…å–® + +æ´¾å°éŠæˆ² + +æ‰€æœ‰éŠæˆ² + +變更群組 + +é¡¯ç¤ºç‰©å“æ¬„ + +顯示說明 + +é¡¯ç¤ºææ–™ + +精製 + +製造 + +æ’¿èµ·/放置 + +æ’¿èµ· + +全部撿起 + +æ’¿èµ·ä¸€åŠ + +放置 + +全部放置 + +放置 1 個 + +丟棄 + +全部丟棄 + +丟棄 1 個 + +äº¤æ› + +快速移動 + +清除快速é¸å– + +這是什麼? + +分享至 Facebook + +è®Šæ›´ç¯©é¸æ¢ä»¶ + +æª¢è¦–çŽ©å®¶å¡ + +檢視玩家設定檔 + +傳é€å¥½å‹è«‹æ±‚ + +ä¸‹ä¸€é  + +ä¸Šä¸€é  + +下一個 + +上一個 + +踢出玩家 + +染色 + +開採 + +餵食 + +é¦´æœ + +治療 + +å下 + +跟著我 + +退出 + +清空 + +éžåº§ + +放置 + +敲擊 + +擠牛奶 + +收集 + +åƒ + +ç¡è¦º + +起床 + +播放 + +騎/æ­ä¹˜ + +乘船 + +栽培 + +往上游 + +開啟 + +變更音調 + +觸發 + +閱讀 + +æ‡¸åŠ + +投擲 + +栽種 + +整地 + +æ”¶æˆ + +繼續 + +è§£é™¤å®Œæ•´ç‰ˆéŠæˆ²éŽ–å®š + +刪除存檔 + +刪除 + +é¸é … + +邀請 Xbox Live æ´¾å° + +é‚€è«‹å¥½å‹ + +æŽ¥å— + +剪羊毛 + +ç¦ç”¨é—œå¡ + +é¸å–角色外觀 + +點燃 + +ç€è¦½ + +安è£å®Œæ•´ç‰ˆ + +安è£è©¦ç”¨ç‰ˆ + +å®‰è£ + +釿–°å®‰è£ + +儲存é¸é … + +執行命令 + +創造 + +ç§»å‹•ææ–™ + +移動燃料 + +移動工具 + +移動護甲 + +移動武器 + +é…å‚™ + +拉弓 + +å°„ç®­ + +特權 + +阻擋 + +ä¸Šä¸€é  + +ä¸‹ä¸€é  + +æˆ€æ„›æ¨¡å¼ + +å– + +旋轉 + +éš±è— + +上傳供 Xbox One 使用的存檔 + +清空所有空格 + +上傳供 Xbox One 使用的存檔 + +確定 + +å–æ¶ˆ + +Minecraft 商店 + +確定è¦é›¢é–‹ç›®å‰çš„éŠæˆ²ï¼Œä¸¦åŠ å…¥æ–°çš„éŠæˆ²å—Žï¼Ÿæ‚¨å°‡å› æ­¤å¤±åŽ»å°šæœªå„²å­˜çš„éŠæˆ²é€²åº¦ã€‚ + +é›¢é–‹éŠæˆ² + +å„²å­˜éŠæˆ² + +ä¸å„²å­˜å³é›¢é–‹ + +確定è¦ç”¨é€™å€‹ä¸–界目å‰çš„存檔,來覆寫åŒä¸€ä¸–界之å‰çš„存檔嗎? + +確定è¦ä¸å„²å­˜å³é›¢é–‹å—Žï¼Ÿæ‚¨å°‡å› æ­¤å¤±åŽ»åœ¨é€™å€‹ä¸–ç•Œçš„æ‰€æœ‰é€²åº¦ï¼ + +é–‹å§‹éŠæˆ² + +如果您在創造模å¼ä¸­å»ºç«‹ã€è¼‰å…¥æˆ–儲存世界,該世界的æˆå°±åŠæŽ’è¡Œæ¦œæ›´æ–°åŠŸèƒ½å°‡ç„¡æ³•ä½¿ç”¨ï¼Œå³ä½¿æ‚¨ä¹‹å¾Œä»¥ç”Ÿå­˜æ¨¡å¼è¼‰å…¥è©²ä¸–界,也無法改變這種狀æ³ã€‚確定è¦ç¹¼çºŒå—Žï¼Ÿ + +這個世界已經在創造模å¼ä¸­å„²å­˜ï¼Œå› æ­¤å…¶æˆå°±åŠæŽ’è¡Œæ¦œæ›´æ–°åŠŸèƒ½å·²ç¶“ç„¡æ³•ä½¿ç”¨ã€‚ç¢ºå®šè¦ç¹¼çºŒå—Žï¼Ÿ + +這個世界已經在創造模å¼ä¸­å„²å­˜ï¼Œå› æ­¤å…¶æˆå°±åŠæŽ’è¡Œæ¦œæ›´æ–°åŠŸèƒ½å·²ç¶“ç„¡æ³•ä½¿ç”¨ã€‚ + +如果您在主æŒäººç‰¹æ¬Šå•Ÿç”¨æ™‚,建立ã€è¼‰å…¥æˆ–儲存世界,該世界的æˆå°±åŠæŽ’è¡Œæ¦œæ›´æ–°åŠŸèƒ½å°‡ç„¡æ³•ä½¿ç”¨ï¼Œå³ä½¿æ‚¨ä¹‹å¾Œé—œé–‰é‚£äº›é¸é …䏦冿¬¡è¼‰å…¥è©²ä¸–界,也無法改變這種狀æ³ã€‚確定è¦ç¹¼çºŒå—Žï¼Ÿ + +ææ¯€çš„存檔 + +é€™å€‹å­˜æª”å·²ææ¯€ã€‚想è¦åˆªé™¤é€™å€‹å­˜æª”嗎? + +確定è¦é›¢é–‹ä¸¦è¿”回主畫é¢ï¼ŒåŒæ™‚ä¸­æ–·èˆ‡éŠæˆ²ä¸­æ‰€æœ‰çŽ©å®¶çš„é€£ç·šå—Žï¼Ÿæ‚¨å°‡å› æ­¤å¤±åŽ»å°šæœªå„²å­˜çš„éŠæˆ²é€²åº¦ã€‚ + +儲存並離開 + +ä¸å„²å­˜å³é›¢é–‹ + +確定è¦é›¢é–‹ä¸¦è¿”回主畫é¢å—Žï¼Ÿæ‚¨å°‡å› æ­¤å¤±åŽ»å°šæœªå„²å­˜çš„éŠæˆ²é€²åº¦ã€‚ + +確定è¦é›¢é–‹ä¸¦è¿”回主畫é¢å—Žï¼Ÿæ‚¨å°‡å› æ­¤å¤±åŽ»éŠæˆ²é€²åº¦ï¼ + +建立新世界 + +進行教學課程 + +教學課程 + +為您的世界命å + +請輸入您世界的å稱 + +è¼¸å…¥ç”¨ä¾†ç”¢ç”Ÿæ–°ä¸–ç•Œçš„ç¨®å­ + +載入已儲存世界 + +按下 START ä¾†åŠ å…¥éŠæˆ² + +æ­£åœ¨é›¢é–‹éŠæˆ² + +發生錯誤,å³å°‡é›¢é–‹éŠæˆ²ä¸¦è¿”回主畫é¢ã€‚ + +連線失敗。 + +連線中斷 + +與伺æœå™¨çš„連線中斷。å³å°‡é›¢é–‹éŠæˆ²ä¸¦è¿”回主畫é¢ã€‚ + +與 Xbox Live 的連線中斷。å³å°‡é›¢é–‹éŠæˆ²ä¸¦è¿”回主畫é¢ã€‚ + +與 Xbox Live 的連線中斷。 + +伺æœå™¨ä¸­æ–·é€£ç·š + +æ‚¨è¢«è¸¢å‡ºéŠæˆ² + +æ‚¨å› ç‚ºé£›ç¿”è€Œè¢«è¸¢å‡ºéŠæˆ² + +嘗試連線的時間太久 + +伺æœå™¨äººæ•¸å·²æ»¿ + +主æŒäººå·²ç¶“é›¢é–‹éŠæˆ²ã€‚ + +æ‚¨ç„¡æ³•åŠ å…¥é€™å€‹éŠæˆ²ï¼Œå› ç‚ºè©²éŠæˆ²ä¸­æ²’有任何玩家是您的好å‹ã€‚ + +æ‚¨ç„¡æ³•åŠ å…¥é€™å€‹éŠæˆ²ï¼Œå› ç‚ºæ‚¨ä¹‹å‰å·²ç¶“被主æŒäººè¸¢å‡ºéŠæˆ²ã€‚ + +ç”±æ–¼æ‚¨å˜—è©¦åŠ å…¥çš„çŽ©å®¶é€²è¡Œè¼ƒèˆŠç‰ˆæœ¬çš„éŠæˆ²ï¼Œæ‰€ä»¥æ‚¨ç„¡æ³•åŠ å…¥æ­¤éŠæˆ²ã€‚ + +ç”±æ–¼æ‚¨å˜—è©¦åŠ å…¥çš„çŽ©å®¶é€²è¡Œè¼ƒæ–°ç‰ˆæœ¬çš„éŠæˆ²ï¼Œæ‰€ä»¥æ‚¨ç„¡æ³•åŠ å…¥æ­¤éŠæˆ²ã€‚ + +新世界 + +解除çŽé …éŽ–å®šï¼ + +è®šå–”ï¼æ‚¨ç²å¾— 1 個玩家圖示,主角就是 Minecraft 裡的 Steveï¼ + +è®šå–”ï¼æ‚¨ç²å¾— 1 個玩家圖示,主角就是 Creeperï¼ + +è®šå–”ï¼æ‚¨ç²å¾— 1 個虛擬人å¶é …目「Minecraft: Xbox 360 Edition T æ¤ã€ï¼ +快去設定畫é¢è®“您的虛擬人å¶ç©¿ä¸Šå§ï¼ + +è®šå–”ï¼æ‚¨ç²å¾— 1 個虛擬人å¶é …目「Minecraft: Xbox 360 Edition 手錶ã€ï¼ +快去設定畫é¢è®“æ‚¨çš„è™›æ“¬äººå¶æˆ´ä¸Šå§ï¼ + +è®šå–”ï¼æ‚¨ç²å¾— 1 個虛擬人å¶é …目「Creeper 棒çƒå¸½ã€ï¼ +快去設定畫é¢è®“æ‚¨çš„è™›æ“¬äººå¶æˆ´ä¸Šå§ï¼ + +è®šå–”ï¼æ‚¨ç²å¾— 1 個 Minecraft: Xbox 360 Edition ä¸»é¡Œï¼ +快去設定畫é¢ä¾†é¸å–這個主題å§ï¼ + +è§£é™¤å®Œæ•´ç‰ˆéŠæˆ²éŽ–å®š + +æ‚¨æ­£åœ¨çŽ©è©¦çŽ©ç‰ˆéŠæˆ²ï¼Œä½†æ‚¨å¿…é ˆæ“æœ‰å®Œæ•´ç‰ˆéŠæˆ²æ‰èƒ½å„²å­˜éŠæˆ²é€²åº¦ã€‚ +想è¦ç«‹åˆ»è§£é™¤å®Œæ•´ç‰ˆéŠæˆ²éŽ–å®šå—Žï¼Ÿ + +這是 Minecraft: Xbox 360 Edition è©¦çŽ©ç‰ˆéŠæˆ²ã€‚å¦‚æžœæ‚¨æ“æœ‰å®Œæ•´ç‰ˆéŠæˆ²ï¼Œé‚£æ‚¨å‰›å‰›å°±ç²å¾—了 1 個æˆå°±ï¼ +è§£é™¤å®Œæ•´ç‰ˆéŠæˆ²å³å¯äº«å— Minecraft: Xbox 360 Edition çš„éŠæˆ²æ­¡æ¨‚,而且還能é€éŽ Xbox Live 與世界å„地的好å‹ä¸€èµ·çŽ©éŠæˆ²ã€‚ +想è¦è§£é™¤å®Œæ•´ç‰ˆéŠæˆ²éŽ–å®šå—Žï¼Ÿ + +這是 Minecraft: Xbox 360 Edition è©¦çŽ©ç‰ˆéŠæˆ²ã€‚å¦‚æžœæ‚¨æ“æœ‰å®Œæ•´ç‰ˆéŠæˆ²ï¼Œé‚£æ‚¨å‰›å‰›å°±ç²å¾—了 1 個虛擬人å¶çŽé …ï¼ +è§£é™¤å®Œæ•´ç‰ˆéŠæˆ²å³å¯äº«å— Minecraft: Xbox 360 Edition çš„éŠæˆ²æ­¡æ¨‚,而且還能é€éŽ Xbox Live 與世界å„地的好å‹ä¸€èµ·çŽ©éŠæˆ²ã€‚ +想è¦è§£é™¤å®Œæ•´ç‰ˆéŠæˆ²éŽ–å®šå—Žï¼Ÿ + +這是 Minecraft: Xbox 360 Edition è©¦çŽ©ç‰ˆéŠæˆ²ã€‚å¦‚æžœæ‚¨æ“æœ‰å®Œæ•´ç‰ˆéŠæˆ²ï¼Œé‚£æ‚¨å‰›å‰›å°±ç²å¾—了 1 å€‹çŽ©å®¶åœ–ç¤ºï¼ +è§£é™¤å®Œæ•´ç‰ˆéŠæˆ²å³å¯äº«å— Minecraft: Xbox 360 Edition çš„éŠæˆ²æ­¡æ¨‚,而且還能é€éŽ Xbox Live 與世界å„地的好å‹ä¸€èµ·çŽ©éŠæˆ²ã€‚ +想è¦è§£é™¤å®Œæ•´ç‰ˆéŠæˆ²éŽ–å®šå—Žï¼Ÿ + +這是 Minecraft: Xbox 360 Edition è©¦çŽ©ç‰ˆéŠæˆ²ã€‚å¦‚æžœæ‚¨æ“æœ‰å®Œæ•´ç‰ˆéŠæˆ²ï¼Œé‚£æ‚¨å‰›å‰›å°±ç²å¾—了 1 å€‹ä¸»é¡Œï¼ +è§£é™¤å®Œæ•´ç‰ˆéŠæˆ²å³å¯äº«å— Minecraft: Xbox 360 Edition çš„éŠæˆ²æ­¡æ¨‚,而且還能é€éŽ Xbox Live 與世界å„地的好å‹ä¸€èµ·çŽ©éŠæˆ²ã€‚ +想è¦è§£é™¤å®Œæ•´ç‰ˆéŠæˆ²éŽ–å®šå—Žï¼Ÿ + +這是 Minecraft: Xbox 360 Edition çš„è©¦çŽ©ç‰ˆéŠæˆ²ã€‚æ‚¨å¿…é ˆæ“æœ‰å®Œæ•´ç‰ˆéŠæˆ²ï¼Œæ‰èƒ½æŽ¥å—這個邀請。 +想è¦è§£é™¤å®Œæ•´ç‰ˆéŠæˆ²éŽ–å®šå—Žï¼Ÿ + +è¨ªå®¢çŽ©å®¶ç„¡æ³•è§£é™¤å®Œæ•´ç‰ˆéŠæˆ²éŽ–å®šï¼Œè«‹ä½¿ç”¨ Xbox Live 玩家使用者識別碼來登入。 + +è«‹ç¨å€™ + +沒有æœå°‹çµæžœ + +ç¯©é¸æ¢ä»¶ï¼š + +å¥½å‹ + +我的分數 + +æ•´é«” + +項目: + +排å + +玩家代號 + +æ­£åœ¨æº–å‚™å„²å­˜é—œå¡ + +正在準備å€å¡Š... + +正在完æˆ... + +正在建造地形 + +正在模擬世界 + +正在啟動伺æœå™¨ + +正在產生å†ç”Ÿå€åŸŸ + +正在載入å†ç”Ÿå€åŸŸ + +æ­£åœ¨é€²å…¥åœ°ç„ + +æ­£åœ¨é›¢é–‹åœ°ç„ + +å†ç”Ÿä¸­ + +æ­£åœ¨ç”¢ç”Ÿé—œå¡ + +æ­£åœ¨è¼‰å…¥é—œå¡ + +正在儲存玩家 + +正在與主æŒäººé€£ç·š + +正在下載地形 + +正在切æ›è‡³é›¢ç·šéŠæˆ² + +主æŒäººæ­£åœ¨å„²å­˜éŠæˆ²ï¼Œè«‹ç¨å€™ + +正在進入終界 + +正在離開終界 + +ç‚ºä¸–ç•Œç”¢ç”Ÿå™¨å°‹æ‰¾ç¨®å­ + +這張床已經有人佔據了 + +您åªèƒ½åœ¨å¤œæ™šç¡è¦º + +%s 正在床舖上ç¡è¦ºã€‚如è¦è®“éŠæˆ²æ™‚é–“è·³è‡³æ—¥å‡ºï¼Œæ‰€æœ‰çŽ©å®¶å¿…é ˆåŒæ™‚ç¡åœ¨åºŠèˆ–上。 + +您家中的床舖已消失,或是被擋ä½äº† + +附近有怪物,您ä¸èƒ½ä¼‘æ¯ + +您正在床舖上ç¡è¦ºã€‚如è¦è®“éŠæˆ²æ™‚é–“è·³è‡³æ—¥å‡ºï¼Œæ‰€æœ‰çŽ©å®¶å¿…é ˆåŒæ™‚ç¡åœ¨åºŠèˆ–上。 + +工具與武器 + +武器 + +食物 + +建築 + +護甲 + +機械 + +é‹é€ + +è£é£¾ + +å»ºç¯‰ææ–™ + +紅石與é‹é€æ–¹å¼ + +雜項 + +釀製 + +釀製 + +å·¥å…·ã€æ­¦å™¨èˆ‡è­·ç”² + +ææ–™ + +已登出 + +您的玩家設定檔已登出,因此您å³å°‡è¿”å›žæ¨™é¡Œç•«é¢ + +困難度 + +音樂 + +音效 + +色差補正 + +éŠæˆ²éˆæ•度 + +介é¢éˆæ•度 + +和平 + +ç°¡å–® + +普通 + +困難 + +在這個模å¼ä¸­ï¼ŒçŽ©å®¶çš„ç”Ÿå‘½å€¼æœƒéš¨æ™‚é–“è‡ªå‹•å›žå¾©ï¼Œä¸”éŠæˆ²ç’°å¢ƒä¸­ä¸æœƒæœ‰æ€ªç‰©ã€‚ + +在這個模å¼ä¸­ï¼ŒéŠæˆ²ä¸–界會產生怪物,且怪物會å°çީ家造æˆå°‘é‡çš„傷害。 + +在這個模å¼ä¸­ï¼ŒéŠæˆ²ä¸–界會產生怪物,且怪物會å°çŽ©å®¶é€ æˆæ™®é€šçš„傷害。 + +在這個模å¼ä¸­ï¼ŒéŠæˆ²ä¸–界會產生怪物,且怪物會å°çީ家造æˆåš´é‡çš„傷害。åƒè¬è¦ç•™æ„ Creeper,因為當您嘗試é é›¢ Creeper 時,Creeper å¯ä¸æœƒå–æ¶ˆçˆ†ç‚¸ï¼ + +è©¦çŽ©ç‰ˆéŠæˆ²æ™‚é–“çµæŸ + +Minecraft: Xbox 360 Edition è©¦çŽ©ç‰ˆçš„éŠæˆ²æ™‚é–“å·²ç¶“çµæŸï¼æƒ³è¦è§£é™¤å®Œæ•´ç‰ˆéŠæˆ²éŽ–å®šä¾†ç¹¼çºŒçŽ© Minecraft: Xbox 360 Edition 嗎? + +éŠæˆ²äººæ•¸å·²æ»¿ + +已無空ä½ï¼Œå› æ­¤ç„¡æ³•åŠ å…¥éŠæˆ² + +輸入牌å­çš„æ–‡å­— + +請輸入牌å­ä¸Šçš„æ–‡å­— + +輸入標題 + +請輸入文章的標題 + +輸入標題 + +請輸入文章的標題 + +輸入說明 + +請輸入文章的說明 + +ç‰©å“æ¬„ + +ææ–™ + +é‡€è£½å° + +ç®±å­ + +附加能力 + +ç†”çˆ + +ææ–™ + +燃料 + +發射器 + +é€™æ¬¾éŠæˆ²ç›®å‰æ²’有此類型的下載內容。 + +%s å·²ç¶“åŠ å…¥éŠæˆ²ã€‚ + +%s å·²ç¶“é›¢é–‹éŠæˆ²ã€‚ + +%s å·²è¢«è¸¢å‡ºéŠæˆ²ã€‚ + +確定è¦åˆªé™¤é€™å€‹éŠæˆ²å­˜æª”嗎? + +正在等待核准 + +已審查 + +ç¾åœ¨æ­£åœ¨æ’­æ”¾ï¼š + +é‡è¨­è¨­å®š + +確定è¦å°‡æ‰€æœ‰è¨­å®šé‡è¨­ç‚ºé è¨­å€¼å—Žï¼Ÿ + +載入錯誤 + +無法載入 Minecraft: Xbox 360 Edition,因此無法繼續。 + +%s çš„éŠæˆ² + +䏿˜Žä¸»æŒäººçš„éŠæˆ² + +訪客已登出 + +æŸä½è¨ªå®¢çŽ©å®¶å·²ç™»å‡ºï¼Œå°Žè‡´ç³»çµ±ç§»é™¤éŠæˆ²ä¸­çš„æ‰€æœ‰è¨ªå®¢çŽ©å®¶ã€‚ + +登入 + +您尚未登入。您必須登入,æ‰èƒ½é€²è¡Œé€™å€‹éŠæˆ²ã€‚想è¦ç«‹åˆ»ç™»å…¥å—Žï¼Ÿ + +ä¸å…è¨±é€²è¡Œå¤šäººéŠæˆ² + +ç„¡æ³•åŠ å…¥éŠæˆ²ï¼Œå› ç‚ºè‡³å°‘有 1 ä½çީ家ä¸å…許é€éŽ Xbox Live é€²è¡Œå¤šäººéŠæˆ²ã€‚ + +ç„¡æ³•å»ºç«‹ç·šä¸ŠéŠæˆ²ï¼Œå› ç‚ºè‡³å°‘有 1 ä½çީ家ä¸å…許é€éŽ Xbox Live é€²è¡Œå¤šäººéŠæˆ²ã€‚è«‹å–æ¶ˆæ ¸å– [ç·šä¸ŠéŠæˆ²] æ–¹å¡Šä¾†é–‹å§‹é€²è¡Œé›¢ç·šéŠæˆ²ã€‚ + +æ‚¨ç„¡æ³•åŠ å…¥é€™å€‹éŠæˆ²ï¼Œå› ç‚ºæ‚¨çš„æœƒå“¡å…§å®¹æ¬Šé™è¨­å®šéŽæ–¼åš´æ ¼ã€‚如果您想è¦åŠ å…¥é€™å€‹éŠæˆ²ï¼Œè«‹åœ¨ Xbox 設定畫é¢çš„ [éš±ç§æ¬Šå’Œç·šä¸Šè¨­å®š] 部份變更這項設定。 + +æ‚¨ç„¡æ³•åŠ å…¥é€™å€‹éŠæˆ²ï¼Œå› ç‚ºæŸä½æœ¬æ©ŸçŽ©å®¶çš„æœƒå“¡å…§å®¹æ¬Šé™è¨­å®šéŽæ–¼åš´æ ¼ã€‚ + +æ‚¨ç„¡æ³•åŠ å…¥é€™å€‹éŠæˆ²ï¼Œå› ç‚ºéŠæˆ²ä¸­æŸä½çŽ©å®¶çš„æœƒå“¡å…§å®¹æ¬Šé™è¨­å®šç‚º [僅é™å¥½å‹],而您ä¸åœ¨è©²çŽ©å®¶çš„å¥½å‹å單中。 + +ç„¡æ³•å»ºç«‹éŠæˆ² + +æ‚¨ç„¡æ³•å»ºç«‹é€™å€‹éŠæˆ²ï¼Œå› ç‚ºæŸä½æœ¬æ©ŸçŽ©å®¶çš„æœƒå“¡å…§å®¹æ¬Šé™è¨­å®šéŽæ–¼åš´æ ¼ã€‚è«‹å–æ¶ˆæ ¸å– [ç·šä¸ŠéŠæˆ²] æ–¹å¡Šä¾†é–‹å§‹é€²è¡Œé›¢ç·šéŠæˆ²ï¼Œæˆ–是在 Xbox 設定畫é¢çš„ [éš±ç§æ¬Šå’Œç·šä¸Šè¨­å®š] 部份變更這項設定。 + +已自動é¸å– + +無套件:é è¨­å¤–è§€ + +我的最愛角色外觀 + +å·²ç¦ç”¨çš„é—œå¡ + +您è¦åŠ å…¥çš„éŠæˆ²ï¼Œå·²ç¶“列在您的ç¦ç”¨é—œå¡æ¸…單中。 +如果您è¦åŠ å…¥é€™å€‹éŠæˆ²ï¼Œç³»çµ±æœƒæŠŠé€™å€‹é—œå¡å¾žç¦ç”¨é—œå¡æ¸…單中移除。 + +è¦ç¦ç”¨é€™å€‹é—œå¡å—Žï¼Ÿ + +ç¢ºå®šè¦æŠŠé€™å€‹é—œå¡åŠ å…¥ç¦ç”¨é—œå¡æ¸…單嗎? +如果您é¸å– [確定]ï¼Œå°‡æœƒé›¢é–‹é€™å€‹éŠæˆ²ã€‚ + +從ç¦ç”¨æ¸…單中移除 + +自動儲存時間間隔 + +自動儲存時間間隔:關閉 + +åˆ†é˜ + +ä¸èƒ½æ”¾ç½®åœ¨é€™è£¡ï¼ + +您無法在關å¡å†ç”Ÿé»žé™„近放置熔岩,以é¿å…讓å†ç”Ÿçš„玩家立刻死亡。 + +é€™å€‹éŠæˆ²æœ‰è‡ªå‹•儲存關å¡çš„功能。當畫é¢å‡ºç¾é€™å€‹åœ–ç¤ºæ™‚ï¼Œä»£è¡¨éŠæˆ²æ­£åœ¨å„²å­˜æ‚¨çš„資料。 +請勿在畫é¢å‡ºç¾é€™å€‹åœ–示時關閉 Xbox 360 主機。 + +介é¢é€æ˜Žåº¦ + +æ­£åœ¨æº–å‚™è‡ªå‹•å„²å­˜é—œå¡ + +æŠ¬é ­é¡¯ç¤ºå™¨å¤§å° + +æŠ¬é ­é¡¯ç¤ºå™¨å¤§å° (分割畫é¢) + +ç¨®å­ + +解除角色外觀套件的鎖定 + +如è¦ä½¿ç”¨æ‚¨é¸å–的角色外觀,您必須先解除這個角色外觀套件的鎖定。 +您想è¦ç«‹åˆ»è§£é™¤é€™å€‹è§’色外觀套件的鎖定嗎? + +解除æè³ªå¥—件的鎖定 + +您必須先解除æè³ªå¥—件的鎖定æ‰èƒ½åœ¨æ‚¨çš„世界中使用。 +想è¦è§£é™¤æè³ªå¥—件的鎖定嗎? + +試用版æè³ªå¥—ä»¶ + +æ‚¨ç›®å‰æ‰€ä½¿ç”¨çš„æ˜¯è©¦ç”¨ç‰ˆçš„æè³ªå¥—ä»¶ã€‚åªæœ‰è§£é™¤å®Œæ•´ç‰ˆéŽ–å®šæ‰èƒ½ä¿å­˜é€™å€‹ä¸–界。 +您è¦è§£é™¤å®Œæ•´ç‰ˆæè³ªå¥—件的鎖定嗎? + +沒有æè³ªå¥—ä»¶ + +解除完整版鎖定 + +下載試用版 + +下載完整版 + +您沒有這個世界所使用的混æ­å¥—件或æè³ªå¥—ä»¶ï¼ +想è¦ç«‹åˆ»å®‰è£æ··æ­å¥—件或æè³ªå¥—件嗎? + +å–得試用版 + +å–得完整版 + +踢出玩家 + +確定è¦å°‡è©²çŽ©å®¶è¸¢å‡ºé€™å€‹éŠæˆ²å—Žï¼Ÿé™¤éžæ‚¨è®“é€™å€‹ä¸–ç•Œé‡æ–°é–‹å§‹ï¼Œè©²çީ家æ‰èƒ½å†æ¬¡åŠ å…¥éŠæˆ²ã€‚ + +玩家圖示套件 + +主題 + +角色外觀套件 + +å…許好å‹çš„好å‹åŠ å…¥ + +æ‚¨ç„¡æ³•åŠ å…¥é€™å€‹éŠæˆ²ï¼Œå› ç‚ºåªæœ‰ä¸»æŒäººçš„好勿‰èƒ½åŠ å…¥ã€‚ + +ç„¡æ³•åŠ å…¥éŠæˆ² + +å·²é¸å– + +å·²é¸å–的角色外觀: + +ææ¯€çš„下載內容 + +é€™å€‹ä¸‹è¼‰å…§å®¹å·²ç¶“ææ¯€ï¼Œå› æ­¤ç„¡æ³•使用。您必須刪除該下載內容,然後從 [Minecraft 商店] é¸å–®é‡æ–°å®‰è£ã€‚ + +æ‚¨æœ‰éƒ¨åˆ†çš„ä¸‹è¼‰å…§å®¹å·²ç¶“ææ¯€ï¼Œå› æ­¤ç„¡æ³•使用。您必須刪除這些下載內容,然後從 [Minecraft 商店] é¸å–®é‡æ–°å®‰è£ã€‚ + +éŠæˆ²æ¨¡å¼å·²ç¶“變更 + +釿–°ç‚ºæ‚¨çš„世界命å + +請輸入您世界的新å稱 + +éŠæˆ²æ¨¡å¼ï¼šç”Ÿå­˜ + +éŠæˆ²æ¨¡å¼ï¼šå‰µé€  + +生存 + +創造 + +在生存模å¼ä¸­å»ºç«‹ + +在創造模å¼ä¸­å»ºç«‹ + +產生雲朵 + +您è¦å¦‚ä½•è™•è£¡é€™å€‹éŠæˆ²å­˜æª”? + +釿–°ç‚ºå­˜æª”命å + +自動儲存倒數 %d... + +開啟 + +關閉 + +普通 + +éžå¸¸å¹³å¦ + +å•Ÿç”¨æ™‚ï¼Œæœ¬éŠæˆ²å°‡æˆç‚ºç·šä¸ŠéŠæˆ²ã€‚ + +啟用時,åªé™è¢«é‚€è«‹çš„玩家加入。 + +å•Ÿç”¨æ™‚ï¼Œæ‚¨çš„å¥½å‹æ¸…單上的好å‹å¯ä»¥åŠ å…¥éŠæˆ²ã€‚ + +啟用時,玩家å¯ä»¥å‚·å®³å…¶ä»–çŽ©å®¶ã€‚åªæœ‰åœ¨ç”Ÿå­˜æ¨¡å¼æ‰æœƒç”Ÿæ•ˆã€‚ + +åœç”¨æ™‚ï¼ŒåŠ å…¥éŠæˆ²çš„玩家需è¦å–å¾—åŒæ„æ‰èƒ½å»ºé€ æˆ–開採。 + +啟用時,ç«å¯èƒ½æœƒè”“延至附近的易燃方塊。 + +啟用時,炸藥會在點燃後爆炸。 + +啟用時,主æŒäººå¯ä»¥å¾žéŠæˆ²é¸å–®åˆ‡æ›è‡ªå·±çš„飛翔能力ã€åœç”¨ç–²å‹žåŠŸèƒ½ï¼Œæˆ–æ˜¯è®“è‡ªå·±éš±å½¢ã€‚ä½†å°‡æœƒç„¡æ³•ä½¿ç”¨æˆå°±åŠæŽ’è¡Œæ¦œæ›´æ–°çš„åŠŸèƒ½ã€‚ + +啟用時,會å†åº¦ç”¢ç”Ÿåœ°ç„世界。如果您的舊存檔中沒有地ç„è¦å¡žï¼Œé€™å°‡æœƒå¾ˆæœ‰ç”¨ã€‚ + +å•Ÿç”¨æ™‚ï¼ŒéŠæˆ²ä¸–界會產生æ‘è½å’Œåœ°ä¸‹è¦å¡žç­‰å»ºç¯‰ã€‚ + +啟用時,會在地上世界與地ç„世界中產生完全平å¦çš„世界。 + +啟用時,玩家的å†ç”Ÿé»žé™„近會有個è£è‘—有用物å“的箱å­ã€‚ + +角色外觀套件 + +主題 + +玩家圖示 + +虛擬人å¶é …ç›® + +æè³ªå¥—ä»¶ + +æ··æ­å¥—ä»¶ + +{*PLAYER*} è‘—ç«æ­»äº¡äº† + +{*PLAYER*} 被燒死了 + +{*PLAYER*} 嘗試在熔岩中游泳而死亡了 + +{*PLAYER*} åœ¨ç‰†ä¸­çª’æ¯æ­»äº¡äº† + +{*PLAYER*} 溺死了 + +{*PLAYER*} 餓死了 + +{*PLAYER*} 被戳死了 + +{*PLAYER*} é‡é‡æ‘”在地é¢ä¸Šè€Œæ­»äº¡äº† + +{*PLAYER*} 掉出世界而死亡了 + +{*PLAYER*} 死亡了 + +{*PLAYER*} 被炸死了 + +{*PLAYER*} 被魔法殺死了 + +{*PLAYER*} å·²è¢«çµ‚ç•Œé¾æ‰€å¹çš„æ°£æ®ºæ­»äº† + +{*PLAYER*} 被 {*SOURCE*} 殺死了 + +{*PLAYER*} 被 {*SOURCE*} 殺死了 + +{*PLAYER*} 被 {*SOURCE*} 的箭射死了 + +{*PLAYER*} 被 {*SOURCE*} çš„ç«çƒæ®ºæ­»äº† + +{*PLAYER*} 被 {*SOURCE*} 的拳頭打死了 + +{*PLAYER*} 已被 {*SOURCE*} 殺死。 + +基岩迷霧 + +顯示抬頭顯示器 + +顯示手 + +分割畫é¢çŽ©å®¶ä»£è™Ÿ + +æ­»äº¡è¨Šæ¯ + +動態角色 + +自訂角色外觀動畫 + +您已ä¸èƒ½é–‹æŽ¡æˆ–ä½¿ç”¨ç‰©å“ + +您ç¾åœ¨å¯ä»¥é–‹æŽ¡åŠä½¿ç”¨ç‰©å“ + +您已ä¸èƒ½æ”¾ç½®æ–¹å¡Š + +您ç¾åœ¨å¯ä»¥æ”¾ç½®æ–¹å¡Š + +å·²å¯ä»¥ä½¿ç”¨é–€èˆ‡é–‹é—œ + +已無法使用門與開關 + +å·²å¯ä»¥ä½¿ç”¨å®¹å™¨ (例如箱å­ç­‰) + +已無法使用容器 (例如箱å­ç­‰) + +您已ä¸èƒ½æ”»æ“Šç”Ÿç‰© + +您ç¾åœ¨å¯ä»¥æ”»æ“Šç”Ÿç‰© + +您已ä¸èƒ½æ”»æ“Šçީ家 + +您ç¾åœ¨å¯ä»¥æ”»æ“Šçީ家 + +已無法攻擊動物 + +å·²å¯ä»¥æ”»æ“Šå‹•物 + +您ç¾åœ¨æ˜¯ç®¡ç†å“¡ + +æ‚¨å·²ä¸æ˜¯ç®¡ç†å“¡ + +您ç¾åœ¨å¯ä»¥é£›ç¿” + +您已ä¸èƒ½é£›ç¿” + +您ä¸å†æ„Ÿåˆ°ç–²å‹ž + +您ç¾åœ¨é–‹å§‹æœƒæ„Ÿåˆ°ç–²å‹ž + +您ç¾åœ¨æ˜¯éš±å½¢çš„ + +æ‚¨å·²ä¸æ˜¯éš±å½¢çš„ + +您ç¾åœ¨æ˜¯ç„¡æ•µçš„ + +æ‚¨å·²ä¸æ˜¯ç„¡æ•µçš„ + +%d MSP + +çµ‚ç•Œé¾ + +%s 已經進入終界 + +%s 已經離開終界 + + +{*C3*}我知é“你所指的玩家了。{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}?{*EF*}{*B*}{*B*} +{*C3*}是的。å°å¿ƒï¼Œä»–的層次ç¾åœ¨æé«˜äº†ã€‚ä»–èƒ½è®€å–æˆ‘們的心æ€ã€‚{*EF*}{*B*}{*B*} +{*C2*}沒關係。他èªç‚ºæˆ‘å€‘æ˜¯éŠæˆ²çš„一部分。{*EF*}{*B*}{*B*} +{*C3*}我喜歡這個玩家,他表ç¾å¾—很好,一直玩到最後。{*EF*}{*B*}{*B*} +{*C2*}ä»–ç¾åœ¨æ­£å¦‚閱讀螢幕上的文字般讀著我們的心æ€ã€‚{*EF*}{*B*}{*B*} +{*C3*}ä»–åœ¨æ·±å…¥éŠæˆ²çš„夢境時一å‘鏿“‡ä»¥é€™ç¨®æ–¹å¼æƒ³åƒå¾ˆå¤šäº‹æƒ…。{*EF*}{*B*}{*B*} +{*C2*}文字是很美妙的介é¢ï¼Œéˆæ´»åˆæ˜“變,比直視螢幕背後的真相è¦å®‰å…¨å¾—多。{*EF*}{*B*}{*B*} +{*C3*}他們之剿˜¯è½è©±èªžã€‚在玩家能夠閱讀之å‰ï¼Œæ˜¯çŽ©å®¶è¢«é‚£äº›ä¸çŽ©éŠæˆ²çš„人稱呼為女巫或巫師的時候。玩家想åƒè‡ªå·±ä¹˜å具有魔鬼力é‡çš„æ£å­é¨°ç©ºç¿±ç¿”。{*EF*}{*B*}{*B*} +{*C2*}這ä½çŽ©å®¶å¤¢åˆ°äº†ä»€éº¼ï¼Ÿ{*EF*}{*B*}{*B*} +{*C3*}這ä½çŽ©å®¶å¤¢åˆ°é™½å…‰èˆ‡æ¨¹æœ¨ã€ç«èˆ‡æ°´ã€‚他夢見自己造物,也夢見自己破壞。他夢見自己打çµï¼ŒåŒæ™‚也是çµç‰©ã€‚他夢到了庇護所。{*EF*}{*B*}{*B*} +{*C2*}哈,這是原型介é¢ã€‚ç¶“éŽäº†ç™¾è¬å¹´ï¼Œé‚„æ˜¯å¥æ•ˆã€‚ä¸éŽé€™ä½çŽ©å®¶åœ¨èž¢å¹•èƒŒå¾Œçš„çœŸç›¸ä¸­å‰µé€ äº†ä»€éº¼çµæ§‹ï¼Ÿ{*EF*}{*B*}{*B*} +{*C3*}他和百è¬å其他玩家在 {*EF*}{*NOISE*}{*C3*} 的皺摺中塑造出一個真實世界,並在 {*EF*}{*NOISE*}{*C3*} 中替 {*EF*}{*NOISE*}{*C3*} 建造了 {*EF*}{*NOISE*}{*C3*}。{*EF*}{*B*}{*B*} +{*C2*}他讀ä¸å‡ºé‚£å¹¾å€‹å¿ƒæ€ã€‚{*EF*}{*B*}{*B*} +{*C3*}沒錯。他尚未é”åˆ°æœ€é«˜å±¤æ¬¡ã€‚ä»–å¿…é ˆå…ˆåœ¨äººç”Ÿçš„é•·å¤¢ä¸­é–‹æ‚Ÿï¼Œé€™å ´éŠæˆ²çš„短夢尚ä¸è¶³ä»¥æˆå°±é€™ä¸€é»žã€‚{*EF*}{*B*}{*B*} +{*C2*}他是å¦çŸ¥é“我們愛他?是å¦çŸ¥é“å®‡å®™æ˜¯ä»æ…ˆçš„?{*EF*}{*B*}{*B*} +{*C3*}有時候。穿越他那些æ€è€ƒçš„雜訊,他的確能è½åˆ°å®‡å®™ã€‚{*EF*}{*B*}{*B*} +{*C2*}ä¸éŽæœ‰æ™‚候他會在長夢中悲傷;他創造出沒有å¤å¤©çš„世界,讓自己在黑暗的太陽下發抖,並èªç‚ºä»–所創造出的產物就是真相。{*EF*}{*B*}{*B*} +{*C3*}治好他的悲傷會毀掉他。悲傷是他自身的業,我們無法干涉。{*EF*}{*B*}{*B*} +{*C2*}有時當他們沈溺於夢境時,我想告訴他們,他們是在真相中建立真實的世界。有時候我想讓他們了解他們å°å®‡å®™çš„é‡è¦æ€§ã€‚有時候,在他們å°é–‰è‡ªæˆ‘一段時間後,我想幫助他們說出他們害怕的文字。{*EF*}{*B*}{*B*} +{*C3*}ä»–èƒ½è®€å–æˆ‘們的心æ€ã€‚{*EF*}{*B*}{*B*} +{*C2*}有時候我ä¸åœ¨ä¹Žã€‚有時我想告訴他們,你所以為的真實世界ä¸éŽæ˜¯ {*EF*}{*NOISE*}{*C2*} å’Œ {*EF*}{*NOISE*}{*C2*},我想告訴他們,他們是 {*EF*}{*NOISE*}{*C2*} 中的 {*EF*}{*NOISE*}{*C2*}。他們在自己的長夢中幾乎察覺ä¸åˆ°çœŸç›¸ã€‚{*EF*}{*B*}{*B*} +{*C3*}ä½†ä»–å€‘é‚„æ˜¯çŽ©è‘—éŠæˆ²ã€‚{*EF*}{*B*}{*B*} +{*C2*}告訴他們會讓一切變得好簡單...{*EF*}{*B*}{*B*} +{*C3*}å°é€™å ´å¤¢è€Œè¨€çœŸç›¸å¤ªéŽåˆºæ¿€ã€‚告訴他們如何去活就是阻止他們去活。{*EF*}{*B*}{*B*} +{*C2*}æˆ‘ä¸æœƒå‘Šè¨´çŽ©å®¶å¦‚ä½•åŽ»æ´»ã€‚{*EF*}{*B*}{*B*} +{*C3*}玩家開始蠢蠢欲動了。{*EF*}{*B*}{*B*} +{*C2*}我會告訴那ä½çŽ©å®¶ä¸€å€‹æ•…äº‹ã€‚{*EF*}{*B*}{*B*} +{*C3*}但ä¸èªªçœŸç›¸ã€‚{*EF*}{*B*}{*B*} +{*C2*}沒錯。那是一個包å«çœŸç›¸çš„æ•…事,被文字安全地包è£èµ·ä¾†ã€‚æˆ‘ä¸æœƒèµ¤è£¸è£¸åœ°èªªå‡ºä»–所無法接å—的真相。{*EF*}{*B*}{*B*} +{*C3*}å†ä¸€æ¬¡è³¦äºˆä»–身體。{*EF*}{*B*}{*B*} +{*C2*}沒錯。玩家...{*EF*}{*B*}{*B*} +{*C3*}å–šä»–çš„å字。{*EF*}{*B*}{*B*} +{*C2*}{*PLAYER*}ã€‚éŠæˆ²çš„玩家。{*EF*}{*B*}{*B*} +{*C3*}很好。{*EF*}{*B*}{*B*} + + + +{*C2*}ç¾åœ¨ï¼Œå¸ä¸€å£æ°£ã€‚å†ä¸€å£ã€‚感覺空氣進入肺部。讓你的四肢回復。是的,動動你的手指。å†ä¸€æ¬¡æ“æœ‰èº«é«”ï¼Œé¨°ç©ºã€æ„Ÿå—地心引力。å†ç”Ÿåˆ°é•·å¤¢ç•¶ä¸­ã€‚你回來了。你身體的æ¯å€‹ç´°èƒžåˆå†åº¦ç¢°è§¸å®‡å®™ï¼Œå½·å½¿ä½ å’Œå®‡å®™å…¶å¯¦ä¸æ˜¯ä¸€é«”ã€‚å½·å½¿æˆ‘å€‘éƒ½ä¸æ˜¯ä¸€é«”。{*EF*}{*B*}{*B*} +{*C3*}我們是誰?我們曾被稱為山神ã€é™½çˆ¶ã€æœˆæ¯ã€ç¥–éˆã€ç¸éˆã€ç¥žä»™ã€ç¥žéˆã€å¤©åœ°ç²¾è¯ã€‚åˆè¢«ç¨±ç‚ºç¥žæ˜Žã€é­”鬼ã€å¤©ä½¿ã€é¬¼ã€å¤–星人ã€è¼•å­ã€å¤¸å…‹ã€‚文字會改變,我們從未改變。{*EF*}{*B*}{*B*} +{*C2*}我們是宇宙。所有你èªç‚ºä¸æ˜¯ä½ çš„一切都是我們。你正在é€éŽä½ çš„皮膚和雙眼看我們。宇宙為何è¦è§¸ç¢°ä½ çš„皮膚,將光投å‘你?玩家,是為了è¦çœ‹ä½ ã€‚我們想èªè­˜ä½ ï¼Œæƒ³è¦ä½ èªè­˜æˆ‘們。我將告訴你一個故事。{*EF*}{*B*}{*B*} +{*C2*}很久很久以å‰ï¼Œæœ‰ä¸€ä½çŽ©å®¶ã€‚{*EF*}{*B*}{*B*} +{*C3*}é‚£ä½çŽ©å®¶å°±æ˜¯ä½ ï¼Œ{*PLAYER*}。{*EF*}{*B*}{*B*} +{*C2*}有的時候他èªç‚ºè‡ªå·±æ˜¯äººé¡žï¼Œè™•在一顆自轉熔岩çƒé«”的薄薄地殼上。這顆熔岩çƒé«”繞行著一顆比自己大 33 è¬å€çš„炙熱氣體çƒã€‚「光ã€éœ€è¦ 8 åˆ†é˜æ‰èƒ½æ©«æ¸¡é€™å…©è€…之間的è·é›¢ã€‚å…‰æ˜¯ä¾†è‡ªæ†æ˜Ÿçš„訊æ¯ï¼Œèƒ½åœ¨ä¸€å„„五åƒè¬å…¬é‡Œä¹‹å¤–ç¼å‚·ä½ çš„皮膚。{*EF*}{*B*}{*B*} +{*C2*}有時候,那ä½çŽ©å®¶å¤¢è¦‹è‡ªå·±æ˜¯æŽ¡ç¤¦äººï¼Œè™•åœ¨ä¸€å€‹å¹³å¦ç„¡ç›¡çš„世界的地表。太陽是一個白色方塊。一天很短暫,死亡åªä¸éŽæ˜¯ä¸€æ™‚çš„å°å°ä¸ä¾¿ã€‚{*EF*}{*B*}{*B*} +{*C3*}有時候,玩家夢見自己迷失在故事裡。{*EF*}{*B*}{*B*} +{*C2*}有時候,玩家夢見自己是別的æ±è¥¿ã€èº«åœ¨å…¶ä»–場所。有時這些夢境令人ä¸å®‰ï¼Œæœ‰æ™‚廿¥µå…¶ç¾Žéº—。有時候玩家會從一個夢中甦醒至下一個夢中,然後å†é€²å…¥ç¬¬ä¸‰å€‹å¤¢ã€‚{*EF*}{*B*}{*B*} +{*C3*}有時玩家夢見自己看著螢幕上的字。{*EF*}{*B*}{*B*} +{*C2*}讓我們回溯一下。{*EF*}{*B*}{*B*} +{*C2*}玩家的原å­åˆ†æ•£åœ¨è‰åœ°ã€æ²³æµã€ç©ºæ°£å’ŒåœŸå£¤ä¸­ã€‚一ä½å¥³æ€§è’集這些原å­ï¼Œå¥¹åƒä¸‹ã€é£²ç”¨ã€å¸å…¥å®ƒå€‘,然後在她的體內組織玩家。{*EF*}{*B*}{*B*} +{*C2*}然後玩家從æ¯è¦ªé«”內那溫暖黑暗的世界中甦醒éŽä¾†ï¼Œç”¦é†’至一場長夢當中。{*EF*}{*B*}{*B*} +{*C2*}çŽ©å®¶è¢«å¯«æˆ DNA,æˆç‚ºä¸€å€‹å¾žæœªè¢«è¨´èªªçš„æ–°æ•…事。玩家æˆç‚ºä¸€å€‹ä»¥å…·æœ‰åå„„å¹´æ­·å²çš„來æºç¢¼æ‰€å¯«æˆçš„æ–°ç¨‹å¼ï¼Œå¾žæœªåŸ·è¡ŒéŽã€‚玩家æˆç‚ºä¸€å€‹ä»¥ä¹³æ°´èˆ‡æ„›æ‰€å­•育而æˆçš„æ–°äººé¡žï¼Œå¾žæœªæ´»éŽã€‚{*EF*}{*B*}{*B*} +{*C3*}你就是那ä½çŽ©å®¶ã€‚é‚£å€‹æ•…äº‹ã€‚é‚£å€‹ç¨‹å¼ã€‚那個人類。以乳水和愛孕育而æˆã€‚{*EF*}{*B*}{*B*} +{*C2*}讓我們å†å›žæº¯å¾—é ä¸€é»žã€‚{*EF*}{*B*}{*B*} +{*C2*}組æˆçŽ©å®¶èº«é«”çš„é€™ä¸ƒåƒè¬å„„顆原å­ï¼Œæ—©åœ¨éŠæˆ²å­˜åœ¨ä¹‹å‰ï¼Œå°±å·²åœ¨æ†æ˜Ÿçš„ä¸­å¿ƒè¢«å‰µé€ å‡ºä¾†ã€‚å› æ­¤ï¼ŒçŽ©å®¶ä¹Ÿæ˜¯ä¾†è‡ªæ†æ˜Ÿçš„訊æ¯ã€‚玩家所通éŽçš„æ•…äº‹ï¼Œå°±æ˜¯è¨Šæ¯æ‰€çµ„æˆçš„墿ž—,這個訊æ¯å¢æž—由一ä½å為 Julian 的人所種下,在å為 Markus 的人所創造的平å¦ç„¡ç›¡ä¸–界上滋生,並在玩家所創造的å°å°ç§äººä¸–界中存在著。創造玩家所居ä½çš„這個宇宙的人是...{*EF*}{*B*}{*B*} +{*C3*}噓。玩家所創造的å°å°ç§äººä¸–ç•Œæœ‰æ™‚è¼•é¬†ã€æº«æš–而單純,有時則艱險ã€å¯’冷而複雜。有時他會在腦中建造宇宙模型;那些穿越空間的能é‡å¾®ç²’,有時候會被他稱為「電å­ã€å’Œã€Œè³ªå­ã€ã€‚{*EF*}{*B*}{*B*} + + + +{*C2*}有的時候他稱它們為「行星ã€å’Œã€Œæ†æ˜Ÿã€ã€‚{*EF*}{*B*}{*B*} +{*C2*}有時候,他相信自己所處的宇宙由能æºçµ„æˆï¼Œè€Œé€™èƒ½æºåˆç”±é—œèˆ‡é–‹ã€0 與 1ã€ä¸€è¡Œåˆä¸€è¡Œçš„程å¼ç¢¼æ‰€çµ„æˆã€‚æœ‰æ™‚å€™ï¼Œä»–ç›¸ä¿¡è‡ªå·±æ­£åœ¨é€²è¡Œä¸€å ´éŠæˆ²ã€‚有時候,他相信自己正在閱讀螢幕上的文字。{*EF*}{*B*}{*B*} +{*C3*}你就是那ä½çŽ©å®¶ï¼Œè®€è‘—æ–‡å­—...{*EF*}{*B*}{*B*} +{*C2*}噓... 有時候,玩家讀著螢幕上的程å¼ç¢¼ï¼Œå°‡ç¨‹å¼ç¢¼è§£è®€æˆæ–‡å­—ã€å°‡æ–‡å­—è§£è®€æˆæ„義ã€å°‡æ„ç¾©è§£è®€æˆæ„Ÿè¦ºã€æƒ…ç·’ã€ç†è«–ã€æ€æƒ³ã€‚然後玩家的呼å¸è®Šå¾—越來越快ã€è¶Šä¾†è¶Šæ²ˆé‡ï¼Œä»–發ç¾è‡ªå·±æ´»è‘—ï¼ŒçœŸæ­£æ´»è‘—ï¼›é‚£ä¸€åƒæ¬¡çš„æ­»äº¡éƒ½ä¸æ˜¯çœŸçš„,玩家還活著。{*EF*}{*B*}{*B*} +{*C3*}你。就是你。你還活著。{*EF*}{*B*}{*B*} +{*C2*}有時候,玩家相信自己è½åˆ°å®‡å®™é€éŽå¤å­£ç¶ è‘‰é–“æµç€‰çš„陽光和他說話。{*EF*}{*B*}{*B*} +{*C3*}有時候,玩家相信自己è½åˆ°å®‡å®™åœ¨å†·å†½å†¬å¤œä¸­å°„下光芒和他說話。那閃ç¾åœ¨çŽ©å®¶çœ¼è§’çš„å¾®å…‰ï¼Œå¯èƒ½æ˜¯ä¸€é¡†æ¯”太陽大百è¬å€çš„æ†æ˜Ÿï¼Œç‚ºäº†åœ¨é‚£ä¸€çž¬é–“è®“çŽ©å®¶çœ‹åˆ°ï¼Œè€Œé©Ÿç‡’åŒ–ç‚ºé›¢å­ï¼Œå¥½è®“在宇宙é ç«¯æ¼«æ­¥å›žå®¶çš„玩家,çªç„¶é–“èžåˆ°é£Ÿç‰©çš„é¦™æ°£ï¼Œæ„Ÿè¦ºè‡ªå·±å¹¾ä¹Žå°±è¦æŠµé”é‚£é“熟悉的門å‰ï¼Œæº–備好å†åº¦å…¥å¤¢ã€‚{*EF*}{*B*}{*B*} +{*C2*}有時候,玩家相信宇宙é€éŽ 0 å’Œ 1ã€é€éŽä¸–上的電æµã€é€éŽå¤¢å¢ƒçµæŸæ™‚在螢幕上æ²å‹•的文字和他說話。{*EF*}{*B*}{*B*} +{*C3*}而宇宙說「我愛你ã€ã€‚{*EF*}{*B*}{*B*} +{*C2*}å®‡å®™èªªä½ åœ¨éŠæˆ²ä¸­è¡¨ç¾å¾—很好。{*EF*}{*B*}{*B*} +{*C3*}宇宙說你已具備你所需的一切。{*EF*}{*B*}{*B*} +{*C2*}宇宙說你比自己所想的還è¦å …強。{*EF*}{*B*}{*B*} +{*C3*}宇宙說你就是白æ™ã€‚{*EF*}{*B*}{*B*} +{*C2*}宇宙說你就是黑夜。{*EF*}{*B*}{*B*} +{*C3*}宇宙說你所抵抗的黑暗來自你的內心。{*EF*}{*B*}{*B*} +{*C2*}宇宙說你所追尋的光就在你自己心中。{*EF*}{*B*}{*B*} +{*C3*}宇宙說你ä¸å­¤å–®ã€‚{*EF*}{*B*}{*B*} +{*C2*}宇宙說你和一切都是一體。{*EF*}{*B*}{*B*} +{*C3*}宇宙說你就是宇宙,正在èªè­˜è‡ªå·±ã€å’Œè‡ªå·±å°è©±ã€è®€è‘—自己編寫的程å¼ç¢¼ã€‚{*EF*}{*B*}{*B*} +{*C2*}宇宙說我愛你,因為你就是愛。{*EF*}{*B*}{*B*} +{*C3*}éŠæˆ²å·²ç¶“çµæŸï¼ŒçŽ©å®¶å·²å¾žå¤¢å¢ƒä¸­ç”¦é†’ã€‚çŽ©å®¶é–‹å§‹ä¸€æ®µæ–°çš„å¤¢å¢ƒã€‚çŽ©å®¶åˆå†åº¦åšå¤¢ï¼Œåšä¸€å ´æ›´å¥½çš„夢。玩家就是宇宙。玩家就是愛。{*EF*}{*B*}{*B*} +{*C3*}你就是玩家。{*EF*}{*B*}{*B*} +{*C2*}醒éŽä¾†å§ã€‚{*EF*} + + +é‡è¨­åœ°ç„ + +確定è¦å°æ­¤éŠæˆ²å­˜æª”的地ç„進行é‡è¨­å—Žï¼Ÿé€™å°‡æœƒå¤±åŽ»æ‰€æœ‰åœ°ç„å…§çš„å»ºè¨­é€²åº¦ï¼ + +é‡è¨­åœ°ç„ + +ä¸è¦é‡è¨­åœ°ç„ + +ç›®å‰è±¬ã€ 綿羊ã€ä¹³ç‰›å’Œè²“å·²é”到數é‡ä¸Šé™ï¼Œç„¡æ³•剪 Mooshroom 的毛。 + +ç›®å‰è±¬ã€ç¶¿ç¾Šã€ä¹³ç‰›å’Œè²“å·²é”到數é‡ä¸Šé™ã€‚無法使用角色蛋。 + +ç›®å‰ Mooshroom å·²é”到數é‡ä¸Šé™ï¼Œç„¡æ³•使用角色蛋。 + +ç›®å‰å·²é”åˆ°éŠæˆ²ä¸–界的狼數é‡ä¸Šé™ï¼Œç„¡æ³•使用角色蛋。 + +ç›®å‰å·²é”åˆ°éŠæˆ²ä¸–界的雞數é‡ä¸Šé™ï¼Œç„¡æ³•使用角色蛋。 + +ç›®å‰å·²é”åˆ°éŠæˆ²ä¸–界的çƒè³Šæ•¸é‡ä¸Šé™ï¼Œç„¡æ³•使用角色蛋。 + +ç›®å‰å·²é”åˆ°éŠæˆ²ä¸–界的敵人數é‡ä¸Šé™ï¼Œç„¡æ³•使用角色蛋。 + +ç›®å‰å·²é”åˆ°éŠæˆ²ä¸–ç•Œçš„æ‘æ°‘數é‡ä¸Šé™ï¼Œç„¡æ³•使用角色蛋。 + +該世界中的圖畫/ç‰©å“æ¡†æž¶å·²é”最大數é‡ã€‚ + +您無法在和平模å¼ä¸­ç”¢ç”Ÿæ•µäººã€‚ + +ç›®å‰è±¬ã€ç¶¿ç¾Šã€ä¹³ç‰›å’Œè²“å·²é”到數é‡ä¸Šé™ã€‚此動物無法進入戀愛模å¼ã€‚ + +狼已é”åˆ°ç¹æ®–數é‡ä¸Šé™ï¼Œè©²å‹•物無法進入戀愛模å¼ã€‚ + +雞已é”åˆ°ç¹æ®–數é‡ä¸Šé™ï¼Œè©²å‹•物無法進入戀愛模å¼ã€‚ + +Mooshrooms å·²é”åˆ°ç¹æ®–數é‡ä¸Šé™ï¼Œè©²å‹•物無法進入戀愛模å¼ã€‚ + +ç›®å‰é€™å€‹ä¸–界的å°èˆ¹å·²é”到數é‡ä¸Šé™ã€‚ + +ç›®å‰å·²é”éŠæˆ²ä¸–界的生物頭顱數é‡ä¸Šé™ã€‚ + +上下å轉 + +慣用左手 + +æ‚¨æ­»äº¡äº†ï¼ + +å†ç”Ÿ + +下載內容 + +變更角色外觀 + +éŠæˆ²æ–¹å¼ + +控制 + +設定 + +製作群 + +釿–°å®‰è£å…§å®¹ + +åµéŒ¯è¨­å®š + +ç«æœƒè”“å»¶ + +炸藥會爆炸 + +玩家å°çީ家 + +信任玩家 + +主æŒäººç‰¹æ¬Š + +產生建築 + +éžå¸¸å¹³å¦çš„世界 + +è´ˆå“ç®± + +世界é¸é … + +å¯ä»¥å»ºé€ å’Œé–‹æŽ¡ + +å¯ä»¥ä½¿ç”¨é–€èˆ‡é–‹é—œ + +å¯ä»¥é–‹å•Ÿå®¹å™¨ + +å¯ä»¥æ”»æ“Šçީ家 + +å¯ä»¥æ”»æ“Šå‹•物 + +管ç†å“¡ + +踢出玩家 + +å¯ä»¥é£›ç¿” + +åœç”¨ç–²å‹ž + +隱形 + +主æŒäººé¸é … + +玩家/邀請 + +ç·šä¸ŠéŠæˆ² + +僅é™é‚€è«‹ + +更多é¸é … + +載入 + +新世界 + +世界å稱 + +世界生æˆå™¨ç”¨çš„ç¨®å­ + +留白å³å¯ä½¿ç”¨éš¨æ©Ÿç¨®å­ + +玩家 + +åŠ å…¥éŠæˆ² + +é–‹å§‹éŠæˆ² + +找ä¸åˆ°éŠæˆ² + +é€²è¡ŒéŠæˆ² + +排行榜 + +æˆå°± + +說明與é¸é … + +è§£é™¤å®Œæ•´ç‰ˆéŠæˆ²éŽ–å®š + +ç¹¼çºŒéŠæˆ² + +å„²å­˜éŠæˆ² + +困難度: + +éŠæˆ²é¡žåž‹ï¼š + +玩家代號: + +建築: + +é—œå¡é¡žåž‹ï¼š + +玩家å°çŽ©å®¶ï¼š + +信任玩家: + +炸藥: + +ç«æœƒè”“延: + +釿–°å®‰è£ä¸»é¡Œ + +釿–°å®‰è£çŽ©å®¶åœ–ç¤º 1 + +釿–°å®‰è£çŽ©å®¶åœ–ç¤º 2 + +釿–°å®‰è£è™›æ“¬äººå¶é …ç›® 1 + +釿–°å®‰è£è™›æ“¬äººå¶é …ç›® 2 + +釿–°å®‰è£è™›æ“¬äººå¶é …ç›® 3 + +é¸é … + +音訊 + +控制 + +圖形 + +ä½¿ç”¨è€…ä»‹é¢ + +é‡è¨­ç‚ºé è¨­å€¼ + +檢視上下跳動的動作 + +æç¤º + +éŠæˆ²ä¸­çš„工具æç¤º + +éŠæˆ²ä¸­çš„玩家代號 + +é›™äººéŠæˆ²åž‚ç›´åˆ†å‰²ç•«é¢ + +å®Œæˆ + +編輯牌å­ä¸Šçš„訊æ¯ï¼š + +請填寫螢幕擷å–ç•«é¢çš„說明 + +標題 + +éŠæˆ²ä¸­çš„螢幕擷å–ç•«é¢ + +編輯牌å­ä¸Šçš„訊æ¯ï¼š + +來看看我在 Minecraft: Xbox 360 Edition 製作了什麼æ±è¥¿ï¼ + +ç¶“å…¸ Minecraft æè³ªã€åœ–示åŠä½¿ç”¨è€…介é¢ï¼ + +顯示所有混æ­ä¸–界 + +é¸å–è¦å‚³è¼¸çš„存檔空格 + +清空空格 + +正在上傳存檔中繼資料 + +正在上傳存檔資料 + +正在上傳供 Xbox One 使用的存檔 + +已喿¶ˆä¸Šå‚³ + +æ‚¨å·²ç¶“å–æ¶ˆå°‡æ­¤å­˜æª”上傳至存檔轉移å€ã€‚ + +無特殊效果 + +速度 + +ç·©æ…¢ + +快速 + +開採倦怠 + +åŠ›é‡ + +虛弱 + +ç«‹å³å›žå¾©ç”Ÿå‘½å€¼ + +ç«‹å³å‚·å®³ + +è·³èºå¢žå¼· + +å™å¿ƒ + +å†ç”Ÿ + +抵抗力 + +é˜²ç« + +æ°´ä¸­å‘¼å¸ + +隱形 + +眼盲 + +夜視 + +飢餓 + +巨毒 + +æ•æ· + +ç·©æ…¢ + +快速 + +é²éˆ + +åŠ›é‡ + +虛弱 + +回復生命值 + +傷害 + +è·³èº + +å™å¿ƒ + +å†ç”Ÿ + +抵抗力 + +é˜²ç« + +æ°´ä¸­å‘¼å¸ + +隱形 + +眼盲 + +夜視 + +飢餓 + +巨毒 + + + +2 + +3 + +4 + +噴濺 + +平庸 + +ç„¡è¶£ + +平淡 + +清澈 + +乳狀 + +æ“´æ•£ + +拙劣 + +稀薄 + +粗劣 + +走味 + +巨大 + +粗製 + +奶油 + +平順 + +柔順 + +精緻 + +æ¿ƒéƒ + +高雅 + +高貴 + +媚力 + +è¯éº— + +極緻 + +強烈 + +閃光 + +強效 + +æ··æ¿ + +無臭 + +惡臭 + +刺鼻 + +刺激 + +濃稠 + +黿€§ + +æ‰€æœ‰è—¥æ°´çš„åŸºæœ¬é…æ–¹ï¼Œç”¨ä¾†åœ¨é‡€è£½å°ä¸­é‡€è£½è—¥æ°´ã€‚ + +本身ä¸å…·å‚™ä»»ä½•效果,藉由在釀製å°ä¸­æ·»åŠ å…¶ä»–ææ–™ä¾†é‡€è£½è—¥æ°´ã€‚ + +增加å—影響玩家ã€å‹•物和怪物的移動速度,並增加玩家的奔跑速度ã€è·³èºé«˜åº¦å’Œè¦–野。 + +減少å—影響玩家ã€å‹•物和怪物的移動速度,並é™ä½ŽçŽ©å®¶çš„å¥”è·‘é€Ÿåº¦ã€è·³èºé«˜åº¦å’Œè¦–野。 + +增加å—影響玩家和怪物攻擊時所造æˆçš„傷害。 + +減少å—影響玩家和怪物攻擊時所造æˆçš„傷害。 + +ç«‹å³å¢žåŠ å—影響玩家ã€å‹•物和怪物的生命值。 + +ç«‹å³æ¸›å°‘å—影響玩家ã€å‹•物和怪物的生命值。 + +隨著時間自動回復å—影響玩家ã€å‹•物和怪物的生命值。 + +讓å—影響玩家ã€å‹•物和怪物ä¸å—ç«ã€ç†”岩,和 Blaze é è·æ”»æ“Šçš„傷害。 + +隨著時間自動減少å—影響玩家ã€å‹•物和怪物的生命值。 + +鋒利 + +釿“Š + +節足剋星 + +擊退 + +çƒˆç« + +防護 + +é˜²ç« + +輕盈 + +防爆 + +防彈 + +æ°´ä¸­å‘¼å¸ + +水中挖掘 + +效率 + +èšå¯¶ + +è€åŠ› + +奪寶 + +財富 + +åŠ›é‡ + +ç«ç„° + +猛擊 + +ç„¡é™ + +1 + +2 + +3 + +4 + +5 + +6 + +7 + +8 + +9 + +10 + +å¯ä»¥ç”¨ä¸€æŠŠé¶´å˜´é‹¤æˆ–更好的工具來採集翡翠。 + +和箱å­é¡žä¼¼ï¼Œä½†æ˜¯çީ家å¯ä»¥åœ¨å„處的終界箱裡å–得個人所存放的é“具。 + +有æ±è¥¿ç©¿éŽé€£çµçš„絆線時就會啟動。 + +有æ±è¥¿ç©¿éŽé€£æŽ¥çš„絆線鉤時就會啟動。 + +精簡的翡翠儲存方法。 + +一é¢ç”±éµåµçŸ³ç Œæˆçš„牆。 + +å¯ä»¥ç”¨ä¾†ä¿®ç†æ­¦å™¨ã€å·¥å…·ï¼Œä»¥åŠè­·ç”²ã€‚ + +在熔çˆå…§ç†”煉製æˆç„石英。 + +用來當作è£é£¾ã€‚ + +å¯ä»¥ç”¨ä¾†å’Œæ‘民交易。 + +用來當作è£é£¾ï¼Œæ‚¨å¯ä»¥æŠŠèŠ±ã€æ¨¹è‹—ã€ä»™äººæŽŒï¼Œé‚„有蘑è‡ç¨®åœ¨ä¸Šé¢ã€‚ + +å¯å›žå¾© 2 個 {*ICON_SHANK_01*},並å¯ç²¾è£½æˆé‡‘色胡蘿蔔。å¯ä»¥æ ½ç¨®åœ¨è¾²åœ°ä¸Šã€‚ + +å¯å›žå¾© 0.5 個 {*ICON_SHANK_01*},或å¯åœ¨ç†”çˆä¸­çƒ¹ç…®ã€‚å¯ä»¥æ ½ç¨®åœ¨è¾²åœ°ä¸Šã€‚ + +å¯å›žå¾© 3 點 {*ICON_SHANK_01*}。在熔çˆä¸­çƒ¹ç…®é¦¬éˆ´è–¯å³å¯ç²å¾—。 + +å¯å›žå¾© 1 個 {*ICON_SHANK_01*},或å¯åœ¨ç†”çˆä¸­çƒ¹ç…®ã€‚å¯ä»¥æ ½ç¨®åœ¨è¾²åœ°ä¸Šã€‚食用å¯èƒ½æœƒè®“您中毒。 + +å¯å›žå¾© 3 個 {*ICON_SHANK_01*}。用胡蘿蔔和碎金塊精製而æˆã€‚ + +å¯ä»¥åœ¨é¨Žè±¬çš„æ™‚候控制牠的方å‘。 + + +å¯å›žå¾© 4 個 {*ICON_SHANK_01*}。 + +用於éµç §ä¸­ï¼Œå¯ä»¥ç‚ºæ­¦å™¨ã€å·¥å…·ï¼Œæˆ–是護甲附加特殊能力。 + +採集ç„石英原礦å³å¯ç²å¾—。å¯ç²¾è£½æˆç„石英方塊。 + +由羊毛製æˆï¼Œå¯ç”¨æ–¼è£é£¾ã€‚ + +ç¿¡ç¿  + +花盆 + +胡蘿蔔 + +馬鈴薯 + +烤馬鈴薯 + +有毒馬鈴薯 + +金色胡蘿蔔 + +願者上鉤 + +å—瓜派 + +附魔å°å†Š + +ç„石英 + +翡翠原礦 + +終界箱 + +絆線鉤 + +絆線 + +翡翠方塊 + +éµåµçŸ³ç‰† + +é’è‹”åµçŸ³ç‰† + +花盆 + +胡蘿蔔 + +馬鈴薯 + +éµç § + +éµç § + +è¼•å¾®å—æçš„éµç § + +åš´é‡å—æçš„éµç § + +ç„石英原礦 + +ç„石英方塊 + +雕刻石英方塊 + +希臘圓柱石英方塊 + +石英階梯 + +地毯 + +黑色地毯 + +紅色地毯 + +綠色地毯 + +棕色地毯 + +è—色地毯 + +紫色地毯 + +é’綠地毯 + +æ·ºç°åœ°æ¯¯ + +ç°è‰²åœ°æ¯¯ + +粉紅地毯 + +é’æª¸åœ°æ¯¯ + +黃色地毯 + +æ·ºè—地毯 + +洋紅地毯 + +橘色地毯 + +白色地毯 + +雕刻沙岩 + +平滑沙岩 + +{*PLAYER*} 打算傷害 {*SOURCE*},å»å› æ­¤å–ªå‘½ + +{*PLAYER*} é­è½ä¸‹éµç §æ“Šæ–ƒã€‚ + +{*PLAYER*} é­è½ä¸‹æ–¹å¡Šæ“Šæ–ƒã€‚ + +å°‡ {*PLAYER*} 傳é€è‡³ {*DESTINATION*} + +{*PLAYER*} 將您傳é€è‡³ä»–身邊 + +{*PLAYER*} 剛剛傳é€åˆ°æ‚¨èº«é‚Š + +棘刺 + +çŸ³è‹±æ¿ + +讓陰暗的地方看起來åƒåœ¨æ—¥å…‰ä¸‹ä¸€æ¨£ï¼Œå°±é€£åœ¨æ°´ä¸­ä¹Ÿä¸€æ¨£ã€‚ + +讓å—影響的玩家ã€å‹•ç‰©ä»¥åŠæ€ªç‰©éš±å½¢ã€‚ + +ä¿®ç† & 命å + +附加能力花費:%d + +èŠ±è²»å¤ªé«˜ï¼ + +釿–°å‘½å + +æ‚¨æ“æœ‰ï¼š + +交易所需é“å…· + +{*VILLAGER_TYPE*} æä¾› %s + +ä¿®ç† + +交易 + +染製項圈 + + + 這是éµç §æ“作介é¢ï¼Œæ‚¨å¯ä»¥åœ¨æ­¤æ¶ˆè€—經驗值為武器ã€è­·ç”²æˆ–工具釿–°å‘½åã€ä¿®ç†æˆ–附加特殊能力。 + + + + {*B*} + 請按一下 {*CONTROLLER_VK_A*} 瞭解更多關於éµç §ä»‹é¢çš„資訊。{*B*} + 如您已瞭解此資訊,請按一下 {*CONTROLLER_VK_B*}。 + + + + 如è¦é–‹å§‹ç¶­è­·ä¸€é …é“具,請將é“具放在第一個格å­è£¡ã€‚ + + + + åœ¨ç¬¬äºŒå€‹ç©ºæ ¼æ”¾ç½®æ­£ç¢ºçš„ææ–™ï¼ˆä¾‹å¦‚使用éµç¢‡å¡Šä¿®è£œå—æçš„éµåŠï¼‰ï¼Œä¿®ç†çš„çµæžœå°±æœƒé¡¯ç¤ºåœ¨ç”¢å‡ºç©ºæ ¼ä¸­ã€‚ + + + + 或者,您å¯ä»¥åœ¨ç¬¬äºŒå€‹ç©ºæ ¼ä¸­æ”¾å…¥ç‰¹å®šçš„é“具來組åˆã€‚ + + + + 如果è¦åœ¨éµç §ä¸­é™„加特殊能力,請在第二個空格中放入附魔å°å†Šã€‚ + + + + 一次作業所需的經驗值會顯示在產出格的下方。如果您的經驗值ä¸è¶³ä»¥åŸ·è¡Œè©²æ¬¡ä½œæ¥­ï¼Œä¾¿ç„¡æ³•å®Œæˆæ­¤æ¬¡æ“作。 + + + + 您å¯ä»¥åœ¨æ–‡å­—æ–¹å¡Šä¸­é‡æ–°ç‚ºé“具命å。 + + + + 從產出格拿起å³å°‡ä¿®å¾©çš„é“å…·ï¼Œå³æœƒæ¶ˆè€—å…ˆå‰æ”¾å…¥éµç §çš„兩件物å“ä»¥åŠæ‰€éœ€ç¶“驗值。 + + + + 在此å€ä¸­æœ‰ä¸€å€‹éµç §å’Œä¸€å€‹è£äº†å·¥å…·å’Œæ­¦å™¨çš„ç®±å­ï¼Œæ‚¨å¯ä»¥åœ¨æ­¤é«”é©—éµç §çš„æ“ä½œæ–¹å¼ã€‚ + + + + {*B*} + 請按一下 {*CONTROLLER_VK_A*} 瞭解關於éµç §çš„資訊。{*B*} + 如您已瞭解如何使用éµç §ï¼Œè«‹æŒ‰ä¸€ä¸‹ {*CONTROLLER_VK_B*}。 + + + + 您å¯ä»¥ä½¿ç”¨éµç §ä¿®å¾©æ­¦å™¨å’Œå·¥å…·çš„è€ä¹…度,也å¯ä»¥åœ¨éµç §ä¸Šè®Šæ›´ç‰©å“å稱,或是放入附魔å°å†Šä»¥åŠ ä¸Šç‰¹æ®Šèƒ½åŠ›ã€‚ + + + + 您能在地下迷宮中的箱å­è£¡ç™¼ç¾æˆ–在附加能力å°ä¸Šè£½ä½œé™„é­”å°å†Šã€‚ + + + + 在éµç §ä¸ŠåŸ·è¡Œä½œæ¥­æœƒæ¶ˆè€—ç¶“é©—å€¼ï¼Œä¹Ÿæœƒä½¿æ­¤å™¨å…·å—æã€‚ + + + + æ¶ˆè€—é‡æœƒä¾ä½œæ¥­é¡žåž‹ã€ç‰©å“價值ã€é™„加能力數é‡ï¼Œä»¥åŠå…ˆå‰çµ„åˆçš„æ¬¡æ•¸è€Œæœ‰ä¸åŒã€‚ + + + + 在變更å稱後,所有玩家都å¯ä»¥çœ‹åˆ°ç‰©å“的新å稱,還能é™ä½Žå…ˆå‰çµ„åˆé€ æˆçš„æ¶ˆè€—。 + + + + 在本å€çš„ç®±å­ä¸­æ”¶ç´äº†å¹¾æŠŠå—æçš„åå­—éŽ¬é‚„æœ‰ä¸€äº›ææ–™ã€å¹¾ç“¶ç¶“驗值藥水,以åŠé™„é­”å°å†Šï¼Œè®“您體驗此æ“作。 + + + + 您å¯ä»¥åœ¨äº¤æ˜“介é¢ä¸­å¾—çŸ¥æ‘æ°‘願æ„交æ›çš„物å“。 + + + + {*B*} + 請按一下 {*CONTROLLER_VK_A*} 瞭解交易介é¢ã€‚{*B*} + 如您已瞭解交易介é¢ï¼Œè«‹æŒ‰ä¸€ä¸‹ {*CONTROLLER_VK_B*}。 + + + + æ‘æ°‘當時願æ„äº¤æ˜“çš„ç‰©å“æœƒé¡¯ç¤ºåœ¨ä»‹é¢çš„上方。 + + + + å¦‚æžœæ‚¨æŒæœ‰çš„é“具數é‡ä¸è¶³ï¼Œè©²ç‰©å“會顯示為紅色且無法交易。 + + + + 您è¦äº¤çµ¦æ‘æ°‘çš„é“å…·æ•¸é‡æœƒé¡¯ç¤ºåœ¨ä»‹é¢å·¦æ–¹çš„兩個方格中。 + + + + 您能在介é¢ä¸­çš„左邊看到兩個方格,以åŠäº¤æ˜“所需的é“具數é‡ã€‚ + + + + 請按一下 {*CONTROLLER_VK_A*} å’Œæ‘æ°‘交æ›ä»–們æä¾›çš„é“具。 + + + + 在此å€åŸŸæœ‰ä¸€ä½æ‘民以åŠè£æœ‰ç´™å¼µçš„ç®±å­ï¼Œè®“您了解如何交易。 + + + + {*B*} + 請按一下 {*CONTROLLER_VK_A*} 瞭解何謂交易。{*B*} + 如果您已明白,請按一下 {*CONTROLLER_VK_B*}。 + + + + 玩家å¯ä»¥ç”¨èº«ä¸ŠæŒæœ‰çš„é“å…·å’Œæ‘æ°‘交易。 + + + + æ‘æ°‘æŒæœ‰çš„交易å“å¯èƒ½å’Œä»–å€‘çš„è·æ¥­æœ‰é—œã€‚ + + + + 執行多項交易,å¯èƒ½æœƒå¢žåŠ æˆ–æ›´æ–°æ‘æ°‘æŒæœ‰çš„物å“。 + + + + 太常交易的熱門物å“å¯èƒ½æœƒæš«æ™‚åœæ­¢äº¤æ›ï¼Œä½†æ˜¯ä»èƒ½å’Œæ‘民交易æ›å–其他物å“。 + + + + 從箱å­è£¡æ‹¿å¹¾å¼µç´™å’Œæ‘民交易。 + + + + 在此å€åŸŸä¸­æœ‰å…©å€‹çµ‚界箱。 + + + + {*B*} + 請按一下 {*CONTROLLER_VK_A*} 了解關於終界箱的資訊。{*B*} + 如果您已瞭解其é‹ä½œæ–¹å¼ï¼Œè«‹æŒ‰ä¸€ä¸‹ {*CONTROLLER_VK_B*}。 + + + + å³ä½¿åœ¨ä¸åŒçš„空間裡,世界上所有的終界箱ä»ä¸²è¯åœ¨ä¸€èµ·ã€‚存放在終界箱中的é“具,都å¯ä»¥åœ¨å…¶ä»–終界箱中å–用。 + + + + ä¸éŽï¼Œæ¯å€‹çŽ©å®¶åœ¨çµ‚ç•Œç®±ä¸­çœ‹åˆ°çš„å…§å®¹ç‰©éƒ½æœƒä¸åŒã€‚ + + + + 玩家能在任何終界箱中儲存物å“,並從世界中其他ä¸åŒåœ°é»žçš„終界箱中å–物。試著把é“具放進終界箱å§ã€‚ + + +å¯å›žå¾© 2 個 {*ICON_SHANK_01*},在 30 ç§’å…§æŒçºŒå›žå¾©ç”Ÿå‘½å€¼ï¼Œä¸¦å…·æœ‰ 5 åˆ†é˜æŠ—ç«å’ŒæŠµæŠ—傷害的效果。用蘋果和金塊精製而æˆã€‚ + +å¯ä»¥å‚³é€ + +å‚³é€ + +傳é€è‡³çީ家ä½ç½® + +傳é€åˆ°è‡ªå·±èº«é‚Š + +å¯ä»¥é—œé–‰ç–²å‹žè¨ˆç®— + +å¯ä»¥éš±å½¢ + +您能啟用隱形功能 + +您無法啟用隱形功能 + +您能啟用飛行功能 + +您無法啟用飛行功能 + +您能關閉疲勞計算 + +您無法關閉疲勞計算 + +您能使用傳é€åŠŸèƒ½ + +您無法使用傳é€åŠŸèƒ½ + +{*T3*}éŠæˆ²æ–¹å¼ï¼šéµç §{*ETW*}{*B*}{*B*} +您å¯ä»¥åœ¨éµç §ä¸Šä½¿ç”¨ç¶“驗等級來修ç†ã€æ›´å,或是於物å“上附加特殊能力。{*B*} +您å¯ä»¥è®Šæ›´æ‰€æœ‰ç‰©å“çš„å稱,修繕有è€ä¹…度的è£å‚™ï¼Œæˆ–加入附魔å°å†Šç‚ºç‰©å“æä¾›ç‰¹æ®Šèƒ½åŠ›ã€‚{*B*} +您å¯ä»¥åœ¨æœ€å·¦é‚Šçš„空格內放入想è¦ä¿®ç†çš„物å“,並加入該物å“的製作原料(例如éµåŠèˆ‡éµéŒ ï¼‰æˆ–是以相åŒé¡žåž‹çš„物å“來組åˆã€‚{*B*} +用éµç §çµ„åˆç‰©å“會更有效率,如果其中一件物å“附加了特殊能力,產出æˆå“也會繼承此特殊能力。{*B*} +也å¯ä»¥é€éŽåР入附魔å°å†Šçš„æ–¹å¼ç‚ºç‰©å“加入特殊能力,您åªéœ€è¦ç¢ºèªä½¿ç”¨äº†é©ç•¶çš„附魔å°å†Šã€‚您å¯ä»¥åœ¨åœ°ä¸‹è¿·å®®ä¸­çš„ç®±å­è£¡æ‰¾åˆ°é™„é­”å°å†Šï¼Œä¹Ÿå¯ä»¥åœ¨é™„加能力å°ä¸Šè£½ä½œã€‚{*B*} +åœ¨æ¯æ¬¡çµ„åˆå¾Œï¼Œéµç §éƒ½æœ‰å¯èƒ½æœƒå—æï¼Œåœ¨ä¸€å®šçš„ä½¿ç”¨æ¬¡æ•¸å¾Œä¾¿æœƒææ¯€ã€‚{*B*} + + +{*T3*}éŠæˆ²æ–¹å¼ï¼šäº¤æ˜“{*ETW*}{*B*}{*B*} +您也å¯ä»¥å’Œæ‘民交易。æ¯ä½æ‘民都有ä¸åŒçš„è·æ¥­ï¼Œä»–們有å¯èƒ½æœƒæ˜¯è¾²å¤«ã€è‚‰è²©ã€éµåŒ ã€æ›¸å•†æˆ–æ˜¯ç¥­å¸ ï¼Œé€™ä¹Ÿæœƒå½±éŸ¿ä»–å€‘ä¾›æ‡‰çš„ç‰©å“種類。{*B*} +您å¯ä»¥å¾žæ‘民的交易é¸å–®ä¸­çœ‹åˆ°å¯äº¤æ˜“çš„ç‰©å“æ¸…å–®ã€‚æ‘æ°‘åœ¨äº¤æ˜“æ™‚çµ¦äºˆçš„ç‰©å“æ•¸é‡å¯èƒ½æœƒæœ‰ä¸åŒï¼Œè€Œå¦‚果是太常交易的å“項,å¯èƒ½æœƒæš«æ™‚åœæ­¢è²©å”®ã€‚{*B*} +交易通常與物å“è²·è³£äº¤æ˜“çš„ç¿¡ç¿ æ•¸é‡æœ‰é—œã€‚{*B*} +如果您身上沒有足夠的物å“,您想交æ›çš„物å“就會顯示為紅色。{*B*} + + +{*T3*}éŠæˆ²æ–¹å¼ï¼šçµ‚界箱{*ETW*}{*B*}{*B*} +世界中所有終界箱都連在一起,放在這種箱å­è£¡çš„物å“,也å¯ä»¥åœ¨å…¶ä»–終界箱中å–用。ä¸éŽï¼Œæ¯å€‹çŽ©å®¶åœ¨çµ‚ç•Œç®±è£¡çœ‹åˆ°çš„ç‰©å“都會ä¸åŒã€‚這能讓玩家在世界中任何終界箱存放物å“並在其他地點的終界箱å–得存放物。 + + +農夫 + +書商 + +ç¥­å¸ + +éµåŒ  + +肉販 + +å¯åœ¨æ‘èŽŠè£¡æ‰¾åˆ°æ‘æ°‘,他們會根據å„è‡ªçš„è·æ¥­ï¼Œä¾›æ‡‰ç›¸æ‡‰çš„é“具給玩家購買。 + +大容é‡ç®±å­ + + + 您也能在附加能力å°ä¸Šè£½ä½œé™„é­”å°å†Šï¼Œæ‚¨å¾€å¾Œå¯é€éŽéµç §å°‡æ­¤èƒ½åŠ›é™„åŠ åœ¨å…¶ä»–ç‰©å“上。 + + + + åªè¦æœ‰æ±è¥¿ç¶“éŽä¸¦è§¸å‹•機關,絆線鉤也能為迴路供電。 + + + +  åªè¦ä¸€ç¶“馴æœï¼Œç‹¼èº«ä¸Šå°±æœƒå‡ºç¾ä¸€æ¢é …圈,您å¯ä»¥é€éŽæŸ“色方å¼è®Šæ›´é …圈的é¡è‰²ã€‚ + + +在種æ¤èƒ¡è˜¿è””和馬鈴薯後,也能收æˆé€™å…©é …ææ–™ã€‚您å¯ä»¥åœ¨åœ°é¢ä¸Šçœ‹åˆ°é€™äº›è”¬æžœçš„狀態來判斷是å¦å¯ä»¥æ”¶æˆã€‚ + + +  此外,您å¯ä»¥ç‚ºè±¬åŠ ä¸Šé¦¬éžï¼ŒçŽ©å®¶ä¾¿èƒ½é¨Žä¹˜è±¬éš»ã€‚æ‚¨å¯ä»¥ä½¿ç”¨ã€Œé¡˜è€…上鉤ã€ä¾†å¼•誘å°è±¬ç§»å‹•。 + + + + 如果需è¦çš„話,您å¯ä»¥è—‰ç”±ä½¿ç”¨ {*CONTROLLER_ACTION_MOVE*} 來慢慢移動您的礦車。藉此將礦車移動到有電力的軌é“上å¯ä»¥å¹«åŠ©å®ƒå•Ÿå‹•ã€‚ + + +æ‚¨ç„¡æ³•åŠ å…¥æ­¤éŠæˆ²ã€‚分割畫é¢åªåœ¨é«˜ç•«è³ªæ¨¡å¼ä¸­æ”¯æ´ã€‚如果您想è¦åŠ å…¥ï¼Œè«‹ç™»å‡ºå…¶ä»–çŽ©å®¶ã€‚ + +治療 + +Xbox 360 + +上一步 + +ç•¶éŠæˆ²ä¸­æˆ–è¼‰å…¥éŠæˆ²çš„存檔有啟用此é¸é …時,都會åœç”¨æˆå°±åŠæŽ’è¡Œæ¦œæ›´æ–°çš„åŠŸèƒ½ã€‚ + +上傳供 Xbox One 使用的存檔 + +上傳存檔 + +您一次åªèƒ½åœ¨å­˜æª”轉移å€å„²å­˜ä¸€å€‹ Xbox 360 ä¸»æ©Ÿå­˜æª”ã€‚è«‹ç¢ºèªæ‚¨åœ¨ä¸Šå‚³å¦ä¸€å€‹ Xbox 360 主機存檔之å‰å·²ç¶“將存檔下載至您的 Xbox One 主機中。 + +正在上傳... + +上傳完æˆï¼ + +上傳失敗。請您ç¨å¾Œå†è©¦ã€‚ + + diff --git a/Minecraft.Client/Common/Minecraft_Macros.h b/Minecraft.Client/Common/Minecraft_Macros.h new file mode 100644 index 00000000..4f1f096a --- /dev/null +++ b/Minecraft.Client/Common/Minecraft_Macros.h @@ -0,0 +1,42 @@ + +#pragma once + +// 3 bit user index +// 5 bits alpha +// 1 bit decoration +// 3 bits poptime +// 8 bits unused // was 11 bits aux val but needed 15 bits for potions so moved to item bitmask +// 6 bits count +// 6 bits scale + +// uiCount is up to 64, but can't ever be 0, so to make it 6 bits, subtract one from the packing, and add one on the unpacking +#define MAKE_SLOTDISPLAY_DATA_BITMASK(uiUserIndex,uiAlpha,bDecorations,uiCount,uiScale,uiPopTime) ((((uiUserIndex&0x7)<<29) | (uiAlpha&0x1F)<<24) | (bDecorations?0x800000:0) | ((uiPopTime&0x7)<<20) | ((uiCount-1)<<6) | (uiScale&0x3F)) + +#define GET_SLOTDISPLAY_USERINDEX_FROM_DATA_BITMASK(uiBitmask) ((((unsigned int)uiBitmask)>>29)&0x7) +#define GET_SLOTDISPLAY_ALPHA_FROM_DATA_BITMASK(uiBitmask) ((((unsigned int)uiBitmask)>>24)&0x1F) +#define GET_SLOTDISPLAY_DECORATIONS_FROM_DATA_BITMASK(uiBitmask) ((((unsigned int)uiBitmask)&0x800000)?true:false) +//#define GET_SLOTDISPLAY_AUXVAL_FROM_DATA_BITMASK(uiBitmask) ((((unsigned long)uiBitmask)>>12)&0x7FF) +#define GET_SLOTDISPLAY_COUNT_FROM_DATA_BITMASK(uiBitmask) (((((unsigned int)uiBitmask)>>6)&0x3F)+1) +#define GET_SLOTDISPLAY_SCALE_FROM_DATA_BITMASK(uiBitmask) (((unsigned int)uiBitmask)&0x3F) +#define GET_SLOTDISPLAY_POPTIME_FROM_DATA_BITMASK(uiBitmask) ((((unsigned int)uiBitmask)>>20)&0x7) + +// 16 bits for id (either item id or xzp icon id) +// 15 bits for aux value +// 1 bit for foil +#define MAKE_SLOTDISPLAY_ITEM_BITMASK(uiId,uiAuxValue,bFoil) ( (uiId & 0xFFFF) | ((uiAuxValue & 0x7FFF) << 16) | (bFoil?0x80000000:0) ) + +#define GET_SLOTDISPLAY_ID_FROM_ITEM_BITMASK(uiBitmask) (((unsigned int)uiBitmask)&0xFFFF) +#define GET_SLOTDISPLAY_AUXVAL_FROM_ITEM_BITMASK(uiBitmask) ((((unsigned int)uiBitmask)>>16) & 0x7FFF) +#define GET_SLOTDISPLAY_FOIL_FROM_ITEM_BITMASK(uiBitmask) ((((unsigned int)uiBitmask)&0x80000000)?true:false) + + +// For encoding the players skin selection in their profile +// bDlcSkin = false is a players skin, bDlcSkin = true is a DLC skin +#define MAKE_SKIN_BITMASK(bDlcSkin, dwSkinId) ( (bDlcSkin?0x80000000:0) | (dwSkinId & 0x7FFFFFFF) ) +#define IS_SKIN_ID_IN_RANGE(dwSkinId) (dwSkinId <= 0x7FFFFFFF) + +#define GET_DLC_SKIN_ID_FROM_BITMASK(uiBitmask) (((DWORD)uiBitmask)&0x7FFFFFFF) +#define GET_UGC_SKIN_ID_FROM_BITMASK(uiBitmask) (((DWORD)uiBitmask)&0x7FFFFFE0) +#define GET_DEFAULT_SKIN_ID_FROM_BITMASK(uiBitmask) (((DWORD)uiBitmask)&0x0000001F) +#define GET_IS_DLC_SKIN_FROM_BITMASK(uiBitmask) ((((DWORD)uiBitmask)&0x80000000)?true:false) + diff --git a/Minecraft.Client/Common/Network/GameNetworkManager.cpp b/Minecraft.Client/Common/Network/GameNetworkManager.cpp new file mode 100644 index 00000000..2a80f80a --- /dev/null +++ b/Minecraft.Client/Common/Network/GameNetworkManager.cpp @@ -0,0 +1,2000 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\AABB.h" +#include "..\..\..\Minecraft.World\Vec3.h" +#include "..\..\..\Minecraft.World\Socket.h" +#include "..\..\..\Minecraft.World\ThreadName.h" +#include "..\..\..\Minecraft.World\Entity.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\..\ClientConnection.h" +#include "..\..\Minecraft.h" +#include "..\..\User.h" +#include "..\..\MinecraftServer.h" +#include "..\..\PlayerList.h" +#include "..\..\ServerPlayer.h" +#include "..\..\PlayerConnection.h" +#include "..\..\MultiPlayerLevel.h" +#include "..\..\ProgressRenderer.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\DisconnectPacket.h" +#include "..\..\..\Minecraft.World\compression.h" +#include "..\..\..\Minecraft.World\OldChunkStorage.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\TexturePack.h" + +#include "..\..\Gui.h" +#include "..\..\LevelRenderer.h" +#include "..\..\..\Minecraft.World\IntCache.h" +#include "..\GameRules\ConsoleGameRules.h" +#include "GameNetworkManager.h" + +#ifdef _XBOX +#include "Common\XUI\XUI_PauseMenu.h" +#elif !(defined __PSVITA__) +#include "Common\UI\UI.h" +#include "Common\UI\UIScene_PauseMenu.h" +#include "..\..\Xbox\Network\NetworkPlayerXbox.h" +#endif + +#ifdef _DURANGO +#include "..\Minecraft.World\DurangoStats.h" +#endif + +// Global instance +CGameNetworkManager g_NetworkManager; +CPlatformNetworkManager *CGameNetworkManager::s_pPlatformNetworkManager; + +__int64 CGameNetworkManager::messageQueue[512]; +__int64 CGameNetworkManager::byteQueue[512]; +int CGameNetworkManager::messageQueuePos = 0; + +CGameNetworkManager::CGameNetworkManager() +{ + m_bInitialised = false; + m_bLastDisconnectWasLostRoomOnly = false; + m_bFullSessionMessageOnNextSessionChange = false; + +#ifdef __ORBIS__ + m_pUpsell = NULL; + m_pInviteInfo = NULL; +#endif +} + +void CGameNetworkManager::Initialise() +{ + ServerStoppedCreate( false ); + ServerReadyCreate( false ); + int flagIndexSize = LevelRenderer::getGlobalChunkCount() / (Level::maxBuildHeight / 16); // dividing here by number of renderer chunks in one column +#ifdef _XBOX + s_pPlatformNetworkManager = new CPlatformNetworkManagerXbox(); +#elif defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ + s_pPlatformNetworkManager = new CPlatformNetworkManagerSony(); +#elif defined _DURANGO + s_pPlatformNetworkManager = new CPlatformNetworkManagerDurango(); +#else + s_pPlatformNetworkManager = new CPlatformNetworkManagerStub(); +#endif + s_pPlatformNetworkManager->Initialise( this, flagIndexSize ); + m_bNetworkThreadRunning = false; + m_bInitialised = true; +} + +void CGameNetworkManager::Terminate() +{ + if( m_bInitialised ) + { + s_pPlatformNetworkManager->Terminate(); + } +} + +void CGameNetworkManager::DoWork() +{ +#ifdef _XBOX + // did we get any notifications from the game listener? + if(app.GetNotifications()->size()!=0) + { + PNOTIFICATION pNotification=app.GetNotifications()->back(); + + switch(pNotification->dwNotification) + { + case XN_LIVE_LINK_STATE_CHANGED: + { + int iPrimaryPlayer = g_NetworkManager.GetPrimaryPad(); + bool bConnected = (pNotification->uiParam!=0)?true:false; + if((g_NetworkManager.GetLockedProfile()!=-1) && iPrimaryPlayer!=-1 && bConnected == false && g_NetworkManager.IsInSession() ) + { + app.SetAction(iPrimaryPlayer,eAppAction_EthernetDisconnected); + } + } + break; + case XN_LIVE_INVITE_ACCEPTED: + s_pPlatformNetworkManager->Notify(pNotification->dwNotification,pNotification->uiParam); + break; + } + + app.GetNotifications()->pop_back(); + delete pNotification; + } +#endif + s_pPlatformNetworkManager->DoWork(); + +#ifdef __ORBIS__ + if (m_pUpsell != NULL && m_pUpsell->hasResponse()) + { + int iPad_invited = m_iPlayerInvited, iPad_checking = m_pUpsell->m_userIndex; + + m_iPlayerInvited = -1; + + delete m_pUpsell; + m_pUpsell = NULL; + + if (ProfileManager.HasPlayStationPlus(iPad_checking)) + { + this->GameInviteReceived(iPad_invited, m_pInviteInfo); + + // m_pInviteInfo deleted by GameInviteReceived. + m_pInviteInfo = NULL; + } + else + { + delete m_pInviteInfo; + m_pInviteInfo = NULL; + } + } +#endif +} + +bool CGameNetworkManager::_RunNetworkGame(LPVOID lpParameter) +{ + bool success = true; + + bool isHost = g_NetworkManager.IsHost(); + // Start the network game + Minecraft *pMinecraft=Minecraft::GetInstance(); + success = StartNetworkGame(pMinecraft,lpParameter); + + if(!success) return false; + + if( isHost ) + { + // We do not have a lobby, so the only players in the game at this point are local ones. + + success = s_pPlatformNetworkManager->_RunNetworkGame(); + if(!success) + { + app.SetAction(ProfileManager.GetPrimaryPad(),eAppAction_ExitWorld,(void *)TRUE); + return true; + } + } + + if( g_NetworkManager.IsLeavingGame() ) return false; + + app.SetGameStarted(true); + + // 4J-PB - if this is the trial game, start the trial timer + if(!ProfileManager.IsFullVersion()) + { + ui.SetTrialTimerLimitSecs(MinecraftDynamicConfigurations::GetTrialTime()); + app.SetTrialTimerStart(); + } + //app.CloseXuiScenes(ProfileManager.GetPrimaryPad()); + + return success; +} + +bool CGameNetworkManager::StartNetworkGame(Minecraft *minecraft, LPVOID lpParameter) +{ +#ifdef _DURANGO + ProfileManager.SetDeferredSignoutEnabled(true); +#endif + + __int64 seed = 0; + if(lpParameter != NULL) + { + NetworkGameInitData *param = (NetworkGameInitData *)lpParameter; + seed = param->seed; + + app.setLevelGenerationOptions(param->levelGen); + if(param->levelGen != NULL) + { + if(app.getLevelGenerationOptions() == NULL) + { + app.DebugPrintf("Game rule was not loaded, and seed is required. Exiting.\n"); + return false; + } + else + { + param->seed = seed = app.getLevelGenerationOptions()->getLevelSeed(); + } + } + } + + static __int64 sseed = seed; // Create static version so this will be valid until next call to this function & whilst thread is running + ServerStoppedCreate(false); + if( g_NetworkManager.IsHost() ) + { + ServerStoppedCreate(true); + ServerReadyCreate(true); + // Ready to go - create actual networking thread & start hosting + C4JThread* thread = new C4JThread(&CGameNetworkManager::ServerThreadProc, lpParameter, "Server", 256 * 1024); +#if defined __PS3__ || defined __PSVITA__ + thread->SetPriority(THREAD_PRIORITY_BELOW_NORMAL); +#endif //__PS3__ + + thread->SetProcessor(CPU_CORE_SERVER); + thread->Run(); + + ServerReadyWait(); + ServerReadyDestroy(); + + if( MinecraftServer::serverHalted() ) + return false; + +// printf("Server ready to go!\n"); + } + else + { + Socket::Initialise(NULL); + } + +#ifndef _XBOX + Minecraft *pMinecraft = Minecraft::GetInstance(); + // Make sure that we have transitioned through any joining/creating stages and are actually playing the game, so that we know the players should be valid + bool changedMessage = false; + while(!IsReadyToPlayOrIdle()) + { + changedMessage = true; + pMinecraft->progressRenderer->progressStage( g_NetworkManager.CorrectErrorIDS(IDS_PROGRESS_SAVING_TO_DISC) ); // "Finalizing..." vaguest message I could find + pMinecraft->progressRenderer->progressStagePercentage( g_NetworkManager.GetJoiningReadyPercentage() ); + Sleep(10); + } + if( changedMessage ) + { + pMinecraft->progressRenderer->progressStagePercentage( 100 ); + } +#endif + + // If we aren't in session, then something bad must have happened - we aren't joining, creating or ready play + if(!IsInSession() ) + { + MinecraftServer::HaltServer(); + return false; + } + + // 4J Stu - Wait a while to make sure that DLC is loaded. This is the last point before the network communication starts + // so the latest we can check this + while( !app.DLCInstallProcessCompleted() && app.DLCInstallPending() && !g_NetworkManager.IsLeavingGame() ) + { + Sleep( 10 ); + } + if( g_NetworkManager.IsLeavingGame() ) + { + MinecraftServer::HaltServer(); + return false; + } + + // PRIMARY PLAYER + + vector createdConnections; + ClientConnection *connection; + + if( g_NetworkManager.IsHost() ) + { + connection = new ClientConnection(minecraft, NULL); + } + else + { + INetworkPlayer *pNetworkPlayer = g_NetworkManager.GetLocalPlayerByUserIndex(ProfileManager.GetLockedProfile()); + if(pNetworkPlayer == NULL) + { + MinecraftServer::HaltServer(); + app.DebugPrintf("%d\n",ProfileManager.GetLockedProfile()); + // If the player is NULL here then something went wrong in the session setup, and continuing will end up in a crash + return false; + } + + Socket *socket = pNetworkPlayer->GetSocket(); + + // Fix for #13259 - CRASH: Gameplay: loading process is halted when player loads saved data + if(socket == NULL) + { + assert(false); + MinecraftServer::HaltServer(); + // If the socket is NULL here then something went wrong in the session setup, and continuing will end up in a crash + return false; + } + + connection = new ClientConnection(minecraft, socket); + } + + if( !connection->createdOk ) + { + assert(false); + delete connection; + connection = NULL; + MinecraftServer::HaltServer(); + return false; + } + + connection->send( shared_ptr( new PreLoginPacket(minecraft->user->name) ) ); + + // Tick connection until we're ready to go. The stages involved in this are: + // (1) Creating the ClientConnection sends a prelogin packet to the server + // (2) the server sends a prelogin back, which is handled by the clientConnection, and returns a login packet + // (3) the server sends a login back, which is handled by the client connection to start the game + if( !g_NetworkManager.IsHost() ) + { + Minecraft::GetInstance()->progressRenderer->progressStart(IDS_PROGRESS_CONNECTING); + } + else + { + // 4J Stu - Host needs to generate a unique multiplayer id for sentient telemetry reporting + INT multiplayerInstanceId = TelemetryManager->GenerateMultiplayerInstanceId(); + TelemetryManager->SetMultiplayerInstanceId(multiplayerInstanceId); + } + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + do + { + app.DebugPrintf("ticking connection A\n"); + connection->tick(); + + // 4J Stu - We were ticking this way too fast which could cause the connection to time out + // The connections should tick at 20 per second + Sleep(50); + } while ( (IsInSession() && !connection->isStarted() && !connection->isClosed() && !g_NetworkManager.IsLeavingGame()) || tPack->isLoadingData() || (Minecraft::GetInstance()->skins->needsUIUpdate() || ui.IsReloadingSkin()) ); + ui.CleanUpSkinReload(); + + // 4J Stu - Fix for #11279 - CRASH: TCR 001: BAS Game Stability: Signing out of game will cause title to crash + // We need to break out of the above loop if m_bLeavingGame is set, and close the connection + if( g_NetworkManager.IsLeavingGame() || !IsInSession() ) + { + connection->close(); + } + + if( connection->isStarted() && !connection->isClosed() ) + { + createdConnections.push_back( connection ); + + int primaryPad = ProfileManager.GetPrimaryPad(); + app.SetRichPresenceContext(primaryPad,CONTEXT_GAME_STATE_BLANK); + if (GetPlayerCount() > 1) // Are we offline or online, and how many players are there + { + if (IsLocalGame()) ProfileManager.SetCurrentGameActivity(primaryPad,CONTEXT_PRESENCE_MULTIPLAYEROFFLINE,false); + else ProfileManager.SetCurrentGameActivity(primaryPad,CONTEXT_PRESENCE_MULTIPLAYER,false); + } + else + { + if(IsLocalGame()) ProfileManager.SetCurrentGameActivity(primaryPad,CONTEXT_PRESENCE_MULTIPLAYER_1POFFLINE,false); + else ProfileManager.SetCurrentGameActivity(primaryPad,CONTEXT_PRESENCE_MULTIPLAYER_1P,false); + } + + + // ALL OTHER LOCAL PLAYERS + for(int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + // Already have setup the primary pad + if(idx == ProfileManager.GetPrimaryPad() ) continue; + + if( GetLocalPlayerByUserIndex(idx) != NULL && !ProfileManager.IsSignedIn(idx) ) + { + INetworkPlayer *pNetworkPlayer = g_NetworkManager.GetLocalPlayerByUserIndex(idx); + Socket *socket = pNetworkPlayer->GetSocket(); + app.DebugPrintf("Closing socket due to player %d not being signed in any more\n"); + if( !socket->close(false) ) socket->close(true); + + continue; + } + + // By default when we host we only have the local player, but currently allow multiple local players to join + // when joining any other way, so just because they are signed in doesn't mean they are in the session + // 4J Stu - If they are in the session, then we should add them to the game. Otherwise we won't be able to add them later + INetworkPlayer *pNetworkPlayer = g_NetworkManager.GetLocalPlayerByUserIndex(idx); + if( pNetworkPlayer == NULL ) + continue; + + ClientConnection *connection; + + Socket *socket = pNetworkPlayer->GetSocket(); + connection = new ClientConnection(minecraft, socket, idx); + + minecraft->addPendingLocalConnection(idx, connection); + //minecraft->createExtraLocalPlayer(idx, (convStringToWstring( ProfileManager.GetGamertag(idx) )).c_str(), idx, connection); + + // Open the socket on the server end to accept incoming data + Socket::addIncomingSocket(socket); + + connection->send( shared_ptr( new PreLoginPacket(convStringToWstring( ProfileManager.GetGamertag(idx) )) ) ); + + createdConnections.push_back( connection ); + + // Tick connection until we're ready to go. The stages involved in this are: + // (1) Creating the ClientConnection sends a prelogin packet to the server + // (2) the server sends a prelogin back, which is handled by the clientConnection, and returns a login packet + // (3) the server sends a login back, which is handled by the client connection to start the game + do + { + // We need to keep ticking the connections for players that already logged in + for(AUTO_VAR(it, createdConnections.begin()); it < createdConnections.end(); ++it) + { + (*it)->tick(); + } + + // 4J Stu - We were ticking this way too fast which could cause the connection to time out + // The connections should tick at 20 per second + Sleep(50); + app.DebugPrintf("<***> %d %d %d %d %d\n",IsInSession(), !connection->isStarted(),!connection->isClosed(),ProfileManager.IsSignedIn(idx),!g_NetworkManager.IsLeavingGame()); +#if defined _XBOX || __PS3__ + } while (IsInSession() && !connection->isStarted() && !connection->isClosed() && ProfileManager.IsSignedIn(idx) && !g_NetworkManager.IsLeavingGame() ); +#else + // TODO - This SHOULD be something just like the code above but temporarily changing here so that we don't have to depend on the profilemanager behaviour + } while (IsInSession() && !connection->isStarted() && !connection->isClosed() && !g_NetworkManager.IsLeavingGame() ); +#endif + + // 4J Stu - Fix for #11279 - CRASH: TCR 001: BAS Game Stability: Signing out of game will cause title to crash + // We need to break out of the above loop if m_bLeavingGame is set, and stop creating new connections + // The connections in the createdConnections vector get closed at the end of the thread + if( g_NetworkManager.IsLeavingGame() || !IsInSession() ) break; + + if( ProfileManager.IsSignedIn(idx) && !connection->isClosed() ) + { + app.SetRichPresenceContext(idx,CONTEXT_GAME_STATE_BLANK); + if (IsLocalGame()) ProfileManager.SetCurrentGameActivity(idx,CONTEXT_PRESENCE_MULTIPLAYEROFFLINE,false); + else ProfileManager.SetCurrentGameActivity(idx,CONTEXT_PRESENCE_MULTIPLAYER,false); + } + else + { + connection->close(); + AUTO_VAR(it, find( createdConnections.begin(), createdConnections.end(), connection )); + if(it != createdConnections.end() ) createdConnections.erase( it ); + } + } + + app.SetGameMode( eMode_Multiplayer ); + } + else if ( connection->isClosed() || !IsInSession()) + { +// assert(false); + MinecraftServer::HaltServer(); + return false; + } + + + if(g_NetworkManager.IsLeavingGame() || !IsInSession() ) + { + for(AUTO_VAR(it, createdConnections.begin()); it < createdConnections.end(); ++it) + { + (*it)->close(); + } +// assert(false); + MinecraftServer::HaltServer(); + return false; + } + + // Catch in-case server has been halted (by a player signout). + if ( MinecraftServer::serverHalted() ) + return false; + + return true; +} + +int CGameNetworkManager::CorrectErrorIDS(int IDS) +{ + return s_pPlatformNetworkManager->CorrectErrorIDS(IDS); +} + +int CGameNetworkManager::GetLocalPlayerMask(int playerIndex) +{ + return s_pPlatformNetworkManager->GetLocalPlayerMask( playerIndex ); +} + +int CGameNetworkManager::GetPlayerCount() +{ + return s_pPlatformNetworkManager->GetPlayerCount(); +} + +int CGameNetworkManager::GetOnlinePlayerCount() +{ + return s_pPlatformNetworkManager->GetOnlinePlayerCount(); +} + +bool CGameNetworkManager::AddLocalPlayerByUserIndex( int userIndex ) +{ + return s_pPlatformNetworkManager->AddLocalPlayerByUserIndex( userIndex ); +} + +bool CGameNetworkManager::RemoveLocalPlayerByUserIndex( int userIndex ) +{ + return s_pPlatformNetworkManager->RemoveLocalPlayerByUserIndex( userIndex ); +} + +INetworkPlayer *CGameNetworkManager::GetLocalPlayerByUserIndex(int userIndex ) +{ + return s_pPlatformNetworkManager->GetLocalPlayerByUserIndex( userIndex ); +} + +INetworkPlayer *CGameNetworkManager::GetPlayerByIndex(int playerIndex) +{ + return s_pPlatformNetworkManager->GetPlayerByIndex( playerIndex ); +} + +INetworkPlayer *CGameNetworkManager::GetPlayerByXuid(PlayerUID xuid) +{ + return s_pPlatformNetworkManager->GetPlayerByXuid( xuid ); +} + +INetworkPlayer *CGameNetworkManager::GetPlayerBySmallId(unsigned char smallId) +{ + return s_pPlatformNetworkManager->GetPlayerBySmallId( smallId ); +} + +#ifdef _DURANGO +wstring CGameNetworkManager::GetDisplayNameByGamertag(wstring gamertag) +{ + return s_pPlatformNetworkManager->GetDisplayNameByGamertag(gamertag); +} +#endif + +INetworkPlayer *CGameNetworkManager::GetHostPlayer() +{ + return s_pPlatformNetworkManager->GetHostPlayer(); +} + +void CGameNetworkManager::RegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam) +{ + s_pPlatformNetworkManager->RegisterPlayerChangedCallback( iPad, callback, callbackParam ); +} + +void CGameNetworkManager::UnRegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam) +{ + s_pPlatformNetworkManager->UnRegisterPlayerChangedCallback( iPad, callback, callbackParam ); +} + +void CGameNetworkManager::HandleSignInChange() +{ + s_pPlatformNetworkManager->HandleSignInChange(); +} + +bool CGameNetworkManager::ShouldMessageForFullSession() +{ + return s_pPlatformNetworkManager->ShouldMessageForFullSession(); +} + +bool CGameNetworkManager::IsInSession() +{ + return s_pPlatformNetworkManager->IsInSession(); +} + +bool CGameNetworkManager::IsInGameplay() +{ + return s_pPlatformNetworkManager->IsInGameplay(); +} + +bool CGameNetworkManager::IsReadyToPlayOrIdle() +{ + return s_pPlatformNetworkManager->IsReadyToPlayOrIdle(); +} + +bool CGameNetworkManager::IsLeavingGame() +{ + return s_pPlatformNetworkManager->IsLeavingGame(); +} + +bool CGameNetworkManager::SetLocalGame(bool isLocal) +{ + return s_pPlatformNetworkManager->SetLocalGame( isLocal ); +} + +bool CGameNetworkManager::IsLocalGame() +{ + return s_pPlatformNetworkManager->IsLocalGame(); +} + +void CGameNetworkManager::SetPrivateGame(bool isPrivate) +{ + s_pPlatformNetworkManager->SetPrivateGame( isPrivate ); +} + +bool CGameNetworkManager::IsPrivateGame() +{ + return s_pPlatformNetworkManager->IsPrivateGame(); +} + +void CGameNetworkManager::HostGame(int localUsersMask, bool bOnlineGame, bool bIsPrivate, unsigned char publicSlots, unsigned char privateSlots) +{ + // 4J Stu - clear any previous connection errors + Minecraft::GetInstance()->clearConnectionFailed(); + + s_pPlatformNetworkManager->HostGame( localUsersMask, bOnlineGame, bIsPrivate, publicSlots, privateSlots ); +} + +bool CGameNetworkManager::IsHost() +{ + return (s_pPlatformNetworkManager->IsHost() == TRUE); +} + +bool CGameNetworkManager::IsInStatsEnabledSession() +{ + return s_pPlatformNetworkManager->IsInStatsEnabledSession(); +} + +bool CGameNetworkManager::SessionHasSpace(unsigned int spaceRequired) +{ + return s_pPlatformNetworkManager->SessionHasSpace( spaceRequired ); +} + +vector *CGameNetworkManager::GetSessionList(int iPad, int localPlayers, bool partyOnly) +{ + return s_pPlatformNetworkManager->GetSessionList( iPad, localPlayers, partyOnly ); +} + +bool CGameNetworkManager::GetGameSessionInfo(int iPad, SessionID sessionId,FriendSessionInfo *foundSession) +{ + return s_pPlatformNetworkManager->GetGameSessionInfo( iPad, sessionId, foundSession ); +} + +void CGameNetworkManager::SetSessionsUpdatedCallback( void (*SessionsUpdatedCallback)(LPVOID pParam), LPVOID pSearchParam ) +{ + s_pPlatformNetworkManager->SetSessionsUpdatedCallback( SessionsUpdatedCallback, pSearchParam ); +} + +void CGameNetworkManager::GetFullFriendSessionInfo( FriendSessionInfo *foundSession, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ) +{ + s_pPlatformNetworkManager->GetFullFriendSessionInfo(foundSession, FriendSessionUpdatedFn, pParam); +} + +void CGameNetworkManager::ForceFriendsSessionRefresh() +{ + s_pPlatformNetworkManager->ForceFriendsSessionRefresh(); +} + +bool CGameNetworkManager::JoinGameFromInviteInfo( int userIndex, int userMask, const INVITE_INFO *pInviteInfo) +{ + return s_pPlatformNetworkManager->JoinGameFromInviteInfo( userIndex, userMask, pInviteInfo ); +} + +CGameNetworkManager::eJoinGameResult CGameNetworkManager::JoinGame(FriendSessionInfo *searchResult, int localUsersMask) +{ + app.SetTutorialMode( false ); + g_NetworkManager.SetLocalGame(false); + + int primaryUserIndex = ProfileManager.GetLockedProfile(); + + // 4J-PB - clear any previous connection errors + Minecraft::GetInstance()->clearConnectionFailed(); + + // Make sure that the Primary Pad is in by default + localUsersMask |= GetLocalPlayerMask( ProfileManager.GetPrimaryPad() ); + + return (eJoinGameResult)(s_pPlatformNetworkManager->JoinGame( searchResult, localUsersMask, primaryUserIndex )); +} + +void CGameNetworkManager::CancelJoinGame(LPVOID lpParam) +{ +#ifdef _XBOX_ONE + s_pPlatformNetworkManager->CancelJoinGame(); +#endif +} + +bool CGameNetworkManager::LeaveGame(bool bMigrateHost) +{ + Minecraft::GetInstance()->gui->clearMessages(); + return s_pPlatformNetworkManager->LeaveGame( bMigrateHost ); +} + +int CGameNetworkManager::JoinFromInvite_SignInReturned(void *pParam,bool bContinue, int iPad) +{ + INVITE_INFO * pInviteInfo = (INVITE_INFO *)pParam; + + if(bContinue==true) + { +#ifdef __ORBIS__ + // Check if PSN is unavailable because of age restriction + int npAvailability = ProfileManager.getNPAvailability(iPad); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + UINT uiIDA[1]; + uiIDA[0] = IDS_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + + return 0; + } +#endif + + app.DebugPrintf("JoinFromInvite_SignInReturned, iPad %d\n",iPad); + // It's possible that the player has not signed in - they can back out + if(ProfileManager.IsSignedIn(iPad) && ProfileManager.IsSignedInLive(iPad) ) + { + app.DebugPrintf("JoinFromInvite_SignInReturned, passed sign-in tests\n"); + int localUsersMask = 0; + int joiningUsers = 0; + + bool noPrivileges = false; + for(unsigned int index = 0; index < XUSER_MAX_COUNT; ++index) + { + if(ProfileManager.IsSignedIn(index) ) + { + ++joiningUsers; + if( !ProfileManager.AllowedToPlayMultiplayer(index) ) noPrivileges = true; + localUsersMask |= GetLocalPlayerMask( index ); + } + } + + // Check if user-created content is allowed, as we cannot play multiplayer if it's not + bool noUGC = false; +#if defined(__PS3__) || defined(__PSVITA__) + ProfileManager.GetChatAndContentRestrictions(iPad,false,&noUGC,NULL,NULL); +#elif defined(__ORBIS__) + ProfileManager.GetChatAndContentRestrictions(iPad,false,NULL,&noUGC,NULL); +#endif + + if(noUGC) + { + int messageText = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL; + if(joiningUsers > 1) messageText = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL; + + ui.RequestUGCMessageBox(IDS_CONNECTION_FAILED, messageText); + } + else if(noPrivileges) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + } + else + { +#if defined(__ORBIS__) || defined(__PSVITA__) + bool chatRestricted = false; + ProfileManager.GetChatAndContentRestrictions(iPad,false,&chatRestricted,NULL,NULL); + if(chatRestricted) + { + ProfileManager.DisplaySystemMessage( 0, ProfileManager.GetPrimaryPad() ); + } +#endif + ProfileManager.SetLockedProfile(iPad); + ProfileManager.SetPrimaryPad(iPad); + + g_NetworkManager.SetLocalGame(false); + + // If the player was signed in before selecting play, we'll not have read the profile yet, so query the sign-in status to get this to happen + ProfileManager.QuerySigninStatus(); + + // 4J-PB - clear any previous connection errors + Minecraft::GetInstance()->clearConnectionFailed(); + + // change the minecraft player name + Minecraft::GetInstance()->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); + + bool success = g_NetworkManager.JoinGameFromInviteInfo( + iPad, // dwUserIndex + localUsersMask, // dwUserMask + pInviteInfo ); // pInviteInfo + if( !success ) + { + app.DebugPrintf( "Failed joining game from invite\n" ); + } + } + } + else + { + app.DebugPrintf("JoinFromInvite_SignInReturned, failed sign-in tests :%d %d\n",ProfileManager.IsSignedIn(iPad),ProfileManager.IsSignedInLive(iPad)); + } + } + return 0; + +} + +void CGameNetworkManager::UpdateAndSetGameSessionData(INetworkPlayer *pNetworkPlayerLeaving) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + TexturePack *tPack = pMinecraft->skins->getSelected(); + s_pPlatformNetworkManager->SetSessionTexturePackParentId( tPack->getDLCParentPackId() ); + s_pPlatformNetworkManager->SetSessionSubTexturePackId( tPack->getDLCSubPackId() ); + + s_pPlatformNetworkManager->UpdateAndSetGameSessionData( pNetworkPlayerLeaving ); +} + +void CGameNetworkManager::SendInviteGUI(int quadrant) +{ + s_pPlatformNetworkManager->SendInviteGUI(quadrant); +} + +void CGameNetworkManager::ResetLeavingGame() +{ + s_pPlatformNetworkManager->ResetLeavingGame(); +} + +bool CGameNetworkManager::IsNetworkThreadRunning() +{ + return m_bNetworkThreadRunning;; +} + +int CGameNetworkManager::RunNetworkGameThreadProc( void* lpParameter ) +{ + // Share AABB & Vec3 pools with default (main thread) - should be ok as long as we don't tick the main thread whilst this thread is running + AABB::UseDefaultThreadStorage(); + Vec3::UseDefaultThreadStorage(); + Compression::UseDefaultThreadStorage(); + Tile::CreateNewThreadStorage(); + IntCache::CreateNewThreadStorage(); + + g_NetworkManager.m_bNetworkThreadRunning = true; + bool success = g_NetworkManager._RunNetworkGame(lpParameter); + g_NetworkManager.m_bNetworkThreadRunning = false; + if( !success) + { + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + while ( tPack->isLoadingData() || (Minecraft::GetInstance()->skins->needsUIUpdate() || ui.IsReloadingSkin()) ) + { + Sleep(1); + } + ui.CleanUpSkinReload(); + if(app.GetDisconnectReason() == DisconnectPacket::eDisconnect_None) + { + app.SetDisconnectReason( DisconnectPacket::eDisconnect_ConnectionCreationFailed ); + } + // If we failed before the server started, clear the game rules. Otherwise the server will clear it up. + if(MinecraftServer::getInstance() == NULL) app.m_gameRules.unloadCurrentGameRules(); + Tile::ReleaseThreadStorage(); + return -1; + } + +#ifdef __PSVITA__ + // 4J-JEV: Wait for the loading/saving to finish. + while (StorageManager.GetSaveState() != C4JStorage::ESaveGame_Idle) Sleep(10); +#endif + + Tile::ReleaseThreadStorage(); + IntCache::ReleaseThreadStorage(); + return 0; +} + +int CGameNetworkManager::ServerThreadProc( void* lpParameter ) +{ + __int64 seed = 0; + if(lpParameter != NULL) + { + NetworkGameInitData *param = (NetworkGameInitData *)lpParameter; + seed = param->seed; + app.SetGameHostOption(eGameHostOption_All,param->settings); + } + + SetThreadName(-1, "Minecraft Server thread"); + AABB::CreateNewThreadStorage(); + Vec3::CreateNewThreadStorage(); + IntCache::CreateNewThreadStorage(); + Compression::UseDefaultThreadStorage(); + OldChunkStorage::UseDefaultThreadStorage(); + Entity::useSmallIds(); + Level::enableLightingCache(); + Tile::CreateNewThreadStorage(); + + MinecraftServer::main(seed, lpParameter); //saveData, app.GetGameHostOption(eGameHostOption_All)); + + Tile::ReleaseThreadStorage(); + AABB::ReleaseThreadStorage(); + Vec3::ReleaseThreadStorage(); + IntCache::ReleaseThreadStorage(); + Level::destroyLightingCache(); + + if(lpParameter != NULL) delete lpParameter; + + return S_OK; +} + +int CGameNetworkManager::ExitAndJoinFromInviteThreadProc( void* lpParam ) +{ + // Share AABB & Vec3 pools with default (main thread) - should be ok as long as we don't tick the main thread whilst this thread is running + AABB::UseDefaultThreadStorage(); + Vec3::UseDefaultThreadStorage(); + Compression::UseDefaultThreadStorage(); + + //app.SetGameStarted(false); + +#ifndef __PSVITA__ + UIScene_PauseMenu::_ExitWorld(NULL); +#endif + + while( g_NetworkManager.IsInSession() ) + { + Sleep(1); + } + + // Xbox should always be online when receiving invites - on PS3 we need to check & ask the user to sign in +#ifndef __PS3__ + JoinFromInviteData *inviteData = (JoinFromInviteData *)lpParam; + app.SetAction(inviteData->dwUserIndex, eAppAction_JoinFromInvite, lpParam); +#else + if(ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())) + { + JoinFromInviteData *inviteData = (JoinFromInviteData *)lpParam; + app.SetAction(inviteData->dwUserIndex, eAppAction_JoinFromInvite, lpParam); + } + else + { + UINT uiIDA[2]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CGameNetworkManager::MustSignInReturned_0,lpParam, app.GetStringTable()); + } +#endif + + return S_OK; +} + +#if defined __PS3__ || defined __PSVITA__ || defined __ORBIS__ +// This case happens when we have been returned from the game to the main menu after receiving an invite and are now trying to go back in to join the new game +// The pair of methods MustSignInReturned_0 & PSNSignInReturned_0 handle this +int CGameNetworkManager::MustSignInReturned_0(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + if(result==C4JStorage::EMessage_ResultAccept) + { +#ifdef __PS3__ + SQRNetworkManager_PS3::AttemptPSNSignIn(&CGameNetworkManager::PSNSignInReturned_0, pParam,true); +#elif defined __PSVITA__ + SQRNetworkManager_Vita::AttemptPSNSignIn(&CGameNetworkManager::PSNSignInReturned_0, pParam,true); +#elif defined __ORBIS__ + SQRNetworkManager_Orbis::AttemptPSNSignIn(&CGameNetworkManager::PSNSignInReturned_0, pParam,true); +#endif + } + else + { + app.SetAction(0,eAppAction_Idle); + ui.NavigateToHomeMenu(); + ui.UpdatePlayerBasePositions(); + } + + return 0; +} + +int CGameNetworkManager::PSNSignInReturned_0(void* pParam, bool bContinue, int iPad) +{ + JoinFromInviteData *inviteData = (JoinFromInviteData *)pParam; + + // If the invite data isn't set up yet (indicated by it being all zeroes, easiest detected via the net version), then try and get it again... this can happen if we got + // the invite whilst signed out + + if( bContinue ) + { + if(inviteData->pInviteInfo->netVersion == 0) + { +#if defined __PS3__ || defined __VITA__ + if(!SQRNetworkManager_PS3::UpdateInviteData((SQRNetworkManager::PresenceSyncInfo *)inviteData->pInviteInfo)) + { + bContinue = false; + } +#elif defined __ORBIS__ + // TODO: No Orbis equivalent (should there be?) +#endif + } + } + + if( bContinue ) + { + app.SetAction(inviteData->dwUserIndex, eAppAction_JoinFromInvite, pParam); + } + else + { + app.SetAction(inviteData->dwUserIndex,eAppAction_Idle); + ui.NavigateToHomeMenu(); + ui.UpdatePlayerBasePositions(); + } + + return 0; +} + +// This case happens when we were in the main menus when we got an invite, and weren't signed in... now can proceed with the normal flow of code for this situation +// The pair of methods MustSignInReturned_1 & PSNSignInReturned_1 handle this +int CGameNetworkManager::MustSignInReturned_1(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + if(result==C4JStorage::EMessage_ResultAccept) + { +#ifdef __PS3__ + SQRNetworkManager_PS3::AttemptPSNSignIn(&CGameNetworkManager::PSNSignInReturned_1, pParam,true); +#elif defined __PSVITA__ + SQRNetworkManager_Vita::AttemptPSNSignIn(&CGameNetworkManager::PSNSignInReturned_1, pParam,true); +#elif defined __ORBIS__ + SQRNetworkManager_Orbis::AttemptPSNSignIn(&CGameNetworkManager::PSNSignInReturned_1, pParam,true); +#endif + } + return 0; +} + +int CGameNetworkManager::PSNSignInReturned_1(void* pParam, bool bContinue, int iPad) +{ + INVITE_INFO *inviteInfo = (INVITE_INFO *)pParam; + + // If the invite data isn't set up yet (indicated by it being all zeroes, easiest detected via the net version), then try and get it again... this can happen if we got + // the invite whilst signed out + + if( bContinue ) + { + if(inviteInfo->netVersion == 0) + { +#if defined __PS3__ || defined __VITA__ + if(!SQRNetworkManager_PS3::UpdateInviteData((SQRNetworkManager::PresenceSyncInfo *)inviteInfo)) + { + bContinue = false; + } +#elif defined __ORBIS__ + // TODO: No Orbis equivalent (should there be?) +#endif + + } + } + + if( bContinue ) + { + g_NetworkManager.HandleInviteWhenInMenus(0, inviteInfo); + } + + return 0; +} +#endif + +void CGameNetworkManager::_LeaveGame() +{ + s_pPlatformNetworkManager->_LeaveGame(false, true); +} + +int CGameNetworkManager::ChangeSessionTypeThreadProc( void* lpParam ) +{ + // Share AABB & Vec3 pools with default (main thread) - should be ok as long as we don't tick the main thread whilst this thread is running + AABB::UseDefaultThreadStorage(); + Vec3::UseDefaultThreadStorage(); + Compression::UseDefaultThreadStorage(); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + MinecraftServer *pServer = MinecraftServer::getInstance(); + +#if defined(__PS3__) || defined(__ORBIS__) || defined __PSVITA__ + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + if( g_NetworkManager.m_bLastDisconnectWasLostRoomOnly ) + { + if(g_NetworkManager.m_bSignedOutofPSN) + { + C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME, IDS_ERROR_PSN_SIGN_OUT, uiIDA,1,ProfileManager.GetPrimaryPad()); + } + else + { + C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME, uiIDA,1,ProfileManager.GetPrimaryPad()); + } + } + else + { + C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_CONNECTION_LOST, g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT), uiIDA,1,ProfileManager.GetPrimaryPad()); + } + + // Swap these two messages around as one is too long to display at 480 + pMinecraft->progressRenderer->progressStartNoAbort( IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME ); + pMinecraft->progressRenderer->progressStage( -1 ); //g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT) ); +#elif defined(_XBOX_ONE) + if( g_NetworkManager.m_bFullSessionMessageOnNextSessionChange ) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME, IDS_IN_PARTY_SESSION_FULL, uiIDA,1,ProfileManager.GetPrimaryPad()); + pMinecraft->progressRenderer->progressStartNoAbort( IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME ); + pMinecraft->progressRenderer->progressStage( -1 ); + } + else + { + pMinecraft->progressRenderer->progressStartNoAbort( g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT) ); + pMinecraft->progressRenderer->progressStage( IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME ); + } + +#else + pMinecraft->progressRenderer->progressStartNoAbort( g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT) ); + pMinecraft->progressRenderer->progressStage( IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME ); +#endif + + while( app.GetXuiServerAction(ProfileManager.GetPrimaryPad() ) != eXuiServerAction_Idle && !MinecraftServer::serverHalted() ) + { + Sleep(10); + } + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)TRUE); + + // wait for the server to be in a non-ticking state + pServer->m_serverPausedEvent->WaitForSignal(INFINITE); + +#if defined(__PS3__) || defined(__ORBIS__) || defined __PSVITA__ + // Swap these two messages around as one is too long to display at 480 + pMinecraft->progressRenderer->progressStartNoAbort( IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME ); + pMinecraft->progressRenderer->progressStage( -1 ); //g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT) ); +#elif defined(_XBOX_ONE) + if( g_NetworkManager.m_bFullSessionMessageOnNextSessionChange ) + { + pMinecraft->progressRenderer->progressStartNoAbort( IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME ); + pMinecraft->progressRenderer->progressStage( -1 ); + } + else + { + pMinecraft->progressRenderer->progressStartNoAbort( g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT) ); + pMinecraft->progressRenderer->progressStage( IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME ); + } +#else + pMinecraft->progressRenderer->progressStartNoAbort( g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT) ); + pMinecraft->progressRenderer->progressStage( IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME ); +#endif + + pMinecraft->progressRenderer->progressStagePercentage(25); + +#ifdef _XBOX_ONE + // wait for any players that were being added, to finish doing this. On XB1, if we don't do this then there's an async thread running doing this, + // which could then finish at any inappropriate time later + while( s_pPlatformNetworkManager->IsAddingPlayer() ) + { + Sleep(1); + } +#endif + + // Null the network player of all the server players that are local, to stop them being removed from the server when removed from the session + if( pServer != NULL ) + { + PlayerList *players = pServer->getPlayers(); + for(AUTO_VAR(it, players->players.begin()); it < players->players.end(); ++it) + { + shared_ptr servPlayer = *it; + if( servPlayer->connection->isLocal() && !servPlayer->connection->isGuest() ) + { + servPlayer->connection->connection->getSocket()->setPlayer(NULL); + } + } + } + + // delete the current session - if we weren't actually disconnected fully from the network but have just lost our room, then pass a bLeaveRoom flag of false + // here as by definition we don't need to leave the room (again). This is currently only an issue for sony platforms. + if( g_NetworkManager.m_bLastDisconnectWasLostRoomOnly ) + { + s_pPlatformNetworkManager->_LeaveGame(false, false); + } + else + { + s_pPlatformNetworkManager->_LeaveGame(false, true); + } + + // wait for the current session to end + while( g_NetworkManager.IsInSession() ) + { + Sleep(1); + } + + // Reset this flag as the we don't need to know that we only lost the room only from this point onwards, the behaviour is exactly the same + g_NetworkManager.m_bLastDisconnectWasLostRoomOnly = false; + g_NetworkManager.m_bFullSessionMessageOnNextSessionChange = false; + + pMinecraft->progressRenderer->progressStagePercentage(50); + + // Defaulting to making this a local game + g_NetworkManager.SetLocalGame(true); + + // Create a new session with all the players that were in the old one + int localUsersMask = 0; + char numLocalPlayers = 0; + for(unsigned int index = 0; index < XUSER_MAX_COUNT; ++index) + { + if(ProfileManager.IsSignedIn(index) && pMinecraft->localplayers[index] != NULL ) + { + numLocalPlayers++; + localUsersMask |= GetLocalPlayerMask(index); + } + } + + s_pPlatformNetworkManager->_HostGame( localUsersMask ); + + pMinecraft->progressRenderer->progressStagePercentage(75); + + // Wait for all the local players to rejoin the session + while( g_NetworkManager.GetPlayerCount() < numLocalPlayers ) + { + Sleep(1); + } + + // Restore the network player of all the server players that are local + if( pServer != NULL ) + { + for(unsigned int index = 0; index < XUSER_MAX_COUNT; ++index) + { + if(ProfileManager.IsSignedIn(index) && pMinecraft->localplayers[index] != NULL ) + { + PlayerUID localPlayerXuid = pMinecraft->localplayers[index]->getXuid(); + + PlayerList *players = pServer->getPlayers(); + for(AUTO_VAR(it, players->players.begin()); it < players->players.end(); ++it) + { + shared_ptr servPlayer = *it; + if( servPlayer->getXuid() == localPlayerXuid ) + { + servPlayer->connection->connection->getSocket()->setPlayer( g_NetworkManager.GetLocalPlayerByUserIndex(index) ); + } + } + + // Player might have a pending connection + if (pMinecraft->m_pendingLocalConnections[index] != NULL) + { + // Update the network player + pMinecraft->m_pendingLocalConnections[index]->getConnection()->getSocket()->setPlayer(g_NetworkManager.GetLocalPlayerByUserIndex(index)); + } + } + } + } + + pMinecraft->progressRenderer->progressStagePercentage(100); + +#ifndef _XBOX + // Make sure that we have transitioned through any joining/creating stages so we're actually ready to set to play + while(!s_pPlatformNetworkManager->IsReadyToPlayOrIdle()) + { + Sleep(10); + } +#endif + + s_pPlatformNetworkManager->_StartGame(); + +#ifndef _XBOX + // Wait until the message box has been closed + while(ui.IsSceneInStack(XUSER_INDEX_ANY, eUIScene_MessageBox)) + { + Sleep(10); + } +#endif + + // Start the game again + app.SetGameStarted(true); + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)FALSE); + app.SetChangingSessionType(false); + app.SetReallyChangingSessionType(false); + + return S_OK; + +} + +void CGameNetworkManager::SystemFlagSet(INetworkPlayer *pNetworkPlayer, int index) +{ + s_pPlatformNetworkManager->SystemFlagSet( pNetworkPlayer, index ); +} + +bool CGameNetworkManager::SystemFlagGet(INetworkPlayer *pNetworkPlayer, int index) +{ + return s_pPlatformNetworkManager->SystemFlagGet( pNetworkPlayer, index ); +} + +wstring CGameNetworkManager::GatherStats() +{ + return s_pPlatformNetworkManager->GatherStats(); +} + +void CGameNetworkManager::renderQueueMeter() +{ +#ifdef _XBOX + int height = 720; + + CGameNetworkManager::byteQueue[(CGameNetworkManager::messageQueuePos) & (CGameNetworkManager::messageQueue_length - 1)] = GetHostPlayer()->GetSendQueueSizeBytes(NULL, false); + CGameNetworkManager::messageQueue[(CGameNetworkManager::messageQueuePos++) & (CGameNetworkManager::messageQueue_length - 1)] = GetHostPlayer()->GetSendQueueSizeMessages(NULL, false); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->gui->renderGraph(CGameNetworkManager::messageQueue_length, CGameNetworkManager::messageQueuePos, CGameNetworkManager::messageQueue, 10, 1000, CGameNetworkManager::byteQueue, 100, 25000); +#endif +} + +wstring CGameNetworkManager::GatherRTTStats() +{ + return s_pPlatformNetworkManager->GatherRTTStats(); +} + +void CGameNetworkManager::StateChange_AnyToHosting() +{ + app.DebugPrintf("Disabling Guest Signin\n"); + XEnableGuestSignin(FALSE); + Minecraft::GetInstance()->clearPendingClientTextureRequests(); +} + +void CGameNetworkManager::StateChange_AnyToJoining() +{ + app.DebugPrintf("Disabling Guest Signin\n"); + XEnableGuestSignin(FALSE); + Minecraft::GetInstance()->clearPendingClientTextureRequests(); + + ConnectionProgressParams *param = new ConnectionProgressParams(); + param->iPad = ProfileManager.GetPrimaryPad(); + param->stringId = -1; + param->showTooltips = false; + param->setFailTimer = true; + param->timerTime = CONNECTING_PROGRESS_CHECK_TIME; + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(), eUIScene_ConnectingProgress, param); +} + +void CGameNetworkManager::StateChange_JoiningToIdle(CPlatformNetworkManager::eJoinFailedReason reason) +{ + DisconnectPacket::eDisconnectReason disconnectReason; + switch(reason) + { + case CPlatformNetworkManager::JOIN_FAILED_SERVER_FULL: + disconnectReason = DisconnectPacket::eDisconnect_ServerFull; + break; + case CPlatformNetworkManager::JOIN_FAILED_INSUFFICIENT_PRIVILEGES: + disconnectReason = DisconnectPacket::eDisconnect_NoMultiplayerPrivilegesJoin; + app.SetAction(ProfileManager.GetPrimaryPad(),eAppAction_FailedToJoinNoPrivileges); + break; + default: + disconnectReason = DisconnectPacket::eDisconnect_ConnectionCreationFailed; + break; + }; + Minecraft::GetInstance()->connectionDisconnected(ProfileManager.GetPrimaryPad(), disconnectReason); +} + +void CGameNetworkManager::StateChange_AnyToStarting() +{ +#if defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ + app.getRemoteStorage()->shutdown(); // shut the remote storage lib down and hopefully get our 7mb back +#endif + + if(!g_NetworkManager.IsHost()) + { + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc; + loadingParams->lpParam = NULL; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; + completionData->iPad = ProfileManager.GetPrimaryPad(); + loadingParams->completionData = completionData; + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); + } +} + +void CGameNetworkManager::StateChange_AnyToEnding(bool bStateWasPlaying) +{ + // Kick off a stats write for players that are signed into LIVE, if this is a local game + if( bStateWasPlaying && g_NetworkManager.IsLocalGame() ) + { + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + INetworkPlayer *pNetworkPlayer = g_NetworkManager.GetLocalPlayerByUserIndex(i); + if(pNetworkPlayer != NULL && ProfileManager.IsSignedIn( i ) ) + { + app.DebugPrintf("Stats save for an offline game for the player at index %d\n", i ); + Minecraft::GetInstance()->forceStatsSave(pNetworkPlayer->GetUserIndex()); + } + } + } + + Minecraft::GetInstance()->gui->clearMessages(); + + if(!g_NetworkManager.IsHost() && !g_NetworkManager.IsLeavingGame() ) + { + // 4J Stu - If the host is saving then it might take a while to quite the session, so do it ourself + //m_bLeavingGame = true; + + // The host has notified that the game is about to end + if(app.GetDisconnectReason() == DisconnectPacket::eDisconnect_None) app.SetDisconnectReason( DisconnectPacket::eDisconnect_Quitting ); + app.SetAction(ProfileManager.GetPrimaryPad(),eAppAction_ExitWorld,(void *)TRUE); + } +} + +void CGameNetworkManager::StateChange_AnyToIdle() +{ + app.DebugPrintf("Enabling Guest Signin\n"); + XEnableGuestSignin(TRUE); + // Reset this here so that we can search for games again + // 4J Stu - If we are changing session type there is a race between that thread setting the game to local, and this setting it to not local + if(!app.GetChangingSessionType()) g_NetworkManager.SetLocalGame( false ); + +} + +void CGameNetworkManager::CreateSocket( INetworkPlayer *pNetworkPlayer, bool localPlayer ) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + + Socket *socket = NULL; + shared_ptr mpPlayer = pMinecraft->localplayers[pNetworkPlayer->GetUserIndex()]; + if( localPlayer && mpPlayer != NULL && mpPlayer->connection != NULL) + { + // If we already have a MultiplayerLocalPlayer here then we are doing a session type change + socket = mpPlayer->connection->getSocket(); + + // Pair this socket and network player + pNetworkPlayer->SetSocket( socket); + if( socket ) + { + socket->setPlayer( pNetworkPlayer ); + } + } + else + { + socket = new Socket( pNetworkPlayer, g_NetworkManager.IsHost(), g_NetworkManager.IsHost() && localPlayer ); + pNetworkPlayer->SetSocket( socket ); + + // 4J Stu - May be other states we want to accept aswell + // Add this user to the game server if the game is started already + if( g_NetworkManager.IsHost() && g_NetworkManager.IsInGameplay() ) + { + Socket::addIncomingSocket(socket); + } + + // If this is a local player and we are already in the game, we need to setup a local connection and log + // the player in to the game server + if( localPlayer && g_NetworkManager.IsInGameplay() ) + { + int idx = pNetworkPlayer->GetUserIndex(); + app.DebugPrintf("Creating new client connection for idx: %d\n", idx); + + ClientConnection *connection; + connection = new ClientConnection(pMinecraft, socket, idx); + + if( connection->createdOk ) + { + connection->send( shared_ptr( new PreLoginPacket( pNetworkPlayer->GetOnlineName() ) ) ); + pMinecraft->addPendingLocalConnection(idx, connection); + } + else + { + pMinecraft->connectionDisconnected( idx , DisconnectPacket::eDisconnect_ConnectionCreationFailed ); + delete connection; + connection = NULL; + } + } + } + +} + +void CGameNetworkManager::CloseConnection( INetworkPlayer *pNetworkPlayer ) +{ + MinecraftServer *server = MinecraftServer::getInstance(); + if( server != NULL ) + { + PlayerList *players = server->getPlayers(); + if( players != NULL ) + { + players->closePlayerConnectionBySmallId(pNetworkPlayer->GetSmallId()); + } + } +} + +void CGameNetworkManager::PlayerJoining( INetworkPlayer *pNetworkPlayer ) +{ + if (g_NetworkManager.IsInGameplay()) // 4J-JEV: Wait to do this at StartNetworkGame if not in-game yet. + { + // 4J-JEV: Update RichPresence when a player joins the game. + bool multiplayer = g_NetworkManager.GetPlayerCount() > 1, localgame = g_NetworkManager.IsLocalGame(); + for (int iPad=0; iPadIsLocal() ) + { + TelemetryManager->RecordPlayerSessionStart(pNetworkPlayer->GetUserIndex()); + } +#ifdef _XBOX + else + { + if( !pNetworkPlayer->IsHost() ) + { + for(int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if(Minecraft::GetInstance()->localplayers[idx] != NULL) + { + TelemetryManager->RecordLevelStart(idx, eSen_FriendOrMatch_Playing_With_Invited_Friends, eSen_CompeteOrCoop_Coop_and_Competitive, Minecraft::GetInstance()->level->difficulty, app.GetLocalPlayerCount(), g_NetworkManager.GetOnlinePlayerCount()); + } + } + } + } +#endif +} + +void CGameNetworkManager::PlayerLeaving( INetworkPlayer *pNetworkPlayer ) +{ + if( pNetworkPlayer->IsLocal() ) + { + ProfileManager.SetCurrentGameActivity(pNetworkPlayer->GetUserIndex(),CONTEXT_PRESENCE_IDLE,false); + + TelemetryManager->RecordPlayerSessionExit(pNetworkPlayer->GetUserIndex(), app.GetDisconnectReason()); + } +#ifdef _XBOX + else + { + for(int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if(Minecraft::GetInstance()->localplayers[idx] != NULL) + { + TelemetryManager->RecordLevelStart(idx, eSen_FriendOrMatch_Playing_With_Invited_Friends, eSen_CompeteOrCoop_Coop_and_Competitive, Minecraft::GetInstance()->level->difficulty, app.GetLocalPlayerCount(), g_NetworkManager.GetOnlinePlayerCount()); + } + } + } +#endif +} + +void CGameNetworkManager::HostChanged() +{ + // Disable host migration + app.SetAction(ProfileManager.GetPrimaryPad(),eAppAction_ExitWorld,(void *)TRUE); +} + +void CGameNetworkManager::WriteStats( INetworkPlayer *pNetworkPlayer ) +{ + Minecraft::GetInstance()->forceStatsSave( pNetworkPlayer->GetUserIndex() ); +} + +void CGameNetworkManager::GameInviteReceived( int userIndex, const INVITE_INFO *pInviteInfo) +{ +#ifdef __ORBIS__ + if (m_pUpsell != NULL) + { + delete pInviteInfo; + return; + } + + // Need to check we're signed in to PSN + bool isSignedInLive = true; + bool isLocalMultiplayerAvailable = app.IsLocalMultiplayerAvailable(); + int iPadNotSignedInLive = -1; + for(unsigned int i = 0; i < XUSER_MAX_COUNT; i++) + { + if (ProfileManager.IsSignedIn(i) && (i == ProfileManager.GetPrimaryPad() || isLocalMultiplayerAvailable)) + { + if (isSignedInLive && !ProfileManager.IsSignedInLive(i)) + { + // Record the first non signed in live pad + iPadNotSignedInLive = i; + } + + isSignedInLive = isSignedInLive && ProfileManager.IsSignedInLive(i); + } + } + + if (!isSignedInLive) + { + // Determine why they're not "signed in live" + + // Check if PSN is unavailable because of age restriction + int npAvailability = ProfileManager.getNPAvailability(iPadNotSignedInLive); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive if the npAvailability isn't SCE_OK + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive, NULL, NULL, app.GetStringTable()); + } + else if (ProfileManager.isSignedInPSN(iPadNotSignedInLive)) + { + // Signed in to PSN but not connected (no internet access) + assert(!ProfileManager.isConnectedToPSN(iPadNotSignedInLive)); + + UINT uiIDA[1]; + uiIDA[0] = IDS_OK; + ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPadNotSignedInLive, NULL, NULL, app.GetStringTable()); + } + else + { + // Not signed in to PSN + UINT uiIDA[1]; + uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; + ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, iPadNotSignedInLive, &CGameNetworkManager::MustSignInReturned_1, (void *)pInviteInfo, app.GetStringTable(), NULL, 0, false); + } + return; + } + + // 4J-JEV: Check that all players are authorised for PsPlus, present upsell to players that aren't and try again. + for (unsigned int index = 0; index < XUSER_MAX_COUNT; index++) + { + if ( ProfileManager.IsSignedIn(index) + && !ProfileManager.HasPlayStationPlus(userIndex) ) + { + m_pInviteInfo = (INVITE_INFO *) pInviteInfo; + m_iPlayerInvited = userIndex; + + m_pUpsell = new PsPlusUpsellWrapper(index); + m_pUpsell->displayUpsell(); + + return; + } + } +#endif + +#ifdef __PSVITA__ + // Need to check we're signed in to PSN + bool isSignedInLive = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()); + if (!isSignedInLive) + { + // Determine why they're not "signed in live" + // MGH - we need to add a new message at some point for connecting when already signed in +// if (ProfileManager.IsSignedInPSN(ProfileManager.GetPrimaryPad())) +// { +// // Signed in to PSN but not connected (no internet access) +// UINT uiIDA[1]; +// uiIDA[0] = IDS_OK; +// ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, ProfileManager.GetPrimaryPad(), NULL, NULL, app.GetStringTable()); +// } +// else + { + // Not signed in to PSN + UINT uiIDA[1]; + uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; + ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), &CGameNetworkManager::MustSignInReturned_1, (void *)pInviteInfo, app.GetStringTable(), NULL, 0, false); + } + return; + } +#endif + + + int localUsersMask = 0; + Minecraft *pMinecraft = Minecraft::GetInstance(); + int joiningUsers = 0; + + bool noPrivileges = false; + for(unsigned int index = 0; index < XUSER_MAX_COUNT; ++index) + { + if(ProfileManager.IsSignedIn(index) ) + { + // 4J-PB we shouldn't bring any inactive players into the game, except for the invited player (who may be an inactive player) + // 4J Stu - If we are not in a game, then bring in all players signed in + if(index==userIndex || pMinecraft->localplayers[index]!=NULL ) + { + ++joiningUsers; + if( !ProfileManager.AllowedToPlayMultiplayer(index) ) noPrivileges = true; + localUsersMask |= GetLocalPlayerMask( index ); + } + } + } + + // Check if user-created content is allowed, as we cannot play multiplayer if it's not + bool noUGC = false; + bool bContentRestricted=false; + BOOL pccAllowed = TRUE; + BOOL pccFriendsAllowed = TRUE; +#if defined(__PS3__) || defined(__PSVITA__) + ProfileManager.GetChatAndContentRestrictions(userIndex,false,&noUGC,&bContentRestricted,NULL); +#else + ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); + if(!pccAllowed && !pccFriendsAllowed) noUGC = true; +#endif + +#if defined(_XBOX) || defined(__PS3__) + if(joiningUsers > 1 && !RenderManager.IsHiDef() && userIndex != ProfileManager.GetPrimaryPad()) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + + // 4J-PB - it's possible there is no primary pad here, when accepting an invite from the dashboard + ui.RequestMessageBox( IDS_CONNECTION_FAILED, IDS_CONNECTION_FAILED_NO_SD_SPLITSCREEN, uiIDA,1,XUSER_INDEX_ANY,NULL,NULL, app.GetStringTable()); + } + else +#endif + + if( noUGC ) + { + int messageText = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL; + if(joiningUsers > 1) messageText = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL; + + ui.RequestUGCMessageBox(IDS_CONNECTION_FAILED, messageText, XUSER_INDEX_ANY); + } +#if defined(__PS3__) || defined __PSVITA__ + else if(bContentRestricted) + { + int messageText = IDS_CONTENT_RESTRICTION; + if(joiningUsers > 1) messageText = IDS_CONTENT_RESTRICTION_MULTIPLAYER; + + ui.RequestContentRestrictedMessageBox(IDS_CONNECTION_FAILED, messageText, XUSER_INDEX_ANY); + } +#endif + else if(noPrivileges) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + + // 4J-PB - it's possible there is no primary pad here, when accepting an invite from the dashboard + //StorageManager.RequestMessageBox( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + ui.RequestMessageBox( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,XUSER_INDEX_ANY,NULL,NULL, app.GetStringTable()); + } + else + { +#if defined(__ORBIS__) || defined(__PSVITA__) + bool chatRestricted = false; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),false,&chatRestricted,NULL,NULL); + if(chatRestricted) + { + ProfileManager.DisplaySystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION, ProfileManager.GetPrimaryPad() ); + } +#endif + if( !g_NetworkManager.IsInSession() ) + { +#ifndef __PS3__ + HandleInviteWhenInMenus(userIndex, pInviteInfo); +#else + // PS3 is more complicated here - we need to make sure that the player is online. If they are then we can do the same as the xbox, if not we need to try and get them online and then, if they do sign in, go down the same path + if(ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())) + { + HandleInviteWhenInMenus(userIndex, pInviteInfo); + } + else + { + UINT uiIDA[2]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CGameNetworkManager::MustSignInReturned_1,(void *)pInviteInfo, app.GetStringTable()); + } +#endif + } + else + { + app.DebugPrintf("We are already in a multiplayer game...need to leave it\n"); + +// JoinFromInviteData *joinData = new JoinFromInviteData(); +// joinData->dwUserIndex = dwUserIndex; +// joinData->dwLocalUsersMask = dwLocalUsersMask; +// joinData->pInviteInfo = pInviteInfo; + + // tell the app to process this +#ifdef __PSVITA__ + if(((CPlatformNetworkManagerSony*)s_pPlatformNetworkManager)->checkValidInviteData(pInviteInfo)) +#endif + { + app.ProcessInvite(userIndex,localUsersMask,pInviteInfo); + } + } + } +} + +volatile bool waitHere = true; + +void CGameNetworkManager::HandleInviteWhenInMenus( int userIndex, const INVITE_INFO *pInviteInfo) +{ + // We are in the root menus somewhere + +#if 0 + while( waitHere ) + { + Sleep(1); + } +#endif + + // if this is the trial game, then we need the user to unlock the full game + if(!ProfileManager.IsFullVersion()) + { + // The marketplace will fail with the primary player set to -1 + ProfileManager.SetPrimaryPad(userIndex); + + app.SetAction(userIndex,eAppAction_DashboardTrialJoinFromInvite); + } + else + { + ProfileManager.SetPrimaryPad(userIndex); + + // 4J Stu - If we accept an invite from the main menu before going to play game we need to load the DLC + // These checks are done within the StartInstallDLCProcess - (!app.DLCInstallProcessCompleted() && !app.DLCInstallPending()) app.StartInstallDLCProcess(dwUserIndex); + app.StartInstallDLCProcess(userIndex); + + // 4J Stu - Fix for #10936 - MP Lab: TCR 001: Matchmaking: Player is stuck in a soft-locked state after selecting the guest account when prompted + // The locked profile should not be changed if we are in menus as the main player might sign out in the sign-in ui + //ProfileManager.SetLockedProfile(-1); + + if(!app.IsLocalMultiplayerAvailable()) + { + bool noPrivileges=!ProfileManager.AllowedToPlayMultiplayer(userIndex); + + if(noPrivileges) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + } + else + { + ProfileManager.SetLockedProfile(userIndex); + ProfileManager.SetPrimaryPad(userIndex); + + int localUsersMask=0; + localUsersMask |= GetLocalPlayerMask( userIndex ); + + // If the player was signed in before selecting play, we'll not have read the profile yet, so query the sign-in status to get this to happen + ProfileManager.QuerySigninStatus(); + + // 4J-PB - clear any previous connection errors + Minecraft::GetInstance()->clearConnectionFailed(); + + g_NetworkManager.SetLocalGame(false); + + // change the minecraft player name + Minecraft::GetInstance()->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); + + bool success = g_NetworkManager.JoinGameFromInviteInfo( userIndex, localUsersMask, pInviteInfo ); + if( !success ) + { + app.DebugPrintf( "Failed joining game from invite\n" ); + } + } + } + else + { + // the FromInvite will make the lib decide how many panes to display based on connected pads/signed in players +#ifdef _XBOX + ProfileManager.RequestSignInUI(true, false, false, false, false,&CGameNetworkManager::JoinFromInvite_SignInReturned, (LPVOID)pInviteInfo,userIndex); +#else + SignInInfo info; + info.Func = &CGameNetworkManager::JoinFromInvite_SignInReturned; + info.lpParam = (LPVOID)pInviteInfo; + info.requireOnline = true; + app.DebugPrintf("Using fullscreen layer\n"); + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_QuadrantSignin,&info,eUILayer_Alert,eUIGroup_Fullscreen); +#endif + } + } +} + +void CGameNetworkManager::AddLocalPlayerFailed(int idx, bool serverFull/* = false*/) +{ + Minecraft::GetInstance()->connectionDisconnected(idx, serverFull ? DisconnectPacket::eDisconnect_ServerFull : DisconnectPacket::eDisconnect_ConnectionCreationFailed); +} + +#if defined __PS3__ || defined __PSVITA__ || defined __ORBIS__ +void CGameNetworkManager::HandleDisconnect(bool bLostRoomOnly,bool bPSNSignout) +#else +void CGameNetworkManager::HandleDisconnect(bool bLostRoomOnly) +#endif +{ + int iPrimaryPlayer = g_NetworkManager.GetPrimaryPad(); + + if((g_NetworkManager.GetLockedProfile()!=-1) && iPrimaryPlayer!=-1 && g_NetworkManager.IsInSession() ) + { + m_bLastDisconnectWasLostRoomOnly = bLostRoomOnly; +#if defined __PS3__ || defined __PSVITA__ || defined __ORBIS__ + m_bSignedOutofPSN=bPSNSignout; +#endif + app.SetAction(iPrimaryPlayer,eAppAction_EthernetDisconnected); + } + else + { + m_bLastDisconnectWasLostRoomOnly = false; + } +} + +int CGameNetworkManager::GetPrimaryPad() +{ + return ProfileManager.GetPrimaryPad(); +} + +int CGameNetworkManager::GetLockedProfile() +{ + return ProfileManager.GetLockedProfile(); +} + +bool CGameNetworkManager::IsSignedInLive(int playerIdx) +{ + return ProfileManager.IsSignedInLive(playerIdx); +} + +bool CGameNetworkManager::AllowedToPlayMultiplayer(int playerIdx) +{ + return ProfileManager.AllowedToPlayMultiplayer(playerIdx); +} + +char *CGameNetworkManager::GetOnlineName(int playerIdx) +{ + return ProfileManager.GetGamertag(playerIdx); +} + +void CGameNetworkManager::ServerReadyCreate(bool create) +{ + m_hServerReadyEvent = ( create ? ( new C4JThread::Event ) : NULL ); +} + +void CGameNetworkManager::ServerReady() +{ + m_hServerReadyEvent->Set(); +} + +void CGameNetworkManager::ServerReadyWait() +{ + m_hServerReadyEvent->WaitForSignal(INFINITE); +} + +void CGameNetworkManager::ServerReadyDestroy() +{ + delete m_hServerReadyEvent; + m_hServerReadyEvent = NULL; +} + +bool CGameNetworkManager::ServerReadyValid() +{ + return ( m_hServerReadyEvent != NULL ); +} + +void CGameNetworkManager::ServerStoppedCreate(bool create) +{ + m_hServerStoppedEvent = ( create ? ( new C4JThread::Event ) : NULL ); +} + +void CGameNetworkManager::ServerStopped() +{ + m_hServerStoppedEvent->Set(); +} + +void CGameNetworkManager::ServerStoppedWait() +{ + // If this is called from the main thread, then this won't be ticking anything which can mean that the storage manager state can't progress. + // This means that the server thread we are waiting on won't ever finish, as it might be locked waiting for this to complete itself. + // Do some ticking here then if this is the case. + if( C4JThread::isMainThread() ) + { + int result = WAIT_TIMEOUT; + do + { +#ifndef _XBOX + RenderManager.StartFrame(); +#endif + result = m_hServerStoppedEvent->WaitForSignal(20); + // Tick some simple things + ProfileManager.Tick(); + StorageManager.Tick(); + InputManager.Tick(); + RenderManager.Tick(); + ui.tick(); + ui.render(); + RenderManager.Present(); + } while( result == WAIT_TIMEOUT ); + } + else + { + m_hServerStoppedEvent->WaitForSignal(INFINITE); + } +} + +void CGameNetworkManager::ServerStoppedDestroy() +{ + delete m_hServerStoppedEvent; + m_hServerStoppedEvent = NULL; +} + +bool CGameNetworkManager::ServerStoppedValid() +{ + return ( m_hServerStoppedEvent != NULL ); +} + +int CGameNetworkManager::GetJoiningReadyPercentage() +{ + return s_pPlatformNetworkManager->GetJoiningReadyPercentage(); +} + +#ifndef _XBOX +void CGameNetworkManager::FakeLocalPlayerJoined() +{ + s_pPlatformNetworkManager->FakeLocalPlayerJoined(); +} +#endif + +#ifdef __PSVITA__ +bool CGameNetworkManager::usingAdhocMode() +{ + return ((CPlatformNetworkManagerSony*)s_pPlatformNetworkManager)->usingAdhocMode(); +} + +void CGameNetworkManager::setAdhocMode(bool bAdhoc) +{ + ((CPlatformNetworkManagerSony*)s_pPlatformNetworkManager)->setAdhocMode(bAdhoc); +} + +void CGameNetworkManager::startAdhocMatching() +{ + ((CPlatformNetworkManagerSony*)s_pPlatformNetworkManager)->startAdhocMatching(); +} + +#endif diff --git a/Minecraft.Client/Common/Network/GameNetworkManager.h b/Minecraft.Client/Common/Network/GameNetworkManager.h new file mode 100644 index 00000000..1bb532da --- /dev/null +++ b/Minecraft.Client/Common/Network/GameNetworkManager.h @@ -0,0 +1,236 @@ +#pragma once +using namespace std; +#include +#include +#include "..\..\..\Minecraft.World\C4JThread.h" +#include "NetworkPlayerInterface.h" +#ifdef _XBOX +#include "..\..\Xbox\Network\PlatformNetworkManagerXbox.h" +#elif defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ +#include "..\..\Common\Network\Sony\PlatformNetworkManagerSony.h" +#elif defined _DURANGO +#include "..\..\Durango\Network\PlatformNetworkManagerDurango.h" +#else +#include "PlatformNetworkManagerStub.h" +#endif +#include "SessionInfo.h" + +#ifdef __ORBIS__ +#include "..\..\Orbis\Network\PsPlusUpsellWrapper_Orbis.h" +#endif + +class ClientConnection; +class Minecraft; + + +// This class implements the game-side interface to the networking system. As such, it is platform independent and may contain bits of game-side code where appropriate. +// It shouldn't ever reference any platform specifics of the network implementation (eg QNET), rather it should interface with an implementation of PlatformNetworkManager to +// provide this functionality. + +class CGameNetworkManager +{ +#ifdef _XBOX + friend class CPlatformNetworkManagerXbox; +#elif defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ + friend class CPlatformNetworkManagerSony; +#elif defined _DURANGO + friend class CPlatformNetworkManagerDurango; +#else + friend class CPlatformNetworkManagerStub; +#endif +public: + CGameNetworkManager(); + // Misc high level flow + + typedef enum + { + JOINGAME_SUCCESS, + JOINGAME_FAIL_GENERAL, + JOINGAME_FAIL_SERVER_FULL + } eJoinGameResult; + + void Initialise(); + void Terminate(); + void DoWork(); + bool _RunNetworkGame(LPVOID lpParameter); + bool StartNetworkGame(Minecraft *minecraft, LPVOID lpParameter); + int CorrectErrorIDS(int IDS); + + // Player management + + static int GetLocalPlayerMask(int playerIndex); + int GetPlayerCount(); + int GetOnlinePlayerCount(); + bool AddLocalPlayerByUserIndex( int userIndex ); + bool RemoveLocalPlayerByUserIndex( int userIndex ); + INetworkPlayer *GetLocalPlayerByUserIndex(int userIndex ); + INetworkPlayer *GetPlayerByIndex(int playerIndex); + INetworkPlayer *GetPlayerByXuid(PlayerUID xuid); + INetworkPlayer *GetPlayerBySmallId(unsigned char smallId); + wstring GetDisplayNameByGamertag(wstring gamertag); + INetworkPlayer *GetHostPlayer(); + void RegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam); + void UnRegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam); + void HandleSignInChange(); + bool ShouldMessageForFullSession(); + + // State management + + bool IsInSession(); + bool IsInGameplay(); + bool IsLeavingGame(); + bool IsReadyToPlayOrIdle(); + + // Hosting and game type + + bool SetLocalGame(bool isLocal); + bool IsLocalGame(); + void SetPrivateGame(bool isPrivate); + bool IsPrivateGame(); + void HostGame(int localUsersMask, bool bOnlineGame, bool bIsPrivate, unsigned char publicSlots = MINECRAFT_NET_MAX_PLAYERS, unsigned char privateSlots = 0); + bool IsHost(); + bool IsInStatsEnabledSession(); + + // Client session discovery + + bool SessionHasSpace(unsigned int spaceRequired = 1); + vector *GetSessionList(int iPad, int localPlayers, bool partyOnly); + bool GetGameSessionInfo(int iPad, SessionID sessionId,FriendSessionInfo *foundSession); + void SetSessionsUpdatedCallback( void (*SessionsUpdatedCallback)(LPVOID pParam), LPVOID pSearchParam ); + void GetFullFriendSessionInfo( FriendSessionInfo *foundSession, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ); + void ForceFriendsSessionRefresh(); + + // Session joining and leaving + + bool JoinGameFromInviteInfo( int userIndex, int userMask, const INVITE_INFO *pInviteInfo); + eJoinGameResult JoinGame(FriendSessionInfo *searchResult, int localUsersMask); + static void CancelJoinGame(LPVOID lpParam); // Not part of the shared interface + bool LeaveGame(bool bMigrateHost); + static int JoinFromInvite_SignInReturned(void *pParam,bool bContinue, int iPad); + void UpdateAndSetGameSessionData(INetworkPlayer *pNetworkPlayerLeaving = NULL); + void SendInviteGUI(int iPad); + void ResetLeavingGame(); + + // Threads + + bool IsNetworkThreadRunning(); + static int RunNetworkGameThreadProc( void* lpParameter ); + static int ServerThreadProc( void* lpParameter ); + static int ExitAndJoinFromInviteThreadProc( void* lpParam ); + +#if (defined __PS3__) || (defined __ORBIS__) || (defined __PSVITA__) + static int MustSignInReturned_0(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int PSNSignInReturned_0(void* pParam, bool bContinue, int iPad); + + static int MustSignInReturned_1(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int PSNSignInReturned_1(void* pParam, bool bContinue, int iPad); +#endif + + static void _LeaveGame(); + static int ChangeSessionTypeThreadProc( void* lpParam ); + + // System flags + + void SystemFlagSet(INetworkPlayer *pNetworkPlayer, int index); + bool SystemFlagGet(INetworkPlayer *pNetworkPlayer, int index); + + // Events + + void ServerReadyCreate(bool create); // Create the signal (or set to NULL) + void ServerReady(); // Signal that we are ready + void ServerReadyWait(); // Wait for the signal + void ServerReadyDestroy(); // Destroy signal + bool ServerReadyValid(); // Is non-NULL + + void ServerStoppedCreate(bool create); // Create the signal + void ServerStopped(); // Signal that we are ready + void ServerStoppedWait(); // Wait for the signal + void ServerStoppedDestroy(); // Destroy signal + bool ServerStoppedValid(); // Is non-NULL + +#ifdef __PSVITA__ + static bool usingAdhocMode(); + static void setAdhocMode(bool bAdhoc); + static void startAdhocMatching(); +#endif + // Debug output + + wstring GatherStats(); + void renderQueueMeter(); + wstring GatherRTTStats(); + + // GUI debug output + + // Used for debugging output + static const int messageQueue_length = 512; + static __int64 messageQueue[messageQueue_length]; + static const int byteQueue_length = 512; + static __int64 byteQueue[byteQueue_length]; + static int messageQueuePos; + + // Methods called from PlatformNetworkManager +private: + void StateChange_AnyToHosting(); + void StateChange_AnyToJoining(); + void StateChange_JoiningToIdle(CPlatformNetworkManager::eJoinFailedReason reason); + void StateChange_AnyToStarting(); + void StateChange_AnyToEnding(bool bStateWasPlaying); + void StateChange_AnyToIdle(); + void CreateSocket( INetworkPlayer *pNetworkPlayer, bool localPlayer ); + void CloseConnection( INetworkPlayer *pNetworkPlayer ); + void PlayerJoining( INetworkPlayer *pNetworkPlayer ); + void PlayerLeaving( INetworkPlayer *pNetworkPlayer ); + void HostChanged(); + void WriteStats( INetworkPlayer *pNetworkPlayer ); + void GameInviteReceived( int userIndex, const INVITE_INFO *pInviteInfo); + void HandleInviteWhenInMenus( int userIndex, const INVITE_INFO *pInviteInfo); + void AddLocalPlayerFailed(int idx, bool serverFull = false); +#if defined __PS3__ || defined __PSVITA__ || defined __ORBIS__ + void HandleDisconnect(bool bLostRoomOnly,bool bPSNSignOut); +#else + void HandleDisconnect(bool bLostRoomOnly); +#endif + + int GetPrimaryPad(); + int GetLockedProfile(); + bool IsSignedInLive(int playerIdx); + bool AllowedToPlayMultiplayer(int playerIdx); + char *GetOnlineName(int playerIdx); + + C4JThread::Event* m_hServerStoppedEvent; + C4JThread::Event* m_hServerReadyEvent; + bool m_bInitialised; + +#ifdef _XBOX_ONE +public: + void SetFullSessionMessageOnNextSessionChange() { m_bFullSessionMessageOnNextSessionChange = true; } +#endif +private: + float m_lastPlayerEventTimeStart; // For telemetry + static CPlatformNetworkManager *s_pPlatformNetworkManager; + bool m_bNetworkThreadRunning; + int GetJoiningReadyPercentage(); + bool m_bLastDisconnectWasLostRoomOnly; + bool m_bFullSessionMessageOnNextSessionChange; +#if defined __PS3__ || defined __PSVITA__ || defined __ORBIS__ + bool m_bSignedOutofPSN; +#endif + +#ifdef __ORBIS__ + PsPlusUpsellWrapper *m_pUpsell; + INVITE_INFO *m_pInviteInfo; + int m_iPlayerInvited; +#endif + +public: +#ifndef _XBOX + void FakeLocalPlayerJoined(); // Temporary method whilst we don't have real networking to make this happen +#endif +}; + +extern CGameNetworkManager g_NetworkManager; + +#ifdef __PS3__ +#undef __in +#define __out +#endif diff --git a/Minecraft.Client/Common/Network/NetworkPlayerInterface.h b/Minecraft.Client/Common/Network/NetworkPlayerInterface.h new file mode 100644 index 00000000..501b08ff --- /dev/null +++ b/Minecraft.Client/Common/Network/NetworkPlayerInterface.h @@ -0,0 +1,31 @@ +#pragma once + +class Socket; + +// This is the platform independent interface for dealing with players within a network game. This should be used directly by game code (and GameNetworkManager) rather than the platform-specific implementations. + +class INetworkPlayer +{ +public: + virtual ~INetworkPlayer() {} + virtual unsigned char GetSmallId() = 0; + virtual void SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority) = 0; + virtual bool IsSameSystem(INetworkPlayer *player) = 0; + virtual int GetSendQueueSizeBytes( INetworkPlayer *player, bool lowPriority ) = 0; + virtual int GetSendQueueSizeMessages( INetworkPlayer *player, bool lowPriority ) = 0; + virtual int GetCurrentRtt() = 0; + virtual bool IsHost() = 0; + virtual bool IsGuest() = 0; + virtual bool IsLocal() = 0; + virtual int GetSessionIndex() = 0; + virtual bool IsTalking() = 0; + virtual bool IsMutedByLocalUser(int userIndex) = 0; + virtual bool HasVoice() = 0; + virtual bool HasCamera() = 0; + virtual int GetUserIndex() = 0; + virtual void SetSocket(Socket *pSocket) = 0; + virtual Socket *GetSocket() = 0; + virtual const wchar_t *GetOnlineName() = 0; + virtual wstring GetDisplayName() = 0; + virtual PlayerUID GetUID() = 0; +}; diff --git a/Minecraft.Client/Common/Network/PlatformNetworkManagerInterface.h b/Minecraft.Client/Common/Network/PlatformNetworkManagerInterface.h new file mode 100644 index 00000000..901e59e7 --- /dev/null +++ b/Minecraft.Client/Common/Network/PlatformNetworkManagerInterface.h @@ -0,0 +1,126 @@ +#pragma once +using namespace std; +#include +#include +#include "..\..\..\Minecraft.World\C4JThread.h" +#include "NetworkPlayerInterface.h" +#include "SessionInfo.h" + +class ClientConnection; +class Minecraft; +class CGameNetworkManager; + +// This is the interface to be implemented by the platform-specific versions of the PlatformNetworkManagers. This API is used directly by GameNetworkManager so that +// it can remain as platform independent as possible. + +// This value should be incremented if the server version changes, or the game session data changes +#define MINECRAFT_NET_VERSION VER_NETWORK + + +typedef struct _SearchForGamesData +{ + DWORD sessionIDCount; + XSESSION_SEARCHRESULT_HEADER *searchBuffer; + XNQOS **ppQos; + SessionID *sessionIDList; + XOVERLAPPED *pOverlapped; +} SearchForGamesData; + +class CPlatformNetworkManager +{ + friend class CGameNetworkManager; +public: + + typedef enum + { + JOIN_FAILED_SERVER_FULL, + JOIN_FAILED_INSUFFICIENT_PRIVILEGES, + JOIN_FAILED_NONSPECIFIC, + } eJoinFailedReason; + + virtual bool Initialise(CGameNetworkManager *pGameNetworkManager, int flagIndexSize) = 0; + virtual void Terminate() = 0; + virtual int GetJoiningReadyPercentage() = 0; + virtual int CorrectErrorIDS(int IDS) = 0; + + virtual void DoWork() = 0; + virtual int GetPlayerCount() = 0; + virtual int GetOnlinePlayerCount() = 0; + virtual int GetLocalPlayerMask(int playerIndex) = 0; + virtual bool AddLocalPlayerByUserIndex( int userIndex ) = 0; + virtual bool RemoveLocalPlayerByUserIndex( int userIndex ) = 0; + virtual INetworkPlayer *GetLocalPlayerByUserIndex( int userIndex ) = 0; + virtual INetworkPlayer *GetPlayerByIndex(int playerIndex) = 0; + virtual INetworkPlayer * GetPlayerByXuid(PlayerUID xuid) = 0; + virtual INetworkPlayer * GetPlayerBySmallId(unsigned char smallId) = 0; + virtual bool ShouldMessageForFullSession() = 0; + + virtual INetworkPlayer *GetHostPlayer() = 0; + virtual bool IsHost() = 0; + virtual bool JoinGameFromInviteInfo( int userIndex, int userMask, const INVITE_INFO *pInviteInfo) = 0; + virtual bool LeaveGame(bool bMigrateHost) = 0; + + virtual bool IsInSession() = 0; + virtual bool IsInGameplay() = 0; + virtual bool IsReadyToPlayOrIdle() = 0; + virtual bool IsInStatsEnabledSession() = 0; + virtual bool SessionHasSpace(unsigned int spaceRequired = 1) = 0; + virtual void SendInviteGUI(int quadrant) = 0; + virtual bool IsAddingPlayer() = 0; + + virtual void HostGame(int localUsersMask, bool bOnlineGame, bool bIsPrivate, unsigned char publicSlots = MINECRAFT_NET_MAX_PLAYERS, unsigned char privateSlots = 0) = 0; + virtual int JoinGame(FriendSessionInfo *searchResult, int dwLocalUsersMask, int dwPrimaryUserIndex ) = 0; + virtual void CancelJoinGame() {}; + virtual bool SetLocalGame(bool isLocal) = 0; + virtual bool IsLocalGame() = 0; + virtual void SetPrivateGame(bool isPrivate) = 0; + virtual bool IsPrivateGame() = 0; + virtual bool IsLeavingGame() = 0; + virtual void ResetLeavingGame() = 0; + + virtual void RegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam) = 0; + virtual void UnRegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam) = 0; + + virtual void HandleSignInChange() = 0; + + virtual bool _RunNetworkGame() = 0; + +private: + virtual bool _LeaveGame(bool bMigrateHost, bool bLeaveRoom) = 0; + virtual void _HostGame(int usersMask, unsigned char publicSlots = MINECRAFT_NET_MAX_PLAYERS, unsigned char privateSlots = 0) = 0; + virtual bool _StartGame() = 0; + + +public: + virtual void UpdateAndSetGameSessionData(INetworkPlayer *pNetworkPlayerLeaving = NULL) = 0; + +private: + virtual bool RemoveLocalPlayer( INetworkPlayer *pNetworkPlayer ) = 0; + +public: + virtual void SystemFlagSet(INetworkPlayer *pNetworkPlayer, int index) = 0; + virtual bool SystemFlagGet(INetworkPlayer *pNetworkPlayer, int index) = 0; + + virtual wstring GatherStats() = 0; + virtual wstring GatherRTTStats() = 0; + +private: + virtual void SetSessionTexturePackParentId( int id ) = 0; + virtual void SetSessionSubTexturePackId( int id ) = 0; + virtual void Notify(int ID, ULONG_PTR Param) = 0; + +public: + virtual vector *GetSessionList(int iPad, int localPlayers, bool partyOnly) = 0; + virtual bool GetGameSessionInfo(int iPad, SessionID sessionId,FriendSessionInfo *foundSession) = 0; + virtual void SetSessionsUpdatedCallback( void (*SessionsUpdatedCallback)(LPVOID pParam), LPVOID pSearchParam ) = 0; + virtual void GetFullFriendSessionInfo( FriendSessionInfo *foundSession, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ) = 0; + virtual void ForceFriendsSessionRefresh() = 0; + +#ifndef _XBOX + virtual void FakeLocalPlayerJoined() {}; // Temporary method whilst we don't have real networking to make this happen +#endif + +#ifdef _DURANGO + virtual wstring GetDisplayNameByGamertag(wstring gamertag) = 0; +#endif +}; diff --git a/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.cpp b/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.cpp new file mode 100644 index 00000000..b6b0fe12 --- /dev/null +++ b/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.cpp @@ -0,0 +1,646 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\Socket.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "PlatformNetworkManagerStub.h" +#include "..\..\Xbox\Network\NetworkPlayerXbox.h" // TODO - stub version of this? + +CPlatformNetworkManagerStub *g_pPlatformNetworkManager; + + +void CPlatformNetworkManagerStub::NotifyPlayerJoined(IQNetPlayer *pQNetPlayer ) +{ + const char * pszDescription; + + // 4J Stu - We create a fake socket for every where that we need an INBOUND queue of game data. Outbound + // is all handled by QNet so we don't need that. Therefore each client player has one, and the host has one + // for each client player. + bool createFakeSocket = false; + bool localPlayer = false; + + NetworkPlayerXbox *networkPlayer = (NetworkPlayerXbox *)addNetworkPlayer(pQNetPlayer); + + if( pQNetPlayer->IsLocal() ) + { + localPlayer = true; + if( pQNetPlayer->IsHost() ) + { + pszDescription = "local host"; + // 4J Stu - No socket for the localhost as it uses a special loopback queue + + m_machineQNetPrimaryPlayers.push_back( pQNetPlayer ); + } + else + { + pszDescription = "local"; + + // We need an inbound queue on all local players to receive data from the host + createFakeSocket = true; + } + } + else + { + if( pQNetPlayer->IsHost() ) + { + pszDescription = "remote host"; + } + else + { + pszDescription = "remote"; + + // If we are the host, then create a fake socket for every remote player + if( m_pIQNet->IsHost() ) + { + createFakeSocket = true; + } + } + + if( m_pIQNet->IsHost() && !m_bHostChanged ) + { + // Do we already have a primary player for this system? + bool systemHasPrimaryPlayer = false; + for(AUTO_VAR(it, m_machineQNetPrimaryPlayers.begin()); it < m_machineQNetPrimaryPlayers.end(); ++it) + { + IQNetPlayer *pQNetPrimaryPlayer = *it; + if( pQNetPlayer->IsSameSystem(pQNetPrimaryPlayer) ) + { + systemHasPrimaryPlayer = true; + break; + } + } + if( !systemHasPrimaryPlayer ) + m_machineQNetPrimaryPlayers.push_back( pQNetPlayer ); + } + } + g_NetworkManager.PlayerJoining( networkPlayer ); + + if( createFakeSocket == true && !m_bHostChanged ) + { + g_NetworkManager.CreateSocket( networkPlayer, localPlayer ); + } + + app.DebugPrintf( "Player 0x%p \"%ls\" joined; %s; voice %i; camera %i.\n", + pQNetPlayer, + pQNetPlayer->GetGamertag(), + pszDescription, + (int) pQNetPlayer->HasVoice(), + (int) pQNetPlayer->HasCamera() ); + + + if( m_pIQNet->IsHost() ) + { + // 4J-PB - only the host should do this +// g_NetworkManager.UpdateAndSetGameSessionData(); + SystemFlagAddPlayer( networkPlayer ); + } + + for( int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if(playerChangedCallback[idx] != NULL) + playerChangedCallback[idx]( playerChangedCallbackParam[idx], networkPlayer, false ); + } + + if(m_pIQNet->GetState() == QNET_STATE_GAME_PLAY) + { + int localPlayerCount = 0; + for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if( m_pIQNet->GetLocalPlayerByUserIndex(idx) != NULL ) ++localPlayerCount; + } + + float appTime = app.getAppTime(); + + // Only record stats for the primary player here + m_lastPlayerEventTimeStart = appTime; + } +} + +bool CPlatformNetworkManagerStub::Initialise(CGameNetworkManager *pGameNetworkManager, int flagIndexSize) +{ + m_pGameNetworkManager = pGameNetworkManager; + m_flagIndexSize = flagIndexSize; + g_pPlatformNetworkManager = this; + for( int i = 0; i < XUSER_MAX_COUNT; i++ ) + { + playerChangedCallback[ i ] = NULL; + } + + m_bLeavingGame = false; + m_bLeaveGameOnTick = false; + m_bHostChanged = false; + + m_bSearchResultsReady = false; + m_bSearchPending = false; + + m_bIsOfflineGame = false; + m_pSearchParam = NULL; + m_SessionsUpdatedCallback = NULL; + + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + m_searchResultsCount[i] = 0; + m_lastSearchStartTime[i] = 0; + + // The results that will be filled in with the current search + m_pSearchResults[i] = NULL; + m_pQoSResult[i] = NULL; + m_pCurrentSearchResults[i] = NULL; + m_pCurrentQoSResult[i] = NULL; + m_currentSearchResultsCount[i] = 0; + } + + // Success! + return true; +} + +void CPlatformNetworkManagerStub::Terminate() +{ +} + +int CPlatformNetworkManagerStub::GetJoiningReadyPercentage() +{ + return 100; +} + +int CPlatformNetworkManagerStub::CorrectErrorIDS(int IDS) +{ + return IDS; +} + +bool CPlatformNetworkManagerStub::isSystemPrimaryPlayer(IQNetPlayer *pQNetPlayer) +{ + return true; +} + +// We call this twice a frame, either side of the render call so is a good place to "tick" things +void CPlatformNetworkManagerStub::DoWork() +{ +} + +int CPlatformNetworkManagerStub::GetPlayerCount() +{ + return m_pIQNet->GetPlayerCount(); +} + +bool CPlatformNetworkManagerStub::ShouldMessageForFullSession() +{ + return false; +} + +int CPlatformNetworkManagerStub::GetOnlinePlayerCount() +{ + return 1; +} + +int CPlatformNetworkManagerStub::GetLocalPlayerMask(int playerIndex) +{ + return 1 << playerIndex; +} + +bool CPlatformNetworkManagerStub::AddLocalPlayerByUserIndex( int userIndex ) +{ + NotifyPlayerJoined(m_pIQNet->GetLocalPlayerByUserIndex(userIndex)); + return ( m_pIQNet->AddLocalPlayerByUserIndex(userIndex) == S_OK ); +} + +bool CPlatformNetworkManagerStub::RemoveLocalPlayerByUserIndex( int userIndex ) +{ + return true; +} + +bool CPlatformNetworkManagerStub::IsInStatsEnabledSession() +{ + return true; +} + +bool CPlatformNetworkManagerStub::SessionHasSpace(unsigned int spaceRequired /*= 1*/) +{ + return true; +} + +void CPlatformNetworkManagerStub::SendInviteGUI(int quadrant) +{ +} + +bool CPlatformNetworkManagerStub::IsAddingPlayer() +{ + return false; +} + +bool CPlatformNetworkManagerStub::LeaveGame(bool bMigrateHost) +{ + if( m_bLeavingGame ) return true; + + m_bLeavingGame = true; + + // If we are the host wait for the game server to end + if(m_pIQNet->IsHost() && g_NetworkManager.ServerStoppedValid()) + { + m_pIQNet->EndGame(); + g_NetworkManager.ServerStoppedWait(); + g_NetworkManager.ServerStoppedDestroy(); + } + return true; +} + +bool CPlatformNetworkManagerStub::_LeaveGame(bool bMigrateHost, bool bLeaveRoom) +{ + return true; +} + +void CPlatformNetworkManagerStub::HostGame(int localUsersMask, bool bOnlineGame, bool bIsPrivate, unsigned char publicSlots /*= MINECRAFT_NET_MAX_PLAYERS*/, unsigned char privateSlots /*= 0*/) +{ +// #ifdef _XBOX + // 4J Stu - We probably did this earlier as well, but just to be sure! + SetLocalGame( !bOnlineGame ); + SetPrivateGame( bIsPrivate ); + SystemFlagReset(); + + // Make sure that the Primary Pad is in by default + localUsersMask |= GetLocalPlayerMask( g_NetworkManager.GetPrimaryPad() ); + + m_bLeavingGame = false; + + m_pIQNet->HostGame(); + + _HostGame( localUsersMask, publicSlots, privateSlots ); +//#endif +} + +void CPlatformNetworkManagerStub::_HostGame(int usersMask, unsigned char publicSlots /*= MINECRAFT_NET_MAX_PLAYERS*/, unsigned char privateSlots /*= 0*/) +{ +} + +bool CPlatformNetworkManagerStub::_StartGame() +{ + return true; +} + +int CPlatformNetworkManagerStub::JoinGame(FriendSessionInfo *searchResult, int localUsersMask, int primaryUserIndex) +{ + return CGameNetworkManager::JOINGAME_SUCCESS; +} + +bool CPlatformNetworkManagerStub::SetLocalGame(bool isLocal) +{ + m_bIsOfflineGame = isLocal; + + return true; +} + +void CPlatformNetworkManagerStub::SetPrivateGame(bool isPrivate) +{ + app.DebugPrintf("Setting as private game: %s\n", isPrivate ? "yes" : "no" ); + m_bIsPrivateGame = isPrivate; +} + +void CPlatformNetworkManagerStub::RegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam) +{ + playerChangedCallback[iPad] = callback; + playerChangedCallbackParam[iPad] = callbackParam; +} + +void CPlatformNetworkManagerStub::UnRegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam) +{ + if(playerChangedCallbackParam[iPad] == callbackParam) + { + playerChangedCallback[iPad] = NULL; + playerChangedCallbackParam[iPad] = NULL; + } +} + +void CPlatformNetworkManagerStub::HandleSignInChange() +{ + return; +} + +bool CPlatformNetworkManagerStub::_RunNetworkGame() +{ + return true; +} + +void CPlatformNetworkManagerStub::UpdateAndSetGameSessionData(INetworkPlayer *pNetworkPlayerLeaving /*= NULL*/) +{ +// DWORD playerCount = m_pIQNet->GetPlayerCount(); +// +// if( this->m_bLeavingGame ) +// return; +// +// if( GetHostPlayer() == NULL ) +// return; +// +// for(unsigned int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++i) +// { +// if( i < playerCount ) +// { +// INetworkPlayer *pNetworkPlayer = GetPlayerByIndex(i); +// +// // We can call this from NotifyPlayerLeaving but at that point the player is still considered in the session +// if( pNetworkPlayer != pNetworkPlayerLeaving ) +// { +// m_hostGameSessionData.players[i] = ((NetworkPlayerXbox *)pNetworkPlayer)->GetUID(); +// +// char *temp; +// temp = (char *)wstringtofilename( pNetworkPlayer->GetOnlineName() ); +// memcpy(m_hostGameSessionData.szPlayers[i],temp,XUSER_NAME_SIZE); +// } +// else +// { +// m_hostGameSessionData.players[i] = NULL; +// memset(m_hostGameSessionData.szPlayers[i],0,XUSER_NAME_SIZE); +// } +// } +// else +// { +// m_hostGameSessionData.players[i] = NULL; +// memset(m_hostGameSessionData.szPlayers[i],0,XUSER_NAME_SIZE); +// } +// } +// +// m_hostGameSessionData.hostPlayerUID = ((NetworkPlayerXbox *)GetHostPlayer())->GetQNetPlayer()->GetXuid(); +// m_hostGameSessionData.m_uiGameHostSettings = app.GetGameHostOption(eGameHostOption_All); +} + +int CPlatformNetworkManagerStub::RemovePlayerOnSocketClosedThreadProc( void* lpParam ) +{ + INetworkPlayer *pNetworkPlayer = (INetworkPlayer *)lpParam; + + Socket *socket = pNetworkPlayer->GetSocket(); + + if( socket != NULL ) + { + //printf("Waiting for socket closed event\n"); + socket->m_socketClosedEvent->WaitForSignal(INFINITE); + + //printf("Socket closed event has fired\n"); + // 4J Stu - Clear our reference to this socket + pNetworkPlayer->SetSocket( NULL ); + delete socket; + } + + return g_pPlatformNetworkManager->RemoveLocalPlayer( pNetworkPlayer ); +} + +bool CPlatformNetworkManagerStub::RemoveLocalPlayer( INetworkPlayer *pNetworkPlayer ) +{ + return true; +} + +CPlatformNetworkManagerStub::PlayerFlags::PlayerFlags(INetworkPlayer *pNetworkPlayer, unsigned int count) +{ + // 4J Stu - Don't assert, just make it a multiple of 8! This count is calculated from a load of separate values, + // and makes tweaking world/render sizes a pain if we hit an assert here + count = (count + 8 - 1) & ~(8 - 1); + //assert( ( count % 8 ) == 0 ); + this->m_pNetworkPlayer = pNetworkPlayer; + this->flags = new unsigned char [ count / 8 ]; + memset( this->flags, 0, count / 8 ); + this->count = count; +} +CPlatformNetworkManagerStub::PlayerFlags::~PlayerFlags() +{ + delete [] flags; +} + +// Add a player to the per system flag storage - if we've already got a player from that system, copy its flags over +void CPlatformNetworkManagerStub::SystemFlagAddPlayer(INetworkPlayer *pNetworkPlayer) +{ + PlayerFlags *newPlayerFlags = new PlayerFlags( pNetworkPlayer, m_flagIndexSize); + // If any of our existing players are on the same system, then copy over flags from that one + for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) + { + if( pNetworkPlayer->IsSameSystem(m_playerFlags[i]->m_pNetworkPlayer) ) + { + memcpy( newPlayerFlags->flags, m_playerFlags[i]->flags, m_playerFlags[i]->count / 8 ); + break; + } + } + m_playerFlags.push_back(newPlayerFlags); +} + +// Remove a player from the per system flag storage - just maintains the m_playerFlags vector without any gaps in it +void CPlatformNetworkManagerStub::SystemFlagRemovePlayer(INetworkPlayer *pNetworkPlayer) +{ + for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) + { + if( m_playerFlags[i]->m_pNetworkPlayer == pNetworkPlayer ) + { + delete m_playerFlags[i]; + m_playerFlags[i] = m_playerFlags.back(); + m_playerFlags.pop_back(); + return; + } + } +} + +void CPlatformNetworkManagerStub::SystemFlagReset() +{ + for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) + { + delete m_playerFlags[i]; + } + m_playerFlags.clear(); +} + +// Set a per system flag - this is done by setting the flag on every player that shares that system +void CPlatformNetworkManagerStub::SystemFlagSet(INetworkPlayer *pNetworkPlayer, int index) +{ + if( ( index < 0 ) || ( index >= m_flagIndexSize ) ) return; + if( pNetworkPlayer == NULL ) return; + + for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) + { + if( pNetworkPlayer->IsSameSystem(m_playerFlags[i]->m_pNetworkPlayer) ) + { + m_playerFlags[i]->flags[ index / 8 ] |= ( 128 >> ( index % 8 ) ); + } + } +} + +// Get value of a per system flag - can be read from the flags of the passed in player as anything else sent to that +// system should also have been duplicated here +bool CPlatformNetworkManagerStub::SystemFlagGet(INetworkPlayer *pNetworkPlayer, int index) +{ + if( ( index < 0 ) || ( index >= m_flagIndexSize ) ) return false; + if( pNetworkPlayer == NULL ) + { + return false; + } + + for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) + { + if( m_playerFlags[i]->m_pNetworkPlayer == pNetworkPlayer ) + { + return ( ( m_playerFlags[i]->flags[ index / 8 ] & ( 128 >> ( index % 8 ) ) ) != 0 ); + } + } + return false; +} + +wstring CPlatformNetworkManagerStub::GatherStats() +{ + return L""; +} + +wstring CPlatformNetworkManagerStub::GatherRTTStats() +{ + wstring stats(L"Rtt: "); + + wchar_t stat[32]; + + for(unsigned int i = 0; i < GetPlayerCount(); ++i) + { + IQNetPlayer *pQNetPlayer = ((NetworkPlayerXbox *)GetPlayerByIndex( i ))->GetQNetPlayer(); + + if(!pQNetPlayer->IsLocal()) + { + ZeroMemory(stat,32*sizeof(WCHAR)); + swprintf(stat, 32, L"%d: %d/", i, pQNetPlayer->GetCurrentRtt() ); + stats.append(stat); + } + } + return stats; +} + +void CPlatformNetworkManagerStub::TickSearch() +{ +} + +void CPlatformNetworkManagerStub::SearchForGames() +{ +} + +int CPlatformNetworkManagerStub::SearchForGamesThreadProc( void* lpParameter ) +{ + return 0; +} + +void CPlatformNetworkManagerStub::SetSearchResultsReady(int resultCount) +{ + m_bSearchResultsReady = true; + m_searchResultsCount[m_lastSearchPad] = resultCount; +} + +vector *CPlatformNetworkManagerStub::GetSessionList(int iPad, int localPlayers, bool partyOnly) +{ + vector *filteredList = new vector();; + return filteredList; +} + +bool CPlatformNetworkManagerStub::GetGameSessionInfo(int iPad, SessionID sessionId, FriendSessionInfo *foundSessionInfo) +{ + return false; +} + +void CPlatformNetworkManagerStub::SetSessionsUpdatedCallback( void (*SessionsUpdatedCallback)(LPVOID pParam), LPVOID pSearchParam ) +{ + m_SessionsUpdatedCallback = SessionsUpdatedCallback; m_pSearchParam = pSearchParam; +} + +void CPlatformNetworkManagerStub::GetFullFriendSessionInfo( FriendSessionInfo *foundSession, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ) +{ + FriendSessionUpdatedFn(true, pParam); +} + +void CPlatformNetworkManagerStub::ForceFriendsSessionRefresh() +{ + app.DebugPrintf("Resetting friends session search data\n"); + + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + m_searchResultsCount[i] = 0; + m_lastSearchStartTime[i] = 0; + delete m_pSearchResults[i]; + m_pSearchResults[i] = NULL; + } +} + +INetworkPlayer *CPlatformNetworkManagerStub::addNetworkPlayer(IQNetPlayer *pQNetPlayer) +{ + NetworkPlayerXbox *pNetworkPlayer = new NetworkPlayerXbox(pQNetPlayer); + pQNetPlayer->SetCustomDataValue((ULONG_PTR)pNetworkPlayer); + currentNetworkPlayers.push_back( pNetworkPlayer ); + return pNetworkPlayer; +} + +void CPlatformNetworkManagerStub::removeNetworkPlayer(IQNetPlayer *pQNetPlayer) +{ + INetworkPlayer *pNetworkPlayer = getNetworkPlayer(pQNetPlayer); + for( AUTO_VAR(it, currentNetworkPlayers.begin()); it != currentNetworkPlayers.end(); it++ ) + { + if( *it == pNetworkPlayer ) + { + currentNetworkPlayers.erase(it); + return; + } + } +} + +INetworkPlayer *CPlatformNetworkManagerStub::getNetworkPlayer(IQNetPlayer *pQNetPlayer) +{ + return pQNetPlayer ? (INetworkPlayer *)(pQNetPlayer->GetCustomDataValue()) : NULL; +} + + +INetworkPlayer *CPlatformNetworkManagerStub::GetLocalPlayerByUserIndex(int userIndex ) +{ + return getNetworkPlayer(m_pIQNet->GetLocalPlayerByUserIndex(userIndex)); +} + +INetworkPlayer *CPlatformNetworkManagerStub::GetPlayerByIndex(int playerIndex) +{ + return getNetworkPlayer(m_pIQNet->GetPlayerByIndex(playerIndex)); +} + +INetworkPlayer * CPlatformNetworkManagerStub::GetPlayerByXuid(PlayerUID xuid) +{ + return getNetworkPlayer( m_pIQNet->GetPlayerByXuid(xuid)) ; +} + +INetworkPlayer * CPlatformNetworkManagerStub::GetPlayerBySmallId(unsigned char smallId) +{ + return getNetworkPlayer(m_pIQNet->GetPlayerBySmallId(smallId)); +} + +INetworkPlayer *CPlatformNetworkManagerStub::GetHostPlayer() +{ + return getNetworkPlayer(m_pIQNet->GetHostPlayer()); +} + +bool CPlatformNetworkManagerStub::IsHost() +{ + return m_pIQNet->IsHost() && !m_bHostChanged; +} + +bool CPlatformNetworkManagerStub::JoinGameFromInviteInfo( int userIndex, int userMask, const INVITE_INFO *pInviteInfo) +{ + return ( m_pIQNet->JoinGameFromInviteInfo( userIndex, userMask, pInviteInfo ) == S_OK); +} + +void CPlatformNetworkManagerStub::SetSessionTexturePackParentId( int id ) +{ + m_hostGameSessionData.texturePackParentId = id; +} + +void CPlatformNetworkManagerStub::SetSessionSubTexturePackId( int id ) +{ + m_hostGameSessionData.subTexturePackId = id; +} + +void CPlatformNetworkManagerStub::Notify(int ID, ULONG_PTR Param) +{ +} + +bool CPlatformNetworkManagerStub::IsInSession() +{ + return m_pIQNet->GetState() != QNET_STATE_IDLE; +} + +bool CPlatformNetworkManagerStub::IsInGameplay() +{ + return m_pIQNet->GetState() == QNET_STATE_GAME_PLAY; +} + +bool CPlatformNetworkManagerStub::IsReadyToPlayOrIdle() +{ + return true; +} diff --git a/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.h b/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.h new file mode 100644 index 00000000..f997dece --- /dev/null +++ b/Minecraft.Client/Common/Network/PlatformNetworkManagerStub.h @@ -0,0 +1,170 @@ +#pragma once +using namespace std; +#include +#include "..\..\..\Minecraft.World\C4JThread.h" +#include "NetworkPlayerInterface.h" +#include "PlatformNetworkManagerInterface.h" +#include "SessionInfo.h" + +class CPlatformNetworkManagerStub : public CPlatformNetworkManager +{ + friend class CGameNetworkManager; +public: + virtual bool Initialise(CGameNetworkManager *pGameNetworkManager, int flagIndexSize); + virtual void Terminate(); + virtual int GetJoiningReadyPercentage(); + virtual int CorrectErrorIDS(int IDS); + + virtual void DoWork(); + virtual int GetPlayerCount(); + virtual int GetOnlinePlayerCount(); + virtual int GetLocalPlayerMask(int playerIndex); + virtual bool AddLocalPlayerByUserIndex( int userIndex ); + virtual bool RemoveLocalPlayerByUserIndex( int userIndex ); + virtual INetworkPlayer *GetLocalPlayerByUserIndex( int userIndex ); + virtual INetworkPlayer *GetPlayerByIndex(int playerIndex); + virtual INetworkPlayer * GetPlayerByXuid(PlayerUID xuid); + virtual INetworkPlayer * GetPlayerBySmallId(unsigned char smallId); + virtual bool ShouldMessageForFullSession(); + + virtual INetworkPlayer *GetHostPlayer(); + virtual bool IsHost(); + virtual bool JoinGameFromInviteInfo( int userIndex, int userMask, const INVITE_INFO *pInviteInfo); + virtual bool LeaveGame(bool bMigrateHost); + + virtual bool IsInSession(); + virtual bool IsInGameplay(); + virtual bool IsReadyToPlayOrIdle(); + virtual bool IsInStatsEnabledSession(); + virtual bool SessionHasSpace(unsigned int spaceRequired = 1); + virtual void SendInviteGUI(int quadrant); + virtual bool IsAddingPlayer(); + + virtual void HostGame(int localUsersMask, bool bOnlineGame, bool bIsPrivate, unsigned char publicSlots = MINECRAFT_NET_MAX_PLAYERS, unsigned char privateSlots = 0); + virtual int JoinGame(FriendSessionInfo *searchResult, int localUsersMask, int primaryUserIndex ); + virtual bool SetLocalGame(bool isLocal); + virtual bool IsLocalGame() { return m_bIsOfflineGame; } + virtual void SetPrivateGame(bool isPrivate); + virtual bool IsPrivateGame() { return m_bIsPrivateGame; } + virtual bool IsLeavingGame() { return m_bLeavingGame; } + virtual void ResetLeavingGame() { m_bLeavingGame = false; } + + virtual void RegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam); + virtual void UnRegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam); + + virtual void HandleSignInChange(); + + virtual bool _RunNetworkGame(); + +private: + bool isSystemPrimaryPlayer(IQNetPlayer *pQNetPlayer); + virtual bool _LeaveGame(bool bMigrateHost, bool bLeaveRoom); + virtual void _HostGame(int dwUsersMask, unsigned char publicSlots = MINECRAFT_NET_MAX_PLAYERS, unsigned char privateSlots = 0); + virtual bool _StartGame(); + + IQNet * m_pIQNet; // pointer to QNet interface + + HANDLE m_notificationListener; + + vector m_machineQNetPrimaryPlayers; // collection of players that we deem to be the main one for that system + + bool m_bLeavingGame; + bool m_bLeaveGameOnTick; + bool m_migrateHostOnLeave; + bool m_bHostChanged; + + bool m_bIsOfflineGame; + bool m_bIsPrivateGame; + int m_flagIndexSize; + + // This is only maintained by the host, and is not valid on client machines + GameSessionData m_hostGameSessionData; + CGameNetworkManager *m_pGameNetworkManager; +public: + virtual void UpdateAndSetGameSessionData(INetworkPlayer *pNetworkPlayerLeaving = NULL); + +private: + // TODO 4J Stu - Do we need to be able to have more than one of these? + void (*playerChangedCallback[XUSER_MAX_COUNT])(void *callbackParam, INetworkPlayer *pPlayer, bool leaving); + void *playerChangedCallbackParam[XUSER_MAX_COUNT]; + + static int RemovePlayerOnSocketClosedThreadProc( void* lpParam ); + virtual bool RemoveLocalPlayer( INetworkPlayer *pNetworkPlayer ); + + // Things for handling per-system flags + class PlayerFlags + { + public: + INetworkPlayer *m_pNetworkPlayer; + unsigned char *flags; + unsigned int count; + PlayerFlags(INetworkPlayer *pNetworkPlayer, unsigned int count); + ~PlayerFlags(); + }; + vector m_playerFlags; + void SystemFlagAddPlayer(INetworkPlayer *pNetworkPlayer); + void SystemFlagRemovePlayer(INetworkPlayer *pNetworkPlayer); + void SystemFlagReset(); +public: + virtual void SystemFlagSet(INetworkPlayer *pNetworkPlayer, int index); + virtual bool SystemFlagGet(INetworkPlayer *pNetworkPlayer, int index); + + // For telemetry +private: + float m_lastPlayerEventTimeStart; + +public: + wstring GatherStats(); + wstring GatherRTTStats(); + +private: + vector friendsSessions[XUSER_MAX_COUNT]; + int m_searchResultsCount[XUSER_MAX_COUNT]; + int m_lastSearchStartTime[XUSER_MAX_COUNT]; + + // The results that will be filled in with the current search + XSESSION_SEARCHRESULT_HEADER *m_pSearchResults[XUSER_MAX_COUNT]; + XNQOS *m_pQoSResult[XUSER_MAX_COUNT]; + + // The results from the previous search, which are currently displayed in the game + XSESSION_SEARCHRESULT_HEADER *m_pCurrentSearchResults[XUSER_MAX_COUNT]; + XNQOS *m_pCurrentQoSResult[XUSER_MAX_COUNT]; + int m_currentSearchResultsCount[XUSER_MAX_COUNT]; + + int m_lastSearchPad; + bool m_bSearchResultsReady; + bool m_bSearchPending; + LPVOID m_pSearchParam; + void (*m_SessionsUpdatedCallback)(LPVOID pParam); + + C4JThread* m_SearchingThread; + + void TickSearch(); + void SearchForGames(); + static int SearchForGamesThreadProc( void* lpParameter ); + + void SetSearchResultsReady(int resultCount = 0); + + vectorcurrentNetworkPlayers; + INetworkPlayer *addNetworkPlayer(IQNetPlayer *pQNetPlayer); + void removeNetworkPlayer(IQNetPlayer *pQNetPlayer); + static INetworkPlayer *getNetworkPlayer(IQNetPlayer *pQNetPlayer); + + virtual void SetSessionTexturePackParentId( int id ); + virtual void SetSessionSubTexturePackId( int id ); + virtual void Notify(int ID, ULONG_PTR Param); + +public: + virtual vector *GetSessionList(int iPad, int localPlayers, bool partyOnly); + virtual bool GetGameSessionInfo(int iPad, SessionID sessionId,FriendSessionInfo *foundSession); + virtual void SetSessionsUpdatedCallback( void (*SessionsUpdatedCallback)(LPVOID pParam), LPVOID pSearchParam ); + virtual void GetFullFriendSessionInfo( FriendSessionInfo *foundSession, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ); + virtual void ForceFriendsSessionRefresh(); + +private: + void NotifyPlayerJoined( IQNetPlayer *pQNetPlayer ); + +#ifndef _XBOX + void FakeLocalPlayerJoined() { NotifyPlayerJoined(m_pIQNet->GetLocalPlayerByUserIndex(0)); } +#endif +}; diff --git a/Minecraft.Client/Common/Network/SessionInfo.h b/Minecraft.Client/Common/Network/SessionInfo.h new file mode 100644 index 00000000..31472a19 --- /dev/null +++ b/Minecraft.Client/Common/Network/SessionInfo.h @@ -0,0 +1,113 @@ +#pragma once + +#if defined(__PS3__) || defined(__ORBIS__) +#include "..\..\Common\Network\Sony\SQRNetworkManager.h" +#endif + + +// A struct that we store in the QoS data when we are hosting the session. Max size 1020 bytes. +#ifdef _XBOX +typedef struct _GameSessionData +{ + unsigned short netVersion; // 2 bytes + char hostName[XUSER_NAME_SIZE]; // 16 bytes ( 16*1 ) + GameSessionUID hostPlayerUID; // 8 bytes ( 8*1 ) on xbox, 24 bytes on PS3 + GameSessionUID players[MINECRAFT_NET_MAX_PLAYERS]; // 64 bytes ( 8*8 ) on xbox, 192 ( 24*8) on PS3 + char szPlayers[MINECRAFT_NET_MAX_PLAYERS][XUSER_NAME_SIZE]; // 128 bytes ( 8*16) + unsigned int m_uiGameHostSettings; // 4 bytes + unsigned int texturePackParentId; // 4 bytes + unsigned char subTexturePackId; // 1 byte + + bool isJoinable; // 1 byte + + _GameSessionData() + { + netVersion = 0; + memset(hostName,0,XUSER_NAME_SIZE); + memset(players,0,MINECRAFT_NET_MAX_PLAYERS*sizeof(players[0])); + memset(szPlayers,0,MINECRAFT_NET_MAX_PLAYERS*XUSER_NAME_SIZE); + isJoinable = true; + m_uiGameHostSettings = 0; + texturePackParentId = 0; + subTexturePackId = 0; + } +} GameSessionData; +#elif defined __PS3__ || defined __ORBIS__ || defined(__PSVITA__) +typedef struct _GameSessionData +{ + unsigned short netVersion; // 2 bytes + GameSessionUID hostPlayerUID; // 8 bytes ( 8*1 ) on xbox, 24 bytes on PS3 + GameSessionUID players[MINECRAFT_NET_MAX_PLAYERS]; // 64 bytes ( 8*8 ) on xbox, 192 ( 24*8) on PS3 + unsigned int m_uiGameHostSettings; // 4 bytes + unsigned int texturePackParentId; // 4 bytes + unsigned char subTexturePackId; // 1 byte + + bool isJoinable; // 1 byte + + unsigned char playerCount; // 1 byte + bool isReadyToJoin; // 1 byte + + _GameSessionData() + { + netVersion = 0; + memset(players,0,MINECRAFT_NET_MAX_PLAYERS*sizeof(players[0])); + isJoinable = true; + m_uiGameHostSettings = 0; + texturePackParentId = 0; + subTexturePackId = 0; + playerCount = 0; + isReadyToJoin = false; + + } +} GameSessionData; +#else +typedef struct _GameSessionData +{ + unsigned short netVersion; // 2 bytes + unsigned int m_uiGameHostSettings; // 4 bytes + unsigned int texturePackParentId; // 4 bytes + unsigned char subTexturePackId; // 1 byte + + bool isReadyToJoin; // 1 byte + + _GameSessionData() + { + netVersion = 0; + m_uiGameHostSettings = 0; + texturePackParentId = 0; + subTexturePackId = 0; + } +} GameSessionData; +#endif + +class FriendSessionInfo +{ +public: + SessionID sessionId; +#ifdef _XBOX + XSESSION_SEARCHRESULT searchResult; +#elif defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + SQRNetworkManager::SessionSearchResult searchResult; +#elif defined(_DURANGO) + DQRNetworkManager::SessionSearchResult searchResult; +#endif + wchar_t *displayLabel; + unsigned char displayLabelLength; + unsigned char displayLabelViewableStartIndex; + GameSessionData data; + bool hasPartyMember; + + FriendSessionInfo() + { + displayLabel = NULL; + displayLabelLength = 0; + displayLabelViewableStartIndex = 0; + hasPartyMember = false; + } + + ~FriendSessionInfo() + { + if(displayLabel!=NULL) + delete displayLabel; + } +}; diff --git a/Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.cpp b/Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.cpp new file mode 100644 index 00000000..9c750e95 --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.cpp @@ -0,0 +1,114 @@ +#include "stdafx.h" +#include "NetworkPlayerSony.h" + +NetworkPlayerSony::NetworkPlayerSony(SQRNetworkPlayer *qnetPlayer) +{ + m_sqrPlayer = qnetPlayer; + m_pSocket = NULL; +} + +unsigned char NetworkPlayerSony::GetSmallId() +{ + return m_sqrPlayer->GetSmallId(); +} + +void NetworkPlayerSony::SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority) +{ + // TODO - handle priority + m_sqrPlayer->SendData( ((NetworkPlayerSony *)player)->m_sqrPlayer, pvData, dataSize ); +} + +bool NetworkPlayerSony::IsSameSystem(INetworkPlayer *player) +{ + return m_sqrPlayer->IsSameSystem(((NetworkPlayerSony *)player)->m_sqrPlayer); +} + +int NetworkPlayerSony::GetSendQueueSizeBytes( INetworkPlayer *player, bool lowPriority ) +{ + return 0; // TODO +} + +int NetworkPlayerSony::GetSendQueueSizeMessages( INetworkPlayer *player, bool lowPriority ) +{ + return 0; // TODO +} + +int NetworkPlayerSony::GetCurrentRtt() +{ + return 0; // TODO +} + +bool NetworkPlayerSony::IsHost() +{ + return m_sqrPlayer->IsHost(); +} + +bool NetworkPlayerSony::IsGuest() +{ + return false; // TODO +} + +bool NetworkPlayerSony::IsLocal() +{ + return m_sqrPlayer->IsLocal(); +} + +int NetworkPlayerSony::GetSessionIndex() +{ + return m_sqrPlayer->GetSessionIndex(); +} + +bool NetworkPlayerSony::IsTalking() +{ + return m_sqrPlayer->IsTalking(); +} + +bool NetworkPlayerSony::IsMutedByLocalUser(int userIndex) +{ + return m_sqrPlayer->IsMutedByLocalUser(userIndex); +} + +bool NetworkPlayerSony::HasVoice() +{ + return m_sqrPlayer->HasVoice(); +} + +bool NetworkPlayerSony::HasCamera() +{ + return false; // TODO +} + +int NetworkPlayerSony::GetUserIndex() +{ + return m_sqrPlayer->GetLocalPlayerIndex(); +} + +void NetworkPlayerSony::SetSocket(Socket *pSocket) +{ + m_pSocket = pSocket; +} + +Socket *NetworkPlayerSony::GetSocket() +{ + return m_pSocket; +} + +const wchar_t *NetworkPlayerSony::GetOnlineName() +{ + return m_sqrPlayer->GetName(); +} + +wstring NetworkPlayerSony::GetDisplayName() +{ + return m_sqrPlayer->GetName(); +} + +PlayerUID NetworkPlayerSony::GetUID() +{ + return m_sqrPlayer->GetUID(); +} + +void NetworkPlayerSony::SetUID(PlayerUID UID) +{ + m_sqrPlayer->SetUID(UID); +} diff --git a/Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.h b/Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.h new file mode 100644 index 00000000..5c8605fb --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.h @@ -0,0 +1,39 @@ +#pragma once + +#include "..\..\Common\Network\NetworkPlayerInterface.h" +#include "SQRNetworkPlayer.h" + +// This is an implementation of the INetworkPlayer interface, for Sony platforms. It effectively wraps the SQRNetworkPlayer class in a non-platform-specific way. + +class NetworkPlayerSony : public INetworkPlayer +{ +public: + // Common player interface + NetworkPlayerSony(SQRNetworkPlayer *sqrPlayer); + virtual unsigned char GetSmallId(); + virtual void SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority); + virtual bool IsSameSystem(INetworkPlayer *player); + virtual int GetSendQueueSizeBytes( INetworkPlayer *player, bool lowPriority ); + virtual int GetSendQueueSizeMessages( INetworkPlayer *player, bool lowPriority ); + virtual int GetCurrentRtt(); + virtual bool IsHost(); + virtual bool IsGuest(); + virtual bool IsLocal(); + virtual int GetSessionIndex(); + virtual bool IsTalking(); + virtual bool IsMutedByLocalUser(int userIndex); + virtual bool HasVoice(); + virtual bool HasCamera(); + virtual int GetUserIndex(); + virtual void SetSocket(Socket *pSocket); + virtual Socket *GetSocket(); + virtual const wchar_t *GetOnlineName(); + virtual wstring GetDisplayName(); + virtual PlayerUID GetUID(); + + void SetUID(PlayerUID UID); + +private: + SQRNetworkPlayer *m_sqrPlayer; + Socket *m_pSocket; +}; diff --git a/Minecraft.Client/Common/Network/Sony/PlatformNetworkManagerSony.cpp b/Minecraft.Client/Common/Network/Sony/PlatformNetworkManagerSony.cpp new file mode 100644 index 00000000..009993cb --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/PlatformNetworkManagerSony.cpp @@ -0,0 +1,1462 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\Socket.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "PlatformNetworkManagerSony.h" +#include "NetworkPlayerSony.h" +#include "..\..\Common\Network\GameNetworkManager.h" + +CPlatformNetworkManagerSony *g_pPlatformNetworkManager; + +bool CPlatformNetworkManagerSony::IsLocalGame() +{ + return m_bIsOfflineGame; +} +bool CPlatformNetworkManagerSony::IsPrivateGame() +{ + return m_bIsPrivateGame; +} +bool CPlatformNetworkManagerSony::IsLeavingGame() +{ + return m_bLeavingGame; +} +void CPlatformNetworkManagerSony::ResetLeavingGame() +{ + m_bLeavingGame = false; +} + + +void CPlatformNetworkManagerSony::HandleStateChange(SQRNetworkManager::eSQRNetworkManagerState oldState, SQRNetworkManager::eSQRNetworkManagerState newState, bool idleReasonIsSessionFull) +{ + static const char * c_apszStateNames[] = + { + "SNM_STATE_INITIALISING", + "SNM_STATE_INITIALISE_FAILED", + "SNM_STATE_IDLE", + "SNM_STATE_HOSTING", + "SNM_STATE_JOINING", + "SNM_STATE_STARTING", + "SNM_STATE_PLAYING", + "SNM_STATE_LEAVING", + "SNM_STATE_ENDING", + }; + + app.DebugPrintf( "Network State: %s ==> %s\n", + c_apszStateNames[ oldState ], + c_apszStateNames[ newState ] ); + + if( newState == SQRNetworkManager::SNM_STATE_HOSTING ) + { + m_bLeavingGame = false; + m_bLeaveGameOnTick = false; + m_bHostChanged = false; + g_NetworkManager.StateChange_AnyToHosting(); + } + else if( newState == SQRNetworkManager::SNM_STATE_JOINING ) + { + // 4J Stu - We may be accepting an invite from the DLC menu, so hide the icon +#ifdef __ORBIS__ + sceNpCommerceHidePsStoreIcon(); +#elif defined __PSVITA__ + sceNpCommerce2HidePsStoreIcon(); +#endif + m_bLeavingGame = false; + m_bLeaveGameOnTick = false; + m_bHostChanged = false; + g_NetworkManager.StateChange_AnyToJoining(); + } + else if( newState == SQRNetworkManager::SNM_STATE_IDLE && oldState == SQRNetworkManager::SNM_STATE_JOINING ) + { + if( idleReasonIsSessionFull ) + { + g_NetworkManager.StateChange_JoiningToIdle(JOIN_FAILED_SERVER_FULL); + } + else + { + g_NetworkManager.StateChange_JoiningToIdle(JOIN_FAILED_NONSPECIFIC); + } + } + else if( newState == SQRNetworkManager::SNM_STATE_IDLE && oldState == SQRNetworkManager::SNM_STATE_HOSTING ) + { + m_bLeavingGame = true; + } + else if( newState == SQRNetworkManager::SNM_STATE_STARTING ) + { + m_lastPlayerEventTimeStart = app.getAppTime(); + + g_NetworkManager.StateChange_AnyToStarting(); + } + // Fix for #93148 - TCR 001: BAS Game Stability: Title will crash for the multiplayer client if host of the game will exit during the clients loading to created world. + // 4J Stu - If the client joins just as the host is exiting, then they can skip to leaving without passing through ending + else if( newState == SQRNetworkManager::SNM_STATE_ENDING ) + { + g_NetworkManager.StateChange_AnyToEnding( oldState == SQRNetworkManager::SNM_STATE_PLAYING ); + + // 4J-PB - Only the host can leave here - the clients will hang if m_bLeavingGame is set to true here + if( m_pSQRNet->IsHost() ) + { + m_bLeavingGame = true; + } + } + + if( newState == SQRNetworkManager::SNM_STATE_IDLE ) + { + // On PS3, sometimes we're getting a SNM_STATE_ENDING transition to SNM_STATE_IDLE on joining, because the server context being deleted sets the state away from SNM_STATE_JOINING before we detect + // the cause for the disconnection. This means we don't pick up on the joining->idle transition. Set disconnection reason here too for this case. + if( idleReasonIsSessionFull ) + { + app.SetDisconnectReason( DisconnectPacket::eDisconnect_ServerFull ); + } + g_NetworkManager.StateChange_AnyToIdle(); + } +} + +void CPlatformNetworkManagerSony::HandleDataReceived(SQRNetworkPlayer *playerFrom, SQRNetworkPlayer *playerTo, unsigned char *data, unsigned int dataSize) +{ + if(m_pSQRNet->GetState() == SQRNetworkManager::SNM_STATE_ENDING) + { + return; + } + + if( playerTo->IsHost() ) + { + // If we are the host we care who this came from + //app.DebugPrintf( "Pushing data into host read queue for user \"%ls\"\n", pPlayerFrom->GetGamertag()); + // Push this data into the read queue for the player that sent it + INetworkPlayer *pPlayerFrom = getNetworkPlayer(playerFrom); + Socket *socket = pPlayerFrom->GetSocket(); + + if(socket != NULL) + socket->pushDataToQueue(data, dataSize, false); + } + else + { + // If we are not the host the message must have come from the host, so we care more about who it is addressed to + INetworkPlayer *pPlayerTo = getNetworkPlayer(playerTo); + Socket *socket = pPlayerTo->GetSocket(); + //app.DebugPrintf( "Pushing data into read queue for user \"%ls\"\n", apPlayersTo[dwPlayer]->GetGamertag()); + if(socket != NULL) + socket->pushDataToQueue(data, dataSize); + } +} + +void CPlatformNetworkManagerSony::HandlePlayerJoined(SQRNetworkPlayer * pSQRPlayer) +{ + const char * pszDescription; + + // 4J Stu - We create a fake socket for every where that we need an INBOUND queue of game data. Outbound + // is all handled by QNet so we don't need that. Therefore each client player has one, and the host has one + // for each client player. + bool createFakeSocket = false; + bool localPlayer = false; + + NetworkPlayerSony *networkPlayer = (NetworkPlayerSony *)addNetworkPlayer(pSQRPlayer); + + if( pSQRPlayer->IsLocal() ) + { + localPlayer = true; + if( pSQRPlayer->IsHost() ) + { + pszDescription = "local host"; + // 4J Stu - No socket for the localhost as it uses a special loopback queue + + m_machineSQRPrimaryPlayers.push_back( pSQRPlayer ); + } + else + { + pszDescription = "local"; + + // We need an inbound queue on all local players to receive data from the host + createFakeSocket = true; + } + } + else + { + if( pSQRPlayer->IsHost() ) + { + pszDescription = "remote host"; + } + else + { + pszDescription = "remote"; + + // If we are the host, then create a fake socket for every remote player + if( m_pSQRNet->IsHost() ) + { + createFakeSocket = true; + } + } + + if( m_pSQRNet->IsHost() && !m_bHostChanged ) + { + // Do we already have a primary player for this system? + bool systemHasPrimaryPlayer = false; + for(AUTO_VAR(it, m_machineSQRPrimaryPlayers.begin()); it < m_machineSQRPrimaryPlayers.end(); ++it) + { + SQRNetworkPlayer *pQNetPrimaryPlayer = *it; + if( pSQRPlayer->IsSameSystem(pQNetPrimaryPlayer) ) + { + systemHasPrimaryPlayer = true; + break; + } + } + if( !systemHasPrimaryPlayer ) + m_machineSQRPrimaryPlayers.push_back( pSQRPlayer ); + } + } + g_NetworkManager.PlayerJoining( networkPlayer ); + + if( createFakeSocket == true && !m_bHostChanged ) + { + g_NetworkManager.CreateSocket( networkPlayer, localPlayer ); + } + +#if 0 + app.DebugPrintf( "Player 0x%p \"%ls\" joined; %s; voice %i; camera %i.\n", + pSQRPlayer, + pSQRPlayer->GetGamertag(), + pszDescription, + (int) pSQRPlayer->HasVoice(), + (int) pSQRPlayer->HasCamera() ); +#endif + + + if( m_pSQRNet->IsHost() ) + { + // 4J-PB - only the host should do this + g_NetworkManager.UpdateAndSetGameSessionData(); + SystemFlagAddPlayer( networkPlayer ); + } + + for( int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if(playerChangedCallback[idx] != NULL) + playerChangedCallback[idx]( playerChangedCallbackParam[idx], networkPlayer, false ); + } + + if(true) // TODO m_pSQRNet->GetState() == QNET_STATE_GAME_PLAY) + { + int localPlayerCount = 0; + for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if( m_pSQRNet->GetLocalPlayerByUserIndex(idx) != NULL ) ++localPlayerCount; + } + + float appTime = app.getAppTime(); + + // Only record stats for the primary player here + m_lastPlayerEventTimeStart = appTime; + } +} + +void CPlatformNetworkManagerSony::HandlePlayerLeaving(SQRNetworkPlayer *pSQRPlayer) +{ + //__debugbreak(); + + app.DebugPrintf( "Player 0x%p leaving.\n", + pSQRPlayer ); + + INetworkPlayer *networkPlayer = getNetworkPlayer(pSQRPlayer); + + if( networkPlayer ) + { + // Get our wrapper object associated with this player. + Socket *socket = networkPlayer->GetSocket(); + if( socket != NULL ) + { + // If we are in game then remove this player from the game as well. + // We may get here either from the player requesting to exit the game, + // in which case we they will already have left the game server, or from a disconnection + // where we then have to remove them from the game server + if( m_pSQRNet->IsHost() && !m_bHostChanged ) + { + g_NetworkManager.CloseConnection(networkPlayer); + } + + // Free the wrapper object memory. + // TODO 4J Stu - We may still be using this at the point that the player leaves the session. + // We need this as long as the game server still needs to communicate with the player + //delete socket; + + networkPlayer->SetSocket( NULL ); + } + + if( m_pSQRNet->IsHost() && !m_bHostChanged ) + { + if( isSystemPrimaryPlayer(pSQRPlayer) ) + { + SQRNetworkPlayer *pNewSQRPrimaryPlayer = NULL; + for(unsigned int i = 0; i < m_pSQRNet->GetPlayerCount(); ++i ) + { + SQRNetworkPlayer *pSQRPlayer2 = m_pSQRNet->GetPlayerByIndex( i ); + + if ( pSQRPlayer2 != NULL && pSQRPlayer2 != pSQRPlayer && pSQRPlayer2->IsSameSystem( pSQRPlayer ) ) + { + pNewSQRPrimaryPlayer = pSQRPlayer2; + break; + } + } + AUTO_VAR(it, find( m_machineSQRPrimaryPlayers.begin(), m_machineSQRPrimaryPlayers.end(), pSQRPlayer)); + if( it != m_machineSQRPrimaryPlayers.end() ) + { + m_machineSQRPrimaryPlayers.erase( it ); + } + + if( pNewSQRPrimaryPlayer != NULL ) + m_machineSQRPrimaryPlayers.push_back( pNewSQRPrimaryPlayer ); + } + + g_NetworkManager.UpdateAndSetGameSessionData( networkPlayer ); + SystemFlagRemovePlayer( networkPlayer ); + + } + + g_NetworkManager.PlayerLeaving( networkPlayer ); + + for( int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if(playerChangedCallback[idx] != NULL) + playerChangedCallback[idx]( playerChangedCallbackParam[idx], networkPlayer, true ); + } + + if(m_pSQRNet->GetState() == SQRNetworkManager::SNM_STATE_PLAYING) + { + int localPlayerCount = 0; + for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if( m_pSQRNet->GetLocalPlayerByUserIndex(idx) != NULL ) ++localPlayerCount; + } + + float appTime = app.getAppTime(); + m_lastPlayerEventTimeStart = appTime; + } + + removeNetworkPlayer(pSQRPlayer); + } +} + +// Update our external data to match the current internal player slots, and resync back out (host only) +void CPlatformNetworkManagerSony::HandleResyncPlayerRequest(SQRNetworkPlayer **aPlayers) +{ + m_hostGameSessionData.playerCount = 0; + for(int i = 0; i < SQRNetworkManager::MAX_ONLINE_PLAYER_COUNT; i++ ) + { + if( aPlayers[i] ) + { + m_hostGameSessionData.players[i] = aPlayers[i]->GetUID(); + m_hostGameSessionData.playerCount++; + } + else + { + memset(&m_hostGameSessionData.players[i],0,sizeof(m_hostGameSessionData.players[i])); + } + } + m_pSQRNet->UpdateExternalRoomData(); +} + +void CPlatformNetworkManagerSony::HandleAddLocalPlayerFailed(int idx) +{ + g_NetworkManager.AddLocalPlayerFailed(idx); +} + +void CPlatformNetworkManagerSony::HandleDisconnect(bool bLostRoomOnly,bool bPSNSignOut) +{ + g_NetworkManager.HandleDisconnect(bLostRoomOnly,bPSNSignOut); +} + +void CPlatformNetworkManagerSony::HandleInviteReceived( int userIndex, const SQRNetworkManager::PresenceSyncInfo *pInviteInfo) +{ + g_NetworkManager.GameInviteReceived( userIndex, pInviteInfo ); +} + +extern SQRNetworkManager *testSQRNetworkManager; + +bool CPlatformNetworkManagerSony::Initialise(CGameNetworkManager *pGameNetworkManager, int flagIndexSize) +{ + // Create a sony network manager, and go online +#ifdef __ORBIS__ + m_pSQRNet = new SQRNetworkManager_Orbis(this); + m_pSQRNet->Initialise(); +#elif defined __PS3__ + m_pSQRNet = new SQRNetworkManager_PS3(this); + m_pSQRNet->Initialise(); +#else // __PSVITA__ + // m_pSQRNet = new SQRNetworkManager_Vita(this); + m_bUsingAdhocMode = false; + m_pSQRNet_Vita_Adhoc = new SQRNetworkManager_AdHoc_Vita(this); + m_pSQRNet_Vita = new SQRNetworkManager_Vita(this); + + m_pSQRNet = m_pSQRNet_Vita; + + // 4J-PB - seems we can't initialise both adhoc and psn comms - from Rohan - "having adhoc matching and matching2 library initialised together results in undesired behaviour", but probably having other parts initialised also is 'undesirable' + + m_pSQRNet_Vita->Initialise(); + + if(ProfileManager.IsSignedInPSN(ProfileManager.GetPrimaryPad())) + { + // we're signed into the PSN, but we won't be online yet, force a sign-in online here + m_pSQRNet_Vita->AttemptPSNSignIn(NULL, NULL); + } + + +#endif + + m_pGameNetworkManager = pGameNetworkManager; + m_flagIndexSize = flagIndexSize; + g_pPlatformNetworkManager = this; + for( int i = 0; i < XUSER_MAX_COUNT; i++ ) + { + playerChangedCallback[ i ] = NULL; + } + + m_bLeavingGame = false; + m_bLeaveGameOnTick = false; + m_bHostChanged = false; + m_bLeaveRoomWhenLeavingGame = true; + + m_bSearchPending = false; + + m_bIsOfflineGame = false; + m_pSearchParam = NULL; + m_SessionsUpdatedCallback = NULL; + + m_searchResultsCount = 0; + m_pSearchResults = NULL; + + m_lastSearchStartTime = 0; + + // Success! + return true; +} + +void CPlatformNetworkManagerSony::Terminate() +{ + m_pSQRNet->Terminate(); +} + +int CPlatformNetworkManagerSony::GetJoiningReadyPercentage() +{ + return m_pSQRNet->GetJoiningReadyPercentage(); +} + +int CPlatformNetworkManagerSony::CorrectErrorIDS(int IDS) +{ + // Attempts to remap the following messages to provide something that PS3 TCRs are happier with + // + // IDS_CONNECTION_LOST - "Connection lost" + // IDS_CONNECTION_FAILED - "Connection failed" + // IDS_CONNECTION_LOST_LIVE - "Connection to "PSN" was lost. Exiting to the main menu." + // IDS_CONNECTION_LOST_LIVE_NO_EXIT - "Connection to "PSN" was lost." + // IDS_CONNECTION_LOST_SERVER - "Connection to the server was lost. Exiting to the main menu." + // + // Map to: + // + // IDS_ERROR_NETWORK - "A network error has occurred" + // IDS_ERROR_NETWORK_TITLE - "Network Error" + // IDS_ERROR_NETWORK_EXIT - "A network error has occurred. Exiting to Main Menu." + // IDS_ERROR_PSN_SIGN_OUT - You have been signed out from the "PSN". + // IDS_ERROR_PSN_SIGN_OUT_EXIT - You have been signed out from the "PSN". Exiting to Main Menu + + // Determine if we'd prefer to present errors as a signing out issue, rather than a network issue, based on whether we have a network connection at all or not + bool preferSignoutError = false; + int state; +#ifdef __PS3__ + int ret = cellNetCtlGetState( &state ); + int IPObtainedState = CELL_NET_CTL_STATE_IPObtained; +#elif defined __ORBIS__ + int ret = sceNetCtlGetState( &state ); + int IPObtainedState = SCE_NET_CTL_STATE_IPOBTAINED; +#elif defined __PSVITA__ + int ret = sceNetCtlInetGetState( &state ); + int IPObtainedState = SCE_NET_CTL_STATE_IPOBTAINED; +#endif + if( ret == 0 ) + { + if( state == IPObtainedState ) + { + preferSignoutError = true; + } + } + +#ifdef __PSVITA__ + // If we're in ad-hoc mode this problem definitely wasn't PSN related + if (usingAdhocMode()) preferSignoutError = false; +#endif + + // If we're the host we haven't lost connection to the server + if (IDS == IDS_CONNECTION_LOST_SERVER && g_NetworkManager.IsHost()) + { + IDS = IDS_CONNECTION_LOST_LIVE; + } + + switch(IDS) + { + case IDS_CONNECTION_LOST: + case IDS_CONNECTION_FAILED: + return IDS_ERROR_NETWORK_TITLE; + case IDS_CONNECTION_LOST_LIVE: + if( preferSignoutError ) + { + return IDS_ERROR_PSN_SIGN_OUT_EXIT; + } + else + { + return IDS_ERROR_NETWORK_EXIT; + } + case IDS_CONNECTION_LOST_LIVE_NO_EXIT: + if( preferSignoutError ) + { + return IDS_ERROR_PSN_SIGN_OUT; + } + else + { + return IDS_ERROR_NETWORK_TITLE; + } + break; +#ifdef __PSVITA__ + case IDS_CONNECTION_LOST_SERVER: + if(preferSignoutError) + { + if(ProfileManager.IsSignedInPSN(ProfileManager.GetPrimaryPad()) == false) + return IDS_ERROR_PSN_SIGN_OUT_EXIT; + } +#endif + default: + return IDS; + } + + +} + +bool CPlatformNetworkManagerSony::isSystemPrimaryPlayer(SQRNetworkPlayer *pSQRPlayer) +{ + bool playerIsSystemPrimary = false; + for(AUTO_VAR(it, m_machineSQRPrimaryPlayers.begin()); it < m_machineSQRPrimaryPlayers.end(); ++it) + { + SQRNetworkPlayer *pSQRPrimaryPlayer = *it; + if( pSQRPrimaryPlayer == pSQRPlayer ) + { + playerIsSystemPrimary = true; + break; + } + } + return playerIsSystemPrimary; +} + +// We call this twice a frame, either side of the render call so is a good place to "tick" things +void CPlatformNetworkManagerSony::DoWork() +{ +#if 0 + DWORD dwNotifyId; + ULONG_PTR ulpNotifyParam; + + while( XNotifyGetNext( + m_notificationListener, + 0, // Any notification + &dwNotifyId, + &ulpNotifyParam) + ) + { + + switch(dwNotifyId) + { + + case XN_SYS_SIGNINCHANGED: + app.DebugPrintf("Signinchanged - %d\n", ulpNotifyParam); + break; + case XN_LIVE_INVITE_ACCEPTED: + // ignore these - we're catching them from the game listener, so we can get the one from the dashboard + break; + default: + m_pIQNet->Notify(dwNotifyId,ulpNotifyParam); + break; + } + + } + + TickSearch(); + + if( m_bLeaveGameOnTick ) + { + m_pIQNet->LeaveGame(m_migrateHostOnLeave); + m_bLeaveGameOnTick = false; + } + + m_pIQNet->DoWork(); +#else + TickSearch(); + + if( m_bLeaveGameOnTick ) + { + m_pSQRNet->LeaveRoom(m_bLeaveRoomWhenLeavingGame); + m_bLeaveGameOnTick = false; + } + + m_pSQRNet->Tick(); +#endif +} + +int CPlatformNetworkManagerSony::GetPlayerCount() +{ + return m_pSQRNet->GetPlayerCount(); +} + +bool CPlatformNetworkManagerSony::ShouldMessageForFullSession() +{ + return false; +} + +int CPlatformNetworkManagerSony::GetOnlinePlayerCount() +{ + return m_pSQRNet->GetOnlinePlayerCount(); +} + +int CPlatformNetworkManagerSony::GetLocalPlayerMask(int playerIndex) +{ + return 1 << playerIndex; +} + +bool CPlatformNetworkManagerSony::AddLocalPlayerByUserIndex( int userIndex ) +{ + return m_pSQRNet->AddLocalPlayerByUserIndex(userIndex); +} + +bool CPlatformNetworkManagerSony::RemoveLocalPlayerByUserIndex( int userIndex ) +{ + SQRNetworkPlayer *pSQRPlayer = m_pSQRNet->GetLocalPlayerByUserIndex(userIndex); + INetworkPlayer *pNetworkPlayer = getNetworkPlayer(pSQRPlayer); + + if(pNetworkPlayer != NULL) + { + Socket *socket = pNetworkPlayer->GetSocket(); + + if( socket != NULL ) + { + // We can't remove the player from qnet until we have stopped using it to communicate + C4JThread* thread = new C4JThread(&CPlatformNetworkManagerSony::RemovePlayerOnSocketClosedThreadProc, pNetworkPlayer, "RemovePlayerOnSocketClosed"); + thread->SetProcessor( CPU_CORE_REMOVE_PLAYER ); + thread->Run(); + } + else + { + // Safe to remove the player straight away + return m_pSQRNet->RemoveLocalPlayerByUserIndex(userIndex); + } + } + return true; +} + +bool CPlatformNetworkManagerSony::IsInStatsEnabledSession() +{ +#if 0 + DWORD dataSize = sizeof(QNET_LIVE_STATS_MODE); + QNET_LIVE_STATS_MODE statsMode; + m_pIQNet->GetOpt(QNET_OPTION_LIVE_STATS_MODE, &statsMode , &dataSize ); + + // Use QNET_LIVE_STATS_MODE_AUTO if there is another way to check if stats are enabled or not + bool statsEnabled = statsMode == QNET_LIVE_STATS_MODE_ENABLED; + return m_pIQNet->GetState() != QNET_STATE_IDLE && statsEnabled; +#endif + return true; +} + +bool CPlatformNetworkManagerSony::SessionHasSpace(unsigned int spaceRequired /*= 1*/) +{ + return m_pSQRNet->SessionHasSpace(spaceRequired); +#if 0 + // This function is used while a session is running, so all players trying to join + // should use public slots, + DWORD publicSlots = 0; + DWORD filledPublicSlots = 0; + DWORD privateSlots = 0; + DWORD filledPrivateSlots = 0; + + DWORD dataSize = sizeof(DWORD); + m_pIQNet->GetOpt(QNET_OPTION_TOTAL_PUBLIC_SLOTS, &publicSlots, &dataSize ); + m_pIQNet->GetOpt(QNET_OPTION_FILLED_PUBLIC_SLOTS, &filledPublicSlots, &dataSize ); + m_pIQNet->GetOpt(QNET_OPTION_TOTAL_PRIVATE_SLOTS, &privateSlots, &dataSize ); + m_pIQNet->GetOpt(QNET_OPTION_FILLED_PRIVATE_SLOTS, &filledPrivateSlots, &dataSize ); + + DWORD spaceLeft = (publicSlots - filledPublicSlots) + (privateSlots - filledPrivateSlots); + + return spaceLeft >= spaceRequired; +#else + return true; +#endif +} + +void CPlatformNetworkManagerSony::SendInviteGUI(int quadrant) +{ + m_pSQRNet->SendInviteGUI(); +} + +bool CPlatformNetworkManagerSony::IsAddingPlayer() +{ + return false; +} + +bool CPlatformNetworkManagerSony::LeaveGame(bool bMigrateHost) +{ + if( m_bLeavingGame ) return true; + + m_bLeavingGame = true; + + // If we are a client, wait for all client connections to close + // TODO Possibly need to do multiple objects depending on how split screen online works + SQRNetworkPlayer *pSQRPlayer = m_pSQRNet->GetLocalPlayerByUserIndex(g_NetworkManager.GetPrimaryPad()); + INetworkPlayer *pNetworkPlayer = getNetworkPlayer(pSQRPlayer); + + if(pNetworkPlayer != NULL) + { + Socket *socket = pNetworkPlayer->GetSocket(); + + if( socket != NULL ) + { + //printf("Waiting for socket closed event\n"); + DWORD result = socket->m_socketClosedEvent->WaitForSignal(INFINITE); + + // The session might be gone once the socket releases + if( IsInSession() ) + { + //printf("Socket closed event has fired\n"); + // 4J Stu - Clear our reference to this socket + pSQRPlayer = m_pSQRNet->GetLocalPlayerByUserIndex(g_NetworkManager.GetPrimaryPad()); + pNetworkPlayer = getNetworkPlayer(pSQRPlayer); + pNetworkPlayer->SetSocket( NULL ); + } + delete socket; + } + else + { + //printf("Socket is already NULL\n"); + } + } + + // If we are the host wait for the game server to end + if(m_pSQRNet->IsHost() && g_NetworkManager.ServerStoppedValid()) + { + m_pSQRNet->EndGame(); + g_NetworkManager.ServerStoppedWait(); + g_NetworkManager.ServerStoppedDestroy(); + } + + return _LeaveGame(bMigrateHost, true); +} + +bool CPlatformNetworkManagerSony::_LeaveGame(bool bMigrateHost, bool bLeaveRoom) +{ + // 4J Stu - Fix for #10490 - TCR 001 BAS Game Stability: When a party of four players leave a world to join another world without saving the title will crash. + // Changed this to make it threadsafe + m_bLeavingGame = true; // Added for Sony platforms but unsure why the 360 doesn't need it - without this, the leaving triggered by this causes the game to respond by leaving again when it transitions to the SNM_STATE_ENDING state + m_bLeaveRoomWhenLeavingGame = bLeaveRoom; + m_bLeaveGameOnTick = true; + m_migrateHostOnLeave = bMigrateHost; + + return true; +} + +void CPlatformNetworkManagerSony::HostGame(int localUsersMask, bool bOnlineGame, bool bIsPrivate, unsigned char publicSlots /*= MINECRAFT_NET_MAX_PLAYERS*/, unsigned char privateSlots /*= 0*/) +{ +// #ifdef _XBOX + // 4J Stu - We probably did this earlier as well, but just to be sure! + SetLocalGame( !bOnlineGame ); + SetPrivateGame( bIsPrivate ); + SystemFlagReset(); + + // Make sure that the Primary Pad is in by default + localUsersMask |= GetLocalPlayerMask( g_NetworkManager.GetPrimaryPad() ); + + _HostGame( localUsersMask, publicSlots, privateSlots ); +//#endif +} + +void CPlatformNetworkManagerSony::_HostGame(int usersMask, unsigned char publicSlots /*= MINECRAFT_NET_MAX_PLAYERS*/, unsigned char privateSlots /*= 0*/) +{ + // Start hosting a new game + + memset(&m_hostGameSessionData,0,sizeof(m_hostGameSessionData)); + m_hostGameSessionData.netVersion = MINECRAFT_NET_VERSION; + m_hostGameSessionData.isJoinable = !IsPrivateGame(); + m_hostGameSessionData.isReadyToJoin = false; + m_hostGameSessionData.playerCount = 0; + m_hostGameSessionData.m_uiGameHostSettings = app.GetGameHostOption(eGameHostOption_All); + for( int i = 0; i < SQRNetworkManager::MAX_LOCAL_PLAYER_COUNT; i++ ) + { + if( usersMask & ( 1 << i ) ) + { + m_hostGameSessionData.playerCount++; + } + } + + m_pSQRNet->CreateAndJoinRoom(g_NetworkManager.GetPrimaryPad(),usersMask, &m_hostGameSessionData, sizeof(m_hostGameSessionData), IsLocalGame()); // Should be using: g_NetworkManager.GetLockedProfile() but that isn't being set currently +} + +bool CPlatformNetworkManagerSony::_StartGame() +{ +#if 0 + // Set the options that now allow players to join this game + BOOL enableJip = TRUE; // Must always be true othewise nobody can join the game while in the PLAY state + m_pIQNet->SetOpt( QNET_OPTION_JOIN_IN_PROGRESS_ALLOWED, &enableJip, sizeof BOOL ); + BOOL enableInv = !IsLocalGame(); + m_pIQNet->SetOpt( QNET_OPTION_INVITES_ALLOWED, &enableInv, sizeof BOOL ); + BOOL enablePres = !IsPrivateGame() && !IsLocalGame(); + m_pIQNet->SetOpt( QNET_OPTION_PRESENCE_JOIN_MODE, &enablePres, sizeof BOOL ); + + return ( m_pIQNet->StartGame() == S_OK ); +#else + m_pSQRNet->StartGame(); + return true; +#endif +} + +int CPlatformNetworkManagerSony::JoinGame(FriendSessionInfo *searchResult, int localUsersMask, int primaryUserIndex) +{ + int joinPlayerCount = 0; + for( int i = 0; i < SQRNetworkManager::MAX_LOCAL_PLAYER_COUNT; i++ ) + { + if( localUsersMask & ( 1 << i ) ) + { + joinPlayerCount++; + } + } + GameSessionData *gameSession = (GameSessionData *)(&searchResult->data); + if( ( gameSession->playerCount + joinPlayerCount ) > SQRNetworkManager::MAX_ONLINE_PLAYER_COUNT ) + { + return CGameNetworkManager::JOINGAME_FAIL_SERVER_FULL; + } + + if( m_pSQRNet->JoinRoom(&searchResult->searchResult, localUsersMask) ) + { + return CGameNetworkManager::JOINGAME_SUCCESS; + } + else + { + return CGameNetworkManager::JOINGAME_FAIL_GENERAL; + } +} + +bool CPlatformNetworkManagerSony::SetLocalGame(bool isLocal) +{ + if( m_pSQRNet->GetState() == SQRNetworkManager::SNM_STATE_IDLE) + { +#if 0 + QNET_SESSIONTYPE sessionType = isLocal ? QNET_SESSIONTYPE_LOCAL : QNET_SESSIONTYPE_LIVE_STANDARD; + m_pIQNet->SetOpt(QNET_OPTION_TYPE_SESSIONTYPE, &sessionType , sizeof QNET_SESSIONTYPE); + + // The default value for this is QNET_LIVE_STATS_MODE_AUTO, but that decides based on the players + // in when the game starts. As we may want a non-live player to join the game we cannot have stats enabled + // when we create the sessions. As a result of this, the NotifyWriteStats callback will not be called for + // LIVE players that are connected to LIVE so we write their stats data on a state change. + QNET_LIVE_STATS_MODE statsMode = isLocal ? QNET_LIVE_STATS_MODE_DISABLED : QNET_LIVE_STATS_MODE_ENABLED; + m_pIQNet->SetOpt(QNET_OPTION_LIVE_STATS_MODE, &statsMode , sizeof QNET_LIVE_STATS_MODE); + + // Also has a default of QNET_LIVE_PRESENCE_MODE_AUTO as above, although the effects are less of an issue + QNET_LIVE_PRESENCE_MODE presenceMode = isLocal ? QNET_LIVE_PRESENCE_MODE_NOT_ADVERTISED : QNET_LIVE_PRESENCE_MODE_ADVERTISED; + m_pIQNet->SetOpt(QNET_OPTION_LIVE_PRESENCE_MODE, &presenceMode , sizeof QNET_LIVE_PRESENCE_MODE); +#endif + + m_bIsOfflineGame = isLocal; + app.DebugPrintf("Setting as local game: %s\n", isLocal ? "yes" : "no" ); + } + else + { + app.DebugPrintf("Tried to change session type while not in idle or offline state\n"); + } + + return true; +} + +void CPlatformNetworkManagerSony::SetPrivateGame(bool isPrivate) +{ + app.DebugPrintf("Setting as private game: %s\n", isPrivate ? "yes" : "no" ); + m_bIsPrivateGame = isPrivate; +} + +void CPlatformNetworkManagerSony::RegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam) +{ + playerChangedCallback[iPad] = callback; + playerChangedCallbackParam[iPad] = callbackParam; +} + +void CPlatformNetworkManagerSony::UnRegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam) +{ + if(playerChangedCallbackParam[iPad] == callbackParam) + { + playerChangedCallback[iPad] = NULL; + playerChangedCallbackParam[iPad] = NULL; + } +} + +void CPlatformNetworkManagerSony::HandleSignInChange() +{ + return; +} + +bool CPlatformNetworkManagerSony::_RunNetworkGame() +{ +#if 0 + // We delay actually starting the session so that we know the game server is running by the time the clients try to join + // This does result in a host advantage + HRESULT hr = m_pIQNet->StartGame(); + if(FAILED(hr)) return false; + + // Set the options that now allow players to join this game + BOOL enableJip = TRUE; // Must always be true othewise nobody can join the game while in the PLAY state + m_pIQNet->SetOpt( QNET_OPTION_JOIN_IN_PROGRESS_ALLOWED, &enableJip, sizeof BOOL ); + BOOL enableInv = !IsLocalGame(); + m_pIQNet->SetOpt( QNET_OPTION_INVITES_ALLOWED, &enableInv, sizeof BOOL ); + BOOL enablePres = !IsPrivateGame() && !IsLocalGame(); + m_pIQNet->SetOpt( QNET_OPTION_PRESENCE_JOIN_MODE, &enablePres, sizeof BOOL ); +#endif + if( IsHost() ) + { + m_pSQRNet->StartGame(); + m_hostGameSessionData.isReadyToJoin = true; + m_pSQRNet->UpdateExternalRoomData(); + m_pSQRNet->SetPresenceDataStartHostingGame(); + } + + return true; +} + +// Note that this does less than the xbox equivalent as we have HandleResyncPlayerRequest that is called by the underlying SQRNetworkManager when players are added/removed etc., so this +// call is only used to update the game host settings & then do the final push out of the data. +void CPlatformNetworkManagerSony::UpdateAndSetGameSessionData(INetworkPlayer *pNetworkPlayerLeaving /*= NULL*/) +{ + if( this->m_bLeavingGame ) + return; + + m_hostGameSessionData.hostPlayerUID = GetHostPlayer()->GetUID(); +#ifdef __PSVITA__ + if(usingAdhocMode()) + { + m_hostGameSessionData.hostPlayerUID.setForAdhoc(); + } +#endif + + m_hostGameSessionData.m_uiGameHostSettings = app.GetGameHostOption(eGameHostOption_All); + + // If this is called With a pNetworkPlayerLeaving, then the call has ultimately started within SQRNetworkManager::RemoveRemotePlayersAndSync, so we don't need to sync each change + // as that function does a sync at the end of all changes. + if( pNetworkPlayerLeaving == NULL ) + { + m_pSQRNet->UpdateExternalRoomData(); + } +} + +int CPlatformNetworkManagerSony::RemovePlayerOnSocketClosedThreadProc( void* lpParam ) +{ + INetworkPlayer *pNetworkPlayer = (INetworkPlayer *)lpParam; + + Socket *socket = pNetworkPlayer->GetSocket(); + + if( socket != NULL ) + { + //printf("Waiting for socket closed event\n"); + socket->m_socketClosedEvent->WaitForSignal(INFINITE); + + //printf("Socket closed event has fired\n"); + // 4J Stu - Clear our reference to this socket + pNetworkPlayer->SetSocket( NULL ); + delete socket; + } + + return g_pPlatformNetworkManager->RemoveLocalPlayer( pNetworkPlayer ); +} + +bool CPlatformNetworkManagerSony::RemoveLocalPlayer( INetworkPlayer *pNetworkPlayer ) +{ + if( pNetworkPlayer->IsLocal() ) + { + return m_pSQRNet->RemoveLocalPlayerByUserIndex( pNetworkPlayer->GetUserIndex() ); + } + + return true; +} + +CPlatformNetworkManagerSony::PlayerFlags::PlayerFlags(INetworkPlayer *pNetworkPlayer, unsigned int count) +{ + // 4J Stu - Don't assert, just make it a multiple of 8! This count is calculated from a load of separate values, + // and makes tweaking world/render sizes a pain if we hit an assert here + count = (count + 8 - 1) & ~(8 - 1); + //assert( ( count % 8 ) == 0 ); + this->m_pNetworkPlayer = pNetworkPlayer; + this->flags = new unsigned char [ count / 8 ]; + memset( this->flags, 0, count / 8 ); + this->count = count; +} +CPlatformNetworkManagerSony::PlayerFlags::~PlayerFlags() +{ + delete [] flags; +} + +// Add a player to the per system flag storage - if we've already got a player from that system, copy its flags over +void CPlatformNetworkManagerSony::SystemFlagAddPlayer(INetworkPlayer *pNetworkPlayer) +{ + PlayerFlags *newPlayerFlags = new PlayerFlags( pNetworkPlayer, m_flagIndexSize); + // If any of our existing players are on the same system, then copy over flags from that one + for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) + { + if( pNetworkPlayer->IsSameSystem(m_playerFlags[i]->m_pNetworkPlayer) ) + { + memcpy( newPlayerFlags->flags, m_playerFlags[i]->flags, m_playerFlags[i]->count / 8 ); + break; + } + } + m_playerFlags.push_back(newPlayerFlags); +} + +// Remove a player from the per system flag storage - just maintains the m_playerFlags vector without any gaps in it +void CPlatformNetworkManagerSony::SystemFlagRemovePlayer(INetworkPlayer *pNetworkPlayer) +{ + for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) + { + if( m_playerFlags[i]->m_pNetworkPlayer == pNetworkPlayer ) + { + delete m_playerFlags[i]; + m_playerFlags[i] = m_playerFlags.back(); + m_playerFlags.pop_back(); + return; + } + } +} + +void CPlatformNetworkManagerSony::SystemFlagReset() +{ + for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) + { + delete m_playerFlags[i]; + } + m_playerFlags.clear(); +} + +// Set a per system flag - this is done by setting the flag on every player that shares that system +void CPlatformNetworkManagerSony::SystemFlagSet(INetworkPlayer *pNetworkPlayer, int index) +{ + if( ( index < 0 ) || ( index >= m_flagIndexSize ) ) return; + if( pNetworkPlayer == NULL ) return; + + for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) + { + if( pNetworkPlayer->IsSameSystem(m_playerFlags[i]->m_pNetworkPlayer) ) + { + m_playerFlags[i]->flags[ index / 8 ] |= ( 128 >> ( index % 8 ) ); + } + } +} + +// Get value of a per system flag - can be read from the flags of the passed in player as anything else sent to that +// system should also have been duplicated here +bool CPlatformNetworkManagerSony::SystemFlagGet(INetworkPlayer *pNetworkPlayer, int index) +{ + if( ( index < 0 ) || ( index >= m_flagIndexSize ) ) return false; + if( pNetworkPlayer == NULL ) + { + return false; + } + + for( unsigned int i = 0; i < m_playerFlags.size(); i++ ) + { + if( m_playerFlags[i]->m_pNetworkPlayer == pNetworkPlayer ) + { + return ( ( m_playerFlags[i]->flags[ index / 8 ] & ( 128 >> ( index % 8 ) ) ) != 0 ); + } + } + return false; +} + +wstring CPlatformNetworkManagerSony::GatherStats() +{ +#if 0 + return L"Queue messages: " + _toString(((NetworkPlayerXbox *)GetHostPlayer())->GetQNetPlayer()->GetSendQueueSize( NULL, QNET_GETSENDQUEUESIZE_MESSAGES ) ) + + L" Queue bytes: " + _toString( ((NetworkPlayerXbox *)GetHostPlayer())->GetQNetPlayer()->GetSendQueueSize( NULL, QNET_GETSENDQUEUESIZE_BYTES ) ); +#else + return L""; +#endif +} + +wstring CPlatformNetworkManagerSony::GatherRTTStats() +{ +#if 0 + wstring stats(L"Rtt: "); + + wchar_t stat[32]; + + for(unsigned int i = 0; i < GetPlayerCount(); ++i) + { + SQRNetworkPlayer *pSQRPlayer = ((NetworkPlayerXbox *)GetPlayerByIndex( i ))->GetQNetPlayer(); + + if(!pSQRPlayer->IsLocal()) + { + ZeroMemory(stat,32); + swprintf(stat, 32, L"%d: %d/", i, pSQRPlayer->GetCurrentRtt() ); + stats.append(stat); + } + } + return stats; +#else + return L""; +#endif +} + +void CPlatformNetworkManagerSony::TickSearch() +{ + if( m_bSearchPending ) + { + if( !m_pSQRNet->FriendRoomManagerIsBusy() ) + { + m_searchResultsCount = m_pSQRNet->FriendRoomManagerGetCount(); + delete m_pSearchResults; + m_pSearchResults = new SQRNetworkManager::SessionSearchResult[m_searchResultsCount]; + + for( int i = 0; i < m_searchResultsCount; i++ ) + { + m_pSQRNet->FriendRoomManagerGetRoomInfo(i, &m_pSearchResults[i] ); + } + m_bSearchPending = false; + + if( m_SessionsUpdatedCallback != NULL ) m_SessionsUpdatedCallback(m_pSearchParam); + } + } + else + { + if( !m_pSQRNet->FriendRoomManagerIsBusy() ) + { + // Don't start searches unless we have registered a callback + int searchDelay = MINECRAFT_PS3ROOM_SEARCH_DELAY_MILLISECONDS; +#ifdef __PSVITA__ + // in adhoc mode we can keep searching, as the friend list is populated in callbacks + // 4J Stu - Every second seems a bit much as it makes the friend list flash every time it updates. Changed this to 5 seconds. + if( usingAdhocMode()) + searchDelay = 5000; +#endif + if( m_SessionsUpdatedCallback != NULL && (m_lastSearchStartTime + searchDelay) < GetTickCount() ) + { + if( m_pSQRNet->FriendRoomManagerSearch() ) + { + m_bSearchPending = true; + m_lastSearchStartTime = GetTickCount(); + } + } + } + } +} + +vector *CPlatformNetworkManagerSony::GetSessionList(int iPad, int localPlayers, bool partyOnly) +{ + vector *filteredList = new vector(); + for( int i = 0; i < m_searchResultsCount; i++ ) + { + if( m_pSearchResults[i].m_extData ) + { + FriendSessionInfo *newInfo = new FriendSessionInfo(); + newInfo->displayLabel = new wchar_t[17]; + ZeroMemory(newInfo->displayLabel, sizeof(wchar_t)*17); + // TODO - this mbstowcs shouldn't encounter any non-ascii characters, but I imagine we'll want to actually use the online name here which is UTF-8 + mbstowcs(newInfo->displayLabel, m_pSearchResults[i].m_NpId.handle.data, 17); + newInfo->displayLabelLength = strlen(m_pSearchResults[i].m_NpId.handle.data); + newInfo->hasPartyMember = false; + newInfo->searchResult = m_pSearchResults[i]; + newInfo->sessionId = m_pSearchResults[i].m_sessionId; + memcpy(&newInfo->data, m_pSearchResults[i].m_extData, sizeof(GameSessionData)); + if( ( newInfo->data.isReadyToJoin ) && + ( newInfo->data.isJoinable ) && + ( newInfo->data.netVersion == MINECRAFT_NET_VERSION ) ) + { + filteredList->push_back(newInfo); + } + else + { + delete newInfo; + } + } + } + + return filteredList; +} + +bool CPlatformNetworkManagerSony::GetGameSessionInfo(int iPad, SessionID sessionId, FriendSessionInfo *foundSessionInfo) +{ +#if 0 + HRESULT hr = E_FAIL; + + const XSESSION_SEARCHRESULT *pSearchResult; + const XNQOSINFO * pxnqi; + + if( m_currentSearchResultsCount[iPad] > 0 ) + { + // Loop through all the results. + for( DWORD dwResult = 0; dwResult < m_currentSearchResultsCount[iPad]; dwResult++ ) + { + pSearchResult = &m_pCurrentSearchResults[iPad]->pResults[dwResult]; + + if(memcmp( &pSearchResult->info.sessionID, &sessionId, sizeof(SessionID) ) != 0) continue; + + bool foundSession = false; + FriendSessionInfo *sessionInfo = NULL; + AUTO_VAR(itFriendSession, friendsSessions[iPad].begin()); + for(itFriendSession = friendsSessions[iPad].begin(); itFriendSession < friendsSessions[iPad].end(); ++itFriendSession) + { + sessionInfo = *itFriendSession; + if(memcmp( &pSearchResult->info.sessionID, &sessionInfo->sessionId, sizeof(SessionID) ) == 0) + { + sessionInfo->searchResult = *pSearchResult; + sessionInfo->displayLabel = new wchar_t[100]; + ZeroMemory( sessionInfo->displayLabel, 100 * sizeof(wchar_t) ); + foundSession = true; + break; + } + } + + // We received a search result for a session no longer in our list of friends sessions + if(!foundSession) break; + + // See if this result was contacted successfully via QoS probes. + pxnqi = &m_pCurrentQoSResult[iPad]->axnqosinfo[dwResult]; + if( pxnqi->bFlags & XNET_XNQOSINFO_TARGET_CONTACTED ) + { + + if(pxnqi->cbData > 0) + { + sessionInfo->data = *(GameSessionData *)pxnqi->pbData; + + wstring gamerName = convStringToWstring(sessionInfo->data.hostName); + swprintf(sessionInfo->displayLabel,app.GetString(IDS_GAME_HOST_NAME),L"MWWWWWWWWWWWWWWM");// gamerName.c_str() ); + } + else + { + swprintf(sessionInfo->displayLabel,app.GetString(IDS_GAME_HOST_NAME_UNKNOWN)); + } + sessionInfo->displayLabelLength = wcslen( sessionInfo->displayLabel ); + + // If this host wasn't disabled use this one. + if( !( pxnqi->bFlags & XNET_XNQOSINFO_TARGET_DISABLED ) && + sessionInfo->data.netVersion == MINECRAFT_NET_VERSION && + sessionInfo->data.isJoinable) + { + foundSessionInfo->data = sessionInfo->data; + if(foundSessionInfo->displayLabel != NULL) delete [] foundSessionInfo->displayLabel; + foundSessionInfo->displayLabel = new wchar_t[100]; + memcpy(foundSessionInfo->displayLabel, sessionInfo->displayLabel, 100 * sizeof(wchar_t) ); + foundSessionInfo->displayLabelLength = sessionInfo->displayLabelLength; + foundSessionInfo->hasPartyMember = sessionInfo->hasPartyMember; + foundSessionInfo->searchResult = sessionInfo->searchResult; + foundSessionInfo->sessionId = sessionInfo->sessionId; + + hr = S_OK; + } + } + } + } + + return ( hr == S_OK ); +#else + return false; +#endif +} + +void CPlatformNetworkManagerSony::SetSessionsUpdatedCallback( void (*SessionsUpdatedCallback)(LPVOID pParam), LPVOID pSearchParam ) +{ + m_SessionsUpdatedCallback = SessionsUpdatedCallback; m_pSearchParam = pSearchParam; +} + +void CPlatformNetworkManagerSony::GetFullFriendSessionInfo( FriendSessionInfo *foundSession, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ) +{ + m_pSQRNet->GetExtDataForRoom( foundSession->sessionId.m_RoomId, &foundSession->data, FriendSessionUpdatedFn, pParam); +} + +void CPlatformNetworkManagerSony::ForceFriendsSessionRefresh() +{ + app.DebugPrintf("Resetting friends session search data\n"); + m_lastSearchStartTime = 0; + m_searchResultsCount = 0; + delete m_pSearchResults; + m_pSearchResults = NULL; +} + +INetworkPlayer *CPlatformNetworkManagerSony::addNetworkPlayer(SQRNetworkPlayer *pSQRPlayer) +{ + NetworkPlayerSony *pNetworkPlayer = new NetworkPlayerSony(pSQRPlayer); + pSQRPlayer->SetCustomDataValue((ULONG_PTR)pNetworkPlayer); + currentNetworkPlayers.push_back( pNetworkPlayer ); + return pNetworkPlayer; +} + +void CPlatformNetworkManagerSony::removeNetworkPlayer(SQRNetworkPlayer *pSQRPlayer) +{ + INetworkPlayer *pNetworkPlayer = getNetworkPlayer(pSQRPlayer); + for( AUTO_VAR(it, currentNetworkPlayers.begin()); it != currentNetworkPlayers.end(); it++ ) + { + if( *it == pNetworkPlayer ) + { + currentNetworkPlayers.erase(it); + return; + } + } +} + +INetworkPlayer *CPlatformNetworkManagerSony::getNetworkPlayer(SQRNetworkPlayer *pSQRPlayer) +{ + return pSQRPlayer ? (INetworkPlayer *)(pSQRPlayer->GetCustomDataValue()) : NULL; +} + + +INetworkPlayer *CPlatformNetworkManagerSony::GetLocalPlayerByUserIndex(int userIndex ) +{ + return getNetworkPlayer(m_pSQRNet->GetLocalPlayerByUserIndex(userIndex)); +} + +INetworkPlayer *CPlatformNetworkManagerSony::GetPlayerByIndex(int playerIndex) +{ + return getNetworkPlayer(m_pSQRNet->GetPlayerByIndex(playerIndex)); +} + +INetworkPlayer * CPlatformNetworkManagerSony::GetPlayerByXuid(PlayerUID xuid) +{ + return getNetworkPlayer(m_pSQRNet->GetPlayerByXuid(xuid)); +} + +INetworkPlayer * CPlatformNetworkManagerSony::GetPlayerBySmallId(unsigned char smallId) +{ + return getNetworkPlayer(m_pSQRNet->GetPlayerBySmallId(smallId)); +} + +INetworkPlayer *CPlatformNetworkManagerSony::GetHostPlayer() +{ + return getNetworkPlayer(m_pSQRNet->GetHostPlayer()); +} + +bool CPlatformNetworkManagerSony::IsHost() +{ + return m_pSQRNet->IsHost() && !m_bHostChanged; +} + +bool CPlatformNetworkManagerSony::JoinGameFromInviteInfo( int userIndex, int userMask, const INVITE_INFO *pInviteInfo) +{ + return m_pSQRNet->JoinRoom( pInviteInfo->m_RoomId, pInviteInfo->m_ServerId, userMask, pInviteInfo ); +} + +void CPlatformNetworkManagerSony::SetSessionTexturePackParentId( int id ) +{ + m_hostGameSessionData.texturePackParentId = id; +} + +void CPlatformNetworkManagerSony::SetSessionSubTexturePackId( int id ) +{ + m_hostGameSessionData.subTexturePackId = id; +} + +void CPlatformNetworkManagerSony::Notify(int ID, ULONG_PTR Param) +{ +#if 0 + m_pSQRNet->Notify( ID, Param ); +#endif +} + +bool CPlatformNetworkManagerSony::IsInSession() +{ + return m_pSQRNet->IsInSession(); +} + +bool CPlatformNetworkManagerSony::IsInGameplay() +{ + return m_pSQRNet->GetState() == SQRNetworkManager::SNM_STATE_PLAYING; +} + +bool CPlatformNetworkManagerSony::IsReadyToPlayOrIdle() +{ + return m_pSQRNet->IsReadyToPlayOrIdle(); +} + +void CPlatformNetworkManagerSony::SetSQRPresenceInfoFromExtData(SQRNetworkManager::PresenceSyncInfo *presence, void *pExtData, SceNpMatching2RoomId roomId, SceNpMatching2ServerId serverId) +{ + GameSessionData *gsd = (GameSessionData *)pExtData; + + memcpy(&presence->hostPlayerUID, &gsd->hostPlayerUID, sizeof(GameSessionUID) ); + presence->m_RoomId = roomId; + presence->m_ServerId = serverId; + presence->texturePackParentId = gsd->texturePackParentId; + presence->subTexturePackId = gsd->subTexturePackId; + presence->netVersion = gsd->netVersion; + presence->inviteOnly = !gsd->isJoinable; +} + +void CPlatformNetworkManagerSony::MallocAndSetExtDataFromSQRPresenceInfo(void **pExtData, SQRNetworkManager::PresenceSyncInfo *presence) +{ + GameSessionData *gsd = (GameSessionData *)malloc(sizeof(GameSessionData)); + memset(gsd, 0, sizeof(GameSessionData)); + if( presence->netVersion != 0 ) + { + memcpy(&gsd->hostPlayerUID, &presence->hostPlayerUID, sizeof(GameSessionUID) ); + gsd->texturePackParentId = presence->texturePackParentId; + gsd->subTexturePackId = presence->subTexturePackId; + gsd->netVersion = presence->netVersion; + gsd->isJoinable = !presence->inviteOnly; + gsd->isReadyToJoin = true; + } + *pExtData = gsd; +} + +#ifdef __PSVITA__ +bool CPlatformNetworkManagerSony::setAdhocMode( bool bAdhoc ) +{ + if(m_bUsingAdhocMode != bAdhoc) + { + m_bUsingAdhocMode = bAdhoc; + if(m_bUsingAdhocMode) + { + // uninit the PSN, and init adhoc + if(m_pSQRNet_Vita->IsInitialised()) + { + m_pSQRNet_Vita->UnInitialise(); + } + + if(m_pSQRNet_Vita_Adhoc->IsInitialised()==false) + { + m_pSQRNet_Vita_Adhoc->Initialise(); + } + + m_pSQRNet = m_pSQRNet_Vita_Adhoc; + } + else + { + if(m_pSQRNet_Vita_Adhoc->IsInitialised()) + { + int ret = sceNetCtlAdhocDisconnect(); + // uninit the adhoc, and init psn + m_pSQRNet_Vita_Adhoc->UnInitialise(); + } + + if(m_pSQRNet_Vita->IsInitialised()==false) + { + m_pSQRNet_Vita->Initialise(); + } + + m_pSQRNet = m_pSQRNet_Vita; + } + } + + return true; +} + +void CPlatformNetworkManagerSony::startAdhocMatching( ) +{ + assert(m_pSQRNet == m_pSQRNet_Vita_Adhoc); + ((SQRNetworkManager_AdHoc_Vita*)m_pSQRNet_Vita_Adhoc)->startMatching(); +} + +bool CPlatformNetworkManagerSony::checkValidInviteData(const INVITE_INFO* pInviteInfo) +{ + if(((SQRNetworkManager_Vita*)m_pSQRNet_Vita)->GetHostUID() == pInviteInfo->hostPlayerUID) + { + // we're trying to join a game we're already in, so we just ignore this + return false; + } + else + { + return true; + } +} + + + +#endif // __PSVITA__ diff --git a/Minecraft.Client/Common/Network/Sony/PlatformNetworkManagerSony.h b/Minecraft.Client/Common/Network/Sony/PlatformNetworkManagerSony.h new file mode 100644 index 00000000..258acd83 --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/PlatformNetworkManagerSony.h @@ -0,0 +1,187 @@ +#pragma once +using namespace std; +#include +#include "..\..\..\Minecraft.World\C4JThread.h" +#include "..\..\Common\Network\NetworkPlayerInterface.h" +#include "..\..\Common\Network\PlatformNetworkManagerInterface.h" +#include "..\..\Common\Network\SessionInfo.h" +#include "SQRNetworkPlayer.h" + +// This is how often we allow a search for new games +#define MINECRAFT_PS3ROOM_SEARCH_DELAY_MILLISECONDS 30000 + +// This is the Sony platform specific implementation of CPlatformNetworkManager. It is implemented using SQRNetworkManager/SQRNetworkPlayer. There shouldn't be any general game code in here, +// this class is for providing a bridge between the common game-side network implementation, and the lowest level platform specific libraries. + +class CPlatformNetworkManagerSony : public CPlatformNetworkManager, ISQRNetworkManagerListener +{ + friend class CGameNetworkManager; +public: + virtual bool Initialise(CGameNetworkManager *pGameNetworkManager, int flagIndexSize); + virtual void Terminate(); + virtual int GetJoiningReadyPercentage(); + virtual int CorrectErrorIDS(int IDS); + + virtual void DoWork(); + virtual int GetPlayerCount(); + virtual int GetOnlinePlayerCount(); + virtual int GetLocalPlayerMask(int playerIndex); + virtual bool AddLocalPlayerByUserIndex( int userIndex ); + virtual bool RemoveLocalPlayerByUserIndex( int userIndex ); + virtual INetworkPlayer *GetLocalPlayerByUserIndex( int userIndex ); + virtual INetworkPlayer *GetPlayerByIndex(int playerIndex); + virtual INetworkPlayer * GetPlayerByXuid(PlayerUID xuid); + virtual INetworkPlayer * GetPlayerBySmallId(unsigned char smallId); + virtual bool ShouldMessageForFullSession(); + + virtual INetworkPlayer *GetHostPlayer(); + virtual bool IsHost(); + virtual bool JoinGameFromInviteInfo( int userIndex, int userMask, const INVITE_INFO *pInviteInfo); + virtual bool LeaveGame(bool bMigrateHost); + + virtual bool IsInSession(); + virtual bool IsInGameplay(); + virtual bool IsReadyToPlayOrIdle(); + virtual bool IsInStatsEnabledSession(); + virtual bool SessionHasSpace(unsigned int spaceRequired = 1); + + virtual void SendInviteGUI(int quadrant); + virtual bool IsAddingPlayer(); + + virtual void HostGame(int localUsersMask, bool bOnlineGame, bool bIsPrivate, unsigned char publicSlots = MINECRAFT_NET_MAX_PLAYERS, unsigned char privateSlots = 0); + virtual int JoinGame(FriendSessionInfo *searchResult, int localUsersMask, int primaryUserIndex ); + virtual bool SetLocalGame(bool isLocal); + virtual bool IsLocalGame(); + virtual void SetPrivateGame(bool isPrivate); + virtual bool IsPrivateGame(); + virtual bool IsLeavingGame(); + virtual void ResetLeavingGame(); + + virtual void RegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam); + virtual void UnRegisterPlayerChangedCallback(int iPad, void (*callback)(void *callbackParam, INetworkPlayer *pPlayer, bool leaving), void *callbackParam); + + virtual void HandleSignInChange(); + + virtual bool _RunNetworkGame(); + +#ifdef __PSVITA__ + bool usingAdhocMode() { return m_bUsingAdhocMode; } + bool setAdhocMode(bool bAdhoc); + void startAdhocMatching(); + bool checkValidInviteData(const INVITE_INFO* pInviteInfo); +#endif + +private: + bool isSystemPrimaryPlayer(SQRNetworkPlayer *pQNetPlayer); + virtual bool _LeaveGame(bool bMigrateHost, bool bLeaveRoom); + virtual void _HostGame(int dwUsersMask, unsigned char publicSlots = MINECRAFT_NET_MAX_PLAYERS, unsigned char privateSlots = 0); + virtual bool _StartGame(); + +#ifdef __PSVITA__ + bool m_bUsingAdhocMode; + SQRNetworkManager_Vita* m_pSQRNet_Vita; + SQRNetworkManager_AdHoc_Vita* m_pSQRNet_Vita_Adhoc; +#endif + SQRNetworkManager * m_pSQRNet; // pointer to SQRNetworkManager interface + + HANDLE m_notificationListener; + + vector m_machineSQRPrimaryPlayers; // collection of players that we deem to be the main one for that system + + bool m_bLeavingGame; + bool m_bLeaveGameOnTick; + bool m_migrateHostOnLeave; + bool m_bHostChanged; + bool m_bLeaveRoomWhenLeavingGame; + + bool m_bIsOfflineGame; + bool m_bIsPrivateGame; + int m_flagIndexSize; + + // This is only maintained by the host, and is not valid on client machines + GameSessionData m_hostGameSessionData; + CGameNetworkManager *m_pGameNetworkManager; +public: + virtual void UpdateAndSetGameSessionData(INetworkPlayer *pNetworkPlayerLeaving = NULL); + +private: + // TODO 4J Stu - Do we need to be able to have more than one of these? + void (*playerChangedCallback[XUSER_MAX_COUNT])(void *callbackParam, INetworkPlayer *pPlayer, bool leaving); + void *playerChangedCallbackParam[XUSER_MAX_COUNT]; + + static int RemovePlayerOnSocketClosedThreadProc( void* lpParam ); + virtual bool RemoveLocalPlayer( INetworkPlayer *pNetworkPlayer ); + + // Things for handling per-system flags + class PlayerFlags + { + public: + INetworkPlayer *m_pNetworkPlayer; + unsigned char *flags; + unsigned int count; + PlayerFlags(INetworkPlayer *pNetworkPlayer, unsigned int count); + ~PlayerFlags(); + }; + vector m_playerFlags; + void SystemFlagAddPlayer(INetworkPlayer *pNetworkPlayer); + void SystemFlagRemovePlayer(INetworkPlayer *pNetworkPlayer); + void SystemFlagReset(); +public: + virtual void SystemFlagSet(INetworkPlayer *pNetworkPlayer, int index); + virtual bool SystemFlagGet(INetworkPlayer *pNetworkPlayer, int index); + + // For telemetry +private: + float m_lastPlayerEventTimeStart; + +public: + wstring GatherStats(); + wstring GatherRTTStats(); + +private: + vector friendsSessions; + + int m_lastSearchStartTime; + + // The results that will be filled in with the current search + int m_searchResultsCount; + SQRNetworkManager::SessionSearchResult *m_pSearchResults; + + int m_lastSearchPad; + bool m_bSearchPending; + LPVOID m_pSearchParam; + void (*m_SessionsUpdatedCallback)(LPVOID pParam); + + C4JThread* m_SearchingThread; + + void TickSearch(); + + vectorcurrentNetworkPlayers; + INetworkPlayer *addNetworkPlayer(SQRNetworkPlayer *pSQRPlayer); + void removeNetworkPlayer(SQRNetworkPlayer *pSQRPlayer); + static INetworkPlayer *getNetworkPlayer(SQRNetworkPlayer *pSQRPlayer); + + virtual void SetSessionTexturePackParentId( int id ); + virtual void SetSessionSubTexturePackId( int id ); + virtual void Notify(int ID, ULONG_PTR Param); + +public: + virtual vector *GetSessionList(int iPad, int localPlayers, bool partyOnly); + virtual bool GetGameSessionInfo(int iPad, SessionID sessionId,FriendSessionInfo *foundSession); + virtual void SetSessionsUpdatedCallback( void (*SessionsUpdatedCallback)(LPVOID pParam), LPVOID pSearchParam ); + virtual void GetFullFriendSessionInfo( FriendSessionInfo *foundSession, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ); + virtual void ForceFriendsSessionRefresh(); + + // ... and the new ones that have been converted to ISQRNetworkManagerListener + virtual void HandleDataReceived(SQRNetworkPlayer *playerFrom, SQRNetworkPlayer *playerTo, unsigned char *data, unsigned int dataSize); + virtual void HandlePlayerJoined(SQRNetworkPlayer *player); + virtual void HandlePlayerLeaving(SQRNetworkPlayer *player); + virtual void HandleStateChange(SQRNetworkManager::eSQRNetworkManagerState oldState, SQRNetworkManager::eSQRNetworkManagerState newState, bool idleReasonIsSessionFull); + virtual void HandleResyncPlayerRequest(SQRNetworkPlayer **aPlayers); + virtual void HandleAddLocalPlayerFailed(int idx); + virtual void HandleDisconnect(bool bLostRoomOnly,bool bPSNSignOut=false); + virtual void HandleInviteReceived( int userIndex, const SQRNetworkManager::PresenceSyncInfo *pInviteInfo); + + static void SetSQRPresenceInfoFromExtData(SQRNetworkManager::PresenceSyncInfo *presence, void *pExtData, SceNpMatching2RoomId roomId, SceNpMatching2ServerId serverId); + static void MallocAndSetExtDataFromSQRPresenceInfo(void **pExtData, SQRNetworkManager::PresenceSyncInfo *presence); +}; diff --git a/Minecraft.Client/Common/Network/Sony/SQRNetworkManager.cpp b/Minecraft.Client/Common/Network/Sony/SQRNetworkManager.cpp new file mode 100644 index 00000000..20f2641c --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/SQRNetworkManager.cpp @@ -0,0 +1,10 @@ +#include "stdafx.h" + +#include "SQRNetworkManager.h" + +bool SQRNetworkManager::s_safeToRespondToGameBootInvite = false; + +void SQRNetworkManager::SafeToRespondToGameBootInvite() +{ + s_safeToRespondToGameBootInvite = true; +} diff --git a/Minecraft.Client/Common/Network/Sony/SQRNetworkManager.h b/Minecraft.Client/Common/Network/Sony/SQRNetworkManager.h new file mode 100644 index 00000000..c93368d8 --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/SQRNetworkManager.h @@ -0,0 +1,313 @@ +#pragma once +#include +#ifdef __PS3__ +#include +#include +#else +#include +#include +#include +#endif +#include + +#include + +class SQRNetworkPlayer; +class ISQRNetworkManagerListener; +class SonyVoiceChat; +class C4JThread; + +// This is the lowest level manager for providing network functionality on Sony platforms. This manages various network activities including the players within a gaming session. +// The game shouldn't directly use this class, it is here to provide functionality required by PlatformNetworkManagerSony. + +class SQRNetworkManager +{ +public: + static const int MAX_LOCAL_PLAYER_COUNT = XUSER_MAX_COUNT; + static const int MAX_ONLINE_PLAYER_COUNT = MINECRAFT_NET_MAX_PLAYERS; + + static const int NP_POOL_SIZE = 128 * 1024; +protected: + friend class SQRNetworkPlayer; + friend class SonyVoiceChat; + + + static const int MAX_FRIENDS = 100; +#ifdef __PS3__ + static const int RUDP_THREAD_PRIORITY = 999; +#else // __ORBIS_ + static const int RUDP_THREAD_PRIORITY = 500; +#endif + static const int RUDP_THREAD_STACK_SIZE = 32878; + static const int MAX_SIMULTANEOUS_INVITES = 10; + + + // This class stores everything about a player that must be synchronised between machines. This syncing is carried out + // by the Matching2 lib by using internal room binary data (ie data that is only visible to current members of a room) + class PlayerSyncData + { + public: + PlayerUID m_UID; // Assigned by the associated player->GetUID() + SceNpMatching2RoomMemberId m_roomMemberId; // Assigned by Matching2 lib, we can use to indicate which machine this player belongs to (note - 16 bits) + unsigned char m_smallId; // Assigned by SQRNetworkManager, to attach a permanent id to this player (until we have to wrap round), to match a similar concept in qnet + unsigned char m_localIdx : 4; // Which local player (by controller index) this represents + unsigned char m_playerCount : 4; + }; + + class RoomSyncData + { + public: + PlayerSyncData players[MAX_ONLINE_PLAYER_COUNT]; + void setPlayerCount(int c) { players[0].m_playerCount = c;} + int getPlayerCount() { return players[0].m_playerCount;} + }; + +public: + class PresenceSyncInfo + { + public: + GameSessionUID hostPlayerUID; + SceNpMatching2RoomId m_RoomId; + SceNpMatching2ServerId m_ServerId; + unsigned int texturePackParentId; + unsigned short netVersion; + unsigned char subTexturePackId; + bool inviteOnly; + }; + + + // Externally exposed state. All internal states are mapped to one of these broader states. + typedef enum + { + SNM_STATE_INITIALISING, + SNM_STATE_INITIALISE_FAILED, + SNM_STATE_IDLE, + + SNM_STATE_HOSTING, + SNM_STATE_JOINING, + + SNM_STATE_STARTING, + SNM_STATE_PLAYING, + + SNM_STATE_LEAVING, + SNM_STATE_ENDING, + } eSQRNetworkManagerState; + + struct SessionID + { + SceNpMatching2RoomId m_RoomId; + SceNpMatching2ServerId m_ServerId; + }; + + struct SessionSearchResult + { + SceNpId m_NpId; + SessionID m_sessionId; + void *m_extData; +#ifdef __PSVITA__ + SceNetInAddr m_netAddr; +#endif + }; + +protected: + + // On initialisation, state should transition from SNM_INT_STATE_UNINITIALISED -> SNM_INT_STATE_SIGNING_IN -> SNM_INT_STATE_SIGNED_IN -> SNM_INT_STATE_STARTING_CONTEXT -> SNM_INT_STATE_IDLE. + // Error indicated if we transition at any point to SNM_INT_STATE_INITIALISE_FAILED. + + // NOTE: If anything changes in here, then the mapping from internal -> external state needs to be updated (m_INTtoEXTStateMappings, defined in the cpp file) + typedef enum + { + SNM_INT_STATE_UNINITIALISED, + SNM_INT_STATE_SIGNING_IN, + SNM_INT_STATE_STARTING_CONTEXT, + SNM_INT_STATE_INITIALISE_FAILED, + + SNM_INT_STATE_IDLE, + SNM_INT_STATE_IDLE_RECREATING_MATCHING_CONTEXT, + + SNM_INT_STATE_HOSTING_STARTING_MATCHING_CONTEXT, + SNM_INT_STATE_HOSTING_SEARCHING_FOR_SERVER, + SNM_INT_STATE_HOSTING_SERVER_SEARCH_SERVER_ERROR, + SNM_INT_STATE_HOSTING_SERVER_FOUND, + SNM_INT_STATE_HOSTING_SERVER_SEARCH_CREATING_CONTEXT, + SNM_INT_STATE_HOSTING_SERVER_SEARCH_FAILED, + + SNM_INT_STATE_HOSTING_CREATE_ROOM_SEARCHING_FOR_WORLD, + SNM_INT_STATE_HOSTING_CREATE_ROOM_WORLD_FOUND, + SNM_INT_STATE_HOSTING_CREATE_ROOM_CREATING_ROOM, + SNM_INT_STATE_HOSTING_CREATE_ROOM_SUCCESS, + SNM_INT_STATE_HOSTING_CREATE_ROOM_FAILED, + SNM_INT_STATE_HOSTING_CREATE_ROOM_RESTART_MATCHING_CONTEXT, + SNM_INT_STATE_HOSTING_WAITING_TO_PLAY, + + SNM_INT_STATE_JOINING_STARTING_MATCHING_CONTEXT, + SNM_INT_STATE_JOINING_SEARCHING_FOR_SERVER, + SNM_INT_STATE_JOINING_SERVER_SEARCH_SERVER_ERROR, + SNM_INT_STATE_JOINING_SERVER_FOUND, + SNM_INT_STATE_JOINING_SERVER_SEARCH_CREATING_CONTEXT, + SNM_INT_STATE_JOINING_SERVER_SEARCH_FAILED, + + SNM_INT_STATE_JOINING_JOIN_ROOM, + SNM_INT_STATE_JOINING_JOIN_ROOM_FAILED, + + SNM_INT_STATE_JOINING_WAITING_FOR_LOCAL_PLAYERS, + + SNM_INT_STATE_SERVER_DELETING_CONTEXT, + + SNM_INT_STATE_STARTING, + SNM_INT_STATE_PLAYING, + + SNM_INT_STATE_LEAVING, + SNM_INT_STATE_LEAVING_FAILED, + + SNM_INT_STATE_ENDING, + + SNM_INT_STATE_COUNT + + } eSQRNetworkManagerInternalState; + + typedef enum + { + SNM_FORCE_ERROR_NP2_INIT, + SNM_FORCE_ERROR_NET_INITIALIZE_NETWORK, + SNM_FORCE_ERROR_NET_CTL_INIT, + SNM_FORCE_ERROR_RUDP_INIT, + SNM_FORCE_ERROR_NET_START_DIALOG, + SNM_FORCE_ERROR_MATCHING2_INIT, + SNM_FORCE_ERROR_REGISTER_NP_CALLBACK, + SNM_FORCE_ERROR_GET_NPID, + SNM_FORCE_ERROR_CREATE_MATCHING_CONTEXT, + SNM_FORCE_ERROR_REGISTER_CALLBACKS, + SNM_FORCE_ERROR_CONTEXT_START_ASYNC, + SNM_FORCE_ERROR_SET_EXTERNAL_ROOM_DATA, + SNM_FORCE_ERROR_GET_FRIEND_LIST_ENTRY_COUNT, + SNM_FORCE_ERROR_GET_FRIEND_LIST_ENTRY, + SNM_FORCE_ERROR_GET_USER_INFO_LIST, + SNM_FORCE_ERROR_LEAVE_ROOM, + SNM_FORCE_ERROR_SET_ROOM_MEMBER_DATA_INTERNAL, + SNM_FORCE_ERROR_SET_ROOM_MEMBER_DATA_INTERNAL2, + SNM_FORCE_ERROR_CREATE_SERVER_CONTEXT, + SNM_FORCE_ERROR_CREATE_JOIN_ROOM, + SNM_FORCE_ERROR_GET_SERVER_INFO, + SNM_FORCE_ERROR_DELETE_SERVER_CONTEXT, + SNM_FORCE_ERROR_SETSOCKOPT_0, + SNM_FORCE_ERROR_SETSOCKOPT_1, + SNM_FORCE_ERROR_SETSOCKOPT_2, + SNM_FORCE_ERROR_SOCK_BIND, + SNM_FORCE_ERROR_CREATE_RUDP_CONTEXT, + SNM_FORCE_ERROR_RUDP_BIND, + SNM_FORCE_ERROR_RUDP_INIT2, + SNM_FORCE_ERROR_GET_ROOM_EXTERNAL_DATA, + SNM_FORCE_ERROR_GET_SERVER_INFO_DATA, + SNM_FORCE_ERROR_GET_WORLD_INFO_DATA, + SNM_FORCE_ERROR_GET_CREATE_JOIN_ROOM_DATA, + SNM_FORCE_ERROR_GET_USER_INFO_LIST_DATA, + SNM_FORCE_ERROR_GET_JOIN_ROOM_DATA, + SNM_FORCE_ERROR_GET_ROOM_MEMBER_DATA_INTERNAL, + SNM_FORCE_ERROR_GET_ROOM_EXTERNAL_DATA2, + SNM_FORCE_ERROR_CREATE_SERVER_CONTEXT_CALLBACK, + SNM_FORCE_ERROR_SET_ROOM_DATA_CALLBACK, + SNM_FORCE_ERROR_UPDATED_ROOM_DATA, + SNM_FORCE_ERROR_UPDATED_ROOM_MEMBER_DATA_INTERNAL1, + SNM_FORCE_ERROR_UPDATED_ROOM_MEMBER_DATA_INTERNAL2, + SNM_FORCE_ERROR_UPDATED_ROOM_MEMBER_DATA_INTERNAL3, + SNM_FORCE_ERROR_UPDATED_ROOM_MEMBER_DATA_INTERNAL4, + SNM_FORCE_ERROR_GET_WORLD_INFO_LIST, + SNM_FORCE_ERROR_JOIN_ROOM, + + SNM_FORCE_ERROR_COUNT, + } eSQRForceError; + + + class StateChangeInfo + { + public: + eSQRNetworkManagerState m_oldState; + eSQRNetworkManagerState m_newState; + bool m_idleReasonIsSessionFull; + StateChangeInfo(eSQRNetworkManagerState oldState, eSQRNetworkManagerState newState,bool idleReasonIsSessionFull) : m_oldState(oldState), m_newState(newState), m_idleReasonIsSessionFull(idleReasonIsSessionFull) {} + }; + + std::queue m_stateChangeQueue; + CRITICAL_SECTION m_csStateChangeQueue; + CRITICAL_SECTION m_csMatching; + + typedef enum + { + SNM_FRIEND_SEARCH_STATE_IDLE, // Idle - search result will be valid (although it may not have any entries) + SNM_FRIEND_SEARCH_STATE_GETTING_FRIEND_COUNT, // Getting count of friends in friend list + SNM_FRIEND_SEARCH_STATE_GETTING_FRIEND_INFO, // Getting presence/NpId info for each friend + } eSQRNetworkManagerFriendSearchState; + + typedef void (*ServerContextValidCallback)(SQRNetworkManager *manager); + + static bool s_safeToRespondToGameBootInvite; + +public: + + // General + virtual void Tick() = 0; + virtual void Initialise() = 0; +#ifdef __PSVITA__ + virtual void UnInitialise() = 0; // to switch from PSN to Adhoc + virtual bool IsInitialised() = 0; +#endif + virtual void Terminate() = 0; + virtual eSQRNetworkManagerState GetState() = 0; + virtual bool IsHost() = 0; + virtual bool IsReadyToPlayOrIdle() = 0; + virtual bool IsInSession() = 0; + + // Session management + virtual void CreateAndJoinRoom(int hostIndex, int localPlayerMask, void *extData, int extDataSize, bool offline) = 0; + virtual void UpdateExternalRoomData() = 0; + virtual bool FriendRoomManagerIsBusy() = 0; + virtual bool FriendRoomManagerSearch() = 0; + virtual bool FriendRoomManagerSearch2() = 0; + virtual int FriendRoomManagerGetCount() = 0; + virtual void FriendRoomManagerGetRoomInfo(int idx, SessionSearchResult *searchResult) = 0; + virtual bool JoinRoom(SessionSearchResult *searchResult, int localPlayerMask) = 0; + virtual bool JoinRoom(SceNpMatching2RoomId roomId, SceNpMatching2ServerId serverId, int localPlayerMask, const SQRNetworkManager::PresenceSyncInfo *presence) = 0; + virtual void StartGame() = 0; + virtual void LeaveRoom(bool bActuallyLeaveRoom) = 0; + virtual void EndGame() = 0; + virtual bool SessionHasSpace(int spaceRequired) = 0; + virtual bool AddLocalPlayerByUserIndex(int idx) = 0; + virtual bool RemoveLocalPlayerByUserIndex(int idx) = 0; + virtual void SendInviteGUI() = 0; + + virtual void GetExtDataForRoom( SceNpMatching2RoomId roomId, void *extData, void (* FriendSessionUpdatedFn)(bool success, void *pParam), void *pParam ) = 0; + + // Player retrieval + virtual int GetPlayerCount() = 0; + virtual int GetOnlinePlayerCount() = 0; + virtual SQRNetworkPlayer *GetPlayerByIndex(int idx) = 0; + virtual SQRNetworkPlayer *GetPlayerBySmallId(int idx) = 0; + virtual SQRNetworkPlayer *GetPlayerByXuid(PlayerUID xuid) = 0; + virtual SQRNetworkPlayer *GetLocalPlayerByUserIndex(int idx) = 0; + virtual SQRNetworkPlayer *GetHostPlayer() = 0; + + virtual void SetPresenceDataStartHostingGame() = 0; + virtual int GetJoiningReadyPercentage() = 0; + + virtual void LocalDataSend(SQRNetworkPlayer *playerFrom, SQRNetworkPlayer *playerTo, const void *data, unsigned int dataSize) = 0; + virtual int GetSessionIndex(SQRNetworkPlayer *player) = 0; + + static void SafeToRespondToGameBootInvite(); + +}; + + +// Class defining interface to be implemented for class that handles callbacks +class ISQRNetworkManagerListener +{ +public: + virtual void HandleDataReceived(SQRNetworkPlayer *playerFrom, SQRNetworkPlayer *playerTo, unsigned char *data, unsigned int dataSize) = 0; + virtual void HandlePlayerJoined(SQRNetworkPlayer *player) = 0; + virtual void HandlePlayerLeaving(SQRNetworkPlayer *player) = 0; + virtual void HandleStateChange(SQRNetworkManager::eSQRNetworkManagerState oldState, SQRNetworkManager::eSQRNetworkManagerState newState, bool idleReasonIsSessionFull) = 0; + virtual void HandleResyncPlayerRequest(SQRNetworkPlayer **aPlayers) = 0; + virtual void HandleAddLocalPlayerFailed(int idx) = 0; + virtual void HandleDisconnect(bool bLostRoomOnly,bool bPSNSignOut=false) = 0; + virtual void HandleInviteReceived( int userIndex, const SQRNetworkManager::PresenceSyncInfo *pInviteInfo) = 0; +}; diff --git a/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.cpp b/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.cpp new file mode 100644 index 00000000..e244b34c --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.cpp @@ -0,0 +1,399 @@ +#include "stdafx.h" +#include "SQRNetworkPlayer.h" + +#ifdef __PS3__ +#include +#include "PS3/Network/SonyVoiceChat.h" + +#elif defined __ORBIS__ +#include +#include "Orbis/Network/SonyVoiceChat_Orbis.h" + +#else // __PSVITA__ +#include +#include +#include "PSVita/Network/SonyVoiceChat_Vita.h" + +#endif + + +static const bool sc_verbose = false; + +int SQRNetworkPlayer::GetSmallId() +{ + return m_ISD.m_smallId; +} + +wchar_t *SQRNetworkPlayer::GetName() +{ + return m_name; +} + +bool SQRNetworkPlayer::IsRemote() +{ + return !IsLocal(); +} + +bool SQRNetworkPlayer::IsHost() +{ + return (m_type == SNP_TYPE_HOST); +} + +bool SQRNetworkPlayer::IsLocal() +{ + // m_host determines whether this *machine* is hosting the game, not this player (which is determined by m_type) + if( m_host ) + { + // If we are the hosting machine, then both the host & local players are local to this machine + return (m_type == SNP_TYPE_HOST) || (m_type == SNP_TYPE_LOCAL); + } + else + { + // Not hosting, just local players are actually physically local + return (m_type == SNP_TYPE_LOCAL) ; + } +} + +int SQRNetworkPlayer::GetLocalPlayerIndex() +{ + return m_localPlayerIdx; +} + +bool SQRNetworkPlayer::IsSameSystem(SQRNetworkPlayer *other) +{ + return (m_roomMemberId == other->m_roomMemberId); +} + +uintptr_t SQRNetworkPlayer::GetCustomDataValue() +{ + return m_customData; +} + +void SQRNetworkPlayer::SetCustomDataValue(uintptr_t data) +{ + m_customData = data; +} + +SQRNetworkPlayer::SQRNetworkPlayer(SQRNetworkManager *manager, eSQRNetworkPlayerType playerType, bool onHost, SceNpMatching2RoomMemberId roomMemberId, int localPlayerIdx, int rudpCtx, PlayerUID *pUID) +{ + m_roomMemberId = roomMemberId; + m_localPlayerIdx = localPlayerIdx; + m_rudpCtx = rudpCtx; + m_flags = 0; + m_type = playerType; + m_host = onHost; + m_manager = manager; + m_customData = 0; + if( pUID ) + { + memcpy(&m_ISD.m_UID,pUID,sizeof(PlayerUID)); +#ifdef __PSVITA__ + if(CGameNetworkManager::usingAdhocMode() && pUID->getOnlineID()[0] == 0) + { + assert(localPlayerIdx == 0); + // player doesn't have an online UID, set it from the player name + m_ISD.m_UID.setForAdhoc(); + } +#endif // __PSVITA__ + } + else + { + memset(&m_ISD.m_UID,0,sizeof(PlayerUID)); + } + SetNameFromUID(); + InitializeCriticalSection(&m_csQueue); +#ifdef __ORBIS__ + if(IsLocal()) + { + SonyVoiceChat_Orbis::initLocalPlayer(m_localPlayerIdx); + } +#endif + +} + +SQRNetworkPlayer::~SQRNetworkPlayer() +{ +#ifdef __ORBIS__ + SQRNetworkManager_Orbis* pMan = (SQRNetworkManager_Orbis*)m_manager; +// pMan->removePlayerFromVoiceChat(this); +// m_roomMemberId = -1; +#endif + DeleteCriticalSection(&m_csQueue); +} + +bool SQRNetworkPlayer::IsReady() +{ + return ( ( m_flags & SNP_FLAG_READY_MASK ) == SNP_FLAG_READY_MASK ); +} + +PlayerUID SQRNetworkPlayer::GetUID() +{ + return m_ISD.m_UID; +} + +void SQRNetworkPlayer::SetUID(PlayerUID UID) +{ + m_ISD.m_UID = UID; + SetNameFromUID(); +} + +bool SQRNetworkPlayer::HasConnectionAndSmallId() +{ + const int reqFlags = ( SNP_FLAG_CONNECTION_COMPLETE | SNP_FLAG_SMALLID_ALLOCATED ); + return (( m_flags & reqFlags) == reqFlags); +} + +void SQRNetworkPlayer::ConnectionComplete() +{ + m_host ? app.DebugPrintf(sc_verbose, "host : ") : app.DebugPrintf(sc_verbose, "client:"); + app.DebugPrintf(sc_verbose, ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ConnectionComplete\n"); + m_flags |= SNP_FLAG_CONNECTION_COMPLETE; +} + +void SQRNetworkPlayer::SmallIdAllocated(unsigned char smallId) +{ + m_ISD.m_smallId = smallId; + m_flags |= SNP_FLAG_SMALLID_ALLOCATED; + m_host ? app.DebugPrintf(sc_verbose, "host : ") : app.DebugPrintf(sc_verbose, "client:"); + app.DebugPrintf(sc_verbose, ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Small ID allocated\n"); + + + // If this is a non-network sort of player then flag now as having its small id confirmed + if( ( m_type == SNP_TYPE_HOST ) || + ( m_host && ( m_type == SNP_TYPE_LOCAL ) ) || + ( !m_host && ( m_type == SNP_TYPE_REMOTE ) ) ) + { + m_host ? app.DebugPrintf(sc_verbose, "host : ") : app.DebugPrintf(sc_verbose, "client:"); + app.DebugPrintf(sc_verbose, ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Small ID confirmed\n"); + + m_flags |= SNP_FLAG_SMALLID_CONFIRMED; + } +} + +void SQRNetworkPlayer::InitialDataReceived(SQRNetworkPlayer::InitSendData *ISD) +{ + assert(m_ISD.m_smallId == ISD->m_smallId); + memcpy(&m_ISD, ISD, sizeof(InitSendData) ); +#ifdef __PSVITA__ + SetNameFromUID(); +#endif + m_host ? app.DebugPrintf(sc_verbose, "host : ") : app.DebugPrintf(sc_verbose, "client:"); + app.DebugPrintf(sc_verbose, ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Small ID confirmed\n"); + m_flags |= SNP_FLAG_SMALLID_CONFIRMED; +} + +bool SQRNetworkPlayer::HasSmallIdConfirmed() +{ + return ( m_flags & SNP_FLAG_SMALLID_CONFIRMED ); +} + +// To confirm to the host that we are ready, send a single byte with our small id. +void SQRNetworkPlayer::ConfirmReady() +{ +#ifdef __PS3__ + int ret = cellRudpWrite( m_rudpCtx, &m_ISD, sizeof(InitSendData), CELL_RUDP_MSG_LATENCY_CRITICAL ); +#else //__ORBIS__ + int ret = sceRudpWrite( m_rudpCtx, &m_ISD, sizeof(InitSendData), SCE_RUDP_MSG_LATENCY_CRITICAL ); +#endif + // TODO - error handling here? + assert ( ret == sizeof(InitSendData) ); + // Final flag for a local player on the client, as we are now safe to send data on to the host + m_host ? app.DebugPrintf(sc_verbose, "host : ") : app.DebugPrintf(sc_verbose, "client:"); + app.DebugPrintf(sc_verbose, ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Small ID confirmed\n"); + m_flags |= SNP_FLAG_SMALLID_CONFIRMED; +} + +// Attempt to send data, of any size, from this player to that specified by pPlayerTarget. This may not be possible depending on the two players, due to +// our star shaped network connectivity. Data may be any size, and is copied so on returning from this method it does not need to be preserved. +void SQRNetworkPlayer::SendData( SQRNetworkPlayer *pPlayerTarget, const void *data, unsigned int dataSize ) +{ + // Our network is connected as a star. If we are the host, then we can send to any remote player. If we're a client, we can send only to the host. + // The host can also send to other local players, but this doesn't need to go through Rudp. + if( m_host ) + { + if( ( m_type == SNP_TYPE_HOST ) && ( pPlayerTarget->m_type == SNP_TYPE_LOCAL ) ) + { + // Special internal communication from host to local player + m_manager->LocalDataSend( this, pPlayerTarget, data, dataSize ); + } + else if( ( m_type == SNP_TYPE_LOCAL ) && ( pPlayerTarget->m_type == SNP_TYPE_HOST ) ) + { + // Special internal communication from local player to host + m_manager->LocalDataSend( this, pPlayerTarget, data, dataSize ); + } + else if( ( m_type == SNP_TYPE_HOST ) && ( pPlayerTarget->m_type == SNP_TYPE_REMOTE ) ) + { + // Rudp communication from host to remote player - handled by remote player instance + pPlayerTarget->SendInternal(data,dataSize); + } + else + { + // Can't do any other types of communications + assert(false); + } + } + else + { + if( ( m_type == SNP_TYPE_LOCAL ) && ( pPlayerTarget->m_type == SNP_TYPE_HOST ) ) + { + // Rudp communication from client to host - handled by this player instace + SendInternal(data, dataSize); + } + else + { + // Can't do any other types of communications + assert(false); + } + } +} + +// Internal send function - to simplify the number of mechanisms we have for sending data, this method just adds the data to be send to the player's internal queue, +// and then calls SendMoreInternal. This method can take any size of data, which it will split up into payload size chunks before sending. All input data is copied +// into internal buffers. +void SQRNetworkPlayer::SendInternal(const void *data, unsigned int dataSize) +{ + EnterCriticalSection(&m_csQueue); + + QueuedSendBlock sendBlock; + + unsigned char *dataCurrent = (unsigned char *)data; + unsigned int dataRemaining = dataSize; + + while( dataRemaining ) + { + int dataSize = dataRemaining; + if( dataSize > SNP_MAX_PAYLOAD ) dataSize = SNP_MAX_PAYLOAD; + sendBlock.start = new unsigned char [dataSize]; + sendBlock.end = sendBlock.start + dataSize; + sendBlock.current = sendBlock.start; + memcpy( sendBlock.start, dataCurrent, dataSize); + m_sendQueue.push(sendBlock); + dataRemaining -= dataSize; + dataCurrent += dataSize; + } + + // Now try and send as much as we can + SendMoreInternal(); + + LeaveCriticalSection(&m_csQueue); +} + + + + +// Internal send function. This attempts to send as many elements in the queue as possible until the write function tells us that we can't send any more. This way, +// we are guaranteed that if there *is* anything more in the queue left to send, we'll get a CELL_RUDP_CONTEXT_EVENT_WRITABLE event when whatever we've managed to +// send here is complete, and can continue on. +void SQRNetworkPlayer::SendMoreInternal() +{ + EnterCriticalSection(&m_csQueue); + bool keepSending; + do + { + keepSending = false; + if( m_sendQueue.size() > 0) + { + // Attempt to send the full data in the first element in our queue + unsigned char *data= m_sendQueue.front().current; + int dataSize = m_sendQueue.front().end - m_sendQueue.front().current; +#ifdef __PS3__ + int ret = cellRudpWrite( m_rudpCtx, data, dataSize, 0);//CELL_RUDP_MSG_LATENCY_CRITICAL ); + int wouldBlockFlag = CELL_RUDP_ERROR_WOULDBLOCK; + +#else // __ORBIS__ + int ret = sceRudpWrite( m_rudpCtx, data, dataSize, 0);//CELL_RUDP_MSG_LATENCY_CRITICAL ); + int wouldBlockFlag = SCE_RUDP_ERROR_WOULDBLOCK; +#endif + if( ret == dataSize ) + { + // Fully sent, remove from queue - will loop in the while loop to see if there's anything else in the queue we could send + delete [] m_sendQueue.front().start; + m_sendQueue.pop(); + if( m_sendQueue.size() ) + { + keepSending = true; + } + } + else if( ( ret >= 0 ) || ( ret == wouldBlockFlag ) ) + { + + + // Things left to send - adjust this element in the queue + int remainingBytes; + if( ret >= 0 ) + { + // Only ret bytes sent so far + remainingBytes = dataSize - ret; + assert(remainingBytes > 0 ); + } + else + { + // Is CELL_RUDP_ERROR_WOULDBLOCK, nothing has yet been sent + remainingBytes = dataSize; + } + m_sendQueue.front().current = m_sendQueue.front().end - remainingBytes; + } + } + } while (keepSending); + LeaveCriticalSection(&m_csQueue); +} + +void SQRNetworkPlayer::SetNameFromUID() +{ + mbstowcs(m_name, m_ISD.m_UID.getOnlineID(), 16); + m_name[16] = 0; +#ifdef __PS3__ // only 1 player on vita, and they have to be online (or adhoc), and with PS4 all local players need to be signed in + // Not an online player? Add a suffix with the controller ID on + if( m_ISD.m_UID.isSignedIntoPSN() == 0) + { + int pos = wcslen(m_name); + swprintf(&m_name[pos], 5, L" (%d)", m_ISD.m_UID.getQuadrant() + 1 ); + } +#endif +} + +void SQRNetworkPlayer::SetName(char *name) +{ + mbstowcs(m_name, name, 20); + m_name[20] = 0; +} + +int SQRNetworkPlayer::GetSessionIndex() +{ + return m_manager->GetSessionIndex(this); +} + +bool SQRNetworkPlayer::HasVoice() +{ +#ifdef __ORBIS__ + return SonyVoiceChat_Orbis::hasMicConnected(this); +#elif defined __PSVITA__ + return SonyVoiceChat_Vita::hasMicConnected(this); +#else + return SonyVoiceChat::hasMicConnected(&m_roomMemberId); +#endif +} + +bool SQRNetworkPlayer::IsTalking() +{ +#ifdef __ORBIS__ + return SonyVoiceChat_Orbis::isTalking(this); +#elif defined __PSVITA__ + return SonyVoiceChat_Vita::isTalking(this); +#else + return SonyVoiceChat::isTalking(&m_roomMemberId); +#endif +} + +bool SQRNetworkPlayer::IsMutedByLocalUser(int userIndex) +{ +#ifdef __ORBIS__ +// assert(0); // this is never called, so isn't implemented in the PS4 voice stuff at the moment + return false; +#elif defined __PSVITA__ + return false;// this is never called, so isn't implemented in the Vita voice stuff at the moment +#else + SQRNetworkManager_PS3* pMan = (SQRNetworkManager_PS3*)m_manager; + return SonyVoiceChat::isMutedPlayer(pMan->m_roomSyncData.players[userIndex].m_roomMemberId); +#endif +} diff --git a/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.h b/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.h new file mode 100644 index 00000000..0cd56e8d --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.h @@ -0,0 +1,103 @@ +#pragma once +#include "SQRNetworkManager.h" +#include + +// This is the lowest level class for handling the concept of a player on Sony platforms. This is managed by SQRNetworkManager. The game shouldn't directly communicate +// with this class, as it is wrapped by NetworkPlayerSony which is an implementation of a platform-independent interface INetworkPlayer. + +class SQRNetworkPlayer +{ +#ifdef __ORBIS__ + friend class SQRNetworkManager_Orbis; + friend class SonyVoiceChat_Orbis; +#elif defined __PS3__ + friend class SQRNetworkManager_PS3; +#else // __PSVITA__ + friend class SQRNetworkManager_Vita; + friend class SQRNetworkManager_AdHoc_Vita; + friend class SonyVoiceChat_Vita; +#endif + friend class SQRNetworkManager; + friend class NetworkPlayerSony; + friend class CPlatformNetworkManagerSony; + + int GetSmallId(); + wchar_t *GetName(); + bool IsRemote(); + bool IsHost(); + bool IsLocal(); + int GetLocalPlayerIndex(); + bool IsSameSystem(SQRNetworkPlayer *other); + uintptr_t GetCustomDataValue(); + void SetCustomDataValue(uintptr_t data); + bool HasVoice(); + bool IsTalking(); + bool IsMutedByLocalUser(int userIndex); + + static const int SNP_FLAG_CONNECTION_COMPLETE = 1; // This player has a fully connected Rudp or other local link established (to a remote player if this is on the host, to the host if this is a client) - or isn't expected to have one + static const int SNP_FLAG_SMALLID_ALLOCATED = 2; // This player has a small id allocated + static const int SNP_FLAG_SMALLID_CONFIRMED = 4; // This player's small id has been confirmed as received by the client (only relevant for players using network communications, others set at the same time as allocating) + static const int SNP_FLAG_READY_MASK = 7; // Mask indicated all bits which must be set in the flags for this player to be considered "ready" + + static const int SNP_MAX_PAYLOAD = 1346; // This is the default RUDP payload size - if we want to change this we'll need to use cellRudpSetOption to set something else & adjust segment size + + typedef enum + { + SNP_TYPE_HOST, // This player represents the host + SNP_TYPE_LOCAL, // On host - this player is a local player that needs communicated with specially not using rudp. On clients - this is a local player, where m_rudpCtx is the context used to communicate from this player to/from the host + SNP_TYPE_REMOTE, // On host - this player's m_rupdCtx can be used to communicate from between the host and this player. On clients - this is a remote player that cannot be communicated with + } eSQRNetworkPlayerType; + + class QueuedSendBlock + { + public: + unsigned char *start; + unsigned char *end; + unsigned char *current; + }; + + class InitSendData + { + public: + unsigned char m_smallId; // Id to uniquely and permanently identify this player between machines - assigned by the server + PlayerUID m_UID; + }; + + SQRNetworkPlayer(SQRNetworkManager *manager, eSQRNetworkPlayerType playerType, bool onHost, SceNpMatching2RoomMemberId roomMemberId, int localPlayerIdx, int rudpCtx, PlayerUID *pUID); + ~SQRNetworkPlayer(); + + PlayerUID GetUID(); + void SetUID(PlayerUID UID); + bool HasConnectionAndSmallId(); + bool IsReady(); + void ConnectionComplete(); + void SmallIdAllocated(unsigned char smallId); + void InitialDataReceived(InitSendData *ISD); // Only for remote players as viewed from the host, this is set when the host has received confirmation that the client has received the small id for this player, ie it is now safe to send data to + bool HasSmallIdConfirmed(); + + void SendData( SQRNetworkPlayer *pPlayerTarget, const void *data, unsigned int dataSize ); + + void ConfirmReady(); + void SendInternal(const void *data, unsigned int dataSize); + void SendMoreInternal(); +#ifdef __PSVITA__ + void SendInternal_VitaAdhoc(const void *data, unsigned int dataSize, EAdhocDataTag tag = e_dataTag_Normal); + void SendMoreInternal_VitaAdhoc(); +#endif + void SetNameFromUID(); + void SetName(char *name); + int GetSessionIndex(); + + eSQRNetworkPlayerType m_type; // The player type + bool m_host; // Whether this actual player class is stored on a host (not whether it represents the host, or a player on the host machine) + int m_flags; // Flags reflecting current state of this player + int m_rudpCtx; // Rudp context that can be used to communicate between this player & the host (see comments for eSQRNetworkPlayerType above) + int m_localPlayerIdx; // Index of this player on the machine to which it belongs + SceNpMatching2RoomMemberId m_roomMemberId; // The room member id, effectively a per machine id + InitSendData m_ISD; // Player UID & ID that get sent together to the host when connection is established + SQRNetworkManager *m_manager; // Pointer back to the manager that is managing this player + wchar_t m_name[21]; + uintptr_t m_customData; + CRITICAL_SECTION m_csQueue; + std::queue m_sendQueue; +}; diff --git a/Minecraft.Client/Common/Network/Sony/SonyCommerce.cpp b/Minecraft.Client/Common/Network/Sony/SonyCommerce.cpp new file mode 100644 index 00000000..8435cd56 --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/SonyCommerce.cpp @@ -0,0 +1,1492 @@ +#include "stdafx.h" + +#include "SonyCommerce.h" +#include "..\PS3Extras\ShutdownManager.h" +#include + + +bool SonyCommerce::m_bCommerceInitialised = false; +SceNpCommerce2SessionInfo SonyCommerce::m_sessionInfo; +SonyCommerce::State SonyCommerce::m_state = e_state_noSession; +int SonyCommerce::m_errorCode = 0; +LPVOID SonyCommerce::m_callbackParam = NULL; + +void* SonyCommerce::m_receiveBuffer = NULL; +SonyCommerce::Event SonyCommerce::m_event; +std::queue SonyCommerce::m_messageQueue; +std::vector* SonyCommerce::m_pProductInfoList = NULL; +SonyCommerce::ProductInfoDetailed* SonyCommerce::m_pProductInfoDetailed = NULL; +SonyCommerce::ProductInfo* SonyCommerce::m_pProductInfo = NULL; + +SonyCommerce::CategoryInfo* SonyCommerce::m_pCategoryInfo = NULL; +const char* SonyCommerce::m_pProductID = NULL; +char* SonyCommerce::m_pCategoryID = NULL; +SonyCommerce::CheckoutInputParams SonyCommerce::m_checkoutInputParams; +SonyCommerce::DownloadListInputParams SonyCommerce::m_downloadInputParams; + +SonyCommerce::CallbackFunc SonyCommerce::m_callbackFunc = NULL; +sys_memory_container_t SonyCommerce::m_memContainer = SYS_MEMORY_CONTAINER_ID_INVALID; +bool SonyCommerce::m_bUpgradingTrial = false; + +SonyCommerce::CallbackFunc SonyCommerce::m_trialUpgradeCallbackFunc; +LPVOID SonyCommerce::m_trialUpgradeCallbackParam; + +CRITICAL_SECTION SonyCommerce::m_queueLock; + + + +uint32_t SonyCommerce::m_contextId=0; ///< The npcommerce2 context ID +bool SonyCommerce::m_contextCreated=false; ///< npcommerce2 context ID created? +SonyCommerce::Phase SonyCommerce::m_currentPhase = e_phase_stopped; ///< Current commerce2 util +char SonyCommerce::m_commercebuffer[SCE_NP_COMMERCE2_RECV_BUF_SIZE]; + +C4JThread* SonyCommerce::m_tickThread = NULL; +bool SonyCommerce::m_bLicenseChecked=false; // Check the trial/full license for the game + + +SonyCommerce::ProductInfoDetailed s_trialUpgradeProductInfoDetailed; +void SonyCommerce::Delete() +{ + m_pProductInfoList=NULL; + m_pProductInfoDetailed=NULL; + m_pProductInfo=NULL; + m_pCategoryInfo = NULL; + m_pProductID = NULL; + m_pCategoryID = NULL; +} +void SonyCommerce::Init() +{ + int ret; + + assert(m_state == e_state_noSession); + if(!m_bCommerceInitialised) + { + ret = sceNpCommerce2Init(); + if (ret < 0) + { + app.DebugPrintf(4,"sceNpCommerce2Init failed (0x%x)\n", ret); + return; + } + else + { + m_bCommerceInitialised = true; + } + m_pCategoryID=(char *)malloc(sizeof(char) * 100); + InitializeCriticalSection(&m_queueLock); + } + + return ; + +} + + + +void SonyCommerce::CheckForTrialUpgradeKey_Callback(LPVOID param, bool bFullVersion) +{ + ProfileManager.SetFullVersion(bFullVersion); + if(ProfileManager.IsFullVersion()) + { + StorageManager.SetSaveDisabled(false); + ConsoleUIController::handleUnlockFullVersionCallback(); + // licence has been checked, so we're ok to install the trophies now + ProfileManager.InitialiseTrophies( SQRNetworkManager_PS3::GetSceNpCommsId(), + SQRNetworkManager_PS3::GetSceNpCommsSig()); + + } + m_bLicenseChecked=true; +} + +bool SonyCommerce::LicenseChecked() +{ + return m_bLicenseChecked; +} + +void SonyCommerce::CheckForTrialUpgradeKey() +{ + StorageManager.CheckForTrialUpgradeKey(CheckForTrialUpgradeKey_Callback, NULL); +} + +int SonyCommerce::Shutdown() +{ + int ret=0; + if (m_contextCreated) + { + ret = sceNpCommerce2DestroyCtx(m_contextId); + if (ret != 0) + { + return ret; + } + + m_contextId = 0; + m_contextCreated = false; + } + + ret = sceNpCommerce2Term(); + m_bCommerceInitialised = false; + if (ret != 0) + { + return ret; + } + delete m_pCategoryID; + DeleteCriticalSection(&m_queueLock); + + return ret; +} + + + +int SonyCommerce::TickLoop(void* lpParam) +{ + ShutdownManager::HasStarted(ShutdownManager::eCommerceThread); + while( (m_currentPhase != e_phase_stopped) && ShutdownManager::ShouldRun(ShutdownManager::eCommerceThread) ) + { + processEvent(); + processMessage(); + Sleep(16); // sleep for a frame + } + + ShutdownManager::HasFinished(ShutdownManager::eCommerceThread); + + return 0; +} + +int SonyCommerce::getProductList(std::vector* productList, char *categoryId) +{ + int ret = 0; + uint32_t requestId; + size_t bufSize = sizeof(m_commercebuffer); + size_t fillSize = 0; + SceNpCommerce2GetCategoryContentsResult result; + SceNpCommerce2CategoryInfo categoryInfo; + SceNpCommerce2ContentInfo contentInfo; + SceNpCommerce2GameProductInfo productInfo; + SceNpCommerce2GameSkuInfo skuInfo; + ProductInfo tempInfo; + std::vector tempProductVec; + + if (!m_contextCreated) + { + ret = createContext(); + if (ret < 0) + { + setError(ret); + return ret; + } + } + + // Create request ID + ret = sceNpCommerce2GetCategoryContentsCreateReq(m_contextId, &requestId); + if (ret < 0) + { + setError(ret); + return ret; + } + + // Obtain category content data + ret = sceNpCommerce2GetCategoryContentsStart(requestId, categoryId, 0, SCE_NP_COMMERCE2_GETCAT_MAX_COUNT); + if (ret < 0) + { + sceNpCommerce2DestroyReq(requestId); + setError(ret); + return ret; + } + + ret = sceNpCommerce2GetCategoryContentsGetResult(requestId, m_commercebuffer, bufSize, &fillSize); + if (ret < 0) + { + sceNpCommerce2DestroyReq(requestId); + setError(ret); + return ret; + } + + ret = sceNpCommerce2DestroyReq(requestId); + if (ret < 0) + { + setError(ret); + return ret; + } + + // We have the initial category content data, + // now to take out the category content information. + ret = sceNpCommerce2InitGetCategoryContentsResult(&result, m_commercebuffer, fillSize); + if (ret < 0) + { + setError(ret); + return ret; + } + + // Get the category information + ret = sceNpCommerce2GetCategoryInfo(&result, &categoryInfo); + if (ret < 0) + { + sceNpCommerce2DestroyGetCategoryContentsResult(&result); + setError(ret); + return ret; + } + + if(categoryInfo.countOfProduct==0) + { + // There is no DLC + return 0; + } + + // Reserve some space + tempProductVec.reserve(categoryInfo.countOfProduct); + + // For each product, obtain information + for (int i = 0; i < result.rangeOfContents.count; i++) + { + ret = sceNpCommerce2GetContentInfo(&result, i, &contentInfo); + if (ret < 0) + { + sceNpCommerce2DestroyGetCategoryContentsResult(&result); + setError(ret); + return ret; + } + + // Only process if it is a product + if (contentInfo.contentType == SCE_NP_COMMERCE2_CONTENT_TYPE_PRODUCT) + { + + // reset tempInfo + memset(&tempInfo, 0x0, sizeof(tempInfo)); + + // Get product info + ret = sceNpCommerce2GetGameProductInfoFromContentInfo(&contentInfo, &productInfo); + if (ret < 0) + { + sceNpCommerce2DestroyGetCategoryContentsResult(&result); + setError(ret); + return ret; + } + + // populate our temp struct + + strncpy(tempInfo.productId, productInfo.productId, SCE_NP_COMMERCE2_PRODUCT_ID_LEN); + strncpy(tempInfo.productName, productInfo.productName, SCE_NP_COMMERCE2_PRODUCT_NAME_LEN); + strncpy(tempInfo.shortDescription, productInfo.productShortDescription, SCE_NP_COMMERCE2_PRODUCT_SHORT_DESCRIPTION_LEN); + if(tempInfo.longDescription[0]!=0) + { + strncpy(tempInfo.longDescription, productInfo.productLongDescription, SCE_NP_COMMERCE2_PRODUCT_LONG_DESCRIPTION_LEN); + } + else + { +#ifdef _DEBUG + strcpy(tempInfo.longDescription,"Missing long description"); +#endif + } + strncpy(tempInfo.spName, productInfo.spName, SCE_NP_COMMERCE2_SP_NAME_LEN); + strncpy(tempInfo.imageUrl, productInfo.imageUrl, SCE_NP_COMMERCE2_URL_LEN); + tempInfo.releaseDate = productInfo.releaseDate; + + if (productInfo.countOfSku == 1) + { + // Get SKU info + ret = sceNpCommerce2GetGameSkuInfoFromGameProductInfo(&productInfo, 0, &skuInfo); + if (ret < 0) + { + sceNpCommerce2DestroyGetCategoryContentsResult(&result); + setError(ret); + return ret; + } + tempInfo.purchasabilityFlag = skuInfo.purchasabilityFlag; + + // Take out the price. Nicely formatted + // but also keep the price as a value in case it's 0 - we need to show "free" for that + tempInfo.ui32Price= skuInfo.price; + ret = sceNpCommerce2GetPrice(m_contextId, tempInfo.price, sizeof(tempInfo.price), skuInfo.price); + + if (ret < 0) + { + sceNpCommerce2DestroyGetCategoryContentsResult(&result); + setError(ret); + return ret; + } + } + tempProductVec.push_back(tempInfo); + } + } + + // Set our result + *productList = tempProductVec; + + // Destroy the category contents result + ret = sceNpCommerce2DestroyGetCategoryContentsResult(&result); + if (ret < 0) + { + return ret; + } + + return ret; +} + +int SonyCommerce::getCategoryInfo(CategoryInfo *pInfo, char *categoryId) +{ + int ret = 0; + uint32_t requestId; + size_t bufSize = sizeof(m_commercebuffer); + size_t fillSize = 0; + SceNpCommerce2GetCategoryContentsResult result; + SceNpCommerce2CategoryInfo categoryInfo; + SceNpCommerce2ContentInfo contentInfo; + //CategoryInfo tempCatInfo; + CategoryInfoSub tempSubCatInfo; + + if (!m_contextCreated) + { + ret = createContext(); + if (ret < 0) + { + m_errorCode = ret; + return ret; + } + } + + // Create request ID + ret = sceNpCommerce2GetCategoryContentsCreateReq(m_contextId, &requestId); + if (ret < 0) + { + m_errorCode = ret; + return ret; + } + + // Obtain category content data + if (categoryId) + { + ret = sceNpCommerce2GetCategoryContentsStart(requestId, categoryId, 0, SCE_NP_COMMERCE2_GETCAT_MAX_COUNT); + } + else + { + ret = sceNpCommerce2GetCategoryContentsStart(requestId,categoryId, + 0, SCE_NP_COMMERCE2_GETCAT_MAX_COUNT); + } + if (ret < 0) + { + sceNpCommerce2DestroyReq(requestId); + m_errorCode = ret; + return ret; + } + + ret = sceNpCommerce2GetCategoryContentsGetResult(requestId, m_commercebuffer, bufSize, &fillSize); + if (ret < 0) + { + if(ret==SCE_NP_COMMERCE2_ERROR_SERVER_MAINTENANCE) + { + app.DebugPrintf(4,"\n--- SCE_NP_COMMERCE2_ERROR_SERVER_MAINTENANCE ---\n\n"); + } + sceNpCommerce2DestroyReq(requestId); + m_errorCode = ret; + return ret; + } + + ret = sceNpCommerce2DestroyReq(requestId); + if (ret < 0) + { + m_errorCode = ret; + return ret; + } + + // We have the initial category content data, + // now to take out the category content information. + ret = sceNpCommerce2InitGetCategoryContentsResult(&result, m_commercebuffer, fillSize); + if (ret < 0) { + m_errorCode = ret; + return ret; + } + + // Get the category information + ret = sceNpCommerce2GetCategoryInfo(&result, &categoryInfo); + if (ret < 0) { + sceNpCommerce2DestroyGetCategoryContentsResult(&result); + m_errorCode = ret; + return ret; + } + + strcpy(pInfo->current.categoryId, categoryInfo.categoryId); + strcpy(pInfo->current.categoryName, categoryInfo.categoryName); + strcpy(pInfo->current.categoryDescription, categoryInfo.categoryDescription); + strcpy(pInfo->current.imageUrl, categoryInfo.imageUrl); + pInfo->countOfProducts = categoryInfo.countOfProduct; + pInfo->countOfSubCategories = categoryInfo.countOfSubCategory; + + if (categoryInfo.countOfSubCategory > 0) + { + // For each sub category, obtain information + for (int i = 0; i < result.rangeOfContents.count; i++) + { + + ret = sceNpCommerce2GetContentInfo(&result, i, &contentInfo); + if (ret < 0) + { + sceNpCommerce2DestroyGetCategoryContentsResult(&result); + m_errorCode = ret; + return ret; + } + + // Only process if it is a category + if (contentInfo.contentType == SCE_NP_COMMERCE2_CONTENT_TYPE_CATEGORY) + { + + ret = sceNpCommerce2GetCategoryInfoFromContentInfo(&contentInfo, &categoryInfo); + if (ret < 0) + { + sceNpCommerce2DestroyGetCategoryContentsResult(&result); + m_errorCode = ret; + return ret; + } + + strcpy(tempSubCatInfo.categoryId, categoryInfo.categoryId); + strcpy(tempSubCatInfo.categoryName, categoryInfo.categoryName); + strcpy(tempSubCatInfo.categoryDescription, categoryInfo.categoryDescription); + strcpy(tempSubCatInfo.imageUrl, categoryInfo.imageUrl); + + // Add to the list + pInfo->subCategories.push_back(tempSubCatInfo); + } + } + } + + // Set our result + //*info = tempCatInfo; + + // Destroy the category contents result + ret = sceNpCommerce2DestroyGetCategoryContentsResult(&result); + if (ret < 0) { + return ret; + } + + return ret; +} + + +int SonyCommerce::getDetailedProductInfo(ProductInfoDetailed *pInfo, const char *productId, char *categoryId) +{ + int ret = 0; + uint32_t requestId; + size_t bufSize = sizeof(m_commercebuffer); + size_t fillSize = 0; + std::list ratingDescList; + SceNpCommerce2GetProductInfoResult result; + SceNpCommerce2ContentRatingInfo ratingInfo; + SceNpCommerce2GameProductInfo productInfo; + SceNpCommerce2GameSkuInfo skuInfo; + //ProductInfoDetailed tempInfo; + + if (!m_contextCreated) { + ret = createContext(); + if (ret < 0) { + m_errorCode = ret; + return ret; + } + } + + // Obtain product data + ret = sceNpCommerce2GetProductInfoCreateReq(m_contextId, &requestId); + if (ret < 0) { + m_errorCode = ret; + return ret; + } + + if (categoryId && categoryId[0] != 0) { + ret = sceNpCommerce2GetProductInfoStart(requestId, categoryId, productId); + } else { + ret = sceNpCommerce2GetProductInfoStart(requestId, NULL, productId); + } + if (ret < 0) { + sceNpCommerce2DestroyReq(requestId); + m_errorCode = ret; + return ret; + } + + ret = sceNpCommerce2GetProductInfoGetResult(requestId, m_commercebuffer, bufSize, &fillSize); + if (ret < 0) { + sceNpCommerce2DestroyReq(requestId); + m_errorCode = ret; + return ret; + } + + ret = sceNpCommerce2DestroyReq(requestId); + if (ret < 0) + { + m_errorCode = ret; + return ret; + } + + // Take Out Game Product Information + ret = sceNpCommerce2InitGetProductInfoResult(&result, m_commercebuffer, fillSize); + if (ret < 0) + { + m_errorCode = ret; + return ret; + } + + ret = sceNpCommerce2GetGameProductInfo(&result, &productInfo); + if (ret < 0) + { + sceNpCommerce2DestroyGetProductInfoResult(&result); + m_errorCode = ret; + return ret; + } + + // Get rating info + ret = sceNpCommerce2GetContentRatingInfoFromGameProductInfo(&productInfo, &ratingInfo); + if (ret < 0) + { + sceNpCommerce2DestroyGetProductInfoResult(&result); + m_errorCode = ret; + return ret; + } + + for (int index = 0; index < ratingInfo.countOfContentRatingDescriptor; index++) + { + SceNpCommerce2ContentRatingDescriptor desc; + sceNpCommerce2GetContentRatingDescriptor(&ratingInfo, index, &desc); + ratingDescList.push_back(desc); + } + + // populate our temp struct + pInfo->ratingDescriptors = ratingDescList; + strncpy(pInfo->productId, productInfo.productId, SCE_NP_COMMERCE2_PRODUCT_ID_LEN); + strncpy(pInfo->productName, productInfo.productName, SCE_NP_COMMERCE2_PRODUCT_NAME_LEN); + strncpy(pInfo->shortDescription, productInfo.productShortDescription, SCE_NP_COMMERCE2_PRODUCT_SHORT_DESCRIPTION_LEN); + strncpy(pInfo->longDescription, productInfo.productLongDescription, SCE_NP_COMMERCE2_PRODUCT_LONG_DESCRIPTION_LEN); + strncpy(pInfo->legalDescription, productInfo.legalDescription, SCE_NP_COMMERCE2_PRODUCT_LEGAL_DESCRIPTION_LEN); + strncpy(pInfo->spName, productInfo.spName, SCE_NP_COMMERCE2_SP_NAME_LEN); + strncpy(pInfo->imageUrl, productInfo.imageUrl, SCE_NP_COMMERCE2_URL_LEN); + pInfo->releaseDate = productInfo.releaseDate; + strncpy(pInfo->ratingSystemId, ratingInfo.ratingSystemId, SCE_NP_COMMERCE2_RATING_SYSTEM_ID_LEN); + strncpy(pInfo->ratingImageUrl, ratingInfo.imageUrl, SCE_NP_COMMERCE2_URL_LEN); + + // Get SKU info + if (productInfo.countOfSku == 1) + { + ret = sceNpCommerce2GetGameSkuInfoFromGameProductInfo(&productInfo, 0, &skuInfo); + if (ret < 0) + { + sceNpCommerce2DestroyGetProductInfoResult(&result); + m_errorCode = ret; + return ret; + } + strncpy(pInfo->skuId, skuInfo.skuId, SCE_NP_COMMERCE2_SKU_ID_LEN); + pInfo->purchasabilityFlag = skuInfo.purchasabilityFlag; + + // Take out the price. Nicely formatted + // but also keep the price as a value in case it's 0 - we need to show "free" for that + pInfo->ui32Price= skuInfo.price; + ret = sceNpCommerce2GetPrice(m_contextId, pInfo->price, sizeof(pInfo->price), skuInfo.price); + if (ret < 0) + { + sceNpCommerce2DestroyGetProductInfoResult(&result); + m_errorCode = ret; + return ret; + } + } + + // Set our result + //*info = tempInfo; + + ret = sceNpCommerce2DestroyGetProductInfoResult(&result); + if (ret < 0) + { + return ret; + } + + return ret; +} + + +int SonyCommerce::addDetailedProductInfo(ProductInfo *info, const char *productId, char *categoryId) +{ + int ret = 0; + uint32_t requestId; + size_t bufSize = sizeof(m_commercebuffer); + size_t fillSize = 0; + std::list ratingDescList; + SceNpCommerce2GetProductInfoResult result; + SceNpCommerce2ContentRatingInfo ratingInfo; + SceNpCommerce2GameProductInfo productInfo; + SceNpCommerce2GameSkuInfo skuInfo; + //ProductInfoDetailed tempInfo; + + if (!m_contextCreated) + { + ret = createContext(); + if (ret < 0) + { + m_errorCode = ret; + return ret; + } + } + + // Obtain product data + ret = sceNpCommerce2GetProductInfoCreateReq(m_contextId, &requestId); + if (ret < 0) + { + m_errorCode = ret; + return ret; + } + + if (categoryId && categoryId[0] != 0) + { + ret = sceNpCommerce2GetProductInfoStart(requestId, categoryId, productId); + } + else + { + ret = sceNpCommerce2GetProductInfoStart(requestId, categoryId, productId); + } + if (ret < 0) { + sceNpCommerce2DestroyReq(requestId); + m_errorCode = ret; + return ret; + } + + ret = sceNpCommerce2GetProductInfoGetResult(requestId, m_commercebuffer, bufSize, &fillSize); + if (ret < 0) + { + sceNpCommerce2DestroyReq(requestId); + m_errorCode = ret; + return ret; + } + + ret = sceNpCommerce2DestroyReq(requestId); + if (ret < 0) + { + m_errorCode = ret; + return ret; + } + + // Take Out Game Product Information + ret = sceNpCommerce2InitGetProductInfoResult(&result, m_commercebuffer, fillSize); + if (ret < 0) + { + m_errorCode = ret; + return ret; + } + + ret = sceNpCommerce2GetGameProductInfo(&result, &productInfo); + if (ret < 0) + { + sceNpCommerce2DestroyGetProductInfoResult(&result); + m_errorCode = ret; + return ret; + } + + // Get rating info + ret = sceNpCommerce2GetContentRatingInfoFromGameProductInfo(&productInfo, &ratingInfo); + if (ret < 0) + { + sceNpCommerce2DestroyGetProductInfoResult(&result); + m_errorCode = ret; + return ret; + } + + for (int index = 0; index < ratingInfo.countOfContentRatingDescriptor; index++) + { + SceNpCommerce2ContentRatingDescriptor desc; + sceNpCommerce2GetContentRatingDescriptor(&ratingInfo, index, &desc); + ratingDescList.push_back(desc); + } + + // populate our temp struct +// tempInfo.ratingDescriptors = ratingDescList; +// strncpy(tempInfo.productId, productInfo.productId, SCE_NP_COMMERCE2_PRODUCT_ID_LEN); +// strncpy(tempInfo.productName, productInfo.productName, SCE_NP_COMMERCE2_PRODUCT_NAME_LEN); +// strncpy(tempInfo.shortDescription, productInfo.productShortDescription, SCE_NP_COMMERCE2_PRODUCT_SHORT_DESCRIPTION_LEN); + strncpy(info->longDescription, productInfo.productLongDescription, SCE_NP_COMMERCE2_PRODUCT_LONG_DESCRIPTION_LEN); +// strncpy(tempInfo.legalDescription, productInfo.legalDescription, SCE_NP_COMMERCE2_PRODUCT_LEGAL_DESCRIPTION_LEN); +// strncpy(tempInfo.spName, productInfo.spName, SCE_NP_COMMERCE2_SP_NAME_LEN); +// strncpy(tempInfo.imageUrl, productInfo.imageUrl, SCE_NP_COMMERCE2_URL_LEN); +// tempInfo.releaseDate = productInfo.releaseDate; +// strncpy(tempInfo.ratingSystemId, ratingInfo.ratingSystemId, SCE_NP_COMMERCE2_RATING_SYSTEM_ID_LEN); +// strncpy(tempInfo.ratingImageUrl, ratingInfo.imageUrl, SCE_NP_COMMERCE2_URL_LEN); + + // Get SKU info + if (productInfo.countOfSku == 1) + { + ret = sceNpCommerce2GetGameSkuInfoFromGameProductInfo(&productInfo, 0, &skuInfo); + if (ret < 0) + { + sceNpCommerce2DestroyGetProductInfoResult(&result); + m_errorCode = ret; + return ret; + } + strncpy(info->skuId, skuInfo.skuId, SCE_NP_COMMERCE2_SKU_ID_LEN); + info->purchasabilityFlag = skuInfo.purchasabilityFlag; + info->annotation = skuInfo.annotation; + + // Take out the price. Nicely formatted + // but also keep the price as a value in case it's 0 - we need to show "free" for that + info->ui32Price= skuInfo.price; + ret = sceNpCommerce2GetPrice(m_contextId, info->price, sizeof(info->price), skuInfo.price); + if (ret < 0) + { + sceNpCommerce2DestroyGetProductInfoResult(&result); + m_errorCode = ret; + return ret; + } + } + else + { + // 4J-PB - more than one sku id! We have to be able to use the sku id returned for a product, so there is not supposed to be more than 1 + app.DebugPrintf("MORE THAN 1 SKU ID FOR %s\n",info->productName); + } + + // Set our result + //*info = tempInfo; + + ret = sceNpCommerce2DestroyGetProductInfoResult(&result); + if (ret < 0) + { + return ret; + } + + return ret; +} + + +int SonyCommerce::checkout(CheckoutInputParams ¶ms) +{ + int ret = 0; + const char *skuIdsTemp[SCE_NP_COMMERCE2_SKU_CHECKOUT_MAX]; + std::list::iterator iter = params.skuIds.begin(); + std::list::iterator iterEnd = params.skuIds.end(); + + if (!m_contextCreated) { + ret = createContext(); + if (ret < 0) { + return ret; + } + } + + for (int i = 0; i < params.skuIds.size(); i++) { + skuIdsTemp[i] = (const char *)(*iter); + iter++; + } + + ret = sceNpCommerce2DoCheckoutStartAsync(m_contextId, skuIdsTemp, params.skuIds.size(), *params.memContainer); + if (ret < 0) { + return ret; + } + + return CELL_OK; +} + + +int SonyCommerce::downloadList(DownloadListInputParams ¶ms) +{ + int ret = 0; + const char *skuIdsTemp[SCE_NP_COMMERCE2_SKU_CHECKOUT_MAX]; + std::list::iterator iter = params.skuIds.begin(); + std::list::iterator iterEnd = params.skuIds.end(); + + if (!m_contextCreated) { + ret = createContext(); + if (ret < 0) { + return ret; + } + } + + for (int i = 0; i < params.skuIds.size(); i++) { + skuIdsTemp[i] = (const char *)(*iter); + iter++; + } + ret = sceNpCommerce2DoDlListStartAsync(m_contextId, app.GetCommerceCategory(), skuIdsTemp, params.skuIds.size(), *params.memContainer); + if (ret < 0) { + return ret; + } + + return CELL_OK; +} + +void SonyCommerce::UpgradeTrialCallback2(LPVOID lpParam,int err) +{ + app.DebugPrintf(4,"SonyCommerce_UpgradeTrialCallback2 : err : 0x%08x\n", err); + SonyCommerce::CheckForTrialUpgradeKey(); + if(err != CELL_OK) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_PRO_UNLOCKGAME_TITLE, IDS_NO_DLCOFFERS, uiIDA,1,ProfileManager.GetPrimaryPad()); + } + m_trialUpgradeCallbackFunc(m_trialUpgradeCallbackParam, m_errorCode); +} + +void SonyCommerce::UpgradeTrialCallback1(LPVOID lpParam,int err) +{ + + app.DebugPrintf(4,"SonyCommerce_UpgradeTrialCallback1 : err : 0x%08x\n", err); + if(err == CELL_OK) + { + const char* skuID = s_trialUpgradeProductInfoDetailed.skuId; + if(s_trialUpgradeProductInfoDetailed.purchasabilityFlag == SCE_NP_COMMERCE2_SKU_PURCHASABILITY_FLAG_OFF) + { + app.DebugPrintf(4,"UpgradeTrialCallback1 - DownloadAlreadyPurchased\n"); + SonyCommerce::DownloadAlreadyPurchased( UpgradeTrialCallback2, NULL, skuID); + } + else + { + app.DebugPrintf(4,"UpgradeTrialCallback1 - Checkout\n"); + SonyCommerce::Checkout( UpgradeTrialCallback2, NULL, skuID); + } + } + else + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_PRO_UNLOCKGAME_TITLE, IDS_NO_DLCOFFERS, uiIDA,1,ProfileManager.GetPrimaryPad()); + m_trialUpgradeCallbackFunc(m_trialUpgradeCallbackParam, m_errorCode); + } +} + + + +// global func, so we can call from the profile lib +void SonyCommerce_UpgradeTrial() +{ + // we're now calling the app function here, which manages pending requests + app.UpgradeTrial(); +} + +void SonyCommerce::UpgradeTrial(CallbackFunc cb, LPVOID lpParam) +{ + m_trialUpgradeCallbackFunc = cb; + m_trialUpgradeCallbackParam = lpParam; + +// static char szTrialUpgradeSkuID[64]; +// sprintf(szTrialUpgradeSkuID, "%s-TRIALUPGRADE0001", app.GetCommerceCategory());//, szSKUSuffix); + GetDetailedProductInfo(UpgradeTrialCallback1, NULL, &s_trialUpgradeProductInfoDetailed, app.GetUpgradeKey(), app.GetCommerceCategory()); +} + + +int SonyCommerce::createContext() +{ + SceNpId npId; + int ret = sceNpManagerGetNpId(&npId); + if(ret < 0) + { + app.DebugPrintf(4,"createContext sceNpManagerGetNpId problem\n"); + return ret; + } + + if (m_contextCreated) { + ret = sceNpCommerce2DestroyCtx(m_contextId); + if (ret < 0) + { + app.DebugPrintf(4,"createContext sceNpCommerce2DestroyCtx problem\n"); + return ret; + } + } + + // Create commerce2 context + ret = sceNpCommerce2CreateCtx(SCE_NP_COMMERCE2_VERSION, &npId, commerce2Handler, NULL, &m_contextId); + if (ret < 0) + { + app.DebugPrintf(4,"createContext sceNpCommerce2CreateCtx problem\n"); + return ret; + } + + m_contextCreated = true; + + return CELL_OK; +} + +int SonyCommerce::createSession() +{ + int ret = createContext(); + if (ret < 0) { + return ret; + } + + m_currentPhase = e_phase_creatingSessionPhase; + ret = sceNpCommerce2CreateSessionStart(m_contextId); + if (ret < 0) { + return ret; + } + return ret; +} + + +void SonyCommerce::commerce2Handler(uint32_t contextId, uint32_t subjectId, int event, int errorCode, void *arg) +{ +// Event reply; +// reply.service = Toolkit::NP::commerce; +// + EnterCriticalSection(&m_queueLock); + + switch (event) { + case SCE_NP_COMMERCE2_EVENT_REQUEST_ERROR: + { + m_messageQueue.push(e_message_commerceEnd); + m_errorCode = errorCode; + break; + } + case SCE_NP_COMMERCE2_EVENT_CREATE_SESSION_DONE: + { + m_messageQueue.push(e_message_commerceEnd); + m_event = e_event_commerceSessionCreated; + break; + } + case SCE_NP_COMMERCE2_EVENT_CREATE_SESSION_ABORT: + { + m_messageQueue.push(e_message_commerceEnd); + m_event = e_event_commerceSessionAborted; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_CHECKOUT_STARTED: + { + m_currentPhase = e_phase_checkoutPhase; + m_event = e_event_commerceCheckoutStarted; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_CHECKOUT_SUCCESS: + { + m_messageQueue.push(e_message_commerceEnd); + m_event = e_event_commerceCheckoutSuccess; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_CHECKOUT_BACK: + { + m_messageQueue.push(e_message_commerceEnd); + m_event = e_event_commerceCheckoutAborted; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_CHECKOUT_FINISHED: + { + m_event = e_event_commerceCheckoutFinished; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_DL_LIST_STARTED: + { + m_currentPhase = e_phase_downloadListPhase; + m_event = e_event_commerceDownloadListStarted; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_DL_LIST_SUCCESS: + { + m_messageQueue.push(e_message_commerceEnd); + m_event = e_event_commerceDownloadListSuccess; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_DL_LIST_FINISHED: + { + m_event = e_event_commerceDownloadListFinished; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_PROD_BROWSE_STARTED: + m_currentPhase = e_phase_productBrowsePhase; + m_event = e_event_commerceProductBrowseStarted; + break; + case SCE_NP_COMMERCE2_EVENT_DO_PROD_BROWSE_SUCCESS: + { + m_messageQueue.push(e_message_commerceEnd); + m_event = e_event_commerceProductBrowseSuccess; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_PROD_BROWSE_BACK: + { + m_messageQueue.push(e_message_commerceEnd); + m_event = e_event_commerceProductBrowseAborted; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_PROD_BROWSE_FINISHED: + { + m_event = e_event_commerceProductBrowseFinished; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_PROD_BROWSE_OPENED: + break; + case SCE_NP_COMMERCE2_EVENT_DO_PRODUCT_CODE_STARTED: + { + m_currentPhase = e_phase_voucherRedeemPhase; + m_event = e_event_commerceVoucherInputStarted; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_PRODUCT_CODE_SUCCESS: + { + m_messageQueue.push(e_message_commerceEnd); + m_event = e_event_commerceVoucherInputSuccess; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_PRODUCT_CODE_BACK: + { + m_messageQueue.push(e_message_commerceEnd); + m_event = e_event_commerceVoucherInputAborted; + break; + } + case SCE_NP_COMMERCE2_EVENT_DO_PRODUCT_CODE_FINISHED: + { + m_event = e_event_commerceVoucherInputFinished; + break; + } + default: + break; + }; + + LeaveCriticalSection(&m_queueLock); +} + + + +void SonyCommerce::processMessage() +{ + EnterCriticalSection(&m_queueLock); + int ret; + if(m_messageQueue.empty()) + { + LeaveCriticalSection(&m_queueLock); + return; + } + Message msg = m_messageQueue.front(); + m_messageQueue.pop(); + + switch (msg) + { + + case e_message_commerceCreateSession: + ret = createSession(); + if (ret < 0) + { + m_event = e_event_commerceError; + m_errorCode = ret; + } + break; + + case e_message_commerceGetCategoryInfo: + { + ret = getCategoryInfo(m_pCategoryInfo, m_pCategoryID); + if (ret < 0) + { + m_event = e_event_commerceError; + app.DebugPrintf(4,"ERROR - e_event_commerceGotCategoryInfo - %s\n",m_pCategoryID); + m_errorCode = ret; + } + else + { + m_event = e_event_commerceGotCategoryInfo; + app.DebugPrintf(4,"e_event_commerceGotCategoryInfo - %s\n",m_pCategoryID); + } + break; + } + + case e_message_commerceGetProductList: + { + ret = getProductList(m_pProductInfoList, m_pCategoryID); + if (ret < 0) + { + m_event = e_event_commerceError; + } + else + { + m_event = e_event_commerceGotProductList; + app.DebugPrintf(4,"e_event_commerceGotProductList - %s\n",m_pCategoryID); + } + break; + } + + case e_message_commerceGetDetailedProductInfo: + { + ret = getDetailedProductInfo(m_pProductInfoDetailed, m_pProductID, m_pCategoryID); + if (ret < 0) + { + m_event = e_event_commerceError; + m_errorCode = ret; + } + else + { + m_event = e_event_commerceGotDetailedProductInfo; + app.DebugPrintf(4,"e_event_commerceGotDetailedProductInfo - %s\n",m_pCategoryID); + } + break; + } + case e_message_commerceAddDetailedProductInfo: + { + ret = addDetailedProductInfo(m_pProductInfo, m_pProductID, m_pCategoryID); + if (ret < 0) + { + m_event = e_event_commerceError; + m_errorCode = ret; + } + else + { + m_event = e_event_commerceAddedDetailedProductInfo; + } + break; + } + +// +// case e_message_commerceStoreProductBrowse: +// { +// ret = productBrowse(*(ProductBrowseParams *)msg.inputArgs); +// if (ret < 0) { +// m_event = e_event_commerceError; +// m_errorCode = ret; +// } +// _TOOLKIT_NP_DEL (ProductBrowseParams *)msg.inputArgs; +// break; +// } +// +// case e_message_commerceUpgradeTrial: +// { +// ret = upgradeTrial(); +// if (ret < 0) { +// m_event = e_event_commerceError; +// m_errorCode = ret; +// } +// break; +// } +// +// case e_message_commerceRedeemVoucher: +// { +// ret = voucherCodeInput(*(VoucherInputParams *)msg.inputArgs); +// if (ret < 0) { +// m_event = e_event_commerceError; +// m_errorCode = ret; +// } +// _TOOLKIT_NP_DEL (VoucherInputParams *)msg.inputArgs; +// break; +// } +// +// case e_message_commerceGetEntitlementList: +// { +// Job > tmpJob(static_cast > *>(msg.output)); +// +// int state = 0; +// int ret = sceNpManagerGetStatus(&state); +// +// // We don't want to process this if we are offline +// if (ret < 0 || state != SCE_NP_MANAGER_STATUS_ONLINE) { +// m_event = e_event_commerceError; +// reply.returnCode = SCE_TOOLKIT_NP_OFFLINE; +// tmpJob.setError(SCE_TOOLKIT_NP_OFFLINE); +// } else { +// getEntitlementList(&tmpJob); +// } +// break; +// } +// +// case e_message_commerceConsumeEntitlement: +// { +// int state = 0; +// int ret = sceNpManagerGetStatus(&state); +// +// // We don't want to process this if we are offline +// if (ret < 0 || state != SCE_NP_MANAGER_STATUS_ONLINE) { +// m_event = e_event_commerceError; +// reply.returnCode = SCE_TOOLKIT_NP_OFFLINE; +// } else { +// +// ret = consumeEntitlement(*(EntitlementToConsume *)msg.inputArgs); +// if (ret < 0) { +// m_event = e_event_commerceError; +// m_errorCode = ret; +// } else { +// m_event = e_event_commerceConsumedEntitlement; +// } +// } +// _TOOLKIT_NP_DEL (EntitlementToConsume *)msg.inputArgs; +// +// break; +// } +// + case e_message_commerceCheckout: + { + ret = checkout(m_checkoutInputParams); + if (ret < 0) { + m_event = e_event_commerceError; + m_errorCode = ret; + } + break; + } + + case e_message_commerceDownloadList: + { + ret = downloadList(m_downloadInputParams); + if (ret < 0) { + m_event = e_event_commerceError; + m_errorCode = ret; + } + break; + } + + case e_message_commerceEnd: + app.DebugPrintf("XXX - e_message_commerceEnd!\n"); + ret = commerceEnd(); + if (ret < 0) + { + m_event = e_event_commerceError; + m_errorCode = ret; + } + // 4J-PB - we don't seem to handle the error code here + else if(m_errorCode!=0) + { + m_event = e_event_commerceError; + } + break; + + default: + break; + } + + LeaveCriticalSection(&m_queueLock); +} + + +void SonyCommerce::processEvent() +{ + int ret = 0; + + switch (m_event) + { + case e_event_none: + break; + case e_event_commerceSessionCreated: + app.DebugPrintf(4,"Commerce Session Created.\n"); + runCallback(); + break; + case e_event_commerceSessionAborted: + app.DebugPrintf(4,"Commerce Session aborted.\n"); + runCallback(); + break; + case e_event_commerceGotProductList: + app.DebugPrintf(4,"Got product list.\n"); + runCallback(); + break; + case e_event_commerceGotCategoryInfo: + app.DebugPrintf(4,"Got category info\n"); + runCallback(); + break; + case e_event_commerceGotDetailedProductInfo: + app.DebugPrintf(4,"Got detailed product info.\n"); + runCallback(); + break; + case e_event_commerceAddedDetailedProductInfo: + app.DebugPrintf(4,"Added detailed product info.\n"); + runCallback(); + break; + case e_event_commerceProductBrowseStarted: + break; + case e_event_commerceProductBrowseSuccess: + break; + case e_event_commerceProductBrowseAborted: + break; + case e_event_commerceProductBrowseFinished: + assert(0); +// ret = sys_memory_container_destroy(s_memContainer); +// if (ret < 0) { +// printf("Failed to destroy memory container"); +// } +// s_memContainer = SYS_MEMORY_CONTAINER_ID_INVALID; + break; + case e_event_commerceVoucherInputStarted: + break; + case e_event_commerceVoucherInputSuccess: + break; + case e_event_commerceVoucherInputAborted: + break; + case e_event_commerceVoucherInputFinished: + assert(0); +// ret = sys_memory_container_destroy(s_memContainer); +// if (ret < 0) { +// printf("Failed to destroy memory container"); +// } +// s_memContainer = SYS_MEMORY_CONTAINER_ID_INVALID; + break; + case e_event_commerceGotEntitlementList: + break; + case e_event_commerceConsumedEntitlement: + break; + case e_event_commerceCheckoutStarted: + app.DebugPrintf(4,"Checkout Started\n"); + break; + case e_event_commerceCheckoutSuccess: + app.DebugPrintf(4,"Checkout succeeded: 0x%x\n", m_errorCode); + // clear the DLC installed and check again + app.ClearDLCInstalled(); + ui.HandleDLCInstalled(0); + break; + case e_event_commerceCheckoutAborted: + app.DebugPrintf(4,"Checkout aborted: 0x%x\n", m_errorCode); + break; + case e_event_commerceCheckoutFinished: + app.DebugPrintf(4,"Checkout Finished: 0x%x\n", m_errorCode); + ret = sys_memory_container_destroy(m_memContainer); + if (ret < 0) { + app.DebugPrintf(4,"Failed to destroy memory container"); + } + + m_memContainer = SYS_MEMORY_CONTAINER_ID_INVALID; + // 4J-PB - if there's been an error - like dlc already purchased, the runcallback has already happened, and will crash this time + if(m_callbackFunc!=NULL) + { + runCallback(); + } + break; + case e_event_commerceDownloadListStarted: + app.DebugPrintf(4,"Download List Started\n"); + break; + case e_event_commerceDownloadListSuccess: + app.DebugPrintf(4,"Download succeeded: 0x%x\n", m_errorCode); + break; + case e_event_commerceDownloadListFinished: + app.DebugPrintf(4,"Download Finished: 0x%x\n", m_errorCode); + ret = sys_memory_container_destroy(m_memContainer); + if (ret < 0) { + app.DebugPrintf(4,"Failed to destroy memory container"); + } + + m_memContainer = SYS_MEMORY_CONTAINER_ID_INVALID; + // 4J-PB - if there's been an error - like dlc already purchased, the runcallback has already happened, and will crash this time + if(m_callbackFunc!=NULL) + { + runCallback(); + } + break; + case e_event_commerceError: + app.DebugPrintf(4,"Commerce Error 0x%x\n", m_errorCode); + + if(m_memContainer != SYS_MEMORY_CONTAINER_ID_INVALID) + { + ret = sys_memory_container_destroy(m_memContainer); + if (ret < 0) { + app.DebugPrintf(4,"Failed to destroy memory container"); + } + + m_memContainer = SYS_MEMORY_CONTAINER_ID_INVALID; + } + + runCallback(); + break; + default: + break; + } + m_event = e_event_none; +} + + +int SonyCommerce::commerceEnd() +{ + int ret = 0; + + if (m_currentPhase == e_phase_voucherRedeemPhase) + ret = sceNpCommerce2DoProductCodeFinishAsync(m_contextId); + else if (m_currentPhase == e_phase_productBrowsePhase) + ret = sceNpCommerce2DoProductBrowseFinishAsync(m_contextId); + else if (m_currentPhase == e_phase_creatingSessionPhase) + ret = sceNpCommerce2CreateSessionFinish(m_contextId, &m_sessionInfo); + else if (m_currentPhase == e_phase_checkoutPhase) + ret = sceNpCommerce2DoCheckoutFinishAsync(m_contextId); + else if (m_currentPhase == e_phase_downloadListPhase) + ret = sceNpCommerce2DoDlListFinishAsync(m_contextId); + + m_currentPhase = e_phase_idle; + + return ret; +} + +void SonyCommerce::CreateSession( CallbackFunc cb, LPVOID lpParam ) +{ + Init(); + EnterCriticalSection(&m_queueLock); + setCallback(cb,lpParam); + m_messageQueue.push(e_message_commerceCreateSession); + if(m_tickThread == NULL) + m_tickThread = new C4JThread(TickLoop, NULL, "SonyCommerce tick"); + if(m_tickThread->isRunning() == false) + { + m_currentPhase = e_phase_idle; + m_tickThread->Run(); + } + LeaveCriticalSection(&m_queueLock); +} + +void SonyCommerce::CloseSession() +{ + assert(m_currentPhase == e_phase_idle); + m_currentPhase = e_phase_stopped; + Shutdown(); +} + +void SonyCommerce::GetProductList( CallbackFunc cb, LPVOID lpParam, std::vector* productList, const char *categoryId) +{ + EnterCriticalSection(&m_queueLock); + setCallback(cb,lpParam); + m_pProductInfoList = productList; + strcpy(m_pCategoryID,categoryId); + m_messageQueue.push(e_message_commerceGetProductList); + LeaveCriticalSection(&m_queueLock); +} + +void SonyCommerce::GetDetailedProductInfo( CallbackFunc cb, LPVOID lpParam, ProductInfoDetailed* productInfo, const char *productId, const char *categoryId ) +{ + EnterCriticalSection(&m_queueLock); + setCallback(cb,lpParam); + m_pProductInfoDetailed = productInfo; + m_pProductID = productId; + strcpy(m_pCategoryID,categoryId); + m_messageQueue.push(e_message_commerceGetDetailedProductInfo); + LeaveCriticalSection(&m_queueLock); +} + +// 4J-PB - fill out the long description and the price for the product +void SonyCommerce::AddDetailedProductInfo( CallbackFunc cb, LPVOID lpParam, ProductInfo* productInfo, const char *productId, const char *categoryId ) +{ + EnterCriticalSection(&m_queueLock); + setCallback(cb,lpParam); + m_pProductInfo = productInfo; + m_pProductID = productId; + strcpy(m_pCategoryID,categoryId); + m_messageQueue.push(e_message_commerceAddDetailedProductInfo); + LeaveCriticalSection(&m_queueLock); +} +void SonyCommerce::GetCategoryInfo( CallbackFunc cb, LPVOID lpParam, CategoryInfo *info, const char *categoryId ) +{ + EnterCriticalSection(&m_queueLock); + setCallback(cb,lpParam); + m_pCategoryInfo = info; + strcpy(m_pCategoryID,categoryId); + m_messageQueue.push(e_message_commerceGetCategoryInfo); + LeaveCriticalSection(&m_queueLock); +} + +void SonyCommerce::Checkout( CallbackFunc cb, LPVOID lpParam, const char* skuID ) +{ + if(m_memContainer != SYS_MEMORY_CONTAINER_ID_INVALID) + { + return; + } + EnterCriticalSection(&m_queueLock); + setCallback(cb,lpParam); + int ret = sys_memory_container_create(&m_memContainer, SCE_NP_COMMERCE2_DO_CHECKOUT_MEMORY_CONTAINER_SIZE); + if (ret < 0) + { + app.DebugPrintf(4,"sys_memory_container_create() failed. ret = 0x%x\n", ret); + } + + m_checkoutInputParams.memContainer = &m_memContainer; + m_checkoutInputParams.skuIds.clear(); + m_checkoutInputParams.skuIds.push_back(skuID); + m_messageQueue.push(e_message_commerceCheckout); + LeaveCriticalSection(&m_queueLock); +} + +void SonyCommerce::DownloadAlreadyPurchased( CallbackFunc cb, LPVOID lpParam, const char* skuID ) +{ + if(m_memContainer != SYS_MEMORY_CONTAINER_ID_INVALID) + return; + EnterCriticalSection(&m_queueLock); + setCallback(cb,lpParam); + int ret = sys_memory_container_create(&m_memContainer, SCE_NP_COMMERCE2_DO_CHECKOUT_MEMORY_CONTAINER_SIZE); + if (ret < 0) + { + app.DebugPrintf(4,"sys_memory_container_create() failed. ret = 0x%x\n", ret); + } + + m_downloadInputParams.memContainer = &m_memContainer; + m_downloadInputParams.skuIds.clear(); + m_downloadInputParams.skuIds.push_back(skuID); + m_messageQueue.push(e_message_commerceDownloadList); + LeaveCriticalSection(&m_queueLock); +} + + + diff --git a/Minecraft.Client/Common/Network/Sony/SonyCommerce.h b/Minecraft.Client/Common/Network/Sony/SonyCommerce.h new file mode 100644 index 00000000..6df04947 --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/SonyCommerce.h @@ -0,0 +1,173 @@ +#pragma once + +#include +#include +#include +#ifdef __PS3__ +#include +#include +#include +#elif defined __PSVITA__ +#include +#include +#else // __ORBIS__ + +#define SCE_NP_COMMERCE2_CATEGORY_ID_LEN SCE_TOOLKIT_NP_COMMERCE_CATEGORY_ID_LEN ///< The size of the category ID. +#define SCE_NP_COMMERCE2_PRODUCT_ID_LEN SCE_TOOLKIT_NP_COMMERCE_PRODUCT_ID_LEN ///< The size of the product ID. +#define SCE_NP_COMMERCE2_CATEGORY_NAME_LEN SCE_TOOLKIT_NP_COMMERCE_CATEGORY_NAME_LEN ///< The size of the category name. +#define SCE_NP_COMMERCE2_CATEGORY_DESCRIPTION_LEN SCE_TOOLKIT_NP_COMMERCE_CATEGORY_DESCRIPTION_LEN ///< The size of the category description. +#define SCE_NP_COMMERCE2_URL_LEN SCE_TOOLKIT_NP_COMMERCE_URL_LEN ///< The size of the URL. +#define SCE_NP_COMMERCE2_PRODUCT_NAME_LEN SCE_TOOLKIT_NP_COMMERCE_PRODUCT_NAME_LEN ///< The size of the product name. +#define SCE_NP_COMMERCE2_PRODUCT_SHORT_DESCRIPTION_LEN SCE_TOOLKIT_NP_COMMERCE_PRODUCT_SHORT_DESCRIPTION_LEN ///< The size of the product short description. +#define SCE_NP_COMMERCE2_SP_NAME_LEN SCE_TOOLKIT_NP_COMMERCE_SP_NAME_LEN ///< The size of the licensee (publisher) name. +#define SCE_NP_COMMERCE2_CURRENCY_CODE_LEN SCE_TOOLKIT_NP_COMMERCE_CURRENCY_CODE_LEN ///< The size of currency code. +#define SCE_NP_COMMERCE2_CURRENCY_CODE_LEN SCE_TOOLKIT_NP_COMMERCE_CURRENCY_CODE_LEN +#define SCE_NP_COMMERCE2_CURRENCY_SYMBOL_LEN SCE_TOOLKIT_NP_COMMERCE_CURRENCY_SYMBOL_LEN ///< The size of currency symbol. +#define SCE_NP_COMMERCE2_THOUSAND_SEPARATOR_LEN SCE_TOOLKIT_NP_COMMERCE_THOUSAND_SEPARATOR_LEN ///< The size of the character separating every 3 digits of the price. +#define SCE_NP_COMMERCE2_DECIMAL_LETTER_LEN SCE_TOOLKIT_NP_COMMERCE_DECIMAL_LETTER_LEN ///< The size of the character indicating the decimal point in the price. +#define SCE_NP_COMMERCE2_SKU_ID_LEN SCE_TOOLKIT_NP_COMMERCE_SKU_ID_LEN ///< The size of the SKU ID. +#define SCE_NP_COMMERCE2_PRODUCT_LONG_DESCRIPTION_LEN SCE_TOOLKIT_NP_COMMERCE_PRODUCT_LONG_DESCRIPTION_LEN ///< The size of the product long description. +#define SCE_NP_COMMERCE2_PRODUCT_LEGAL_DESCRIPTION_LEN SCE_TOOLKIT_NP_COMMERCE_PRODUCT_LEGAL_DESCRIPTION_LEN ///< The size of the product legal description. +#define SCE_NP_COMMERCE2_RATING_SYSTEM_ID_LEN SCE_TOOLKIT_NP_COMMERCE_RATING_SYSTEM_ID_LEN ///< The size of the rating system ID. +#define SCE_NP_ENTITLEMENT_ID_SIZE SCE_TOOLKIT_NP_COMMERCE_ENTITLEMENT_ID_LEN ///< The size of entitlement ID. +#endif + +#ifndef __PSVITA__ +#define SCE_TOOLKIT_NP_SKU_PRICE_LEN (SCE_NP_COMMERCE2_CURRENCY_CODE_LEN \ + + SCE_NP_COMMERCE2_CURRENCY_SYMBOL_LEN \ + + SCE_NP_COMMERCE2_THOUSAND_SEPARATOR_LEN \ + + SCE_NP_COMMERCE2_DECIMAL_LETTER_LEN) ///< The maximum length of a price in characters. +#endif + +class SonyCommerce +{ + +public: + typedef void (*CallbackFunc)(LPVOID lpParam, int error_code); + + + /// @brief + /// Contains information about a subcategory on the PlayStation(R)Store. + /// + /// Contains information about a subcategory on the PlayStation(R)Store. + typedef struct CategoryInfoSub + { + char categoryId[SCE_NP_COMMERCE2_CATEGORY_ID_LEN]; ///< The ID of the subcategory. + char categoryName[SCE_NP_COMMERCE2_CATEGORY_NAME_LEN]; ///< The name of the subcategory. + char categoryDescription[SCE_NP_COMMERCE2_CATEGORY_DESCRIPTION_LEN]; ///< The detailed description of the subcategory. + char imageUrl[SCE_NP_COMMERCE2_URL_LEN]; ///< The image URL of the subcategory. + } + CategoryInfoSub; + + /// @brief + /// Current category information + /// + /// This structure contains information about a category on the PlayStation(R)Store + typedef struct CategoryInfo + { + CategoryInfoSub current; ///< The currently selected subcategory. + std::list subCategories; ///< Information about the subcategories in this category. + uint32_t countOfProducts; ///< The number of products in the category. + uint32_t countOfSubCategories; ///< The number of subcategories. + } + CategoryInfo; + + /// Contains information about a product in the PlayStation(R)Store. + typedef struct ProductInfo + { + uint32_t purchasabilityFlag; ///< A flag that indicates whether the product can be purchased (SCE_NP_COMMERCE2_SKU_PURCHASABILITY_FLAG_XXX). + uint32_t annotation; // SCE_NP_COMMERCE2_SKU_ANN_PURCHASED_CANNOT_PURCHASE_AGAIN or SCE_NP_COMMERCE2_SKU_ANN_PURCHASED_CAN_PURCHASE_AGAIN + uint32_t ui32Price; + char productId[SCE_NP_COMMERCE2_PRODUCT_ID_LEN]; ///< The product ID. + char productName[SCE_NP_COMMERCE2_PRODUCT_NAME_LEN]; ///< The name of the product. + char shortDescription[SCE_NP_COMMERCE2_PRODUCT_SHORT_DESCRIPTION_LEN]; ///< A short description of the product. + char longDescription[SCE_NP_COMMERCE2_PRODUCT_LONG_DESCRIPTION_LEN]; ///< A long description of the product. + char skuId[SCE_NP_COMMERCE2_SKU_ID_LEN]; ///< The SKU ID + char spName[SCE_NP_COMMERCE2_SP_NAME_LEN]; ///< The service provider name. + char imageUrl[SCE_NP_COMMERCE2_URL_LEN]; ///< The product image URL. + char price[SCE_TOOLKIT_NP_SKU_PRICE_LEN]; ///< The price of the product. This is formatted to include the currency code. + char padding[6]; ///< Padding. +#ifdef __PS3__ + CellRtcTick releaseDate; ///< The product release date. +#else + SceRtcTick releaseDate; +#endif + } + ProductInfo; + + /// @brief + /// Contains detailed information about a product on the PlayStation(R)Store. + /// + /// Contains detailed information about a product on the PlayStation(R)Store. + typedef struct ProductInfoDetailed + { + uint32_t purchasabilityFlag; ///< A flag that indicates whether the product can be purchased (SCE_NP_COMMERCE2_SKU_PURCHASABILITY_FLAG_XXX). + uint32_t ui32Price; + char skuId[SCE_NP_COMMERCE2_SKU_ID_LEN]; ///< The SKU ID + char productId[SCE_NP_COMMERCE2_PRODUCT_ID_LEN]; ///< The product ID. + char productName[SCE_NP_COMMERCE2_PRODUCT_NAME_LEN]; ///< The name of the product. + char shortDescription[SCE_NP_COMMERCE2_PRODUCT_SHORT_DESCRIPTION_LEN]; ///< A short description of the product. + char longDescription[SCE_NP_COMMERCE2_PRODUCT_LONG_DESCRIPTION_LEN]; ///< A long description of the product. + char legalDescription[SCE_NP_COMMERCE2_PRODUCT_LEGAL_DESCRIPTION_LEN]; ///< The legal description for the product. + char spName[SCE_NP_COMMERCE2_SP_NAME_LEN]; ///< The service provider name. + char imageUrl[SCE_NP_COMMERCE2_URL_LEN]; ///< The product image URL. + char price[SCE_TOOLKIT_NP_SKU_PRICE_LEN]; ///< The price of the product. This is formatted to include the currency code. + char ratingSystemId[SCE_NP_COMMERCE2_RATING_SYSTEM_ID_LEN]; ///< The ID of the rating system (for example: PEGI, ESRB). + char ratingImageUrl[SCE_NP_COMMERCE2_URL_LEN]; ///< The URL of the rating icon. + char padding[2]; ///< Padding. +#ifdef __PS3__ + std::list ratingDescriptors; ///< The list of rating descriptors. + CellRtcTick releaseDate; ///< The product release date. +#else + SceRtcTick releaseDate; ///< The product release date. +#endif + } + ProductInfoDetailed; + + /// @brief + /// Checkout parameters + /// + /// This structure contains list of SKUs to checkout to and a memory container + typedef struct CheckoutInputParams + { + std::list skuIds; ///< List of SKU IDs +#ifdef __PS3__ + sys_memory_container_t *memContainer; ///< Memory container for checkout overlay +#endif + } + CheckoutInputParams; + + /// @brief + /// Contains download list parameters. + /// + /// Contains download list parameters. + typedef struct DownloadListInputParams + { + std::list skuIds; ///< The list of SKU IDs +#ifdef __PS3__ + sys_memory_container_t *memContainer; ///< A memory container for checkout overlay. +#endif + const char* categoryID; + } + DownloadListInputParams; + + +public: + virtual void CreateSession(CallbackFunc cb, LPVOID lpParam) = 0; + virtual void CloseSession() = 0; + + virtual void GetCategoryInfo(CallbackFunc cb, LPVOID lpParam, CategoryInfo *info, const char *categoryId) = 0; + virtual void GetProductList(CallbackFunc cb, LPVOID lpParam, std::vector* productList, const char *categoryId) = 0; + virtual void GetDetailedProductInfo(CallbackFunc cb, LPVOID lpParam, ProductInfoDetailed* productInfoDetailed, const char *productId, const char *categoryId) = 0; + virtual void AddDetailedProductInfo( CallbackFunc cb, LPVOID lpParam, ProductInfo* productInfo, const char *productId, const char *categoryId ) = 0; + virtual void Checkout(CallbackFunc cb, LPVOID lpParam, const char* skuID) = 0; + virtual void DownloadAlreadyPurchased(CallbackFunc cb, LPVOID lpParam, const char* skuID) = 0; +#if defined(__ORBIS__) || defined( __PSVITA__) + virtual void Checkout_Game(CallbackFunc cb, LPVOID lpParam, const char* skuID) = 0; + virtual void DownloadAlreadyPurchased_Game(CallbackFunc cb, LPVOID lpParam, const char* skuID) = 0; +#endif + virtual void UpgradeTrial(CallbackFunc cb, LPVOID lpParam) = 0; + virtual void CheckForTrialUpgradeKey() = 0; + virtual bool LicenseChecked() = 0; + +}; diff --git a/Minecraft.Client/Common/Network/Sony/SonyHttp.cpp b/Minecraft.Client/Common/Network/Sony/SonyHttp.cpp new file mode 100644 index 00000000..f0095885 --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/SonyHttp.cpp @@ -0,0 +1,34 @@ +#include "stdafx.h" +#include "SonyHttp.h" + + +#ifdef __PS3__ +#include "PS3\Network\SonyHttp_PS3.h" +SonyHttp_PS3 g_SonyHttp; + +#elif defined __ORBIS__ +#include "Orbis\Network\SonyHttp_Orbis.h" +SonyHttp_Orbis g_SonyHttp; + +#elif defined __PSVITA__ +#include "PSVita\Network\SonyHttp_Vita.h" +SonyHttp_Vita g_SonyHttp; + +#endif + + + +bool SonyHttp::init() +{ + return g_SonyHttp.init(); +} + +void SonyHttp::shutdown() +{ + g_SonyHttp.shutdown(); +} + +bool SonyHttp::getDataFromURL(const char* szURL, void** ppOutData, int* pDataSize) +{ + return g_SonyHttp.getDataFromURL(szURL, ppOutData, pDataSize); +} diff --git a/Minecraft.Client/Common/Network/Sony/SonyHttp.h b/Minecraft.Client/Common/Network/Sony/SonyHttp.h new file mode 100644 index 00000000..3fa526b0 --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/SonyHttp.h @@ -0,0 +1,11 @@ +#pragma once + + + +class SonyHttp +{ +public: + static bool init(); + static void shutdown(); + static bool getDataFromURL(const char* szURL, void** ppOutData, int* pDataSize); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.cpp b/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.cpp new file mode 100644 index 00000000..ccb1957d --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.cpp @@ -0,0 +1,340 @@ + + +#include "stdafx.h" +#include "SonyRemoteStorage.h" + + +static const char sc_remoteSaveFilename[] = "/minecraft_save/gamedata.rs"; +#ifdef __PSVITA__ +static const char sc_localSaveFilename[] = "CloudSave_Vita.bin"; +static const char sc_localSaveFullPath[] = "savedata0:CloudSave_Vita.bin"; +#elif defined __PS3__ +static const char sc_localSaveFilename[] = "CloudSave_PS3.bin"; +static const char sc_localSaveFullPath[] = "NPEB01899--140720203552"; +#else +static const char sc_localSaveFilename[] = "CloudSave_Orbis.bin"; +static const char sc_localSaveFullPath[] = "/app0/CloudSave_Orbis.bin"; +#endif + +static SceRemoteStorageStatus statParams; + + + + +// void remoteStorageGetCallback(LPVOID lpParam, SonyRemoteStorage::Status s, int error_code) +// { +// app.DebugPrintf("remoteStorageGetCallback err : 0x%08x\n"); +// } +// +// void remoteStorageCallback(LPVOID lpParam, SonyRemoteStorage::Status s, int error_code) +// { +// app.DebugPrintf("remoteStorageCallback err : 0x%08x\n"); +// +// app.getRemoteStorage()->getRemoteFileInfo(&statParams, remoteStorageGetInfoCallback, NULL); +// } + + + + + + + + +void getSaveInfoReturnCallback(LPVOID lpParam, SonyRemoteStorage::Status s, int error_code) +{ + SonyRemoteStorage* pRemoteStorage = (SonyRemoteStorage*)lpParam; + app.DebugPrintf("remoteStorageGetInfoCallback err : 0x%08x\n", error_code); + if(error_code == 0) + { + for(int i=0;im_getInfoStatus = SonyRemoteStorage::e_infoFound; + pRemoteStorage->m_remoteFileInfo = &statParams.data[i]; + } + } + } + if(pRemoteStorage->m_getInfoStatus != SonyRemoteStorage::e_infoFound) + pRemoteStorage->m_getInfoStatus = SonyRemoteStorage::e_noInfoFound; +} + + + + + + +static void getSaveInfoInitCallback(LPVOID lpParam, SonyRemoteStorage::Status s, int error_code) +{ + SonyRemoteStorage* pRemoteStorage = (SonyRemoteStorage*)lpParam; + if(error_code != 0) + { + app.DebugPrintf("getSaveInfoInitCallback err : 0x%08x\n", error_code); + pRemoteStorage->m_getInfoStatus = SonyRemoteStorage::e_noInfoFound; + } + else + { + app.DebugPrintf("getSaveInfoInitCallback calling getRemoteFileInfo\n"); + app.getRemoteStorage()->getRemoteFileInfo(&statParams, getSaveInfoReturnCallback, pRemoteStorage); + } +} + +void SonyRemoteStorage::getSaveInfo() +{ + if(m_getInfoStatus == e_gettingInfo) + { + app.DebugPrintf("SonyRemoteStorage::getSaveInfo already running!!!\n"); + return; + } + + m_getInfoStatus = e_gettingInfo; + if(!ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())) + { + m_getInfoStatus = e_noInfoFound; + return; + } + app.DebugPrintf("SonyRemoteStorage::getSaveInfo calling init\n"); + + bool bOK = init(getSaveInfoInitCallback, this); + if(!bOK) + m_getInfoStatus = e_noInfoFound; +} + +bool SonyRemoteStorage::getSaveData( const char* localDirname, CallbackFunc cb, LPVOID lpParam ) +{ + m_startTime = System::currentTimeMillis(); + m_dataProgress = 0; + return getData(sc_remoteSaveFilename, localDirname, cb, lpParam); +} + + +static void setSaveDataInitCallback(LPVOID lpParam, SonyRemoteStorage::Status s, int error_code) +{ + SonyRemoteStorage* pRemoteStorage = (SonyRemoteStorage*)lpParam; + if(error_code != 0) + { + app.DebugPrintf("setSaveDataInitCallback err : 0x%08x\n", error_code); + pRemoteStorage->m_setDataStatus = SonyRemoteStorage::e_settingDataFailed; + if(pRemoteStorage->m_initCallbackFunc) + pRemoteStorage->m_initCallbackFunc(pRemoteStorage->m_initCallbackParam, s, error_code); + } + else + { + app.getRemoteStorage()->setData(pRemoteStorage->m_setSaveDataInfo, pRemoteStorage->m_initCallbackFunc, pRemoteStorage->m_initCallbackParam); + } + +} +bool SonyRemoteStorage::setSaveData(PSAVE_INFO info, CallbackFunc cb, void* lpParam) +{ + m_setSaveDataInfo = info; + m_setDataStatus = e_settingData; + m_initCallbackFunc = cb; + m_initCallbackParam = lpParam; + m_dataProgress = 0; + bool bOK = init(setSaveDataInitCallback, this); + if(!bOK) + m_setDataStatus = e_settingDataFailed; + + return bOK; +} + +const char* SonyRemoteStorage::getLocalFilename() +{ + return sc_localSaveFullPath; +} + +const char* SonyRemoteStorage::getSaveNameUTF8() +{ + if(m_getInfoStatus != e_infoFound) + return NULL; + DescriptionData* pDescData = (DescriptionData*)m_remoteFileInfo->fileDescription; + return pDescData->m_saveNameUTF8; +} + +ESavePlatform SonyRemoteStorage::getSavePlatform() +{ + if(m_getInfoStatus != e_infoFound) + return SAVE_FILE_PLATFORM_NONE; + DescriptionData* pDescData = (DescriptionData*)m_remoteFileInfo->fileDescription; + return (ESavePlatform)MAKE_FOURCC(pDescData->m_platform[0], pDescData->m_platform[1], pDescData->m_platform[2], pDescData->m_platform[3]); + +} + +__int64 SonyRemoteStorage::getSaveSeed() +{ + if(m_getInfoStatus != e_infoFound) + return 0; + DescriptionData* pDescData = (DescriptionData*)m_remoteFileInfo->fileDescription; + + char seedString[17]; + ZeroMemory(seedString,17); + memcpy(seedString, pDescData->m_seed,16); + + __uint64 seed = 0; + std::stringstream ss; + ss << seedString; + ss >> std::hex >> seed; + return seed; +} + +unsigned int SonyRemoteStorage::getSaveHostOptions() +{ + if(m_getInfoStatus != e_infoFound) + return 0; + DescriptionData* pDescData = (DescriptionData*)m_remoteFileInfo->fileDescription; + + char optionsString[9]; + ZeroMemory(optionsString,9); + memcpy(optionsString, pDescData->m_hostOptions,8); + + unsigned int uiHostOptions = 0; + std::stringstream ss; + ss << optionsString; + ss >> std::hex >> uiHostOptions; + return uiHostOptions; +} + +unsigned int SonyRemoteStorage::getSaveTexturePack() +{ + if(m_getInfoStatus != e_infoFound) + return 0; + DescriptionData* pDescData = (DescriptionData*)m_remoteFileInfo->fileDescription; + + char textureString[9]; + ZeroMemory(textureString,9); + memcpy(textureString, pDescData->m_texturePack,8); + + unsigned int uiTexturePack = 0; + std::stringstream ss; + ss << textureString; + ss >> std::hex >> uiTexturePack; + return uiTexturePack; +} + +const char* SonyRemoteStorage::getRemoteSaveFilename() +{ + return sc_remoteSaveFilename; +} + +int SonyRemoteStorage::getSaveFilesize() +{ + if(m_getInfoStatus == e_infoFound) + { + return m_remoteFileInfo->fileSize; + } + return 0; +} + + +bool SonyRemoteStorage::setData( PSAVE_INFO info, CallbackFunc cb, LPVOID lpParam ) +{ + m_setDataSaveInfo = info; + m_callbackFunc = cb; + m_callbackParam = lpParam; + m_status = e_setDataInProgress; + + C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveDataThumbnail(info,&LoadSaveDataThumbnailReturned,this); + return true; +} + +int SonyRemoteStorage::LoadSaveDataThumbnailReturned(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes) +{ + SonyRemoteStorage *pClass= (SonyRemoteStorage *)lpParam; + + if(pClass->m_bAborting) + { + pClass->runCallback(); + return 0; + } + + app.DebugPrintf("Received data for a thumbnail\n"); + + if(pbThumbnail && dwThumbnailBytes) + { + pClass->m_thumbnailData = pbThumbnail; + pClass->m_thumbnailDataSize = dwThumbnailBytes; + } + else + { + app.DebugPrintf("Thumbnail data is NULL, or has size 0\n"); + pClass->m_thumbnailData = NULL; + pClass->m_thumbnailDataSize = 0; + } + + if(pClass->m_SetDataThread != NULL) + delete pClass->m_SetDataThread; + + pClass->m_SetDataThread = new C4JThread(setDataThread, pClass, "setDataThread"); + pClass->m_SetDataThread->Run(); + + return 0; +} + +int SonyRemoteStorage::setDataThread(void* lpParam) +{ + SonyRemoteStorage* pClass = (SonyRemoteStorage*)lpParam; + pClass->m_startTime = System::currentTimeMillis(); + pClass->setDataInternal(); + return 0; +} + +bool SonyRemoteStorage::saveIsAvailable() +{ + if(m_getInfoStatus != e_infoFound) + return false; +#ifdef __PS3__ + return (getSavePlatform() == SAVE_FILE_PLATFORM_PSVITA); +#elif defined __PSVITA__ + return (getSavePlatform() == SAVE_FILE_PLATFORM_PS3); +#else // __ORBIS__ + return true; +#endif +} + +int SonyRemoteStorage::getDataProgress() +{ + __int64 time = System::currentTimeMillis(); + int elapsedSecs = (time - m_startTime) / 1000; + int progVal = m_dataProgress + (elapsedSecs/3); + if(progVal > 95) + { + return m_dataProgress; + } + return progVal; +} + + +bool SonyRemoteStorage::shutdown() +{ + if(m_bInitialised) + { + int ret = sceRemoteStorageTerm(); + if(ret >= 0) + { + app.DebugPrintf("Term request done \n"); + m_bInitialised = false; + free(m_memPoolBuffer); + m_memPoolBuffer = NULL; + return true; + } + else + { + app.DebugPrintf("Error in Term request: 0x%x \n", ret); + return false; + } + } + return true; +} + + +void SonyRemoteStorage::waitForStorageManagerIdle() +{ + C4JStorage::ESaveGameState storageState = StorageManager.GetSaveState(); + while(storageState != C4JStorage::ESaveGame_Idle) + { + Sleep(10); +// app.DebugPrintf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>> storageState = %d\n", storageState); + storageState = StorageManager.GetSaveState(); + } +} diff --git a/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.h b/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.h new file mode 100644 index 00000000..f435848e --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.h @@ -0,0 +1,120 @@ +#pragma once + + +#include "..\..\Common\Network\Sony\sceRemoteStorage\header\sceRemoteStorage.h" + +class SonyRemoteStorage +{ +public: + enum Status + { + e_idle, + e_accountLinked, + e_error, + e_signInRequired, + e_compressInProgress, + e_setDataInProgress, + e_setDataSucceeded, + e_getDataInProgress, + e_getDataSucceeded, + e_getStatusInProgress, + e_getStatusSucceeded + }; + typedef void (*CallbackFunc)(LPVOID lpParam, Status s, int error_code); + + enum GetInfoStatus + { + e_gettingInfo, + e_infoFound, + e_noInfoFound + }; + GetInfoStatus m_getInfoStatus; + + enum SetDataStatus + { + e_settingData, + e_settingDataFailed, + e_settingDataSucceeded + }; + SetDataStatus m_setDataStatus; + + PSAVE_INFO m_setSaveDataInfo; + SceRemoteStorageData* m_remoteFileInfo; + + class DescriptionData + { + // this stuff is read from a JSON query, so it all has to be text based, max 256 bytes + public: + char m_platform[4]; + char m_seed[16]; // 8 bytes as hex + char m_hostOptions[8]; // 4 bytes as hex + char m_texturePack[8]; // 4 bytes as hex + char m_saveNameUTF8[128]; + }; + + CallbackFunc m_callbackFunc; + void* m_callbackParam; + + + CallbackFunc m_initCallbackFunc; + void* m_initCallbackParam; + + void getSaveInfo(); + bool waitingForSaveInfo() { return (m_getInfoStatus == e_gettingInfo); } + bool saveIsAvailable(); + + int getSaveFilesize(); + bool getSaveData(const char* localDirname, CallbackFunc cb, LPVOID lpParam); + + bool setSaveData(PSAVE_INFO info, CallbackFunc cb, void* lpParam); + bool waitingForSetData() { return (m_setDataStatus == e_settingData); } + + const char* getLocalFilename(); + const char* getSaveNameUTF8(); + ESavePlatform getSavePlatform(); + __int64 getSaveSeed(); + unsigned int getSaveHostOptions(); + unsigned int getSaveTexturePack(); + + void SetServiceID(char *pchServiceID) { m_pchServiceID=pchServiceID; } + + virtual bool init(CallbackFunc cb, LPVOID lpParam) = 0; + virtual bool getRemoteFileInfo(SceRemoteStorageStatus* pInfo, CallbackFunc cb, LPVOID lpParam) = 0; + virtual bool getData(const char* remotePath, const char* localPath, CallbackFunc cb, LPVOID lpParam) = 0; + virtual void abort() = 0; + virtual bool shutdown(); + virtual bool setDataInternal() = 0; + virtual void runCallback() = 0; + + + Status getStatus() { return m_status; } + int getDataProgress(); + void waitForStorageManagerIdle(); + + + + bool setData( PSAVE_INFO info, CallbackFunc cb, LPVOID lpParam ); + static int LoadSaveDataThumbnailReturned(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes); + static int setDataThread(void* lpParam); + + SonyRemoteStorage() : m_memPoolBuffer(NULL), m_bInitialised(false),m_getInfoStatus(e_noInfoFound) {} + +protected: + const char* getRemoteSaveFilename(); + bool m_bInitialised; + void* m_memPoolBuffer; + Status m_status; + int m_dataProgress; + char *m_pchServiceID; + + PBYTE m_thumbnailData; + unsigned int m_thumbnailDataSize; + C4JThread* m_SetDataThread; + PSAVE_INFO m_setDataSaveInfo; + __int64 m_startTime; + + bool m_bAborting; + bool m_bTransferStarted; + +}; + diff --git a/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/header/sceRemoteStorage.h b/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/header/sceRemoteStorage.h new file mode 100644 index 00000000..de70398d --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/header/sceRemoteStorage.h @@ -0,0 +1,137 @@ + +#ifndef SCE_REMOTE_STORAGE_H +#define SCE_REMOTE_STORAGE_H + +#include "sceRemoteStorageDefines.h" + +/// @brief +/// Initialises the RemoteStorage library. +/// +/// Initialises the RemoteStorage library, creates a session on the server and starts the Thread to process requests. +/// This method must be executed to start the RemoteStorage library or none of its functionality will be available. +/// This method will block while it initializes its thread and will return an error if it is +/// unable to do so. The session will be created on the thread once this is created and it won't be a blocking operation. +/// +/// It is important to note that HTTP, SSL and NET libraries are not being initialised by the library and should be initialised outside of it. +/// +/// @param params The structure of type <>SceRemoteStorageInitParams that contains necessary information to start the library. +/// +/// @retval SCE_REMOTE_STORAGE_SUCCESS The operation was successfully registered on the thread. +/// @retval SCE_REMOTE_STORAGE_ERROR_INVALID_ARGUMENT At least one of the arguments passed in the input structure is not valid. +/// @retval SCE_REMOTE_STORAGE_ERROR_FAILED_TO_ALLOCATE There is no enough memory on the library to perform an allocation. +/// @retval USER_ACCOUNT_LINKED This event will be sent to the event callback when the session is created and linked to PSN on the server +/// @retval PSN_SIGN_IN_REQUIRED This event will be sent to the event callback when the session is created but not linked to PSN on the server. +/// This will only happen on the PC version and requires to call sceRemoteStorageOpenWebBrowser() function. +/// @retval ERROR_OCCURRED This event will be sent to the event callback when an error has occurred in the thread. +/// +/// @note System errors may be returned. Design your code so it does expect other errors. +int32_t sceRemoteStorageInit(const SceRemoteStorageInitParams & params); + +/// @brief +/// Terminates the RemoteStorage library. +/// +/// Terminates the RemoteStorage library and deletes the thread that process requests. +/// This method must be executed to terminate the RemoteStorage library to prevent leaks in memory and resources. +/// This method will abort any other pending requests and terminate the library. It won't wait for requests to finish. +/// This method is synchronous and does not make use of the callback to inform the user of success termination. It is executed on the calling thread. +/// +/// @retval SCE_REMOTE_STORAGE_SUCCESS The operation was successful. +/// @retval SCE_REMOTE_STORAGE_ERROR_NOT_INITIALISED The RemoteStorage library was not initialised. +/// +/// @note System errors may be returned. Design your code so it does expect other errors. +int32_t sceRemoteStorageTerm(); + +/// @brief +/// Aborts a request sent to the RemoteStorage library. +/// +/// Aborts a request being processed or pending to be processed by the RemoteStorage library. +/// This method is synchronous and does not make use of the callback to inform the user of success termination. It is executed on the calling thread. +/// +/// @param param A structure containing the request Id to be aborted. +/// This request Id is provided by other functions (get/setData, getStatus and OpenWebBrowser) so they can be referenced. +/// +/// @retval SCE_REMOTE_STORAGE_SUCCESS The operation was successful. +/// @retval SCE_REMOTE_STORAGE_ERROR_NOT_INITIALISED The RemoteStorage library was not initialised. +/// @retval SCE_REMOTE_STORAGE_ERROR_REQ_ID_NOT_FOUND The request Id sent is not found. +/// +/// @note System errors may be returned. Design your code so it does expect other errors. +int32_t sceRemoteStorageAbort(const SceRemoteStorageAbortReqParams & params); + +/// @brief +/// Opens the default web browser to sign in to PSN on PC. +/// +/// Opens the default web browser to sign in to PSN on PC. This function does not have any functionality on other platforms. +/// This method does make use of the callback to inform the user of success termination. This function has priority over other functions on the thread (as getData(), getStatus() +/// and setData()) and it will be executed as soon as the thread finishes processing a pending request. +/// +/// @param param The structure containing extra parameters to be passed in. This structure does only exist for future expansions. +/// +/// @retval SCE_REMOTE_STORAGE_SUCCESS The operation was successfully registered on the thread. +/// @retval SCE_REMOTE_STORAGE_ERROR_NOT_INITIALISED The RemoteStorage library was not initialised. +/// @retval SCE_REMOTE_STORAGE_ERROR_FAILED_TO_ALLOCATE There is no enough memory on the library to perform an allocation. +/// @retval ERROR_OCCURRED This event will be sent to the event callback when an error has occurred in the thread. +/// +/// @note System errors may be returned. Design your code so it does expect other errors. +int32_t sceRemoteStorageOpenWebBrowser(const SceRemoteStorageWebBrowserReqParams & params); + +/// @brief +/// Gives details for all files of a user. +/// +/// Gives details for all files of a user. It provides generic information (remaining bandwidth per day, HDD space per user, number of files) as well as +/// specific file information (number of bytes, file name, file description, MD5 checksum, timestamp and file visibility). File data is not provided. +/// This method does make use of the callback to inform the user of success termination. The SceRemoteStorageStatus pointer must be pointer a to a valid +/// location in memory until the callback is called as the output information will be stored in such location. +/// +/// @param params The structure containing extra parameters to be passed in. This structure does only exist for future expansions. +/// @param status The structure where the output information will be stored. The memory location being pointed must be valid until the callback gets called. +/// +/// @retval SCE_REMOTE_STORAGE_SUCCESS The operation was successfully registered on the thread. +/// @retval SCE_REMOTE_STORAGE_ERROR_NOT_INITIALISED The RemoteStorage library was not initialised. +/// @retval SCE_REMOTE_STORAGE_ERROR_FAILED_TO_ALLOCATE There is no enough memory on the library to perform an allocation. +/// @retval ERROR_OCCURRED This event will be sent to the event callback when an error has occurred in the thread. +/// +/// @note System errors may be returned. Design your code so it does expect other errors. +int32_t sceRemoteStorageGetStatus(const SceRemoteStorageStatusReqParams & params, SceRemoteStorageStatus * status); + +/// @brief +/// Gets section of data from a file specified. +/// +/// Gets section of data from a file specified. The amount of data requested can be of any size. To request this information the name of file, the number of bytes and +/// the byte to start reading along with a buffer to store such data must be provided. +/// Metadata information of the file, as description or visibility, will be provided only in the case the first amount of bytes for the file are requested (offset = 0). +/// This method does make use of the callback to inform the user of success termination. The SceRemoteStorageData pointer must be a pointer to a valid +/// location in memory until the callback is called as the output information will be stored in such location. +/// +/// @param params The structure containing the file name to read, the start byte to start reading and the amount of bytes to read. +/// @param status The structure where the output information will be stored. The memory location being pointed must be valid until the callback gets called. +/// +/// @retval SCE_REMOTE_STORAGE_SUCCESS The operation was successfully registered on the thread. +/// @retval SCE_REMOTE_STORAGE_ERROR_NOT_INITIALISED The RemoteStorage library was not initialised. +/// @retval SCE_REMOTE_STORAGE_ERROR_FAILED_TO_ALLOCATE There is no enough memory on the library to perform an allocation. +/// @retval ERROR_OCCURRED This event will be sent to the event callback when an error has occurred in the thread. +/// +/// @note System errors may be returned. Design your code so it does expect other errors. +int32_t sceRemoteStorageGetData(const SceRemoteStorageGetDataReqParams & params, SceRemoteStorageData * data); + +/// @brief +/// Sets chunk of data to a file specified. +/// +/// Sets chunk of data to a file specified. The amount of data sent must be of, at least, 5 Megabytes per chunk excepts +/// in the case of the last chunk of the file (or the only one if that is the case) as it can be smaller. +/// The information provided regarding the chunk as the chunk number, total number of chunks, data buffer and its size should be provided in every call. +/// The information provided regarding the file as its name, description and visibility should be provided in the last chunk only (this is, when +/// chunk number = number of chunks). +/// This method does make use of the callback to inform the user of success termination. The data attribute of the SceRemoteStorageSetDataReqParams pointer +/// must be a pointer to a valid location in memory until the callback is called as the buffer won't be copied internally. +/// +/// @param data The structure containing the chunk information. +/// +/// @retval SCE_REMOTE_STORAGE_SUCCESS The operation was successfully registered on the thread. +/// @retval SCE_REMOTE_STORAGE_ERROR_NOT_INITIALISED The RemoteStorage library was not initialised. +/// @retval SCE_REMOTE_STORAGE_ERROR_FAILED_TO_ALLOCATE There is no enough memory on the library to perform an allocation. +/// @retval ERROR_OCCURRED This event will be sent to the event callback when an error has occurred in the thread. +/// +/// @note System errors may be returned. Design your code so it does expect other errors. +int32_t sceRemoteStorageSetData(const SceRemoteStorageSetDataReqParams & data); + +#endif \ No newline at end of file diff --git a/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/header/sceRemoteStorageDefines.h b/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/header/sceRemoteStorageDefines.h new file mode 100644 index 00000000..b3c8f5cc --- /dev/null +++ b/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/header/sceRemoteStorageDefines.h @@ -0,0 +1,167 @@ + +#ifndef SCE_REMOTE_STORAGE_DEFINES_H +#define SCE_REMOTE_STORAGE_DEFINES_H + +#ifdef __psp2__ +#include +#include +#elif __ORBIS__ +#include +#define SceAppUtilSaveDataDataSlot int +#elif __PS3__ +#define SceAppUtilSaveDataDataSlot int +#endif + +#include + +// Macros +#define SCE_REMOTE_STORAGE_MAX_FILES 16 +#define SCE_REMOTE_STORAGE_DATA_NAME_MAX_LEN 64 +#define SCE_REMOTE_STORAGE_CLIENT_ID_MAX_LEN 64 +#define SCE_REMOTE_STORAGE_PLATFORM_NAME_MAX_LEN 16 +#define SCE_REMOTE_STORAGE_MD5_STRING_LENGTH 33 +#define SCE_REMOTE_STORAGE_RFC2822_LENGTH 32 +#define SCE_REMOTE_STORAGE_DATA_DESCRIPTION_MAX_LEN 256 +#define SCE_REMOTE_STORAGE_DATA_LOCATION_MAX_LEN 256 +#define SCE_REMOTE_STORAGE_PS3_SAVEDATA_SECUREFILEID_SIZE 16 +#define SCE_REMOTE_STORAGE_PS3_SAVEDATA_FILENAME_SIZE 13 +#define SCE_REMOTE_STORAGE_AUTH_CODE_MAX_LEN 128 + +// Return values +#define SCE_REMOTE_STORAGE_SUCCESS 0 + +// Error codes +#define SCE_REMOTE_STORAGE_ERROR_INVALID_ARGUMENT 0x80001001 +#define SCE_REMOTE_STORAGE_ERROR_FAILED_TO_CREATE_THREAD 0x80001002 +#define SCE_REMOTE_STORAGE_ERROR_NOT_INITIALISED 0x80001003 +#define SCE_REMOTE_STORAGE_ERROR_FAILED_TO_OPEN_WEB_BROWSER 0x80001004 +#define SCE_REMOTE_STORAGE_ERROR_PSN_ACCOUNT_NOT_LINKED 0x80001005 +#define SCE_REMOTE_STORAGE_ERROR_COULD_NOT_CREATE_SESSION 0x80001006 +#define SCE_REMOTE_STORAGE_ERROR_FAILED_TO_ALLOCATE 0x80001007 +#define SCE_REMOTE_STORAGE_ERROR_SESSION_DOES_NOT_EXIST 0x80001008 +#define SCE_REMOTE_STORAGE_ERROR_REQ_ID_NOT_FOUND 0x80001009 +#define SCE_REMOTE_STORAGE_ERROR_MAX_NUMBER_FILES_REACHED 0x8000100A +#define SCE_REMOTE_STORAGE_ERROR_NO_MORE_SYNCS 0x8000100B +#define SCE_REMOTE_STORAGE_ERROR_ALREADY_INITIALISED 0x8000100C +#define SCE_REMOTE_STORAGE_ERROR_INVALID_UPLOADID 0x8000100D +#define SCE_REMOTE_STORAGE_ERROR_FAILED_TO_OPEN_FILE 0x8000100E +#define SCE_REMOTE_STORAGE_ERROR_CLOUD_DATA_CORRUPTED 0x8000100F +#define SCE_REMOTE_STORAGE_ERROR_INVALID_CHAR_IN_FILE_NAME 0x80001010 +#define SCE_REMOTE_STORAGE_ERROR_INVALID_JSON_RESPONSE 0x80001011 +#define SCE_REMOTE_STORAGE_ERROR_REQUEST_ABORTED 0x80001012 +#define SCE_REMOTE_STORAGE_ERROR_SERVER_ERROR 0x80002000 // Server errors can be between 0x80002064 to 0x800022BB both included + + +typedef enum SceRemoteStorageDataVisibility +{ + PRIVATE = 0, // Only data owner can read and write data + PUBLIC_READ_ONLY, // Everyone can read this data. Owner can write to it + PUBLIC_READ_WRITE // Everyone can read and write data +} SceRemoteStorageDataVisibility; + +typedef enum SceRemoteStorageEvent +{ + USER_ACCOUNT_LINKED = 0, // User's account has been linked with PSN + PSN_SIGN_IN_REQUIRED, // User's PSN sign-in through web browser is required + WEB_BROWSER_RESULT, // Result of sceRemoteStorageOpenWebBrowser(). Please check retCode + GET_DATA_RESULT, // Result of sceRemoteStorageGetData(). Please check retCode + GET_DATA_PROGRESS, // Progress of sceRemoteStorageGetData() completion as a percentage. Please check retCode + SET_DATA_RESULT, // Result of sceRemoteStorageSetData(). Please check retCode + SET_DATA_PROGRESS, // Progress of sceRemoteStorageSetData() completion as a percentage. Please check retCode + GET_STATUS_RESULT, // Result of sceRemoteStorageGetStatus(). Please check retCode + ERROR_OCCURRED // A generic error has occurred. Please check retCode +} SceRemoteStorageEvent; + +typedef enum SceRemoteStorageEnvironment +{ + DEVELOPMENT = 0, + PRODUCTION +}SceRemoteStorageEnvironment; + +typedef void (*sceRemoteStorageCallback)(const SceRemoteStorageEvent event, int32_t retCode, void * userData); + +typedef struct SceRemoteStorageInitParamsThread +{ + int32_t threadAffinity; // Thread affinity + int32_t threadPriority; // Priority that the thread runs out +} SceRemoteStorageInitParamsThread; + +typedef struct SceRemoteStorageInitParamsPool +{ + void * memPoolBuffer; // Memory pool used by sceRemoteStorage library + size_t memPoolSize; // Size of memPoolBuffer +} SceRemoteStorageInitParamsPool; + +typedef struct SceRemoteStorageInitTimeout +{ + uint32_t resolveMs; //Timeout for DNS resolution in milliseconds. Defaults to 30 seconds + uint32_t connectMs; //Timeout for first connection between client and server. Defaults to 30 seconds + uint32_t sendMs; //Timeout to send request to server. Defaults to 120 seconds + uint32_t receiveMs; //Timeout to receive information from server. Defaults to 120 seconds + + SceRemoteStorageInitTimeout() : resolveMs(30 * 1000), connectMs(30 * 1000), sendMs(120 * 1000), receiveMs(120 * 1000) {} +}SceRemoteStorageInitTimeout; + +typedef struct SceRemoteStorageInitParams +{ + sceRemoteStorageCallback callback; // Event callback + void * userData; // Application defined data for callback + int32_t httpContextId; // PS4 only: Http context ID that was returned from sceHttpInit() + int32_t userId; // PS4 only: Current user, see SceUserServiceUserId + void * psnTicket; // PS3 only: The PSN ticket used to authenticate the user + size_t psnTicketSize; // PS3 only: The size of the PSN ticket in bytes + char clientId[SCE_REMOTE_STORAGE_CLIENT_ID_MAX_LEN]; // This represents your application on PSN, used to sign PSN user in for your title + SceRemoteStorageInitTimeout timeout; // Timeout for network transactions + SceRemoteStorageInitParamsPool pool; // Memory pool parameters + SceRemoteStorageInitParamsThread thread; // Thread creation parameters + SceRemoteStorageEnvironment environment; // Only used on non-PlayStation platforms: PSN Environment used by the library +} SceRemoteStorageInitParams; + +typedef struct SceRemoteStorageGetDataReqParams +{ + char fileName[SCE_REMOTE_STORAGE_DATA_NAME_MAX_LEN]; // Name of file on remote storage server + char pathLocation[SCE_REMOTE_STORAGE_DATA_LOCATION_MAX_LEN]; // File location on the HDD + char secureFileId[SCE_REMOTE_STORAGE_PS3_SAVEDATA_SECUREFILEID_SIZE]; // PS3 only. ID used for save data encryption + char ps3DataFilename[SCE_REMOTE_STORAGE_PS3_SAVEDATA_FILENAME_SIZE]; // PS3 only. Name of data file in save data + uint32_t ps3FileType; // PS3 only. Type of file, CELL_SAVEDATA_FILETYPE_XXX + SceAppUtilSaveDataDataSlot psVitaSaveDataSlot; // PS Vita only. Save data slot information +} SceRemoteStorageGetDataReqParams; + +typedef struct SceRemoteStorageSetDataReqParams +{ + char fileName[SCE_REMOTE_STORAGE_DATA_NAME_MAX_LEN]; // Name of file on remote storage server + char fileDescription[SCE_REMOTE_STORAGE_DATA_DESCRIPTION_MAX_LEN]; // Description of file on remote storage server + char pathLocation[SCE_REMOTE_STORAGE_DATA_LOCATION_MAX_LEN]; // File location on the HDD + char secureFileId[SCE_REMOTE_STORAGE_PS3_SAVEDATA_SECUREFILEID_SIZE]; // PS3 only. ID used for save data encryption + char ps3DataFilename[SCE_REMOTE_STORAGE_PS3_SAVEDATA_FILENAME_SIZE]; // PS3 only. Name of data file in save data + uint32_t ps3FileType; // PS3 only. Type of file, CELL_SAVEDATA_FILETYPE_XXX + SceRemoteStorageDataVisibility visibility; // Visibility of data +} SceRemoteStorageSetDataReqParams; + +typedef struct SceRemoteStorageData +{ + char fileName[SCE_REMOTE_STORAGE_DATA_NAME_MAX_LEN]; // Name of file on remote storage server + char fileDescription[SCE_REMOTE_STORAGE_DATA_DESCRIPTION_MAX_LEN]; // Description of file on remote storage server + size_t fileSize; // Size of file in bytes + char md5Checksum[SCE_REMOTE_STORAGE_MD5_STRING_LENGTH]; // File MD5 checksum + char timeStamp[SCE_REMOTE_STORAGE_RFC2822_LENGTH]; // Time that data was written on the server. Format is RFC2822 + SceRemoteStorageDataVisibility visibility; // Visibility of data +} SceRemoteStorageData; + +typedef struct SceRemoteStorageWebBrowserReqParams { } SceRemoteStorageWebBrowseReqParams; + +typedef struct SceRemoteStorageStatusReqParams { } SceRemoteStorageStatusReqParams; + +typedef struct SceRemoteStorageAbortReqParams +{ + uint32_t requestId; // The request Id to be aborted +} SceRemoteStorageAbortReqParams; + +typedef struct SceRemoteStorageStatus +{ + uint32_t numFiles; // Number of files user has on remote storage server + SceRemoteStorageData data[SCE_REMOTE_STORAGE_MAX_FILES]; // Details about data if available. Data buffer will not be retrieved + uint64_t remainingSyncs; // Remaining syncs. the user has for upload/download +} SceRemoteStorageStatus; + +#endif diff --git a/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/ps3/lib/sceRemoteStorage.a b/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/ps3/lib/sceRemoteStorage.a new file mode 100644 index 00000000..1b2eb640 Binary files /dev/null and b/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/ps3/lib/sceRemoteStorage.a differ diff --git a/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/ps4/lib/sceRemoteStorage.a b/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/ps4/lib/sceRemoteStorage.a new file mode 100644 index 00000000..2e667e20 Binary files /dev/null and b/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/ps4/lib/sceRemoteStorage.a differ diff --git a/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/psvita/lib/sceRemoteStorage.a b/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/psvita/lib/sceRemoteStorage.a new file mode 100644 index 00000000..f8568afd Binary files /dev/null and b/Minecraft.Client/Common/Network/Sony/sceRemoteStorage/psvita/lib/sceRemoteStorage.a differ diff --git a/Minecraft.Client/Common/Potion_Macros.h b/Minecraft.Client/Common/Potion_Macros.h new file mode 100644 index 00000000..29f3e03a --- /dev/null +++ b/Minecraft.Client/Common/Potion_Macros.h @@ -0,0 +1,54 @@ +#pragma once + +// 4J-JEV: +// All functional potions need bit-13 set. + +#define MASK_REGENERATION 0x2001 +#define MASK_SPEED 0x2002 +#define MASK_FIRE_RESISTANCE 0x2003 +#define MASK_POISON 0x2004 +#define MASK_INSTANTHEALTH 0x2005 +#define MASK_NIGHTVISION 0x2006 +#define MASK_INVISIBILITY 0x200E +#define MASK_WEAKNESS 0x2008 +#define MASK_STRENGTH 0x2009 +#define MASK_SLOWNESS 0x200A +#define MASK_INSTANTDAMAGE 0x200C + +#define MASK_TYPE_AWKWARD 0x0010 + +#define MASK_SPLASH 0x4000 +#define MASK_BIT13 0x2000 + +#define MASK_LEVEL2 0x0020 +#define MASK_EXTENDED 0x0040 +#define MASK_LEVEL2EXTENDED 0x0060 + +#define MACRO_POTION_IS_REGENERATION(aux) ((aux & 0x200F) == MASK_REGENERATION) +#define MACRO_POTION_IS_SPEED(aux) ((aux & 0x200F) == MASK_SPEED) +#define MACRO_POTION_IS_FIRE_RESISTANCE(aux) ((aux & 0x200F) == MASK_FIRE_RESISTANCE) +#define MACRO_POTION_IS_INSTANTHEALTH(aux) ((aux & 0x200F) == MASK_INSTANTHEALTH) +#define MACRO_POTION_IS_NIGHTVISION(aux) ((aux & 0x200F) == MASK_NIGHTVISION) +#define MACRO_POTION_IS_INVISIBILITY(aux) ((aux & 0x200F) == MASK_INVISIBILITY) +#define MACRO_POTION_IS_WEAKNESS(aux) ((aux & 0x200F) == MASK_WEAKNESS) +#define MACRO_POTION_IS_STRENGTH(aux) ((aux & 0x200F) == MASK_STRENGTH) +#define MACRO_POTION_IS_SLOWNESS(aux) ((aux & 0x200F) == MASK_SLOWNESS) +#define MACRO_POTION_IS_POISON(aux) ((aux & 0x200F) == MASK_POISON) +#define MACRO_POTION_IS_INSTANTDAMAGE(aux) ((aux & 0x200F) == MASK_INSTANTDAMAGE) + +#define MACRO_POTION_IS_SPLASH(aux) ((aux & MASK_SPLASH) == MASK_SPLASH) +#define MACRO_POTION_IS_BOTTLE(aux) ((aux & MASK_SPLASH) == 0) + +#define MACRO_POTION_IS_AKWARD(aux) ((aux & MASK_TYPE_AWKWARD) == MASK_TYPE_AWKWARD) + +#define MACRO_POTION_IS_REGULAR(aux) ((aux & (MASK_LEVEL2EXTENDED)) == 0) +#define MACRO_POTION_IS_LEVEL2(aux) ((aux & (MASK_LEVEL2 )) == MASK_LEVEL2) +#define MACRO_POTION_IS_EXTENDED(aux) ((aux & (MASK_EXTENDED)) == (MASK_EXTENDED)) +#define MACRO_POTION_IS_LEVEL2EXTENDED(aux) ((aux & (MASK_LEVEL2EXTENDED)) == (MASK_LEVEL2EXTENDED)) + + +#define MACRO_MAKEPOTION_AUXVAL(potion_type, potion_strength, potion_effect) (potion_type | potion_strength | potion_effect) + +// The potion brewing creates high aux values with redundant high bits, so use this to bring the aux val into ranges that match our macros +// 4J-JEV: 0x2000 == bit-13; Used to stop netherwart "resetting" functional potions. +#define NORMALISE_POTION_AUXVAL(aux) (aux & (MASK_BIT13 | MASK_SPLASH | 0xFF)) \ No newline at end of file diff --git a/Minecraft.Client/Common/Telemetry/TelemetryManager.cpp b/Minecraft.Client/Common/Telemetry/TelemetryManager.cpp new file mode 100644 index 00000000..4b04b19c --- /dev/null +++ b/Minecraft.Client/Common/Telemetry/TelemetryManager.cpp @@ -0,0 +1,450 @@ +#include "stdafx.h" + +#include "MultiPlayerLocalPlayer.h" + +#include "..\Minecraft.World\LevelSettings.h" +#include "..\Minecraft.World\LevelData.h" +#include "..\Minecraft.World\Level.h" + +#include "TelemetryManager.h" + +#if !defined(_DURANGO) && !defined(_XBOX) + +CTelemetryManager *TelemetryManager = new CTelemetryManager(); + +#endif + +HRESULT CTelemetryManager::Init() +{ + return S_OK; +} + +HRESULT CTelemetryManager::Tick() +{ + return S_OK; +} + +HRESULT CTelemetryManager::Flush() +{ + return S_OK; +} + +bool CTelemetryManager::RecordPlayerSessionStart(int iPad) +{ + return true; +} + +bool CTelemetryManager::RecordPlayerSessionExit(int iPad, int exitStatus) +{ + return true; +} + +bool CTelemetryManager::RecordHeartBeat(int iPad) +{ + return true; +} + +bool CTelemetryManager::RecordLevelStart(int iPad, ESen_FriendOrMatch friendsOrMatch, ESen_CompeteOrCoop competeOrCoop, int difficulty, int numberOfLocalPlayers, int numberOfOnlinePlayers) +{ + if(iPad == ProfileManager.GetPrimaryPad() ) m_bFirstFlush = true; + + ++m_levelInstanceID; + m_fLevelStartTime[iPad] = app.getAppTime(); + + return true; +} + +bool CTelemetryManager::RecordLevelExit(int iPad, ESen_LevelExitStatus levelExitStatus) +{ + return true; +} + +bool CTelemetryManager::RecordLevelSaveOrCheckpoint(int iPad, int saveOrCheckPointID, int saveSizeInBytes) +{ + return true; +} + +bool CTelemetryManager::RecordLevelResume(int iPad, ESen_FriendOrMatch friendsOrMatch, ESen_CompeteOrCoop competeOrCoop, int difficulty, int numberOfLocalPlayers, int numberOfOnlinePlayers, int saveOrCheckPointID) +{ + return true; +} + +bool CTelemetryManager::RecordPauseOrInactive(int iPad) +{ + return true; +} + +bool CTelemetryManager::RecordUnpauseOrActive(int iPad) +{ + return true; +} + +bool CTelemetryManager::RecordMenuShown(int iPad, EUIScene menuID, int optionalMenuSubID) +{ + return true; +} + +bool CTelemetryManager::RecordAchievementUnlocked(int iPad, int achievementID, int achievementGamerscore) +{ + return true; +} + +bool CTelemetryManager::RecordMediaShareUpload(int iPad, ESen_MediaDestination mediaDestination, ESen_MediaType mediaType) +{ + return true; +} + +bool CTelemetryManager::RecordUpsellPresented(int iPad, ESen_UpsellID upsellId, int marketplaceOfferID) +{ + return true; +} + +bool CTelemetryManager::RecordUpsellResponded(int iPad, ESen_UpsellID upsellId, int marketplaceOfferID, ESen_UpsellOutcome upsellOutcome) +{ + return true; +} + +bool CTelemetryManager::RecordPlayerDiedOrFailed(int iPad, int lowResMapX, int lowResMapY, int lowResMapZ, int mapID, int playerWeaponID, int enemyWeaponID, ETelemetryChallenges enemyTypeID) +{ + return true; +} + +bool CTelemetryManager::RecordEnemyKilledOrOvercome(int iPad, int lowResMapX, int lowResMapY, int lowResMapZ, int mapID, int playerWeaponID, int enemyWeaponID, ETelemetryChallenges enemyTypeID) +{ + return true; +} + +bool CTelemetryManager::RecordTexturePackLoaded(int iPad, int texturePackId, bool purchased) +{ + return true; +} + +bool CTelemetryManager::RecordSkinChanged(int iPad, int dwSkinId) +{ + return true; +} + +bool CTelemetryManager::RecordBanLevel(int iPad) +{ + return true; +} + +bool CTelemetryManager::RecordUnBanLevel(int iPad) +{ + return true; +} + + + /////////////////////////////////////////////////////////////////// + // 4J-JEV: FOLLOWING LOGIC TAKEN FROM XBOX 'SentientManager.cpp' // + /////////////////////////////////////////////////////////////////// + + +/* +Number of seconds elapsed since Sentient initialize. +Title needs to track this and report it as a property. +These times will be used to create timelines and understand durations. +This should be tracked independently of saved games (restoring a save should not reset the seconds since initialize) +*/ +INT CTelemetryManager::GetSecondsSinceInitialize() +{ + return (INT)(app.getAppTime() - m_initialiseTime); +} + +/* +An in-game setting that significantly differentiates the play style of the game. +(This should be captured as an integer and correspond to mode specific to the game.) +Teams will have to provide the game mappings that correspond to the integers. +The intent is to allow teams to capture data on the highest level categories of gameplay in their game. +For example, a game mode could be the name of the specific mini game (eg: golf vs darts) or a specific multiplayer mode (eg: hoard vs beast.) ModeID = 0 means undefined or unknown. +The intent is to answer the question "How are players playing your game?" +*/ +INT CTelemetryManager::GetMode(DWORD dwUserId) +{ + INT mode = (INT)eTelem_ModeId_Undefined; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if( pMinecraft->localplayers[dwUserId] != NULL && pMinecraft->localplayers[dwUserId]->level != NULL && pMinecraft->localplayers[dwUserId]->level->getLevelData() != NULL ) + { + GameType *gameType = pMinecraft->localplayers[dwUserId]->level->getLevelData()->getGameType(); + + if (gameType->isSurvival()) + { + mode = (INT)eTelem_ModeId_Survival; + } + else if (gameType->isCreative()) + { + mode = (INT)eTelem_ModeId_Creative; + } + else + { + mode = (INT)eTelem_ModeId_Undefined; + } + } + return mode; +} + +/* +Used when a title has more heirarchy required. +OptionalSubMode ID = 0 means undefined or unknown. +For titles that have sub-modes (Sports/Football). +Mode is always an indicator of "How is the player choosing to play my game?" so these do not have to be consecutive. +LevelIDs and SubLevelIDs can be reused as they will always be paired with a Mode/SubModeID, Mode should be unique - SubMode can be shared between modes. +*/ +INT CTelemetryManager::GetSubMode(DWORD dwUserId) +{ + INT subMode = (INT)eTelem_SubModeId_Undefined; + + if(Minecraft::GetInstance()->isTutorial()) + { + subMode = (INT)eTelem_SubModeId_Tutorial; + } + else + { + subMode = (INT)eTelem_SubModeId_Normal; + } + + return subMode; +} + +/* +This is a more granular view of mode, allowing teams to get a sense of the levels or maps players are playing and providing some insight into how players progress through a game. +Teams will have to provide the game mappings that correspond to the integers. +The intent is that a level is highest level at which modes can be dissected and provides an indication of player progression in a game. +The intent is that level start and ends do not occur more than every 2 minutes or so, otherwise the data reported will be difficult to understand. +Levels are unique only within a given modeID - so you can have a ModeID =1, LevelID =1 and a different ModeID=2, LevelID = 1 indicate two completely different levels. +LevelID = 0 means undefined or unknown. +*/ +INT CTelemetryManager::GetLevelId(DWORD dwUserId) +{ + INT levelId = (INT)eTelem_LevelId_Undefined; + + levelId = (INT)eTelem_LevelId_PlayerGeneratedLevel; + + return levelId; +} + +/* +Used when a title has more heirarchy required. OptionalSubLevel ID = 0 means undefined or unknown. +For titles that have sub-levels. +Level is always an indicator of "How far has the player progressed." so when possible these should be consecutive or at least monotonically increasing. +LevelIDs and SubLevelIDs can be reused as they will always be paired with a Mode/SubModeID +*/ +INT CTelemetryManager::GetSubLevelId(DWORD dwUserId) +{ + INT subLevelId = (INT)eTelem_SubLevelId_Undefined; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if(pMinecraft->localplayers[dwUserId] != NULL) + { + switch(pMinecraft->localplayers[dwUserId]->dimension) + { + case 0: + subLevelId = (INT)eTelem_SubLevelId_Overworld; + break; + case -1: + subLevelId = (INT)eTelem_SubLevelId_Nether; + break; + case 1: + subLevelId = (INT)eTelem_SubLevelId_End; + break; + }; + } + + return subLevelId; +} + +/* +Build version of the title, used to track changes in development as well as patches/title updates +Allows developer to separate out stats from different builds +*/ +INT CTelemetryManager::GetTitleBuildId() +{ + return (INT)VER_PRODUCTBUILD; +} + +/* +Generated by the game every time LevelStart or LevelResume is called. +This should be a unique ID (can be sequential) within a session. +Helps differentiate level attempts when a play plays the same mode/level - especially with aggregated stats +*/ +INT CTelemetryManager::GetLevelInstanceID() +{ + return (INT)m_levelInstanceID; +} + +/* +MultiplayerinstanceID is a title-generated value that is the same for all players in the same multiplayer session. +Link up players into a single multiplayer session ID. +*/ +INT CTelemetryManager::GetMultiplayerInstanceID() +{ + return m_multiplayerInstanceID; +} + +INT CTelemetryManager::GenerateMultiplayerInstanceId() +{ +#if defined(_DURANGO) || defined(_XBOX) + FILETIME SystemTimeAsFileTime; + GetSystemTimeAsFileTime( &SystemTimeAsFileTime ); + return *((INT *)&SystemTimeAsFileTime.dwLowDateTime); +#else + return 0; +#endif +} + +void CTelemetryManager::SetMultiplayerInstanceId(INT value) +{ + m_multiplayerInstanceID = value; +} + +/* +Indicates whether the game is being played in single or multiplayer mode and whether multiplayer is being played locally or over live. +How social is your game? How do people play it? +*/ +INT CTelemetryManager::GetSingleOrMultiplayer() +{ + INT singleOrMultiplayer = (INT)eSen_SingleOrMultiplayer_Undefined; + + // Unused + //eSen_SingleOrMultiplayer_Single_Player + //eSen_SingleOrMultiplayer_Multiplayer_Live + + if(app.GetLocalPlayerCount() == 1 && g_NetworkManager.GetOnlinePlayerCount() == 0) + { + singleOrMultiplayer = (INT)eSen_SingleOrMultiplayer_Single_Player; + } + else if(app.GetLocalPlayerCount() > 1 && g_NetworkManager.GetOnlinePlayerCount() == 0) + { + singleOrMultiplayer = (INT)eSen_SingleOrMultiplayer_Multiplayer_Local; + } + else if(app.GetLocalPlayerCount() == 1 && g_NetworkManager.GetOnlinePlayerCount() > 0) + { + singleOrMultiplayer = (INT)eSen_SingleOrMultiplayer_Multiplayer_Live; + } + else if(app.GetLocalPlayerCount() > 1 && g_NetworkManager.GetOnlinePlayerCount() > 0) + { + singleOrMultiplayer = (INT)eSen_SingleOrMultiplayer_Multiplayer_Both_Local_and_Live; + } + + return singleOrMultiplayer; +} + +/* +An in-game setting that differentiates the challenge imposed on the user. +Normalized to a standard 5-point scale. Are players changing the difficulty? +*/ +INT CTelemetryManager::GetDifficultyLevel(INT diff) +{ + INT difficultyLevel = (INT)eSen_DifficultyLevel_Undefined; + + switch(diff) + { + case 0: + difficultyLevel = (INT)eSen_DifficultyLevel_Easiest; + break; + case 1: + difficultyLevel = (INT)eSen_DifficultyLevel_Easier; + break; + case 2: + difficultyLevel = (INT)eSen_DifficultyLevel_Normal; + break; + case 3: + difficultyLevel = (INT)eSen_DifficultyLevel_Harder; + break; + } + + // Unused + //eSen_DifficultyLevel_Hardest = 5, + + return difficultyLevel; +} + +/* +Differentiates trial/demo from full purchased titles +Is this a full title or demo? +*/ +INT CTelemetryManager::GetLicense() +{ + INT license = eSen_License_Undefined; + + if(ProfileManager.IsFullVersion()) + { + license = (INT)eSen_License_Full_Purchased_Title; + } + else + { + license = (INT)eSen_License_Trial_or_Demo; + } + return license; +} + +/* +This is intended to capture whether players played using default control scheme or customized the control scheme. +Are players customizing your controls? +*/ +INT CTelemetryManager::GetDefaultGameControls() +{ + INT defaultGameControls = eSen_DefaultGameControls_Undefined; + + // Unused + //eSen_DefaultGameControls_Custom_controls + + defaultGameControls = eSen_DefaultGameControls_Default_controls; + + return defaultGameControls; +} + +/* +Are players changing default audio settings? +This is intended to capture whether players are playing with or without volume and whether they make changes from the default audio settings. +*/ +INT CTelemetryManager::GetAudioSettings(DWORD dwUserId) +{ + INT audioSettings = (INT)eSen_AudioSettings_Undefined; + + if(dwUserId == ProfileManager.GetPrimaryPad()) + { + BYTE volume = app.GetGameSettings(dwUserId,eGameSetting_SoundFXVolume); + + if(volume == 0) + { + audioSettings = (INT)eSen_AudioSettings_Off; + } + else if(volume == DEFAULT_VOLUME_LEVEL) + { + audioSettings = (INT)eSen_AudioSettings_On_Default; + } + else + { + audioSettings = (INT)eSen_AudioSettings_On_CustomSetting; + } + } + return audioSettings; +} + +/* +Refers to the highest level performance metric for your game. +For example, a performance metric could points earned, race time, total kills, etc. +This is entirely up to you and will help us understand how well the player performed, or how far the player progressed  in the level before exiting. +How far did users progress before failing/exiting the level? +*/ +INT CTelemetryManager::GetLevelExitProgressStat1() +{ + // 4J Stu - Unused + return 0; +} + +/* +Refers to the highest level performance metric for your game. +For example, a performance metric could points earned, race time, total kills, etc. +This is entirely up to you and will help us understand how well the player performed, or how far the player progressed  in the level before exiting. +How far did users progress before failing/exiting the level? +*/ +INT CTelemetryManager::GetLevelExitProgressStat2() +{ + // 4J Stu - Unused + return 0; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Telemetry/TelemetryManager.h b/Minecraft.Client/Common/Telemetry/TelemetryManager.h new file mode 100644 index 00000000..40b6c04c --- /dev/null +++ b/Minecraft.Client/Common/Telemetry/TelemetryManager.h @@ -0,0 +1,65 @@ +#pragma once + +#include "..\..\Common\UI\UIEnums.h" + +class CTelemetryManager +{ +public: + virtual HRESULT Init(); + virtual HRESULT Tick(); + virtual HRESULT Flush(); + + virtual bool RecordPlayerSessionStart(int iPad); + virtual bool RecordPlayerSessionExit(int iPad, int exitStatus); + virtual bool RecordHeartBeat(int iPad); + virtual bool RecordLevelStart(int iPad, ESen_FriendOrMatch friendsOrMatch, ESen_CompeteOrCoop competeOrCoop, int difficulty, int numberOfLocalPlayers, int numberOfOnlinePlayers); + virtual bool RecordLevelExit(int iPad, ESen_LevelExitStatus levelExitStatus); + virtual bool RecordLevelSaveOrCheckpoint(int iPad, int saveOrCheckPointID, int saveSizeInBytes); + virtual bool RecordLevelResume(int iPad, ESen_FriendOrMatch friendsOrMatch, ESen_CompeteOrCoop competeOrCoop, int difficulty, int numberOfLocalPlayers, int numberOfOnlinePlayers, int saveOrCheckPointID); + virtual bool RecordPauseOrInactive(int iPad); + virtual bool RecordUnpauseOrActive(int iPad); + virtual bool RecordMenuShown(int iPad, EUIScene menuID, int optionalMenuSubID); + virtual bool RecordAchievementUnlocked(int iPad, int achievementID, int achievementGamerscore); + virtual bool RecordMediaShareUpload(int iPad, ESen_MediaDestination mediaDestination, ESen_MediaType mediaType); + virtual bool RecordUpsellPresented(int iPad, ESen_UpsellID upsellId, int marketplaceOfferID); + virtual bool RecordUpsellResponded(int iPad, ESen_UpsellID upsellId, int marketplaceOfferID, ESen_UpsellOutcome upsellOutcome); + virtual bool RecordPlayerDiedOrFailed(int iPad, int lowResMapX, int lowResMapY, int lowResMapZ, int mapID, int playerWeaponID, int enemyWeaponID, ETelemetryChallenges enemyTypeID); + virtual bool RecordEnemyKilledOrOvercome(int iPad, int lowResMapX, int lowResMapY, int lowResMapZ, int mapID, int playerWeaponID, int enemyWeaponID, ETelemetryChallenges enemyTypeID); + virtual bool RecordTexturePackLoaded(int iPad, int texturePackId, bool purchased); + + virtual bool RecordSkinChanged(int iPad, int dwSkinId); + virtual bool RecordBanLevel(int iPad); + virtual bool RecordUnBanLevel(int iPad); + + virtual int GetMultiplayerInstanceID(); + virtual int GenerateMultiplayerInstanceId(); + virtual void SetMultiplayerInstanceId(int value); + +protected: + float m_initialiseTime; + float m_lastHeartbeat; + bool m_bFirstFlush; + + float m_fLevelStartTime[XUSER_MAX_COUNT]; + + INT m_multiplayerInstanceID; + DWORD m_levelInstanceID; + + // Helper functions to get the various common settings + INT GetSecondsSinceInitialize(); + INT GetMode(DWORD dwUserId); + INT GetSubMode(DWORD dwUserId); + INT GetLevelId(DWORD dwUserId); + INT GetSubLevelId(DWORD dwUserId); + INT GetTitleBuildId(); + INT GetLevelInstanceID(); + INT GetSingleOrMultiplayer(); + INT GetDifficultyLevel(INT diff); + INT GetLicense(); + INT GetDefaultGameControls(); + INT GetAudioSettings(DWORD dwUserId); + INT GetLevelExitProgressStat1(); + INT GetLevelExitProgressStat2(); +}; + +extern CTelemetryManager *TelemetryManager; \ No newline at end of file diff --git a/Minecraft.Client/Common/Trial/TrialLevel.mcs b/Minecraft.Client/Common/Trial/TrialLevel.mcs new file mode 100644 index 00000000..99b17387 Binary files /dev/null and b/Minecraft.Client/Common/Trial/TrialLevel.mcs differ diff --git a/Minecraft.Client/Common/Trial/TrialMode.cpp b/Minecraft.Client/Common/Trial/TrialMode.cpp new file mode 100644 index 00000000..e8149138 --- /dev/null +++ b/Minecraft.Client/Common/Trial/TrialMode.cpp @@ -0,0 +1,9 @@ +#include "stdafx.h" +#include "TrialMode.h" +#include "..\Tutorial\FullTutorial.h" + +TrialMode::TrialMode(int iPad, Minecraft *minecraft, ClientConnection *connection) + : FullTutorialMode(iPad, minecraft, connection) +{ + tutorial = new FullTutorial(iPad, true); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Trial/TrialMode.h b/Minecraft.Client/Common/Trial/TrialMode.h new file mode 100644 index 00000000..a1034acf --- /dev/null +++ b/Minecraft.Client/Common/Trial/TrialMode.h @@ -0,0 +1,10 @@ +#pragma once +#include "..\Tutorial\FullTutorialMode.h" + +class TrialMode : public FullTutorialMode +{ +public: + TrialMode(int iPad, Minecraft *minecraft, ClientConnection *connection); + + virtual bool isImplemented() { return true; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/AreaConstraint.cpp b/Minecraft.Client/Common/Tutorial/AreaConstraint.cpp new file mode 100644 index 00000000..f133d604 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/AreaConstraint.cpp @@ -0,0 +1,52 @@ +#include "stdafx.h" + +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "AreaConstraint.h" +#include "..\..\..\Minecraft.World\AABB.h" + +AreaConstraint::AreaConstraint( int descriptionId, double x0, double y0, double z0, double x1, double y1, double z1, bool contains /*= true*/, bool restrictsMovement /*=true*/ ) + : TutorialConstraint( descriptionId ) +{ + messageArea = AABB::newPermanent(x0+2, y0+2, z0+2, x1-2, y1-2, z1-2); + movementArea = AABB::newPermanent(x0, y0, z0, x1, y1, z1); + + this->contains = contains; + m_restrictsMovement = restrictsMovement; +} + +AreaConstraint::~AreaConstraint() +{ + delete messageArea; + delete movementArea; +} + +bool AreaConstraint::isConstraintSatisfied(int iPad) +{ + Minecraft *minecraft = Minecraft::GetInstance(); + return messageArea->contains( minecraft->localplayers[iPad]->getPos(1) ) == contains; +} + +bool AreaConstraint::isConstraintRestrictive(int iPad) +{ + return m_restrictsMovement; +} + + +bool AreaConstraint::canMoveToPosition(double xo, double yo, double zo, double xt, double yt, double zt) +{ + if(!m_restrictsMovement) return true; + + Vec3 *targetPos = Vec3::newTemp(xt, yt, zt); + Minecraft *minecraft = Minecraft::GetInstance(); + + if(movementArea->contains( targetPos ) == contains) + { + return true; + } + Vec3 *origPos = Vec3::newTemp(xo, yo, zo); + + double currDist = origPos->distanceTo(movementArea); + double targetDist = targetPos->distanceTo(movementArea); + return targetDist < currDist; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/AreaConstraint.h b/Minecraft.Client/Common/Tutorial/AreaConstraint.h new file mode 100644 index 00000000..f98945e1 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/AreaConstraint.h @@ -0,0 +1,24 @@ +#pragma once + +#include "TutorialConstraint.h" + +class AABB; + +class AreaConstraint : public TutorialConstraint +{ +private: + AABB *movementArea; + AABB *messageArea; + bool contains; // If true we must stay in this area, if false must stay out of this area + bool m_restrictsMovement; + +public: + virtual ConstraintType getType() { return e_ConstraintArea; } + + AreaConstraint( int descriptionId, double x0, double y0, double z0, double x1, double y1, double z1, bool contains = true, bool restrictsMovement =true ); + ~AreaConstraint(); + + virtual bool isConstraintSatisfied(int iPad); + virtual bool isConstraintRestrictive(int iPad); + virtual bool canMoveToPosition(double xo, double yo, double zo, double xt, double yt, double zt); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/AreaHint.cpp b/Minecraft.Client/Common/Tutorial/AreaHint.cpp new file mode 100644 index 00000000..8b711c88 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/AreaHint.cpp @@ -0,0 +1,49 @@ +#include "stdafx.h" + +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "AreaHint.h" +#include "..\..\..\Minecraft.World\AABB.h" +#include "Tutorial.h" + +AreaHint::AreaHint(eTutorial_Hint id, Tutorial *tutorial, eTutorial_State displayState, eTutorial_State completeState, + int descriptionId, double x0, double y0, double z0, double x1, double y1, double z1, bool allowFade /*= false*/, bool contains /*= true*/ ) + : TutorialHint( id, tutorial, descriptionId, e_Hint_Area, allowFade ) +{ + area = AABB::newPermanent(x0, y0, z0, x1, y1, z1); + + this->contains = contains; + + m_displayState = displayState; + m_completeState = completeState; +} + +AreaHint::~AreaHint() +{ + delete area; +} + +int AreaHint::tick() +{ + Minecraft *minecraft = Minecraft::GetInstance(); + if( (m_displayState == e_Tutorial_State_Any || m_tutorial->getCurrentState() == m_displayState) && + m_hintNeeded && + area->contains( minecraft->player->getPos(1) ) == contains ) + { + if( m_completeState == e_Tutorial_State_None ) + { + m_hintNeeded = false; + } + else if ( m_tutorial->isStateCompleted( m_completeState ) ) + { + m_hintNeeded = false; + return -1; + } + + return m_descriptionId; + } + else + { + return -1; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/AreaHint.h b/Minecraft.Client/Common/Tutorial/AreaHint.h new file mode 100644 index 00000000..12ef8977 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/AreaHint.h @@ -0,0 +1,25 @@ +#pragma once + +#include "TutorialHint.h" + +class AABB; + +class AreaHint : public TutorialHint +{ +private: + AABB *area; + bool contains; // If true we must stay in this area, if false must stay out of this area + + // Only display the hint if the game is in this state + eTutorial_State m_displayState; + + // Only display the hint if this state is not completed + eTutorial_State m_completeState; + +public: + AreaHint(eTutorial_Hint id, Tutorial *tutorial, eTutorial_State displayState, eTutorial_State completeState, + int descriptionId, double x0, double y0, double z0, double x1, double y1, double z1, bool allowFade = true, bool contains = true ); + ~AreaHint(); + + virtual int tick(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/AreaTask.cpp b/Minecraft.Client/Common/Tutorial/AreaTask.cpp new file mode 100644 index 00000000..de29ab1b --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/AreaTask.cpp @@ -0,0 +1,69 @@ +#include "stdafx.h" +#include "Tutorial.h" +#include "AreaTask.h" + +AreaTask::AreaTask(eTutorial_State state, Tutorial *tutorial, vector *inConstraints, int descriptionId, EAreaTaskCompletionStates completionState) + : TutorialTask( tutorial, descriptionId, false, inConstraints, false, false, false ) +{ + m_tutorialState = state; + if(m_tutorialState == e_Tutorial_State_Gameplay) + { + enableConstraints(true); + } + m_completionState = completionState; +} + +bool AreaTask::isCompleted() +{ + if(bIsCompleted) return true; + + bool complete = false; + switch(m_completionState) + { + case eAreaTaskCompletion_CompleteOnConstraintsSatisfied: + { + bool allSatisfied = true; + for(AUTO_VAR(it, constraints.begin()); it != constraints.end(); ++it) + { + TutorialConstraint *constraint = *it; + if(!constraint->isConstraintSatisfied(tutorial->getPad())) + { + allSatisfied = false; + break; + } + } + complete = allSatisfied; + } + break; + case eAreaTaskCompletion_CompleteOnActivation: + complete = bHasBeenActivated; + break; + }; + bIsCompleted = complete; + return complete; +} + +void AreaTask::setAsCurrentTask(bool active) +{ + TutorialTask::setAsCurrentTask(active); + + if(m_completionState == eAreaTaskCompletion_CompleteOnConstraintsSatisfied) + { + enableConstraints(active); + } +} + +void AreaTask::onStateChange(eTutorial_State newState) +{ + if(m_completionState == eAreaTaskCompletion_CompleteOnActivation) + { + if(m_tutorialState == newState) + { + enableConstraints(true); + } + else if(m_tutorialState != e_Tutorial_State_Gameplay) + { + //enableConstraints(false); + } + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/AreaTask.h b/Minecraft.Client/Common/Tutorial/AreaTask.h new file mode 100644 index 00000000..0d20bd7a --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/AreaTask.h @@ -0,0 +1,24 @@ +#pragma once +using namespace std; + +#include "TutorialTask.h" + +// A task that creates an maintains an area constraint until it is activated +class AreaTask : public TutorialTask +{ +public: + enum EAreaTaskCompletionStates + { + eAreaTaskCompletion_CompleteOnActivation, + eAreaTaskCompletion_CompleteOnConstraintsSatisfied, + }; +private: + EAreaTaskCompletionStates m_completionState; + eTutorial_State m_tutorialState; +public: + AreaTask(eTutorial_State state, Tutorial *tutorial, vector *inConstraints, int descriptionId = -1, EAreaTaskCompletionStates completionState = eAreaTaskCompletion_CompleteOnActivation); + virtual bool isCompleted(); + virtual void setAsCurrentTask(bool active = true); + virtual void onStateChange(eTutorial_State newState); + +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/ChangeStateConstraint.cpp b/Minecraft.Client/Common/Tutorial/ChangeStateConstraint.cpp new file mode 100644 index 00000000..f01db84e --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/ChangeStateConstraint.cpp @@ -0,0 +1,136 @@ +#include "stdafx.h" + +#include "Tutorial.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "ChangeStateConstraint.h" +#include "..\..\..\Minecraft.World\AABB.h" +#include "..\..\ClientConnection.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" + +ChangeStateConstraint::ChangeStateConstraint( Tutorial *tutorial, eTutorial_State targetState, eTutorial_State sourceStates[], DWORD sourceStatesCount, + double x0, double y0, double z0, double x1, double y1, double z1, bool contains /*= true*/, bool changeGameMode /*= false*/, GameType *targetGameMode /*= 0*/ ) + : TutorialConstraint( -1 ) +{ + movementArea = AABB::newPermanent(x0, y0, z0, x1, y1, z1); + + this->contains = contains; + + m_changeGameMode = changeGameMode; + m_targetGameMode = targetGameMode; + m_changedFromGameMode = 0; + + m_tutorial = tutorial; + m_targetState = targetState; + m_sourceStatesCount = sourceStatesCount; + + m_bHasChanged = false; + m_changedFromState = e_Tutorial_State_None; + + m_bComplete = false; + + m_sourceStates = new eTutorial_State [m_sourceStatesCount]; + for(unsigned int i=0;i0) delete [] m_sourceStates; +} + +void ChangeStateConstraint::tick(int iPad) +{ + if(m_bComplete) return; + + if(m_tutorial->isStateCompleted(m_targetState)) + { + Minecraft *minecraft = Minecraft::GetInstance(); + if(m_changeGameMode) + { + unsigned int playerPrivs = minecraft->localplayers[iPad]->getAllPlayerGamePrivileges(); + Player::setPlayerGamePrivilege(playerPrivs,Player::ePlayerGamePrivilege_CreativeMode,m_changedFromGameMode == GameType::CREATIVE); + + unsigned int originalPrivileges = minecraft->localplayers[iPad]->getAllPlayerGamePrivileges(); + if(originalPrivileges != playerPrivs) + { + // Send update settings packet to server + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr player = minecraft->localplayers[iPad]; + if(player != NULL && player->connection && player->connection->getNetworkPlayer() != NULL) + { + player->connection->send( shared_ptr( new PlayerInfoPacket( player->connection->getNetworkPlayer()->GetSmallId(), -1, playerPrivs) ) ); + } + } + } + m_bComplete = true; + return; + } + + bool inASourceState = false; + Minecraft *minecraft = Minecraft::GetInstance(); + for(DWORD i = 0; i < m_sourceStatesCount; ++i) + { + if(m_sourceStates[i] == m_tutorial->getCurrentState()) + { + inASourceState = true; + break; + } + } + if( !m_bHasChanged && inASourceState && movementArea->contains( minecraft->localplayers[iPad]->getPos(1) ) == contains ) + { + m_bHasChanged = true; + m_changedFromState = m_tutorial->getCurrentState(); + m_tutorial->changeTutorialState(m_targetState); + + if(m_changeGameMode) + { + if(minecraft->localgameModes[iPad] != NULL) + { + m_changedFromGameMode = minecraft->localplayers[iPad]->abilities.instabuild ? GameType::CREATIVE : GameType::SURVIVAL; + + unsigned int playerPrivs = minecraft->localplayers[iPad]->getAllPlayerGamePrivileges(); + Player::setPlayerGamePrivilege(playerPrivs,Player::ePlayerGamePrivilege_CreativeMode,m_targetGameMode == GameType::CREATIVE); + + unsigned int originalPrivileges = minecraft->localplayers[iPad]->getAllPlayerGamePrivileges(); + if(originalPrivileges != playerPrivs) + { + // Send update settings packet to server + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr player = minecraft->localplayers[iPad]; + if(player != NULL && player->connection && player->connection->getNetworkPlayer() != NULL) + { + player->connection->send( shared_ptr( new PlayerInfoPacket( player->connection->getNetworkPlayer()->GetSmallId(), -1, playerPrivs) ) ); + } + } + } + } + } + else if( m_bHasChanged && movementArea->contains( minecraft->localplayers[iPad]->getPos(1) ) != contains ) + { + m_bHasChanged = false; + m_tutorial->changeTutorialState(m_changedFromState); + + if(m_changeGameMode) + { + unsigned int playerPrivs = minecraft->localplayers[iPad]->getAllPlayerGamePrivileges(); + Player::setPlayerGamePrivilege(playerPrivs,Player::ePlayerGamePrivilege_CreativeMode,m_changedFromGameMode == GameType::CREATIVE); + + unsigned int originalPrivileges = minecraft->localplayers[iPad]->getAllPlayerGamePrivileges(); + if(originalPrivileges != playerPrivs) + { + // Send update settings packet to server + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr player = minecraft->localplayers[iPad]; + if(player != NULL && player->connection && player->connection->getNetworkPlayer() != NULL) + { + player->connection->send( shared_ptr( new PlayerInfoPacket( player->connection->getNetworkPlayer()->GetSmallId(), -1, playerPrivs) ) ); + } + } + } + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/ChangeStateConstraint.h b/Minecraft.Client/Common/Tutorial/ChangeStateConstraint.h new file mode 100644 index 00000000..2156870d --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/ChangeStateConstraint.h @@ -0,0 +1,37 @@ +#pragma once + +#include "TutorialEnum.h" +#include "TutorialConstraint.h" + +class AABB; +class Tutorial; +class GameType; + +class ChangeStateConstraint : public TutorialConstraint +{ +private: + AABB *movementArea; + bool contains; // If true we must stay in this area, if false must stay out of this area + bool m_changeGameMode; + GameType *m_targetGameMode; + GameType *m_changedFromGameMode; + + eTutorial_State m_targetState; + eTutorial_State *m_sourceStates; + DWORD m_sourceStatesCount; + + bool m_bHasChanged; + eTutorial_State m_changedFromState; + + bool m_bComplete; + + Tutorial *m_tutorial; + +public: + virtual ConstraintType getType() { return e_ConstraintChangeState; } + + ChangeStateConstraint( Tutorial *tutorial, eTutorial_State targetState, eTutorial_State sourceStates[], DWORD sourceStatesCount, double x0, double y0, double z0, double x1, double y1, double z1, bool contains = true, bool changeGameMode = false, GameType *targetGameMode = NULL ); + ~ChangeStateConstraint(); + + virtual void tick(int iPad); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/ChoiceTask.cpp b/Minecraft.Client/Common/Tutorial/ChoiceTask.cpp new file mode 100644 index 00000000..c03166b5 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/ChoiceTask.cpp @@ -0,0 +1,135 @@ +#include "stdafx.h" +#include +#include +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "Tutorial.h" +#include "TutorialConstraints.h" +#include "ChoiceTask.h" +#include "..\..\..\Minecraft.World\Material.h" + +ChoiceTask::ChoiceTask(Tutorial *tutorial, int descriptionId, int promptId /*= -1*/, bool requiresUserInput /*= false*/, + int iConfirmMapping /*= 0*/, int iCancelMapping /*= 0*/, + eTutorial_CompletionAction cancelAction /*= e_Tutorial_Completion_None*/, ETelemetryChallenges telemetryEvent /*= eTelemetryTutorial_NoEvent*/) + : TutorialTask( tutorial, descriptionId, false, NULL, true, false, false ) +{ + if(requiresUserInput == true) + { + constraints.push_back( new InputConstraint( iConfirmMapping ) ); + constraints.push_back( new InputConstraint( iCancelMapping ) ); + } + m_iConfirmMapping = iConfirmMapping; + m_iCancelMapping = iCancelMapping; + m_bConfirmMappingComplete = false; + m_bCancelMappingComplete = false; + + m_cancelAction = cancelAction; + + m_promptId = promptId; + tutorial->addMessage( m_promptId ); + + m_eTelemetryEvent = telemetryEvent; +} + +bool ChoiceTask::isCompleted() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if( m_bConfirmMappingComplete || m_bCancelMappingComplete ) + { + sendTelemetry(); + enableConstraints(false, true); + return true; + } + + if(ui.GetMenuDisplayed(tutorial->getPad())) + { + // If a menu is displayed, then we use the handleUIInput to complete the task + } + else + { + // If the player is under water then allow all keypresses so they can jump out + if( pMinecraft->localplayers[tutorial->getPad()]->isUnderLiquid(Material::water) ) return false; + + if(!m_bConfirmMappingComplete && InputManager.GetValue(pMinecraft->player->GetXboxPad(), m_iConfirmMapping) > 0 ) + { + m_bConfirmMappingComplete = true; + } + if(!m_bCancelMappingComplete && InputManager.GetValue(pMinecraft->player->GetXboxPad(), m_iCancelMapping) > 0 ) + { + m_bCancelMappingComplete = true; + } + } + + if(m_bConfirmMappingComplete || m_bCancelMappingComplete) + { + sendTelemetry(); + enableConstraints(false, true); + } + return m_bConfirmMappingComplete || m_bCancelMappingComplete; +} + +eTutorial_CompletionAction ChoiceTask::getCompletionAction() +{ + if(m_bCancelMappingComplete) + { + return m_cancelAction; + } + else + { + return e_Tutorial_Completion_None; + } +} + +int ChoiceTask::getPromptId() +{ + if( m_bShownForMinimumTime ) + return m_promptId; + else + return -1; +} + +void ChoiceTask::setAsCurrentTask(bool active /*= true*/) +{ + enableConstraints( active ); + TutorialTask::setAsCurrentTask(active); +} + +void ChoiceTask::handleUIInput(int iAction) +{ + if(bHasBeenActivated && m_bShownForMinimumTime) + { + if( iAction == m_iConfirmMapping ) + { + m_bConfirmMappingComplete = true; + } + else if(iAction == m_iCancelMapping ) + { + m_bCancelMappingComplete = true; + } + } +} + +void ChoiceTask::sendTelemetry() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if( m_eTelemetryEvent != eTelemetryChallenges_Unknown ) + { + bool firstPlay = true; + // We only store first play for some of the events + switch(m_eTelemetryEvent) + { + case eTelemetryTutorial_TrialStart: + firstPlay = !tutorial->getCompleted( eTutorial_Telemetry_TrialStart ); + tutorial->setCompleted( eTutorial_Telemetry_TrialStart ); + break; + case eTelemetryTutorial_Halfway: + firstPlay = !tutorial->getCompleted( eTutorial_Telemetry_Halfway ); + tutorial->setCompleted( eTutorial_Telemetry_Halfway ); + break; + }; + + TelemetryManager->RecordEnemyKilledOrOvercome(pMinecraft->player->GetXboxPad(), 0, 0, 0, 0, 0, 0, m_eTelemetryEvent); + } +} diff --git a/Minecraft.Client/Common/Tutorial/ChoiceTask.h b/Minecraft.Client/Common/Tutorial/ChoiceTask.h new file mode 100644 index 00000000..79c2ba42 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/ChoiceTask.h @@ -0,0 +1,27 @@ +#pragma once +using namespace std; + +#include "TutorialTask.h" + +// Information messages with a choice +class ChoiceTask : public TutorialTask +{ +private: + int m_iConfirmMapping, m_iCancelMapping; + bool m_bConfirmMappingComplete, m_bCancelMappingComplete; + eTutorial_CompletionAction m_cancelAction; + + ETelemetryChallenges m_eTelemetryEvent; + + bool CompletionMaskIsValid(); +public: + ChoiceTask(Tutorial *tutorial, int descriptionId, int promptId = -1, bool requiresUserInput = false, int iConfirmMapping = 0, int iCancelMapping = 0, eTutorial_CompletionAction cancelAction = e_Tutorial_Completion_None, ETelemetryChallenges telemetryEvent = eTelemetryChallenges_Unknown); + virtual bool isCompleted(); + virtual eTutorial_CompletionAction getCompletionAction(); + virtual int getPromptId(); + virtual void setAsCurrentTask(bool active = true); + virtual void handleUIInput(int iAction); + +private: + void sendTelemetry(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/CompleteUsingItemTask.cpp b/Minecraft.Client/Common/Tutorial/CompleteUsingItemTask.cpp new file mode 100644 index 00000000..43b2f7f3 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/CompleteUsingItemTask.cpp @@ -0,0 +1,37 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\ItemInstance.h" +#include "CompleteUsingItemTask.h" + +CompleteUsingItemTask::CompleteUsingItemTask(Tutorial *tutorial, int descriptionId, int itemIds[], unsigned int itemIdsLength, bool enablePreCompletion) + : TutorialTask( tutorial, descriptionId, enablePreCompletion, NULL) +{ + m_iValidItemsA= new int [itemIdsLength]; + for(int i=0;i item) +{ + if(!hasBeenActivated() && !isPreCompletionEnabled()) return; + for(int i=0;iid == m_iValidItemsA[i] ) + { + bIsCompleted = true; + break; + } + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/CompleteUsingItemTask.h b/Minecraft.Client/Common/Tutorial/CompleteUsingItemTask.h new file mode 100644 index 00000000..a905bead --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/CompleteUsingItemTask.h @@ -0,0 +1,20 @@ +#pragma once +using namespace std; + +#include "TutorialTask.h" + +class Level; + +class CompleteUsingItemTask : public TutorialTask +{ +private: + int *m_iValidItemsA; + int m_iValidItemsCount; + bool completed; + +public: + CompleteUsingItemTask(Tutorial *tutorial, int descriptionId, int itemIds[], unsigned int itemIdsLength, bool enablePreCompletion = false); + virtual ~CompleteUsingItemTask(); + virtual bool isCompleted(); + virtual void completeUsingItem(shared_ptr item); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/ControllerTask.cpp b/Minecraft.Client/Common/Tutorial/ControllerTask.cpp new file mode 100644 index 00000000..c5fe071b --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/ControllerTask.cpp @@ -0,0 +1,123 @@ +#include "stdafx.h" +#include +#include +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "Tutorial.h" +#include "TutorialConstraints.h" +#include "ControllerTask.h" + +ControllerTask::ControllerTask(Tutorial *tutorial, int descriptionId, bool enablePreCompletion, bool showMinimumTime, + int mappings[], unsigned int mappingsLength, int iCompletionMaskA[], int iCompletionMaskACount, int iSouthpawMappings[], unsigned int uiSouthpawMappingsCount) + : TutorialTask( tutorial, descriptionId, enablePreCompletion, NULL, showMinimumTime ) +{ + for(unsigned int i = 0; i < mappingsLength; ++i) + { + constraints.push_back( new InputConstraint( mappings[i] ) ); + completedMappings[mappings[i]] = false; + } + if(uiSouthpawMappingsCount > 0 ) m_bHasSouthpaw = true; + for(unsigned int i = 0; i < uiSouthpawMappingsCount; ++i) + { + southpawCompletedMappings[iSouthpawMappings[i]] = false; + } + + m_iCompletionMaskA= new int [iCompletionMaskACount]; + for(int i=0;iplayer->GetXboxPad(),eGameSetting_ControlSouthPaw)) + { + for(AUTO_VAR(it, southpawCompletedMappings.begin()); it != southpawCompletedMappings.end(); ++it) + { + bool current = (*it).second; + if(!current) + { + // TODO Use a different pad + if( InputManager.GetValue(pMinecraft->player->GetXboxPad(), (*it).first) > 0 ) + { + (*it).second = true; + m_uiCompletionMask|=1<player->GetXboxPad(), (*it).first) > 0 ) + { + (*it).second = true; + m_uiCompletionMask|=1< completedMappings; + unordered_map southpawCompletedMappings; + bool m_bHasSouthpaw; + unsigned int m_uiCompletionMask; + int *m_iCompletionMaskA; + int m_iCompletionMaskACount; + bool CompletionMaskIsValid(); +public: + ControllerTask(Tutorial *tutorial, int descriptionId, bool enablePreCompletion, bool showMinimumTime, + int mappings[], unsigned int mappingsLength, int iCompletionMaskA[]=NULL, int iCompletionMaskACount=0, int iSouthpawMappings[]=NULL, unsigned int uiSouthpawMappingsCount=0); + ~ControllerTask(); + virtual bool isCompleted(); + virtual void setAsCurrentTask(bool active = true); + +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/CraftTask.cpp b/Minecraft.Client/Common/Tutorial/CraftTask.cpp new file mode 100644 index 00000000..6749d030 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/CraftTask.cpp @@ -0,0 +1,66 @@ +#include "stdafx.h" +#include "CraftTask.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" + +CraftTask::CraftTask( int itemId, int auxValue, int quantity, + Tutorial *tutorial, int descriptionId, bool enablePreCompletion /*= true*/, vector *inConstraints /*= NULL*/, + bool bShowMinimumTime /*=false*/, bool bAllowFade /*=true*/, bool m_bTaskReminders /*=true*/ ) + : TutorialTask(tutorial, descriptionId, enablePreCompletion, inConstraints, bShowMinimumTime, bAllowFade, m_bTaskReminders ), + m_quantity( quantity ), + m_count( 0 ) +{ + m_numItems = 1; + m_items = new int[1]; + m_items[0] = itemId; + m_auxValues = new int[1]; + m_auxValues[0] = auxValue; +} + +CraftTask::CraftTask( int *items, int *auxValues, int numItems, int quantity, + Tutorial *tutorial, int descriptionId, bool enablePreCompletion /*= true*/, vector *inConstraints /*= NULL*/, + bool bShowMinimumTime /*=false*/, bool bAllowFade /*=true*/, bool m_bTaskReminders /*=true*/ ) + : TutorialTask(tutorial, descriptionId, enablePreCompletion, inConstraints, bShowMinimumTime, bAllowFade, m_bTaskReminders ), + m_quantity( quantity ), + m_count( 0 ) +{ + m_numItems = numItems; + m_items = new int[m_numItems]; + m_auxValues = new int[m_numItems]; + + for(int i = 0; i < m_numItems; ++i) + { + m_items[i] = items[i]; + m_auxValues[i] = auxValues[i]; + } +} + +CraftTask::~CraftTask() +{ + delete[] m_items; + delete[] m_auxValues; +} + +void CraftTask::onCrafted(shared_ptr item) +{ +#ifndef _CONTENT_PACKAGE + wprintf(L"CraftTask::onCrafted - %ls\n", item->toString().c_str() ); +#endif + bool itemFound = false; + for(int i = 0; i < m_numItems; ++i) + { + if(m_items[i] == item->id && (m_auxValues[i] == -1 || m_auxValues[i] == item->getAuxValue())) + { + itemFound = true; + break; + } + } + + if(itemFound) + { + ++m_count; + } + if( m_count >= m_quantity) + { + bIsCompleted = true; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/CraftTask.h b/Minecraft.Client/Common/Tutorial/CraftTask.h new file mode 100644 index 00000000..1496f07a --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/CraftTask.h @@ -0,0 +1,25 @@ +#pragma once +#include "TutorialTask.h" + +class CraftTask : public TutorialTask +{ +public: + CraftTask( int itemId, int auxValue, int quantity, + Tutorial *tutorial, int descriptionId, bool enablePreCompletion = true, vector *inConstraints = NULL, + bool bShowMinimumTime=false, bool bAllowFade=true, bool m_bTaskReminders=true ); + CraftTask( int *items, int *auxValues, int numItems, int quantity, + Tutorial *tutorial, int descriptionId, bool enablePreCompletion = true, vector *inConstraints = NULL, + bool bShowMinimumTime=false, bool bAllowFade=true, bool m_bTaskReminders=true ); + + ~CraftTask(); + + virtual bool isCompleted() { return bIsCompleted; } + virtual void onCrafted(shared_ptr item); + +private: + int *m_items; + int *m_auxValues; + int m_numItems; + int m_quantity; + int m_count; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/DiggerItemHint.cpp b/Minecraft.Client/Common/Tutorial/DiggerItemHint.cpp new file mode 100644 index 00000000..1367f411 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/DiggerItemHint.cpp @@ -0,0 +1,76 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.h" +#include "Tutorial.h" +#include "DiggerItemHint.h" + + +DiggerItemHint::DiggerItemHint(eTutorial_Hint id, Tutorial *tutorial, int descriptionId, int items[], unsigned int itemsLength) + : TutorialHint(id, tutorial, descriptionId, e_Hint_DiggerItem) +{ + m_iItemsCount = itemsLength; + + m_iItems= new int [m_iItemsCount]; + for(unsigned int i=0;iaddMessage(IDS_TUTORIAL_HINT_ATTACK_WITH_TOOL, true); +} + +int DiggerItemHint::startDestroyBlock(shared_ptr item, Tile *tile) +{ + if(item != NULL) + { + bool itemFound = false; + for(unsigned int i=0;iid == m_iItems[i]) + { + itemFound = true; + break; + } + } + if(itemFound) + { + float speed = item->getDestroySpeed(tile); + if(speed == 1) + { + // Display hint + return m_descriptionId; + } + } + } + return -1; +} + +int DiggerItemHint::attack(shared_ptr item, shared_ptr entity) +{ + if(item != NULL) + { + bool itemFound = false; + for(unsigned int i=0;iid == m_iItems[i]) + { + itemFound = true; + break; + } + } + if(itemFound) + { + // It's also possible that we could hit TileEntities (eg falling sand) so don't want to give this hint then + if( dynamic_pointer_cast( entity ) != NULL ) + { + return IDS_TUTORIAL_HINT_ATTACK_WITH_TOOL; + } + else + { + return -1; + } + } + } + return -1; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/DiggerItemHint.h b/Minecraft.Client/Common/Tutorial/DiggerItemHint.h new file mode 100644 index 00000000..cb71742e --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/DiggerItemHint.h @@ -0,0 +1,18 @@ +#pragma once + +#include "TutorialHint.h" + +class DiggerItem; +class Level; + +class DiggerItemHint : public TutorialHint +{ +private: + int *m_iItems; + unsigned int m_iItemsCount; + +public: + DiggerItemHint(eTutorial_Hint id, Tutorial *tutorial, int descriptionId, int items[], unsigned int itemsLength); + virtual int startDestroyBlock(shared_ptr item, Tile *tile); + virtual int attack(shared_ptr item, shared_ptr entity); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/EffectChangedTask.cpp b/Minecraft.Client/Common/Tutorial/EffectChangedTask.cpp new file mode 100644 index 00000000..5f1b5b20 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/EffectChangedTask.cpp @@ -0,0 +1,31 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.effect.h" +#include "EffectChangedTask.h" + +EffectChangedTask::EffectChangedTask(Tutorial *tutorial, int descriptionId, MobEffect *effect, bool apply, + bool enablePreCompletion, bool bShowMinimumTime, bool bAllowFade, bool bTaskReminders ) + : TutorialTask(tutorial,descriptionId,enablePreCompletion,NULL,bShowMinimumTime,bAllowFade,bTaskReminders) +{ + m_effect = effect; + m_apply = apply; +} + +bool EffectChangedTask::isCompleted() +{ + return bIsCompleted; +} + +void EffectChangedTask::onEffectChanged(MobEffect *effect, bool bRemoved /*=false*/) +{ + if(effect == m_effect) + { + if(m_apply == !bRemoved) + { + bIsCompleted = true; + } + else + { + bIsCompleted = false; + } + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/EffectChangedTask.h b/Minecraft.Client/Common/Tutorial/EffectChangedTask.h new file mode 100644 index 00000000..23563f39 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/EffectChangedTask.h @@ -0,0 +1,19 @@ +#pragma once +using namespace std; + +#include "TutorialTask.h" + +class MobEffect; + +class EffectChangedTask : public TutorialTask +{ +private: + MobEffect *m_effect; + bool m_apply; + +public: + EffectChangedTask(Tutorial *tutorial, int descriptionId, MobEffect *effect, bool apply = true, + bool enablePreCompletion = true, bool bShowMinimumTime = false, bool bAllowFade = true, bool bTaskReminders = true ); + virtual bool isCompleted(); + virtual void onEffectChanged(MobEffect *effect, bool bRemoved=false); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/FullTutorial.cpp b/Minecraft.Client/Common/Tutorial/FullTutorial.cpp new file mode 100644 index 00000000..123ab9de --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/FullTutorial.cpp @@ -0,0 +1,653 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.phys.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.effect.h" +#include "..\GameRules\ConsoleGameRules.h" +#include "DiggerItemHint.h" +#include "TutorialTasks.h" +#include "AreaHint.h" +#include "FullTutorial.h" +#include "TutorialConstraints.h" + +FullTutorial::FullTutorial(int iPad, bool isTrial /*= false*/) + : Tutorial(iPad, true) +{ + m_isTrial = isTrial; + m_freezeTime = true; + m_progressFlags = 0; + + for(unsigned int i = 0; i < e_Tutorial_State_Max; ++i) + { + m_completedStates[i] = false; + } + + addMessage(IDS_TUTORIAL_COMPLETED); + + /* + * + * + * GAMEPLAY + * + */ + // START OF BASIC TUTORIAL + if( m_isTrial ) + { + addTask(e_Tutorial_State_Gameplay, new ChoiceTask(this, IDS_TUTORIAL_TASK_OVERVIEW, IDS_TUTORIAL_PROMPT_START_TUTORIAL, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Jump_To_Last_Task, eTelemetryTutorial_TrialStart) ); + } + else + { +#ifdef _XBOX + if(getCompleted(eTutorial_Telemetry_Halfway) && !isStateCompleted(e_Tutorial_State_Redstone_And_Piston) ) + { + addTask(e_Tutorial_State_Gameplay, new ChoiceTask(this, IDS_TUTORIAL_NEW_FEATURES_CHOICE, IDS_TUTORIAL_PROMPT_NEW_FEATURES_CHOICE, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Jump_To_Last_Task, eTelemetryTutorial_TrialStart) ); + } + + addTask(e_Tutorial_State_Gameplay, new InfoTask(this, IDS_TUTORIAL_TASK_OVERVIEW, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); +#else + if(getCompleted(eTutorial_Telemetry_Halfway)) + { + addTask(e_Tutorial_State_Gameplay, new ChoiceTask(this, IDS_TUTORIAL_TASK_OVERVIEW, IDS_TUTORIAL_PROMPT_START_TUTORIAL, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Jump_To_Last_Task, eTelemetryTutorial_TrialStart) ); + } + else + { + addTask(e_Tutorial_State_Gameplay, new InfoTask(this, IDS_TUTORIAL_TASK_OVERVIEW, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } +#endif + } + + int lookMappings[] = {MINECRAFT_ACTION_LOOK_UP, MINECRAFT_ACTION_LOOK_DOWN, MINECRAFT_ACTION_LOOK_LEFT, MINECRAFT_ACTION_LOOK_RIGHT}; + int moveMappings[] = {MINECRAFT_ACTION_FORWARD, MINECRAFT_ACTION_BACKWARD, MINECRAFT_ACTION_LEFT, MINECRAFT_ACTION_RIGHT}; + int iLookCompletionMaskA[]= { 10, // 1010 + 9, // 1001 + 6, // 0110 + 5 // 0101 + }; + addTask(e_Tutorial_State_Gameplay, new ControllerTask( this, IDS_TUTORIAL_TASK_LOOK, false, false, lookMappings, 4, iLookCompletionMaskA, 4, moveMappings, 4) ); + + addTask(e_Tutorial_State_Gameplay, new ControllerTask( this, IDS_TUTORIAL_TASK_MOVE, false, false, moveMappings, 4, iLookCompletionMaskA, 4, lookMappings, 4) ); + + addTask(e_Tutorial_State_Gameplay, new InfoTask(this, IDS_TUTORIAL_TASK_SPRINT, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + + int jumpMappings[] = {MINECRAFT_ACTION_JUMP}; + addTask(e_Tutorial_State_Gameplay, new ControllerTask( this, IDS_TUTORIAL_TASK_JUMP, false, true, jumpMappings, 1) ); + + int mineMappings[] = {MINECRAFT_ACTION_ACTION}; + addTask(e_Tutorial_State_Gameplay, new ControllerTask( this, IDS_TUTORIAL_TASK_MINE, false, true, mineMappings, 1) ); + addTask(e_Tutorial_State_Gameplay, new PickupTask( Tile::treeTrunk_Id, 4, -1, this, IDS_TUTORIAL_TASK_CHOP_WOOD ) ); + + int scrollMappings[] = {MINECRAFT_ACTION_LEFT_SCROLL,MINECRAFT_ACTION_RIGHT_SCROLL}; + //int scrollMappings[] = {ACTION_MENU_LEFT_SCROLL,ACTION_MENU_RIGHT_SCROLL}; + int iScrollCompletionMaskA[]= { 2, // 10 + 1};// 01 + addTask(e_Tutorial_State_Gameplay, new ControllerTask( this, IDS_TUTORIAL_TASK_SCROLL, false, false, scrollMappings, 2,iScrollCompletionMaskA,2) ); + + int invMappings[] = {MINECRAFT_ACTION_INVENTORY}; + addTask(e_Tutorial_State_Gameplay, new ControllerTask( this, IDS_TUTORIAL_TASK_INVENTORY, false, false, invMappings, 1) ); + addTask(e_Tutorial_State_Gameplay, new StateChangeTask( e_Tutorial_State_Inventory_Menu, this) ); + + addTask(e_Tutorial_State_Gameplay, new InfoTask(this, IDS_TUTORIAL_TASK_FOOD_BAR_DEPLETE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Gameplay, new InfoTask(this, IDS_TUTORIAL_TASK_FOOD_BAR_HEAL, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Gameplay, new InfoTask(this, IDS_TUTORIAL_TASK_FOOD_BAR_FEED, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + + // While they should only eat the item we give them, includ the ability to complete this task with different items + int foodItems[] = {Item::mushroomStew_Id, Item::apple_Id, Item::bread_Id, Item::porkChop_raw_Id, Item::porkChop_cooked_Id, + Item::apple_gold_Id, Item::fish_raw_Id, Item::fish_cooked_Id, Item::cookie_Id, Item::beef_cooked_Id, + Item::beef_raw_Id, Item::chicken_cooked_Id, Item::chicken_raw_Id, Item::melon_Id, Item::rotten_flesh_Id}; + addTask(e_Tutorial_State_Gameplay, new CompleteUsingItemTask(this, IDS_TUTORIAL_TASK_FOOD_BAR_EAT_STEAK, foodItems, 15, true) ); + + int crftMappings[] = {MINECRAFT_ACTION_CRAFTING}; + addTask(e_Tutorial_State_Gameplay, new ControllerTask( this, IDS_TUTORIAL_TASK_CRAFTING, false, false, crftMappings, 1) ); + + addTask(e_Tutorial_State_Gameplay, new ProgressFlagTask( &m_progressFlags, FULL_TUTORIAL_PROGRESS_2_X_2_Crafting, ProgressFlagTask::e_Progress_Set_Flag, this ) ); + addTask(e_Tutorial_State_Gameplay, new StateChangeTask( e_Tutorial_State_2x2Crafting_Menu, this) ); + + addTask(e_Tutorial_State_Gameplay, new CraftTask( Tile::wood_Id, -1, 1, this, IDS_TUTORIAL_TASK_CREATE_PLANKS) ); + addTask(e_Tutorial_State_Gameplay, new CraftTask( Tile::workBench_Id, -1, 1, this, IDS_TUTORIAL_TASK_CREATE_CRAFTING_TABLE) ); + + //int useMappings[] = {MINECRAFT_ACTION_USE}; + //addTask(e_Tutorial_State_Gameplay, new ControllerTask( this, IDS_TUTORIAL_TASK_USE, false, false, useMappings, 1) ); + addTask(e_Tutorial_State_Gameplay, new InfoTask(this, IDS_TUTORIAL_TASK_USE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Gameplay, new UseItemTask( Tile::workBench_Id, this, IDS_TUTORIAL_TASK_PLACE_WORKBENCH, true ) ); + + addTask(e_Tutorial_State_Gameplay, new InfoTask(this, IDS_TUTORIAL_TASK_NIGHT_DANGER, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Gameplay, new InfoTask(this, IDS_TUTORIAL_TASK_NEARBY_SHELTER, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Gameplay, new InfoTask(this, IDS_TUTORIAL_TASK_COLLECT_RESOURCES, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + + // END OF BASIC TUTORIAL + + addTask(e_Tutorial_State_Gameplay, new ChoiceTask(this, IDS_TUTORIAL_TASK_BASIC_COMPLETE, IDS_TUTORIAL_PROMPT_BASIC_COMPLETE, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Jump_To_Last_Task, eTelemetryTutorial_Halfway) ); + + // START OF FULL TUTORIAL + + addTask(e_Tutorial_State_Gameplay, new UseTileTask( Tile::workBench_Id, this, IDS_TUTORIAL_TASK_OPEN_WORKBENCH, false ) ); + + addTask(e_Tutorial_State_Gameplay, new ProgressFlagTask( &m_progressFlags, FULL_TUTORIAL_PROGRESS_3_X_3_Crafting, ProgressFlagTask::e_Progress_Set_Flag, this ) ); + addTask(e_Tutorial_State_Gameplay, new StateChangeTask( e_Tutorial_State_3x3Crafting_Menu, this) ); + + addTask(e_Tutorial_State_Gameplay, new CraftTask( Item::stick->id, -1, 1, this, IDS_TUTORIAL_TASK_CREATE_STICKS) ); + + int shovelItems[] = {Item::shovel_wood->id, Item::shovel_stone->id, Item::shovel_iron->id, Item::shovel_gold->id, Item::shovel_diamond->id}; + int shovelAuxVals[] = {-1,-1,-1,-1,-1}; + addTask(e_Tutorial_State_Gameplay, new CraftTask( shovelItems, shovelAuxVals, 5, 1, this, IDS_TUTORIAL_TASK_CREATE_WOODEN_SHOVEL) ); + + int hatchetItems[] = {Item::hatchet_wood->id, Item::hatchet_stone->id, Item::hatchet_iron->id, Item::hatchet_gold->id, Item::hatchet_diamond->id}; + int hatchetAuxVals[] = {-1,-1,-1,-1,-1}; + addTask(e_Tutorial_State_Gameplay, new CraftTask( hatchetItems, hatchetAuxVals, 5, 1, this, IDS_TUTORIAL_TASK_CREATE_WOODEN_HATCHET) ); + + int pickaxeItems[] = {Item::pickAxe_wood->id, Item::pickAxe_stone->id, Item::pickAxe_iron->id, Item::pickAxe_gold->id, Item::pickAxe_diamond->id}; + int pickaxeAuxVals[] = {-1,-1,-1,-1,-1}; + addTask(e_Tutorial_State_Gameplay, new CraftTask( pickaxeItems, pickaxeAuxVals, 5, 1, this, IDS_TUTORIAL_TASK_CREATE_WOODEN_PICKAXE) ); + + addTask(e_Tutorial_State_Gameplay, new PickupTask( Tile::stoneBrick_Id, 8, -1, this, IDS_TUTORIAL_TASK_MINE_STONE ) ); + + addTask(e_Tutorial_State_Gameplay, new ProgressFlagTask( &m_progressFlags, FULL_TUTORIAL_PROGRESS_CRAFT_FURNACE, ProgressFlagTask::e_Progress_Set_Flag, this ) ); + addTask(e_Tutorial_State_Gameplay, new CraftTask( Tile::furnace_Id, -1, 1, this, IDS_TUTORIAL_TASK_CREATE_FURNACE ) ); + addTask(e_Tutorial_State_Gameplay, new UseTileTask(Tile::furnace_Id, this, IDS_TUTORIAL_TASK_PLACE_AND_OPEN_FURNACE) ); + + addTask(e_Tutorial_State_Gameplay, new ProgressFlagTask( &m_progressFlags, FULL_TUTORIAL_PROGRESS_USE_FURNACE, ProgressFlagTask::e_Progress_Set_Flag, this ) ); + addTask(e_Tutorial_State_Gameplay, new StateChangeTask( e_Tutorial_State_Furnace_Menu, this) ); + addTask(e_Tutorial_State_Gameplay, new CraftTask( Item::coal->id, -1, 1, this, IDS_TUTORIAL_TASK_CREATE_CHARCOAL) ); + addTask(e_Tutorial_State_Gameplay, new CraftTask( Tile::glass_Id, -1, 1, this, IDS_TUTORIAL_TASK_CREATE_GLASS) ); + addTask(e_Tutorial_State_Gameplay, new CraftTask( Item::door_wood->id, -1, 1, this, IDS_TUTORIAL_TASK_CREATE_WOODEN_DOOR) ); + addTask(e_Tutorial_State_Gameplay, new UseItemTask(Item::door_wood->id, this, IDS_TUTORIAL_TASK_PLACE_DOOR) ); + addTask(e_Tutorial_State_Gameplay, new CraftTask( Tile::torch_Id, -1, 1, this, IDS_TUTORIAL_TASK_CREATE_TORCH) ); + + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"tutorialArea"); + if(area != NULL) + { + vector *areaConstraints = new vector(); + areaConstraints->push_back( new AreaConstraint( IDS_TUTORIAL_CONSTRAINT_TUTORIAL_AREA, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + addTask(e_Tutorial_State_Gameplay, new AreaTask(e_Tutorial_State_Gameplay,this, areaConstraints) ); + } + } + + // This MUST be the last task in the e_Tutorial_State_Gameplay state. Some of the earlier tasks will skip to the last + // task when complete, and this is the one that we want the player to see. + ProcedureCompoundTask *finalTask = new ProcedureCompoundTask( this ); + finalTask->AddTask( new InfoTask(this, IDS_TUTORIAL_COMPLETED, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A, eTelemetryTutorial_Complete) ); + // 4J Stu - Remove this string as it refers to things that don't exist in the current tutorial world! + //finalTask->AddTask( new InfoTask(this, IDS_TUTORIAL_FEATURES_IN_THIS_AREA, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + finalTask->AddTask( new InfoTask(this, IDS_TUTORIAL_FEATURES_OUTSIDE_THIS_AREA, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + finalTask->AddTask( new InfoTask(this, IDS_TUTORIAL_COMPLETED_EXPLORE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Gameplay, finalTask); + // END OF FULL TUTORIAL + + + /* + * + * + * INVENTORY + * + */ + // Some tasks already added in the super class ctor + addTask(e_Tutorial_State_Inventory_Menu, new FullTutorialActiveTask( this, e_Tutorial_Completion_Complete_State) ); + addTask(e_Tutorial_State_Inventory_Menu, new InfoTask(this, IDS_TUTORIAL_TASK_INV_EXIT, -1, false, ACTION_MENU_B) ); + + /* + * + * + * CRAFTING + * + */ + // Some tasks already added in the super class ctor + + addTask(e_Tutorial_State_2x2Crafting_Menu, new FullTutorialActiveTask( this, e_Tutorial_Completion_Complete_State) ); + // To block progress + addTask(e_Tutorial_State_2x2Crafting_Menu, new ProgressFlagTask( &m_progressFlags, FULL_TUTORIAL_PROGRESS_2_X_2_Crafting, ProgressFlagTask::e_Progress_Flag_On, this ) ); + + addTask(e_Tutorial_State_2x2Crafting_Menu, new FullTutorialActiveTask( this, e_Tutorial_Completion_Complete_State) ); + + addTask(e_Tutorial_State_2x2Crafting_Menu, new CraftTask( Tile::wood_Id, -1, 1, this, IDS_TUTORIAL_TASK_CRAFT_CREATE_PLANKS) ); + + ProcedureCompoundTask *workbenchCompound = new ProcedureCompoundTask( this ); + workbenchCompound->AddTask( new XuiCraftingTask( this, IDS_TUTORIAL_TASK_CRAFT_SELECT_STRUCTURES, Recipy::eGroupType_Structure) ); + workbenchCompound->AddTask( new XuiCraftingTask( this, IDS_TUTORIAL_TASK_CRAFT_SELECT_CRAFTING_TABLE, Tile::workBench_Id) ); + workbenchCompound->AddTask( new CraftTask( Tile::workBench_Id, -1, 1, this, IDS_TUTORIAL_TASK_CREATE_CRAFTING_TABLE) ); + addTask(e_Tutorial_State_2x2Crafting_Menu, workbenchCompound ); + addTask(e_Tutorial_State_2x2Crafting_Menu, new InfoTask(this, IDS_TUTORIAL_TASK_CRAFT_EXIT_AND_PLACE_TABLE, -1, false, ACTION_MENU_B) ); + + // 3x3 Crafting + addTask(e_Tutorial_State_3x3Crafting_Menu, new FullTutorialActiveTask( this, e_Tutorial_Completion_Complete_State) ); + + addTask(e_Tutorial_State_3x3Crafting_Menu, new ProgressFlagTask( &m_progressFlags, FULL_TUTORIAL_PROGRESS_3_X_3_Crafting, ProgressFlagTask::e_Progress_Flag_On, this ) ); + + addTask(e_Tutorial_State_3x3Crafting_Menu, new CraftTask( Item::stick->id, -1, 1, this, IDS_TUTORIAL_TASK_CREATE_STICKS) ); + + ProcedureCompoundTask *shovelCompound = new ProcedureCompoundTask( this ); + shovelCompound->AddTask( new XuiCraftingTask( this, IDS_TUTORIAL_TASK_CRAFT_SELECT_TOOLS, Recipy::eGroupType_Tool) ); + shovelCompound->AddTask( new XuiCraftingTask( this, IDS_TUTORIAL_TASK_CRAFT_SELECT_WOODEN_SHOVEL, Item::shovel_wood->id) ); + shovelCompound->AddTask( new CraftTask( shovelItems, shovelAuxVals, 5, 1, this, IDS_TUTORIAL_TASK_CREATE_WOODEN_SHOVEL) ); + addTask(e_Tutorial_State_3x3Crafting_Menu, shovelCompound ); + addTask(e_Tutorial_State_3x3Crafting_Menu, new CraftTask( hatchetItems, hatchetAuxVals, 5, 1, this, IDS_TUTORIAL_TASK_CREATE_WOODEN_HATCHET) ); + addTask(e_Tutorial_State_3x3Crafting_Menu, new CraftTask( pickaxeItems, pickaxeAuxVals, 5, 1, this, IDS_TUTORIAL_TASK_CREATE_WOODEN_PICKAXE) ); + + addTask(e_Tutorial_State_3x3Crafting_Menu, new InfoTask(this, IDS_TUTORIAL_TASK_CRAFT_TOOLS_BUILT, -1, false, ACTION_MENU_B) ); + + // To block progress + addTask(e_Tutorial_State_3x3Crafting_Menu, new ProgressFlagTask( &m_progressFlags, FULL_TUTORIAL_PROGRESS_CRAFT_FURNACE, ProgressFlagTask::e_Progress_Flag_On, this ) ); + + addTask(e_Tutorial_State_3x3Crafting_Menu, new CraftTask( Tile::furnace_Id, -1, 1, this, IDS_TUTORIAL_TASK_CRAFT_CREATE_FURNACE) ); + addTask(e_Tutorial_State_3x3Crafting_Menu, new InfoTask(this, IDS_TUTORIAL_TASK_CRAFT_EXIT_AND_PLACE_FURNACE, -1, false, ACTION_MENU_B) ); + + // No need to block here, as it's fine if the player wants to do this out of order + addTask(e_Tutorial_State_3x3Crafting_Menu, new CraftTask( Item::door_wood->id, -1, 1, this, IDS_TUTORIAL_TASK_CREATE_WOODEN_DOOR) ); + addTask(e_Tutorial_State_3x3Crafting_Menu, new CraftTask( Tile::torch_Id, -1, 1, this, IDS_TUTORIAL_TASK_CREATE_TORCH) ); + + /* + * + * + * FURNACE + * + */ + // Some tasks already added in the super class ctor + + addTask(e_Tutorial_State_Furnace_Menu, new FullTutorialActiveTask( this, e_Tutorial_Completion_Complete_State) ); + + // Blocking + addTask(e_Tutorial_State_Furnace_Menu, new ProgressFlagTask( &m_progressFlags, FULL_TUTORIAL_PROGRESS_USE_FURNACE, ProgressFlagTask::e_Progress_Flag_On, this ) ); + + addTask(e_Tutorial_State_Furnace_Menu, new CraftTask( Item::coal->id, -1, 1, this, IDS_TUTORIAL_TASK_FURNACE_CREATE_CHARCOAL) ); + addTask(e_Tutorial_State_Furnace_Menu, new InfoTask(this, IDS_TUTORIAL_TASK_FURNACE_CHARCOAL_USES, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Furnace_Menu, new CraftTask( Tile::glass_Id, -1, 1, this, IDS_TUTORIAL_TASK_FURNACE_CREATE_GLASS) ); + + /* + * + * + * BREWING + * + */ + + // To block progress + addTask(e_Tutorial_State_Brewing_Menu, new ProgressFlagTask( &m_progressFlags, EXTENDED_TUTORIAL_PROGRESS_USE_BREWING_STAND, ProgressFlagTask::e_Progress_Flag_On, this ) ); + + int potionItems[] = {Item::potion_Id,Item::potion_Id,Item::potion_Id,Item::potion_Id,Item::potion_Id,Item::potion_Id,Item::potion_Id,Item::potion_Id}; + int potionAuxVals[] = { MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_FIRE_RESISTANCE), + MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_FIRE_RESISTANCE), + MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_FIRE_RESISTANCE), + MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_FIRE_RESISTANCE), + MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_FIRE_RESISTANCE), + MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_FIRE_RESISTANCE), + MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_FIRE_RESISTANCE), + MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_FIRE_RESISTANCE) + }; + addTask(e_Tutorial_State_Brewing_Menu, new CraftTask( potionItems, potionAuxVals, 8, 1, this, IDS_TUTORIAL_TASK_BREWING_MENU_CREATE_FIRE_POTION) ); + addTask(e_Tutorial_State_Brewing_Menu, new InfoTask(this, IDS_TUTORIAL_TASK_BREWING_MENU_EXIT, -1, false, ACTION_MENU_B) ); + + /* + * + * + * MINECART + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"minecartArea"); + if(area != NULL) + { + addHint(e_Tutorial_State_Gameplay, new AreaHint(e_Tutorial_Hint_Always_On, this, e_Tutorial_State_Gameplay, e_Tutorial_State_Riding_Minecart, IDS_TUTORIAL_HINT_MINECART, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1 ) ); + } + } + + /* + * + * + * BOAT + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"boatArea"); + if(area != NULL) + { + addHint(e_Tutorial_State_Gameplay, new AreaHint(e_Tutorial_Hint_Always_On, this, e_Tutorial_State_Gameplay, e_Tutorial_State_Riding_Boat, IDS_TUTORIAL_HINT_BOAT, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1 ) ); + } + } + + /* + * + * + * FISHING + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"fishingArea"); + if(area != NULL) + { + addHint(e_Tutorial_State_Gameplay, new AreaHint(e_Tutorial_Hint_Always_On, this, e_Tutorial_State_Gameplay, e_Tutorial_State_Fishing, IDS_TUTORIAL_HINT_FISHING, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1 ) ); + } + } + + /* + * + * + * PISTON - SELF-REPAIRING BRIDGE + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"pistonBridgeArea"); + if(area != NULL) + { + addHint(e_Tutorial_State_Gameplay, new AreaHint(e_Tutorial_Hint_Always_On, this, e_Tutorial_State_Gameplay, e_Tutorial_State_None, IDS_TUTORIAL_HINT_PISTON_SELF_REPAIRING_BRIDGE, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1, true ) ); + } + } + + /* + * + * + * PISTON - PISTON AND REDSTONE CIRCUITS + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"pistonArea"); + if(area != NULL) + { + eTutorial_State redstoneAndPistonStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Redstone_And_Piston, redstoneAndPistonStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + + addTask(e_Tutorial_State_Redstone_And_Piston, new ChoiceTask(this, IDS_TUTORIAL_REDSTONE_OVERVIEW, IDS_TUTORIAL_PROMPT_REDSTONE_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Redstone_And_Pistons) ); + addTask(e_Tutorial_State_Redstone_And_Piston, new InfoTask(this, IDS_TUTORIAL_TASK_REDSTONE_POWER_SOURCES, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Redstone_And_Piston, new InfoTask(this, IDS_TUTORIAL_TASK_REDSTONE_TRIPWIRE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Redstone_And_Piston, new InfoTask(this, IDS_TUTORIAL_TASK_REDSTONE_POWER_SOURCES_POSITION, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Redstone_And_Piston, new InfoTask(this, IDS_TUTORIAL_TASK_REDSTONE_DUST, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Redstone_And_Piston, new InfoTask(this, IDS_TUTORIAL_TASK_REDSTONE_REPEATER, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Redstone_And_Piston, new InfoTask(this, IDS_TUTORIAL_TASK_PISTONS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Redstone_And_Piston, new InfoTask(this, IDS_TUTORIAL_TASK_TRY_IT, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + } + + /* + * + * + * PORTAL + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"portalArea"); + if(area != NULL) + { + eTutorial_State portalStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Portal, portalStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + + addTask(e_Tutorial_State_Portal, new ChoiceTask(this, IDS_TUTORIAL_PORTAL_OVERVIEW, IDS_TUTORIAL_PROMPT_PORTAL_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Portal) ); + addTask(e_Tutorial_State_Portal, new InfoTask(this, IDS_TUTORIAL_TASK_BUILD_PORTAL, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Portal, new InfoTask(this, IDS_TUTORIAL_TASK_ACTIVATE_PORTAL, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Portal, new InfoTask(this, IDS_TUTORIAL_TASK_USE_PORTAL, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Portal, new InfoTask(this, IDS_TUTORIAL_TASK_NETHER, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Portal, new InfoTask(this, IDS_TUTORIAL_TASK_NETHER_FAST_TRAVEL, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + } + + /* + * + * + * CREATIVE + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"creativeArea"); + if(area != NULL) + { + eTutorial_State creativeStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_CreativeMode, creativeStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1,true,true,GameType::CREATIVE) ); + + addTask(e_Tutorial_State_CreativeMode, new ChoiceTask(this, IDS_TUTORIAL_CREATIVE_OVERVIEW, IDS_TUTORIAL_PROMPT_CREATIVE_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Jump_To_Last_Task, eTelemetryTutorial_CreativeMode) ); + addTask(e_Tutorial_State_CreativeMode, new InfoTask(this, IDS_TUTORIAL_TASK_CREATIVE_MODE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_CreativeMode, new InfoTask(this, IDS_TUTORIAL_TASK_FLY, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + + int crftMappings[] = {MINECRAFT_ACTION_CRAFTING}; + addTask(e_Tutorial_State_CreativeMode, new ControllerTask( this, IDS_TUTORIAL_TASK_OPEN_CREATIVE_INVENTORY, false, false, crftMappings, 1) ); + addTask(e_Tutorial_State_CreativeMode, new StateChangeTask( e_Tutorial_State_Creative_Inventory_Menu, this) ); + + // This last task ensures that the player is still in creative mode until they exit the area (but could skip the previous instructional stuff) + ProcedureCompoundTask *creativeFinalTask = new ProcedureCompoundTask( this ); + + AABB *exitArea = app.getGameRuleDefinitions()->getNamedArea(L"creativeExitArea"); + if(exitArea != NULL) + { + vector *creativeExitAreaConstraints = new vector(); + creativeExitAreaConstraints->push_back( new AreaConstraint( -1, exitArea->x0,exitArea->y0,exitArea->z0,exitArea->x1,exitArea->y1,exitArea->z1,true,false) ); + creativeFinalTask->AddTask( new AreaTask(e_Tutorial_State_CreativeMode, this, creativeExitAreaConstraints,IDS_TUTORIAL_TASK_CREATIVE_EXIT,AreaTask::eAreaTaskCompletion_CompleteOnConstraintsSatisfied) ); + } + + vector *creativeAreaConstraints = new vector(); + creativeAreaConstraints->push_back( new AreaConstraint( IDS_TUTORIAL_CONSTRAINT_TUTORIAL_AREA, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + creativeFinalTask->AddTask( new AreaTask(e_Tutorial_State_CreativeMode, this, creativeAreaConstraints) ); + + creativeFinalTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_CREATIVE_COMPLETE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + + addTask(e_Tutorial_State_CreativeMode,creativeFinalTask); + } + } + + /* + * + * + * BREWING + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"brewingArea"); + if(area != NULL) + { + eTutorial_State brewingStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Brewing, brewingStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + + addTask(e_Tutorial_State_Brewing, new ChoiceTask(this, IDS_TUTORIAL_TASK_BREWING_OVERVIEW, IDS_TUTORIAL_PROMPT_BREWING_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Brewing) ); + + ProcedureCompoundTask *fillWaterBottleTask = new ProcedureCompoundTask( this ); + fillWaterBottleTask->AddTask( new PickupTask( Item::glassBottle_Id, 1, -1, this, IDS_TUTORIAL_TASK_BREWING_GET_GLASS_BOTTLE ) ); + fillWaterBottleTask->AddTask( new PickupTask( Item::potion_Id, 1, 0, this, IDS_TUTORIAL_TASK_BREWING_FILL_GLASS_BOTTLE ) ); + addTask(e_Tutorial_State_Brewing, fillWaterBottleTask); + + addTask(e_Tutorial_State_Brewing, new InfoTask(this, IDS_TUTORIAL_TASK_BREWING_FILL_CAULDRON, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + + + addTask(e_Tutorial_State_Brewing, new ProgressFlagTask( &m_progressFlags, EXTENDED_TUTORIAL_PROGRESS_USE_BREWING_STAND, ProgressFlagTask::e_Progress_Set_Flag, this ) ); + addTask(e_Tutorial_State_Brewing, new CraftTask( potionItems, potionAuxVals, 8, 1, this, IDS_TUTORIAL_TASK_BREWING_CREATE_FIRE_POTION) ); + + addTask(e_Tutorial_State_Brewing, new InfoTask(this, IDS_TUTORIAL_TASK_BREWING_USE_POTION, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Brewing, new EffectChangedTask(this, IDS_TUTORIAL_TASK_BREWING_DRINK_FIRE_POTION, MobEffect::fireResistance) ); + addTask(e_Tutorial_State_Brewing, new InfoTask(this, IDS_TUTORIAL_TASK_BREWING_USE_EFFECTS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + } + + /* + * + * + * ENCHANTING + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"enchantingArea"); + if(area != NULL) + { + eTutorial_State enchantingStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Enchanting, enchantingStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + + addTask(e_Tutorial_State_Enchanting, new ChoiceTask(this, IDS_TUTORIAL_TASK_ENCHANTING_OVERVIEW, IDS_TUTORIAL_PROMPT_ENCHANTING_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Enchanting) ); + + addTask(e_Tutorial_State_Enchanting, new InfoTask(this, IDS_TUTORIAL_TASK_ENCHANTING_SUMMARY, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Enchanting, new InfoTask(this, IDS_TUTORIAL_TASK_ENCHANTING_BOOKS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Enchanting, new InfoTask(this, IDS_TUTORIAL_TASK_ENCHANTING_BOOKCASES, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Enchanting, new InfoTask(this, IDS_TUTORIAL_TASK_ENCHANTING_EXPERIENCE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Enchanting, new InfoTask(this, IDS_TUTORIAL_TASK_ENCHANTING_BOTTLE_O_ENCHANTING, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Enchanting, new InfoTask(this, IDS_TUTORIAL_TASK_ENCHANTING_USE_CHESTS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + } + + /* + * + * + * ANVIL + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"anvilArea"); + if(area != NULL) + { + eTutorial_State enchantingStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Anvil, enchantingStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + + addTask(e_Tutorial_State_Anvil, new ChoiceTask(this, IDS_TUTORIAL_TASK_ANVIL_OVERVIEW, IDS_TUTORIAL_PROMPT_ANVIL_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Anvil) ); + + addTask(e_Tutorial_State_Anvil, new InfoTask(this, IDS_TUTORIAL_TASK_ANVIL_SUMMARY, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Anvil, new InfoTask(this, IDS_TUTORIAL_TASK_ANVIL_ENCHANTED_BOOKS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Anvil, new InfoTask(this, IDS_TUTORIAL_TASK_ANVIL_COST, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Anvil, new InfoTask(this, IDS_TUTORIAL_TASK_ANVIL_COST2, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Anvil, new InfoTask(this, IDS_TUTORIAL_TASK_ANVIL_RENAMING, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Anvil, new InfoTask(this, IDS_TUTORIAL_TASK_ANVIL_USE_CHESTS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + } + + /* + * + * + * TRADING + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"tradingArea"); + if(area != NULL) + { + eTutorial_State enchantingStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Trading, enchantingStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + + addTask(e_Tutorial_State_Trading, new ChoiceTask(this, IDS_TUTORIAL_TASK_TRADING_OVERVIEW, IDS_TUTORIAL_PROMPT_TRADING_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Trading) ); + + addTask(e_Tutorial_State_Trading, new InfoTask(this, IDS_TUTORIAL_TASK_TRADING_SUMMARY, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Trading, new InfoTask(this, IDS_TUTORIAL_TASK_TRADING_TRADES, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Trading, new InfoTask(this, IDS_TUTORIAL_TASK_TRADING_INCREASE_TRADES, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Trading, new InfoTask(this, IDS_TUTORIAL_TASK_TRADING_DECREASE_TRADES, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Trading, new InfoTask(this, IDS_TUTORIAL_TASK_TRADING_USE_CHESTS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + } + + /* + * + * + * ENDERCHEST + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"enderchestArea"); + if(area != NULL) + { + eTutorial_State enchantingStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Enderchests, enchantingStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + + addTask(e_Tutorial_State_Enderchests, new ChoiceTask(this, IDS_TUTORIAL_TASK_ENDERCHEST_OVERVIEW, IDS_TUTORIAL_PROMPT_ENDERCHEST_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Enderchest) ); + + addTask(e_Tutorial_State_Enderchests, new InfoTask(this, IDS_TUTORIAL_TASK_ENDERCHEST_SUMMARY, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Enderchests, new InfoTask(this, IDS_TUTORIAL_TASK_ENDERCHEST_PLAYERS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Enderchests, new InfoTask(this, IDS_TUTORIAL_TASK_ENDERCHEST_FUNCTION, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + } + + /* + * + * + * FARMING + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"farmingArea"); + if(area != NULL) + { + eTutorial_State farmingStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Farming, farmingStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + + addTask(e_Tutorial_State_Farming, new ChoiceTask(this, IDS_TUTORIAL_FARMING_OVERVIEW, IDS_TUTORIAL_PROMPT_FARMING_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Farming) ); + + addTask(e_Tutorial_State_Farming, new InfoTask(this, IDS_TUTORIAL_TASK_FARMING_SEEDS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Farming, new InfoTask(this, IDS_TUTORIAL_TASK_FARMING_FARMLAND, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Farming, new InfoTask(this, IDS_TUTORIAL_TASK_FARMING_WHEAT, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Farming, new InfoTask(this, IDS_TUTORIAL_TASK_FARMING_PUMPKIN_AND_MELON, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Farming, new InfoTask(this, IDS_TUTORIAL_TASK_FARMING_CARROTS_AND_POTATOES, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Farming, new InfoTask(this, IDS_TUTORIAL_TASK_FARMING_SUGARCANE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Farming, new InfoTask(this, IDS_TUTORIAL_TASK_FARMING_CACTUS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Farming, new InfoTask(this, IDS_TUTORIAL_TASK_FARMING_MUSHROOM, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Farming, new InfoTask(this, IDS_TUTORIAL_TASK_FARMING_BONEMEAL, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Farming, new InfoTask(this, IDS_TUTORIAL_TASK_FARMING_COMPLETE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + } + + /* + * + * + * BREEDING + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"breedingArea"); + if(area != NULL) + { + eTutorial_State breedingStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Breeding, breedingStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + + addTask(e_Tutorial_State_Breeding, new ChoiceTask(this, IDS_TUTORIAL_BREEDING_OVERVIEW, IDS_TUTORIAL_PROMPT_BREEDING_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Breeding) ); + + addTask(e_Tutorial_State_Breeding, new InfoTask(this, IDS_TUTORIAL_TASK_BREEDING_FEED, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Breeding, new InfoTask(this, IDS_TUTORIAL_TASK_BREEDING_FEED_FOOD, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Breeding, new InfoTask(this, IDS_TUTORIAL_TASK_BREEDING_BABY, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Breeding, new InfoTask(this, IDS_TUTORIAL_TASK_BREEDING_DELAY, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Breeding, new InfoTask(this, IDS_TUTORIAL_TASK_BREEDING_FOLLOW, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Breeding, new InfoTask(this, IDS_TUTORIAL_TASK_BREEDING_RIDING_PIGS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Breeding, new InfoTask(this, IDS_TUTORIAL_TASK_BREEDING_WOLF_TAMING, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Breeding, new InfoTask(this, IDS_TUTORIAL_TASK_BREEDING_WOLF_COLLAR, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Breeding, new InfoTask(this, IDS_TUTORIAL_TASK_BREEDING_COMPLETE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + } + + /* + * + * + * SNOW AND IRON GOLEM + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"golemArea"); + if(area != NULL) + { + eTutorial_State golemStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Golem, golemStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + + addTask(e_Tutorial_State_Golem, new ChoiceTask(this, IDS_TUTORIAL_GOLEM_OVERVIEW, IDS_TUTORIAL_PROMPT_GOLEM_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Golem) ); + + addTask(e_Tutorial_State_Golem, new InfoTask(this, IDS_TUTORIAL_TASK_GOLEM_PUMPKIN, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Golem, new InfoTask(this, IDS_TUTORIAL_TASK_GOLEM_SNOW, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Golem, new InfoTask(this, IDS_TUTORIAL_TASK_GOLEM_IRON, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Golem, new InfoTask(this, IDS_TUTORIAL_TASK_GOLEM_IRON_VILLAGE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + + } + } + +} + +// 4J Stu - All tutorials are onby default in the full tutorial whether the player has previously completed them or not +bool FullTutorial::isStateCompleted( eTutorial_State state ) +{ + return m_completedStates[state]; +} + +void FullTutorial::setStateCompleted( eTutorial_State state ) +{ + m_completedStates[state] = true; + Tutorial::setStateCompleted(state); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/FullTutorial.h b/Minecraft.Client/Common/Tutorial/FullTutorial.h new file mode 100644 index 00000000..da2641d2 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/FullTutorial.h @@ -0,0 +1,21 @@ +#pragma once +#include "Tutorial.h" + +#define FULL_TUTORIAL_PROGRESS_2_X_2_Crafting 1 +#define FULL_TUTORIAL_PROGRESS_3_X_3_Crafting 2 +#define FULL_TUTORIAL_PROGRESS_CRAFT_FURNACE 4 +#define FULL_TUTORIAL_PROGRESS_USE_FURNACE 8 +#define EXTENDED_TUTORIAL_PROGRESS_USE_BREWING_STAND 16 + +class FullTutorial : public Tutorial +{ +private: + bool m_isTrial; + char m_progressFlags; + bool m_completedStates[e_Tutorial_State_Max]; +public: + FullTutorial(int iPad, bool isTrial = false); + + virtual bool isStateCompleted( eTutorial_State state ); + virtual void setStateCompleted( eTutorial_State state ); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/FullTutorialActiveTask.cpp b/Minecraft.Client/Common/Tutorial/FullTutorialActiveTask.cpp new file mode 100644 index 00000000..54985d21 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/FullTutorialActiveTask.cpp @@ -0,0 +1,26 @@ +#include "stdafx.h" +#include "Tutorial.h" +#include "FullTutorialActiveTask.h" + +FullTutorialActiveTask::FullTutorialActiveTask(Tutorial *tutorial, eTutorial_CompletionAction completeAction /*= e_Tutorial_Completion_None*/) + : TutorialTask( tutorial, -1, false, NULL, false, false, false ) +{ + m_completeAction = completeAction; +} + +bool FullTutorialActiveTask::isCompleted() +{ + return bHasBeenActivated; +} + +eTutorial_CompletionAction FullTutorialActiveTask::getCompletionAction() +{ + if( tutorial->m_fullTutorialComplete ) + { + return m_completeAction; + } + else + { + return e_Tutorial_Completion_None; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/FullTutorialActiveTask.h b/Minecraft.Client/Common/Tutorial/FullTutorialActiveTask.h new file mode 100644 index 00000000..5aa05610 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/FullTutorialActiveTask.h @@ -0,0 +1,18 @@ +#pragma once +using namespace std; + +#include "TutorialTask.h" + +// Information messages with a choice +class FullTutorialActiveTask : public TutorialTask +{ +private: + eTutorial_CompletionAction m_completeAction; + + bool CompletionMaskIsValid(); +public: + FullTutorialActiveTask(Tutorial *tutorial, eTutorial_CompletionAction completeAction = e_Tutorial_Completion_None); + virtual bool isCompleted(); + virtual eTutorial_CompletionAction getCompletionAction(); + +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/FullTutorialMode.cpp b/Minecraft.Client/Common/Tutorial/FullTutorialMode.cpp new file mode 100644 index 00000000..a5ee85b8 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/FullTutorialMode.cpp @@ -0,0 +1,16 @@ +#include "stdafx.h" +#include "..\..\Minecraft.h" +#include "FullTutorial.h" +#include "FullTutorialMode.h" + +FullTutorialMode::FullTutorialMode(int iPad, Minecraft *minecraft, ClientConnection *connection) + : TutorialMode(iPad, minecraft, connection) +{ + tutorial = new FullTutorial( iPad ); + minecraft->playerStartedTutorial( iPad ); +} + +bool FullTutorialMode::isTutorial() +{ + return !tutorial->m_fullTutorialComplete; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/FullTutorialMode.h b/Minecraft.Client/Common/Tutorial/FullTutorialMode.h new file mode 100644 index 00000000..ce6f1819 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/FullTutorialMode.h @@ -0,0 +1,12 @@ +#pragma once +#include "TutorialMode.h" + +class FullTutorialMode : public TutorialMode +{ +public: + FullTutorialMode(int iPad, Minecraft *minecraft, ClientConnection *connection); + + virtual bool isImplemented() { return true; } + + virtual bool isTutorial(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/InfoTask.cpp b/Minecraft.Client/Common/Tutorial/InfoTask.cpp new file mode 100644 index 00000000..5330841f --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/InfoTask.cpp @@ -0,0 +1,137 @@ +#include "stdafx.h" +#include +#include +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "Tutorial.h" +#include "TutorialConstraints.h" +#include "InfoTask.h" +#include "..\..\..\Minecraft.World\Material.h" + +InfoTask::InfoTask(Tutorial *tutorial, int descriptionId, int promptId /*= -1*/, bool requiresUserInput /*= false*/, + int iMapping /*= 0*/, ETelemetryChallenges telemetryEvent /*= eTelemetryTutorial_NoEvent*/) + : TutorialTask( tutorial, descriptionId, false, NULL, true, false, false ) +{ + if(requiresUserInput == true) + { + constraints.push_back( new InputConstraint( iMapping ) ); + } + completedMappings[iMapping]=false; + + m_promptId = promptId; + tutorial->addMessage( m_promptId ); + + m_eTelemetryEvent = telemetryEvent; +} + +bool InfoTask::isCompleted() +{ + if( bIsCompleted ) + return true; + + if( tutorial->m_hintDisplayed ) + return false; + + if( !bHasBeenActivated || !m_bShownForMinimumTime ) + return false; + + bool bAllComplete = true; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + // If the player is under water then allow all keypresses so they can jump out + if( pMinecraft->localplayers[tutorial->getPad()]->isUnderLiquid(Material::water) ) return false; + + if(ui.GetMenuDisplayed(tutorial->getPad())) + { + // If a menu is displayed, then we use the handleUIInput to complete the task + bAllComplete = true; + for(AUTO_VAR(it, completedMappings.begin()); it != completedMappings.end(); ++it) + { + bool current = (*it).second; + if(!current) + { + bAllComplete = false; + break; + } + } + } + else + { + int iCurrent=0; + + for(AUTO_VAR(it, completedMappings.begin()); it != completedMappings.end(); ++it) + { + bool current = (*it).second; + if(!current) + { + if( InputManager.GetValue(pMinecraft->player->GetXboxPad(), (*it).first) > 0 ) + { + (*it).second = true; + bAllComplete=true; + } + else + { + bAllComplete = false; + } + } + iCurrent++; + } + } + + if(bAllComplete==true) + { + sendTelemetry(); + enableConstraints(false, true); + } + bIsCompleted = bAllComplete; + return bAllComplete; +} + +int InfoTask::getPromptId() +{ + if( m_bShownForMinimumTime ) + return m_promptId; + else + return -1; +} + +void InfoTask::setAsCurrentTask(bool active /*= true*/) +{ + enableConstraints( active ); + TutorialTask::setAsCurrentTask(active); +} + +void InfoTask::handleUIInput(int iAction) +{ + if(bHasBeenActivated) + { + for(AUTO_VAR(it, completedMappings.begin()); it != completedMappings.end(); ++it) + { + if( iAction == (*it).first ) + { + (*it).second = true; + } + } + } +} + + +void InfoTask::sendTelemetry() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if( m_eTelemetryEvent != eTelemetryChallenges_Unknown ) + { + bool firstPlay = true; + // We only store first play for some of the events + switch(m_eTelemetryEvent) + { + case eTelemetryTutorial_Complete: + firstPlay = !tutorial->getCompleted( eTutorial_Telemetry_Complete ); + tutorial->setCompleted( eTutorial_Telemetry_Complete ); + break; + }; + TelemetryManager->RecordEnemyKilledOrOvercome(pMinecraft->player->GetXboxPad(), 0, 0, 0, 0, 0, 0, m_eTelemetryEvent); + } +} diff --git a/Minecraft.Client/Common/Tutorial/InfoTask.h b/Minecraft.Client/Common/Tutorial/InfoTask.h new file mode 100644 index 00000000..e072038b --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/InfoTask.h @@ -0,0 +1,25 @@ +#pragma once +using namespace std; + +#include "TutorialTask.h" + +// Information messages +class InfoTask : public TutorialTask +{ +private: + unordered_map completedMappings; + + ETelemetryChallenges m_eTelemetryEvent; + + bool CompletionMaskIsValid(); +public: + InfoTask(Tutorial *tutorial, int descriptionId, int promptId = -1, bool requiresUserInput = false, int iMapping = 0, ETelemetryChallenges telemetryEvent = eTelemetryChallenges_Unknown); + virtual bool isCompleted(); + virtual int getPromptId(); + virtual void setAsCurrentTask(bool active = true); + virtual void handleUIInput(int iAction); + +private: + void sendTelemetry(); + +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/InputConstraint.cpp b/Minecraft.Client/Common/Tutorial/InputConstraint.cpp new file mode 100644 index 00000000..a26d3eb1 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/InputConstraint.cpp @@ -0,0 +1,18 @@ +#include "stdafx.h" +#include "InputConstraint.h" + +bool InputConstraint::isMappingConstrained(int iPad, int mapping) +{ + // If it's a menu button, then we ignore all inputs + if((m_inputMapping == mapping) || (mapping < ACTION_MAX_MENU)) + { + return true; + } + + // Otherwise see if they map to the same actual button + unsigned char layoutMapping = InputManager.GetJoypadMapVal( iPad ); + + // 4J HEG - Replaced the equivalance test with bitwise AND, important in some mapping configurations + // (e.g. when comparing two action map values and one has extra buttons mapped) + return (InputManager.GetGameJoypadMaps(layoutMapping,m_inputMapping) & InputManager.GetGameJoypadMaps(layoutMapping,mapping)) > 0; +} diff --git a/Minecraft.Client/Common/Tutorial/InputConstraint.h b/Minecraft.Client/Common/Tutorial/InputConstraint.h new file mode 100644 index 00000000..3d6bee61 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/InputConstraint.h @@ -0,0 +1,15 @@ +#pragma once + +#include "TutorialConstraint.h" + +class InputConstraint : public TutorialConstraint +{ +private: + int m_inputMapping; // Should be one of the EControllerActions +public: + virtual ConstraintType getType() { return e_ConstraintInput; } + + InputConstraint(int mapping) : TutorialConstraint(-1), m_inputMapping( mapping ) {} + + virtual bool isMappingConstrained(int iPad, int mapping); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/LookAtEntityHint.cpp b/Minecraft.Client/Common/Tutorial/LookAtEntityHint.cpp new file mode 100644 index 00000000..3b4680ce --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/LookAtEntityHint.cpp @@ -0,0 +1,25 @@ +#include "stdafx.h" +#include "Tutorial.h" +#include "LookAtEntityHint.h" + + +LookAtEntityHint::LookAtEntityHint(eTutorial_Hint id, Tutorial *tutorial, int descriptionId, int titleId, eINSTANCEOF type) + : TutorialHint(id, tutorial, descriptionId, e_Hint_LookAtEntity) +{ + m_type = type; + m_titleId = titleId; +} + +bool LookAtEntityHint::onLookAtEntity(eINSTANCEOF type) +{ + if(m_type == type) + { + // Display hint + Tutorial::PopupMessageDetails *message = new Tutorial::PopupMessageDetails(); + message->m_messageId = m_descriptionId; + message->m_titleId = m_titleId; + message->m_delay = true; + return m_tutorial->setMessage(this, message); + } + return false; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/LookAtEntityHint.h b/Minecraft.Client/Common/Tutorial/LookAtEntityHint.h new file mode 100644 index 00000000..99136691 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/LookAtEntityHint.h @@ -0,0 +1,20 @@ +#pragma once +using namespace std; + +#include "..\..\..\Minecraft.World\Class.h" +#include "TutorialHint.h" + +class ItemInstance; + +class LookAtEntityHint : public TutorialHint +{ +private: + eINSTANCEOF m_type; + int m_titleId; + +public: + LookAtEntityHint(eTutorial_Hint id, Tutorial *tutorial, int descriptionId, int titleId, eINSTANCEOF type); + ~LookAtEntityHint(); + + virtual bool onLookAtEntity(eINSTANCEOF type); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/LookAtTileHint.cpp b/Minecraft.Client/Common/Tutorial/LookAtTileHint.cpp new file mode 100644 index 00000000..0a953a7b --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/LookAtTileHint.cpp @@ -0,0 +1,68 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "Tutorial.h" +#include "LookAtTileHint.h" + + +LookAtTileHint::LookAtTileHint(eTutorial_Hint id, Tutorial *tutorial, int tiles[], unsigned int tilesLength, int iconOverride /*= -1*/, int iData /* = -1 */, int iDataOverride /*= -1*/) + : TutorialHint(id, tutorial, -1, e_Hint_LookAtTile) +{ + m_iTilesCount = tilesLength; + + m_iTiles= new int [m_iTilesCount]; + for(unsigned int i=0;i 0 && id < 256 && (m_iData == -1 || m_iData == iData) ) + { + bool itemFound = false; + for(unsigned int i=0;im_delay = true; + if( m_iconOverride >= 0 ) + { + message->m_icon = m_iconOverride; + } + else if(m_iconOverride == -2) + { + message->m_icon = TUTORIAL_NO_ICON; + } + else + { + message->m_icon = id; + if(m_iDataOverride > -1) + { + message->m_iAuxVal = m_iDataOverride; + } + else + { + message->m_iAuxVal = iData; + } + } + message->m_messageId = Item::items[id]->getUseDescriptionId(); + message->m_titleId = Item::items[id]->getDescriptionId(message->m_iAuxVal); + return m_tutorial->setMessage(this, message); + } + } + return false; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/LookAtTileHint.h b/Minecraft.Client/Common/Tutorial/LookAtTileHint.h new file mode 100644 index 00000000..34ec1b95 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/LookAtTileHint.h @@ -0,0 +1,22 @@ +#pragma once +using namespace std; + +#include "TutorialHint.h" + +class ItemInstance; + +class LookAtTileHint : public TutorialHint +{ +private: + int *m_iTiles; + unsigned int m_iTilesCount; + int m_iconOverride; + int m_iData; + int m_iDataOverride; + +public: + LookAtTileHint(eTutorial_Hint id, Tutorial *tutorial, int tiles[], unsigned int tilesLength, int iconOverride = -1, int iData=-1, int iDataOverride = -1); + ~LookAtTileHint(); + + virtual bool onLookAt(int id, int iData=0); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/PickupTask.cpp b/Minecraft.Client/Common/Tutorial/PickupTask.cpp new file mode 100644 index 00000000..00bc9d1f --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/PickupTask.cpp @@ -0,0 +1,17 @@ +#include "stdafx.h" +#include "PickupTask.h" + +void PickupTask::onTake(shared_ptr item, unsigned int invItemCountAnyAux, unsigned int invItemCountThisAux) +{ + if(item->id == m_itemId) + { + if(m_auxValue == -1 && invItemCountAnyAux >= m_quantity) + { + bIsCompleted = true; + } + else if( m_auxValue == item->getAuxValue() && invItemCountThisAux >= m_quantity) + { + bIsCompleted = true; + } + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/PickupTask.h b/Minecraft.Client/Common/Tutorial/PickupTask.h new file mode 100644 index 00000000..68e1d479 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/PickupTask.h @@ -0,0 +1,26 @@ +#pragma once +using namespace std; +#include "TutorialTask.h" + +class ItemInstance; + +class PickupTask : public TutorialTask +{ +public: + PickupTask( int itemId, unsigned int quantity, int auxValue, + Tutorial *tutorial, int descriptionId, bool enablePreCompletion = true, vector *inConstraints = NULL, + bool bShowMinimumTime=false, bool bAllowFade=true, bool m_bTaskReminders=true ) + : TutorialTask(tutorial, descriptionId, enablePreCompletion, inConstraints, bShowMinimumTime, bAllowFade, m_bTaskReminders ), + m_itemId( itemId), + m_quantity( quantity ), + m_auxValue( auxValue ) + {} + + virtual bool isCompleted() { return bIsCompleted; } + virtual void onTake(shared_ptr item, unsigned int invItemCountAnyAux, unsigned int invItemCountThisAux); + +private: + int m_itemId; + unsigned int m_quantity; + int m_auxValue; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/ProcedureCompoundTask.cpp b/Minecraft.Client/Common/Tutorial/ProcedureCompoundTask.cpp new file mode 100644 index 00000000..8603f765 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/ProcedureCompoundTask.cpp @@ -0,0 +1,263 @@ +#include "stdafx.h" +#include "ProcedureCompoundTask.h" + +ProcedureCompoundTask::~ProcedureCompoundTask() +{ + for(AUTO_VAR(it, m_taskSequence.begin()); it < m_taskSequence.end(); ++it) + { + delete (*it); + } +} + +void ProcedureCompoundTask::AddTask(TutorialTask *task) +{ + if(task != NULL) + { + m_taskSequence.push_back(task); + } +} + +int ProcedureCompoundTask::getDescriptionId() +{ + if(bIsCompleted) + return -1; + + // Return the id of the first task not completed + int descriptionId = -1; + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + if(!task->isCompleted()) + { + task->setAsCurrentTask(true); + descriptionId = task->getDescriptionId(); + break; + } + else if(task->getCompletionAction() == e_Tutorial_Completion_Complete_State) + { + bIsCompleted = true; + break; + } + } + return descriptionId; +} + +int ProcedureCompoundTask::getPromptId() +{ + if(bIsCompleted) + return -1; + + // Return the id of the first task not completed + int promptId = -1; + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + if(!task->isCompleted()) + { + promptId = task->getPromptId(); + break; + } + } + return promptId; +} + +bool ProcedureCompoundTask::isCompleted() +{ + // Return whether all tasks are completed + + bool allCompleted = true; + bool isCurrentTask = true; + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + + if(allCompleted && isCurrentTask) + { + if(task->isCompleted()) + { + if(task->getCompletionAction() == e_Tutorial_Completion_Complete_State) + { + allCompleted = true; + break; + } + } + else + { + task->setAsCurrentTask(true); + allCompleted = false; + isCurrentTask = false; + } + } + else if (!allCompleted) + { + task->setAsCurrentTask(false); + } + } + + if(allCompleted) + { + //Disable all constraints + itEnd = m_taskSequence.end(); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + task->enableConstraints(false); + } + } + bIsCompleted = allCompleted; + return allCompleted; +} + +void ProcedureCompoundTask::onCrafted(shared_ptr item) +{ + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + task->onCrafted(item); + } +} + +void ProcedureCompoundTask::handleUIInput(int iAction) +{ + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + task->handleUIInput(iAction); + } +} + + +void ProcedureCompoundTask::setAsCurrentTask(bool active /*= true*/) +{ + bool allCompleted = true; + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + if(allCompleted && !task->isCompleted()) + { + task->setAsCurrentTask(true); + allCompleted = false; + } + else if (!allCompleted) + { + task->setAsCurrentTask(false); + } + } +} + +bool ProcedureCompoundTask::ShowMinimumTime() +{ + if(bIsCompleted) + return false; + + bool showMinimumTime = false; + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + if(!task->isCompleted()) + { + showMinimumTime = task->ShowMinimumTime(); + break; + } + } + return showMinimumTime; +} + +bool ProcedureCompoundTask::hasBeenActivated() +{ + if(bIsCompleted) + return true; + + bool hasBeenActivated = false; + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + if(!task->isCompleted()) + { + hasBeenActivated = task->hasBeenActivated(); + break; + } + } + return hasBeenActivated; +} + +void ProcedureCompoundTask::setShownForMinimumTime() +{ + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + if(!task->isCompleted()) + { + task->setShownForMinimumTime(); + break; + } + } +} + +bool ProcedureCompoundTask::AllowFade() +{ + if(bIsCompleted) + return true; + + bool allowFade = true; + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + if(!task->isCompleted()) + { + allowFade = task->AllowFade(); + break; + } + } + return allowFade; +} + +void ProcedureCompoundTask::useItemOn(Level *level, shared_ptr item, int x, int y, int z,bool bTestUseOnly) +{ + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + task->useItemOn(level, item, x, y, z, bTestUseOnly); + } +} + +void ProcedureCompoundTask::useItem(shared_ptr item, bool bTestUseOnly) +{ + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + task->useItem(item, bTestUseOnly); + } +} + +void ProcedureCompoundTask::onTake(shared_ptr item, unsigned int invItemCountAnyAux, unsigned int invItemCountThisAux) +{ + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + task->onTake(item, invItemCountAnyAux, invItemCountThisAux); + } +} + +void ProcedureCompoundTask::onStateChange(eTutorial_State newState) +{ + AUTO_VAR(itEnd, m_taskSequence.end()); + for(AUTO_VAR(it, m_taskSequence.begin()); it < itEnd; ++it) + { + TutorialTask *task = *it; + task->onStateChange(newState); + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/ProcedureCompoundTask.h b/Minecraft.Client/Common/Tutorial/ProcedureCompoundTask.h new file mode 100644 index 00000000..36b32798 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/ProcedureCompoundTask.h @@ -0,0 +1,36 @@ +#pragma once + +#include "TutorialTask.h" + +// A tutorial task that requires each of the task to be completed in order until the last one is complete. +// If an earlier task that was complete is now not complete then it's hint should be shown. +class ProcedureCompoundTask : public TutorialTask +{ +public: + ProcedureCompoundTask(Tutorial *tutorial ) + : TutorialTask(tutorial, -1, false, NULL, false, true, false ) + {} + + ~ProcedureCompoundTask(); + + void AddTask(TutorialTask *task); + + virtual int getDescriptionId(); + virtual int getPromptId(); + virtual bool isCompleted(); + virtual void onCrafted(shared_ptr item); + virtual void handleUIInput(int iAction); + virtual void setAsCurrentTask(bool active = true); + virtual bool ShowMinimumTime(); + virtual bool hasBeenActivated(); + virtual void setShownForMinimumTime(); + virtual bool AllowFade(); + + virtual void useItemOn(Level *level, shared_ptr item, int x, int y, int z, bool bTestUseOnly=false); + virtual void useItem(shared_ptr item, bool bTestUseOnly=false); + virtual void onTake(shared_ptr item, unsigned int invItemCountAnyAux, unsigned int invItemCountThisAux); + virtual void onStateChange(eTutorial_State newState); + +private: + vector m_taskSequence; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/ProgressFlagTask.cpp b/Minecraft.Client/Common/Tutorial/ProgressFlagTask.cpp new file mode 100644 index 00000000..ea224ca3 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/ProgressFlagTask.cpp @@ -0,0 +1,17 @@ +#include "stdafx.h" +#include "ProgressFlagTask.h" + +bool ProgressFlagTask::isCompleted() +{ + switch( m_type ) + { + case e_Progress_Set_Flag: + (*flags) |= m_mask; + bIsCompleted = true; + break; + case e_Progress_Flag_On: + bIsCompleted = ((*flags) & m_mask) == m_mask; + break; + } + return bIsCompleted; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/ProgressFlagTask.h b/Minecraft.Client/Common/Tutorial/ProgressFlagTask.h new file mode 100644 index 00000000..b96e1bc0 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/ProgressFlagTask.h @@ -0,0 +1,25 @@ +#pragma once +using namespace std; +#include "Tutorial.h" +#include "TutorialTask.h" + +class ProgressFlagTask : public TutorialTask +{ +public: + enum EProgressFlagType + { + e_Progress_Set_Flag, + e_Progress_Flag_On, + }; +private: + char *flags; // Not a member of this object + char m_mask; + EProgressFlagType m_type; +public: + ProgressFlagTask(char *flags, char mask, EProgressFlagType type, Tutorial *tutorial ) : + TutorialTask(tutorial, -1, false, NULL ), + flags( flags ), m_mask( mask ), m_type( type ) + {} + + virtual bool isCompleted(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/StatTask.cpp b/Minecraft.Client/Common/Tutorial/StatTask.cpp new file mode 100644 index 00000000..5f8b215e --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/StatTask.cpp @@ -0,0 +1,25 @@ +#include "stdafx.h" +#include "..\..\Minecraft.h" +#include "..\..\LocalPlayer.h" +#include "..\..\StatsCounter.h" +#include "..\..\..\Minecraft.World\net.minecraft.stats.h" +#include "StatTask.h" + +StatTask::StatTask(Tutorial *tutorial, int descriptionId, bool enablePreCompletion, Stat *stat, int variance /*= 1*/) + : TutorialTask( tutorial, descriptionId, enablePreCompletion, NULL ) +{ + this->stat = stat; + + Minecraft *minecraft = Minecraft::GetInstance(); + targetValue = minecraft->stats[ProfileManager.GetPrimaryPad()]->getTotalValue( stat ) + variance; +} + +bool StatTask::isCompleted() +{ + if( bIsCompleted ) + return true; + + Minecraft *minecraft = Minecraft::GetInstance(); + bIsCompleted = minecraft->stats[ProfileManager.GetPrimaryPad()]->getTotalValue( stat ) >= (unsigned int)targetValue; + return bIsCompleted; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/StatTask.h b/Minecraft.Client/Common/Tutorial/StatTask.h new file mode 100644 index 00000000..ba38f00a --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/StatTask.h @@ -0,0 +1,18 @@ +#pragma once +using namespace std; + +#include "TutorialTask.h" + +class Stat; + +// 4J Stu - Tutorial tasks that can use the current stat trackin code. This is things like blocks mined/items crafted. +class StatTask : public TutorialTask +{ +private: + Stat *stat; + int targetValue; + +public: + StatTask(Tutorial *tutorial, int descriptionId, bool enablePreCompletion, Stat *stat, int variance = 1); + virtual bool isCompleted(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/StateChangeTask.h b/Minecraft.Client/Common/Tutorial/StateChangeTask.h new file mode 100644 index 00000000..fb9e6396 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/StateChangeTask.h @@ -0,0 +1,27 @@ +#pragma once +using namespace std; +#include "Tutorial.h" +#include "TutorialTask.h" + +class StateChangeTask : public TutorialTask +{ +private: + eTutorial_State m_state; +public: + StateChangeTask(eTutorial_State state, + Tutorial *tutorial, int descriptionId = -1, bool enablePreCompletion = false, vector *inConstraints = NULL, + bool bShowMinimumTime=false, bool bAllowFade=true, bool m_bTaskReminders=true ) : + TutorialTask(tutorial, descriptionId, enablePreCompletion, inConstraints, bShowMinimumTime, bAllowFade, m_bTaskReminders ), + m_state( state ) + {} + + virtual bool isCompleted() { return bIsCompleted; } + + virtual void onStateChange(eTutorial_State newState) + { + if(newState == m_state) + { + bIsCompleted = true; + } + } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TakeItemHint.cpp b/Minecraft.Client/Common/Tutorial/TakeItemHint.cpp new file mode 100644 index 00000000..a1a5c37a --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TakeItemHint.cpp @@ -0,0 +1,45 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "Tutorial.h" +#include "TakeItemHint.h" + + +TakeItemHint::TakeItemHint(eTutorial_Hint id, Tutorial *tutorial, int items[], unsigned int itemsLength) + : TutorialHint(id, tutorial, -1, e_Hint_TakeItem) +{ + m_iItemsCount = itemsLength; + + m_iItems= new int [m_iItemsCount]; + for(unsigned int i=0;i item) +{ + if(item != NULL) + { + bool itemFound = false; + for(unsigned int i=0;iid == m_iItems[i]) + { + itemFound = true; + break; + } + } + if(itemFound) + { + // Display hint + Tutorial::PopupMessageDetails *message = new Tutorial::PopupMessageDetails(); + message->m_messageId = item->getUseDescriptionId(); + message->m_titleId = item->getDescriptionId(); + message->m_icon = item->id; + message->m_delay = true; + return m_tutorial->setMessage(this, message); + } + } + return false; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TakeItemHint.h b/Minecraft.Client/Common/Tutorial/TakeItemHint.h new file mode 100644 index 00000000..f001d4c7 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TakeItemHint.h @@ -0,0 +1,19 @@ +#pragma once +using namespace std; + +#include "TutorialHint.h" + +class ItemInstance; + +class TakeItemHint : public TutorialHint +{ +private: + int *m_iItems; + unsigned int m_iItemsCount; + +public: + TakeItemHint(eTutorial_Hint id, Tutorial *tutorial, int items[], unsigned int itemsLength); + ~TakeItemHint(); + + virtual bool onTake( shared_ptr item ); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/Tutorial b/Minecraft.Client/Common/Tutorial/Tutorial new file mode 100644 index 00000000..db585813 Binary files /dev/null and b/Minecraft.Client/Common/Tutorial/Tutorial differ diff --git a/Minecraft.Client/Common/Tutorial/Tutorial.cpp b/Minecraft.Client/Common/Tutorial/Tutorial.cpp new file mode 100644 index 00000000..b0a0d665 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/Tutorial.cpp @@ -0,0 +1,2160 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\net.minecraft.stats.h" +#include "..\..\LocalPlayer.h" +#include "..\..\..\Minecraft.World\Entity.h" +#include "..\..\..\Minecraft.World\Level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\..\MinecraftServer.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\MultiPlayerLevel.h" +#include "..\..\SurvivalMode.h" +#include "Tutorial.h" +#include "TutorialMessage.h" +#include "TutorialTasks.h" +#include "TutorialConstraints.h" +#include "TutorialHints.h" + +vector Tutorial::s_completableTasks; + + +int Tutorial::m_iTutorialHintDelayTime = 14000; +int Tutorial::m_iTutorialDisplayMessageTime = 7000; +int Tutorial::m_iTutorialMinimumDisplayMessageTime = 2000; +int Tutorial::m_iTutorialExtraReminderTime = 13000; +int Tutorial::m_iTutorialReminderTime = m_iTutorialDisplayMessageTime + m_iTutorialExtraReminderTime; +int Tutorial::m_iTutorialConstraintDelayRemoveTicks = 15; +int Tutorial::m_iTutorialFreezeTimeValue = 8000; + +bool Tutorial::PopupMessageDetails::isSameContent(PopupMessageDetails *other) +{ + if(other == NULL) return false; + + bool textTheSame = (m_messageId == other->m_messageId) && (m_messageString.compare(other->m_messageString) == 0); + bool titleTheSame = (m_titleId == other->m_titleId) && (m_titleString.compare(other->m_titleString) == 0); + bool promptTheSame = (m_promptId == other->m_promptId) && (m_promptString.compare(other->m_promptString) == 0); + return textTheSame && titleTheSame && promptTheSame; +} + +void Tutorial::staticCtor() +{ + // + /* + ***** + ***** + THE ORDERING OF THESE SHOULD NOT CHANGE - Although the ordering may not be totally logical due to the order tasks were added, these map + to bits in the profile data in this order. New tasks/hints should be added at the end. + ***** + ***** + */ + s_completableTasks.push_back( e_Tutorial_State_Inventory_Menu ); + s_completableTasks.push_back( e_Tutorial_State_2x2Crafting_Menu ); + s_completableTasks.push_back( e_Tutorial_State_3x3Crafting_Menu ); + s_completableTasks.push_back( e_Tutorial_State_Furnace_Menu ); + + s_completableTasks.push_back( e_Tutorial_State_Riding_Minecart ); + s_completableTasks.push_back( e_Tutorial_State_Riding_Boat ); + s_completableTasks.push_back( e_Tutorial_State_Fishing ); + s_completableTasks.push_back( e_Tutorial_State_Bed ); + + s_completableTasks.push_back( e_Tutorial_State_Container_Menu ); + s_completableTasks.push_back( e_Tutorial_State_Trap_Menu ); + s_completableTasks.push_back( e_Tutorial_State_Redstone_And_Piston ); + s_completableTasks.push_back( e_Tutorial_State_Portal ); + s_completableTasks.push_back( e_Tutorial_State_Creative_Inventory_Menu ); + s_completableTasks.push_back( e_Tutorial_State_Food_Bar ); + s_completableTasks.push_back( e_Tutorial_State_CreativeMode ); + s_completableTasks.push_back( e_Tutorial_State_Brewing ); + s_completableTasks.push_back( e_Tutorial_State_Brewing_Menu ); + s_completableTasks.push_back( e_Tutorial_State_Enchanting ); + + s_completableTasks.push_back( e_Tutorial_Hint_Hold_To_Mine ); + s_completableTasks.push_back( e_Tutorial_Hint_Tool_Damaged ); + s_completableTasks.push_back( e_Tutorial_Hint_Swim_Up ); + + s_completableTasks.push_back( e_Tutorial_Hint_Unused_2 ); + s_completableTasks.push_back( e_Tutorial_Hint_Unused_3 ); + s_completableTasks.push_back( e_Tutorial_Hint_Unused_4 ); + s_completableTasks.push_back( e_Tutorial_Hint_Unused_5 ); + s_completableTasks.push_back( e_Tutorial_Hint_Unused_6 ); + s_completableTasks.push_back( e_Tutorial_Hint_Unused_7 ); + s_completableTasks.push_back( e_Tutorial_Hint_Unused_8 ); + s_completableTasks.push_back( e_Tutorial_Hint_Unused_9 ); + s_completableTasks.push_back( e_Tutorial_Hint_Unused_10 ); + + s_completableTasks.push_back( e_Tutorial_Hint_Rock ); + s_completableTasks.push_back( e_Tutorial_Hint_Stone ); + s_completableTasks.push_back( e_Tutorial_Hint_Planks ); + s_completableTasks.push_back( e_Tutorial_Hint_Sapling ); + s_completableTasks.push_back( e_Tutorial_Hint_Unbreakable ); + s_completableTasks.push_back( e_Tutorial_Hint_Water ); + s_completableTasks.push_back( e_Tutorial_Hint_Lava ); + s_completableTasks.push_back( e_Tutorial_Hint_Sand ); + s_completableTasks.push_back( e_Tutorial_Hint_Gravel ); + s_completableTasks.push_back( e_Tutorial_Hint_Gold_Ore ); + s_completableTasks.push_back( e_Tutorial_Hint_Iron_Ore ); + s_completableTasks.push_back( e_Tutorial_Hint_Coal_Ore ); + s_completableTasks.push_back( e_Tutorial_Hint_Tree_Trunk ); + s_completableTasks.push_back( e_Tutorial_Hint_Glass ); + s_completableTasks.push_back( e_Tutorial_Hint_Leaves ); + s_completableTasks.push_back( e_Tutorial_Hint_Lapis_Ore ); + s_completableTasks.push_back( e_Tutorial_Hint_Lapis_Block ); + s_completableTasks.push_back( e_Tutorial_Hint_Dispenser ); + s_completableTasks.push_back( e_Tutorial_Hint_Sandstone ); + s_completableTasks.push_back( e_Tutorial_Hint_Note_Block ); + s_completableTasks.push_back( e_Tutorial_Hint_Powered_Rail ); + s_completableTasks.push_back( e_Tutorial_Hint_Detector_Rail ); + s_completableTasks.push_back( e_Tutorial_Hint_Tall_Grass ); + s_completableTasks.push_back( e_Tutorial_Hint_Wool ); + s_completableTasks.push_back( e_Tutorial_Hint_Flower ); + s_completableTasks.push_back( e_Tutorial_Hint_Mushroom ); + s_completableTasks.push_back( e_Tutorial_Hint_Gold_Block ); + s_completableTasks.push_back( e_Tutorial_Hint_Iron_Block ); + s_completableTasks.push_back( e_Tutorial_Hint_Stone_Slab ); + s_completableTasks.push_back( e_Tutorial_Hint_Red_Brick ); + s_completableTasks.push_back( e_Tutorial_Hint_Tnt ); + s_completableTasks.push_back( e_Tutorial_Hint_Bookshelf ); + s_completableTasks.push_back( e_Tutorial_Hint_Moss_Stone ); + s_completableTasks.push_back( e_Tutorial_Hint_Obsidian ); + s_completableTasks.push_back( e_Tutorial_Hint_Torch ); + s_completableTasks.push_back( e_Tutorial_Hint_MobSpawner ); + s_completableTasks.push_back( e_Tutorial_Hint_Chest ); + s_completableTasks.push_back( e_Tutorial_Hint_Redstone ); + s_completableTasks.push_back( e_Tutorial_Hint_Diamond_Ore ); + s_completableTasks.push_back( e_Tutorial_Hint_Diamond_Block ); + s_completableTasks.push_back( e_Tutorial_Hint_Crafting_Table ); + s_completableTasks.push_back( e_Tutorial_Hint_Crops ); + s_completableTasks.push_back( e_Tutorial_Hint_Farmland ); + s_completableTasks.push_back( e_Tutorial_Hint_Furnace ); + s_completableTasks.push_back( e_Tutorial_Hint_Sign ); + s_completableTasks.push_back( e_Tutorial_Hint_Door_Wood ); + s_completableTasks.push_back( e_Tutorial_Hint_Ladder ); + s_completableTasks.push_back( e_Tutorial_Hint_Rail ); + s_completableTasks.push_back( e_Tutorial_Hint_Stairs_Stone ); + s_completableTasks.push_back( e_Tutorial_Hint_Lever ); + s_completableTasks.push_back( e_Tutorial_Hint_PressurePlate ); + s_completableTasks.push_back( e_Tutorial_Hint_Door_Iron ); + s_completableTasks.push_back( e_Tutorial_Hint_Redstone_Ore ); + s_completableTasks.push_back( e_Tutorial_Hint_Redstone_Torch ); + s_completableTasks.push_back( e_Tutorial_Hint_Button ); + s_completableTasks.push_back( e_Tutorial_Hint_Snow ); + s_completableTasks.push_back( e_Tutorial_Hint_Ice ); + s_completableTasks.push_back( e_Tutorial_Hint_Cactus ); + s_completableTasks.push_back( e_Tutorial_Hint_Clay ); + s_completableTasks.push_back( e_Tutorial_Hint_Sugarcane ); + s_completableTasks.push_back( e_Tutorial_Hint_Record_Player ); + s_completableTasks.push_back( e_Tutorial_Hint_Pumpkin ); + s_completableTasks.push_back( e_Tutorial_Hint_Hell_Rock ); + s_completableTasks.push_back( e_Tutorial_Hint_Hell_Sand ); + s_completableTasks.push_back( e_Tutorial_Hint_Glowstone ); + s_completableTasks.push_back( e_Tutorial_Hint_Portal ); + s_completableTasks.push_back( e_Tutorial_Hint_Pumpkin_Lit ); + s_completableTasks.push_back( e_Tutorial_Hint_Cake ); + s_completableTasks.push_back( e_Tutorial_Hint_Redstone_Repeater ); + s_completableTasks.push_back( e_Tutorial_Hint_Trapdoor ); + s_completableTasks.push_back( e_Tutorial_Hint_Piston ); + s_completableTasks.push_back( e_Tutorial_Hint_Sticky_Piston ); + s_completableTasks.push_back( e_Tutorial_Hint_Monster_Stone_Egg ); + s_completableTasks.push_back( e_Tutorial_Hint_Stone_Brick_Smooth ); + s_completableTasks.push_back( e_Tutorial_Hint_Huge_Mushroom ); + s_completableTasks.push_back( e_Tutorial_Hint_Iron_Fence ); + s_completableTasks.push_back( e_Tutorial_Hint_Thin_Glass ); + s_completableTasks.push_back( e_Tutorial_Hint_Melon ); + s_completableTasks.push_back( e_Tutorial_Hint_Vine ); + s_completableTasks.push_back( e_Tutorial_Hint_Fence_Gate ); + s_completableTasks.push_back( e_Tutorial_Hint_Mycel ); + s_completableTasks.push_back( e_Tutorial_Hint_Water_Lily ); + s_completableTasks.push_back( e_Tutorial_Hint_Nether_Brick ); + s_completableTasks.push_back( e_Tutorial_Hint_Nether_Fence ); + s_completableTasks.push_back( e_Tutorial_Hint_Nether_Stalk ); + s_completableTasks.push_back( e_Tutorial_Hint_Enchant_Table ); + s_completableTasks.push_back( e_Tutorial_Hint_Brewing_Stand ); + s_completableTasks.push_back( e_Tutorial_Hint_Cauldron ); + s_completableTasks.push_back( e_Tutorial_Hint_End_Portal ); + s_completableTasks.push_back( e_Tutorial_Hint_End_Portal_Frame ); + + s_completableTasks.push_back( e_Tutorial_Hint_Squid ); + s_completableTasks.push_back( e_Tutorial_Hint_Cow ); + s_completableTasks.push_back( e_Tutorial_Hint_Sheep ); + s_completableTasks.push_back( e_Tutorial_Hint_Chicken ); + s_completableTasks.push_back( e_Tutorial_Hint_Pig ); + s_completableTasks.push_back( e_Tutorial_Hint_Wolf ); + s_completableTasks.push_back( e_Tutorial_Hint_Creeper ); + s_completableTasks.push_back( e_Tutorial_Hint_Skeleton ); + s_completableTasks.push_back( e_Tutorial_Hint_Spider ); + s_completableTasks.push_back( e_Tutorial_Hint_Zombie ); + s_completableTasks.push_back( e_Tutorial_Hint_Pig_Zombie ); + s_completableTasks.push_back( e_Tutorial_Hint_Ghast ); + s_completableTasks.push_back( e_Tutorial_Hint_Slime ); + s_completableTasks.push_back( e_Tutorial_Hint_Enderman ); + s_completableTasks.push_back( e_Tutorial_Hint_Silverfish ); + s_completableTasks.push_back( e_Tutorial_Hint_Cave_Spider ); + s_completableTasks.push_back( e_Tutorial_Hint_MushroomCow ); + s_completableTasks.push_back( e_Tutorial_Hint_SnowMan ); + s_completableTasks.push_back( e_Tutorial_Hint_IronGolem ); + s_completableTasks.push_back( e_Tutorial_Hint_EnderDragon ); + s_completableTasks.push_back( e_Tutorial_Hint_Blaze ); + s_completableTasks.push_back( e_Tutorial_Hint_Lava_Slime ); + + s_completableTasks.push_back( e_Tutorial_Hint_Ozelot ); + s_completableTasks.push_back( e_Tutorial_Hint_Villager ); + + s_completableTasks.push_back( e_Tutorial_Hint_Item_Shovel ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Hatchet ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Pickaxe ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Flint_And_Steel ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Apple ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Bow ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Arrow ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Coal ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Diamond ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Iron_Ingot ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Gold_Ingot ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Sword ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Stick ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Bowl ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Mushroom_Stew ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_String ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Feather ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Sulphur ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Hoe ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Seeds ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Wheat ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Bread ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Helmet ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Chestplate ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Leggings ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Boots ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Flint ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Porkchop_Raw ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Porkchop_Cooked ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Painting ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Apple_Gold ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Sign ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Door_Wood ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Bucket_Empty ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Bucket_Water ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Bucket_Lava ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Minecart ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Saddle ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Door_Iron ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Redstone ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Snowball ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Boat ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Leather ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Milk ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Brick ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Clay ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Reeds ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Paper ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Book ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Slimeball ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Minecart_Chest ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Minecart_Furnace ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Egg ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Compass ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Clock ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Yellow_Dust ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Fish_Raw ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Fish_Cooked ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Dye_Powder ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Bone ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Sugar ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Cake ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Diode ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Cookie ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Map ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Record ); + + s_completableTasks.push_back( e_Tutorial_Hint_White_Stone ); + s_completableTasks.push_back( e_Tutorial_Hint_Dragon_Egg ); + s_completableTasks.push_back( e_Tutorial_Hint_RedstoneLamp ); + s_completableTasks.push_back( e_Tutorial_Hint_Cocoa); + + s_completableTasks.push_back( e_Tutorial_Hint_EmeraldOre ); + s_completableTasks.push_back( e_Tutorial_Hint_EmeraldBlock ); + s_completableTasks.push_back( e_Tutorial_Hint_EnderChest ); + s_completableTasks.push_back( e_Tutorial_Hint_TripwireSource ); + s_completableTasks.push_back( e_Tutorial_Hint_Tripwire ); + s_completableTasks.push_back( e_Tutorial_Hint_CobblestoneWall ); + s_completableTasks.push_back( e_Tutorial_Hint_Flowerpot ); + s_completableTasks.push_back( e_Tutorial_Hint_Anvil ); + s_completableTasks.push_back( e_Tutorial_Hint_QuartzOre ); + s_completableTasks.push_back( e_Tutorial_Hint_QuartzBlock ); + s_completableTasks.push_back( e_Tutorial_Hint_WoolCarpet ); + + s_completableTasks.push_back( e_Tutorial_Hint_Potato ); + s_completableTasks.push_back( e_Tutorial_Hint_Carrot ); + + s_completableTasks.push_back( e_Tutorial_Hint_Item_Unused_18 ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Unused_19 ); + s_completableTasks.push_back( e_Tutorial_Hint_Item_Unused_20 ); + + s_completableTasks.push_back( eTutorial_Telemetry_TrialStart ); + s_completableTasks.push_back( eTutorial_Telemetry_Halfway ); + s_completableTasks.push_back( eTutorial_Telemetry_Complete ); + + s_completableTasks.push_back( eTutorial_Telemetry_Unused_1 ); + s_completableTasks.push_back( eTutorial_Telemetry_Unused_2 ); + s_completableTasks.push_back( eTutorial_Telemetry_Unused_3 ); + s_completableTasks.push_back( eTutorial_Telemetry_Unused_4 ); + s_completableTasks.push_back( eTutorial_Telemetry_Unused_5 ); + s_completableTasks.push_back( eTutorial_Telemetry_Unused_6 ); + s_completableTasks.push_back( eTutorial_Telemetry_Unused_7 ); + s_completableTasks.push_back( eTutorial_Telemetry_Unused_8 ); + s_completableTasks.push_back( eTutorial_Telemetry_Unused_9 ); + s_completableTasks.push_back( eTutorial_Telemetry_Unused_10 ); + + s_completableTasks.push_back( e_Tutorial_State_Enchanting_Menu ); + s_completableTasks.push_back( e_Tutorial_State_Farming ); + s_completableTasks.push_back( e_Tutorial_State_Breeding ); + s_completableTasks.push_back( e_Tutorial_State_Golem ); + s_completableTasks.push_back( e_Tutorial_State_Trading ); + s_completableTasks.push_back( e_Tutorial_State_Trading_Menu ); + s_completableTasks.push_back( e_Tutorial_State_Anvil ); + s_completableTasks.push_back( e_Tutorial_State_Anvil_Menu ); + s_completableTasks.push_back( e_Tutorial_State_Enderchests ); + + s_completableTasks.push_back( e_Tutorial_State_Unused_9 ); + s_completableTasks.push_back( e_Tutorial_State_Unused_10 ); + + if( s_completableTasks.size() > TUTORIAL_PROFILE_STORAGE_BITS ) + { + app.DebugPrintf("Warning: Too many tutorial completable tasks added, not enough bits allocated to stored them in the profile data"); + assert(false); + } +} + +Tutorial::Tutorial(int iPad, bool isFullTutorial /*= false*/) : m_iPad( iPad ) +{ + m_isFullTutorial = isFullTutorial; + m_fullTutorialComplete = false; + m_allTutorialsComplete = false; + hasRequestedUI = false; + uiTempDisabled = false; + m_hintDisplayed = false; + m_freezeTime = false; + m_timeFrozen = false; + m_UIScene = NULL; + m_allowShow = true; + m_bHasTickedOnce = false; + m_firstTickTime = 0; + + m_lastMessage = NULL; + + lastMessageTime = 0; + m_iTaskReminders = 0; + m_lastMessageState = e_Tutorial_State_Gameplay; + + m_CurrentState = e_Tutorial_State_Gameplay; + m_hasStateChanged = false; +#ifdef _XBOX + m_hTutorialScene=NULL; +#endif + + for(unsigned int i = 0; i < e_Tutorial_State_Max; ++i) + { + currentTask[i] = NULL; + currentFailedConstraint[i] = NULL; + } + + // DEFAULT TASKS THAT ALL TUTORIALS SHARE + /* + * + * + * GAMEPLAY + * + */ + + if(!isHintCompleted(e_Tutorial_Hint_Hold_To_Mine)) addHint(e_Tutorial_State_Gameplay, new TutorialHint(e_Tutorial_Hint_Hold_To_Mine, this, IDS_TUTORIAL_HINT_HOLD_TO_MINE, TutorialHint::e_Hint_HoldToMine) ); + if(!isHintCompleted(e_Tutorial_Hint_Tool_Damaged)) addHint(e_Tutorial_State_Gameplay, new TutorialHint(e_Tutorial_Hint_Tool_Damaged, this, IDS_TUTORIAL_HINT_TOOL_DAMAGED, TutorialHint::e_Hint_ToolDamaged) ); + if(!isHintCompleted(e_Tutorial_Hint_Swim_Up)) addHint(e_Tutorial_State_Gameplay, new TutorialHint(e_Tutorial_Hint_Swim_Up, this, IDS_TUTORIAL_HINT_SWIM_UP, TutorialHint::e_Hint_SwimUp) ); + + /* + * TILE HINTS + */ + int rockItems[] = {Tile::rock_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Rock)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Rock, this, rockItems, 1 ) ); + + int stoneItems[] = {Tile::stoneBrick_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Stone)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Stone, this, stoneItems, 1 ) ); + + int plankItems[] = {Tile::wood_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Planks)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Planks, this, plankItems, 1 ) ); + + int saplingItems[] = {Tile::sapling_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Sapling)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Sapling, this, saplingItems, 1 ) ); + + int unbreakableItems[] = {Tile::unbreakable_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Unbreakable)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Unbreakable, this, unbreakableItems, 1 ) ); + + int waterItems[] = {Tile::water_Id, Tile::calmWater_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Water)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Water, this, waterItems, 2 ) ); + + int lavaItems[] = {Tile::lava_Id, Tile::calmLava_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Lava)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Lava, this, lavaItems, 2 ) ); + + int sandItems[] = {Tile::sand_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Sand)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Sand, this, sandItems, 1 ) ); + + int gravelItems[] = {Tile::gravel_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Gravel)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Gravel, this, gravelItems, 1 ) ); + + int goldOreItems[] = {Tile::goldOre_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Gold_Ore)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Gold_Ore, this, goldOreItems, 1 ) ); + + int ironOreItems[] = {Tile::ironOre_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Iron_Ore)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Iron_Ore, this, ironOreItems, 1 ) ); + + int coalOreItems[] = {Tile::coalOre_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Coal_Ore)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Coal_Ore, this, coalOreItems, 1 ) ); + + int treeTrunkItems[] = {Tile::treeTrunk_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Tree_Trunk)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Tree_Trunk, this, treeTrunkItems, 1 ) ); + + int leavesItems[] = {Tile::leaves_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Leaves)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Leaves, this, leavesItems, 1 ) ); + + int glassItems[] = {Tile::glass_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Glass)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Glass, this, glassItems, 1 ) ); + + int lapisOreItems[] = {Tile::lapisOre_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Lapis_Ore)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Lapis_Ore, this, lapisOreItems, 1 ) ); + + int lapisBlockItems[] = {Tile::lapisBlock_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Lapis_Block)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Lapis_Block, this, lapisBlockItems, 1 ) ); + + int dispenserItems[] = {Tile::dispenser_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Dispenser)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Dispenser, this, dispenserItems, 1 ) ); + + int sandstoneItems[] = {Tile::sandStone_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Sandstone)) + { + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Sandstone, this, sandstoneItems, 1, -1, SandStoneTile::TYPE_DEFAULT ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Sandstone, this, sandstoneItems, 1, -1, SandStoneTile::TYPE_HEIROGLYPHS ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Sandstone, this, sandstoneItems, 1, -1, SandStoneTile::TYPE_SMOOTHSIDE ) ); + } + + int noteBlockItems[] = {Tile::musicBlock_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Note_Block)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Note_Block, this, noteBlockItems, 1 ) ); + + int poweredRailItems[] = {Tile::goldenRail_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Powered_Rail)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Powered_Rail, this, poweredRailItems, 1 ) ); + + int detectorRailItems[] = {Tile::detectorRail_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Detector_Rail)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Detector_Rail, this, detectorRailItems, 1 ) ); + + int tallGrassItems[] = {Tile::tallgrass_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Tall_Grass)) + { + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Tall_Grass, this, tallGrassItems, 1, -1, TallGrass::DEAD_SHRUB ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Tall_Grass, this, tallGrassItems, 1, -1, TallGrass::TALL_GRASS ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Tall_Grass, this, tallGrassItems, 1, -1, TallGrass::FERN ) ); + } + + int woolItems[] = {Tile::cloth_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Wool)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Wool, this, woolItems, 1 ) ); + + int flowerItems[] = {Tile::flower_Id, Tile::rose_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Flower)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Flower, this, flowerItems, 2 ) ); + + int mushroomItems[] = {Tile::mushroom1_Id, Tile::mushroom2_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Mushroom)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Mushroom, this, mushroomItems, 2 ) ); + + int goldBlockItems[] = {Tile::goldBlock_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Gold_Block)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Gold_Block, this, goldBlockItems, 1 ) ); + + int ironBlockItems[] = {Tile::ironBlock_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Iron_Block)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Iron_Block, this, ironBlockItems, 1 ) ); + + int stoneSlabItems[] = {Tile::stoneSlabHalf_Id, Tile::stoneSlab_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Stone_Slab)) + { + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Stone_Slab, this, stoneSlabItems, 2, -1, StoneSlabTile::STONE_SLAB ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Stone_Slab, this, stoneSlabItems, 2, -1, StoneSlabTile::SAND_SLAB ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Stone_Slab, this, stoneSlabItems, 2, -1, StoneSlabTile::WOOD_SLAB ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Stone_Slab, this, stoneSlabItems, 2, -1, StoneSlabTile::COBBLESTONE_SLAB ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Stone_Slab, this, stoneSlabItems, 2, -1, StoneSlabTile::BRICK_SLAB ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Stone_Slab, this, stoneSlabItems, 2, -1, StoneSlabTile::SMOOTHBRICK_SLAB ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Stone_Slab, this, stoneSlabItems, 2, -1, StoneSlabTile::NETHERBRICK_SLAB ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Stone_Slab, this, stoneSlabItems, 2, -1, StoneSlabTile::QUARTZ_SLAB ) ); + } + + int woodSlabItems[] = {Tile::woodSlabHalf_Id, Tile::woodSlab_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Stone_Slab)) + { + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Stone_Slab, this, woodSlabItems, 2, -1, TreeTile::BIRCH_TRUNK ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Stone_Slab, this, woodSlabItems, 2, -1, TreeTile::DARK_TRUNK ) ); + } + + int redBrickItems[] = {Tile::redBrick_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Red_Brick)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Red_Brick, this, redBrickItems, 1 ) ); + + int tntItems[] = {Tile::tnt_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Tnt)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Tnt, this, tntItems, 1 ) ); + + int bookshelfItems[] = {Tile::bookshelf_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Bookshelf)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Bookshelf, this, bookshelfItems, 1 ) ); + + int mossStoneItems[] = {Tile::mossStone_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Moss_Stone)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Moss_Stone, this, mossStoneItems, 1 ) ); + + int obsidianItems[] = {Tile::obsidian_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Obsidian)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Obsidian, this, obsidianItems, 1 ) ); + + int torchItems[] = {Tile::torch_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Torch)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Torch, this, torchItems, 1 ) ); + + int mobSpawnerItems[] = {Tile::mobSpawner_Id}; + if(!isHintCompleted(e_Tutorial_Hint_MobSpawner)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_MobSpawner, this, mobSpawnerItems, 1 ) ); + + int chestItems[] = {Tile::chest_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Chest)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Chest, this, chestItems, 1 ) ); + + int redstoneItems[] = {Tile::redStoneDust_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Redstone)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Redstone, this, redstoneItems, 1, Item::redStone_Id ) ); + + int diamondOreItems[] = {Tile::diamondOre_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Diamond_Ore)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Diamond_Ore, this, diamondOreItems, 1 ) ); + + int diamondBlockItems[] = {Tile::diamondBlock_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Diamond_Block)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Diamond_Block, this, diamondBlockItems, 1 ) ); + + int craftingTableItems[] = {Tile::workBench_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Crafting_Table)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Crafting_Table, this, craftingTableItems, 1 ) ); + + int cropsItems[] = {Tile::crops_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Crops)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Crops, this, cropsItems, 1, -1, -1, 7 ) ); + + int farmlandItems[] = {Tile::farmland_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Farmland)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Farmland, this, farmlandItems, 1 ) ); + + int furnaceItems[] = {Tile::furnace_Id, Tile::furnace_lit_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Furnace)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Furnace, this, furnaceItems, 2 ) ); + + int signItems[] = {Tile::sign_Id, Tile::wallSign_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Sign)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Sign, this, signItems, 2, Item::sign_Id ) ); + + int doorWoodItems[] = {Tile::door_wood_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Door_Wood)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Door_Wood, this, doorWoodItems, 1, Item::door_wood->id ) ); + + int ladderItems[] = {Tile::ladder_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Ladder)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Ladder, this, ladderItems, 1 ) ); + + int stairsStoneItems[] = {Tile::stairs_stone_Id,Tile::stairs_bricks_Id,Tile::stairs_stoneBrickSmooth_Id,Tile::stairs_wood_Id,Tile::stairs_sprucewood_Id,Tile::stairs_birchwood_Id,Tile::stairs_netherBricks_Id,Tile::stairs_sandstone_Id,Tile::stairs_quartz_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Stairs_Stone)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Stairs_Stone, this, stairsStoneItems, 9 ) ); + + int railItems[] = {Tile::rail_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Rail)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Rail, this, railItems, 1 ) ); + + int leverItems[] = {Tile::lever_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Lever)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Lever, this, leverItems, 1 ) ); + + int pressurePlateItems[] = {Tile::pressurePlate_stone_Id, Tile::pressurePlate_wood_Id}; + if(!isHintCompleted(e_Tutorial_Hint_PressurePlate)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_PressurePlate, this, pressurePlateItems, 2 ) ); + + int doorIronItems[] = {Tile::door_iron_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Door_Iron)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Door_Iron, this, doorIronItems, 1, Item::door_iron->id ) ); + + int redstoneOreItems[] = {Tile::redStoneOre_Id, Tile::redStoneOre_lit_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Redstone_Ore)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Redstone_Ore, this, redstoneOreItems, 2 ) ); + + int redstoneTorchItems[] = {Tile::notGate_off_Id, Tile::notGate_on_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Redstone_Torch)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Redstone_Torch, this, redstoneTorchItems, 2 ) ); + + int buttonItems[] = {Tile::button_stone_Id, Tile::button_wood_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Button)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Button, this, buttonItems, 2 ) ); + + int snowItems[] = {Tile::snow_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Snow)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Snow, this, snowItems, 1 ) ); + + int iceItems[] = {Tile::ice_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Ice)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Ice, this, iceItems, 1 ) ); + + int cactusItems[] = {Tile::cactus_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Cactus)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Cactus, this, cactusItems, 1 ) ); + + int clayItems[] = {Tile::clay_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Clay)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Clay, this, clayItems, 1 ) ); + + int sugarCaneItems[] = {Tile::reeds_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Sugarcane)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Sugarcane, this, sugarCaneItems, 1 ) ); + + int recordPlayerItems[] = {Tile::recordPlayer_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Record_Player)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Record_Player, this, recordPlayerItems, 1 ) ); + + int pumpkinItems[] = {Tile::pumpkin_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Pumpkin)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Pumpkin, this, pumpkinItems, 1, -1, -1, 0 ) ); + + int hellRockItems[] = {Tile::hellRock_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Hell_Rock)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Hell_Rock, this, hellRockItems, 1 ) ); + + int hellSandItems[] = {Tile::hellSand_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Hell_Sand)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Hell_Sand, this, hellSandItems, 1 ) ); + + int glowstoneItems[] = {Tile::lightGem_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Glowstone)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Glowstone, this, glowstoneItems, 1 ) ); + + int portalItems[] = {Tile::portalTile_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Portal)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Portal, this, portalItems, 1 ) ); + + int pumpkinLitItems[] = {Tile::litPumpkin_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Pumpkin_Lit)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Pumpkin_Lit, this, pumpkinLitItems, 1, -1, -1, 0 ) ); + + int cakeItems[] = {Tile::cake_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Cake)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Cake, this, cakeItems, 1 ) ); + + int redstoneRepeaterItems[] = {Tile::diode_on_Id, Tile::diode_off_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Redstone_Repeater)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Redstone_Repeater, this, redstoneRepeaterItems, 2, Item::diode_Id ) ); + + int trapdoorItems[] = {Tile::trapdoor_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Trapdoor)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Trapdoor, this, trapdoorItems, 1 ) ); + + int pistonItems[] = {Tile::pistonBase_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Piston)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Piston, this, pistonItems, 1 ) ); + + int stickyPistonItems[] = {Tile::pistonStickyBase_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Sticky_Piston)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Sticky_Piston, this, stickyPistonItems, 1 ) ); + + int monsterStoneEggItems[] = {Tile::monsterStoneEgg_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Monster_Stone_Egg)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Monster_Stone_Egg, this, monsterStoneEggItems, 1 ) ); + + int stoneBrickSmoothItems[] = {Tile::stoneBrickSmooth_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Stone_Brick_Smooth)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Stone_Brick_Smooth, this, stoneBrickSmoothItems, 1 ) ); + + int hugeMushroomItems[] = {Tile::hugeMushroom1_Id,Tile::hugeMushroom2_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Huge_Mushroom)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Huge_Mushroom, this, hugeMushroomItems, 2 ) ); + + int ironFenceItems[] = {Tile::ironFence_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Iron_Fence)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Iron_Fence, this, ironFenceItems, 1 ) ); + + int thisGlassItems[] = {Tile::thinGlass_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Thin_Glass)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Thin_Glass, this, thisGlassItems, 1 ) ); + + int melonItems[] = {Tile::melon_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Melon)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Melon, this, melonItems, 1 ) ); + + int vineItems[] = {Tile::vine_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Vine)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Vine, this, vineItems, 1 ) ); + + int fenceGateItems[] = {Tile::fenceGate_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Fence_Gate)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Fence_Gate, this, fenceGateItems, 1 ) ); + + int mycelItems[] = {Tile::mycel_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Mycel)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Mycel, this, mycelItems, 1 ) ); + + int waterLilyItems[] = {Tile::waterLily_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Water_Lily)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Water_Lily, this, waterLilyItems, 1 ) ); + + int netherBrickItems[] = {Tile::netherBrick_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Nether_Brick)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Nether_Brick, this, netherBrickItems, 1 ) ); + + int netherFenceItems[] = {Tile::netherFence_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Nether_Fence)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Nether_Fence, this, netherFenceItems, 1 ) ); + + int netherStalkItems[] = {Tile::netherStalk_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Nether_Stalk)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Nether_Stalk, this, netherStalkItems, 1 ) ); + + int enchantTableItems[] = {Tile::enchantTable_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Enchant_Table)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Enchant_Table, this, enchantTableItems, 1 ) ); + + int brewingStandItems[] = {Tile::brewingStand_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Brewing_Stand)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Brewing_Stand, this, brewingStandItems, 1, Item::brewingStand_Id ) ); + + int cauldronItems[] = {Tile::cauldron_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Cauldron)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Cauldron, this, cauldronItems, 1, Item::cauldron_Id ) ); + + int endPortalItems[] = {Tile::endPortalTile_Id}; + if(!isHintCompleted(e_Tutorial_Hint_End_Portal)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_End_Portal, this, endPortalItems, 1, -2 ) ); + + int endPortalFrameItems[] = {Tile::endPortalFrameTile_Id}; + if(!isHintCompleted(e_Tutorial_Hint_End_Portal_Frame)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_End_Portal_Frame, this, endPortalFrameItems, 1 ) ); + + int whiteStoneItems[] = {Tile::whiteStone_Id}; + if(!isHintCompleted(e_Tutorial_Hint_White_Stone)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_White_Stone, this, whiteStoneItems, 1 ) ); + + int dragonEggItems[] = {Tile::dragonEgg_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Dragon_Egg)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Dragon_Egg, this, dragonEggItems, 1 ) ); + + int redstoneLampItems[] = {Tile::redstoneLight_Id, Tile::redstoneLight_lit_Id}; + if(!isHintCompleted(e_Tutorial_Hint_RedstoneLamp)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_RedstoneLamp, this, redstoneLampItems, 2 ) ); + + int cocoaItems[] = {Tile::cocoa_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Cocoa)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Cocoa, this, cocoaItems, 1 ) ); + + int emeraldOreItems[] = {Tile::emeraldOre_Id}; + if(!isHintCompleted(e_Tutorial_Hint_EmeraldOre)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_EmeraldOre, this, emeraldOreItems, 1 ) ); + + int emeraldBlockItems[] = {Tile::emeraldBlock_Id}; + if(!isHintCompleted(e_Tutorial_Hint_EmeraldBlock)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_EmeraldBlock, this, emeraldBlockItems, 1 ) ); + + int enderChestItems[] = {Tile::enderChest_Id}; + if(!isHintCompleted(e_Tutorial_Hint_EnderChest)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_EnderChest, this, enderChestItems, 1 ) ); + + int tripwireSourceItems[] = {Tile::tripWireSource_Id}; + if(!isHintCompleted(e_Tutorial_Hint_TripwireSource)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_TripwireSource, this, tripwireSourceItems, 1 ) ); + + int tripwireItems[] = {Tile::tripWire_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Tripwire)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Tripwire, this, tripwireItems, 1, Item::string_Id ) ); + + int cobblestoneWallItems[] = {Tile::cobbleWall_Id}; + if(!isHintCompleted(e_Tutorial_Hint_CobblestoneWall)) + { + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_CobblestoneWall, this, cobblestoneWallItems, 1, -1, WallTile::TYPE_NORMAL ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_CobblestoneWall, this, cobblestoneWallItems, 1, -1, WallTile::TYPE_MOSSY ) ); + } + + int flowerpotItems[] = {Tile::flowerPot_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Flowerpot)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Flowerpot, this, flowerpotItems, 1, Item::flowerPot_Id ) ); + + int anvilItems[] = {Tile::anvil_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Anvil)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Anvil, this, anvilItems, 1 ) ); + + int quartzOreItems[] = {Tile::netherQuartz_Id}; + if(!isHintCompleted(e_Tutorial_Hint_QuartzOre)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_QuartzOre, this, quartzOreItems, 1 ) ); + + int quartzBlockItems[] = {Tile::quartzBlock_Id}; + if(!isHintCompleted(e_Tutorial_Hint_QuartzBlock)) + { + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_QuartzBlock, this, quartzBlockItems, 1, -1, QuartzBlockTile::TYPE_DEFAULT ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_QuartzBlock, this, quartzBlockItems, 1, -1, QuartzBlockTile::TYPE_CHISELED ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_QuartzBlock, this, quartzBlockItems, 1, -1, QuartzBlockTile::TYPE_LINES_Y ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_QuartzBlock, this, quartzBlockItems, 1, -1, QuartzBlockTile::TYPE_LINES_X ) ); + addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_QuartzBlock, this, quartzBlockItems, 1, -1, QuartzBlockTile::TYPE_LINES_Z ) ); + } + + int carpetItems[] = {Tile::woolCarpet_Id}; + if(!isHintCompleted(e_Tutorial_Hint_WoolCarpet)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_WoolCarpet, this, carpetItems, 1 ) ); + + int potatoItems[] = {Tile::potatoes_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Potato)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Potato, this, potatoItems, 1, -1, -1, 7 ) ); + + int carrotItems[] = {Tile::carrots_Id}; + if(!isHintCompleted(e_Tutorial_Hint_Carrot)) addHint(e_Tutorial_State_Gameplay, new LookAtTileHint(e_Tutorial_Hint_Carrot, this, carrotItems, 1, -1, -1, 7 ) ); + + /* + * ENTITY HINTS + */ + if(!isHintCompleted(e_Tutorial_Hint_Squid)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Squid, this, IDS_DESC_SQUID, IDS_SQUID, eTYPE_SQUID ) ); + if(!isHintCompleted(e_Tutorial_Hint_Cow)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Cow, this, IDS_DESC_COW, IDS_COW, eTYPE_COW ) ); + if(!isHintCompleted(e_Tutorial_Hint_Sheep)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Sheep, this, IDS_DESC_SHEEP, IDS_SHEEP, eTYPE_SHEEP ) ); + if(!isHintCompleted(e_Tutorial_Hint_Chicken)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Chicken, this, IDS_DESC_CHICKEN, IDS_CHICKEN, eTYPE_CHICKEN ) ); + if(!isHintCompleted(e_Tutorial_Hint_Pig)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Pig, this, IDS_DESC_PIG, IDS_PIG, eTYPE_PIG ) ); + if(!isHintCompleted(e_Tutorial_Hint_Wolf)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Wolf, this, IDS_DESC_WOLF, IDS_WOLF, eTYPE_WOLF ) ); + if(!isHintCompleted(e_Tutorial_Hint_Creeper)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Creeper, this, IDS_DESC_CREEPER, IDS_CREEPER, eTYPE_CREEPER ) ); + if(!isHintCompleted(e_Tutorial_Hint_Skeleton)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Skeleton, this, IDS_DESC_SKELETON, IDS_SKELETON, eTYPE_SKELETON ) ); + if(!isHintCompleted(e_Tutorial_Hint_Spider)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Spider, this, IDS_DESC_SPIDER, IDS_SPIDER, eTYPE_SPIDER ) ); + if(!isHintCompleted(e_Tutorial_Hint_Zombie)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Zombie, this, IDS_DESC_ZOMBIE, IDS_ZOMBIE, eTYPE_ZOMBIE ) ); + if(!isHintCompleted(e_Tutorial_Hint_Pig_Zombie)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Pig_Zombie, this, IDS_DESC_PIGZOMBIE, IDS_PIGZOMBIE, eTYPE_PIGZOMBIE ) ); + if(!isHintCompleted(e_Tutorial_Hint_Ghast)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Ghast, this, IDS_DESC_GHAST, IDS_GHAST, eTYPE_GHAST ) ); + if(!isHintCompleted(e_Tutorial_Hint_Slime)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Slime, this, IDS_DESC_SLIME, IDS_SLIME, eTYPE_SLIME ) ); + if(!isHintCompleted(e_Tutorial_Hint_Enderman)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Enderman, this, IDS_DESC_ENDERMAN, IDS_ENDERMAN, eTYPE_ENDERMAN ) ); + if(!isHintCompleted(e_Tutorial_Hint_Silverfish)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Silverfish, this, IDS_DESC_SILVERFISH, IDS_SILVERFISH, eTYPE_SILVERFISH ) ); + if(!isHintCompleted(e_Tutorial_Hint_Cave_Spider)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Cave_Spider, this, IDS_DESC_CAVE_SPIDER, IDS_CAVE_SPIDER, eTYPE_CAVESPIDER ) ); + if(!isHintCompleted(e_Tutorial_Hint_MushroomCow)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_MushroomCow, this, IDS_DESC_MUSHROOM_COW, IDS_MUSHROOM_COW, eTYPE_MUSHROOMCOW) ); + if(!isHintCompleted(e_Tutorial_Hint_SnowMan)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_SnowMan, this, IDS_DESC_SNOWMAN, IDS_SNOWMAN, eTYPE_SNOWMAN ) ); + if(!isHintCompleted(e_Tutorial_Hint_IronGolem)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_IronGolem, this, IDS_DESC_IRONGOLEM, IDS_IRONGOLEM, eTYPE_VILLAGERGOLEM ) ); + if(!isHintCompleted(e_Tutorial_Hint_EnderDragon)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_EnderDragon, this, IDS_DESC_ENDERDRAGON, IDS_ENDERDRAGON, eTYPE_ENDERDRAGON ) ); + if(!isHintCompleted(e_Tutorial_Hint_Blaze)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Blaze, this, IDS_DESC_BLAZE, IDS_BLAZE, eTYPE_BLAZE ) ); + if(!isHintCompleted(e_Tutorial_Hint_Lava_Slime)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Lava_Slime, this, IDS_DESC_LAVA_SLIME, IDS_LAVA_SLIME, eTYPE_LAVASLIME ) ); + if(!isHintCompleted(e_Tutorial_Hint_Ozelot)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Ozelot, this, IDS_DESC_OZELOT, IDS_OZELOT, eTYPE_OZELOT ) ); + if(!isHintCompleted(e_Tutorial_Hint_Villager)) addHint(e_Tutorial_State_Gameplay, new LookAtEntityHint(e_Tutorial_Hint_Villager, this, IDS_DESC_VILLAGER, IDS_VILLAGER, eTYPE_VILLAGER) ); + + + /* + * ITEM HINTS + */ + int shovelItems[] = {Item::shovel_wood->id, Item::shovel_stone->id, Item::shovel_iron->id, Item::shovel_gold->id, Item::shovel_diamond->id}; + if(!isHintCompleted(e_Tutorial_Hint_Item_Shovel)) addHint(e_Tutorial_State_Gameplay, new DiggerItemHint(e_Tutorial_Hint_Item_Shovel, this, IDS_TUTORIAL_HINT_DIGGER_ITEM_SHOVEL, shovelItems, 5) ); + + int hatchetItems[] = {Item::hatchet_wood->id, Item::hatchet_stone->id, Item::hatchet_iron->id, Item::hatchet_gold->id, Item::hatchet_diamond->id}; + if(!isHintCompleted(e_Tutorial_Hint_Item_Hatchet)) addHint(e_Tutorial_State_Gameplay, new DiggerItemHint(e_Tutorial_Hint_Item_Hatchet, this, IDS_TUTORIAL_HINT_DIGGER_ITEM_HATCHET, hatchetItems, 5 ) ); + + int pickaxeItems[] = {Item::pickAxe_wood->id, Item::pickAxe_stone->id, Item::pickAxe_iron->id, Item::pickAxe_gold->id, Item::pickAxe_diamond->id}; + if(!isHintCompleted(e_Tutorial_Hint_Item_Pickaxe)) addHint(e_Tutorial_State_Gameplay, new DiggerItemHint(e_Tutorial_Hint_Item_Pickaxe, this, IDS_TUTORIAL_HINT_DIGGER_ITEM_PICKAXE, pickaxeItems, 5 ) ); + + /* + * + * + * INVENTORY + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Inventory_Menu) ) + { + ProcedureCompoundTask *inventoryOverviewTask = new ProcedureCompoundTask( this ); + inventoryOverviewTask->AddTask( new ChoiceTask(this, IDS_TUTORIAL_TASK_INV_OVERVIEW, IDS_TUTORIAL_PROMPT_INV_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State, eTelemetryTutorial_Inventory) ); + inventoryOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_INV_PICK_UP, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + inventoryOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_INV_MOVE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + inventoryOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_INV_DROP, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + inventoryOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_INV_INFO, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Inventory_Menu, inventoryOverviewTask ); + } + + /* + * + * + * CREATIVE INVENTORY + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Creative_Inventory_Menu) ) + { + ProcedureCompoundTask *creativeInventoryOverviewTask = new ProcedureCompoundTask( this ); + creativeInventoryOverviewTask->AddTask( new ChoiceTask(this, IDS_TUTORIAL_TASK_CREATIVE_INV_OVERVIEW, IDS_TUTORIAL_PROMPT_CREATIVE_INV_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State, eTelemetryTutorial_CreativeInventory) ); + creativeInventoryOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_CREATIVE_INV_PICK_UP, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + creativeInventoryOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_CREATIVE_INV_MOVE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + creativeInventoryOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_CREATIVE_INV_DROP, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + creativeInventoryOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_CREATIVE_INV_NAV, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + creativeInventoryOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_CREATIVE_INV_INFO, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Creative_Inventory_Menu, creativeInventoryOverviewTask ); + } + + /* + * + * + * CRAFTING + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_2x2Crafting_Menu ) ) + { + ProcedureCompoundTask *craftingOverviewTask = new ProcedureCompoundTask( this ); + craftingOverviewTask->AddTask( new ChoiceTask(this, IDS_TUTORIAL_TASK_CRAFT_OVERVIEW, IDS_TUTORIAL_PROMPT_CRAFT_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State, eTelemetryTutorial_Crafting) ); + craftingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_CRAFT_NAV, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + craftingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_CRAFT_CREATE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + craftingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_CRAFT_CRAFT_TABLE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + craftingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_CRAFT_INVENTORY, IDS_TUTORIAL_PROMPT_PRESS_X_TO_TOGGLE_DESCRIPTION, false, ACTION_MENU_X) ); + craftingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_CRAFT_DESCRIPTION, IDS_TUTORIAL_PROMPT_PRESS_X_TO_TOGGLE_INGREDIENTS, false, ACTION_MENU_X) ); + craftingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_CRAFT_INGREDIENTS, IDS_TUTORIAL_PROMPT_PRESS_X_TO_TOGGLE_INVENTORY, false, ACTION_MENU_X) ); + addTask(e_Tutorial_State_2x2Crafting_Menu, craftingOverviewTask ); + } + // Other tasks can be added in the derived classes + + addHint(e_Tutorial_State_2x2Crafting_Menu, new TutorialHint(e_Tutorial_Hint_Always_On, this, IDS_TUTORIAL_HINT_CRAFT_NO_INGREDIENTS, TutorialHint::e_Hint_NoIngredients) ); + + addHint(e_Tutorial_State_3x3Crafting_Menu, new TutorialHint(e_Tutorial_Hint_Always_On, this, IDS_TUTORIAL_HINT_CRAFT_NO_INGREDIENTS, TutorialHint::e_Hint_NoIngredients) ); + + /* + * + * + * FURNACE + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Furnace_Menu ) ) + { + ProcedureCompoundTask *furnaceOverviewTask = new ProcedureCompoundTask( this ); + furnaceOverviewTask->AddTask( new ChoiceTask(this, IDS_TUTORIAL_TASK_FURNACE_OVERVIEW, IDS_TUTORIAL_PROMPT_FURNACE_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State, eTelemetryTutorial_Furnace) ); + furnaceOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_FURNACE_METHOD, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + furnaceOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_FURNACE_FUELS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + furnaceOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_FURNACE_INGREDIENTS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Furnace_Menu, furnaceOverviewTask ); + } + // Other tasks can be added in the derived classes + + /* + * + * + * BREWING MENU + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Brewing_Menu ) ) + { + ProcedureCompoundTask *brewingOverviewTask = new ProcedureCompoundTask( this ); + brewingOverviewTask->AddTask( new ChoiceTask(this, IDS_TUTORIAL_TASK_BREWING_MENU_OVERVIEW, IDS_TUTORIAL_PROMPT_BREWING_MENU_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State, eTelemetryTutorial_BrewingMenu) ); + brewingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_BREWING_MENU_METHOD, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + brewingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_BREWING_MENU_BASIC_INGREDIENTS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + brewingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_BREWING_MENU_EXTENDED_INGREDIENTS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + brewingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_BREWING_MENU_EXTENDED_INGREDIENTS_2, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Brewing_Menu, brewingOverviewTask ); + } + // Other tasks can be added in the derived classes + + /* + * + * + * ENCHANTING MENU + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Enchanting_Menu ) ) + { + ProcedureCompoundTask *enchantingOverviewTask = new ProcedureCompoundTask( this ); + enchantingOverviewTask->AddTask( new ChoiceTask(this, IDS_TUTORIAL_TASK_ENCHANTING_MENU_OVERVIEW, IDS_TUTORIAL_PROMPT_ENCHANTING_MENU_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State, eTelemetryTutorial_EnchantingMenu) ); + enchantingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_ENCHANTING_MENU_START, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + enchantingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_ENCHANTING_MENU_ENCHANTMENTS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + enchantingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_ENCHANTING_MENU_COST, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + enchantingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_ENCHANTING_MENU_ENCHANT, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + enchantingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_ENCHANTING_MENU_BETTER_ENCHANTMENTS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Enchanting_Menu, enchantingOverviewTask ); + } + // Other tasks can be added in the derived classes + + /* + * + * + * ANVIL MENU + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Anvil_Menu ) ) + { + ProcedureCompoundTask *anvilOverviewTask = new ProcedureCompoundTask( this ); + anvilOverviewTask->AddTask( new ChoiceTask(this, IDS_TUTORIAL_TASK_ANVIL_MENU_OVERVIEW, IDS_TUTORIAL_PROMPT_ANVIL_MENU_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State, eTelemetryTutorial_AnvilMenu) ); + anvilOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_ANVIL_MENU_START, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + anvilOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_ANVIL_MENU_REPAIR, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + anvilOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_ANVIL_MENU_SACRIFICE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + anvilOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_ANVIL_MENU_ENCHANT, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + anvilOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_ANVIL_MENU_COST, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + anvilOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_ANVIL_MENU_RENAMING, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + anvilOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_ANVIL_MENU_SMITH, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Anvil_Menu, anvilOverviewTask ); + } + // Other tasks can be added in the derived classes + + /* + * + * + * TRADING MENU + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Trading_Menu ) ) + { + ProcedureCompoundTask *tradingOverviewTask = new ProcedureCompoundTask( this ); + tradingOverviewTask->AddTask( new ChoiceTask(this, IDS_TUTORIAL_TASK_TRADING_MENU_OVERVIEW, IDS_TUTORIAL_PROMPT_TRADING_MENU_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State, eTelemetryTutorial_TradingMenu) ); + tradingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_TRADING_MENU_START, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + tradingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_TRADING_MENU_UNAVAILABLE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + tradingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_TRADING_MENU_DETAILS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + tradingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_TRADING_MENU_INVENTORY, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + tradingOverviewTask->AddTask( new InfoTask(this, IDS_TUTORIAL_TASK_TRADING_MENU_TRADE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Trading_Menu, tradingOverviewTask ); + } + // Other tasks can be added in the derived classes + + /* + * + * + * MINECART + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Riding_Minecart ) ) + { + addTask(e_Tutorial_State_Riding_Minecart, new ChoiceTask(this, IDS_TUTORIAL_TASK_MINECART_OVERVIEW, IDS_TUTORIAL_PROMPT_MINECART_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Minecart) ); + addTask(e_Tutorial_State_Riding_Minecart, new InfoTask(this, IDS_TUTORIAL_TASK_MINECART_RAILS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Riding_Minecart, new InfoTask(this, IDS_TUTORIAL_TASK_MINECART_POWERED_RAILS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Riding_Minecart, new InfoTask(this, IDS_TUTORIAL_TASK_MINECART_PUSHING, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + + /* + * + * + * BOAT + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Riding_Boat ) ) + { + addTask(e_Tutorial_State_Riding_Boat, new ChoiceTask(this, IDS_TUTORIAL_TASK_BOAT_OVERVIEW, IDS_TUTORIAL_PROMPT_BOAT_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Boat) ); + addTask(e_Tutorial_State_Riding_Boat, new InfoTask(this, IDS_TUTORIAL_TASK_BOAT_STEER, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + + /* + * + * + * FISHING + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Fishing ) ) + { + addTask(e_Tutorial_State_Fishing, new ChoiceTask(this, IDS_TUTORIAL_TASK_FISHING_OVERVIEW, IDS_TUTORIAL_PROMPT_FISHING_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Fishing) ); + addTask(e_Tutorial_State_Fishing, new InfoTask(this, IDS_TUTORIAL_TASK_FISHING_CAST, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Fishing, new InfoTask(this, IDS_TUTORIAL_TASK_FISHING_FISH, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Fishing, new InfoTask(this, IDS_TUTORIAL_TASK_FISHING_USES, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + + /* + * + * + * BED + * + */ + if(isFullTutorial || !isStateCompleted( e_Tutorial_State_Bed ) ) + { + addTask(e_Tutorial_State_Bed, new ChoiceTask(this, IDS_TUTORIAL_TASK_BED_OVERVIEW, IDS_TUTORIAL_PROMPT_BED_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Bed) ); + addTask(e_Tutorial_State_Bed, new InfoTask(this, IDS_TUTORIAL_TASK_BED_PLACEMENT, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Bed, new InfoTask(this, IDS_TUTORIAL_TASK_BED_MULTIPLAYER, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + + /* + * + * + * FOOD BAR + * + */ + if(!isFullTutorial && !isStateCompleted( e_Tutorial_State_Food_Bar ) ) + { + addTask(e_Tutorial_State_Food_Bar, new ChoiceTask(this, IDS_TUTORIAL_TASK_FOOD_BAR_OVERVIEW, IDS_TUTORIAL_PROMPT_FOOD_BAR_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_FoodBar) ); + addTask(e_Tutorial_State_Food_Bar, new InfoTask(this, IDS_TUTORIAL_TASK_FOOD_BAR_DEPLETE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Food_Bar, new InfoTask(this, IDS_TUTORIAL_TASK_FOOD_BAR_HEAL, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Food_Bar, new InfoTask(this, IDS_TUTORIAL_TASK_FOOD_BAR_FEED, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } +} + +Tutorial::~Tutorial() +{ + for(AUTO_VAR(it, m_globalConstraints.begin()); it != m_globalConstraints.end(); ++it) + { + delete (*it); + } + for(unordered_map::iterator it = messages.begin(); it != messages.end(); ++it) + { + delete (*it).second; + } + for(unsigned int i = 0; i < e_Tutorial_State_Max; ++i) + { + for(AUTO_VAR(it, activeTasks[i].begin()); it < activeTasks[i].end(); ++it) + { + delete (*it); + } + for(AUTO_VAR(it, hints[i].begin()); it < hints[i].end(); ++it) + { + delete (*it); + } + + currentTask[i] = NULL; + currentFailedConstraint[i] = NULL; + } +} + +void Tutorial::debugResetPlayerSavedProgress(int iPad) +{ +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) + GAME_SETTINGS *pGameSettings = (GAME_SETTINGS *)StorageManager.GetGameDefinedProfileData(iPad); +#else + GAME_SETTINGS *pGameSettings = (GAME_SETTINGS *)ProfileManager.GetGameDefinedProfileData(iPad); +#endif + ZeroMemory( pGameSettings->ucTutorialCompletion, TUTORIAL_PROFILE_STORAGE_BYTES ); + pGameSettings->uiSpecialTutorialBitmask = 0; +} + +void Tutorial::setCompleted( int completableId ) +{ + //if(app.GetGameSettingsDebugMask(m_iPad) && app.GetGameSettingsDebugMask()&(1L<= 0 && completableIndex < TUTORIAL_PROFILE_STORAGE_BITS ) + { + // Set the bit for this position +#if (defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) + GAME_SETTINGS *pGameSettings = (GAME_SETTINGS *)StorageManager.GetGameDefinedProfileData(m_iPad); +#else + GAME_SETTINGS *pGameSettings = (GAME_SETTINGS *)ProfileManager.GetGameDefinedProfileData(m_iPad); +#endif + int arrayIndex = completableIndex >> 3; + int bitIndex = 7 - (completableIndex % 8); + pGameSettings->ucTutorialCompletion[arrayIndex] |= 1<bSettingsChanged=true; + } +} + +bool Tutorial::getCompleted( int completableId ) +{ + //if(app.GetGameSettingsDebugMask(m_iPad) && app.GetGameSettingsDebugMask()&(1L<= 0 && completableIndex < TUTORIAL_PROFILE_STORAGE_BITS ) + { + // Read the bit for this position + //Retrieve the data pointer from the profile +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) + GAME_SETTINGS *pGameSettings = (GAME_SETTINGS *)StorageManager.GetGameDefinedProfileData(m_iPad); +#else + GAME_SETTINGS *pGameSettings = (GAME_SETTINGS *)ProfileManager.GetGameDefinedProfileData(m_iPad); +#endif + int arrayIndex = completableIndex >> 3; + int bitIndex = 7 - (completableIndex % 8); + return (pGameSettings->ucTutorialCompletion[arrayIndex] & 1<getId(); + + if( hintId != e_Tutorial_Hint_Always_On ) + { + setHintCompleted( hint->getId() ); + hints[m_CurrentState].erase( find(hints[m_CurrentState].begin(), hints[m_CurrentState].end(), hint) ); + delete hint; + } + // else + // { + // find(hints[m_CurrentState].begin(), hints[m_CurrentState].end(), hint); + // } +} + +void Tutorial::tick() +{ + // Don't do anything for the first 2 seconds so that the loading screen is gone + if(!m_bHasTickedOnce) + { + int time = GetTickCount(); + if(m_firstTickTime == 0) + { + m_firstTickTime = time; + } + else if ( time - m_firstTickTime > 1500 ) + { + m_bHasTickedOnce = true; + } + } + if(!m_bHasTickedOnce) + { + return; + } + + bool constraintChanged = false; + bool taskChanged = false; + + for(unsigned int state = 0; state < e_Tutorial_State_Max; ++state) + { + AUTO_VAR(it, constraintsToRemove[state].begin()); + while(it < constraintsToRemove[state].end() ) + { + ++(*it).second; + if( (*it).second > m_iTutorialConstraintDelayRemoveTicks ) + { + TutorialConstraint *c = (*it).first; + constraints[state].erase( find( constraints[state].begin(), constraints[state].end(), c) ); + c->setQueuedForRemoval(false); + it = constraintsToRemove[state].erase( it ); + + if( c->getDeleteOnDeactivate() ) + { + delete c; + } + } + else + { + ++it; + } + } + } + + // 4J Stu TODO - Make this a constraint + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(m_freezeTime && !m_timeFrozen && !m_fullTutorialComplete ) + { + // Need to set the time on both levels to stop the flickering as the local level + // tries to predict the time + MinecraftServer::SetTimeOfDay(m_iTutorialFreezeTimeValue); + pMinecraft->level->setOverrideTimeOfDay(m_iTutorialFreezeTimeValue); // Always daytime + m_timeFrozen = true; + } + else if(m_freezeTime && m_timeFrozen && m_fullTutorialComplete) + { + __int64 currentTime = pMinecraft->level->getTime(); + int currentDayTime = (currentTime % Level::TICKS_PER_DAY); + int timeToAdd = 0; + if(currentDayTime > m_iTutorialFreezeTimeValue) + { + timeToAdd = (Level::TICKS_PER_DAY - currentDayTime) + m_iTutorialFreezeTimeValue; + } + else + { + timeToAdd = m_iTutorialFreezeTimeValue - currentDayTime; + } + __int64 targetTime = currentTime + timeToAdd; + MinecraftServer::SetTimeOfDay(-1); + MinecraftServer::SetTime(targetTime); + pMinecraft->level->setOverrideTimeOfDay(-1); + pMinecraft->level->setTime(targetTime); + m_timeFrozen = false; + } + + if(!m_allowShow) + { + if( currentTask[m_CurrentState] != NULL && (!currentTask[m_CurrentState]->AllowFade() || (lastMessageTime + m_iTutorialDisplayMessageTime ) > GetTickCount() ) ) + { + uiTempDisabled = true; + } + ui.SetTutorialVisible( m_iPad, false ); + return; + } + + + if(!hasRequestedUI ) + { +#ifdef _XBOX + m_bSceneIsSplitscreen=app.GetLocalPlayerCount()>1; + if(m_bSceneIsSplitscreen) + { + app.NavigateToScene(m_iPad, eUIComponent_TutorialPopup,(void *)this, false, false, &m_hTutorialScene); + } + else + { + app.NavigateToScene(m_iPad, eUIComponent_TutorialPopup,(void *)this, false, false, &m_hTutorialScene); + } +#else + ui.SetTutorial(m_iPad, this); +#endif + hasRequestedUI = true; + } + else + { + // if we've changed mode, we may need to change scene + if(m_bSceneIsSplitscreen!=(app.GetLocalPlayerCount()>1)) + { +#ifdef _XBOX + app.TutorialSceneNavigateBack(m_iPad); + m_bSceneIsSplitscreen=app.GetLocalPlayerCount()>1; + if(m_bSceneIsSplitscreen) + { + app.NavigateToScene(m_iPad, eUIComponent_TutorialPopup,(void *)this, false, false, &m_hTutorialScene); + } + else + { + app.NavigateToScene(m_iPad, eUIComponent_TutorialPopup,(void *)this, false, false, &m_hTutorialScene); + } +#else + ui.SetTutorial(m_iPad, this); +#endif + } + } + + if(ui.IsPauseMenuDisplayed( m_iPad ) ) + { + if( currentTask[m_CurrentState] != NULL && (!currentTask[m_CurrentState]->AllowFade() || (lastMessageTime + m_iTutorialDisplayMessageTime ) > GetTickCount() ) ) + { + uiTempDisabled = true; + } + ui.SetTutorialVisible( m_iPad, false ); + return; + } + if( uiTempDisabled ) + { + ui.SetTutorialVisible( m_iPad, true ); + lastMessageTime = GetTickCount(); + uiTempDisabled = false; + } + + // Check constraints + for(AUTO_VAR(it, m_globalConstraints.begin()); it < m_globalConstraints.end(); ++it) + { + TutorialConstraint *constraint = *it; + constraint->tick(m_iPad); + } + + // Check hints + int hintNeeded = -1; + if(!m_hintDisplayed) + { + // 4J Stu - TU-1 interim + // Allow turning off all the hints + bool hintsOn = m_isFullTutorial || app.GetGameSettings(m_iPad,eGameSetting_Hints); + + if(hintsOn) + { + for(AUTO_VAR(it, hints[m_CurrentState].begin()); it < hints[m_CurrentState].end(); ++it) + { + TutorialHint *hint = *it; + hintNeeded = hint->tick(); + if(hintNeeded >= 0) + { + PopupMessageDetails *message = new PopupMessageDetails(); + message->m_messageId = hintNeeded; + message->m_allowFade = hint->allowFade(); + message->m_forceDisplay = true; + setMessage( hint, message ); + break; + } + } + } + } + + // Check constraints + // Only need to update these if we aren't already failing something + if( !m_allTutorialsComplete && (currentFailedConstraint[m_CurrentState] == NULL || currentFailedConstraint[m_CurrentState]->isConstraintSatisfied(m_iPad)) ) + { + if( currentFailedConstraint[m_CurrentState] != NULL && currentFailedConstraint[m_CurrentState]->isConstraintSatisfied(m_iPad) ) + { + constraintChanged = true; + currentFailedConstraint[m_CurrentState] = NULL; + } + for(AUTO_VAR(it, constraints[m_CurrentState].begin()); it < constraints[m_CurrentState].end(); ++it) + { + TutorialConstraint *constraint = *it; + if( !constraint->isConstraintSatisfied(m_iPad) && constraint->isConstraintRestrictive(m_iPad) ) + { + constraintChanged = true; + currentFailedConstraint[m_CurrentState] = constraint; + } + } + } + + if( !m_allTutorialsComplete && currentFailedConstraint[m_CurrentState] == NULL ) + { + // Update tasks + bool isCurrentTask = true; + AUTO_VAR(it, activeTasks[m_CurrentState].begin()); + while(activeTasks[m_CurrentState].size() > 0 && it < activeTasks[m_CurrentState].end()) + { + TutorialTask *task = *it; + if( isCurrentTask || task->isPreCompletionEnabled() ) + { + isCurrentTask = false; + if( + ( !task->ShowMinimumTime() || ( task->hasBeenActivated() && (lastMessageTime + m_iTutorialMinimumDisplayMessageTime ) < GetTickCount() ) ) + && task->isCompleted() + ) + { + eTutorial_CompletionAction compAction = task->getCompletionAction(); + it = activeTasks[m_CurrentState].erase( it ); + delete task; + task = NULL; + + if( activeTasks[m_CurrentState].size() > 0 ) + { + switch( compAction ) + { + case e_Tutorial_Completion_Complete_State_Gameplay_Constraints: + { + // 4J Stu - Move the delayed constraints to the gameplay state so that they are in + // effect for a bit longer + AUTO_VAR(itCon, constraintsToRemove[m_CurrentState].begin()); + while(itCon != constraintsToRemove[m_CurrentState].end() ) + { + constraints[e_Tutorial_State_Gameplay].push_back(itCon->first); + constraintsToRemove[e_Tutorial_State_Gameplay].push_back( pair(itCon->first, itCon->second) ); + + constraints[m_CurrentState].erase( find( constraints[m_CurrentState].begin(), constraints[m_CurrentState].end(), itCon->first) ); + itCon = constraintsToRemove[m_CurrentState].erase(itCon); + } + } + // Fall through the the normal complete state + case e_Tutorial_Completion_Complete_State: + for(AUTO_VAR(itRem, activeTasks[m_CurrentState].begin()); itRem < activeTasks[m_CurrentState].end(); ++itRem) + { + delete (*itRem); + } + activeTasks[m_CurrentState].clear(); + break; + case e_Tutorial_Completion_Jump_To_Last_Task: + { + TutorialTask *lastTask = activeTasks[m_CurrentState].at( activeTasks[m_CurrentState].size() - 1 ); + activeTasks[m_CurrentState].pop_back(); + for(AUTO_VAR(itRem, activeTasks[m_CurrentState].begin()); itRem < activeTasks[m_CurrentState].end(); ++itRem) + { + delete (*itRem); + } + activeTasks[m_CurrentState].clear(); + activeTasks[m_CurrentState].push_back( lastTask ); + it = activeTasks[m_CurrentState].begin(); + } + break; + case e_Tutorial_Completion_None: + default: + break; + } + } + + if( activeTasks[m_CurrentState].size() > 0 ) + { + currentTask[m_CurrentState] = activeTasks[m_CurrentState][0]; + currentTask[m_CurrentState]->setAsCurrentTask(); + } + else + { + setStateCompleted( m_CurrentState ); + + currentTask[m_CurrentState] = NULL; + } + taskChanged = true; + + // If we can complete this early, check if we can complete it right now + if( currentTask[m_CurrentState] != NULL && currentTask[m_CurrentState]->isPreCompletionEnabled() ) + { + isCurrentTask = true; + } + } + else + { + ++it; + } + if( task != NULL && task->ShowMinimumTime() && task->hasBeenActivated() && (lastMessageTime + m_iTutorialMinimumDisplayMessageTime ) < GetTickCount() ) + { + task->setShownForMinimumTime(); + + if( !m_hintDisplayed ) + { + PopupMessageDetails *message = new PopupMessageDetails(); + message->m_messageId = task->getDescriptionId(); + message->m_promptId = task->getPromptId(); + message->m_allowFade = task->AllowFade(); + message->m_replaceCurrent = true; + setMessage( message ); + } + } + } + else + { + ++it; + } + } + + if( currentTask[m_CurrentState] == NULL && activeTasks[m_CurrentState].size() > 0 ) + { + currentTask[m_CurrentState] = activeTasks[m_CurrentState][0]; + currentTask[m_CurrentState]->setAsCurrentTask(); + taskChanged = true; + } + } + + if(!m_allTutorialsComplete && (taskChanged || m_hasStateChanged) ) + { + bool allComplete = true; + for(unsigned int state = 0; state < e_Tutorial_State_Max; ++state) + { + if(activeTasks[state].size() > 0 ) + { + allComplete = false; + break; + } + if(state==e_Tutorial_State_Gameplay) + { + m_fullTutorialComplete = true; + Minecraft::GetInstance()->playerLeftTutorial(m_iPad); + } + } + if(allComplete) + m_allTutorialsComplete = true; + } + + if( constraintChanged || taskChanged || m_hasStateChanged || + (currentFailedConstraint[m_CurrentState] == NULL && currentTask[m_CurrentState] != NULL && (m_lastMessage == NULL || currentTask[m_CurrentState]->getDescriptionId() != m_lastMessage->m_messageId) && !m_hintDisplayed) + ) + { + if( currentFailedConstraint[m_CurrentState] != NULL ) + { + PopupMessageDetails *message = new PopupMessageDetails(); + message->m_messageId = currentFailedConstraint[m_CurrentState]->getDescriptionId(); + message->m_allowFade = false; + setMessage( message ); + } + else if( currentTask[m_CurrentState] != NULL ) + { + PopupMessageDetails *message = new PopupMessageDetails(); + message->m_messageId = currentTask[m_CurrentState]->getDescriptionId(); + message->m_promptId = currentTask[m_CurrentState]->getPromptId(); + message->m_allowFade = currentTask[m_CurrentState]->AllowFade(); + setMessage( message ); + currentTask[m_CurrentState]->TaskReminders()? m_iTaskReminders = 1 : m_iTaskReminders = 0; + } + else + { + setMessage( NULL ); + } + } + + if(m_hintDisplayed && (lastMessageTime + m_iTutorialDisplayMessageTime ) < GetTickCount() ) + { + m_hintDisplayed = false; + } + + if( currentFailedConstraint[m_CurrentState] == NULL && currentTask[m_CurrentState] != NULL && (m_iTaskReminders!=0) && (lastMessageTime + (m_iTaskReminders * m_iTutorialReminderTime) ) < GetTickCount() ) + { + // Reminder + PopupMessageDetails *message = new PopupMessageDetails(); + message->m_messageId = currentTask[m_CurrentState]->getDescriptionId(); + message->m_promptId = currentTask[m_CurrentState]->getPromptId(); + message->m_allowFade = currentTask[m_CurrentState]->AllowFade(); + message->m_isReminder = true; + setMessage( message ); + ++m_iTaskReminders; + if( m_iTaskReminders > 1 ) + m_iTaskReminders = 1; + } + + m_hasStateChanged = false; + + // If we have completed this state, and it is one that occurs during normal gameplay then change back to the gameplay track + if( m_CurrentState != e_Tutorial_State_Gameplay && activeTasks[m_CurrentState].size() == 0 && (isSelectedItemState() || !ui.GetMenuDisplayed(m_iPad) ) ) + { + this->changeTutorialState( e_Tutorial_State_Gameplay ); + } +} + +bool Tutorial::setMessage(PopupMessageDetails *message) +{ + if(message != NULL && !message->m_forceDisplay && + m_lastMessageState == m_CurrentState && + message->isSameContent(m_lastMessage) && + ( !message->m_isReminder || ( (lastMessageTime + m_iTutorialReminderTime ) > GetTickCount() && message->m_isReminder ) ) + ) + { + delete message; + return false; + } + + if(message != NULL && (message->m_messageId > 0 || !message->m_messageString.empty()) ) + { + m_lastMessageState = m_CurrentState; + + if(!message->m_replaceCurrent) lastMessageTime = GetTickCount(); + + wstring text; + if(!message->m_messageString.empty()) + { + text = message->m_messageString; + } + else + { + AUTO_VAR(it, messages.find(message->m_messageId)); + if( it != messages.end() && it->second != NULL ) + { + TutorialMessage *messageString = it->second; + text = wstring( messageString->getMessageForDisplay() ); + } + else + { + text = wstring( app.GetString(message->m_messageId) ); + } + } + + if(!message->m_promptString.empty()) + { + text.append(message->m_promptString); + } + else if(message->m_promptId >= 0) + { + AUTO_VAR(it, messages.find(message->m_promptId)); + if(it != messages.end() && it->second != NULL) + { + TutorialMessage *prompt = it->second; + text.append( prompt->getMessageForDisplay() ); + } + } + + wstring title; + TutorialPopupInfo popupInfo; + popupInfo.interactScene = m_UIScene; + popupInfo.desc = text.c_str(); + popupInfo.icon = message->m_icon; + popupInfo.iAuxVal = message->m_iAuxVal; + popupInfo.allowFade = message->m_allowFade; + popupInfo.isReminder = message->m_isReminder; + popupInfo.tutorial = this; + if( !message->m_titleString.empty() || message->m_titleId > 0 ) + { + if(message->m_titleString.empty()) title = wstring( app.GetString(message->m_titleId) ); + else title = message->m_titleString; + + popupInfo.title = title.c_str(); + ui.SetTutorialDescription( m_iPad, &popupInfo ); + } + else + { + ui.SetTutorialDescription( m_iPad, &popupInfo ); + } + } + else if( (m_lastMessage != NULL && m_lastMessage->m_messageId != -1) ) //&& (lastMessageTime + m_iTutorialReminderTime ) > GetTickCount() ) + { + // This should cause the popup to dissappear + TutorialPopupInfo popupInfo; + popupInfo.interactScene = m_UIScene; + popupInfo.tutorial = this; + ui.SetTutorialDescription( m_iPad, &popupInfo ); + } + + if(m_lastMessage != NULL) delete m_lastMessage; + m_lastMessage = message; + + return true; +} + +bool Tutorial::setMessage(TutorialHint *hint, PopupMessageDetails *message) +{ + // 4J Stu - TU-1 interim + // Allow turning off all the hints + bool hintsOn = m_isFullTutorial || (app.GetGameSettings(m_iPad,eGameSetting_Hints) && app.GetGameSettings(m_iPad,eGameSetting_DisplayHUD)); + + bool messageShown = false; + DWORD time = GetTickCount(); + if(message != NULL && (message->m_forceDisplay || hintsOn) && + (!message->m_delay || + ( + (m_hintDisplayed && (time - m_lastHintDisplayedTime) > m_iTutorialHintDelayTime ) || + (!m_hintDisplayed && (time - lastMessageTime) > m_iTutorialMinimumDisplayMessageTime ) + ) + ) + ) + { + messageShown = setMessage( message ); + + if(messageShown) + { + m_lastHintDisplayedTime = time; + m_hintDisplayed = true; + if(hint!=NULL) setHintCompleted( hint ); + } + } + return messageShown; +} + +bool Tutorial::setMessage(const wstring &messageString, int icon, int auxValue) +{ + PopupMessageDetails *message = new PopupMessageDetails(); + message->m_messageString = messageString; + message->m_icon = icon; + message->m_iAuxVal = auxValue; + message->m_forceDisplay = true; + + return setMessage(message); +} + +void Tutorial::showTutorialPopup(bool show) +{ + m_allowShow = show; + + if(!show) + { + if( currentTask[m_CurrentState] != NULL && (!currentTask[m_CurrentState]->AllowFade() || (lastMessageTime + m_iTutorialDisplayMessageTime ) > GetTickCount() ) ) + { + uiTempDisabled = true; + } + ui.SetTutorialVisible( m_iPad, show ); + } +} + +void Tutorial::useItemOn(Level *level, shared_ptr item, int x, int y, int z, bool bTestUseOnly) +{ + for(AUTO_VAR(it, activeTasks[m_CurrentState].begin()); it < activeTasks[m_CurrentState].end(); ++it) + { + TutorialTask *task = *it; + task->useItemOn(level, item, x, y, z, bTestUseOnly); + } +} + +void Tutorial::useItemOn(shared_ptr item, bool bTestUseOnly) +{ + for(AUTO_VAR(it, activeTasks[m_CurrentState].begin()); it < activeTasks[m_CurrentState].end(); ++it) + { + TutorialTask *task = *it; + task->useItem(item, bTestUseOnly); + } +} + +void Tutorial::completeUsingItem(shared_ptr item) +{ + for(AUTO_VAR(it, activeTasks[m_CurrentState].begin()); it < activeTasks[m_CurrentState].end(); ++it) + { + TutorialTask *task = *it; + task->completeUsingItem(item); + } + + // Fix for #46922 - TU5: UI: Player receives a reminder that he is hungry while "hunger bar" is full (triggered in split-screen mode) + if(m_CurrentState != e_Tutorial_State_Gameplay) + { + for(AUTO_VAR(it, activeTasks[e_Tutorial_State_Gameplay].begin()); it < activeTasks[e_Tutorial_State_Gameplay].end(); ++it) + { + TutorialTask *task = *it; + task->completeUsingItem(item); + } + } +} + +void Tutorial::startDestroyBlock(shared_ptr item, Tile *tile) +{ + int hintNeeded = -1; + for(AUTO_VAR(it, hints[m_CurrentState].begin()); it < hints[m_CurrentState].end(); ++it) + { + TutorialHint *hint = *it; + hintNeeded = hint->startDestroyBlock(item, tile); + if(hintNeeded >= 0) + { + PopupMessageDetails *message = new PopupMessageDetails(); + message->m_messageId = hintNeeded; + setMessage( hint, message ); + break; + } + + } +} + +void Tutorial::destroyBlock(Tile *tile) +{ + int hintNeeded = -1; + for(AUTO_VAR(it, hints[m_CurrentState].begin()); it < hints[m_CurrentState].end(); ++it) + { + TutorialHint *hint = *it; + hintNeeded = hint->destroyBlock(tile); + if(hintNeeded >= 0) + { + PopupMessageDetails *message = new PopupMessageDetails(); + message->m_messageId = hintNeeded; + setMessage( hint, message ); + break; + } + + } +} + +void Tutorial::attack(shared_ptr player, shared_ptr entity) +{ + int hintNeeded = -1; + for(AUTO_VAR(it, hints[m_CurrentState].begin()); it < hints[m_CurrentState].end(); ++it) + { + TutorialHint *hint = *it; + hintNeeded = hint->attack(player->inventory->getSelected(), entity); + if(hintNeeded >= 0) + { + PopupMessageDetails *message = new PopupMessageDetails(); + message->m_messageId = hintNeeded; + setMessage( hint, message ); + break; + } + + } +} + +void Tutorial::itemDamaged(shared_ptr item) +{ + int hintNeeded = -1; + for(AUTO_VAR(it, hints[m_CurrentState].begin()); it < hints[m_CurrentState].end(); ++it) + { + TutorialHint *hint = *it; + hintNeeded = hint->itemDamaged(item); + if(hintNeeded >= 0) + { + PopupMessageDetails *message = new PopupMessageDetails(); + message->m_messageId = hintNeeded; + setMessage( hint, message ); + break; + } + + } +} + +void Tutorial::handleUIInput(int iAction) +{ + if( m_hintDisplayed ) return; + + //for(AUTO_VAR(it, activeTasks[m_CurrentState].begin()); it < activeTasks[m_CurrentState].end(); ++it) + //{ + // TutorialTask *task = *it; + // task->handleUIInput(iAction); + //} + if(currentTask[m_CurrentState] != NULL) + currentTask[m_CurrentState]->handleUIInput(iAction); +} + +void Tutorial::createItemSelected(shared_ptr item, bool canMake) +{ + int hintNeeded = -1; + for(AUTO_VAR(it, hints[m_CurrentState].begin()); it < hints[m_CurrentState].end(); ++it) + { + TutorialHint *hint = *it; + hintNeeded = hint->createItemSelected(item, canMake); + if(hintNeeded >= 0) + { + PopupMessageDetails *message = new PopupMessageDetails(); + message->m_messageId = hintNeeded; + setMessage( hint, message ); + break; + } + + } +} + +void Tutorial::onCrafted(shared_ptr item) +{ + for(unsigned int state = 0; state < e_Tutorial_State_Max; ++state) + { + for(AUTO_VAR(it, activeTasks[state].begin()); it < activeTasks[state].end(); ++it) + { + TutorialTask *task = *it; + task->onCrafted(item); + } + } +} + +void Tutorial::onTake(shared_ptr item, unsigned int invItemCountAnyAux, unsigned int invItemCountThisAux) +{ + if( !m_hintDisplayed ) + { + bool hintNeeded = false; + for(AUTO_VAR(it, hints[m_CurrentState].begin()); it < hints[m_CurrentState].end(); ++it) + { + TutorialHint *hint = *it; + hintNeeded = hint->onTake(item); + if(hintNeeded) + { + break; + } + + } + } + + for(unsigned int state = 0; state < e_Tutorial_State_Max; ++state) + { + for(AUTO_VAR(it, activeTasks[state].begin()); it < activeTasks[state].end(); ++it) + { + TutorialTask *task = *it; + task->onTake(item, invItemCountAnyAux, invItemCountThisAux); + } + } +} + +void Tutorial::onSelectedItemChanged(shared_ptr item) +{ + // We only handle this if we are in a state that allows changing based on the selected item + // Menus and states like riding in a minecart will NOT allow this + if( isSelectedItemState() ) + { + if(item != NULL) + { + switch(item->id) + { + case Item::fishingRod_Id: + changeTutorialState(e_Tutorial_State_Fishing); + break; + default: + changeTutorialState(e_Tutorial_State_Gameplay); + break; + } + } + else + { + changeTutorialState(e_Tutorial_State_Gameplay); + } + } +} + +void Tutorial::onLookAt(int id, int iData) +{ + if( m_hintDisplayed ) return; + + bool hintNeeded = false; + for(AUTO_VAR(it, hints[m_CurrentState].begin()); it < hints[m_CurrentState].end(); ++it) + { + TutorialHint *hint = *it; + hintNeeded = hint->onLookAt(id, iData); + if(hintNeeded) + { + break; + } + } + + if( m_CurrentState == e_Tutorial_State_Gameplay ) + { + if(id > 0) + { + switch(id) + { + case Tile::bed_Id: + changeTutorialState(e_Tutorial_State_Bed); + break; + default: + break; + } + } + } +} + +void Tutorial::onLookAtEntity(eINSTANCEOF type) +{ + if( m_hintDisplayed ) return; + + bool hintNeeded = false; + for(AUTO_VAR(it, hints[m_CurrentState].begin()); it < hints[m_CurrentState].end(); ++it) + { + TutorialHint *hint = *it; + hintNeeded = hint->onLookAtEntity(type); + if(hintNeeded) + { + break; + } + } +} + +void Tutorial::onEffectChanged(MobEffect *effect, bool bRemoved) +{ + for(AUTO_VAR(it, activeTasks[m_CurrentState].begin()); it < activeTasks[m_CurrentState].end(); ++it) + { + TutorialTask *task = *it; + task->onEffectChanged(effect,bRemoved); + } +} + +bool Tutorial::canMoveToPosition(double xo, double yo, double zo, double xt, double yt, double zt) +{ + bool allowed = true; + for(AUTO_VAR(it, constraints[m_CurrentState].begin()); it < constraints[m_CurrentState].end(); ++it) + { + TutorialConstraint *constraint = *it; + if( !constraint->isConstraintSatisfied(m_iPad) && !constraint->canMoveToPosition(xo,yo,zo,xt,yt,zt) ) + { + allowed = false; + break; + } + } + return allowed; +} + +bool Tutorial::isInputAllowed(int mapping) +{ + if( m_hintDisplayed ) return true; + + // If the player is under water then allow all keypresses so they can jump out + if( Minecraft::GetInstance()->localplayers[m_iPad]->isUnderLiquid(Material::water) ) return true; + + bool allowed = true; + for(AUTO_VAR(it, constraints[m_CurrentState].begin()); it < constraints[m_CurrentState].end(); ++it) + { + TutorialConstraint *constraint = *it; + if( constraint->isMappingConstrained( m_iPad, mapping ) ) + { + allowed = false; + break; + } + } + return allowed; +} + +vector *Tutorial::getTasks() +{ + return &tasks; +} + +unsigned int Tutorial::getCurrentTaskIndex() +{ + unsigned int index = 0; + for(AUTO_VAR(it, tasks.begin()); it < tasks.end(); ++it) + { + if(*it == currentTask[e_Tutorial_State_Gameplay]) + break; + + ++index; + } + return index; +} + +void Tutorial::AddGlobalConstraint(TutorialConstraint *c) +{ + m_globalConstraints.push_back(c); +} + +void Tutorial::AddConstraint(TutorialConstraint *c) +{ + constraints[m_CurrentState].push_back(c); +} + +void Tutorial::RemoveConstraint(TutorialConstraint *c, bool delayedRemove /*= false*/) +{ + if( currentFailedConstraint[m_CurrentState] == c ) + currentFailedConstraint[m_CurrentState] = NULL; + + if( c->getQueuedForRemoval() ) + { + // If it is already queued for removal, remove it on the next tick + /*for(AUTO_VAR(it, constraintsToRemove[m_CurrentState].begin()); it < constraintsToRemove[m_CurrentState].end(); ++it) + { + if( it->first == c ) + { + it->second = m_iTutorialConstraintDelayRemoveTicks; + break; + } + }*/ + } + else if(delayedRemove) + { + c->setQueuedForRemoval(true); + constraintsToRemove[m_CurrentState].push_back( pair(c, 0) ); + } + else + { + for( AUTO_VAR(it, constraintsToRemove[m_CurrentState].begin()); it < constraintsToRemove[m_CurrentState].end(); ++it) + { + if( it->first == c ) + { + constraintsToRemove[m_CurrentState].erase( it ); + break; + } + } + + AUTO_VAR(it, find( constraints[m_CurrentState].begin(), constraints[m_CurrentState].end(), c)); + if( it != constraints[m_CurrentState].end() ) constraints[m_CurrentState].erase( find( constraints[m_CurrentState].begin(), constraints[m_CurrentState].end(), c) ); + + // It may be in the gameplay list, so remove it from there if it is + it = find( constraints[e_Tutorial_State_Gameplay].begin(), constraints[e_Tutorial_State_Gameplay].end(), c); + if( it != constraints[e_Tutorial_State_Gameplay].end() ) constraints[e_Tutorial_State_Gameplay].erase( find( constraints[e_Tutorial_State_Gameplay].begin(), constraints[e_Tutorial_State_Gameplay].end(), c) ); + } +} + +void Tutorial::addTask(eTutorial_State state, TutorialTask *t) +{ + if( state == e_Tutorial_State_Gameplay ) + { + tasks.push_back(t); + } + activeTasks[state].push_back(t); +} + +void Tutorial::addHint(eTutorial_State state, TutorialHint *h) +{ + hints[state].push_back(h); +} + +void Tutorial::addMessage(int messageId, bool limitRepeats /*= false*/, unsigned char numRepeats /*= TUTORIAL_MESSAGE_DEFAULT_SHOW*/) +{ + if(messageId >= 0 && messages.find(messageId)==messages.end()) + messages[messageId] = new TutorialMessage(messageId, limitRepeats, numRepeats); +} + +#ifdef _XBOX +void Tutorial::changeTutorialState(eTutorial_State newState, CXuiScene *scene /*= NULL*/) +#else +void Tutorial::changeTutorialState(eTutorial_State newState, UIScene *scene /*= NULL*/) +#endif +{ + if(newState == m_CurrentState) + { + // If clearing the scene, make sure that the tutorial popup has its reference to this scene removed +#ifndef _XBOX + if( scene == NULL ) + { + ui.RemoveInteractSceneReference(m_iPad, m_UIScene); + } +#endif + m_UIScene = scene; + return; + } + // 4J Stu - TU-1 interim + // Allow turning off all the hints + bool hintsOn = m_isFullTutorial || app.GetGameSettings(m_iPad,eGameSetting_Hints); + + if(hintsOn) + { + // If we have completed this state, and it is one that occurs during normal gameplay then change back to the gameplay track + if( newState != e_Tutorial_State_Gameplay && activeTasks[newState].size() == 0 && !ui.GetMenuDisplayed(m_iPad) ) + { + return; + } + + // The action that caused the change of state may also have completed the current task + if( currentTask[m_CurrentState] != NULL && currentTask[m_CurrentState]->isCompleted() ) + { + activeTasks[m_CurrentState].erase( find( activeTasks[m_CurrentState].begin(), activeTasks[m_CurrentState].end(), currentTask[m_CurrentState]) ); + + if( activeTasks[m_CurrentState].size() > 0 ) + { + currentTask[m_CurrentState] = activeTasks[m_CurrentState][0]; + currentTask[m_CurrentState]->setAsCurrentTask(); + } + else + { + currentTask[m_CurrentState] = NULL; + } + } + + if( currentTask[m_CurrentState] != NULL ) + { + currentTask[m_CurrentState]->onStateChange(newState); + } + + // Make sure that the current message is cleared + setMessage( NULL ); + + // If clearing the scene, make sure that the tutorial popup has its reference to this scene removed +#ifndef _XBOX + if( scene == NULL ) + { + ui.RemoveInteractSceneReference(m_iPad, m_UIScene); + } +#endif + m_UIScene = scene; + + + if( m_CurrentState != newState ) + { + for(AUTO_VAR(it, activeTasks[newState].begin()); it < activeTasks[newState].end(); ++it) + { + TutorialTask *task = *it; + task->onStateChange(newState); + } + m_CurrentState = newState; + m_hasStateChanged = true; + m_hintDisplayed = false; + } + } +} + +bool Tutorial::isSelectedItemState() +{ + bool isSelectedItemState = false; + switch(m_CurrentState) + { + case e_Tutorial_State_Gameplay: + case e_Tutorial_State_Fishing: + isSelectedItemState = true; + break; + default: + break; + } + return isSelectedItemState; +} diff --git a/Minecraft.Client/Common/Tutorial/Tutorial.h b/Minecraft.Client/Common/Tutorial/Tutorial.h new file mode 100644 index 00000000..aaaaba0a --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/Tutorial.h @@ -0,0 +1,199 @@ +#pragma once +using namespace std; +#include "TutorialTask.h" +#include "TutorialConstraint.h" +#include "TutorialHint.h" +#include "TutorialMessage.h" +#include "TutorialEnum.h" + +// #define TUTORIAL_HINT_DELAY_TIME 14000 // How long we should wait from displaying one hint to the next +// #define TUTORIAL_DISPLAY_MESSAGE_TIME 7000 +// #define TUTORIAL_MINIMUM_DISPLAY_MESSAGE_TIME 2000 +// #define TUTORIAL_REMINDER_TIME (TUTORIAL_DISPLAY_MESSAGE_TIME + 20000) +// #define TUTORIAL_CONSTRAINT_DELAY_REMOVE_TICKS 15 +// +// // 0-24000 +// #define TUTORIAL_FREEZE_TIME_VALUE 8000 + +class Level; +class CXuiScene; + +class Tutorial +{ +public: + class PopupMessageDetails + { + public: + int m_messageId; + int m_promptId; + int m_titleId; + wstring m_messageString; + wstring m_promptString; + wstring m_titleString; + int m_icon; + int m_iAuxVal; + bool m_allowFade; + bool m_isReminder; + bool m_replaceCurrent; + bool m_forceDisplay; + bool m_delay; + + PopupMessageDetails() + { + m_messageId = -1; + m_promptId = -1; + m_titleId = -1; + m_messageString = L""; + m_promptString = L""; + m_titleString = L""; + m_icon = TUTORIAL_NO_ICON; + m_iAuxVal = 0; + m_allowFade = true; + m_isReminder = false; + m_replaceCurrent = false; + m_forceDisplay = false; + m_delay = false; + } + + bool isSameContent(PopupMessageDetails *other); + + }; + +private: + static int m_iTutorialHintDelayTime; + static int m_iTutorialDisplayMessageTime; + static int m_iTutorialMinimumDisplayMessageTime; + static int m_iTutorialExtraReminderTime; + static int m_iTutorialReminderTime; + static int m_iTutorialConstraintDelayRemoveTicks; + static int m_iTutorialFreezeTimeValue; + eTutorial_State m_CurrentState; + bool m_hasStateChanged; +#ifdef _XBOX + HXUIOBJ m_hTutorialScene; // to store the popup scene (splitscreen or normal) +#endif + bool m_bSceneIsSplitscreen; + + bool m_bHasTickedOnce; + int m_firstTickTime; + +protected: + unordered_map messages; + vector m_globalConstraints; + vector constraints[e_Tutorial_State_Max]; + vector< pair > constraintsToRemove[e_Tutorial_State_Max]; + vector tasks; // We store a copy of the tasks for the main gameplay tutorial so that we could display an overview menu + vector activeTasks[e_Tutorial_State_Max]; + vector hints[e_Tutorial_State_Max]; + TutorialTask *currentTask[e_Tutorial_State_Max]; + TutorialConstraint *currentFailedConstraint[e_Tutorial_State_Max]; + + bool m_freezeTime; + bool m_timeFrozen; + //D3DXVECTOR3 m_OriginalPosition; + +public: + DWORD lastMessageTime; + DWORD m_lastHintDisplayedTime; +private: + PopupMessageDetails *m_lastMessage; + + eTutorial_State m_lastMessageState; + unsigned int m_iTaskReminders; + + bool m_allowShow; + +public: + bool m_hintDisplayed; + +private: + bool hasRequestedUI; + bool uiTempDisabled; + +#ifdef _XBOX + CXuiScene *m_UIScene; +#else + UIScene *m_UIScene; +#endif + + int m_iPad; +public: + bool m_allTutorialsComplete; + bool m_fullTutorialComplete; + bool m_isFullTutorial; +public: + Tutorial(int iPad, bool isFullTutorial = false); + ~Tutorial(); + void tick(); + + int getPad() { return m_iPad; } + + virtual bool isStateCompleted( eTutorial_State state ); + virtual void setStateCompleted( eTutorial_State state ); + bool isHintCompleted( eTutorial_Hint hint ); + void setHintCompleted( eTutorial_Hint hint ); + void setHintCompleted( TutorialHint *hint ); + + // completableId will be either a eTutorial_State value or eTutorial_Hint + void setCompleted( int completableId ); + bool getCompleted( int completableId ); + +#ifdef _XBOX + void changeTutorialState(eTutorial_State newState, CXuiScene *scene = NULL); +#else + void changeTutorialState(eTutorial_State newState, UIScene *scene = NULL); +#endif + bool isSelectedItemState(); + + bool setMessage(PopupMessageDetails *message); + bool setMessage(TutorialHint *hint, PopupMessageDetails *message); + bool setMessage(const wstring &message, int icon, int auxValue); + + void showTutorialPopup(bool show); + + void useItemOn(Level *level, shared_ptr item, int x, int y, int z,bool bTestUseOnly=false); + void useItemOn(shared_ptr item, bool bTestUseOnly=false); + void completeUsingItem(shared_ptr item); + void startDestroyBlock(shared_ptr item, Tile *tile); + void destroyBlock(Tile *tile); + void attack(shared_ptr player, shared_ptr entity); + void itemDamaged(shared_ptr item); + + void handleUIInput(int iAction); + void createItemSelected(shared_ptr item, bool canMake); + void onCrafted(shared_ptr item); + void onTake(shared_ptr item, unsigned int invItemCountAnyAux, unsigned int invItemCountThisAux); + void onSelectedItemChanged(shared_ptr item); + void onLookAt(int id, int iData=0); + void onLookAtEntity(eINSTANCEOF type); + void onEffectChanged(MobEffect *effect, bool bRemoved=false); + + bool canMoveToPosition(double xo, double yo, double zo, double xt, double yt, double zt); + bool isInputAllowed(int mapping); + + void AddGlobalConstraint(TutorialConstraint *c); + void AddConstraint(TutorialConstraint *c); + void RemoveConstraint(TutorialConstraint *c, bool delayedRemove = false); + void addTask(eTutorial_State state, TutorialTask *t); + void addHint(eTutorial_State state, TutorialHint *h); + void addMessage(int messageId, bool limitRepeats = false, unsigned char numRepeats = TUTORIAL_MESSAGE_DEFAULT_SHOW); + + int GetTutorialDisplayMessageTime() {return m_iTutorialDisplayMessageTime;} + + // Only for the main gameplay tutorial + vector *getTasks(); + unsigned int getCurrentTaskIndex(); + +#ifdef _XBOX + CXuiScene *getScene() { return m_UIScene; } +#else + UIScene *getScene() { return m_UIScene; } +#endif + eTutorial_State getCurrentState() { return m_CurrentState; } + + // These are required so that we have a consistent mapping of the completion bits stored in the profile data + static void staticCtor(); + static vector s_completableTasks; + + static void debugResetPlayerSavedProgress(int iPad); +}; diff --git a/Minecraft.Client/Common/Tutorial/TutorialConstraint.h b/Minecraft.Client/Common/Tutorial/TutorialConstraint.h new file mode 100644 index 00000000..877fd57e --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TutorialConstraint.h @@ -0,0 +1,41 @@ +#pragma once + +// 4J Stu - An abstract class that represents a constraint on what the user is able to do +class TutorialConstraint +{ +private: + int descriptionId; + bool m_deleteOnDeactivate; + bool m_queuedForRemoval; +public: + enum ConstraintType + { + e_ConstraintInput = 0, // Constraint on controller input + e_ConstraintArea, + e_ConstraintAllInput, + e_ConstraintXuiInput, + e_ConstraintChangeState, + }; + + TutorialConstraint(int descriptionId) : descriptionId( descriptionId ), m_deleteOnDeactivate( false ), m_queuedForRemoval( false ) {} + virtual ~TutorialConstraint() {} + + int getDescriptionId() { return descriptionId; } + + virtual ConstraintType getType() = 0; + + virtual void tick(int iPad) {} + virtual bool isConstraintSatisfied(int iPad) { return true; } + virtual bool isConstraintRestrictive(int iPad) { return true; } + + virtual bool isMappingConstrained(int iPad, int mapping) { return false;} + virtual bool isXuiInputConstrained(int vk) { return false;} + + void setDeleteOnDeactivate(bool deleteOnDeactivated) { m_deleteOnDeactivate = deleteOnDeactivated; } + bool getDeleteOnDeactivate() { return m_deleteOnDeactivate; } + + void setQueuedForRemoval(bool queued) { m_queuedForRemoval = queued; } + bool getQueuedForRemoval() { return m_queuedForRemoval; } + + virtual bool canMoveToPosition(double xo, double yo, double zo, double xt, double yt, double zt) { return true; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TutorialConstraints.h b/Minecraft.Client/Common/Tutorial/TutorialConstraints.h new file mode 100644 index 00000000..74bb8935 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TutorialConstraints.h @@ -0,0 +1,4 @@ +#include "TutorialConstraint.h" +#include "AreaConstraint.h" +#include "ChangeStateConstraint.h" +#include "InputConstraint.h" \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TutorialEnum.h b/Minecraft.Client/Common/Tutorial/TutorialEnum.h new file mode 100644 index 00000000..33f2e67d --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TutorialEnum.h @@ -0,0 +1,329 @@ +#pragma once + +typedef struct { + WORD index; + DWORD diffsSize; + BYTE *diffs; + DWORD lastByteChanged; +} TutorialDiff_Chunk; + +typedef struct { + DWORD diffCount; + TutorialDiff_Chunk *diffs; +} TutorialDiff_File; + +#define TUTORIAL_NO_TEXT -1 +#define TUTORIAL_NO_ICON -1 + +// If you want to make these bigger, be aware that that will affect what is stored after the tutorial data in the profile data +// See Xbox_App.h for the struct +#define TUTORIAL_PROFILE_STORAGE_BITS 512 +#define TUTORIAL_PROFILE_STORAGE_BYTES (TUTORIAL_PROFILE_STORAGE_BITS/8) + +// 4J Stu - The total number of eTutorial_State and eTutorial_Hint must be less than 512, as we only have 512 bits of profile +// data to flag whether or not the player has seen them +// In general a block or tool will have one each. We have a state if we need more than one message, or a hint if just once +// message will suffice +// Tasks added here should also be added in the Tutorial::staticCtor() if you wish to store completion in the profile data +enum eTutorial_State +{ + e_Tutorial_State_Any = -2, + e_Tutorial_State_None = -1, + + e_Tutorial_State_Gameplay = 0, + + e_Tutorial_State_Inventory_Menu, + e_Tutorial_State_2x2Crafting_Menu, + e_Tutorial_State_3x3Crafting_Menu, + e_Tutorial_State_Furnace_Menu, + + e_Tutorial_State_Riding_Minecart, + e_Tutorial_State_Riding_Boat, + e_Tutorial_State_Fishing, + + e_Tutorial_State_Bed, + + e_Tutorial_State_Container_Menu, + e_Tutorial_State_Trap_Menu, + e_Tutorial_State_Redstone_And_Piston, + e_Tutorial_State_Portal, + e_Tutorial_State_Creative_Inventory_Menu, // Added TU5 + e_Tutorial_State_Food_Bar, // Added TU5 + e_Tutorial_State_CreativeMode, // Added TU7 + e_Tutorial_State_Brewing, + e_Tutorial_State_Brewing_Menu, + e_Tutorial_State_Enchanting, + e_Tutorial_State_Enchanting_Menu, + e_Tutorial_State_Farming, + e_Tutorial_State_Breeding, + e_Tutorial_State_Golem, + e_Tutorial_State_Trading, + e_Tutorial_State_Trading_Menu, + e_Tutorial_State_Anvil, + e_Tutorial_State_Anvil_Menu, + e_Tutorial_State_Enderchests, + + e_Tutorial_State_Unused_9, + e_Tutorial_State_Unused_10, + + e_Tutorial_State_Max +}; + +// Hints added here should also be added in the Tutorial::staticCtor() if you wish to store completion in the profile data +enum eTutorial_Hint +{ + e_Tutorial_Hint_Always_On = e_Tutorial_State_Max, + + e_Tutorial_Hint_Hold_To_Mine, + e_Tutorial_Hint_Tool_Damaged, + e_Tutorial_Hint_Swim_Up, + + e_Tutorial_Hint_Unused_2, + e_Tutorial_Hint_Unused_3, + e_Tutorial_Hint_Unused_4, + e_Tutorial_Hint_Unused_5, + e_Tutorial_Hint_Unused_6, + e_Tutorial_Hint_Unused_7, + e_Tutorial_Hint_Unused_8, + e_Tutorial_Hint_Unused_9, + e_Tutorial_Hint_Unused_10, + + e_Tutorial_Hint_Rock, + e_Tutorial_Hint_Stone, + e_Tutorial_Hint_Planks, + e_Tutorial_Hint_Sapling, + e_Tutorial_Hint_Unbreakable, + e_Tutorial_Hint_Water, + e_Tutorial_Hint_Lava, + e_Tutorial_Hint_Sand, + e_Tutorial_Hint_Gravel, + e_Tutorial_Hint_Gold_Ore, + e_Tutorial_Hint_Iron_Ore, + e_Tutorial_Hint_Coal_Ore, + e_Tutorial_Hint_Tree_Trunk, + e_Tutorial_Hint_Leaves, + e_Tutorial_Hint_Glass, + e_Tutorial_Hint_Lapis_Ore, + e_Tutorial_Hint_Lapis_Block, + e_Tutorial_Hint_Dispenser, + e_Tutorial_Hint_Sandstone, + e_Tutorial_Hint_Note_Block, + e_Tutorial_Hint_Powered_Rail, + e_Tutorial_Hint_Detector_Rail, + e_Tutorial_Hint_Tall_Grass, + e_Tutorial_Hint_Wool, + e_Tutorial_Hint_Flower, + e_Tutorial_Hint_Mushroom, + e_Tutorial_Hint_Gold_Block, + e_Tutorial_Hint_Iron_Block, + e_Tutorial_Hint_Stone_Slab, + e_Tutorial_Hint_Red_Brick, + e_Tutorial_Hint_Tnt, + e_Tutorial_Hint_Bookshelf, + e_Tutorial_Hint_Moss_Stone, + e_Tutorial_Hint_Obsidian, + e_Tutorial_Hint_Torch, + e_Tutorial_Hint_MobSpawner, + e_Tutorial_Hint_Chest, + e_Tutorial_Hint_Redstone, + e_Tutorial_Hint_Diamond_Ore, + e_Tutorial_Hint_Diamond_Block, + e_Tutorial_Hint_Crafting_Table, + e_Tutorial_Hint_Crops, + e_Tutorial_Hint_Farmland, + e_Tutorial_Hint_Furnace, + e_Tutorial_Hint_Sign, + e_Tutorial_Hint_Door_Wood, + e_Tutorial_Hint_Ladder, + e_Tutorial_Hint_Stairs_Stone, + e_Tutorial_Hint_Rail, + e_Tutorial_Hint_Lever, + e_Tutorial_Hint_PressurePlate, + e_Tutorial_Hint_Door_Iron, + e_Tutorial_Hint_Redstone_Ore, + e_Tutorial_Hint_Redstone_Torch, + e_Tutorial_Hint_Button, + e_Tutorial_Hint_Snow, + e_Tutorial_Hint_Ice, + e_Tutorial_Hint_Cactus, + e_Tutorial_Hint_Clay, + e_Tutorial_Hint_Sugarcane, + e_Tutorial_Hint_Record_Player, + e_Tutorial_Hint_Pumpkin, + e_Tutorial_Hint_Hell_Rock, + e_Tutorial_Hint_Hell_Sand, + e_Tutorial_Hint_Glowstone, + e_Tutorial_Hint_Portal, + e_Tutorial_Hint_Pumpkin_Lit, + e_Tutorial_Hint_Cake, + e_Tutorial_Hint_Redstone_Repeater, + e_Tutorial_Hint_Trapdoor, + e_Tutorial_Hint_Piston, + e_Tutorial_Hint_Sticky_Piston, + e_Tutorial_Hint_Monster_Stone_Egg, + e_Tutorial_Hint_Stone_Brick_Smooth, + e_Tutorial_Hint_Huge_Mushroom, + e_Tutorial_Hint_Iron_Fence, + e_Tutorial_Hint_Thin_Glass, + e_Tutorial_Hint_Melon, + e_Tutorial_Hint_Vine, + e_Tutorial_Hint_Fence_Gate, + e_Tutorial_Hint_Mycel, + e_Tutorial_Hint_Water_Lily, + e_Tutorial_Hint_Nether_Brick, + e_Tutorial_Hint_Nether_Fence, + e_Tutorial_Hint_Nether_Stalk, + e_Tutorial_Hint_Enchant_Table, + e_Tutorial_Hint_Brewing_Stand, + e_Tutorial_Hint_Cauldron, + e_Tutorial_Hint_End_Portal, + e_Tutorial_Hint_End_Portal_Frame, + + e_Tutorial_Hint_Squid, + e_Tutorial_Hint_Cow, + e_Tutorial_Hint_Sheep, + e_Tutorial_Hint_Chicken, + e_Tutorial_Hint_Pig, + e_Tutorial_Hint_Wolf, + e_Tutorial_Hint_Creeper, + e_Tutorial_Hint_Skeleton, + e_Tutorial_Hint_Spider, + e_Tutorial_Hint_Zombie, + e_Tutorial_Hint_Pig_Zombie, + e_Tutorial_Hint_Ghast, + e_Tutorial_Hint_Slime, + e_Tutorial_Hint_Enderman, + e_Tutorial_Hint_Silverfish, + e_Tutorial_Hint_Cave_Spider, + e_Tutorial_Hint_MushroomCow, + e_Tutorial_Hint_SnowMan, + e_Tutorial_Hint_IronGolem, + e_Tutorial_Hint_EnderDragon, + e_Tutorial_Hint_Blaze, + e_Tutorial_Hint_Lava_Slime, + + e_Tutorial_Hint_Ozelot, + e_Tutorial_Hint_Villager, + + e_Tutorial_Hint_Item_Shovel, + e_Tutorial_Hint_Item_Hatchet, + e_Tutorial_Hint_Item_Pickaxe, + e_Tutorial_Hint_Item_Flint_And_Steel, + e_Tutorial_Hint_Item_Apple, + e_Tutorial_Hint_Item_Bow, + e_Tutorial_Hint_Item_Arrow, + e_Tutorial_Hint_Item_Coal, + e_Tutorial_Hint_Item_Diamond, + e_Tutorial_Hint_Item_Iron_Ingot, + e_Tutorial_Hint_Item_Gold_Ingot, + e_Tutorial_Hint_Item_Sword, + e_Tutorial_Hint_Item_Stick, + e_Tutorial_Hint_Item_Bowl, + e_Tutorial_Hint_Item_Mushroom_Stew, + e_Tutorial_Hint_Item_String, + e_Tutorial_Hint_Item_Feather, + e_Tutorial_Hint_Item_Sulphur, + e_Tutorial_Hint_Item_Hoe, + e_Tutorial_Hint_Item_Seeds, + e_Tutorial_Hint_Item_Wheat, + e_Tutorial_Hint_Item_Bread, + e_Tutorial_Hint_Item_Helmet, + e_Tutorial_Hint_Item_Chestplate, + e_Tutorial_Hint_Item_Leggings, + e_Tutorial_Hint_Item_Boots, + e_Tutorial_Hint_Item_Flint, + e_Tutorial_Hint_Item_Porkchop_Raw, + e_Tutorial_Hint_Item_Porkchop_Cooked, + e_Tutorial_Hint_Item_Painting, + e_Tutorial_Hint_Item_Apple_Gold, + e_Tutorial_Hint_Item_Sign, + e_Tutorial_Hint_Item_Door_Wood, + e_Tutorial_Hint_Item_Bucket_Empty, + e_Tutorial_Hint_Item_Bucket_Water, + e_Tutorial_Hint_Item_Bucket_Lava, + e_Tutorial_Hint_Item_Minecart, + e_Tutorial_Hint_Item_Saddle, + e_Tutorial_Hint_Item_Door_Iron, + e_Tutorial_Hint_Item_Redstone, + e_Tutorial_Hint_Item_Snowball, + e_Tutorial_Hint_Item_Boat, + e_Tutorial_Hint_Item_Leather, + e_Tutorial_Hint_Item_Milk, + e_Tutorial_Hint_Item_Brick, + e_Tutorial_Hint_Item_Clay, + e_Tutorial_Hint_Item_Reeds, + e_Tutorial_Hint_Item_Paper, + e_Tutorial_Hint_Item_Book, + e_Tutorial_Hint_Item_Slimeball, + e_Tutorial_Hint_Item_Minecart_Chest, + e_Tutorial_Hint_Item_Minecart_Furnace, + e_Tutorial_Hint_Item_Egg, + e_Tutorial_Hint_Item_Compass, + e_Tutorial_Hint_Item_Clock, + e_Tutorial_Hint_Item_Yellow_Dust, + e_Tutorial_Hint_Item_Fish_Raw, + e_Tutorial_Hint_Item_Fish_Cooked, + e_Tutorial_Hint_Item_Dye_Powder, + e_Tutorial_Hint_Item_Bone, + e_Tutorial_Hint_Item_Sugar, + e_Tutorial_Hint_Item_Cake, + e_Tutorial_Hint_Item_Diode, + e_Tutorial_Hint_Item_Cookie, + e_Tutorial_Hint_Item_Map, + e_Tutorial_Hint_Item_Record, + + e_Tutorial_Hint_White_Stone, + e_Tutorial_Hint_Dragon_Egg, + e_Tutorial_Hint_RedstoneLamp, + e_Tutorial_Hint_Cocoa, + + e_Tutorial_Hint_EmeraldOre, + e_Tutorial_Hint_EmeraldBlock, + e_Tutorial_Hint_EnderChest, + e_Tutorial_Hint_TripwireSource, + e_Tutorial_Hint_Tripwire, + e_Tutorial_Hint_CobblestoneWall, + e_Tutorial_Hint_Flowerpot, + e_Tutorial_Hint_Anvil, + e_Tutorial_Hint_QuartzOre, + e_Tutorial_Hint_QuartzBlock, + e_Tutorial_Hint_WoolCarpet, + + e_Tutorial_Hint_Potato, + e_Tutorial_Hint_Carrot, + + e_Tutorial_Hint_Item_Unused_18, + e_Tutorial_Hint_Item_Unused_19, + e_Tutorial_Hint_Item_Unused_20, + + e_Tutorial_Hint_Item_Max, +}; + +// We store the first time that we complete these tasks to be used in telemetry +enum eTutorial_Telemetry +{ + eTutorial_Telemetry_None = e_Tutorial_Hint_Item_Max, + + eTutorial_Telemetry_TrialStart, + eTutorial_Telemetry_Halfway, + eTutorial_Telemetry_Complete, + + eTutorial_Telemetry_Unused_1, + eTutorial_Telemetry_Unused_2, + eTutorial_Telemetry_Unused_3, + eTutorial_Telemetry_Unused_4, + eTutorial_Telemetry_Unused_5, + eTutorial_Telemetry_Unused_6, + eTutorial_Telemetry_Unused_7, + eTutorial_Telemetry_Unused_8, + eTutorial_Telemetry_Unused_9, + eTutorial_Telemetry_Unused_10, +}; + +enum eTutorial_CompletionAction +{ + e_Tutorial_Completion_None, + e_Tutorial_Completion_Complete_State, // This will make the current tutorial state complete + e_Tutorial_Completion_Complete_State_Gameplay_Constraints, // This will make the current tutorial state complete, and move the delayed constraints to the gameplay state + e_Tutorial_Completion_Jump_To_Last_Task, +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TutorialHint.cpp b/Minecraft.Client/Common/Tutorial/TutorialHint.cpp new file mode 100644 index 00000000..5f0808bf --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TutorialHint.cpp @@ -0,0 +1,128 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "Tutorial.h" +#include "TutorialHint.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" + +TutorialHint::TutorialHint(eTutorial_Hint id, Tutorial *tutorial, int descriptionId, eHintType type, bool allowFade /*= true*/) + : m_id( id ), m_tutorial(tutorial), m_descriptionId( descriptionId ), m_type( type ), m_counter( 0 ), + m_lastTile( NULL ), m_hintNeeded( true ), m_allowFade(allowFade) +{ + tutorial->addMessage(descriptionId, type != e_Hint_NoIngredients); +} + +int TutorialHint::startDestroyBlock(shared_ptr item, Tile *tile) +{ + int returnVal = -1; + switch(m_type) + { + case e_Hint_HoldToMine: + if( tile == m_lastTile && m_hintNeeded ) + { + ++m_counter; + if(m_counter > TUTORIAL_HINT_MAX_MINE_REPEATS) + { + returnVal = m_descriptionId; + } + } + else + { + m_counter = 0; + } + m_lastTile = tile; + break; + default: + break; + } + + return returnVal; +} + +int TutorialHint::destroyBlock(Tile *tile) +{ + int returnVal = -1; + switch(m_type) + { + case e_Hint_HoldToMine: + if(tile == m_lastTile && m_counter > 0) + { + m_hintNeeded = false; + } + break; + default: + break; + } + + return returnVal; +} + +int TutorialHint::attack(shared_ptr item, shared_ptr entity) +{ + /* + switch(m_type) + { + default: + return -1; + } + */ + return -1; +} + +int TutorialHint::createItemSelected(shared_ptr item, bool canMake) +{ + int returnVal = -1; + switch(m_type) + { + case e_Hint_NoIngredients: + if(!canMake) + returnVal = m_descriptionId; + break; + default: + break; + } + return returnVal; +} + +int TutorialHint::itemDamaged(shared_ptr item) +{ + int returnVal = -1; + switch(m_type) + { + case e_Hint_ToolDamaged: + returnVal = m_descriptionId; + break; + default: + break; + } + return returnVal; +} + +bool TutorialHint::onTake( shared_ptr item ) +{ + return false; +} + +bool TutorialHint::onLookAt(int id, int iData) +{ + return false; +} + +bool TutorialHint::onLookAtEntity(eINSTANCEOF type) +{ + return false; +} + +int TutorialHint::tick() +{ + int returnVal = -1; + switch(m_type) + { + case e_Hint_SwimUp: + if( Minecraft::GetInstance()->localplayers[m_tutorial->getPad()]->isUnderLiquid(Material::water) ) returnVal = m_descriptionId; + break; + } + return returnVal; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TutorialHint.h b/Minecraft.Client/Common/Tutorial/TutorialHint.h new file mode 100644 index 00000000..8ca543cc --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TutorialHint.h @@ -0,0 +1,53 @@ +#pragma once +using namespace std; + +#include "TutorialEnum.h" + +#define TUTORIAL_HINT_MAX_MINE_REPEATS 20 + +class Level; +class Tutorial; + +class TutorialHint +{ +public: + enum eHintType + { + e_Hint_DiggerItem, + e_Hint_HoldToMine, + e_Hint_NoIngredients, + e_Hint_ToolDamaged, + e_Hint_TakeItem, + e_Hint_Area, + e_Hint_LookAtTile, + e_Hint_LookAtEntity, + e_Hint_SwimUp, + }; + +protected: + eHintType m_type; + int m_descriptionId; + Tutorial *m_tutorial; + eTutorial_Hint m_id; + + int m_counter; + Tile *m_lastTile; + bool m_hintNeeded; + bool m_allowFade; + +public: + TutorialHint(eTutorial_Hint id, Tutorial *tutorial, int descriptionId, eHintType type, bool allowFade = true); + + eTutorial_Hint getId() { return m_id; } + + virtual int startDestroyBlock(shared_ptr item, Tile *tile); + virtual int destroyBlock(Tile *tile); + virtual int attack(shared_ptr item, shared_ptr entity); + virtual int createItemSelected(shared_ptr item, bool canMake); + virtual int itemDamaged(shared_ptr item); + virtual bool onTake( shared_ptr item ); + virtual bool onLookAt(int id, int iData=0); + virtual bool onLookAtEntity(eINSTANCEOF type); + virtual int tick(); + virtual bool allowFade() { return m_allowFade; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TutorialHints.h b/Minecraft.Client/Common/Tutorial/TutorialHints.h new file mode 100644 index 00000000..5c7381ab --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TutorialHints.h @@ -0,0 +1,7 @@ +#pragma once + +#include "AreaHint.h" +#include "DiggerItemHint.h" +#include "LookAtTileHint.h" +#include "TakeItemHint.h" +#include "LookAtEntityHint.h" \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TutorialMessage.cpp b/Minecraft.Client/Common/Tutorial/TutorialMessage.cpp new file mode 100644 index 00000000..1f007035 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TutorialMessage.cpp @@ -0,0 +1,23 @@ +#include "stdafx.h" +#include "TutorialMessage.h" + +TutorialMessage::TutorialMessage(int messageId, bool limitRepeats /*= false*/, unsigned char numRepeats /*= TUTORIAL_MESSAGE_DEFAULT_SHOW*/) + : messageId( messageId ), limitRepeats( limitRepeats ), numRepeats( numRepeats ), timesShown( 0 ) +{ +} + +bool TutorialMessage::canDisplay() +{ + return !limitRepeats || (timesShown < numRepeats); +} + +LPCWSTR TutorialMessage::getMessageForDisplay() +{ + if(!canDisplay()) + return L""; + + if(limitRepeats) + ++timesShown; + + return app.GetString( messageId ); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TutorialMessage.h b/Minecraft.Client/Common/Tutorial/TutorialMessage.h new file mode 100644 index 00000000..6a0b4d46 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TutorialMessage.h @@ -0,0 +1,20 @@ +#pragma once + +// The default number of times any message should be shown +#define TUTORIAL_MESSAGE_DEFAULT_SHOW 3 + +class TutorialMessage +{ +private: + int messageId; + bool limitRepeats; + unsigned char numRepeats; + unsigned char timesShown; + DWORD lastDisplayed; + +public: + TutorialMessage(int messageId, bool limitRepeats = false, unsigned char numRepeats = TUTORIAL_MESSAGE_DEFAULT_SHOW); + + bool canDisplay(); + LPCWSTR getMessageForDisplay(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TutorialMode.cpp b/Minecraft.Client/Common/Tutorial/TutorialMode.cpp new file mode 100644 index 00000000..82c81598 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TutorialMode.cpp @@ -0,0 +1,124 @@ +#include "stdafx.h" +#include +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\MultiPlayerLevel.h" +#include "..\..\..\Minecraft.World\Inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "TutorialMode.h" + +TutorialMode::TutorialMode(int iPad, Minecraft *minecraft, ClientConnection *connection) : MultiPlayerGameMode( minecraft, connection ), m_iPad( iPad ) +{ +} + +TutorialMode::~TutorialMode() +{ + if(tutorial != NULL) + delete tutorial; +} + +void TutorialMode::startDestroyBlock(int x, int y, int z, int face) +{ + if(!tutorial->m_allTutorialsComplete) + { + int t = minecraft->level->getTile(x, y, z); + tutorial->startDestroyBlock(minecraft->player->inventory->getSelected(), Tile::tiles[t]); + } + MultiPlayerGameMode::startDestroyBlock( x, y, z, face ); +} + +bool TutorialMode::destroyBlock(int x, int y, int z, int face) +{ + if(!tutorial->m_allTutorialsComplete) + { + int t = minecraft->level->getTile(x, y, z); + tutorial->destroyBlock(Tile::tiles[t]); + } + shared_ptr item = minecraft->player->getSelectedItem(); + int damageBefore; + if(item != NULL) + { + damageBefore = item->getDamageValue(); + } + bool changed = MultiPlayerGameMode::destroyBlock( x, y, z, face ); + + if(!tutorial->m_allTutorialsComplete) + { + if ( item != NULL && item->isDamageableItem() ) + { + int max = item->getMaxDamage(); + int damageNow = item->getDamageValue(); + + if(damageNow > damageBefore && damageNow > (max/2) ) + { + tutorial->itemDamaged( item ); + } + } + } + + return changed; +} + +void TutorialMode::tick() +{ + MultiPlayerGameMode::tick(); + + if(!tutorial->m_allTutorialsComplete) + tutorial->tick(); + + /* + if( tutorial.m_allTutorialsComplete && (tutorial.lastMessageTime + m_iTutorialDisplayMessageTime) < GetTickCount() ) + { + // Exit tutorial + minecraft->gameMode = new SurvivalMode( this ); + delete this; + } + */ +} + +bool TutorialMode::useItemOn(shared_ptr player, Level *level, shared_ptr item, int x, int y, int z, int face, Vec3 *hit, bool bTestUseOnly, bool *pbUsedItem) +{ + bool haveItem = false; + int itemCount = 0; + if(!tutorial->m_allTutorialsComplete) + { + tutorial->useItemOn(level, item, x, y, z, bTestUseOnly); + + if(!bTestUseOnly) + { + if(item != NULL) + { + haveItem = true; + itemCount = item->count; + } + } + } + bool result = MultiPlayerGameMode::useItemOn( player, level, item, x, y, z, face, hit, bTestUseOnly, pbUsedItem ); + + if(!bTestUseOnly) + { + if(!tutorial->m_allTutorialsComplete) + { + if( result && haveItem && itemCount > item->count ) + { + tutorial->useItemOn(item); + } + } + } + return result; +} + +void TutorialMode::attack(shared_ptr player, shared_ptr entity) +{ + if(!tutorial->m_allTutorialsComplete) + tutorial->attack(player, entity); + + MultiPlayerGameMode::attack( player, entity ); +} + +bool TutorialMode::isInputAllowed(int mapping) +{ + return tutorial->m_allTutorialsComplete || tutorial->isInputAllowed( mapping ); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TutorialMode.h b/Minecraft.Client/Common/Tutorial/TutorialMode.h new file mode 100644 index 00000000..75e24edf --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TutorialMode.h @@ -0,0 +1,28 @@ +#pragma once +using namespace std; + +#include "..\..\MultiPlayerGameMode.h" +#include "Tutorial.h" + +class TutorialMode : public MultiPlayerGameMode +{ +protected: + Tutorial *tutorial; + int m_iPad; + + // Function to make this an abstract class + virtual bool isImplemented() = 0; +public: + TutorialMode(int iPad, Minecraft *minecraft, ClientConnection *connection); + virtual ~TutorialMode(); + + virtual void startDestroyBlock(int x, int y, int z, int face); + virtual bool destroyBlock(int x, int y, int z, int face); + virtual void tick(); + virtual bool useItemOn(shared_ptr player, Level *level, shared_ptr item, int x, int y, int z, int face, Vec3 *hit, bool bTestUseOnly=false, bool *pbUsedItem=NULL); + virtual void attack(shared_ptr player, shared_ptr entity); + + virtual bool isInputAllowed(int mapping); + + Tutorial *getTutorial() { return tutorial; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TutorialTask.cpp b/Minecraft.Client/Common/Tutorial/TutorialTask.cpp new file mode 100644 index 00000000..2251ab07 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TutorialTask.cpp @@ -0,0 +1,78 @@ +#include "stdafx.h" +#include "Tutorial.h" +#include "TutorialConstraints.h" +#include "TutorialTask.h" + +TutorialTask::TutorialTask(Tutorial *tutorial, int descriptionId, bool enablePreCompletion, vector *inConstraints, + bool bShowMinimumTime, bool bAllowFade, bool bTaskReminders) + : tutorial( tutorial ), descriptionId( descriptionId ), m_promptId( -1 ), enablePreCompletion( enablePreCompletion ), + areConstraintsEnabled( false ), bIsCompleted( false ), bHasBeenActivated( false ), + m_bAllowFade(bAllowFade), m_bTaskReminders(bTaskReminders), m_bShowMinimumTime( bShowMinimumTime), m_bShownForMinimumTime( false ) +{ + if(inConstraints != NULL) + { + for(AUTO_VAR(it, inConstraints->begin()); it < inConstraints->end(); ++it) + { + TutorialConstraint *constraint = *it; + constraints.push_back( constraint ); + } + delete inConstraints; + } + + tutorial->addMessage(descriptionId); +} + +TutorialTask::~TutorialTask() +{ + enableConstraints(false); + + for(AUTO_VAR(it, constraints.begin()); it < constraints.end(); ++it) + { + TutorialConstraint *constraint = *it; + + if( constraint->getQueuedForRemoval() ) + { + constraint->setDeleteOnDeactivate(true); + } + else + { + delete constraint; + } + } +} + +void TutorialTask::taskCompleted() +{ + if( areConstraintsEnabled == true ) + enableConstraints( false ); +} + +void TutorialTask::enableConstraints(bool enable, bool delayRemove /*= false*/) +{ + if( !enable && (areConstraintsEnabled || !delayRemove) ) + { + // Remove + for(AUTO_VAR(it, constraints.begin()); it != constraints.end(); ++it) + { + TutorialConstraint *constraint = *it; + //app.DebugPrintf(">>>>>>>> %i\n", constraints.size()); + tutorial->RemoveConstraint( constraint, delayRemove ); + } + areConstraintsEnabled = false; + } + else if( !areConstraintsEnabled && enable ) + { + // Add + for(AUTO_VAR(it, constraints.begin()); it != constraints.end(); ++it) + { + TutorialConstraint *constraint = *it; + tutorial->AddConstraint( constraint ); + } + areConstraintsEnabled = true; + } +} + +void TutorialTask::setAsCurrentTask(bool active /*= true*/) +{ + bHasBeenActivated = active; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TutorialTask.h b/Minecraft.Client/Common/Tutorial/TutorialTask.h new file mode 100644 index 00000000..92cb5999 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TutorialTask.h @@ -0,0 +1,63 @@ +#pragma once +using namespace std; +#include "TutorialEnum.h" + +class Level; +class Tutorial; +class TutorialConstraint; +class MobEffect; + +// A class that represents each individual task in the tutorial. +// +// Members: +// enablePreCompletion - If this is true, then the player can complete this task out of sequence. +// This stops us asking them to do things they have already done +// constraints - A list of constraints which can be activated (as a whole). +// If they are active, then the constraints are removed when the task is completed +// areConstraintsEnabled- A flag which records whether or not we have added the constraints to the tutorial +class TutorialTask +{ +protected: + int descriptionId; + int m_promptId; + Tutorial *tutorial; + bool enablePreCompletion; + bool bHasBeenActivated; + bool m_bAllowFade; + bool m_bTaskReminders; + bool m_bShowMinimumTime; + +protected: + bool bIsCompleted; + bool m_bShownForMinimumTime; + vector constraints; + bool areConstraintsEnabled; +public: + TutorialTask(Tutorial *tutorial, int descriptionId, bool enablePreCompletion, vector *inConstraints, bool bShowMinimumTime=false, bool bAllowFade=true, bool m_bTaskReminders=true ); + virtual ~TutorialTask(); + + virtual int getDescriptionId() { return descriptionId; } + virtual int getPromptId() { return m_promptId; } + + virtual bool isCompleted() = 0; + virtual eTutorial_CompletionAction getCompletionAction() { return e_Tutorial_Completion_None; } + virtual bool isPreCompletionEnabled() { return enablePreCompletion; } + virtual void taskCompleted(); + virtual void enableConstraints(bool enable, bool delayRemove = false); + virtual void setAsCurrentTask(bool active = true); + + virtual void setShownForMinimumTime() { m_bShownForMinimumTime = true; } + virtual bool hasBeenActivated() { return bHasBeenActivated; } + virtual bool AllowFade() { return m_bAllowFade;} + bool TaskReminders() { return m_bTaskReminders;} + virtual bool ShowMinimumTime() { return m_bShowMinimumTime;} + + virtual void useItemOn(Level *level, shared_ptr item, int x, int y, int z, bool bTestUseOnly=false) { } + virtual void useItem(shared_ptr item,bool bTestUseOnly=false) { } + virtual void completeUsingItem(shared_ptr item) { } + virtual void handleUIInput(int iAction) { } + virtual void onCrafted(shared_ptr item) { } + virtual void onTake(shared_ptr item, unsigned int invItemCountAnyAux, unsigned int invItemCountThisAux) { } + virtual void onStateChange(eTutorial_State newState) { } + virtual void onEffectChanged(MobEffect *effect, bool bRemoved=false) { } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/TutorialTasks.h b/Minecraft.Client/Common/Tutorial/TutorialTasks.h new file mode 100644 index 00000000..591e9564 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/TutorialTasks.h @@ -0,0 +1,16 @@ +#include "StatTask.h" +#include "CraftTask.h" +#include "PickupTask.h" +#include "UseTileTask.h" +#include "UseItemTask.h" +#include "InfoTask.h" +#include "ControllerTask.h" +#include "ProcedureCompoundTask.h" +#include "XuiCraftingTask.h" +#include "StateChangeTask.h" +#include "ChoiceTask.h" +#include "FullTutorialActiveTask.h" +#include "AreaTask.h" +#include "ProgressFlagTask.h" +#include "CompleteUsingItemTask.h" +#include "EffectChangedTask.h" \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/UseItemTask.cpp b/Minecraft.Client/Common/Tutorial/UseItemTask.cpp new file mode 100644 index 00000000..09bac4d1 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/UseItemTask.cpp @@ -0,0 +1,25 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\Entity.h" +#include "..\..\..\Minecraft.World\Level.h" +#include "..\..\..\Minecraft.World\ItemInstance.h" +#include "UseItemTask.h" + +UseItemTask::UseItemTask(const int itemId, Tutorial *tutorial, int descriptionId, + bool enablePreCompletion, vector *inConstraints, bool bShowMinimumTime, bool bAllowFade, bool bTaskReminders) + : TutorialTask( tutorial, descriptionId, enablePreCompletion, inConstraints, bShowMinimumTime, bAllowFade, bTaskReminders ), + itemId( itemId ) +{ +} + +bool UseItemTask::isCompleted() +{ + return bIsCompleted; +} + +void UseItemTask::useItem(shared_ptr item,bool bTestUseOnly) +{ + if(bTestUseOnly) return; + + if( item->id == itemId ) + bIsCompleted = true; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/UseItemTask.h b/Minecraft.Client/Common/Tutorial/UseItemTask.h new file mode 100644 index 00000000..46d71be4 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/UseItemTask.h @@ -0,0 +1,20 @@ +#pragma once +using namespace std; + +#include "TutorialTask.h" + +class Level; + +// 4J Stu - Tasks that involve placing a tile +class UseItemTask : public TutorialTask +{ +private: + const int itemId; + bool completed; + +public: + UseItemTask(const int itemId, Tutorial *tutorial, int descriptionId, + bool enablePreCompletion = false, vector *inConstraints = NULL, bool bShowMinimumTime = false, bool bAllowFade = true, bool bTaskReminders = true ); + virtual bool isCompleted(); + virtual void useItem(shared_ptr item, bool bTestUseOnly=false); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/UseTileTask.cpp b/Minecraft.Client/Common/Tutorial/UseTileTask.cpp new file mode 100644 index 00000000..1f4ed4cb --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/UseTileTask.cpp @@ -0,0 +1,40 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\Entity.h" +#include "..\..\..\Minecraft.World\Level.h" +#include "..\..\..\Minecraft.World\ItemInstance.h" +#include "UseTileTask.h" + +UseTileTask::UseTileTask(const int tileId, int x, int y, int z, Tutorial *tutorial, int descriptionId, + bool enablePreCompletion, vector *inConstraints, bool bShowMinimumTime, bool bAllowFade, bool bTaskReminders) + : TutorialTask( tutorial, descriptionId, enablePreCompletion, inConstraints, bShowMinimumTime, bAllowFade, bTaskReminders ), + x( x ), y( y ), z( z ), tileId( tileId ) +{ + useLocation = true; +} + +UseTileTask::UseTileTask(const int tileId, Tutorial *tutorial, int descriptionId, + bool enablePreCompletion, vector *inConstraints, bool bShowMinimumTime, bool bAllowFade, bool bTaskReminders) + : TutorialTask( tutorial, descriptionId, enablePreCompletion, inConstraints, bShowMinimumTime, bAllowFade, bTaskReminders ), + tileId( tileId ) +{ + useLocation = false; +} + +bool UseTileTask::isCompleted() +{ + return bIsCompleted; +} + +void UseTileTask::useItemOn(Level *level, shared_ptr item, int x, int y, int z,bool bTestUseOnly) +{ + if(bTestUseOnly) return; + + if( !enablePreCompletion && !bHasBeenActivated) return; + + if( !useLocation || ( x == this->x && y == this->y && z == this->z ) ) + { + int t = level->getTile(x, y, z); + if( t == tileId ) + bIsCompleted = true; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/UseTileTask.h b/Minecraft.Client/Common/Tutorial/UseTileTask.h new file mode 100644 index 00000000..74b3a40c --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/UseTileTask.h @@ -0,0 +1,24 @@ +#pragma once +using namespace std; + +#include "TutorialTask.h" + +class Level; + +// 4J Stu - Tasks that involve using a tile, with or without an item. e.g. Opening a chest +class UseTileTask : public TutorialTask +{ +private: + int x,y,z; + const int tileId; + bool useLocation; + bool completed; + +public: + UseTileTask(const int tileId, int x, int y, int z, Tutorial *tutorial, int descriptionId, + bool enablePreCompletion = false, vector *inConstraints = NULL, bool bShowMinimumTime = false, bool bAllowFade = true, bool bTaskReminders = true ); + UseTileTask(const int tileId, Tutorial *tutorial, int descriptionId, + bool enablePreCompletion = false, vector *inConstraints = NULL, bool bShowMinimumTime = false, bool bAllowFade = true, bool bTaskReminders = true); + virtual bool isCompleted(); + virtual void useItemOn(Level *level, shared_ptr item, int x, int y, int z, bool bTestUseOnly=false); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/XuiCraftingTask.cpp b/Minecraft.Client/Common/Tutorial/XuiCraftingTask.cpp new file mode 100644 index 00000000..71b88479 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/XuiCraftingTask.cpp @@ -0,0 +1,42 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\ItemInstance.h" +#if !(defined _XBOX) && !(defined __PSVITA__) +#include "..\UI\UI.h" +#endif +#include "Tutorial.h" +#include "XuiCraftingTask.h" + +bool XuiCraftingTask::isCompleted() +{ +#ifndef __PSVITA__ + // This doesn't seem to work + //IUIScene_CraftingMenu *craftScene = reinterpret_cast(tutorial->getScene()); +#ifdef _XBOX + CXuiSceneCraftingPanel *craftScene = (CXuiSceneCraftingPanel *)(tutorial->getScene()); +#else + UIScene_CraftingMenu *craftScene = reinterpret_cast(tutorial->getScene()); +#endif + + bool completed = false; + + switch(m_type) + { + case e_Crafting_SelectGroup: + if(craftScene != NULL && craftScene->getCurrentGroup() == m_group) + { + completed = true; + } + break; + case e_Crafting_SelectItem: + if(craftScene != NULL && craftScene->isItemSelected(m_item)) + { + completed = true; + } + break; + } + + return completed; +#else + return true; +#endif +} diff --git a/Minecraft.Client/Common/Tutorial/XuiCraftingTask.h b/Minecraft.Client/Common/Tutorial/XuiCraftingTask.h new file mode 100644 index 00000000..2dc48709 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/XuiCraftingTask.h @@ -0,0 +1,36 @@ +#pragma once +#include "TutorialTask.h" +#include "..\..\..\Minecraft.World\Recipy.h" + +class XuiCraftingTask : public TutorialTask +{ +public: + enum eCraftingTaskType + { + e_Crafting_SelectGroup, + e_Crafting_SelectItem, + }; + + // Select group + XuiCraftingTask(Tutorial *tutorial, int descriptionId, Recipy::_eGroupType groupToSelect, bool enablePreCompletion = false, vector *inConstraints = NULL, + bool bShowMinimumTime=false, bool bAllowFade=true, bool m_bTaskReminders=true ) + : TutorialTask(tutorial, descriptionId, enablePreCompletion, inConstraints, bShowMinimumTime, bAllowFade, m_bTaskReminders ), + m_group(groupToSelect), + m_type( e_Crafting_SelectGroup ) + {} + + // Select Item + XuiCraftingTask(Tutorial *tutorial, int descriptionId, int itemId, bool enablePreCompletion = false, vector *inConstraints = NULL, + bool bShowMinimumTime=false, bool bAllowFade=true, bool m_bTaskReminders=true ) + : TutorialTask(tutorial, descriptionId, enablePreCompletion, inConstraints, bShowMinimumTime, bAllowFade, m_bTaskReminders ), + m_item(itemId), + m_type( e_Crafting_SelectItem ) + {} + + virtual bool isCompleted(); + +private: + eCraftingTaskType m_type; + Recipy::_eGroupType m_group; + int m_item; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIController.h b/Minecraft.Client/Common/UI/IUIController.h new file mode 100644 index 00000000..319185d8 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIController.h @@ -0,0 +1,77 @@ +#pragma once + +#include "UIEnums.h" + +// 4J Stu - An interface class that defines all the public functions that we use within the game code. This allows us to build the Xbox 360 version without +// using the base UIController class used by the other platforms +class IUIController +{ +public: + virtual void tick() = 0; + virtual void render() = 0; + virtual void StartReloadSkinThread() = 0; + virtual bool IsReloadingSkin() = 0; + virtual void CleanUpSkinReload() = 0; + virtual bool NavigateToScene(int iPad, EUIScene scene, void *initData = NULL, EUILayer layer = eUILayer_Scene, EUIGroup group = eUIGroup_PAD) = 0; + virtual bool NavigateBack(int iPad, bool forceUsePad = false, EUIScene eScene = eUIScene_COUNT, EUILayer eLayer = eUILayer_COUNT) = 0; + virtual void CloseUIScenes(int iPad, bool forceIPad = false) = 0; + virtual void CloseAllPlayersScenes() = 0; + + virtual bool IsPauseMenuDisplayed(int iPad) = 0; + virtual bool IsContainerMenuDisplayed(int iPad) = 0; + virtual bool IsIgnorePlayerJoinMenuDisplayed(int iPad) = 0; + virtual bool IsIgnoreAutosaveMenuDisplayed(int iPad) = 0; + virtual void SetIgnoreAutosaveMenuDisplayed(int iPad, bool displayed) = 0; + virtual bool IsSceneInStack(int iPad, EUIScene eScene) = 0; + virtual bool GetMenuDisplayed(int iPad) = 0; + virtual void CheckMenuDisplayed() = 0; + + virtual void SetTooltipText( unsigned int iPad, unsigned int tooltip, int iTextID ) = 0; + virtual void SetEnableTooltips( unsigned int iPad, BOOL bVal ) = 0; + virtual void ShowTooltip( unsigned int iPad, unsigned int tooltip, bool show ) = 0; + virtual void SetTooltips( unsigned int iPad, int iA, int iB=-1, int iX=-1, int iY=-1 , int iLT=-1, int iRT=-1, int iLB=-1, int iRB=-1, int iLS=-1, bool forceUpdate = false) = 0; + virtual void EnableTooltip( unsigned int iPad, unsigned int tooltip, bool enable ) = 0; + virtual void RefreshTooltips(unsigned int iPad) = 0; + + virtual void PlayUISFX(ESoundEffect eSound) = 0; + + virtual void ShowUIDebugConsole(bool show) {} + virtual void ShowUIDebugMarketingGuide(bool show) {} + + virtual void DisplayGamertag(unsigned int iPad, bool show) = 0; + virtual void SetSelectedItem(unsigned int iPad, const wstring &name) = 0; + virtual void UpdateSelectedItemPos(unsigned int iPad) = 0; + + virtual void HandleDLCMountingComplete() = 0; + virtual void HandleDLCInstalled(int iPad) = 0; +#ifdef _XBOX_ONE + virtual void HandleDLCLicenseChange() = 0; +#endif + virtual void HandleTMSDLCFileRetrieved(int iPad) = 0; + virtual void HandleTMSBanFileRetrieved(int iPad) = 0; + virtual void HandleInventoryUpdated(int iPad) = 0; + virtual void HandleGameTick() = 0; + + virtual void SetTutorialDescription(int iPad, TutorialPopupInfo *info) = 0; + virtual void SetTutorialVisible(int iPad, bool visible) = 0; + virtual bool IsTutorialVisible(int iPad) = 0; + + virtual void UpdatePlayerBasePositions() = 0; + virtual void SetEmptyQuadrantLogo(int iSection) = 0; + virtual void HideAllGameUIElements() = 0; + virtual void ShowOtherPlayersBaseScene(unsigned int iPad, bool show) = 0; + + virtual void ShowTrialTimer(bool show) = 0; + virtual void SetTrialTimerLimitSecs(unsigned int uiSeconds) = 0; + virtual void UpdateTrialTimer(unsigned int iPad) = 0; + virtual void ReduceTrialTimerValue() = 0; + + virtual void ShowAutosaveCountdownTimer(bool show) = 0; + virtual void UpdateAutosaveCountdownTimer(unsigned int uiSeconds) = 0; + virtual void ShowSavingMessage(unsigned int iPad, C4JStorage::ESavingMessage eVal) = 0; + + virtual bool PressStartPlaying(unsigned int iPad) = 0; + virtual void ShowPressStart(unsigned int iPad) = 0; + + virtual void SetWinUserIndex(unsigned int iPad) = 0; +}; diff --git a/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp new file mode 100644 index 00000000..29ddcf71 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp @@ -0,0 +1,1635 @@ +#include "stdafx.h" + +#include "IUIScene_AbstractContainerMenu.h" + +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.crafting.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\Minecraft.h" + +#ifdef __ORBIS__ +#include +#endif + +IUIScene_AbstractContainerMenu::IUIScene_AbstractContainerMenu() +{ + m_menu = NULL; + m_autoDeleteMenu = false; + m_lastPointerLabelSlot = NULL; + + m_pointerPos.x = 0.0f; + m_pointerPos.y = 0.0f; + +} + +IUIScene_AbstractContainerMenu::~IUIScene_AbstractContainerMenu() +{ + // Delete associated menu if we were requested to on initialisation. Most menus are + // created just before calling CXuiSceneAbstractContainer::Initialize, but the player's inventorymenu + // is also passed directly and we don't want to go deleting that + if( m_autoDeleteMenu ) delete m_menu; +} + +void IUIScene_AbstractContainerMenu::Initialize(int iPad, AbstractContainerMenu* menu, bool autoDeleteMenu, int startIndex,ESceneSection firstSection,ESceneSection maxSection, bool bNavigateBack) +{ + assert( menu != NULL ); + + m_menu = menu; + m_autoDeleteMenu = autoDeleteMenu; + + Minecraft::GetInstance()->localplayers[iPad]->containerMenu = menu; + + // 4J WESTY - New tool tips to support pointer prototype. + //UpdateTooltips(); + // Default tooltips. + for ( int i = 0; i < eToolTipNumButtons; ++i ) + { + m_aeToolTipSettings[ i ] = eToolTipNone; + } + // 4J-PB - don't set the eToolTipPickupPlace_OLD here - let the timer do it. + /*SetToolTip( eToolTipButtonA, eToolTipPickupPlace_OLD );*/ + SetToolTip( eToolTipButtonB, eToolTipExit ); + SetToolTip( eToolTipButtonA, eToolTipNone ); + SetToolTip( eToolTipButtonX, eToolTipNone ); + SetToolTip( eToolTipButtonY, eToolTipNone ); + + // 4J WESTY : To indicate if pointer has left menu window area. + m_bPointerOutsideMenu = false; + + // 4J Stu - Store the enum range for the current scene + m_eFirstSection = firstSection; + m_eMaxSection = maxSection; + + m_iConsectiveInputTicks = 0; + + m_bNavigateBack = bNavigateBack; + + // Put the pointer over first item in use row to start with. +#ifdef TAP_DETECTION + m_eCurrSection = firstSection; + m_eCurrTapState = eTapStateNoInput; + m_iCurrSlotX = 0; + m_iCurrSlotY = 0; +#endif // TAP_DETECTION + // + // for(int i=0;i= columns) + { + *piTargetX = columns - 1; + } + else + { + *piTargetX = offsetX; + } + } + else + { + // Update X + int offsetX = (*piTargetX) - xOffset; + if( offsetX < 0 ) + { + *piTargetX = columns - 1; + } + else if (offsetX >= columns) + { + *piTargetX = 0; + } + else + { + *piTargetX = offsetX; + } + } +} + +#ifdef TAP_DETECTION +IUIScene_AbstractContainerMenu::ETapState IUIScene_AbstractContainerMenu::GetTapInputType( float fInputX, float fInputY ) +{ + if ( ( fabs( fInputX ) < 0.3f ) && ( fabs( fInputY ) < 0.3f ) ) + { + return eTapStateNoInput; + } + else if ( ( fInputX < -0.3f ) && ( fabs( fInputY ) < 0.3f ) ) + { + return eTapStateLeft; + } + else if ( ( fInputX > 0.3f ) && ( fabs( fInputY ) < 0.3f ) ) + { + return eTapStateRight; + } + else if ( ( fInputY < -0.3f ) && ( fabs( fInputX ) < 0.3f ) ) + { + return eTapStateDown; + } + else if ( ( fInputY > 0.3f ) && ( fabs( fInputX ) < 0.3f ) ) + { + return eTapStateUp; + } + else + { + return eTapNone; + } +} +#endif // TAP_DETECTION + +void IUIScene_AbstractContainerMenu::SetToolTip( EToolTipButton eButton, EToolTipItem eItem ) +{ + if ( m_aeToolTipSettings[ eButton ] != eItem ) + { + m_aeToolTipSettings[ eButton ] = eItem; + UpdateTooltips(); + } +} + +void IUIScene_AbstractContainerMenu::UpdateTooltips() +{ + // Table gives us text id for tooltip. + static const DWORD kaToolTipextIds[ eNumToolTips ] = + { + IDS_TOOLTIPS_PICKUPPLACE, //eToolTipPickupPlace_OLD + IDS_TOOLTIPS_EXIT, // eToolTipExit + IDS_TOOLTIPS_PICKUP_GENERIC, // eToolTipPickUpGeneric + IDS_TOOLTIPS_PICKUP_ALL, // eToolTipPickUpAll + IDS_TOOLTIPS_PICKUP_HALF, // eToolTipPickUpHalf + IDS_TOOLTIPS_PLACE_GENERIC, // eToolTipPlaceGeneric + IDS_TOOLTIPS_PLACE_ONE, // eToolTipPlaceOne + IDS_TOOLTIPS_PLACE_ALL, // eToolTipPlaceAll + IDS_TOOLTIPS_DROP_GENERIC, // eToolTipDropGeneric + IDS_TOOLTIPS_DROP_ONE, // eToolTipDropOne + IDS_TOOLTIPS_DROP_ALL, // eToolTipDropAll + IDS_TOOLTIPS_SWAP, // eToolTipSwap + IDS_TOOLTIPS_QUICK_MOVE, // eToolTipQuickMove + IDS_TOOLTIPS_QUICK_MOVE_INGREDIENT, // eToolTipQuickMoveIngredient + IDS_TOOLTIPS_QUICK_MOVE_FUEL, // eToolTipQuickMoveTool + IDS_TOOLTIPS_WHAT_IS_THIS, // eToolTipWhatIsThis + IDS_TOOLTIPS_EQUIP, // eToolTipEquip + IDS_TOOLTIPS_CLEAR_QUICK_SELECT, // eToolTipClearQuickSelect + IDS_TOOLTIPS_QUICK_MOVE_TOOL, // eToolTipQuickMoveTool + IDS_TOOLTIPS_QUICK_MOVE_ARMOR, // eToolTipQuickMoveTool + IDS_TOOLTIPS_QUICK_MOVE_WEAPON, // eToolTipQuickMoveTool + IDS_TOOLTIPS_DYE, // eToolTipDye + IDS_TOOLTIPS_REPAIR, // eToolTipRepair + }; + + BYTE focusUser = getPad(); + + for ( int i = 0; i < eToolTipNumButtons; ++i ) + { + if ( m_aeToolTipSettings[ i ] == eToolTipNone ) + { + ui.ShowTooltip( focusUser, i, FALSE ); + } + else + { + ui.SetTooltipText( focusUser, i, kaToolTipextIds[ m_aeToolTipSettings[ i ] ] ); + ui.ShowTooltip( focusUser, i, TRUE ); + } + } +} + +void IUIScene_AbstractContainerMenu::onMouseTick() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->localgameModes[getPad()] != NULL) + { + Tutorial *tutorial = pMinecraft->localgameModes[getPad()]->getTutorial(); + if(tutorial != NULL) + { + if(ui.IsTutorialVisible(getPad()) && !tutorial->isInputAllowed(ACTION_MENU_UP)) + { + return; + } + } + } + + // Offset to display carried item attached to pointer. + // static const float kfCarriedItemOffsetX = -5.0f; + // static const float kfCarriedItemOffsetY = -5.0f; + float fInputDirX=0.0f; + float fInputDirY=0.0f; + + // Get current pointer position. + UIVec2D vPointerPos = m_pointerPos; + + // Offset to image centre. + vPointerPos.x += m_fPointerImageOffsetX; + vPointerPos.y += m_fPointerImageOffsetY; + + // Get stick input. + int iPad = getPad(); + + bool bStickInput = false; + float fInputX = InputManager.GetJoypadStick_LX( iPad, false )*((float)app.GetGameSettings(iPad,eGameSetting_Sensitivity_InMenu)/100.0f); // apply the sensitivity + float fInputY = InputManager.GetJoypadStick_LY( iPad, false )*((float)app.GetGameSettings(iPad,eGameSetting_Sensitivity_InMenu)/100.0f); // apply the sensitivity + +#ifdef __ORBIS__ + // should have sensitivity for the touchpad + //(float)app.GetGameSettings(iPad,eGameSetting_Sensitivity_TouchPadInMenu)/100.0f + + // get the touchpad input and treat it as a map to the window + ScePadTouchData *pTouchPadData=InputManager.GetTouchPadData(iPad); + + // make sure the touchpad button isn't down (it's the pausemenu) + + if((!InputManager.ButtonDown(iPad, ACTION_MENU_TOUCHPAD_PRESS)) && (pTouchPadData->touchNum>0)) + { + if(m_bFirstTouchStored[iPad]==false) + { + m_oldvTouchPos.x=(float)pTouchPadData->touch[0].x; + m_oldvTouchPos.y=(float)pTouchPadData->touch[0].y; + m_oldvPointerPos.x=vPointerPos.x; + m_oldvPointerPos.y=vPointerPos.y; + m_bFirstTouchStored[iPad]=true; + } + + // should take the average of multiple touch points + + float fNewX=(((float)pTouchPadData->touch[0].x)-m_oldvTouchPos.x) * m_fTouchPadMulX; + float fNewY=(((float)pTouchPadData->touch[0].y)-m_oldvTouchPos.y) * m_fTouchPadMulY; + // relative positions - needs a deadzone + + if(fNewX>m_fTouchPadDeadZoneX) + { + vPointerPos.x=m_oldvPointerPos.x+((fNewX-m_fTouchPadDeadZoneX)*((float)app.GetGameSettings(iPad,eGameSetting_Sensitivity_InMenu)/100.0f)); + } + else if(fNewX<-m_fTouchPadDeadZoneX) + { + vPointerPos.x=m_oldvPointerPos.x+((fNewX+m_fTouchPadDeadZoneX)*((float)app.GetGameSettings(iPad,eGameSetting_Sensitivity_InMenu)/100.0f)); + } + + if(fNewY>m_fTouchPadDeadZoneY) + { + vPointerPos.y=m_oldvPointerPos.y+((fNewY-m_fTouchPadDeadZoneY)*((float)app.GetGameSettings(iPad,eGameSetting_Sensitivity_InMenu)/100.0f)); + } + else if(fNewY<-m_fTouchPadDeadZoneY) + { + vPointerPos.y=m_oldvPointerPos.y+((fNewY+m_fTouchPadDeadZoneY)*((float)app.GetGameSettings(iPad,eGameSetting_Sensitivity_InMenu)/100.0f)); + } + + // Clamp to pointer extents. + if ( vPointerPos.x < m_fPointerMinX ) vPointerPos.x = m_fPointerMinX; + else if ( vPointerPos.x > m_fPointerMaxX ) vPointerPos.x = m_fPointerMaxX; + if ( vPointerPos.y < m_fPointerMinY ) vPointerPos.y = m_fPointerMinY; + else if ( vPointerPos.y > m_fPointerMaxY ) vPointerPos.y = m_fPointerMaxY; + + bStickInput = true; + m_eCurrTapState=eTapStateNoInput; + } + else + { + // reset the touch flag + m_bFirstTouchStored[iPad]=false; + +#endif + + + + // If there is any input on sticks, move the pointer. + if ( ( fabs( fInputX ) >= 0.01f ) || ( fabs( fInputY ) >= 0.01f ) ) + { + fInputDirX = ( fInputX > 0.0f ) ? 1.0f : ( fInputX < 0.0f )?-1.0f : 0.0f; + fInputDirY = ( fInputY > 0.0f ) ? 1.0f : ( fInputY < 0.0f )?-1.0f : 0.0f; + +#ifdef TAP_DETECTION + // Check for potential tap input to jump slot. + ETapState eNewTapInput = GetTapInputType( fInputX, fInputY ); + + switch( m_eCurrTapState ) + { + case eTapStateNoInput: + m_eCurrTapState = eNewTapInput; + break; + + case eTapStateUp: + case eTapStateDown: + case eTapStateLeft: + case eTapStateRight: + if ( ( eNewTapInput != m_eCurrTapState ) && ( eNewTapInput != eTapStateNoInput ) ) + { + // Input is no longer suitable for tap. + m_eCurrTapState = eTapNone; + } + break; + + case eTapNone: + /// Nothing to do, input is not a tap. + break; + } +#endif // TAP_DETECTION + + // Square it so we get more precision for small inputs. + fInputX = fInputX * fInputX * fInputDirX * POINTER_SPEED_FACTOR; + fInputY = fInputY * fInputY * fInputDirY * POINTER_SPEED_FACTOR; + //fInputX = fInputX * POINTER_SPEED_FACTOR; + //fInputY = fInputY * POINTER_SPEED_FACTOR; + float fInputScale = 1.0f; + + // Ramp up input from zero when new input is recieved over INPUT_TICKS_FOR_SCALING ticks. This is to try to improve tapping stick to move 1 box. + if ( m_iConsectiveInputTicks < MAX_INPUT_TICKS_FOR_SCALING ) + { + ++m_iConsectiveInputTicks; + fInputScale = ( (float)( m_iConsectiveInputTicks) / (float)(MAX_INPUT_TICKS_FOR_SCALING) ); + } +#ifdef TAP_DETECTION + else if ( m_iConsectiveInputTicks < MAX_INPUT_TICKS_FOR_TAPPING ) + { + ++m_iConsectiveInputTicks; + } + else + { + m_eCurrTapState = eTapNone; + } +#endif + // 4J Stu - The cursor moves too fast in SD mode + // The SD/splitscreen scenes are approximately 0.6 times the size of the fullscreen on + if(!RenderManager.IsHiDef() || app.GetLocalPlayerCount() > 1) fInputScale *= 0.6f; + + fInputX *= fInputScale; + fInputY *= fInputScale; + +#ifdef USE_POINTER_ACCEL + m_fPointerAccelX += fInputX / 50.0f; + m_fPointerAccelY += fInputY / 50.0f; + + if ( fabsf( fInputX ) > fabsf( m_fPointerVelX + m_fPointerAccelX ) ) + { + m_fPointerVelX += m_fPointerAccelX; + } + else + { + m_fPointerAccelX = fInputX - m_fPointerVelX; + m_fPointerVelX = fInputX; + } + + if ( fabsf( fInputY ) > fabsf( m_fPointerVelY + m_fPointerAccelY ) ) + { + m_fPointerVelY += m_fPointerAccelY; + } + else + { + m_fPointerAccelY = fInputY - m_fPointerVelY; + m_fPointerVelY = fInputY; + } + //printf( "IN %.2f VEL %.2f ACC %.2f\n", fInputY, m_fPointerVelY, m_fPointerAccelY ); + + vPointerPos.x += m_fPointerVelX; + vPointerPos.y -= m_fPointerVelY; +#else + // Add input to pointer position. + vPointerPos.x += fInputX; + vPointerPos.y -= fInputY; +#endif + // Clamp to pointer extents. + if ( vPointerPos.x < m_fPointerMinX ) vPointerPos.x = m_fPointerMinX; + else if ( vPointerPos.x > m_fPointerMaxX ) vPointerPos.x = m_fPointerMaxX; + if ( vPointerPos.y < m_fPointerMinY ) vPointerPos.y = m_fPointerMinY; + else if ( vPointerPos.y > m_fPointerMaxY ) vPointerPos.y = m_fPointerMaxY; + + bStickInput = true; + } + else + { + m_iConsectiveInputTicks = 0; +#ifdef USE_POINTER_ACCEL + m_fPointerVelX = 0.0f; + m_fPointerVelY = 0.0f; + m_fPointerAccelX = 0.0f; + m_fPointerAccelY = 0.0f; +#endif + } + +#ifdef __ORBIS__ + } +#endif + + // Determine which slot the pointer is currently over. + ESceneSection eSectionUnderPointer = eSectionNone; + int iNewSlotX = -1; + int iNewSlotY = -1; + int iNewSlotIndex = -1; + bool bPointerIsOverSlot = false; + + // Centre position of item under pointer, use this to snap pointer to item. + D3DXVECTOR3 vSnapPos; + + for ( int iSection = m_eFirstSection; iSection < m_eMaxSection; ++iSection ) + { + // Do not check any further if we have already found the item under the pointer. + if(m_eCurrTapState == eTapStateJump) + { + eSectionUnderPointer = m_eCurrSection; + } + else if ( eSectionUnderPointer == eSectionNone ) + { + ESceneSection eSection = ( ESceneSection )( iSection ); + + // Get position of this section. + UIVec2D sectionPos; + GetPositionOfSection( eSection, &( sectionPos ) ); + + if(!IsSectionSlotList(eSection)) + { + UIVec2D itemPos; + UIVec2D itemSize; + GetItemScreenData( eSection, 0, &( itemPos ), &( itemSize ) ); + + UIVec2D itemMax = itemSize; + itemMax += itemPos; + + if ( ( vPointerPos.x >= sectionPos.x ) && ( vPointerPos.x <= itemMax.x ) && + ( vPointerPos.y >= sectionPos.y ) && ( vPointerPos.y <= itemMax.y ) ) + { + // Pointer is over this control! + eSectionUnderPointer = eSection; + + vSnapPos.x = itemPos.x + ( itemSize.x / 2.0f ); + vSnapPos.y = itemPos.y + ( itemSize.y / 2.0f ); + + // Does this section already have focus. + if ( !doesSectionTreeHaveFocus( eSection ) ) + { + // Give focus to this section. + setSectionFocus(eSection, getPad()); + } + + bPointerIsOverSlot = false; + + // Have we actually changed slot? If so, input cannot be a tap. + if ( ( eSectionUnderPointer != m_eCurrSection ) || ( iNewSlotX != m_iCurrSlotX ) || ( iNewSlotY != m_iCurrSlotY ) ) + { + m_eCurrTapState = eTapNone; + } + + // Store what is currently under the pointer. + m_eCurrSection = eSectionUnderPointer; + } + } + else + { + + // Get dimensions of this section. + int iNumRows; + int iNumColumns; + int iNumItems = GetSectionDimensions( eSection, &( iNumColumns ), &( iNumRows ) ); + + // Check each item to see if pointer is over it. + for ( int iItem = 0; iItem < iNumItems; ++iItem ) + { + UIVec2D itemPos; + UIVec2D itemSize; + GetItemScreenData( eSection, iItem, &( itemPos ), &( itemSize ) ); + + itemPos += sectionPos; + + UIVec2D itemMax = itemSize; + itemMax += itemPos; + + if ( ( vPointerPos.x >= itemPos.x ) && ( vPointerPos.x <= itemMax.x ) && + ( vPointerPos.y >= itemPos.y ) && ( vPointerPos.y <= itemMax.y ) ) + { + // Pointer is over this slot! + eSectionUnderPointer = eSection; + iNewSlotIndex = iItem; + iNewSlotX = iNewSlotIndex % iNumColumns; + iNewSlotY = iNewSlotIndex / iNumColumns; + + vSnapPos.x = itemPos.x + ( itemSize.x / 2.0f ); + vSnapPos.y = itemPos.y + ( itemSize.y / 2.0f ); + + // Does this section already have focus. + if ( !doesSectionTreeHaveFocus( eSection ) ) + { + // Give focus to this section. + setSectionFocus(eSection, getPad()); + } + + // Set the highlight marker. + setSectionSelectedSlot(eSection, iNewSlotX, iNewSlotY ); + + bPointerIsOverSlot = true; + +#ifdef TAP_DETECTION + // Have we actually changed slot? If so, input cannot be a tap. + if ( ( eSectionUnderPointer != m_eCurrSection ) || ( iNewSlotX != m_iCurrSlotX ) || ( iNewSlotY != m_iCurrSlotY ) ) + { + m_eCurrTapState = eTapNone; + } + + // Store what is currently under the pointer. + m_eCurrSection = eSectionUnderPointer; + m_iCurrSlotX = iNewSlotX; + m_iCurrSlotY = iNewSlotY; +#endif // TAP_DETECTION + // No need to check any further slots, the pointer can only ever be over one. + break; + } + } + } + } + } + + // If we are not over any slot, set focus elsewhere. + if ( eSectionUnderPointer == eSectionNone ) + { + setFocusToPointer( getPad() ); +#ifdef TAP_DETECTION + // Input cannot be a tap. + m_eCurrTapState = eTapNone; + + // Store what is currently under the pointer. + m_eCurrSection = eSectionNone; + m_iCurrSlotX = -1; + m_iCurrSlotY = -1; +#endif // TAP_DETECTION + } + else + { + if ( !bStickInput ) + { + // Did we get a tap input? + int iDesiredSlotX = -1; + int iDesiredSlotY = -1; + + switch( m_eCurrTapState ) + { + case eTapStateUp: + iDesiredSlotX = m_iCurrSlotX; + iDesiredSlotY = m_iCurrSlotY - 1; + break; + case eTapStateDown: + iDesiredSlotX = m_iCurrSlotX; + iDesiredSlotY = m_iCurrSlotY + 1; + break; + case eTapStateLeft: + iDesiredSlotX = m_iCurrSlotX - 1; + iDesiredSlotY = m_iCurrSlotY; + break; + case eTapStateRight: + iDesiredSlotX = m_iCurrSlotX + 1; + iDesiredSlotY = m_iCurrSlotY; + break; + case eTapStateJump: + iDesiredSlotX = m_iCurrSlotX; + iDesiredSlotY = m_iCurrSlotY; + break; + } + + int iNumRows; + int iNumColumns; + int iNumItems = GetSectionDimensions( eSectionUnderPointer, &( iNumColumns ), &( iNumRows ) ); + + + if ( (m_eCurrTapState != eTapNone && m_eCurrTapState != eTapStateNoInput) && + ( !IsSectionSlotList(eSectionUnderPointer) || + ( ( iDesiredSlotX < 0 ) || ( iDesiredSlotX >= iNumColumns ) || ( iDesiredSlotY < 0 ) || ( iDesiredSlotY >= iNumRows ) ) + )) + { + + eSectionUnderPointer = GetSectionAndSlotInDirection( eSectionUnderPointer, m_eCurrTapState, &iDesiredSlotX, &iDesiredSlotY ); + + if(!IsSectionSlotList(eSectionUnderPointer)) bPointerIsOverSlot = false; + + // Get the details for the new section + iNumItems = GetSectionDimensions( eSectionUnderPointer, &( iNumColumns ), &( iNumRows ) ); + } + + if ( !IsSectionSlotList(eSectionUnderPointer) || ( ( iDesiredSlotX >= 0 ) && ( iDesiredSlotX < iNumColumns ) && ( iDesiredSlotY >= 0 ) && ( iDesiredSlotY < iNumRows ) ) ) + { + // Desired slot after tap input is valid, so make the jump to this slot. + UIVec2D sectionPos; + GetPositionOfSection( eSectionUnderPointer, &( sectionPos ) ); + + iNewSlotIndex = ( iDesiredSlotY * iNumColumns ) + iDesiredSlotX; + + UIVec2D itemPos; + UIVec2D itemSize; + GetItemScreenData( eSectionUnderPointer, iNewSlotIndex, &( itemPos ), &( itemSize ) ); + + if(IsSectionSlotList(eSectionUnderPointer)) itemPos += sectionPos; + + vSnapPos.x = itemPos.x + ( itemSize.x / 2.0f); + vSnapPos.y = itemPos.y + ( itemSize.y / 2.0f); + + m_eCurrSection = eSectionUnderPointer; + m_iCurrSlotX = iDesiredSlotX; + m_iCurrSlotY = iDesiredSlotY; + } + + m_eCurrTapState = eTapStateNoInput; + + // If there is no stick input, and we are over a slot, then snap pointer to slot centre. + // 4J - TomK - only if this particular component allows so! + if(CanHaveFocus(eSectionUnderPointer)) + { + vPointerPos.x = vSnapPos.x; + vPointerPos.y = vSnapPos.y; + } + } + } + + // Clamp to pointer extents. + if ( vPointerPos.x < m_fPointerMinX ) vPointerPos.x = m_fPointerMinX; + else if ( vPointerPos.x > m_fPointerMaxX ) vPointerPos.x = m_fPointerMaxX; + if ( vPointerPos.y < m_fPointerMinY ) vPointerPos.y = m_fPointerMinY; + else if ( vPointerPos.y > m_fPointerMaxY ) vPointerPos.y = m_fPointerMaxY; + + // Check if the pointer is outside of the panel. + bool bPointerIsOutsidePanel = false; + if ( ( vPointerPos.x < m_fPanelMinX ) || ( vPointerPos.x > m_fPanelMaxX ) || ( vPointerPos.y < m_fPanelMinY ) || ( vPointerPos.y > m_fPanelMaxY ) ) + { + bPointerIsOutsidePanel = true; + } + + // Determine appropriate context sensitive tool tips, based on what is carried on the pointer and what is under the pointer. + + // What are we carrying on pointer. + shared_ptr player = Minecraft::GetInstance()->localplayers[getPad()]; + shared_ptr carriedItem = nullptr; + if(player != NULL) carriedItem = player->inventory->getCarried(); + + shared_ptr slotItem = nullptr; + Slot *slot = NULL; + int slotIndex = 0; + if(bPointerIsOverSlot) + { + slotIndex = iNewSlotIndex + getSectionStartOffset( eSectionUnderPointer ); + slot = m_menu->getSlot(slotIndex); + } + bool bIsItemCarried = carriedItem != NULL; + int iCarriedCount = 0; + bool bCarriedIsSameAsSlot = false; // Indicates if same item is carried on pointer as is in slot under pointer. + if ( bIsItemCarried ) + { + iCarriedCount = carriedItem->count; + } + + // What is in the slot that we are over. + bool bSlotHasItem = false; + bool bMayPlace = false; + bool bCanPlaceOne = false; + bool bCanPlaceAll = false; + bool bCanCombine = false; + bool bCanDye = false; + int iSlotCount = 0; + int iSlotStackSizeRemaining = 0; // How many more items can be stacked on this slot. + if ( bPointerIsOverSlot ) + { + slotItem = slot->getItem(); + bSlotHasItem = slotItem != NULL; + if ( bSlotHasItem ) + { + iSlotCount = slotItem->GetCount(); + + if ( bIsItemCarried ) + { + bCarriedIsSameAsSlot = IsSameItemAs(carriedItem, slotItem); + bCanCombine = m_menu->mayCombine(slot,carriedItem); + bCanDye = bCanCombine && dynamic_cast(slot->getItem()->getItem()); + + if ( bCarriedIsSameAsSlot ) + { + iSlotStackSizeRemaining = GetEmptyStackSpace( m_menu->getSlot(slotIndex) ); + } + } + } + + if( bIsItemCarried) + { + bMayPlace = slot->mayPlace(carriedItem); + + if ( bSlotHasItem ) iSlotStackSizeRemaining = GetEmptyStackSpace( slot ); + else iSlotStackSizeRemaining = slot->getMaxStackSize(); + + if(bMayPlace && iSlotStackSizeRemaining > 0) bCanPlaceOne = true; + if(bMayPlace && iSlotStackSizeRemaining > 1 && carriedItem->count > 1) bCanPlaceAll = true; + } + } + + if( bPointerIsOverSlot && bSlotHasItem ) + { + vector unformattedStrings; + wstring desc = GetItemDescription( slot, unformattedStrings ); + SetPointerText(desc, unformattedStrings, slot != m_lastPointerLabelSlot); + m_lastPointerLabelSlot = slot; + } + else + { + vector unformattedStrings; + SetPointerText(L"", unformattedStrings, false); + m_lastPointerLabelSlot = NULL; + } + + EToolTipItem buttonA, buttonX, buttonY, buttonRT; + buttonA = buttonX = buttonY = buttonRT = eToolTipNone; + if ( bPointerIsOverSlot ) + { + SetPointerOutsideMenu( false ); + if ( bIsItemCarried ) + { + if ( bSlotHasItem ) + { + // Item in hand and item in slot ... is item in slot the same as in out hand? If so, can we stack on to it? + if ( bCarriedIsSameAsSlot ) + { + // Can we stack more into this slot? + if ( iSlotStackSizeRemaining == 0 ) + { + // Cannot stack any more. + buttonRT = eToolTipWhatIsThis; + } + else if ( iSlotStackSizeRemaining == 1 ) + { + // Can only put 1 more on the stack. + buttonA = eToolTipPlaceGeneric; + buttonRT = eToolTipWhatIsThis; + } + else // can put 1 or all. + { + if(bCanPlaceAll) + { + // Multiple items in hand. + buttonA = eToolTipPlaceAll; + buttonX = eToolTipPlaceOne; + } + else if(bCanPlaceOne) + { + if(iCarriedCount > 1) buttonA = eToolTipPlaceOne; + else buttonA = eToolTipPlaceGeneric; + } + buttonRT = eToolTipWhatIsThis; + } + } + else // items are different, click here will swap them. + { + + if(bMayPlace) buttonA = eToolTipSwap; + buttonRT = eToolTipWhatIsThis; + } + if(bCanDye) + { + buttonX = eToolTipDye; + } + else if(bCanCombine) + { + buttonX = eToolTipRepair; + } + } + else // slot empty. + { + // Item in hand, slot is empty. + if ( iCarriedCount == 1 ) + { + // Only one item in hand. + buttonA = eToolTipPlaceGeneric; + } + else + { + if(bCanPlaceAll) + { + // Multiple items in hand. + buttonA = eToolTipPlaceAll; + buttonX = eToolTipPlaceOne; + } + else if(bCanPlaceOne) + { + buttonA = eToolTipPlaceOne; + } + } + } + } + else // no object in hand + { + if ( bSlotHasItem ) + { + if ( iSlotCount == 1 ) + { + buttonA = eToolTipPickUpGeneric; + buttonRT = eToolTipWhatIsThis; + } + else + { + // Multiple items in slot. + buttonA = eToolTipPickUpAll; + buttonX = eToolTipPickUpHalf; + buttonRT = eToolTipWhatIsThis; + } + } + else + { + // Nothing in slot and nothing in hand. + } + } + + if ( bSlotHasItem ) + { + // Item in slot + + // 4J-PB - show tooltips for quick use of armour + + if((eSectionUnderPointer==eSectionInventoryUsing)||(eSectionUnderPointer==eSectionInventoryInventory)) + { + shared_ptr item = getSlotItem(eSectionUnderPointer, iNewSlotIndex); + ArmorRecipes::_eArmorType eArmourType=ArmorRecipes::GetArmorType(item->id); + + if(eArmourType==ArmorRecipes::eArmorType_None) + { + buttonY = eToolTipQuickMove; + } + else + { + // check that the slot required is empty + switch(eArmourType) + { + case ArmorRecipes::eArmorType_Helmet: + if(isSlotEmpty(eSectionInventoryArmor,0)) + { + buttonY = eToolTipEquip; + } + else + { + buttonY = eToolTipQuickMove; + } + break; + case ArmorRecipes::eArmorType_Chestplate: + if(isSlotEmpty(eSectionInventoryArmor,1)) + { + buttonY = eToolTipEquip; + } + else + { + buttonY = eToolTipQuickMove; + } + break; + case ArmorRecipes::eArmorType_Leggings: + if(isSlotEmpty(eSectionInventoryArmor,2)) + { + buttonY = eToolTipEquip; + } + else + { + buttonY = eToolTipQuickMove; + } + break; + case ArmorRecipes::eArmorType_Boots: + if(isSlotEmpty(eSectionInventoryArmor,3)) + { + buttonY = eToolTipEquip; + } + else + { + buttonY = eToolTipQuickMove; + } + break; + default: + buttonY = eToolTipQuickMove; + break; + } + + } + } + // 4J-PB - show tooltips for quick use of fuel or ingredient + else if((eSectionUnderPointer==eSectionFurnaceUsing)||(eSectionUnderPointer==eSectionFurnaceInventory)) + { + // Get the info on this item. + shared_ptr item = getSlotItem(eSectionUnderPointer, iNewSlotIndex); + bool bValidFuel = FurnaceTileEntity::isFuel(item); + bool bValidIngredient = FurnaceRecipes::getInstance()->getResult(item->getItem()->id) != NULL; + + if(bValidIngredient) + { + // is there already something in the ingredient slot? + if(!isSlotEmpty(eSectionFurnaceIngredient,0)) + { + // is it the same as this item + shared_ptr IngredientItem = getSlotItem(eSectionFurnaceIngredient,0); + if(IngredientItem->id == item->id) + { + buttonY = eToolTipQuickMoveIngredient; + } + else + { + if(FurnaceRecipes::getInstance()->getResult(item->id)==NULL) + { + buttonY = eToolTipQuickMove; + } + else + { + buttonY = eToolTipQuickMoveIngredient; + } + } + } + else + { + // ingredient slot empty + buttonY = eToolTipQuickMoveIngredient; + } + } + else if(bValidFuel) + { + // Is there already something in the fuel slot? + if(!isSlotEmpty(eSectionFurnaceFuel,0)) + { + // is it the same as this item + shared_ptr fuelItem = getSlotItem(eSectionFurnaceFuel,0); + if(fuelItem->id == item->id) + { + buttonY = eToolTipQuickMoveFuel; + } + else if(bValidIngredient) + { + // check if the ingredient slot is empty, or the same as this + if(!isSlotEmpty(eSectionFurnaceIngredient,0)) + { + // is it the same as this item + shared_ptr IngredientItem = getSlotItem(eSectionFurnaceIngredient,0); + if(IngredientItem->id == item->id) + { + buttonY = eToolTipQuickMoveIngredient; + } + else + { + if(FurnaceRecipes::getInstance()->getResult(item->id)==NULL) + { + buttonY = eToolTipQuickMove; + } + else + { + buttonY = eToolTipQuickMoveIngredient; + } + } + } + else + { + // ingredient slot empty + buttonY = eToolTipQuickMoveIngredient; + } + } + else + { + buttonY = eToolTipQuickMove; + } + } + else + { + buttonY = eToolTipQuickMoveFuel; + } + } + else + { + buttonY = eToolTipQuickMove; + } + } + // 4J-PB - show tooltips for quick use of ingredients in brewing + else if((eSectionUnderPointer==eSectionBrewingUsing)||(eSectionUnderPointer==eSectionBrewingInventory)) + { + // Get the info on this item. + shared_ptr item = getSlotItem(eSectionUnderPointer, iNewSlotIndex); + int iId=item->id; + + // valid ingredient? + bool bValidIngredient=false; + //bool bValidIngredientBottom=false; + + if(Item::items[iId]->hasPotionBrewingFormula() || (iId == Item::netherStalkSeeds_Id)) + { + bValidIngredient=true; + } + + if(bValidIngredient) + { + // is there already something in the ingredient slot? + if(!isSlotEmpty(eSectionBrewingIngredient,0)) + { + // is it the same as this item + shared_ptr IngredientItem = getSlotItem(eSectionBrewingIngredient,0); + if(IngredientItem->id == item->id) + { + buttonY = eToolTipQuickMoveIngredient; + } + else + { + buttonY=eToolTipQuickMove; + } + } + else + { + // ingredient slot empty + buttonY = eToolTipQuickMoveIngredient; + } + } + else + { + // valid potion? Glass bottle with water in it is a 'potion' too. + if(iId==Item::potion_Id) + { + // space available? + if(isSlotEmpty(eSectionBrewingBottle1,0) || + isSlotEmpty(eSectionBrewingBottle2,0) || + isSlotEmpty(eSectionBrewingBottle3,0)) + { + buttonY = eToolTipQuickMoveIngredient; + } + else + { + buttonY=eToolTipNone; + } + } + else + { + buttonY=eToolTipQuickMove; + } + } + } + else if((eSectionUnderPointer==eSectionEnchantUsing)||(eSectionUnderPointer==eSectionEnchantInventory)) + { + // Get the info on this item. + shared_ptr item = getSlotItem(eSectionUnderPointer, iNewSlotIndex); + int iId=item->id; + + // valid enchantable tool? + if(Item::items[iId]->isEnchantable(item)) + { + // is there already something in the ingredient slot? + if(isSlotEmpty(eSectionEnchantSlot,0)) + { + // tool slot empty + switch(iId) + { + case Item::bow_Id: + case Item::sword_wood_Id: + case Item::sword_stone_Id: + case Item::sword_iron_Id: + case Item::sword_diamond_Id: + buttonY=eToolTipQuickMoveWeapon; + break; + + case Item::helmet_cloth_Id: + case Item::chestplate_cloth_Id: + case Item::leggings_cloth_Id: + case Item::boots_cloth_Id: + + case Item::helmet_chain_Id: + case Item::chestplate_chain_Id: + case Item::leggings_chain_Id: + case Item::boots_chain_Id: + + case Item::helmet_iron_Id: + case Item::chestplate_iron_Id: + case Item::leggings_iron_Id: + case Item::boots_iron_Id: + + case Item::helmet_diamond_Id: + case Item::chestplate_diamond_Id: + case Item::leggings_diamond_Id: + case Item::boots_diamond_Id: + + case Item::helmet_gold_Id: + case Item::chestplate_gold_Id: + case Item::leggings_gold_Id: + case Item::boots_gold_Id: + buttonY=eToolTipQuickMoveArmor; + + break; + case Item::book_Id: + buttonY = eToolTipQuickMove; + break; + default: + buttonY=eToolTipQuickMoveTool; + break; + } + } + else + { + buttonY = eToolTipQuickMove; + } + } + else + { + buttonY=eToolTipQuickMove; + } + } + else + { + buttonY = eToolTipQuickMove; + } + } + } + + if ( bPointerIsOutsidePanel ) + { + SetPointerOutsideMenu( true ); + // Outside window, we dropping items. + if ( bIsItemCarried ) + { + //int iCount = m_pointerControl->GetObjectCount( m_pointerControl->m_hObj ); + if ( iCarriedCount > 1 ) + { + buttonA = eToolTipDropAll; + buttonX = eToolTipDropOne; + } + else + { + buttonA = eToolTipDropGeneric; + } + } + } + else // pointer is just over dead space ... can't really do anything. + { + SetPointerOutsideMenu( false ); + } + + shared_ptr item = nullptr; + if(bPointerIsOverSlot && bSlotHasItem) item = getSlotItem(eSectionUnderPointer, iNewSlotIndex); + overrideTooltips(eSectionUnderPointer, item, bIsItemCarried, bSlotHasItem, bCarriedIsSameAsSlot, iSlotStackSizeRemaining, buttonA, buttonX, buttonY, buttonRT); + + SetToolTip( eToolTipButtonA, buttonA ); + SetToolTip( eToolTipButtonX, buttonX ); + SetToolTip( eToolTipButtonY, buttonY ); + SetToolTip( eToolTipButtonRT, buttonRT ); + + + // Offset back to image top left. + vPointerPos.x -= m_fPointerImageOffsetX; + vPointerPos.y -= m_fPointerImageOffsetY; + + // Update pointer position. + // 4J-PB - do not allow sub pixel positions or we get broken lines in box edges + + // problem here when sensitivity is low - we'll be moving a sub pixel size, so it'll clamp, and we'll never move. In that case, move 1 pixel + if(fInputDirX!=0.0f) + { + if(fInputDirX==1.0f) + { + vPointerPos.x+=0.999999f; + } + else + { + vPointerPos.x-=0.999999f; + } + } + + if(fInputDirY!=0.0f) + { + if(fInputDirY==1.0f) + { + vPointerPos.y+=0.999999f; + } + else + { + vPointerPos.y-=0.999999f; + } + } + + vPointerPos.x = floor(vPointerPos.x); + vPointerPos.x += ( (int)vPointerPos.x%2); + vPointerPos.y = floor(vPointerPos.y); + vPointerPos.y += ( (int)vPointerPos.y%2); + m_pointerPos = vPointerPos; + + adjustPointerForSafeZone(); +} + +bool IUIScene_AbstractContainerMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) +{ + bool bHandled = false; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->localgameModes[getPad()] != NULL ) + { + Tutorial *tutorial = pMinecraft->localgameModes[getPad()]->getTutorial(); + if(tutorial != NULL) + { + tutorial->handleUIInput(iAction); + if(ui.IsTutorialVisible(getPad()) && !tutorial->isInputAllowed(iAction)) + { + return S_OK; + } + } + } + +#ifdef _XBOX + ui.AnimateKeyPress(iPad, iAction); +#else + ui.AnimateKeyPress(iPad, iAction, bRepeat, true, false); +#endif + + int buttonNum=0; // 0 = LeftMouse, 1 = RightMouse + BOOL quickKeyHeld=FALSE; // Represents shift key on PC + + BOOL validKeyPress = FALSE; + //BOOL itemEditorKeyPress = FALSE; + + // Ignore input from other players + //if(pMinecraft->player->GetXboxPad()!=pInputData->UserIndex) return S_OK; + + switch(iAction) + { +#ifdef _DEBUG_MENUS_ENABLED +#if TO_BE_IMPLEMENTED + case VK_PAD_RTHUMB_PRESS: + itemEditorKeyPress = TRUE; + break; +#endif +#endif + case ACTION_MENU_A: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + if(!bRepeat) + { + validKeyPress = TRUE; + + // Standard left click + buttonNum = 0; + quickKeyHeld = FALSE; + ui.PlayUISFX(eSFX_Press); + } + break; + case ACTION_MENU_X: + if(!bRepeat) + { + validKeyPress = TRUE; + + // Standard right click + buttonNum = 1; + quickKeyHeld = FALSE; + ui.PlayUISFX(eSFX_Press); + } + break; + case ACTION_MENU_Y: + if(!bRepeat) + { + //bool bIsItemCarried = !m_pointerControl->isEmpty( m_pointerControl->m_hObj ); + + // 4J Stu - TU8: Remove this fix, and fix the tooltip display instead as customers liked the feature + + // Fix for #58583 - TU6: Content: UI: The Quick Move button prompt disappears even though it still works + // No quick move tooltip is shown if something is carried, so disable the action as well + //if(!bIsItemCarried) + { + validKeyPress = TRUE; + + // Shift and left click + buttonNum = 0; + quickKeyHeld = TRUE; + ui.PlayUISFX(eSFX_Press); + } + } + break; + // 4J Stu - Also enable start to exit the scene. This key is also not constrained by the tutorials. + case ACTION_MENU_PAUSEMENU: + case ACTION_MENU_B: + { + + ui.SetTooltips(iPad, -1); + + // 4J Stu - Fix for #11302 - TCR 001: Network Connectivity: Host crashed after being killed by the client while accessing a chest during burst packet loss. + // We need to make sure that we call closeContainer() anytime this menu is closed, even if it is forced to close by some other reason (like the player dying) + // Therefore I have moved this call to the OnDestroy() method to make sure that it always happens. + //Minecraft::GetInstance()->localplayers[pInputData->UserIndex]->closeContainer(); + + // Return to the game. We should really callback to the app here as well + // to let it know that we have closed the ui incase we need to do things when that happens + + if(m_bNavigateBack) + { + ui.NavigateBack(iPad); + } + else + { + ui.CloseUIScenes(iPad); + } + + bHandled = true; + return S_OK; + } + break; + case ACTION_MENU_LEFT: + { + //ui.PlayUISFX(eSFX_Focus); + m_eCurrTapState = eTapStateLeft; + } + break; + case ACTION_MENU_RIGHT: + { + //ui.PlayUISFX(eSFX_Focus); + m_eCurrTapState = eTapStateRight; + } + break; + case ACTION_MENU_UP: + { + //ui.PlayUISFX(eSFX_Focus); + m_eCurrTapState = eTapStateUp; + } + break; + case ACTION_MENU_DOWN: + { + //ui.PlayUISFX(eSFX_Focus); + m_eCurrTapState = eTapStateDown; + } + break; + case ACTION_MENU_PAGEUP: + { + // 4J Stu - Do nothing except stop this being passed anywhere else + bHandled = true; + } + break; +#ifdef __PSVITA__ + //CD - Vita uses select for What's this - key 40 + case MINECRAFT_ACTION_GAME_INFO: +#else + case ACTION_MENU_PAGEDOWN: +#endif + + { + if( IsSectionSlotList( m_eCurrSection ) ) + { + int currentIndex = getCurrentIndex( m_eCurrSection ) - getSectionStartOffset(m_eCurrSection); + + bool bSlotHasItem = !isSlotEmpty(m_eCurrSection, currentIndex); + if ( bSlotHasItem ) + { + shared_ptr item = getSlotItem(m_eCurrSection, currentIndex); + if( Minecraft::GetInstance()->localgameModes[iPad] != NULL ) + { + Tutorial::PopupMessageDetails *message = new Tutorial::PopupMessageDetails; + message->m_messageId = item->getUseDescriptionId(); + + if(Item::items[item->id] != NULL) message->m_titleString = Item::items[item->id]->getHoverName(item); + message->m_titleId = item->getDescriptionId(); + + message->m_icon = item->id; + message->m_iAuxVal = item->getAuxValue(); + message->m_forceDisplay = true; + + TutorialMode *gameMode = (TutorialMode *)Minecraft::GetInstance()->localgameModes[iPad]; + gameMode->getTutorial()->setMessage(NULL, message); + ui.PlayUISFX(eSFX_Press); + } + } + } + bHandled = TRUE; + } + break; + }; + + if( validKeyPress == TRUE ) + { + if(handleValidKeyPress(iPad,buttonNum,quickKeyHeld)) + { + // Used to allow overriding certain keypresses, so do nothing here + } + else + { + if( IsSectionSlotList( m_eCurrSection ) ) + { + handleSlotListClicked(m_eCurrSection,buttonNum,quickKeyHeld); + } + else + { + // TODO Clicked something else, like for example the craft result. Do something here + + // 4J WESTY : For pointer system we can legally drop items outside of the window panel here, or may press button while + // pointer is over empty panel space. + if ( m_bPointerOutsideMenu ) + { + handleOutsideClicked(iPad, buttonNum, quickKeyHeld); + } + else // + { + // over empty space or something else??? + handleOtherClicked(iPad,m_eCurrSection,buttonNum,quickKeyHeld?true:false); + //assert( FALSE ); + } + } + } + bHandled = true; + } +#ifdef _DEBUG_MENUS_ENABLED +#if TO_BE_IMPLEMENTED + else if(itemEditorKeyPress == TRUE) + { + HXUIOBJ hFocusObject = GetFocus(pInputData->UserIndex); + HXUIOBJ hFocusObjectParent; + XuiElementGetParent( hFocusObject, &hFocusObjectParent ); + + HXUICLASS hClassCXuiCtrlSlotList; + + // TODO Define values for these + hClassCXuiCtrlSlotList = XuiFindClass( L"CXuiCtrlSlotList" ); + + // If the press comes from a SlotList, cast it up then send a clicked call to it's menu + if( XuiIsInstanceOf( hFocusObjectParent, hClassCXuiCtrlSlotList ) ) + { + CXuiCtrlSlotList* slotList; + VOID *pObj; + XuiObjectFromHandle( hFocusObjectParent, &pObj ); + slotList = (CXuiCtrlSlotList *)pObj; + + int currentIndex = slotList->GetCurSel(); + + CXuiCtrlSlotItemListItem* pCXuiCtrlSlotItem; + slotList->GetCXuiCtrlSlotItem( currentIndex, &( pCXuiCtrlSlotItem ) ); + + //Minecraft *pMinecraft = Minecraft::GetInstance(); + + CScene_DebugItemEditor::ItemEditorInput *initData = new CScene_DebugItemEditor::ItemEditorInput(); + initData->iPad = m_iPad; + initData->slot = pCXuiCtrlSlotItem->getSlot( pCXuiCtrlSlotItem->m_hObj ); + initData->menu = m_menu; + + // Add timer to poll controller stick input at 60Hz + HRESULT timerResult = KillTimer( POINTER_INPUT_TIMER_ID ); + assert( timerResult == S_OK ); + + app.NavigateToScene(m_iPad,eUIScene_DebugItemEditor,(void *)initData,false,TRUE); + } + } +#endif +#endif + else + { + handleAdditionalKeyPress(iAction); + } + + UpdateTooltips(); + + return bHandled; +} + +bool IUIScene_AbstractContainerMenu::handleValidKeyPress(int iUserIndex, int buttonNum, BOOL quickKeyHeld) +{ + return false; +} + +void IUIScene_AbstractContainerMenu::handleOutsideClicked(int iPad, int buttonNum, BOOL quickKeyHeld) +{ + // Drop items. + + //pMinecraft->localgameModes[m_iPad]->handleInventoryMouseClick(menu->containerId, AbstractContainerMenu::CLICKED_OUTSIDE, buttonNum, quickKeyHeld?true:false, pMinecraft->localplayers[m_iPad] ); + slotClicked(AbstractContainerMenu::CLICKED_OUTSIDE, buttonNum, quickKeyHeld?true:false); +} + +void IUIScene_AbstractContainerMenu::handleOtherClicked(int iPad, ESceneSection eSection, int buttonNum, bool quickKey) +{ + // Do nothing +} + +void IUIScene_AbstractContainerMenu::handleAdditionalKeyPress(int iAction) +{ + // Do nothing +} + +void IUIScene_AbstractContainerMenu::handleSlotListClicked(ESceneSection eSection, int buttonNum, BOOL quickKeyHeld) +{ + int currentIndex = getCurrentIndex(eSection); + + //pMinecraft->localgameModes[m_iPad]->handleInventoryMouseClick(menu->containerId, currentIndex, buttonNum, quickKeyHeld?true:false, pMinecraft->localplayers[m_iPad] ); + slotClicked(currentIndex, buttonNum, quickKeyHeld?true:false); + + handleSectionClick(eSection); +} + +void IUIScene_AbstractContainerMenu::slotClicked(int slotId, int buttonNum, bool quickKey) +{ + // 4J Stu - Removed this line as unused + //if (slot != NULL) slotId = slot->index; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->localgameModes[getPad()]->handleInventoryMouseClick(m_menu->containerId, slotId, buttonNum, quickKey, pMinecraft->localplayers[getPad()] ); +} + +int IUIScene_AbstractContainerMenu::getCurrentIndex(ESceneSection eSection) +{ + int rows, columns; + GetSectionDimensions( eSection, &columns, &rows ); + int currentIndex = (m_iCurrSlotY * columns) + m_iCurrSlotX; + + return currentIndex + getSectionStartOffset(eSection); +} + +bool IUIScene_AbstractContainerMenu::IsSameItemAs(shared_ptr itemA, shared_ptr itemB) +{ + if(itemA == NULL || itemB == NULL) return false; + + bool bStackedByData = itemA->isStackedByData(); + return ( ( itemA->id == itemB->id ) && ( (bStackedByData && itemA->getAuxValue() == itemB->getAuxValue()) || !bStackedByData ) ); +} + +int IUIScene_AbstractContainerMenu::GetEmptyStackSpace(Slot *slot) +{ + int iResult = 0; + + if(slot != NULL && slot->hasItem()) + { + shared_ptr item = slot->getItem(); + if ( item->isStackable() ) + { + int iCount = item->GetCount(); + int iMaxStackSize = min(item->getMaxStackSize(), slot->getMaxStackSize() ); + + iResult = iMaxStackSize - iCount; + + if(iResult < 0 ) iResult = 0; + } + } + + return iResult; +} + +wstring IUIScene_AbstractContainerMenu::GetItemDescription(Slot *slot, vector &unformattedStrings) +{ + if(slot == NULL) return L""; + + wstring desc = L""; + vector *strings = slot->getItem()->getHoverText(nullptr, false, unformattedStrings); + bool firstLine = true; + for(AUTO_VAR(it, strings->begin()); it != strings->end(); ++it) + { + wstring thisString = *it; + if(!firstLine) + { + desc.append( L"
" ); + } + else + { + firstLine = false; + wchar_t formatted[256]; + eMinecraftColour rarityColour = slot->getItem()->getRarity()->color; + int colour = app.GetHTMLColour(rarityColour); + + if(slot->getItem()->hasCustomHoverName()) + { + colour = app.GetHTMLColour(eTextColor_RenamedItemTitle); + } + + swprintf(formatted, 256, L"%ls",colour,thisString.c_str()); + thisString = formatted; + } + desc.append( thisString ); + } + strings->clear(); + delete strings; + return desc; +} diff --git a/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.h b/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.h new file mode 100644 index 00000000..bdb8bb4c --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.h @@ -0,0 +1,223 @@ +#pragma once + +// Uncomment to enable tap input detection to jump 1 slot. Doesn't work particularly well yet, and I feel the system does not need it. +// Would probably be required if we decide to slow down the pointer movement. +// 4J Stu - There was a request to be able to navigate the scenes with the dpad, so I have used much of the TAP_DETECTION +// code as it worked well for that situation. This #define should still stop the same things happening when using the +// stick though when not defined +#define TAP_DETECTION + +// Uncomment to enable acceleration on pointer input. +//#define USE_POINTER_ACCEL + +#define POINTER_INPUT_TIMER_ID (0) // Arbitrary timer ID. +#define POINTER_SPEED_FACTOR (13.0f) // Speed of pointer. +//#define POINTER_PANEL_OVER_REACH (42.0f) // Amount beyond edge of panel which pointer can go over to drop items. - comes from the pointer size in the scene + +#define MAX_INPUT_TICKS_FOR_SCALING (7) +#define MAX_INPUT_TICKS_FOR_TAPPING (15) + +class AbstractContainerMenu; +class Slot; + +class IUIScene_AbstractContainerMenu +{ +protected: + // Sections of this scene containing items selectable by the pointer. + // 4J Stu - Always make the Using section the first one + enum ESceneSection + { + eSectionNone = -1, + eSectionContainerUsing = 0, + eSectionContainerInventory, + eSectionContainerChest, + eSectionContainerMax, + + eSectionFurnaceUsing, + eSectionFurnaceInventory, + eSectionFurnaceIngredient, + eSectionFurnaceFuel, + eSectionFurnaceResult, + eSectionFurnaceMax, + + eSectionInventoryUsing, + eSectionInventoryInventory, + eSectionInventoryArmor, + eSectionInventoryMax, + + eSectionTrapUsing, + eSectionTrapInventory, + eSectionTrapTrap, + eSectionTrapMax, + + eSectionInventoryCreativeUsing, + eSectionInventoryCreativeSelector, +#ifndef _XBOX + eSectionInventoryCreativeTab_0, + eSectionInventoryCreativeTab_1, + eSectionInventoryCreativeTab_2, + eSectionInventoryCreativeTab_3, + eSectionInventoryCreativeTab_4, + eSectionInventoryCreativeTab_5, + eSectionInventoryCreativeTab_6, + eSectionInventoryCreativeTab_7, + eSectionInventoryCreativeSlider, +#endif + eSectionInventoryCreativeMax, + + eSectionEnchantUsing, + eSectionEnchantInventory, + eSectionEnchantSlot, + eSectionEnchantButton1, + eSectionEnchantButton2, + eSectionEnchantButton3, + eSectionEnchantMax, + + eSectionBrewingUsing, + eSectionBrewingInventory, + eSectionBrewingBottle1, + eSectionBrewingBottle2, + eSectionBrewingBottle3, + eSectionBrewingIngredient, + eSectionBrewingMax, + + eSectionAnvilUsing, + eSectionAnvilInventory, + eSectionAnvilItem1, + eSectionAnvilItem2, + eSectionAnvilResult, + eSectionAnvilName, + eSectionAnvilMax, + }; + + AbstractContainerMenu* m_menu; + bool m_autoDeleteMenu; + + eTutorial_State m_previousTutorialState; + + UIVec2D m_pointerPos; + + // Offset from pointer image top left to centre (we use the centre as the actual pointer). + float m_fPointerImageOffsetX; + float m_fPointerImageOffsetY; + + // Min and max extents for the pointer. + float m_fPointerMinX; + float m_fPointerMaxX; + float m_fPointerMinY; + float m_fPointerMaxY; + + // Min and max extents of the panel. + float m_fPanelMinX; + float m_fPanelMaxX; + float m_fPanelMinY; + float m_fPanelMaxY; + + int m_iConsectiveInputTicks; + + // Used for detecting quick "taps" in a direction, should jump cursor to next slot. + enum ETapState + { + eTapStateNoInput = 0, + eTapStateUp, + eTapStateDown, + eTapStateLeft, + eTapStateRight, + eTapStateJump, + eTapNone + }; + + ETapState m_eCurrTapState; + ESceneSection m_eCurrSection; + int m_iCurrSlotX; + int m_iCurrSlotY; + +#ifdef __ORBIS__ + bool m_bFirstTouchStored[XUSER_MAX_COUNT]; // monitor the first position of a touch, so we can use relative distances of movement + UIVec2D m_oldvPointerPos; + UIVec2D m_oldvTouchPos; + // store the multipliers to map the UI window to the touchpad window + float m_fTouchPadMulX; + float m_fTouchPadMulY; + float m_fTouchPadDeadZoneX; // usese the multipliers + float m_fTouchPadDeadZoneY; + + +#endif + + // ENum indexes of the first section for this scene, and 1+the last section + ESceneSection m_eFirstSection, m_eMaxSection; + + // 4J - WESTY - Added for pointer prototype. + // Current tooltip settings. + EToolTipItem m_aeToolTipSettings[ eToolTipNumButtons ]; + + // 4J - WESTY - Added for pointer prototype. + // Indicates if pointer is outside UI window (used to drop items). + bool m_bPointerOutsideMenu; + Slot *m_lastPointerLabelSlot; + + bool m_bSplitscreen; + bool m_bNavigateBack; // should we exit the xuiscenes or just navigate back on exit? + + virtual bool IsSectionSlotList( ESceneSection eSection ) { return eSection != eSectionNone; } + virtual bool CanHaveFocus( ESceneSection eSection ) { return true; } + int GetSectionDimensions( ESceneSection eSection, int* piNumColumns, int* piNumRows ); + virtual int getSectionColumns(ESceneSection eSection) = 0; + virtual int getSectionRows(ESceneSection eSection) = 0; + virtual ESceneSection GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ) = 0; + virtual void GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ) = 0; + virtual void GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ) = 0; + void updateSlotPosition( ESceneSection eSection, ESceneSection newSection, ETapState eTapDirection, int *piTargetX, int *piTargetY, int xOffset ); + + #ifdef TAP_DETECTION + ETapState GetTapInputType( float fInputX, float fInputY ); + #endif + + // Current tooltip settings. + void SetToolTip( EToolTipButton eButton, EToolTipItem eItem ); + void UpdateTooltips(); + + // 4J - WESTY - Added for pointer prototype. + void SetPointerOutsideMenu( bool bOutside ) { m_bPointerOutsideMenu = bOutside; } + + void Initialize(int m_iPad, AbstractContainerMenu* menu, bool autoDeleteMenu, int startIndex,ESceneSection firstSection,ESceneSection maxSection, bool bNavigateBack=FALSE); + virtual void PlatformInitialize(int iPad, int startIndex) = 0; + virtual void InitDataAssociations(int iPad, AbstractContainerMenu *menu, int startIndex = 0) = 0; + + void onMouseTick(); + bool handleKeyDown(int iPad, int iAction, bool bRepeat); + virtual bool handleValidKeyPress(int iUserIndex, int buttonNum, BOOL quickKeyHeld); + virtual void handleOutsideClicked(int iPad, int buttonNum, BOOL quickKeyHeld); + virtual void handleOtherClicked(int iPad, ESceneSection eSection, int buttonNum, bool quickKey); + virtual void handleAdditionalKeyPress(int iAction); + virtual void handleSlotListClicked(ESceneSection eSection, int buttonNum, BOOL quickKeyHeld); + virtual void handleSectionClick(ESceneSection eSection) = 0; + void slotClicked(int slotId, int buttonNum, bool quickKey); + int getCurrentIndex(ESceneSection eSection); + virtual int getSectionStartOffset(ESceneSection eSection) = 0; + virtual bool doesSectionTreeHaveFocus(ESceneSection eSection) = 0; + virtual void setSectionFocus(ESceneSection eSection, int iPad) = 0; + virtual void setSectionSelectedSlot(ESceneSection eSection, int x, int y) = 0; + virtual void setFocusToPointer(int iPad) = 0; + virtual void SetPointerText(const wstring &description, vector &unformattedStrings, bool newSlot) = 0; + virtual shared_ptr getSlotItem(ESceneSection eSection, int iSlot) = 0; + virtual bool isSlotEmpty(ESceneSection eSection, int iSlot) = 0; + virtual void adjustPointerForSafeZone() = 0; + + virtual bool overrideTooltips(ESceneSection sectionUnderPointer, shared_ptr itemUnderPointer, bool bIsItemCarried, bool bSlotHasItem, bool bCarriedIsSameAsSlot, int iSlotStackSizeRemaining, + EToolTipItem &buttonA, EToolTipItem &buttonX, EToolTipItem &buttonY, EToolTipItem &buttonRT) { return false; } + +private: + bool IsSameItemAs(shared_ptr itemA, shared_ptr itemB); + int GetEmptyStackSpace(Slot *slot); + wstring GetItemDescription(Slot *slot, vector &unformattedStrings); + +protected: + + IUIScene_AbstractContainerMenu(); + virtual ~IUIScene_AbstractContainerMenu(); + +public: + virtual int getPad() = 0; +}; diff --git a/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp new file mode 100644 index 00000000..81451c7a --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp @@ -0,0 +1,272 @@ +#include "stdafx.h" +#include "IUIScene_AnvilMenu.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\InputOutputStream.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\ClientConnection.h" + +IUIScene_AnvilMenu::IUIScene_AnvilMenu() +{ + m_inventory = nullptr; + m_repairMenu = NULL; + m_itemName = L""; +} + +IUIScene_AbstractContainerMenu::ESceneSection IUIScene_AnvilMenu::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 eSectionAnvilItem1: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionAnvilName; + } + else if(eTapDirection == eTapStateDown) + { + newSection = eSectionAnvilInventory; + xOffset = ANVIL_SCENE_ITEM1_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateLeft) + { + newSection = eSectionAnvilResult; + } + else if(eTapDirection == eTapStateRight) + { + newSection = eSectionAnvilItem2; + } + break; + case eSectionAnvilItem2: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionAnvilName; + } + else if(eTapDirection == eTapStateDown) + { + newSection = eSectionAnvilInventory; + xOffset = ANVIL_SCENE_ITEM2_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateLeft) + { + newSection = eSectionAnvilItem1; + } + else if(eTapDirection == eTapStateRight) + { + newSection = eSectionAnvilResult; + } + break; + case eSectionAnvilResult: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionAnvilName; + } + else if(eTapDirection == eTapStateDown) + { + newSection = eSectionAnvilInventory; + xOffset = ANVIL_SCENE_RESULT_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateLeft) + { + newSection = eSectionAnvilItem2; + } + else if(eTapDirection == eTapStateRight) + { + newSection = eSectionAnvilItem1; + } + break; + case eSectionAnvilName: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionAnvilUsing; + xOffset = ANVIL_SCENE_ITEM2_SLOT_UP_OFFSET; + } + else if(eTapDirection == eTapStateDown) + { + newSection = eSectionAnvilItem2; + } + break; + case eSectionAnvilInventory: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionAnvilUsing; + } + else if(eTapDirection == eTapStateUp) + { + if( *piTargetX <= ANVIL_SCENE_ITEM1_SLOT_UP_OFFSET) + { + newSection = eSectionAnvilItem1; + } + else if( *piTargetX <= ANVIL_SCENE_ITEM2_SLOT_UP_OFFSET) + { + newSection = eSectionAnvilItem2; + } + else if( *piTargetX >= ANVIL_SCENE_RESULT_SLOT_UP_OFFSET) + { + newSection = eSectionAnvilResult; + } + } + break; + case eSectionAnvilUsing: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionAnvilInventory; + } + else if(eTapDirection == eTapStateDown) + { + if( *piTargetX <= ANVIL_SCENE_ITEM1_SLOT_UP_OFFSET) + { + newSection = eSectionAnvilItem1; + } + else if( *piTargetX <= ANVIL_SCENE_ITEM2_SLOT_UP_OFFSET) + { + newSection = eSectionAnvilName; + } + else if( *piTargetX >= ANVIL_SCENE_RESULT_SLOT_UP_OFFSET) + { + newSection = eSectionAnvilName; + } + } + break; + default: + assert( false ); + break; + } + + updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, xOffset); + + return newSection; +} + +int IUIScene_AnvilMenu::getSectionStartOffset(ESceneSection eSection) +{ + int offset = 0; + switch( eSection ) + { + case eSectionAnvilItem1: + offset = MerchantMenu::PAYMENT1_SLOT; + break; + case eSectionAnvilItem2: + offset = MerchantMenu::PAYMENT2_SLOT; + break; + case eSectionAnvilResult: + offset = MerchantMenu::RESULT_SLOT; + break; + case eSectionAnvilInventory: + offset = MerchantMenu::INV_SLOT_START; + break; + case eSectionAnvilUsing: + offset = MerchantMenu::USE_ROW_SLOT_START; + break; + default: + assert( false ); + break; + } + return offset; +} + +void IUIScene_AnvilMenu::handleOtherClicked(int iPad, ESceneSection eSection, int buttonNum, bool quickKey) +{ + switch(eSection) + { + case eSectionAnvilName: + handleEditNamePressed(); + break; + }; +} + +bool IUIScene_AnvilMenu::IsSectionSlotList( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionAnvilUsing: + case eSectionAnvilInventory: + case eSectionAnvilItem1: + case eSectionAnvilItem2: + case eSectionAnvilResult: + return true; + } + return false; +} + +void IUIScene_AnvilMenu::handleTick() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + bool canAfford = true; + wstring m_costString = L""; + + if(m_repairMenu->cost > 0) + { + if(m_repairMenu->cost >= 40 && !pMinecraft->localplayers[getPad()]->abilities.instabuild) + { + m_costString = app.GetString(IDS_REPAIR_EXPENSIVE); + canAfford = false; + } + else if(!m_repairMenu->getSlot(RepairMenu::RESULT_SLOT)->hasItem()) + { + // Do nothing + } + else + { + LPCWSTR costString = app.GetString(IDS_REPAIR_COST); + wchar_t temp[256]; + swprintf(temp, 256, costString, m_repairMenu->cost); + m_costString = temp; + if(!m_repairMenu->getSlot(RepairMenu::RESULT_SLOT)->mayPickup(dynamic_pointer_cast(m_inventory->player->shared_from_this()))) + { + canAfford = false; + } + } + } + setCostLabel(m_costString, canAfford); + + bool crossVisible = (m_repairMenu->getSlot(RepairMenu::INPUT_SLOT)->hasItem() || m_repairMenu->getSlot(RepairMenu::ADDITIONAL_SLOT)->hasItem()) && !m_repairMenu->getSlot(RepairMenu::RESULT_SLOT)->hasItem(); + showCross(crossVisible); +} + +void IUIScene_AnvilMenu::updateItemName() +{ + Slot *slot = m_repairMenu->getSlot(RepairMenu::INPUT_SLOT); + if (slot != NULL && slot->hasItem()) + { + if (!slot->getItem()->hasCustomHoverName() && m_itemName.compare(slot->getItem()->getHoverName())==0) + { + m_itemName = L""; + } + } + + m_repairMenu->setItemName(m_itemName); + + // Convert to byteArray + ByteArrayOutputStream baos; + DataOutputStream dos(&baos); + dos.writeUTF(m_itemName); + Minecraft::GetInstance()->localplayers[getPad()]->connection->send(shared_ptr(new CustomPayloadPacket(CustomPayloadPacket::SET_ITEM_NAME_PACKET, baos.toByteArray()))); +} + +void IUIScene_AnvilMenu::refreshContainer(AbstractContainerMenu *container, vector > *items) +{ + slotChanged(container, RepairMenu::INPUT_SLOT, container->getSlot(0)->getItem()); +} + +void IUIScene_AnvilMenu::slotChanged(AbstractContainerMenu *container, int slotIndex, shared_ptr item) +{ + if (slotIndex == RepairMenu::INPUT_SLOT) + { + m_itemName = item == NULL ? L"" : item->getHoverName(); + setEditNameValue(m_itemName); + setEditNameEditable(item != NULL); + if (item != NULL) + { + updateItemName(); + } + } +} + +void IUIScene_AnvilMenu::setContainerData(AbstractContainerMenu *container, int id, int value) +{ +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.h b/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.h new file mode 100644 index 00000000..6c4348f2 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.h @@ -0,0 +1,45 @@ +#pragma once +#include "IUIScene_AbstractContainerMenu.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.ContainerListener.h" + +// The 0-indexed slot in the inventory list that lines up with the result slot +#define ANVIL_SCENE_RESULT_SLOT_UP_OFFSET 5 +#define ANVIL_SCENE_RESULT_SLOT_DOWN_OFFSET 5 +#define ANVIL_SCENE_ITEM1_SLOT_UP_OFFSET 3 +#define ANVIL_SCENE_ITEM1_SLOT_DOWN_OFFSET 3 +#define ANVIL_SCENE_ITEM2_SLOT_UP_OFFSET 4 +#define ANVIL_SCENE_ITEM2_SLOT_DOWN_OFFSET 4 + +class Inventory; +class RepairMenu; + +class IUIScene_AnvilMenu : public virtual IUIScene_AbstractContainerMenu, public net_minecraft_world_inventory::ContainerListener +{ +protected: + shared_ptr m_inventory; + RepairMenu *m_repairMenu; + wstring m_itemName; + +protected: + IUIScene_AnvilMenu(); + + virtual ESceneSection GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ); + int getSectionStartOffset(ESceneSection eSection); + virtual void handleOtherClicked(int iPad, ESceneSection eSection, int buttonNum, bool quickKey); + bool IsSectionSlotList( ESceneSection eSection ); + + void handleTick(); + + // Anvil only + virtual void handleEditNamePressed() = 0; + virtual void setEditNameValue(const wstring &name) = 0; + virtual void setEditNameEditable(bool enabled) = 0; + virtual void setCostLabel(const wstring &label, bool canAfford) = 0; + virtual void showCross(bool show) = 0; + void updateItemName(); + + // ContainerListenr + void refreshContainer(AbstractContainerMenu *container, vector > *items); + void slotChanged(AbstractContainerMenu *container, int slotIndex, shared_ptr item); + void setContainerData(AbstractContainerMenu *container, int id, int value); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_BrewingMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_BrewingMenu.cpp new file mode 100644 index 00000000..44bbdc44 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_BrewingMenu.cpp @@ -0,0 +1,151 @@ +#include "stdafx.h" + +#include "IUIScene_BrewingMenu.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" + +IUIScene_AbstractContainerMenu::ESceneSection IUIScene_BrewingMenu::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 eSectionBrewingBottle1: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionBrewingIngredient; + } + else if(eTapDirection == eTapStateDown) + { + newSection = eSectionBrewingInventory; + xOffset = BREWING_SCENE_BOTTLE1_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateLeft) + { + newSection = eSectionBrewingBottle3; + } + else if(eTapDirection == eTapStateRight) + { + newSection = eSectionBrewingBottle2; + } + break; + case eSectionBrewingBottle2: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionBrewingIngredient; + } + else if(eTapDirection == eTapStateDown) + { + newSection = eSectionBrewingInventory; + xOffset = BREWING_SCENE_BOTTLE2_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateLeft) + { + newSection = eSectionBrewingBottle1; + } + else if(eTapDirection == eTapStateRight) + { + newSection = eSectionBrewingBottle3; + } + break; + case eSectionBrewingBottle3: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionBrewingIngredient; + } + else if(eTapDirection == eTapStateDown) + { + newSection = eSectionBrewingInventory; + xOffset = BREWING_SCENE_BOTTLE3_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateLeft) + { + newSection = eSectionBrewingBottle2; + } + else if(eTapDirection == eTapStateRight) + { + newSection = eSectionBrewingBottle1; + } + break; + case eSectionBrewingIngredient: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionBrewingUsing; + xOffset = BREWING_SCENE_INGREDIENT_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateDown) + { + newSection = eSectionBrewingBottle2; + } + break; + case eSectionBrewingInventory: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionBrewingUsing; + } + else if(eTapDirection == eTapStateUp) + { + if( *piTargetX <= BREWING_SCENE_BOTTLE1_SLOT_UP_OFFSET) + { + newSection = eSectionBrewingBottle1; + } + else if( *piTargetX <= BREWING_SCENE_BOTTLE2_SLOT_UP_OFFSET) + { + newSection = eSectionBrewingBottle2; + } + else if( *piTargetX >= BREWING_SCENE_BOTTLE3_SLOT_UP_OFFSET) + { + newSection = eSectionBrewingBottle3; + } + } + break; + case eSectionBrewingUsing: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionBrewingInventory; + } + else if(eTapDirection == eTapStateDown) + { + newSection = eSectionBrewingIngredient; + } + break; + default: + assert( false ); + break; + } + + updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, xOffset); + + return newSection; +} + +int IUIScene_BrewingMenu::getSectionStartOffset(ESceneSection eSection) +{ + int offset = 0; + switch( eSection ) + { + case eSectionBrewingBottle1: + offset = BrewingStandMenu::BOTTLE_SLOT_START; + break; + case eSectionBrewingBottle2: + offset = BrewingStandMenu::BOTTLE_SLOT_START + 1; + break; + case eSectionBrewingBottle3: + offset = BrewingStandMenu::BOTTLE_SLOT_START + 2; + break; + case eSectionBrewingIngredient: + offset = BrewingStandMenu::INGREDIENT_SLOT; + break; + case eSectionBrewingInventory: + offset = BrewingStandMenu::INV_SLOT_START; + break; + case eSectionBrewingUsing: + offset = BrewingStandMenu::INV_SLOT_START + 27; + break; + default: + assert( false ); + break; + } + return offset; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_BrewingMenu.h b/Minecraft.Client/Common/UI/IUIScene_BrewingMenu.h new file mode 100644 index 00000000..2d5150bb --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_BrewingMenu.h @@ -0,0 +1,19 @@ +#pragma once +#include "IUIScene_AbstractContainerMenu.h" + +// The 0-indexed slot in the inventory list that lines up with the result slot +#define BREWING_SCENE_INGREDIENT_SLOT_UP_OFFSET 5 +#define BREWING_SCENE_INGREDIENT_SLOT_DOWN_OFFSET 5 +#define BREWING_SCENE_BOTTLE1_SLOT_UP_OFFSET 3 +#define BREWING_SCENE_BOTTLE1_SLOT_DOWN_OFFSET 3 +#define BREWING_SCENE_BOTTLE2_SLOT_UP_OFFSET 4 +#define BREWING_SCENE_BOTTLE2_SLOT_DOWN_OFFSET 4 +#define BREWING_SCENE_BOTTLE3_SLOT_UP_OFFSET 5 +#define BREWING_SCENE_BOTTLE3_SLOT_DOWN_OFFSET 5 + +class IUIScene_BrewingMenu : public virtual IUIScene_AbstractContainerMenu +{ +protected: + virtual ESceneSection GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ); + int getSectionStartOffset(ESceneSection eSection); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_ContainerMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_ContainerMenu.cpp new file mode 100644 index 00000000..c6a4df00 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_ContainerMenu.cpp @@ -0,0 +1,71 @@ +#include "stdafx.h" +#include "IUIScene_ContainerMenu.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" + +IUIScene_AbstractContainerMenu::ESceneSection IUIScene_ContainerMenu::GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ) +{ + ESceneSection newSection = eSection; + + // Find the new section if there is one + switch( eSection ) + { + case eSectionContainerChest: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionContainerInventory; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionContainerUsing; + } + break; + case eSectionContainerInventory: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionContainerUsing; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionContainerChest; + } + break; + case eSectionContainerUsing: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionContainerChest; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionContainerInventory; + } + break; + default: + assert( false ); + break; + } + + updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, 0); + + return newSection; +} + +int IUIScene_ContainerMenu::getSectionStartOffset(ESceneSection eSection) +{ + int offset = 0; + switch( eSection ) + { + case eSectionContainerChest: + offset = 0; + break; + case eSectionContainerInventory: + offset = m_menu->getSize() - (27+9); + break; + case eSectionContainerUsing: + offset = m_menu->getSize() - 9; + break; + default: + assert( false ); + break; + } + return offset; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_ContainerMenu.h b/Minecraft.Client/Common/UI/IUIScene_ContainerMenu.h new file mode 100644 index 00000000..e0408b39 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_ContainerMenu.h @@ -0,0 +1,10 @@ +#pragma once + +#include "IUIScene_AbstractContainerMenu.h" + +class IUIScene_ContainerMenu : public virtual IUIScene_AbstractContainerMenu +{ +protected: + virtual ESceneSection GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ); + int getSectionStartOffset(ESceneSection eSection); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.cpp new file mode 100644 index 00000000..f158b174 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.cpp @@ -0,0 +1,1400 @@ +#include "stdafx.h" + +#include "..\..\..\Minecraft.World\net.minecraft.world.item.crafting.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\..\..\Minecraft.World\net.minecraft.stats.h" +#include "..\..\LocalPlayer.h" +#include "IUIScene_CraftingMenu.h" + +Recipy::_eGroupType IUIScene_CraftingMenu::m_GroupTypeMapping4GridA[IUIScene_CraftingMenu::m_iMaxGroup2x2]= +{ + Recipy::eGroupType_Structure, + Recipy::eGroupType_Tool, + Recipy::eGroupType_Food, + Recipy::eGroupType_Mechanism, + Recipy::eGroupType_Transport, + Recipy::eGroupType_Decoration, +}; + +Recipy::_eGroupType IUIScene_CraftingMenu::m_GroupTypeMapping9GridA[IUIScene_CraftingMenu::m_iMaxGroup3x3]= +{ + Recipy::eGroupType_Structure, + Recipy::eGroupType_Tool, + Recipy::eGroupType_Food, + Recipy::eGroupType_Armour, + Recipy::eGroupType_Mechanism, + Recipy::eGroupType_Transport, + Recipy::eGroupType_Decoration, +}; + + +LPCWSTR IUIScene_CraftingMenu::m_GroupIconNameA[m_iMaxGroup3x3]= +{ + L"Structures",//Recipy::eGroupType_Structure, + L"Tools",//Recipy::eGroupType_Tool, + L"Food",//Recipy::eGroupType_Food, + L"Armour",//Recipy::eGroupType_Armour, + L"Mechanisms",//Recipy::eGroupType_Mechanism, + L"Transport",//Recipy::eGroupType_Transport, + L"Decoration",//Recipy::eGroupType_Decoration, +}; + +IUIScene_CraftingMenu::_eGroupTab IUIScene_CraftingMenu::m_GroupTabBkgMapping2x2A[m_iMaxGroup2x2]= +{ + eGroupTab_Left, + eGroupTab_Middle, + eGroupTab_Middle, + eGroupTab_Middle, + eGroupTab_Middle, + eGroupTab_Right, +}; + +IUIScene_CraftingMenu::_eGroupTab IUIScene_CraftingMenu::m_GroupTabBkgMapping3x3A[m_iMaxGroup3x3]= +{ + eGroupTab_Left, + eGroupTab_Middle, + eGroupTab_Middle, + eGroupTab_Middle, + eGroupTab_Middle, + eGroupTab_Middle, + eGroupTab_Right, +}; + + +// mapping array to map the base objects to their description string +// This should map the enums +// enum +// { +// eBaseItemType_undefined=0, +// eBaseItemType_sword, +// eBaseItemType_shovel, +// eBaseItemType_pickaxe, +// eBaseItemType_hatchet, +// eBaseItemType_hoe, +// eBaseItemType_door, +// eBaseItemType_helmet, +// eBaseItemType_chestplate, +// eBaseItemType_leggings, +// eBaseItemType_boots, +// eBaseItemType_ingot, +// eBaseItemType_rail, +// eBaseItemType_block, +// eBaseItemType_pressureplate, +// eBaseItemType_stairs, +// eBaseItemType_cloth, +// eBaseItemType_dyepowder, +// eBaseItemType_structplanks +// eBaseItemType_structblock, +// eBaseItemType_slab, +// eBaseItemType_halfslab, +// eBaseItemType_torch, +// eBaseItemType_bow, +// eBaseItemType_pockettool, +// eBaseItemType_utensil, +// +// } +// eBaseItemType; + +IUIScene_CraftingMenu::IUIScene_CraftingMenu() +{ + m_iCurrentSlotHIndex=0; + m_iCurrentSlotVIndex=1; + + for(int i=0;ilocalgameModes[getPad()] != NULL ) + { + Tutorial *tutorial = pMinecraft->localgameModes[getPad()]->getTutorial(); + if(tutorial != NULL) + { + tutorial->handleUIInput(iAction); + if(ui.IsTutorialVisible(getPad()) && !tutorial->isInputAllowed(iAction)) + { + return S_OK; + } + } + } + + + switch(iAction) + { + case ACTION_MENU_X: + + // change the display + m_iDisplayDescription++; + if(m_iDisplayDescription==DISPLAY_MAX) m_iDisplayDescription=DISPLAY_INVENTORY; + ui.PlayUISFX(eSFX_Focus); + UpdateMultiPanel(); + UpdateTooltips(); + break; + case ACTION_MENU_PAUSEMENU: + case ACTION_MENU_B: + ui.ShowTooltip( iPad, eToolTipButtonX, false ); + ui.ShowTooltip( iPad, eToolTipButtonB, false ); + ui.ShowTooltip( iPad, eToolTipButtonA, false ); + ui.ShowTooltip( iPad, eToolTipButtonRB, false ); + // kill the crafting xui + //ui.PlayUISFX(eSFX_Back); + ui.CloseUIScenes(iPad); + + bHandled = true; + break; + case ACTION_MENU_A: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + // Do some crafting! + if(m_pPlayer && m_pPlayer->inventory) + { + //RecipyList *recipes = ((Recipes *)Recipes::getInstance())->getRecipies(); + Recipy::INGREDIENTS_REQUIRED *pRecipeIngredientsRequired=Recipes::getInstance()->getRecipeIngredientsArray(); + // Force a make if the debug is on + if(app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L< pTempItemInst=pRecipeIngredientsRequired[iRecipe].pRecipy->assemble(nullptr); + //int iIcon=pTempItemInst->getItem()->getIcon(pTempItemInst->getAuxValue()); + + if( pMinecraft->localgameModes[iPad] != NULL) + { + Tutorial *tutorial = pMinecraft->localgameModes[iPad]->getTutorial(); + if(tutorial != NULL) + { + tutorial->onCrafted(pTempItemInst); + } + } + + pMinecraft->localgameModes[iPad]->handleCraftItem(iRecipe,m_pPlayer); + + if(m_pPlayer->inventory->add(pTempItemInst)==false) + { + // no room in inventory, so throw it down + m_pPlayer->drop(pTempItemInst); + } + // play a sound + //pMinecraft->soundEngine->playUI( L"random.pop", 1.0f, 1.0f); + ui.PlayUISFX(eSFX_Craft); + } + } + else if(CanBeMadeA[m_iCurrentSlotHIndex].iCount!=0) + { + int iSlot; + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>1) + { + iSlot=iVSlotIndexA[m_iCurrentSlotVIndex]; + } + else + { + iSlot=0; + } + int iRecipe= CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]; + shared_ptr pTempItemInst=pRecipeIngredientsRequired[iRecipe].pRecipy->assemble(nullptr); + //int iIcon=pTempItemInst->getItem()->getIcon(pTempItemInst->getAuxValue()); + + if( pMinecraft->localgameModes[iPad] != NULL ) + { + Tutorial *tutorial = pMinecraft->localgameModes[iPad]->getTutorial(); + if(tutorial != NULL) + { + tutorial->createItemSelected(pTempItemInst, pRecipeIngredientsRequired[iRecipe].bCanMake[iPad]); + } + } + + if(pRecipeIngredientsRequired[iRecipe].bCanMake[iPad]) + { + pTempItemInst->onCraftedBy(m_pPlayer->level, dynamic_pointer_cast( m_pPlayer->shared_from_this() ), pTempItemInst->count ); + // TODO 4J Stu - handleCraftItem should do a lot more than what it does, loads of the "can we craft" code should also probably be + // shifted to the GameMode + pMinecraft->localgameModes[iPad]->handleCraftItem(iRecipe,m_pPlayer); + + // play a sound + //pMinecraft->soundEngine->playUI( L"random.pop", 1.0f, 1.0f); + ui.PlayUISFX(eSFX_Craft); + + // and remove those resources from your inventory + for(int i=0;i ingItemInst = nullptr; + // do we need to remove a specific aux value? + if(pRecipeIngredientsRequired[iRecipe].iIngAuxValA[i]!=Recipes::ANY_AUX_VALUE) + { + ingItemInst = m_pPlayer->inventory->getResourceItem( pRecipeIngredientsRequired[iRecipe].iIngIDA[i],pRecipeIngredientsRequired[iRecipe].iIngAuxValA[i] ); + m_pPlayer->inventory->removeResource(pRecipeIngredientsRequired[iRecipe].iIngIDA[i],pRecipeIngredientsRequired[iRecipe].iIngAuxValA[i]); + } + else + { + ingItemInst = m_pPlayer->inventory->getResourceItem( pRecipeIngredientsRequired[iRecipe].iIngIDA[i] ); + m_pPlayer->inventory->removeResource(pRecipeIngredientsRequired[iRecipe].iIngIDA[i]); + } + + // 4J Stu - Fix for #13097 - Bug: Milk Buckets are removed when crafting Cake + if (ingItemInst != NULL) + { + if (ingItemInst->getItem()->hasCraftingRemainingItem()) + { + // replace item with remaining result + m_pPlayer->inventory->add( shared_ptr( new ItemInstance(ingItemInst->getItem()->getCraftingRemainingItem()) ) ); + } + + } + } + } + + // 4J Stu - Fix for #13119 - We should add the item after we remove the ingredients + if(m_pPlayer->inventory->add(pTempItemInst)==false ) + { + // no room in inventory, so throw it down + m_pPlayer->drop(pTempItemInst); + } + + //4J Gordon: Achievements + switch(pTempItemInst->id ) + { + case Tile::workBench_Id: m_pPlayer->awardStat(GenericStats::buildWorkbench(), GenericStats::param_buildWorkbench()); break; + case Item::pickAxe_wood_Id: m_pPlayer->awardStat(GenericStats::buildPickaxe(), GenericStats::param_buildPickaxe()); break; + case Tile::furnace_Id: m_pPlayer->awardStat(GenericStats::buildFurnace(), GenericStats::param_buildFurnace()); break; + case Item::hoe_wood_Id: m_pPlayer->awardStat(GenericStats::buildHoe(), GenericStats::param_buildHoe()); break; + case Item::bread_Id: m_pPlayer->awardStat(GenericStats::makeBread(), GenericStats::param_makeBread()); break; + case Item::cake_Id: m_pPlayer->awardStat(GenericStats::bakeCake(), GenericStats::param_bakeCake()); break; + case Item::pickAxe_stone_Id: m_pPlayer->awardStat(GenericStats::buildBetterPickaxe(), GenericStats::param_buildBetterPickaxe()); break; + case Item::sword_wood_Id: m_pPlayer->awardStat(GenericStats::buildSword(), GenericStats::param_buildSword()); break; + case Tile::dispenser_Id: m_pPlayer->awardStat(GenericStats::dispenseWithThis(), GenericStats::param_dispenseWithThis()); break; + case Tile::enchantTable_Id: m_pPlayer->awardStat(GenericStats::enchantments(), GenericStats::param_enchantments()); break; + case Tile::bookshelf_Id: m_pPlayer->awardStat(GenericStats::bookcase(), GenericStats::param_bookcase()); break; + } + + // We've used some ingredients from our inventory, so update the recipes we can make + CheckRecipesAvailable(); + // don't reset the vertical slots - we want to stay where we are + UpdateVerticalSlots(); + UpdateHighlight(); + } + else + { + //pMinecraft->soundEngine->playUI( L"btn.back", 1.0f, 1.0f); + ui.PlayUISFX(eSFX_CraftFail); + } + } + } + break; + + case ACTION_MENU_LEFT_SCROLL: + // turn off the old group tab + showTabHighlight(m_iGroupIndex,false); + + if(m_iGroupIndex==0) + { + if(m_iContainerType==RECIPE_TYPE_3x3) + { + m_iGroupIndex=m_iMaxGroup3x3-1; + } + else + { + m_iGroupIndex=m_iMaxGroup2x2-1; + } + } + else + { + m_iGroupIndex--; + } + // turn on the new group + showTabHighlight(m_iGroupIndex,true); + + m_iCurrentSlotHIndex=0; + m_iCurrentSlotVIndex=1; + + CheckRecipesAvailable(); + // reset the vertical slots + iVSlotIndexA[0]=CanBeMadeA[m_iCurrentSlotHIndex].iCount-1; + iVSlotIndexA[1]=0; + iVSlotIndexA[2]=1; + ui.PlayUISFX(eSFX_Focus); + UpdateVerticalSlots(); + UpdateHighlight(); + setGroupText(GetGroupNameText(m_pGroupA[m_iGroupIndex])); + + break; + case ACTION_MENU_RIGHT_SCROLL: + // turn off the old group tab + showTabHighlight(m_iGroupIndex,false); + + m_iGroupIndex++; + if(m_iContainerType==RECIPE_TYPE_3x3) + { + if(m_iGroupIndex==m_iMaxGroup3x3) m_iGroupIndex=0; + } + else + { + if(m_iGroupIndex==m_iMaxGroup2x2) m_iGroupIndex=0; + } + // turn on the new group + showTabHighlight(m_iGroupIndex,true); + + m_iCurrentSlotHIndex=0; + m_iCurrentSlotVIndex=1; + CheckRecipesAvailable(); + // reset the vertical slots + iVSlotIndexA[0]=CanBeMadeA[m_iCurrentSlotHIndex].iCount-1; + iVSlotIndexA[1]=0; + iVSlotIndexA[2]=1; + ui.PlayUISFX(eSFX_Focus); + UpdateVerticalSlots(); + UpdateHighlight(); + setGroupText(GetGroupNameText(m_pGroupA[m_iGroupIndex])); + break; + } + + // 4J-Tomk - check if we've only got one vertical scroll slot (480, splits & Vita) + bool bNoScrollSlots = false; + if(m_bSplitscreen ||(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen())) + { + bNoScrollSlots = true; + } +#ifdef __PSVITA__ + bNoScrollSlots = true; +#endif + + // 4J Stu - We did used to swap the thumsticks based on Southpaw in this scene, but ONLY in this scene + switch(iAction) + { + case ACTION_MENU_OTHER_STICK_UP: + scrollDescriptionUp(); + break; + case ACTION_MENU_OTHER_STICK_DOWN: + scrollDescriptionDown(); + break; + case ACTION_MENU_RIGHT: + { + int iOldHSlot=m_iCurrentSlotHIndex; + + m_iCurrentSlotHIndex++; + if(m_iCurrentSlotHIndex>=m_iCraftablesMaxHSlotC) m_iCurrentSlotHIndex=0; + m_iCurrentSlotVIndex=1; + // clear the indices + iVSlotIndexA[0]=CanBeMadeA[m_iCurrentSlotHIndex].iCount-1; + iVSlotIndexA[1]=0; + iVSlotIndexA[2]=1; + + UpdateVerticalSlots(); + UpdateHighlight(); + // re-enable the old hslot + if(CanBeMadeA[iOldHSlot].iCount>0) + { + setShowCraftHSlot(iOldHSlot,true); + } + ui.PlayUISFX(eSFX_Focus); + bHandled = true; + } + break; + case ACTION_MENU_LEFT: + { + if(m_iCraftablesMaxHSlotC!=0) + { + int iOldHSlot=m_iCurrentSlotHIndex; + if(m_iCurrentSlotHIndex==0) m_iCurrentSlotHIndex=m_iCraftablesMaxHSlotC-1; + else m_iCurrentSlotHIndex--; + m_iCurrentSlotVIndex=1; + // clear the indices + iVSlotIndexA[0]=CanBeMadeA[m_iCurrentSlotHIndex].iCount-1; + iVSlotIndexA[1]=0; + iVSlotIndexA[2]=1; + + UpdateVerticalSlots(); + UpdateHighlight(); + // re-enable the old hslot + if(CanBeMadeA[iOldHSlot].iCount>0) + { + setShowCraftHSlot(iOldHSlot,true); + } + ui.PlayUISFX(eSFX_Focus); + } + bHandled = true; + } + break; + case ACTION_MENU_UP: + { + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>1) + { + if(bNoScrollSlots) + { + if(iVSlotIndexA[1]==0) + { + iVSlotIndexA[1]=CanBeMadeA[m_iCurrentSlotHIndex].iCount-1; + } + else + { + iVSlotIndexA[1]--; + } + ui.PlayUISFX(eSFX_Focus); + } + else + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>2) + { + { + if(m_iCurrentSlotVIndex!=0) + { + // just move the highlight + m_iCurrentSlotVIndex--; + ui.PlayUISFX(eSFX_Focus); + } + else + { + //move the slots + iVSlotIndexA[2]=iVSlotIndexA[1]; + iVSlotIndexA[1]=iVSlotIndexA[0]; + // on 0 and went up, so cycle the values + if(iVSlotIndexA[0]==0) + { + iVSlotIndexA[0]=CanBeMadeA[m_iCurrentSlotHIndex].iCount-1; + } + else + { + iVSlotIndexA[0]--; + } + ui.PlayUISFX(eSFX_Focus); + } + } + } + else + { + if(m_iCurrentSlotVIndex!=1) + { + // just move the highlight + m_iCurrentSlotVIndex--; + ui.PlayUISFX(eSFX_Focus); + } + } + UpdateVerticalSlots(); + UpdateHighlight(); + } + + } + break; + case ACTION_MENU_DOWN: + { + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>1) + { + if(bNoScrollSlots) + { + if(iVSlotIndexA[1]==(CanBeMadeA[m_iCurrentSlotHIndex].iCount-1)) + { + iVSlotIndexA[1]=0; + } + else + { + iVSlotIndexA[1]++; + } + ui.PlayUISFX(eSFX_Focus); + + } + else + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>2) + { + if(m_iCurrentSlotVIndex!=2) + { + m_iCurrentSlotVIndex++; + ui.PlayUISFX(eSFX_Focus); + } + else + { + iVSlotIndexA[0]=iVSlotIndexA[1]; + iVSlotIndexA[1]=iVSlotIndexA[2]; + if(iVSlotIndexA[m_iCurrentSlotVIndex]==(CanBeMadeA[m_iCurrentSlotHIndex].iCount-1)) + { + iVSlotIndexA[2]=0; + } + else + { + iVSlotIndexA[2]++; + } + ui.PlayUISFX(eSFX_Focus); + } + } + else + { + if(m_iCurrentSlotVIndex!=(CanBeMadeA[m_iCurrentSlotHIndex].iCount)) + { + m_iCurrentSlotVIndex++; + ui.PlayUISFX(eSFX_Focus); + } + } + UpdateVerticalSlots(); + UpdateHighlight(); + } + } + break; + } + + return bHandled; +} + +////////////////////////////////////////////////////////////////////////// +// +// CheckRecipesAvailable +// +////////////////////////////////////////////////////////////////////////// +void IUIScene_CraftingMenu::CheckRecipesAvailable() +{ + int iHSlotBrushControl=0; + + // clear the current list + memset(CanBeMadeA,0,sizeof(CANBEMADE)*m_iCraftablesMaxHSlotC); + + hideAllHSlots(); + + if(m_pPlayer && m_pPlayer->inventory) + { + // dump out the inventory + /* for (unsigned int k = 0; k < m_pPlayer->inventory->items.length; k++) + { + if (m_pPlayer->inventory->items[k] != NULL) + { + wstring itemstring=m_pPlayer->inventory->items[k]->toString(); + + //printf("--- Player has "); + OutputDebugStringW(itemstring.c_str()); + //printf(" with Aux val = %d, base type = %d, Material = %d\n",m_pPlayer->inventory->items[k]->getAuxValue(),m_pPlayer->inventory->items[k]->getItem()->getBaseItemType(),m_pPlayer->inventory->items[k]->getItem()->getMaterial()); + } + } + */ + RecipyList *recipes = ((Recipes *)Recipes::getInstance())->getRecipies(); + Recipy::INGREDIENTS_REQUIRED *pRecipeIngredientsRequired=Recipes::getInstance()->getRecipeIngredientsArray(); + int iRecipeC=(int)recipes->size(); + AUTO_VAR(itRecipe, recipes->begin()); + + // dump out the recipe products + + // for (int i = 0; i < iRecipeC; i++) + // { + // shared_ptr pTempItemInst=pRecipeIngredientsRequired[i].pRecipy->assemble(NULL); + // if (pTempItemInst != NULL) + // { + // wstring itemstring=pTempItemInst->toString(); + // + // printf("Recipe [%d] = ",i); + // OutputDebugStringW(itemstring.c_str()); + // if(pTempItemInst->id!=0) + // { + // if(pTempItemInst->id<256) + // { + // Tile *pTile=Tile::tiles[pTempItemInst->id]; + // printf("[TILE] ID\t%d\tAux val\t%d\tBase type\t%d\tMaterial\t%d\t Count=%d\n",pTempItemInst->id, pTempItemInst->getAuxValue(),pTile->getBaseItemType(),pTile->getMaterial(),pTempItemInst->GetCount()); + // } + // else + // { + // printf("ID\t%d\tAux val\t%d\tBase type\t%d\tMaterial\t%d Count=%d\n",pTempItemInst->id, pTempItemInst->getAuxValue(),pTempItemInst->getItem()->getBaseItemType(),pTempItemInst->getItem()->getMaterial(),pTempItemInst->GetCount()); + // } + // + // } + // } + // } + + for(int i=0;igetGroup()!=m_pGroupA[m_iGroupIndex]) + { + itRecipe++; + pRecipeIngredientsRequired[i].bCanMake[getPad()]=false; + continue; + } + // if we are in the inventory menu, then we have 2x2 crafting available only + if((m_iContainerType==RECIPE_TYPE_2x2) && (pRecipeIngredientsRequired[i].iType==RECIPE_TYPE_3x3)) + { + // need a crafting table for this recipe + itRecipe++; + pRecipeIngredientsRequired[i].bCanMake[getPad()]=false; + continue; + } + // clear the mask showing which ingredients are missing + pRecipeIngredientsRequired[i].usBitmaskMissingGridIngredients[getPad()]=0; + + //bool bCanMakeRecipe=true; + bool *bFoundA= new bool [pRecipeIngredientsRequired[i].iIngC]; + for(int j=0;jinventory->items.length; k++) + { + if (m_pPlayer->inventory->items[k] != NULL) + { + // do they have the ingredient, and the aux value matches, and enough off it? + if((m_pPlayer->inventory->items[k]->id == pRecipeIngredientsRequired[i].iIngIDA[j]) && + // check if the ingredient required doesn't care about the aux value, or if it does, does the inventory item aux match it + ((pRecipeIngredientsRequired[i].iIngAuxValA[j]==Recipes::ANY_AUX_VALUE) || (pRecipeIngredientsRequired[i].iIngAuxValA[j]==m_pPlayer->inventory->items[k]->getAuxValue())) + ) + { + // do they have enough? We need to check the whole inventory, since they may have enough in different slots (milk isn't milkx3, but milk,milk,milk) + if(m_pPlayer->inventory->items[k]->GetCount()>=pRecipeIngredientsRequired[i].iIngValA[j]) + { + // they have enough with one slot + bFoundA[j]=true; + } + else + { + // look at the combined value from the whole inventory + + for(unsigned int l=0;linventory->items.length;l++) + { + if (m_pPlayer->inventory->items[l] != NULL) + { + if( + (m_pPlayer->inventory->items[l]->id == pRecipeIngredientsRequired[i].iIngIDA[j]) && + ( (pRecipeIngredientsRequired[i].iIngAuxValA[j]==Recipes::ANY_AUX_VALUE) || (pRecipeIngredientsRequired[i].iIngAuxValA[j]==m_pPlayer->inventory->items[l]->getAuxValue() )) + ) + { + iTotalCount+=m_pPlayer->inventory->items[l]->GetCount(); + } + } + } + + if(iTotalCount>=pRecipeIngredientsRequired[i].iIngValA[j]) + { + bFoundA[j]=true; + } + } + + // 4J Stu - TU-1 hotfix + // Fix for #13143 - Players are able to craft items they do not have enough ingredients for if they store the ingredients in multiple, smaller stacks + break; + } + } + } + // if bFoundA[j] is false, then we didn't have enough of the ingredient required by the recipe, so mark the grid items we're short of + if(bFoundA[j]==false) + { + int iMissing = pRecipeIngredientsRequired[i].iIngValA[j]-iTotalCount; + int iGridIndex=0; + while(iMissing!=0) + { + // need to check if there is an aux val and match that + if(((pRecipeIngredientsRequired[i].uiGridA[iGridIndex]&0x00FFFFFF)==pRecipeIngredientsRequired[i].iIngIDA[j]) && + ((pRecipeIngredientsRequired[i].iIngAuxValA[j]==Recipes::ANY_AUX_VALUE) ||(pRecipeIngredientsRequired[i].iIngAuxValA[j]== ((pRecipeIngredientsRequired[i].uiGridA[iGridIndex]&0xFF000000)>>24))) ) + { + // this grid entry is the ingredient we don't have enough of + pRecipeIngredientsRequired[i].usBitmaskMissingGridIngredients[getPad()]|=1< pTempItemInst=pRecipeIngredientsRequired[i].pRecipy->assemble(nullptr); + //int iIcon=pTempItemInst->getItem()->getIcon(pTempItemInst->getAuxValue()); + int iID=pTempItemInst->getItem()->id; + int iBaseType; + + if(iID<256) // is it a tile? + { + iBaseType=Tile::tiles[iID]->getBaseItemType(); + } + else + { + iBaseType=pTempItemInst->getItem()->getBaseItemType(); + } + + // ignore for the misc base type - these have not been placed in a base type group + if(iBaseType!=Item::eBaseItemType_undefined) + { + for(int k=0;kgetDescriptionId())); +#endif + app.DebugPrintf("\n"); + + } + } + } + else + { + app.DebugPrintf("Need more HSlots\n"); + } + + delete [] bFoundA; + itRecipe++; + } + } + + // run through the canbemade list and update the icons displayed + int iIndex=0; + //RecipyList *recipes = ((Recipes *)Recipes::getInstance())->getRecipies(); + Recipy::INGREDIENTS_REQUIRED *pRecipeIngredientsRequired=Recipes::getInstance()->getRecipeIngredientsArray(); + + while((iIndex pTempItemInst=pRecipeIngredientsRequired[CanBeMadeA[iIndex].iRecipeA[0]].pRecipy->assemble(nullptr); + assert(pTempItemInst->id!=0); + unsigned int uiAlpha; + + if(app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<id == Item::clock_Id || pTempItemInst->id == Item::compass_Id ) + { + pTempItemInst->setAuxValue( 255 ); + } + setCraftHSlotItem(getPad(),iIndex,pTempItemInst,uiAlpha); + + iIndex++; + } + + // 4J-PB - Removed - UpdateTooltips will do this + // Update tooltips + /*if(CanBeMadeA[m_iCurrentSlotHIndex].iCount!=0) + { + ui.ShowTooltip( getPad(), eToolTipButtonA, true ); + // 4J-PB - not implemented ! + //ui.EnableTooltip( getPad(), eToolTipButtonA, true ); + } + else + { + ui.ShowTooltip( getPad(), eToolTipButtonA, false ); + }*/ +} + +////////////////////////////////////////////////////////////////////////// +// +// UpdateHighlight +// +////////////////////////////////////////////////////////////////////////// +void IUIScene_CraftingMenu::UpdateHighlight() +{ + updateHighlightAndScrollPositions(); + + bool bCanBeMade=CanBeMadeA[m_iCurrentSlotHIndex].iCount!=0; + if(bCanBeMade) + { + //RecipyList *recipes = ((Recipes *)Recipes::getInstance())->getRecipies(); + Recipy::INGREDIENTS_REQUIRED *pRecipeIngredientsRequired=Recipes::getInstance()->getRecipeIngredientsArray(); + int iSlot; + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>1) + { + iSlot=iVSlotIndexA[m_iCurrentSlotVIndex]; + } + else + { + iSlot=0; + } + shared_ptr pTempItemInstAdditional=pRecipeIngredientsRequired[CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]].pRecipy->assemble(nullptr); + + // special case for the torch coal/charcoal + int id=pTempItemInstAdditional->getDescriptionId(); + LPCWSTR itemstring; + + switch(id) + { + case IDS_TILE_TORCH: + { + if(pRecipeIngredientsRequired[CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]].iIngAuxValA[0]==1) + { + itemstring=app.GetString( IDS_TILE_TORCHCHARCOAL ); + } + else + { + itemstring=app.GetString( IDS_TILE_TORCHCOAL ); + } + } + break; + case IDS_ITEM_FIREBALL: + { + if(pRecipeIngredientsRequired[CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]].iIngAuxValA[2]==1) + { + itemstring=app.GetString( IDS_ITEM_FIREBALLCHARCOAL ); + } + else + { + itemstring=app.GetString( IDS_ITEM_FIREBALLCOAL ); + } + } + break; + default: + itemstring=app.GetString(id ); + break; + } + + setItemText(itemstring); + } + else + { + setItemText(L""); + } + UpdateDescriptionText(bCanBeMade); + DisplayIngredients(); + + UpdateMultiPanel(); + + UpdateTooltips(); +} + +////////////////////////////////////////////////////////////////////////// +// +// UpdateVerticalSlots +// +////////////////////////////////////////////////////////////////////////// +void IUIScene_CraftingMenu::UpdateVerticalSlots() +{ + //RecipyList *recipes = ((Recipes *)Recipes::getInstance())->getRecipies(); + Recipy::INGREDIENTS_REQUIRED *pRecipeIngredientsRequired=Recipes::getInstance()->getRecipeIngredientsArray(); + + // update the vertical items for the current horizontal slot + hideAllVSlots(); + + // could have either 1 or 2 vertical slots, above and below the horizontal slot + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>1) + { + // turn off the horizontal one since we could be cycling through others + setShowCraftHSlot(m_iCurrentSlotHIndex,false); + int iSlots=(CanBeMadeA[m_iCurrentSlotHIndex].iCount>2)?3:2; + + // 4J-Tomk - check if we've only got one vertical scroll slot (480, splits & Vita) + bool bNoScrollSlots = false; + if(m_bSplitscreen ||(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen())) + { + bNoScrollSlots = true; + } +#ifdef __PSVITA__ + bNoScrollSlots = true; +#endif + + for(int i=0;i pTempItemInstAdditional=pRecipeIngredientsRequired[CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iVSlotIndexA[i]]].pRecipy->assemble(nullptr); + + assert(pTempItemInstAdditional->id!=0); + unsigned int uiAlpha; + + if(app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<id == Item::clock_Id || pTempItemInstAdditional->id == Item::compass_Id ) + { + pTempItemInstAdditional->setAuxValue( 255 ); + } + + setCraftVSlotItem(getPad(),i,pTempItemInstAdditional,uiAlpha); + + updateVSlotPositions(iSlots, i); + } + } +} + +////////////////////////////////////////////////////////////////////////// +// +// DisplayIngredients +// +////////////////////////////////////////////////////////////////////////// +void IUIScene_CraftingMenu::DisplayIngredients() +{ + //RecipyList *recipes = ((Recipes *)Recipes::getInstance())->getRecipies(); + Recipy::INGREDIENTS_REQUIRED *pRecipeIngredientsRequired=Recipes::getInstance()->getRecipeIngredientsArray(); + + // hide the previous ingredients + hideAllIngredientsSlots(); + + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount!=0) + { + int iSlot,iRecipy; + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>1) + { + iSlot=iVSlotIndexA[m_iCurrentSlotVIndex]; + iRecipy=CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]; + } + else + { + iSlot=0; + iRecipy=CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[0]; + } + + // show the 2x2 or 3x3 to make the current item + int iBoxWidth=(m_iContainerType==RECIPE_TYPE_2x2)?2:3; + int iRecipe=CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]; + bool bCanMakeRecipe = pRecipeIngredientsRequired[iRecipe].bCanMake[getPad()]; + shared_ptr pTempItemInst=pRecipeIngredientsRequired[iRecipe].pRecipy->assemble(nullptr); + + m_iIngredientsC=pRecipeIngredientsRequired[iRecipe].iIngC; + + // update the ingredients required - these will all be hidden until cycled by the user + for(int i=0;i itemInst= shared_ptr(new ItemInstance(item,pRecipeIngredientsRequired[iRecipe].iIngValA[i],iAuxVal)); + + setIngredientDescriptionItem(getPad(),i,itemInst); + setIngredientDescriptionRedBox(i,false); + + // 4J-PB - a very special case - the bed can use any kind of wool, so we can't use the item description + // and the same goes for the painting + int idescID; + + if( ((pTempItemInst->id==Item::bed_Id) &&(id==Tile::cloth_Id)) || + ((pTempItemInst->id==Item::painting_Id) &&(id==Tile::cloth_Id)) ) + { + idescID=IDS_ANY_WOOL; + } + else + { + idescID=itemInst->getDescriptionId(); + } + setIngredientDescriptionText(i,app.GetString(idescID)); + } + + // 4J Stu - For clocks and compasses we set the aux value to a special one that signals we should use a default texture + // rather than the dynamic one for the player + if( pTempItemInst->id == Item::clock_Id || pTempItemInst->id == Item::compass_Id ) + { + pTempItemInst->setAuxValue( 255 ); + } + + // don't grey out the output icon + setCraftingOutputSlotItem(getPad(), pTempItemInst); + + if(app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<>24; + + // 4J Stu - For clocks and compasses we set the aux value to a special one that signals we should use a default texture + // rather than the dynamic one for the player + if( id == Item::clock_Id || id == Item::compass_Id ) + { + iAuxVal = 0xFF; + } + shared_ptr itemInst= shared_ptr(new ItemInstance(id,1,iAuxVal)); + setIngredientSlotItem(getPad(),index,itemInst); + // show the ingredients we don't have if we can't make the recipe + if(app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<getRecipies(); + Recipy::INGREDIENTS_REQUIRED *pRecipeIngredientsRequired=Recipes::getInstance()->getRecipeIngredientsArray(); + + if(bCanBeMade) + { + int iSlot;//,iRecipy; + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>1) + { + iSlot=iVSlotIndexA[m_iCurrentSlotVIndex]; + //iRecipy=CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]; + } + else + { + iSlot=0; + //iRecipy=CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[0]; + } + + shared_ptr pTempItemInst=pRecipeIngredientsRequired[CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]].pRecipy->assemble(nullptr); + int iID=pTempItemInst->getItem()->id; + int iAuxVal=pTempItemInst->getAuxValue(); + int iBaseType; + + if(iID<256) // is it a tile? + { + iBaseType=Tile::tiles[iID]->getBaseItemType(); + + iIDSString = Tile::tiles[iID]->getUseDescriptionId(); + } + else + { + iBaseType=pTempItemInst->getItem()->getBaseItemType(); + + iIDSString = pTempItemInst->getUseDescriptionId(); + } + + // A few special cases where the description required is specific to crafting, rather than the normal description + if(iBaseType!=Item::eBaseItemType_undefined) + { + switch(iBaseType) + { + case Item::eBaseItemType_cloth: + switch(iAuxVal) + { + case 0: + iIDSString=IDS_DESC_WOOLSTRING; + break; + } + break; + } + } + + // set the string mapped to by the base object mapping array + + if(iIDSString>=0) + { + // this is an html control now, so set the font size and colour + //wstring wsText=app.GetString(iIDSString); + wstring wsText=app.FormatHTMLString(getPad(),app.GetString(iIDSString)); + + // 12 for splitscreen, 14 for normal + EHTMLFontSize size = eHTMLSize_Normal; + if(m_bSplitscreen ||(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen())) + { + size = eHTMLSize_Splitscreen; + } + wchar_t startTags[64]; + swprintf(startTags,64,L"

",app.GetHTMLColour(eHTMLColor_Black)); + wsText= startTags + wsText + L"

"; + + setDescriptionText(wsText.c_str()); + } + else + { + /// Missing string! +#ifdef _DEBUG + setDescriptionText(L"This is some placeholder description text about the craftable item."); +#else + setDescriptionText(L""); +#endif + } + } + else + { + setDescriptionText(L""); + } +} + +////////////////////////////////////////////////////////////////////////// +// +// UpdateTooltips +// +////////////////////////////////////////////////////////////////////////// +void IUIScene_CraftingMenu::UpdateTooltips() +{ + //RecipyList *recipes = ((Recipes *)Recipes::getInstance())->getRecipies(); + Recipy::INGREDIENTS_REQUIRED *pRecipeIngredientsRequired=Recipes::getInstance()->getRecipeIngredientsArray(); + // Update tooltips + + bool bDisplayCreate; + + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount!=0) + { + int iSlot; + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>1) + { + iSlot=iVSlotIndexA[m_iCurrentSlotVIndex]; + } + else + { + iSlot=0; + } + + if(pRecipeIngredientsRequired[CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]].bCanMake[getPad()]) + { + bDisplayCreate=true; + } + else + { + bDisplayCreate=false; + } + } + else + { + bDisplayCreate=false; + } + + + switch(m_iDisplayDescription) + { + case DISPLAY_INVENTORY: + ui.SetTooltips( getPad(), bDisplayCreate?IDS_TOOLTIPS_CREATE:-1,IDS_TOOLTIPS_EXIT, IDS_TOOLTIPS_SHOW_DESCRIPTION,-1,-1,-1,-2, IDS_TOOLTIPS_CHANGE_GROUP); + break; + case DISPLAY_DESCRIPTION: + ui.SetTooltips( getPad(), bDisplayCreate?IDS_TOOLTIPS_CREATE:-1,IDS_TOOLTIPS_EXIT, IDS_TOOLTIPS_SHOW_INGREDIENTS,-1,-1,-1,-2, IDS_TOOLTIPS_CHANGE_GROUP); + break; + case DISPLAY_INGREDIENTS: + ui.SetTooltips( getPad(), bDisplayCreate?IDS_TOOLTIPS_CREATE:-1,IDS_TOOLTIPS_EXIT, IDS_TOOLTIPS_SHOW_INVENTORY,-1,-1,-1,-2, IDS_TOOLTIPS_CHANGE_GROUP); + break; + } + + /*if(CanBeMadeA[m_iCurrentSlotHIndex].iCount!=0) + { + int iSlot; + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>1) + { + iSlot=iVSlotIndexA[m_iCurrentSlotVIndex]; + } + else + { + iSlot=0; + } + + if(pRecipeIngredientsRequired[CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]].bCanMake[getPad()]) + { + ui.EnableTooltip( getPad(), eToolTipButtonA, true ); + } + else + { + ui.EnableTooltip( getPad(), eToolTipButtonA, false ); + } + } + else + { + ui.ShowTooltip( getPad(), eToolTipButtonA, false ); + }*/ +} + +bool IUIScene_CraftingMenu::isItemSelected(int itemId) +{ + bool isSelected = false; + if(m_pPlayer && m_pPlayer->inventory) + { + //RecipyList *recipes = ((Recipes *)Recipes::getInstance())->getRecipies(); + Recipy::INGREDIENTS_REQUIRED *pRecipeIngredientsRequired=Recipes::getInstance()->getRecipeIngredientsArray(); + + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount!=0) + { + int iSlot; + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount>1) + { + iSlot=iVSlotIndexA[m_iCurrentSlotVIndex]; + } + else + { + iSlot=0; + } + int iRecipe= CanBeMadeA[m_iCurrentSlotHIndex].iRecipeA[iSlot]; + ItemInstance *pTempItemInst = (ItemInstance *)pRecipeIngredientsRequired[iRecipe].pRecipy->getResultItem(); + + if(pTempItemInst->id == itemId) + { + isSelected = true; + } + } + } + return isSelected; +} diff --git a/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.h b/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.h new file mode 100644 index 00000000..05227fff --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.h @@ -0,0 +1,119 @@ +#pragma once +#include "..\..\..\Minecraft.World\Recipy.h" +#include "..\..\..\Minecraft.World\Item.h" + +class LocalPlayer; + +// 4J Stu - Crafting menu code that's shared across Iggy and XUI +class IUIScene_CraftingMenu +{ +protected: +#define DISPLAY_INVENTORY 0 +#define DISPLAY_DESCRIPTION 1 +#define DISPLAY_INGREDIENTS 2 +#define DISPLAY_MAX 3 + + enum _eGroupTab + { + eGroupTab_Left, + eGroupTab_Middle, + eGroupTab_Right + }; + + static const int m_iMaxHSlotC = 12; + static const int m_iMaxHCraftingSlotC = 10; + static const int m_iMaxVSlotC = 17; + static const int m_iMaxDisplayedVSlotC = 3; + static const int m_iIngredients3x3SlotC = 9; + static const int m_iIngredients2x2SlotC = 4; + + static const int m_iMaxHSlot3x3C = 12; + static const int m_iMaxHSlot2x2C = 10; + + static const int m_iMaxGroup3x3 = 7; + static const int m_iMaxGroup2x2 = 6; + + static int m_iBaseTypeMapA[Item::eBaseItemType_MAXTYPES]; + + typedef struct + { + int iCount; + int iItemBaseType; + int iRecipeA[m_iMaxVSlotC]; // tiers of item that can be made + } + CANBEMADE; + + CANBEMADE CanBeMadeA[m_iMaxHSlotC]; + + int m_iCurrentSlotHIndex; + int m_iCurrentSlotVIndex; + int m_iRecipeC; + int m_iContainerType; // 2x2 or 3x3 + shared_ptr m_pPlayer; + int m_iGroupIndex; + + int iVSlotIndexA[3]; // index of the v slots currently displayed + + static LPCWSTR m_GroupIconNameA[m_iMaxGroup3x3]; + static Recipy::_eGroupType m_GroupTypeMapping4GridA[m_iMaxGroup2x2]; + static Recipy::_eGroupType m_GroupTypeMapping9GridA[m_iMaxGroup3x3]; + Recipy::_eGroupType *m_pGroupA; + + static LPCWSTR m_GroupTabNameA[3]; + static _eGroupTab m_GroupTabBkgMapping2x2A[m_iMaxGroup2x2]; + static _eGroupTab m_GroupTabBkgMapping3x3A[m_iMaxGroup3x3]; + _eGroupTab *m_pGroupTabA; + int m_iCraftablesMaxHSlotC; + int m_iIngredientsMaxSlotC; + int m_iDisplayDescription; + int m_iIngredientsC; + bool m_bIgnoreKeyPresses; + bool m_bSplitscreen; + + eTutorial_State m_previousTutorialState; + + bool handleKeyDown(int iPad, int iAction, bool bRepeat); + +public: + IUIScene_CraftingMenu(); + +protected: + LPCWSTR GetGroupNameText(int iGroupType); + + void CheckRecipesAvailable(); + void UpdateHighlight(); + void UpdateVerticalSlots(); + void DisplayIngredients(); + void UpdateTooltips(); + void UpdateDescriptionText(bool); + +public: + Recipy::_eGroupType getCurrentGroup() { return m_pGroupA[m_iGroupIndex]; } + bool isItemSelected(int itemId); + +protected: + virtual int getPad() = 0; + virtual void hideAllHSlots() = 0; + virtual void hideAllVSlots() = 0; + virtual void hideAllIngredientsSlots() = 0; + virtual void setCraftHSlotItem(int iPad, int iIndex, shared_ptr item, unsigned int uiAlpha) = 0; + virtual void setCraftVSlotItem(int iPad, int iIndex, shared_ptr item, unsigned int uiAlpha) = 0; + virtual void setCraftingOutputSlotItem(int iPad, shared_ptr item) = 0; + virtual void setCraftingOutputSlotRedBox(bool show) = 0; + virtual void setIngredientSlotItem(int iPad, int index, shared_ptr item) = 0; + virtual void setIngredientSlotRedBox(int index, bool show) = 0; + virtual void setIngredientDescriptionItem(int iPad, int index, shared_ptr item) = 0; + virtual void setIngredientDescriptionRedBox(int index, bool show) = 0; + virtual void setIngredientDescriptionText(int index, LPCWSTR text) = 0; + virtual void setShowCraftHSlot(int iIndex, bool show) = 0; + virtual void showTabHighlight(int iIndex, bool show) = 0; + virtual void setGroupText(LPCWSTR text) = 0; + virtual void setDescriptionText(LPCWSTR text) = 0; + virtual void setItemText(LPCWSTR text) = 0; + virtual void scrollDescriptionUp() = 0; + virtual void scrollDescriptionDown() = 0; + virtual void updateHighlightAndScrollPositions() = 0; + virtual void updateVSlotPositions(int iSlots, int i) = 0; + + virtual void UpdateMultiPanel() = 0; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp new file mode 100644 index 00000000..7ce33234 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp @@ -0,0 +1,1053 @@ +#include "stdafx.h" +#include "IUIScene_CreativeMenu.h" + +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.enchantment.h" + +// 4J JEV - Images for each tab. +IUIScene_CreativeMenu::TabSpec **IUIScene_CreativeMenu::specs = NULL; + +vector< shared_ptr > IUIScene_CreativeMenu::categoryGroups[eCreativeInventoryGroupsCount]; + +#define ITEM(id) list->push_back( shared_ptr(new ItemInstance(id, 1, 0)) ); +#define ITEM_AUX(id, aux) list->push_back( shared_ptr(new ItemInstance(id, 1, aux)) ); +#define DEF(index) list = &categoryGroups[index]; + + +void IUIScene_CreativeMenu::staticCtor() +{ + vector< shared_ptr > *list; + + + // Building Blocks + DEF(eCreativeInventory_BuildingBlocks) + ITEM(Tile::rock_Id) + ITEM(Tile::grass_Id) + ITEM(Tile::dirt_Id) + ITEM(Tile::stoneBrick_Id) + ITEM(Tile::sand_Id) + ITEM(Tile::sandStone_Id) + ITEM_AUX(Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE) + ITEM_AUX(Tile::sandStone_Id, SandStoneTile::TYPE_HEIROGLYPHS) + ITEM(Tile::goldBlock_Id) + ITEM(Tile::ironBlock_Id) + ITEM(Tile::lapisBlock_Id) + ITEM(Tile::diamondBlock_Id) + ITEM(Tile::emeraldBlock_Id) + ITEM_AUX(Tile::quartzBlock_Id,QuartzBlockTile::TYPE_DEFAULT) + ITEM(Tile::coalOre_Id) + ITEM(Tile::lapisOre_Id) + ITEM(Tile::diamondOre_Id) + ITEM(Tile::redStoneOre_Id) + ITEM(Tile::ironOre_Id) + ITEM(Tile::goldOre_Id) + ITEM(Tile::emeraldOre_Id) + ITEM(Tile::netherQuartz_Id) + ITEM(Tile::unbreakable_Id) + ITEM_AUX(Tile::wood_Id,0) + ITEM_AUX(Tile::wood_Id,TreeTile::DARK_TRUNK) + ITEM_AUX(Tile::wood_Id,TreeTile::BIRCH_TRUNK) + ITEM_AUX(Tile::wood_Id,TreeTile::JUNGLE_TRUNK) + ITEM_AUX(Tile::treeTrunk_Id, 0) + ITEM_AUX(Tile::treeTrunk_Id, TreeTile::DARK_TRUNK) + ITEM_AUX(Tile::treeTrunk_Id, TreeTile::BIRCH_TRUNK) + ITEM_AUX(Tile::treeTrunk_Id, TreeTile::JUNGLE_TRUNK) + ITEM(Tile::gravel_Id) + ITEM(Tile::redBrick_Id) + ITEM(Tile::mossStone_Id) + ITEM(Tile::obsidian_Id) + ITEM(Tile::clay) + ITEM(Tile::ice_Id) + ITEM(Tile::snow_Id) + ITEM(Tile::hellRock_Id) + ITEM(Tile::hellSand_Id) + ITEM(Tile::lightGem_Id) + ITEM_AUX(Tile::stoneBrickSmooth_Id,SmoothStoneBrickTile::TYPE_DEFAULT) + ITEM_AUX(Tile::stoneBrickSmooth_Id,SmoothStoneBrickTile::TYPE_MOSSY) + ITEM_AUX(Tile::stoneBrickSmooth_Id,SmoothStoneBrickTile::TYPE_CRACKED) + ITEM_AUX(Tile::stoneBrickSmooth_Id,SmoothStoneBrickTile::TYPE_DETAIL) + ITEM_AUX(Tile::monsterStoneEgg_Id,StoneMonsterTile::HOST_ROCK) + ITEM_AUX(Tile::monsterStoneEgg_Id,StoneMonsterTile::HOST_COBBLE) + ITEM_AUX(Tile::monsterStoneEgg_Id,StoneMonsterTile::HOST_STONEBRICK) + ITEM(Tile::mycel_Id) + ITEM(Tile::netherBrick_Id) + ITEM(Tile::whiteStone_Id) + ITEM_AUX(Tile::quartzBlock_Id,QuartzBlockTile::TYPE_CHISELED) + ITEM_AUX(Tile::quartzBlock_Id,QuartzBlockTile::TYPE_LINES_Y) + ITEM(Tile::trapdoor_Id) + ITEM(Tile::fenceGate_Id) + ITEM(Item::door_wood_Id) + ITEM(Item::door_iron_Id) + ITEM_AUX(Tile::stoneSlabHalf_Id,StoneSlabTile::STONE_SLAB) + ITEM_AUX(Tile::stoneSlabHalf_Id,StoneSlabTile::SAND_SLAB) + // AP - changed oak slab to be wood because it wouldn't burn +// ITEM_AUX(Tile::stoneSlabHalf_Id,StoneSlabTile::WOOD_SLAB) + ITEM_AUX(Tile::woodSlabHalf_Id,0) + ITEM_AUX(Tile::woodSlabHalf_Id,TreeTile::DARK_TRUNK) + ITEM_AUX(Tile::woodSlabHalf_Id,TreeTile::BIRCH_TRUNK) + ITEM_AUX(Tile::woodSlabHalf_Id,TreeTile::JUNGLE_TRUNK) + ITEM_AUX(Tile::stoneSlabHalf_Id,StoneSlabTile::COBBLESTONE_SLAB) + ITEM_AUX(Tile::stoneSlabHalf_Id,StoneSlabTile::BRICK_SLAB) + ITEM_AUX(Tile::stoneSlabHalf_Id,StoneSlabTile::SMOOTHBRICK_SLAB) + ITEM_AUX(Tile::stoneSlabHalf_Id,StoneSlabTile::NETHERBRICK_SLAB) + ITEM_AUX(Tile::stoneSlabHalf_Id,StoneSlabTile::QUARTZ_SLAB) + ITEM(Tile::stairs_wood_Id) + ITEM(Tile::stairs_birchwood_Id) + ITEM(Tile::stairs_sprucewood_Id) + ITEM(Tile::stairs_junglewood_Id) + ITEM(Tile::stairs_stone_Id) + ITEM(Tile::stairs_bricks_Id) + ITEM(Tile::stairs_stoneBrickSmooth_Id) + ITEM(Tile::stairs_netherBricks_Id) + ITEM(Tile::stairs_sandstone_Id) + ITEM(Tile::stairs_quartz_Id) + + + // Decoration + DEF(eCreativeInventory_Decoration) + ITEM_AUX(Item::skull_Id,SkullTileEntity::TYPE_SKELETON) + ITEM_AUX(Item::skull_Id,SkullTileEntity::TYPE_WITHER) + ITEM_AUX(Item::skull_Id,SkullTileEntity::TYPE_ZOMBIE) + ITEM_AUX(Item::skull_Id,SkullTileEntity::TYPE_CHAR) + ITEM_AUX(Item::skull_Id,SkullTileEntity::TYPE_CREEPER) + ITEM(Tile::sponge_Id) + ITEM(Tile::melon_Id) + ITEM(Tile::pumpkin_Id) + ITEM(Tile::litPumpkin_Id) + ITEM_AUX(Tile::sapling_Id, Sapling::TYPE_DEFAULT) + ITEM_AUX(Tile::sapling_Id, Sapling::TYPE_EVERGREEN) + ITEM_AUX(Tile::sapling_Id, Sapling::TYPE_BIRCH) + ITEM_AUX(Tile::sapling_Id, Sapling::TYPE_JUNGLE) + ITEM_AUX(Tile::leaves_Id, LeafTile::NORMAL_LEAF) + ITEM_AUX(Tile::leaves_Id, LeafTile::EVERGREEN_LEAF) + ITEM_AUX(Tile::leaves_Id, LeafTile::BIRCH_LEAF) + ITEM_AUX(Tile::leaves_Id, LeafTile::JUNGLE_LEAF) + ITEM(Tile::vine) + ITEM(Tile::waterLily_Id) + ITEM(Tile::torch_Id) + ITEM_AUX(Tile::tallgrass_Id, TallGrass::DEAD_SHRUB) + ITEM_AUX(Tile::tallgrass_Id, TallGrass::TALL_GRASS) + ITEM_AUX(Tile::tallgrass_Id, TallGrass::FERN) + ITEM(Tile::deadBush_Id) + ITEM(Tile::flower_Id) + ITEM(Tile::rose_Id) + ITEM(Tile::mushroom1_Id) + ITEM(Tile::mushroom2_Id) + ITEM(Tile::cactus_Id) + ITEM(Tile::topSnow_Id) + // 4J-PB - Already got sugar cane in Materials ITEM_11(Tile::reeds_Id) + ITEM(Tile::web_Id) + ITEM(Tile::thinGlass_Id) + ITEM(Tile::glass_Id) + ITEM(Item::painting_Id) + ITEM(Item::itemFrame_Id) + ITEM(Item::sign_Id) + ITEM(Tile::bookshelf_Id) + ITEM(Item::flowerPot_Id) + ITEM_AUX(Tile::cloth_Id,14) // Red + ITEM_AUX(Tile::cloth_Id,1) // Orange + ITEM_AUX(Tile::cloth_Id,4) // Yellow + ITEM_AUX(Tile::cloth_Id,5) // Lime + ITEM_AUX(Tile::cloth_Id,3) // Light Blue + ITEM_AUX(Tile::cloth_Id,9) // Cyan + ITEM_AUX(Tile::cloth_Id,11) // Blue + ITEM_AUX(Tile::cloth_Id,10) // Purple + ITEM_AUX(Tile::cloth_Id,2) // Magenta + ITEM_AUX(Tile::cloth_Id,6) // Pink + ITEM_AUX(Tile::cloth_Id,0) // White + ITEM_AUX(Tile::cloth_Id,8) // Light Gray + ITEM_AUX(Tile::cloth_Id,7) // Gray + ITEM_AUX(Tile::cloth_Id,15) // Black + ITEM_AUX(Tile::cloth_Id,13) // Green + ITEM_AUX(Tile::cloth_Id,12) // Brown + + ITEM_AUX(Tile::woolCarpet_Id,14) // Red + ITEM_AUX(Tile::woolCarpet_Id,1) // Orange + ITEM_AUX(Tile::woolCarpet_Id,4) // Yellow + ITEM_AUX(Tile::woolCarpet_Id,5) // Lime + ITEM_AUX(Tile::woolCarpet_Id,3) // Light Blue + ITEM_AUX(Tile::woolCarpet_Id,9) // Cyan + ITEM_AUX(Tile::woolCarpet_Id,11) // Blue + ITEM_AUX(Tile::woolCarpet_Id,10) // Purple + ITEM_AUX(Tile::woolCarpet_Id,2) // Magenta + ITEM_AUX(Tile::woolCarpet_Id,6) // Pink + ITEM_AUX(Tile::woolCarpet_Id,0) // White + ITEM_AUX(Tile::woolCarpet_Id,8) // Light Gray + ITEM_AUX(Tile::woolCarpet_Id,7) // Gray + ITEM_AUX(Tile::woolCarpet_Id,15) // Black + ITEM_AUX(Tile::woolCarpet_Id,13) // Green + ITEM_AUX(Tile::woolCarpet_Id,12) // Brown + + + // Redstone + DEF(eCreativeInventory_Redstone) + ITEM(Tile::dispenser_Id) + ITEM(Tile::musicBlock_Id) + ITEM(Tile::pistonBase_Id) + ITEM(Tile::pistonStickyBase_Id) + ITEM(Tile::tnt_Id) + ITEM(Tile::lever_Id) + ITEM(Tile::button_stone_Id) + ITEM(Tile::button_wood_Id) + ITEM(Tile::pressurePlate_stone_Id) + ITEM(Tile::pressurePlate_wood_Id) + ITEM(Item::redStone_Id) + ITEM(Tile::notGate_on_Id) + ITEM(Item::diode_Id) + ITEM(Tile::redstoneLight_Id) + ITEM(Tile::tripWireSource_Id) + + // Transport + DEF(eCreativeInventory_Transport) + ITEM(Tile::rail_Id) + ITEM(Tile::goldenRail_Id) + ITEM(Tile::detectorRail_Id) + ITEM(Tile::ladder_Id) + ITEM(Item::minecart_Id) + ITEM(Item::minecart_chest_Id) + ITEM(Item::minecart_furnace_Id) + ITEM(Item::saddle_Id) + ITEM(Item::boat_Id) + + // Miscellaneous + DEF(eCreativeInventory_Misc) + ITEM(Tile::chest_Id) + ITEM(Tile::enderChest_Id) + ITEM(Tile::workBench_Id) + ITEM(Tile::furnace_Id) + ITEM(Item::brewingStand_Id) + ITEM(Tile::enchantTable_Id) + ITEM(Tile::endPortalFrameTile_Id) + ITEM(Tile::recordPlayer_Id) + ITEM(Tile::anvil_Id); + ITEM(Tile::fence_Id) + ITEM(Tile::netherFence_Id) + ITEM(Tile::ironFence_Id) + ITEM_AUX(Tile::cobbleWall_Id, WallTile::TYPE_NORMAL) + ITEM_AUX(Tile::cobbleWall_Id, WallTile::TYPE_MOSSY) + ITEM(Item::bed_Id) + ITEM(Item::bucket_empty_Id) + ITEM(Item::bucket_lava_Id) + ITEM(Item::bucket_water_Id) + ITEM(Item::milk_Id) + ITEM(Item::cauldron_Id) + ITEM(Item::snowBall_Id) + ITEM(Item::paper_Id) + ITEM(Item::book_Id) + ITEM(Item::enderPearl_Id) + ITEM(Item::eyeOfEnder_Id) + ITEM(Item::record_01_Id) + ITEM(Item::record_02_Id) + ITEM(Item::record_03_Id) + ITEM(Item::record_04_Id) + ITEM(Item::record_05_Id) + ITEM(Item::record_06_Id) + ITEM(Item::record_07_Id) + ITEM(Item::record_08_Id) + ITEM(Item::record_09_Id) + ITEM(Item::record_10_Id) + ITEM(Item::record_11_Id) + ITEM(Item::record_12_Id) + ITEM_AUX(Item::monsterPlacer_Id, 50); // Creeper + ITEM_AUX(Item::monsterPlacer_Id, 51); // Skeleton + ITEM_AUX(Item::monsterPlacer_Id, 52); // Spider + ITEM_AUX(Item::monsterPlacer_Id, 54); // Zombie + ITEM_AUX(Item::monsterPlacer_Id, 55); // Slime + ITEM_AUX(Item::monsterPlacer_Id, 56); // Ghast + ITEM_AUX(Item::monsterPlacer_Id, 57); // Zombie Pigman + ITEM_AUX(Item::monsterPlacer_Id, 58); // Enderman + ITEM_AUX(Item::monsterPlacer_Id, 59); // Cave Spider + ITEM_AUX(Item::monsterPlacer_Id, 60); // Silverfish + ITEM_AUX(Item::monsterPlacer_Id, 61); // Blaze + ITEM_AUX(Item::monsterPlacer_Id, 62); // Magma Cube + ITEM_AUX(Item::monsterPlacer_Id, 90); // Pig + ITEM_AUX(Item::monsterPlacer_Id, 91); // Sheep + ITEM_AUX(Item::monsterPlacer_Id, 92); // Cow + ITEM_AUX(Item::monsterPlacer_Id, 93); // Chicken + ITEM_AUX(Item::monsterPlacer_Id, 94); // Squid + ITEM_AUX(Item::monsterPlacer_Id, 95); // Wolf + ITEM_AUX(Item::monsterPlacer_Id, 96); // Mooshroom + ITEM_AUX(Item::monsterPlacer_Id, 98); // Ozelot + ITEM_AUX(Item::monsterPlacer_Id, 120); // Villager + + // Food + DEF(eCreativeInventory_Food) + ITEM(Item::apple_Id) + ITEM(Item::apple_gold_Id) + ITEM_AUX(Item::apple_gold_Id,1) // Enchanted + ITEM(Item::melon_Id) + ITEM(Item::mushroomStew_Id) + ITEM(Item::bread_Id) + ITEM(Item::cake_Id) + ITEM(Item::cookie_Id) + ITEM(Item::fish_cooked_Id) + ITEM(Item::fish_raw_Id) + ITEM(Item::porkChop_cooked_Id) + ITEM(Item::porkChop_raw_Id) + ITEM(Item::beef_cooked_Id) + ITEM(Item::beef_raw_Id) + ITEM(Item::chicken_raw_Id) + ITEM(Item::chicken_cooked_Id) + ITEM(Item::rotten_flesh_Id) + ITEM(Item::spiderEye_Id) + ITEM(Item::potato_Id) + ITEM(Item::potatoBaked_Id) + ITEM(Item::potatoPoisonous_Id) + ITEM(Item::carrots_Id) + ITEM(Item::carrotGolden_Id) + ITEM(Item::pumpkinPie_Id) + + // Tools, Armour and Weapons (Complete) + DEF(eCreativeInventory_ToolsArmourWeapons) + ITEM(Item::compass_Id) + ITEM(Item::helmet_cloth_Id) + ITEM(Item::chestplate_cloth_Id) + ITEM(Item::leggings_cloth_Id) + ITEM(Item::boots_cloth_Id) + ITEM(Item::sword_wood_Id) + ITEM(Item::shovel_wood_Id) + ITEM(Item::pickAxe_wood_Id) + ITEM(Item::hatchet_wood_Id) + ITEM(Item::hoe_wood_Id) + + ITEM(Item::map_Id) + ITEM(Item::helmet_chain_Id) + ITEM(Item::chestplate_chain_Id) + ITEM(Item::leggings_chain_Id) + ITEM(Item::boots_chain_Id) + ITEM(Item::sword_stone_Id) + ITEM(Item::shovel_stone_Id) + ITEM(Item::pickAxe_stone_Id) + ITEM(Item::hatchet_stone_Id) + ITEM(Item::hoe_stone_Id) + + ITEM(Item::bow_Id) + ITEM(Item::helmet_iron_Id) + ITEM(Item::chestplate_iron_Id) + ITEM(Item::leggings_iron_Id) + ITEM(Item::boots_iron_Id) + ITEM(Item::sword_iron_Id) + ITEM(Item::shovel_iron_Id) + ITEM(Item::pickAxe_iron_Id) + ITEM(Item::hatchet_iron_Id) + ITEM(Item::hoe_iron_Id) + + ITEM(Item::arrow_Id) + ITEM(Item::helmet_gold_Id) + ITEM(Item::chestplate_gold_Id) + ITEM(Item::leggings_gold_Id) + ITEM(Item::boots_gold_Id) + ITEM(Item::sword_gold_Id) + ITEM(Item::shovel_gold_Id) + ITEM(Item::pickAxe_gold_Id) + ITEM(Item::hatchet_gold_Id) + ITEM(Item::hoe_gold_Id) + + ITEM(Item::flintAndSteel_Id) + ITEM(Item::helmet_diamond_Id) + ITEM(Item::chestplate_diamond_Id) + ITEM(Item::leggings_diamond_Id) + ITEM(Item::boots_diamond_Id) + ITEM(Item::sword_diamond_Id) + ITEM(Item::shovel_diamond_Id) + ITEM(Item::pickAxe_diamond_Id) + ITEM(Item::hatchet_diamond_Id) + ITEM(Item::hoe_diamond_Id) + + ITEM(Item::fireball_Id) + ITEM(Item::clock_Id) + ITEM(Item::shears_Id) + ITEM(Item::fishingRod_Id) + ITEM(Item::carrotOnAStick_Id) + + for(unsigned int i = 0; i < Enchantment::enchantments.length; ++i) + { + Enchantment *enchantment = Enchantment::enchantments[i]; + if (enchantment == NULL || enchantment->category == NULL) continue; + list->push_back(Item::enchantedBook->createForEnchantment(new EnchantmentInstance(enchantment, enchantment->getMaxLevel()))); + } + + // Materials + DEF(eCreativeInventory_Materials) + ITEM(Item::coal_Id) + ITEM_AUX(Item::coal_Id,1) + ITEM(Item::diamond_Id) + ITEM(Item::emerald_Id) + ITEM(Item::ironIngot_Id) + ITEM(Item::goldIngot_Id) + ITEM(Item::netherQuartz_Id) + ITEM(Item::brick_Id) + ITEM(Item::netherbrick_Id) + ITEM(Item::stick_Id) + ITEM(Item::bowl_Id) + ITEM(Item::bone_Id) + ITEM(Item::string_Id) + ITEM(Item::feather_Id) + ITEM(Item::flint_Id) + ITEM(Item::leather_Id) + ITEM(Item::sulphur_Id) + ITEM(Item::clay_Id) + ITEM(Item::yellowDust_Id) + ITEM(Item::seeds_wheat_Id) + ITEM(Item::seeds_melon_Id) + ITEM(Item::seeds_pumpkin_Id) + ITEM(Item::wheat_Id) + ITEM(Item::reeds_Id) + ITEM(Item::egg_Id) + ITEM(Item::sugar_Id) + ITEM(Item::slimeBall_Id) + ITEM(Item::blazeRod_Id) + ITEM(Item::goldNugget_Id) + ITEM(Item::netherStalkSeeds_Id) + ITEM_AUX(Item::dye_powder_Id,1) // Red + ITEM_AUX(Item::dye_powder_Id,14) // Orange + ITEM_AUX(Item::dye_powder_Id,11) // Yellow + ITEM_AUX(Item::dye_powder_Id,10) // Lime + ITEM_AUX(Item::dye_powder_Id,12) // Light Blue + ITEM_AUX(Item::dye_powder_Id,6) // Cyan + ITEM_AUX(Item::dye_powder_Id,4) // Blue + ITEM_AUX(Item::dye_powder_Id,5) // Purple + ITEM_AUX(Item::dye_powder_Id,13) // Magenta + ITEM_AUX(Item::dye_powder_Id,9) // Pink + ITEM_AUX(Item::dye_powder_Id,15) // Bone Meal + ITEM_AUX(Item::dye_powder_Id,7) // Light gray + ITEM_AUX(Item::dye_powder_Id,8) // Gray + ITEM_AUX(Item::dye_powder_Id,0) // black (ink sac) + ITEM_AUX(Item::dye_powder_Id,2) // Green + ITEM_AUX(Item::dye_powder_Id,3) // Brown + + // Brewing (TODO) + DEF(eCreativeInventory_Brewing) + ITEM(Item::expBottle_Id) + + // 4J Stu - Anything else added here also needs to be added to the key handler below + ITEM(Item::ghastTear_Id) + ITEM(Item::fermentedSpiderEye_Id) + ITEM(Item::blazePowder_Id) + ITEM(Item::magmaCream_Id) + ITEM(Item::speckledMelon_Id) + ITEM(Item::glassBottle_Id) + ITEM_AUX(Item::potion_Id,0) // Water bottle + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_TYPE_AWKWARD)) // Awkward Potion + + + DEF(eCreativeInventory_Potions_Basic) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_REGENERATION)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_SPEED)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_FIRE_RESISTANCE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_POISON)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_INSTANTHEALTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_WEAKNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_STRENGTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_SLOWNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_INSTANTDAMAGE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_REGENERATION)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_SPEED)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_FIRE_RESISTANCE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_POISON)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_INSTANTHEALTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_WEAKNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_STRENGTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_SLOWNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_INSTANTDAMAGE)) + + DEF(eCreativeInventory_Potions_Level2) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_REGENERATION)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_SPEED)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_FIRE_RESISTANCE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_POISON)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_INSTANTHEALTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_NIGHTVISION)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_INVISIBILITY)) + + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_WEAKNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_STRENGTH)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_SLOWNESS)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_INSTANTDAMAGE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_REGENERATION)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_SPEED)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_FIRE_RESISTANCE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_POISON)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_INSTANTHEALTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_NIGHTVISION)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_INVISIBILITY)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_WEAKNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_STRENGTH)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_SLOWNESS)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_INSTANTDAMAGE)) + + DEF(eCreativeInventory_Potions_Extended) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_REGENERATION)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_SPEED)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_FIRE_RESISTANCE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_POISON)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_INSTANTHEALTH)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_NIGHTVISION)) // 4J- Moved here as there isn't a weak variant of this potion. + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, 0, MASK_INVISIBILITY)) // 4J- Moved here as there isn't a weak variant of this potion. + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_WEAKNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_STRENGTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_SLOWNESS)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_INSTANTDAMAGE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_REGENERATION)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_SPEED)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_FIRE_RESISTANCE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_POISON)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_INSTANTHEALTH)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_NIGHTVISION)) // 4J- Moved here as there isn't a weak variant of this potion. + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, 0, MASK_INVISIBILITY)) // 4J- Moved here as there isn't a weak variant of this potion. + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_WEAKNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_STRENGTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_SLOWNESS)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_INSTANTDAMAGE)) + + DEF(eCreativeInventory_Potions_Level2_Extended) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2EXTENDED, MASK_REGENERATION)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2EXTENDED, MASK_SPEED)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_FIRE_RESISTANCE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2EXTENDED, MASK_POISON)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_INSTANTHEALTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2EXTENDED, MASK_NIGHTVISION)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2EXTENDED, MASK_INVISIBILITY)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_NIGHTVISION)) // 4J- Moved here as there isn't a weak variant of this potion. + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_INVISIBILITY)) // 4J- Moved here as there isn't a weak variant of this potion. + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_WEAKNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2EXTENDED, MASK_STRENGTH)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_EXTENDED, MASK_SLOWNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(0, MASK_LEVEL2, MASK_INSTANTDAMAGE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2EXTENDED, MASK_REGENERATION)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2EXTENDED, MASK_SPEED)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_FIRE_RESISTANCE)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2EXTENDED, MASK_POISON)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_INSTANTHEALTH)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2EXTENDED, MASK_NIGHTVISION)) + //ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2EXTENDED, MASK_INVISIBILITY)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_NIGHTVISION)) // 4J- Moved here as there isn't a weak variant of this potion. + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_INVISIBILITY)) // 4J- Moved here as there isn't a weak variant of this potion. + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_WEAKNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2EXTENDED, MASK_STRENGTH)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_EXTENDED, MASK_SLOWNESS)) + ITEM_AUX(Item::potion_Id,MACRO_MAKEPOTION_AUXVAL(MASK_SPLASH, MASK_LEVEL2, MASK_INSTANTDAMAGE)) + + + specs = new TabSpec*[eCreativeInventoryTab_COUNT]; + + // Top Row + ECreative_Inventory_Groups blocksGroup[] = {eCreativeInventory_BuildingBlocks}; + specs[eCreativeInventoryTab_BuildingBlocks] = new TabSpec(L"Structures", IDS_GROUPNAME_BUILDING_BLOCKS, 1, blocksGroup, 0, NULL); + + ECreative_Inventory_Groups decorationsGroup[] = {eCreativeInventory_Decoration}; + specs[eCreativeInventoryTab_Decorations] = new TabSpec(L"Decoration", IDS_GROUPNAME_DECORATIONS, 1, decorationsGroup, 0, NULL); + + ECreative_Inventory_Groups redAndTranGroup[] = {eCreativeInventory_Transport, eCreativeInventory_Redstone}; + specs[eCreativeInventoryTab_RedstoneAndTransport] = new TabSpec(L"RedstoneAndTransport", IDS_GROUPNAME_REDSTONE_AND_TRANSPORT, 2, redAndTranGroup, 0, NULL); + + ECreative_Inventory_Groups materialsGroup[] = {eCreativeInventory_Materials}; + specs[eCreativeInventoryTab_Materials] = new TabSpec(L"Materials", IDS_GROUPNAME_MATERIALS, 1, materialsGroup, 0, NULL); + + ECreative_Inventory_Groups foodGroup[] = {eCreativeInventory_Food}; + specs[eCreativeInventoryTab_Food] = new TabSpec(L"Food", IDS_GROUPNAME_FOOD, 1, foodGroup, 0, NULL); + + ECreative_Inventory_Groups toolsGroup[] = {eCreativeInventory_ToolsArmourWeapons}; + specs[eCreativeInventoryTab_ToolsWeaponsArmor] = new TabSpec(L"Tools", IDS_GROUPNAME_TOOLS_WEAPONS_ARMOR, 1, toolsGroup, 0, NULL); + + ECreative_Inventory_Groups brewingGroup[] = {eCreativeInventory_Brewing, eCreativeInventory_Potions_Level2_Extended, eCreativeInventory_Potions_Extended, eCreativeInventory_Potions_Level2, eCreativeInventory_Potions_Basic}; + + // Just use the text LT - the graphic doesn't fit in splitscreen either + // In 480p there's not enough room for the LT button, so use text instead + //if(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) + { + specs[eCreativeInventoryTab_Brewing] = new TabSpec(L"Brewing", IDS_GROUPNAME_POTIONS_480, 5, brewingGroup, 0, NULL); + } + // else + // { + // specs[eCreativeInventoryTab_Brewing] = new TabSpec(L"icon_brewing.png", IDS_GROUPNAME_POTIONS, 1, brewingGroup, 4, potionsGroup); + // } + + ECreative_Inventory_Groups miscGroup[] = {eCreativeInventory_Misc}; + specs[eCreativeInventoryTab_Misc] = new TabSpec(L"Misc", IDS_GROUPNAME_MISCELLANEOUS, 1, miscGroup, 0, NULL); + +} + +IUIScene_CreativeMenu::IUIScene_CreativeMenu() +{ + m_bCarryingCreativeItem = false; + m_creativeSlotX = m_creativeSlotY = m_inventorySlotX = m_inventorySlotY = 0; + + // 4J JEV - Settup Tabs + for (int i = 0; i < eCreativeInventoryTab_COUNT; i++) + { + m_tabDynamicPos[i] = 0; + m_tabPage[i] = 0; + } +} + +/* 4J JEV - Switches between tabs. +*/ +void IUIScene_CreativeMenu::switchTab(ECreativeInventoryTabs tab) +{ + // Could just be changing page on the current tab + if(tab != m_curTab) updateTabHighlightAndText(tab); + + m_curTab = tab; + + updateScrollCurrentPage(m_tabPage[m_curTab] + 1, specs[m_curTab]->getPageCount()); + + specs[tab]->populateMenu(itemPickerMenu,m_tabDynamicPos[m_curTab], m_tabPage[m_curTab]); +} + +// 4J JEV - Tab Spec Struct + +IUIScene_CreativeMenu::TabSpec::TabSpec(LPCWSTR icon, int descriptionId, int staticGroupsCount, ECreative_Inventory_Groups *staticGroups, int dynamicGroupsCount, ECreative_Inventory_Groups *dynamicGroups) + : m_icon(icon), m_descriptionId(descriptionId), m_staticGroupsCount(staticGroupsCount), m_dynamicGroupsCount(dynamicGroupsCount) +{ + + m_pages = 0; + m_staticGroupsA = NULL; + + unsigned int dynamicItems = 0; + m_staticItems = 0; + + if(staticGroupsCount > 0) + { + m_staticGroupsA = new ECreative_Inventory_Groups[staticGroupsCount]; + for(int i = 0; i < staticGroupsCount; ++i) + { + m_staticGroupsA[i] = staticGroups[i]; + m_staticItems += categoryGroups[m_staticGroupsA[i]].size(); + } + } + + m_dynamicGroupsA = NULL; + if(dynamicGroupsCount > 0) + { + m_dynamicGroupsA = new ECreative_Inventory_Groups[dynamicGroupsCount]; + for(int i = 0; i < dynamicGroupsCount; ++i) + { + m_dynamicGroupsA[i] = dynamicGroups[i]; + dynamicItems += categoryGroups[m_dynamicGroupsA[i]].size(); + } + } + + m_staticPerPage = MAX_SIZE - dynamicItems; + m_pages = (int)ceil((float)m_staticItems / m_staticPerPage); +} + +IUIScene_CreativeMenu::TabSpec::~TabSpec() +{ + if(m_staticGroupsA != NULL) delete [] m_staticGroupsA; + if(m_dynamicGroupsA != NULL) delete [] m_dynamicGroupsA; +} + +void IUIScene_CreativeMenu::TabSpec::populateMenu(AbstractContainerMenu *menu, int dynamicIndex, unsigned int page) +{ + int lastSlotIndex = 0; + + // Fill the dynamic group + if(m_dynamicGroupsCount > 0 && m_dynamicGroupsA != NULL) + { + for(AUTO_VAR(it, categoryGroups[m_dynamicGroupsA[dynamicIndex]].rbegin()); it != categoryGroups[m_dynamicGroupsA[dynamicIndex]].rend() && lastSlotIndex < MAX_SIZE; ++it) + { + Slot *slot = menu->getSlot(++lastSlotIndex); + slot->set( *it ); + } + } + + // Fill from the static groups + unsigned int startIndex = page * m_staticPerPage; + int remainingItems = m_staticItems - startIndex; + + // Work out the first group with an item the want to display, and which item in that group + unsigned int currentIndex = 0; + unsigned int currentGroup = 0; + unsigned int currentItem = 0; + for(; currentGroup < m_staticGroupsCount; ++currentGroup) + { + int size = categoryGroups[m_staticGroupsA[currentGroup]].size(); + if( currentIndex + size < startIndex) + { + currentIndex += size; + continue; + } + currentItem = size - ((currentIndex + size) - startIndex); + break; + } + + for(; lastSlotIndex < MAX_SIZE;) + { + Slot *slot = menu->getSlot(lastSlotIndex++); + slot->set(categoryGroups[m_staticGroupsA[currentGroup]][currentItem]); + + ++currentItem; + if(currentItem >= categoryGroups[m_staticGroupsA[currentGroup]].size()) + { + currentItem = 0; + ++currentGroup; + if(currentGroup >= m_staticGroupsCount) + { + break; + } + } + } + + for(; lastSlotIndex < MAX_SIZE; ++lastSlotIndex) + { + Slot *slot = menu->getSlot(lastSlotIndex); + slot->remove(1); + } +} + +unsigned int IUIScene_CreativeMenu::TabSpec::getPageCount() +{ + return m_pages; +} + + +// 4J JEV - Item Picker Menu +IUIScene_CreativeMenu::ItemPickerMenu::ItemPickerMenu( shared_ptr smp, shared_ptr inv ) : AbstractContainerMenu() +{ + inventory = inv; + creativeContainer = smp; + + //int startLength = slots->size(); + + Slot *slot = NULL; + for (int i = 0; i < TabSpec::MAX_SIZE; i++) + { + // 4J JEV - These values get set by addSlot anyway. + slot = new Slot( creativeContainer, i, -1, -1); + + ItemPickerMenu::addSlot( slot ); + } + + for (int i = 0; i < 9; i++) + { + slot = new Slot( inventory, i, -1, -1 ); + ItemPickerMenu::addSlot( slot ); + } + + // 4J Stu - Give the creative menu a unique container id + containerId = CONTAINER_ID_CREATIVE; +} + +bool IUIScene_CreativeMenu::ItemPickerMenu::stillValid(shared_ptr player) +{ + return true; +} + +bool IUIScene_CreativeMenu::ItemPickerMenu::isOverrideResultClick(int slotNum, int buttonNum) +{ + return slotNum >= 0 && slotNum < 9 && buttonNum == 0; +} + +IUIScene_AbstractContainerMenu::ESceneSection IUIScene_CreativeMenu::GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ) +{ + ESceneSection newSection = eSection; + + // Find the new section if there is one + switch( eSection ) + { + case eSectionInventoryCreativeSelector: + if (eTapDirection == eTapStateDown || eTapDirection == eTapStateUp) + { + newSection = eSectionInventoryCreativeUsing; + } + break; + case eSectionInventoryCreativeUsing: + if (eTapDirection == eTapStateDown || eTapDirection == eTapStateUp) + { + newSection = eSectionInventoryCreativeSelector; + } + break; +#ifndef _XBOX + case eSectionInventoryCreativeTab_0: + case eSectionInventoryCreativeTab_1: + case eSectionInventoryCreativeTab_2: + case eSectionInventoryCreativeTab_3: + case eSectionInventoryCreativeTab_4: + case eSectionInventoryCreativeTab_5: + case eSectionInventoryCreativeTab_6: + case eSectionInventoryCreativeTab_7: + case eSectionInventoryCreativeSlider: + /* do nothing */ + break; +#endif + default: + assert( false ); + break; + } + + updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, 0); + + return newSection; +} + +bool IUIScene_CreativeMenu::handleValidKeyPress(int iPad, int buttonNum, BOOL quickKeyHeld) +{ + // 4J Added - Make pressing the X button clear the hotbar + if(buttonNum == 1) + { + Minecraft *pMinecraft = Minecraft::GetInstance(); + for(unsigned int i = TabSpec::MAX_SIZE; i < TabSpec::MAX_SIZE + 9; ++i) + { + shared_ptr newItem = m_menu->getSlot(i)->getItem(); + + if(newItem != NULL) + { + m_menu->getSlot(i)->set(nullptr); + // call this function to synchronize multiplayer item bar + pMinecraft->localgameModes[iPad]->handleCreativeModeItemAdd(nullptr, i - (int)m_menu->slots->size() + 9 + InventoryMenu::USE_ROW_SLOT_START); + } + } + return true; + } + return false; +} + +void IUIScene_CreativeMenu::handleOutsideClicked(int iPad, int buttonNum, BOOL quickKeyHeld) +{ + // Drop items. + Minecraft *pMinecraft = Minecraft::GetInstance(); + + shared_ptr playerInventory = pMinecraft->localplayers[iPad]->inventory; + if (playerInventory->getCarried() != NULL) + { + if (buttonNum == 0) + { + pMinecraft->localgameModes[iPad]->handleCreativeModeItemDrop(playerInventory->getCarried()); + playerInventory->setCarried(nullptr); + } + if (buttonNum == 1) + { + shared_ptr removedItem = playerInventory->getCarried()->remove(1); + pMinecraft->localgameModes[iPad]->handleCreativeModeItemDrop(removedItem); + if (playerInventory->getCarried()->count == 0) playerInventory->setCarried(nullptr); + } + } + + //pMinecraft->localgameModes[m_iPad]->handleInventoryMouseClick(menu->containerId, AbstractContainerMenu::CLICKED_OUTSIDE, buttonNum, quickKeyHeld?true:false, pMinecraft->localplayers[m_iPad] ); +} + +void IUIScene_CreativeMenu::handleAdditionalKeyPress(int iAction) +{ + int dir = 1; + switch(iAction) + { + case ACTION_MENU_LEFT_SCROLL: + dir = -1; + // Fall through intentional + case ACTION_MENU_RIGHT_SCROLL: + { + ECreativeInventoryTabs tab = (ECreativeInventoryTabs)(m_curTab + dir); + if (tab < 0) tab = (ECreativeInventoryTabs)(eCreativeInventoryTab_COUNT - 1); + if (tab >= eCreativeInventoryTab_COUNT) tab = eCreativeInventoryTab_BuildingBlocks; + switchTab(tab); + ui.PlayUISFX(eSFX_Focus); + } + break; + case ACTION_MENU_PAGEUP: + // change the potion strength + { + ++m_tabDynamicPos[m_curTab]; + if(m_tabDynamicPos[m_curTab] >= specs[m_curTab]->m_dynamicGroupsCount) m_tabDynamicPos[m_curTab] = 0; + switchTab(m_curTab); + } + break; + case ACTION_MENU_OTHER_STICK_DOWN: + ++m_tabPage[m_curTab]; + if(m_tabPage[m_curTab] >= specs[m_curTab]->getPageCount()) + { + m_tabPage[m_curTab] = specs[m_curTab]->getPageCount() - 1; + } + else + { + switchTab(m_curTab); + } + break; + case ACTION_MENU_OTHER_STICK_UP: + --m_tabPage[m_curTab]; + if(m_tabPage[m_curTab] < 0) + { + m_tabPage[m_curTab] = 0; + } + else + { + switchTab(m_curTab); + } + break; + } +} + +void IUIScene_CreativeMenu::handleSlotListClicked(ESceneSection eSection, int buttonNum, BOOL quickKeyHeld) +{ + int currentIndex = getCurrentIndex(eSection); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + bool instantPlace = false; + if (eSection == eSectionInventoryCreativeSelector) + { + if (buttonNum == 0) + { + + shared_ptr playerInventory = pMinecraft->localplayers[getPad()]->inventory; + shared_ptr carried = playerInventory->getCarried(); + shared_ptr clicked = m_menu->getSlot(currentIndex)->getItem(); + if (clicked != NULL) + { + playerInventory->setCarried(ItemInstance::clone(clicked)); + carried = playerInventory->getCarried(); + if (quickKeyHeld == TRUE) + { + carried->count = carried->getMaxStackSize(); + } + m_creativeSlotX = m_iCurrSlotX; + m_creativeSlotY = m_iCurrSlotY; + m_eCurrSection = eSectionInventoryCreativeUsing; + m_eCurrTapState = eTapStateJump; + + instantPlace = getEmptyInventorySlot(carried, m_inventorySlotX); + m_iCurrSlotX = m_inventorySlotX; + m_iCurrSlotY = m_inventorySlotY; + + m_bCarryingCreativeItem = true; + } + } + } + if(instantPlace || eSection == eSectionInventoryCreativeUsing) + { + if(instantPlace) + { + setSectionSelectedSlot(eSectionInventoryCreativeUsing,m_iCurrSlotX,m_iCurrSlotY); + currentIndex = getCurrentIndex(eSectionInventoryCreativeUsing); + buttonNum = 0; + quickKeyHeld = FALSE; + } + m_menu->clicked(currentIndex, buttonNum, quickKeyHeld?AbstractContainerMenu::CLICK_QUICK_MOVE:AbstractContainerMenu::CLICK_PICKUP, pMinecraft->localplayers[getPad()]); + shared_ptr newItem = m_menu->getSlot(currentIndex)->getItem(); + // call this function to synchronize multiplayer item bar + pMinecraft->localgameModes[getPad()]->handleCreativeModeItemAdd(newItem, currentIndex - (int)m_menu->slots->size() + 9 + InventoryMenu::USE_ROW_SLOT_START); + + if(m_bCarryingCreativeItem) + { + m_inventorySlotX = m_iCurrSlotX; + m_inventorySlotY = m_iCurrSlotY; + m_eCurrSection = eSectionInventoryCreativeSelector; + m_eCurrTapState = eTapStateJump; + m_iCurrSlotX = m_creativeSlotX; + m_iCurrSlotY = m_creativeSlotY; + + shared_ptr playerInventory = pMinecraft->localplayers[getPad()]->inventory; + playerInventory->setCarried(nullptr); + m_bCarryingCreativeItem = false; + } + } +} + +bool IUIScene_CreativeMenu::IsSectionSlotList( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionInventoryCreativeUsing: + case eSectionInventoryCreativeSelector: + return true; + } + return false; +} + +bool IUIScene_CreativeMenu::CanHaveFocus( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionInventoryCreativeUsing: + case eSectionInventoryCreativeSelector: + return true; + } + return false; +} + +bool IUIScene_CreativeMenu::getEmptyInventorySlot(shared_ptr item, int &slotX) +{ + bool sameItemFound = false; + bool emptySlotFound = false; + // Jump to the slot with this item already on it, if we can stack more + for(unsigned int i = TabSpec::MAX_SIZE; i < TabSpec::MAX_SIZE + 9; ++i) + { + shared_ptr slotItem = m_menu->getSlot(i)->getItem(); + if( slotItem != NULL && slotItem->sameItem(item) && (slotItem->GetCount() + item->GetCount() <= item->getMaxStackSize() )) + { + sameItemFound = true; + slotX = i - TabSpec::MAX_SIZE; + break; + } + } + + if(!sameItemFound) + { + // Find an empty slot + for(unsigned int i = TabSpec::MAX_SIZE; i < TabSpec::MAX_SIZE + 9; ++i) + { + if( m_menu->getSlot(i)->getItem() == NULL ) + { + slotX = i - TabSpec::MAX_SIZE; + emptySlotFound = true; + break; + } + } + } + return sameItemFound || emptySlotFound; +} + +int IUIScene_CreativeMenu::getSectionStartOffset(ESceneSection eSection) +{ + int offset = 0; + switch( eSection ) + { + case eSectionInventoryCreativeSelector: + offset = 0; + break; + case eSectionInventoryCreativeUsing: + offset = TabSpec::MAX_SIZE; + break; + default: + assert( false ); + break; + } + return offset; +} + +bool IUIScene_CreativeMenu::overrideTooltips(ESceneSection sectionUnderPointer, shared_ptr itemUnderPointer, bool bIsItemCarried, bool bSlotHasItem, bool bCarriedIsSameAsSlot, int iSlotStackSizeRemaining, + EToolTipItem &buttonA, EToolTipItem &buttonX, EToolTipItem &buttonY, EToolTipItem &buttonRT) +{ + bool _override = false; + + if(sectionUnderPointer == eSectionInventoryCreativeSelector) + { + if(bSlotHasItem) + { + buttonA = eToolTipPickUpGeneric; + buttonRT = eToolTipWhatIsThis; + + if(itemUnderPointer->isStackable()) + { + buttonY = eToolTipPickUpAll; + } + else + { + buttonY = eToolTipNone; //eToolTipPickUpGeneric; + } + } + } + else if(sectionUnderPointer == eSectionInventoryCreativeUsing) + { + buttonY = eToolTipNone; + } + buttonX = eToolTipClearQuickSelect; + _override = true; + + return _override; +} diff --git a/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.h b/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.h new file mode 100644 index 00000000..7ab3ff7e --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.h @@ -0,0 +1,122 @@ +#pragma once +#include "IUIScene_AbstractContainerMenu.h" +#include "..\..\..\Minecraft.World\AbstractContainerMenu.h" +// 4J Stu - This class is for code that is common between XUI and Iggy + +class SimpleContainer; + +class IUIScene_CreativeMenu : public virtual IUIScene_AbstractContainerMenu +{ +public: + // 4J Stu - These map directly to the tabs seenon the screen + enum ECreativeInventoryTabs + { + eCreativeInventoryTab_BuildingBlocks = 0, + eCreativeInventoryTab_Decorations, + eCreativeInventoryTab_RedstoneAndTransport, + eCreativeInventoryTab_Materials, + eCreativeInventoryTab_Food, + eCreativeInventoryTab_ToolsWeaponsArmor, + eCreativeInventoryTab_Brewing, + eCreativeInventoryTab_Misc, + eCreativeInventoryTab_COUNT, + }; + + // 4J Stu - These are logical groupings of items, and be be combined for tabs on-screen + enum ECreative_Inventory_Groups + { + eCreativeInventory_BuildingBlocks, + eCreativeInventory_Decoration, + eCreativeInventory_Redstone, + eCreativeInventory_Transport, + eCreativeInventory_Materials, + eCreativeInventory_Food, + eCreativeInventory_ToolsArmourWeapons, + eCreativeInventory_Brewing, + eCreativeInventory_Potions_Basic, + eCreativeInventory_Potions_Level2, + eCreativeInventory_Potions_Extended, + eCreativeInventory_Potions_Level2_Extended, + eCreativeInventory_Misc, + eCreativeInventoryGroupsCount + }; + + // 4J JEV - Keeping all the tab specifications in one place. + struct TabSpec + { + public: + // 4J JEV - Layout + static const int rows = 5; + static const int columns = 10; + static const int MAX_SIZE = rows * columns; + + // 4J JEV - Images + const LPCWSTR m_icon; + const int m_descriptionId; + const int m_staticGroupsCount; + ECreative_Inventory_Groups *m_staticGroupsA; + const int m_dynamicGroupsCount; + ECreative_Inventory_Groups *m_dynamicGroupsA; + + private: + unsigned int m_pages; + unsigned int m_staticPerPage; + unsigned int m_staticItems; + + public: + TabSpec( LPCWSTR icon, int descriptionId, int staticGroupsCount, ECreative_Inventory_Groups *staticGroups, int dynamicGroupsCount, ECreative_Inventory_Groups *dynamicGroups ); + ~TabSpec(); + + void populateMenu(AbstractContainerMenu *menu, int dynamicIndex, unsigned int page); + unsigned int getPageCount(); + }; + + class ItemPickerMenu : public AbstractContainerMenu + { + protected: + shared_ptr creativeContainer; + shared_ptr inventory; + + public: + ItemPickerMenu( shared_ptr creativeContainer, shared_ptr inventory ); + + virtual bool stillValid(shared_ptr player); + bool isOverrideResultClick(int slotNum, int buttonNum); + protected: + // 4J Stu - Brought forward from 1.2 to fix infinite recursion bug in creative + virtual void loopClick(int slotIndex, int buttonNum, bool quickKeyHeld, shared_ptr player) { } // do nothing + } *itemPickerMenu; + +protected: + static vector< shared_ptr > categoryGroups[eCreativeInventoryGroupsCount]; + // 4J JEV - Tabs + static TabSpec **specs; + + bool m_bCarryingCreativeItem; + int m_creativeSlotX, m_creativeSlotY, m_inventorySlotX, m_inventorySlotY; + +public: + static void staticCtor(); + IUIScene_CreativeMenu(); + +protected: + ECreativeInventoryTabs m_curTab; + int m_tabDynamicPos[eCreativeInventoryTab_COUNT]; + int m_tabPage[eCreativeInventoryTab_COUNT]; + + void switchTab(ECreativeInventoryTabs tab); + virtual void updateTabHighlightAndText(ECreativeInventoryTabs tab) = 0; + virtual void updateScrollCurrentPage(int currentPage, int pageCount) = 0; + virtual ESceneSection GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ); + virtual bool handleValidKeyPress(int iUserIndex, int buttonNum, BOOL quickKeyHeld); + virtual void handleOutsideClicked(int iPad, int buttonNum, BOOL quickKeyHeld); + virtual void handleAdditionalKeyPress(int iAction); + virtual void handleSlotListClicked(ESceneSection eSection, int buttonNum, BOOL quickKeyHeld); + bool getEmptyInventorySlot(shared_ptr item, int &slotX); + int getSectionStartOffset(ESceneSection eSection); + virtual bool IsSectionSlotList( ESceneSection eSection ); + virtual bool CanHaveFocus( ESceneSection eSection ); + + virtual bool overrideTooltips(ESceneSection sectionUnderPointer, shared_ptr itemUnderPointer, bool bIsItemCarried, bool bSlotHasItem, bool bCarriedIsSameAsSlot, int iSlotStackSizeRemaining, + EToolTipItem &buttonA, EToolTipItem &buttonX, EToolTipItem &buttonY, EToolTipItem &buttonRT); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_DispenserMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_DispenserMenu.cpp new file mode 100644 index 00000000..ec8a73c3 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_DispenserMenu.cpp @@ -0,0 +1,77 @@ +#include "stdafx.h" + +#include "IUIScene_DispenserMenu.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" + +IUIScene_AbstractContainerMenu::ESceneSection IUIScene_DispenserMenu::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 eSectionTrapTrap: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionTrapInventory; + xOffset = -TRAP_SCENE_TRAP_SLOT_OFFSET; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionTrapUsing; + xOffset = -TRAP_SCENE_TRAP_SLOT_OFFSET; + } + break; + case eSectionTrapInventory: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionTrapUsing; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionTrapTrap; + xOffset = TRAP_SCENE_TRAP_SLOT_OFFSET; + } + break; + case eSectionTrapUsing: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionTrapTrap; + xOffset = TRAP_SCENE_TRAP_SLOT_OFFSET; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionTrapInventory; + } + break; + default: + assert( false ); + break; + } + + updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, xOffset); + + return newSection; +} + +int IUIScene_DispenserMenu::getSectionStartOffset(ESceneSection eSection) +{ + int offset = 0; + switch( eSection ) + { + case eSectionTrapTrap: + offset = 0; + break; + case eSectionTrapInventory: + offset = 9; + break; + case eSectionTrapUsing: + offset = 9 + 27; + break; + default: + assert( false ); + break; + } + return offset; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_DispenserMenu.h b/Minecraft.Client/Common/UI/IUIScene_DispenserMenu.h new file mode 100644 index 00000000..e1826f95 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_DispenserMenu.h @@ -0,0 +1,12 @@ +#pragma once +#include "IUIScene_AbstractContainerMenu.h" + +// The 0-indexed slot in the inventory list that lines up with the result slot +#define TRAP_SCENE_TRAP_SLOT_OFFSET 3 + +class IUIScene_DispenserMenu : public virtual IUIScene_AbstractContainerMenu +{ +protected: + virtual ESceneSection GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ); + int getSectionStartOffset(ESceneSection eSection); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_EnchantingMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_EnchantingMenu.cpp new file mode 100644 index 00000000..c73f7dc5 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_EnchantingMenu.cpp @@ -0,0 +1,185 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "IUIScene_EnchantingMenu.h" + +IUIScene_AbstractContainerMenu::ESceneSection IUIScene_EnchantingMenu::GetSectionAndSlotInDirection( IUIScene_AbstractContainerMenu::ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ) +{ + IUIScene_AbstractContainerMenu::ESceneSection newSection = eSection; + int xOffset = 0; + + // Find the new section if there is one + switch( eSection ) + { + case eSectionEnchantInventory: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionEnchantUsing; + } + else if(eTapDirection == eTapStateUp) + { + if( *piTargetX >= ENCHANT_SCENE_ENCHANT_BUTTONS_UP_OFFSET) + { + newSection = eSectionEnchantButton3; + } + else + { + newSection = eSectionEnchantSlot; + } + } + break; + case eSectionEnchantUsing: + if(eTapDirection == eTapStateDown) + { + if( *piTargetX >= ENCHANT_SCENE_ENCHANT_BUTTONS_UP_OFFSET) + { + newSection = eSectionEnchantButton1; + } + else + { + newSection = eSectionEnchantSlot; + } + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionEnchantInventory; + } + break; + case eSectionEnchantSlot: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionEnchantInventory; + xOffset = ENCHANT_SCENE_INGREDIENT_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionEnchantUsing; + xOffset = ENCHANT_SCENE_INGREDIENT_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateLeft || eTapDirection == eTapStateRight) + { + newSection = eSectionEnchantButton1; + } + break; + case eSectionEnchantButton1: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionEnchantButton2; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionEnchantUsing; + xOffset = ENCHANT_SCENE_ENCHANT_BUTTONS_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateLeft || eTapDirection == eTapStateRight) + { + newSection = eSectionEnchantSlot; + } + break; + case eSectionEnchantButton2: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionEnchantButton3; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionEnchantButton1; + } + else if(eTapDirection == eTapStateLeft || eTapDirection == eTapStateRight) + { + newSection = eSectionEnchantSlot; + } + break; + case eSectionEnchantButton3: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionEnchantInventory; + xOffset = ENCHANT_SCENE_ENCHANT_BUTTONS_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionEnchantButton2; + } + else if(eTapDirection == eTapStateLeft || eTapDirection == eTapStateRight) + { + newSection = eSectionEnchantSlot; + } + break; + default: + assert( false ); + break; + } + + updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, xOffset); + + return newSection; +} + +void IUIScene_EnchantingMenu::handleOtherClicked(int iPad, ESceneSection eSection, int buttonNum, bool quickKey) +{ + int index = -1; + // Old xui code +#if 0 + HXUIOBJ hFocusObject = GetFocus(iPad); + if(hFocusObject == m_enchant1->m_hObj) index = 0; + else if(hFocusObject == m_enchant2->m_hObj) index = 1; + else if(hFocusObject == m_enchant3->m_hObj) index = 2; +#endif + + switch(eSection) + { + case eSectionEnchantButton1: + index = 0; + break; + case eSectionEnchantButton2: + index = 1; + break; + case eSectionEnchantButton3: + index = 2; + break; + }; + Minecraft *pMinecraft = Minecraft::GetInstance(); + if (index >= 0 && m_menu->clickMenuButton(dynamic_pointer_cast(pMinecraft->localplayers[iPad]), index)) + { + pMinecraft->localgameModes[iPad]->handleInventoryButtonClick(m_menu->containerId, index); + } +} + +int IUIScene_EnchantingMenu::getSectionStartOffset(ESceneSection eSection) +{ + int offset = 0; + switch( eSection ) + { + case eSectionEnchantSlot: + offset = 0; + break; + case eSectionEnchantInventory: + offset = 1; + break; + case eSectionEnchantUsing: + offset = 1 + 27; + break; + default: + assert( false ); + break; + }; + return offset; +} + +bool IUIScene_EnchantingMenu::IsSectionSlotList( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionEnchantInventory: + case eSectionEnchantUsing: + case eSectionEnchantSlot: + return true; + } + return false; +} + +EnchantmentMenu *IUIScene_EnchantingMenu::getMenu() +{ + return (EnchantmentMenu *)m_menu; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_EnchantingMenu.h b/Minecraft.Client/Common/UI/IUIScene_EnchantingMenu.h new file mode 100644 index 00000000..7867265a --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_EnchantingMenu.h @@ -0,0 +1,23 @@ +#pragma once + +#include "IUIScene_AbstractContainerMenu.h" + +// The 0-indexed slot in the inventory list that lines up with the result slot +#define ENCHANT_SCENE_ENCHANT_BUTTONS_UP_OFFSET 3 +#define ENCHANT_SCENE_ENCHANT_BUTTONS_DOWN_OFFSET -7 +#define ENCHANT_SCENE_INGREDIENT_SLOT_UP_OFFSET 0 +#define ENCHANT_SCENE_INGREDIENT_SLOT_DOWN_OFFSET 0 + +class EnchantmentMenu; + +class IUIScene_EnchantingMenu : public virtual IUIScene_AbstractContainerMenu +{ +protected: + virtual ESceneSection GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ); + virtual void handleOtherClicked(int iPad, ESceneSection eSection, int buttonNum, bool quickKey); + int getSectionStartOffset(ESceneSection eSection); + virtual bool IsSectionSlotList( ESceneSection eSection ); + +public: + EnchantmentMenu *getMenu(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_FurnaceMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_FurnaceMenu.cpp new file mode 100644 index 00000000..4a6c6762 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_FurnaceMenu.cpp @@ -0,0 +1,141 @@ +#include "stdafx.h" + +#include "IUIScene_FurnaceMenu.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" + +IUIScene_AbstractContainerMenu::ESceneSection IUIScene_FurnaceMenu::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 eSectionFurnaceResult: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionFurnaceUsing; + xOffset = FURNACE_SCENE_RESULT_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateDown) + { + newSection = eSectionFurnaceInventory; + xOffset = FURNACE_SCENE_RESULT_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateLeft) + { + newSection = eSectionFurnaceIngredient; + } + else if(eTapDirection == eTapStateRight) + { + newSection = eSectionFurnaceIngredient; + } + break; + case eSectionFurnaceIngredient: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionFurnaceUsing; + xOffset = FURNACE_SCENE_FUEL_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateDown) + { + newSection = eSectionFurnaceFuel; + } + else if(eTapDirection == eTapStateLeft) + { + newSection = eSectionFurnaceResult; + } + else if(eTapDirection == eTapStateRight) + { + newSection = eSectionFurnaceResult; + } + break; + case eSectionFurnaceFuel: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionFurnaceInventory; + xOffset = FURNACE_SCENE_FUEL_SLOT_DOWN_OFFSET; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionFurnaceIngredient; + } + else if(eTapDirection == eTapStateLeft) + { + newSection = eSectionFurnaceResult; + } + else if(eTapDirection == eTapStateRight) + { + newSection = eSectionFurnaceResult; + } + break; + case eSectionFurnaceInventory: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionFurnaceUsing; + } + else if(eTapDirection == eTapStateUp) + { + if( *piTargetX >= FURNACE_SCENE_RESULT_SLOT_UP_OFFSET) + { + newSection = eSectionFurnaceResult; + } + else + { + newSection = eSectionFurnaceFuel; + } + } + break; + case eSectionFurnaceUsing: + if(eTapDirection == eTapStateUp) + { + newSection = eSectionFurnaceInventory; + } + else if(eTapDirection == eTapStateDown) + { + if( *piTargetX >= FURNACE_SCENE_RESULT_SLOT_UP_OFFSET) + { + newSection = eSectionFurnaceResult; + } + else + { + newSection = eSectionFurnaceIngredient; + } + } + break; + default: + assert( false ); + break; + } + + updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, xOffset); + + return newSection; +} + +int IUIScene_FurnaceMenu::getSectionStartOffset(ESceneSection eSection) +{ + int offset = 0; + switch( eSection ) + { + case eSectionFurnaceResult: + offset = FurnaceMenu::RESULT_SLOT; + break; + case eSectionFurnaceFuel: + offset = FurnaceMenu::FUEL_SLOT; + break; + case eSectionFurnaceIngredient: + offset = FurnaceMenu::INGREDIENT_SLOT; + break; + case eSectionFurnaceInventory: + offset = FurnaceMenu::INV_SLOT_START; + break; + case eSectionFurnaceUsing: + offset = FurnaceMenu::INV_SLOT_START + 27; + break; + default: + assert( false ); + break; + } + return offset; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_FurnaceMenu.h b/Minecraft.Client/Common/UI/IUIScene_FurnaceMenu.h new file mode 100644 index 00000000..1e3b3ba1 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_FurnaceMenu.h @@ -0,0 +1,15 @@ +#pragma once +#include "IUIScene_AbstractContainerMenu.h" + +// The 0-indexed slot in the inventory list that lines up with the result slot +#define FURNACE_SCENE_RESULT_SLOT_UP_OFFSET 6 +#define FURNACE_SCENE_RESULT_SLOT_DOWN_OFFSET -7 +#define FURNACE_SCENE_FUEL_SLOT_UP_OFFSET 0 +#define FURNACE_SCENE_FUEL_SLOT_DOWN_OFFSET -3 + +class IUIScene_FurnaceMenu : public virtual IUIScene_AbstractContainerMenu +{ +protected: + virtual ESceneSection GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ); + int getSectionStartOffset(ESceneSection eSection); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_InventoryMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_InventoryMenu.cpp new file mode 100644 index 00000000..7bed406a --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_InventoryMenu.cpp @@ -0,0 +1,72 @@ +#include "stdafx.h" + +#include "IUIScene_InventoryMenu.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" + +IUIScene_AbstractContainerMenu::ESceneSection IUIScene_InventoryMenu::GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ) +{ + ESceneSection newSection = eSection; + + // Find the new section if there is one + switch( eSection ) + { + 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); + + return newSection; +} + +int IUIScene_InventoryMenu::getSectionStartOffset(ESceneSection eSection) +{ + int offset = 0; + switch( eSection ) + { + case eSectionInventoryArmor: + offset = InventoryMenu::ARMOR_SLOT_START; + break; + case eSectionInventoryInventory: + offset = InventoryMenu::INV_SLOT_START; + break; + case eSectionInventoryUsing: + offset = InventoryMenu::INV_SLOT_START + 27; + break; + default: + assert( false ); + break; + } + return offset; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_InventoryMenu.h b/Minecraft.Client/Common/UI/IUIScene_InventoryMenu.h new file mode 100644 index 00000000..30887f8a --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_InventoryMenu.h @@ -0,0 +1,10 @@ +#pragma once + +#include "IUIScene_AbstractContainerMenu.h" + +class IUIScene_InventoryMenu : public virtual IUIScene_AbstractContainerMenu +{ +protected: + virtual ESceneSection GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ); + int getSectionStartOffset(ESceneSection eSection); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_PauseMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_PauseMenu.cpp new file mode 100644 index 00000000..79203e7c --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_PauseMenu.cpp @@ -0,0 +1,691 @@ +#include "stdafx.h" +#include "IUIScene_PauseMenu.h" +#include "..\..\Minecraft.h" +#include "..\..\MinecraftServer.h" +#include "..\..\MultiPlayerLevel.h" +#include "..\..\ProgressRenderer.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.phys.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\TexturePack.h" +#include "..\..\DLCTexturePack.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" + + +int IUIScene_PauseMenu::ExitGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + IUIScene_PauseMenu *scene = (IUIScene_PauseMenu *)pParam; + + // Results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { + scene->SetIgnoreInput(true); + app.SetAction(iPad,eAppAction_ExitWorld); + } + return 0; +} + + +int IUIScene_PauseMenu::ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + IUIScene_PauseMenu *scene = (IUIScene_PauseMenu *)pParam; + + // Exit with or without saving + // Decline means save in this dialog + if(result==C4JStorage::EMessage_ResultDecline || result==C4JStorage::EMessage_ResultThirdOption) + { + if( result==C4JStorage::EMessage_ResultDecline ) // Save + { + // 4J-PB - Is the player trying to save but they are using a trial texturepack ? + if(!Minecraft::GetInstance()->skins->isUsingDefaultSkin()) + { + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + DLCPack *pDLCPack=pDLCTexPack->getDLCInfoParentPack();//tPack->getDLCPack(); + if(!pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) + { +#ifdef _XBOX + // upsell + ULONGLONG ullOfferID_Full; + // get the dlc texture pack + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + app.GetDLCFullOfferIDForPackID(pDLCTexPack->getDLCParentPackId(),&ullOfferID_Full); + + // tell sentient about the upsell of the full version of the skin pack + TelemetryManager->RecordUpsellPresented(iPad, eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); +#endif + + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + // Give the player a warning about the trial version of the texture pack + ui.RequestMessageBox(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad() , &IUIScene_PauseMenu::WarningTrialTexturePackReturned, scene,app.GetStringTable(), NULL, 0, false); + + return S_OK; + } + } + + // does the save exist? + bool bSaveExists; + StorageManager.DoesSaveExist(&bSaveExists); + // 4J-PB - we check if the save exists inside the libs + // we need to ask if they are sure they want to overwrite the existing game + if(bSaveExists) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameAndSaveReturned, scene, app.GetStringTable(), NULL, 0, false); + return 0; + } + else + { +#if defined(_XBOX_ONE) || defined(__ORBIS__) + StorageManager.SetSaveDisabled(false); +#endif + MinecraftServer::getInstance()->setSaveOnExit( true ); + } + } + else + { + // been a few requests for a confirm on exit without saving + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_TITLE_DECLINE_SAVE_GAME, IDS_CONFIRM_DECLINE_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameDeclineSaveReturned, scene, app.GetStringTable(), NULL, 0, false); + return 0; + } + + scene->SetIgnoreInput(true); + + app.SetAction(iPad,eAppAction_ExitWorld); + } + return 0; +} + + +int IUIScene_PauseMenu::ExitGameAndSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + // 4J-PB - we won't come in here if we have a trial texture pack + IUIScene_PauseMenu *scene = (IUIScene_PauseMenu *)pParam; + + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { + //INT saveOrCheckpointId = 0; + //bool validSave = StorageManager.GetSaveUniqueNumber(&saveOrCheckpointId); + //SentientManager.RecordLevelSaveOrCheckpoint(ProfileManager.GetPrimaryPad(), saveOrCheckpointId); +#if defined(_XBOX_ONE) || defined(__ORBIS__) + StorageManager.SetSaveDisabled(false); +#endif + scene->SetIgnoreInput(true); + MinecraftServer::getInstance()->setSaveOnExit( true ); + // flag a app action of exit game + app.SetAction(iPad,eAppAction_ExitWorld); + } + else + { + // has someone disconnected the ethernet here, causing the pause menu to shut? + if(ui.IsPauseMenuDisplayed(ProfileManager.GetPrimaryPad())) + { + UINT uiIDA[3]; + // you cancelled the save on exit after choosing exit and save? You go back to the Exit choices then. + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_EXIT_GAME_SAVE; + uiIDA[2]=IDS_EXIT_GAME_NO_SAVE; + + if(g_NetworkManager.GetPlayerCount()>1) + { + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameSaveDialogReturned, scene, app.GetStringTable(), NULL, 0, false); + } + else + { + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameSaveDialogReturned, scene, app.GetStringTable(), NULL, 0, false); + } + } + } + return 0; +} + + + +int IUIScene_PauseMenu::ExitGameDeclineSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + IUIScene_PauseMenu *scene = (IUIScene_PauseMenu *)pParam; + + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { +#if defined(_XBOX_ONE) || defined(__ORBIS__) + // Don't do this here, as it will still try and save some things even though it shouldn't! + //StorageManager.SetSaveDisabled(false); +#endif + scene->SetIgnoreInput(true); + MinecraftServer::getInstance()->setSaveOnExit( false ); + // flag a app action of exit game + app.SetAction(iPad,eAppAction_ExitWorld); + } + else + { + // has someone disconnected the ethernet here, causing the pause menu to shut? + if(ui.IsPauseMenuDisplayed(ProfileManager.GetPrimaryPad())) + { + UINT uiIDA[3]; + // you cancelled the save on exit after choosing exit and save? You go back to the Exit choices then. + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_EXIT_GAME_SAVE; + uiIDA[2]=IDS_EXIT_GAME_NO_SAVE; + + if(g_NetworkManager.GetPlayerCount()>1) + { + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, ProfileManager.GetPrimaryPad(),&IUIScene_PauseMenu::ExitGameSaveDialogReturned, scene, app.GetStringTable(), NULL, 0, false); + } + else + { + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, ProfileManager.GetPrimaryPad(),&IUIScene_PauseMenu::ExitGameSaveDialogReturned, scene, app.GetStringTable(), NULL, 0, false); + } + } + + } + return 0; +} + + + +int IUIScene_PauseMenu::WarningTrialTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + if(result==C4JStorage::EMessage_ResultAccept) + { + if(!ProfileManager.IsSignedInLive(iPad)) + { + // you're not signed in to PSN! + + } + else + { + // 4J-PB - need to check this user can access the store + bool bContentRestricted; + ProfileManager.GetChatAndContentRestrictions(iPad,true,NULL,&bContentRestricted,NULL); + if(bContentRestricted) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad,NULL,&app, app.GetStringTable(), NULL, 0, false); + } + else + { + // need to get info on the pack to see if the user has already downloaded it + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + // retrieve the store name for the skin pack + DLCPack *pDLCPack=pDLCTexPack->getDLCInfoParentPack();//tPack->getDLCPack(); + const char *pchPackName=wstringtofilename(pDLCPack->getName()); + app.DebugPrintf("Texture Pack - %s\n",pchPackName); + SONYDLC *pSONYDLCInfo=app.GetSONYDLCInfo((char *)pchPackName); + + if(pSONYDLCInfo!=NULL) + { + char chName[42]; + char chSkuID[SCE_NP_COMMERCE2_SKU_ID_LEN]; + + memset(chSkuID,0,SCE_NP_COMMERCE2_SKU_ID_LEN); + // find the info on the skin pack + // we have to retrieve the skuid from the store info, it can't be hardcoded since Sony may change it. + // So we assume the first sku for the product is the one we want +#ifdef __ORBIS__ + sprintf(chName,"%s",pSONYDLCInfo->chDLCKeyname); +#else + sprintf(chName,"%s-%s",app.GetCommerceCategory(),pSONYDLCInfo->chDLCKeyname); +#endif + app.GetDLCSkuIDFromProductList(chName,chSkuID); + // 4J-PB - need to check for an empty store +#if defined __ORBIS__ || defined __PSVITA__ || defined __PS3__ + if(app.CheckForEmptyStore(iPad)==false) +#endif + { + if(app.DLCAlreadyPurchased(chSkuID)) + { + app.DownloadAlreadyPurchased(chSkuID); + } + else + { + app.Checkout(chSkuID); + } + } + } + } + } + } +#endif // + +#ifdef _XBOX_ONE + IUIScene_PauseMenu* pScene = (IUIScene_PauseMenu*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + if(ProfileManager.IsSignedIn(iPad)) + { + if (ProfileManager.IsSignedInLive(iPad)) + { + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + // get the dlc texture pack + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + DLCPack *pDLCPack=pDLCTexPack->getDLCInfoParentPack(); + + DLC_INFO *pDLCInfo=app.GetDLCInfoForProductName((WCHAR *)pDLCPack->getName().c_str()); + + StorageManager.InstallOffer(1,(WCHAR *)pDLCInfo->wsProductId.c_str(),NULL,NULL); + + // the license change coming in when the offer has been installed will cause this scene to refresh + } + else + { + // 4J-JEV: Fix for XB1: #165863 - XR-074: Compliance: With no active network connection user is unable to convert from Trial to Full texture pack and is not messaged why. + UINT uiIDA[1] = { IDS_CONFIRM_OK }; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + } + } + } + +#endif + +#ifdef _XBOX + IUIScene_PauseMenu* pScene = (IUIScene_PauseMenu*)pParam; + + //pScene->m_bIgnoreInput = false; + pScene->ShowScene( true ); + if(result==C4JStorage::EMessage_ResultAccept) + { + if(ProfileManager.IsSignedIn(iPad)) + { + ULONGLONG ullIndexA[1]; + + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + // get the dlc texture pack + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + // Need to get the parent packs id, since this may be one of many child packs with their own ids + app.GetDLCFullOfferIDForPackID(pDLCTexPack->getDLCParentPackId(),&ullIndexA[0]); + + // need to allow downloads here, or the player would need to quit the game to let the download of a texture pack happen. This might affect the network traffic, since the download could take all the bandwidth... + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); + + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + } + } + else + { + TelemetryManager->RecordUpsellResponded(iPad, eSet_UpsellID_Texture_DLC, ( pScene->m_pDLCPack->getPurchaseOfferId() & 0xFFFFFFFF ), eSen_UpsellOutcome_Declined); + } +#endif + + + return 0; +} + + +int IUIScene_PauseMenu::SaveWorldThreadProc( LPVOID lpParameter ) +{ + bool bAutosave=(bool)lpParameter; + if(bAutosave) + { + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_AutoSaveGame); + } + else + { + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_SaveGame); + } + + // Share AABB & Vec3 pools with default (main thread) - should be ok as long as we don't tick the main thread whilst this thread is running + AABB::UseDefaultThreadStorage(); + Vec3::UseDefaultThreadStorage(); + Compression::UseDefaultThreadStorage(); + + Minecraft *pMinecraft=Minecraft::GetInstance(); + + //wprintf(L"Loading world on thread\n"); + + if(ProfileManager.IsFullVersion()) + { + app.SetGameStarted(false); + + while( app.GetXuiServerAction(ProfileManager.GetPrimaryPad() ) != eXuiServerAction_Idle && !MinecraftServer::serverHalted() ) + { + Sleep(10); + } + + if(!MinecraftServer::serverHalted() && !app.GetChangingSessionType() ) app.SetGameStarted(true); + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + if(app.GetGameHostOption(eGameHostOption_DisableSaving)) StorageManager.SetSaveDisabled(true); +#endif + } + + HRESULT hr = S_OK; + if(app.GetChangingSessionType()) + { + // 4J Stu - This causes the fullscreenprogress scene to ignore the action it was given + hr = ERROR_CANCELLED; + } + return hr; +} + +int IUIScene_PauseMenu::ExitWorldThreadProc( void* lpParameter ) +{ + // Share AABB & Vec3 pools with default (main thread) - should be ok as long as we don't tick the main thread whilst this thread is running + AABB::UseDefaultThreadStorage(); + Vec3::UseDefaultThreadStorage(); + Compression::UseDefaultThreadStorage(); + + //app.SetGameStarted(false); + + _ExitWorld(lpParameter); + + return S_OK; +} + +// This function performs the meat of exiting from a level. It should be called from a thread other than the main thread. +void IUIScene_PauseMenu::_ExitWorld(LPVOID lpParameter) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + + int exitReasonStringId = pMinecraft->progressRenderer->getCurrentTitle(); + int exitReasonTitleId = IDS_CONNECTION_LOST; + + bool saveStats = true; + if (pMinecraft->isClientSide() || g_NetworkManager.IsInSession()) + { + if(lpParameter != NULL ) + { + // 4J-PB - check if we have lost connection to Live + if(ProfileManager.GetLiveConnectionStatus()!=XONLINE_S_LOGON_CONNECTION_ESTABLISHED ) + { + exitReasonStringId = IDS_CONNECTION_LOST_LIVE; + } + else + { + switch( app.GetDisconnectReason() ) + { + case DisconnectPacket::eDisconnect_Kicked: + exitReasonStringId = IDS_DISCONNECTED_KICKED; + break; + case DisconnectPacket::eDisconnect_NoUGC_AllLocal: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; + case DisconnectPacket::eDisconnect_NoUGC_Single_Local: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; +#if defined(__PS3__) || defined(__ORBIS__) + case DisconnectPacket::eDisconnect_ContentRestricted_AllLocal: + exitReasonStringId = IDS_CONTENT_RESTRICTION_MULTIPLAYER; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; + case DisconnectPacket::eDisconnect_ContentRestricted_Single_Local: + exitReasonStringId = IDS_CONTENT_RESTRICTION; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; +#endif +#ifdef _XBOX + case DisconnectPacket::eDisconnect_NoUGC_Remote: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_REMOTE; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; +#endif + case DisconnectPacket::eDisconnect_NoFlying: + exitReasonStringId = IDS_DISCONNECTED_FLYING; + break; + case DisconnectPacket::eDisconnect_Quitting: + exitReasonStringId = IDS_DISCONNECTED_SERVER_QUIT; + break; +#ifdef __ORBIS__ + case DisconnectPacket::eDisconnect_NetworkError: + exitReasonStringId = IDS_ERROR_NETWORK_EXIT; + exitReasonTitleId = IDS_ERROR_NETWORK_TITLE; + break; +#endif + case DisconnectPacket::eDisconnect_NoFriendsInGame: + exitReasonStringId = IDS_DISCONNECTED_NO_FRIENDS_IN_GAME; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; + case DisconnectPacket::eDisconnect_Banned: + exitReasonStringId = IDS_DISCONNECTED_BANNED; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; + case DisconnectPacket::eDisconnect_NotFriendsWithHost: + exitReasonStringId = IDS_NOTALLOWED_FRIENDSOFFRIENDS; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; + case DisconnectPacket::eDisconnect_OutdatedServer: + exitReasonStringId = IDS_DISCONNECTED_SERVER_OLD; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; + case DisconnectPacket::eDisconnect_OutdatedClient: + exitReasonStringId = IDS_DISCONNECTED_CLIENT_OLD; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; + case DisconnectPacket::eDisconnect_ServerFull: + exitReasonStringId = IDS_DISCONNECTED_SERVER_FULL; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; +#ifdef _XBOX_ONE + case DisconnectPacket::eDisconnect_ExitedGame: + exitReasonTitleId = IDS_EXIT_GAME; + exitReasonStringId = IDS_DISCONNECTED_EXITED_GAME; + break; +#endif + +#if defined __ORBIS__ || defined __PS3__ || defined __PSVITA__ + case DisconnectPacket::eDisconnect_NATMismatch: + exitReasonStringId = IDS_DISCONNECTED_NAT_TYPE_MISMATCH; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; +#endif + default: + exitReasonStringId = IDS_CONNECTION_LOST_SERVER; + } + } + //pMinecraft->progressRenderer->progressStartNoAbort( exitReasonStringId ); + + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + // 4J Stu - Fix for #48669 - TU5: Code: Compliance: TCR #15: Incorrect/misleading messages after signing out a profile during online game session. + // If the primary player is signed out, then that is most likely the cause of the disconnection so don't display a message box. This will allow the message box requested by the libraries to be brought up + if( ProfileManager.IsSignedIn(ProfileManager.GetPrimaryPad())) ui.RequestMessageBox( exitReasonTitleId, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + exitReasonStringId = -1; + + // 4J - Force a disconnection, this handles the situation that the server has already disconnected + if( pMinecraft->levels[0] != NULL ) pMinecraft->levels[0]->disconnect(false); + if( pMinecraft->levels[1] != NULL ) pMinecraft->levels[1]->disconnect(false); + if( pMinecraft->levels[2] != NULL ) pMinecraft->levels[2]->disconnect(false); + } + else + { + exitReasonStringId = IDS_EXITING_GAME; + pMinecraft->progressRenderer->progressStartNoAbort( IDS_EXITING_GAME ); + if( pMinecraft->levels[0] != NULL ) pMinecraft->levels[0]->disconnect(); + if( pMinecraft->levels[1] != NULL ) pMinecraft->levels[1]->disconnect(); + if( pMinecraft->levels[2] != NULL ) pMinecraft->levels[2]->disconnect(); + } + + // 4J Stu - This only does something if we actually have a server, so don't need to do any other checks + MinecraftServer::HaltServer(); + + // We need to call the stats & leaderboards save before we exit the session + // 4J We need to do this in a QNet callback where it is safe + //pMinecraft->forceStatsSave(); + saveStats = false; + + // 4J Stu - Leave the session once the disconnect packet has been sent + g_NetworkManager.LeaveGame(FALSE); + } + else + { + if(lpParameter != NULL && ProfileManager.IsSignedIn(ProfileManager.GetPrimaryPad()) ) + { + switch( app.GetDisconnectReason() ) + { + case DisconnectPacket::eDisconnect_Kicked: + exitReasonStringId = IDS_DISCONNECTED_KICKED; + break; + case DisconnectPacket::eDisconnect_NoUGC_AllLocal: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; + case DisconnectPacket::eDisconnect_NoUGC_Single_Local: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; +#if defined(__PS3__) || defined(__ORBIS__) + case DisconnectPacket::eDisconnect_ContentRestricted_AllLocal: + exitReasonStringId = IDS_CONTENT_RESTRICTION_MULTIPLAYER; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; + case DisconnectPacket::eDisconnect_ContentRestricted_Single_Local: + exitReasonStringId = IDS_CONTENT_RESTRICTION; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; +#endif +#ifdef _XBOX + case DisconnectPacket::eDisconnect_NoUGC_Remote: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_REMOTE; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; +#endif + case DisconnectPacket::eDisconnect_Quitting: + exitReasonStringId = IDS_DISCONNECTED_SERVER_QUIT; + break; +#ifdef __ORBIS__ + case DisconnectPacket::eDisconnect_NetworkError: + exitReasonStringId = IDS_ERROR_NETWORK_EXIT; + exitReasonTitleId = IDS_ERROR_NETWORK_TITLE; + break; +#endif + case DisconnectPacket::eDisconnect_NoMultiplayerPrivilegesJoin: + exitReasonStringId = IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT; + break; + case DisconnectPacket::eDisconnect_OutdatedServer: + exitReasonStringId = IDS_DISCONNECTED_SERVER_OLD; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; + case DisconnectPacket::eDisconnect_OutdatedClient: + exitReasonStringId = IDS_DISCONNECTED_CLIENT_OLD; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; + case DisconnectPacket::eDisconnect_ServerFull: + exitReasonStringId = IDS_DISCONNECTED_SERVER_FULL; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; +#if defined __ORBIS__ || defined __PS3__ || defined __PSVITA__ + case DisconnectPacket::eDisconnect_NATMismatch: + exitReasonStringId = IDS_DISCONNECTED_NAT_TYPE_MISMATCH; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; +#endif + default: + exitReasonStringId = IDS_DISCONNECTED; + } + //pMinecraft->progressRenderer->progressStartNoAbort( exitReasonStringId ); + + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox( exitReasonTitleId, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + exitReasonStringId = -1; + } + } + // Fix for #93148 - TCR 001: BAS Game Stability: Title will crash for the multiplayer client if host of the game will exit during the clients loading to created world. + while( g_NetworkManager.IsNetworkThreadRunning() ) + { + Sleep(1); + } + pMinecraft->setLevel(NULL,exitReasonStringId,nullptr,saveStats); + + TelemetryManager->Flush(); + + app.m_gameRules.unloadCurrentGameRules(); + //app.m_Audio.unloadCurrentAudioDetails(); + + MinecraftServer::resetFlags(); + + // Fix for #48385 - BLACK OPS :TU5: Functional: Client becomes pseudo soft-locked when returned to the main menu after a remote disconnect + // Make sure there is text explaining why the player is waiting + pMinecraft->progressRenderer->progressStart(IDS_EXITING_GAME); + + // Fix for #13259 - CRASH: Gameplay: loading process is halted when player loads saved data + // We can't start/join a new game until the session is destroyed, so wait for it to be idle again + while( g_NetworkManager.IsInSession() ) + { + Sleep(1); + } + + app.SetChangingSessionType(false); + app.SetReallyChangingSessionType(false); + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + // Make sure we don't think saving is disabled in the menus + StorageManager.SetSaveDisabled(false); +#endif +} + + +int IUIScene_PauseMenu::SaveGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { +#if defined(_XBOX_ONE) || defined(__ORBIS__) + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_TITLE_ENABLE_AUTOSAVE, IDS_CONFIRM_ENABLE_AUTOSAVE, uiIDA, 2, iPad,&IUIScene_PauseMenu::EnableAutosaveDialogReturned,pParam, app.GetStringTable(), NULL, 0, false); +#else + // flag a app action of save game + app.SetAction(iPad,eAppAction_SaveGame); +#endif + } + return 0; +} + +int IUIScene_PauseMenu::EnableAutosaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { + // Set the global flag, so that we don't disable saving again once the save is complete + app.SetGameHostOption(eGameHostOption_DisableSaving, 0); + } + else + { + // Set the global flag, so that we do disable saving again once the save is complete + // We need to set this on as we may have only disabled it due to having a trial texture pack + app.SetGameHostOption(eGameHostOption_DisableSaving, 1); + } + // Re-enable saving temporarily + StorageManager.SetSaveDisabled(false); + + // flag a app action of save game + app.SetAction(iPad,eAppAction_SaveGame); + return 0; +} + +int IUIScene_PauseMenu::DisableAutosaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { + // Set the global flag, so that we disable saving again once the save is complete + app.SetGameHostOption(eGameHostOption_DisableSaving, 1); + StorageManager.SetSaveDisabled(false); + + // flag a app action of save game + app.SetAction(iPad,eAppAction_SaveGame); + } + return 0; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_PauseMenu.h b/Minecraft.Client/Common/UI/IUIScene_PauseMenu.h new file mode 100644 index 00000000..7233df3a --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_PauseMenu.h @@ -0,0 +1,25 @@ +#pragma once + +class IUIScene_PauseMenu +{ +protected: + DLCPack *m_pDLCPack; + +public: + static int ExitGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ExitGameAndSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ExitGameDeclineSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int WarningTrialTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int SaveGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int EnableAutosaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int DisableAutosaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + + static int SaveWorldThreadProc( void* lpParameter ); + static int ExitWorldThreadProc( void* lpParameter ); + static void _ExitWorld(LPVOID lpParameter); // Call only from a thread + +protected: + virtual void ShowScene(bool show) = 0; + virtual void SetIgnoreInput(bool ignoreInput) = 0; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_StartGame.cpp b/Minecraft.Client/Common/UI/IUIScene_StartGame.cpp new file mode 100644 index 00000000..be611778 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_StartGame.cpp @@ -0,0 +1,379 @@ +#include "stdafx.h" +#include "UI.h" +#include "TexturePack.h" +#include "TexturePackRepository.h" +#include "Minecraft.h" +#include "IUIScene_StartGame.h" + +IUIScene_StartGame::IUIScene_StartGame(int iPad, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + m_bIgnoreInput = false; + m_iTexturePacksNotInstalled=0; + m_texturePackDescDisplayed = false; + m_bShowTexturePackDescription = false; + m_iSetTexturePackDescription = -1; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + m_currentTexturePackIndex = pMinecraft->skins->getTexturePackIndex(0); +} + +void IUIScene_StartGame::HandleDLCMountingComplete() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + // clear out the current texture pack list + m_texturePackList.clearSlots(); + + int texturePacksCount = pMinecraft->skins->getTexturePackCount(); + + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + + DWORD dwImageBytes; + PBYTE pbImageData = tp->getPackIcon(dwImageBytes); + + if(dwImageBytes > 0 && pbImageData) + { + wchar_t imageName[64]; + swprintf(imageName,64,L"tpack%08x",tp->getId()); + registerSubstitutionTexture(imageName, pbImageData, dwImageBytes); + m_texturePackList.addPack(i,imageName); + } + } + + m_iTexturePacksNotInstalled=0; + + // 4J-PB - there may be texture packs we don't have, so use the info from TMS for this + // REMOVE UNTIL WORKING + DLC_INFO *pDLCInfo=NULL; + + // first pass - look to see if there are any that are not in the list + bool bTexturePackAlreadyListed; + bool bNeedToGetTPD=false; + + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + bTexturePackAlreadyListed=false; +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + char *pchName=app.GetDLCInfoTextures(i); + pDLCInfo=app.GetDLCInfo(pchName); +#elif defined _XBOX_ONE + pDLCInfo=app.GetDLCInfoForFullOfferID((WCHAR *)app.GetDLCInfoTexturesFullOffer(i).c_str()); +#else + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); +#endif + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + if(pDLCInfo->iConfig==tp->getDLCParentPackId()) + { + bTexturePackAlreadyListed=true; + } + } + if(bTexturePackAlreadyListed==false) + { + // some missing + bNeedToGetTPD=true; + + m_iTexturePacksNotInstalled++; + } + } + +#if TO_BE_IMPLEMENTED + if(bNeedToGetTPD==true) + { + // add a TMS request for them + app.DebugPrintf("+++ Adding TMSPP request for texture pack data\n"); + app.AddTMSPPFileTypeRequest(e_DLC_TexturePackData); + if(m_iConfigA!=NULL) + { + delete m_iConfigA; + } + m_iConfigA= new int [m_iTexturePacksNotInstalled]; + m_iTexturePacksNotInstalled=0; + + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + bTexturePackAlreadyListed=false; + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + if(pDLCInfo->iConfig==tp->getDLCParentPackId()) + { + bTexturePackAlreadyListed=true; + } + } + if(bTexturePackAlreadyListed==false) + { + m_iConfigA[m_iTexturePacksNotInstalled++]=pDLCInfo->iConfig; + } + } + } +#endif + m_currentTexturePackIndex = pMinecraft->skins->getTexturePackIndex(0); + UpdateTexturePackDescription(m_currentTexturePackIndex); + + m_texturePackList.selectSlot(m_currentTexturePackIndex); + m_bIgnoreInput=false; + app.m_dlcManager.checkForCorruptDLCAndAlert(); +} + +void IUIScene_StartGame::handleSelectionChanged(F64 selectedId) +{ + m_iSetTexturePackDescription = (int)selectedId; + + if(!m_texturePackDescDisplayed) + { + m_bShowTexturePackDescription = true; + } +} + +void IUIScene_StartGame::UpdateTexturePackDescription(int index) +{ + TexturePack *tp = Minecraft::GetInstance()->skins->getTexturePackByIndex(index); + + if(tp==NULL) + { +#if TO_BE_IMPLEMENTED + // this is probably a texture pack icon added from TMS + + DWORD dwBytes=0,dwFileBytes=0; + PBYTE pbData=NULL,pbFileData=NULL; + + CXuiCtrl4JList::LIST_ITEM_INFO ListItem; + // get the current index of the list, and then get the data + ListItem=m_pTexturePacksList->GetData(index); + + app.GetTPD(ListItem.iData,&pbData,&dwBytes); + + app.GetFileFromTPD(eTPDFileType_Loc,pbData,dwBytes,&pbFileData,&dwFileBytes ); + if(dwFileBytes > 0 && pbFileData) + { + StringTable *pStringTable = new StringTable(pbFileData, dwFileBytes); + m_texturePackTitle.SetText(pStringTable->getString(L"IDS_DISPLAY_NAME")); + m_texturePackDescription.SetText(pStringTable->getString(L"IDS_TP_DESCRIPTION")); + } + + app.GetFileFromTPD(eTPDFileType_Icon,pbData,dwBytes,&pbFileData,&dwFileBytes ); + if(dwFileBytes >= 0 && pbFileData) + { + XuiCreateTextureBrushFromMemory(pbFileData,dwFileBytes,&m_hTexturePackIconBrush); + m_texturePackIcon->UseBrush(m_hTexturePackIconBrush); + } + app.GetFileFromTPD(eTPDFileType_Comparison,pbData,dwBytes,&pbFileData,&dwFileBytes ); + if(dwFileBytes >= 0 && pbFileData) + { + XuiCreateTextureBrushFromMemory(pbFileData,dwFileBytes,&m_hTexturePackComparisonBrush); + m_texturePackComparison->UseBrush(m_hTexturePackComparisonBrush); + } + else + { + m_texturePackComparison->UseBrush(NULL); + } +#endif + } + else + { + m_labelTexturePackName.setLabel(tp->getName()); + m_labelTexturePackDescription.setLabel(tp->getDesc1()); + + DWORD dwImageBytes; + PBYTE pbImageData = tp->getPackIcon(dwImageBytes); + + //if(dwImageBytes > 0 && pbImageData) + //{ + // registerSubstitutionTexture(L"texturePackIcon", pbImageData, dwImageBytes); + // m_bitmapTexturePackIcon.setTextureName(L"texturePackIcon"); + //} + + wchar_t imageName[64]; + swprintf(imageName,64,L"tpack%08x",tp->getId()); + m_bitmapTexturePackIcon.setTextureName(imageName); + + pbImageData = tp->getPackComparison(dwImageBytes); + + if(dwImageBytes > 0 && pbImageData) + { + swprintf(imageName,64,L"texturePackComparison%08x",tp->getId()); + registerSubstitutionTexture(imageName, pbImageData, dwImageBytes); + m_bitmapComparison.setTextureName(imageName); + } + else + { + m_bitmapComparison.setTextureName(L""); + } + } +} + +void IUIScene_StartGame::UpdateCurrentTexturePack(int iSlot) +{ + m_currentTexturePackIndex = iSlot; + TexturePack *tp = Minecraft::GetInstance()->skins->getTexturePackByIndex(m_currentTexturePackIndex); + + // if the texture pack is null, you don't have it yet + if(tp==NULL) + { +#if TO_BE_IMPLEMENTED + // Upsell + + CXuiCtrl4JList::LIST_ITEM_INFO ListItem; + // get the current index of the list, and then get the data + ListItem=m_pTexturePacksList->GetData(m_currentTexturePackIndex); + + + // upsell the texture pack + // tell sentient about the upsell of the full version of the skin pack + ULONGLONG ullOfferID_Full; + app.GetDLCFullOfferIDForPackID(ListItem.iData,&ullOfferID_Full); + + TelemetryManager->RecordUpsellPresented(ProfileManager.GetPrimaryPad(), eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); + + UINT uiIDA[3]; + + uiIDA[0]=IDS_TEXTUREPACK_FULLVERSION; + uiIDA[1]=IDS_TEXTURE_PACK_TRIALVERSION; + uiIDA[2]=IDS_CONFIRM_CANCEL; + + + // Give the player a warning about the texture pack missing + ui.RequestMessageBox(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 3, ProfileManager.GetPrimaryPad(),&:TexturePackDialogReturned,this,app.GetStringTable()); + + // do set the texture pack id, and on the user pressing create world, check they have it + m_MoreOptionsParams.dwTexturePack = ListItem.iData; + return ; +#endif + } + else + { + m_MoreOptionsParams.dwTexturePack = tp->getId(); + } +} + +int IUIScene_StartGame::TrialTexturePackWarningReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + IUIScene_StartGame* pScene = (IUIScene_StartGame*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + pScene->checkStateAndStartGame(); + } + else + { + pScene->m_bIgnoreInput=false; + } + return 0; +} + +int IUIScene_StartGame::UnlockTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + IUIScene_StartGame* pScene = (IUIScene_StartGame*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + if(ProfileManager.IsSignedIn(iPad)) + { +#if defined _XBOX //|| defined _XBOX_ONE + ULONGLONG ullIndexA[1]; + DLC_INFO *pDLCInfo = app.GetDLCInfoForTrialOfferID(pScene->m_pDLCPack->getPurchaseOfferId()); + + if(pDLCInfo!=NULL) + { + ullIndexA[0]=pDLCInfo->ullOfferID_Full; + } + else + { + ullIndexA[0]=pScene->m_pDLCPack->getPurchaseOfferId(); + } + + + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); +#elif defined _XBOX_ONE + //StorageManager.InstallOffer(1,StorageManager.GetOffer(iIndex).wszProductID,NULL,NULL); +#endif + + // the license change coming in when the offer has been installed will cause this scene to refresh + } + } + else + { +#if defined _XBOX + TelemetryManager->RecordUpsellResponded(iPad, eSet_UpsellID_Texture_DLC, ( pScene->m_pDLCPack->getPurchaseOfferId() & 0xFFFFFFFF ), eSen_UpsellOutcome_Declined); +#endif + } + + pScene->m_bIgnoreInput = false; + + return 0; +} + +int IUIScene_StartGame::TexturePackDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + IUIScene_StartGame *pClass = (IUIScene_StartGame *)pParam; + + +#ifdef _XBOX + // Exit with or without saving + // Decline means install full version of the texture pack in this dialog + if(result==C4JStorage::EMessage_ResultDecline || result==C4JStorage::EMessage_ResultAccept) + { + // we need to enable background downloading for the DLC + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); + + ULONGLONG ullOfferID_Full; + ULONGLONG ullIndexA[1]; + CXuiCtrl4JList::LIST_ITEM_INFO ListItem; + // get the current index of the list, and then get the data + ListItem=pClass->m_pTexturePacksList->GetData(pClass->m_currentTexturePackIndex); + app.GetDLCFullOfferIDForPackID(ListItem.iData,&ullOfferID_Full); + + if( result==C4JStorage::EMessage_ResultAccept ) // Full version + { + ullIndexA[0]=ullOfferID_Full; + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + + } + else // trial version + { + // if there is no trial version, this is a Cancel + DLC_INFO *pDLCInfo=app.GetDLCInfoForFullOfferID(ullOfferID_Full); + if(pDLCInfo->ullOfferID_Trial!=0LL) + { + + ullIndexA[0]=pDLCInfo->ullOfferID_Trial; + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + } + } + } +#elif defined _XBOX_ONE + // Get the product id from the texture pack id + if(result==C4JStorage::EMessage_ResultAccept) + { + + if(ProfileManager.IsSignedIn(iPad)) + { + if (ProfileManager.IsSignedInLive(iPad)) + { + wstring ProductId; + app.GetDLCFullOfferIDForPackID(pClass->m_MoreOptionsParams.dwTexturePack,ProductId); + + + StorageManager.InstallOffer(1,(WCHAR *)ProductId.c_str(),NULL,NULL); + + // the license change coming in when the offer has been installed will cause this scene to refresh + } + else + { + // 4J-JEV: Fix for XB1: #165863 - XR-074: Compliance: With no active network connection user is unable to convert from Trial to Full texture pack and is not messaged why. + UINT uiIDA[1] = { IDS_CONFIRM_OK }; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + } + } + } + +#endif + pClass->m_bIgnoreInput=false; + return 0; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_StartGame.h b/Minecraft.Client/Common/UI/IUIScene_StartGame.h new file mode 100644 index 00000000..a3361011 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_StartGame.h @@ -0,0 +1,48 @@ +#pragma once + +#include "UIScene.h" + +// Shared functions between CreteWorld, Load and Join +class IUIScene_StartGame : public UIScene +{ +protected: + UIControl_TexturePackList m_texturePackList; + + UIControl m_controlTexturePackPanel; + UIControl_Label m_labelTexturePackName, m_labelTexturePackDescription; + UIControl_BitmapIcon m_bitmapTexturePackIcon, m_bitmapComparison; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_controlTexturePackPanel, "TexturePackPanel" ) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlTexturePackPanel ) + UI_MAP_ELEMENT( m_labelTexturePackName, "TexturePackName") + UI_MAP_ELEMENT( m_labelTexturePackDescription, "TexturePackDescription") + UI_MAP_ELEMENT( m_bitmapTexturePackIcon, "Icon") + UI_MAP_ELEMENT( m_bitmapComparison, "ComparisonPic") + UI_END_MAP_CHILD_ELEMENTS() + UI_END_MAP_ELEMENTS_AND_NAMES() + + LaunchMoreOptionsMenuInitData m_MoreOptionsParams; + bool m_bIgnoreInput; + + int m_iTexturePacksNotInstalled; + unsigned int m_currentTexturePackIndex; + bool m_bShowTexturePackDescription; + bool m_texturePackDescDisplayed; + int m_iSetTexturePackDescription; + + IUIScene_StartGame(int iPad, UILayer *parentLayer); + + virtual void checkStateAndStartGame() = 0; + + virtual void handleSelectionChanged(F64 selectedId); + + virtual void HandleDLCMountingComplete(); + + void UpdateTexturePackDescription(int index); + void UpdateCurrentTexturePack(int iSlot); + + static int TrialTexturePackWarningReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int UnlockTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int TexturePackDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_TradingMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_TradingMenu.cpp new file mode 100644 index 00000000..658bcdfb --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_TradingMenu.cpp @@ -0,0 +1,387 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.trading.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\ClientConnection.h" +#include "IUIScene_TradingMenu.h" + +IUIScene_TradingMenu::IUIScene_TradingMenu() +{ + m_validOffersCount = 0; + m_selectedSlot = 0; + m_offersStartIndex = 0; + m_menu = NULL; + m_bHasUpdatedOnce = false; +} + +shared_ptr IUIScene_TradingMenu::getMerchant() +{ + return m_merchant; +} + +bool IUIScene_TradingMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) +{ + bool handled = false; + //MerchantRecipeList *offers = m_merchant->getOffers(Minecraft::GetInstance()->localplayers[getPad()]); + + bool changed = false; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if( pMinecraft->localgameModes[getPad()] != NULL ) + { + Tutorial *tutorial = pMinecraft->localgameModes[getPad()]->getTutorial(); + if(tutorial != NULL) + { + tutorial->handleUIInput(iAction); + if(ui.IsTutorialVisible(getPad()) && !tutorial->isInputAllowed(iAction)) + { + return S_OK; + } + } + } + + + switch(iAction) + { + case ACTION_MENU_B: + ui.ShowTooltip( iPad, eToolTipButtonX, false ); + ui.ShowTooltip( iPad, eToolTipButtonB, false ); + ui.ShowTooltip( iPad, eToolTipButtonA, false ); + ui.ShowTooltip( iPad, eToolTipButtonRB, false ); + // kill the crafting xui + //ui.PlayUISFX(eSFX_Back); + ui.CloseUIScenes(iPad); + + handled = true; + break; + case ACTION_MENU_A: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + if(!m_activeOffers.empty()) + { + int selectedShopItem = (m_selectedSlot + m_offersStartIndex); + if( selectedShopItem < m_activeOffers.size() ) + { + MerchantRecipe *activeRecipe = m_activeOffers.at(selectedShopItem).first; + if(!activeRecipe->isDeprecated()) + { + // Do we have the ingredients? + shared_ptr buyAItem = activeRecipe->getBuyAItem(); + shared_ptr buyBItem = activeRecipe->getBuyBItem(); + shared_ptr player = Minecraft::GetInstance()->localplayers[getPad()]; + int buyAMatches = player->inventory->countMatches(buyAItem); + int buyBMatches = player->inventory->countMatches(buyBItem); + if( (buyAItem != NULL && buyAMatches >= buyAItem->count) && (buyBItem == NULL || buyBMatches >= buyBItem->count) ) + { + m_merchant->notifyTrade(activeRecipe); + + // Remove the items we are purchasing with + player->inventory->removeResources(buyAItem); + player->inventory->removeResources(buyBItem); + + // Add the item we have purchased + shared_ptr result = activeRecipe->getSellItem()->copy(); + if(!player->inventory->add( result ) ) + { + player->drop(result); + } + + // Send a packet to the server + int actualShopItem = m_activeOffers.at(selectedShopItem).second; + player->connection->send( shared_ptr( new TradeItemPacket(m_menu->containerId, actualShopItem) ) ); + + updateDisplay(); + } + } + } + } + handled = true; + break; + case ACTION_MENU_LEFT: + handled = true; + if(m_selectedSlot == 0) + { + if(m_offersStartIndex > 0) + { + --m_offersStartIndex; + changed = true; + } + } + else + { + --m_selectedSlot; + changed = true; + moveSelector(false); + } + break; + case ACTION_MENU_RIGHT: + handled = true; + if(m_selectedSlot == (DISPLAY_TRADES_COUNT - 1)) + { + if((m_offersStartIndex + DISPLAY_TRADES_COUNT) < m_activeOffers.size()) + { + ++m_offersStartIndex; + changed = true; + } + } + else + { + ++m_selectedSlot; + changed = true; + moveSelector(true); + } + break; + } + if (changed) + { + updateDisplay(); + + int selectedShopItem = (m_selectedSlot + m_offersStartIndex); + if( selectedShopItem < m_activeOffers.size() ) + { + int actualShopItem = m_activeOffers.at(selectedShopItem).second; + m_menu->setSelectionHint(actualShopItem); + + ByteArrayOutputStream rawOutput; + DataOutputStream output(&rawOutput); + output.writeInt(actualShopItem); + Minecraft::GetInstance()->getConnection(getPad())->send(shared_ptr( new CustomPayloadPacket(CustomPayloadPacket::TRADER_SELECTION_PACKET, rawOutput.toByteArray()))); + } + } + return handled; +} + +void IUIScene_TradingMenu::handleTick() +{ + int offerCount = 0; + MerchantRecipeList *offers = m_merchant->getOffers(Minecraft::GetInstance()->localplayers[getPad()]); + if (offers != NULL) + { + offerCount = offers->size(); + + if(!m_bHasUpdatedOnce) + { + updateDisplay(); + } + } + + showScrollRightArrow( (m_offersStartIndex + DISPLAY_TRADES_COUNT) < m_activeOffers.size()); + showScrollLeftArrow(m_offersStartIndex > 0); +} + +void IUIScene_TradingMenu::updateDisplay() +{ + int iA = -1; + + MerchantRecipeList *unfilteredOffers = m_merchant->getOffers(Minecraft::GetInstance()->localplayers[getPad()]); + if (unfilteredOffers != NULL) + { + m_activeOffers.clear(); + int unfilteredIndex = 0; + int firstValidTrade = INT_MAX; + for(AUTO_VAR(it, unfilteredOffers->begin()); it != unfilteredOffers->end(); ++it) + { + MerchantRecipe *recipe = *it; + if(!recipe->isDeprecated()) + { + m_activeOffers.push_back( pair(recipe,unfilteredIndex)); + firstValidTrade = min(firstValidTrade,unfilteredIndex); + } + ++unfilteredIndex; + } + + if(!m_bHasUpdatedOnce) + { + if(firstValidTrade != 0 && firstValidTrade < unfilteredOffers->size()) + { + m_menu->setSelectionHint(firstValidTrade); + + ByteArrayOutputStream rawOutput; + DataOutputStream output(&rawOutput); + output.writeInt(firstValidTrade); + Minecraft::GetInstance()->getConnection(getPad())->send(shared_ptr( new CustomPayloadPacket(CustomPayloadPacket::TRADER_SELECTION_PACKET, rawOutput.toByteArray()))); + } + } + + if( (m_offersStartIndex + DISPLAY_TRADES_COUNT) > m_activeOffers.size()) + { + m_offersStartIndex = m_activeOffers.size() - DISPLAY_TRADES_COUNT; + if(m_offersStartIndex < 0) m_offersStartIndex = 0; + } + + for(unsigned int i = 0; i < DISPLAY_TRADES_COUNT; ++i) + { + int offerIndex = i + m_offersStartIndex; + bool showRedBox = false; + if(offerIndex < m_activeOffers.size()) + { + showRedBox = !canMake(m_activeOffers.at(offerIndex).first); + setTradeItem(i, m_activeOffers.at(offerIndex).first->getSellItem() ); + } + else + { + setTradeItem(i, nullptr); + } + setTradeRedBox( i, showRedBox); + } + + int selectedShopItem = (m_selectedSlot + m_offersStartIndex); + if( selectedShopItem < m_activeOffers.size() ) + { + MerchantRecipe *activeRecipe = m_activeOffers.at(selectedShopItem).first; + + wstring wsTemp; + + // 4J-PB - need to get the villager type here + wsTemp = app.GetString(IDS_VILLAGER_OFFERS_ITEM); + wsTemp = replaceAll(wsTemp,L"{*VILLAGER_TYPE*}",app.GetString(m_merchant->getDisplayName())); + int iPos=wsTemp.find(L"%s"); + wsTemp.replace(iPos,2,activeRecipe->getSellItem()->getHoverName()); + + setTitle(wsTemp.c_str()); + + vector unformattedStrings; + wstring offerDescription = GetItemDescription(activeRecipe->getSellItem(), unformattedStrings); + setOfferDescription(offerDescription, unformattedStrings); + + shared_ptr buyAItem = activeRecipe->getBuyAItem(); + shared_ptr buyBItem = activeRecipe->getBuyBItem(); + + setRequest1Item(buyAItem); + setRequest2Item(buyBItem); + + if(buyAItem != NULL) setRequest1Name(buyAItem->getHoverName()); + else setRequest1Name(L""); + + if(buyBItem != NULL) setRequest2Name(buyBItem->getHoverName()); + else setRequest2Name(L""); + + bool canMake = true; + + shared_ptr player = Minecraft::GetInstance()->localplayers[getPad()]; + int buyAMatches = player->inventory->countMatches(buyAItem); + if(buyAMatches > 0) + { + setRequest1RedBox(buyAMatches < buyAItem->count); + canMake = buyAMatches > buyAItem->count; + } + else + { + setRequest1RedBox(true); + canMake = false; + } + + int buyBMatches = player->inventory->countMatches(buyBItem); + if(buyBMatches > 0) + { + setRequest2RedBox(buyBMatches < buyBItem->count); + canMake = canMake && buyBMatches > buyBItem->count; + } + else + { + if(buyBItem!=NULL) + { + setRequest2RedBox(true); + canMake = false; + } + else + { + setRequest2RedBox(buyBItem != NULL); + canMake = canMake && buyBItem == NULL; + } + } + + if(canMake) iA = IDS_TOOLTIPS_TRADE; + } + else + { + setTitle(app.GetString(m_merchant->getDisplayName())); + setRequest1Name(L""); + setRequest2Name(L""); + setRequest1RedBox(false); + setRequest2RedBox(false); + setRequest1Item(nullptr); + setRequest2Item(nullptr); + } + + m_bHasUpdatedOnce = true; + } + + ui.SetTooltips(getPad(), iA, IDS_TOOLTIPS_EXIT); +} + +bool IUIScene_TradingMenu::canMake(MerchantRecipe *recipe) +{ + bool canMake = false; + if (recipe != NULL) + { + if(recipe->isDeprecated()) return false; + + shared_ptr buyAItem = recipe->getBuyAItem(); + shared_ptr buyBItem = recipe->getBuyBItem(); + + shared_ptr player = Minecraft::GetInstance()->localplayers[getPad()]; + int buyAMatches = player->inventory->countMatches(buyAItem); + if(buyAMatches > 0) + { + canMake = buyAMatches >= buyAItem->count; + } + else + { + canMake = buyAItem == NULL; + } + + int buyBMatches = player->inventory->countMatches(buyBItem); + if(buyBMatches > 0) + { + canMake = canMake && buyBMatches >= buyBItem->count; + } + else + { + canMake = canMake && buyBItem == NULL; + } + } + return canMake; +} + + +void IUIScene_TradingMenu::setRequest1Item(shared_ptr item) +{ +} + +void IUIScene_TradingMenu::setRequest2Item(shared_ptr item) +{ +} + +void IUIScene_TradingMenu::setTradeItem(int index, shared_ptr item) +{ +} + +wstring IUIScene_TradingMenu::GetItemDescription(shared_ptr item, vector &unformattedStrings) +{ + if(item == NULL) return L""; + + wstring desc = L""; + vector *strings = item->getHoverTextOnly(nullptr, false, unformattedStrings); + bool firstLine = true; + for(AUTO_VAR(it, strings->begin()); it != strings->end(); ++it) + { + wstring thisString = *it; + if(!firstLine) + { + desc.append( L"
" ); + } + else + { + firstLine = false; + } + desc.append( thisString ); + } + strings->clear(); + delete strings; + return desc; +} diff --git a/Minecraft.Client/Common/UI/IUIScene_TradingMenu.h b/Minecraft.Client/Common/UI/IUIScene_TradingMenu.h new file mode 100644 index 00000000..c8edda67 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_TradingMenu.h @@ -0,0 +1,58 @@ +#pragma once +#include "..\Minecraft.World\MerchantMenu.h" + +class MerchantRecipe; + +class IUIScene_TradingMenu +{ +protected: + MerchantMenu *m_menu; + shared_ptr m_merchant; + vector< pair > m_activeOffers; + + int m_validOffersCount; + int m_selectedSlot; + int m_offersStartIndex; + bool m_bHasUpdatedOnce; + + eTutorial_State m_previousTutorialState; + + static const int DISPLAY_TRADES_COUNT = 7; + + static const int BUY_A = MerchantMenu::USE_ROW_SLOT_END; + static const int BUY_B = BUY_A + 1; + static const int TRADES_START = BUY_B + 1; + +protected: + IUIScene_TradingMenu(); + + bool handleKeyDown(int iPad, int iAction, bool bRepeat); + void handleTick(); + + virtual void showScrollRightArrow(bool show) = 0; + virtual void showScrollLeftArrow(bool show) = 0; + virtual void moveSelector(bool right) = 0; + virtual void setRequest1Name(const wstring &name) = 0; + virtual void setRequest2Name(const wstring &name) = 0; + virtual void setTitle(const wstring &name) = 0; + + virtual void setRequest1RedBox(bool show) = 0; + virtual void setRequest2RedBox(bool show) = 0; + virtual void setTradeRedBox(int index, bool show) = 0; + + virtual void setOfferDescription(const wstring &name, vector &unformattedStrings) = 0; + + virtual void setRequest1Item(shared_ptr item); + virtual void setRequest2Item(shared_ptr item); + virtual void setTradeItem(int index, shared_ptr item); + +private: + void updateDisplay(); + bool canMake(MerchantRecipe *recipe); + wstring GetItemDescription(shared_ptr item, vector &unformattedStrings); + +public: + shared_ptr getMerchant(); + + virtual int getPad() = 0; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UI.h b/Minecraft.Client/Common/UI/UI.h new file mode 100644 index 00000000..622ccf84 --- /dev/null +++ b/Minecraft.Client/Common/UI/UI.h @@ -0,0 +1,118 @@ +#pragma once + +#include "UIEnums.h" +#include "UIStructs.h" + +#include "UIBitmapFont.h" +#include "UITTFFont.h" + +#include "UIScene.h" +#include "UILayer.h" +#include "UIGroup.h" +#include "UIController.h" + +#include "UIControl.h" +#include "UIControl_Base.h" +#include "UIControl_Button.h" +#include "UIControl_CheckBox.h" +#include "UIControl_Slider.h" +#include "UIControl_Label.h" +#include "UIControl_TextInput.h" +#include "UIControl_SlotList.h" +#include "UIControl_Cursor.h" +#include "UIControl_ButtonList.h" +#include "UIControl_Progress.h" +#include "UIControl_TexturePackList.h" +#include "UIControl_LeaderboardList.h" +#include "UIControl_SaveList.h" +#include "UIControl_PlayerList.h" +#include "UIControl_BitmapIcon.h" +#include "UIControl_DLCList.h" +#include "UIControl_HTMLLabel.h" +#include "UIControl_DynamicLabel.h" +#include "UIControl_MinecraftPlayer.h" +#include "UIControl_PlayerSkinPreview.h" +#include "UIControl_EnchantmentButton.h" +#include "UIControl_EnchantmentBook.h" +#include "UIControl_SpaceIndicatorBar.h" + +#ifdef __PSVITA__ +#include "UIControl_Touch.h" +#endif + +#include "UIScene_HUD.h" +#include "UIComponent_Panorama.h" +#include "UIComponent_Logo.h" +#include "UIComponent_Tooltips.h" +#include "UIComponent_TutorialPopup.h" +#include "UIComponent_Chat.h" +#include "UIComponent_PressStartToPlay.h" +#include "UIComponent_MenuBackground.h" + +#include "UIScene_QuadrantSignin.h" +#include "UIScene_MessageBox.h" +#include "UIScene_Timer.h" +#include "UIScene_Keyboard.h" + +#include "UIScene_DebugOverlay.h" +#include "UIScene_DebugOptions.h" +#include "UIComponent_DebugUIConsole.h" +#include "UIComponent_DebugUIMarketingGuide.h" +#include "UIScene_DebugSetCamera.h" +#include "UIScene_DebugCreateSchematic.h" + +#include "UIScene_TrialExitUpsell.h" +#include "UIScene_Intro.h" +#include "UIScene_SaveMessage.h" +#include "UIScene_MainMenu.h" +#include "UIScene_LoadMenu.h" +#include "UIScene_JoinMenu.h" +#include "UIScene_LoadOrJoinMenu.h" +#include "UIScene_CreateWorldMenu.h" +#include "UIScene_LaunchMoreOptionsMenu.h" +#include "UIScene_FullscreenProgress.h" +#include "UIScene_LeaderboardsMenu.h" +#include "UIScene_DLCMainMenu.h" +#include "UIScene_DLCOffersMenu.h" +#include "UIScene_ReinstallMenu.h" + +#include "UIScene_HelpAndOptionsMenu.h" +#include "UIScene_SettingsMenu.h" +#include "UIScene_SettingsOptionsMenu.h" +#include "UIScene_SettingsAudioMenu.h" +#include "UIScene_SettingsControlMenu.h" +#include "UIScene_SettingsGraphicsMenu.h" +#include "UIScene_SettingsUIMenu.h" +#include "UIScene_SkinSelectMenu.h" +#include "UIScene_HowToPlayMenu.h" +#include "UIScene_HowToPlay.h" +#include "UIScene_ControlsMenu.h" +#include "UIScene_Credits.h" + +#include "UIScene_PauseMenu.h" + +#include "UIScene_AbstractContainerMenu.h" +#include "UIScene_BrewingStandMenu.h" +#include "UIScene_ContainerMenu.h" +#include "UIScene_DispenserMenu.h" +#include "UIScene_EnchantingMenu.h" +#include "UIScene_InventoryMenu.h" +#include "UIScene_FurnaceMenu.h" +#include "UIScene_CreativeMenu.h" +#include "UIScene_TradingMenu.h" +#include "UIScene_AnvilMenu.h" + +#include "UIScene_CraftingMenu.h" +#include "UIScene_SignEntryMenu.h" + +#include "UIScene_ConnectingProgress.h" +#include "UIScene_DeathMenu.h" +#include "UIScene_InGameInfoMenu.h" +#include "UIScene_InGameHostOptionsMenu.h" +#include "UIScene_InGamePlayerOptionsMenu.h" +#if defined(_XBOX_ONE) || defined(__ORBIS__) +#include "UIScene_InGameSaveManagementMenu.h" +#endif +#include "UIScene_TeleportMenu.h" +#include "UIScene_EndPoem.h" +#include "UIScene_EULA.h" diff --git a/Minecraft.Client/Common/UI/UIBitmapFont.cpp b/Minecraft.Client/Common/UI/UIBitmapFont.cpp new file mode 100644 index 00000000..ec49eea3 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIBitmapFont.cpp @@ -0,0 +1,364 @@ +#include "stdafx.h" + +#include "BufferedImage.h" +#include "UIFontData.h" + +#include + +#include "UIBitmapFont.h" + + +///////////////////////////// +// UI Abstract Bitmap Font // +///////////////////////////// + +UIAbstractBitmapFont::~UIAbstractBitmapFont() +{ + if (m_registered) IggyFontRemoveUTF8( m_fontname.c_str(),-1,IGGY_FONTFLAG_none ); + delete m_bitmapFontProvider; +} + + +UIAbstractBitmapFont::UIAbstractBitmapFont(const string &fontname) +{ + m_fontname = fontname; + + m_registered = false; + + m_bitmapFontProvider = new IggyBitmapFontProvider(); + m_bitmapFontProvider->get_font_metrics = &UIAbstractBitmapFont::GetFontMetrics_Callback; + m_bitmapFontProvider->get_glyph_for_codepoint = &UIAbstractBitmapFont::GetCodepointGlyph_Callback; + m_bitmapFontProvider->get_glyph_metrics = &UIAbstractBitmapFont::GetGlyphMetrics_Callback; + m_bitmapFontProvider->is_empty = &UIAbstractBitmapFont::IsGlyphEmpty_Callback; + m_bitmapFontProvider->get_kerning = &UIAbstractBitmapFont::GetKerningForGlyphPair_Callback; + m_bitmapFontProvider->can_bitmap = &UIAbstractBitmapFont::CanProvideBitmap_Callback; + m_bitmapFontProvider->get_bitmap = &UIAbstractBitmapFont::GetGlyphBitmap_Callback; + m_bitmapFontProvider->free_bitmap = &UIAbstractBitmapFont::FreeGlyphBitmap_Callback; + m_bitmapFontProvider->userdata = this; +} + +void UIAbstractBitmapFont::registerFont() +{ + if(m_registered) + { + return; + } + + m_bitmapFontProvider->num_glyphs = m_numGlyphs; + + IggyFontInstallBitmapUTF8( m_bitmapFontProvider,m_fontname.c_str(),-1,IGGY_FONTFLAG_none ); + IggyFontSetIndirectUTF8( m_fontname.c_str(),-1 ,IGGY_FONTFLAG_all ,m_fontname.c_str() ,-1 ,IGGY_FONTFLAG_none ); + m_registered = true; +} + +IggyFontMetrics * RADLINK UIAbstractBitmapFont::GetFontMetrics_Callback(void *user_context,IggyFontMetrics *metrics) +{ + return ((UIAbstractBitmapFont *) user_context)->GetFontMetrics(metrics); +} + +S32 RADLINK UIAbstractBitmapFont::GetCodepointGlyph_Callback(void *user_context,U32 codepoint) +{ + return ((UIAbstractBitmapFont *) user_context)->GetCodepointGlyph(codepoint); +} + +IggyGlyphMetrics * RADLINK UIAbstractBitmapFont::GetGlyphMetrics_Callback(void *user_context,S32 glyph,IggyGlyphMetrics *metrics) +{ + return ((UIAbstractBitmapFont *) user_context)->GetGlyphMetrics(glyph,metrics); +} + +rrbool RADLINK UIAbstractBitmapFont::IsGlyphEmpty_Callback(void *user_context,S32 glyph) +{ + return ((UIAbstractBitmapFont *) user_context)->IsGlyphEmpty(glyph); +} + +F32 RADLINK UIAbstractBitmapFont::GetKerningForGlyphPair_Callback(void *user_context,S32 first_glyph,S32 second_glyph) +{ + return ((UIAbstractBitmapFont *) user_context)->GetKerningForGlyphPair(first_glyph,second_glyph); +} + +rrbool RADLINK UIAbstractBitmapFont::CanProvideBitmap_Callback(void *user_context,S32 glyph,F32 pixel_scale) +{ + return ((UIAbstractBitmapFont *) user_context)->CanProvideBitmap(glyph,pixel_scale); +} + +rrbool RADLINK UIAbstractBitmapFont::GetGlyphBitmap_Callback(void *user_context,S32 glyph,F32 pixel_scale,IggyBitmapCharacter *bitmap) +{ + return ((UIAbstractBitmapFont *) user_context)->GetGlyphBitmap(glyph,pixel_scale,bitmap); +} + +void RADLINK UIAbstractBitmapFont::FreeGlyphBitmap_Callback(void *user_context,S32 glyph,F32 pixel_scale,IggyBitmapCharacter *bitmap) +{ + return ((UIAbstractBitmapFont *) user_context)->FreeGlyphBitmap(glyph,pixel_scale,bitmap); +} + +UIBitmapFont::UIBitmapFont( SFontData &sfontdata ) + : UIAbstractBitmapFont( sfontdata.m_strFontName ) +{ + m_numGlyphs = sfontdata.m_uiGlyphCount; + + BufferedImage bimg(sfontdata.m_wstrFilename); + int *bimgData = bimg.getData(); + + m_cFontData = new CFontData(sfontdata, bimgData); + + //delete [] bimgData; +} + +UIBitmapFont::~UIBitmapFont() +{ + m_cFontData->release(); +} + +//Callback function type for returning vertical font metrics +IggyFontMetrics *UIBitmapFont::GetFontMetrics(IggyFontMetrics *metrics) +{ + //Description + // Vertical metrics for a font + //Members + // ascent - extent of characters above baseline (positive) + // descent - extent of characters below baseline (positive) + // line_gap - spacing between one row's descent and the next line's ascent + // average_glyph_width_for_tab_stops - spacing of "average" character for computing default tab stops + // largest_glyph_bbox_y1 - lowest point below baseline of any character in the font + + metrics->ascent = m_cFontData->getFontData()->m_fAscent; + metrics->descent = m_cFontData->getFontData()->m_fDescent; + + metrics->average_glyph_width_for_tab_stops = 8.0f; + + // This is my best guess, there's no reference to a specific glyph here + // so aren't these just exactly the same. + metrics->largest_glyph_bbox_y1 = metrics->descent; + + // metrics->line_gap; // 4J-JEV: Sean said this does nothing. + + return metrics; +} + +//Callback function type for mapping 32-bit unicode code point to internal font glyph number; use IGGY_GLYPH_INVALID to mean "invalid character" +S32 UIBitmapFont::GetCodepointGlyph(U32 codepoint) +{ + // 4J-JEV: Change "right single quotation marks" to apostrophies. + if (codepoint == 0x2019) codepoint = 0x27; + + return m_cFontData->getGlyphId(codepoint); +} + +//Callback function type for returning horizontal metrics for each glyph +IggyGlyphMetrics * UIBitmapFont::GetGlyphMetrics(S32 glyph,IggyGlyphMetrics *metrics) +{ + // 4J-JEV: Information about 'Glyph Metrics'. + // http://freetype.sourceforge.net/freetype2/docs/glyphs/glyphs-3.html - Overview. + // http://en.wikipedia.org/wiki/Kerning#Kerning_values - 'Font Units' + + //Description + // Horizontal metrics for a glyph + //Members + // x0 y0 x1 y1 - bounding box + // advance - horizontal distance to move character origin after drawing this glyph + + + /* 4J-JEV: *IMPORTANT* + * + * I believe these are measured wrt the scale mentioned in GetGlyphBitmap + * i.e. 1.0f == pixel_scale, + * + * However we do not have that information here, then all these values need to be + * the same for every scale in this font. + * + * We have 2 scales of bitmap glyph, and we can only scale these up by powers of 2 + * otherwise the fonts will become blurry. The appropriate glyph is chosen in + * 'GetGlyphBitmap' however we need to set the horizontal sizes here. + */ + + float glyphAdvance = m_cFontData->getAdvance(glyph); + + // 4J-JEV: Anything outside this measurement will be + // cut off if it's at the start or end of the row. + metrics->x0 = 0.0f; + + if ( m_cFontData->glyphIsWhitespace(glyph) ) + metrics->x1 = 0.0f; + else + metrics->x1 = glyphAdvance; + + // The next Glyph just starts right after this one. + metrics->advance = glyphAdvance; + + //app.DebugPrintf("[UIBitmapFont] GetGlyphMetrics:\n\tmetrics->advance == %f,\n", metrics->advance); + + // These don't do anything either. + metrics->y0 = 0.0f; metrics->y1 = 1.0f; + + return metrics; +} + +//Callback function type that should return true iff the glyph has no visible elements +rrbool UIBitmapFont::IsGlyphEmpty (S32 glyph) +{ + if (m_cFontData->glyphIsWhitespace(glyph)) return true; + return false;//app.DebugPrintf("Is glyph %d empty? %s\n",glyph,isEmpty?"TRUE":"FALSE"); +} + +//Callback function type for returning the kerning amount for a given pair of glyphs +F32 UIBitmapFont::GetKerningForGlyphPair(S32 first_glyph,S32 second_glyph) +{ + //UIBitmapFont *uiFont = (UIBitmapFont *) user_context; + //app.DebugPrintf("Get kerning for glyph pair %d,%d\n",first_glyph,second_glyph); + + // 4J-JEV: Yet another field that doesn't do anything. + // Only set out of paranoia. + return 0.0f; +} + +//Callback function type used for reporting whether a bitmap supports a given glyph at the given scale +rrbool UIBitmapFont::CanProvideBitmap(S32 glyph,F32 pixel_scale) +{ + //app.DebugPrintf("Can provide bitmap for glyph %d at scale %f? %s\n",glyph,pixel_scale,canProvideBitmap?"TRUE":"FALSE"); + return true; +} + +// Description +// Callback function type used for getting the bitmap for a given glyph +// Parameters +// glyph The glyph to compute/get the bitmap for +// pixel_scale The scale factor (pseudo point size) requested by the textfield,adjusted for display resolution +// bitmap The structure to store the bitmap into +rrbool UIBitmapFont::GetGlyphBitmap(S32 glyph,F32 pixel_scale,IggyBitmapCharacter *bitmap) +{ + //Description + // Data structure used to return to Iggy the bitmap to use for a glyph + //Members + // pixels_one_per_byte - pixels startin with the top-left-most; 0 is transparent and 255 is opaque + // width_in_pixels - this is the width of the bitmap data + // height_in_pixels - this is the height of the bitmap data + // stride_in_bytes - the distance from one row to the next + // oversample - this is the amount of oversampling (0 or 1 = not oversample,2 = 2x oversampled,4 = 4x oversampled) + // point_sample - if true,the bitmap will be drawn with point sampling; if false,it will be drawn with bilinear + // top_left_x - the offset of the top left corner from the character origin + // top_left_y - the offset of the top left corner from the character origin + // pixel_scale_correct - the pixel_scale at which this character should be displayed at displayed_width_in_pixels + // pixel_scale_min - the smallest pixel_scale to allow using this character (scaled down) + // pixel_scale_max - the largest pixels cale to allow using this character (scaled up) + // user_context_for_free - you can use this to store data to access on the corresponding free call + + int row = 0,col = 0; + m_cFontData->getPos(glyph,row,col); + + // Skip to glyph start. + bitmap->pixels_one_per_byte = m_cFontData->topLeftPixel(row,col); + + // Choose a reasonable glyph scale. + float glyphScale = 1.0f, truePixelScale = 1.0f / m_cFontData->getFontData()->m_fAdvPerPixel; + F32 targetPixelScale = pixel_scale; + //if(!RenderManager.IsWidescreen()) + //{ + // // Fix for different scales in 480 + // targetPixelScale = pixel_scale*2/3; + //} + while ( (0.5f + glyphScale) * truePixelScale < targetPixelScale) + glyphScale++; + + // 4J-JEV: Debug code to check which font sizes are being used. +#if (!defined _CONTENT_PACKAGE) && (VERBOSE_FONT_OUTPUT > 0) + + struct DebugData + { + string name; + long scale; + long mul; + + bool operator==(const DebugData& dd) const + { + if ( name.compare(dd.name) != 0 ) return false; + else if (scale != dd.scale) return false; + else if (mul != dd.mul) return false; + else return true; + } + }; + + static long long lastPrint = System::currentTimeMillis(); + static unordered_set debug_fontSizesRequested; + + { + DebugData dData = { m_cFontData->getFontName(), (long) pixel_scale, (long) glyphScale }; + debug_fontSizesRequested.insert(dData); + + if ( (lastPrint - System::currentTimeMillis()) > VERBOSE_FONT_OUTPUT ) + { + app.DebugPrintf(" Requested font/sizes:\n"); + + unordered_set::iterator itr; + for ( itr = debug_fontSizesRequested.begin(); + itr != debug_fontSizesRequested.end(); + itr++ + ) + { + app.DebugPrintf("\t- %s:%i\t(x%i)\n", itr->name.c_str(), itr->scale, itr->mul); + } + + lastPrint = System::currentTimeMillis(); + debug_fontSizesRequested.clear(); + } + } +#endif + + //app.DebugPrintf("Request glyph_%d (U+%.4X) at %f, converted to %f (%f)\n", + // glyph, GetUnicode(glyph), pixel_scale, targetPixelScale, glyphScale); + + // It is not necessary to shrink the glyph width here + // as its already been done in 'GetGlyphMetrics' by: + // > metrics->x1 = m_kerningTable[glyph] * ratio; + bitmap->width_in_pixels = m_cFontData->getFontData()->m_uiGlyphWidth; + bitmap->height_in_pixels = m_cFontData->getFontData()->m_uiGlyphHeight; + + /* 4J-JEV: This is to do with glyph placement, + * and not the position in the archive. + * I don't know why the 0.65 is needed, or what it represents, + * although it doesn't look like its the baseline. + */ + bitmap->top_left_x = 0; + + // 4J-PB - this was chopping off the top of the characters, so accented ones were losing a couple of pixels at the top + // DaveK has reduced the height of the accented capitalised characters, and we've dropped this from 0.65 to 0.64 + bitmap->top_left_y = -((S32) m_cFontData->getFontData()->m_uiGlyphHeight) * m_cFontData->getFontData()->m_fAscent; + + bitmap->oversample = 0; + bitmap->point_sample = true; + + // 4J-JEV: + // pixel_scale == font size chosen in flash. + // bitmap->pixel_scale_correct = (float) m_glyphHeight; // Scales the glyph to desired size. + // bitmap->pixel_scale_correct = pixel_scale; // Always the same size (not desired size). + // bitmap->pixel_scale_correct = pixel_scale * 0.5; // Doubles original size. + // bitmap->pixel_scale_correct = pixel_scale * 2; // Halves original size. + + // Actual scale, and possible range of scales. + bitmap->pixel_scale_correct = pixel_scale / glyphScale; + bitmap->pixel_scale_max = 99.0f; + bitmap->pixel_scale_min = 0.0f; + + /* 4J-JEV: Some of Sean's code. + int glyphScaleMin = 1; + int glyphScaleMax = 3; + float actualScale = pixel_scale / glyphScale; + bitmap->pixel_scale_correct = actualScale; + bitmap->pixel_scale_min = actualScale * glyphScaleMin * 0.999f; + bitmap->pixel_scale_max = actualScale * glyphScaleMax * 1.001f; */ + + // 4J-JEV: Nothing to do with glyph placement, + // entirely to do with cropping your glyph out of an archive. + bitmap->stride_in_bytes = m_cFontData->getFontData()->m_uiGlyphMapX; + + // 4J-JEV: Additional information needed to release memory afterwards. + bitmap->user_context_for_free = NULL; + + return true; +} + +//Callback function type for freeing a bitmap shape returned by GetGlyphBitmap +void RADLINK UIBitmapFont::FreeGlyphBitmap(S32 glyph,F32 pixel_scale,IggyBitmapCharacter *bitmap) +{ + // We don't need to free anything,it just comes from the archive. + //app.DebugPrintf("Free bitmap for glyph %d at scale %f\n",glyph,pixel_scale); +} diff --git a/Minecraft.Client/Common/UI/UIBitmapFont.h b/Minecraft.Client/Common/UI/UIBitmapFont.h new file mode 100644 index 00000000..62b708fb --- /dev/null +++ b/Minecraft.Client/Common/UI/UIBitmapFont.h @@ -0,0 +1,75 @@ +#pragma once + +struct SFontData; +class CFontData; + +#define VERBOSE_FONT_OUTPUT 0 + +// const int BITMAP_FONT_LANGUAGES = XC_LANGUAGE_ENGLISH +// | XC_LANGUAGE_GERMAN +// | XC_LANGUAGE_FRENCH +// | XC_LANGUAGE_SPANISH +// | XC_LANGUAGE_ITALIAN +// | XC_LANGUAGE_PORTUGUESE +// | XC_LANGUAGE_BRAZILIAN; + +using namespace std; + +class UIAbstractBitmapFont +{ +protected: + string m_fontname; + + IggyBitmapFontProvider *m_bitmapFontProvider; + + bool m_registered; + + unsigned int m_numGlyphs; + +public: + UIAbstractBitmapFont(const string &fontname); + ~UIAbstractBitmapFont(); + + void registerFont(); + + // Virtual Functions. + virtual IggyFontMetrics *GetFontMetrics(IggyFontMetrics *metrics) = 0; + virtual S32 GetCodepointGlyph(U32 codepoint) = 0; + virtual IggyGlyphMetrics *GetGlyphMetrics(S32 glyph, IggyGlyphMetrics *metrics) = 0; + virtual rrbool IsGlyphEmpty(S32 glyph) = 0; + virtual F32 GetKerningForGlyphPair(S32 first_glyph, S32 second_glyph) = 0; + virtual rrbool CanProvideBitmap(S32 glyph, F32 pixel_scale) = 0; + virtual rrbool GetGlyphBitmap(S32 glyph, F32 pixel_scale, IggyBitmapCharacter *bitmap) = 0; + virtual void FreeGlyphBitmap(S32 glyph, F32 pixel_scale, IggyBitmapCharacter *bitmap) = 0; + + // Static Callbacks + // Just wrappers for the virtual functions. + static IggyFontMetrics * RADLINK GetFontMetrics_Callback(void *user_context, IggyFontMetrics *metrics); + static S32 RADLINK GetCodepointGlyph_Callback(void *user_context, U32 codepoint); + static IggyGlyphMetrics * RADLINK GetGlyphMetrics_Callback(void *user_context, S32 glyph, IggyGlyphMetrics *metrics); + static rrbool RADLINK IsGlyphEmpty_Callback(void *user_context, S32 glyph); + static F32 RADLINK GetKerningForGlyphPair_Callback(void *user_context, S32 first_glyph, S32 second_glyph); + static rrbool RADLINK CanProvideBitmap_Callback(void *user_context, S32 glyph, F32 pixel_scale); + static rrbool RADLINK GetGlyphBitmap_Callback(void *user_context, S32 glyph, F32 pixel_scale, IggyBitmapCharacter *bitmap); + static void RADLINK FreeGlyphBitmap_Callback(void *user_context, S32 glyph, F32 pixel_scale, IggyBitmapCharacter *bitmap); +}; + +class UIBitmapFont : public UIAbstractBitmapFont +{ +protected: + CFontData *m_cFontData; + +public: + UIBitmapFont(SFontData &sfontdata); + + ~UIBitmapFont(); + + virtual IggyFontMetrics * GetFontMetrics(IggyFontMetrics *metrics); + virtual S32 GetCodepointGlyph(U32 codepoint); + virtual IggyGlyphMetrics * GetGlyphMetrics(S32 glyph, IggyGlyphMetrics *metrics); + virtual rrbool IsGlyphEmpty(S32 glyph); + virtual F32 GetKerningForGlyphPair(S32 first_glyph, S32 second_glyph); + virtual rrbool CanProvideBitmap(S32 glyph, F32 pixel_scale); + virtual rrbool GetGlyphBitmap(S32 glyph, F32 pixel_scale, IggyBitmapCharacter *bitmap); + virtual void FreeGlyphBitmap(S32 glyph, F32 pixel_scale, IggyBitmapCharacter *bitmap); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_Chat.cpp b/Minecraft.Client/Common/UI/UIComponent_Chat.cpp new file mode 100644 index 00000000..98b4f165 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_Chat.cpp @@ -0,0 +1,157 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIComponent_Chat.h" +#include "..\..\Minecraft.h" +#include "..\..\Gui.h" + +UIComponent_Chat::UIComponent_Chat(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + for(unsigned int i = 0; i < CHAT_LINES_COUNT; ++i) + { + m_labelChatText[i].init(L""); + } + m_labelJukebox.init(L""); + + addTimer(0, 100); +} + +wstring UIComponent_Chat::getMoviePath() +{ + switch( m_parentLayer->getViewport() ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + m_bSplitscreen = true; + return L"ComponentChatSplit"; + break; + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + default: + m_bSplitscreen = false; + return L"ComponentChat"; + break; + } +} + +void UIComponent_Chat::handleTimerComplete(int id) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + + bool anyVisible = false; + if(pMinecraft->localplayers[m_iPad]!= NULL) + { + Gui *pGui = pMinecraft->gui; + //DWORD messagesToDisplay = min( CHAT_LINES_COUNT, pGui->getMessagesCount(m_iPad) ); + for( unsigned int i = 0; i < CHAT_LINES_COUNT; ++i ) + { + float opacity = pGui->getOpacity(m_iPad, i); + if( opacity > 0 ) + { + m_controlLabelBackground[i].setOpacity(opacity); + m_labelChatText[i].setOpacity(opacity); + m_labelChatText[i].setLabel( pGui->getMessage(m_iPad,i) ); + + anyVisible = true; + } + else + { + m_controlLabelBackground[i].setOpacity(0); + m_labelChatText[i].setOpacity(0); + m_labelChatText[i].setLabel(L""); + } + } + if(pGui->getJukeboxOpacity(m_iPad) > 0) anyVisible = true; + m_labelJukebox.setOpacity( pGui->getJukeboxOpacity(m_iPad) ); + m_labelJukebox.setLabel( pGui->getJukeboxMessage(m_iPad) ); + } + else + { + for( unsigned int i = 0; i < CHAT_LINES_COUNT; ++i ) + { + m_controlLabelBackground[i].setOpacity(0); + m_labelChatText[i].setOpacity(0); + m_labelChatText[i].setLabel(L""); + } + m_labelJukebox.setOpacity( 0 ); + } + + setVisible(anyVisible); +} + +void UIComponent_Chat::render(S32 width, S32 height, C4JRender::eViewportType viewport) +{ + if(m_bSplitscreen) + { + S32 xPos = 0; + S32 yPos = 0; + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + yPos = (S32)(ui.getScreenHeight() / 2); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + xPos = (S32)(ui.getScreenWidth() / 2); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + xPos = (S32)(ui.getScreenWidth() / 2); + yPos = (S32)(ui.getScreenHeight() / 2); + break; + } + ui.setupRenderPosition(xPos, yPos); + + S32 tileXStart = 0; + S32 tileYStart = 0; + S32 tileWidth = width; + S32 tileHeight = height; + + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + tileHeight = (S32)(ui.getScreenHeight()); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + tileWidth = (S32)(ui.getScreenWidth()); + tileYStart = (S32)(m_movieHeight / 2); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + tileWidth = (S32)(ui.getScreenWidth()); + tileYStart = (S32)(m_movieHeight / 2); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + tileYStart = (S32)(m_movieHeight / 2); + break; + } + + IggyPlayerSetDisplaySize( getMovie(), m_movieWidth, m_movieHeight ); + + IggyPlayerDrawTilesStart ( getMovie() ); + + m_renderWidth = tileWidth; + m_renderHeight = tileHeight; + IggyPlayerDrawTile ( getMovie() , + tileXStart , + tileYStart , + tileXStart + tileWidth , + tileYStart + tileHeight , + 0 ); + IggyPlayerDrawTilesEnd ( getMovie() ); + } + else + { + UIScene::render(width, height, viewport); + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_Chat.h b/Minecraft.Client/Common/UI/UIComponent_Chat.h new file mode 100644 index 00000000..d18352cc --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_Chat.h @@ -0,0 +1,66 @@ +#pragma once + +#include "UIScene.h" + +#define CHAT_LINES_COUNT 10 + +class UIComponent_Chat : public UIScene +{ +private: + bool m_bSplitscreen; + +protected: + UIControl_Label m_labelChatText[CHAT_LINES_COUNT]; + UIControl_Label m_labelJukebox; + UIControl m_controlLabelBackground[CHAT_LINES_COUNT]; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT(m_labelChatText[0],"Label1") + UI_MAP_ELEMENT(m_labelChatText[1],"Label2") + UI_MAP_ELEMENT(m_labelChatText[2],"Label3") + UI_MAP_ELEMENT(m_labelChatText[3],"Label4") + UI_MAP_ELEMENT(m_labelChatText[4],"Label5") + UI_MAP_ELEMENT(m_labelChatText[5],"Label6") + UI_MAP_ELEMENT(m_labelChatText[6],"Label7") + UI_MAP_ELEMENT(m_labelChatText[7],"Label8") + UI_MAP_ELEMENT(m_labelChatText[8],"Label9") + UI_MAP_ELEMENT(m_labelChatText[9],"Label10") + + UI_MAP_ELEMENT(m_controlLabelBackground[0],"Label1Background") + UI_MAP_ELEMENT(m_controlLabelBackground[1],"Label2Background") + UI_MAP_ELEMENT(m_controlLabelBackground[2],"Label3Background") + UI_MAP_ELEMENT(m_controlLabelBackground[3],"Label4Background") + UI_MAP_ELEMENT(m_controlLabelBackground[4],"Label5Background") + UI_MAP_ELEMENT(m_controlLabelBackground[5],"Label6Background") + UI_MAP_ELEMENT(m_controlLabelBackground[6],"Label7Background") + UI_MAP_ELEMENT(m_controlLabelBackground[7],"Label8Background") + UI_MAP_ELEMENT(m_controlLabelBackground[8],"Label9Background") + UI_MAP_ELEMENT(m_controlLabelBackground[9],"Label10Background") + + UI_MAP_ELEMENT(m_labelJukebox,"Jukebox") + UI_END_MAP_ELEMENTS_AND_NAMES() + +public: + UIComponent_Chat(int iPad, void *initData, UILayer *parentLayer); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + virtual EUIScene getSceneType() { return eUIComponent_Chat;} + + // Returns true if this scene handles input + virtual bool stealsFocus() { return false; } + + // Returns true if this scene has focus for the pad passed in + virtual bool hasFocus(int iPad) { return false; } + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return false; } + + // RENDERING + virtual void render(S32 width, S32 height, C4JRender::eViewportType viewport); + +protected: + void handleTimerComplete(int id); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_DebugUIConsole.cpp b/Minecraft.Client/Common/UI/UIComponent_DebugUIConsole.cpp new file mode 100644 index 00000000..7436d796 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_DebugUIConsole.cpp @@ -0,0 +1,39 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIComponent_DebugUIConsole.h" + +UIComponent_DebugUIConsole::UIComponent_DebugUIConsole(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_bTextChanged = false; +} + +wstring UIComponent_DebugUIConsole::getMoviePath() +{ + return L"DebugUIConsoleComponent"; +} + +void UIComponent_DebugUIConsole::tick() +{ + UIScene::tick(); + if(m_bTextChanged) + { + m_bTextChanged = false; + for(unsigned int i = 0; i < 10 && i < m_textList.size(); ++i) + { + m_labels[i].setLabel(m_textList[i]); + } + } +} + +void UIComponent_DebugUIConsole::addText(const string &text) +{ + if(!text.empty() && text.compare("\n") != 0) + { + if(m_textList.size() >= 10) m_textList.pop_front(); + m_textList.push_back(text); + m_bTextChanged = true; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_DebugUIConsole.h b/Minecraft.Client/Common/UI/UIComponent_DebugUIConsole.h new file mode 100644 index 00000000..177754f5 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_DebugUIConsole.h @@ -0,0 +1,49 @@ +#pragma once + +#include "UIScene.h" +#include "UIControl_Label.h" + +class UIComponent_DebugUIConsole : public UIScene +{ +private: + UIControl_Label m_labels[10]; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_labels[0], "consoleLine1") + UI_MAP_ELEMENT( m_labels[1], "consoleLine2") + UI_MAP_ELEMENT( m_labels[2], "consoleLine3") + UI_MAP_ELEMENT( m_labels[3], "consoleLine4") + UI_MAP_ELEMENT( m_labels[4], "consoleLine5") + UI_MAP_ELEMENT( m_labels[5], "consoleLine6") + UI_MAP_ELEMENT( m_labels[6], "consoleLine7") + UI_MAP_ELEMENT( m_labels[7], "consoleLine8") + UI_MAP_ELEMENT( m_labels[8], "consoleLine9") + UI_MAP_ELEMENT( m_labels[9], "consoleLine10") + UI_END_MAP_ELEMENTS_AND_NAMES() + + deque m_textList; + + bool m_bTextChanged; + +public: + UIComponent_DebugUIConsole(int iPad, void *initData, UILayer *parentLayer); + + virtual void tick(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + virtual EUIScene getSceneType() { return eUIComponent_DebugUIConsole;} + + // Returns true if this scene handles input + virtual bool stealsFocus() { return false; } + + // Returns true if this scene has focus for the pad passed in + virtual bool hasFocus(int iPad) { return false; } + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return false; } + + void addText(const string &text); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_DebugUIMarketingGuide.cpp b/Minecraft.Client/Common/UI/UIComponent_DebugUIMarketingGuide.cpp new file mode 100644 index 00000000..240429bc --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_DebugUIMarketingGuide.cpp @@ -0,0 +1,33 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIComponent_DebugUIMarketingGuide.h" + +UIComponent_DebugUIMarketingGuide::UIComponent_DebugUIMarketingGuide(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = (F64)0; // WIN64 +#if defined _XBOX + value[0].number = (F64)1; +#elif defined _DURANGO + value[0].number = (F64)2; +#elif defined __PS3__ + value[0].number = (F64)3; +#elif defined __ORBIS__ + value[0].number = (F64)4; +#elif defined __PSVITA__ + value[0].number = (F64)5; +#elif defined _WINDOWS64 + value[0].number = (F64)0; +#endif + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetPlatform , 1 , value ); +} + +wstring UIComponent_DebugUIMarketingGuide::getMoviePath() +{ + return L"DebugUIMarketingGuide"; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_DebugUIMarketingGuide.h b/Minecraft.Client/Common/UI/UIComponent_DebugUIMarketingGuide.h new file mode 100644 index 00000000..2c651173 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_DebugUIMarketingGuide.h @@ -0,0 +1,34 @@ +#pragma once + +#include "UIScene.h" +#include "UIControl_Label.h" + +class UIComponent_DebugUIMarketingGuide : public UIScene +{ +private: + IggyName m_funcSetPlatform; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_NAME( m_funcSetPlatform, L"SetPlatform") + UI_END_MAP_ELEMENTS_AND_NAMES() + + +public: + UIComponent_DebugUIMarketingGuide(int iPad, void *initData, UILayer *parentLayer); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + virtual EUIScene getSceneType() { return eUIComponent_DebugUIMarketingGuide;} + + // Returns true if this scene handles input + virtual bool stealsFocus() { return false; } + + // Returns true if this scene has focus for the pad passed in + virtual bool hasFocus(int iPad) { return false; } + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return false; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_Logo.cpp b/Minecraft.Client/Common/UI/UIComponent_Logo.cpp new file mode 100644 index 00000000..2f5c82bd --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_Logo.cpp @@ -0,0 +1,30 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIComponent_Logo.h" + +UIComponent_Logo::UIComponent_Logo(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); +} + +wstring UIComponent_Logo::getMoviePath() +{ + switch( m_parentLayer->getViewport() ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + return L"ComponentLogoSplit"; + break; + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + default: + return L"ComponentLogo"; + break; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_Logo.h b/Minecraft.Client/Common/UI/UIComponent_Logo.h new file mode 100644 index 00000000..1a8cf819 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_Logo.h @@ -0,0 +1,25 @@ +#pragma once + +#include "UIScene.h" + +class UIComponent_Logo : public UIScene +{ +public: + UIComponent_Logo(int iPad, void *initData, UILayer *parentLayer); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + virtual EUIScene getSceneType() { return eUIComponent_Logo;} + + // Returns true if this scene handles input + virtual bool stealsFocus() { return false; } + + // Returns true if this scene has focus for the pad passed in + virtual bool hasFocus(int iPad) { return false; } + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return false; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_MenuBackground.cpp b/Minecraft.Client/Common/UI/UIComponent_MenuBackground.cpp new file mode 100644 index 00000000..d3a4c4c0 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_MenuBackground.cpp @@ -0,0 +1,103 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIComponent_MenuBackground.h" + +UIComponent_MenuBackground::UIComponent_MenuBackground(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + m_bSplitscreen = false; + // Setup all the Iggy references we need for this scene + initialiseMovie(); +} + +wstring UIComponent_MenuBackground::getMoviePath() +{ switch( m_parentLayer->getViewport() ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + m_bSplitscreen = true; + break; + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + default: + m_bSplitscreen = false; + break; + } + + // We use the fullscreen one even in splitscreen, just draw different parts of it + return L"MenuBackground"; +} + +void UIComponent_MenuBackground::render(S32 width, S32 height, C4JRender::eViewportType viewport) +{ + if(m_bSplitscreen) + { + S32 xPos = 0; + S32 yPos = 0; + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + yPos = (S32)(ui.getScreenHeight() / 2); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + xPos = (S32)(ui.getScreenWidth() / 2); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + xPos = (S32)(ui.getScreenWidth() / 2); + yPos = (S32)(ui.getScreenHeight() / 2); + break; + } + ui.setupRenderPosition(xPos, yPos); + + S32 tileXStart = 0; + S32 tileYStart = 0; + S32 tileWidth = width; + S32 tileHeight = height; + + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + tileHeight = (S32)(ui.getScreenHeight()); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + tileWidth = (S32)(ui.getScreenWidth()); + tileYStart = (S32)(m_movieHeight / 2); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + tileWidth = (S32)(ui.getScreenWidth()); + tileYStart = (S32)(m_movieHeight / 2); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + tileYStart = (S32)(m_movieHeight / 2); + break; + } + + IggyPlayerSetDisplaySize( getMovie(), m_movieWidth, m_movieHeight ); + + IggyPlayerDrawTilesStart ( getMovie() ); + + m_renderWidth = tileWidth; + m_renderHeight = tileHeight; + IggyPlayerDrawTile ( getMovie() , + tileXStart , + tileYStart , + tileXStart + tileWidth , + tileYStart + tileHeight , + 0 ); + IggyPlayerDrawTilesEnd ( getMovie() ); + } + else + { + UIScene::render(width, height, viewport); + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_MenuBackground.h b/Minecraft.Client/Common/UI/UIComponent_MenuBackground.h new file mode 100644 index 00000000..ac0b9d2f --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_MenuBackground.h @@ -0,0 +1,30 @@ +#pragma once + +#include "UIScene.h" + +class UIComponent_MenuBackground : public UIScene +{ +private: + bool m_bSplitscreen; +public: + UIComponent_MenuBackground(int iPad, void *initData, UILayer *parentLayer); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + virtual EUIScene getSceneType() { return eUIComponent_MenuBackground;} + + // Returns true if this scene handles input + virtual bool stealsFocus() { return false; } + + // Returns true if this scene has focus for the pad passed in + virtual bool hasFocus(int iPad) { return false; } + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return false; } + + // RENDERING + virtual void render(S32 width, S32 height, C4JRender::eViewportType viewport); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_Panorama.cpp b/Minecraft.Client/Common/UI/UIComponent_Panorama.cpp new file mode 100644 index 00000000..a418fcda --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_Panorama.cpp @@ -0,0 +1,144 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIComponent_Panorama.h" +#include "Minecraft.h" +#include "MultiPlayerLevel.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.dimension.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.storage.h" + +UIComponent_Panorama::UIComponent_Panorama(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_bShowingDay = true; + + while(!m_hasTickedOnce) tick(); +} + +wstring UIComponent_Panorama::getMoviePath() +{ + switch( m_parentLayer->getViewport() ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + m_bSplitscreen = true; + return L"PanoramaSplit"; + break; + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + default: + m_bSplitscreen = false; + return L"Panorama"; + break; + } +} + +void UIComponent_Panorama::tick() +{ + if(!hasMovie()) return; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + EnterCriticalSection(&pMinecraft->m_setLevelCS); + if(pMinecraft->level!=NULL) + { + __int64 i64TimeOfDay =0; + // are we in the Nether? - Leave the time as 0 if we are, so we show daylight + if(pMinecraft->level->dimension->id==0) + { + i64TimeOfDay = pMinecraft->level->getLevelData()->getTime() % 24000; + } + + if(i64TimeOfDay>14000) + { + setPanorama(false); + } + else + { + setPanorama(true); + } + } + else + { + setPanorama(true); + } + LeaveCriticalSection(&pMinecraft->m_setLevelCS); + + UIScene::tick(); +} + +void UIComponent_Panorama::render(S32 width, S32 height, C4JRender::eViewportType viewport) +{ + bool specialViewport = (viewport == C4JRender::VIEWPORT_TYPE_SPLIT_TOP) || + (viewport == C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM) || + (viewport == C4JRender::VIEWPORT_TYPE_SPLIT_LEFT) || + (viewport == C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT); + if(m_bSplitscreen && specialViewport) + { + S32 xPos = 0; + S32 yPos = 0; + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + yPos = (S32)(ui.getScreenHeight() / 2); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + xPos = (S32)(ui.getScreenWidth() / 2); + break; + } + ui.setupRenderPosition(xPos, yPos); + + if((viewport == C4JRender::VIEWPORT_TYPE_SPLIT_LEFT) || (viewport == C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT)) + { + // Need to render at full height, but only the left side of the scene + S32 tileXStart = 0; + S32 tileYStart = 0; + S32 tileWidth = width; + S32 tileHeight = (S32)(ui.getScreenHeight()); + + IggyPlayerSetDisplaySize( getMovie(), m_movieWidth, m_movieHeight ); + + IggyPlayerDrawTilesStart ( getMovie() ); + + m_renderWidth = tileWidth; + m_renderHeight = tileHeight; + IggyPlayerDrawTile ( getMovie() , + tileXStart , + tileYStart , + tileXStart + tileWidth , + tileYStart + tileHeight , + 0 ); + IggyPlayerDrawTilesEnd ( getMovie() ); + } + else + { + // Need to render at full height, and full width. But compressed into the viewport + IggyPlayerSetDisplaySize( getMovie(), ui.getScreenWidth(), ui.getScreenHeight()/2 ); + IggyPlayerDraw( getMovie() ); + } + } + else + { + UIScene::render(width, height, viewport); + } +} + +void UIComponent_Panorama::setPanorama(bool isDay) +{ + if(isDay != m_bShowingDay) + { + m_bShowingDay = isDay; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = isDay; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowPanoramaDay , 1 , value ); + } +} diff --git a/Minecraft.Client/Common/UI/UIComponent_Panorama.h b/Minecraft.Client/Common/UI/UIComponent_Panorama.h new file mode 100644 index 00000000..99dc115c --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_Panorama.h @@ -0,0 +1,40 @@ +#pragma once + +#include "UIScene.h" + +class UIComponent_Panorama : public UIScene +{ +private: + bool m_bSplitscreen; + bool m_bShowingDay; + +protected: + IggyName m_funcShowPanoramaDay; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_NAME(m_funcShowPanoramaDay, L"ShowPanoramaDay"); + UI_END_MAP_ELEMENTS_AND_NAMES() + +public: + UIComponent_Panorama(int iPad, void *initData, UILayer *parentLayer); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + virtual EUIScene getSceneType() { return eUIComponent_Panorama;} + + // Returns true if this scene handles input + virtual bool stealsFocus() { return false; } + + // Returns true if this scene has focus for the pad passed in + virtual bool hasFocus(int iPad) { return false; } + + virtual void tick(); + + // RENDERING + virtual void render(S32 width, S32 height, C4JRender::eViewportType viewport); + +private: + void setPanorama(bool isDay); +}; diff --git a/Minecraft.Client/Common/UI/UIComponent_PressStartToPlay.cpp b/Minecraft.Client/Common/UI/UIComponent_PressStartToPlay.cpp new file mode 100644 index 00000000..2feb94c1 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_PressStartToPlay.cpp @@ -0,0 +1,167 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIComponent_PressStartToPlay.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" + +UIComponent_PressStartToPlay::UIComponent_PressStartToPlay(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_showingSaveIcon = false; + m_showingAutosaveTimer = false; + m_showingTrialTimer = false; + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + m_showingPressStart[i] = false; + } + m_trialTimer = L""; + m_autosaveTimer = L""; + + m_labelTrialTimer.init(L""); + m_labelTrialTimer.setVisible(false); + +#ifdef __ORBIS__ + wstring text = app.GetString(IDS_PRESS_X_TO_JOIN); + text = replaceAll(text, L"{*CONTROLLER_VK_A*}", app.GetVKReplacement(VK_PAD_A) ); + + m_labelPressStart.init(text.c_str()); +#elif defined _XBOX_ONE + wstring text = app.GetString(IDS_PRESS_START_TO_JOIN); + text = replaceAll(text, L"{*CONTROLLER_VK_START*}", app.GetVKReplacement(VK_PAD_START) ); + m_labelPressStart.init(text.c_str()); +#else + m_labelPressStart.init(app.GetString(IDS_PRESS_START_TO_JOIN)); +#endif + m_controlSaveIcon.setVisible(false); + m_controlPressStartPanel.setVisible(false); + m_playerDisplayName.setVisible(false); +} + +wstring UIComponent_PressStartToPlay::getMoviePath() +{ + return L"PressStartToPlay"; +} + +void UIComponent_PressStartToPlay::handleReload() +{ + // 4J Stu - It's possible these could change during the reload, so can't use the normal controls refresh of it's state + m_controlSaveIcon.setVisible(m_showingSaveIcon); + m_labelTrialTimer.setVisible(m_showingAutosaveTimer); + m_labelTrialTimer.setLabel(m_autosaveTimer); + m_labelTrialTimer.setVisible(m_showingTrialTimer); + m_labelTrialTimer.setLabel(m_trialTimer); + + bool showPressStart = false; + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + bool show = m_showingPressStart[i]; + showPressStart |= show; + + if(show) + { + addTimer(0,3000); + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = i; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowController , 1 , value ); + } + } + m_controlPressStartPanel.setVisible(showPressStart); +} + +void UIComponent_PressStartToPlay::handleTimerComplete(int id) +{ + m_controlPressStartPanel.setVisible(false); + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + m_showingPressStart[i] = false; + } + ui.ClearPressStart(); +} + +void UIComponent_PressStartToPlay::showPressStart(int iPad, bool show) +{ + m_showingPressStart[iPad] = show; + if(!ui.IsExpectingOrReloadingSkin() && hasMovie()) + { + m_controlPressStartPanel.setVisible(show); + + if(show) + { + addTimer(0,3000); + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = iPad; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowController , 1 , value ); + } + } +} + +void UIComponent_PressStartToPlay::setTrialTimer(const wstring &label) +{ + m_trialTimer = label; + if(!ui.IsExpectingOrReloadingSkin() && hasMovie()) + { + m_labelTrialTimer.setLabel(label); + } +} + +void UIComponent_PressStartToPlay::showTrialTimer(bool show) +{ + m_showingTrialTimer = show; + if(!ui.IsExpectingOrReloadingSkin() && hasMovie()) + { + m_labelTrialTimer.setVisible(show); + } +} + +void UIComponent_PressStartToPlay::setAutosaveTimer(const wstring &label) +{ + m_autosaveTimer = label; + if(!ui.IsExpectingOrReloadingSkin() && hasMovie()) + { + m_labelTrialTimer.setLabel(label); + } +} + +void UIComponent_PressStartToPlay::showAutosaveTimer(bool show) +{ + m_showingAutosaveTimer = show; + if(!ui.IsExpectingOrReloadingSkin() && hasMovie()) + { + m_labelTrialTimer.setVisible(show); + } +} + +void UIComponent_PressStartToPlay::showSaveIcon(bool show) +{ + m_showingSaveIcon = show; + if(!ui.IsExpectingOrReloadingSkin() && hasMovie()) + { + m_controlSaveIcon.setVisible(show); + } + else + { + if(show) app.DebugPrintf("Tried to show save icon while texture pack reload was in progress\n"); + } +} + +void UIComponent_PressStartToPlay::showPlayerDisplayName(bool show) +{ +#ifdef _XBOX_ONE + if(show) + { + m_playerDisplayName.setLabel(ProfileManager.GetDisplayName(ProfileManager.GetPrimaryPad())); + } + m_playerDisplayName.setVisible(show); +#else + m_playerDisplayName.setVisible(false); +#endif +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_PressStartToPlay.h b/Minecraft.Client/Common/UI/UIComponent_PressStartToPlay.h new file mode 100644 index 00000000..a29b6016 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_PressStartToPlay.h @@ -0,0 +1,60 @@ +#pragma once + +#include "UIScene.h" + +class UIComponent_PressStartToPlay : public UIScene +{ +private: + bool m_showingSaveIcon; + bool m_showingAutosaveTimer; + bool m_showingTrialTimer; + bool m_showingPressStart[XUSER_MAX_COUNT]; + wstring m_trialTimer; + wstring m_autosaveTimer; + +protected: + UIControl_Label m_labelTrialTimer, m_labelPressStart, m_playerDisplayName; + UIControl m_controlSaveIcon, m_controlPressStartPanel; + IggyName m_funcShowController; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT(m_labelTrialTimer, "TrialTimer") + UI_MAP_ELEMENT(m_controlSaveIcon, "SaveIcon") + UI_MAP_ELEMENT(m_playerDisplayName, "PlayerName") + UI_MAP_ELEMENT(m_controlPressStartPanel, "MainPanel") + UI_BEGIN_MAP_CHILD_ELEMENTS(m_controlPressStartPanel) + UI_MAP_ELEMENT(m_labelPressStart, "PressStartLabel" ) + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_NAME(m_funcShowController, L"ShowController"); + UI_END_MAP_ELEMENTS_AND_NAMES() + +public: + UIComponent_PressStartToPlay(int iPad, void *initData, UILayer *parentLayer); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + virtual EUIScene getSceneType() { return eUIComponent_PressStartToPlay;} + + // Returns true if this scene handles input + virtual bool stealsFocus() { return false; } + + // Returns true if this scene has focus for the pad passed in + virtual bool hasFocus(int iPad) { return false; } + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return false; } + + virtual void handleReload(); + virtual void handleTimerComplete(int id); + + void showPressStart(int iPad, bool show); + void setTrialTimer(const wstring &label); + void showTrialTimer(bool show); + void setAutosaveTimer(const wstring &label); + void showAutosaveTimer(bool show); + void showSaveIcon(bool show); + void showPlayerDisplayName(bool show); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_Tooltips.cpp b/Minecraft.Client/Common/UI/UIComponent_Tooltips.cpp new file mode 100644 index 00000000..63eba1a5 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_Tooltips.cpp @@ -0,0 +1,501 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIComponent_Tooltips.h" + +UIComponent_Tooltips::UIComponent_Tooltips(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + for(int i=0;igetViewport() ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + m_bSplitscreen = true; + return L"ToolTipsSplit"; + break; + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + default: + m_bSplitscreen = false; + return L"ToolTips"; + break; + } +} + +F64 UIComponent_Tooltips::getSafeZoneHalfWidth() +{ + float width = ui.getScreenWidth(); + + float safeWidth = 0.0f; + +#ifndef __PSVITA__ + // 85% safezone for tooltips in either SD mode + if( !RenderManager.IsHiDef() ) + { + // 85% safezone + safeWidth = m_movieWidth * (0.15f / 2); + } + else + { + // 90% safezone + safeWidth = width * (0.1f / 2); + } +#endif + return safeWidth; +} + +void UIComponent_Tooltips::updateSafeZone() +{ + // Distance from edge + F64 safeTop = 0.0; + F64 safeBottom = 0.0; + F64 safeLeft = 0.0; + F64 safeRight = 0.0; + + switch( m_parentLayer->getViewport() ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + safeTop = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + safeBottom = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + safeLeft = getSafeZoneHalfWidth(); + safeBottom = getSafeZoneHalfHeight(); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + safeRight = getSafeZoneHalfWidth(); + safeBottom = getSafeZoneHalfHeight(); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + safeTop = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + safeTop = getSafeZoneHalfHeight(); + safeRight = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + safeBottom = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + safeBottom = getSafeZoneHalfHeight(); + safeRight = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + default: + safeTop = getSafeZoneHalfHeight(); + safeBottom = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + safeRight = getSafeZoneHalfWidth(); + break; + } + setSafeZone(safeTop, safeBottom, safeLeft, safeRight); +} + +void UIComponent_Tooltips::tick() +{ + UIScene::tick(); + + // set the opacity of the tooltip items + unsigned char ucAlpha=app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_InterfaceOpacity); + float fVal; + + if(ucAlpha<80) + { + // if we are in a menu, set the minimum opacity for tooltips to 15% + if(ui.GetMenuDisplayed(m_iPad) && (ucAlpha<15)) + { + ucAlpha=15; + } + + // check if we have the timer running for the opacity + unsigned int uiOpacityTimer=app.GetOpacityTimer(m_iPad); + if(uiOpacityTimer!=0) + { + if(uiOpacityTimer<10) + { + float fStep=(80.0f-(float)ucAlpha)/10.0f; + fVal=0.01f*(80.0f-((10.0f-(float)uiOpacityTimer)*fStep)); + } + else + { + fVal=0.01f*80.0f; + } + } + else + { + fVal=0.01f*(float)ucAlpha; + } + } + else + { + // if we are in a menu, set the minimum opacity for tooltips to 15% + if(ui.GetMenuDisplayed(m_iPad) && (ucAlpha<15)) + { + ucAlpha=15; + } + fVal=0.01f*(float)ucAlpha; + } + setOpacity(fVal); +} + +void UIComponent_Tooltips::render(S32 width, S32 height, C4JRender::eViewportType viewport) +{ + if((ProfileManager.GetLockedProfile()!=-1) && !ui.GetMenuDisplayed(m_iPad) && (app.GetGameSettings(m_iPad,eGameSetting_Tooltips)==0 || app.GetGameSettings(m_iPad,eGameSetting_DisplayHUD)==0)) + { + return; + } + + if(m_bSplitscreen) + { + S32 xPos = 0; + S32 yPos = 0; + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + yPos = (S32)(ui.getScreenHeight() / 2); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + xPos = (S32)(ui.getScreenWidth() / 2); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + xPos = (S32)(ui.getScreenWidth() / 2); + yPos = (S32)(ui.getScreenHeight() / 2); + break; + } + ui.setupRenderPosition(xPos, yPos); + + S32 tileXStart = 0; + S32 tileYStart = 0; + S32 tileWidth = width; + S32 tileHeight = height; + + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + tileHeight = (S32)(ui.getScreenHeight()); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + tileWidth = (S32)(ui.getScreenWidth()); + tileYStart = (S32)(m_movieHeight / 2); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + tileWidth = (S32)(ui.getScreenWidth()); + tileYStart = (S32)(m_movieHeight / 2); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + tileYStart = (S32)(m_movieHeight / 2); + break; + } + + IggyPlayerSetDisplaySize( getMovie(), m_movieWidth, m_movieHeight ); + + IggyPlayerDrawTilesStart ( getMovie() ); + + m_renderWidth = tileWidth; + m_renderHeight = tileHeight; + IggyPlayerDrawTile ( getMovie() , + tileXStart , + tileYStart , + tileXStart + tileWidth , + tileYStart + tileHeight , + 0 ); + IggyPlayerDrawTilesEnd ( getMovie() ); + } + else + { + UIScene::render(width, height, viewport); + } +} + +void UIComponent_Tooltips::SetTooltipText( unsigned int tooltip, int iTextID ) +{ + if( _SetTooltip(tooltip, iTextID) ) _Relayout(); +} + +void UIComponent_Tooltips::SetEnableTooltips( bool bVal ) +{ +} + +void UIComponent_Tooltips::ShowTooltip( unsigned int tooltip, bool show ) +{ + if(show != m_tooltipValues[tooltip].show) + { + _SetTooltip(tooltip, L"", show); + _Relayout(); + } +} + +void UIComponent_Tooltips::SetTooltips( int iA, int iB, int iX, int iY , int iLT, int iRT, int iLB, int iRB, int iLS, bool forceUpdate) +{ + bool needsRelayout = false; + needsRelayout = _SetTooltip( eToolTipButtonA, iA ) || needsRelayout; + needsRelayout = _SetTooltip( eToolTipButtonB, iB ) || needsRelayout; + needsRelayout = _SetTooltip( eToolTipButtonX, iX ) || needsRelayout; + needsRelayout = _SetTooltip( eToolTipButtonY, iY ) || needsRelayout; + needsRelayout = _SetTooltip( eToolTipButtonLT, iLT ) || needsRelayout; + needsRelayout = _SetTooltip( eToolTipButtonRT, iRT ) || needsRelayout; + needsRelayout = _SetTooltip( eToolTipButtonLB, iLB ) || needsRelayout; + needsRelayout = _SetTooltip( eToolTipButtonRB, iRB ) || needsRelayout; + needsRelayout = _SetTooltip( eToolTipButtonLS, iLS ) || needsRelayout; + + if(needsRelayout)_Relayout(); +} + +void UIComponent_Tooltips::EnableTooltip( unsigned int tooltip, bool enable ) +{ +} + +bool UIComponent_Tooltips::_SetTooltip(unsigned int iToolTip, int iTextID) +{ + bool changed = false; + if(iTextID != m_tooltipValues[iToolTip].iString || (iTextID > -1 && !m_tooltipValues[iToolTip].show)) + { + m_tooltipValues[iToolTip].iString = iTextID; + changed = true; + if(iTextID > -1) _SetTooltip(iToolTip, app.GetString(iTextID), true); + else if(iTextID == -2) _SetTooltip(iToolTip, L"", true); + else _SetTooltip(iToolTip, L"", false); + } + return changed; +} + +void UIComponent_Tooltips::_SetTooltip(unsigned int iToolTipId, const wstring &label, bool show, bool force) +{ + if(!force && !show && !m_tooltipValues[iToolTipId].show) + { + return; + } + m_tooltipValues[iToolTipId].show = show; + + IggyDataValue result; + IggyDataValue value[3]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = iToolTipId; + + value[1].type = IGGY_DATATYPE_string_UTF16; + IggyStringUTF16 stringVal; + + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[1].string16 = stringVal; + + value[2].type = IGGY_DATATYPE_boolean; + value[2].boolval = show; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetTooltip , 3 , value ); + + app.DebugPrintf("Actual tooltip update!\n"); +} + +void UIComponent_Tooltips::_Relayout() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcUpdateLayout, 0 , NULL ); + +#ifdef __PSVITA__ + // rebuild touchboxes + ui.TouchBoxRebuild(this); +#endif +} + +#ifdef __PSVITA__ +void UIComponent_Tooltips::handleTouchInput(unsigned int iPad, S32 x, S32 y, int iId, bool bPressed, bool bRepeat, bool bReleased) +{ + //app.DebugPrintf("ToolTip Touch ID = %i\n", iId); + bool handled = false; + + // perform action on release + if(bReleased) + { + switch(iId) + { + case ETouchInput_Touch_A: + app.DebugPrintf("ToolTip Map Touch to _PSV_JOY_BUTTON_X\n", iId); + InputManager.MapTouchInput(iPad, _PSV_JOY_BUTTON_X); + break; + case ETouchInput_Touch_B: + app.DebugPrintf("ToolTip Map Touch to _PSV_JOY_BUTTON_O\n", iId); + InputManager.MapTouchInput(iPad, _PSV_JOY_BUTTON_O); + break; + case ETouchInput_Touch_X: + app.DebugPrintf("ToolTip Map Touch to _PSV_JOY_BUTTON_SQUARE\n", iId); + InputManager.MapTouchInput(iPad, _PSV_JOY_BUTTON_SQUARE); + break; + case ETouchInput_Touch_Y: + app.DebugPrintf("ToolTip Map Touch to _PSV_JOY_BUTTON_TRIANGLE\n", iId); + InputManager.MapTouchInput(iPad, _PSV_JOY_BUTTON_TRIANGLE); + break; + case ETouchInput_Touch_LT: + /* not in use on vita */ + app.DebugPrintf("ToolTip no action\n", iId); + break; + case ETouchInput_Touch_RightTrigger: + app.DebugPrintf("ToolTip Map Touch to _PSV_JOY_BUTTON_SELECT\n", iId); + InputManager.MapTouchInput(iPad, _PSV_JOY_BUTTON_SELECT); + break; + case ETouchInput_Touch_LeftBumper: + app.DebugPrintf("ToolTip Map Touch to _PSV_JOY_BUTTON_L1\n", iId); + InputManager.MapTouchInput(iPad, _PSV_JOY_BUTTON_L1); + break; + case ETouchInput_Touch_RightBumper: + app.DebugPrintf("ToolTip Map Touch to _PSV_JOY_BUTTON_R1\n", iId); + InputManager.MapTouchInput(iPad, _PSV_JOY_BUTTON_R1); + break; + case ETouchInput_Touch_LeftStick: + app.DebugPrintf("ToolTip no action\n", iId); + /* no action */ + break; + } + } +} +#endif + +void UIComponent_Tooltips::handleReload() +{ + app.DebugPrintf("UIComponent_Tooltips::handleReload\n"); + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + if(InputManager.IsCircleCrossSwapped()) + { + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = true; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetABSwap , 1 , value ); + } +#endif + + for(unsigned int i = 0; i < eToolTipNumButtons; ++i) + { + _SetTooltip(i,app.GetString(m_tooltipValues[i].iString), m_tooltipValues[i].show, true); + } + _Relayout(); +} + +void UIComponent_Tooltips::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if(m_overrideSFX[iPad][key]) + { + // don't play a sound for this action + switch(key) + { + case ACTION_MENU_A: + case ACTION_MENU_OK: + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + case ACTION_MENU_X: + case ACTION_MENU_Y: + case ACTION_MENU_B: + case ACTION_MENU_CANCEL: + case ACTION_MENU_LEFT_SCROLL: + case ACTION_MENU_RIGHT_SCROLL: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } + } + else + { + switch(key) + { + case ACTION_MENU_OK: + case ACTION_MENU_CANCEL: + // 4J-PB - We get both A and OK, and B and Cancel, so only play a sound on one of them. + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_A: + case ACTION_MENU_X: + case ACTION_MENU_Y: + // 4J-PB - play a Press sound + //CD - Removed, causes a sound on all presses + /*if(pressed) + { + ui.PlayUISFX(eSFX_Press); + }*/ + sendInputToMovie(key, repeat, pressed, released); + break; + + case ACTION_MENU_B: + // 4J-PB - play a Press sound + //CD - Removed, causes a sound on all presses + /*if(pressed) + { + ui.PlayUISFX(eSFX_Back); + }*/ + sendInputToMovie(key, repeat, pressed, released); + break; + + case ACTION_MENU_LEFT_SCROLL: + case ACTION_MENU_RIGHT_SCROLL: + //CD - Removed, causes a sound on all presses + /*if(pressed) + { + ui.PlayUISFX(eSFX_Scroll); + }*/ + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } + } +} + +void UIComponent_Tooltips::overrideSFX(int iPad, int key, bool bVal) +{ + m_overrideSFX[iPad][key]=bVal; +} diff --git a/Minecraft.Client/Common/UI/UIComponent_Tooltips.h b/Minecraft.Client/Common/UI/UIComponent_Tooltips.h new file mode 100644 index 00000000..4b4c8268 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_Tooltips.h @@ -0,0 +1,110 @@ +#pragma once + +#include "UIScene.h" + +class UIComponent_Tooltips : public UIScene +{ +private: + bool m_bSplitscreen; + +protected: + typedef struct _TooltipValues + { + bool show; + int iString; + + _TooltipValues() + { + show = false; + iString = -1; + } + } TooltipValues; + + TooltipValues m_tooltipValues[eToolTipNumButtons]; + + IggyName m_funcSetTooltip, m_funcSetOpacity, m_funcSetABSwap, m_funcUpdateLayout; + +#ifdef __PSVITA__ + enum ETouchInput + { + ETouchInput_Touch_A, + ETouchInput_Touch_B, + ETouchInput_Touch_X, + ETouchInput_Touch_Y, + ETouchInput_Touch_LT, + ETouchInput_Touch_RightTrigger, + ETouchInput_Touch_LeftBumper, + ETouchInput_Touch_RightBumper, + ETouchInput_Touch_LeftStick, + + ETouchInput_Count, + }; + UIControl_Touch m_TouchController[ETouchInput_Count]; +#endif + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) +#ifdef __PSVITA__ + UI_MAP_ELEMENT( m_TouchController[ETouchInput_Touch_A], "Touch_A") + UI_MAP_ELEMENT( m_TouchController[ETouchInput_Touch_B], "Touch_B") + UI_MAP_ELEMENT( m_TouchController[ETouchInput_Touch_X], "Touch_X") + UI_MAP_ELEMENT( m_TouchController[ETouchInput_Touch_Y], "Touch_Y") + UI_MAP_ELEMENT( m_TouchController[ETouchInput_Touch_LT], "Touch_LT") + UI_MAP_ELEMENT( m_TouchController[ETouchInput_Touch_RightTrigger], "Touch_RightTrigger") + UI_MAP_ELEMENT( m_TouchController[ETouchInput_Touch_LeftBumper], "Touch_LeftBumper") + UI_MAP_ELEMENT( m_TouchController[ETouchInput_Touch_RightBumper], "Touch_RightBumper") + UI_MAP_ELEMENT( m_TouchController[ETouchInput_Touch_LeftStick], "Touch_LeftStick") +#endif + UI_MAP_NAME( m_funcSetTooltip, L"SetToolTip") + UI_MAP_NAME( m_funcSetOpacity, L"SetOpacity") + UI_MAP_NAME( m_funcSetABSwap, L"SetABSwap") + UI_MAP_NAME( m_funcUpdateLayout, L"UpdateLayout") + UI_END_MAP_ELEMENTS_AND_NAMES() + + virtual wstring getMoviePath(); + + virtual F64 getSafeZoneHalfWidth(); + +public: + UIComponent_Tooltips(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIComponent_Tooltips;} + + // Returns true if this scene handles input + virtual bool stealsFocus() { return false; } + + // Returns true if this scene has focus for the pad passed in + virtual bool hasFocus(int iPad) { return false; } + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return false; } + + virtual void updateSafeZone(); + + virtual void tick(); + + // RENDERING + virtual void render(S32 width, S32 height, C4JRender::eViewportType viewport); + + virtual void SetTooltipText( unsigned int tooltip, int iTextID ); + virtual void SetEnableTooltips( bool bVal ); + virtual void ShowTooltip( unsigned int tooltip, bool show ); + virtual void SetTooltips( int iA, int iB=-1, int iX=-1, int iY=-1 , int iLT=-1, int iRT=-1, int iLB=-1, int iRB=-1, int iLS=-1, bool forceUpdate = false); + virtual void EnableTooltip( unsigned int tooltip, bool enable ); + + virtual void handleReload(); + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + void overrideSFX(int iPad, int key, bool bVal); + + +private: + bool _SetTooltip(unsigned int iToolTip, int iTextID); + void _SetTooltip(unsigned int iToolTipId, const wstring &label, bool show, bool force = false); + void _Relayout(); + + bool m_overrideSFX[XUSER_MAX_COUNT][ACTION_MAX_MENU]; + +#ifdef __PSVITA__ + virtual void handleTouchInput(unsigned int iPad, S32 x, S32 y, int iId, bool bPressed, bool bRepeat, bool bReleased); +#endif +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.cpp b/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.cpp new file mode 100644 index 00000000..858a8b43 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.cpp @@ -0,0 +1,539 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIComponent_TutorialPopup.h" +#include "..\..\Common\Tutorial\Tutorial.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\Minecraft.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" + +UIComponent_TutorialPopup::UIComponent_TutorialPopup(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_interactScene = NULL; + m_lastInteractSceneMoved = NULL; + m_lastSceneMovedLeft = false; + m_bAllowFade = false; + m_iconItem = nullptr; + m_iconIsFoil = false; + + m_bContainerMenuVisible = false; + m_bSplitscreenGamertagVisible = false; + + m_labelDescription.init(L""); +} + +wstring UIComponent_TutorialPopup::getMoviePath() +{ + switch( m_parentLayer->getViewport() ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + return L"TutorialPopupSplit"; + break; + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + default: + return L"TutorialPopup"; + break; + } +} + +void UIComponent_TutorialPopup::UpdateTutorialPopup() +{ + // has the Splitscreen Gamertag visibility been changed? Re-Adjust Layout to prevent overlaps! + if(m_bSplitscreenGamertagVisible != (bool)(app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_DisplaySplitscreenGamertags) != 0)) + { + m_bSplitscreenGamertagVisible = (bool)(app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_DisplaySplitscreenGamertags) != 0); + handleReload(); + } +} + +void UIComponent_TutorialPopup::handleReload() +{ + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = (bool)((app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_DisplaySplitscreenGamertags)!=0) && !m_bContainerMenuVisible); // 4J - TomK - Offset for splitscreen gamertag? + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcAdjustLayout, 1 , value ); +} + +void UIComponent_TutorialPopup::SetTutorialDescription(TutorialPopupInfo *info) +{ + m_interactScene = info->interactScene; + + wstring parsed = _SetIcon(info->icon, info->iAuxVal, info->isFoil, info->desc); + parsed = _SetImage( parsed ); + parsed = ParseDescription(m_iPad, parsed); + + if(parsed.empty()) + { + _SetDescription( info->interactScene, L"", L"", info->allowFade, info->isReminder ); + } + else + { + _SetDescription( info->interactScene, parsed, info->title, info->allowFade, info->isReminder ); + } +} + +void UIComponent_TutorialPopup::RemoveInteractSceneReference(UIScene *scene) +{ + if( m_interactScene == scene ) + { + m_interactScene = NULL; + } +} + +void UIComponent_TutorialPopup::SetVisible(bool visible) +{ + m_parentLayer->showComponent(0,eUIComponent_TutorialPopup,visible); + + if( visible && m_bAllowFade ) + { + //Initialise a timer to fade us out again + app.DebugPrintf("UIComponent_TutorialPopup::SetVisible: setting TUTORIAL_POPUP_FADE_TIMER_ID to %d\n",m_tutorial->GetTutorialDisplayMessageTime()); + addTimer(TUTORIAL_POPUP_FADE_TIMER_ID,m_tutorial->GetTutorialDisplayMessageTime()); + } +} + +bool UIComponent_TutorialPopup::IsVisible() +{ + return m_parentLayer->isComponentVisible(eUIComponent_TutorialPopup); +} + +void UIComponent_TutorialPopup::handleTimerComplete(int id) +{ + switch(id) + { + case TUTORIAL_POPUP_FADE_TIMER_ID: + SetVisible(false); + killTimer(id); + app.DebugPrintf("handleTimerComplete: setting TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID\n"); + addTimer(TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID,TUTORIAL_POPUP_MOVE_SCENE_TIME); + break; + case TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID: + UpdateInteractScenePosition(IsVisible()); + killTimer(id); + break; + } +} + +void UIComponent_TutorialPopup::_SetDescription(UIScene *interactScene, const wstring &desc, const wstring &title, bool allowFade, bool isReminder) +{ + m_interactScene = interactScene; + app.DebugPrintf("Setting m_interactScene to %08x\n", m_interactScene); + if( interactScene != m_lastInteractSceneMoved ) m_lastInteractSceneMoved = NULL; + if(desc.empty()) + { + SetVisible( false ); + app.DebugPrintf("_SetDescription1: setting TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID\n"); + addTimer(TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID,TUTORIAL_POPUP_MOVE_SCENE_TIME); + killTimer(TUTORIAL_POPUP_FADE_TIMER_ID); + } + else + { + SetVisible( true ); + app.DebugPrintf("_SetDescription2: setting TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID\n"); + addTimer(TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID,TUTORIAL_POPUP_MOVE_SCENE_TIME); + + if( allowFade ) + { + //Initialise a timer to fade us out again + app.DebugPrintf("_SetDescription: setting TUTORIAL_POPUP_FADE_TIMER_ID\n"); + addTimer(TUTORIAL_POPUP_FADE_TIMER_ID,m_tutorial->GetTutorialDisplayMessageTime()); + } + else + { + app.DebugPrintf("_SetDescription: killing TUTORIAL_POPUP_FADE_TIMER_ID\n"); + killTimer(TUTORIAL_POPUP_FADE_TIMER_ID); + } + m_bAllowFade = allowFade; + + if(isReminder) + { + wstring text(app.GetString( IDS_TUTORIAL_REMINDER )); + text.append( desc ); + stripWhitespaceForHtml( text ); + // set the text colour + wchar_t formatting[40]; + // 4J Stu - Don't set HTML font size, that's set at design time in flash + //swprintf(formatting, 40, L"",app.GetHTMLColour(eHTMLColor_White),m_textFontSize); + swprintf(formatting, 40, L"",app.GetHTMLColour(eHTMLColor_White)); + text = formatting + text; + + m_labelDescription.setLabel( text, true ); + } + else + { + wstring text(desc); + stripWhitespaceForHtml( text ); + // set the text colour + wchar_t formatting[40]; + // 4J Stu - Don't set HTML font size, that's set at design time in flash + //swprintf(formatting, 40, L"",app.GetHTMLColour(eHTMLColor_White),m_textFontSize); + swprintf(formatting, 40, L"",app.GetHTMLColour(eHTMLColor_White)); + text = formatting + text; + + m_labelDescription.setLabel( text, true ); + + } + + m_labelTitle.setLabel( title, true ); + m_labelTitle.setVisible(!title.empty()); + + + // read host setting if gamertag is visible or not and pass on to Adjust Layout function (so we can offset it to stay clear of the gamertag) + m_bSplitscreenGamertagVisible = (bool)(app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_DisplaySplitscreenGamertags)!=0); + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = (m_bSplitscreenGamertagVisible && !m_bContainerMenuVisible); // 4J - TomK - Offset for splitscreen gamertag? + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcAdjustLayout, 1 , value ); + } +} + +wstring UIComponent_TutorialPopup::_SetIcon(int icon, int iAuxVal, bool isFoil, LPCWSTR desc) +{ + wstring temp(desc); + + bool isFixedIcon = false; + + m_iconIsFoil = isFoil; + if( icon != TUTORIAL_NO_ICON ) + { + m_iconIsFoil = false; + m_iconItem = shared_ptr(new ItemInstance(icon,1,iAuxVal)); + } + else + { + m_iconItem = nullptr; + wstring openTag(L"{*ICON*}"); + wstring closeTag(L"{*/ICON*}"); + int iconTagStartPos = (int)temp.find(openTag); + int iconStartPos = iconTagStartPos + (int)openTag.length(); + if( iconTagStartPos > 0 && iconStartPos < (int)temp.length() ) + { + int iconEndPos = (int)temp.find( closeTag, iconStartPos ); + + if(iconEndPos > iconStartPos && iconEndPos < (int)temp.length() ) + { + wstring id = temp.substr(iconStartPos, iconEndPos - iconStartPos); + + vector idAndAux = stringSplit(id,L':'); + + int iconId = _fromString(idAndAux[0]); + + if(idAndAux.size() > 1) + { + iAuxVal = _fromString(idAndAux[1]); + } + else + { + iAuxVal = 0; + } + m_iconItem = shared_ptr(new ItemInstance(iconId,1,iAuxVal)); + + temp.replace(iconTagStartPos, iconEndPos - iconTagStartPos + closeTag.length(), L""); + } + } + + // remove any icon text + else if(temp.find(L"{*CraftingTableIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Tile::workBench_Id,1,0)); + } + else if(temp.find(L"{*SticksIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Item::stick_Id,1,0)); + } + else if(temp.find(L"{*PlanksIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Tile::wood_Id,1,0)); + } + else if(temp.find(L"{*WoodenShovelIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Item::shovel_wood_Id,1,0)); + } + else if(temp.find(L"{*WoodenHatchetIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Item::hatchet_wood_Id,1,0)); + } + else if(temp.find(L"{*WoodenPickaxeIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Item::pickAxe_wood_Id,1,0)); + } + else if(temp.find(L"{*FurnaceIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Tile::furnace_Id,1,0)); + } + else if(temp.find(L"{*WoodenDoorIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Item::door_wood,1,0)); + } + else if(temp.find(L"{*TorchIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Tile::torch_Id,1,0)); + } + else if(temp.find(L"{*BoatIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Item::boat_Id,1,0)); + } + else if(temp.find(L"{*FishingRodIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Item::fishingRod_Id,1,0)); + } + else if(temp.find(L"{*FishIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Item::fish_raw_Id,1,0)); + } + else if(temp.find(L"{*MinecartIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Item::minecart_Id,1,0)); + } + else if(temp.find(L"{*RailIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Tile::rail_Id,1,0)); + } + else if(temp.find(L"{*PoweredRailIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Tile::goldenRail_Id,1,0)); + } + else if(temp.find(L"{*StructuresIcon*}")!=wstring::npos) + { + isFixedIcon = true; + setupIconHolder(e_ICON_TYPE_STRUCTURES); + } + else if(temp.find(L"{*ToolsIcon*}")!=wstring::npos) + { + isFixedIcon = true; + setupIconHolder(e_ICON_TYPE_TOOLS); + } + else if(temp.find(L"{*StoneIcon*}")!=wstring::npos) + { + m_iconItem = shared_ptr(new ItemInstance(Tile::rock_Id,1,0)); + } + else + { + m_iconItem = nullptr; + } + } + if(!isFixedIcon && m_iconItem != NULL) setupIconHolder(e_ICON_TYPE_IGGY); + m_controlIconHolder.setVisible( isFixedIcon || m_iconItem != NULL); + + return temp; +} + +wstring UIComponent_TutorialPopup::_SetImage(wstring &desc) +{ + // 4J Stu - Unused +#if 0 + BOOL imageShowAtStart = m_image.IsShown(); + + wstring openTag(L"{*IMAGE*}"); + wstring closeTag(L"{*/IMAGE*}"); + int imageTagStartPos = (int)desc.find(openTag); + int imageStartPos = imageTagStartPos + (int)openTag.length(); + if( imageTagStartPos > 0 && imageStartPos < (int)desc.length() ) + { + int imageEndPos = (int)desc.find( closeTag, imageStartPos ); + + if(imageEndPos > imageStartPos && imageEndPos < (int)desc.length() ) + { + wstring id = desc.substr(imageStartPos, imageEndPos - imageStartPos); + m_image.SetImagePath( id.c_str() ); + m_image.SetShow( TRUE ); + + desc.replace(imageTagStartPos, imageEndPos - imageTagStartPos + closeTag.length(), L""); + } + } + else + { + // hide the icon slot + m_image.SetShow( FALSE ); + } + + BOOL imageShowAtEnd = m_image.IsShown(); + if(imageShowAtStart != imageShowAtEnd) + { + float fHeight, fWidth, fIconHeight, fDescHeight, fDescWidth; + m_image.GetBounds(&fWidth,&fIconHeight); + GetBounds(&fWidth,&fHeight); + + + // 4J Stu - For some reason when we resize the scene it resets the size of the HTML control + // We don't want that to happen, so get it's size before and set it back after + m_description.GetBounds(&fDescWidth,&fDescHeight); + if(imageShowAtEnd) + { + SetBounds(fWidth, fHeight + fIconHeight); + } + else + { + SetBounds(fWidth, fHeight - fIconHeight); + } + m_description.SetBounds(fDescWidth, fDescHeight); + } +#endif + return desc; +} + + +wstring UIComponent_TutorialPopup::ParseDescription(int iPad, wstring &text) +{ + text = replaceAll(text, L"{*CraftingTableIcon*}", L""); + text = replaceAll(text, L"{*SticksIcon*}", L""); + text = replaceAll(text, L"{*PlanksIcon*}", L""); + text = replaceAll(text, L"{*WoodenShovelIcon*}", L""); + text = replaceAll(text, L"{*WoodenHatchetIcon*}", L""); + text = replaceAll(text, L"{*WoodenPickaxeIcon*}", L""); + text = replaceAll(text, L"{*FurnaceIcon*}", L""); + text = replaceAll(text, L"{*WoodenDoorIcon*}", L""); + text = replaceAll(text, L"{*TorchIcon*}", L""); + text = replaceAll(text, L"{*MinecartIcon*}", L""); + text = replaceAll(text, L"{*BoatIcon*}", L""); + text = replaceAll(text, L"{*FishingRodIcon*}", L""); + text = replaceAll(text, L"{*FishIcon*}", L""); + text = replaceAll(text, L"{*RailIcon*}", L""); + text = replaceAll(text, L"{*PoweredRailIcon*}", L""); + text = replaceAll(text, L"{*StructuresIcon*}", L""); + text = replaceAll(text, L"{*ToolsIcon*}", L""); + text = replaceAll(text, L"{*StoneIcon*}", L""); + + bool exitScreenshot = false; + size_t pos = text.find(L"{*EXIT_PICTURE*}"); + if(pos != wstring::npos) exitScreenshot = true; + text = replaceAll(text, L"{*EXIT_PICTURE*}", L""); + m_controlExitScreenshot.setVisible(exitScreenshot); + /* +#define MINECRAFT_ACTION_RENDER_DEBUG ACTION_INGAME_13 +#define MINECRAFT_ACTION_PAUSEMENU ACTION_INGAME_15 +#define MINECRAFT_ACTION_SNEAK_TOGGLE ACTION_INGAME_17 + */ + + return app.FormatHTMLString(iPad,text); +} + +void UIComponent_TutorialPopup::UpdateInteractScenePosition(bool visible) +{ + if( m_interactScene == NULL ) return; + + // 4J-PB - check this players screen section to see if we should allow the animation + bool bAllowAnim=false; + bool isCraftingScene = (m_interactScene->getSceneType() == eUIScene_Crafting2x2Menu) || (m_interactScene->getSceneType() == eUIScene_Crafting3x3Menu); + bool isCreativeScene = (m_interactScene->getSceneType() == eUIScene_CreativeMenu); + switch(Minecraft::GetInstance()->localplayers[m_iPad]->m_iScreenSection) + { + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + bAllowAnim=true; + break; + default: + // anim allowed for everything except the crafting 2x2 and 3x3, and the creative menu + if(!isCraftingScene && !isCreativeScene) + { + bAllowAnim=true; + } + break; + } + + if(bAllowAnim) + { + bool movingLeft = visible; + + if( (m_lastInteractSceneMoved != m_interactScene && movingLeft) || ( m_lastInteractSceneMoved == m_interactScene && m_lastSceneMovedLeft != movingLeft ) ) + { + if(movingLeft) + { + m_interactScene->slideLeft(); + } + else + { + m_interactScene->slideRight(); + } + + m_lastInteractSceneMoved = m_interactScene; + m_lastSceneMovedLeft = movingLeft; + } + } + +} + +void UIComponent_TutorialPopup::render(S32 width, S32 height, C4JRender::eViewportType viewport) +{ + if(viewport != C4JRender::VIEWPORT_TYPE_FULLSCREEN) + { + S32 xPos = 0; + S32 yPos = 0; + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + xPos = (S32)(ui.getScreenWidth() / 2); + yPos = (S32)(ui.getScreenHeight() / 2); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + yPos = (S32)(ui.getScreenHeight() / 2); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + xPos = (S32)(ui.getScreenWidth() / 2); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + xPos = (S32)(ui.getScreenWidth() / 2); + yPos = (S32)(ui.getScreenHeight() / 2); + break; + } + //Adjust for safezone + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + yPos += getSafeZoneHalfHeight(); + break; + } + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + xPos -= getSafeZoneHalfWidth(); + break; + } + ui.setupRenderPosition(xPos, yPos); + + IggyPlayerSetDisplaySize( getMovie(), width, height ); + IggyPlayerDraw( getMovie() ); + } + else + { + UIScene::render(width, height, viewport); + } +} + +void UIComponent_TutorialPopup::customDraw(IggyCustomDrawCallbackRegion *region) +{ + if(m_iconItem != NULL) customDrawSlotControl(region,m_iPad,m_iconItem,1.0f,m_iconItem->isFoil() || m_iconIsFoil,false); +} + +void UIComponent_TutorialPopup::setupIconHolder(EIcons icon) +{ + app.DebugPrintf("Setting icon holder to %d\n", icon); + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = (F64)icon; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetupIconHolder , 1 , value ); +} diff --git a/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.h b/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.h new file mode 100644 index 00000000..36f78300 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.h @@ -0,0 +1,101 @@ +#pragma once + +#include "UIScene.h" + +#define TUTORIAL_POPUP_FADE_TIMER_ID 0 +#define TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID 1 +#define TUTORIAL_POPUP_MOVE_SCENE_TIME 500 + + +class UIComponent_TutorialPopup : public UIScene +{ +private: + // A scene that may be displayed behind the popup that the player is using, that will need shifted so we can see it clearly. + UIScene *m_interactScene, *m_lastInteractSceneMoved; + bool m_lastSceneMovedLeft; + bool m_bAllowFade; + Tutorial *m_tutorial; + shared_ptr m_iconItem; + bool m_iconIsFoil; + //int m_iLocalPlayerC; + + bool m_bContainerMenuVisible; + bool m_bSplitscreenGamertagVisible; + + // Maps to values in AS + enum EIcons + { + e_ICON_TYPE_IGGY = 0, + e_ICON_TYPE_ARMOUR = 1, + e_ICON_TYPE_BREWING = 2, + e_ICON_TYPE_DECORATION = 3, + e_ICON_TYPE_FOOD = 4, + e_ICON_TYPE_MATERIALS = 5, + e_ICON_TYPE_MECHANISMS = 6, + e_ICON_TYPE_MISC = 7, + e_ICON_TYPE_REDSTONE_AND_TRANSPORT = 8, + e_ICON_TYPE_STRUCTURES = 9, + e_ICON_TYPE_TOOLS = 10, + e_ICON_TYPE_TRANSPORT = 11, + }; + +public: + UIComponent_TutorialPopup(int iPad, void *initData, UILayer *parentLayer); + +protected: + UIControl_Label m_labelDescription, m_labelTitle; + UIControl m_controlIconHolder; + UIControl m_controlExitScreenshot; + IggyName m_funcAdjustLayout, m_funcSetupIconHolder; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_labelTitle, "Title") + UI_MAP_ELEMENT( m_labelDescription, "Description") + UI_MAP_ELEMENT( m_controlIconHolder, "IconHolder") + UI_MAP_ELEMENT( m_controlExitScreenshot, "ExitScreenShot") + + UI_MAP_NAME( m_funcAdjustLayout, L"AdjustLayout") + UI_MAP_NAME( m_funcSetupIconHolder, L"SetupIconHolder") + UI_END_MAP_ELEMENTS_AND_NAMES() + + virtual wstring getMoviePath(); + +public: + virtual EUIScene getSceneType() { return eUIComponent_TutorialPopup;} + + // Returns true if this scene handles input + virtual bool stealsFocus() { return false; } + + // Returns true if this scene has focus for the pad passed in + virtual bool hasFocus(int iPad) { return false; } + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return false; } + + virtual void handleReload(); + + void SetContainerMenuVisible(bool bContainerMenuVisible) { m_bContainerMenuVisible = bContainerMenuVisible; } + void UpdateTutorialPopup(); + + void SetTutorial( Tutorial *tutorial ) { m_tutorial = tutorial; } + void SetTutorialDescription(TutorialPopupInfo *info); + void RemoveInteractSceneReference(UIScene *scene); + void SetVisible(bool visible); + bool IsVisible(); + + // RENDERING + virtual void render(S32 width, S32 height, C4JRender::eViewportType viewport); + + virtual void customDraw(IggyCustomDrawCallbackRegion *region); + +protected: + void handleTimerComplete(int id); + +private: + void _SetDescription(UIScene *interactScene, const wstring &desc, const wstring &title, bool allowFade, bool isReminder); + wstring _SetIcon(int icon, int iAuxVal, bool isFoil, LPCWSTR desc); + wstring _SetImage(wstring &desc); + wstring ParseDescription(int iPad, wstring &text); + void UpdateInteractScenePosition(bool visible); + + void setupIconHolder(EIcons icon); +}; diff --git a/Minecraft.Client/Common/UI/UIControl.cpp b/Minecraft.Client/Common/UI/UIControl.cpp new file mode 100644 index 00000000..ec2e13d8 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl.cpp @@ -0,0 +1,153 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\JavaMath.h" + +UIControl::UIControl() +{ + m_parentScene = NULL; + m_lastOpacity = 1.0f; + m_controlName = ""; + m_isVisible = true; + m_bHidden = false; + m_eControlType = eNoControl; +} + +bool UIControl::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + m_parentScene = scene; + m_controlName = controlName; + + rrbool res = IggyValuePathMakeNameRef ( &m_iggyPath , parent , controlName.c_str() ); + + m_nameXPos = registerFastName(L"x"); + m_nameYPos = registerFastName(L"y"); + m_nameWidth = registerFastName(L"width"); + m_nameHeight = registerFastName(L"height"); + m_funcSetAlpha = registerFastName(L"SetControlAlpha"); + m_nameVisible = registerFastName(L"visible"); + + F64 fx, fy, fwidth, fheight; + IggyValueGetF64RS( getIggyValuePath() , m_nameXPos , NULL , &fx ); + IggyValueGetF64RS( getIggyValuePath() , m_nameYPos , NULL , &fy ); + IggyValueGetF64RS( getIggyValuePath() , m_nameWidth , NULL , &fwidth ); + IggyValueGetF64RS( getIggyValuePath() , m_nameHeight , NULL , &fheight ); + + m_x = (S32)fx; + m_y = (S32)fy; + m_width = (S32)Math::round(fwidth); + m_height = (S32)Math::round(fheight); + + return res; +} + +#ifdef __PSVITA__ +void UIControl::UpdateControl() +{ + F64 fx, fy, fwidth, fheight; + IggyValueGetF64RS( getIggyValuePath() , m_nameXPos , NULL , &fx ); + IggyValueGetF64RS( getIggyValuePath() , m_nameYPos , NULL , &fy ); + IggyValueGetF64RS( getIggyValuePath() , m_nameWidth , NULL , &fwidth ); + IggyValueGetF64RS( getIggyValuePath() , m_nameHeight , NULL , &fheight ); + m_x = (S32)fx; + m_y = (S32)fy; + m_width = (S32)Math::round(fwidth); + m_height = (S32)Math::round(fheight); +} +#endif // __PSVITA__ + +void UIControl::ReInit() +{ + if(m_lastOpacity != 1.0f) + { + IggyDataValue result; + IggyDataValue value[2]; + IggyStringUTF8 stringVal; + + stringVal.string = (char *)m_controlName.c_str(); + stringVal.length = m_controlName.length(); + value[0].type = IGGY_DATATYPE_string_UTF8; + value[0].string8 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = m_lastOpacity; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, m_parentScene->m_rootPath , m_funcSetAlpha , 2 , value ); + } + + IggyValueSetBooleanRS( getIggyValuePath(), m_nameVisible, NULL, m_isVisible ); +} + +IggyValuePath *UIControl::getIggyValuePath() +{ + return &m_iggyPath; +} + +S32 UIControl::getXPos() +{ + return m_x; +} + +S32 UIControl::getYPos() +{ + return m_y; +} + +S32 UIControl::getWidth() +{ + return m_width; +} + +S32 UIControl::getHeight() +{ + return m_height; +} + +void UIControl::setOpacity(float percent) +{ + if(percent != m_lastOpacity) + { + m_lastOpacity = percent; + + IggyDataValue result; + IggyDataValue value[2]; + IggyStringUTF8 stringVal; + + stringVal.string = (char *)m_controlName.c_str(); + stringVal.length = m_controlName.length(); + value[0].type = IGGY_DATATYPE_string_UTF8; + value[0].string8 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = m_lastOpacity; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, m_parentScene->m_rootPath , m_funcSetAlpha , 2 , value ); + } +} + +void UIControl::setVisible(bool visible) +{ + if(visible != m_isVisible) + { + rrbool succ = IggyValueSetBooleanRS( getIggyValuePath(), m_nameVisible, NULL, visible ); + if(succ) m_isVisible = visible; + else app.DebugPrintf("Failed to set visibility for control\n"); + } +} + +bool UIControl::getVisible() +{ + rrbool bVisible = false; + + IggyResult result = IggyValueGetBooleanRS ( getIggyValuePath() , m_nameVisible, NULL, &bVisible ); + + m_isVisible = bVisible; + + return bVisible; +} + +IggyName UIControl::registerFastName(const wstring &name) +{ + return m_parentScene->registerFastName(name); +} diff --git a/Minecraft.Client/Common/UI/UIControl.h b/Minecraft.Client/Common/UI/UIControl.h new file mode 100644 index 00000000..3b4ef050 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl.h @@ -0,0 +1,92 @@ +#pragma once + +// This class for any name object in the flash scene +class UIControl +{ + +public: + enum eUIControlType + { + eNoControl, + eButton, + eButtonList, + eCheckBox, + eCursor, + eDLCList, + eDynamicLabel, + eEnchantmentBook, + eEnchantmentButton, + eHTMLLabel, + eLabel, + eLeaderboardList, + eMinecraftPlayer, + ePlayerList, + ePlayerSkinPreview, + eProgress, + eSaveList, + eSlider, + eSlotList, + eTextInput, + eTexturePackList, + eBitmapIcon, + eTouchControl, + }; +protected: + eUIControlType m_eControlType; + int m_id; + bool m_bHidden; // set by the Remove call + +public: + + void setControlType(eUIControlType eType) {m_eControlType=eType;} + eUIControlType getControlType() {return m_eControlType;} + void setId(int iID) { m_id=iID; } + int getId() { return m_id; } + UIScene * getParentScene() {return m_parentScene;} + +protected: + IggyValuePath m_iggyPath; + UIScene *m_parentScene; + string m_controlName; + + IggyName m_nameXPos, m_nameYPos, m_nameWidth, m_nameHeight; + IggyName m_funcSetAlpha, m_nameVisible; + + S32 m_x,m_y,m_width,m_height; + float m_lastOpacity; + bool m_isVisible; + +public: + UIControl(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); +#ifdef __PSVITA__ + void UpdateControl(); + void setHidden(bool bHidden) {m_bHidden=bHidden;} + bool getHidden(void) {return m_bHidden;} +#endif + + IggyValuePath *getIggyValuePath(); + + string getControlName() { return m_controlName; } + + virtual void tick() {} + virtual void ReInit(); + + virtual void setFocus(bool focus) {} + + S32 getXPos(); + S32 getYPos(); + S32 getWidth(); + S32 getHeight(); + + void setOpacity(float percent); + void setVisible(bool visible); + bool getVisible(); + bool isVisible() { return m_isVisible; } + + virtual bool hasFocus() { return false; } + +protected: + IggyName registerFastName(const wstring &name); +}; diff --git a/Minecraft.Client/Common/UI/UIControl_Base.cpp b/Minecraft.Client/Common/UI/UIControl_Base.cpp new file mode 100644 index 00000000..18af2f63 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Base.cpp @@ -0,0 +1,112 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\JavaMath.h" + +UIControl_Base::UIControl_Base() +{ + m_bLabelChanged = false; + m_label = L""; + m_id = 0; +} + +bool UIControl_Base::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + bool success = UIControl::setupControl(scene,parent,controlName); + + m_setLabelFunc = registerFastName(L"SetLabel"); + m_initFunc = registerFastName(L"Init"); + m_funcGetLabel = registerFastName(L"GetLabel"); + m_funcCheckLabelWidths = registerFastName(L"CheckLabelWidths"); + + return success; +} + +void UIControl_Base::tick() +{ + UIControl::tick(); + + if(m_bLabelChanged) + { + //app.DebugPrintf("Calling SetLabel - '%ls'\n", m_label.c_str()); + m_bLabelChanged = false; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_string_UTF16; + IggyStringUTF16 stringVal; + + stringVal.string = (IggyUTF16*)m_label.c_str(); + stringVal.length = m_label.length(); + value[0].string16 = stringVal; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_setLabelFunc , 1 , value ); + } +} + +void UIControl_Base::setLabel(const wstring &label, bool instant, bool force) +{ + if( force || ((!m_label.empty() || !label.empty()) && m_label.compare(label) != 0) ) m_bLabelChanged = true; + m_label = label; + + if(m_bLabelChanged && instant) + { + m_bLabelChanged = false; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_string_UTF16; + IggyStringUTF16 stringVal; + + stringVal.string = (IggyUTF16*)m_label.c_str(); + stringVal.length = m_label.length(); + value[0].string16 = stringVal; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_setLabelFunc , 1 , value ); + } +} + +void UIControl_Base::setLabel(const string &label) +{ + wstring wlabel = convStringToWstring(label); + setLabel(wlabel); +} + +const wchar_t* UIControl_Base::getLabel() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcGetLabel , 0 , NULL ); + + if(result.type == IGGY_DATATYPE_string_UTF16) + { + m_label = wstring( (wchar_t *)result.string16.string, result.string16.length); + } + + return m_label.c_str(); +} + +void UIControl_Base::setAllPossibleLabels(int labelCount, wchar_t labels[][256]) +{ + IggyDataValue result; + IggyDataValue *value = new IggyDataValue[labelCount]; + IggyStringUTF16 * stringVal = new IggyStringUTF16[labelCount]; + + for(unsigned int i = 0; i < labelCount; ++i) + { + stringVal[i].string = (IggyUTF16 *)labels[i]; + stringVal[i].length = wcslen(labels[i]); + value[i].type = IGGY_DATATYPE_string_UTF16; + value[i].string16 = stringVal[i]; + } + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcCheckLabelWidths , labelCount , value ); + + delete [] value; + delete [] stringVal; +} + +bool UIControl_Base::hasFocus() +{ + return m_parentScene->controlHasFocus( this ); +} diff --git a/Minecraft.Client/Common/UI/UIControl_Base.h b/Minecraft.Client/Common/UI/UIControl_Base.h new file mode 100644 index 00000000..e70997c3 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Base.h @@ -0,0 +1,30 @@ +#pragma once + +#include "UIControl.h" + +// This class maps to the FJ_Base class in actionscript +class UIControl_Base : public UIControl +{ +protected: + IggyName m_initFunc; + IggyName m_setLabelFunc; + IggyName m_funcGetLabel; + IggyName m_funcCheckLabelWidths; + + bool m_bLabelChanged; + wstring m_label; +public: + UIControl_Base(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + virtual void tick(); + + virtual void setLabel(const wstring &label, bool instant = false, bool force = false); + virtual void setLabel(const string &label); + const wchar_t* getLabel(); + virtual void setAllPossibleLabels(int labelCount, wchar_t labels[][256]); + int getId() { return m_id; } + + virtual bool hasFocus(); +}; diff --git a/Minecraft.Client/Common/UI/UIControl_BitmapIcon.cpp b/Minecraft.Client/Common/UI/UIControl_BitmapIcon.cpp new file mode 100644 index 00000000..49561906 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_BitmapIcon.cpp @@ -0,0 +1,27 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_BitmapIcon.h" + +bool UIControl_BitmapIcon::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eBitmapIcon); + bool success = UIControl::setupControl(scene,parent,controlName); + + //SlotList specific initialisers + m_funcSetTextureName = registerFastName(L"SetTextureName"); + + return success; +} + +void UIControl_BitmapIcon::setTextureName(const wstring &iconName) +{ + IggyDataValue result; + IggyDataValue value[1]; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)iconName.c_str(); + stringVal.length = iconName.length(); + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcSetTextureName , 1 , value ); +} diff --git a/Minecraft.Client/Common/UI/UIControl_BitmapIcon.h b/Minecraft.Client/Common/UI/UIControl_BitmapIcon.h new file mode 100644 index 00000000..9b2fe0a8 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_BitmapIcon.h @@ -0,0 +1,14 @@ +#pragma once + +#include "UIControl.h" + +class UIControl_BitmapIcon : public UIControl +{ +private: + IggyName m_funcSetTextureName; + +public: + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void setTextureName(const wstring &iconName); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_Button.cpp b/Minecraft.Client/Common/UI/UIControl_Button.cpp new file mode 100644 index 00000000..96ddb8eb --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Button.cpp @@ -0,0 +1,68 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_Button.h" + +UIControl_Button::UIControl_Button() +{ +} + +bool UIControl_Button::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eButton); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //Button specific initialisers + m_funcEnableButton = registerFastName(L"EnableButton"); + + return success; +} + +void UIControl_Button::init(const wstring &label, int id) +{ + m_label = label; + m_id = id; + + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_string_UTF16; + IggyStringUTF16 stringVal; + + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].string16 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = id; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_initFunc , 2 , value ); + +#ifdef __PSVITA__ + // 4J-PB - add this button to the vita touch box list + + switch(m_parentScene->GetParentLayer()->m_iLayer) + { + case eUILayer_Error: + case eUILayer_Fullscreen: + case eUILayer_Scene: + case eUILayer_HUD: + ui.TouchBoxAdd(this,m_parentScene); + break; + } +#endif +} + +void UIControl_Button::ReInit() +{ + UIControl_Base::ReInit(); + + init(m_label, m_id); +} + +void UIControl_Button::setEnable(bool enable) +{ + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = enable; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcEnableButton , 1 , value ); +} diff --git a/Minecraft.Client/Common/UI/UIControl_Button.h b/Minecraft.Client/Common/UI/UIControl_Button.h new file mode 100644 index 00000000..367a48d7 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Button.h @@ -0,0 +1,19 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_Button : public UIControl_Base +{ +private: + IggyName m_funcEnableButton; + +public: + UIControl_Button(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void init(const wstring &label, int id); + virtual void ReInit(); + + void setEnable(bool enable); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_ButtonList.cpp b/Minecraft.Client/Common/UI/UIControl_ButtonList.cpp new file mode 100644 index 00000000..32db4843 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_ButtonList.cpp @@ -0,0 +1,197 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_ButtonList.h" + +UIControl_ButtonList::UIControl_ButtonList() +{ + m_itemCount = 0; + m_iCurrentSelection = 0; +} + +bool UIControl_ButtonList::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eButtonList); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //SlotList specific initialisers + m_addNewItemFunc = registerFastName(L"addNewItem"); + m_removeAllItemsFunc = registerFastName(L"removeAllItems"); + m_funcHighlightItem = registerFastName(L"HighlightItem"); + m_funcRemoveItem = registerFastName(L"RemoveItem"); + m_funcSetButtonLabel = registerFastName(L"SetButtonLabel"); + m_funcSetTouchFocus = registerFastName(L"SetTouchFocus"); + m_funcCanTouchTrigger = registerFastName(L"CanTouchTrigger"); + + return success; +} + +void UIControl_ButtonList::init(int id) +{ + m_id = id; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = id; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_initFunc , 1 , value ); + + #ifdef __PSVITA__ + // 4J-PB - add this buttonlist to the vita touch box list + + switch(m_parentScene->GetParentLayer()->m_iLayer) + { + case eUILayer_Fullscreen: + case eUILayer_Scene: + case eUILayer_HUD: + ui.TouchBoxAdd(this,m_parentScene); + break; +} + #endif +} + +void UIControl_ButtonList::ReInit() +{ + UIControl_Base::ReInit(); + init(m_id); + m_itemCount = 0; + m_iCurrentSelection = 0; +} + +void UIControl_ButtonList::clearList() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_removeAllItemsFunc , 0 , NULL ); + + m_itemCount = 0; +} + +void UIControl_ButtonList::addItem(const string &label) +{ + addItem(label, m_itemCount); +} + +void UIControl_ButtonList::addItem(const wstring &label) +{ + addItem(label, m_itemCount); +} + +void UIControl_ButtonList::addItem(const string &label, int data) +{ + IggyDataValue result; + IggyDataValue value[2]; + + IggyStringUTF8 stringVal; + stringVal.string = (char*)label.c_str(); + stringVal.length = (S32)label.length(); + value[0].type = IGGY_DATATYPE_string_UTF8; + value[0].string8 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = data; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_addNewItemFunc , 2 , value ); + + ++m_itemCount; +} + +void UIControl_ButtonList::addItem(const wstring &label, int data) +{ + IggyDataValue result; + IggyDataValue value[2]; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = data; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_addNewItemFunc , 2 , value ); + + ++m_itemCount; +} + +void UIControl_ButtonList::removeItem(int index) +{ + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = index; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcRemoveItem , 1 , value ); + + --m_itemCount; +} + +void UIControl_ButtonList::setCurrentSelection(int iSelection) +{ + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iSelection; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcHighlightItem , 1 , value ); +} + +int UIControl_ButtonList::getCurrentSelection() +{ + return m_iCurrentSelection; +} + +void UIControl_ButtonList::updateChildFocus(int iChild) +{ + m_iCurrentSelection = iChild; +} + +void UIControl_ButtonList::setButtonLabel(int iButtonId, const wstring &label) +{ + IggyDataValue result; + IggyDataValue value[2]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iButtonId; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[1].type = IGGY_DATATYPE_string_UTF16; + value[1].string16 = stringVal; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie(), &result, getIggyValuePath(), m_funcSetButtonLabel, 2 , value ); +} + +#ifdef __PSVITA__ +void UIControl_ButtonList::SetTouchFocus(S32 iX, S32 iY, bool bRepeat) +{ + IggyDataValue result; + IggyDataValue value[3]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iX; + value[1].type = IGGY_DATATYPE_number; + value[1].number = iY; + value[2].type = IGGY_DATATYPE_boolean; + value[2].boolval = bRepeat; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie(), &result, getIggyValuePath(), m_funcSetTouchFocus, 3 , value ); +} + +bool UIControl_ButtonList::CanTouchTrigger(S32 iX, S32 iY) +{ + IggyDataValue result; + IggyDataValue value[2]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iX; + value[1].type = IGGY_DATATYPE_number; + value[1].number = iY; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie(), &result, getIggyValuePath(), m_funcCanTouchTrigger, 2 , value ); + + S32 bCanTouchTrigger = false; + if(result.type == IGGY_DATATYPE_boolean) + { + bCanTouchTrigger = (bool)result.boolval; + } + return bCanTouchTrigger; +} +#endif diff --git a/Minecraft.Client/Common/UI/UIControl_ButtonList.h b/Minecraft.Client/Common/UI/UIControl_ButtonList.h new file mode 100644 index 00000000..a3c5da3a --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_ButtonList.h @@ -0,0 +1,44 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_ButtonList : public UIControl_Base +{ +protected: + IggyName m_addNewItemFunc, m_removeAllItemsFunc, m_funcHighlightItem, m_funcRemoveItem, m_funcSetButtonLabel, m_funcSetTouchFocus, m_funcCanTouchTrigger; + + int m_itemCount; + int m_iCurrentSelection; + +public: + UIControl_ButtonList(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void init(int id); + virtual void ReInit(); + + void clearList(); + + void addItem(const wstring &label); + void addItem(const string &label); + + void addItem(const wstring &label, int data); + void addItem(const string &label, int data); + + void removeItem(int index); + + int getItemCount() { return m_itemCount; } + + void setCurrentSelection(int iSelection); + int getCurrentSelection(); + + void updateChildFocus(int iChild); + + void setButtonLabel(int iButtonId, const wstring &label); + +#ifdef __PSVITA__ + void SetTouchFocus(S32 iX, S32 iY, bool bRepeat); + bool CanTouchTrigger(S32 iX, S32 iY); +#endif +}; diff --git a/Minecraft.Client/Common/UI/UIControl_CheckBox.cpp b/Minecraft.Client/Common/UI/UIControl_CheckBox.cpp new file mode 100644 index 00000000..d3bdf758 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_CheckBox.cpp @@ -0,0 +1,109 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_CheckBox.h" + +UIControl_CheckBox::UIControl_CheckBox() +{ +} + +bool UIControl_CheckBox::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eCheckBox); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //CheckBox specific initialisers + m_checkedProp = registerFastName(L"Checked"); + m_funcEnable = registerFastName(L"EnableCheckBox"); + m_funcSetCheckBox = registerFastName(L"SetCheckBox"); + + m_bEnabled = true; + + return success; +} + +void UIControl_CheckBox::init(const wstring &label, int id, bool checked) +{ + m_label = label; + m_id = id; + m_bChecked = checked; + + IggyDataValue result; + IggyDataValue value[3]; + value[0].type = IGGY_DATATYPE_string_UTF16; + IggyStringUTF16 stringVal; + + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].string16 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = (int)id; + + value[2].type = IGGY_DATATYPE_boolean; + value[2].boolval = checked; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_initFunc , 3 , value ); + +#ifdef __PSVITA__ + // 4J-TomK - add checkbox to the vita touch box list + + switch(m_parentScene->GetParentLayer()->m_iLayer) + { + case eUILayer_Fullscreen: + case eUILayer_Scene: + case eUILayer_HUD: + ui.TouchBoxAdd(this,m_parentScene); + break; +} +#endif +} + +bool UIControl_CheckBox::IsChecked() +{ + rrbool checked = false; + IggyResult result = IggyValueGetBooleanRS ( &m_iggyPath , m_checkedProp, NULL, &checked ); + m_bChecked = checked; + return checked; +} + +bool UIControl_CheckBox::IsEnabled() +{ + return m_bEnabled; +} + +void UIControl_CheckBox::SetEnable(bool enable) +{ + m_bEnabled = enable; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = enable; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcEnable , 1 , value ); +} + +// 4J HEG - this is only ever used when required, most of this should happen in the flash +void UIControl_CheckBox::setChecked(bool checked) +{ + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = checked; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcSetCheckBox , 1 , value ); +} + +// 4J-TomK we need to trigger this one via function instead of key down event because of how it works +void UIControl_CheckBox::TouchSetCheckbox(bool checked) +{ + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = checked; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcSetCheckBox , 1 , value ); +} + +void UIControl_CheckBox::ReInit() +{ + UIControl_Base::ReInit(); + + init(m_label, m_id, m_bChecked); +} diff --git a/Minecraft.Client/Common/UI/UIControl_CheckBox.h b/Minecraft.Client/Common/UI/UIControl_CheckBox.h new file mode 100644 index 00000000..924e9c68 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_CheckBox.h @@ -0,0 +1,27 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_CheckBox : public UIControl_Base +{ +private: + IggyName m_checkedProp, m_funcEnable, m_funcSetCheckBox; + + bool m_bChecked, m_bEnabled; + +public: + UIControl_CheckBox(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void init(const wstring &label, int id, bool checked); + + bool IsChecked(); + bool IsEnabled(); + void SetEnable(bool enable); + void setChecked(bool checked); + void TouchSetCheckbox(bool checked); + + virtual void ReInit(); + +}; diff --git a/Minecraft.Client/Common/UI/UIControl_Cursor.cpp b/Minecraft.Client/Common/UI/UIControl_Cursor.cpp new file mode 100644 index 00000000..2ac5ce8a --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Cursor.cpp @@ -0,0 +1,17 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_Cursor.h" + +UIControl_Cursor::UIControl_Cursor() +{ +} + +bool UIControl_Cursor::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eCursor); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //Label specific initialisers + + return success; +} diff --git a/Minecraft.Client/Common/UI/UIControl_Cursor.h b/Minecraft.Client/Common/UI/UIControl_Cursor.h new file mode 100644 index 00000000..cc7705d4 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Cursor.h @@ -0,0 +1,11 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_Cursor : public UIControl_Base +{ +public: + UIControl_Cursor(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_DLCList.cpp b/Minecraft.Client/Common/UI/UIControl_DLCList.cpp new file mode 100644 index 00000000..35e6b08a --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_DLCList.cpp @@ -0,0 +1,69 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_DLCList.h" + +bool UIControl_DLCList::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eDLCList); + bool success = UIControl_ButtonList::setupControl(scene,parent,controlName); + + //SlotList specific initialisers + m_funcShowTick = registerFastName(L"ShowTick"); + + return success; +} + +void UIControl_DLCList::addItem(const string &label, bool showTick, int iId) +{ + IggyDataValue result; + IggyDataValue value[3]; + + IggyStringUTF8 stringVal; + stringVal.string = (char*)label.c_str(); + stringVal.length = (S32)label.length(); + value[0].type = IGGY_DATATYPE_string_UTF8; + value[0].string8 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = iId; + + value[2].type = IGGY_DATATYPE_boolean; + value[2].boolval = showTick; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_addNewItemFunc , 3 , value ); + + ++m_itemCount; +} + +void UIControl_DLCList::addItem(const wstring &label, bool showTick, int iId) +{ + IggyDataValue result; + IggyDataValue value[3]; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16 *)label.c_str(); + stringVal.length = (S32)label.length(); + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = iId; + + value[2].type = IGGY_DATATYPE_boolean; + value[2].boolval = showTick; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_addNewItemFunc , 3 , value ); + + ++m_itemCount; +} + +void UIControl_DLCList::showTick(int iId, bool showTick) +{ + IggyDataValue result; + IggyDataValue value[2]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iId; + + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = showTick; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcShowTick , 2 , value ); +} diff --git a/Minecraft.Client/Common/UI/UIControl_DLCList.h b/Minecraft.Client/Common/UI/UIControl_DLCList.h new file mode 100644 index 00000000..9c917cbf --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_DLCList.h @@ -0,0 +1,17 @@ +#pragma once + +#include "UIControl_ButtonList.h" + +class UIControl_DLCList : public UIControl_ButtonList +{ +private: + IggyName m_funcShowTick; + +public: + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + using UIControl_ButtonList::addItem; + void addItem(const string &label, bool showTick, int iId); + void addItem(const wstring &label, bool showTick, int iId); + void showTick(int iId, bool showTick); +}; diff --git a/Minecraft.Client/Common/UI/UIControl_DynamicLabel.cpp b/Minecraft.Client/Common/UI/UIControl_DynamicLabel.cpp new file mode 100644 index 00000000..fa29a137 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_DynamicLabel.cpp @@ -0,0 +1,98 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_DynamicLabel.h" + +UIControl_DynamicLabel::UIControl_DynamicLabel() +{ +} + +bool UIControl_DynamicLabel::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eDynamicLabel); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //Label specific initialisers + m_funcAddText = registerFastName(L"AddText"); + m_funcTouchScroll = registerFastName(L"TouchScroll"); + m_funcGetRealWidth = registerFastName(L"GetRealWidth"); + m_funcGetRealHeight = registerFastName(L"GetRealHeight"); + + return success; +} + +void UIControl_DynamicLabel::addText(const wstring &text, bool bLastEntry) +{ + IggyDataValue result; + IggyDataValue value[2]; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)text.c_str(); + stringVal.length = text.length(); + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = bLastEntry; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcAddText , 2 , value ); +} + +void UIControl_DynamicLabel::ReInit() +{ + UIControl_Base::ReInit(); +} + +void UIControl_DynamicLabel::SetupTouch() +{ + #ifdef __PSVITA__ + // 4J-TomK - add this dynamic label to the vita touch box list + + switch(m_parentScene->GetParentLayer()->m_iLayer) + { + case eUILayer_Fullscreen: + case eUILayer_Scene: + case eUILayer_HUD: + ui.TouchBoxAdd(this,m_parentScene); + break; + } + #endif +} + +void UIControl_DynamicLabel::TouchScroll(S32 iY, bool bActive) +{ + IggyDataValue result; + IggyDataValue value[2]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iY; + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = bActive; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie(), &result, getIggyValuePath(), m_funcTouchScroll, 2 , value ); +} + +S32 UIControl_DynamicLabel::GetRealWidth() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcGetRealWidth, 0 , NULL ); + + S32 iRealWidth = m_width; + if(result.type == IGGY_DATATYPE_number) + { + iRealWidth = (S32)result.number; + } + return iRealWidth; +} + +S32 UIControl_DynamicLabel::GetRealHeight() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcGetRealHeight, 0 , NULL ); + + S32 iRealHeight = m_height; + if(result.type == IGGY_DATATYPE_number) + { + iRealHeight = (S32)result.number; + } + return iRealHeight; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_DynamicLabel.h b/Minecraft.Client/Common/UI/UIControl_DynamicLabel.h new file mode 100644 index 00000000..902c706d --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_DynamicLabel.h @@ -0,0 +1,25 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_DynamicLabel : public UIControl_Label +{ +private: + IggyName m_funcAddText, m_funcTouchScroll, m_funcGetRealWidth, m_funcGetRealHeight; + +public: + UIControl_DynamicLabel(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + virtual void addText(const wstring &text, bool bLastEntry); + + virtual void ReInit(); + + virtual void SetupTouch(); + + virtual void TouchScroll(S32 iY, bool bActive); + + S32 GetRealWidth(); + S32 GetRealHeight(); +}; diff --git a/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.cpp b/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.cpp new file mode 100644 index 00000000..ef7c0e94 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.cpp @@ -0,0 +1,140 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_EnchantmentBook.h" +#include "..\..\Minecraft.h" +#include "..\..\TileEntityRenderDispatcher.h" +#include "..\..\EnchantTableRenderer.h" +#include "..\..\Lighting.h" +#include "..\..\BookModel.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" + +UIControl_EnchantmentBook::UIControl_EnchantmentBook() +{ + UIControl::setControlType(UIControl::eEnchantmentBook); + model = NULL; + last = nullptr; + + time = 0; + flip = oFlip = flipT = flipA = 0.0f; + open = oOpen = 0.0f; +} + +void UIControl_EnchantmentBook::render(IggyCustomDrawCallbackRegion *region) +{ + glPushMatrix(); + float width = region->x1 - region->x0; + float height = region->y1 - region->y0; + + // Revert the scale from the setup + float ssX = width/m_width; + float ssY = height/m_height; + glScalef(ssX, ssY,1.0f); + + glTranslatef(m_width/2, m_height/2, 50.0f); + + // Add a uniform scale + glScalef(1/ssX, 1/ssX, 1.0f); + + glScalef(50.0f,50.0f,1.0f); + + glRotatef(45 + 90, 0, 1, 0); + Lighting::turnOn(); + glRotatef(-45 - 90, 0, 1, 0); + + //float sss = 4; + + //glTranslatef(0, 3.3f, -16); + //glScalef(sss, sss, sss); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + int tex = pMinecraft->textures->loadTexture(TN_ITEM_BOOK); // 4J was L"/1_2_2/item/book.png" + pMinecraft->textures->bind(tex); + + glRotatef(20, 1, 0, 0); + + float a = 1; + float o = oOpen + (open - oOpen) * a; + glTranslatef((1 - o) * 0.2f, (1 - o) * 0.1f, (1 - o) * 0.25f); + glRotatef(-(1 - o) * 90 - 90, 0, 1, 0); + glRotatef(180, 1, 0, 0); + + float ff1 = oFlip + (flip - oFlip) * a + 0.25f; + float ff2 = oFlip + (flip - oFlip) * a + 0.75f; + ff1 = (ff1 - floor(ff1)) * 1.6f - 0.3f; + ff2 = (ff2 - floor(ff2)) * 1.6f - 0.3f; + + if (ff1 < 0) ff1 = 0; + if (ff2 < 0) ff2 = 0; + if (ff1 > 1) ff1 = 1; + if (ff2 > 1) ff2 = 1; + + glEnable(GL_CULL_FACE); + + if(model == NULL) + { + // Share the model the the EnchantTableRenderer + + EnchantTableRenderer *etr = (EnchantTableRenderer*)TileEntityRenderDispatcher::instance->getRenderer(eTYPE_ENCHANTMENTTABLEENTITY); + if(etr != NULL) + { + model = etr->bookModel; + } + else + { + model = new BookModel(); + } + } + + model->render(nullptr, 0, ff1, ff2, o, 0, 1 / 16.0f,true); + glDisable(GL_CULL_FACE); + + glPopMatrix(); + Lighting::turnOff(); + glDisable(GL_RESCALE_NORMAL); + + tickBook(); +} + +void UIControl_EnchantmentBook::tickBook() +{ + UIScene_EnchantingMenu *m_containerScene = (UIScene_EnchantingMenu *)m_parentScene; + EnchantmentMenu *menu = m_containerScene->getMenu(); + shared_ptr current = menu->getSlot(0)->getItem(); + if (!ItemInstance::matches(current, last)) + { + last = current; + + do + { + flipT += random.nextInt(4) - random.nextInt(4); + } while (flip <= flipT + 1 && flip >= flipT - 1); + } + + time++; + oFlip = flip; + oOpen = open; + + bool shouldBeOpen = false; + for (int i = 0; i < 3; i++) + { + if (menu->costs[i] != 0) + { + shouldBeOpen = true; + } + } + + if (shouldBeOpen) open += 0.2f; + else open -= 0.2f; + if (open < 0) open = 0; + if (open > 1) open = 1; + + + float diff = (flipT - flip) * 0.4f; + float max = 0.2f; + if (diff < -max) diff = -max; + if (diff > +max) diff = +max; + flipA += (diff - flipA) * 0.9f; + + flip = flip + flipA; +} diff --git a/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.h b/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.h new file mode 100644 index 00000000..cbe2cf2b --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.h @@ -0,0 +1,33 @@ +#pragma once + +#include "UIControl.h" + +class UIScene_EnchantingMenu; +class BookModel; + +class UIControl_EnchantmentBook : public UIControl +{ +private: + BookModel *model; + Random random; + + // 4J JEV: Book animation variables. + int time; + float flip, oFlip, flipT, flipA; + float open, oOpen; + + //BOOL m_bDirty; + //float m_fScale,m_fAlpha; + //int m_iPad; + shared_ptr last; + + //float m_fScreenWidth,m_fScreenHeight; + //float m_fRawWidth,m_fRawHeight; + + void tickBook(); + +public: + UIControl_EnchantmentBook(); + + void render(IggyCustomDrawCallbackRegion *region); +}; diff --git a/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.cpp b/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.cpp new file mode 100644 index 00000000..e1490e0b --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.cpp @@ -0,0 +1,205 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_EnchantmentButton.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" + +UIControl_EnchantmentButton::UIControl_EnchantmentButton() +{ + m_index = 0; + m_lastState = eState_Inactive; + m_lastCost = 0; + m_enchantmentString = L""; + m_bHasFocus = false; + + m_textColour = app.GetHTMLColour(eTextColor_Enchant); + m_textFocusColour = app.GetHTMLColour(eTextColor_EnchantFocus); + m_textDisabledColour = app.GetHTMLColour(eTextColor_EnchantDisabled); +} + +bool UIControl_EnchantmentButton::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eEnchantmentButton); + bool success = UIControl_Button::setupControl(scene,parent,controlName); + + //Button specific initialisers + m_funcChangeState = registerFastName(L"ChangeState"); + + return success; +} + +void UIControl_EnchantmentButton::init(int index) +{ + m_index = index; +} + +void UIControl_EnchantmentButton::tick() +{ + updateState(); + UIControl_Button::tick(); +} + +void UIControl_EnchantmentButton::render(IggyCustomDrawCallbackRegion *region) +{ + UIScene_EnchantingMenu *enchantingScene = (UIScene_EnchantingMenu *)m_parentScene; + EnchantmentMenu *menu = enchantingScene->getMenu(); + + float width = region->x1 - region->x0; + float height = region->y1 - region->y0; + float xo = width/2; + float yo = height; + //glTranslatef(xo, yo, 50.0f); + + // Revert the scale from the setup + float ssX = width/m_width; + float ssY = height/m_height; + glScalef(ssX, ssY,1.0f); + + float ss = 1.0f; + +#if TO_BE_IMPLEMENTED + if(!enchantingScene->m_bSplitscreen) +#endif + { + switch(enchantingScene->getSceneResolution()) + { + case UIScene::eSceneResolution_1080: + ss = 3.0f; + break; + default: + ss = 2.0f; + break; + } + } + + glScalef(ss, ss, ss); + + int cost = menu->costs[m_index]; + + //if(cost != m_lastCost) + //{ + // updateState(); + //} + + glColor4f(1, 1, 1, 1); + if (cost != 0) + { + glEnable(GL_ALPHA_TEST); + glAlphaFunc(GL_GREATER, 0.1f); + Minecraft *pMinecraft = Minecraft::GetInstance(); + wstring line = _toString(cost); + Font *font = pMinecraft->altFont; + //int col = 0x685E4A; + unsigned int col = m_textColour; + if (pMinecraft->localplayers[enchantingScene->getPad()]->experienceLevel < cost && !pMinecraft->localplayers[enchantingScene->getPad()]->abilities.instabuild) + { + col = m_textDisabledColour; + font->drawWordWrap(m_enchantmentString, 0, 0, (float)m_width/ss, col, (float)m_height/ss); + font = pMinecraft->font; + //col = (0x80ff20 & 0xfefefe) >> 1; + //font->drawShadow(line, (bwidth - font->width(line))/ss, 7, col); + } + else + { + if (m_bHasFocus) + { + //col = 0xffff80; + col = m_textFocusColour; + } + font->drawWordWrap(m_enchantmentString, 0, 0, (float)m_width/ss, col, (float)m_height/ss); + font = pMinecraft->font; + //col = 0x80ff20; + //font->drawShadow(line, (bwidth - font->width(line))/ss, 7, col); + } + glDisable(GL_ALPHA_TEST); + } + else + { + } + + //Lighting::turnOff(); + glDisable(GL_RESCALE_NORMAL); +} + +void UIControl_EnchantmentButton::updateState() +{ + UIScene_EnchantingMenu *enchantingScene = (UIScene_EnchantingMenu *)m_parentScene; + EnchantmentMenu *menu = enchantingScene->getMenu(); + + EState state = eState_Inactive; + + int cost = menu->costs[m_index]; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(cost > pMinecraft->localplayers[enchantingScene->getPad()]->experienceLevel && !pMinecraft->localplayers[enchantingScene->getPad()]->abilities.instabuild) + { + // Dark background + state = eState_Inactive; + } + else + { + // Light background and focus background + if(m_bHasFocus) + { + state = eState_Selected; + } + else + { + state = eState_Active; + } + } + + if(cost != m_lastCost) + { + setLabel( _toString(cost) ); + m_lastCost = cost; + m_enchantmentString = EnchantmentNames::instance.getRandomName(); + } + if(cost == 0) + { + // Dark background + state = eState_Inactive; + setLabel(L""); + } + + if(state != m_lastState) + { + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = (int)state; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcChangeState , 1 , value ); + + if(out == IGGY_RESULT_SUCCESS) m_lastState = state; + } +} + +void UIControl_EnchantmentButton::setFocus(bool focus) +{ + m_bHasFocus = focus; + updateState(); +} + +UIControl_EnchantmentButton::EnchantmentNames UIControl_EnchantmentButton::EnchantmentNames::instance; + +UIControl_EnchantmentButton::EnchantmentNames::EnchantmentNames() +{ + wstring allWords = L"the elder scrolls klaatu berata niktu xyzzy bless curse light darkness fire air earth water hot dry cold wet ignite snuff embiggen twist shorten stretch fiddle destroy imbue galvanize enchant free limited range of towards inside sphere cube self other ball mental physical grow shrink demon elemental spirit animal creature beast humanoid undead fresh stale "; + std::wistringstream iss(allWords); + std::copy(std::istream_iterator< std::wstring, wchar_t, std::char_traits >(iss), std::istream_iterator< std::wstring, wchar_t, std::char_traits >(),std::back_inserter(words)); +} + +wstring UIControl_EnchantmentButton::EnchantmentNames::getRandomName() +{ + int wordCount = random.nextInt(2) + 3; + wstring word = L""; + for (int i = 0; i < wordCount; i++) + { + if (i > 0) word += L" "; + word += words[random.nextInt(words.size())]; + } + return word; +} diff --git a/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.h b/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.h new file mode 100644 index 00000000..9b8a3c8f --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.h @@ -0,0 +1,55 @@ +#pragma once + +#include "UIControl_Button.h" + +class UIControl_EnchantmentButton : public UIControl_Button +{ +private: + // Maps to values in AS + enum EState + { + eState_Inactive = 0, + eState_Active = 1, + eState_Selected = 2, + }; + + EState m_lastState; + int m_lastCost; + int m_index; + wstring m_enchantmentString; + bool m_bHasFocus; + + IggyName m_funcChangeState; + + unsigned int m_textColour, m_textFocusColour, m_textDisabledColour; + + class EnchantmentNames + { + public: + static EnchantmentNames instance; + + private: + Random random; + vector words; + + EnchantmentNames(); + + public: + wstring getRandomName(); + }; + +public: + UIControl_EnchantmentButton(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + virtual void tick(); + + void init(int index); + + void render(IggyCustomDrawCallbackRegion *region); + + void updateState(); + + virtual void setFocus(bool focus); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_HTMLLabel.cpp b/Minecraft.Client/Common/UI/UIControl_HTMLLabel.cpp new file mode 100644 index 00000000..8b7eb9a1 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_HTMLLabel.cpp @@ -0,0 +1,103 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_HTMLLabel.h" + +UIControl_HTMLLabel::UIControl_HTMLLabel() +{ +} + +bool UIControl_HTMLLabel::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eHTMLLabel); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //Label specific initialisers + m_funcStartAutoScroll = registerFastName(L"StartAutoScroll"); + m_funcTouchScroll = registerFastName(L"TouchScroll"); + m_funcGetRealWidth = registerFastName(L"GetRealWidth"); + m_funcGetRealHeight = registerFastName(L"GetRealHeight"); + + return success; +} + +void UIControl_HTMLLabel::startAutoScroll() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcStartAutoScroll , 0 , NULL ); +} + +void UIControl_HTMLLabel::ReInit() +{ + UIControl_Base::ReInit(); + // Don't set the label, HTML sizes will have changed. Let the scene update us. + init(L""); +} + +void UIControl_HTMLLabel::setLabel(const string &label) +{ + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_string_UTF8; + IggyStringUTF8 stringVal; + + stringVal.string = (char *) label.c_str(); + stringVal.length = label.length(); + value[0].string8 = stringVal; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_setLabelFunc , 1 , value ); +} + +void UIControl_HTMLLabel::SetupTouch() +{ + #ifdef __PSVITA__ + // 4J-TomK - add this dynamic label to the vita touch box list + + switch(m_parentScene->GetParentLayer()->m_iLayer) + { + case eUILayer_Fullscreen: + case eUILayer_Scene: + case eUILayer_HUD: + ui.TouchBoxAdd(this,m_parentScene); + break; + } + #endif +} + +void UIControl_HTMLLabel::TouchScroll(S32 iY, bool bActive) +{ + IggyDataValue result; + IggyDataValue value[2]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iY; + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = bActive; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie(), &result, getIggyValuePath(), m_funcTouchScroll, 2 , value ); +} + +S32 UIControl_HTMLLabel::GetRealWidth() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcGetRealWidth, 0 , NULL ); + + S32 iRealWidth = m_width; + if(result.type == IGGY_DATATYPE_number) + { + iRealWidth = (S32)result.number; + } + return iRealWidth; +} + +S32 UIControl_HTMLLabel::GetRealHeight() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcGetRealHeight, 0 , NULL ); + + S32 iRealHeight = m_height; + if(result.type == IGGY_DATATYPE_number) + { + iRealHeight = (S32)result.number; + } + return iRealHeight; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_HTMLLabel.h b/Minecraft.Client/Common/UI/UIControl_HTMLLabel.h new file mode 100644 index 00000000..17e7cfb4 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_HTMLLabel.h @@ -0,0 +1,27 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_HTMLLabel : public UIControl_Label +{ +private: + IggyName m_funcStartAutoScroll, m_funcTouchScroll, m_funcGetRealWidth, m_funcGetRealHeight; + +public: + UIControl_HTMLLabel(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void startAutoScroll(); + virtual void ReInit(); + + using UIControl_Base::setLabel; + void setLabel(const string &label); + + virtual void SetupTouch(); + + virtual void TouchScroll(S32 iY, bool bActive); + + S32 GetRealWidth(); + S32 GetRealHeight(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_Label.cpp b/Minecraft.Client/Common/UI/UIControl_Label.cpp new file mode 100644 index 00000000..1481fea1 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Label.cpp @@ -0,0 +1,53 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_Label.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" + +UIControl_Label::UIControl_Label() +{ +} + +bool UIControl_Label::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eLabel); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //Label specific initialisers + + return success; +} + +void UIControl_Label::init(const wstring &label) +{ + m_label = label; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_string_UTF16; + IggyStringUTF16 stringVal; + + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].string16 = stringVal; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_initFunc , 1 , value ); +} + +void UIControl_Label::init(const string &label) +{ + m_label = convStringToWstring(label); + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_string_UTF8; + IggyStringUTF8 stringVal; + + stringVal.string = (char *)label.c_str(); + stringVal.length = label.length(); + value[0].string8 = stringVal; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_initFunc , 1 , value ); +} + +void UIControl_Label::ReInit() +{ + UIControl_Base::ReInit(); + init(m_label); +} diff --git a/Minecraft.Client/Common/UI/UIControl_Label.h b/Minecraft.Client/Common/UI/UIControl_Label.h new file mode 100644 index 00000000..aa0f3f14 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Label.h @@ -0,0 +1,15 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_Label : public UIControl_Base +{ +public: + UIControl_Label(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void init(const wstring &label); + void init(const string &label); + virtual void ReInit(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_LeaderboardList.cpp b/Minecraft.Client/Common/UI/UIControl_LeaderboardList.cpp new file mode 100644 index 00000000..c34b5e87 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_LeaderboardList.cpp @@ -0,0 +1,238 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_LeaderboardList.h" + +UIControl_LeaderboardList::UIControl_LeaderboardList() +{ +} + +bool UIControl_LeaderboardList::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eLeaderboardList); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //UIControl_LeaderboardList specific initialisers + m_funcInitLeaderboard = registerFastName(L"InitLeaderboard"); + m_funcAddDataSet = registerFastName(L"AddDataSet"); + m_funcResetLeaderboard = registerFastName(L"ResetLeaderboard"); + m_funcSetupTitles = registerFastName(L"SetupTitles"); + m_funcSetColumnIcon = registerFastName(L"SetColumnIcon"); +#ifdef __PSVITA__ + m_funcSetTouchFocus = registerFastName(L"SetTouchFocus"); + m_bTouchInitialised = false; +#endif + + return success; +} + +void UIControl_LeaderboardList::init(int id) +{ + m_id = id; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = id; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_initFunc , 1 , value ); +} + +void UIControl_LeaderboardList::ReInit() +{ + UIControl_Base::ReInit(); + init(m_id); +} + +void UIControl_LeaderboardList::clearList() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcResetLeaderboard , 0 , NULL ); +} + +void UIControl_LeaderboardList::setupTitles(const wstring &rank, const wstring &gamertag) +{ + IggyDataValue result; + IggyDataValue value[2]; + + IggyStringUTF16 stringVal0; + stringVal0.string = (IggyUTF16*)rank.c_str(); + stringVal0.length = rank.length(); + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal0; + + IggyStringUTF16 stringVal1; + stringVal1.string = (IggyUTF16*)gamertag.c_str(); + stringVal1.length = gamertag.length(); + value[1].type = IGGY_DATATYPE_string_UTF16; + value[1].string16 = stringVal1; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcSetupTitles , 2 , value ); +} + +void UIControl_LeaderboardList::initLeaderboard(int iFirstFocus, int iTotalEntries, int iNumColumns) +{ + IggyDataValue result; + IggyDataValue value[3]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = iFirstFocus; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = iTotalEntries; + + value[2].type = IGGY_DATATYPE_number; + value[2].number = iNumColumns; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcInitLeaderboard , 3 , value ); + +#ifdef __PSVITA__ + // 4J-PB - add this button to the vita touch box list + if(!m_bTouchInitialised) + { + switch(m_parentScene->GetParentLayer()->m_iLayer) + { + case eUILayer_Fullscreen: + case eUILayer_Scene: + ui.TouchBoxAdd(this,m_parentScene); + break; + } + m_bTouchInitialised = true; + } +#endif +} + +void UIControl_LeaderboardList::setColumnIcon(int iColumn, int iType) +{ + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = iColumn; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = (iType<=32000)?0:(iType-32000); + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcSetColumnIcon , 2 , value ); +} + +void UIControl_LeaderboardList::addDataSet(bool bLast, int iId, int iRank, const wstring &gamertag, bool bDisplayMessage, const wstring &col0, const wstring &col1, const wstring &col2, const wstring &col3, const wstring &col4, const wstring &col5, const wstring &col6) +{ + IggyDataValue result; + IggyDataValue value[12]; + + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = bLast; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = iId; + + value[2].type = IGGY_DATATYPE_number; + value[2].number = iRank; + + IggyStringUTF16 stringVal0; + stringVal0.string = (IggyUTF16*)gamertag.c_str(); + stringVal0.length = gamertag.length(); + value[3].type = IGGY_DATATYPE_string_UTF16; + value[3].string16 = stringVal0; + + value[4].type = IGGY_DATATYPE_boolean; + value[4].boolval = bDisplayMessage; + + IggyStringUTF16 stringVal1; + stringVal1.string = (IggyUTF16*)col0.c_str(); + stringVal1.length = col0.length(); + value[5].type = IGGY_DATATYPE_string_UTF16; + value[5].string16 = stringVal1; + + if(col1.empty()) + { + value[6].type = IGGY_DATATYPE_null; + } + else + { + IggyStringUTF16 stringVal2; + stringVal2.string = (IggyUTF16*)col1.c_str(); + stringVal2.length = col1.length(); + value[6].type = IGGY_DATATYPE_string_UTF16; + value[6].string16 = stringVal2; + } + + if(col2.empty()) + { + value[7].type = IGGY_DATATYPE_null; + } + else + { + IggyStringUTF16 stringVal3; + stringVal3.string = (IggyUTF16*)col2.c_str(); + stringVal3.length = col2.length(); + value[7].type = IGGY_DATATYPE_string_UTF16; + value[7].string16 = stringVal3; + } + + if(col3.empty()) + { + value[8].type = IGGY_DATATYPE_null; + } + else + { + IggyStringUTF16 stringVal4; + stringVal4.string = (IggyUTF16*)col3.c_str(); + stringVal4.length = col3.length(); + value[8].type = IGGY_DATATYPE_string_UTF16; + value[8].string16 = stringVal4; + } + + if(col4.empty()) + { + value[9].type = IGGY_DATATYPE_null; + } + else + { + IggyStringUTF16 stringVal5; + stringVal5.string = (IggyUTF16*)col4.c_str(); + stringVal5.length = col4.length(); + value[9].type = IGGY_DATATYPE_string_UTF16; + value[9].string16 = stringVal5; + } + + if(col5.empty()) + { + value[10].type = IGGY_DATATYPE_null; + } + else + { + IggyStringUTF16 stringVal6; + stringVal6.string = (IggyUTF16*)col5.c_str(); + stringVal6.length = col5.length(); + value[10].type = IGGY_DATATYPE_string_UTF16; + value[10].string16 = stringVal6; + } + + if(col6.empty()) + { + value[11].type = IGGY_DATATYPE_null; + } + else + { + IggyStringUTF16 stringVal7; + stringVal7.string = (IggyUTF16*)col6.c_str(); + stringVal7.length = col6.length(); + value[11].type = IGGY_DATATYPE_string_UTF16; + value[11].string16 = stringVal7; + } + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcAddDataSet , 12 , value ); +} + +#ifdef __PSVITA__ +void UIControl_LeaderboardList::SetTouchFocus(S32 iX, S32 iY, bool bRepeat) +{ + IggyDataValue result; + IggyDataValue value[3]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iX; + value[1].type = IGGY_DATATYPE_number; + value[1].number = iY; + value[2].type = IGGY_DATATYPE_boolean; + value[2].boolval = bRepeat; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie(), &result, getIggyValuePath(), m_funcSetTouchFocus, 3 , value ); +} +#endif \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_LeaderboardList.h b/Minecraft.Client/Common/UI/UIControl_LeaderboardList.h new file mode 100644 index 00000000..e102ddd7 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_LeaderboardList.h @@ -0,0 +1,50 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_LeaderboardList : public UIControl_Base +{ +private: + IggyName m_funcInitLeaderboard, m_funcAddDataSet; + IggyName m_funcResetLeaderboard; + IggyName m_funcSetupTitles, m_funcSetColumnIcon; +#ifdef __PSVITA__ + IggyName m_funcSetTouchFocus; + bool m_bTouchInitialised; +#endif +public: + enum ELeaderboardIcons + { + e_ICON_TYPE_IGGY = 0, + e_ICON_TYPE_CLIMBED = 32001, + e_ICON_TYPE_FALLEN = 32002, + e_ICON_TYPE_WALKED = 32003, + e_ICON_TYPE_SWAM = 32004, + e_ICON_TYPE_ZOMBIE = 32005, + e_ICON_TYPE_ZOMBIEPIGMAN = 32006, + e_ICON_TYPE_GHAST = 32007, + e_ICON_TYPE_CREEPER = 32008, + e_ICON_TYPE_SKELETON = 32009, + e_ICON_TYPE_SPIDER = 32010, + e_ICON_TYPE_SPIDERJOKEY = 32011, + e_ICON_TYPE_SLIME = 32012, + e_ICON_TYPE_PORTAL = 32013, + }; + UIControl_LeaderboardList(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void init(int id); + virtual void ReInit(); + + void clearList(); + + void setupTitles(const wstring &rank, const wstring &gamertag); + void initLeaderboard(int iFirstFocus, int iTotalEntries, int iNumColumns); + void setColumnIcon(int iColumn, int iType); + void addDataSet(bool bLast, int iId, int iRank, const wstring &gamertag, bool bDisplayMessage, const wstring &col0, const wstring &col1, const wstring &col2, const wstring &col3, const wstring &col4, const wstring &col5, const wstring &col6); + +#ifdef __PSVITA__ + void SetTouchFocus(S32 iX, S32 iY, bool bRepeat); +#endif +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_MinecraftPlayer.cpp b/Minecraft.Client/Common/UI/UIControl_MinecraftPlayer.cpp new file mode 100644 index 00000000..3a18ed53 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_MinecraftPlayer.cpp @@ -0,0 +1,93 @@ +#include "stdafx.h" +#include "..\..\Minecraft.h" +#include "..\..\ScreenSizeCalculator.h" +#include "..\..\EntityRenderDispatcher.h" +#include "..\..\PlayerRenderer.h" +#include "..\..\HumanoidModel.h" +#include "..\..\Lighting.h" +#include "..\..\ModelPart.h" +#include "..\..\Options.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "UI.h" +#include "UIControl_MinecraftPlayer.h" + +UIControl_MinecraftPlayer::UIControl_MinecraftPlayer() +{ + UIControl::setControlType(UIControl::eMinecraftPlayer); + + Minecraft *pMinecraft=Minecraft::GetInstance(); + + ScreenSizeCalculator ssc(pMinecraft->options, pMinecraft->width_phys, pMinecraft->height_phys); + m_fScreenWidth=(float)pMinecraft->width_phys; + m_fRawWidth=(float)ssc.rawWidth; + m_fScreenHeight=(float)pMinecraft->height_phys; + m_fRawHeight=(float)ssc.rawHeight; +} + +void UIControl_MinecraftPlayer::render(IggyCustomDrawCallbackRegion *region) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + glEnable(GL_RESCALE_NORMAL); + glEnable(GL_COLOR_MATERIAL); + glPushMatrix(); + + float width = region->x1 - region->x0; + float height = region->y1 - region->y0; + float xo = width/2; + float yo = height; + + glTranslatef(xo, yo - 7.0f, 50.0f); + + float ss; + + // Base scale on height of this control + // Potentially we might want separate x & y scales here + ss = width / (m_fScreenWidth / m_fScreenHeight); + + glScalef(-ss, ss, ss); + glRotatef(180, 0, 0, 1); + + UIScene_InventoryMenu *containerMenu = (UIScene_InventoryMenu *)m_parentScene; + + float oybr = pMinecraft->localplayers[containerMenu->getPad()]->yBodyRot; + float oyr = pMinecraft->localplayers[containerMenu->getPad()]->yRot; + float oxr = pMinecraft->localplayers[containerMenu->getPad()]->xRot; + float oyhr = pMinecraft->localplayers[containerMenu->getPad()]->yHeadRot; + + //float xd = ( matrix._41 + ( (bwidth*matrix._11)/2) ) - m_pointerPos.x; + float xd = (m_x + m_width/2) - containerMenu->m_pointerPos.x; + + // Need to base Y on head position, not centre of mass + //float yd = ( matrix._42 + ( (bheight*matrix._22) / 2) - 40 ) - m_pointerPos.y; + float yd = (m_y + m_height/2 - 40) - containerMenu->m_pointerPos.y; + + glRotatef(45 + 90, 0, 1, 0); + Lighting::turnOn(); + glRotatef(-45 - 90, 0, 1, 0); + + glRotatef(-(float) atan(yd / 40.0f) * 20, 1, 0, 0); + + pMinecraft->localplayers[containerMenu->getPad()]->yBodyRot = (float) atan(xd / 40.0f) * 20; + pMinecraft->localplayers[containerMenu->getPad()]->yRot = (float) atan(xd / 40.0f) * 40; + pMinecraft->localplayers[containerMenu->getPad()]->xRot = -(float) atan(yd / 40.0f) * 20; + pMinecraft->localplayers[containerMenu->getPad()]->yHeadRot = pMinecraft->localplayers[containerMenu->getPad()]->yRot; + //pMinecraft->localplayers[m_iPad]->glow = 1; + glTranslatef(0, pMinecraft->localplayers[containerMenu->getPad()]->heightOffset, 0); + EntityRenderDispatcher::instance->playerRotY = 180; + + // 4J Stu - Turning on hideGui while we do this stops the name rendering in split-screen + bool wasHidingGui = pMinecraft->options->hideGui; + pMinecraft->options->hideGui = true; + EntityRenderDispatcher::instance->render(pMinecraft->localplayers[containerMenu->getPad()], 0, 0, 0, 0, 1, false, false); + pMinecraft->options->hideGui = wasHidingGui; + //pMinecraft->localplayers[m_iPad]->glow = 0; + + pMinecraft->localplayers[containerMenu->getPad()]->yBodyRot = oybr; + pMinecraft->localplayers[containerMenu->getPad()]->yRot = oyr; + pMinecraft->localplayers[containerMenu->getPad()]->xRot = oxr; + pMinecraft->localplayers[containerMenu->getPad()]->yHeadRot = oyhr; + glPopMatrix(); + Lighting::turnOff(); + glDisable(GL_RESCALE_NORMAL); +} diff --git a/Minecraft.Client/Common/UI/UIControl_MinecraftPlayer.h b/Minecraft.Client/Common/UI/UIControl_MinecraftPlayer.h new file mode 100644 index 00000000..3b032f76 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_MinecraftPlayer.h @@ -0,0 +1,15 @@ +#pragma once + +#include "UIControl.h" + +class UIControl_MinecraftPlayer : public UIControl +{ +private: + float m_fScreenWidth,m_fScreenHeight; + float m_fRawWidth,m_fRawHeight; + +public: + UIControl_MinecraftPlayer(); + + void render(IggyCustomDrawCallbackRegion *region); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_PlayerList.cpp b/Minecraft.Client/Common/UI/UIControl_PlayerList.cpp new file mode 100644 index 00000000..41534dc2 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_PlayerList.cpp @@ -0,0 +1,65 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_PlayerList.h" + +bool UIControl_PlayerList::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::ePlayerList); + bool success = UIControl_ButtonList::setupControl(scene,parent,controlName); + + //SlotList specific initialisers + m_funcSetPlayerIcon = registerFastName(L"SetPlayerIcon"); + m_funcSetVOIPIcon = registerFastName(L"SetVOIPIcon"); + + return success; +} + +void UIControl_PlayerList::addItem(const wstring &label, int iPlayerIcon, int iVOIPIcon) +{ + IggyDataValue result; + IggyDataValue value[4]; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = (S32)label.length(); + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = m_itemCount; + + value[2].type = IGGY_DATATYPE_number; + value[2].number = iPlayerIcon + 1; + + value[3].type = IGGY_DATATYPE_number; + value[3].number = iVOIPIcon + 1; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_addNewItemFunc , 4 , value ); + + ++m_itemCount; +} + +void UIControl_PlayerList::setPlayerIcon(int iId, int iPlayerIcon) +{ + IggyDataValue result; + IggyDataValue value[2]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iId; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = iPlayerIcon + 1; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcSetPlayerIcon , 2 , value ); +} + +void UIControl_PlayerList::setVOIPIcon(int iId, int iVOIPIcon) +{ + IggyDataValue result; + IggyDataValue value[2]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iId; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = iVOIPIcon + 1; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcSetVOIPIcon , 2 , value ); +} diff --git a/Minecraft.Client/Common/UI/UIControl_PlayerList.h b/Minecraft.Client/Common/UI/UIControl_PlayerList.h new file mode 100644 index 00000000..8647d950 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_PlayerList.h @@ -0,0 +1,17 @@ +#pragma once + +#include "UIControl_ButtonList.h" + +class UIControl_PlayerList : public UIControl_ButtonList +{ +private: + IggyName m_funcSetPlayerIcon, m_funcSetVOIPIcon; + +public: + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + using UIControl_ButtonList::addItem; + void addItem(const wstring &label, int iPlayerIcon, int iVOIPIcon); + void setPlayerIcon(int iId, int iPlayerIcon); + void setVOIPIcon(int iId, int iVOIPIcon); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp b/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp new file mode 100644 index 00000000..544b4da1 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp @@ -0,0 +1,514 @@ +#include "stdafx.h" +#include "..\..\Minecraft.h" +#include "..\..\ScreenSizeCalculator.h" +#include "..\..\EntityRenderDispatcher.h" +#include "..\..\PlayerRenderer.h" +#include "..\..\HumanoidModel.h" +#include "..\..\Lighting.h" +#include "..\..\ModelPart.h" +#include "..\..\Options.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "UIControl_PlayerSkinPreview.h" + +//#define SKIN_PREVIEW_BOB_ANIM +#define SKIN_PREVIEW_WALKING_ANIM + +UIControl_PlayerSkinPreview::UIControl_PlayerSkinPreview() +{ + UIControl::setControlType(UIControl::ePlayerSkinPreview); + m_bDirty = FALSE; + m_fScale = 1.0f; + m_fAlpha = 1.0f; + + Minecraft *pMinecraft=Minecraft::GetInstance(); + + ScreenSizeCalculator ssc(pMinecraft->options, pMinecraft->width_phys, pMinecraft->height_phys); + m_fScreenWidth=(float)pMinecraft->width_phys; + m_fRawWidth=(float)ssc.rawWidth; + m_fScreenHeight=(float)pMinecraft->height_phys; + m_fRawHeight=(float)ssc.rawHeight; + + m_customTextureUrl = L"default"; + m_backupTexture = TN_MOB_CHAR; + m_capeTextureUrl = L""; + + m_yRot = 0; + m_xRot = 0; + + m_swingTime = 0.0f; + m_bobTick = 0.0f; + m_walkAnimSpeedO = 0.0f; + m_walkAnimSpeed = 0.0f; + m_walkAnimPos = 0.0f; + + m_bAutoRotate = false; + m_bRotatingLeft = false; + + m_incXRot = false; + m_decXRot = false; + m_incYRot = false; + m_decYRot = false; + + m_currentAnimation = e_SkinPreviewAnimation_Walking; + + m_fTargetRotation = 0.0f; + m_fOriginalRotation = 0.0f; + m_framesAnimatingRotation = 0; + m_bAnimatingToFacing = false; + m_pvAdditionalModelParts=NULL; + m_uiAnimOverrideBitmask=0L; +} + +void UIControl_PlayerSkinPreview::tick() +{ + UIControl::tick(); + + if( m_bAnimatingToFacing ) + { + ++m_framesAnimatingRotation; + m_yRot = m_fOriginalRotation + m_framesAnimatingRotation * ( (m_fTargetRotation - m_fOriginalRotation) / CHANGING_SKIN_FRAMES ); + + //if(m_framesAnimatingRotation == CHANGING_SKIN_FRAMES) m_bAnimatingToFacing = false; + } + else + { + if( m_incXRot ) IncrementXRotation(); + if( m_decXRot ) DecrementXRotation(); + if( m_incYRot ) IncrementYRotation(); + if( m_decYRot ) DecrementYRotation(); + + if(m_bAutoRotate) + { + ++m_rotateTick; + + if(m_rotateTick%4==0) + { + if(m_yRot >= LOOK_LEFT_EXTENT) + { + m_bRotatingLeft = false; + } + else if(m_yRot <= LOOK_RIGHT_EXTENT) + { + m_bRotatingLeft = true; + } + + if(m_bRotatingLeft) + { + IncrementYRotation(); + } + else + { + DecrementYRotation(); + } + } + } + } +} + +void UIControl_PlayerSkinPreview::SetTexture(const wstring &url, TEXTURE_NAME backupTexture) +{ + m_customTextureUrl = url; + m_backupTexture = backupTexture; + + unsigned int uiAnimOverrideBitmask = Player::getSkinAnimOverrideBitmask( app.getSkinIdFromPath(m_customTextureUrl) ); + + if(app.GetGameSettings(eGameSetting_CustomSkinAnim)==0 ) + { + // We have a force animation for some skins (claptrap) + // 4J-PB - treat all the eAnim_Disable flags as a force anim + + if((uiAnimOverrideBitmask & HumanoidModel::m_staticBitmaskIgnorePlayerCustomAnimSetting)!=0) + { + m_uiAnimOverrideBitmask=uiAnimOverrideBitmask; + } + else + { + m_uiAnimOverrideBitmask=0; + } + } + else + { + m_uiAnimOverrideBitmask = uiAnimOverrideBitmask; + } + + m_pvAdditionalModelParts=app.GetAdditionalModelParts(app.getSkinIdFromPath(m_customTextureUrl)); +} + +void UIControl_PlayerSkinPreview::SetFacing(ESkinPreviewFacing facing, bool bAnimate /*= false*/) +{ + switch(facing) + { + case e_SkinPreviewFacing_Forward: + m_fTargetRotation = 0; + m_bRotatingLeft = true; + break; + case e_SkinPreviewFacing_Left: + m_fTargetRotation = LOOK_LEFT_EXTENT; + m_bRotatingLeft = false; + break; + case e_SkinPreviewFacing_Right: + m_fTargetRotation = LOOK_RIGHT_EXTENT; + m_bRotatingLeft = true; + break; + } + + if(!bAnimate) + { + m_yRot = m_fTargetRotation; + m_bAnimatingToFacing = false; + } + else + { + m_fOriginalRotation = m_yRot; + m_bAnimatingToFacing = true; + m_framesAnimatingRotation = 0; + } +} + +void UIControl_PlayerSkinPreview::CycleNextAnimation() +{ + m_currentAnimation = (ESkinPreviewAnimations)(m_currentAnimation + 1); + if(m_currentAnimation >= e_SkinPreviewAnimation_Count) m_currentAnimation = e_SkinPreviewAnimation_Walking; + + m_swingTime = 0.0f; +} + +void UIControl_PlayerSkinPreview::CyclePreviousAnimation() +{ + m_currentAnimation = (ESkinPreviewAnimations)(m_currentAnimation - 1); + if(m_currentAnimation < e_SkinPreviewAnimation_Walking) m_currentAnimation = (ESkinPreviewAnimations)(e_SkinPreviewAnimation_Count - 1); + + m_swingTime = 0.0f; +} + +void UIControl_PlayerSkinPreview::render(IggyCustomDrawCallbackRegion *region) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + + glEnable(GL_RESCALE_NORMAL); + glEnable(GL_COLOR_MATERIAL); + glPushMatrix(); + + float width = region->x1 - region->x0; + float height = region->y1 - region->y0; + float xo = width/2; + float yo = height; + + glTranslatef(xo, yo - 3.5f, 50.0f); + //glTranslatef(120.0f, 294, 0.0f); + + float ss; + + // Base scale on height of this control + // Potentially we might want separate x & y scales here + ss = width / (m_fScreenWidth / m_fScreenHeight); + + glScalef(-ss, ss, ss); + glRotatef(180, 0, 0, 1); + + //glRotatef(45 + 90, 0, 1, 0); + Lighting::turnOn(); + //glRotatef(-45 - 90, 0, 1, 0); + + glRotatef(-(float)m_xRot, 1, 0, 0); + + // 4J Stu - Turning on hideGui while we do this stops the name rendering in split-screen + bool wasHidingGui = pMinecraft->options->hideGui; + pMinecraft->options->hideGui = true; + + //EntityRenderDispatcher::instance->render(pMinecraft->localplayers[0], 0, 0, 0, 0, 1); + EntityRenderer *renderer = EntityRenderDispatcher::instance->getRenderer(eTYPE_PLAYER); + if (renderer != NULL) + { + // 4J-PB - any additional parts to turn on for this player (skin dependent) + //vector *pAdditionalModelParts=mob->GetAdditionalModelParts(); + + if(m_pvAdditionalModelParts && m_pvAdditionalModelParts->size()!=0) + { + for(AUTO_VAR(it, m_pvAdditionalModelParts->begin()); it != m_pvAdditionalModelParts->end(); ++it) + { + ModelPart *pModelPart=*it; + + pModelPart->visible=true; + } + } + + render(renderer,0,0,0,0,1); + //renderer->postRender(entity, x, y, z, rot, a); + + // hide the additional parts + if(m_pvAdditionalModelParts && m_pvAdditionalModelParts->size()!=0) + { + for(AUTO_VAR(it, m_pvAdditionalModelParts->begin()); it != m_pvAdditionalModelParts->end(); ++it) + { + ModelPart *pModelPart=*it; + + pModelPart->visible=false; + } + } + } + + pMinecraft->options->hideGui = wasHidingGui; + + glPopMatrix(); + Lighting::turnOff(); + glDisable(GL_RESCALE_NORMAL); +} + +// 4J Stu - Modified version of MobRenderer::render that does not require an actual entity +void UIControl_PlayerSkinPreview::render(EntityRenderer *renderer, double x, double y, double z, float rot, float a) +{ + glPushMatrix(); + glDisable(GL_CULL_FACE); + + HumanoidModel *model = (HumanoidModel *)renderer->getModel(); + + //getAttackAnim(mob, a); + //if (armor != NULL) armor->attackTime = model->attackTime; + //model->riding = mob->isRiding(); + //if (armor != NULL) armor->riding = model->riding; + + // 4J Stu - Remember to reset these values once the rendering is done if you add another one + model->attackTime = 0; + model->sneaking = false; + model->holdingRightHand = false; + model->holdingLeftHand = false; + model->idle = false; + model->eating = false; + model->eating_swing = 0; + model->eating_t = 0; + model->young = false; + model->riding = false; + + model->m_uiAnimOverrideBitmask = m_uiAnimOverrideBitmask; + + if( !m_bAnimatingToFacing ) + { + switch( m_currentAnimation ) + { + case e_SkinPreviewAnimation_Sneaking: + model->sneaking = true; + break; + case e_SkinPreviewAnimation_Attacking: + model->holdingRightHand = true; + m_swingTime++; + if (m_swingTime >= (Player::SWING_DURATION * 3) ) + { + m_swingTime = 0; + } + model->attackTime = m_swingTime / (float) (Player::SWING_DURATION * 3); + break; + default: + break; + }; + } + + + float bodyRot = m_yRot; //(mob->yBodyRotO + (mob->yBodyRot - mob->yBodyRotO) * a); + float headRot = m_yRot; //(mob->yRotO + (mob->yRot - mob->yRotO) * a); + float headRotx = 0; //(mob->xRotO + (mob->xRot - mob->xRotO) * a); + + //setupPosition(mob, x, y, z); + // is equivalent to + glTranslatef((float) x, (float) y, (float) z); + + //float bob = getBob(mob, a); +#ifdef SKIN_PREVIEW_BOB_ANIM + float bob = (m_bobTick + a)/2; + + ++m_bobTick; + if(m_bobTick>=360*2) m_bobTick = 0; +#else + float bob = 0.0f; +#endif + + //setupRotations(mob, bob, bodyRot, a); + // is equivalent to + glRotatef(180 - bodyRot, 0, 1, 0); + + float _scale = 1 / 16.0f; + glEnable(GL_RESCALE_NORMAL); + glScalef(-1, -1, 1); + + //scale(mob, a); + // is equivalent to + float s = 15 / 16.0f; + glScalef(s, s, s); + + glTranslatef(0, -24 * _scale - 0.125f / 16.0f, 0); + +#ifdef SKIN_PREVIEW_WALKING_ANIM + m_walkAnimSpeedO = m_walkAnimSpeed; + m_walkAnimSpeed += (0.1f - m_walkAnimSpeed) * 0.4f; + m_walkAnimPos += m_walkAnimSpeed; + float ws = m_walkAnimSpeedO + (m_walkAnimSpeed - m_walkAnimSpeedO) * a; + float wp = m_walkAnimPos - m_walkAnimSpeed * (1 - a); +#else + float ws = 0; + float wp = 0; +#endif + + if (ws > 1) ws = 1; + + MemSect(31); + bindTexture(m_customTextureUrl, m_backupTexture); + MemSect(0); + glEnable(GL_ALPHA_TEST); + + //model->prepareMobModel(mob, wp, ws, a); + model->render(nullptr, wp, ws, bob, headRot - bodyRot, headRotx, _scale, true); + /*for (int i = 0; i < MAX_ARMOR_LAYERS; i++) + { + if (prepareArmor(mob, i, a)) + { + armor->render(wp, ws, bob, headRot - bodyRot, headRotx, _scale, true); + glDisable(GL_BLEND); + glEnable(GL_ALPHA_TEST); + } + }*/ + + //additionalRendering(mob, a); + if (bindTexture(m_capeTextureUrl, L"" )) + { + glPushMatrix(); + glTranslatef(0, 0, 2 / 16.0f); + + double xd = 0;//(mob->xCloakO + (mob->xCloak - mob->xCloakO) * a) - (mob->xo + (mob->x - mob->xo) * a); + double yd = 0;//(mob->yCloakO + (mob->yCloak - mob->yCloakO) * a) - (mob->yo + (mob->y - mob->yo) * a); + double zd = 0;//(mob->zCloakO + (mob->zCloak - mob->zCloakO) * a) - (mob->zo + (mob->z - mob->zo) * a); + + float yr = 1;//mob->yBodyRotO + (mob->yBodyRot - mob->yBodyRotO) * a; + + double xa = sin(yr * PI / 180); + double za = -cos(yr * PI / 180); + + float flap = (float) yd * 10; + if (flap < -6) flap = -6; + if (flap > 32) flap = 32; + float lean = (float) (xd * xa + zd * za) * 100; + float lean2 = (float) (xd * za - zd * xa) * 100; + if (lean < 0) lean = 0; + + //float pow = 1;//mob->oBob + (bob - mob->oBob) * a; + + flap += 1;//sin((mob->walkDistO + (mob->walkDist - mob->walkDistO) * a) * 6) * 32 * pow; + if (model->sneaking) + { + flap += 25; + } + + glRotatef(6.0f + lean / 2 + flap, 1, 0, 0); + glRotatef(lean2 / 2, 0, 0, 1); + glRotatef(-lean2 / 2, 0, 1, 0); + glRotatef(180, 0, 1, 0); + model->renderCloak(1 / 16.0f,true); + glPopMatrix(); + } + /* + float br = mob->getBrightness(a); + int overlayColor = getOverlayColor(mob, br, a); + + if (((overlayColor >> 24) & 0xff) > 0 || mob->hurtTime > 0 || mob->deathTime > 0) + { + glDisable(GL_TEXTURE_2D); + glDisable(GL_ALPHA_TEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glDepthFunc(GL_EQUAL); + + // 4J - changed these renders to not use the compiled version of their models, because otherwise the render states set + // about (in particular the depth & alpha test) don't work with our command buffer versions + if (mob->hurtTime > 0 || mob->deathTime > 0) + { + glColor4f(br, 0, 0, 0.4f); + model->render(wp, ws, bob, headRot - bodyRot, headRotx, _scale, false); + for (int i = 0; i < MAX_ARMOR_LAYERS; i++) + { + if (prepareArmorOverlay(mob, i, a)) + { + glColor4f(br, 0, 0, 0.4f); + armor->render(wp, ws, bob, headRot - bodyRot, headRotx, _scale, false); + } + } + } + + if (((overlayColor >> 24) & 0xff) > 0) + { + float r = ((overlayColor >> 16) & 0xff) / 255.0f; + float g = ((overlayColor >> 8) & 0xff) / 255.0f; + float b = ((overlayColor) & 0xff) / 255.0f; + float aa = ((overlayColor >> 24) & 0xff) / 255.0f; + glColor4f(r, g, b, aa); + model->render(wp, ws, bob, headRot - bodyRot, headRotx, _scale, false); + for (int i = 0; i < MAX_ARMOR_LAYERS; i++) + { + if (prepareArmorOverlay(mob, i, a)) + { + glColor4f(r, g, b, aa); + armor->render(wp, ws, bob, headRot - bodyRot, headRotx, _scale, false); + } + } + } + + glDepthFunc(GL_LEQUAL); + glDisable(GL_BLEND); + glEnable(GL_ALPHA_TEST); + glEnable(GL_TEXTURE_2D); + } + */ + glDisable(GL_RESCALE_NORMAL); + + glEnable(GL_CULL_FACE); + + glPopMatrix(); + + MemSect(31); + //renderName(mob, x, y, z); + MemSect(0); + + // Reset the model values to stop the changes we made here affecting anything in game (like the player hand render) + model->attackTime = 0; + model->sneaking = false; + model->holdingRightHand = false; + model->holdingLeftHand = false; +} + +bool UIControl_PlayerSkinPreview::bindTexture(const wstring& urlTexture, int backupTexture) +{ + Textures *t = Minecraft::GetInstance()->textures; + + // 4J-PB - no http textures on the xbox, mem textures instead + + //int id = t->loadHttpTexture(urlTexture, backupTexture); + int id = t->loadMemTexture(urlTexture, backupTexture); + + if (id >= 0) + { + t->bind(id); + return true; + } + else + { + return false; + } +} + +bool UIControl_PlayerSkinPreview::bindTexture(const wstring& urlTexture, const wstring& backupTexture) +{ + Textures *t = Minecraft::GetInstance()->textures; + + // 4J-PB - no http textures on the xbox, mem textures instead + + //int id = t->loadHttpTexture(urlTexture, backupTexture); + int id = t->loadMemTexture(urlTexture, backupTexture); + + if (id >= 0) + { + t->bind(id); + return true; + } + else + { + return false; + } +} diff --git a/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.h b/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.h new file mode 100644 index 00000000..a7c3126e --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.h @@ -0,0 +1,90 @@ +#pragma once + +#include "UIControl.h" +#include "..\..\Textures.h" + +class ModelPart; +class EntityRenderer; + +class UIControl_PlayerSkinPreview : public UIControl +{ +private: + static const int LOOK_LEFT_EXTENT = 45; + static const int LOOK_RIGHT_EXTENT = -45; + + static const int CHANGING_SKIN_FRAMES = 15; + + enum ESkinPreviewAnimations + { + e_SkinPreviewAnimation_Walking, + e_SkinPreviewAnimation_Sneaking, + e_SkinPreviewAnimation_Attacking, + + e_SkinPreviewAnimation_Count, + }; + + BOOL m_bDirty; + float m_fScale,m_fAlpha; + + wstring m_customTextureUrl; + TEXTURE_NAME m_backupTexture; + wstring m_capeTextureUrl; + unsigned int m_uiAnimOverrideBitmask; + + float m_fScreenWidth,m_fScreenHeight; + float m_fRawWidth,m_fRawHeight; + + int m_yRot,m_xRot; + + float m_bobTick; + + float m_walkAnimSpeedO; + float m_walkAnimSpeed; + float m_walkAnimPos; + + bool m_bAutoRotate, m_bRotatingLeft; + BYTE m_rotateTick; + float m_fTargetRotation, m_fOriginalRotation; + int m_framesAnimatingRotation; + bool m_bAnimatingToFacing; + + float m_swingTime; + + ESkinPreviewAnimations m_currentAnimation; + //vector *m_pvAdditionalBoxes; + vector *m_pvAdditionalModelParts; +public: + enum ESkinPreviewFacing + { + e_SkinPreviewFacing_Forward, + e_SkinPreviewFacing_Left, + e_SkinPreviewFacing_Right, + }; + + UIControl_PlayerSkinPreview(); + + virtual void tick(); + + void render(IggyCustomDrawCallbackRegion *region); + + void SetTexture(const wstring &url, TEXTURE_NAME backupTexture = TN_MOB_CHAR); + void SetCapeTexture(const wstring &url) { m_capeTextureUrl = url; } + void ResetRotation() { m_xRot = 0; m_yRot = 0; } + void IncrementYRotation() { m_yRot = (m_yRot+4); if(m_yRot >= 180) m_yRot = -180; } + void DecrementYRotation() { m_yRot = (m_yRot-4); if(m_yRot <= -180) m_yRot = 180; } + void IncrementXRotation() { m_xRot = (m_xRot+2); if(m_xRot > 22) m_xRot = 22; } + void DecrementXRotation() { m_xRot = (m_xRot-2); if(m_xRot < -22) m_xRot = -22; } + void SetAutoRotate(bool autoRotate) { m_bAutoRotate = autoRotate; } + void SetFacing(ESkinPreviewFacing facing, bool bAnimate = false); + + void CycleNextAnimation(); + void CyclePreviousAnimation(); + + bool m_incXRot, m_decXRot; + bool m_incYRot, m_decYRot; + +private: + void render(EntityRenderer *renderer, double x, double y, double z, float rot, float a); + bool bindTexture(const wstring& urlTexture, int backupTexture); + bool bindTexture(const wstring& urlTexture, const wstring& backupTexture); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_Progress.cpp b/Minecraft.Client/Common/UI/UIControl_Progress.cpp new file mode 100644 index 00000000..e2ab817d --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Progress.cpp @@ -0,0 +1,84 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_Progress.h" + +UIControl_Progress::UIControl_Progress() +{ + m_min = 0; + m_max = 100; + m_current = 0; + m_lastPercent = 0.0f; + m_showingBar = true; +} + +bool UIControl_Progress::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eProgress); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //Progress specific initialisers + m_setProgressFunc = registerFastName(L"setProgress"); + m_showBarFunc = registerFastName(L"ShowBar"); + + return success; +} + +void UIControl_Progress::init(const wstring &label, int id, int min, int max, int current) +{ + m_label = label; + m_id = id; + m_min = min; + m_max = max; + m_current = current; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_string_UTF16; + IggyStringUTF16 stringVal; + + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].string16 = stringVal; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_initFunc , 1 , value ); +} + +void UIControl_Progress::ReInit() +{ + UIControl_Base::ReInit(); + init(m_label, m_id, m_min, m_max, m_current); +} + +void UIControl_Progress::setProgress(int current) +{ + m_current = current; + + float percent = (float)((m_current-m_min))/(m_max-m_min); + + if(percent != m_lastPercent) + { + m_lastPercent = percent; + //app.DebugPrintf("Setting progress value to %d/%f\n", m_current, percent); + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = percent; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_setProgressFunc , 1 , value ); + } +} + +void UIControl_Progress::showBar(bool show) +{ + if(show != m_showingBar) + { + m_showingBar = show; + //app.DebugPrintf("Setting progress value to %d/%f\n", m_current, percent); + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = show; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_showBarFunc , 1 , value ); + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_Progress.h b/Minecraft.Client/Common/UI/UIControl_Progress.h new file mode 100644 index 00000000..8398a188 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Progress.h @@ -0,0 +1,25 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_Progress : public UIControl_Base +{ +private: + IggyName m_setProgressFunc, m_showBarFunc; + int m_min; + int m_max; + int m_current; + float m_lastPercent; + bool m_showingBar; + +public: + UIControl_Progress(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void init(const wstring &label, int id, int min, int max, int current); + virtual void ReInit(); + + void setProgress(int current); + void showBar(bool show); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_SaveList.cpp b/Minecraft.Client/Common/UI/UIControl_SaveList.cpp new file mode 100644 index 00000000..f83454d7 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_SaveList.cpp @@ -0,0 +1,106 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_SaveList.h" + +bool UIControl_SaveList::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eSaveList); + bool success = UIControl_ButtonList::setupControl(scene,parent,controlName); + + //SlotList specific initialisers + m_funcSetTextureName = registerFastName(L"SetTextureName"); + + return success; +} + +void UIControl_SaveList::addItem(const wstring &label) +{ + addItem(label, L""); +} + +void UIControl_SaveList::addItem(const string &label) +{ + addItem(label, L""); +} + +void UIControl_SaveList::addItem(const wstring &label, int data) +{ + addItem(label, L"", data); +} + +void UIControl_SaveList::addItem(const string &label, int data) +{ + addItem(label, L"", data); +} + +void UIControl_SaveList::addItem(const string &label, const wstring &iconName) +{ + addItem(label, iconName, m_itemCount); + ++m_itemCount; +} + +void UIControl_SaveList::addItem(const wstring &label, const wstring &iconName) +{ + addItem(label, iconName, m_itemCount); + ++m_itemCount; +} + +void UIControl_SaveList::addItem(const string &label, const wstring &iconName, int data) +{ + IggyDataValue result; + IggyDataValue value[3]; + + IggyStringUTF8 stringVal; + stringVal.string = (char*)label.c_str(); + stringVal.length = (S32)label.length(); + value[0].type = IGGY_DATATYPE_string_UTF8; + value[0].string8 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = m_itemCount; + + IggyStringUTF16 stringVal2; + stringVal2.string = (IggyUTF16*)iconName.c_str(); + stringVal2.length = iconName.length(); + value[2].type = IGGY_DATATYPE_string_UTF16; + value[2].string16 = stringVal2; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_addNewItemFunc , 3 , value ); +} + +void UIControl_SaveList::addItem(const wstring &label, const wstring &iconName, int data) +{ + IggyDataValue result; + IggyDataValue value[3]; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = (S32)label.length(); + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = m_itemCount; + + IggyStringUTF16 stringVal2; + stringVal2.string = (IggyUTF16*)iconName.c_str(); + stringVal2.length = iconName.length(); + value[2].type = IGGY_DATATYPE_string_UTF16; + value[2].string16 = stringVal2; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_addNewItemFunc , 3 , value ); +} + +void UIControl_SaveList::setTextureName(int iId, const wstring &iconName) +{ + IggyDataValue result; + IggyDataValue value[2]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iId; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)iconName.c_str(); + stringVal.length = iconName.length(); + value[1].type = IGGY_DATATYPE_string_UTF16; + value[1].string16 = stringVal; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcSetTextureName , 2 , value ); +} diff --git a/Minecraft.Client/Common/UI/UIControl_SaveList.h b/Minecraft.Client/Common/UI/UIControl_SaveList.h new file mode 100644 index 00000000..7c72fea9 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_SaveList.h @@ -0,0 +1,29 @@ +#pragma once + +#include "UIControl_ButtonList.h" + +class UIControl_SaveList : public UIControl_ButtonList +{ +private: + IggyName m_funcSetTextureName; + +public: + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + using UIControl_ButtonList::addItem; + + void addItem(const wstring &label); + void addItem(const string &label); + + void addItem(const wstring &label, int data); + void addItem(const string &label, int data); + + void addItem(const string &label, const wstring &iconName); + void addItem(const wstring &label, const wstring &iconName); + void setTextureName(int iId, const wstring &iconName); + +private: + void addItem(const string &label, const wstring &iconName, int data); + void addItem(const wstring &label, const wstring &iconName, int data); + +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_Slider.cpp b/Minecraft.Client/Common/UI/UIControl_Slider.cpp new file mode 100644 index 00000000..bd3b1ada --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Slider.cpp @@ -0,0 +1,119 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_Slider.h" + +UIControl_Slider::UIControl_Slider() +{ + m_id = 0; + m_min = 0; + m_max = 100; + m_current = 0; +} + +bool UIControl_Slider::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eSlider); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //Slider specific initialisers + m_funcSetRelativeSliderPos = registerFastName(L"SetRelativeSliderPos"); + m_funcGetRealWidth = registerFastName(L"GetRealWidth"); + + return success; +} + +void UIControl_Slider::init(const wstring &label, int id, int min, int max, int current) +{ + m_label = label; + m_id = id; + m_min = min; + m_max = max; + m_current = current; + + IggyDataValue result; + IggyDataValue value[5]; + value[0].type = IGGY_DATATYPE_string_UTF16; + IggyStringUTF16 stringVal; + + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].string16 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = (int)id; + + value[2].type = IGGY_DATATYPE_number; + value[2].number = (int)min; + + value[3].type = IGGY_DATATYPE_number; + value[3].number = (int)max; + + value[4].type = IGGY_DATATYPE_number; + value[4].number = (int)current; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_initFunc , 5 , value ); + +#ifdef __PSVITA__ + // 4J-TomK - add slider to the vita touch box list + + switch(m_parentScene->GetParentLayer()->m_iLayer) + { + case eUILayer_Fullscreen: + case eUILayer_Scene: + case eUILayer_HUD: + ui.TouchBoxAdd(this,m_parentScene); + break; + } +#endif +} + +void UIControl_Slider::handleSliderMove(int newValue) +{ + if (m_current!=newValue) + { + ui.PlayUISFX(eSFX_Scroll); + m_current = newValue; + + if(newValue < m_allPossibleLabels.size()) + { + setLabel(m_allPossibleLabels[newValue]); + } + } +} + +void UIControl_Slider::SetSliderTouchPos(float fTouchPos) +{ + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = fTouchPos; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcSetRelativeSliderPos , 1 , value ); + } + +S32 UIControl_Slider::GetRealWidth() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcGetRealWidth , 0 , NULL ); + + S32 iRealWidth = m_width; + if(result.type == IGGY_DATATYPE_number) + { + iRealWidth = (S32)result.number; + } + return iRealWidth; +} + +void UIControl_Slider::setAllPossibleLabels(int labelCount, wchar_t labels[][256]) +{ + for(unsigned int i = 0; i < labelCount; ++i) + { + m_allPossibleLabels.push_back(labels[i]); + } + UIControl_Base::setAllPossibleLabels(labelCount, labels); +} + +void UIControl_Slider::ReInit() +{ + UIControl_Base::ReInit(); + + init(m_label, m_id, m_min, m_max, m_current); +} diff --git a/Minecraft.Client/Common/UI/UIControl_Slider.h b/Minecraft.Client/Common/UI/UIControl_Slider.h new file mode 100644 index 00000000..0b57c2f1 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Slider.h @@ -0,0 +1,32 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_Slider : public UIControl_Base +{ +private: + //int m_id; // 4J-TomK this is part of class UIControl and doesn't need to be here! + int m_min; + int m_max; + int m_current; + + vector m_allPossibleLabels; + + // 4J-TomK - function for setting slider position on touch + IggyName m_funcSetRelativeSliderPos; + IggyName m_funcGetRealWidth; + +public: + UIControl_Slider(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void init(const wstring &label, int id, int min, int max, int current); + + void handleSliderMove(int newValue); + void SetSliderTouchPos(float fTouchPos); + virtual void setAllPossibleLabels(int labelCount, wchar_t labels[][256]); + + S32 GetRealWidth(); + virtual void ReInit(); +}; diff --git a/Minecraft.Client/Common/UI/UIControl_SlotList.cpp b/Minecraft.Client/Common/UI/UIControl_SlotList.cpp new file mode 100644 index 00000000..e2130431 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_SlotList.cpp @@ -0,0 +1,93 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_SlotList.h" + +UIControl_SlotList::UIControl_SlotList() +{ + m_lastHighlighted = -1; +} + +bool UIControl_SlotList::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eSlotList); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //SlotList specific initialisers + m_addSlotFunc = registerFastName(L"addSlot"); + m_setRedBoxFunc = registerFastName(L"SetSlotRedBox"); + m_setHighlightFunc = registerFastName(L"SetSlotHighlight"); + + m_lastHighlighted = 0; + + return success; +} + +void UIControl_SlotList::addSlot(int id) +{ + IggyDataValue result; + IggyDataValue value[3]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = id; + + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = false; + value[2].type = IGGY_DATATYPE_boolean; + value[2].boolval = false; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_addSlotFunc ,3 , value ); +} + +void UIControl_SlotList::addSlots(int iStartValue, int iCount) +{ + for(unsigned int i = iStartValue; i < iStartValue + iCount; ++i) + { + addSlot(i); + } +} + + +void UIControl_SlotList::setHighlightSlot(int index) +{ + if(index != m_lastHighlighted) + { + if(m_lastHighlighted != -1) + { + setSlotHighlighted(m_lastHighlighted, false); + } + setSlotHighlighted(index, true); + m_lastHighlighted = index; + } +} + +void UIControl_SlotList::setSlotHighlighted(int index, bool highlight) +{ + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = index; + + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = highlight; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_setHighlightFunc , 2 , value ); +} + +void UIControl_SlotList::showSlotRedBox(int index, bool show) +{ + //app.DebugPrintf("Setting red box at index %d to %s\n", index, show?"on":"off"); + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = index; + + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = show; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_setRedBoxFunc , 2, value ); +} + +void UIControl_SlotList::setFocus(bool focus) +{ + if(m_lastHighlighted != -1) + { + if(focus) setSlotHighlighted(m_lastHighlighted, true); + else setSlotHighlighted(m_lastHighlighted, false); + } +} diff --git a/Minecraft.Client/Common/UI/UIControl_SlotList.h b/Minecraft.Client/Common/UI/UIControl_SlotList.h new file mode 100644 index 00000000..ee741c4d --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_SlotList.h @@ -0,0 +1,28 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_SlotList : public UIControl_Base +{ +private: + //IggyName m_addSlotFunc, m_getSlotFunc, m_setRedBoxFunc, m_setHighlightFunc; + IggyName m_addSlotFunc, m_setRedBoxFunc, m_setHighlightFunc; + + int m_lastHighlighted; + +public: + UIControl_SlotList(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void addSlot(int id); + void addSlots(int iStartValue, int iCount); + + void setHighlightSlot(int index); + void showSlotRedBox(int index, bool show); + + virtual void setFocus(bool focus); + +private: + void setSlotHighlighted(int index, bool highlight); +}; diff --git a/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.cpp b/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.cpp new file mode 100644 index 00000000..dfdea93e --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.cpp @@ -0,0 +1,122 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_SpaceIndicatorBar.h" + +UIControl_SpaceIndicatorBar::UIControl_SpaceIndicatorBar() +{ + m_min = 0; + m_max = 100; + m_currentSave = 0; + m_currentTotal = 0; + m_currentOffset = 0.0f; +} + +bool UIControl_SpaceIndicatorBar::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eProgress); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //Progress specific initialisers + m_setSaveSizeFunc = registerFastName(L"setSaveGameSize"); + m_setTotalSizeFunc = registerFastName(L"setTotalSize"); + m_setSaveGameOffsetFunc = registerFastName(L"setSaveGameOffset"); + + return success; +} + +void UIControl_SpaceIndicatorBar::init(const wstring &label, int id, __int64 min, __int64 max) +{ + m_label = label; + m_id = id; + m_min = min; + m_max = max; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_string_UTF16; + IggyStringUTF16 stringVal; + + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].string16 = stringVal; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_initFunc , 1 , value ); +} + +void UIControl_SpaceIndicatorBar::ReInit() +{ + UIControl_Base::ReInit(); + init(m_label, m_id, m_min, m_max); + setSaveSize(m_currentSave); + setTotalSize(m_currentTotal); + setSaveGameOffset(m_currentOffset); +} + +void UIControl_SpaceIndicatorBar::reset() +{ + m_sizeAndOffsets.clear(); + m_currentTotal = 0; + setTotalSize(0); + setSaveSize(0); + setSaveGameOffset(0.0f); +} + +void UIControl_SpaceIndicatorBar::addSave(__int64 size) +{ + float startPercent = (float)((m_currentTotal-m_min))/(m_max-m_min); + + m_sizeAndOffsets.push_back( pair<__int64, float>(size, startPercent) ); + + m_currentTotal += size; + setTotalSize(m_currentTotal); +} + +void UIControl_SpaceIndicatorBar::selectSave(int index) +{ + if(index >= 0 && index < m_sizeAndOffsets.size()) + { + pair<__int64,float> values = m_sizeAndOffsets[index]; + setSaveSize(values.first); + setSaveGameOffset(values.second); + } + else + { + setSaveSize(0); + setSaveGameOffset(0); + } +} + +void UIControl_SpaceIndicatorBar::setSaveSize(__int64 size) +{ + m_currentSave = size; + + float percent = (float)((m_currentSave-m_min))/(m_max-m_min); + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = percent; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_setSaveSizeFunc , 1 , value ); +} + +void UIControl_SpaceIndicatorBar::setTotalSize(__int64 size) +{ + float percent = (float)((m_currentTotal-m_min))/(m_max-m_min); + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = percent; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_setTotalSizeFunc , 1 , value ); +} + +void UIControl_SpaceIndicatorBar::setSaveGameOffset(float offset) +{ + m_currentOffset = offset; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = m_currentOffset; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_setSaveGameOffsetFunc , 1 , value ); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.h b/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.h new file mode 100644 index 00000000..39f9a746 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.h @@ -0,0 +1,33 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_SpaceIndicatorBar : public UIControl_Base +{ +private: + IggyName m_setSaveSizeFunc, m_setTotalSizeFunc, m_setSaveGameOffsetFunc; + __int64 m_min; + __int64 m_max; + __int64 m_currentSave, m_currentTotal; + float m_currentOffset; + + vector > m_sizeAndOffsets; + +public: + UIControl_SpaceIndicatorBar(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void init(const wstring &label, int id, __int64 min, __int64 max); + virtual void ReInit(); + void reset(); + + void addSave(__int64 size); + void selectSave(int index); + + +private: + void setSaveSize(__int64 size); + void setTotalSize(__int64 totalSize); + void setSaveGameOffset(float offset); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_TextInput.cpp b/Minecraft.Client/Common/UI/UIControl_TextInput.cpp new file mode 100644 index 00000000..4cb78d50 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_TextInput.cpp @@ -0,0 +1,83 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_TextInput.h" + +UIControl_TextInput::UIControl_TextInput() +{ + m_bHasFocus = false; +} + +bool UIControl_TextInput::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eTextInput); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //TextInput specific initialisers + m_textName = registerFastName(L"text"); + m_funcChangeState = registerFastName(L"ChangeState"); + m_funcSetCharLimit = registerFastName(L"SetCharLimit"); + + return success; +} + +void UIControl_TextInput::init(const wstring &label, int id) +{ + m_label = label; + m_id = id; + + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_string_UTF16; + IggyStringUTF16 stringVal; + + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].string16 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = id; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_initFunc , 2 , value ); + + #ifdef __PSVITA__ + // 4J-TomK - add this buttonlist to the vita touch box list + + switch(m_parentScene->GetParentLayer()->m_iLayer) + { + case eUILayer_Fullscreen: + case eUILayer_Scene: + case eUILayer_HUD: + ui.TouchBoxAdd(this,m_parentScene); + break; + } + #endif +} + +void UIControl_TextInput::ReInit() +{ + UIControl_Base::ReInit(); + + init(m_label, m_id); +} + +void UIControl_TextInput::setFocus(bool focus) +{ + if(m_bHasFocus != focus) + { + m_bHasFocus = focus; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = focus?0:1; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcChangeState , 1 , value ); + } +} + +void UIControl_TextInput::SetCharLimit(int iLimit) +{ + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = iLimit; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcSetCharLimit , 1 , value ); +} diff --git a/Minecraft.Client/Common/UI/UIControl_TextInput.h b/Minecraft.Client/Common/UI/UIControl_TextInput.h new file mode 100644 index 00000000..d4023884 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_TextInput.h @@ -0,0 +1,22 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_TextInput : public UIControl_Base +{ +private: + IggyName m_textName, m_funcChangeState, m_funcSetCharLimit; + bool m_bHasFocus; + +public: + UIControl_TextInput(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void init(const wstring &label, int id); + void ReInit(); + + virtual void setFocus(bool focus); + + void SetCharLimit(int iLimit); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_TexturePackList.cpp b/Minecraft.Client/Common/UI/UIControl_TexturePackList.cpp new file mode 100644 index 00000000..02336e00 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_TexturePackList.cpp @@ -0,0 +1,145 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_TexturePackList.h" + +UIControl_TexturePackList::UIControl_TexturePackList() +{ +} + +bool UIControl_TexturePackList::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eTexturePackList); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + //SlotList specific initialisers + m_addPackFunc = registerFastName(L"addPack"); + m_clearSlotsFunc = registerFastName(L"removeAllItems"); + m_funcSelectSlot = registerFastName(L"SelectSlot"); + m_funcEnableSelector = registerFastName(L"EnableSelector"); + m_funcSetTouchFocus = registerFastName(L"SetTouchFocus"); + m_funcCanTouchTrigger = registerFastName(L"CanTouchTrigger"); + m_funcGetRealHeight = registerFastName(L"GetRealHeight"); + + return success; +} + +void UIControl_TexturePackList::init(const wstring &label, int id) +{ + m_label = label; + m_id = id; + + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_string_UTF16; + IggyStringUTF16 stringVal; + + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].string16 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = id; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_initFunc , 2 , value ); + +#ifdef __PSVITA__ + // 4J-TomK - add this texturepack list to the vita touch box list + + switch(m_parentScene->GetParentLayer()->m_iLayer) + { + case eUILayer_Fullscreen: + case eUILayer_Scene: + case eUILayer_HUD: + ui.TouchBoxAdd(this,m_parentScene); + break; + } +#endif +} + +void UIControl_TexturePackList::addPack(int id, const wstring &textureName) +{ + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = id; + + value[1].type = IGGY_DATATYPE_string_UTF16; + IggyStringUTF16 stringVal; + + stringVal.string = (IggyUTF16*)textureName.c_str(); + stringVal.length = textureName.length(); + value[1].string16 = stringVal; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_addPackFunc ,2 , value ); +} + +void UIControl_TexturePackList::selectSlot(int id) +{ + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = id; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcSelectSlot ,1 , value ); +} + +void UIControl_TexturePackList::clearSlots() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_clearSlotsFunc ,0 , NULL ); +} + +void UIControl_TexturePackList::setEnabled(bool enable) +{ + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].number = enable; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath(), m_funcEnableSelector ,1 , value ); +} + +void UIControl_TexturePackList::SetTouchFocus(S32 iX, S32 iY, bool bRepeat) +{ + IggyDataValue result; + IggyDataValue value[3]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iX; + value[1].type = IGGY_DATATYPE_number; + value[1].number = iY; + value[2].type = IGGY_DATATYPE_boolean; + value[2].boolval = bRepeat; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie(), &result, getIggyValuePath(), m_funcSetTouchFocus, 3 , value ); +} + +bool UIControl_TexturePackList::CanTouchTrigger(S32 iX, S32 iY) +{ + IggyDataValue result; + IggyDataValue value[2]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iX; + value[1].type = IGGY_DATATYPE_number; + value[1].number = iY; + + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie(), &result, getIggyValuePath(), m_funcCanTouchTrigger, 2 , value ); + + S32 bCanTouchTrigger = false; + if(result.type == IGGY_DATATYPE_boolean) + { + bCanTouchTrigger = (bool)result.boolval; + } + return bCanTouchTrigger; +} + +S32 UIControl_TexturePackList::GetRealHeight() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcGetRealHeight, 0 , NULL ); + + S32 iRealHeight = m_height; + if(result.type == IGGY_DATATYPE_number) + { + iRealHeight = (S32)result.number; + } + return iRealHeight; +} + diff --git a/Minecraft.Client/Common/UI/UIControl_TexturePackList.h b/Minecraft.Client/Common/UI/UIControl_TexturePackList.h new file mode 100644 index 00000000..ce476fb1 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_TexturePackList.h @@ -0,0 +1,27 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_TexturePackList : public UIControl_Base +{ +private: + IggyName m_addPackFunc, m_funcSelectSlot, m_funcSetTouchFocus, m_funcCanTouchTrigger, m_funcGetRealHeight,m_clearSlotsFunc; + IggyName m_funcEnableSelector; + +public: + UIControl_TexturePackList(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void init(const wstring &label, int id); + + void addPack(int id, const wstring &textureName); + void selectSlot(int id); + void clearSlots(); + + virtual void setEnabled(bool enable); + + void SetTouchFocus(S32 iX, S32 iY, bool bRepeat); + bool CanTouchTrigger(S32 iX, S32 iY); + S32 GetRealHeight(); +}; diff --git a/Minecraft.Client/Common/UI/UIControl_Touch.cpp b/Minecraft.Client/Common/UI/UIControl_Touch.cpp new file mode 100644 index 00000000..bd57882f --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Touch.cpp @@ -0,0 +1,38 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_Touch.h" + +UIControl_Touch::UIControl_Touch() +{ +} + +bool UIControl_Touch::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + UIControl::setControlType(UIControl::eTouchControl); + bool success = UIControl_Base::setupControl(scene,parent,controlName); + + return success; +} + +void UIControl_Touch::init(int iId) +{ + m_id = iId; + + // 4J-TomK - add this touch control to the vita touch box list + switch(m_parentScene->GetParentLayer()->m_iLayer) + { + case eUILayer_Error: + case eUILayer_Fullscreen: + case eUILayer_Scene: + case eUILayer_HUD: + ui.TouchBoxAdd(this,m_parentScene); + break; + } +} + +void UIControl_Touch::ReInit() +{ + UIControl_Base::ReInit(); + + init(m_id); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_Touch.h b/Minecraft.Client/Common/UI/UIControl_Touch.h new file mode 100644 index 00000000..8ae799a0 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_Touch.h @@ -0,0 +1,16 @@ +#pragma once + +#include "UIControl_Base.h" + +class UIControl_Touch : public UIControl_Base +{ +private: + +public: + UIControl_Touch(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void init(int id); + virtual void ReInit(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIController.cpp b/Minecraft.Client/Common/UI/UIController.cpp new file mode 100644 index 00000000..7493ff06 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIController.cpp @@ -0,0 +1,3015 @@ +#include "stdafx.h" +#include "UIController.h" +#include "UI.h" +#include "UIScene.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\LocalPlayer.h" +#include "..\..\DLCTexturePack.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\Minecraft.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.boss.enderdragon.h" +#include "..\..\EnderDragonRenderer.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "UIFontData.h" +#ifdef __PSVITA__ +#include +#endif + +// 4J Stu - Enable this to override the Iggy Allocator +//#define ENABLE_IGGY_ALLOCATOR +//#define EXCLUDE_IGGY_ALLOCATIONS_FROM_HEAP_INSPECTOR + +//#define ENABLE_IGGY_EXPLORER +#ifdef ENABLE_IGGY_EXPLORER +#include "Windows64\Iggy\include\iggyexpruntime.h" +#endif + +//#define ENABLE_IGGY_PERFMON +#ifdef ENABLE_IGGY_PERFMON + +#define PM_ORIGIN_X 24 +#define PM_ORIGIN_Y 34 + +#ifdef __ORBIS__ +#include "Orbis\Iggy\include\iggyperfmon.h" +#include "Orbis\Iggy\include\iggyperfmon_orbis.h" +#elif defined _DURANGO +#include "Durango\Iggy\include\iggyperfmon.h" +#elif defined __PS3__ +#include "PS3\Iggy\include\iggyperfmon.h" +#include "PS3\Iggy\include\iggyperfmon_ps3.h" +#elif defined __PSVITA__ +#include "PSVita\Iggy\include\iggyperfmon.h" +#include "PSVita\Iggy\include\iggyperfmon_psp2.h" +#elif defined __WINDOWS64 +#include "Windows64\Iggy\include\iggyperfmon.h" +#endif + +#endif + +CRITICAL_SECTION UIController::ms_reloadSkinCS; +bool UIController::ms_bReloadSkinCSInitialised = false; + +DWORD UIController::m_dwTrialTimerLimitSecs=DYNAMIC_CONFIG_DEFAULT_TRIAL_TIME; + +static void RADLINK WarningCallback(void *user_callback_data, Iggy *player, IggyResult code, const char *message) +{ + //enum IggyResult{ IGGY_RESULT_SUCCESS = 0, IGGY_RESULT_Warning_None = 0, + // IGGY_RESULT_Warning_Misc = 100, IGGY_RESULT_Warning_GDraw = 101, + // IGGY_RESULT_Warning_ProgramFlow = 102, + // IGGY_RESULT_Warning_Actionscript = 103, + // IGGY_RESULT_Warning_Graphics = 104, IGGY_RESULT_Warning_Font = 105, + // IGGY_RESULT_Warning_Timeline = 106, IGGY_RESULT_Warning_Library = 107, + // IGGY_RESULT_Warning_CannotSustainFrameRate = 201, + // IGGY_RESULT_Warning_ThrewException = 202, + // IGGY_RESULT_Error_Threshhold = 400, IGGY_RESULT_Error_Misc = 400, + // IGGY_RESULT_Error_GDraw = 401, IGGY_RESULT_Error_ProgramFlow = 402, + // IGGY_RESULT_Error_Actionscript = 403, IGGY_RESULT_Error_Graphics = 404, + // IGGY_RESULT_Error_Font = 405, IGGY_RESULT_Error_Create = 406, + // IGGY_RESULT_Error_Library = 407, IGGY_RESULT_Error_ValuePath = 408, + // IGGY_RESULT_Error_Audio = 409, IGGY_RESULT_Error_Internal = 499, + // IGGY_RESULT_Error_InvalidIggy = 501, + // IGGY_RESULT_Error_InvalidArgument = 502, + // IGGY_RESULT_Error_InvalidEntity = 503, + // IGGY_RESULT_Error_UndefinedEntity = 504, + // IGGY_RESULT_Error_OutOfMemory = 1001,}; + + switch(code) + { + case IGGY_RESULT_Warning_CannotSustainFrameRate: + // Ignore warning + break; + default: + /* Normally, we'd want to issue this warning to some kind of + logging system or error reporting system, but since this is a + tutorial app, we just use Win32's default error stream. Since + ActionScript 3 exceptions are routed through this warning + callback, it's definitely a good idea to make sure these + warnings get printed somewhere that's easy for you to read and + use for debugging, otherwise debugging errors in the + ActionScript 3 code in your Flash content will be very + difficult! */ + app.DebugPrintf(app.USER_SR, message); + app.DebugPrintf(app.USER_SR, "\n"); + break; + }; +} + + +/* Flash provides a way for ActionScript 3 code to print debug output +using a function called "trace". It's very useful for debugging +Flash programs, so ideally, when using Iggy, we'd like to see any +trace output alongside our own debugging output. To facilitate +this, Iggy allows us to install a callback that will be called +any time ActionScript code calls trace. */ +static void RADLINK TraceCallback(void *user_callback_data, Iggy *player, char const *utf8_string, S32 length_in_bytes) +{ + app.DebugPrintf(app.USER_UI, (char *)utf8_string); +} + +#ifdef ENABLE_IGGY_PERFMON +static void *RADLINK perf_malloc(void *handle, U32 size) +{ + return malloc(size); +} + +static void RADLINK perf_free(void *handle, void *ptr) +{ + return free(ptr); +} +#endif + +#ifdef EXCLUDE_IGGY_ALLOCATIONS_FROM_HEAP_INSPECTOR +extern "C" void *__real_malloc(size_t t); +extern "C" void __real_free(void *t); +#endif + +__int64 UIController::iggyAllocCount = 0; +static unordered_map allocations; +static void * RADLINK AllocateFunction ( void * alloc_callback_user_data , size_t size_requested , size_t * size_returned ) +{ + UIController *controller = (UIController *)alloc_callback_user_data; + EnterCriticalSection(&controller->m_Allocatorlock); +#ifdef EXCLUDE_IGGY_ALLOCATIONS_FROM_HEAP_INSPECTOR + void *alloc = __real_malloc(size_requested); +#else + void *alloc = malloc(size_requested); +#endif + *size_returned = size_requested; + UIController::iggyAllocCount += size_requested; + allocations[alloc] = size_requested; + app.DebugPrintf(app.USER_SR, "Allocating %d, new total: %d\n", size_requested, UIController::iggyAllocCount); + LeaveCriticalSection(&controller->m_Allocatorlock); + return alloc; +} + +static void RADLINK DeallocateFunction ( void * alloc_callback_user_data , void * ptr ) +{ + UIController *controller = (UIController *)alloc_callback_user_data; + EnterCriticalSection(&controller->m_Allocatorlock); + size_t size = allocations[ptr]; + UIController::iggyAllocCount -= size; + allocations.erase(ptr); + app.DebugPrintf(app.USER_SR, "Freeing %d, new total %d\n", size, UIController::iggyAllocCount); +#ifdef EXCLUDE_IGGY_ALLOCATIONS_FROM_HEAP_INSPECTOR + __real_free(ptr); +#else + free(ptr); +#endif + LeaveCriticalSection(&controller->m_Allocatorlock); +} + +UIController::UIController() +{ + m_uiDebugConsole = NULL; + m_reloadSkinThread = NULL; + m_navigateToHomeOnReload = false; + m_mcTTFFont= NULL; + m_moj7 = NULL; + m_moj11 = NULL; + +#ifdef ENABLE_IGGY_ALLOCATOR + InitializeCriticalSection(&m_Allocatorlock); +#endif + + // 4J Stu - This is a bit of a hack until we change the Minecraft initialisation to store the proper screen size for other platforms +#if defined _WINDOWS64 || defined _DURANGO || defined __ORBIS__ + m_fScreenWidth = 1920.0f; + m_fScreenHeight = 1080.0f; + m_bScreenWidthSetup = true; +#else + m_fScreenWidth = 1280.0f; + m_fScreenHeight = 720.0f; + m_bScreenWidthSetup = false; +#endif + + for(unsigned int i = 0; i < eLibrary_Count; ++i) + { + m_iggyLibraries[i] = IGGY_INVALID_LIBRARY; + } + + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + m_bMenuDisplayed[i] = false; + m_iCountDown[i]=0; + m_bMenuToBeClosed[i]=false; + + for(unsigned int key = 0; key <= ACTION_MAX_MENU; ++key) + { + m_actionRepeatTimer[i][key] = 0; + } + } + + for(unsigned int i = 0; i < eUIGroup_COUNT; ++i) + { + m_bCloseAllScenes[i] = false; + } + + m_iPressStartQuadrantsMask = 0; + + m_currentRenderViewport = C4JRender::VIEWPORT_TYPE_FULLSCREEN; + m_bCustomRenderPosition = false; + m_winUserIndex = 0; + m_accumulatedTicks = 0; + + InitializeCriticalSection(&m_navigationLock); + InitializeCriticalSection(&m_registeredCallbackScenesCS); + //m_bSysUIShowing=false; + m_bSystemUIShowing=false; +#ifdef __PSVITA__ + m_bTouchscreenPressed=false; +#endif + + if(!ms_bReloadSkinCSInitialised) + { + // MGH - added to prevent crash loading Iggy movies while the skins were being reloaded + InitializeCriticalSection(&ms_reloadSkinCS); + ms_bReloadSkinCSInitialised = true; + } +} + +void UIController::SetSysUIShowing(bool bVal) +{ + if(bVal) app.DebugPrintf("System UI showing\n"); + else app.DebugPrintf("System UI stopped showing\n"); + m_bSystemUIShowing=bVal; +} + +void UIController::SetSystemUIShowing(LPVOID lpParam,bool bVal) +{ + UIController *pClass=(UIController *)lpParam; + pClass->SetSysUIShowing(bVal); +} + +// SETUP +void UIController::preInit(S32 width, S32 height) +{ + m_fScreenWidth = width; + m_fScreenHeight = height; + m_bScreenWidthSetup = true; + +#ifdef ENABLE_IGGY_ALLOCATOR + IggyAllocator allocator; + allocator.user_callback_data = this; + allocator.mem_alloc = &AllocateFunction; + allocator.mem_free = &DeallocateFunction; + IggyInit(&allocator); +#else + IggyInit(0); +#endif + + IggySetWarningCallback(WarningCallback, 0); + IggySetTraceCallbackUTF8(TraceCallback, 0); + + setFontCachingCalculationBuffer(-1); +} + +void UIController::postInit() +{ + // set up a custom rendering callback + IggySetCustomDrawCallback(&UIController::CustomDrawCallback, this); + IggySetAS3ExternalFunctionCallbackUTF16 ( &UIController::ExternalFunctionCallback, this ); + IggySetTextureSubstitutionCallbacks ( &UIController::TextureSubstitutionCreateCallback , &UIController::TextureSubstitutionDestroyCallback, this ); + + SetupFont(); + // + loadSkins(); + + for(unsigned int i = 0; i < eUIGroup_COUNT; ++i) + { + m_groups[i] = new UIGroup((EUIGroup)i,i-1); + } + + +#ifdef ENABLE_IGGY_EXPLORER + iggy_explorer = IggyExpCreate("127.0.0.1", 9190, malloc(IGGYEXP_MIN_STORAGE), IGGYEXP_MIN_STORAGE); + if ( iggy_explorer == NULL ) + { + // not normally an error, just an error for this demo! + app.DebugPrintf( "Couldn't connect to Iggy Explorer, did you run it first?" ); + } + else + { + IggyUseExplorer( m_groups[1]->getHUD()->getMovie(), iggy_explorer); + } +#endif + +#ifdef ENABLE_IGGY_PERFMON + m_iggyPerfmonEnabled = false; + iggy_perfmon = IggyPerfmonCreate(perf_malloc, perf_free, NULL); + IggyInstallPerfmon(iggy_perfmon); +#endif + + NavigateToScene(0, eUIScene_Intro); +} + +void UIController::SetupFont() +{ + bool bBitmapFont=false; + + if(m_mcTTFFont!=NULL) + { + delete m_mcTTFFont; + } + + switch(XGetLanguage()) + { +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + case XC_LANGUAGE_JAPANESE: + m_mcTTFFont = new UITTFFont("Common/Media/font/JPN/DF-DotDotGothic16.ttf", 0x203B); // JPN + break; + case XC_LANGUAGE_SCHINESE: //TODO + case XC_LANGUAGE_TCHINESE: + m_mcTTFFont = new UITTFFont("Common/Media/font/CHT/DFTT_R5.TTC", 0x203B); // CHT + break; + case XC_LANGUAGE_KOREAN: + m_mcTTFFont = new UITTFFont("Common/Media/font/KOR/candadite2.ttf", 0x203B); // KOR + break; + // 4J-JEV, Cyrillic characters have been added to this font now, (4/July/14) + //case XC_LANGUAGE_RUSSIAN: + //case XC_LANGUAGE_GREEK: +#else + case XC_LANGUAGE_JAPANESE: + m_mcTTFFont = new UITTFFont("Common/Media/font/JPN/DFGMaruGothic-Md.ttf", 0x2022); // JPN + break; + case XC_LANGUAGE_SCHINESE: //TODO + case XC_LANGUAGE_TCHINESE: + m_mcTTFFont = new UITTFFont("Common/Media/font/CHT/DFHeiMedium-B5.ttf", 0x2022); // CHT + break; + case XC_LANGUAGE_KOREAN: + m_mcTTFFont = new UITTFFont("Common/Media/font/KOR/BOKMSD.ttf", 0x2022); // KOR + break; +#endif + default: + bBitmapFont=true; + // m_mcTTFFont = new UITTFFont("Common/Media/font/Mojangles.ttf", 0x2022); // 4J-JEV: Shouldn't be using this. + break; + } + + if(bBitmapFont) + { + // these may have been set up by a previous language being chosen + if(m_moj7==NULL) + { + m_moj7 = new UIBitmapFont(SFontData::Mojangles_7); + m_moj7->registerFont(); + } + if(m_moj11==NULL) + { + m_moj11 = new UIBitmapFont(SFontData::Mojangles_11); + m_moj11->registerFont(); + } + } + else + { + app.DebugPrintf("IggyFontSetIndirectUTF8\n"); + IggyFontSetIndirectUTF8( "Mojangles7", -1, IGGY_FONTFLAG_all, "Mojangles_TTF",-1 ,IGGY_FONTFLAG_none ); + IggyFontSetIndirectUTF8( "Mojangles11", -1, IGGY_FONTFLAG_all, "Mojangles_TTF",-1 ,IGGY_FONTFLAG_none ); + } +} + +// TICKING +void UIController::tick() +{ + if(m_navigateToHomeOnReload && !ui.IsReloadingSkin()) + { + ui.CleanUpSkinReload(); + m_navigateToHomeOnReload = false; + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_MainMenu); + } + + for(unsigned int i = 0; i < eUIGroup_COUNT; ++i) + { + if(m_bCloseAllScenes[i]) + { + m_groups[i]->closeAllScenes(); + m_groups[i]->getTooltips()->SetTooltips(-1); + m_bCloseAllScenes[i] = false; + } + } + + if(m_accumulatedTicks == 0) tickInput(); + m_accumulatedTicks = 0; + + for(unsigned int i = 0; i < eUIGroup_COUNT; ++i) + { + m_groups[i]->tick(); + + // TODO: May wish to skip ticking other groups here + } + + // Fix for HUD ticks so that they all tick before this reference is cleared + EnderDragonRenderer::bossInstance = nullptr; + + // Clear out the cached movie file data + __int64 currentTime = System::currentTimeMillis(); + for(AUTO_VAR(it, m_cachedMovieData.begin()); it != m_cachedMovieData.end();) + { + if(it->second.m_expiry < currentTime) + { + delete [] it->second.m_ba.data; + it = m_cachedMovieData.erase(it); + } + else + { + ++it; + } + } +} + +void UIController::loadSkins() +{ + wstring platformSkinPath = L""; + +#ifdef __PS3__ + platformSkinPath = L"skinPS3.swf"; +#elif defined __PSVITA__ + platformSkinPath = L"skinVita.swf"; +#elif defined _WINDOWS64 + if(m_fScreenHeight==1080.0f) + { + platformSkinPath = L"skinHDWin.swf"; + } + else + { + platformSkinPath = L"skinWin.swf"; + } +#elif defined _DURANGO + if(m_fScreenHeight==1080.0f) + { + platformSkinPath = L"skinHDDurango.swf"; + } + else + { + platformSkinPath = L"skinDurango.swf"; + } +#elif defined __ORBIS__ + if(m_fScreenHeight==1080.0f) + { + platformSkinPath = L"skinHDOrbis.swf"; + } + else + { + platformSkinPath = L"skinOrbis.swf"; + } + +#endif + // Every platform has one of these, so nothing shared + if(m_fScreenHeight==1080.0f) + { + m_iggyLibraries[eLibrary_Platform] = loadSkin(platformSkinPath, L"platformskinHD.swf"); + } + else + { + m_iggyLibraries[eLibrary_Platform] = loadSkin(platformSkinPath, L"platformskin.swf"); + } + +#if defined(__PS3__) || defined(__PSVITA__) + m_iggyLibraries[eLibrary_GraphicsDefault] = loadSkin(L"skinGraphics.swf", L"skinGraphics.swf"); + m_iggyLibraries[eLibrary_GraphicsHUD] = loadSkin(L"skinGraphicsHud.swf", L"skinGraphicsHud.swf"); + m_iggyLibraries[eLibrary_GraphicsInGame] = loadSkin(L"skinGraphicsInGame.swf", L"skinGraphicsInGame.swf"); + m_iggyLibraries[eLibrary_GraphicsTooltips] = loadSkin(L"skinGraphicsTooltips.swf", L"skinGraphicsTooltips.swf"); + m_iggyLibraries[eLibrary_GraphicsLabels] = loadSkin(L"skinGraphicsLabels.swf", L"skinGraphicsLabels.swf"); + m_iggyLibraries[eLibrary_Labels] = loadSkin(L"skinLabels.swf", L"skinLabels.swf"); + m_iggyLibraries[eLibrary_InGame] = loadSkin(L"skinInGame.swf", L"skinInGame.swf"); + m_iggyLibraries[eLibrary_HUD] = loadSkin(L"skinHud.swf", L"skinHud.swf"); + m_iggyLibraries[eLibrary_Tooltips] = loadSkin(L"skinTooltips.swf", L"skinTooltips.swf"); + m_iggyLibraries[eLibrary_Default] = loadSkin(L"skin.swf", L"skin.swf"); +#endif + +#if ( defined(_WINDOWS64) || defined(_DURANGO) || defined(__ORBIS__) ) + +#if defined(_WINDOWS64) + // 4J Stu - Load the 720/480 skins so that we have something to fallback on during development +#ifndef _FINAL_BUILD + m_iggyLibraries[eLibraryFallback_GraphicsDefault] = loadSkin(L"skinGraphics.swf", L"skinGraphics.swf"); + m_iggyLibraries[eLibraryFallback_GraphicsHUD] = loadSkin(L"skinGraphicsHud.swf", L"skinGraphicsHud.swf"); + m_iggyLibraries[eLibraryFallback_GraphicsInGame] = loadSkin(L"skinGraphicsInGame.swf", L"skinGraphicsInGame.swf"); + m_iggyLibraries[eLibraryFallback_GraphicsTooltips] = loadSkin(L"skinGraphicsTooltips.swf", L"skinGraphicsTooltips.swf"); + m_iggyLibraries[eLibraryFallback_GraphicsLabels] = loadSkin(L"skinGraphicsLabels.swf", L"skinGraphicsLabels.swf"); + m_iggyLibraries[eLibraryFallback_Labels] = loadSkin(L"skinLabels.swf", L"skinLabels.swf"); + m_iggyLibraries[eLibraryFallback_InGame] = loadSkin(L"skinInGame.swf", L"skinInGame.swf"); + m_iggyLibraries[eLibraryFallback_HUD] = loadSkin(L"skinHud.swf", L"skinHud.swf"); + m_iggyLibraries[eLibraryFallback_Tooltips] = loadSkin(L"skinTooltips.swf", L"skinTooltips.swf"); + m_iggyLibraries[eLibraryFallback_Default] = loadSkin(L"skin.swf", L"skin.swf"); +#endif +#endif + + m_iggyLibraries[eLibrary_GraphicsDefault] = loadSkin(L"skinHDGraphics.swf", L"skinHDGraphics.swf"); + m_iggyLibraries[eLibrary_GraphicsHUD] = loadSkin(L"skinHDGraphicsHud.swf", L"skinHDGraphicsHud.swf"); + m_iggyLibraries[eLibrary_GraphicsInGame] = loadSkin(L"skinHDGraphicsInGame.swf", L"skinHDGraphicsInGame.swf"); + m_iggyLibraries[eLibrary_GraphicsTooltips] = loadSkin(L"skinHDGraphicsTooltips.swf", L"skinHDGraphicsTooltips.swf"); + m_iggyLibraries[eLibrary_GraphicsLabels] = loadSkin(L"skinHDGraphicsLabels.swf", L"skinHDGraphicsLabels.swf"); + m_iggyLibraries[eLibrary_Labels] = loadSkin(L"skinHDLabels.swf", L"skinHDLabels.swf"); + m_iggyLibraries[eLibrary_InGame] = loadSkin(L"skinHDInGame.swf", L"skinHDInGame.swf"); + m_iggyLibraries[eLibrary_HUD] = loadSkin(L"skinHDHud.swf", L"skinHDHud.swf"); + m_iggyLibraries[eLibrary_Tooltips] = loadSkin(L"skinHDTooltips.swf", L"skinHDTooltips.swf"); + m_iggyLibraries[eLibrary_Default] = loadSkin(L"skinHD.swf", L"skinHD.swf"); +#endif // HD platforms +} + +IggyLibrary UIController::loadSkin(const wstring &skinPath, const wstring &skinName) +{ + IggyLibrary lib = IGGY_INVALID_LIBRARY; + // 4J Stu - We need to load the platformskin before the normal skin, as the normal skin requires some elements from the platform skin + if(!skinPath.empty() && app.hasArchiveFile(skinPath)) + { + byteArray baFile = app.getArchiveFile(skinPath); + lib = IggyLibraryCreateFromMemoryUTF16( (IggyUTF16 *)skinName.c_str() , (void *)baFile.data, baFile.length, NULL ); + + delete[] baFile.data; +#ifdef _DEBUG + IggyMemoryUseInfo memoryInfo; + rrbool res; + int iteration = 0; + __int64 totalStatic = 0; + while(res = IggyDebugGetMemoryUseInfo ( NULL , + lib , + "" , + 0 , + iteration , + &memoryInfo )) + { + totalStatic += memoryInfo.static_allocation_bytes; + app.DebugPrintf(app.USER_SR, "%ls - %.*s, static: %dB, dynamic: %dB\n", skinPath.c_str(), memoryInfo.subcategory_stringlen, memoryInfo.subcategory, memoryInfo.static_allocation_bytes, memoryInfo.dynamic_allocation_bytes); + ++iteration; + } + + app.DebugPrintf(app.USER_SR, "%ls - Total static: %dB (%dKB)\n", skinPath.c_str(), totalStatic, totalStatic/1024); +#endif + } + return lib; +} + +void UIController::ReloadSkin() +{ + // Destroy all scene swf + for(unsigned int i = 0; i < eUIGroup_COUNT; ++i) + { + //m_bCloseAllScenes[i] = true; + m_groups[i]->DestroyAll(); + } + + // Unload the current libraries + // Some libraries reference others, so we destroy in reverse order + for(int i = eLibrary_Count - 1; i >= 0; --i) + { + if(m_iggyLibraries[i] != IGGY_INVALID_LIBRARY) IggyLibraryDestroy(m_iggyLibraries[i]); + m_iggyLibraries[i] = IGGY_INVALID_LIBRARY; + } + +#ifdef _WINDOWS64 + // 4J Stu - Don't load on a thread on windows. I haven't investigated this in detail, so a quick fix + reloadSkinThreadProc(this); +#else + // Navigate to the timer scene so that we can display something while the loading is happening + ui.NavigateToScene(0,eUIScene_Timer,(void *)1,eUILayer_Tooltips,eUIGroup_Fullscreen); + + m_reloadSkinThread = new C4JThread(reloadSkinThreadProc, (void*)this, "Reload skin thread"); + m_reloadSkinThread->SetProcessor(CPU_CORE_UI_SCENE); + //m_reloadSkinThread->Run(); + + //// Load new skin + //loadSkins(); + + //// Reload all scene swf + //for(int i = eUIGroup_Player1; i <= eUIGroup_Player4; ++i) + //{ + // m_groups[i]->ReloadAll(); + //} + + //// Always reload the fullscreen group + //m_groups[eUIGroup_Fullscreen]->ReloadAll(); +#endif +} + +void UIController::StartReloadSkinThread() +{ + if(m_reloadSkinThread) m_reloadSkinThread->Run(); +} + +int UIController::reloadSkinThreadProc(void* lpParam) +{ + EnterCriticalSection(&ms_reloadSkinCS); // MGH - added to prevent crash loading Iggy movies while the skins were being reloaded + UIController *controller = (UIController *)lpParam; + // Load new skin + controller->loadSkins(); + + // Reload all scene swf + for(int i = eUIGroup_Player1; i < eUIGroup_COUNT; ++i) + { + controller->m_groups[i]->ReloadAll(); + } + + // Always reload the fullscreen group + controller->m_groups[eUIGroup_Fullscreen]->ReloadAll(); + + // 4J Stu - Don't do this on windows, as we never navigated forwards to start with +#ifndef _WINDOW64 + controller->NavigateBack(0, false, eUIScene_COUNT, eUILayer_Tooltips); +#endif + LeaveCriticalSection(&ms_reloadSkinCS); + + return 0; +} + +bool UIController::IsReloadingSkin() +{ + return m_reloadSkinThread && (!m_reloadSkinThread->hasStarted() || m_reloadSkinThread->isRunning()); +} + +bool UIController::IsExpectingOrReloadingSkin() +{ + return Minecraft::GetInstance()->skins->getSelected()->isLoadingData() || Minecraft::GetInstance()->skins->needsUIUpdate() || IsReloadingSkin(); +} + +void UIController::CleanUpSkinReload() +{ + delete m_reloadSkinThread; + m_reloadSkinThread = NULL; + + if(!Minecraft::GetInstance()->skins->isUsingDefaultSkin()) + { + if(!Minecraft::GetInstance()->skins->getSelected()->hasAudio()) + { +#ifdef _DURANGO + DWORD result = StorageManager.UnmountInstalledDLC(L"TPACK"); +#else + DWORD result = StorageManager.UnmountInstalledDLC("TPACK"); +#endif + } + } + + for(AUTO_VAR(it,m_queuedMessageBoxData.begin()); it != m_queuedMessageBoxData.end(); ++it) + { + QueuedMessageBoxData *queuedData = *it; + ui.NavigateToScene(queuedData->iPad, eUIScene_MessageBox, &queuedData->info, queuedData->layer, eUIGroup_Fullscreen); + delete queuedData->info.uiOptionA; + delete queuedData; + } + m_queuedMessageBoxData.clear(); +} + +byteArray UIController::getMovieData(const wstring &filename) +{ + // Cache everything we load in the current tick + __int64 targetTime = System::currentTimeMillis() + (1000LL * 60); + AUTO_VAR(it,m_cachedMovieData.find(filename)); + if(it == m_cachedMovieData.end() ) + { + byteArray baFile = app.getArchiveFile(filename); + CachedMovieData cmd; + cmd.m_ba = baFile; + cmd.m_expiry = targetTime; + m_cachedMovieData[filename] = cmd; + return baFile; + } + else + { + it->second.m_expiry = targetTime; + return it->second.m_ba; + } +} + +// INPUT +void UIController::tickInput() +{ + // If system/commerce UI up, don't handle input + //if(!m_bSysUIShowing && !m_bSystemUIShowing) + if(!m_bSystemUIShowing) + { +#ifdef ENABLE_IGGY_PERFMON + if (m_iggyPerfmonEnabled) + { + if(InputManager.ButtonPressed(ProfileManager.GetPrimaryPad(), ACTION_MENU_STICK_PRESS)) m_iggyPerfmonEnabled = !m_iggyPerfmonEnabled; + } + else +#endif + { + handleInput(); + ++m_accumulatedTicks; + } + } +} + +void UIController::handleInput() +{ + // For each user, loop over each key type and send messages based on the state + for(unsigned int iPad = 0; iPad < XUSER_MAX_COUNT; ++iPad) + { +#ifdef _DURANGO + // 4J-JEV: Added exception for primary play who migh've uttered speech commands. + if(iPad != ProfileManager.GetPrimaryPad() + && (!InputManager.IsPadConnected(iPad) || !InputManager.IsPadLocked(iPad)) ) continue; +#endif + for(unsigned int key = 0; key <= ACTION_MAX_MENU; ++key) + { + handleKeyPress(iPad, key); + } + +#ifdef __PSVITA__ + //CD - Vita requires key press 40 - select [MINECRAFT_ACTION_GAME_INFO] + handleKeyPress(iPad, MINECRAFT_ACTION_GAME_INFO); +#endif + } + +#ifdef _DURANGO + if(!app.GetGameStarted()) + { + bool repeat = false; + int firstUnfocussedUnhandledPad = -1; + + // For durango, check for unmapped controllers + for(unsigned int iPad = XUSER_MAX_COUNT; iPad < (XUSER_MAX_COUNT + InputManager.MAX_GAMEPADS); ++iPad) + { + if(InputManager.IsPadLocked(iPad) || !InputManager.IsPadConnected(iPad) ) continue; + + for(unsigned int key = 0; key <= ACTION_MAX_MENU; ++key) + { + + bool pressed = InputManager.ButtonPressed(iPad,key); // Toggle + bool released = InputManager.ButtonReleased(iPad,key); // Toggle + + if(pressed || released) + { + bool handled = false; + + // Send the key to the fullscreen group first + m_groups[(int)eUIGroup_Fullscreen]->handleInput(iPad, key, repeat, pressed, released, handled); + + if(firstUnfocussedUnhandledPad < 0 && !m_groups[(int)eUIGroup_Fullscreen]->HasFocus(iPad)) + { + firstUnfocussedUnhandledPad = iPad; + } + } + } + } + + if(ProfileManager.GetLockedProfile() >= 0 && !InputManager.IsPadLocked( ProfileManager.GetLockedProfile() ) && firstUnfocussedUnhandledPad >= 0) + { + ProfileManager.RequestSignInUI(false, false, false, false, true, NULL, NULL, firstUnfocussedUnhandledPad ); + } + } +#endif +} + +void UIController::handleKeyPress(unsigned int iPad, unsigned int key) +{ + + bool down = false; + bool pressed = false; // Toggle + bool released = false; // Toggle + bool repeat = false; + +#ifdef __PSVITA__ + if(key==ACTION_MENU_OK) + { + bool bTouchScreenInput=false; + + // check the touchscreen + + // 4J-PB - use the touchscreen for quickselect + SceTouchData* pTouchData = InputManager.GetTouchPadData(iPad,false); + + if((m_bTouchscreenPressed==false) && pTouchData->reportNum==1) + { + // no active touch? clear active and highlighted touch UI elements + m_ActiveUIElement = NULL; + m_HighlightedUIElement = NULL; + + // fullscreen first + UIScene *pScene=m_groups[(int)eUIGroup_Fullscreen]->getCurrentScene(); + // also check tooltip scene if we're not touching anything in the main scene + UIScene *pToolTips=m_groups[(int)eUIGroup_Fullscreen]->getTooltips(); + if(pScene) + { + // scene touch check + if(TouchBoxHit(pScene,pTouchData->report[0].x,pTouchData->report[0].y)) + { + down=pressed=m_bTouchscreenPressed=true; + bTouchScreenInput=true; + } + // tooltip touch check + else if(TouchBoxHit(pToolTips,pTouchData->report[0].x,pTouchData->report[0].y)) + { + down=pressed=m_bTouchscreenPressed=true; + bTouchScreenInput=true; + } + } + else + { + pScene=m_groups[(EUIGroup)(iPad+1)]->getCurrentScene(); + pToolTips=m_groups[(int)iPad+1]->getTooltips(); + if(pScene) + { + // scene touch check + if(TouchBoxHit(pScene,pTouchData->report[0].x,pTouchData->report[0].y)) + { + down=pressed=m_bTouchscreenPressed=true; + bTouchScreenInput=true; + } + // tooltip touch check (if scene exists but not component has been touched) + else if(TouchBoxHit(pToolTips,pTouchData->report[0].x,pTouchData->report[0].y)) + { + down=pressed=m_bTouchscreenPressed=true; + bTouchScreenInput=true; + } + } + else if(pToolTips) + { + // tooltip touch check (if scene does not exist) + if(TouchBoxHit(pToolTips,pTouchData->report[0].x,pTouchData->report[0].y)) + { + down=pressed=m_bTouchscreenPressed=true; + bTouchScreenInput=true; + } + } + } + } + else if(m_bTouchscreenPressed && pTouchData->reportNum==1) + { + // fullscreen first + UIScene *pScene=m_groups[(int)eUIGroup_Fullscreen]->getCurrentScene(); + // also check tooltip scene if we're not touching anything in the main scene + UIScene *pToolTips=m_groups[(int)eUIGroup_Fullscreen]->getTooltips(); + if(pScene) + { + // scene touch check + if(TouchBoxHit(pScene,pTouchData->report[0].x,pTouchData->report[0].y)) + { + down=true; + bTouchScreenInput=true; + } + // tooltip touch check (if scene exists but not component has been touched) + else if(TouchBoxHit(pToolTips,pTouchData->report[0].x,pTouchData->report[0].y)) + { + down=true; + bTouchScreenInput=true; + } + } + else + { + pScene=m_groups[(EUIGroup)(iPad+1)]->getCurrentScene(); + pToolTips=m_groups[(int)iPad+1]->getTooltips(); + if(pScene) + { + // scene touch check + if(TouchBoxHit(pScene,pTouchData->report[0].x,pTouchData->report[0].y)) + { + down=true; + bTouchScreenInput=true; + } + // tooltip touch check (if scene exists but not component has been touched) + else if(TouchBoxHit(pToolTips,pTouchData->report[0].x,pTouchData->report[0].y)) + { + down=true; + bTouchScreenInput=true; + } + } + else if(pToolTips) + { + // tooltip touch check (if scene does not exist) + if(TouchBoxHit(pToolTips,pTouchData->report[0].x,pTouchData->report[0].y)) + { + down=true; + bTouchScreenInput=true; + } + } + } + } + else if(m_bTouchscreenPressed && pTouchData->reportNum==0) + { + // released + bTouchScreenInput=true; + m_bTouchscreenPressed=false; + released=true; + } + + if(pressed) + { + // Start repeat timer + m_actionRepeatTimer[iPad][key] = GetTickCount() + UI_REPEAT_KEY_DELAY_MS; + } + else if (released) + { + // Stop repeat timer + m_actionRepeatTimer[iPad][key] = 0; + } + else if (down) + { + // Check is enough time has elapsed to be a repeat key + DWORD currentTime = GetTickCount(); + if(m_actionRepeatTimer[iPad][key] > 0 && currentTime > m_actionRepeatTimer[iPad][key]) + { + repeat = true; + pressed = true; + m_actionRepeatTimer[iPad][key] = currentTime + UI_REPEAT_KEY_REPEAT_RATE_MS; + } + } + + // handle touch input + HandleTouchInput(iPad, key, pressed, repeat, released); + + // ignore any other presses if the touchscreen has been used + if(bTouchScreenInput) return; + } +#endif + + down = InputManager.ButtonDown(iPad,key); + pressed = InputManager.ButtonPressed(iPad,key); // Toggle + released = InputManager.ButtonReleased(iPad,key); // Toggle + + if(pressed) app.DebugPrintf("Pressed %d\n",key); + if(released) app.DebugPrintf("Released %d\n",key); + // Repeat handling + if(pressed) + { + // Start repeat timer + m_actionRepeatTimer[iPad][key] = GetTickCount() + UI_REPEAT_KEY_DELAY_MS; + } + else if (released) + { + // Stop repeat timer + m_actionRepeatTimer[iPad][key] = 0; + } + else if (down) + { + // Check is enough time has elapsed to be a repeat key + DWORD currentTime = GetTickCount(); + if(m_actionRepeatTimer[iPad][key] > 0 && currentTime > m_actionRepeatTimer[iPad][key]) + { + repeat = true; + pressed = true; + m_actionRepeatTimer[iPad][key] = currentTime + UI_REPEAT_KEY_REPEAT_RATE_MS; + } + } + +#ifndef _CONTENT_PACKAGE + +#ifdef ENABLE_IGGY_PERFMON + if ( pressed && !repeat && key == ACTION_MENU_STICK_PRESS) + { + m_iggyPerfmonEnabled = !m_iggyPerfmonEnabled; + } +#endif + + // 4J Stu - Removed this function +#if 0 +#ifdef __PS3__ + //if ( pressed && + // !repeat && + // //app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<PrintTotalMemoryUsage(totalStatic, totalDynamic); + } + for(unsigned int i = 0; i < eLibrary_Count; ++i) + { + __int64 libraryStatic = 0; + __int64 libraryDynamic = 0; + + if(m_iggyLibraries[i] != IGGY_INVALID_LIBRARY) + { + + IggyMemoryUseInfo memoryInfo; + rrbool res; + int iteration = 0; + while(res = IggyDebugGetMemoryUseInfo ( NULL , + m_iggyLibraries[i] , + "" , + 0 , + iteration , + &memoryInfo )) + { + libraryStatic += memoryInfo.static_allocation_bytes; + libraryDynamic += memoryInfo.dynamic_allocation_bytes; + totalStatic += memoryInfo.static_allocation_bytes; + totalDynamic += memoryInfo.dynamic_allocation_bytes; + ++iteration; + } + } + + app.DebugPrintf(app.USER_SR, "Library static: %dB , Library dynamic: %d, ID: %d\n", libraryStatic, libraryDynamic, i); + } + app.DebugPrintf(app.USER_SR, "Total static: %d , Total dynamic: %d\n", totalStatic, totalDynamic); + app.DebugPrintf(app.USER_SR, "\n\nEND TOTAL SWF MEMORY USAGE\n"); + app.DebugPrintf(app.USER_SR, "********************************\n\n"); + } + else +#endif +#endif +#endif + //#endif + if(repeat || pressed || released) + { + bool handled = false; + + // Send the key to the fullscreen group first + m_groups[(int)eUIGroup_Fullscreen]->handleInput(iPad, key, repeat, pressed, released, handled); + if(!handled) + { + // If it's not been handled yet, then pass the event onto the players specific group + m_groups[(iPad+1)]->handleInput(iPad, key, repeat, pressed, released, handled); + } + } +} + +rrbool RADLINK UIController::ExternalFunctionCallback( void * user_callback_data , Iggy * player , IggyExternalFunctionCallUTF16 * call) +{ + UIScene *scene = (UIScene *)IggyPlayerGetUserdata(player); + + if(scene != NULL) + { + scene->externalCallback(call); + } + + return true; +} + +// RENDERING +void UIController::renderScenes() +{ + PIXBeginNamedEvent(0, "Rendering Iggy scenes"); + // Only render player scenes if the game is started + if(app.GetGameStarted() && !m_groups[eUIGroup_Fullscreen]->hidesLowerScenes()) + { + for(int i = eUIGroup_Player1; i < eUIGroup_COUNT; ++i) + { + PIXBeginNamedEvent(0, "Rendering layer %d scenes", i); + m_groups[i]->render(); + PIXEndNamedEvent(); + } + } + + // Always render the fullscreen group + PIXBeginNamedEvent(0, "Rendering fullscreen scenes"); + m_groups[eUIGroup_Fullscreen]->render(); + PIXEndNamedEvent(); + + PIXEndNamedEvent(); + +#ifdef ENABLE_IGGY_PERFMON + if (m_iggyPerfmonEnabled) + { + IggyPerfmonPad pm_pad; + + pm_pad.bits = 0; + pm_pad.field.dpad_up = InputManager.ButtonPressed(ProfileManager.GetPrimaryPad(),ACTION_MENU_UP); + pm_pad.field.dpad_down = InputManager.ButtonPressed(ProfileManager.GetPrimaryPad(),ACTION_MENU_DOWN); + pm_pad.field.dpad_left = InputManager.ButtonPressed(ProfileManager.GetPrimaryPad(),ACTION_MENU_LEFT); + pm_pad.field.dpad_right = InputManager.ButtonPressed(ProfileManager.GetPrimaryPad(),ACTION_MENU_RIGHT); + pm_pad.field.button_up = InputManager.ButtonPressed(ProfileManager.GetPrimaryPad(),ACTION_MENU_Y); + pm_pad.field.button_down = InputManager.ButtonPressed(ProfileManager.GetPrimaryPad(),ACTION_MENU_A); + pm_pad.field.button_left = InputManager.ButtonPressed(ProfileManager.GetPrimaryPad(),ACTION_MENU_X); + pm_pad.field.button_right = InputManager.ButtonPressed(ProfileManager.GetPrimaryPad(),ACTION_MENU_B); + pm_pad.field.shoulder_left_hi = InputManager.ButtonPressed(ProfileManager.GetPrimaryPad(),ACTION_MENU_LEFT_SCROLL); + pm_pad.field.shoulder_right_hi = InputManager.ButtonPressed(ProfileManager.GetPrimaryPad(),ACTION_MENU_RIGHT_SCROLL); + pm_pad.field.trigger_left_low = InputManager.ButtonPressed(ProfileManager.GetPrimaryPad(),ACTION_MENU_PAGEUP); + pm_pad.field.trigger_right_low = InputManager.ButtonPressed(ProfileManager.GetPrimaryPad(),ACTION_MENU_PAGEDOWN); + //IggyPerfmonPadFromXInputStatePointer(pm_pad, &xi_pad); + + //gdraw_D3D_SetTileOrigin( fb, + // zb, + // PM_ORIGIN_X, + // PM_ORIGIN_Y ); + IggyPerfmonTickAndDraw(iggy_perfmon, gdraw_funcs, &pm_pad, + PM_ORIGIN_X, PM_ORIGIN_Y, getScreenWidth(), getScreenHeight()); // perfmon draw area in window coords + } +#endif +} + +void UIController::getRenderDimensions(C4JRender::eViewportType viewport, S32 &width, S32 &height) +{ + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + width = (S32)(getScreenWidth()); + height = (S32)(getScreenHeight()); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + width = (S32)(getScreenWidth() / 2); + height = (S32)(getScreenHeight() / 2); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + width = (S32)(getScreenWidth() / 2); + height = (S32)(getScreenHeight() / 2); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + width = (S32)(getScreenWidth() / 2); + height = (S32)(getScreenHeight() / 2); + break; + } +} + +void UIController::setupRenderPosition(C4JRender::eViewportType viewport) +{ + if(m_bCustomRenderPosition || m_currentRenderViewport != viewport) + { + m_currentRenderViewport = viewport; + m_bCustomRenderPosition = false; + S32 xPos = 0; + S32 yPos = 0; + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + xPos = (S32)(getScreenWidth() / 4); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + xPos = (S32)(getScreenWidth() / 4); + yPos = (S32)(getScreenHeight() / 2); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + yPos = (S32)(getScreenHeight() / 4); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + xPos = (S32)(getScreenWidth() / 2); + yPos = (S32)(getScreenHeight() / 4); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + xPos = (S32)(getScreenWidth() / 2); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + yPos = (S32)(getScreenHeight() / 2); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + xPos = (S32)(getScreenWidth() / 2); + yPos = (S32)(getScreenHeight() / 2); + break; + } + m_tileOriginX = xPos; + m_tileOriginY = yPos; + setTileOrigin(xPos, yPos); + } +} + +void UIController::setupRenderPosition(S32 xOrigin, S32 yOrigin) +{ + m_bCustomRenderPosition = true; + m_tileOriginX = xOrigin; + m_tileOriginY = yOrigin; + setTileOrigin(xOrigin, yOrigin); +} + +void UIController::setupCustomDrawGameState() +{ + // Rest the clear rect + m_customRenderingClearRect.left = LONG_MAX; + m_customRenderingClearRect.right = LONG_MIN; + m_customRenderingClearRect.top = LONG_MAX; + m_customRenderingClearRect.bottom = LONG_MIN; + +#if defined _WINDOWS64 || _DURANGO + PIXBeginNamedEvent(0,"StartFrame"); + RenderManager.StartFrame(); + PIXEndNamedEvent(); + gdraw_D3D11_setViewport_4J(); +#elif defined __PS3__ + RenderManager.StartFrame(); +#elif defined __PSVITA__ + RenderManager.StartFrame(); +#elif defined __ORBIS__ + RenderManager.StartFrame(false); + // Set up a viewport for the render that matches Iggy's own viewport, apart form using an opengl-style z-range (Iggy uses a DX-style range on PS4), so + // that the renderer orthographic projection will work + gdraw_orbis_setViewport_4J(); +#endif + RenderManager.Set_matrixDirty(); + + // 4J Stu - We don't need to clear this here as iggy hasn't written anything to the depth buffer. + // We DO however clear after we render which is why we still setup the rectangle here + //RenderManager.Clear(GL_DEPTH_BUFFER_BIT, &m_customRenderingClearRect); + //glClear(GL_DEPTH_BUFFER_BIT); + + PIXBeginNamedEvent(0,"Final setup"); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, m_fScreenWidth, m_fScreenHeight, 0, 1000, 3000); + glMatrixMode(GL_MODELVIEW); + glEnable(GL_ALPHA_TEST); + glAlphaFunc(GL_GREATER, 0.1f); + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LEQUAL); + glDepthMask(true); + PIXEndNamedEvent(); +} + +void UIController::setupCustomDrawMatrices(UIScene *scene, CustomDrawData *customDrawRegion) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + + // Clear just the region required for this control. + float sceneWidth = (float)scene->getRenderWidth(); + float sceneHeight = (float)scene->getRenderHeight(); + + LONG left, right, top, bottom; +#ifdef __PS3__ + if(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) + { + // 4J Stu - Our SD target on PS3 is double width + left = m_tileOriginX + (sceneWidth + customDrawRegion->mat[(0*4)+3]*sceneWidth); + right = left + ( (sceneWidth * customDrawRegion->mat[0]) ) * customDrawRegion->x1; + } + else +#endif + { + left = m_tileOriginX + (sceneWidth + customDrawRegion->mat[(0*4)+3]*sceneWidth)/2; + right = left + ( (sceneWidth * customDrawRegion->mat[0])/2 ) * customDrawRegion->x1; + } + + top = m_tileOriginY + (sceneHeight - customDrawRegion->mat[(1*4)+3]*sceneHeight)/2; + bottom = top + (sceneHeight * -customDrawRegion->mat[(1*4) + 1])/2 * customDrawRegion->y1; + + m_customRenderingClearRect.left = min(m_customRenderingClearRect.left, left); + m_customRenderingClearRect.right = max(m_customRenderingClearRect.right, right);; + m_customRenderingClearRect.top = min(m_customRenderingClearRect.top, top); + m_customRenderingClearRect.bottom = max(m_customRenderingClearRect.bottom, bottom); + + if(!m_bScreenWidthSetup) + { + Minecraft *pMinecraft=Minecraft::GetInstance(); + if(pMinecraft != NULL) + { + m_fScreenWidth=(float)pMinecraft->width_phys; + m_fScreenHeight=(float)pMinecraft->height_phys; + m_bScreenWidthSetup = true; + } + } + + glLoadIdentity(); + glTranslatef(0, 0, -2000); + // Iggy translations are based on a double-size target, with the origin in the centre + glTranslatef((m_fScreenWidth + customDrawRegion->mat[(0*4)+3]*m_fScreenWidth)/2,(m_fScreenHeight - customDrawRegion->mat[(1*4)+3]*m_fScreenHeight)/2,0); + // Iggy scales are based on a double-size target + glScalef( (m_fScreenWidth * customDrawRegion->mat[0])/2,(m_fScreenHeight * -customDrawRegion->mat[(1*4) + 1])/2,1.0f); +} + +void UIController::setupCustomDrawGameStateAndMatrices(UIScene *scene, CustomDrawData *customDrawRegion) +{ + setupCustomDrawGameState(); + setupCustomDrawMatrices(scene, customDrawRegion); +} + +void UIController::endCustomDrawGameState() +{ +#ifdef __ORBIS__ + // TO BE IMPLEMENTED + RenderManager.Clear(GL_DEPTH_BUFFER_BIT); +#else + RenderManager.Clear(GL_DEPTH_BUFFER_BIT, &m_customRenderingClearRect); +#endif + //glClear(GL_DEPTH_BUFFER_BIT); + glDepthMask(false); + glDisable(GL_ALPHA_TEST); +} + +void UIController::endCustomDrawMatrices() +{ +} + +void UIController::endCustomDrawGameStateAndMatrices() +{ + endCustomDrawMatrices(); + endCustomDrawGameState(); +} + +void RADLINK UIController::CustomDrawCallback(void *user_callback_data, Iggy *player, IggyCustomDrawCallbackRegion *region) +{ + UIScene *scene = (UIScene *)IggyPlayerGetUserdata(player); + + if(scene != NULL) + { + scene->customDraw(region); + } +} + +//Description +//Callback to create a user-defined texture to replace SWF-defined textures. +//Parameters +//width - Input value: optional number of pixels wide specified from AS3, or -1 if not defined. Output value: the number of pixels wide to pretend to Iggy that the bitmap is. SWF and AS3 scales bitmaps based on their pixel dimensions, so you can use this to substitute a texture that is higher or lower resolution that ActionScript thinks it is. +//height - Input value: optional number of pixels high specified from AS3, or -1 if not defined. Output value: the number of pixels high to pretend to Iggy that the bitmap is. SWF and AS3 scales bitmaps based on their pixel dimensions, so you can use this to substitute a texture that is higher or lower resolution that ActionScript thinks it is. +//destroy_callback_data - Optional additional output value you can set; the value will be passed along to the corresponding Iggy_TextureSubstitutionDestroyCallback (e.g. you can store the pointer to your own internal structure here). +//return - A platform-independent wrapped texture handle provided by GDraw, or NULL (NULL with throw an ActionScript 3 ArgumentError that the Flash developer can catch) Use by calling IggySetTextureSubstitutionCallbacks. +// +//Discussion +// +//If your texture includes an alpha channel, you must use a premultiplied alpha (where the R,G, and B channels have been multiplied by the alpha value); all Iggy shaders assume premultiplied alpha (and it looks better anyway). +GDrawTexture * RADLINK UIController::TextureSubstitutionCreateCallback ( void * user_callback_data , IggyUTF16 * texture_name , S32 * width , S32 * height , void * * destroy_callback_data ) +{ + UIController *uiController = (UIController *)user_callback_data; + AUTO_VAR(it,uiController->m_substitutionTextures.find((wchar_t *)texture_name)); + + if(it != uiController->m_substitutionTextures.end()) + { + app.DebugPrintf("Found substitution texture %ls, with %d bytes\n", (wchar_t *)texture_name,it->second.length); + + BufferedImage image(it->second.data, it->second.length); + if( image.getData() != NULL ) + { + image.preMultiplyAlpha(); + Textures *t = Minecraft::GetInstance()->textures; + int id = t->getTexture(&image,C4JRender::TEXTURE_FORMAT_RxGyBzAw,false); + + // 4J Stu - All our flash controls that allow replacing textures use a special 64x64 symbol + // Force this size here so that our images don't get scaled wildly + #if (defined __ORBIS__ || defined _DURANGO ) + *width = 96; + *height = 96; + #else + *width = 64; + *height = 64; + + #endif + *destroy_callback_data = (void *)id; + + app.DebugPrintf("Found substitution texture %ls (%d) - %dx%d\n", (wchar_t *)texture_name, id, image.getWidth(), image.getHeight()); + return ui.getSubstitutionTexture(id); + } + else + { + return NULL; + } + } + else + { + app.DebugPrintf("Could not find substitution texture %ls\n", (wchar_t *)texture_name); + return NULL; + } +} + +//Description +//Callback received from Iggy when it stops using a user-defined texture. +void RADLINK UIController::TextureSubstitutionDestroyCallback ( void * user_callback_data , void * destroy_callback_data , GDrawTexture * handle ) +{ + // Orbis complains about casting a pointer to an int + LONGLONG llVal=(LONGLONG)destroy_callback_data; + int id=(int)llVal; + app.DebugPrintf("Destroying iggy texture %d\n", id); + + ui.destroySubstitutionTexture(user_callback_data, handle); + + Textures *t = Minecraft::GetInstance()->textures; + t->releaseTexture( id ); +} + +void UIController::registerSubstitutionTexture(const wstring &textureName, PBYTE pbData, DWORD dwLength) +{ + // Remove it if it already exists + unregisterSubstitutionTexture(textureName,false); + + m_substitutionTextures[textureName] = byteArray(pbData, dwLength); +} + +void UIController::unregisterSubstitutionTexture(const wstring &textureName, bool deleteData) +{ + AUTO_VAR(it,m_substitutionTextures.find(textureName)); + + if(it != m_substitutionTextures.end()) + { + if(deleteData) delete [] it->second.data; + m_substitutionTextures.erase(it); + } +} + +// NAVIGATION +bool UIController::NavigateToScene(int iPad, EUIScene scene, void *initData, EUILayer layer, EUIGroup group) +{ + // if you're trying to navigate to the inventory,the crafting, pause or game info or any of the trigger scenes and there's already a menu up (because you were pressing a few buttons at the same time) then ignore the navigate + if(GetMenuDisplayed(iPad)) + { + switch(scene) + { + case eUIScene_PauseMenu: + case eUIScene_Crafting2x2Menu: + case eUIScene_Crafting3x3Menu: + case eUIScene_FurnaceMenu: + case eUIScene_ContainerMenu: + case eUIScene_LargeContainerMenu: + case eUIScene_InventoryMenu: + case eUIScene_CreativeMenu: + case eUIScene_DispenserMenu: + case eUIScene_SignEntryMenu: + case eUIScene_InGameInfoMenu: + case eUIScene_EnchantingMenu: + case eUIScene_BrewingStandMenu: + case eUIScene_AnvilMenu: + case eUIScene_TradingMenu: + app.DebugPrintf("IGNORING NAVIGATE - we're trying to navigate to a user selected scene when there's already a scene up: pad:%d, scene:%d\n", iPad, scene); + return false; + break; + } + } + + switch(scene) + { + case eUIScene_FullscreenProgress: + { + // 4J Stu - The fullscreen progress scene should not interfere with any other scene stack, so should be placed in it's own group/layer + layer = eUILayer_Fullscreen; + group = eUIGroup_Fullscreen; + } + break; + case eUIScene_ConnectingProgress: + { + // The connecting progress scene shouldn't interfere with other scenes + layer = eUILayer_Fullscreen; + } + break; + case eUIScene_EndPoem: + { + // The end poem scene shouldn't interfere with other scenes, but will be underneath the autosave progress + group = eUIGroup_Fullscreen; + layer = eUILayer_Scene; + } + break; + }; + int menuDisplayedPad = XUSER_INDEX_ANY; + if(group == eUIGroup_PAD) + { + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) + { + menuDisplayedPad = iPad; + group = (EUIGroup)(iPad+1); + } + else group = eUIGroup_Fullscreen; + } + else + { + layer = eUILayer_Fullscreen; + group = eUIGroup_Fullscreen; + } + } + + PerformanceTimer timer; + + EnterCriticalSection(&m_navigationLock); + SetMenuDisplayed(menuDisplayedPad,true); + bool success = m_groups[(int)group]->NavigateToScene(iPad, scene, initData, layer); + if(success && group == eUIGroup_Fullscreen) setFullscreenMenuDisplayed(true); + LeaveCriticalSection(&m_navigationLock); + + timer.PrintElapsedTime(L"Navigate to scene"); + + return success; + //return true; +} + +bool UIController::NavigateBack(int iPad, bool forceUsePad, EUIScene eScene, EUILayer eLayer) +{ + bool navComplete = false; + if( app.GetGameStarted() ) + { + bool navComplete = m_groups[(int)eUIGroup_Fullscreen]->NavigateBack(iPad, eScene, eLayer); + + if(!navComplete && ( iPad != 255 ) && ( iPad >= 0 ) ) + { + EUIGroup group = (EUIGroup)(iPad+1); + navComplete = m_groups[(int)group]->NavigateBack(iPad, eScene, eLayer); + if(!m_groups[(int)group]->GetMenuDisplayed())SetMenuDisplayed(iPad,false); + } + // 4J-PB - autosave in fullscreen doesn't clear the menuDisplayed flag + else + { + if(!m_groups[(int)eUIGroup_Fullscreen]->GetMenuDisplayed()) + { + setFullscreenMenuDisplayed(false); + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + SetMenuDisplayed(i,m_groups[i+1]->GetMenuDisplayed()); + } + } + } + } + else + { + navComplete = m_groups[(int)eUIGroup_Fullscreen]->NavigateBack(iPad, eScene, eLayer); + if(!m_groups[(int)eUIGroup_Fullscreen]->GetMenuDisplayed()) SetMenuDisplayed(XUSER_INDEX_ANY,false); + } + return navComplete; +} + +void UIController::NavigateToHomeMenu() +{ + ui.CloseAllPlayersScenes(); + + // Alert the app the we no longer want to be informed of ethernet connections + app.SetLiveLinkRequired( false ); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + // 4J-PB - just about to switched to the default texture pack , so clean up anything texture pack related here + + // unload any texture pack audio + // if there is audio in use, clear out the audio, and unmount the pack + TexturePack *pTexPack=Minecraft::GetInstance()->skins->getSelected(); + + + DLCTexturePack *pDLCTexPack=NULL; + if(pTexPack->hasAudio()) + { + // get the dlc texture pack, and store it + pDLCTexPack=(DLCTexturePack *)pTexPack; + } + + // change to the default texture pack + pMinecraft->skins->selectTexturePackById(TexturePackRepository::DEFAULT_TEXTURE_PACK_ID); + + + if(pTexPack->hasAudio()) + { + // need to stop the streaming audio - by playing streaming audio from the default texture pack now + // reset the streaming sounds back to the normal ones + pMinecraft->soundEngine->SetStreamingSounds(eStream_Overworld_Calm1,eStream_Overworld_piano3, + eStream_Nether1,eStream_Nether4, + eStream_end_dragon,eStream_end_end, + eStream_CD_1); + pMinecraft->soundEngine->playStreaming(L"", 0, 0, 0, 1, 1); + + // if(pDLCTexPack->m_pStreamedWaveBank!=NULL) + // { + // pDLCTexPack->m_pStreamedWaveBank->Destroy(); + // } + // if(pDLCTexPack->m_pSoundBank!=NULL) + // { + // pDLCTexPack->m_pSoundBank->Destroy(); + // } +#ifdef _XBOX_ONE + DWORD result = StorageManager.UnmountInstalledDLC(L"TPACK"); +#else + DWORD result = StorageManager.UnmountInstalledDLC("TPACK"); +#endif + + app.DebugPrintf("Unmount result is %d\n",result); + } + + g_NetworkManager.ForceFriendsSessionRefresh(); + + if(pMinecraft->skins->needsUIUpdate()) + { + m_navigateToHomeOnReload = true; + } + else + { + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_MainMenu); + } +} + +UIScene *UIController::GetTopScene(int iPad, EUILayer layer, EUIGroup group) +{ + if(group == eUIGroup_PAD) + { + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) + { + group = (EUIGroup)(iPad+1); + } + else group = eUIGroup_Fullscreen; + } + else + { + layer = eUILayer_Fullscreen; + group = eUIGroup_Fullscreen; + } + } + return m_groups[(int)group]->GetTopScene(layer); +} + +size_t UIController::RegisterForCallbackId(UIScene *scene) +{ + EnterCriticalSection(&m_registeredCallbackScenesCS); + size_t newId = GetTickCount(); + newId &= 0xFFFFFF; // Chop off the top byte, we don't need any more accuracy than that + newId |= (scene->getSceneType() << 24); // Add in the scene's type to help keep this unique + m_registeredCallbackScenes[newId] = scene; + LeaveCriticalSection(&m_registeredCallbackScenesCS); + return newId; +} + +void UIController::UnregisterCallbackId(size_t id) +{ + EnterCriticalSection(&m_registeredCallbackScenesCS); + AUTO_VAR(it, m_registeredCallbackScenes.find(id) ); + if(it != m_registeredCallbackScenes.end() ) + { + m_registeredCallbackScenes.erase(it); + } + LeaveCriticalSection(&m_registeredCallbackScenesCS); +} + +UIScene *UIController::GetSceneFromCallbackId(size_t id) +{ + UIScene *scene = NULL; + AUTO_VAR(it, m_registeredCallbackScenes.find(id) ); + if(it != m_registeredCallbackScenes.end() ) + { + scene = it->second; + } + return scene; +} + +void UIController::EnterCallbackIdCriticalSection() +{ + EnterCriticalSection(&m_registeredCallbackScenesCS); +} + +void UIController::LeaveCallbackIdCriticalSection() +{ + LeaveCriticalSection(&m_registeredCallbackScenesCS); +} + +void UIController::CloseAllPlayersScenes() +{ + m_groups[(int)eUIGroup_Fullscreen]->getTooltips()->SetTooltips(-1); + for(unsigned int i = 0; i < eUIGroup_COUNT; ++i) + { + //m_bCloseAllScenes[i] = true; + m_groups[i]->closeAllScenes(); + m_groups[i]->getTooltips()->SetTooltips(-1); + } + + if (!m_groups[eUIGroup_Fullscreen]->GetMenuDisplayed()) { + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + SetMenuDisplayed(i,false); + } + } + setFullscreenMenuDisplayed(false); +} + +void UIController::CloseUIScenes(int iPad, bool forceIPad) +{ + EUIGroup group; + if( app.GetGameStarted() || forceIPad ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + + m_groups[(int)group]->closeAllScenes(); + m_groups[(int)group]->getTooltips()->SetTooltips(-1); + + // This should cause the popup to dissappear + TutorialPopupInfo popupInfo; + if(m_groups[(int)group]->getTutorialPopup()) m_groups[(int)group]->getTutorialPopup()->SetTutorialDescription(&popupInfo); + + if(group==eUIGroup_Fullscreen) setFullscreenMenuDisplayed(false); + + SetMenuDisplayed((group == eUIGroup_Fullscreen ? XUSER_INDEX_ANY : iPad), m_groups[(int)group]->GetMenuDisplayed()); +} + +void UIController::setFullscreenMenuDisplayed(bool displayed) +{ + // Show/hide the tooltips for the fullscreen group + m_groups[(int)eUIGroup_Fullscreen]->showComponent(ProfileManager.GetPrimaryPad(),eUIComponent_Tooltips,eUILayer_Tooltips,displayed); + + // Show/hide tooltips for the other layers + for(unsigned int i = (eUIGroup_Fullscreen+1); i < eUIGroup_COUNT; ++i) + { + m_groups[i]->showComponent(i,eUIComponent_Tooltips,eUILayer_Tooltips,!displayed); + } +} + +bool UIController::IsPauseMenuDisplayed(int iPad) +{ + EUIGroup group; + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + return m_groups[(int)group]->IsPauseMenuDisplayed(); +} + +bool UIController::IsContainerMenuDisplayed(int iPad) +{ + EUIGroup group; + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + return m_groups[(int)group]->IsContainerMenuDisplayed(); +} + +bool UIController::IsIgnorePlayerJoinMenuDisplayed(int iPad) +{ + EUIGroup group; + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + return m_groups[(int)group]->IsIgnorePlayerJoinMenuDisplayed(); +} + +bool UIController::IsIgnoreAutosaveMenuDisplayed(int iPad) +{ + EUIGroup group; + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + return m_groups[(int)eUIGroup_Fullscreen]->IsIgnoreAutosaveMenuDisplayed() || (group != eUIGroup_Fullscreen && m_groups[(int)group]->IsIgnoreAutosaveMenuDisplayed()); +} + +void UIController::SetIgnoreAutosaveMenuDisplayed(int iPad, bool displayed) +{ + app.DebugPrintf(app.USER_SR, "UIController::SetIgnoreAutosaveMenuDisplayed is not implemented\n"); +} + +bool UIController::IsSceneInStack(int iPad, EUIScene eScene) +{ + EUIGroup group; + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + return m_groups[(int)group]->IsSceneInStack(eScene); +} + +bool UIController::GetMenuDisplayed(int iPad) +{ + return m_bMenuDisplayed[iPad]; +} + +void UIController::SetMenuDisplayed(int iPad,bool bVal) +{ + if(bVal) + { + if(iPad==XUSER_INDEX_ANY) + { + for(int i=0;irunning) + InputManager.SetEnabledGtcButtons(_360_GTC_MENU | _360_GTC_PAUSE | _360_GTC_VIEW); +#endif + } + } +} + +void UIController::CheckMenuDisplayed() +{ + for(int iPad=0;iPadgetTooltips()) m_groups[(int)group]->getTooltips()->SetTooltipText(tooltip, iTextID); +} + +void UIController::SetEnableTooltips( unsigned int iPad, BOOL bVal ) +{ + EUIGroup group; + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + if(m_groups[(int)group]->getTooltips()) m_groups[(int)group]->getTooltips()->SetEnableTooltips(bVal); +} + +void UIController::ShowTooltip( unsigned int iPad, unsigned int tooltip, bool show ) +{ + EUIGroup group; + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + if(m_groups[(int)group]->getTooltips()) m_groups[(int)group]->getTooltips()->ShowTooltip(tooltip,show); +} + +void UIController::SetTooltips( unsigned int iPad, int iA, int iB, int iX, int iY, int iLT, int iRT, int iLB, int iRB, int iLS, bool forceUpdate) +{ + EUIGroup group; + + // 4J-PB - strip out any that are not applicable on the platform +#ifndef _XBOX + if(iX==IDS_TOOLTIPS_SELECTDEVICE) iX=-1; + if(iX==IDS_TOOLTIPS_CHANGEDEVICE) iX=-1; + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + if(iY==IDS_TOOLTIPS_VIEW_GAMERCARD) iY=-1; + if(iY==IDS_TOOLTIPS_VIEW_GAMERPROFILE) iY=-1; + +#endif +#endif + + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + if(m_groups[(int)group]->getTooltips()) m_groups[(int)group]->getTooltips()->SetTooltips(iA, iB, iX, iY, iLT, iRT, iLB, iRB, iLS, forceUpdate); +} + +void UIController::EnableTooltip( unsigned int iPad, unsigned int tooltip, bool enable ) +{ + EUIGroup group; + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + if(m_groups[(int)group]->getTooltips()) m_groups[(int)group]->getTooltips()->EnableTooltip(tooltip,enable); +} + +void UIController::RefreshTooltips(unsigned int iPad) +{ + app.DebugPrintf(app.USER_SR, "UIController::RefreshTooltips is not implemented\n"); +} + +void UIController::AnimateKeyPress(int iPad, int iAction, bool bRepeat, bool bPressed, bool bReleased) +{ + EUIGroup group; + if(bPressed==false) + { + // only animating button press + return; + } + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + bool handled = false; + if(m_groups[(int)group]->getTooltips()) m_groups[(int)group]->getTooltips()->handleInput(iPad, iAction, bRepeat, bPressed, bReleased, handled); +} + +void UIController::OverrideSFX(int iPad, int iAction,bool bVal) +{ + EUIGroup group; + + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + bool handled = false; + if(m_groups[(int)group]->getTooltips()) m_groups[(int)group]->getTooltips()->overrideSFX(iPad, iAction,bVal); +} + +void UIController::PlayUISFX(ESoundEffect eSound) +{ + Minecraft::GetInstance()->soundEngine->playUI(eSound,1.0f,1.0f); +} + +void UIController::DisplayGamertag(unsigned int iPad, bool show) +{ + // The host decides whether these are on or off + if( app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_DisplaySplitscreenGamertags) == 0) + { + show = false; + } + EUIGroup group = (EUIGroup)(iPad+1); + if(m_groups[(int)group]->getHUD()) m_groups[(int)group]->getHUD()->ShowDisplayName(show); + + // Update TutorialPopup in Splitscreen if no container is displayed (to make sure the Popup does not overlap with the Gamertag!) + if(app.GetLocalPlayerCount() > 1 && m_groups[(int)group]->getTutorialPopup() && !m_groups[(int)group]->IsContainerMenuDisplayed()) + { + m_groups[(int)group]->getTutorialPopup()->UpdateTutorialPopup(); + } +} + +void UIController::SetSelectedItem(unsigned int iPad, const wstring &name) +{ + EUIGroup group; + + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + bool handled = false; + if(m_groups[(int)group]->getHUD()) m_groups[(int)group]->getHUD()->SetSelectedLabel(name); +} + +void UIController::UpdateSelectedItemPos(unsigned int iPad) +{ + app.DebugPrintf(app.USER_SR, "UIController::UpdateSelectedItemPos not implemented\n"); +} + +void UIController::HandleDLCMountingComplete() +{ + for(unsigned int i = 0; i < eUIGroup_COUNT; ++i) + { + app.DebugPrintf("UIController::HandleDLCMountingComplete - m_groups[%d]\n",i); + m_groups[i]->HandleDLCMountingComplete(); + } +} + +void UIController::HandleDLCInstalled(int iPad) +{ + //app.DebugPrintf(app.USER_SR, "UIController::HandleDLCInstalled not implemented\n"); + for(unsigned int i = 0; i < eUIGroup_COUNT; ++i) + { + m_groups[i]->HandleDLCInstalled(); + } +} + + +#ifdef _XBOX_ONE +void UIController::HandleDLCLicenseChange() +{ + for(unsigned int i = 0; i < eUIGroup_COUNT; ++i) + { + app.DebugPrintf("UIController::HandleDLCLicenseChange - m_groups[%d]\n",i); + m_groups[i]->HandleDLCLicenseChange(); + } +} +#endif + +void UIController::HandleTMSDLCFileRetrieved(int iPad) +{ + app.DebugPrintf(app.USER_SR, "UIController::HandleTMSDLCFileRetrieved not implemented\n"); +} + +void UIController::HandleTMSBanFileRetrieved(int iPad) +{ + app.DebugPrintf(app.USER_SR, "UIController::HandleTMSBanFileRetrieved not implemented\n"); +} + +void UIController::HandleInventoryUpdated(int iPad) +{ + app.DebugPrintf(app.USER_SR, "UIController::HandleInventoryUpdated not implemented\n"); +} + +void UIController::HandleGameTick() +{ + tickInput(); + + for(unsigned int i = 0; i < eUIGroup_COUNT; ++i) + { + if(m_groups[i]->getHUD()) m_groups[i]->getHUD()->handleGameTick(); + } +} + +void UIController::SetTutorial(int iPad, Tutorial *tutorial) +{ + EUIGroup group; + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + if(m_groups[(int)group]->getTutorialPopup()) m_groups[(int)group]->getTutorialPopup()->SetTutorial(tutorial); +} + +void UIController::SetTutorialDescription(int iPad, TutorialPopupInfo *info) +{ + EUIGroup group; + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + + if(m_groups[(int)group]->getTutorialPopup()) + { + // tutorial popup needs to know if a container menu is being displayed + m_groups[(int)group]->getTutorialPopup()->SetContainerMenuVisible(m_groups[(int)group]->IsContainerMenuDisplayed()); + m_groups[(int)group]->getTutorialPopup()->SetTutorialDescription(info); + } +} + +#ifndef _XBOX +void UIController::RemoveInteractSceneReference(int iPad, UIScene *scene) +{ + EUIGroup group; + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + if(m_groups[(int)group]->getTutorialPopup()) m_groups[(int)group]->getTutorialPopup()->RemoveInteractSceneReference(scene); +} +#endif + +void UIController::SetTutorialVisible(int iPad, bool visible) +{ + EUIGroup group; + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + if(m_groups[(int)group]->getTutorialPopup()) m_groups[(int)group]->getTutorialPopup()->SetVisible(visible); +} + +bool UIController::IsTutorialVisible(int iPad) +{ + EUIGroup group; + if( app.GetGameStarted() ) + { + // If the game isn't running treat as user 0, otherwise map index directly from pad + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; + } + else + { + group = eUIGroup_Fullscreen; + } + bool visible = false; + if(m_groups[(int)group]->getTutorialPopup()) visible = m_groups[(int)group]->getTutorialPopup()->IsVisible(); + return visible; +} + +void UIController::UpdatePlayerBasePositions() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + + for( BYTE idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if(pMinecraft->localplayers[idx] != NULL) + { + if(pMinecraft->localplayers[idx]->m_iScreenSection==C4JRender::VIEWPORT_TYPE_FULLSCREEN) + { + DisplayGamertag(idx,false); + } + else + { + DisplayGamertag(idx,true); + } + m_groups[idx+1]->SetViewportType((C4JRender::eViewportType)pMinecraft->localplayers[idx]->m_iScreenSection); + } + else + { + // 4J Stu - This is a legacy thing from our XUI implementation that we don't need + // Changing the viewport to fullscreen for users that no longer exist is SLOW + // This should probably be on all platforms, but I don't have time to test them all just now! +#ifndef __ORBIS__ + m_groups[idx+1]->SetViewportType(C4JRender::VIEWPORT_TYPE_FULLSCREEN); +#endif + DisplayGamertag(idx,false); + } + } +} + +void UIController::SetEmptyQuadrantLogo(int iSection) +{ + // 4J Stu - We shouldn't need to implement this +} + +void UIController::HideAllGameUIElements() +{ + // 4J Stu - We might not need to implement this + app.DebugPrintf(app.USER_SR, "UIController::HideAllGameUIElements not implemented\n"); +} + +void UIController::ShowOtherPlayersBaseScene(unsigned int iPad, bool show) +{ + // 4J Stu - We shouldn't need to implement this +} + +void UIController::ShowTrialTimer(bool show) +{ + if(m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()) m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()->showTrialTimer(show); +} + +void UIController::SetTrialTimerLimitSecs(unsigned int uiSeconds) +{ + UIController::m_dwTrialTimerLimitSecs = uiSeconds; +} + +void UIController::UpdateTrialTimer(unsigned int iPad) +{ + WCHAR wcTime[20]; + + DWORD dwTimeTicks=(DWORD)app.getTrialTimer(); + + if(dwTimeTicks>m_dwTrialTimerLimitSecs) + { + dwTimeTicks=m_dwTrialTimerLimitSecs; + } + + dwTimeTicks=m_dwTrialTimerLimitSecs-dwTimeTicks; + +#ifndef _CONTENT_PACKAGE + if(true) +#else + // display the time - only if there's less than 3 minutes + if(dwTimeTicks<180) +#endif + { + int iMins=dwTimeTicks/60; + int iSeconds=dwTimeTicks%60; + swprintf( wcTime, 20, L"%d:%02d",iMins,iSeconds); + if(m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()) m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()->setTrialTimer(wcTime); + } + else + { + if(m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()) m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()->setTrialTimer(L""); + } + + // are we out of time? + if((dwTimeTicks==0)) + { + // Trial over + // bring up the pause menu to stop the trial over message box being called again? + if(!ui.GetMenuDisplayed( iPad ) ) + { + ui.NavigateToScene(iPad, eUIScene_PauseMenu, NULL, eUILayer_Scene); + + app.SetAction(iPad,eAppAction_TrialOver); + } + } +} + +void UIController::ReduceTrialTimerValue() +{ + DWORD dwTimeTicks=(int)app.getTrialTimer(); + + if(dwTimeTicks>m_dwTrialTimerLimitSecs) + { + dwTimeTicks=m_dwTrialTimerLimitSecs; + } + + m_dwTrialTimerLimitSecs-=dwTimeTicks; +} + +void UIController::ShowAutosaveCountdownTimer(bool show) +{ + if(m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()) m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()->showTrialTimer(show); +} + +void UIController::UpdateAutosaveCountdownTimer(unsigned int uiSeconds) +{ +#if !(defined(_XBOX_ONE) || defined(__ORBIS__)) + WCHAR wcAutosaveCountdown[100]; + swprintf( wcAutosaveCountdown, 100, app.GetString(IDS_AUTOSAVE_COUNTDOWN),uiSeconds); + if(m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()) m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()->setTrialTimer(wcAutosaveCountdown); +#endif +} + +void UIController::ShowSavingMessage(unsigned int iPad, C4JStorage::ESavingMessage eVal) +{ + bool show = false; + switch(eVal) + { + case C4JStorage::ESavingMessage_None: + show = false; + break; + case C4JStorage::ESavingMessage_Short: + case C4JStorage::ESavingMessage_Long: + show = true; + break; + } + if(m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()) m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()->showSaveIcon(show); +} + +void UIController::ShowPlayerDisplayname(bool show) +{ + if(m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()) m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()->showPlayerDisplayName(show); +} + +void UIController::SetWinUserIndex(unsigned int iPad) +{ + m_winUserIndex = iPad; +} + +unsigned int UIController::GetWinUserIndex() +{ + return m_winUserIndex; +} + +void UIController::ShowUIDebugConsole(bool show) +{ +#ifndef _CONTENT_PACKAGE + + if(show) + { + m_uiDebugConsole = (UIComponent_DebugUIConsole *)m_groups[eUIGroup_Fullscreen]->addComponent(0, eUIComponent_DebugUIConsole, eUILayer_Debug); + } + else + { + m_groups[eUIGroup_Fullscreen]->removeComponent(eUIComponent_DebugUIConsole, eUILayer_Debug); + m_uiDebugConsole = NULL; + } +#endif +} + +void UIController::ShowUIDebugMarketingGuide(bool show) +{ +#ifndef _CONTENT_PACKAGE + + if(show) + { + m_uiDebugMarketingGuide = (UIComponent_DebugUIMarketingGuide *)m_groups[eUIGroup_Fullscreen]->addComponent(0, eUIComponent_DebugUIMarketingGuide, eUILayer_Debug); + } + else + { + m_groups[eUIGroup_Fullscreen]->removeComponent(eUIComponent_DebugUIMarketingGuide, eUILayer_Debug); + m_uiDebugMarketingGuide = NULL; + } +#endif +} + +void UIController::logDebugString(const string &text) +{ + if(m_uiDebugConsole) m_uiDebugConsole->addText(text); +} + +bool UIController::PressStartPlaying(unsigned int iPad) +{ + return m_iPressStartQuadrantsMask&(1<getPressStartToPlay()) m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()->showPressStart(iPad, true); +} + +void UIController::HidePressStart() +{ + ClearPressStart(); + if(m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()) m_groups[(int)eUIGroup_Fullscreen]->getPressStartToPlay()->showPressStart(0, false); +} + +void UIController::ClearPressStart() +{ + m_iPressStartQuadrantsMask = 0; +} + +// 4J Stu - For the different StringTable classes. Should really fix the libraries. +#ifndef __PS3__ +C4JStorage::EMessageResult UIController::RequestMessageBox(UINT uiTitle, UINT uiText, UINT *uiOptionA,UINT uiOptionC, DWORD dwPad, + int( *Func)(LPVOID,int,const C4JStorage::EMessageResult),LPVOID lpParam, C4JStringTable *pStringTable, WCHAR *pwchFormatString,DWORD dwFocusButton, bool bIsError) +#else +C4JStorage::EMessageResult UIController::RequestMessageBox(UINT uiTitle, UINT uiText, UINT *uiOptionA,UINT uiOptionC, DWORD dwPad, + int( *Func)(LPVOID,int,const C4JStorage::EMessageResult),LPVOID lpParam, StringTable *pStringTable, WCHAR *pwchFormatString,DWORD dwFocusButton, bool bIsError) +#endif +{ + MessageBoxInfo param; + param.uiTitle = uiTitle; + param.uiText = uiText; + param.uiOptionA = uiOptionA; + param.uiOptionC = uiOptionC; + param.dwPad = dwPad; + param.Func = Func;\ + param.lpParam = lpParam; + param.pwchFormatString = pwchFormatString; + param.dwFocusButton = dwFocusButton; + + EUILayer layer = bIsError?eUILayer_Error:eUILayer_Alert; + + bool completed = false; + if(ui.IsReloadingSkin()) + { + // Queue this message box + QueuedMessageBoxData *queuedData = new QueuedMessageBoxData(); + queuedData->info = param; + queuedData->info.uiOptionA = new UINT[param.uiOptionC]; + memcpy(queuedData->info.uiOptionA, param.uiOptionA, param.uiOptionC * sizeof(UINT)); + queuedData->iPad = dwPad; + queuedData->layer = eUILayer_Error; // Ensures that these don't get wiped out by a CloseAllScenes call + m_queuedMessageBoxData.push_back(queuedData); + } + else + { + completed = ui.NavigateToScene(dwPad, eUIScene_MessageBox, ¶m, layer, eUIGroup_Fullscreen); + } + + if( completed ) + { + // This may happen if we had to queue the message box, or there was already a message box displaying and so the NavigateToScene returned false; + return C4JStorage::EMessage_Pending; + } + else + { + return C4JStorage::EMessage_Busy; + } +} + +C4JStorage::EMessageResult UIController::RequestUGCMessageBox(UINT title/* = -1 */, UINT message/* = -1 */, int iPad/* = -1*/, int( *Func)(LPVOID,int,const C4JStorage::EMessageResult)/* = NULL*/, LPVOID lpParam/* = NULL*/) +{ + // Default title / messages + if (title == -1) + { + title = IDS_FAILED_TO_CREATE_GAME_TITLE; + } + + if (message == -1) + { + message = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE; + } + + // Default pad to primary player + if (iPad == -1) iPad = ProfileManager.GetPrimaryPad(); + +#ifdef __ORBIS__ + // Show the vague UGC system message in addition to our message + ProfileManager.DisplaySystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_UGC_RESTRICTION, iPad ); + return C4JStorage::EMessage_ResultAccept; +#elif defined(__PSVITA__) + ProfileManager.ShowSystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION, iPad ); + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + return ui.RequestMessageBox( title, IDS_CHAT_RESTRICTION_UGC, uiIDA, 1, iPad, Func, lpParam, app.GetStringTable(), NULL, 0, false); +#else + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + return ui.RequestMessageBox( title, message, uiIDA, 1, iPad, Func, lpParam, app.GetStringTable(), NULL, 0, false); +#endif +} + +C4JStorage::EMessageResult UIController::RequestContentRestrictedMessageBox(UINT title/* = -1 */, UINT message/* = -1 */, int iPad/* = -1*/, int( *Func)(LPVOID,int,const C4JStorage::EMessageResult)/* = NULL*/, LPVOID lpParam/* = NULL*/) +{ + // Default title / messages + if (title == -1) + { + title = IDS_FAILED_TO_CREATE_GAME_TITLE; + } + + if (message == -1) + { +#if defined(_XBOX_ONE) || defined(_WINDOWS64) + // IDS_CONTENT_RESTRICTION doesn't exist on XB1 + message = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE; +#else + message = IDS_CONTENT_RESTRICTION; +#endif + } + + // Default pad to primary player + if (iPad == -1) iPad = ProfileManager.GetPrimaryPad(); + +#ifdef __ORBIS__ + // Show the vague UGC system message in addition to our message + ProfileManager.DisplaySystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_UGC_RESTRICTION, iPad ); + return C4JStorage::EMessage_ResultAccept; +#elif defined(__PSVITA__) + ProfileManager.ShowSystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_AGE_RESTRICTION, iPad ); + return C4JStorage::EMessage_ResultAccept; +#else + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + return ui.RequestMessageBox( title, message, uiIDA, 1, iPad, Func, lpParam, app.GetStringTable(), NULL, 0, false); +#endif +} + +void UIController::setFontCachingCalculationBuffer(int length) +{ + /* 4J-JEV: As described in an email from Sean. + If your `optional_temp_buffer` is NULL, Iggy will allocate the temp + buffer on the stack during Iggy draw calls. The size of the buffer it + will allocate is 16 bytes times `max_chars` in 32-bit, and 24 bytes + times `max_chars` in 64-bit. If the stack of the thread making the + draw call is not large enough, Iggy will crash or otherwise behave + incorrectly. + */ +#if defined __ORBIS__ || defined _DURANGO || defined _WIN64 + static const int CHAR_SIZE = 24; +#else + static const int CHAR_SIZE = 16; +#endif + + if (m_tempBuffer != NULL) delete [] m_tempBuffer; + if (length<0) + { + if (m_defaultBuffer == NULL) m_defaultBuffer = new char[CHAR_SIZE*5000]; + IggySetFontCachingCalculationBuffer(5000, m_defaultBuffer, CHAR_SIZE*5000); + } + else + { + m_tempBuffer = new char[CHAR_SIZE*length]; + IggySetFontCachingCalculationBuffer(length, m_tempBuffer, CHAR_SIZE*length); + } +} + +// Returns the first scene of given type if it exists, NULL otherwise +UIScene *UIController::FindScene(EUIScene sceneType) +{ + UIScene *pScene = NULL; + + for (int i = 0; i < eUIGroup_COUNT; i++) + { + pScene = m_groups[i]->FindScene(sceneType); +#ifdef __PS3__ + if (pScene != NULL) return pScene; +#else + if (pScene != nullptr) return pScene; +#endif + } + + return pScene; +} + +#ifdef __PSVITA__ + +void UIController::TouchBoxAdd(UIControl *pControl,UIScene *pUIScene) +{ + EUIGroup eUIGroup=pUIScene->GetParentLayerGroup(); + EUILayer eUILayer=pUIScene->GetParentLayer()->m_iLayer; + EUIScene eUIscene=pUIScene->getSceneType(); + + TouchBoxAdd(pControl,eUIGroup,eUILayer,eUIscene, pUIScene->GetMainPanel()); +} + +void UIController::TouchBoxAdd(UIControl *pControl,EUIGroup eUIGroup,EUILayer eUILayer,EUIScene eUIscene, UIControl *pMainPanelControl) +{ + UIELEMENT *puiElement = new UIELEMENT; + puiElement->pControl = pControl; + + S32 iControlWidth = pControl->getWidth(); + S32 iControlHeight = pControl->getHeight(); + S32 iMainPanelOffsetX = 0; + S32 iMainPanelOffsetY= 0; + + // 4J-TomK add main panel offset if controls do not live in the root scene + if(pMainPanelControl) + { + iMainPanelOffsetX = pMainPanelControl->getXPos(); + iMainPanelOffsetY = pMainPanelControl->getYPos(); + } + + // 4J-TomK override control width / height where needed + if(puiElement->pControl->getControlType() == UIControl::eSlider) + { + // Sliders are never scaled but masked, so we have to get the real width from AS + UIControl_Slider *pSlider = (UIControl_Slider *)puiElement->pControl; + iControlWidth = pSlider->GetRealWidth(); + } + else if(puiElement->pControl->getControlType() == UIControl::eTexturePackList) + { + // The origin of the TexturePackList is NOT in the top left corner but where the slot area starts. therefore we need the height of the slot area itself. + UIControl_TexturePackList *pTexturePackList = (UIControl_TexturePackList *)puiElement->pControl; + iControlHeight = pTexturePackList->GetRealHeight(); + } + else if(puiElement->pControl->getControlType() == UIControl::eDynamicLabel) + { + // The height and width of this control changes per how to play page + UIControl_DynamicLabel *pDynamicLabel = (UIControl_DynamicLabel *)puiElement->pControl; + iControlWidth = pDynamicLabel->GetRealWidth(); + iControlHeight = pDynamicLabel->GetRealHeight(); + } + else if(puiElement->pControl->getControlType() == UIControl::eHTMLLabel) + { + // The height and width of this control changes per how to play page + UIControl_HTMLLabel *pHtmlLabel = (UIControl_HTMLLabel *)puiElement->pControl; + iControlWidth = pHtmlLabel->GetRealWidth(); + iControlHeight = pHtmlLabel->GetRealHeight(); + } + + puiElement->x1=(S32)((float)pControl->getXPos() + (float)iMainPanelOffsetX); + puiElement->y1=(S32)((float)pControl->getYPos() + (float)iMainPanelOffsetY); + puiElement->x2=(S32)(((float)pControl->getXPos() + (float)iControlWidth + (float)iMainPanelOffsetX)); + puiElement->y2=(S32)(((float)pControl->getYPos() + (float)iControlHeight + (float)iMainPanelOffsetY)); + + if(puiElement->pControl->getControlType() == UIControl::eNoControl) + { + app.DebugPrintf("NO CONTROL!"); + } + + if(puiElement->x1 == puiElement->x2 || puiElement->y1 == puiElement->y2) + { + app.DebugPrintf("NOT adding touchbox %d,%d,%d,%d\n",puiElement->x1,puiElement->y1,puiElement->x2,puiElement->y2); + } + else + { + app.DebugPrintf("Adding touchbox %d,%d,%d,%d\n",puiElement->x1,puiElement->y1,puiElement->x2,puiElement->y2); + m_TouchBoxes[eUIGroup][eUILayer][eUIscene].push_back(puiElement); + } +} + +void UIController::TouchBoxRebuild(UIScene *pUIScene) +{ + EUIGroup eUIGroup=pUIScene->GetParentLayerGroup(); + EUILayer eUILayer=pUIScene->GetParentLayer()->m_iLayer; + EUIScene eUIscene=pUIScene->getSceneType(); + + // if we delete an element, it's possible that the scene has re-arranged all the elements, so we need to rebuild the boxes + ui.TouchBoxesClear(pUIScene); + + // rebuild boxes + AUTO_VAR(itEnd, pUIScene->GetControls()->end()); + for (AUTO_VAR(it, pUIScene->GetControls()->begin()); it != itEnd; it++) + { + UIControl *control=(UIControl *)*it; + + if(control->getControlType() == UIControl::eButton || + control->getControlType() == UIControl::eSlider || + control->getControlType() == UIControl::eCheckBox || + control->getControlType() == UIControl::eTexturePackList || + control->getControlType() == UIControl::eButtonList || + control->getControlType() == UIControl::eTextInput || + control->getControlType() == UIControl::eDynamicLabel || + control->getControlType() == UIControl::eHTMLLabel || + control->getControlType() == UIControl::eLeaderboardList || + control->getControlType() == UIControl::eTouchControl) + { + // 4J-TomK update the control (it might have been moved by flash / AS) + control->UpdateControl(); + + ui.TouchBoxAdd(control,eUIGroup,eUILayer,eUIscene, pUIScene->GetMainPanel()); + } + } +} + +void UIController::TouchBoxesClear(UIScene *pUIScene) +{ + EUIGroup eUIGroup=pUIScene->GetParentLayerGroup(); + EUILayer eUILayer=pUIScene->GetParentLayer()->m_iLayer; + EUIScene eUIscene=pUIScene->getSceneType(); + + AUTO_VAR(itEnd, m_TouchBoxes[eUIGroup][eUILayer][eUIscene].end()); + for (AUTO_VAR(it, m_TouchBoxes[eUIGroup][eUILayer][eUIscene].begin()); it != itEnd; it++) + { + UIELEMENT *element=(UIELEMENT *)*it; + delete element; + } + m_TouchBoxes[eUIGroup][eUILayer][eUIscene].clear(); +} + +bool UIController::TouchBoxHit(UIScene *pUIScene,S32 x, S32 y) +{ + EUIGroup eUIGroup=pUIScene->GetParentLayerGroup(); + EUILayer eUILayer=pUIScene->GetParentLayer()->m_iLayer; + EUIScene eUIscene=pUIScene->getSceneType(); + + // 4J-TomK let's do the transformation from touch resolution to screen resolution here, so our touchbox values always are in screen resolution! + x *= (m_fScreenWidth/1920.0f); + y *= (m_fScreenHeight/1080.0f); + + if(m_TouchBoxes[eUIGroup][eUILayer][eUIscene].size()>0) + { + AUTO_VAR(itEnd, m_TouchBoxes[eUIGroup][eUILayer][eUIscene].end()); + for (AUTO_VAR(it, m_TouchBoxes[eUIGroup][eUILayer][eUIscene].begin()); it != itEnd; it++) + { + UIELEMENT *element=(UIELEMENT *)*it; + if(element->pControl->getHidden() == false && element->pControl->getVisible()) // ignore removed controls + { + if((x>=element->x1) &&(x<=element->x2) && (y>=element->y1) && (y<=element->y2)) + { + if(!m_bTouchscreenPressed) + { + app.DebugPrintf("SET m_ActiveUIElement (Layer: %i) at x = %i y = %i\n", (int)eUILayer, (int)x, (int)y); + m_ActiveUIElement = element; + } + // remember the currently highlighted element + m_HighlightedUIElement = element; + + return true; + } + } + } + } + + //app.DebugPrintf("MISS at x = %i y = %i\n", (int)x, (int)y); + m_HighlightedUIElement = NULL; + return false; +} + +// +// Handle Touch Input +// +void UIController::HandleTouchInput(unsigned int iPad, unsigned int key, bool bPressed, bool bRepeat, bool bReleased) +{ + // no input? no handling! + if(!bPressed && !bRepeat && !bReleased) + { + // override for instand repeat without delay! + if(m_bTouchscreenPressed && m_ActiveUIElement && ( + m_ActiveUIElement->pControl->getControlType() == UIControl::eSlider || + m_ActiveUIElement->pControl->getControlType() == UIControl::eButtonList || + m_ActiveUIElement->pControl->getControlType() == UIControl::eTexturePackList || + m_ActiveUIElement->pControl->getControlType() == UIControl::eDynamicLabel || + m_ActiveUIElement->pControl->getControlType() == UIControl::eHTMLLabel || + m_ActiveUIElement->pControl->getControlType() == UIControl::eLeaderboardList || + m_ActiveUIElement->pControl->getControlType() == UIControl::eTouchControl)) + bRepeat = true; // the above controls need to be controllable without having the finger over them + else + return; + } + + SceTouchData* pTouchData = InputManager.GetTouchPadData(iPad,false); + S32 x = pTouchData->report[0].x * (m_fScreenWidth/1920.0f); + S32 y = pTouchData->report[0].y * (m_fScreenHeight/1080.0f); + + if(bPressed && !bRepeat && !bReleased) // PRESSED HANDLING + { + app.DebugPrintf("touch input pressed\n"); + switch(m_ActiveUIElement->pControl->getControlType()) + { + case UIControl::eButton: + // set focus + UIControl_Button *pButton=(UIControl_Button *)m_ActiveUIElement->pControl; + pButton->getParentScene()->SetFocusToElement(m_ActiveUIElement->pControl->getId()); + // override bPressed to false. we only want the button to trigger on touch release! + bPressed = false; + break; + case UIControl::eSlider: + // set focus + UIControl_Slider *pSlider=(UIControl_Slider *)m_ActiveUIElement->pControl; + pSlider->getParentScene()->SetFocusToElement(m_ActiveUIElement->pControl->getId()); + break; + case UIControl::eCheckBox: + // set focus + UIControl_CheckBox *pCheckbox=(UIControl_CheckBox *)m_ActiveUIElement->pControl; + pCheckbox->getParentScene()->SetFocusToElement(m_ActiveUIElement->pControl->getId()); + // override bPressed. we only want the checkbox to trigger on touch release! + bPressed = false; + break; + case UIControl::eButtonList: + // set focus to list + UIControl_ButtonList *pButtonList=(UIControl_ButtonList *)m_ActiveUIElement->pControl; + //pButtonList->getParentScene()->SetFocusToElement(m_ActiveUIElement->pControl->getId()); + // tell list where we tapped it so it can set focus to the correct button + pButtonList->SetTouchFocus((float)x, (float)y, false); + // override bPressed. we only want the ButtonList to trigger on touch release! + bPressed = false; + break; + case UIControl::eTexturePackList: + // set focus to list + UIControl_TexturePackList *pTexturePackList=(UIControl_TexturePackList *)m_ActiveUIElement->pControl; + pTexturePackList->getParentScene()->SetFocusToElement(m_ActiveUIElement->pControl->getId()); + // tell list where we tapped it so it can set focus to the correct texture pack + pTexturePackList->SetTouchFocus((float)x - (float)m_ActiveUIElement->x1, (float)y - (float)m_ActiveUIElement->y1, false); + // override bPressed. we only want the TexturePack List to trigger on touch release! + bPressed = false; + break; + case UIControl::eTextInput: + // set focus + UIControl_TextInput *pTextInput=(UIControl_TextInput *)m_ActiveUIElement->pControl; + pTextInput->getParentScene()->SetFocusToElement(m_ActiveUIElement->pControl->getId()); + // override bPressed to false. we only want the textinput to trigger on touch release! + bPressed = false; + break; + case UIControl::eDynamicLabel: + // handle dynamic label scrolling + UIControl_DynamicLabel *pDynamicLabel=(UIControl_DynamicLabel *)m_ActiveUIElement->pControl; + pDynamicLabel->TouchScroll(y, true); + // override bPressed to false + bPressed = false; + break; + case UIControl::eHTMLLabel: + // handle dynamic label scrolling + UIControl_HTMLLabel *pHtmlLabel=(UIControl_HTMLLabel *)m_ActiveUIElement->pControl; + pHtmlLabel->TouchScroll(y, true); + // override bPressed to false + bPressed = false; + break; + case UIControl::eLeaderboardList: + // set focus to list + UIControl_LeaderboardList *pLeaderboardList=(UIControl_LeaderboardList *)m_ActiveUIElement->pControl; + // tell list where we tapped it so it can set focus to the correct button + pLeaderboardList->SetTouchFocus((float)x, (float)y, false); + // override bPressed. we only want the ButtonList to trigger on touch release! + bPressed = false; + break; + case UIControl::eTouchControl: + // pass on touch input to relevant parent scene so we can handle it there! + m_ActiveUIElement->pControl->getParentScene()->handleTouchInput(iPad, x, y, m_ActiveUIElement->pControl->getId(), bPressed, bRepeat, bReleased); + // override bPressed to false + bPressed = false; + break; + default: + app.DebugPrintf("PRESSED - UNHANDLED UI ELEMENT\n"); + break; + } + } + else if(bRepeat) // REPEAT HANDLING + { + switch(m_ActiveUIElement->pControl->getControlType()) + { + case UIControl::eButton: + /* no action */ + break; + case UIControl::eSlider: + // handle slider movement + UIControl_Slider *pSlider=(UIControl_Slider *)m_ActiveUIElement->pControl; + float fNewSliderPos = ((float)x - (float)m_ActiveUIElement->x1) / (float)pSlider->GetRealWidth(); + pSlider->SetSliderTouchPos(fNewSliderPos); + break; + case UIControl::eCheckBox: + /* no action */ + bRepeat = false; + bPressed = false; + break; + case UIControl::eButtonList: + // handle button list scrolling + UIControl_ButtonList *pButtonList=(UIControl_ButtonList *)m_ActiveUIElement->pControl; + pButtonList->SetTouchFocus((float)x, (float)y, true); + break; + case UIControl::eTexturePackList: + // handle texturepack list scrolling + UIControl_TexturePackList *pTexturePackList=(UIControl_TexturePackList *)m_ActiveUIElement->pControl; + pTexturePackList->SetTouchFocus((float)x - (float)m_ActiveUIElement->x1, (float)y - (float)m_ActiveUIElement->y1, true); + break; + case UIControl::eTextInput: + /* no action */ + bRepeat = false; + bPressed = false; + break; + case UIControl::eDynamicLabel: + // handle dynamic label scrolling + UIControl_DynamicLabel *pDynamicLabel=(UIControl_DynamicLabel *)m_ActiveUIElement->pControl; + pDynamicLabel->TouchScroll(y, true); + // override bPressed & bRepeat to false + bPressed = false; + bRepeat = false; + break; + case UIControl::eHTMLLabel: + // handle dynamic label scrolling + UIControl_HTMLLabel *pHtmlLabel=(UIControl_HTMLLabel *)m_ActiveUIElement->pControl; + pHtmlLabel->TouchScroll(y, true); + // override bPressed & bRepeat to false + bPressed = false; + bRepeat = false; + break; + case UIControl::eLeaderboardList: + // handle button list scrolling + UIControl_LeaderboardList *pLeaderboardList=(UIControl_LeaderboardList *)m_ActiveUIElement->pControl; + pLeaderboardList->SetTouchFocus((float)x, (float)y, true); + break; + case UIControl::eTouchControl: + // override bPressed to false + bPressed = false; + // pass on touch input to relevant parent scene so we can handle it there! + m_ActiveUIElement->pControl->getParentScene()->handleTouchInput(iPad, x, y, m_ActiveUIElement->pControl->getId(), bPressed, bRepeat, bReleased); + // override bRepeat to false + bRepeat = false; + break; + default: + app.DebugPrintf("REPEAT - UNHANDLED UI ELEMENT\n"); + break; + } + } + if(bReleased) // RELEASED HANDLING + { + app.DebugPrintf("touch input released\n"); + switch(m_ActiveUIElement->pControl->getControlType()) + { + case UIControl::eButton: + // trigger button on release (ONLY if the finger is still on it!) + if(m_HighlightedUIElement && m_ActiveUIElement->pControl == m_HighlightedUIElement->pControl) + bPressed = true; + break; + case UIControl::eSlider: + /* no action */ + break; + case UIControl::eCheckBox: + // trigger checkbox on release (ONLY if the finger is still on it!) + if(m_HighlightedUIElement && m_ActiveUIElement->pControl == m_HighlightedUIElement->pControl) + { + UIControl_CheckBox *pCheckbox=(UIControl_CheckBox *)m_ActiveUIElement->pControl; + pCheckbox->TouchSetCheckbox(!pCheckbox->IsChecked()); + } + bReleased = false; + break; + case UIControl::eButtonList: + // trigger buttonlist on release (ONLY if the finger is still on it!) + if(m_HighlightedUIElement && m_ActiveUIElement->pControl == m_HighlightedUIElement->pControl) + { + UIControl_ButtonList *pButtonList=(UIControl_ButtonList *)m_ActiveUIElement->pControl; + if(pButtonList->CanTouchTrigger(x,y)) + bPressed = true; + } + break; + case UIControl::eTexturePackList: + // trigger texturepack list on release (ONLY if the finger is still on it!) + if(m_HighlightedUIElement && m_ActiveUIElement->pControl == m_HighlightedUIElement->pControl) + { + UIControl_TexturePackList *pTexturePackList=(UIControl_TexturePackList *)m_ActiveUIElement->pControl; + if(pTexturePackList->CanTouchTrigger((float)x - (float)m_ActiveUIElement->x1, (float)y - (float)m_ActiveUIElement->y1)) + bPressed = true; + } + break; + case UIControl::eTextInput: + // trigger TextInput on release (ONLY if the finger is still on it!) + if(m_HighlightedUIElement && m_ActiveUIElement->pControl == m_HighlightedUIElement->pControl) + bPressed = true; + break; + case UIControl::eDynamicLabel: + // handle dynamic label scrolling + UIControl_DynamicLabel *pDynamicLabel=(UIControl_DynamicLabel *)m_ActiveUIElement->pControl; + pDynamicLabel->TouchScroll(y, false); + break; + case UIControl::eHTMLLabel: + // handle dynamic label scrolling + UIControl_HTMLLabel *pHtmlLabel=(UIControl_HTMLLabel *)m_ActiveUIElement->pControl; + pHtmlLabel->TouchScroll(y, false); + break; + case UIControl::eLeaderboardList: + /* no action */ + break; + case UIControl::eTouchControl: + // trigger only if touch is released over the same component! + if(m_HighlightedUIElement && m_ActiveUIElement->pControl == m_HighlightedUIElement->pControl) + { + // pass on touch input to relevant parent scene so we can handle it there! + m_ActiveUIElement->pControl->getParentScene()->handleTouchInput(iPad, x, y, m_ActiveUIElement->pControl->getId(), bPressed, bRepeat, bReleased); + } + // override bReleased to false + bReleased = false; + break; + default: + app.DebugPrintf("RELEASED - UNHANDLED UI ELEMENT\n"); + break; + } + } + + // only proceed if there's input to be handled + if(bPressed || bRepeat || bReleased) + { + SendTouchInput(iPad, key, bPressed, bRepeat, bReleased); + } +} + +void UIController::SendTouchInput(unsigned int iPad, unsigned int key, bool bPressed, bool bRepeat, bool bReleased) +{ + bool handled = false; + + // Send the key to the fullscreen group first + m_groups[(int)eUIGroup_Fullscreen]->handleInput(iPad, key, bRepeat, bPressed, bReleased, handled); + if(!handled) + { + // If it's not been handled yet, then pass the event onto the players specific group + m_groups[(iPad+1)]->handleInput(iPad, key, bRepeat, bPressed, bReleased, handled); + } +} + + +#endif \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIController.h b/Minecraft.Client/Common/UI/UIController.h new file mode 100644 index 00000000..ef064f80 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIController.h @@ -0,0 +1,369 @@ +#pragma once +using namespace std; +#include "IUIController.h" +#include "UIEnums.h" +#include "UIGroup.h" + +class UIAbstractBitmapFont; +class UIBitmapFont; +class UITTFFont; +class UIComponent_DebugUIConsole; +class UIComponent_DebugUIMarketingGuide; +class UIControl; + +// Base class for all shared functions between UIControllers +class UIController : public IUIController +{ +public: + static __int64 iggyAllocCount; + + // MGH - added to prevent crash loading Iggy movies while the skins were being reloaded + static CRITICAL_SECTION ms_reloadSkinCS; + static bool ms_bReloadSkinCSInitialised; + +protected: + UIComponent_DebugUIConsole *m_uiDebugConsole; + UIComponent_DebugUIMarketingGuide *m_uiDebugMarketingGuide; + +private: + CRITICAL_SECTION m_navigationLock; + + static const int UI_REPEAT_KEY_DELAY_MS = 300; // How long from press until the first repeat + static const int UI_REPEAT_KEY_REPEAT_RATE_MS = 100; // How long in between repeats + DWORD m_actionRepeatTimer[XUSER_MAX_COUNT][ACTION_MAX_MENU+1]; + + float m_fScreenWidth; + float m_fScreenHeight; + bool m_bScreenWidthSetup; + + S32 m_tileOriginX, m_tileOriginY; + + UIAbstractBitmapFont *m_mcBitmapFont; + UITTFFont *m_mcTTFFont; + UIBitmapFont *m_moj7, *m_moj11; + + // 4J-PB - ui element type for PSVita touch control +#ifdef __PSVITA__ + + typedef struct + { + UIControl *pControl; + S32 x1,y1,x2,y2; + } + UIELEMENT; + // E3 - Fine for now, but we need to make this better! + vector m_TouchBoxes[eUIGroup_COUNT][eUILayer_COUNT][eUIScene_COUNT]; + bool m_bTouchscreenPressed; +#endif + // 4J Stu - These should be in the order that they reference each other (i.e. they can only reference one with a lower value in the enum) + enum ELibraries + { + eLibrary_Platform, + eLibrary_GraphicsDefault, + eLibrary_GraphicsHUD, + eLibrary_GraphicsInGame, + eLibrary_GraphicsTooltips, + eLibrary_GraphicsLabels, + eLibrary_Labels, + eLibrary_InGame, + eLibrary_HUD, + eLibrary_Tooltips, + eLibrary_Default, + +#if ( defined(_WINDOWS64) ) + // 4J Stu - Load the 720/480 skins so that we have something to fallback on during development +#ifndef _FINAL_BUILD + eLibraryFallback_Platform, + eLibraryFallback_GraphicsDefault, + eLibraryFallback_GraphicsHUD, + eLibraryFallback_GraphicsInGame, + eLibraryFallback_GraphicsTooltips, + eLibraryFallback_GraphicsLabels, + eLibraryFallback_Labels, + eLibraryFallback_InGame, + eLibraryFallback_HUD, + eLibraryFallback_Tooltips, + eLibraryFallback_Default, +#endif +#endif + + eLibrary_Count, + }; + + IggyLibrary m_iggyLibraries[eLibrary_Count]; + +protected: + GDrawFunctions *gdraw_funcs; + +private: + HIGGYEXP iggy_explorer; + HIGGYPERFMON iggy_perfmon; + bool m_iggyPerfmonEnabled; + + bool m_bMenuDisplayed[XUSER_MAX_COUNT]; // track each players menu displayed + bool m_bMenuToBeClosed[XUSER_MAX_COUNT]; // actioned at the end of the game loop + int m_iCountDown[XUSER_MAX_COUNT]; // ticks to block input + + bool m_bCloseAllScenes[eUIGroup_COUNT]; + + int m_iPressStartQuadrantsMask; + + C4JRender::eViewportType m_currentRenderViewport; + bool m_bCustomRenderPosition; + + static DWORD m_dwTrialTimerLimitSecs; + + unordered_map m_substitutionTextures; + + typedef struct _CachedMovieData + { + byteArray m_ba; + __int64 m_expiry; + } CachedMovieData; + unordered_map m_cachedMovieData; + + typedef struct _QueuedMessageBoxData + { + MessageBoxInfo info; + int iPad; + EUILayer layer; + } QueuedMessageBoxData; + vector m_queuedMessageBoxData; + + unsigned int m_winUserIndex; + //bool m_bSysUIShowing; + bool m_bSystemUIShowing; + C4JThread *m_reloadSkinThread; + bool m_navigateToHomeOnReload; + int m_accumulatedTicks; + + D3D11_RECT m_customRenderingClearRect; + + unordered_map m_registeredCallbackScenes; // A collection of scenes and unique id's that are used in async callbacks so we can safely handle when they get destroyed + CRITICAL_SECTION m_registeredCallbackScenesCS;; + +public: + UIController(); +#ifdef __PSVITA__ + void TouchBoxAdd(UIControl *pControl,UIScene *pUIScene); + bool TouchBoxHit(UIScene *pUIScene,S32 x, S32 y); + void TouchBoxesClear(UIScene *pUIScene); + void TouchBoxRebuild(UIScene *pUIScene); + + void HandleTouchInput(unsigned int iPad, unsigned int key, bool bPressed, bool bRepeat, bool bReleased); + void SendTouchInput(unsigned int iPad, unsigned int key, bool bPressed, bool bRepeat, bool bReleased); + + private: + void TouchBoxAdd(UIControl *pControl,EUIGroup eUIGroup,EUILayer eUILayer,EUIScene eUIscene, UIControl *pMainPanelControl); + UIELEMENT *m_ActiveUIElement; + UIELEMENT *m_HighlightedUIElement; +#endif + +protected: + UIGroup *m_groups[eUIGroup_COUNT]; + +public: + void showComponent(int iPad, EUIScene scene, EUILayer layer, EUIGroup group, bool show) + { + m_groups[group]->showComponent(iPad, scene, layer, show); + } + + void removeComponent(EUIScene scene, EUILayer layer, EUIGroup group) + { + m_groups[group]->removeComponent(scene, layer); + } + +protected: + // Should be called from the platforms init function + void preInit(S32 width, S32 height); + void postInit(); + + +public: + CRITICAL_SECTION m_Allocatorlock; + void SetupFont(); +public: + // TICKING + virtual void tick(); + +private: + void loadSkins(); + IggyLibrary loadSkin(const wstring &skinPath, const wstring &skinName); + +public: + void ReloadSkin(); + virtual void StartReloadSkinThread(); + virtual bool IsReloadingSkin(); + virtual bool IsExpectingOrReloadingSkin(); + virtual void CleanUpSkinReload(); + +private: + static int reloadSkinThreadProc(void* lpParam); + +public: + byteArray getMovieData(const wstring &filename); + + // INPUT +private: + void tickInput(); + void handleInput(); + void handleKeyPress(unsigned int iPad, unsigned int key); + +protected: + static rrbool RADLINK ExternalFunctionCallback( void * user_callback_data , Iggy * player , IggyExternalFunctionCallUTF16 * call ); + +public: + // RENDERING + float getScreenWidth() { return m_fScreenWidth; } + float getScreenHeight() { return m_fScreenHeight; } + + virtual void render() = 0; + void getRenderDimensions(C4JRender::eViewportType viewport, S32 &width, S32 &height); + void setupRenderPosition(C4JRender::eViewportType viewport); + void setupRenderPosition(S32 xOrigin, S32 yOrigin); + + void SetSysUIShowing(bool bVal); + static void SetSystemUIShowing(LPVOID lpParam,bool bVal); + +protected: + virtual void setTileOrigin(S32 xPos, S32 yPos) = 0; + +public: + + virtual CustomDrawData *setupCustomDraw(UIScene *scene, IggyCustomDrawCallbackRegion *region) = 0; + virtual CustomDrawData *calculateCustomDraw(IggyCustomDrawCallbackRegion *region) = 0; + virtual void endCustomDraw(IggyCustomDrawCallbackRegion *region) = 0; +protected: + // Should be called from the platforms render function + void renderScenes(); + +public: + virtual void beginIggyCustomDraw4J(IggyCustomDrawCallbackRegion *region, CustomDrawData *customDrawRegion) = 0; + void setupCustomDrawGameState(); + void endCustomDrawGameState(); + void setupCustomDrawMatrices(UIScene *scene, CustomDrawData *customDrawRegion); + void setupCustomDrawGameStateAndMatrices(UIScene *scene, CustomDrawData *customDrawRegion); + void endCustomDrawMatrices(); + void endCustomDrawGameStateAndMatrices(); + +protected: + + static void RADLINK CustomDrawCallback(void *user_callback_data, Iggy *player, IggyCustomDrawCallbackRegion *Region); + static GDrawTexture * RADLINK TextureSubstitutionCreateCallback( void * user_callback_data , IggyUTF16 * texture_name , S32 * width , S32 * height , void **destroy_callback_data ); + static void RADLINK TextureSubstitutionDestroyCallback( void * user_callback_data , void * destroy_callback_data , GDrawTexture * handle ); + + virtual GDrawTexture *getSubstitutionTexture(int textureId) { return NULL; } + virtual void destroySubstitutionTexture(void *destroyCallBackData, GDrawTexture *handle) {} + +public: + void registerSubstitutionTexture(const wstring &textureName, PBYTE pbData, DWORD dwLength); + void unregisterSubstitutionTexture(const wstring &textureName, bool deleteData); + +public: + // NAVIGATION + bool NavigateToScene(int iPad, EUIScene scene, void *initData = NULL, EUILayer layer = eUILayer_Scene, EUIGroup group = eUIGroup_PAD); + bool NavigateBack(int iPad, bool forceUsePad = false, EUIScene eScene = eUIScene_COUNT, EUILayer eLayer = eUILayer_COUNT); + void NavigateToHomeMenu(); + UIScene *GetTopScene(int iPad, EUILayer layer = eUILayer_Scene, EUIGroup group = eUIGroup_PAD); + + size_t RegisterForCallbackId(UIScene *scene); + void UnregisterCallbackId(size_t id); + UIScene *GetSceneFromCallbackId(size_t id); + void EnterCallbackIdCriticalSection(); + void LeaveCallbackIdCriticalSection(); + +private: + void setFullscreenMenuDisplayed(bool displayed); + +public: + void CloseAllPlayersScenes(); + void CloseUIScenes(int iPad, bool forceIPad = false); + + virtual bool IsPauseMenuDisplayed(int iPad); + virtual bool IsContainerMenuDisplayed(int iPad); + virtual bool IsIgnorePlayerJoinMenuDisplayed(int iPad); + virtual bool IsIgnoreAutosaveMenuDisplayed(int iPad); + virtual void SetIgnoreAutosaveMenuDisplayed(int iPad, bool displayed); + virtual bool IsSceneInStack(int iPad, EUIScene eScene); + bool GetMenuDisplayed(int iPad); + void SetMenuDisplayed(int iPad,bool bVal); + virtual void CheckMenuDisplayed(); + void AnimateKeyPress(int iPad, int iAction, bool bRepeat, bool bPressed, bool bReleased); + void OverrideSFX(int iPad, int iAction,bool bVal); + + // TOOLTIPS + virtual void SetTooltipText( unsigned int iPad, unsigned int tooltip, int iTextID ); + virtual void SetEnableTooltips( unsigned int iPad, BOOL bVal ); + virtual void ShowTooltip( unsigned int iPad, unsigned int tooltip, bool show ); + virtual void SetTooltips( unsigned int iPad, int iA, int iB=-1, int iX=-1, int iY=-1 , int iLT=-1, int iRT=-1, int iLB=-1, int iRB=-1, int iLS=-1, bool forceUpdate = false); + virtual void EnableTooltip( unsigned int iPad, unsigned int tooltip, bool enable ); + virtual void RefreshTooltips(unsigned int iPad); + + virtual void PlayUISFX(ESoundEffect eSound); + + virtual void DisplayGamertag(unsigned int iPad, bool show); + virtual void SetSelectedItem(unsigned int iPad, const wstring &name); + virtual void UpdateSelectedItemPos(unsigned int iPad); + + virtual void HandleDLCMountingComplete(); + virtual void HandleDLCInstalled(int iPad); +#ifdef _XBOX_ONE + virtual void HandleDLCLicenseChange(); +#endif + virtual void HandleTMSDLCFileRetrieved(int iPad); + virtual void HandleTMSBanFileRetrieved(int iPad); + virtual void HandleInventoryUpdated(int iPad); + virtual void HandleGameTick(); + + virtual void SetTutorial(int iPad, Tutorial *tutorial); + virtual void SetTutorialDescription(int iPad, TutorialPopupInfo *info); + virtual void RemoveInteractSceneReference(int iPad, UIScene *scene); + virtual void SetTutorialVisible(int iPad, bool visible); + virtual bool IsTutorialVisible(int iPad); + + virtual void UpdatePlayerBasePositions(); + virtual void SetEmptyQuadrantLogo(int iSection); + virtual void HideAllGameUIElements(); + virtual void ShowOtherPlayersBaseScene(unsigned int iPad, bool show); + + virtual void ShowTrialTimer(bool show); + virtual void SetTrialTimerLimitSecs(unsigned int uiSeconds); + virtual void UpdateTrialTimer(unsigned int iPad); + virtual void ReduceTrialTimerValue(); + + virtual void ShowAutosaveCountdownTimer(bool show); + virtual void UpdateAutosaveCountdownTimer(unsigned int uiSeconds); + virtual void ShowSavingMessage(unsigned int iPad, C4JStorage::ESavingMessage eVal); + + virtual void ShowPlayerDisplayname(bool show); + virtual bool PressStartPlaying(unsigned int iPad); + virtual void ShowPressStart(unsigned int iPad); + virtual void HidePressStart(); + void ClearPressStart(); + + // 4J Stu - Only because of the different StringTable type, should really fix the libraries +#ifndef __PS3__ + virtual C4JStorage::EMessageResult RequestMessageBox(UINT uiTitle, UINT uiText, UINT *uiOptionA,UINT uiOptionC, DWORD dwPad=XUSER_INDEX_ANY, + int( *Func)(LPVOID,int,const C4JStorage::EMessageResult)=NULL,LPVOID lpParam=NULL, C4JStringTable *pStringTable=NULL, WCHAR *pwchFormatString=NULL,DWORD dwFocusButton=0, bool bIsError = true); +#else + virtual C4JStorage::EMessageResult RequestMessageBox(UINT uiTitle, UINT uiText, UINT *uiOptionA,UINT uiOptionC, DWORD dwPad=XUSER_INDEX_ANY, + int( *Func)(LPVOID,int,const C4JStorage::EMessageResult)=NULL,LPVOID lpParam=NULL, StringTable *pStringTable=NULL, WCHAR *pwchFormatString=NULL,DWORD dwFocusButton=0, bool bIsError = true); +#endif + + C4JStorage::EMessageResult RequestUGCMessageBox(UINT title = -1, UINT message = -1, int iPad = -1, int( *Func)(LPVOID,int,const C4JStorage::EMessageResult) = NULL, LPVOID lpParam = NULL); + C4JStorage::EMessageResult RequestContentRestrictedMessageBox(UINT title = -1, UINT message = -1, int iPad = -1, int( *Func)(LPVOID,int,const C4JStorage::EMessageResult) = NULL, LPVOID lpParam = NULL); + + virtual void SetWinUserIndex(unsigned int iPad); + unsigned int GetWinUserIndex(); + + virtual void ShowUIDebugConsole(bool show); + virtual void ShowUIDebugMarketingGuide(bool show); + void logDebugString(const string &text); + UIScene* FindScene(EUIScene sceneType); + +public: + char *m_defaultBuffer, *m_tempBuffer; + void setFontCachingCalculationBuffer(int length); + + +}; diff --git a/Minecraft.Client/Common/UI/UIEnums.h b/Minecraft.Client/Common/UI/UIEnums.h new file mode 100644 index 00000000..c68b6740 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIEnums.h @@ -0,0 +1,234 @@ +#pragma once + +// Defines the fixed groups for UI (lower numbers ticked first, rendered last (ie on top)) +enum EUIGroup +{ + eUIGroup_Fullscreen, + eUIGroup_Player1, +#ifndef __PSVITA__ + eUIGroup_Player2, + eUIGroup_Player3, + eUIGroup_Player4, +#endif + + eUIGroup_COUNT, + + eUIGroup_PAD, // Special case to determine the group from the pad (default) +}; + +// Defines the layers in a UI group (lower numbers ticked first, rendered last (ie on top)) +enum EUILayer +{ +#ifndef _CONTENT_PACKAGE + eUILayer_Debug, +#endif + eUILayer_Tooltips, + eUILayer_Error, + eUILayer_Alert, + eUILayer_Fullscreen, // Note: Fullscreen in this context doesn't necessarily mean fill the whole screen, but fill the whole viewport for this group. Enables processes that don't interefere with normal scene stack + eUILayer_Popup, + eUILayer_Scene, + //eUILayer_Chat, + eUILayer_HUD, + + eUILayer_COUNT, +}; + +// Defines the scenes and components that can be added to a layer +// If you add to the enums below, you need to add the scene name in the right place in CConsoleMinecraftApp::wchSceneA +enum EUIScene +{ + eUIScene_PartnernetPassword = 0, + eUIScene_Intro, + eUIScene_SaveMessage, + eUIScene_MainMenu, + eUIScene_FullscreenProgress, + eUIScene_PauseMenu, + eUIScene_Crafting2x2Menu, + eUIScene_Crafting3x3Menu, + eUIScene_FurnaceMenu, + eUIScene_ContainerMenu, + eUIScene_LargeContainerMenu,// for splitscreen + eUIScene_InventoryMenu, + eUIScene_DispenserMenu, + eUIScene_DebugOptions, + eUIScene_DebugTips, + eUIScene_HelpAndOptionsMenu, + eUIScene_HowToPlay, + eUIScene_HowToPlayMenu, + eUIScene_ControlsMenu, + eUIScene_SettingsOptionsMenu, + eUIScene_SettingsAudioMenu, + eUIScene_SettingsControlMenu, + eUIScene_SettingsGraphicsMenu, + eUIScene_SettingsUIMenu, + eUIScene_SettingsMenu, + eUIScene_LeaderboardsMenu, + eUIScene_Credits, + eUIScene_DeathMenu, + eUIComponent_TutorialPopup, + eUIScene_CreateWorldMenu, + eUIScene_LoadOrJoinMenu, + eUIScene_JoinMenu, + eUIScene_SignEntryMenu, + eUIScene_InGameInfoMenu, + eUIScene_ConnectingProgress, + eUIScene_DLCOffersMenu, + eUIScene_SocialPost, + eUIScene_TrialExitUpsell, + eUIScene_LoadMenu, + eUIComponent_Chat, + eUIScene_ReinstallMenu, + eUIScene_SkinSelectMenu, + eUIScene_TextEntry, + eUIScene_InGameHostOptionsMenu, + eUIScene_InGamePlayerOptionsMenu, + eUIScene_CreativeMenu, + eUIScene_LaunchMoreOptionsMenu, + eUIScene_DLCMainMenu, + eUIScene_NewUpdateMessage, + eUIScene_EnchantingMenu, + eUIScene_BrewingStandMenu, + eUIScene_EndPoem, + eUIScene_HUD, + eUIScene_TradingMenu, + eUIScene_AnvilMenu, + eUIScene_TeleportMenu, + +#ifdef _XBOX +// eUIScene_TransferToXboxOne, +#endif + + // When adding new scenes here, you must also update the switches in CConsoleMinecraftApp::NavigateToScene + // There are quite a few so you need to check them all + +#ifndef _XBOX + // Anything non-xbox should be added here. The ordering of scenes above is required for sentient reporting on xbox 360 to continue to be accurate + eUIComponent_Panorama, + eUIComponent_Logo, + eUIComponent_DebugUIConsole, + eUIComponent_DebugUIMarketingGuide, + eUIComponent_Tooltips, + eUIComponent_PressStartToPlay, + eUIComponent_MenuBackground, + eUIScene_Keyboard, + eUIScene_QuadrantSignin, + eUIScene_MessageBox, + eUIScene_Timer, + eUIScene_EULA, + eUIScene_InGameSaveManagementMenu, +#endif // ndef _XBOX + +#ifdef _DEBUG_MENUS_ENABLED + eUIScene_DebugOverlay, + eUIScene_DebugItemEditor, +#endif +#ifndef _CONTENT_PACKAGE + eUIScene_DebugCreateSchematic, + eUIScene_DebugSetCamera, +#endif + + eUIScene_COUNT, +}; + +// Used by the fullscreen progress scene to decide what to do when a thread finishes +enum ProgressionCompletionType +{ + e_ProgressCompletion_NoAction, + e_ProgressCompletion_NavigateBack, + e_ProgressCompletion_CloseUIScenes, + e_ProgressCompletion_CloseAllPlayersUIScenes, + e_ProgressCompletion_NavigateToHomeMenu, + e_ProgressCompletion_AutosaveNavigateBack, + e_ProgressCompletion_NavigateBackToScene, +}; + +enum EToolTipButton +{ + eToolTipButtonA = 0, + eToolTipButtonB, + eToolTipButtonX, + eToolTipButtonY, + eToolTipButtonLT, + eToolTipButtonRT, + eToolTipButtonLB, + eToolTipButtonRB, + eToolTipButtonLS, + eToolTipNumButtons +}; + +enum EToolTipItem +{ + eToolTipNone = -1, + eToolTipPickupPlace_OLD = 0, // To support existing menus. + eToolTipExit, + eToolTipPickUpGeneric, + eToolTipPickUpAll, + eToolTipPickUpHalf, + eToolTipPlaceGeneric, + eToolTipPlaceOne, + eToolTipPlaceAll, + eToolTipDropGeneric, + eToolTipDropOne, + eToolTipDropAll, + eToolTipSwap, + eToolTipQuickMove, + eToolTipQuickMoveIngredient, + eToolTipQuickMoveFuel, + eToolTipWhatIsThis, + eToolTipEquip, + eToolTipClearQuickSelect, + eToolTipQuickMoveTool, + eToolTipQuickMoveArmor, + eToolTipQuickMoveWeapon, + eToolTipDye, + eToolTipRepair, + eNumToolTips +}; + +enum EHowToPlayPage +{ + eHowToPlay_WhatsNew = 0, + eHowToPlay_Basics, + eHowToPlay_Multiplayer, + eHowToPlay_HUD, + eHowToPlay_Creative, + eHowToPlay_Inventory, + eHowToPlay_Chest, + eHowToPlay_LargeChest, + eHowToPlay_Enderchest, + eHowToPlay_InventoryCrafting, + eHowToPlay_CraftTable, + eHowToPlay_Furnace, + eHowToPlay_Dispenser, + + eHowToPlay_Brewing, + eHowToPlay_Enchantment, + eHowToPlay_Anvil, + eHowToPlay_FarmingAnimals, + eHowToPlay_Breeding, + eHowToPlay_Trading, + + eHowToPlay_NetherPortal, + eHowToPlay_TheEnd, +#ifdef _XBOX + eHowToPlay_SocialMedia, + eHowToPlay_BanList, +#endif + eHowToPlay_HostOptions, + eHowToPlay_NumPages +}; + +// Credits +enum ECreditTextTypes +{ + eExtraLargeText = 0, + eLargeText, + eMediumText, + eSmallText, + eNumTextTypes +}; + +#define NO_TRANSLATED_STRING ( -1 ) // String ID used to indicate that we are using non localised string. + +#define CONNECTING_PROGRESS_CHECK_TIME 500 diff --git a/Minecraft.Client/Common/UI/UIFontData.cpp b/Minecraft.Client/Common/UI/UIFontData.cpp new file mode 100644 index 00000000..c5ad46ef --- /dev/null +++ b/Minecraft.Client/Common/UI/UIFontData.cpp @@ -0,0 +1,341 @@ +#include "stdafx.h" +#include "UIFontData.h" + + ///////////////////////////////////////////////////// + // --- -- --- THIS FILE IS IN UNICODE --- -- --- // + ///////////////////////////////////////////////////// + +SFontData SFontData::Mojangles_7 + = { + + /* Font Name */ "Mojangles7", + +#ifdef _XBOX + /* filename */ L"/font/Mojangles_7.png", +#else + /* Filename */ L"/TitleUpdate/res/font/Mojangles_7.png", +#endif + + /* Glyph count */ FONTSIZE, + /* Codepoints */ SFontData::Codepoints, + + /*img wdth,hght*/ 190, 264, + /*img cols,rows*/ FONTCOLS, FONTROWS, + + + /*glyph dim x,y*/ 8,13, + + /*ascent/descent*/ 7.f/13.f, 8.f/13.f, + + /*advance*/ 1.f/10.f, + + /*whitespace*/ 5, + + }; + + +SFontData SFontData::Mojangles_11 + = { + + /* Font Name */ "Mojangles11", + +#ifdef _XBOX + /* filename */ L"/font/Mojangles_11.png", +#else + /* Filename */ L"/TitleUpdate/res/font/Mojangles_11.png", +#endif + + /* Glyph count */ FONTSIZE, + /* Codepoints */ SFontData::Codepoints, + + /*img wdth,hght*/ 305, 348, + /*img cols,rows*/ FONTCOLS, FONTROWS, + + /*glyph dim x,y*/ 13,17, + + /*ascent/descent*/ 11.f/17.f, 6.f/17.f, + + /*advance*/ 1.f/13.f, + + /*whitespace*/ 7 + + }; + + + // ----------------------------------------------------------------------------- + // 4J-JEV: Glyph -> Unicode Maps, + // Unicode search tool: http://www.fileformat.info/info/unicode/char/search.htm + //------------------------------------------------------------------------------ + + +// Originally interpretted from 'Chars.txt', required many alterations to work correctly. (New Characters have been also added) +unsigned short SFontData::Codepoints[FONTSIZE] = +{ + // NOTE: When adding characters here, you may also want to add them to the ignore list 'Mojangles\Dev\Tools\Mojangles.txt' so we know not to panic when localisation uses them. + +/* ż Å» ź Ź ć Ć Å„ Ń */ + 0x0001, 0x017C, 0x017B, 0x017A, 0x0179, 0x0107, 0x0106, 0x0144, 0x0143, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + +/* ! " # $ % & ' ( ) * + , - */ + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, 0x0020, 0x0000, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, + +/* . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D */ + 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, + +/* E F G H I J K L M N O P Q R S T U V W X Y Z [ */ + 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, + +/* \ ] ^ _ ` a b c d e f g h i j k l m n o p q r */ + 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, + +/* s t u v w x y z { | } ~  */ + 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, + +/* */ + 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, 0x00A0, + +/* ¡ ¢ £ ¤ Â¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · */ + 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + +/* ¸ ¹ º » ¼ ½ ¾ ¿ À à Â Ã Ä Ã… Æ Ç È É Ê Ë ÃŒ à Î */ + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, + +/* à à Ñ Ã’ Ó Ô Õ Ö × Ø Ù Ú Û Ü à Þ ß à á â ã ä Ã¥ */ + 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, + +/* æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü */ + 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, + +/* ý þ ÿ Å’ Å“ Å  Å¡ Ÿ Ž ž Æ’ Ë£ âž„ – — ’ ‚ “ †„ † ‡ • */ + 0x00FD, 0x00FE, 0x00FF, 0x0152, 0x0153, 0x0160, 0x0161, 0x0178, 0x017D, 0x017E, 0x0192, 0x02E3, 0x2784, 0x2013, 0x2014, 0x2019, 0x201A, 0x201C, 0x201D, 0x201E, 0x2020, 0x2021, 0x2022, + +/* … ‰ ‹ › € â„¢ Í Åž İ Äž ÅŸ ı ÄŸ Ä™ Ę ó Ó Ä… Ä„ Å› Åš Å‚ Å */ + 0x2026, 0x2030, 0x2039, 0x203A, 0x20AC, 0x2122, 0x035D, 0x015E, 0x0130, 0x011E, 0x015F, 0x0131, 0x011F, 0x0119, 0x0118, 0x00F3, 0x00D3, 0x0105, 0x0104, 0x015B, 0x015A, 0x0142, 0x0141, + +/* РРБ Ð’ Г Д Е Ж З И Й К Л М РО П Р С Т У Ф Ð¥ */ + 0x0401, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, + +/* Ц Ч Ш Щ Ъ Ы Ь Э Ю Я а б в г д е ж з и й к л м */ + 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, + +/* н о п Ñ€ Ñ Ñ‚ у Ñ„ Ñ… ц ч ш щ ÑŠ Ñ‹ ÑŒ Ñ ÑŽ Ñ Ñ‘ χ ψ ω */ + 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0x0451, 0x03C7, 0x03C8, 0x03C9, + +/* ÄŒ ÄŽ Äš Ĺ Ľ Ň ŠŘ Ť Å® Ű Ä Ä Ä› ĺ ľ ň Å‘ Å™ Å¥ ů ű */ + 0x010C, 0x010E, 0x011A, 0x0139, 0x013D, 0x0147, 0x0150, 0x0158, 0x0164, 0x016E, 0x0170, 0x010D, 0x010F, 0x011B, 0x013A, 0x013E, 0x0148, 0x0151, 0x0159, 0x0165, 0x016F, 0x0171, 0x0020, + +/* Α Î’ Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ ΠΞ Ο Π Ρ Σ Τ Î¥ Φ Χ Ψ */ + 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, + +/* Ω α β γ δ ε ζ η θ ι κ λ μ ν ξ ο Ï€ Ï Ï‚ σ Ï„ Ï… φ */ + 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, + +/* Ά Έ Ή Ί ÎŒ ÎŽ ΠΠά έ ή ί ÏŠ ÏŒ Ï ÏŽ Å• ΄ ‘ */ + 0x0386, 0x0388, 0x0389, 0x038A, 0x038C, 0x038E, 0x038F, 0x0390, 0x03AC, 0x03AD, 0x03AE, 0x03AF, 0x03CA, 0x03CC, 0x03CD, 0x03CE, 0x0155, 0x0384, 0x2018, 0x0000, 0x0000, 0x0000, 0x0000, +}; + + + + + /////////////////////// + // --- CFontData --- // + /////////////////////// + +CFontData::CFontData() +{ + m_unicodeMap = unordered_map(); + + m_sFontData = NULL; + m_kerningTable = NULL; + m_pbRawImage = NULL; +} + +CFontData::CFontData(SFontData &sFontData, int *pbRawImage) + : m_unicodeMap( sFontData.m_uiGlyphCount + 2 ) +{ + this->m_sFontData = &sFontData; + + // INITIALISE ALPHA CHANNEL // + + // Glyph Archive (1Byte per pixel). + unsigned int archiveSize = sFontData.m_uiGlyphMapX * sFontData.m_uiGlyphMapY; + + this->m_pbRawImage = new unsigned char[archiveSize]; + + // 4J-JEV: Take the alpha channel from each pixel. + for (unsigned int i = 0; i < archiveSize; i++) + { + this->m_pbRawImage[i] = (pbRawImage[i] & 0xFF000000) >> 24; + } + + // CREATE UNICODE MAP // + for (unsigned int i = 0; i < sFontData.m_uiGlyphCount; i++) + { + unordered_map::value_type pair(sFontData.Codepoints[i], i); + m_unicodeMap.insert( pair ); + } + + // CREATE KERNING TABLE // + m_kerningTable = new unsigned short[sFontData.m_uiGlyphCount]; + for (unsigned short glyph = 0; glyph < sFontData.m_uiGlyphCount; glyph++) + { + int row,column; + getPos(glyph,row,column); + + short xMax = 0, _x=0, _y=0; + + // Find the position of the topLeft corner. + unsigned char *topLeft = m_pbRawImage, *cursor; + moveCursor( topLeft, column * sFontData.m_uiGlyphWidth, row * sFontData.m_uiGlyphHeight); + + assert( ((column+1)*sFontData.m_uiGlyphWidth) < sFontData.m_uiGlyphMapX ); + assert( ((row+1)*sFontData.m_uiGlyphHeight) < sFontData.m_uiGlyphMapY ); + + static int XX = 79; + // Find the furthest filled pixel to the right. + for (short y = 0; y < sFontData.m_uiGlyphHeight; y++) + { + for (short x = 0; x < sFontData.m_uiGlyphWidth; x++) + { + cursor = topLeft; + moveCursor(cursor, x, y); + + assert( (cursor-m_pbRawImage) < archiveSize ); + + if ( *cursor > 0 ) + { + if (x > xMax) xMax = x; + _x = x; + _y = y; + } + } + } + +#if _DEBUG_BLOCK_CHARS + for (short y = 0; y < sFontData.m_uiGlyphHeight; y++) + { + for (short x = 0; x < sFontData.m_uiGlyphWidth; x++) + { + cursor = topLeft; + moveCursor(cursor, x, y); + + if (x==0) *cursor = 0x00; + else if (x<=xMax) *cursor = 0xFF; + else *cursor = 0x00; + } + } +#endif + + // 4J-JEV: Empty glyphs are considered to be whitespace. + if (xMax == 0) m_kerningTable[glyph] = sFontData.m_uiWhitespaceWidth; + else m_kerningTable[glyph] = xMax + 1; + } + + // CACHE GLYPH ADVANCES // + m_pfAdvanceTable = new float[sFontData.m_uiGlyphCount]; + for (unsigned short glyph = 0; glyph < sFontData.m_uiGlyphCount; glyph++) + { + m_pfAdvanceTable[glyph] = m_kerningTable[glyph] * m_sFontData->m_fAdvPerPixel; + } + + // DEBUG // +#ifndef _CONTENT_PACKAGE + for (int i = 0; i < sFontData.m_uiGlyphCount; i++) + { + int unicode = getUnicode(i), unicodeChar = 32, row, col; + if ( 32 < unicode && unicode < 127 && unicode != 0x0025 ) + { + unicodeChar = unicode; + } + + getPos(i, row, col); + + string state = "ok"; + if (i != getGlyphId(unicode)) + { + state = "MISSMATCHED!"; + + app.DebugPrintf( " %i\t%c\tU+%.4X, kerning=%i, (%2i,%2i). %s\n", + i, getGlyphId(unicode), unicodeChar, unicode, m_kerningTable[i], row, col, state.c_str() ); + } + } +#endif +} + +void CFontData::release() +{ + delete [] m_kerningTable; + delete [] m_pfAdvanceTable; + delete [] m_pbRawImage; +} + +const string CFontData::getFontName() +{ + return m_sFontData->m_strFontName; +} + +SFontData *CFontData::getFontData() +{ + return m_sFontData; +} + +unsigned short CFontData::getGlyphId(unsigned int unicodepoint) +{ + unordered_map::iterator out = m_unicodeMap.find(unicodepoint); + if (out != m_unicodeMap.end()) + return out->second; + return 0; +} + +unsigned int CFontData::getUnicode(unsigned short glyphId) +{ + return m_sFontData->Codepoints[glyphId]; +} + +unsigned char *CFontData::topLeftPixel(int row, int col) +{ + unsigned char *out = m_pbRawImage; + moveCursor(out, col * m_sFontData->m_uiGlyphWidth, row* m_sFontData->m_uiGlyphHeight); + return out; +} + +void CFontData::getPos(unsigned short glyphId, int &rowOut, int &colOut) +{ + rowOut = glyphId / m_sFontData->m_uiGlyphMapCols; + colOut = glyphId % m_sFontData->m_uiGlyphMapCols; +} + +float CFontData::getAdvance(unsigned short glyphId) +{ + return m_pfAdvanceTable[glyphId]; +} + +int CFontData::getWidth(unsigned short glyphId) +{ + return m_kerningTable[glyphId]; +} + +bool CFontData::glyphIsWhitespace(unsigned short glyphId) +{ + return unicodeIsWhitespace( getUnicode(glyphId) ); +} + +bool CFontData::unicodeIsWhitespace(unsigned int unicode) +{ + static const unsigned int MAX_WHITESPACE = 1; + static const unsigned int whitespace[MAX_WHITESPACE] = { + 0x0020 + }; + + for (int i=0; im_uiGlyphMapX) + dx; +} diff --git a/Minecraft.Client/Common/UI/UIFontData.h b/Minecraft.Client/Common/UI/UIFontData.h new file mode 100644 index 00000000..b7e38ffa --- /dev/null +++ b/Minecraft.Client/Common/UI/UIFontData.h @@ -0,0 +1,133 @@ +#pragma once + +#include + +using namespace std; + +#define _DEBUG_BLOCK_CHARS 0 + +// For hardcoded font data. +struct SFontData +{ +public: + static const unsigned short FONTCOLS = 23; + static const unsigned short FONTROWS = 20; + + static const unsigned short FONTSIZE = FONTCOLS * FONTROWS; + +public: + // Font name. + string m_strFontName; + + // Filename of the glyph archive. + wstring m_wstrFilename; + + // Number of glyphs in the archive. + unsigned int m_uiGlyphCount; + + // Unicode values of each glyph. + unsigned short *m_arrCodepoints; + + // X resolution of glyph archive. + unsigned int m_uiGlyphMapX; + + // Y resolution of glyph archive. + unsigned int m_uiGlyphMapY; + + // Number of columns in the glyph archive. + unsigned int m_uiGlyphMapCols; + + // Number of rows in the glyph archive. + unsigned int m_uiGlyphMapRows; + + // Width of each glyph. + unsigned int m_uiGlyphWidth; + + // Height of each glyph. + unsigned int m_uiGlyphHeight; + + // Ascent of each glyph above the baseline (units?). + float m_fAscent; + + // Descent of each glyph below the baseline (units?). + float m_fDescent; + + // How much to advance for each pixel wide the glyph is. + float m_fAdvPerPixel; + + // How many pixels wide any whitespace characters are. + unsigned int m_uiWhitespaceWidth; + +public: + static unsigned short Codepoints[FONTSIZE]; + static SFontData Mojangles_7; + static SFontData Mojangles_11; +}; + +// Provides a common interface for dealing with font data. +class CFontData +{ +public: + CFontData(); + + // pbRawImage consumed by constructor. + CFontData(SFontData &sFontData, int *pbRawImage); + + // Release memory. + void release(); + +protected: + + // Hardcoded font data. + SFontData *m_sFontData; + + // Map Unicodepoints to glyph ids. + unordered_map m_unicodeMap; + + // Kerning value for each glyph. + unsigned short *m_kerningTable; + + // Binary blob of the archive image. + unsigned char *m_pbRawImage; + + // Total advance of each character. + float *m_pfAdvanceTable; + +public: + + // Accessor for the font name in the internal SFontData. + const string getFontName(); + + // Accessor for the hardcoded internal font data. + SFontData *getFontData(); + + // Get the glyph id corresponding to a unicode point. + unsigned short getGlyphId(unsigned int unicodepoint); + + // Get the unicodepoint corresponding to a glyph id. + unsigned int getUnicode(unsigned short glyphId); + + // Get a pointer to the top left pixel of a row/column in the raw image. + unsigned char *topLeftPixel(int row, int col); + + // Get the row and column where a glyph appears in the archive. + void getPos(unsigned short gyphId, int &row, int &col); + + // Get the advance of this character (units?). + float getAdvance(unsigned short glyphId); + + // Get the width (in pixels) of a given character. + int getWidth(unsigned short glyphId); + + // Returns true if this glyph is whitespace. + bool glyphIsWhitespace(unsigned short glyphId); + + // Returns true if this unicodepoint is whitespace + bool unicodeIsWhitespace(unsigned int unicodepoint); + +private: + + // Move a pointer in an image dx pixels right and dy pixels down, wrap around in either dimension leads to unknown behaviour. + void moveCursor(unsigned char *&cursor, unsigned int dx, unsigned int dy); +}; + diff --git a/Minecraft.Client/Common/UI/UIGroup.cpp b/Minecraft.Client/Common/UI/UIGroup.cpp new file mode 100644 index 00000000..1899d05b --- /dev/null +++ b/Minecraft.Client/Common/UI/UIGroup.cpp @@ -0,0 +1,421 @@ +#include "stdafx.h" +#include "UIGroup.h" + +UIGroup::UIGroup(EUIGroup group, int iPad) +{ + m_group = group; + m_iPad = iPad; + m_bMenuDisplayed = false; + m_bPauseMenuDisplayed = false; + m_bContainerMenuDisplayed = false; + m_bIgnoreAutosaveMenuDisplayed = false; + m_bIgnorePlayerJoinMenuDisplayed = false; + + m_updateFocusStateCountdown = 0; + + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + m_layers[i] = new UILayer(this); +#ifdef __PSVITA__ + m_layers[i]->m_iLayer=(EUILayer)i; +#endif + } + + m_tooltips = (UIComponent_Tooltips *)m_layers[(int)eUILayer_Tooltips]->addComponent(0, eUIComponent_Tooltips); + + m_tutorialPopup = NULL; + m_hud = NULL; + m_pressStartToPlay = NULL; + if(m_group != eUIGroup_Fullscreen) + { + m_tutorialPopup = (UIComponent_TutorialPopup *)m_layers[(int)eUILayer_Popup]->addComponent(m_iPad, eUIComponent_TutorialPopup); + + m_hud = (UIScene_HUD *)m_layers[(int)eUILayer_HUD]->addComponent(m_iPad, eUIScene_HUD); + + //m_layers[(int)eUILayer_Chat]->addComponent(m_iPad, eUIComponent_Chat); + } + else + { + m_pressStartToPlay = (UIComponent_PressStartToPlay *)m_layers[(int)eUILayer_Tooltips]->addComponent(0, eUIComponent_PressStartToPlay); + } + + m_viewportType = C4JRender::VIEWPORT_TYPE_FULLSCREEN; + + // 4J Stu - Pre-allocate this for cached rendering in scenes. It's horribly slow to do dynamically, but we should only need one + // per group as we will only be displaying one of these types of scenes at a time + m_commandBufferList = MemoryTracker::genLists(1); +} + +void UIGroup::DestroyAll() +{ + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + m_layers[i]->DestroyAll(); + } +} + +void UIGroup::ReloadAll() +{ + // We only need to reload things when they are likely to be rendered + int highestRenderable = 0; + for(; highestRenderable < eUILayer_COUNT; ++highestRenderable) + { + if(m_layers[highestRenderable]->hidesLowerScenes()) break; + } + if(highestRenderable < eUILayer_Fullscreen) highestRenderable = eUILayer_Fullscreen; + for(; highestRenderable >= 0; --highestRenderable) + { + if(highestRenderable < eUILayer_COUNT) m_layers[highestRenderable]->ReloadAll(highestRenderable != (int)eUILayer_Fullscreen); + } +} + +void UIGroup::tick() +{ + // Ignore this group if the player isn't signed in + if(m_iPad >= 0 && !ProfileManager.IsSignedIn(m_iPad)) return; + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + m_layers[i]->tick(); + + // TODO: May wish to ignore ticking other layers here based on current layer + } + + // Handle deferred update focus + if (m_updateFocusStateCountdown > 0) + { + m_updateFocusStateCountdown--; + if (m_updateFocusStateCountdown == 0)_UpdateFocusState(); +} +} + +void UIGroup::render() +{ + // Ignore this group if the player isn't signed in + if(m_iPad >= 0 && !ProfileManager.IsSignedIn(m_iPad)) return; + S32 width = 0; + S32 height = 0; + ui.getRenderDimensions(m_viewportType, width, height); + int highestRenderable = 0; + for(; highestRenderable < eUILayer_COUNT; ++highestRenderable) + { + if(m_layers[highestRenderable]->hidesLowerScenes()) break; + } + for(; highestRenderable >= 0; --highestRenderable) + { + if(highestRenderable < eUILayer_COUNT) m_layers[highestRenderable]->render(width, height,m_viewportType); + } +} + +bool UIGroup::hidesLowerScenes() +{ + // Ignore this group if the player isn't signed in + if(m_iPad >= 0 && !ProfileManager.IsSignedIn(m_iPad)) return false; + bool hidesScenes = false; + for(int i = eUILayer_COUNT - 1; i >= 0; --i) + { + hidesScenes = m_layers[i]->hidesLowerScenes(); + if(hidesScenes) break; + } + return hidesScenes; +} + +void UIGroup::getRenderDimensions(S32 &width, S32 &height) +{ + ui.getRenderDimensions(m_viewportType, width, height); +} + +// NAVIGATION +bool UIGroup::NavigateToScene(int iPad, EUIScene scene, void *initData, EUILayer layer) +{ + bool succeeded = m_layers[(int)layer]->NavigateToScene(iPad, scene, initData); + updateStackStates(); + return succeeded; +} + +bool UIGroup::NavigateBack(int iPad, EUIScene eScene, EUILayer eLayer) +{ + // Keep navigating back on every layer until we hit the target scene + bool foundTarget = false; + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + if(eLayer < eUILayer_COUNT && eLayer != i) continue; + foundTarget = m_layers[i]->NavigateBack(iPad, eScene); + if(foundTarget) break; + } + updateStackStates(); + return foundTarget; +} + +void UIGroup::closeAllScenes() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( m_iPad >= 0 ) + { + if(pMinecraft != NULL && pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + + // This just allows it to be shown + gameMode->getTutorial()->showTutorialPopup(true); + } + } + + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + // Ignore the error layer + if(i != (int)eUILayer_Error) m_layers[i]->closeAllScenes(); + } + updateStackStates(); +} + +UIScene *UIGroup::GetTopScene(EUILayer layer) +{ + return m_layers[(int)layer]->GetTopScene(); +} + +bool UIGroup::GetMenuDisplayed() +{ + return m_bMenuDisplayed; +} + +bool UIGroup::IsSceneInStack(EUIScene scene) +{ + bool found = false; + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + found = m_layers[i]->IsSceneInStack(scene); + if(found) break; + } + return found; +} + +bool UIGroup::HasFocus(int iPad) +{ + bool hasFocus = false; + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + if( m_layers[i]->m_hasFocus) + { + if(m_layers[i]->HasFocus(iPad)) + { + hasFocus = true; + } + break; + } + } + return hasFocus; +} + +#ifdef __PSVITA__ +UIScene *UIGroup::getCurrentScene() +{ + UIScene *pScene; + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + pScene=m_layers[i]->getCurrentScene(); + + if(pScene!=NULL) return pScene; + } + + return NULL; +} +#endif + +// INPUT +void UIGroup::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + // Ignore this group if the player isn't signed in + if(m_iPad >= 0 && !ProfileManager.IsSignedIn(m_iPad)) return; + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + m_layers[i]->handleInput(iPad, key, repeat, pressed, released, handled); + if(handled) break; + } +} + +// FOCUS + +// Check that a layer may recieve focus, specifically that there is no infocus layer above +bool UIGroup::RequestFocus(UILayer* layerPtr) +{ + // Find the layer + unsigned int layerIndex = GetLayerIndex(layerPtr); + + // Top layer is always allowed focus + if (layerIndex == 0) return true; + + // Check layers above to see if any of them have focus + for (int i = layerIndex-1; i >= 0; i--) + { + if (m_layers[i]->m_hasFocus) return false; + } + + return true; +} + +void UIGroup::showComponent(int iPad, EUIScene scene, EUILayer layer, bool show) +{ + m_layers[layer]->showComponent(iPad, scene, show); +} + +UIScene *UIGroup::addComponent(int iPad, EUIScene scene, EUILayer layer) +{ + return m_layers[layer]->addComponent(iPad, scene); +} + +void UIGroup::removeComponent(EUIScene scene, EUILayer layer) +{ + m_layers[layer]->removeComponent(scene); +} + +void UIGroup::SetViewportType(C4JRender::eViewportType type) +{ + if(m_viewportType != type) + { + m_viewportType = type; + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + m_layers[i]->ReloadAll(true); + } + } +} + +C4JRender::eViewportType UIGroup::GetViewportType() +{ + return m_viewportType; +} + +void UIGroup::HandleDLCMountingComplete() +{ + // Ignore this group if the player isn't signed in + if(m_iPad >= 0 && !ProfileManager.IsSignedIn(m_iPad)) return; + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + app.DebugPrintf("UIGroup::HandleDLCMountingComplete - m_layers[%d]\n",i); + m_layers[i]->HandleDLCMountingComplete(); + } +} + +void UIGroup::HandleDLCInstalled() +{ + // Ignore this group if the player isn't signed in + if(m_iPad >= 0 && !ProfileManager.IsSignedIn(m_iPad)) return; + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + m_layers[i]->HandleDLCInstalled(); + } +} + +#ifdef _XBOX_ONE +void UIGroup::HandleDLCLicenseChange() +{ + // Ignore this group if the player isn't signed in + if(m_iPad >= 0 && !ProfileManager.IsSignedIn(m_iPad)) return; + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + m_layers[i]->HandleDLCLicenseChange(); + } +} +#endif + +bool UIGroup::IsFullscreenGroup() +{ + return m_group == eUIGroup_Fullscreen; +} + + +void UIGroup::handleUnlockFullVersion() +{ + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + m_layers[i]->handleUnlockFullVersion(); + } +} + +void UIGroup::updateStackStates() +{ + m_bMenuDisplayed = false; + m_bPauseMenuDisplayed = false; + m_bContainerMenuDisplayed = false; + m_bIgnoreAutosaveMenuDisplayed = false; + m_bIgnorePlayerJoinMenuDisplayed = false; + + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + m_bMenuDisplayed = m_bMenuDisplayed || m_layers[i]->m_bMenuDisplayed; + m_bPauseMenuDisplayed = m_bPauseMenuDisplayed || m_layers[i]->m_bPauseMenuDisplayed; + m_bContainerMenuDisplayed = m_bContainerMenuDisplayed || m_layers[i]->m_bContainerMenuDisplayed; + m_bIgnoreAutosaveMenuDisplayed = m_bIgnoreAutosaveMenuDisplayed || m_layers[i]->m_bIgnoreAutosaveMenuDisplayed; + m_bIgnorePlayerJoinMenuDisplayed = m_bIgnorePlayerJoinMenuDisplayed || m_layers[i]->m_bIgnorePlayerJoinMenuDisplayed; + } +} + +// Defer update focus till for 10 UI ticks +void UIGroup::UpdateFocusState() +{ + m_updateFocusStateCountdown = 10; +} + +// Pass focus to uppermost layer that accepts focus +void UIGroup::_UpdateFocusState() +{ + bool groupFocusSet = false; + + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + groupFocusSet = m_layers[i]->updateFocusState(true); + if (groupFocusSet) break; + } +} + +// Get the index of the layer +unsigned int UIGroup::GetLayerIndex(UILayer* layerPtr) +{ + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + if (m_layers[i] == layerPtr) return i; + } + + // can't get here... + return 0; +} + +void UIGroup::PrintTotalMemoryUsage(__int64 &totalStatic, __int64 &totalDynamic) +{ + __int64 groupStatic = 0; + __int64 groupDynamic = 0; + app.DebugPrintf(app.USER_SR, "-- BEGIN GROUP %d\n",m_group); + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + app.DebugPrintf(app.USER_SR, " \\- BEGIN LAYER %d\n",i); + m_layers[i]->PrintTotalMemoryUsage(groupStatic, groupDynamic); + app.DebugPrintf(app.USER_SR, " \\- END LAYER %d\n",i); + } + app.DebugPrintf(app.USER_SR, "-- Group static: %d, Group dynamic: %d\n", groupStatic, groupDynamic); + totalStatic += groupStatic; + totalDynamic += groupDynamic; + app.DebugPrintf(app.USER_SR, "-- END GROUP %d\n",m_group); +} + +int UIGroup::getCommandBufferList() +{ + return m_commandBufferList; +} + +// Returns the first scene of given type if it exists, NULL otherwise +UIScene *UIGroup::FindScene(EUIScene sceneType) +{ + UIScene *pScene = NULL; + + for (int i = 0; i < eUILayer_COUNT; i++) + { + pScene = m_layers[i]->FindScene(sceneType); +#ifdef __PS3__ + if (pScene != NULL) return pScene; +#else + if (pScene != nullptr) return pScene; +#endif + } + + return pScene; +} diff --git a/Minecraft.Client/Common/UI/UIGroup.h b/Minecraft.Client/Common/UI/UIGroup.h new file mode 100644 index 00000000..e20fbb02 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIGroup.h @@ -0,0 +1,113 @@ +#pragma once +#include "UILayer.h" +#include "UIEnums.h" + +class UIComponent_Tooltips; +class UIComponent_TutorialPopup; +class UIScene_HUD; +class UIComponent_PressStartToPlay; + +// A group contains a collection of layers for a specific context (e.g. each player has 1 group) +class UIGroup +{ +private: + UILayer *m_layers[eUILayer_COUNT]; + + UIComponent_Tooltips *m_tooltips; + UIComponent_TutorialPopup *m_tutorialPopup; + UIComponent_PressStartToPlay *m_pressStartToPlay; + UIScene_HUD *m_hud; + + C4JRender::eViewportType m_viewportType; + + EUIGroup m_group; + int m_iPad; + + bool m_bMenuDisplayed; + bool m_bPauseMenuDisplayed; + bool m_bContainerMenuDisplayed; + bool m_bIgnoreAutosaveMenuDisplayed; + bool m_bIgnorePlayerJoinMenuDisplayed; + + // Countdown in ticks to update focus state + int m_updateFocusStateCountdown; + + int m_commandBufferList; + +public: + UIGroup(EUIGroup group, int iPad); + +#ifdef __PSVITA__ + EUIGroup GetGroup() {return m_group;} +#endif + UIComponent_Tooltips *getTooltips() { return m_tooltips; } + UIComponent_TutorialPopup *getTutorialPopup() { return m_tutorialPopup; } + UIScene_HUD *getHUD() { return m_hud; } + UIComponent_PressStartToPlay *getPressStartToPlay() { return m_pressStartToPlay; } + + void DestroyAll(); + void ReloadAll(); + + void tick(); + void render(); + bool hidesLowerScenes(); + void getRenderDimensions(S32 &width, S32 &height); + + // NAVIGATION + bool NavigateToScene(int iPad, EUIScene scene, void *initData, EUILayer layer); + bool NavigateBack(int iPad, EUIScene eScene, EUILayer eLayer = eUILayer_COUNT); + void closeAllScenes(); + UIScene *GetTopScene(EUILayer layer); + + bool IsSceneInStack(EUIScene scene); + bool HasFocus(int iPad); + + bool RequestFocus(UILayer* layerPtr); + void UpdateFocusState(); + + bool GetMenuDisplayed(); + bool IsPauseMenuDisplayed() { return m_bPauseMenuDisplayed; } + bool IsContainerMenuDisplayed() { return m_bContainerMenuDisplayed; } + bool IsIgnoreAutosaveMenuDisplayed() { return m_bIgnoreAutosaveMenuDisplayed; } + bool IsIgnorePlayerJoinMenuDisplayed() { return m_bIgnorePlayerJoinMenuDisplayed; } + + // INPUT + void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +#ifdef __PSVITA__ + // Current active scene + UIScene *getCurrentScene(); +#endif + + // FOCUS + bool getFocusState(); + + // A component is an element on a layer that displays BELOW other scenes in this layer, but does not engage in any navigation + // E.g. you can keep a component active while performing navigation with other scenes on this layer + void showComponent(int iPad, EUIScene scene, EUILayer layer, bool show); + UIScene *addComponent(int iPad, EUIScene scene, EUILayer layer); + void removeComponent(EUIScene scene, EUILayer layer); + + void SetViewportType(C4JRender::eViewportType type); + C4JRender::eViewportType GetViewportType(); + + virtual void HandleDLCMountingComplete(); + virtual void HandleDLCInstalled(); +#ifdef _XBOX_ONE + virtual void HandleDLCLicenseChange(); +#endif + bool IsFullscreenGroup(); + + void handleUnlockFullVersion(); + + void PrintTotalMemoryUsage(__int64 &totalStatic, __int64 &totalDynamic); + + unsigned int GetLayerIndex(UILayer* layerPtr); + + int getCommandBufferList(); + UIScene *FindScene(EUIScene sceneType); + +private: + void _UpdateFocusState(); + void updateStackStates(); +}; diff --git a/Minecraft.Client/Common/UI/UILayer.cpp b/Minecraft.Client/Common/UI/UILayer.cpp new file mode 100644 index 00000000..e6f87f81 --- /dev/null +++ b/Minecraft.Client/Common/UI/UILayer.cpp @@ -0,0 +1,870 @@ +#include "stdafx.h" +#include "UI.h" +#include "UILayer.h" +#include "UIScene.h" + +UILayer::UILayer(UIGroup *parent) +{ + m_parentGroup = parent; + m_hasFocus = false; + m_bMenuDisplayed = false; + m_bPauseMenuDisplayed = false; + m_bContainerMenuDisplayed = false; + m_bIgnoreAutosaveMenuDisplayed = false; + m_bIgnorePlayerJoinMenuDisplayed = false; +} + +void UILayer::tick() +{ + // Delete old scenes - deleting a scene can cause a new scene to be deleted, so we need to make a copy of the scenes that we are going to try and destroy this tick + vectorscenesToDeleteCopy; + for( AUTO_VAR(it,m_scenesToDelete.begin()); it != m_scenesToDelete.end(); it++) + { + UIScene *scene = (*it); + scenesToDeleteCopy.push_back(scene); + } + m_scenesToDelete.clear(); + + // Delete the scenes in our copy if they are ready to delete, otherwise add back to the ones that are still to be deleted. Actually deleting a scene might also add something back into m_scenesToDelete. + for( AUTO_VAR(it,scenesToDeleteCopy.begin()); it != scenesToDeleteCopy.end(); it++) + { + UIScene *scene = (*it); + if( scene->isReadyToDelete()) + { + delete scene; + } + else + { + m_scenesToDelete.push_back(scene); + } + } + + while (!m_scenesToDestroy.empty()) + { + UIScene *scene = m_scenesToDestroy.back(); + m_scenesToDestroy.pop_back(); + scene->destroyMovie(); + } + m_scenesToDestroy.clear(); + + for(AUTO_VAR(it,m_components.begin()); it != m_components.end(); ++it) + { + (*it)->tick(); + } + // Note: reverse iterator, the last element is the top of the stack + int sceneIndex = m_sceneStack.size() - 1; + //for(AUTO_VAR(it,m_sceneStack.rbegin()); it != m_sceneStack.rend(); ++it) + while( sceneIndex >= 0 && sceneIndex < m_sceneStack.size() ) + { + //(*it)->tick(); + UIScene *scene = m_sceneStack[sceneIndex]; + scene->tick(); + --sceneIndex; + // TODO: We may wish to ignore ticking the rest of the stack based on this scene + } +} + +void UILayer::render(S32 width, S32 height, C4JRender::eViewportType viewport) +{ + if(!ui.IsExpectingOrReloadingSkin()) + { + for(AUTO_VAR(it,m_components.begin()); it != m_components.end(); ++it) + { + AUTO_VAR(itRef,m_componentRefCount.find((*it)->getSceneType())); + if(itRef != m_componentRefCount.end() && itRef->second.second) + { + if((*it)->isVisible() ) + { + PIXBeginNamedEvent(0, "Rendering component %d", (*it)->getSceneType() ); + (*it)->render(width, height,viewport); + PIXEndNamedEvent(); + } + } + } + } + if(!m_sceneStack.empty()) + { + int lowestRenderable = m_sceneStack.size() - 1; + for(;lowestRenderable >= 0; --lowestRenderable) + { + if(m_sceneStack[lowestRenderable]->hidesLowerScenes()) break; + } + if(lowestRenderable < 0) lowestRenderable = 0; + for(;lowestRenderable < m_sceneStack.size(); ++lowestRenderable) + { + if(m_sceneStack[lowestRenderable]->isVisible() && (!ui.IsExpectingOrReloadingSkin() || m_sceneStack[lowestRenderable]->getSceneType()==eUIScene_Timer)) + { + PIXBeginNamedEvent(0, "Rendering scene %d", m_sceneStack[lowestRenderable]->getSceneType() ); + m_sceneStack[lowestRenderable]->render(width, height,viewport); + PIXEndNamedEvent(); + } + } + } +} + +bool UILayer::IsSceneInStack(EUIScene scene) +{ + bool inStack = false; + for(int i = m_sceneStack.size() - 1;i >= 0; --i) + { + if(m_sceneStack[i]->getSceneType() == scene) + { + inStack = true; + break; + } + } + return inStack; +} + +bool UILayer::HasFocus(int iPad) +{ + bool hasFocus = false; + if(m_hasFocus) + { + for(int i = m_sceneStack.size() - 1;i >= 0; --i) + { + if(m_sceneStack[i]->stealsFocus() ) + { + if(m_sceneStack[i]->hasFocus(iPad)) + { + hasFocus = true; + } + break; + } + } + } + return hasFocus; +} + +bool UILayer::hidesLowerScenes() +{ + bool hidesScenes = false; + for(AUTO_VAR(it,m_components.begin()); it != m_components.end(); ++it) + { + if((*it)->hidesLowerScenes()) + { + hidesScenes = true; + break; + } + } + if(!hidesScenes && !m_sceneStack.empty()) + { + for(int i = m_sceneStack.size() - 1;i >= 0; --i) + { + if(m_sceneStack[i]->hidesLowerScenes()) + { + hidesScenes = true; + break; + } + } + } + return hidesScenes; +} + +void UILayer::getRenderDimensions(S32 &width, S32 &height) +{ + m_parentGroup->getRenderDimensions(width, height); +} + +void UILayer::DestroyAll() +{ + for(AUTO_VAR(it,m_components.begin()); it != m_components.end(); ++it) + { + (*it)->destroyMovie(); + } + for(AUTO_VAR(it, m_sceneStack.begin()); it != m_sceneStack.end(); ++it) + { + (*it)->destroyMovie(); + } +} + +void UILayer::ReloadAll(bool force) +{ + for(AUTO_VAR(it,m_components.begin()); it != m_components.end(); ++it) + { + (*it)->reloadMovie(force); + } + if(!m_sceneStack.empty()) + { + int lowestRenderable = 0; + for(;lowestRenderable < m_sceneStack.size(); ++lowestRenderable) + { + m_sceneStack[lowestRenderable]->reloadMovie(); + } + } +} + +bool UILayer::GetMenuDisplayed() +{ + return m_bMenuDisplayed; +} + +bool UILayer::NavigateToScene(int iPad, EUIScene scene, void *initData) +{ + UIScene *newScene = NULL; + switch(scene) + { + // Debug +#ifdef _DEBUG_MENUS_ENABLED + case eUIScene_DebugOverlay: + newScene = new UIScene_DebugOverlay(iPad, initData, this); + break; + case eUIScene_DebugSetCamera: + newScene = new UIScene_DebugSetCamera(iPad, initData, this); + break; + case eUIScene_DebugCreateSchematic: + newScene = new UIScene_DebugCreateSchematic(iPad, initData, this); + break; +#endif + case eUIScene_DebugOptions: + newScene = new UIScene_DebugOptionsMenu(iPad, initData, this); + break; + + // Containers + case eUIScene_InventoryMenu: + newScene = new UIScene_InventoryMenu(iPad, initData, this); + break; + case eUIScene_CreativeMenu: + newScene = new UIScene_CreativeMenu(iPad, initData, this); + break; + case eUIScene_ContainerMenu: + case eUIScene_LargeContainerMenu: + newScene = new UIScene_ContainerMenu(iPad, initData, this); + break; + case eUIScene_BrewingStandMenu: + newScene = new UIScene_BrewingStandMenu(iPad, initData, this); + break; + case eUIScene_DispenserMenu: + newScene = new UIScene_DispenserMenu(iPad, initData, this); + break; + case eUIScene_EnchantingMenu: + newScene = new UIScene_EnchantingMenu(iPad, initData, this); + break; + case eUIScene_FurnaceMenu: + newScene = new UIScene_FurnaceMenu(iPad, initData, this); + break; + case eUIScene_Crafting2x2Menu: + case eUIScene_Crafting3x3Menu: + newScene = new UIScene_CraftingMenu(iPad, initData, this); + break; + case eUIScene_TradingMenu: + newScene = new UIScene_TradingMenu(iPad, initData, this); + break; + case eUIScene_AnvilMenu: + newScene = new UIScene_AnvilMenu(iPad, initData, this); + break; + + // Help and Options + case eUIScene_HelpAndOptionsMenu: + newScene = new UIScene_HelpAndOptionsMenu(iPad, initData, this); + break; + case eUIScene_SettingsMenu: + newScene = new UIScene_SettingsMenu(iPad, initData, this); + break; + case eUIScene_SettingsOptionsMenu: + newScene = new UIScene_SettingsOptionsMenu(iPad, initData, this); + break; + case eUIScene_SettingsAudioMenu: + newScene = new UIScene_SettingsAudioMenu(iPad, initData, this); + break; + case eUIScene_SettingsControlMenu: + newScene = new UIScene_SettingsControlMenu(iPad, initData, this); + break; + case eUIScene_SettingsGraphicsMenu: + newScene = new UIScene_SettingsGraphicsMenu(iPad, initData, this); + break; + case eUIScene_SettingsUIMenu: + newScene = new UIScene_SettingsUIMenu(iPad, initData, this); + break; + case eUIScene_SkinSelectMenu: + newScene = new UIScene_SkinSelectMenu(iPad, initData, this); + break; + case eUIScene_HowToPlayMenu: + newScene = new UIScene_HowToPlayMenu(iPad, initData, this); + break; + case eUIScene_HowToPlay: + newScene = new UIScene_HowToPlay(iPad, initData, this); + break; + case eUIScene_ControlsMenu: + newScene = new UIScene_ControlsMenu(iPad, initData, this); + break; + case eUIScene_ReinstallMenu: + newScene = new UIScene_ReinstallMenu(iPad, initData, this); + break; + case eUIScene_Credits: + newScene = new UIScene_Credits(iPad, initData, this); + break; + + + // Other in-game + case eUIScene_PauseMenu: + newScene = new UIScene_PauseMenu(iPad, initData, this); + break; + case eUIScene_DeathMenu: + newScene = new UIScene_DeathMenu(iPad, initData, this); + break; + case eUIScene_ConnectingProgress: + newScene = new UIScene_ConnectingProgress(iPad, initData, this); + break; + case eUIScene_SignEntryMenu: + newScene = new UIScene_SignEntryMenu(iPad, initData, this); + break; + case eUIScene_InGameInfoMenu: + newScene = new UIScene_InGameInfoMenu(iPad, initData, this); + break; + case eUIScene_InGameHostOptionsMenu: + newScene = new UIScene_InGameHostOptionsMenu(iPad, initData, this); + break; + case eUIScene_InGamePlayerOptionsMenu: + newScene = new UIScene_InGamePlayerOptionsMenu(iPad, initData, this); + break; +#if defined(_XBOX_ONE) || defined(__ORBIS__) + case eUIScene_InGameSaveManagementMenu: + newScene = new UIScene_InGameSaveManagementMenu(iPad, initData, this); + break; +#endif + case eUIScene_TeleportMenu: + newScene = new UIScene_TeleportMenu(iPad, initData, this); + break; + case eUIScene_EndPoem: + if(IsSceneInStack(eUIScene_EndPoem)) + { + app.DebugPrintf("Skipped EndPoem as one was already showing\n"); + return false; + } + else + { + newScene = new UIScene_EndPoem(iPad, initData, this); + } + break; + + + // Frontend + case eUIScene_TrialExitUpsell: + newScene = new UIScene_TrialExitUpsell(iPad, initData, this); + break; + case eUIScene_Intro: + newScene = new UIScene_Intro(iPad, initData, this); + break; + case eUIScene_SaveMessage: + newScene = new UIScene_SaveMessage(iPad, initData, this); + break; + case eUIScene_MainMenu: + newScene = new UIScene_MainMenu(iPad, initData, this); + break; + case eUIScene_LoadOrJoinMenu: + newScene = new UIScene_LoadOrJoinMenu(iPad, initData, this); + break; + case eUIScene_LoadMenu: + newScene = new UIScene_LoadMenu(iPad, initData, this); + break; + case eUIScene_JoinMenu: + newScene = new UIScene_JoinMenu(iPad, initData, this); + break; + case eUIScene_CreateWorldMenu: + newScene = new UIScene_CreateWorldMenu(iPad, initData, this); + break; + case eUIScene_LaunchMoreOptionsMenu: + newScene = new UIScene_LaunchMoreOptionsMenu(iPad, initData, this); + break; + case eUIScene_FullscreenProgress: + newScene = new UIScene_FullscreenProgress(iPad, initData, this); + break; + case eUIScene_LeaderboardsMenu: + newScene = new UIScene_LeaderboardsMenu(iPad, initData, this); + break; + case eUIScene_DLCMainMenu: + newScene = new UIScene_DLCMainMenu(iPad, initData, this); + break; + case eUIScene_DLCOffersMenu: + newScene = new UIScene_DLCOffersMenu(iPad, initData, this); + break; + case eUIScene_EULA: + newScene = new UIScene_EULA(iPad, initData, this); + break; + + // Other + case eUIScene_Keyboard: + newScene = new UIScene_Keyboard(iPad, initData, this); + break; + case eUIScene_QuadrantSignin: + newScene = new UIScene_QuadrantSignin(iPad, initData, this); + break; + case eUIScene_MessageBox: + if(IsSceneInStack(eUIScene_MessageBox)) + { + app.DebugPrintf("Skipped MessageBox as one was already showing\n"); + return false; + } + else + { + newScene = new UIScene_MessageBox(iPad, initData, this); + } + break; + case eUIScene_Timer: + newScene = new UIScene_Timer(iPad, initData, this); + break; + }; + + if(newScene == NULL) + { + app.DebugPrintf("WARNING: Scene %d was not created. Add it to UILayer::NavigateToScene\n", scene); + return false; + } + + if(m_sceneStack.size() > 0) + { + newScene->setBackScene(m_sceneStack[m_sceneStack.size()-1]); + } + + m_sceneStack.push_back(newScene); + + updateFocusState(); + + newScene->tick(); + + return true; +} + +bool UILayer::NavigateBack(int iPad, EUIScene eScene) +{ + if(m_sceneStack.size() == 0) return false; + + bool navigated = false; + if(eScene < eUIScene_COUNT) + { + UIScene *scene = NULL; + do + { + scene = m_sceneStack.back(); + if(scene->getSceneType() == eScene) + { + navigated = true; + break; + } + else + { + if(scene->hasFocus(iPad)) + { + removeScene(scene); + } + else + { + // No focus on the top scene, so this use shouldn't be navigating! + break; + } + } + } while(m_sceneStack.size() > 0); + + } + else + { + UIScene *scene = m_sceneStack.back(); + if(scene->hasFocus(iPad)) + { + removeScene(scene); + navigated = true; + } + } + return navigated; +} + +void UILayer::showComponent(int iPad, EUIScene scene, bool show) +{ + AUTO_VAR(it,m_componentRefCount.find(scene)); + if(it != m_componentRefCount.end()) + { + it->second.second = show; + return; + } + if(show) addComponent(iPad,scene); +} + +bool UILayer::isComponentVisible(EUIScene scene) +{ + bool visible = false; + AUTO_VAR(it,m_componentRefCount.find(scene)); + if(it != m_componentRefCount.end()) + { + visible = it->second.second; + } + return visible; +} + +UIScene *UILayer::addComponent(int iPad, EUIScene scene, void *initData) +{ + AUTO_VAR(it,m_componentRefCount.find(scene)); + if(it != m_componentRefCount.end()) + { + ++it->second.first; + + for(AUTO_VAR(itComp,m_components.begin()); itComp != m_components.end(); ++itComp) + { + if( (*itComp)->getSceneType() == scene ) + { + return *itComp; + } + } + return NULL; + } + UIScene *newScene = NULL; + + switch(scene) + { + case eUIComponent_Panorama: + newScene = new UIComponent_Panorama(iPad, initData, this); + m_componentRefCount[scene] = pair(1,true); + break; + case eUIComponent_DebugUIConsole: + newScene = new UIComponent_DebugUIConsole(iPad, initData, this); + m_componentRefCount[scene] = pair(1,true); + break; + case eUIComponent_DebugUIMarketingGuide: + newScene = new UIComponent_DebugUIMarketingGuide(iPad, initData, this); + m_componentRefCount[scene] = pair(1,true); + break; + case eUIComponent_Logo: + newScene = new UIComponent_Logo(iPad, initData, this); + m_componentRefCount[scene] = pair(1,true); + break; + case eUIComponent_Tooltips: + newScene = new UIComponent_Tooltips(iPad, initData, this); + m_componentRefCount[scene] = pair(1,true); + break; + case eUIComponent_TutorialPopup: + newScene = new UIComponent_TutorialPopup(iPad, initData, this); + // Start hidden + m_componentRefCount[scene] = pair(1,false); + break; + case eUIScene_HUD: + newScene = new UIScene_HUD(iPad, initData, this); + // Start hidden + m_componentRefCount[scene] = pair(1,false); + break; + case eUIComponent_Chat: + newScene = new UIComponent_Chat(iPad, initData, this); + m_componentRefCount[scene] = pair(1,true); + break; + case eUIComponent_PressStartToPlay: + newScene = new UIComponent_PressStartToPlay(iPad, initData, this); + m_componentRefCount[scene] = pair(1,true); + break; + case eUIComponent_MenuBackground: + newScene = new UIComponent_MenuBackground(iPad, initData, this); + m_componentRefCount[scene] = pair(1,true); + break; + }; + + if(newScene == NULL) return NULL; + + m_components.push_back(newScene); + + return newScene; +} + +void UILayer::removeComponent(EUIScene scene) +{ + AUTO_VAR(it,m_componentRefCount.find(scene)); + if(it != m_componentRefCount.end()) + { + --it->second.first; + + if(it->second.first <= 0) + { + m_componentRefCount.erase(it); + for(AUTO_VAR(compIt, m_components.begin()) ; compIt != m_components.end(); ) + { + if( (*compIt)->getSceneType() == scene) + { +#ifdef __PSVITA__ + // remove any touchboxes + ui.TouchBoxesClear((*compIt)); +#endif + m_scenesToDelete.push_back((*compIt)); + (*compIt)->handleDestroy(); // For anything that might require the pointer be valid + compIt = m_components.erase(compIt); + } + else + { + ++compIt; + } + } + } + } +} + +void UILayer::removeScene(UIScene *scene) +{ +#ifdef __PSVITA__ + // remove any touchboxes + ui.TouchBoxesClear(scene); +#endif + + AUTO_VAR(newEnd, std::remove(m_sceneStack.begin(), m_sceneStack.end(), scene) ); + m_sceneStack.erase(newEnd, m_sceneStack.end()); + + m_scenesToDelete.push_back(scene); + + scene->handleDestroy(); // For anything that might require the pointer be valid + + bool hadFocus = m_hasFocus; + updateFocusState(); + + // If this layer has focus, pass it on + if (m_hasFocus || hadFocus) + { + m_hasFocus = false; + m_parentGroup->UpdateFocusState(); + } +} + +void UILayer::closeAllScenes() +{ + vector temp; + temp.insert(temp.end(), m_sceneStack.begin(), m_sceneStack.end()); + m_sceneStack.clear(); + for(AUTO_VAR(it, temp.begin()); it != temp.end(); ++it) + { +#ifdef __PSVITA__ + // remove any touchboxes + ui.TouchBoxesClear(*it); +#endif + m_scenesToDelete.push_back(*it); + (*it)->handleDestroy(); // For anything that might require the pointer be valid + } + + updateFocusState(); + + // If this layer has focus, pass it on + if (m_hasFocus) + { + m_hasFocus = false; + m_parentGroup->UpdateFocusState(); + } +} + +// Get top scene on stack (or NULL if stack is empty) +UIScene *UILayer::GetTopScene() +{ + if(m_sceneStack.size() == 0) + { + return NULL; + } + else + { + return m_sceneStack[m_sceneStack.size()-1]; + } +} + +// Updates layer focus state if no error message is present (unless this is the error layer) +bool UILayer::updateFocusState(bool allowedFocus /* = false */) +{ + // If haveFocus is false, request it + if (!allowedFocus) + { + // To update focus in this layer we need to request focus from group + // Focus will be denied if there's an upper layer that needs focus + allowedFocus = m_parentGroup->RequestFocus(this); + } + + m_bMenuDisplayed = false; + m_bPauseMenuDisplayed = false; + m_bContainerMenuDisplayed = false; + m_bIgnoreAutosaveMenuDisplayed = false; + m_bIgnorePlayerJoinMenuDisplayed = false; + + bool layerFocusSet = false; + for(AUTO_VAR(it,m_sceneStack.rbegin()); it != m_sceneStack.rend(); ++it) + { + UIScene *scene = *it; + + // UPDATE FOCUS STATES + if(!layerFocusSet && allowedFocus && scene->stealsFocus()) + { + scene->gainFocus(); + layerFocusSet = true; + } + else + { + scene->loseFocus(); + if(allowedFocus && app.GetGameStarted()) + { + // 4J Stu - This is a memory optimisation so we don't keep scenes loaded in memory all the time + // This is required for PS3 (and likely Vita), but I'm removing it on XboxOne so that we can avoid + // the scene creation time (which can be >0.5s) since we have the memory to spare +#ifndef _XBOX_ONE + m_scenesToDestroy.push_back(scene); +#endif + } + } + + /// UPDATE STACK STATES + + // 4J-PB - this should just be true + m_bMenuDisplayed=true; + + EUIScene sceneType = scene->getSceneType(); + switch(sceneType) + { + case eUIScene_PauseMenu: + m_bPauseMenuDisplayed = true; + break; + case eUIScene_Crafting2x2Menu: + case eUIScene_Crafting3x3Menu: + case eUIScene_FurnaceMenu: + case eUIScene_ContainerMenu: + case eUIScene_LargeContainerMenu: + case eUIScene_InventoryMenu: + case eUIScene_CreativeMenu: + case eUIScene_DispenserMenu: + case eUIScene_BrewingStandMenu: + case eUIScene_EnchantingMenu: + m_bContainerMenuDisplayed=true; + + // Intentional fall-through + case eUIScene_DeathMenu: + case eUIScene_FullscreenProgress: + case eUIScene_SignEntryMenu: + case eUIScene_EndPoem: + m_bIgnoreAutosaveMenuDisplayed = true; + break; + } + + switch(sceneType) + { + case eUIScene_FullscreenProgress: + case eUIScene_EndPoem: + case eUIScene_Credits: + case eUIScene_LeaderboardsMenu: + m_bIgnorePlayerJoinMenuDisplayed = true; + break; + } + } + m_hasFocus = layerFocusSet; + + return m_hasFocus; +} + +#ifdef __PSVITA__ +UIScene *UILayer::getCurrentScene() +{ + // Note: reverse iterator, the last element is the top of the stack + for(AUTO_VAR(it,m_sceneStack.rbegin()); it != m_sceneStack.rend(); ++it) + { + UIScene *scene = *it; + // 4J-PB - only used on Vita, so iPad 0 is fine + if(scene->hasFocus(0) && scene->canHandleInput()) + { + return scene; + } +} + + return NULL; +} +#endif + +void UILayer::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + // Note: reverse iterator, the last element is the top of the stack + for(AUTO_VAR(it,m_sceneStack.rbegin()); it != m_sceneStack.rend(); ++it) + { + UIScene *scene = *it; + if(scene->hasFocus(iPad) && scene->canHandleInput()) + { + // 4J-PB - ignore repeats of action ABXY buttons + // fix for PS3 213 - [MAIN MENU] Holding down buttons will continue to activate every prompt. + // 4J Stu - Changed this slightly to add the allowRepeat function so we can allow repeats in the crafting menu + if(repeat && !scene->allowRepeat(key) ) + { + return; + } + scene->handleInput(iPad, key, repeat, pressed, released, handled); + } + + // Fix for PS3 #444 - [IN GAME] If the user keeps pressing CROSS while on the 'Save Game' screen the title will crash. + handled = handled || scene->hidesLowerScenes(); + if(handled ) break; + } + + // Components can't take input or focus +} + +void UILayer::HandleDLCMountingComplete() +{ + for(AUTO_VAR(it,m_sceneStack.rbegin()); it != m_sceneStack.rend(); ++it) + { + UIScene *topScene = *it; + app.DebugPrintf("UILayer::HandleDLCMountingComplete - topScene\n"); + topScene->HandleDLCMountingComplete(); + } +} + +void UILayer::HandleDLCInstalled() +{ + for(AUTO_VAR(it,m_sceneStack.rbegin()); it != m_sceneStack.rend(); ++it) + { + UIScene *topScene = *it; + topScene->HandleDLCInstalled(); + } +} + +#ifdef _XBOX_ONE +void UILayer::HandleDLCLicenseChange() +{ + for(AUTO_VAR(it,m_sceneStack.rbegin()); it != m_sceneStack.rend(); ++it) + { + UIScene *topScene = *it; + topScene->HandleDLCLicenseChange(); + } +} +#endif + +bool UILayer::IsFullscreenGroup() +{ + return m_parentGroup->IsFullscreenGroup(); +} + +C4JRender::eViewportType UILayer::getViewport() +{ + return m_parentGroup->GetViewportType(); +} + + +void UILayer::handleUnlockFullVersion() +{ + for(AUTO_VAR(it, m_sceneStack.begin()); it != m_sceneStack.end(); ++it) + { + (*it)->handleUnlockFullVersion(); + } +} + +void UILayer::PrintTotalMemoryUsage(__int64 &totalStatic, __int64 &totalDynamic) +{ + __int64 layerStatic = 0; + __int64 layerDynamic = 0; + for(AUTO_VAR(it,m_components.begin()); it != m_components.end(); ++it) + { + (*it)->PrintTotalMemoryUsage(layerStatic, layerDynamic); + } + for(AUTO_VAR(it, m_sceneStack.begin()); it != m_sceneStack.end(); ++it) + { + (*it)->PrintTotalMemoryUsage(layerStatic, layerDynamic); + } + app.DebugPrintf(app.USER_SR, " \\- Layer static: %d , Layer dynamic: %d\n", layerStatic, layerDynamic); + totalStatic += layerStatic; + totalDynamic += layerDynamic; +} + +// Returns the first scene of given type if it exists, NULL otherwise +UIScene *UILayer::FindScene(EUIScene sceneType) +{ + for (int i = 0; i < m_sceneStack.size(); i++) + { + if (m_sceneStack[i]->getSceneType() == sceneType) + { + return m_sceneStack[i]; + } + } + + return NULL; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UILayer.h b/Minecraft.Client/Common/UI/UILayer.h new file mode 100644 index 00000000..2840f23f --- /dev/null +++ b/Minecraft.Client/Common/UI/UILayer.h @@ -0,0 +1,91 @@ +#pragma once +#include "UIEnums.h" +using namespace std; +class UIScene; +class UIGroup; + +// A layer include a collection of scenes and other components +class UILayer +{ +private: + vector m_sceneStack; // Operates as a stack mainly, but we may wish to iterate over all elements + vector m_components; // Other componenents in this scene that to do not conform the the user nav stack, and cannot take focus + vector m_scenesToDelete; // A list of scenes to delete + vector m_scenesToDestroy; // A list of scenes where we want to dump the swf + +#ifdef __ORBIS__ + unordered_map,std::hash> m_componentRefCount; +#else + unordered_map > m_componentRefCount; +#endif + +public: + bool m_hasFocus; // True if the layer "has focus", should be the only layer in the group + bool m_bMenuDisplayed; + bool m_bPauseMenuDisplayed; + bool m_bContainerMenuDisplayed; + bool m_bIgnoreAutosaveMenuDisplayed; + bool m_bIgnorePlayerJoinMenuDisplayed; + +#ifdef __PSVITA__ + EUILayer m_iLayer; +#endif + + UIGroup *m_parentGroup; +public: + UILayer(UIGroup *parent); + + void tick(); + void render(S32 width, S32 height, C4JRender::eViewportType viewport); + void getRenderDimensions(S32 &width, S32 &height); + + void DestroyAll(); + void ReloadAll(bool force = false); + + // NAVIGATION + bool NavigateToScene(int iPad, EUIScene scene, void *initData); + bool NavigateBack(int iPad, EUIScene eScene); + void removeScene(UIScene *scene); + void closeAllScenes(); + UIScene *GetTopScene(); + + bool GetMenuDisplayed(); + bool IsPauseMenuDisplayed() { return m_bPauseMenuDisplayed; } + + bool IsSceneInStack(EUIScene scene); + bool HasFocus(int iPad); + + bool hidesLowerScenes(); + + // A component is an element on a layer that displays BELOW other scenes in this layer, but does not engage in any navigation + // E.g. you can keep a component active while performing navigation with other scenes on this layer + void showComponent(int iPad, EUIScene scene, bool show); + bool isComponentVisible(EUIScene scene); + UIScene *addComponent(int iPad, EUIScene scene, void *initData = NULL); + void removeComponent(EUIScene scene); + + // INPUT + void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); +#ifdef __PSVITA__ + // Current active scene + UIScene *getCurrentScene(); +#endif + // FOCUS + + bool updateFocusState(bool allowedFocus = false); + +public: + bool IsFullscreenGroup(); + C4JRender::eViewportType getViewport(); + + virtual void HandleDLCMountingComplete(); + virtual void HandleDLCInstalled(); +#ifdef _XBOX_ONE + virtual void HandleDLCLicenseChange(); +#endif + void handleUnlockFullVersion(); + UIScene *FindScene(EUIScene sceneType); + + void PrintTotalMemoryUsage(__int64 &totalStatic, __int64 &totalDynamic); + +}; diff --git a/Minecraft.Client/Common/UI/UIScene.cpp b/Minecraft.Client/Common/UI/UIScene.cpp new file mode 100644 index 00000000..e7d907ec --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene.cpp @@ -0,0 +1,1248 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene.h" + +#include "..\..\Lighting.h" +#include "..\..\LocalPlayer.h" +#include "..\..\ItemRenderer.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" + +UIScene::UIScene(int iPad, UILayer *parentLayer) +{ + m_parentLayer = parentLayer; + m_iPad = iPad; + swf = NULL; + m_pItemRenderer = NULL; + + bHasFocus = false; + m_hasTickedOnce = false; + m_bFocussedOnce = false; + m_bVisible = true; + m_bCanHandleInput = false; + m_bIsReloading = false; + + m_iFocusControl = -1; + m_iFocusChild = 0; + m_lastOpacity = 1.0f; + m_bUpdateOpacity = false; + + m_backScene = NULL; + + m_cacheSlotRenders = false; + m_needsCacheRendered = true; + m_expectedCachedSlotCount = 0; + m_callbackUniqueId = 0; +} + +UIScene::~UIScene() +{ + /* Destroy the Iggy player. */ + IggyPlayerDestroy( swf ); + + for(AUTO_VAR(it,m_registeredTextures.begin()); it != m_registeredTextures.end(); ++it) + { + ui.unregisterSubstitutionTexture( it->first, it->second ); + } + + if(m_callbackUniqueId != 0) + { + ui.UnregisterCallbackId(m_callbackUniqueId); + } + + if(m_pItemRenderer != NULL) delete m_pItemRenderer; +} + +void UIScene::destroyMovie() +{ + /* Destroy the Iggy player. */ + IggyPlayerDestroy( swf ); + swf = NULL; + + // Clear out the controls collection (doesn't delete the controls, and they get re-setup later) + m_controls.clear(); + + // Clear out all the fast names for the current movie + m_fastNames.clear(); +} + +void UIScene::reloadMovie(bool force) +{ + if(!force && (stealsFocus() && (getSceneType() != eUIScene_FullscreenProgress && !bHasFocus))) return; + + m_bIsReloading = true; + if(swf) + { + /* Destroy the Iggy player. */ + IggyPlayerDestroy( swf ); + + // Clear out the controls collection (doesn't delete the controls, and they get re-setup later) + m_controls.clear(); + + // Clear out all the fast names for the current movie + m_fastNames.clear(); + } + + // Reload everything + initialiseMovie(); + + handlePreReload(); + + // Reload controls + for(AUTO_VAR(it, m_controls.begin()); it != m_controls.end(); ++it) + { + (*it)->ReInit(); + } + + handleReload(); + + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = m_iFocusControl; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetFocus , 1 , value ); + + m_needsCacheRendered = true; + m_bIsReloading = false; +} + +bool UIScene::needsReloaded() +{ + return !swf && (!stealsFocus() || bHasFocus); +} + +bool UIScene::hasMovie() +{ + return swf != NULL; +} + +F64 UIScene::getSafeZoneHalfHeight() +{ + float height = ui.getScreenHeight(); + + float safeHeight = 0.0f; + +#ifndef __PSVITA__ + if( !RenderManager.IsHiDef() && RenderManager.IsWidescreen() ) + { + // 90% safezone + safeHeight = height * (0.15f / 2); + } + else + { + // 90% safezone + safeHeight = height * (0.1f / 2); + } +#endif + return safeHeight; +} + +F64 UIScene::getSafeZoneHalfWidth() +{ + float width = ui.getScreenWidth(); + + float safeWidth = 0.0f; +#ifndef __PSVITA__ + if( !RenderManager.IsHiDef() && RenderManager.IsWidescreen() ) + { + // 85% safezone + safeWidth = width * (0.15f / 2); + } + else + { + // 90% safezone + safeWidth = width * (0.1f / 2); + } +#endif + return safeWidth; +} + +void UIScene::updateSafeZone() +{ + // Distance from edge + F64 safeTop = 0.0; + F64 safeBottom = 0.0; + F64 safeLeft = 0.0; + F64 safeRight = 0.0; + + switch( m_parentLayer->getViewport() ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + safeTop = getSafeZoneHalfHeight(); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + safeBottom = getSafeZoneHalfHeight(); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + safeLeft = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + safeRight = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + safeTop = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + safeTop = getSafeZoneHalfHeight(); + safeRight = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + safeBottom = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + safeBottom = getSafeZoneHalfHeight(); + safeRight = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + default: + safeTop = getSafeZoneHalfHeight(); + safeBottom = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + safeRight = getSafeZoneHalfWidth(); + break; + } + setSafeZone(safeTop, safeBottom, safeLeft, safeRight); +} + +void UIScene::setSafeZone(S32 safeTop, S32 safeBottom, S32 safeLeft, S32 safeRight) +{ + IggyDataValue result; + IggyDataValue value[4]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = safeTop; + value[1].type = IGGY_DATATYPE_number; + value[1].number = safeBottom; + value[2].type = IGGY_DATATYPE_number; + value[2].number = safeLeft; + value[3].type = IGGY_DATATYPE_number; + value[3].number = safeRight; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetSafeZone , 4 , value ); +} + +void UIScene::initialiseMovie() +{ + loadMovie(); + mapElementsAndNames(); + + updateSafeZone(); + + m_bUpdateOpacity = true; +} + +#ifdef __PSVITA__ +void UIScene::SetFocusToElement(int iID) +{ + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iID; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetFocus , 1 , value ); + + // also trigger handle focus change (just in case if anything else in relation needs updating!) + _handleFocusChange(iID, 0); +} +#endif + +bool UIScene::mapElementsAndNames() +{ + m_rootPath = IggyPlayerRootPath( swf ); + + m_funcRemoveObject = registerFastName( L"RemoveObject" ); + m_funcSlideLeft = registerFastName( L"SlideLeft" ); + m_funcSlideRight = registerFastName( L"SlideRight" ); + m_funcSetSafeZone = registerFastName( L"SetSafeZone" ); + m_funcSetAlpha = registerFastName( L"SetAlpha" ); + m_funcSetFocus = registerFastName( L"SetFocus" ); + m_funcHorizontalResizeCheck = registerFastName( L"DoHorizontalResizeCheck"); + return true; +} + +extern CRITICAL_SECTION s_loadSkinCS; +void UIScene::loadMovie() +{ + EnterCriticalSection(&UIController::ms_reloadSkinCS); // MGH - added to prevent crash loading Iggy movies while the skins were being reloaded + wstring moviePath = getMoviePath(); + +#ifdef __PS3__ + if(RenderManager.IsWidescreen()) + { + moviePath.append(L"720.swf"); + m_loadedResolution = eSceneResolution_720; + } + else + { + moviePath.append(L"480.swf"); + m_loadedResolution = eSceneResolution_480; + } +#elif defined __PSVITA__ + moviePath.append(L"Vita.swf"); + m_loadedResolution = eSceneResolution_Vita; +#elif defined _WINDOWS64 + if(ui.getScreenHeight() == 720) + { + moviePath.append(L"720.swf"); + m_loadedResolution = eSceneResolution_720; + } + else if(ui.getScreenHeight() == 480) + { + moviePath.append(L"480.swf"); + m_loadedResolution = eSceneResolution_480; + } + else if(ui.getScreenHeight() < 720) + { + moviePath.append(L"Vita.swf"); + m_loadedResolution = eSceneResolution_Vita; + } + else + { + moviePath.append(L"1080.swf"); + m_loadedResolution = eSceneResolution_1080; + } +#else + moviePath.append(L"1080.swf"); + m_loadedResolution = eSceneResolution_1080; +#endif + + if(!app.hasArchiveFile(moviePath)) + { + app.DebugPrintf("WARNING: Could not find iggy movie %ls, falling back on 720\n", moviePath.c_str()); + + moviePath = getMoviePath(); + moviePath.append(L"720.swf"); + m_loadedResolution = eSceneResolution_720; + + if(!app.hasArchiveFile(moviePath)) + { + app.DebugPrintf("ERROR: Could not find any iggy movie for %ls!\n", moviePath.c_str()); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + app.FatalLoadError(); + } + } + + byteArray baFile = ui.getMovieData(moviePath.c_str()); + __int64 beforeLoad = ui.iggyAllocCount; + swf = IggyPlayerCreateFromMemory ( baFile.data , baFile.length, NULL); + __int64 afterLoad = ui.iggyAllocCount; + IggyPlayerInitializeAndTickRS ( swf ); + __int64 afterTick = ui.iggyAllocCount; + + if(!swf) + { + app.DebugPrintf("ERROR: Failed to load iggy scene!\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + app.FatalLoadError(); + } + app.DebugPrintf( app.USER_SR, "Loaded iggy movie %ls\n", moviePath.c_str() ); + IggyProperties *properties = IggyPlayerProperties ( swf ); + m_movieHeight = properties->movie_height_in_pixels; + m_movieWidth = properties->movie_width_in_pixels; + + m_renderWidth = m_movieWidth; + m_renderHeight = m_movieHeight; + + S32 width, height; + m_parentLayer->getRenderDimensions(width, height); + IggyPlayerSetDisplaySize( swf, width, height ); + + IggyPlayerSetUserdata(swf,this); + +//#ifdef _DEBUG +#if 0 + IggyMemoryUseInfo memoryInfo; + rrbool res; + int iteration = 0; + __int64 totalStatic = 0; + __int64 totalDynamic = 0; + while(res = IggyDebugGetMemoryUseInfo ( swf , + NULL , + 0 , + 0 , + iteration , + &memoryInfo )) + { + totalStatic += memoryInfo.static_allocation_bytes; + totalDynamic += memoryInfo.dynamic_allocation_bytes; + app.DebugPrintf(app.USER_SR, "%ls - %.*s static: %d ( %d ) dynamic: %d ( %d )\n", moviePath.c_str(), memoryInfo.subcategory_stringlen, memoryInfo.subcategory, + memoryInfo.static_allocation_bytes, memoryInfo.static_allocation_count, memoryInfo.dynamic_allocation_bytes, memoryInfo.dynamic_allocation_count); + ++iteration; + //if(memoryInfo.static_allocation_bytes > 0) getDebugMemoryUseRecursive(moviePath, memoryInfo); + + } + + app.DebugPrintf(app.USER_SR, "%ls - Total: %d, Expected: %d, Diff: %d\n", moviePath.c_str(), totalStatic + totalDynamic, afterTick - beforeLoad, (afterTick - beforeLoad) - (totalStatic + totalDynamic)); + +#endif + LeaveCriticalSection(&UIController::ms_reloadSkinCS); + +} + +void UIScene::getDebugMemoryUseRecursive(const wstring &moviePath, IggyMemoryUseInfo &memoryInfo) +{ + rrbool res; + IggyMemoryUseInfo internalMemoryInfo; + int internalIteration = 0; + while(res = IggyDebugGetMemoryUseInfo ( swf , + NULL , + memoryInfo.subcategory , + memoryInfo.subcategory_stringlen , + internalIteration , + &internalMemoryInfo )) + { + app.DebugPrintf(app.USER_SR, "%ls - %.*s static: %d ( %d ) dynamic: %d ( %d )\n", moviePath.c_str(), internalMemoryInfo.subcategory_stringlen, internalMemoryInfo.subcategory, + internalMemoryInfo.static_allocation_bytes, internalMemoryInfo.static_allocation_count, internalMemoryInfo.dynamic_allocation_bytes, internalMemoryInfo.dynamic_allocation_count); + ++internalIteration; + if(internalMemoryInfo.subcategory_stringlen > memoryInfo.subcategory_stringlen) getDebugMemoryUseRecursive(moviePath, internalMemoryInfo); + } +} + +void UIScene::PrintTotalMemoryUsage(__int64 &totalStatic, __int64 &totalDynamic) +{ + if(!swf) return; + + IggyMemoryUseInfo memoryInfo; + rrbool res; + int iteration = 0; + __int64 sceneStatic = 0; + __int64 sceneDynamic = 0; + while(res = IggyDebugGetMemoryUseInfo ( swf , + NULL , + "" , + 0 , + iteration , + &memoryInfo )) + { + sceneStatic += memoryInfo.static_allocation_bytes; + sceneDynamic += memoryInfo.dynamic_allocation_bytes; + totalStatic += memoryInfo.static_allocation_bytes; + totalDynamic += memoryInfo.dynamic_allocation_bytes; + ++iteration; + + } + + app.DebugPrintf(app.USER_SR, " \\- Scene static: %d , Scene dynamic: %d , Total: %d - %ls\n", sceneStatic, sceneDynamic, sceneStatic + sceneDynamic, getMoviePath().c_str()); +} + +void UIScene::tick() +{ + if(m_bIsReloading) return; + if(m_hasTickedOnce) m_bCanHandleInput = true; + while(IggyPlayerReadyToTick( swf )) + { + tickTimers(); + for(AUTO_VAR(it, m_controls.begin()); it != m_controls.end(); ++it) + { + (*it)->tick(); + } + IggyPlayerTickRS( swf ); + m_hasTickedOnce = true; + } +} + +UIControl* UIScene::GetMainPanel() +{ + return NULL; +} + + +void UIScene::addTimer(int id, int ms) +{ + int currentTime = System::currentTimeMillis(); + + TimerInfo info; + info.running = true; + info.duration = ms; + info.targetTime = currentTime + ms; + m_timers[id] = info; +} + +void UIScene::killTimer(int id) +{ + AUTO_VAR(it, m_timers.find(id)); + if(it != m_timers.end()) + { + it->second.running = false; + } +} + +void UIScene::tickTimers() +{ + int currentTime = System::currentTimeMillis(); + for(AUTO_VAR(it, m_timers.begin()); it != m_timers.end();) + { + if(!it->second.running) + { + it = m_timers.erase(it); + } + else + { + if(currentTime > it->second.targetTime) + { + handleTimerComplete(it->first); + + // Auto-restart + it->second.targetTime = it->second.duration + currentTime; + } + ++it; + } + } +} + +IggyName UIScene::registerFastName(const wstring &name) +{ + IggyName var; + AUTO_VAR(it,m_fastNames.find(name)); + if(it != m_fastNames.end()) + { + var = it->second; + } + else + { + var = IggyPlayerCreateFastName ( getMovie() , (IggyUTF16 *)name.c_str() , -1 ); + m_fastNames[name] = var; + } + return var; +} + +void UIScene::removeControl( UIControl_Base *control, bool centreScene) +{ + IggyDataValue result; + IggyDataValue value[2]; + + string name = control->getControlName(); + IggyStringUTF8 stringVal; + stringVal.string = (char*)name.c_str(); + stringVal.length = name.length(); + value[0].type = IGGY_DATATYPE_string_UTF8; + value[0].string8 = stringVal; + + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = centreScene; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcRemoveObject , 2 , value ); + +#ifdef __PSVITA__ + // update the button positions since they may have changed + UpdateSceneControls(); + + // mark the button as removed + control->setHidden(true); + // remove it from the touchboxes + ui.TouchBoxRebuild(control->getParentScene()); +#endif + +} + +void UIScene::slideLeft() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSlideLeft , 0 , NULL ); +} + +void UIScene::slideRight() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSlideRight , 0 , NULL ); +} + +void UIScene::doHorizontalResizeCheck() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcHorizontalResizeCheck , 0 , NULL ); +} + +void UIScene::render(S32 width, S32 height, C4JRender::eViewportType viewport) +{ + if(m_bIsReloading) return; + if(!m_hasTickedOnce || !swf) return; + ui.setupRenderPosition(viewport); + IggyPlayerSetDisplaySize( swf, width, height ); + IggyPlayerDraw( swf ); +} + +void UIScene::setOpacity(float percent) +{ + if(percent != m_lastOpacity || (m_bUpdateOpacity && getMovie())) + { + m_lastOpacity = percent; + + // 4J-TomK once a scene has been freshly loaded or re-loaded we force update opacity via initialiseMovie + if(m_bUpdateOpacity) + m_bUpdateOpacity = false; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = percent; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetAlpha , 1 , value ); + } +} + +void UIScene::setVisible(bool visible) +{ + m_bVisible = visible; +} + +void UIScene::customDraw(IggyCustomDrawCallbackRegion *region) +{ + app.DebugPrintf("Handling custom draw for scene with no override!\n"); +} + +void UIScene::customDrawSlotControl(IggyCustomDrawCallbackRegion *region, int iPad, shared_ptr item, float fAlpha, bool isFoil, bool bDecorations) +{ + if (item!= NULL) + { + if(m_cacheSlotRenders) + { + if( (m_cachedSlotDraw.size() + 1) == m_expectedCachedSlotCount) + { + //Make sure that pMinecraft->player is the correct player so that player specific rendering + // eg clock and compass, are rendered correctly + Minecraft *pMinecraft=Minecraft::GetInstance(); + shared_ptr oldPlayer = pMinecraft->player; + if( iPad >= 0 && iPad < XUSER_MAX_COUNT ) pMinecraft->player = pMinecraft->localplayers[iPad]; + + // Setup GDraw, normal game render states and matrices + //CustomDrawData *customDrawRegion = ui.setupCustomDraw(this,region); + PIXBeginNamedEvent(0,"Starting Iggy custom draw\n"); + CustomDrawData *customDrawRegion = ui.calculateCustomDraw(region); + ui.beginIggyCustomDraw4J(region, customDrawRegion); + ui.setupCustomDrawGameState(); + + int list = m_parentLayer->m_parentGroup->getCommandBufferList(); + + bool useCommandBuffers = false; +#ifdef _XBOX_ONE + useCommandBuffers = true; + + // 4J Stu - Temporary until we fix the glint animation which needs updated if we are just replaying a command buffer + m_needsCacheRendered = true; +#endif + + if(!useCommandBuffers || m_needsCacheRendered) + { +#if (!defined __PS3__) && (!defined __PSVITA__) + if(useCommandBuffers) RenderManager.CBuffStart(list, true); +#endif + PIXBeginNamedEvent(0,"Draw uncached"); + ui.setupCustomDrawMatrices(this, customDrawRegion); + _customDrawSlotControl(customDrawRegion, iPad, item, fAlpha, isFoil, bDecorations, useCommandBuffers); + delete customDrawRegion; + PIXEndNamedEvent(); + + PIXBeginNamedEvent(0,"Draw all cache"); + // Draw all the cached slots + for(AUTO_VAR(it, m_cachedSlotDraw.begin()); it != m_cachedSlotDraw.end(); ++it) + { + CachedSlotDrawData *drawData = *it; + ui.setupCustomDrawMatrices(this, drawData->customDrawRegion); + _customDrawSlotControl(drawData->customDrawRegion, iPad, drawData->item, drawData->fAlpha, drawData->isFoil, drawData->bDecorations, useCommandBuffers); + delete drawData->customDrawRegion; + delete drawData; + } + PIXEndNamedEvent(); +#ifndef __PS3__ + if(useCommandBuffers) RenderManager.CBuffEnd(); +#endif + } + m_cachedSlotDraw.clear(); + +#ifndef __PS3__ + if(useCommandBuffers) RenderManager.CBuffCall(list); +#endif + + // Finish GDraw and anything else that needs to be finalised + ui.endCustomDraw(region); + + pMinecraft->player = oldPlayer; + } + else + { + PIXBeginNamedEvent(0,"Caching region"); + CachedSlotDrawData *drawData = new CachedSlotDrawData(); + drawData->item = item; + drawData->fAlpha = fAlpha; + drawData->isFoil = isFoil; + drawData->bDecorations = bDecorations; + drawData->customDrawRegion = ui.calculateCustomDraw(region); + + m_cachedSlotDraw.push_back(drawData); + PIXEndNamedEvent(); + } + } + else + { + // Setup GDraw, normal game render states and matrices + CustomDrawData *customDrawRegion = ui.setupCustomDraw(this,region); + + Minecraft *pMinecraft=Minecraft::GetInstance(); + + //Make sure that pMinecraft->player is the correct player so that player specific rendering + // eg clock and compass, are rendered correctly + shared_ptr oldPlayer = pMinecraft->player; + if( iPad >= 0 && iPad < XUSER_MAX_COUNT ) pMinecraft->player = pMinecraft->localplayers[iPad]; + + _customDrawSlotControl(customDrawRegion, iPad, item, fAlpha, isFoil, bDecorations, false); + delete customDrawRegion; + pMinecraft->player = oldPlayer; + + // Finish GDraw and anything else that needs to be finalised + ui.endCustomDraw(region); + } + } +} + +void UIScene::_customDrawSlotControl(CustomDrawData *region, int iPad, shared_ptr item, float fAlpha, bool isFoil, bool bDecorations, bool usingCommandBuffer) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + + float bwidth,bheight; + bwidth = region->x1 - region->x0; + bheight = region->y1 - region->y0; + + float x = region->x0; + float y = region->y0; + + // Base scale on height of this control, compared to height of what the item renderer normally renders (16 pixels high). Potentially + // we might want separate x & y scales here + + float scaleX = bwidth / 16.0f; + float scaleY = bheight / 16.0f; + + glEnable(GL_RESCALE_NORMAL); + glPushMatrix(); + glRotatef(120, 1, 0, 0); + Lighting::turnOn(); + glPopMatrix(); + + float pop = item->popTime; + if (pop > 0) + { + glPushMatrix(); + float squeeze = 1 + pop / (float) Inventory::POP_TIME_DURATION; + float sx = x; + float sy = y; + float sxoffs = 8 * scaleX; + float syoffs = 12 * scaleY; + glTranslatef((float)(sx + sxoffs), (float)(sy + syoffs), 0); + glScalef(1 / squeeze, (squeeze + 1) / 2, 1); + glTranslatef((float)-(sx + sxoffs), (float)-(sy + syoffs), 0); + } + + PIXBeginNamedEvent(0,"Render and decorate"); + if(m_pItemRenderer == NULL) m_pItemRenderer = new ItemRenderer(); + m_pItemRenderer->renderAndDecorateItem(pMinecraft->font, pMinecraft->textures, item, x, y,scaleX,scaleY,fAlpha,isFoil,false, !usingCommandBuffer); + PIXEndNamedEvent(); + + if (pop > 0) + { + glPopMatrix(); + } + + if(bDecorations) + { + if((scaleX!=1.0f) ||(scaleY!=1.0f)) + { + glPushMatrix(); + glScalef(scaleX, scaleY, 1.0f); + int iX= (int)(0.5f+((float)x)/scaleX); + int iY= (int)(0.5f+((float)y)/scaleY); + + m_pItemRenderer->renderGuiItemDecorations(pMinecraft->font, pMinecraft->textures, item, iX, iY, fAlpha); + glPopMatrix(); + } + else + { + m_pItemRenderer->renderGuiItemDecorations(pMinecraft->font, pMinecraft->textures, item, (int)x, (int)y, fAlpha); + } + } + + Lighting::turnOff(); + glDisable(GL_RESCALE_NORMAL); +} + +// 4J Stu - Not threadsafe +//void UIScene::navigateForward(int iPad, EUIScene scene, void *initData) +//{ +// if(m_parentLayer == NULL) +// { +// app.DebugPrintf("A scene is trying to navigate forwards, but it's parent layer is NULL!\n"); +//#ifndef _CONTENT_PACKAGE +// __debugbreak(); +//#endif +// } +// else +// { +// m_parentLayer->NavigateToScene(iPad,scene,initData); +// } +//} + +void UIScene::navigateBack() +{ + //CD - Added for audio + ui.PlayUISFX(eSFX_Back); + + ui.NavigateBack(m_iPad); + + if(m_parentLayer == NULL) + { +// app.DebugPrintf("A scene is trying to navigate back, but it's parent layer is NULL!\n"); +#ifndef _CONTENT_PACKAGE +// __debugbreak(); +#endif + } + else + { +// m_parentLayer->removeScene(this); + +#ifdef _DURANGO + if (ui.GetTopScene(0)) + InputManager.SetEnabledGtcButtons( ui.GetTopScene(0)->getDefaultGtcButtons() ); +#endif + } + +} + +void UIScene::gainFocus() +{ + if( !bHasFocus && stealsFocus() ) + { + // 4J Stu - Don't do this + /* + IggyEvent event; + IggyMakeEventFocusGained( &event , 0); + + IggyEventResult result; + IggyPlayerDispatchEventRS( getMovie() , &event , &result ); + + app.DebugPrintf("Sent gain focus event to scene\n"); + */ + bHasFocus = true; + if(app.GetGameStarted() && needsReloaded()) + { + reloadMovie(); + } + + updateTooltips(); + updateComponents(); + + if(!m_bFocussedOnce) + { + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = -1; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetFocus , 1 , value ); + } + + handleGainFocus(m_bFocussedOnce); + if(bHasFocus) m_bFocussedOnce = true; + } + else if(bHasFocus && stealsFocus()) + { + updateTooltips(); + } +} + +void UIScene::loseFocus() +{ + if(bHasFocus) + { + // 4J Stu - Don't do this + /* + IggyEvent event; + IggyMakeEventFocusLost( &event ); + IggyEventResult result; + IggyPlayerDispatchEventRS ( getMovie() , &event , &result ); + */ + + app.DebugPrintf("Sent lose focus event to scene\n"); + bHasFocus = false; + handleLoseFocus(); + } +} + +void UIScene::handleGainFocus(bool navBack) +{ +#ifdef _DURANGO + InputManager.SetEnabledGtcButtons( this->getDefaultGtcButtons() ); +#endif +} + +void UIScene::updateTooltips() +{ + ui.SetTooltips(m_iPad, -1); +} + +void UIScene::sendInputToMovie(int key, bool repeat, bool pressed, bool released) +{ + if(!swf) return; + + int iggyKeyCode = convertGameActionToIggyKeycode(key); + + if(iggyKeyCode < 0) + { + app.DebugPrintf("UI WARNING: Ignoring input as game action does not translate to an Iggy keycode\n"); + return; + } + IggyEvent keyEvent; + // 4J Stu - Keyloc is always standard as we don't care about shift/alt + IggyMakeEventKey( &keyEvent, pressed?IGGY_KEYEVENT_Down:IGGY_KEYEVENT_Up, (IggyKeycode)iggyKeyCode, IGGY_KEYLOC_Standard ); + + IggyEventResult result; + IggyPlayerDispatchEventRS ( swf , &keyEvent , &result ); +} + +int UIScene::convertGameActionToIggyKeycode(int action) +{ + int keycode = -1; + switch(action) + { +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + case ACTION_MENU_A: + keycode = IGGY_KEYCODE_ENTER; + break; + case ACTION_MENU_B: + keycode = IGGY_KEYCODE_ESCAPE; + break; + case ACTION_MENU_X: + keycode = IGGY_KEYCODE_F1; + break; + case ACTION_MENU_Y: + keycode = IGGY_KEYCODE_F2; + break; + case ACTION_MENU_OK: + keycode = IGGY_KEYCODE_ENTER; + break; + case ACTION_MENU_CANCEL: + keycode = IGGY_KEYCODE_ESCAPE; + break; + case ACTION_MENU_UP: + keycode = IGGY_KEYCODE_UP; + break; + case ACTION_MENU_DOWN: + keycode = IGGY_KEYCODE_DOWN; + break; + case ACTION_MENU_RIGHT: + keycode = IGGY_KEYCODE_RIGHT; + break; + case ACTION_MENU_LEFT: + keycode = IGGY_KEYCODE_LEFT; + break; + case ACTION_MENU_PAGEUP: + keycode = IGGY_KEYCODE_PAGE_UP; + break; + case ACTION_MENU_PAGEDOWN: + keycode = IGGY_KEYCODE_PAGE_DOWN; + break; + case ACTION_MENU_RIGHT_SCROLL: + keycode = IGGY_KEYCODE_F3; + break; + case ACTION_MENU_LEFT_SCROLL: + keycode = IGGY_KEYCODE_F4; + break; + case ACTION_MENU_STICK_PRESS: + break; + case ACTION_MENU_OTHER_STICK_PRESS: + break; + case ACTION_MENU_OTHER_STICK_UP: + keycode = IGGY_KEYCODE_F11; + break; + case ACTION_MENU_OTHER_STICK_DOWN: + keycode = IGGY_KEYCODE_F12; + break; + case ACTION_MENU_OTHER_STICK_LEFT: + break; + case ACTION_MENU_OTHER_STICK_RIGHT: + break; + }; + + return keycode; +} + +bool UIScene::allowRepeat(int key) +{ + // 4J-PB - ignore repeats of action ABXY buttons + // fix for PS3 213 - [MAIN MENU] Holding down buttons will continue to activate every prompt. + switch(key) + { + case ACTION_MENU_OK: + case ACTION_MENU_CANCEL: + case ACTION_MENU_A: + case ACTION_MENU_B: + case ACTION_MENU_X: + case ACTION_MENU_Y: + return false; + } + return true; +} + +void UIScene::externalCallback(IggyExternalFunctionCallUTF16 * call) +{ + if(wcscmp((wchar_t *)call->function_name.string,L"handlePress")==0) + { + if(call->num_arguments != 2) + { + app.DebugPrintf("Callback for handlePress did not have the correct number of arguments\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + if(call->arguments[0].type != IGGY_DATATYPE_number || call->arguments[1].type != IGGY_DATATYPE_number) + { + app.DebugPrintf("Arguments for handlePress were not of the correct type\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + handlePress(call->arguments[0].number, call->arguments[1].number); + } + else if(wcscmp((wchar_t *)call->function_name.string,L"handleFocusChange")==0) + { + if(call->num_arguments != 2) + { + app.DebugPrintf("Callback for handleFocusChange did not have the correct number of arguments\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + if(call->arguments[0].type != IGGY_DATATYPE_number || call->arguments[1].type != IGGY_DATATYPE_number) + { + app.DebugPrintf("Arguments for handleFocusChange were not of the correct type\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + _handleFocusChange(call->arguments[0].number, call->arguments[1].number); + } + else if(wcscmp((wchar_t *)call->function_name.string,L"handleInitFocus")==0) + { + if(call->num_arguments != 2) + { + app.DebugPrintf("Callback for handleInitFocus did not have the correct number of arguments\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + if(call->arguments[0].type != IGGY_DATATYPE_number || call->arguments[1].type != IGGY_DATATYPE_number) + { + app.DebugPrintf("Arguments for handleInitFocus were not of the correct type\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + _handleInitFocus(call->arguments[0].number, call->arguments[1].number); + } + else if(wcscmp((wchar_t *)call->function_name.string,L"handleCheckboxToggled")==0) + { + if(call->num_arguments != 2) + { + app.DebugPrintf("Callback for handleCheckboxToggled did not have the correct number of arguments\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + if(call->arguments[0].type != IGGY_DATATYPE_number || call->arguments[1].type != IGGY_DATATYPE_boolean) + { + app.DebugPrintf("Arguments for handleCheckboxToggled were not of the correct type\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + handleCheckboxToggled(call->arguments[0].number, call->arguments[1].boolval); + } + else if(wcscmp((wchar_t *)call->function_name.string,L"handleSliderMove")==0) + { + if(call->num_arguments != 2) + { + app.DebugPrintf("Callback for handleSliderMove did not have the correct number of arguments\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + if(call->arguments[0].type != IGGY_DATATYPE_number || call->arguments[1].type != IGGY_DATATYPE_number) + { + app.DebugPrintf("Arguments for handleSliderMove were not of the correct type\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + handleSliderMove(call->arguments[0].number, call->arguments[1].number); + } + else if(wcscmp((wchar_t *)call->function_name.string,L"handleAnimationEnd")==0) + { + if(call->num_arguments != 0) + { + app.DebugPrintf("Callback for handleAnimationEnd did not have the correct number of arguments\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + handleAnimationEnd(); + } + else if(wcscmp((wchar_t *)call->function_name.string,L"handleSelectionChanged")==0) + { + if(call->num_arguments != 1) + { + app.DebugPrintf("Callback for handleSelectionChanged did not have the correct number of arguments\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + if(call->arguments[0].type != IGGY_DATATYPE_number) + { + app.DebugPrintf("Arguments for handleSelectionChanged were not of the correct type\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + handleSelectionChanged(call->arguments[0].number); + } + else if(wcscmp((wchar_t *)call->function_name.string,L"handleRequestMoreData")==0) + { + if(call->num_arguments == 0) + { + handleRequestMoreData(0,false); + } + else + { + if(call->num_arguments != 2) + { + app.DebugPrintf("Callback for handleRequestMoreData did not have the correct number of arguments\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + if(call->arguments[0].type != IGGY_DATATYPE_number || call->arguments[1].type != IGGY_DATATYPE_boolean) + { + app.DebugPrintf("Arguments for handleRequestMoreData were not of the correct type\n"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + return; + } + handleRequestMoreData(call->arguments[0].number, call->arguments[1].boolval); + } + } + else if(wcscmp((wchar_t *)call->function_name.string,L"handleTouchBoxRebuild")==0) + { + handleTouchBoxRebuild(); + } + else + { + app.DebugPrintf("Unhandled callback: %s\n", call->function_name.string); + } +} + +void UIScene::registerSubstitutionTexture(const wstring &textureName, PBYTE pbData, DWORD dwLength, bool deleteData) +{ + m_registeredTextures[textureName] = deleteData;; + ui.registerSubstitutionTexture(textureName, pbData, dwLength); +} + +bool UIScene::hasRegisteredSubstitutionTexture(const wstring &textureName) +{ + AUTO_VAR(it, m_registeredTextures.find( textureName ) ); + + return it != m_registeredTextures.end(); +} + +void UIScene::_handleFocusChange(F64 controlId, F64 childId) +{ + m_iFocusControl = (int)controlId; + m_iFocusChild = (int)childId; + + handleFocusChange(controlId, childId); + ui.PlayUISFX(eSFX_Focus); +} + +void UIScene::_handleInitFocus(F64 controlId, F64 childId) +{ + m_iFocusControl = (int)controlId; + m_iFocusChild = (int)childId; + + //handleInitFocus(controlId, childId); + handleFocusChange(controlId, childId); +} + +bool UIScene::controlHasFocus(int iControlId) +{ + return m_iFocusControl == iControlId; +} + +bool UIScene::controlHasFocus(UIControl_Base *control) +{ + return controlHasFocus( control->getId() ); +} + +int UIScene::getControlChildFocus() +{ + return m_iFocusChild; +} + +int UIScene::getControlFocus() +{ + return m_iFocusControl; +} + +void UIScene::setBackScene(UIScene *scene) +{ + m_backScene = scene; +} + +UIScene *UIScene::getBackScene() +{ + return m_backScene; +} +#ifdef __PSVITA__ +void UIScene::UpdateSceneControls() +{ + AUTO_VAR(itEnd, GetControls()->end()); + for (AUTO_VAR(it, GetControls()->begin()); it != itEnd; it++) + { + UIControl *control=(UIControl *)*it; + control->UpdateControl(); + } +} +#endif + +size_t UIScene::GetCallbackUniqueId() +{ + if( m_callbackUniqueId == 0) + { + m_callbackUniqueId = ui.RegisterForCallbackId(this); + } + return m_callbackUniqueId; +} + +bool UIScene::isReadyToDelete() +{ + return true; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene.h b/Minecraft.Client/Common/UI/UIScene.h new file mode 100644 index 00000000..823c510c --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene.h @@ -0,0 +1,270 @@ +#pragma once +// 4J-PB - remove the inherits via dominance warnings +#pragma warning( disable : 4250 ) +using namespace std; +// A scene map directly to an Iggy movie (or more accurately a collection of different sized movies) + +#include "UIEnums.h" +#include "UIControl_Base.h" + +class ItemRenderer; +class UILayer; + +// 4J Stu - Setup some defines for quickly mapping elements in the scene + +#define UI_BEGIN_MAP_ELEMENTS_AND_NAMES(parentClass) \ + virtual bool mapElementsAndNames() \ + { \ + parentClass::mapElementsAndNames(); \ + IggyValuePath *currentRoot = IggyPlayerRootPath ( getMovie() ); + +#define UI_END_MAP_ELEMENTS_AND_NAMES() \ + return true; \ + } + +#define UI_MAP_ELEMENT( var, name) \ + { var.setupControl(this, currentRoot , name ); m_controls.push_back(&var); } + +#define UI_BEGIN_MAP_CHILD_ELEMENTS( parent ) \ + { \ + IggyValuePath *lastRoot = currentRoot; \ + currentRoot = parent.getIggyValuePath(); + +#define UI_END_MAP_CHILD_ELEMENTS() \ + currentRoot = lastRoot; \ + } + +#define UI_MAP_NAME( var, name ) \ + { var = registerFastName(name); } + +class UIScene +{ + friend class UILayer; +public: + IggyValuePath *m_rootPath; + +private: + Iggy *swf; + IggyName m_funcRemoveObject, m_funcSlideLeft, m_funcSlideRight, m_funcSetSafeZone, m_funcSetFocus, m_funcHorizontalResizeCheck; + IggyName m_funcSetAlpha; + + ItemRenderer *m_pItemRenderer; + unordered_map m_fastNames; + unordered_map m_registeredTextures; + + typedef struct _TimerInfo + { + int duration; + int targetTime; + bool running; + } TimerInfo; + unordered_map m_timers; + + int m_iFocusControl, m_iFocusChild; + float m_lastOpacity; + bool m_bUpdateOpacity; + bool m_bVisible; + bool m_bCanHandleInput; + UIScene *m_backScene; + + size_t m_callbackUniqueId; + +public: + enum ESceneResolution + { + eSceneResolution_1080, + eSceneResolution_720, + eSceneResolution_480, + eSceneResolution_Vita, + }; + +protected: + ESceneResolution m_loadedResolution; + + bool m_bIsReloading; + bool m_bFocussedOnce; + + int m_movieWidth, m_movieHeight; + int m_renderWidth, m_renderHeight; + vector m_controls; + +protected: + UILayer *m_parentLayer; + bool bHasFocus; + int m_iPad; + bool m_hasTickedOnce; + +public: + virtual Iggy *getMovie() { return swf; } + + void destroyMovie(); + virtual void reloadMovie(bool force = false); + virtual bool needsReloaded(); + virtual bool hasMovie(); + virtual void updateSafeZone(); + + int getRenderWidth() { return m_renderWidth; } + int getRenderHeight() { return m_renderHeight; } + +#ifdef __PSVITA__ + UILayer *GetParentLayer() {return m_parentLayer;} + EUIGroup GetParentLayerGroup() {return m_parentLayer->m_parentGroup->GetGroup();} + vector *GetControls() {return &m_controls;} +#endif + +protected: + virtual F64 getSafeZoneHalfHeight(); + virtual F64 getSafeZoneHalfWidth(); + void setSafeZone(S32 top, S32 bottom, S32 left, S32 right); + void doHorizontalResizeCheck(); + virtual wstring getMoviePath() = 0; + + virtual bool mapElementsAndNames(); + void initialiseMovie(); + void loadMovie(); + +private: + void getDebugMemoryUseRecursive(const wstring &moviePath, IggyMemoryUseInfo &memoryInfo); + +public: + void PrintTotalMemoryUsage(__int64 &totalStatic, __int64 &totalDynamic); + +public: + UIScene(int iPad, UILayer *parentLayer); + virtual ~UIScene(); + + virtual EUIScene getSceneType() = 0; + ESceneResolution getSceneResolution() { return m_loadedResolution; } + + virtual void tick(); + + IggyName registerFastName(const wstring &name); +#ifdef __PSVITA__ + void SetFocusToElement(int iID); + void UpdateSceneControls(); +#endif +protected: + void addTimer(int id, int ms); + void killTimer(int id); + void tickTimers(); + TimerInfo* getTimer(int id) { return &m_timers[id]; } + virtual void handleTimerComplete(int id) {} + +public: + // FOCUS + // Returns true if this scene handles input + virtual bool stealsFocus() { return true; } + + // Returns true if this scene has focus for the pad passed in + virtual bool hasFocus(int iPad) { return bHasFocus && iPad == m_iPad; } + + void gainFocus(); + void loseFocus(); + + virtual void updateTooltips(); + virtual void updateComponents() {} + virtual void handleGainFocus(bool navBack); + virtual void handleLoseFocus() {} + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return m_hasTickedOnce; } + + // returns main panel if controls are not living in the root + virtual UIControl* GetMainPanel(); + + void removeControl( UIControl_Base *control, bool centreScene); + void slideLeft(); + void slideRight(); + + // RENDERING + virtual void render(S32 width, S32 height, C4JRender::eViewportType viewpBort); + + virtual void customDraw(IggyCustomDrawCallbackRegion *region); + + void setOpacity(float percent); + void setVisible(bool visible); + bool isVisible() { return m_bVisible; } + +protected: + //void customDrawSlotControl(IggyCustomDrawCallbackRegion *region, int iPad, int iID, int iCount, int iAuxVal, float fAlpha, bool isFoil, bool bDecorations); + void customDrawSlotControl(IggyCustomDrawCallbackRegion *region, int iPad, shared_ptr item, float fAlpha, bool isFoil, bool bDecorations); + + bool m_cacheSlotRenders; + bool m_needsCacheRendered; + int m_expectedCachedSlotCount; +private: + typedef struct _CachedSlotDrawData + { + CustomDrawData *customDrawRegion; + shared_ptr item; + float fAlpha; + bool isFoil; + bool bDecorations; + } CachedSlotDrawData; + vector m_cachedSlotDraw; + + void _customDrawSlotControl(CustomDrawData *region, int iPad, shared_ptr item, float fAlpha, bool isFoil, bool bDecorations, bool usingCommandBuffer); + +public: + // INPUT + bool canHandleInput() { return m_bCanHandleInput; } + virtual bool allowRepeat(int key); + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) {} + void externalCallback(IggyExternalFunctionCallUTF16 * call); + + virtual void handleDestroy() {} +protected: + void sendInputToMovie(int key, bool repeat, bool pressed, bool released); + virtual void handlePreReload() {} + virtual void handleReload() {} + virtual void handlePress(F64 controlId, F64 childId) {} + virtual void handleFocusChange(F64 controlId, F64 childId) {} + virtual void handleInitFocus(F64 controlId, F64 childId) {} + virtual void handleCheckboxToggled(F64 controlId, bool selected) {} + virtual void handleSliderMove(F64 sliderId, F64 currentValue) {} + virtual void handleAnimationEnd() {} + virtual void handleSelectionChanged(F64 selectedId) {} + virtual void handleRequestMoreData(F64 startIndex, bool up) {} + virtual void handleTouchBoxRebuild() {} +private: + void _handleFocusChange(F64 controlId, F64 childId); + void _handleInitFocus(F64 controlId, F64 childId); + + int convertGameActionToIggyKeycode(int action); + +public: + bool controlHasFocus(int iControlId); + bool controlHasFocus(UIControl_Base *control); + int getControlFocus(); + int getControlChildFocus(); + + // NAVIGATION +protected: + //void navigateForward(int iPad, EUIScene scene, void *initData = NULL); + void navigateBack(); + +public: + void setBackScene(UIScene *scene); + UIScene *getBackScene(); + virtual void HandleDLCMountingComplete() {} + virtual void HandleDLCInstalled() {} +#ifdef _XBOX_ONE + virtual void HandleDLCLicenseChange() {} +#endif + void registerSubstitutionTexture(const wstring &textureName, PBYTE pbData, DWORD dwLength, bool deleteData = false); + bool hasRegisteredSubstitutionTexture(const wstring &textureName); + + virtual void handleUnlockFullVersion() {} + + virtual void handleTouchInput(unsigned int iPad, S32 x, S32 y, int iId, bool bPressed, bool bRepeat, bool bReleased) {} + + +protected: +#ifdef _DURANGO + virtual long long getDefaultGtcButtons() { return _360_GTC_BACK; } +#endif + + size_t GetCallbackUniqueId(); + + virtual bool isReadyToDelete(); +}; diff --git a/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp new file mode 100644 index 00000000..a1bd8270 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp @@ -0,0 +1,307 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_AbstractContainerMenu.h" + +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\MultiplayerLocalPlayer.h" + +UIScene_AbstractContainerMenu::UIScene_AbstractContainerMenu(int iPad, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + m_focusSection = eSectionNone; + // in this scene, we override the press sound with our own for crafting success or fail + ui.OverrideSFX(m_iPad,ACTION_MENU_A,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_OK,true); +#ifdef __ORBIS__ + ui.OverrideSFX(m_iPad,ACTION_MENU_TOUCHPAD_PRESS,true); +#endif + ui.OverrideSFX(m_iPad,ACTION_MENU_X,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_Y,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT_SCROLL,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT_SCROLL,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_UP,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_DOWN,true); + + m_bIgnoreInput=false; +} + +UIScene_AbstractContainerMenu::~UIScene_AbstractContainerMenu() +{ + app.DebugPrintf("UIScene_AbstractContainerMenu::~UIScene_AbstractContainerMenu\n"); +} + +void UIScene_AbstractContainerMenu::handleDestroy() +{ + app.DebugPrintf("UIScene_AbstractContainerMenu::handleDestroy\n"); + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + if(gameMode != NULL) gameMode->getTutorial()->changeTutorialState(m_previousTutorialState); + } + + // 4J Stu - Fix for #11302 - TCR 001: Network Connectivity: Host crashed after being killed by the client while accessing a chest during burst packet loss. + // We need to make sure that we call closeContainer() anytime this menu is closed, even if it is forced to close by some other reason (like the player dying) + if(pMinecraft->localplayers[m_iPad] != NULL) pMinecraft->localplayers[m_iPad]->closeContainer(); + + ui.OverrideSFX(m_iPad,ACTION_MENU_A,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_OK,false); +#ifdef __ORBIS__ + ui.OverrideSFX(m_iPad,ACTION_MENU_TOUCHPAD_PRESS,false); +#endif + ui.OverrideSFX(m_iPad,ACTION_MENU_X,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_Y,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT_SCROLL,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT_SCROLL,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_UP,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_DOWN,false); +} + +void UIScene_AbstractContainerMenu::InitDataAssociations(int iPad, AbstractContainerMenu *menu, int startIndex) +{ +} + +void UIScene_AbstractContainerMenu::PlatformInitialize(int iPad, int startIndex) +{ + + m_labelInventory.init( app.GetString(IDS_INVENTORY) ); + + if(startIndex >= 0) + { + m_slotListInventory.addSlots(startIndex, 27); + m_slotListHotbar.addSlots(startIndex + 27, 9); + } + + // Determine min and max extents for pointer, it needs to be able to move off the container to drop items. + float fPanelWidth, fPanelHeight; + float fPanelX, fPanelY; + float fPointerWidth, fPointerHeight; + + // We may have varying depths of controls here, so base off the pointers parent +#if TO_BE_IMPLEMENTED + HXUIOBJ parent; + XuiElementGetBounds( m_pointerControl->m_hObj, &fPointerWidth, &fPointerHeight ); +#else + fPointerWidth = 50; + fPointerHeight = 50; +#endif + + fPanelWidth = m_controlBackgroundPanel.getWidth(); + fPanelHeight = m_controlBackgroundPanel.getHeight(); + fPanelX = m_controlBackgroundPanel.getXPos(); + fPanelY = m_controlBackgroundPanel.getYPos(); + // Get size of pointer + m_fPointerImageOffsetX = 0; //floor(fPointerWidth/2.0f); + m_fPointerImageOffsetY = 0; //floor(fPointerHeight/2.0f); + + m_fPanelMinX = fPanelX; + m_fPanelMaxX = fPanelX + fPanelWidth; + m_fPanelMinY = fPanelY; + m_fPanelMaxY = fPanelY + fPanelHeight; + +#ifdef __ORBIS__ + // we need to map the touchpad rectangle to the UI rectangle. While it works great for the creative menu, it is much too sensitive for the smaller menus. + //X coordinate of the touch point (0 to 1919) + //Y coordinate of the touch point (0 to 941: DUALSHOCK®4 wireless controllers and the CUH-ZCT1J/CAP-ZCT1J/CAP-ZCT1U controllers for the PlayStation®4 development tool, + //0 to 753: JDX-1000x series controllers for the PlayStation®4 development tool,) + m_fTouchPadMulX=fPanelWidth/1919.0f; + m_fTouchPadMulY=fPanelHeight/941.0f; + m_fTouchPadDeadZoneX=15.0f*m_fTouchPadMulX; + m_fTouchPadDeadZoneY=15.0f*m_fTouchPadMulY; + +#endif + + // 4J-PB - need to limit this in splitscreen + if(app.GetLocalPlayerCount()>1) + { + // don't let the pointer go into someone's screen + m_fPointerMinY = floor(fPointerHeight/2.0f); + } + else + { + m_fPointerMinY = fPanelY -fPointerHeight; + } + m_fPointerMinX = fPanelX - fPointerWidth; + m_fPointerMaxX = m_fPanelMaxX + fPointerWidth; + m_fPointerMaxY = m_fPanelMaxY + (fPointerHeight/2); + +// m_hPointerText=NULL; +// m_hPointerTextBkg=NULL; + + // Put the pointer over first item in use row to start with. + UIVec2D itemPos; + UIVec2D itemSize; + GetItemScreenData( m_eCurrSection, 0, &( itemPos ), &( itemSize ) ); + + UIVec2D sectionPos; + GetPositionOfSection( m_eCurrSection, &( sectionPos ) ); + + UIVec2D vPointerPos = sectionPos; + vPointerPos += itemPos; + vPointerPos.x += ( itemSize.x / 2.0f ); + vPointerPos.y += ( itemSize.y / 2.0f ); + + vPointerPos.x -= m_fPointerImageOffsetX; + vPointerPos.y -= m_fPointerImageOffsetY; + + //m_pointerControl->SetPosition( &vPointerPos ); + m_pointerPos = vPointerPos; + + IggyEvent mouseEvent; + S32 width, height; + m_parentLayer->getRenderDimensions(width, height); + S32 x = m_pointerPos.x*((float)width/m_movieWidth); + S32 y = m_pointerPos.y*((float)height/m_movieHeight); + IggyMakeEventMouseMove( &mouseEvent, x, y); + + IggyEventResult result; + IggyPlayerDispatchEventRS ( getMovie() , &mouseEvent , &result ); + +#ifdef USE_POINTER_ACCEL + m_fPointerVelX = 0.0f; + m_fPointerVelY = 0.0f; + m_fPointerAccelX = 0.0f; + m_fPointerAccelY = 0.0f; +#endif +} + +void UIScene_AbstractContainerMenu::tick() +{ + UIScene::tick(); + + onMouseTick(); + + IggyEvent mouseEvent; + S32 width, height; + m_parentLayer->getRenderDimensions(width, height); + S32 x = m_pointerPos.x*((float)width/m_movieWidth); + S32 y = m_pointerPos.y*((float)height/m_movieHeight); + IggyMakeEventMouseMove( &mouseEvent, x, y); + + // 4J Stu - This seems to be broken on Durango, so do it ourself +#ifdef _DURANGO + //mouseEvent.x = x; + //mouseEvent.y = y; +#endif + + IggyEventResult result; + IggyPlayerDispatchEventRS ( getMovie() , &mouseEvent , &result ); +} + +void UIScene_AbstractContainerMenu::render(S32 width, S32 height, C4JRender::eViewportType viewpBort) +{ + m_cacheSlotRenders = true; + + m_needsCacheRendered = m_needsCacheRendered || m_menu->needsRendered(); + + if(m_needsCacheRendered) + { + m_expectedCachedSlotCount = 0; + unsigned int count = m_menu->getSize(); + for(unsigned int i = 0; i < count; ++i) + { + if(m_menu->getSlot(i)->hasItem()) + { + ++m_expectedCachedSlotCount; + } + } + } + + UIScene::render(width, height, viewpBort); + + m_needsCacheRendered = false; +} + +void UIScene_AbstractContainerMenu::customDraw(IggyCustomDrawCallbackRegion *region) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localgameModes[m_iPad] == NULL) return; + + shared_ptr item = nullptr; + if(wcscmp((wchar_t *)region->name,L"pointerIcon")==0) + { + m_cacheSlotRenders = false; + item = pMinecraft->localplayers[m_iPad]->inventory->getCarried(); + } + else + { + int slotId = -1; + swscanf((wchar_t*)region->name,L"slot_%d",&slotId); + if (slotId == -1) + { + app.DebugPrintf("This is not the control we are looking for\n"); + } + else + { + m_cacheSlotRenders = true; + Slot *slot = m_menu->getSlot(slotId); + item = slot->getItem(); + } + } + + if(item != NULL) customDrawSlotControl(region,m_iPad,item,1.0f,item->isFoil(),true); +} + +void UIScene_AbstractContainerMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if(m_bIgnoreInput) return; + + //app.DebugPrintf("UIScene_InventoryMenu handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + if(pressed) + { + handled = handleKeyDown(m_iPad, key, repeat); + } +} + +void UIScene_AbstractContainerMenu::SetPointerText(const wstring &description, vector &unformattedStrings, bool newSlot) +{ + //app.DebugPrintf("Setting pointer text\n"); + m_cursorPath.setLabel(description,false,newSlot); +} + +void UIScene_AbstractContainerMenu::setSectionFocus(ESceneSection eSection, int iPad) +{ + if(m_focusSection != eSectionNone) + { + UIControl *currentFocus = getSection(m_focusSection); + if(currentFocus) currentFocus->setFocus(false); + } + UIControl *newFocus = getSection(eSection); + if(newFocus) newFocus->setFocus(true); + m_focusSection = eSection; +} + +void UIScene_AbstractContainerMenu::setFocusToPointer(int iPad) +{ + if(m_focusSection != eSectionNone) + { + UIControl *currentFocus = getSection(m_focusSection); + if(currentFocus) currentFocus->setFocus(false); + } + m_focusSection = eSectionNone; +} + +shared_ptr UIScene_AbstractContainerMenu::getSlotItem(ESceneSection eSection, int iSlot) +{ + Slot *slot = m_menu->getSlot( getSectionStartOffset(eSection) + iSlot ); + if(slot) return slot->getItem(); + else return nullptr; +} + +bool UIScene_AbstractContainerMenu::isSlotEmpty(ESceneSection eSection, int iSlot) +{ + Slot *slot = m_menu->getSlot( getSectionStartOffset(eSection) + iSlot ); + if(slot) return !slot->hasItem(); + else return false; +} + +void UIScene_AbstractContainerMenu::adjustPointerForSafeZone() +{ + // Handled by AS +} diff --git a/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.h b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.h new file mode 100644 index 00000000..b98b3763 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.h @@ -0,0 +1,63 @@ +#pragma once + +#include "UIScene.h" +#include "IUIScene_AbstractContainerMenu.h" + +class AbstractContainerMenu; + +class UIScene_AbstractContainerMenu : public UIScene, public virtual IUIScene_AbstractContainerMenu +{ +private: + ESceneSection m_focusSection; + bool m_bIgnoreInput; + +protected: + UIControl m_controlMainPanel; + UIControl_SlotList m_slotListHotbar, m_slotListInventory; + UIControl_Cursor m_cursorPath; + UIControl_Label m_labelInventory, m_labelBrewingStand; + UIControl m_controlBackgroundPanel; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_controlMainPanel, "MainPanel" ) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + UI_MAP_ELEMENT( m_controlBackgroundPanel, "BackgroundPanel" ) + UI_MAP_ELEMENT( m_slotListHotbar, "hotbarList") + UI_MAP_ELEMENT( m_slotListInventory, "inventoryList") + UI_MAP_ELEMENT( m_cursorPath, "cursor") + UI_MAP_ELEMENT( m_labelInventory, "inventoryLabel") + UI_END_MAP_CHILD_ELEMENTS() + UI_END_MAP_ELEMENTS_AND_NAMES() + +public: + UIScene_AbstractContainerMenu(int iPad, UILayer *parentLayer); + ~UIScene_AbstractContainerMenu(); + + virtual void handleDestroy(); + + int getPad() { return m_iPad; } + bool getIgnoreInput() { return m_bIgnoreInput; } + void setIgnoreInput(bool bVal) { m_bIgnoreInput=bVal; } + +protected: + virtual void PlatformInitialize(int iPad, int startIndex); + virtual void InitDataAssociations(int iPad, AbstractContainerMenu *menu, int startIndex = 0); + virtual bool doesSectionTreeHaveFocus(ESceneSection eSection) { return false; } + virtual void setSectionFocus(ESceneSection eSection, int iPad); + void setFocusToPointer(int iPad); + void SetPointerText(const wstring &description, vector &unformattedStrings, bool newSlot); + virtual shared_ptr getSlotItem(ESceneSection eSection, int iSlot); + virtual bool isSlotEmpty(ESceneSection eSection, int iSlot); + virtual void adjustPointerForSafeZone(); + + virtual UIControl *getSection(ESceneSection eSection) { return NULL; } + +public: + virtual void tick(); + + virtual void render(S32 width, S32 height, C4JRender::eViewportType viewpBort); + virtual void customDraw(IggyCustomDrawCallbackRegion *region); + + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); +}; diff --git a/Minecraft.Client/Common/UI/UIScene_AnvilMenu.cpp b/Minecraft.Client/Common/UI/UIScene_AnvilMenu.cpp new file mode 100644 index 00000000..7b9886bc --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_AnvilMenu.cpp @@ -0,0 +1,400 @@ +#include "stdafx.h" +#include "UI.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "MultiPlayerLocalPlayer.h" +#include "..\..\Minecraft.h" +#include "UIScene_AnvilMenu.h" + +UIScene_AnvilMenu::UIScene_AnvilMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene_AbstractContainerMenu(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_showingCross = false; + m_textInputAnvil.init(m_itemName,eControl_TextInput); + + m_labelAnvil.init( app.GetString(IDS_REPAIR_AND_NAME) ); + + AnvilScreenInput *initData = (AnvilScreenInput *)_initData; + m_inventory = initData->inventory; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->localgameModes[iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Anvil_Menu, this); + } + + m_repairMenu = new RepairMenu( initData->inventory, initData->level, initData->x, initData->y, initData->z, pMinecraft->localplayers[iPad] ); + m_repairMenu->addSlotListener(this); + + Initialize( iPad, m_repairMenu, true, RepairMenu::INV_SLOT_START, eSectionAnvilUsing, eSectionAnvilMax ); + + m_slotListItem1.addSlots(RepairMenu::INPUT_SLOT, 1); + m_slotListItem2.addSlots(RepairMenu::ADDITIONAL_SLOT, 1); + m_slotListResult.addSlots(RepairMenu::RESULT_SLOT, 1); + + bool expensive = false; + wstring m_costString = L""; + + if(m_repairMenu->cost > 0) + { + if(m_repairMenu->cost >= 40 && !pMinecraft->localplayers[iPad]->abilities.instabuild) + { + m_costString = app.GetString(IDS_REPAIR_EXPENSIVE); + expensive = true; + } + else if(!m_repairMenu->getSlot(RepairMenu::RESULT_SLOT)->hasItem()) + { + // Do nothing + } + else + { + LPCWSTR costString = app.GetString(IDS_REPAIR_COST); + wchar_t temp[256]; + swprintf(temp, 256, costString, m_repairMenu->cost); + m_costString = temp; + if(!m_repairMenu->getSlot(RepairMenu::RESULT_SLOT)->mayPickup(dynamic_pointer_cast(m_inventory->player->shared_from_this()))) + { + expensive = true; + } + } + } + setCostLabel(m_costString, expensive); + + if(initData) delete initData; + + setIgnoreInput(false); + + app.SetRichPresenceContext(iPad, CONTEXT_GAME_STATE_ANVIL); +} + +wstring UIScene_AnvilMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"AnvilMenuSplit"; + } + else + { + return L"AnvilMenu"; + } +} + +void UIScene_AnvilMenu::handleReload() +{ + Initialize( m_iPad, m_menu, true, RepairMenu::INV_SLOT_START, eSectionAnvilUsing, eSectionAnvilMax ); + + m_slotListItem1.addSlots(RepairMenu::INPUT_SLOT, 1); + m_slotListItem2.addSlots(RepairMenu::ADDITIONAL_SLOT, 1); + m_slotListResult.addSlots(RepairMenu::RESULT_SLOT, 1); +} + +void UIScene_AnvilMenu::tick() +{ + UIScene_AbstractContainerMenu::tick(); + + handleTick(); +} + +int UIScene_AnvilMenu::getSectionColumns(ESceneSection eSection) +{ + int cols = 0; + switch( eSection ) + { + case eSectionAnvilItem1: + cols = 1; + break; + case eSectionAnvilItem2: + cols = 1; + break; + case eSectionAnvilResult: + cols = 1; + break; + case eSectionAnvilInventory: + cols = 9; + break; + case eSectionAnvilUsing: + cols = 9; + break; + default: + assert( false ); + break; + } + return cols; +} + +int UIScene_AnvilMenu::getSectionRows(ESceneSection eSection) +{ + int rows = 0; + switch( eSection ) + { + case eSectionAnvilItem1: + rows = 1; + break; + case eSectionAnvilItem2: + rows = 1; + break; + case eSectionAnvilResult: + rows = 1; + break; + case eSectionAnvilInventory: + rows = 3; + break; + case eSectionAnvilUsing: + rows = 1; + break; + default: + assert( false ); + break; + } + return rows; +} + +void UIScene_AnvilMenu::GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ) +{ + switch( eSection ) + { + case eSectionAnvilItem1: + pPosition->x = m_slotListItem1.getXPos(); + pPosition->y = m_slotListItem1.getYPos(); + break; + case eSectionAnvilItem2: + pPosition->x = m_slotListItem2.getXPos(); + pPosition->y = m_slotListItem2.getYPos(); + break; + case eSectionAnvilResult: + pPosition->x = m_slotListResult.getXPos(); + pPosition->y = m_slotListResult.getYPos(); + break; + case eSectionAnvilName: + pPosition->x = m_textInputAnvil.getXPos(); + pPosition->y = m_textInputAnvil.getYPos(); + break; + case eSectionAnvilInventory: + pPosition->x = m_slotListInventory.getXPos(); + pPosition->y = m_slotListInventory.getYPos(); + break; + case eSectionAnvilUsing: + pPosition->x = m_slotListHotbar.getXPos(); + pPosition->y = m_slotListHotbar.getYPos(); + break; + default: + assert( false ); + break; + } +} + +void UIScene_AnvilMenu::GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ) +{ + UIVec2D sectionSize; + + switch( eSection ) + { + case eSectionAnvilItem1: + sectionSize.x = m_slotListItem1.getWidth(); + sectionSize.y = m_slotListItem1.getHeight(); + break; + case eSectionAnvilItem2: + sectionSize.x = m_slotListItem2.getWidth(); + sectionSize.y = m_slotListItem2.getHeight(); + break; + case eSectionAnvilResult: + sectionSize.x = m_slotListResult.getWidth(); + sectionSize.y = m_slotListResult.getHeight(); + break; + case eSectionAnvilName: + sectionSize.x = m_textInputAnvil.getWidth(); + sectionSize.y = m_textInputAnvil.getHeight(); + break; + case eSectionAnvilInventory: + sectionSize.x = m_slotListInventory.getWidth(); + sectionSize.y = m_slotListInventory.getHeight(); + break; + case eSectionAnvilUsing: + sectionSize.x = m_slotListHotbar.getWidth(); + sectionSize.y = m_slotListHotbar.getHeight(); + break; + default: + assert( false ); + break; + } + + if(IsSectionSlotList(eSection)) + { + 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; + } + else + { + GetPositionOfSection(eSection, pPosition); + pSize->x = sectionSize.x; + pSize->y = sectionSize.y; + } +} + +void UIScene_AnvilMenu::setSectionSelectedSlot(ESceneSection eSection, int x, int y) +{ + int cols = getSectionColumns(eSection); + + int index = (y * cols) + x; + + UIControl_SlotList *slotList = NULL; + switch( eSection ) + { + case eSectionAnvilItem1: + slotList = &m_slotListItem1; + break; + case eSectionAnvilItem2: + slotList = &m_slotListItem2; + break; + case eSectionAnvilResult: + slotList = &m_slotListResult; + break; + case eSectionAnvilInventory: + slotList = &m_slotListInventory; + break; + case eSectionAnvilUsing: + slotList = &m_slotListHotbar; + break; + default: + assert( false ); + break; + } + + slotList->setHighlightSlot(index); +} + +UIControl *UIScene_AnvilMenu::getSection(ESceneSection eSection) +{ + UIControl *control = NULL; + switch( eSection ) + { + case eSectionAnvilItem1: + control = &m_slotListItem1; + break; + case eSectionAnvilItem2: + control = &m_slotListItem2; + break; + case eSectionAnvilResult: + control = &m_slotListResult; + break; + case eSectionAnvilName: + control = &m_textInputAnvil; + break; + case eSectionAnvilInventory: + control = &m_slotListInventory; + break; + case eSectionAnvilUsing: + control = &m_slotListHotbar; + break; + default: + assert( false ); + break; + } + return control; +} + +int UIScene_AnvilMenu::KeyboardCompleteCallback(LPVOID lpParam,bool bRes) +{ + // 4J HEG - No reason to set value if keyboard was cancelled + UIScene_AnvilMenu *pClass=(UIScene_AnvilMenu *)lpParam; + pClass->setIgnoreInput(false); + + if (bRes) + { + uint16_t pchText[128]; + ZeroMemory(pchText, 128 * sizeof(uint16_t) ); + InputManager.GetText(pchText); + pClass->setEditNameValue((wchar_t *)pchText); + pClass->m_itemName = (wchar_t *)pchText; + pClass->updateItemName(); + } + return 0; +} + +void UIScene_AnvilMenu::handleEditNamePressed() +{ + setIgnoreInput(true); +#if defined(__PS3__) || defined(__ORBIS__) || defined __PSVITA__ + int language = XGetLanguage(); + switch(language) + { + case XC_LANGUAGE_JAPANESE: + case XC_LANGUAGE_KOREAN: + case XC_LANGUAGE_TCHINESE: + InputManager.RequestKeyboard(app.GetString(IDS_TITLE_RENAME),m_textInputAnvil.getLabel(),(DWORD)m_iPad,30,&UIScene_AnvilMenu::KeyboardCompleteCallback,this,C_4JInput::EKeyboardMode_Default); + break; + default: + // 4J Stu - Use a different keyboard for non-asian languages so we don't have prediction on + InputManager.RequestKeyboard(app.GetString(IDS_TITLE_RENAME),m_textInputAnvil.getLabel(),(DWORD)m_iPad,30,&UIScene_AnvilMenu::KeyboardCompleteCallback,this,C_4JInput::EKeyboardMode_Alphabet_Extended); + break; + } +#else + InputManager.RequestKeyboard(app.GetString(IDS_TITLE_RENAME),m_textInputAnvil.getLabel(),(DWORD)m_iPad,30,&UIScene_AnvilMenu::KeyboardCompleteCallback,this,C_4JInput::EKeyboardMode_Default); +#endif +} + +void UIScene_AnvilMenu::setEditNameValue(const wstring &name) +{ + m_textInputAnvil.setLabel(name); +} + +void UIScene_AnvilMenu::setEditNameEditable(bool enabled) +{ +} + +void UIScene_AnvilMenu::setCostLabel(const wstring &label, bool canAfford) +{ + IggyDataValue result; + IggyDataValue value[2]; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = canAfford; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetCostLabel , 2 , value ); +} + +void UIScene_AnvilMenu::showCross(bool show) +{ + if(m_showingCross != show) + { + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = show; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowRedCross , 1 , value ); + + m_showingCross = show; + } +} + +void UIScene_AnvilMenu::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 + UIScene_AbstractContainerMenu::handleDestroy(); +} diff --git a/Minecraft.Client/Common/UI/UIScene_AnvilMenu.h b/Minecraft.Client/Common/UI/UIScene_AnvilMenu.h new file mode 100644 index 00000000..3afc6333 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_AnvilMenu.h @@ -0,0 +1,66 @@ +#pragma once + +#include "UIScene_AbstractContainerMenu.h" +#include "IUIScene_AnvilMenu.h" +#include "..\Minecraft.World\MerchantMenu.h" + +class InventoryMenu; + +class UIScene_AnvilMenu : public UIScene_AbstractContainerMenu, public IUIScene_AnvilMenu +{ +private: + bool m_showingCross; + + enum EControls + { + eControl_TextInput, + }; + +public: + UIScene_AnvilMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_AnvilMenu;} + +protected: + UIControl_SlotList m_slotListItem1, m_slotListItem2, m_slotListResult; + UIControl_Label m_labelAnvil; + UIControl_TextInput m_textInputAnvil; + + IggyName m_funcShowRedCross, m_funcSetCostLabel; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene_AbstractContainerMenu) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + UI_MAP_ELEMENT( m_slotListItem1, "Ingredient") + UI_MAP_ELEMENT( m_slotListItem2, "Ingredient2") + UI_MAP_ELEMENT( m_slotListResult, "Result") + UI_MAP_ELEMENT( m_labelAnvil, "AnvilText") + UI_MAP_ELEMENT( m_textInputAnvil, "AnvilTextInput") + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_NAME(m_funcShowRedCross, L"ShowRedCross") + UI_MAP_NAME(m_funcSetCostLabel, L"SetCostLabel") + UI_END_MAP_ELEMENTS_AND_NAMES() + + virtual wstring getMoviePath(); + virtual void handleReload(); + + virtual void tick(); + + 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); + + static int KeyboardCompleteCallback(LPVOID lpParam,bool bRes); + virtual void handleEditNamePressed(); + virtual void setEditNameValue(const wstring &name); + virtual void setEditNameEditable(bool enabled); + virtual void handleDestroy(); + + void setCostLabel(const wstring &label, bool canAfford); + void showCross(bool show); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_BrewingStandMenu.cpp b/Minecraft.Client/Common/UI/UIScene_BrewingStandMenu.cpp new file mode 100644 index 00000000..cd56bd84 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_BrewingStandMenu.cpp @@ -0,0 +1,309 @@ +#include "stdafx.h" +#include "UI.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.alchemy.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\..\Minecraft.h" +#include "UIScene_BrewingStandMenu.h" + +UIScene_BrewingStandMenu::UIScene_BrewingStandMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene_AbstractContainerMenu(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_progressBrewingArrow.init(L"",0,0,PotionBrewing::BREWING_TIME_SECONDS * SharedConstants::TICKS_PER_SECOND,0); + m_progressBrewingBubbles.init(L"",0,0,30,0); + + m_labelBrewingStand.init( app.GetString(IDS_BREWING_STAND) ); + + BrewingScreenInput *initData = (BrewingScreenInput *)_initData; + m_brewingStand = initData->brewingStand; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->localgameModes[initData->iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[initData->iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Brewing_Menu, this); + } + + BrewingStandMenu* menu = new BrewingStandMenu( initData->inventory, initData->brewingStand ); + + Initialize( initData->iPad, menu, true, BrewingStandMenu::INV_SLOT_START, eSectionBrewingUsing, eSectionBrewingMax ); + + m_slotListIngredient.addSlots(BrewingStandMenu::INGREDIENT_SLOT, 1); + + for(unsigned int i = 0; i < 3; ++i) + { + m_slotListBottles[i].addSlots(BrewingStandMenu::BOTTLE_SLOT_START + i, 1); + } + + if(initData) delete initData; + + app.SetRichPresenceContext(iPad, CONTEXT_GAME_STATE_BREWING); +} + +wstring UIScene_BrewingStandMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"BrewingStandMenuSplit"; + } + else + { + return L"BrewingStandMenu"; + } +} + +void UIScene_BrewingStandMenu::handleReload() +{ + Initialize( m_iPad, m_menu, true, BrewingStandMenu::INV_SLOT_START, eSectionBrewingUsing, eSectionBrewingMax ); + + m_slotListIngredient.addSlots(BrewingStandMenu::INGREDIENT_SLOT, 1); + + for(unsigned int i = 0; i < 3; ++i) + { + m_slotListBottles[i].addSlots(BrewingStandMenu::BOTTLE_SLOT_START + i, 1); + } +} + +void UIScene_BrewingStandMenu::tick() +{ + m_progressBrewingArrow.setProgress( m_brewingStand->getBrewTime() ); + + int value = 0; + int bubbleStep = (m_brewingStand->getBrewTime() / 2) % 7; + switch (bubbleStep) + { + case 0: + value = 0; + break; + case 6: + value = 5; + break; + case 5: + value = 10; + break; + case 4: + value = 15; + break; + case 3: + value = 20; + break; + case 2: + value = 25; + break; + case 1: + value = 30; + break; + } + m_progressBrewingBubbles.setProgress( value); + UIScene_AbstractContainerMenu::tick(); +} + +int UIScene_BrewingStandMenu::getSectionColumns(ESceneSection eSection) +{ + int cols = 0; + switch( eSection ) + { + case eSectionBrewingBottle1: + cols = 1; + break; + case eSectionBrewingBottle2: + cols = 1; + break; + case eSectionBrewingBottle3: + cols = 1; + break; + case eSectionBrewingIngredient: + cols = 1; + break; + case eSectionBrewingInventory: + cols = 9; + break; + case eSectionBrewingUsing: + cols = 9; + break; + default: + assert( false ); + break; + } + return cols; +} + +int UIScene_BrewingStandMenu::getSectionRows(ESceneSection eSection) +{ + int rows = 0; + switch( eSection ) + { + case eSectionBrewingBottle1: + rows = 1; + break; + case eSectionBrewingBottle2: + rows = 1; + break; + case eSectionBrewingBottle3: + rows = 1; + break; + case eSectionBrewingIngredient: + rows = 1; + break; + case eSectionBrewingInventory: + rows = 3; + break; + case eSectionBrewingUsing: + rows = 1; + break; + default: + assert( false ); + break; + } + return rows; +} + +void UIScene_BrewingStandMenu::GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ) +{ + switch( eSection ) + { + case eSectionBrewingBottle1: + pPosition->x = m_slotListBottles[0].getXPos(); + pPosition->y = m_slotListBottles[0].getYPos(); + break; + case eSectionBrewingBottle2: + pPosition->x = m_slotListBottles[1].getXPos(); + pPosition->y = m_slotListBottles[1].getYPos(); + break; + case eSectionBrewingBottle3: + pPosition->x = m_slotListBottles[2].getXPos(); + pPosition->y = m_slotListBottles[2].getYPos(); + break; + case eSectionBrewingIngredient: + pPosition->x = m_slotListIngredient.getXPos(); + pPosition->y = m_slotListIngredient.getYPos(); + break; + case eSectionBrewingInventory: + pPosition->x = m_slotListInventory.getXPos(); + pPosition->y = m_slotListInventory.getYPos(); + break; + case eSectionBrewingUsing: + pPosition->x = m_slotListHotbar.getXPos(); + pPosition->y = m_slotListHotbar.getYPos(); + break; + default: + assert( false ); + break; + } +} + +void UIScene_BrewingStandMenu::GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ) +{ + UIVec2D sectionSize; + + switch( eSection ) + { + case eSectionBrewingBottle1: + sectionSize.x = m_slotListBottles[0].getWidth(); + sectionSize.y = m_slotListBottles[0].getHeight(); + break; + case eSectionBrewingBottle2: + sectionSize.x = m_slotListBottles[1].getWidth(); + sectionSize.y = m_slotListBottles[1].getHeight(); + break; + case eSectionBrewingBottle3: + sectionSize.x = m_slotListBottles[2].getWidth(); + sectionSize.y = m_slotListBottles[2].getHeight(); + break; + case eSectionBrewingIngredient: + sectionSize.x = m_slotListIngredient.getWidth(); + sectionSize.y = m_slotListIngredient.getHeight(); + break; + case eSectionBrewingInventory: + sectionSize.x = m_slotListInventory.getWidth(); + sectionSize.y = m_slotListInventory.getHeight(); + break; + case eSectionBrewingUsing: + sectionSize.x = m_slotListHotbar.getWidth(); + sectionSize.y = m_slotListHotbar.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_BrewingStandMenu::setSectionSelectedSlot(ESceneSection eSection, int x, int y) +{ + int cols = getSectionColumns(eSection); + + int index = (y * cols) + x; + + UIControl_SlotList *slotList = NULL; + switch( eSection ) + { + case eSectionBrewingBottle1: + slotList = &m_slotListBottles[0]; + break; + case eSectionBrewingBottle2: + slotList = &m_slotListBottles[1]; + break; + case eSectionBrewingBottle3: + slotList = &m_slotListBottles[2]; + break; + case eSectionBrewingIngredient: + slotList = &m_slotListIngredient; + break; + case eSectionBrewingInventory: + slotList = &m_slotListInventory; + break; + case eSectionBrewingUsing: + slotList = &m_slotListHotbar; + break; + default: + assert( false ); + break; + } + + slotList->setHighlightSlot(index); +} + +UIControl *UIScene_BrewingStandMenu::getSection(ESceneSection eSection) +{ + UIControl *control = NULL; + switch( eSection ) + { + case eSectionBrewingBottle1: + control = &m_slotListBottles[0]; + break; + case eSectionBrewingBottle2: + control = &m_slotListBottles[1]; + break; + case eSectionBrewingBottle3: + control = &m_slotListBottles[2]; + break; + case eSectionBrewingIngredient: + control = &m_slotListIngredient; + break; + case eSectionBrewingInventory: + control = &m_slotListInventory; + break; + case eSectionBrewingUsing: + control = &m_slotListHotbar; + break; + default: + assert( false ); + break; + } + return control; +} diff --git a/Minecraft.Client/Common/UI/UIScene_BrewingStandMenu.h b/Minecraft.Client/Common/UI/UIScene_BrewingStandMenu.h new file mode 100644 index 00000000..5441a1ac --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_BrewingStandMenu.h @@ -0,0 +1,49 @@ +#pragma once + +#include "UIScene_AbstractContainerMenu.h" +#include "IUIScene_BrewingMenu.h" + +class InventoryMenu; + +class UIScene_BrewingStandMenu : public UIScene_AbstractContainerMenu, public IUIScene_BrewingMenu +{ +private: + shared_ptr m_brewingStand; + +public: + UIScene_BrewingStandMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_BrewingStandMenu;} + +protected: + UIControl_SlotList m_slotListBottles[3], m_slotListIngredient; + UIControl_Label m_labelBrewingStand; + UIControl_Progress m_progressBrewingArrow, m_progressBrewingBubbles; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene_AbstractContainerMenu) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + UI_MAP_ELEMENT( m_slotListBottles[0], "Bottle1") + UI_MAP_ELEMENT( m_slotListBottles[1], "Bottle2") + UI_MAP_ELEMENT( m_slotListBottles[2], "Bottle3") + UI_MAP_ELEMENT( m_slotListIngredient, "Ingredient") + UI_MAP_ELEMENT( m_labelBrewingStand, "BrewingStandText") + + UI_MAP_ELEMENT( m_progressBrewingArrow, "BrewingArrow") + UI_MAP_ELEMENT( m_progressBrewingBubbles, "BrewingBubbles") + UI_END_MAP_CHILD_ELEMENTS() + UI_END_MAP_ELEMENTS_AND_NAMES() + + virtual wstring getMoviePath(); + virtual void handleReload(); + + virtual void tick(); + + 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); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.cpp b/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.cpp new file mode 100644 index 00000000..0ea99a36 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.cpp @@ -0,0 +1,267 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_ConnectingProgress.h" +#include "..\..\Minecraft.h" + +UIScene_ConnectingProgress::UIScene_ConnectingProgress(int iPad, void *_initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + parentLayer->addComponent(iPad,eUIComponent_Panorama); + parentLayer->addComponent(iPad,eUIComponent_Logo); + + m_progressBar.showBar(false); + m_progressBar.setVisible( false ); + m_labelTip.setVisible( false ); + + ConnectionProgressParams *param = (ConnectionProgressParams *)_initData; + + if( param->stringId >= 0 ) + { + m_labelTitle.init( app.GetString( param->stringId ) ); + } + else + { + m_labelTitle.init( L"" ); + } + m_progressBar.init(L"",0,0,100,0); + m_buttonConfirm.init( app.GetString( IDS_CONFIRM_OK ), eControl_Confirm ); + m_buttonConfirm.setVisible(false); + +#if 0 + if(app.GetLocalPlayerCount()>1) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad,false); + } +#endif + + m_showTooltips = param->showTooltips; + m_runFailTimer = param->setFailTimer; + m_timerTime = param->timerTime; + m_cancelFunc = param->cancelFunc; + m_cancelFuncParam = param->cancelFuncParam; + m_removeLocalPlayer = false; + m_showingButton = false; +} + +UIScene_ConnectingProgress::~UIScene_ConnectingProgress() +{ + m_parentLayer->removeComponent(eUIComponent_Panorama); + m_parentLayer->removeComponent(eUIComponent_Logo); +} + +void UIScene_ConnectingProgress::updateTooltips() +{ + // 4J-PB - removing the option of cancel join, since it didn't work anyway + //ui.SetTooltips( m_iPad, -1, m_showTooltips?IDS_TOOLTIPS_CANCEL_JOIN:-1); + ui.SetTooltips( m_iPad, -1, -1); +} + +void UIScene_ConnectingProgress::tick() +{ + UIScene::tick(); + + if( m_removeLocalPlayer ) + { + m_removeLocalPlayer = false; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->removeLocalPlayerIdx(m_iPad); +#ifdef _XBOX_ONE + ProfileManager.RemoveGamepadFromGame(m_iPad); +#endif + } +} + +wstring UIScene_ConnectingProgress::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1 && !m_parentLayer->IsFullscreenGroup()) + { + return L"FullscreenProgressSplit"; + } + else + { + return L"FullscreenProgress"; + } +} + +void UIScene_ConnectingProgress::handleGainFocus(bool navBack) +{ + UIScene::handleGainFocus(navBack); + if(!navBack && m_runFailTimer) addTimer(0,m_timerTime); +} + +void UIScene_ConnectingProgress::handleLoseFocus() +{ + int millisecsLeft = getTimer(0)->targetTime - System::currentTimeMillis(); + int millisecsTaken = getTimer(0)->duration - millisecsLeft; + app.DebugPrintf("\n"); + app.DebugPrintf("---------------------------------------------------------\n"); + app.DebugPrintf("---------------------------------------------------------\n"); + app.DebugPrintf("UIScene_ConnectingProgress time taken = %d millisecs\n", millisecsTaken); + app.DebugPrintf("---------------------------------------------------------\n"); + app.DebugPrintf("---------------------------------------------------------\n"); + app.DebugPrintf("\n"); + + + killTimer(0); +} + +void UIScene_ConnectingProgress::handleTimerComplete(int id) +{ + // Check if the connection failed + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if( pMinecraft->m_connectionFailed[m_iPad] || !g_NetworkManager.IsInSession() ) + { + +#if 0 + app.RemoveBackScene(m_iPad); +#endif + + int exitReasonStringId; + switch(pMinecraft->m_connectionFailedReason[m_iPad]) + { + case DisconnectPacket::eDisconnect_LoginTooLong: + exitReasonStringId = IDS_DISCONNECTED_LOGIN_TOO_LONG; + break; + case DisconnectPacket::eDisconnect_ServerFull: + exitReasonStringId = IDS_DISCONNECTED_SERVER_FULL; + break; + case DisconnectPacket::eDisconnect_Kicked: + exitReasonStringId = IDS_DISCONNECTED_KICKED; + break; + case DisconnectPacket::eDisconnect_NoUGC_AllLocal: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL; + break; + case DisconnectPacket::eDisconnect_NoUGC_Single_Local: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL; + break; +#if defined(__PS3__) || defined(__ORBIS__) + case DisconnectPacket::eDisconnect_ContentRestricted_AllLocal: + exitReasonStringId = IDS_CONTENT_RESTRICTION_MULTIPLAYER; + break; + case DisconnectPacket::eDisconnect_ContentRestricted_Single_Local: + exitReasonStringId = IDS_CONTENT_RESTRICTION; + break; +#endif +#ifdef _XBOX + case DisconnectPacket::eDisconnect_NoUGC_Remote: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_REMOTE; + break; +#endif + case DisconnectPacket::eDisconnect_NoFlying: + exitReasonStringId = IDS_DISCONNECTED_FLYING; + break; + case DisconnectPacket::eDisconnect_Quitting: + exitReasonStringId = IDS_DISCONNECTED_SERVER_QUIT; + break; + case DisconnectPacket::eDisconnect_OutdatedServer: + exitReasonStringId = IDS_DISCONNECTED_SERVER_OLD; + break; + case DisconnectPacket::eDisconnect_OutdatedClient: + exitReasonStringId = IDS_DISCONNECTED_CLIENT_OLD; + break; +#if defined __ORBIS__ || defined __PS3__ || defined __PSVITA__ + case DisconnectPacket::eDisconnect_NATMismatch: + exitReasonStringId = IDS_DISCONNECTED_NAT_TYPE_MISMATCH; + break; +#endif + default: + exitReasonStringId = IDS_CONNECTION_LOST_SERVER; + break; + } + + if( m_iPad != ProfileManager.GetPrimaryPad() && g_NetworkManager.IsInSession() ) + { + m_buttonConfirm.setVisible(true); + m_showingButton = true; + + // Set text + m_labelTitle.setLabel( app.GetString( IDS_CONNECTION_FAILED ) ); + m_progressBar.setLabel( app.GetString( exitReasonStringId ) ); + m_progressBar.setVisible( true ); + m_controlTimer.setVisible( false ); + } + else + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox( IDS_CONNECTION_FAILED, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + exitReasonStringId = -1; + + //app.NavigateToHomeMenu(); + app.SetAction(ProfileManager.GetPrimaryPad(),eAppAction_ExitWorld,(void *)TRUE); + } + } +} + +void UIScene_ConnectingProgress::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + + if( m_showTooltips ) + { + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { +// 4J-PB - Removed the option to cancel join - it didn't work anyway +// case ACTION_MENU_CANCEL: +// { +// if(m_cancelFunc != NULL) +// { +// m_cancelFunc(m_cancelFuncParam); +// } +// else +// { +// // Cancel the join +// Minecraft *pMinecraft = Minecraft::GetInstance(); +// pMinecraft->removeLocalPlayerIdx(m_iPad); +// } +// handled = true; +// } +// break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + if(pressed) + { + sendInputToMovie(key, repeat, pressed, released); + } + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + if(pressed) + { + sendInputToMovie(key, repeat, pressed, released); + } + break; + } + } +} + +void UIScene_ConnectingProgress::handlePress(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_Confirm: + if(m_showingButton) + { + if( m_iPad != ProfileManager.GetPrimaryPad() && g_NetworkManager.IsInSession() ) + { + // The connection failed if we see the button, so the temp player should be removed and the viewports updated again + // This is actually done in the tick as we can't pull down the scene we are currently in from here + m_removeLocalPlayer = true; + } + else + { + ui.NavigateToHomeMenu(); + //app.NavigateBack( ProfileManager.GetPrimaryPad() ); + } + } + break; + } +} diff --git a/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.h b/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.h new file mode 100644 index 00000000..2c52284c --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.h @@ -0,0 +1,61 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_ConnectingProgress : public UIScene +{ +private: + bool m_runFailTimer; + int m_timerTime; + bool m_showTooltips; + bool m_removeLocalPlayer; + bool m_showingButton; + void (*m_cancelFunc)(LPVOID param); + LPVOID m_cancelFuncParam; + + enum EControls + { + eControl_Confirm + }; + +protected: + UIControl_Progress m_progressBar; + UIControl_Label m_labelTitle, m_labelTip; + UIControl_Button m_buttonConfirm; + UIControl m_controlTimer; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_progressBar, "ProgressBar") + UI_MAP_ELEMENT( m_labelTitle, "Title") + UI_MAP_ELEMENT( m_labelTip, "Tip") + UI_MAP_ELEMENT( m_buttonConfirm, "Confirm") + UI_MAP_ELEMENT( m_controlTimer, "Timer") + UI_END_MAP_ELEMENTS_AND_NAMES() +public: + UIScene_ConnectingProgress(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_ConnectingProgress(); + + virtual void tick(); + + virtual EUIScene getSceneType() { return eUIScene_ConnectingProgress;} + + virtual void updateTooltips(); + virtual void handleGainFocus(bool navBack); + virtual void handleLoseFocus(); + + void handleTimerComplete(int id); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +#ifdef _DURANGO + virtual long long getDefaultGtcButtons() { return 0; } +#endif + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +protected: + void handlePress(F64 controlId, F64 childId); +}; diff --git a/Minecraft.Client/Common/UI/UIScene_ContainerMenu.cpp b/Minecraft.Client/Common/UI/UIScene_ContainerMenu.cpp new file mode 100644 index 00000000..a0b25d18 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_ContainerMenu.cpp @@ -0,0 +1,223 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_ContainerMenu.h" + +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.stats.h" +#include "..\..\LocalPlayer.h" +#include "..\..\Minecraft.h" +#include "..\Tutorial\Tutorial.h" +#include "..\Tutorial\TutorialMode.h" +#include "..\Tutorial\TutorialEnum.h" + +UIScene_ContainerMenu::UIScene_ContainerMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene_AbstractContainerMenu(iPad, parentLayer) +{ + ContainerScreenInput *initData = (ContainerScreenInput *)_initData; + m_bLargeChest = (initData->container->getContainerSize() > 3*9)?true:false; + + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_labelChest.init(app.GetString(initData->container->getName())); + + ContainerMenu* menu = new ContainerMenu( initData->inventory, initData->container ); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->localgameModes[iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[initData->iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Container_Menu, this); + } + + int containerSize = menu->getSize() - (27 + 9); + + Initialize( initData->iPad, menu, true, containerSize, eSectionContainerUsing, eSectionContainerMax); + + m_slotListContainer.addSlots(0, containerSize); + + if(initData) delete initData; +} + +wstring UIScene_ContainerMenu::getMoviePath() +{ + if(m_bLargeChest) + { + if(app.GetLocalPlayerCount() > 1) + { + return L"ChestLargeMenuSplit"; + } + else + { + return L"ChestLargeMenu"; + } + } + else + { + if(app.GetLocalPlayerCount() > 1) + { + return L"ChestMenuSplit"; + } + else + { + return L"ChestMenu"; + } + } +} + +void UIScene_ContainerMenu::handleReload() +{ + int containerSize = m_menu->getSize() - (27 + 9); + + Initialize( m_iPad, m_menu, true, containerSize, eSectionContainerUsing, eSectionContainerMax ); + + m_slotListContainer.addSlots(0, containerSize); +} + +int UIScene_ContainerMenu::getSectionColumns(ESceneSection eSection) +{ + int cols = 0; + switch( eSection ) + { + case eSectionContainerChest: + cols = 9; + break; + case eSectionContainerInventory: + cols = 9; + break; + case eSectionContainerUsing: + cols = 9; + break; + default: + assert( false ); + break; + } + return cols; +} + +int UIScene_ContainerMenu::getSectionRows(ESceneSection eSection) +{ + int rows = 0; + switch( eSection ) + { + case eSectionContainerChest: + rows = (m_menu->getSize() - (27 + 9)) / 9; + break; + case eSectionContainerInventory: + rows = 3; + break; + case eSectionContainerUsing: + rows = 1; + break; + default: + assert( false ); + break; + } + return rows; +} + +void UIScene_ContainerMenu::GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ) +{ + switch( eSection ) + { + case eSectionContainerChest: + pPosition->x = m_slotListContainer.getXPos(); + pPosition->y = m_slotListContainer.getYPos(); + break; + case eSectionContainerInventory: + pPosition->x = m_slotListInventory.getXPos(); + pPosition->y = m_slotListInventory.getYPos(); + break; + case eSectionContainerUsing: + pPosition->x = m_slotListHotbar.getXPos(); + pPosition->y = m_slotListHotbar.getYPos(); + break; + default: + assert( false ); + break; + } +} + +void UIScene_ContainerMenu::GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ) +{ + UIVec2D sectionSize; + + switch( eSection ) + { + case eSectionContainerChest: + sectionSize.x = m_slotListContainer.getWidth(); + sectionSize.y = m_slotListContainer.getHeight(); + break; + case eSectionContainerInventory: + sectionSize.x = m_slotListInventory.getWidth(); + sectionSize.y = m_slotListInventory.getHeight(); + break; + case eSectionContainerUsing: + sectionSize.x = m_slotListHotbar.getWidth(); + sectionSize.y = m_slotListHotbar.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_ContainerMenu::setSectionSelectedSlot(ESceneSection eSection, int x, int y) +{ + int cols = getSectionColumns(eSection); + + int index = (y * cols) + x; + + UIControl_SlotList *slotList = NULL; + switch( eSection ) + { + case eSectionContainerChest: + slotList = &m_slotListContainer; + break; + case eSectionContainerInventory: + slotList = &m_slotListInventory; + break; + case eSectionContainerUsing: + slotList = &m_slotListHotbar; + break; + default: + assert( false ); + break; + } + + slotList->setHighlightSlot(index); +} + +UIControl *UIScene_ContainerMenu::getSection(ESceneSection eSection) +{ + UIControl *control = NULL; + switch( eSection ) + { + case eSectionContainerChest: + control = &m_slotListContainer; + break; + case eSectionContainerInventory: + control = &m_slotListInventory; + break; + case eSectionContainerUsing: + control = &m_slotListHotbar; + break; + default: + assert( false ); + break; + } + return control; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_ContainerMenu.h b/Minecraft.Client/Common/UI/UIScene_ContainerMenu.h new file mode 100644 index 00000000..f2ad743c --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_ContainerMenu.h @@ -0,0 +1,40 @@ +#pragma once + +#include "UIScene_AbstractContainerMenu.h" +#include "IUIScene_ContainerMenu.h" + +class InventoryMenu; + +class UIScene_ContainerMenu : public UIScene_AbstractContainerMenu, public IUIScene_ContainerMenu +{ +private: + bool m_bLargeChest; + +public: + UIScene_ContainerMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_ContainerMenu;} + +protected: + UIControl_SlotList m_slotListContainer; + UIControl_Label m_labelChest; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene_AbstractContainerMenu) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + UI_MAP_ELEMENT( m_slotListContainer, "containerList") + UI_MAP_ELEMENT( m_labelChest, "chestLabel") + 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); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_ControlsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_ControlsMenu.cpp new file mode 100644 index 00000000..c05b502e --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_ControlsMenu.cpp @@ -0,0 +1,336 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_ControlsMenu.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" + +UIScene_ControlsMenu::UIScene_ControlsMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; +#if defined(_XBOX) || defined(_WIN64) + value[0].number = (F64)0; +#elif defined(_DURANGO) + value[0].number = (F64)1; +#elif defined(__PS3__) + value[0].number = (F64)2; +#elif defined(__ORBIS__) + value[0].number = (F64)3; +#elif defined(__PSVITA__) + value[0].number = (F64)4; +#endif + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetPlatform , 1 , value ); + + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + + if(bNotInGame) + { + LPWSTR layoutString = new wchar_t[ 128 ]; + swprintf( layoutString, 128, L"%ls", VER_PRODUCTVERSION_STR_W); + m_labelVersion.init(layoutString); + delete [] layoutString; + } + // 4J-PB - stop the label showing in the in-game controls menu + else + { + m_labelVersion.init(" "); + } + m_bCreativeMode = !bNotInGame && Minecraft::GetInstance()->localplayers[m_iPad] && Minecraft::GetInstance()->localplayers[m_iPad]->abilities.mayfly; + +#ifndef __PSVITA__ +#ifdef __ORBIS__ + // no buttons to initialise if we're running this on PS4 remote play + if(!InputManager.UsingRemoteVita()) +#endif + { + m_buttonLayouts[0].init(L"1", eControl_Button0); + m_buttonLayouts[1].init(L"2", eControl_Button1); + m_buttonLayouts[2].init(L"3", eControl_Button2); + } +#endif + + m_checkboxInvert.init(app.GetString(IDS_INVERT_LOOK), eControl_InvertLook, app.GetGameSettings(m_iPad,eGameSetting_ControlInvertLook)); + m_checkboxSouthpaw.init(app.GetString(IDS_SOUTHPAW), eControl_Southpaw, app.GetGameSettings(m_iPad,eGameSetting_ControlSouthPaw)); + + m_iSchemeTextA[0]=IDS_CONTROLS_SCHEME0; + m_iSchemeTextA[1]=IDS_CONTROLS_SCHEME1; + m_iSchemeTextA[2]=IDS_CONTROLS_SCHEME2; + + int iSelected=app.GetGameSettings(m_iPad,eGameSetting_ControlScheme); + +#ifndef __PSVITA__ + LPWSTR layoutString = new wchar_t[ 128 ]; + swprintf( layoutString, 128, L"%ls : %ls", app.GetString( IDS_CURRENT_LAYOUT ),app.GetString(m_iSchemeTextA[iSelected])); +#ifdef __ORBIS__ + if (!InputManager.UsingRemoteVita()) +#endif + { + m_labelCurrentLayout.init(layoutString); + } +#endif + + m_iCurrentNavigatedControlsLayout = iSelected; + + +#ifdef __ORBIS__ + // don't set controller layout if we're entering the PS4 remote play scene + if(!InputManager.UsingRemoteVita()) +#endif + { + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = (F64)m_iCurrentNavigatedControlsLayout; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetControllerLayout , 1 , value ); + } + +#ifdef __ORBIS__ + // Set mapping to Vita mapping + if (InputManager.UsingRemoteVita()) m_iCurrentNavigatedControlsLayout = 3; +#elif defined __PSVITA__ + // Set mapping to Vita mapping + if (InputManager.IsVitaTV()) m_iCurrentNavigatedControlsLayout = 1; +#endif + + for(unsigned int i = 0; i < e_PadCOUNT; ++i) + { + m_labelsPad[i].init(L""); + m_controlLines[i].setVisible(false); + } + m_bLayoutChanged = false; + + + PositionAllText(m_iPad); +} + +wstring UIScene_ControlsMenu::getMoviePath() +{ +#ifdef __ORBIS__ + if(InputManager.UsingRemoteVita()) + { + return L"ControlsRemotePlay"; + } + else +#endif +#ifdef __PSVITA__ + if(InputManager.IsVitaTV()) + { + return L"ControlsTV"; + } + else +#endif + if(app.GetLocalPlayerCount() > 1) + { + return L"ControlsSplit"; + } + else + { + return L"Controls"; + } +} + +void UIScene_ControlsMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_ControlsMenu::tick() +{ + if(m_bLayoutChanged) PositionAllText(m_iPad); + UIScene::tick(); +} + +void UIScene_ControlsMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + app.CheckGameSettingsChanged(true,iPad); + navigateBack(); + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + if( pressed ) + { + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + } + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_ControlsMenu::handleCheckboxToggled(F64 controlId, bool selected) +{ + switch((int)controlId) + { + case eControl_InvertLook: + app.SetGameSettings(m_iPad,eGameSetting_ControlInvertLook,(unsigned char)( selected ) ); + break; + case eControl_Southpaw: + app.SetGameSettings(m_iPad,eGameSetting_ControlSouthPaw,(unsigned char)( selected ) ); + PositionAllText(m_iPad); + break; + }; +} + +void UIScene_ControlsMenu::handlePress(F64 controlId, F64 childId) +{ + int control = (int)controlId; + switch(control) + { + case eControl_Button0: + case eControl_Button1: + case eControl_Button2: + app.SetGameSettings(m_iPad,eGameSetting_ControlScheme,(unsigned char)control); + LPWSTR layoutString = new wchar_t[ 128 ]; + swprintf( layoutString, 128, L"%ls : %ls", app.GetString( IDS_CURRENT_LAYOUT ),app.GetString(m_iSchemeTextA[control])); +#ifdef __ORBIS__ + if (!InputManager.UsingRemoteVita()) +#endif + { + m_labelCurrentLayout.setLabel(layoutString); + } + + break; + }; +} + +void UIScene_ControlsMenu::handleFocusChange(F64 controlId, F64 childId) +{ + int control = (int)controlId; + switch(control) + { + case eControl_Button0: + case eControl_Button1: + case eControl_Button2: + m_iCurrentNavigatedControlsLayout=control; + m_bLayoutChanged = true; + break; + }; +} + +void UIScene_ControlsMenu::PositionAllText(int iPad) +{ + for(unsigned int i = 0; i < e_PadCOUNT; ++i) + { + m_labelsPad[i].setLabel(L""); + m_controlLines[i].setVisible(false); + } + + if(m_bCreativeMode) + { + PositionText(iPad,IDS_CONTROLS_JUMPFLY,MINECRAFT_ACTION_JUMP); + } + else + { + PositionText(iPad,IDS_CONTROLS_JUMP,MINECRAFT_ACTION_JUMP); + } + PositionText(iPad,IDS_CONTROLS_INVENTORY,MINECRAFT_ACTION_INVENTORY); + PositionText(iPad,IDS_CONTROLS_PAUSE,MINECRAFT_ACTION_PAUSEMENU); + if(m_bCreativeMode) + { + PositionText(iPad,IDS_CONTROLS_SNEAKFLY,MINECRAFT_ACTION_SNEAK_TOGGLE); + } + else + { + PositionText(iPad,IDS_CONTROLS_SNEAK,MINECRAFT_ACTION_SNEAK_TOGGLE); + } + PositionText(iPad,IDS_CONTROLS_USE,MINECRAFT_ACTION_USE); + PositionText(iPad,IDS_CONTROLS_ACTION,MINECRAFT_ACTION_ACTION); + PositionText(iPad,IDS_CONTROLS_HELDITEM,MINECRAFT_ACTION_RIGHT_SCROLL); + PositionText(iPad,IDS_CONTROLS_HELDITEM,MINECRAFT_ACTION_LEFT_SCROLL); + PositionText(iPad,IDS_CONTROLS_DROP,MINECRAFT_ACTION_DROP); + PositionText(iPad,IDS_CONTROLS_CRAFTING,MINECRAFT_ACTION_CRAFTING); + PositionText(iPad,IDS_CONTROLS_THIRDPERSON,MINECRAFT_ACTION_RENDER_THIRD_PERSON); + PositionText(iPad,IDS_CONTROLS_PLAYERS,MINECRAFT_ACTION_GAME_INFO); + + // Swap for southpaw. + if ( app.GetGameSettings(m_iPad,eGameSetting_ControlSouthPaw) ) + { + // Move + PositionText(iPad,IDS_CONTROLS_LOOK,MINECRAFT_ACTION_RIGHT); + // Look + PositionText(iPad,IDS_CONTROLS_MOVE,MINECRAFT_ACTION_LOOK_RIGHT); + } + else // Normal right handed. + { + // Move + PositionText(iPad,IDS_CONTROLS_MOVE,MINECRAFT_ACTION_RIGHT); + // Look + PositionText(iPad,IDS_CONTROLS_LOOK,MINECRAFT_ACTION_LOOK_RIGHT); + } + + bool layoutHasDpadFly; +#ifdef __PSVITA__ + layoutHasDpadFly = m_iCurrentNavigatedControlsLayout == 1; +#else + layoutHasDpadFly = m_iCurrentNavigatedControlsLayout == 0; +#endif + + // If we're in controls mode 1, and creative mode show the dpad for Creative Mode + if(m_bCreativeMode && layoutHasDpadFly) + { + PositionText(iPad,IDS_CONTROLS_DPAD,MINECRAFT_ACTION_DPAD_LEFT); + } + m_bLayoutChanged = false; +} + +void UIScene_ControlsMenu::PositionText(int iPad,int iTextID, unsigned char ucAction) +{ + unsigned int uiVal = InputManager.GetGameJoypadMaps(m_iCurrentNavigatedControlsLayout, ucAction); + + if (uiVal & _360_JOY_BUTTON_A) PositionTextDirect(iPad, iTextID, e_PadA, true); + if (uiVal & _360_JOY_BUTTON_B) PositionTextDirect(iPad, iTextID, e_PadB, true); + if (uiVal & _360_JOY_BUTTON_X) PositionTextDirect(iPad, iTextID, e_PadX, true); + if (uiVal & _360_JOY_BUTTON_Y) PositionTextDirect(iPad, iTextID, e_PadY, true); + if (uiVal & _360_JOY_BUTTON_BACK) + { +#ifdef __ORBIS__ + PositionTextDirect(iPad, iTextID, (InputManager.UsingRemoteVita() ? e_PadTouch : e_PadBack), true); +#else + PositionTextDirect(iPad, iTextID, e_PadBack, true); +#endif + } + if (uiVal & _360_JOY_BUTTON_START) PositionTextDirect(iPad, iTextID, e_PadStart, true); + if (uiVal & _360_JOY_BUTTON_RB) PositionTextDirect(iPad, iTextID, e_PadRB, true); + if (uiVal & _360_JOY_BUTTON_LB) PositionTextDirect(iPad, iTextID, e_PadLB, true); + if (uiVal & _360_JOY_BUTTON_RTHUMB) PositionTextDirect(iPad, iTextID, e_PadRS_1, true); + if (uiVal & _360_JOY_BUTTON_LTHUMB) PositionTextDirect(iPad, iTextID, e_PadLS_1, true); + // Look + if (uiVal & _360_JOY_BUTTON_RSTICK_RIGHT) PositionTextDirect(iPad, iTextID, e_PadRS_2, true); + // Move + if (uiVal & _360_JOY_BUTTON_LSTICK_RIGHT) PositionTextDirect(iPad, iTextID, e_PadLS_2, true); + if (uiVal & _360_JOY_BUTTON_RT) PositionTextDirect(iPad, iTextID, e_PadRT, true); + if (uiVal & _360_JOY_BUTTON_LT) PositionTextDirect(iPad, iTextID, e_PadLT, true); + if (uiVal & _360_JOY_BUTTON_DPAD_RIGHT) PositionTextDirect(iPad, iTextID, e_PadDPadRight, true); + if (uiVal & _360_JOY_BUTTON_DPAD_LEFT) PositionTextDirect(iPad, iTextID, e_PadDPadLeft, true); + if (uiVal & _360_JOY_BUTTON_DPAD_UP) PositionTextDirect(iPad, iTextID, e_PadDPadUp, true); + if (uiVal & _360_JOY_BUTTON_DPAD_DOWN) PositionTextDirect(iPad, iTextID, e_PadDPadDown, true); + } + +void UIScene_ControlsMenu::PositionTextDirect(int iPad,int iTextID, int iControlDetailsIndex, bool bShow) +{ + LPCWSTR text = app.GetString(iTextID); + + m_labelsPad[iControlDetailsIndex].setLabel(text); + m_controlLines[iControlDetailsIndex].setVisible(bShow); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_ControlsMenu.h b/Minecraft.Client/Common/UI/UIScene_ControlsMenu.h new file mode 100644 index 00000000..538207fe --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_ControlsMenu.h @@ -0,0 +1,141 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_ControlsMenu : public UIScene +{ +private: + enum EControl + { + // Buttons must be first three controls here + eControl_Button0, + eControl_Button1, + eControl_Button2, + eControl_InvertLook, + eControl_Southpaw, + }; + + enum EPadButtons + { + e_PadBack=0, + e_PadLT, + e_PadLB, + e_PadDPadLeft, + e_PadDPadRight, + e_PadDPadUp, + e_PadDPadDown, + e_PadLS_1, + e_PadLS_2, + e_PadStart, + e_PadRT, + e_PadRB, + e_PadY, + e_PadB, + e_PadA, + e_PadX, + e_PadRS_1, + e_PadRS_2, + e_PadTouch, + + e_PadCOUNT, + }; + + int m_iSchemeTextA[3]; + int m_iCurrentNavigatedControlsLayout; + bool m_bCreativeMode; + bool m_bLayoutChanged; + + UIControl_Label m_labelCurrentLayout; + UIControl_Label m_labelVersion; + UIControl_Label m_labelsPad[e_PadCOUNT]; + UIControl m_controlLines[e_PadCOUNT]; + UIControl_Button m_buttonLayouts[3]; + UIControl_CheckBox m_checkboxInvert, m_checkboxSouthpaw; + IggyName m_funcSetPlatform, m_funcSetControllerLayout; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + +#ifndef __PSVITA__ +#ifdef __ORBIS__ + if (!InputManager.UsingRemoteVita()) +#endif + { + UI_MAP_ELEMENT( m_labelCurrentLayout, "CurrentLayout") + + UI_MAP_ELEMENT( m_buttonLayouts[0], "Button1") + UI_MAP_ELEMENT( m_buttonLayouts[1], "Button2") + UI_MAP_ELEMENT( m_buttonLayouts[2], "Button3") + } +#endif + + UI_MAP_ELEMENT( m_labelsPad[e_PadBack], "LabelBack") + UI_MAP_ELEMENT( m_labelsPad[e_PadLT], "LabelLT") + UI_MAP_ELEMENT( m_labelsPad[e_PadLB], "LabelLB") + UI_MAP_ELEMENT( m_labelsPad[e_PadDPadLeft], "LabelDPadLeft") + UI_MAP_ELEMENT( m_labelsPad[e_PadDPadRight], "LabelDPadRight") + UI_MAP_ELEMENT( m_labelsPad[e_PadDPadUp], "LabelDPadUp") + UI_MAP_ELEMENT( m_labelsPad[e_PadDPadDown], "LabelDPadDown") + UI_MAP_ELEMENT( m_labelsPad[e_PadLS_1], "LabelLS_1") + UI_MAP_ELEMENT( m_labelsPad[e_PadLS_2], "LabelLS_2") + UI_MAP_ELEMENT( m_labelsPad[e_PadStart], "LabelStart") + UI_MAP_ELEMENT( m_labelsPad[e_PadRT], "LabelRT") + UI_MAP_ELEMENT( m_labelsPad[e_PadRB], "LabelRB") + UI_MAP_ELEMENT( m_labelsPad[e_PadY], "LabelY") + UI_MAP_ELEMENT( m_labelsPad[e_PadB], "LabelB") + UI_MAP_ELEMENT( m_labelsPad[e_PadA], "LabelA") + UI_MAP_ELEMENT( m_labelsPad[e_PadX], "LabelX") + UI_MAP_ELEMENT( m_labelsPad[e_PadRS_1], "LabelRS_1") + UI_MAP_ELEMENT( m_labelsPad[e_PadRS_2], "LabelRS_2") + UI_MAP_ELEMENT( m_labelsPad[e_PadTouch], "LabelTouch") + + UI_MAP_ELEMENT( m_controlLines[e_PadBack], "LineBack") + UI_MAP_ELEMENT( m_controlLines[e_PadLT], "LineLT") + UI_MAP_ELEMENT( m_controlLines[e_PadLB], "LineLB") + UI_MAP_ELEMENT( m_controlLines[e_PadDPadLeft], "LineDpadLeft") + UI_MAP_ELEMENT( m_controlLines[e_PadDPadRight], "LineDpadRight") + UI_MAP_ELEMENT( m_controlLines[e_PadDPadUp], "LineDpadUp") + UI_MAP_ELEMENT( m_controlLines[e_PadDPadDown], "LineDpadDown") + UI_MAP_ELEMENT( m_controlLines[e_PadLS_1], "LineL3") + UI_MAP_ELEMENT( m_controlLines[e_PadLS_2], "LineLeftStick") + UI_MAP_ELEMENT( m_controlLines[e_PadStart], "LineStart") + UI_MAP_ELEMENT( m_controlLines[e_PadRT], "LineRT") + UI_MAP_ELEMENT( m_controlLines[e_PadRB], "LineRB") + UI_MAP_ELEMENT( m_controlLines[e_PadY], "LineY") + UI_MAP_ELEMENT( m_controlLines[e_PadB], "LineB") + UI_MAP_ELEMENT( m_controlLines[e_PadA], "LineA") + UI_MAP_ELEMENT( m_controlLines[e_PadX], "LineX") + UI_MAP_ELEMENT( m_controlLines[e_PadRS_1], "LineR3") + UI_MAP_ELEMENT( m_controlLines[e_PadRS_2], "LineRightStick") + UI_MAP_ELEMENT( m_controlLines[e_PadTouch], "LineTouch") + + UI_MAP_ELEMENT( m_checkboxInvert, "InvertLook") + UI_MAP_ELEMENT( m_checkboxSouthpaw, "SouthPaw") + + UI_MAP_NAME( m_funcSetPlatform, L"SetPlatform") + UI_MAP_NAME( m_funcSetControllerLayout, L"SetControllerLayout") + UI_MAP_ELEMENT( m_labelVersion, "Version") + UI_END_MAP_ELEMENTS_AND_NAMES() +public: + UIScene_ControlsMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_ControlsMenu;} + + virtual void updateTooltips(); + virtual void tick(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + virtual void handleCheckboxToggled(F64 controlId, bool selected); + virtual void handlePress(F64 controlId, F64 childId); + virtual void handleFocusChange(F64 controlId, F64 childId); + +private: + void PositionText(int iPad,int iTextID, unsigned char ucAction); + void PositionTextDirect(int iPad,int iTextID, int iControlDetailsIndex, bool bShow); + void PositionAllText(int iPad); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_CraftingMenu.cpp b/Minecraft.Client/Common/UI/UIScene_CraftingMenu.cpp new file mode 100644 index 00000000..5b729069 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_CraftingMenu.cpp @@ -0,0 +1,769 @@ +#include "stdafx.h" +#include "UI.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "UIScene_CraftingMenu.h" + +#ifdef __PSVITA__ +#define GAME_CRAFTING_TOUCHUPDATE_TIMER_ID 0 +#define GAME_CRAFTING_TOUCHUPDATE_TIMER_TIME 100 +#endif + +UIScene_CraftingMenu::UIScene_CraftingMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + m_bIgnoreKeyPresses = false; + + CraftingPanelScreenInput* initData = (CraftingPanelScreenInput*)_initData; + m_iContainerType=initData->iContainerType; + m_pPlayer=initData->player; + m_bSplitscreen=initData->bSplitscreen; + + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + for(unsigned int i = 0; i < 4; ++i) m_labelIngredientsDesc[i].init(L""); + m_labelDescription.init(L""); + m_labelGroupName.init(L""); + m_labelItemName.init(L""); + m_labelInventory.init( app.GetString(IDS_INVENTORY) ); + m_labelIngredients.init( app.GetString(IDS_INGREDIENTS) ); + + if(m_iContainerType==RECIPE_TYPE_2x2) + { + m_menu = m_pPlayer->inventoryMenu; + m_iMenuInventoryStart = InventoryMenu::INV_SLOT_START; + m_iMenuHotBarStart = InventoryMenu::USE_ROW_SLOT_START; + } + else + { + CraftingMenu *menu = new CraftingMenu(m_pPlayer->inventory, m_pPlayer->level, initData->x, initData->y, initData->z); + Minecraft::GetInstance()->localplayers[m_iPad]->containerMenu = menu; + + m_menu = menu; + m_iMenuInventoryStart = CraftingMenu::INV_SLOT_START; + m_iMenuHotBarStart = CraftingMenu::USE_ROW_SLOT_START; + } + m_slotListInventory.addSlots(CRAFTING_INVENTORY_SLOT_START,CRAFTING_INVENTORY_SLOT_END - CRAFTING_INVENTORY_SLOT_START); + m_slotListHotBar.addSlots(CRAFTING_HOTBAR_SLOT_START, CRAFTING_HOTBAR_SLOT_END - CRAFTING_HOTBAR_SLOT_START); + +#if TO_BE_IMPLEMENTED + // if we are in splitscreen, then we need to figure out if we want to move this scene + if(m_bSplitscreen) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + } + + XuiElementSetShow(m_hGrid,TRUE); + XuiElementSetShow(m_hPanel,TRUE); +#endif + + if(m_iContainerType==RECIPE_TYPE_3x3) + { + m_iIngredientsMaxSlotC = m_iIngredients3x3SlotC; + m_pGroupA=(Recipy::_eGroupType *)&m_GroupTypeMapping9GridA; + m_pGroupTabA=(_eGroupTab *)&m_GroupTabBkgMapping3x3A; + m_iCraftablesMaxHSlotC=m_iMaxHSlot3x3C; + } + else + { + m_iIngredientsMaxSlotC = m_iIngredients2x2SlotC; + m_pGroupA=(Recipy::_eGroupType *)&m_GroupTypeMapping4GridA; + m_pGroupTabA=(_eGroupTab *)&m_GroupTabBkgMapping2x2A; + m_iCraftablesMaxHSlotC=m_iMaxHSlot2x2C; + } + +#if TO_BE_IMPLEMENTED + + + // display the first group tab + m_hTabGroupA[m_iGroupIndex].SetShow(TRUE); + + // store the slot 0 position + m_pHSlotsBrushImageControl[0]->GetPosition(&m_vSlot0Pos); + m_pHSlotsBrushImageControl[1]->GetPosition(&vec); + m_fSlotSize=vec.x-m_vSlot0Pos.x; + + // store the slot 0 highlight position + m_hHighlight.GetPosition(&m_vSlot0HighlightPos); + // Store the V slot position + m_hScrollBar2.GetPosition(&m_vSlot0V2ScrollPos); + m_hScrollBar3.GetPosition(&m_vSlot0V3ScrollPos); + + // get the position of the slot from the xui, and apply any offset needed + for(int i=0;iSetShow(FALSE); + } + + XuiElementSetShow(m_hGridInventory,FALSE); + + m_hScrollBar2.SetShow(FALSE); + m_hScrollBar3.SetShow(FALSE); + +#endif + + app.SetRichPresenceContext(m_iPad,CONTEXT_GAME_STATE_CRAFTING); + setGroupText(GetGroupNameText(m_pGroupA[m_iGroupIndex])); + + // Update the tutorial state + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if( pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + if(m_iContainerType==RECIPE_TYPE_2x2) + { + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_2x2Crafting_Menu, this); + } + else + { + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_3x3Crafting_Menu, this); + } + } + +#ifdef _TO_BE_IMPLEMENTED + XuiSetTimer(m_hObj,IGNORE_KEYPRESS_TIMERID,IGNORE_KEYPRESS_TIME); +#endif + + for(unsigned int i = 0; i < 4; ++i) + { + m_slotListIngredients[i].addSlot(CRAFTING_INGREDIENTS_DESCRIPTION_START + i); + } + m_slotListCraftingOutput.addSlot(CRAFTING_OUTPUT_SLOT_START); + m_slotListIngredientsLayout.addSlots(CRAFTING_INGREDIENTS_LAYOUT_START, m_iIngredientsMaxSlotC); + + // 3 Slot vertical scroll + m_slotListCrafting3VSlots[0].addSlot(CRAFTING_V_SLOT_START + 0); + m_slotListCrafting3VSlots[1].addSlot(CRAFTING_V_SLOT_START + 1); + m_slotListCrafting3VSlots[2].addSlot(CRAFTING_V_SLOT_START + 2); + + // 2 Slot vertical scroll + // 2 slot scroll has swapped order + m_slotListCrafting2VSlots[0].addSlot(CRAFTING_V_SLOT_START + 1); + m_slotListCrafting2VSlots[1].addSlot(CRAFTING_V_SLOT_START + 0); + + // 1 Slot scroll (for 480 mainly) + m_slotListCrafting1VSlots.addSlot(CRAFTING_V_SLOT_START); + + m_slotListCraftingHSlots.addSlots(CRAFTING_H_SLOT_START,m_iCraftablesMaxHSlotC); + + // Check which recipes are available with the resources we have + CheckRecipesAvailable(); + // reset the vertical slots + iVSlotIndexA[0]=CanBeMadeA[m_iCurrentSlotHIndex].iCount-1; + iVSlotIndexA[1]=0; + iVSlotIndexA[2]=1; + UpdateVerticalSlots(); + UpdateHighlight(); + + if(initData) delete initData; + + // in this scene, we override the press sound with our own for crafting success or fail + ui.OverrideSFX(m_iPad,ACTION_MENU_A,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_OK,true); +#ifdef __ORBIS__ + ui.OverrideSFX(m_iPad,ACTION_MENU_TOUCHPAD_PRESS,true); +#endif + ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT_SCROLL,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT_SCROLL,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_UP,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_DOWN,true); + + // 4J-PB - Must be after the CanBeMade list has been set up with CheckRecipesAvailable + UpdateTooltips(); + +#ifdef __PSVITA__ + // initialise vita touch controls with ids + for(unsigned int i = 0; i < ETouchInput_Count; ++i) + { + m_TouchInput[i].init(i); + } + ui.TouchBoxRebuild(this); +#endif +} + +void UIScene_CraftingMenu::handleDestroy() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if( pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + if(gameMode != NULL) gameMode->getTutorial()->changeTutorialState(m_previousTutorialState); + } + + // We need to make sure that we call closeContainer() anytime this menu is closed, even if it is forced to close by some other reason (like the player dying) + if(Minecraft::GetInstance()->localplayers[m_iPad] != NULL) Minecraft::GetInstance()->localplayers[m_iPad]->closeContainer(); + + ui.OverrideSFX(m_iPad,ACTION_MENU_A,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_OK,false); +#ifdef __ORBIS__ + ui.OverrideSFX(m_iPad,ACTION_MENU_TOUCHPAD_PRESS,false); +#endif + ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT_SCROLL,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT_SCROLL,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_UP,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_DOWN,false); +} + +EUIScene UIScene_CraftingMenu::getSceneType() +{ + if(m_iContainerType==RECIPE_TYPE_3x3) + { + return eUIScene_Crafting3x3Menu; + } + else + { + return eUIScene_Crafting2x2Menu; + } +} + +wstring UIScene_CraftingMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + m_bSplitscreen = true; + if(m_iContainerType==RECIPE_TYPE_3x3) + { + return L"Crafting3x3MenuSplit"; + } + else + { + return L"Crafting2x2MenuSplit"; + } + } + else + { + if(m_iContainerType==RECIPE_TYPE_3x3) + { + return L"Crafting3x3Menu"; + } + else + { + return L"Crafting2x2Menu"; + } + } +} + +#ifdef __PSVITA__ +UIControl* UIScene_CraftingMenu::GetMainPanel() +{ + return &m_controlMainPanel; +} + +void UIScene_CraftingMenu::handleTouchInput(unsigned int iPad, S32 x, S32 y, int iId, bool bPressed, bool bRepeat, bool bReleased) +{ + // perform action on release + if(bPressed) + { + if(iId == ETouchInput_CraftingHSlots) + { + m_iCraftingSlotTouchStartY = y; + } + } + else if(bRepeat) + { + if(iId == ETouchInput_CraftingHSlots) + { + if(y >= m_iCraftingSlotTouchStartY + m_TouchInput[ETouchInput_CraftingHSlots].getHeight()) // scroll list down + { + if(iVSlotIndexA[1]==(CanBeMadeA[m_iCurrentSlotHIndex].iCount-1)) + { + iVSlotIndexA[1]=0; + } + else + { + iVSlotIndexA[1]++; + } + ui.PlayUISFX(eSFX_Focus); + + UpdateVerticalSlots(); + UpdateHighlight(); + + m_iCraftingSlotTouchStartY = y; + } + else if(y <= m_iCraftingSlotTouchStartY - m_TouchInput[ETouchInput_CraftingHSlots].getHeight()) // scroll list up + { + if(iVSlotIndexA[1]==0) + { + iVSlotIndexA[1]=CanBeMadeA[m_iCurrentSlotHIndex].iCount-1; + } + else + { + iVSlotIndexA[1]--; + } + ui.PlayUISFX(eSFX_Focus); + + UpdateVerticalSlots(); + UpdateHighlight(); + + m_iCraftingSlotTouchStartY = y; + } + } + } + else if(bReleased) + { + if(iId >= ETouchInput_TouchPanel_0 && iId <= ETouchInput_TouchPanel_6) // Touch Change Group + { + m_iGroupIndex = iId; + // turn on the new group + showTabHighlight(m_iGroupIndex,true); + + m_iCurrentSlotHIndex=0; + m_iCurrentSlotVIndex=1; + CheckRecipesAvailable(); + // reset the vertical slots + iVSlotIndexA[0]=CanBeMadeA[m_iCurrentSlotHIndex].iCount-1; + iVSlotIndexA[1]=0; + iVSlotIndexA[2]=1; + ui.PlayUISFX(eSFX_Focus); + UpdateVerticalSlots(); + UpdateHighlight(); + setGroupText(GetGroupNameText(m_pGroupA[m_iGroupIndex])); + } + else if(iId == ETouchInput_CraftingHSlots) // Touch Change Slot + { + int iMaxHSlots = 0; + if(m_iContainerType==RECIPE_TYPE_3x3) + { + iMaxHSlots = m_iMaxHSlot3x3C; + } + else + { + iMaxHSlots = m_iMaxHSlot2x2C; + } + + int iNewSlot = (x - m_TouchInput[ETouchInput_CraftingHSlots].getXPos() - m_controlMainPanel.getXPos()) / m_TouchInput[ETouchInput_CraftingHSlots].getHeight(); + + int iOldHSlot=m_iCurrentSlotHIndex; + + m_iCurrentSlotHIndex = iNewSlot; + if(m_iCurrentSlotHIndex>=m_iCraftablesMaxHSlotC) m_iCurrentSlotHIndex=0; + m_iCurrentSlotVIndex=1; + // clear the indices + iVSlotIndexA[0]=CanBeMadeA[m_iCurrentSlotHIndex].iCount-1; + iVSlotIndexA[1]=0; + iVSlotIndexA[2]=1; + + UpdateVerticalSlots(); + UpdateHighlight(); + // re-enable the old hslot + if(CanBeMadeA[iOldHSlot].iCount>0) + { + setShowCraftHSlot(iOldHSlot,true); + } + ui.PlayUISFX(eSFX_Focus); + } + } +} + +void UIScene_CraftingMenu::handleTouchBoxRebuild() +{ + addTimer(GAME_CRAFTING_TOUCHUPDATE_TIMER_ID,GAME_CRAFTING_TOUCHUPDATE_TIMER_TIME); +} + +void UIScene_CraftingMenu::handleTimerComplete(int id) +{ + if(id == GAME_CRAFTING_TOUCHUPDATE_TIMER_ID) + { + // we cannot rebuild touch boxes in an iggy callback because it requires further iggy calls + GetMainPanel()->UpdateControl(); + ui.TouchBoxRebuild(this); + killTimer(GAME_CRAFTING_TOUCHUPDATE_TIMER_ID); + } +} +#endif + +void UIScene_CraftingMenu::handleReload() +{ + m_slotListInventory.addSlots(CRAFTING_INVENTORY_SLOT_START,CRAFTING_INVENTORY_SLOT_END - CRAFTING_INVENTORY_SLOT_START); + m_slotListHotBar.addSlots(CRAFTING_HOTBAR_SLOT_START, CRAFTING_HOTBAR_SLOT_END - CRAFTING_HOTBAR_SLOT_START); + + for(unsigned int i = 0; i < 4; ++i) + { + m_slotListIngredients[i].addSlot(CRAFTING_INGREDIENTS_DESCRIPTION_START + i); + } + m_slotListCraftingOutput.addSlot(CRAFTING_OUTPUT_SLOT_START); + m_slotListIngredientsLayout.addSlots(CRAFTING_INGREDIENTS_LAYOUT_START, m_iIngredientsMaxSlotC); + + // 3 Slot vertical scroll + m_slotListCrafting3VSlots[0].addSlot(CRAFTING_V_SLOT_START + 0); + m_slotListCrafting3VSlots[1].addSlot(CRAFTING_V_SLOT_START + 1); + m_slotListCrafting3VSlots[2].addSlot(CRAFTING_V_SLOT_START + 2); + + // 2 Slot vertical scroll + // 2 slot scroll has swapped order + m_slotListCrafting2VSlots[0].addSlot(CRAFTING_V_SLOT_START + 1); + m_slotListCrafting2VSlots[1].addSlot(CRAFTING_V_SLOT_START + 0); + + // 1 Slot scroll (for 480 mainly) + m_slotListCrafting1VSlots.addSlot(CRAFTING_V_SLOT_START); + + m_slotListCraftingHSlots.addSlots(CRAFTING_H_SLOT_START,m_iCraftablesMaxHSlotC); + + app.DebugPrintf(app.USER_SR,"Reloading MultiPanel\n"); + int temp = m_iDisplayDescription; + m_iDisplayDescription = m_iDisplayDescription==0?1:0; + UpdateMultiPanel(); + m_iDisplayDescription = temp; + UpdateMultiPanel(); + + app.DebugPrintf(app.USER_SR,"Reloading Highlight and scroll\n"); + + // reset the vertical slots + m_iCurrentSlotHIndex = 0; + m_iCurrentSlotVIndex = 1; + iVSlotIndexA[0]=CanBeMadeA[m_iCurrentSlotHIndex].iCount-1; + iVSlotIndexA[1]=0; + iVSlotIndexA[2]=1; + UpdateVerticalSlots(); + UpdateHighlight(); + + app.DebugPrintf(app.USER_SR,"Reloading tabs\n"); + showTabHighlight(0,false); + showTabHighlight(m_iGroupIndex,true); +} + +void UIScene_CraftingMenu::customDraw(IggyCustomDrawCallbackRegion *region) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localgameModes[m_iPad] == NULL) return; + + shared_ptr item = nullptr; + int slotId = -1; + float alpha = 1.0f; + bool decorations = true; + bool inventoryItem = false; + swscanf((wchar_t*)region->name,L"slot_%d",&slotId); + if (slotId == -1) + { + app.DebugPrintf("This is not the control we are looking for\n"); + } + else if(slotId >= CRAFTING_INVENTORY_SLOT_START && slotId < CRAFTING_INVENTORY_SLOT_END) + { + int iIndex = slotId - CRAFTING_INVENTORY_SLOT_START; + iIndex += m_iMenuInventoryStart; + Slot *slot = m_menu->getSlot(iIndex); + item = slot->getItem(); + inventoryItem = true; + } + else if(slotId >= CRAFTING_HOTBAR_SLOT_START && slotId < CRAFTING_HOTBAR_SLOT_END) + { + int iIndex = slotId - CRAFTING_HOTBAR_SLOT_START; + iIndex += m_iMenuHotBarStart; + Slot *slot = m_menu->getSlot(iIndex); + item = slot->getItem(); + inventoryItem = true; + } + else if(slotId >= CRAFTING_V_SLOT_START && slotId < CRAFTING_V_SLOT_END ) + { + decorations = false; + int iIndex = slotId - CRAFTING_V_SLOT_START; + if(m_vSlotsInfo[iIndex].show) + { + item = m_vSlotsInfo[iIndex].item; + alpha = ((float)m_vSlotsInfo[iIndex].alpha)/31.0f; + } + } + else if(slotId >= CRAFTING_H_SLOT_START && slotId < (CRAFTING_H_SLOT_START + m_iCraftablesMaxHSlotC) ) + { + decorations = false; + int iIndex = slotId - CRAFTING_H_SLOT_START; + if(m_hSlotsInfo[iIndex].show) + { + item = m_hSlotsInfo[iIndex].item; + alpha = ((float)m_hSlotsInfo[iIndex].alpha)/31.0f; + } + } + else if(slotId >= CRAFTING_INGREDIENTS_LAYOUT_START && slotId < (CRAFTING_INGREDIENTS_LAYOUT_START + m_iIngredientsMaxSlotC) ) + { + int iIndex = slotId - CRAFTING_INGREDIENTS_LAYOUT_START; + if(m_ingredientsSlotsInfo[iIndex].show) + { + item = m_ingredientsSlotsInfo[iIndex].item; + alpha = ((float)m_ingredientsSlotsInfo[iIndex].alpha)/31.0f; + } + } + else if(slotId >= CRAFTING_INGREDIENTS_DESCRIPTION_START && slotId < (CRAFTING_INGREDIENTS_DESCRIPTION_START + 4) ) + { + int iIndex = slotId - CRAFTING_INGREDIENTS_DESCRIPTION_START; + if(m_ingredientsInfo[iIndex].show) + { + item = m_ingredientsInfo[iIndex].item; + alpha = ((float)m_ingredientsInfo[iIndex].alpha)/31.0f; + } + } + else if(slotId == CRAFTING_OUTPUT_SLOT_START ) + { + if(m_craftingOutputSlotInfo.show) + { + item = m_craftingOutputSlotInfo.item; + alpha = ((float)m_craftingOutputSlotInfo.alpha)/31.0f; + } + } + + if(item != NULL) + { + if(!inventoryItem) + { + if( item->id == Item::clock_Id || item->id == Item::compass_Id ) + { + // 4J Stu - For clocks and compasses we set the aux value to a special one that signals we should use a default texture + // rather than the dynamic one for the player + item->setAuxValue(0xFF); + } + else if( (item->getAuxValue() & 0xFF) == 0xFF) + { + // 4J Stu - If the aux value is set to match any + item->setAuxValue(0); + } + } + customDrawSlotControl(region,m_iPad,item,alpha,item->isFoil(),decorations); + } +} + +int UIScene_CraftingMenu::getPad() +{ + return m_iPad; +} + +bool UIScene_CraftingMenu::allowRepeat(int key) +{ + switch(key) + { + // X is used to open this menu, so don't let it repeat + case ACTION_MENU_X: + return false; + } + return true; +} + +void UIScene_CraftingMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_InventoryMenu handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_OTHER_STICK_UP: + case ACTION_MENU_OTHER_STICK_DOWN: + sendInputToMovie(key,repeat,pressed,released); + break; + default: + if(pressed) + { + handled = handleKeyDown(m_iPad, key, repeat); + } + break; + }; +} + +void UIScene_CraftingMenu::hideAllHSlots() +{ + for(unsigned int iIndex = 0; iIndex < m_iMaxHSlotC; ++iIndex) + { + m_hSlotsInfo[iIndex].item = nullptr; + m_hSlotsInfo[iIndex].alpha = 31; + m_hSlotsInfo[iIndex].show = false; + } +} + +void UIScene_CraftingMenu::hideAllVSlots() +{ + for(unsigned int iIndex = 0; iIndex < m_iMaxDisplayedVSlotC; ++iIndex) + { + m_vSlotsInfo[iIndex].item = nullptr; + m_vSlotsInfo[iIndex].alpha = 31; + m_vSlotsInfo[iIndex].show = false; + } +} + +void UIScene_CraftingMenu::hideAllIngredientsSlots() +{ + for(int i=0;i item, unsigned int uiAlpha) +{ + m_hSlotsInfo[iIndex].item = item; + m_hSlotsInfo[iIndex].alpha = uiAlpha; + m_hSlotsInfo[iIndex].show = true; +} + +void UIScene_CraftingMenu::setCraftVSlotItem(int iPad, int iIndex, shared_ptr item, unsigned int uiAlpha) +{ + m_vSlotsInfo[iIndex].item = item; + m_vSlotsInfo[iIndex].alpha = uiAlpha; + m_vSlotsInfo[iIndex].show = true; +} + +void UIScene_CraftingMenu::setCraftingOutputSlotItem(int iPad, shared_ptr item) +{ + m_craftingOutputSlotInfo.item = item; + m_craftingOutputSlotInfo.alpha = 31; + m_craftingOutputSlotInfo.show = item != NULL; +} + +void UIScene_CraftingMenu::setCraftingOutputSlotRedBox(bool show) +{ + m_slotListCraftingOutput.showSlotRedBox(0,show); +} + +void UIScene_CraftingMenu::setIngredientSlotItem(int iPad, int index, shared_ptr item) +{ + m_ingredientsSlotsInfo[index].item = item; + m_ingredientsSlotsInfo[index].alpha = 31; + m_ingredientsSlotsInfo[index].show = item != NULL; +} + +void UIScene_CraftingMenu::setIngredientSlotRedBox(int index, bool show) +{ + m_slotListIngredientsLayout.showSlotRedBox(index,show); +} + +void UIScene_CraftingMenu::setIngredientDescriptionItem(int iPad, int index, shared_ptr item) +{ + m_ingredientsInfo[index].item = item; + m_ingredientsInfo[index].alpha = 31; + m_ingredientsInfo[index].show = item != NULL; + + IggyDataValue result; + IggyDataValue value[2]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = index; + + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = m_ingredientsInfo[index].show; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ) , m_funcShowIngredientSlot , 2 , value ); +} + +void UIScene_CraftingMenu::setIngredientDescriptionRedBox(int index, bool show) +{ + m_slotListIngredients[index].showSlotRedBox(0,show); +} + +void UIScene_CraftingMenu::setIngredientDescriptionText(int index, LPCWSTR text) +{ + m_labelIngredientsDesc[index].setLabel(text); +} + + +void UIScene_CraftingMenu::setShowCraftHSlot(int iIndex, bool show) +{ + m_hSlotsInfo[iIndex].show = show; +} + +void UIScene_CraftingMenu::showTabHighlight(int iIndex, bool show) +{ + if(show) + { + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = iIndex; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ) , m_funcSetActiveTab , 1 , value ); + } +} + +void UIScene_CraftingMenu::setGroupText(LPCWSTR text) +{ + m_labelGroupName.setLabel(text); +} + +void UIScene_CraftingMenu::setDescriptionText(LPCWSTR text) +{ + m_labelDescription.setLabel(text); +} + +void UIScene_CraftingMenu::setItemText(LPCWSTR text) +{ + m_labelItemName.setLabel(text); +} + +void UIScene_CraftingMenu::UpdateMultiPanel() +{ + // Call Iggy function to show the current panel + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = m_iDisplayDescription; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ) , m_funcShowPanelDisplay , 1 , value ); +} + +void UIScene_CraftingMenu::scrollDescriptionUp() +{ + // handled differently +} + +void UIScene_CraftingMenu::scrollDescriptionDown() +{ + // handled differently +} + +void UIScene_CraftingMenu::updateHighlightAndScrollPositions() +{ + { + IggyDataValue result; + IggyDataValue value[2]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = m_iCurrentSlotHIndex; + + int selectorType = 0; + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount == 2) + { + selectorType = 1; + } + else if( CanBeMadeA[m_iCurrentSlotHIndex].iCount > 2) + { + selectorType = 2; + } + + value[1].type = IGGY_DATATYPE_number; + value[1].number = selectorType; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ) , m_funcMoveSelector , 2 , value ); + } + + { + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = m_iCurrentSlotVIndex; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ) , m_funcSelectVerticalItem , 1 , value ); + } +} + +void UIScene_CraftingMenu::updateVSlotPositions(int iSlots, int i) +{ + // Not needed +} diff --git a/Minecraft.Client/Common/UI/UIScene_CraftingMenu.h b/Minecraft.Client/Common/UI/UIScene_CraftingMenu.h new file mode 100644 index 00000000..44a39d61 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_CraftingMenu.h @@ -0,0 +1,205 @@ +#pragma once + +#include "UIScene.h" +#include "UIControl_SlotList.h" +#include "UIControl_Label.h" +#include "IUIScene_CraftingMenu.h" + +#define CRAFTING_INVENTORY_SLOT_START 0 +#define CRAFTING_INVENTORY_SLOT_END (CRAFTING_INVENTORY_SLOT_START + 27) + +#define CRAFTING_HOTBAR_SLOT_START CRAFTING_INVENTORY_SLOT_END +#define CRAFTING_HOTBAR_SLOT_END (CRAFTING_HOTBAR_SLOT_START + 9) + +// Ingredients etc should go here +#define CRAFTING_INGREDIENTS_DESCRIPTION_START CRAFTING_HOTBAR_SLOT_END +#define CRAFTING_INGREDEINTS_DESCRIPTION_END (CRAFTING_INGREDIENTS_DESCRIPTION_START + 4) + +#define CRAFTING_OUTPUT_SLOT_START CRAFTING_INGREDEINTS_DESCRIPTION_END +#define CRAFTING_OUTPUT_SLOT_END (CRAFTING_OUTPUT_SLOT_START + 1) + +#define CRAFTING_INGREDIENTS_LAYOUT_START CRAFTING_OUTPUT_SLOT_END +#define CRAFTING_INGREDIENTS_LAYOUT_END (CRAFTING_INGREDIENTS_LAYOUT_START+9) + +#define CRAFTING_V_SLOT_START CRAFTING_INGREDIENTS_LAYOUT_END +#define CRAFTING_V_SLOT_END (CRAFTING_V_SLOT_START+3) + +// H slots should go last in the count as it's dependent on which size of crafting panel we have +#define CRAFTING_H_SLOT_START CRAFTING_V_SLOT_END + +class UIScene_CraftingMenu : public UIScene, public IUIScene_CraftingMenu +{ +private: + typedef struct _SlotInfo + { + shared_ptr item; + unsigned int alpha; + bool show; + + _SlotInfo() + { + item = nullptr; + alpha = 31; + show = true; + } + } SlotInfo; + + SlotInfo m_hSlotsInfo[m_iMaxHSlotC]; + SlotInfo m_vSlotsInfo[m_iMaxDisplayedVSlotC]; + SlotInfo m_ingredientsSlotsInfo[m_iIngredients3x3SlotC]; + SlotInfo m_craftingOutputSlotInfo; + SlotInfo m_ingredientsInfo[4]; + + AbstractContainerMenu *m_menu; + + int m_iMenuInventoryStart; + int m_iMenuHotBarStart; + +public: + UIScene_CraftingMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual void handleDestroy(); + + virtual EUIScene getSceneType(); + + virtual void customDraw(IggyCustomDrawCallbackRegion *region); + +#ifdef __PSVITA__ + virtual void handleTouchInput(unsigned int iPad, S32 x, S32 y, int iId, bool bPressed, bool bRepeat, bool bReleased); + virtual UIControl* GetMainPanel(); + virtual void handleTouchBoxRebuild(); + virtual void handleTimerComplete(int id); +#endif + +protected: + UIControl m_controlMainPanel; + UIControl m_control1Selector, m_control2Selector, m_control3Selector; + UIControl_SlotList m_slotListCraftingHSlots; + UIControl_SlotList m_slotListCrafting1VSlots, m_slotListCrafting2VSlots[2], m_slotListCrafting3VSlots[3]; + UIControl_SlotList m_slotListIngredientsLayout, m_slotListCraftingOutput; + UIControl_SlotList m_slotListIngredients[4]; + UIControl_SlotList m_slotListInventory, m_slotListHotBar; + UIControl_Label m_labelIngredientsDesc[4]; + UIControl_HTMLLabel m_labelDescription; + UIControl_Label m_labelGroupName, m_labelItemName, m_labelInventory, m_labelIngredients; + + IggyName m_funcMoveSelector, m_funcSelectVerticalItem, m_funcSetActiveTab; + IggyName m_funcShowPanelDisplay, m_funcShowIngredientSlot; + +#ifdef __PSVITA__ + enum ETouchInput + { + ETouchInput_TouchPanel_0, + ETouchInput_TouchPanel_1, + ETouchInput_TouchPanel_2, + ETouchInput_TouchPanel_3, + ETouchInput_TouchPanel_4, + ETouchInput_TouchPanel_5, + ETouchInput_TouchPanel_6, + ETouchInput_CraftingHSlots, + + ETouchInput_Count, + }; + UIControl_Touch m_TouchInput[ETouchInput_Count]; + S32 m_iCraftingSlotTouchStartY; +#endif + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_controlMainPanel, "MainPanel" ) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + UI_MAP_ELEMENT( m_slotListCraftingHSlots, "CraftingHSlots") + + UI_MAP_ELEMENT( m_control3Selector, "SlotSelector3" ) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_control3Selector) + UI_MAP_ELEMENT( m_slotListCrafting3VSlots[0], "Crafting3VSlot1") + UI_MAP_ELEMENT( m_slotListCrafting3VSlots[1], "Crafting3VSlot2") + UI_MAP_ELEMENT( m_slotListCrafting3VSlots[2], "Crafting3VSlot3") + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_ELEMENT( m_control2Selector, "SlotSelector2" ) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_control2Selector) + UI_MAP_ELEMENT( m_slotListCrafting2VSlots[0], "Crafting2VSlot1") + UI_MAP_ELEMENT( m_slotListCrafting2VSlots[1], "Crafting2VSlot2") + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_ELEMENT( m_control1Selector, "CraftingSelector" ) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_control1Selector) + UI_MAP_ELEMENT( m_slotListCrafting1VSlots, "Crafting1VSlot1") + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_ELEMENT( m_slotListIngredientsLayout, "IngredientsLayout") + UI_MAP_ELEMENT( m_slotListCraftingOutput, "CraftingOutput") + + UI_MAP_ELEMENT( m_slotListIngredients[0], "Ingredient1") + UI_MAP_ELEMENT( m_slotListIngredients[1], "Ingredient2") + UI_MAP_ELEMENT( m_slotListIngredients[2], "Ingredient3") + UI_MAP_ELEMENT( m_slotListIngredients[3], "Ingredient4") + + UI_MAP_ELEMENT( m_labelIngredientsDesc[0], "Ingredient1Desc") + UI_MAP_ELEMENT( m_labelIngredientsDesc[1], "Ingredient2Desc") + UI_MAP_ELEMENT( m_labelIngredientsDesc[2], "Ingredient3Desc") + UI_MAP_ELEMENT( m_labelIngredientsDesc[3], "Ingredient4Desc") + + UI_MAP_ELEMENT( m_labelIngredients, "IngredientsLabel") + + UI_MAP_ELEMENT( m_labelDescription, "DescriptionText") + + UI_MAP_ELEMENT( m_slotListInventory, "Inventory") + UI_MAP_ELEMENT( m_slotListHotBar, "HotBar") + + UI_MAP_ELEMENT( m_labelGroupName, "GroupName") + UI_MAP_ELEMENT( m_labelItemName, "ItemName") + UI_MAP_ELEMENT( m_labelInventory, "InventoryLabel") + + UI_MAP_NAME( m_funcMoveSelector, L"MoveSelector") + UI_MAP_NAME( m_funcSelectVerticalItem, L"SelectVerticalItem") + UI_MAP_NAME( m_funcSetActiveTab, L"SetActiveTab") + UI_MAP_NAME( m_funcShowPanelDisplay, L"showPanelDisplay") + UI_MAP_NAME( m_funcShowIngredientSlot, L"ShowIngredient") + +#ifdef __PSVITA__ + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_0], "TouchPanel_0" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_1], "TouchPanel_1" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_2], "TouchPanel_2" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_3], "TouchPanel_3" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_4], "TouchPanel_4" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_5], "TouchPanel_5" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_6], "TouchPanel_6" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_CraftingHSlots], "TouchPanel_CraftingHSlots" ) +#endif + + UI_END_MAP_CHILD_ELEMENTS() + UI_END_MAP_ELEMENTS_AND_NAMES() + + virtual wstring getMoviePath(); + virtual void handleReload(); + + virtual bool allowRepeat(int key); + void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +protected: + virtual int getPad(); + virtual void hideAllHSlots(); + virtual void hideAllVSlots(); + virtual void hideAllIngredientsSlots(); + virtual void setCraftHSlotItem(int iPad, int iIndex, shared_ptr item, unsigned int uiAlpha); + virtual void setCraftVSlotItem(int iPad, int iIndex, shared_ptr item, unsigned int uiAlpha); + virtual void setCraftingOutputSlotItem(int iPad, shared_ptr item); + virtual void setCraftingOutputSlotRedBox(bool show); + virtual void setIngredientSlotItem(int iPad, int index, shared_ptr item); + virtual void setIngredientSlotRedBox(int index, bool show); + virtual void setIngredientDescriptionItem(int iPad, int index, shared_ptr item); + virtual void setIngredientDescriptionRedBox(int index, bool show); + virtual void setIngredientDescriptionText(int index, LPCWSTR text); + virtual void setShowCraftHSlot(int iIndex, bool show); + virtual void showTabHighlight(int iIndex, bool show); + virtual void setGroupText(LPCWSTR text); + virtual void setDescriptionText(LPCWSTR text); + virtual void setItemText(LPCWSTR text); + virtual void scrollDescriptionUp(); + virtual void scrollDescriptionDown(); + virtual void updateHighlightAndScrollPositions(); + virtual void updateVSlotPositions(int iSlots, int i); + + virtual void UpdateMultiPanel(); +}; diff --git a/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.cpp b/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.cpp new file mode 100644 index 00000000..fa41909d --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.cpp @@ -0,0 +1,1457 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_CreateWorldMenu.h" +#include "..\..\MinecraftServer.h" +#include "..\..\Minecraft.h" +#include "..\..\Options.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\TexturePack.h" +#include "..\..\..\Minecraft.World\LevelSettings.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\BiomeSource.h" +#include "..\..\..\Minecraft.World\IntCache.h" +#include "..\..\..\Minecraft.World\LevelType.h" +#include "..\..\DLCTexturePack.h" + +#ifdef __PSVITA__ +#include "PSVita\Network\SQRNetworkManager_AdHoc_Vita.h" +#endif + +#ifdef _WINDOWS64 + +#include +#include "Xbox\Resource.h" +#endif + +#define GAME_CREATE_ONLINE_TIMER_ID 0 +#define GAME_CREATE_ONLINE_TIMER_TIME 100 + +int UIScene_CreateWorldMenu::m_iDifficultyTitleSettingA[4]= +{ + IDS_DIFFICULTY_TITLE_PEACEFUL, + IDS_DIFFICULTY_TITLE_EASY, + IDS_DIFFICULTY_TITLE_NORMAL, + IDS_DIFFICULTY_TITLE_HARD +}; + +UIScene_CreateWorldMenu::UIScene_CreateWorldMenu(int iPad, void *initData, UILayer *parentLayer) : IUIScene_StartGame(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_worldName = app.GetString(IDS_DEFAULT_WORLD_NAME); + m_seed = L""; + + m_iPad=iPad; + + m_labelWorldName.init(app.GetString(IDS_WORLD_NAME)); + m_labelSeed.init(app.GetString(IDS_CREATE_NEW_WORLD_SEED)); + m_labelRandomSeed.init(app.GetString(IDS_CREATE_NEW_WORLD_RANDOM_SEED)); + + m_editWorldName.init(m_worldName, eControl_EditWorldName); + m_editSeed.init(L"", eControl_EditSeed); + + m_buttonGamemode.init(app.GetString(IDS_GAMEMODE_SURVIVAL),eControl_GameModeToggle); + m_buttonMoreOptions.init(app.GetString(IDS_MORE_OPTIONS),eControl_MoreOptions); + m_buttonCreateWorld.init(app.GetString(IDS_CREATE_NEW_WORLD),eControl_NewWorld); + + m_texturePackList.init(app.GetString(IDS_DLC_MENU_TEXTUREPACKS), eControl_TexturePackList); + + m_labelTexturePackName.init(L""); + m_labelTexturePackDescription.init(L""); + + WCHAR TempString[256]; + swprintf( (WCHAR *)TempString, 256, L"%ls: %ls", app.GetString( IDS_SLIDER_DIFFICULTY ),app.GetString(m_iDifficultyTitleSettingA[app.GetGameSettings(m_iPad,eGameSetting_Difficulty)])); + m_sliderDifficulty.init(TempString,eControl_Difficulty,0,3,app.GetGameSettings(m_iPad,eGameSetting_Difficulty)); + + m_MoreOptionsParams.bGenerateOptions=TRUE; + m_MoreOptionsParams.bStructures=TRUE; + m_MoreOptionsParams.bFlatWorld=FALSE; + m_MoreOptionsParams.bBonusChest=FALSE; + m_MoreOptionsParams.bPVP = TRUE; + m_MoreOptionsParams.bTrust = TRUE; + m_MoreOptionsParams.bFireSpreads = TRUE; + m_MoreOptionsParams.bHostPrivileges = FALSE; + m_MoreOptionsParams.bTNT = TRUE; + m_MoreOptionsParams.iPad = iPad; + + m_bGameModeSurvival=true; + m_pDLCPack = NULL; + m_bRebuildTouchBoxes = false; + + m_bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); + // 4J-PB - read the settings for the online flag. We'll only save this setting if the user changed it. + bool bGameSetting_Online=(app.GetGameSettings(m_iPad,eGameSetting_Online)!=0); + m_MoreOptionsParams.bOnlineSettingChangedBySystem=false; + + // 4J-PB - Removing this so that we can attempt to create an online game on PS3 when we are a restricted child account + // It'll fail when we choose create, but this matches the behaviour of load game, and lets the player know why they can't play online, + // instead of just greying out the online setting in the More Options + // #ifdef __PS3__ + // if(ProfileManager.IsSignedInLive( m_iPad )) + // { + // ProfileManager.GetChatAndContentRestrictions(m_iPad,true,&bChatRestricted,&bContentRestricted,NULL); + // } + // #endif + + // Set the text for friends of friends, and default to on + if( m_bMultiplayerAllowed ) + { + m_MoreOptionsParams.bOnlineGame = bGameSetting_Online?TRUE:FALSE; + if(bGameSetting_Online) + { + m_MoreOptionsParams.bInviteOnly = (app.GetGameSettings(m_iPad,eGameSetting_InviteOnly)!=0)?TRUE:FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = (app.GetGameSettings(m_iPad,eGameSetting_FriendsOfFriends)!=0)?TRUE:FALSE; + } + else + { + m_MoreOptionsParams.bInviteOnly = FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = FALSE; + } + } + else + { + m_MoreOptionsParams.bOnlineGame = FALSE; + m_MoreOptionsParams.bInviteOnly = FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = FALSE; + if(bGameSetting_Online) + { + // The profile settings say Online, but either the player is offline, or they are not allowed to play online + m_MoreOptionsParams.bOnlineSettingChangedBySystem=true; + } + } + +#if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 + if(getSceneResolution() == eSceneResolution_1080) + { + // Set up online game checkbox + bool bOnlineGame = m_MoreOptionsParams.bOnlineGame; + m_checkboxOnline.SetEnable(true); + + // 4J-PB - to stop an offline game being able to select the online flag + if(ProfileManager.IsSignedInLive(m_iPad) == false) + { + m_checkboxOnline.SetEnable(false); + } + + if(m_MoreOptionsParams.bOnlineSettingChangedBySystem) + { + m_checkboxOnline.SetEnable(false); + bOnlineGame = false; + } + + m_checkboxOnline.init(app.GetString(IDS_ONLINE_GAME), eControl_OnlineGame, bOnlineGame); + } +#endif + + addTimer( GAME_CREATE_ONLINE_TIMER_ID,GAME_CREATE_ONLINE_TIMER_TIME ); +#if TO_BE_IMPLEMENTED + XuiSetTimer(m_hObj,CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID,CHECKFORAVAILABLETEXTUREPACKS_TIMER_TIME); +#endif + + TelemetryManager->RecordMenuShown(m_iPad, eUIScene_CreateWorldMenu, 0); + + // block input if we're waiting for DLC to install, and wipe the saves list. The end of dlc mounting custom message will fill the list again + if(app.StartInstallDLCProcess(m_iPad)==true) + { + // not doing a mount, so enable input + m_bIgnoreInput=true; + } + else + { + m_bIgnoreInput = false; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + int texturePacksCount = pMinecraft->skins->getTexturePackCount(); + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + + DWORD dwImageBytes; + PBYTE pbImageData = tp->getPackIcon(dwImageBytes); + + if(dwImageBytes > 0 && pbImageData) + { + wchar_t imageName[64]; + swprintf(imageName,64,L"tpack%08x",tp->getId()); + registerSubstitutionTexture(imageName, pbImageData, dwImageBytes); + m_texturePackList.addPack(i,imageName); + } + } + +#if TO_BE_IMPLEMENTED + // 4J-PB - there may be texture packs we don't have, so use the info from TMS for this + + DLC_INFO *pDLCInfo=NULL; + + // first pass - look to see if there are any that are not in the list + bool bTexturePackAlreadyListed; + bool bNeedToGetTPD=false; + + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + bTexturePackAlreadyListed=false; + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + if(pDLCInfo->iConfig==tp->getDLCParentPackId()) + { + bTexturePackAlreadyListed=true; + } + } + if(bTexturePackAlreadyListed==false) + { + // some missing + bNeedToGetTPD=true; + + m_iTexturePacksNotInstalled++; + } + } + + if(bNeedToGetTPD==true) + { + // add a TMS request for them + app.DebugPrintf("+++ Adding TMSPP request for texture pack data\n"); + app.AddTMSPPFileTypeRequest(e_DLC_TexturePackData); + m_iConfigA= new int [m_iTexturePacksNotInstalled]; + m_iTexturePacksNotInstalled=0; + + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + bTexturePackAlreadyListed=false; + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + if(pDLCInfo->iConfig==tp->getDLCParentPackId()) + { + bTexturePackAlreadyListed=true; + } + } + if(bTexturePackAlreadyListed==false) + { + m_iConfigA[m_iTexturePacksNotInstalled++]=pDLCInfo->iConfig; + } + } + } +#endif + + UpdateTexturePackDescription(m_currentTexturePackIndex); + + + m_texturePackList.selectSlot(m_currentTexturePackIndex); + } +} + +UIScene_CreateWorldMenu::~UIScene_CreateWorldMenu() +{ +} + +void UIScene_CreateWorldMenu::updateTooltips() +{ + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_CreateWorldMenu::updateComponents() +{ + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); +} + +wstring UIScene_CreateWorldMenu::getMoviePath() +{ + return L"CreateWorldMenu"; +} + +UIControl* UIScene_CreateWorldMenu::GetMainPanel() +{ + return &m_controlMainPanel; +} + +void UIScene_CreateWorldMenu::handleDestroy() +{ +#ifdef __PSVITA__ + app.DebugPrintf("missing InputManager.DestroyKeyboard on Vita !!!!!!\n"); +#endif + + // shut down the keyboard if it is displayed +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO) + InputManager.DestroyKeyboard(); +#endif +} + +void UIScene_CreateWorldMenu::tick() +{ + UIScene::tick(); + + if(m_iSetTexturePackDescription >= 0 ) + { + UpdateTexturePackDescription( m_iSetTexturePackDescription ); + m_iSetTexturePackDescription = -1; + } + if(m_bShowTexturePackDescription) + { + slideLeft(); + m_texturePackDescDisplayed = true; + + m_bShowTexturePackDescription = false; + } + +#ifdef __ORBIS__ + // check the status of the PSPlus common dialog + switch (sceNpCommerceDialogUpdateStatus()) + { + case SCE_COMMON_DIALOG_STATUS_FINISHED: + { + SceNpCommerceDialogResult Result; + sceNpCommerceDialogGetResult(&Result); + sceNpCommerceDialogTerminate(); + + if(Result.authorized) + { + ProfileManager.PsPlusUpdate(ProfileManager.GetPrimaryPad(), &Result); + // they just became a PSPlus member + checkStateAndStartGame(); + } + else + { + // continue offline? + UINT uiIDA[1]; + uiIDA[0]=IDS_PRO_NOTONLINE_DECLINE; + + // Give the player a warning about the texture pack missing + ui.RequestMessageBox(IDS_PLAY_OFFLINE,IDS_NO_PLAYSTATIONPLUS, uiIDA, 1, ProfileManager.GetPrimaryPad(),&UIScene_CreateWorldMenu::ContinueOffline,dynamic_cast(this),app.GetStringTable(), 0, 0, false); + } + } + break; + default: + break; + } +#endif +} + +#ifdef __ORBIS__ +int UIScene_CreateWorldMenu::ContinueOffline(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_CreateWorldMenu* pClass = (UIScene_CreateWorldMenu*)pParam; + + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultAccept) + { + pClass->m_MoreOptionsParams.bOnlineGame=false; + pClass->checkStateAndStartGame(); + } + return 0; +} + +#endif + +void UIScene_CreateWorldMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if(m_bIgnoreInput) return; + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + navigateBack(); + handled = true; + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + + // 4J-JEV: Inform user why their game must be offline. +#if defined _XBOX_ONE + if ( pressed && controlHasFocus(m_checkboxOnline.getId()) && !m_checkboxOnline.IsEnabled() ) + { + UINT uiIDA[1] = { IDS_CONFIRM_OK }; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + } +#endif + + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + case ACTION_MENU_OTHER_STICK_UP: + case ACTION_MENU_OTHER_STICK_DOWN: + sendInputToMovie(key, repeat, pressed, released); + +#if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 + if(getSceneResolution() == eSceneResolution_1080) + { + bool bOnlineGame = m_checkboxOnline.IsChecked(); + if (m_MoreOptionsParams.bOnlineGame != bOnlineGame) + { + m_MoreOptionsParams.bOnlineGame = bOnlineGame; + + if (!m_MoreOptionsParams.bOnlineGame) + { + m_MoreOptionsParams.bInviteOnly = false; + m_MoreOptionsParams.bAllowFriendsOfFriends = false; + } + } + } +#endif + + handled = true; + break; + } +} + +void UIScene_CreateWorldMenu::handlePress(F64 controlId, F64 childId) +{ + if(m_bIgnoreInput) return; + + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + switch((int)controlId) + { + case eControl_EditWorldName: + { + m_bIgnoreInput=true; + InputManager.RequestKeyboard(app.GetString(IDS_CREATE_NEW_WORLD),m_editWorldName.getLabel(),(DWORD)0,25,&UIScene_CreateWorldMenu::KeyboardCompleteWorldNameCallback,this,C_4JInput::EKeyboardMode_Default); + } + break; + case eControl_EditSeed: + { + m_bIgnoreInput=true; +#ifdef __PS3__ + int language = XGetLanguage(); + switch(language) + { + case XC_LANGUAGE_JAPANESE: + case XC_LANGUAGE_KOREAN: + case XC_LANGUAGE_TCHINESE: + InputManager.RequestKeyboard(app.GetString(IDS_CREATE_NEW_WORLD_SEED),m_editSeed.getLabel(),(DWORD)0,60,&UIScene_CreateWorldMenu::KeyboardCompleteSeedCallback,this,C_4JInput::EKeyboardMode_Default); + break; + default: + // 4J Stu - Use a different keyboard for non-asian languages so we don't have prediction on + InputManager.RequestKeyboard(app.GetString(IDS_CREATE_NEW_WORLD_SEED),m_editSeed.getLabel(),(DWORD)0,60,&UIScene_CreateWorldMenu::KeyboardCompleteSeedCallback,this,C_4JInput::EKeyboardMode_Alphabet_Extended); + break; + } +#else + InputManager.RequestKeyboard(app.GetString(IDS_CREATE_NEW_WORLD_SEED),m_editSeed.getLabel(),(DWORD)0,60,&UIScene_CreateWorldMenu::KeyboardCompleteSeedCallback,this,C_4JInput::EKeyboardMode_Default); +#endif + } + break; + case eControl_GameModeToggle: + if(m_bGameModeSurvival) + { + m_buttonGamemode.setLabel(app.GetString(IDS_GAMEMODE_CREATIVE)); + m_bGameModeSurvival=false; + } + else + { + m_buttonGamemode.setLabel(app.GetString(IDS_GAMEMODE_SURVIVAL)); + m_bGameModeSurvival=true; + } + break; + case eControl_MoreOptions: + ui.NavigateToScene(m_iPad, eUIScene_LaunchMoreOptionsMenu, &m_MoreOptionsParams); + break; + case eControl_TexturePackList: + { + UpdateCurrentTexturePack((int)childId); + } + break; + case eControl_NewWorld: + { +#ifdef _DURANGO + if(m_MoreOptionsParams.bOnlineGame) + { + m_bIgnoreInput = true; + ProfileManager.CheckMultiplayerPrivileges(m_iPad, true, &checkPrivilegeCallback, this); + } + else +#endif + { + StartSharedLaunchFlow(); + } + break; + } + } +} + +#ifdef _DURANGO +void UIScene_CreateWorldMenu::checkPrivilegeCallback(LPVOID lpParam, bool hasPrivilege, int iPad) +{ + UIScene_CreateWorldMenu* pClass = (UIScene_CreateWorldMenu*)lpParam; + + if(hasPrivilege) + { + pClass->StartSharedLaunchFlow(); + } + else + { + pClass->m_bIgnoreInput = false; + } +} +#endif + +void UIScene_CreateWorldMenu::StartSharedLaunchFlow() +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + // Check if we need to upsell the texture pack + if(m_MoreOptionsParams.dwTexturePack!=0) + { + // texture pack hasn't been set yet, so check what it will be + TexturePack *pTexturePack = pMinecraft->skins->getTexturePackById(m_MoreOptionsParams.dwTexturePack); + + if(pTexturePack==NULL) + { +#if TO_BE_IMPLEMENTED + // They've selected a texture pack they don't have yet + // upsell + CXuiCtrl4JList::LIST_ITEM_INFO ListItem; + // get the current index of the list, and then get the data + ListItem=m_pTexturePacksList->GetData(m_currentTexturePackIndex); + + + // upsell the texture pack + // tell sentient about the upsell of the full version of the skin pack + ULONGLONG ullOfferID_Full; + app.GetDLCFullOfferIDForPackID(m_MoreOptionsParams.dwTexturePack,&ullOfferID_Full); + + TelemetryManager->RecordUpsellPresented(ProfileManager.GetPrimaryPad(), eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); +#endif + + UINT uiIDA[2]; + + uiIDA[0]=IDS_TEXTUREPACK_FULLVERSION; + //uiIDA[1]=IDS_TEXTURE_PACK_TRIALVERSION; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + // Give the player a warning about the texture pack missing + ui.RequestMessageBox(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&TexturePackDialogReturned,this,app.GetStringTable(),NULL,0,false); + return; + } + } + m_bIgnoreInput = true; + + // if the profile data has been changed, then force a profile write (we save the online/invite/friends of friends settings) + // It seems we're allowed to break the 5 minute rule if it's the result of a user action + // check the checkboxes + + // Only save the online setting if the user changed it - we may change it because we're offline, but don't want that saved + if(!m_MoreOptionsParams.bOnlineSettingChangedBySystem) + { + app.SetGameSettings(m_iPad,eGameSetting_Online,m_MoreOptionsParams.bOnlineGame?1:0); + } + app.SetGameSettings(m_iPad,eGameSetting_InviteOnly,m_MoreOptionsParams.bInviteOnly?1:0); + app.SetGameSettings(m_iPad,eGameSetting_FriendsOfFriends,m_MoreOptionsParams.bAllowFriendsOfFriends?1:0); + + app.CheckGameSettingsChanged(true,m_iPad); + + // Check that we have the rights to use a texture pack we have selected. + if(m_MoreOptionsParams.dwTexturePack!=0) + { + // texture pack hasn't been set yet, so check what it will be + TexturePack *pTexturePack = pMinecraft->skins->getTexturePackById(m_MoreOptionsParams.dwTexturePack); + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)pTexturePack; + m_pDLCPack=pDLCTexPack->getDLCInfoParentPack(); + + // do we have a license? + if(m_pDLCPack && !m_pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) + { + // no + + // We need to allow people to use a trial texture pack if they are offline - we only need them online if they want to buy it. + + /* + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + + if(!ProfileManager.IsSignedInLive(m_iPad)) + { + // need to be signed in to live + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); + m_bIgnoreInput = false; + return; + } + else */ + { + // upsell +#ifdef _XBOX + DLC_INFO *pDLCInfo = app.GetDLCInfoForTrialOfferID(m_pDLCPack->getPurchaseOfferId()); + ULONGLONG ullOfferID_Full; + + if(pDLCInfo!=NULL) + { + ullOfferID_Full=pDLCInfo->ullOfferID_Full; + } + else + { + ullOfferID_Full=pTexturePack->getDLCPack()->getPurchaseOfferId(); + } + + // tell sentient about the upsell of the full version of the texture pack + TelemetryManager->RecordUpsellPresented(m_iPad, eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); +#endif + +#if defined(_DURANGO) || defined(_WINDOWS64) + // trial pack warning + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_USING_TRIAL_TEXUREPACK_WARNING, uiIDA, 1, m_iPad,&TrialTexturePackWarningReturned,this,app.GetStringTable(),NULL,0,false); +#elif defined __PS3__ || defined __ORBIS__ || defined(__PSVITA__) + // trial pack warning + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + ui.RequestMessageBox(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_USING_TRIAL_TEXUREPACK_WARNING, uiIDA, 2, m_iPad,&TrialTexturePackWarningReturned,this,app.GetStringTable(),NULL,0,false); +#endif + +#if defined _XBOX_ONE || defined __ORBIS__ + StorageManager.SetSaveDisabled(true); +#endif + return; + } + } + } +#if defined _XBOX_ONE || defined __ORBIS__ + app.SetGameHostOption(eGameHostOption_DisableSaving, m_MoreOptionsParams.bDisableSaving?1:0); + StorageManager.SetSaveDisabled(m_MoreOptionsParams.bDisableSaving); +#endif + checkStateAndStartGame(); +} + +void UIScene_CreateWorldMenu::handleSliderMove(F64 sliderId, F64 currentValue) +{ + WCHAR TempString[256]; + int value = (int)currentValue; + switch((int)sliderId) + { + case eControl_Difficulty: + m_sliderDifficulty.handleSliderMove(value); + + app.SetGameSettings(m_iPad,eGameSetting_Difficulty,value); + swprintf( (WCHAR *)TempString, 256, L"%ls: %ls", app.GetString( IDS_SLIDER_DIFFICULTY ),app.GetString(m_iDifficultyTitleSettingA[value])); + m_sliderDifficulty.setLabel(TempString); + break; + } +} + +void UIScene_CreateWorldMenu::handleTimerComplete(int id) +{ +#ifdef __PSVITA__ + // we cannot rebuild touch boxes in an iggy callback because it requires further iggy calls + if(m_bRebuildTouchBoxes) + { + GetMainPanel()->UpdateControl(); + ui.TouchBoxRebuild(this); + m_bRebuildTouchBoxes = false; + } +#endif + + switch(id) + { + case GAME_CREATE_ONLINE_TIMER_ID: + { + bool bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); + + if(bMultiplayerAllowed != m_bMultiplayerAllowed) + { + if( bMultiplayerAllowed ) + { + bool bGameSetting_Online=(app.GetGameSettings(m_iPad,eGameSetting_Online)!=0); + m_MoreOptionsParams.bOnlineGame = bGameSetting_Online?TRUE:FALSE; + if(bGameSetting_Online) + { + m_MoreOptionsParams.bInviteOnly = (app.GetGameSettings(m_iPad,eGameSetting_InviteOnly)!=0)?TRUE:FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = (app.GetGameSettings(m_iPad,eGameSetting_FriendsOfFriends)!=0)?TRUE:FALSE; + } + else + { + m_MoreOptionsParams.bInviteOnly = FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = FALSE; + } + } + else + { + m_MoreOptionsParams.bOnlineGame = FALSE; + m_MoreOptionsParams.bInviteOnly = FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = FALSE; + } + +#if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 + if(getSceneResolution() == eSceneResolution_1080) + { + m_checkboxOnline.SetEnable(bMultiplayerAllowed); + m_checkboxOnline.setChecked(m_MoreOptionsParams.bOnlineGame); + } +#endif + m_bMultiplayerAllowed = bMultiplayerAllowed; + } + } + break; + // 4J-PB - Only Xbox will not have trial DLC patched into the game +#ifdef _XBOX + case CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID: + { + // also check for any new texture packs info being available + // for each item in the mem list, check it's in the data list + + CXuiCtrl4JList::LIST_ITEM_INFO ListInfo; + // for each iConfig, check if the data is available, and add it to the List, then remove it from the viConfig + for(int i=0;i 0 && pbData) + { + DWORD dwImageBytes=0; + PBYTE pbImageData=NULL; + + app.GetFileFromTPD(eTPDFileType_Icon,pbData,dwBytes,&pbImageData,&dwImageBytes ); + ListInfo.fEnabled = TRUE; + ListInfo.iData = m_iConfigA[i]; + HRESULT hr=XuiCreateTextureBrushFromMemory(pbImageData,dwImageBytes,&ListInfo.hXuiBrush); + app.DebugPrintf("Adding texturepack %d from TPD\n",m_iConfigA[i]); + + m_pTexturePacksList->AddData(ListInfo); + + m_iConfigA[i]=-1; + } + } + } + } + break; +#endif + }; +} + +void UIScene_CreateWorldMenu::handleGainFocus(bool navBack) +{ + if(navBack) + { +#if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 + if(getSceneResolution() == eSceneResolution_1080) + { + m_checkboxOnline.setChecked(m_MoreOptionsParams.bOnlineGame); + } + m_editSeed.setLabel(m_MoreOptionsParams.seed); +#endif + } +} + +int UIScene_CreateWorldMenu::KeyboardCompleteWorldNameCallback(LPVOID lpParam,bool bRes) +{ + UIScene_CreateWorldMenu *pClass=(UIScene_CreateWorldMenu *)lpParam; + pClass->m_bIgnoreInput=false; + // 4J HEG - No reason to set value if keyboard was cancelled + if (bRes) + { + uint16_t pchText[128]; + ZeroMemory(pchText, 128 * sizeof(uint16_t) ); + InputManager.GetText(pchText); + + if(pchText[0]!=0) + { + pClass->m_editWorldName.setLabel((wchar_t *)pchText); + pClass->m_worldName = (wchar_t *)pchText; + } + + pClass->m_buttonCreateWorld.setEnable( !pClass->m_worldName.empty() ); + } + return 0; +} + +int UIScene_CreateWorldMenu::KeyboardCompleteSeedCallback(LPVOID lpParam,bool bRes) +{ + UIScene_CreateWorldMenu *pClass=(UIScene_CreateWorldMenu *)lpParam; + pClass->m_bIgnoreInput=false; + // 4J HEG - No reason to set value if keyboard was cancelled + if (bRes) + { +#ifdef __PSVITA__ + //CD - Changed to 2048 [SCE_IME_MAX_TEXT_LENGTH] + uint16_t pchText[2048]; + ZeroMemory(pchText, 2048 * sizeof(uint16_t) ); +#else + uint16_t pchText[128]; + ZeroMemory(pchText, 128 * sizeof(uint16_t) ); +#endif + InputManager.GetText(pchText); + pClass->m_editSeed.setLabel((wchar_t *)pchText); + pClass->m_MoreOptionsParams.seed = (wchar_t *)pchText; + } + return 0; +} + +void UIScene_CreateWorldMenu::checkStateAndStartGame() +{ + int primaryPad = ProfileManager.GetPrimaryPad(); + bool isSignedInLive = true; + bool isOnlineGame = m_MoreOptionsParams.bOnlineGame; + int iPadNotSignedInLive = -1; + bool isLocalMultiplayerAvailable = app.IsLocalMultiplayerAvailable(); + + for(unsigned int i = 0; i < XUSER_MAX_COUNT; i++) + { + if (ProfileManager.IsSignedIn(i) && (i == primaryPad || isLocalMultiplayerAvailable)) + { + if (isSignedInLive && !ProfileManager.IsSignedInLive(i)) + { + // Record the first non signed in live pad + iPadNotSignedInLive = i; + } + + isSignedInLive = isSignedInLive && ProfileManager.IsSignedInLive(i); + } + } + + // If this is an online game but not all players are signed in to Live, stop! + if (isOnlineGame && !isSignedInLive) + { +#ifdef __ORBIS__ + assert(iPadNotSignedInLive != -1); + + // Check if PSN is unavailable because of age restriction + int npAvailability = ProfileManager.getNPAvailability(iPadNotSignedInLive); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + m_bIgnoreInput = false; + // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive if the npAvailability isn't SCE_OK + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive, NULL, NULL, app.GetStringTable()); + } + else + { + m_bIgnoreInput = true; + UINT uiIDA[2]; + uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1] = IDS_CANCEL; + ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPadNotSignedInLive, &UIScene_CreateWorldMenu::MustSignInReturnedPSN, this, app.GetStringTable(), NULL, 0, false); + } + return; +/* 4J-PB - Add this after release +#elif defined __PSVITA__ + m_bIgnoreInput=false; + // Determine why they're not "signed in live" + if (ProfileManager.IsSignedInPSN(ProfileManager.GetPrimaryPad())) + { + // Signed in to PSN but not connected (no internet access) + UINT uiIDA[1]; + uiIDA[0] = IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_PRO_CURRENTLY_NOT_ONLINE_TITLE, IDS_PRO_PSNOFFLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), NULL,NULL, app.GetStringTable()); + } + else + { + // Not signed in to PSN + UINT uiIDA[1]; + uiIDA[0] = IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), NULL,NULL, app.GetStringTable()); + return; + }*/ +#else + m_bIgnoreInput=false; + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(),NULL,0,false); + return; +#endif + } + +#ifdef __ORBIS__ + + bool bPlayStationPlus = true; + int iPadWithNoPlaystationPlus=0; + if(isOnlineGame && isSignedInLive) + { + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if(ProfileManager.IsSignedIn(i) && (i == primaryPad || isLocalMultiplayerAvailable)) + { + if(ProfileManager.HasPlayStationPlus(i)==false) + { + bPlayStationPlus=false; + iPadWithNoPlaystationPlus=i; + break; + } + } + } + + if(bPlayStationPlus==false) + { + m_bIgnoreInput=false; + + // 4J-PB - we're not allowed to show the text Playstation Plus - have to call the upsell all the time! + // upsell psplus + int32_t iResult=sceNpCommerceDialogInitialize(); + + SceNpCommerceDialogParam param; + sceNpCommerceDialogParamInitialize(¶m); + param.mode=SCE_NP_COMMERCE_DIALOG_MODE_PLUS; + param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY; + param.userId = ProfileManager.getUserID(iPadWithNoPlaystationPlus); + + iResult=sceNpCommerceDialogOpen(¶m); + +// UINT uiIDA[2]; +// uiIDA[0]=IDS_PLAY_OFFLINE; +// uiIDA[1]=IDS_PLAYSTATIONPLUS_SIGNUP; +// ui.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_PLAYSTATIONPLUS, uiIDA,2,ProfileManager.GetPrimaryPad(),&UIScene_CreateWorldMenu::PSPlusReturned,this, app.GetStringTable(),NULL,0,false); + return; + } + } +#endif + + if(m_bGameModeSurvival != true || m_MoreOptionsParams.bHostPrivileges == TRUE) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + if(m_bGameModeSurvival != true) + { + ui.RequestMessageBox(IDS_TITLE_START_GAME, IDS_CONFIRM_START_CREATIVE, uiIDA, 2, m_iPad,&UIScene_CreateWorldMenu::ConfirmCreateReturned,this,app.GetStringTable(),NULL,0,false); + } + else + { + ui.RequestMessageBox(IDS_TITLE_START_GAME, IDS_CONFIRM_START_HOST_PRIVILEGES, uiIDA, 2, m_iPad,&UIScene_CreateWorldMenu::ConfirmCreateReturned,this,app.GetStringTable(),NULL,0,false); + } + } + else + { + // 4J Stu - If we only have one controller connected, then don't show the sign-in UI again + DWORD connectedControllers = 0; + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if( InputManager.IsPadConnected(i) || ProfileManager.IsSignedIn(i) ) ++connectedControllers; + } + + // Check if user-created content is allowed, as we cannot play multiplayer if it's not + //bool isClientSide = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && m_MoreOptionsParams.bOnlineGame; + bool noUGC = false; + BOOL pccAllowed = TRUE; + BOOL pccFriendsAllowed = TRUE; + bool bContentRestricted = false; + + ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); +#if defined(__PS3__) || defined(__PSVITA__) + if(isOnlineGame && isSignedInLive) + { + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),false,NULL,&bContentRestricted,NULL); + } +#endif + + noUGC = !pccAllowed && !pccFriendsAllowed; + + if(isOnlineGame && isSignedInLive && app.IsLocalMultiplayerAvailable()) + { + // 4J-PB not sure why we aren't checking the content restriction for the main player here when multiple controllers are connected - adding now + if(noUGC ) + { + m_bIgnoreInput=false; + ui.RequestUGCMessageBox(); + } + else if(bContentRestricted ) + { + m_bIgnoreInput=false; + ui.RequestContentRestrictedMessageBox(); + } +#ifdef __ORBIS__ + else if(bPlayStationPlus==false) + { + m_bIgnoreInput=false; + + // 4J-PB - we're not allowed to show the text Playstation Plus - have to call the upsell all the time! + // upsell psplus + int32_t iResult=sceNpCommerceDialogInitialize(); + + SceNpCommerceDialogParam param; + sceNpCommerceDialogParamInitialize(¶m); + param.mode=SCE_NP_COMMERCE_DIALOG_MODE_PLUS; + param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY; + param.userId = ProfileManager.getUserID(iPadWithNoPlaystationPlus); + + iResult=sceNpCommerceDialogOpen(¶m); +// UINT uiIDA[2]; +// uiIDA[0]=IDS_PLAY_OFFLINE; +// uiIDA[1]=IDS_PLAYSTATIONPLUS_SIGNUP; +// ui.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_PLAYSTATIONPLUS, uiIDA,2,ProfileManager.GetPrimaryPad(),&UIScene_CreateWorldMenu::PSPlusReturned,this, app.GetStringTable(),NULL,0,false); + } + +#endif + else + { + //ProfileManager.RequestSignInUI(false, false, false, true, false,&CScene_MultiGameCreate::StartGame_SignInReturned, this,ProfileManager.GetPrimaryPad()); + SignInInfo info; + info.Func = &UIScene_CreateWorldMenu::StartGame_SignInReturned; + info.lpParam = this; + info.requireOnline = m_MoreOptionsParams.bOnlineGame; + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_QuadrantSignin,&info); + } + } + else + { + if(!pccAllowed && !pccFriendsAllowed) noUGC = true; + + if(isOnlineGame && isSignedInLive && noUGC ) + { + m_bIgnoreInput=false; + ui.RequestUGCMessageBox(); + } + else if(isOnlineGame && isSignedInLive && bContentRestricted ) + { + m_bIgnoreInput=false; + ui.RequestContentRestrictedMessageBox(); + } +#ifdef __ORBIS__ + else if(isOnlineGame && isSignedInLive && (bPlayStationPlus==false)) + { + m_bIgnoreInput=false; + setVisible( true ); + + // 4J-PB - we're not allowed to show the text Playstation Plus - have to call the upsell all the time! + // upsell psplus + int32_t iResult=sceNpCommerceDialogInitialize(); + + SceNpCommerceDialogParam param; + sceNpCommerceDialogParamInitialize(¶m); + param.mode=SCE_NP_COMMERCE_DIALOG_MODE_PLUS; + param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY; + param.userId = ProfileManager.getUserID(iPadWithNoPlaystationPlus); + + iResult=sceNpCommerceDialogOpen(¶m); + +// UINT uiIDA[2]; +// uiIDA[0]=IDS_PLAY_OFFLINE; +// uiIDA[1]=IDS_PLAYSTATIONPLUS_SIGNUP; +// ui.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_PLAYSTATIONPLUS, uiIDA,2,ProfileManager.GetPrimaryPad(),&UIScene_CreateWorldMenu::PSPlusReturned,this, app.GetStringTable(),NULL,0,false); + } + +#endif + else + { +#if defined(__ORBIS__) || defined(__PSVITA__) + if(isOnlineGame) + { + bool chatRestricted = false; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),false,&chatRestricted,NULL,NULL); + if(chatRestricted) + { + ProfileManager.DisplaySystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION, ProfileManager.GetPrimaryPad() ); + } + } +#endif + CreateGame(this, 0); + } + } + } + +} + +// 4J Stu - Shared functionality that is the same whether we needed a quadrant sign-in or not +void UIScene_CreateWorldMenu::CreateGame(UIScene_CreateWorldMenu* pClass, DWORD dwLocalUsersMask) +{ +#if TO_BE_IMPLEMENTED + // stop the timer running that causes a check for new texture packs in TMS but not installed, since this will run all through the create game, and will crash if it tries to create an hbrush + XuiKillTimer(pClass->m_hObj,CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID); +#endif + + bool isClientSide = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && pClass->m_MoreOptionsParams.bOnlineGame; +#ifdef __PSVITA__ + if(CGameNetworkManager::usingAdhocMode()) + { + if(SQRNetworkManager_AdHoc_Vita::GetAdhocStatus())// && pClass->m_MoreOptionsParams.bOnlineGame) + isClientSide = true; + } +#endif // __PSVITA__ + + bool isPrivate = pClass->m_MoreOptionsParams.bInviteOnly?true:false; + + // clear out the app's terrain features list + app.ClearTerrainFeaturePosition(); + + // create the world and launch + wstring wWorldName = pClass->m_worldName; + + StorageManager.ResetSaveData(); + // Make our next save default to the name of the level + StorageManager.SetSaveTitle((wchar_t *)wWorldName.c_str()); + + wstring wSeed; + if(!pClass->m_MoreOptionsParams.seed.empty() ) + { + wSeed=pClass->m_MoreOptionsParams.seed; + } + else + { + // random + wSeed=L""; + } + + // start the game + bool isFlat = (pClass->m_MoreOptionsParams.bFlatWorld==TRUE); + __int64 seedValue = 0; + + NetworkGameInitData *param = new NetworkGameInitData(); + + if (wSeed.length() != 0) + { + __int64 value = 0; + unsigned int len = (unsigned int)wSeed.length(); + + //Check if the input string contains a numerical value + bool isNumber = true; + for( unsigned int i = 0 ; i < len ; ++i ) + { + if( wSeed.at(i) < L'0' || wSeed.at(i) > L'9' ) + { + if( !(i==0 && wSeed.at(i) == L'-' ) ) + { + isNumber = false; + break; + } + } + } + + //If the input string is a numerical value, convert it to a number + if( isNumber ) + value = _fromString<__int64>(wSeed); + + //If the value is not 0 use it, otherwise use the algorithm from the java String.hashCode() function to hash it + if( value != 0 ) + seedValue = value; + else + { + int hashValue = 0; + for( unsigned int i = 0 ; i < len ; ++i ) + hashValue = 31 * hashValue + wSeed.at(i); + seedValue = hashValue; + } + } + else + { + param->findSeed = true; // 4J - java code sets the seed to was (new Random())->nextLong() here - we used to at this point find a suitable seed, but now just set a flag so this is performed in Minecraft::Server::initServer. + } + + + param->seed = seedValue; + param->saveData = NULL; + param->texturePackId = pClass->m_MoreOptionsParams.dwTexturePack; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->skins->selectTexturePackById(pClass->m_MoreOptionsParams.dwTexturePack); + + app.SetGameHostOption(eGameHostOption_Difficulty,Minecraft::GetInstance()->options->difficulty); + app.SetGameHostOption(eGameHostOption_FriendsOfFriends,pClass->m_MoreOptionsParams.bAllowFriendsOfFriends); + app.SetGameHostOption(eGameHostOption_Gamertags,app.GetGameSettings(pClass->m_iPad,eGameSetting_GamertagsVisible)?1:0); + + app.SetGameHostOption(eGameHostOption_BedrockFog,app.GetGameSettings(pClass->m_iPad,eGameSetting_BedrockFog)?1:0); + + app.SetGameHostOption(eGameHostOption_GameType,pClass->m_bGameModeSurvival?GameType::SURVIVAL->getId():GameType::CREATIVE->getId() ); + app.SetGameHostOption(eGameHostOption_LevelType,pClass->m_MoreOptionsParams.bFlatWorld ); + app.SetGameHostOption(eGameHostOption_Structures,pClass->m_MoreOptionsParams.bStructures ); + app.SetGameHostOption(eGameHostOption_BonusChest,pClass->m_MoreOptionsParams.bBonusChest ); + + app.SetGameHostOption(eGameHostOption_PvP,pClass->m_MoreOptionsParams.bPVP); + app.SetGameHostOption(eGameHostOption_TrustPlayers,pClass->m_MoreOptionsParams.bTrust ); + app.SetGameHostOption(eGameHostOption_FireSpreads,pClass->m_MoreOptionsParams.bFireSpreads ); + app.SetGameHostOption(eGameHostOption_TNT,pClass->m_MoreOptionsParams.bTNT ); + app.SetGameHostOption(eGameHostOption_HostCanFly,pClass->m_MoreOptionsParams.bHostPrivileges); + app.SetGameHostOption(eGameHostOption_HostCanChangeHunger,pClass->m_MoreOptionsParams.bHostPrivileges); + app.SetGameHostOption(eGameHostOption_HostCanBeInvisible,pClass->m_MoreOptionsParams.bHostPrivileges ); + + g_NetworkManager.HostGame(dwLocalUsersMask,isClientSide,isPrivate,MINECRAFT_NET_MAX_PLAYERS,0); + + param->settings = app.GetGameHostOption( eGameHostOption_All ); + +#ifdef _LARGE_WORLDS + switch(pClass->m_MoreOptionsParams.worldSize) + { + case 0: + // Classic + param->xzSize = 1 * 54; + param->hellScale = 3; + break; + case 1: + // Small + param->xzSize = 1 * 64; + param->hellScale = 3; + break; + case 2: + // Medium + param->xzSize = 3 * 64; + param->hellScale = 6; + break; + case 3: + //param->xzSize = 5 * 64; + //param->hellScale = 8; + + // Large + param->xzSize = LEVEL_MAX_WIDTH; + param->hellScale = HELL_LEVEL_MAX_SCALE; + break; + }; +#else + param->xzSize = LEVEL_MAX_WIDTH; + param->hellScale = HELL_LEVEL_MAX_SCALE; +#endif + +#ifndef _XBOX + g_NetworkManager.FakeLocalPlayerJoined(); +#endif + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc; + loadingParams->lpParam = (LPVOID)param; + + // Reset the autosave time + app.SetAutosaveTimerTime(); + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + + ui.NavigateToScene(pClass->m_iPad,eUIScene_FullscreenProgress, loadingParams); +} + + +int UIScene_CreateWorldMenu::StartGame_SignInReturned(void *pParam,bool bContinue, int iPad) +{ + UIScene_CreateWorldMenu* pClass = (UIScene_CreateWorldMenu*)pParam; + + if(bContinue==true) + { + // It's possible that the player has not signed in - they can back out + if(ProfileManager.IsSignedIn(pClass->m_iPad)) + { + bool isOnlineGame = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && pClass->m_MoreOptionsParams.bOnlineGame; + // bool isOnlineGame = pClass->m_MoreOptionsParams.bOnlineGame; + int primaryPad = ProfileManager.GetPrimaryPad(); + bool noPrivileges = false; + DWORD dwLocalUsersMask = 0; + bool isSignedInLive = ProfileManager.IsSignedInLive(primaryPad); + int iPadNotSignedInLive = -1; + bool isLocalMultiplayerAvailable = app.IsLocalMultiplayerAvailable(); + + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if (ProfileManager.IsSignedIn(i) && ((i == primaryPad) || isLocalMultiplayerAvailable)) + { + if (isSignedInLive && !ProfileManager.IsSignedInLive(i)) + { + // Record the first non signed in live pad + iPadNotSignedInLive = i; + } + + if( !ProfileManager.AllowedToPlayMultiplayer(i) ) noPrivileges = true; + dwLocalUsersMask |= CGameNetworkManager::GetLocalPlayerMask(i); + isSignedInLive = isSignedInLive && ProfileManager.IsSignedInLive(i); + } + } + + // If this is an online game but not all players are signed in to Live, stop! + if (isOnlineGame && !isSignedInLive) + { +#ifdef __ORBIS__ + assert(iPadNotSignedInLive != -1); + + // Check if PSN is unavailable because of age restriction + int npAvailability = ProfileManager.getNPAvailability(iPadNotSignedInLive); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + pClass->m_bIgnoreInput = false; + // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive if the npAvailability isn't SCE_OK + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive, NULL, NULL, app.GetStringTable()); + } + else + { + pClass->m_bIgnoreInput=true; + UINT uiIDA[2]; + uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1] = IDS_CANCEL; + ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPadNotSignedInLive, &UIScene_CreateWorldMenu::MustSignInReturnedPSN, pClass, app.GetStringTable(), NULL, 0, false); + } + return 0; +#else + pClass->m_bIgnoreInput=false; + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(),NULL,0,false); + return 0; +#endif + } + + // Check if user-created content is allowed, as we cannot play multiplayer if it's not + bool noUGC = false; + BOOL pccAllowed = TRUE; + BOOL pccFriendsAllowed = TRUE; + + ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); + if(!pccAllowed && !pccFriendsAllowed) noUGC = true; + + if(isOnlineGame && (noPrivileges || noUGC) ) + { + if( noUGC ) + { + pClass->m_bIgnoreInput = false; + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(),NULL,0,false); + } + else + { + pClass->m_bIgnoreInput = false; + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_HOST_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(),NULL,0,false); + } + } + else + { + // This is NOT called from a storage manager thread, and is in fact called from the main thread in the Profile library tick. Therefore we use the main threads IntCache. + CreateGame(pClass, dwLocalUsersMask); + } + } + } + else + { + pClass->m_bIgnoreInput = false; + } + return 0; +} + + +int UIScene_CreateWorldMenu::ConfirmCreateReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_CreateWorldMenu* pClass = (UIScene_CreateWorldMenu*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + bool isClientSide = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && pClass->m_MoreOptionsParams.bOnlineGame; + + // 4J Stu - If we only have one controller connected, then don't show the sign-in UI again + DWORD connectedControllers = 0; + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if( InputManager.IsPadConnected(i) || ProfileManager.IsSignedIn(i) ) ++connectedControllers; + } + + if(isClientSide && app.IsLocalMultiplayerAvailable()) + { + //ProfileManager.RequestSignInUI(false, false, false, true, false,&UIScene_CreateWorldMenu::StartGame_SignInReturned, pClass,ProfileManager.GetPrimaryPad()); + SignInInfo info; + info.Func = &UIScene_CreateWorldMenu::StartGame_SignInReturned; + info.lpParam = pClass; + info.requireOnline = pClass->m_MoreOptionsParams.bOnlineGame; + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_QuadrantSignin,&info); + } + else + { + // Check if user-created content is allowed, as we cannot play multiplayer if it's not + bool isClientSide = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && pClass->m_MoreOptionsParams.bOnlineGame; + bool noUGC = false; + BOOL pccAllowed = TRUE; + BOOL pccFriendsAllowed = TRUE; + + ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); + if(!pccAllowed && !pccFriendsAllowed) noUGC = true; + + if(isClientSide && noUGC ) + { + pClass->m_bIgnoreInput = false; + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(),NULL,0,false); + } + else + { +#if defined( __ORBIS__) || defined(__PSVITA__) + bool isOnlineGame = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && pClass->m_MoreOptionsParams.bOnlineGame; + if(isOnlineGame) + { + bool chatRestricted = false; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),false,&chatRestricted,NULL,NULL); + if(chatRestricted) + { + ProfileManager.DisplaySystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION, ProfileManager.GetPrimaryPad() ); + } + } +#endif + CreateGame(pClass, 0); + } + } + } + else + { + pClass->m_bIgnoreInput = false; + } + return 0; +} + +#ifdef __ORBIS__ +int UIScene_CreateWorldMenu::MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_CreateWorldMenu* pClass = (UIScene_CreateWorldMenu *)pParam; + pClass->m_bIgnoreInput = false; + + if(result==C4JStorage::EMessage_ResultAccept) + { + SQRNetworkManager_Orbis::AttemptPSNSignIn(&UIScene_CreateWorldMenu::StartGame_SignInReturned, pClass, false, iPad); + } + + return 0; +} + +// int UIScene_CreateWorldMenu::PSPlusReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +// { +// int32_t iResult; +// UIScene_CreateWorldMenu *pClass = (UIScene_CreateWorldMenu *)pParam; +// +// // continue offline, or upsell PS Plus? +// if(result==C4JStorage::EMessage_ResultDecline) +// { +// // upsell psplus +// int32_t iResult=sceNpCommerceDialogInitialize(); +// +// SceNpCommerceDialogParam param; +// sceNpCommerceDialogParamInitialize(¶m); +// param.mode=SCE_NP_COMMERCE_DIALOG_MODE_PLUS; +// param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY; +// param.userId = ProfileManager.getUserID(pClass->m_iPad); +// +// iResult=sceNpCommerceDialogOpen(¶m); +// } +// else if(result==C4JStorage::EMessage_ResultAccept) +// { +// // continue offline +// pClass->m_MoreOptionsParams.bOnlineGame=false; +// pClass->checkStateAndStartGame(); +// } +// +// pClass->m_bIgnoreInput=false; +// return 0; +// } +#endif + + +void UIScene_CreateWorldMenu::handleTouchBoxRebuild() +{ + m_bRebuildTouchBoxes = true; +} diff --git a/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.h b/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.h new file mode 100644 index 00000000..ebb383e8 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.h @@ -0,0 +1,115 @@ +#pragma once + +#include "IUIScene_StartGame.h" + +class UIScene_CreateWorldMenu : public IUIScene_StartGame +{ +private: + enum EControls + { + eControl_EditWorldName, + eControl_EditSeed, + eControl_TexturePackList, + eControl_GameModeToggle, + eControl_Difficulty, + eControl_MoreOptions, + eControl_NewWorld, + eControl_OnlineGame, + }; + + static int m_iDifficultyTitleSettingA[4]; + + + wstring m_worldName; + wstring m_seed; + + UIControl m_controlMainPanel; + UIControl_Label m_labelWorldName, m_labelSeed, m_labelRandomSeed; + UIControl_Button m_buttonGamemode, m_buttonMoreOptions, m_buttonCreateWorld; + UIControl_TextInput m_editWorldName, m_editSeed; + UIControl_Slider m_sliderDifficulty; + +#if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 + UIControl_CheckBox m_checkboxOnline; +#endif + + UIControl_BitmapIcon m_bitmapIcon, m_bitmapComparison; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(IUIScene_StartGame) + UI_MAP_ELEMENT( m_controlMainPanel, "MainPanel" ) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + UI_MAP_ELEMENT( m_labelWorldName, "WorldName") + UI_MAP_ELEMENT( m_editWorldName, "EditWorldName") + UI_MAP_ELEMENT( m_labelSeed, "Seed") + UI_MAP_ELEMENT( m_editSeed, "EditSeed") + UI_MAP_ELEMENT( m_labelRandomSeed, "RandomSeed") + UI_MAP_ELEMENT( m_texturePackList, "TexturePackSelector") + UI_MAP_ELEMENT( m_buttonGamemode, "GameModeToggle") + +#if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 + UI_MAP_ELEMENT( m_checkboxOnline, "CheckboxOnline") +#endif + UI_MAP_ELEMENT( m_buttonMoreOptions, "MoreOptions") + UI_MAP_ELEMENT( m_buttonCreateWorld, "NewWorld") + UI_MAP_ELEMENT( m_sliderDifficulty, "Difficulty") + UI_END_MAP_CHILD_ELEMENTS() + UI_END_MAP_ELEMENTS_AND_NAMES() + + bool m_bGameModeSurvival; + bool m_bMultiplayerAllowed; + DLCPack * m_pDLCPack; + bool m_bRebuildTouchBoxes; + +public: + UIScene_CreateWorldMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_CreateWorldMenu(); + + virtual void updateTooltips(); + virtual void updateComponents(); + + virtual EUIScene getSceneType() { return eUIScene_CreateWorldMenu;} + + virtual void handleDestroy(); + virtual void tick(); + + virtual UIControl* GetMainPanel(); + + virtual void handleTouchBoxRebuild(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + + virtual void handleTimerComplete(int id); + virtual void handleGainFocus(bool navBack); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +private: + void StartSharedLaunchFlow(); + bool IsLocalMultiplayerAvailable(); + +#ifdef _DURANGO + static void checkPrivilegeCallback(LPVOID lpParam, bool hasPrivilege, int iPad); +#endif + +protected: + static int KeyboardCompleteWorldNameCallback(LPVOID lpParam,const bool bRes); + static int KeyboardCompleteSeedCallback(LPVOID lpParam,const bool bRes); + void handlePress(F64 controlId, F64 childId); + void handleSliderMove(F64 sliderId, F64 currentValue); + + static void CreateGame(UIScene_CreateWorldMenu* pClass, DWORD dwLocalUsersMask); + static int ConfirmCreateReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int StartGame_SignInReturned(void *pParam,bool bContinue, int iPad); + static int MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EMessageResult result); + +#ifdef __ORBIS__ + //static int PSPlusReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ContinueOffline(void *pParam,int iPad,C4JStorage::EMessageResult result); +#endif + + virtual void checkStateAndStartGame(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_CreativeMenu.cpp b/Minecraft.Client/Common/UI/UIScene_CreativeMenu.cpp new file mode 100644 index 00000000..569cc8ba --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_CreativeMenu.cpp @@ -0,0 +1,493 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_CreativeMenu.h" + +#include "..\Minecraft.World\JavaMath.h" +#include "..\..\LocalPlayer.h" +#include "..\Tutorial\Tutorial.h" +#include "..\Tutorial\TutorialMode.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" + +#ifdef __PSVITA__ +#define GAME_CREATIVE_TOUCHUPDATE_TIMER_ID 0 +#define GAME_CREATIVE_TOUCHUPDATE_TIMER_TIME 100 +#endif + +UIScene_CreativeMenu::UIScene_CreativeMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene_AbstractContainerMenu(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + InventoryScreenInput *initData = (InventoryScreenInput *)_initData; + + shared_ptr creativeContainer = shared_ptr(new SimpleContainer( 0, TabSpec::MAX_SIZE )); + itemPickerMenu = new ItemPickerMenu(creativeContainer, initData->player->inventory); + + Initialize( initData->iPad, itemPickerMenu, false, -1, eSectionInventoryCreativeUsing, eSectionInventoryCreativeMax, initData->bNavigateBack); + + m_labelInventory.setLabel( L"" ); + m_bFirstCall=true; + + //m_slotListContainer.addSlots(0,TabSpec::MAX_SIZE); + //m_slotListHotbar.addSlots(TabSpec::MAX_SIZE,TabSpec::MAX_SIZE + 9); + for(unsigned int i = 0; i < TabSpec::MAX_SIZE; ++i) + { + m_slotListContainer.addSlot(i); + } + + for(unsigned int i = TabSpec::MAX_SIZE; i < TabSpec::MAX_SIZE + 9; ++i) + { + m_slotListHotbar.addSlot(i); + } + + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->localgameModes[initData->iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[initData->iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Creative_Inventory_Menu, this); + } + + if(initData) delete initData; + + m_curTab = eCreativeInventoryTab_COUNT; + switchTab(eCreativeInventoryTab_BuildingBlocks); + +#ifdef __PSVITA__ + // initialise vita touch controls with ids + for(unsigned int i = 0; i < ETouchInput_Count; ++i) + { + m_TouchInput[i].init(i); + } +#endif +} + +wstring UIScene_CreativeMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"CreativeMenuSplit"; + } + else + { + return L"CreativeMenu"; + } +} + +#ifdef __PSVITA__ +UIControl* UIScene_CreativeMenu::GetMainPanel() +{ + return &m_controlMainPanel; +} + +void UIScene_CreativeMenu::handleTouchInput(unsigned int iPad, S32 x, S32 y, int iId, bool bPressed, bool bRepeat, bool bReleased) +{ + // perform action on release + if(bReleased) + { + if(iId >= eCreativeInventoryTab_BuildingBlocks && iId <= eCreativeInventoryTab_Misc) + { + switchTab((ECreativeInventoryTabs)iId); + ui.PlayUISFX(eSFX_Focus); + } + } + if(bRepeat && iId == ETouchInput_TouchSlider && specs[m_curTab]->getPageCount() > 1) + { + // calculate relative touch position on slider + float fPosition = ((float)y - (float)m_TouchInput[ETouchInput_TouchSlider].getYPos() - m_controlMainPanel.getYPos()) / (float)m_TouchInput[ETouchInput_TouchSlider].getHeight(); + + // clamp + if(fPosition > 1) + fPosition = 1.0f; + else if(fPosition < 0) + fPosition = 0.0f; + + // calculate page position according to page count + int iCurrentPage = Math::round(fPosition * (specs[m_curTab]->getPageCount() - 1)); + + // set tab page + m_tabPage[m_curTab] = iCurrentPage; + + // update tab + switchTab(m_curTab); + } +} + +void UIScene_CreativeMenu::handleTouchBoxRebuild() +{ + addTimer(GAME_CREATIVE_TOUCHUPDATE_TIMER_ID,GAME_CREATIVE_TOUCHUPDATE_TIMER_TIME); +} + +void UIScene_CreativeMenu::handleTimerComplete(int id) +{ + if(id == GAME_CREATIVE_TOUCHUPDATE_TIMER_ID) + { + // we cannot rebuild touch boxes in an iggy callback because it requires further iggy calls + GetMainPanel()->UpdateControl(); + ui.TouchBoxRebuild(this); + killTimer(GAME_CREATIVE_TOUCHUPDATE_TIMER_ID); + } +} +#endif + +void UIScene_CreativeMenu::handleOtherClicked(int iPad, ESceneSection eSection, int buttonNum, bool quickKey) +{ + switch(eSection) + { + case eSectionInventoryCreativeTab_0: + case eSectionInventoryCreativeTab_1: + case eSectionInventoryCreativeTab_2: + case eSectionInventoryCreativeTab_3: + case eSectionInventoryCreativeTab_4: + case eSectionInventoryCreativeTab_5: + case eSectionInventoryCreativeTab_6: + case eSectionInventoryCreativeTab_7: + { + ECreativeInventoryTabs tab = (ECreativeInventoryTabs)((int)eCreativeInventoryTab_BuildingBlocks + (int)eSection - (int)eSectionInventoryCreativeTab_0); + if(tab != m_curTab) + { + switchTab(tab); + ui.PlayUISFX(eSFX_Focus); + } + } + break; + case eSectionInventoryCreativeSlider: + ScrollBar(this->m_pointerPos); + break; + } +} + +void UIScene_CreativeMenu::ScrollBar(UIVec2D pointerPos) +{ + float fPosition = ((float)pointerPos.y - (float)m_TouchInput[ETouchInput_TouchSlider].getYPos()) / (float)m_TouchInput[ETouchInput_TouchSlider].getHeight(); + + // clamp + if(fPosition > 1) + fPosition = 1.0f; + else if(fPosition < 0) + fPosition = 0.0f; + + // calculate page position according to page count + int iCurrentPage = Math::round(fPosition * (specs[m_curTab]->getPageCount() - 1)); + + // set tab page + m_tabPage[m_curTab] = iCurrentPage; + + // update tab + switchTab(m_curTab); +} + +void UIScene_CreativeMenu::handleReload() +{ + Initialize( m_iPad, m_menu, false, -1, eSectionInventoryCreativeUsing, eSectionInventoryCreativeMax, m_bNavigateBack ); + + for(unsigned int i = 0; i < TabSpec::MAX_SIZE; ++i) + { + m_slotListContainer.addSlot(i); + } + + for(unsigned int i = TabSpec::MAX_SIZE; i < TabSpec::MAX_SIZE + 9; ++i) + { + m_slotListHotbar.addSlot(i); + } +} + +void UIScene_CreativeMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + // 4J-PB - going to ignore repeats on this scene + if(repeat) return; + + //app.DebugPrintf("UIScene_CreativeMenu handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + int dir = 1; + switch(key) + { + case VK_PAD_LSHOULDER: + dir = -1; + // Fall through intentional + case VK_PAD_RSHOULDER: + { + ECreativeInventoryTabs tab = (ECreativeInventoryTabs)(m_curTab + dir); + if (tab < 0) tab = (ECreativeInventoryTabs)(eCreativeInventoryTab_COUNT - 1); + if (tab >= eCreativeInventoryTab_COUNT) tab = eCreativeInventoryTab_BuildingBlocks; + switchTab(tab); + ui.PlayUISFX(eSFX_Focus); + } + break; + case VK_PAD_LTRIGGER: + // change the potion strength + { + ++m_tabDynamicPos[m_curTab]; + if(m_tabDynamicPos[m_curTab] >= specs[m_curTab]->m_dynamicGroupsCount) m_tabDynamicPos[m_curTab] = 0; + switchTab(m_curTab); + } + break; + default: + UIScene_AbstractContainerMenu::handleInput(iPad,key,repeat,pressed,released,handled); + break; + } +} + +void UIScene_CreativeMenu::updateTabHighlightAndText(ECreativeInventoryTabs tab) +{ + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = (F64)tab; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ) , m_funcSetActiveTab , 1 , value ); + + m_labelInventory.setLabel(app.GetString(specs[tab]->m_descriptionId)); +} + +int UIScene_CreativeMenu::getSectionColumns(ESceneSection eSection) +{ + int cols = 0; + switch( eSection ) + { + case eSectionInventoryCreativeSelector: + cols = 10; + break; + case eSectionInventoryCreativeUsing: + cols = 9; + break; + default: + assert( false ); + break; + } + return cols; +} + +int UIScene_CreativeMenu::getSectionRows(ESceneSection eSection) +{ + int rows = 0; + switch( eSection ) + { + case eSectionInventoryCreativeSelector: + rows = 5; + break; + case eSectionInventoryCreativeUsing: + rows = 1; + break; + default: + assert( false ); + break; + } + return rows; +} + +void UIScene_CreativeMenu::GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ) +{ + switch( eSection ) + { + case eSectionInventoryCreativeSelector: + pPosition->x = m_slotListContainer.getXPos(); + pPosition->y = m_slotListContainer.getYPos(); + break; + case eSectionInventoryCreativeUsing: + pPosition->x = m_slotListHotbar.getXPos(); + pPosition->y = m_slotListHotbar.getYPos(); + break; + case eSectionInventoryCreativeTab_0: + pPosition->x = m_TouchInput[ETouchInput_TouchPanel_0].getXPos(); + pPosition->y = m_TouchInput[ETouchInput_TouchPanel_0].getYPos(); + break; + case eSectionInventoryCreativeTab_1: + pPosition->x = m_TouchInput[ETouchInput_TouchPanel_1].getXPos(); + pPosition->y = m_TouchInput[ETouchInput_TouchPanel_1].getYPos(); + break; + case eSectionInventoryCreativeTab_2: + pPosition->x = m_TouchInput[ETouchInput_TouchPanel_2].getXPos(); + pPosition->y = m_TouchInput[ETouchInput_TouchPanel_2].getYPos(); + break; + case eSectionInventoryCreativeTab_3: + pPosition->x = m_TouchInput[ETouchInput_TouchPanel_3].getXPos(); + pPosition->y = m_TouchInput[ETouchInput_TouchPanel_3].getYPos(); + break; + case eSectionInventoryCreativeTab_4: + pPosition->x = m_TouchInput[ETouchInput_TouchPanel_4].getXPos(); + pPosition->y = m_TouchInput[ETouchInput_TouchPanel_4].getYPos(); + break; + case eSectionInventoryCreativeTab_5: + pPosition->x = m_TouchInput[ETouchInput_TouchPanel_5].getXPos(); + pPosition->y = m_TouchInput[ETouchInput_TouchPanel_5].getYPos(); + break; + case eSectionInventoryCreativeTab_6: + pPosition->x = m_TouchInput[ETouchInput_TouchPanel_6].getXPos(); + pPosition->y = m_TouchInput[ETouchInput_TouchPanel_6].getYPos(); + break; + case eSectionInventoryCreativeTab_7: + pPosition->x = m_TouchInput[ETouchInput_TouchPanel_7].getXPos(); + pPosition->y = m_TouchInput[ETouchInput_TouchPanel_7].getYPos(); + break; + case eSectionInventoryCreativeSlider: + pPosition->x = m_TouchInput[ETouchInput_TouchSlider].getXPos(); + pPosition->y = m_TouchInput[ETouchInput_TouchSlider].getYPos(); + break; + default: + assert( false ); + break; + } +} + +void UIScene_CreativeMenu::GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ) +{ + UIVec2D sectionSize; + + switch( eSection ) + { + case eSectionInventoryCreativeSelector: + sectionSize.x = m_slotListContainer.getWidth(); + sectionSize.y = m_slotListContainer.getHeight(); + break; + case eSectionInventoryCreativeUsing: + sectionSize.x = m_slotListHotbar.getWidth(); + sectionSize.y = m_slotListHotbar.getHeight(); + break; + case eSectionInventoryCreativeTab_0: + sectionSize.x = m_TouchInput[ETouchInput_TouchPanel_0].getWidth(); + sectionSize.y = m_TouchInput[ETouchInput_TouchPanel_0].getHeight(); + break; + case eSectionInventoryCreativeTab_1: + sectionSize.x = m_TouchInput[ETouchInput_TouchPanel_1].getWidth(); + sectionSize.y = m_TouchInput[ETouchInput_TouchPanel_1].getHeight(); + break; + case eSectionInventoryCreativeTab_2: + sectionSize.x = m_TouchInput[ETouchInput_TouchPanel_2].getWidth(); + sectionSize.y = m_TouchInput[ETouchInput_TouchPanel_2].getHeight(); + break; + case eSectionInventoryCreativeTab_3: + sectionSize.x = m_TouchInput[ETouchInput_TouchPanel_3].getWidth(); + sectionSize.y = m_TouchInput[ETouchInput_TouchPanel_3].getHeight(); + break; + case eSectionInventoryCreativeTab_4: + sectionSize.x = m_TouchInput[ETouchInput_TouchPanel_4].getWidth(); + sectionSize.y = m_TouchInput[ETouchInput_TouchPanel_4].getHeight(); + break; + case eSectionInventoryCreativeTab_5: + sectionSize.x = m_TouchInput[ETouchInput_TouchPanel_5].getWidth(); + sectionSize.y = m_TouchInput[ETouchInput_TouchPanel_5].getHeight(); + break; + case eSectionInventoryCreativeTab_6: + sectionSize.x = m_TouchInput[ETouchInput_TouchPanel_6].getWidth(); + sectionSize.y = m_TouchInput[ETouchInput_TouchPanel_6].getHeight(); + break; + case eSectionInventoryCreativeTab_7: + sectionSize.x = m_TouchInput[ETouchInput_TouchPanel_7].getWidth(); + sectionSize.y = m_TouchInput[ETouchInput_TouchPanel_7].getHeight(); + break; + case eSectionInventoryCreativeSlider: + sectionSize.x = m_TouchInput[ETouchInput_TouchSlider].getWidth(); + sectionSize.y = m_TouchInput[ETouchInput_TouchSlider].getHeight(); + break; + default: + assert( false ); + break; + } + + if(IsSectionSlotList(eSection)) + { + 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; + } + else + { + GetPositionOfSection(eSection, pPosition); + pSize->x = sectionSize.x; + pSize->y = sectionSize.y; + } +} + +void UIScene_CreativeMenu::setSectionSelectedSlot(ESceneSection eSection, int x, int y) +{ + int cols = getSectionColumns(eSection); + + int index = (y * cols) + x; + + UIControl_SlotList *slotList = NULL; + switch( eSection ) + { + case eSectionInventoryCreativeSelector: + slotList = &m_slotListContainer; + break; + case eSectionInventoryCreativeUsing: + slotList = &m_slotListHotbar; + break; + default: + assert( false ); + break; + } + + slotList->setHighlightSlot(index); +} + +UIControl *UIScene_CreativeMenu::getSection(ESceneSection eSection) +{ + UIControl *control = NULL; + switch( eSection ) + { + case eSectionInventoryCreativeSelector: + control = &m_slotListContainer; + break; + case eSectionInventoryCreativeUsing: + control = &m_slotListHotbar; + break; + case eSectionInventoryCreativeTab_0: + control = &m_TouchInput[ETouchInput_TouchPanel_0]; + break; + case eSectionInventoryCreativeTab_1: + control = &m_TouchInput[ETouchInput_TouchPanel_1]; + break; + case eSectionInventoryCreativeTab_2: + control = &m_TouchInput[ETouchInput_TouchPanel_2]; + break; + case eSectionInventoryCreativeTab_3: + control = &m_TouchInput[ETouchInput_TouchPanel_3]; + break; + case eSectionInventoryCreativeTab_4: + control = &m_TouchInput[ETouchInput_TouchPanel_4]; + break; + case eSectionInventoryCreativeTab_5: + control = &m_TouchInput[ETouchInput_TouchPanel_5]; + break; + case eSectionInventoryCreativeTab_6: + control = &m_TouchInput[ETouchInput_TouchPanel_6]; + break; + case eSectionInventoryCreativeTab_7: + control = &m_TouchInput[ETouchInput_TouchPanel_7]; + break; + case eSectionInventoryCreativeSlider: + control = &m_TouchInput[ETouchInput_TouchSlider]; + break; + default: + assert( false ); + break; + } + return control; +} + +void UIScene_CreativeMenu::updateScrollCurrentPage(int currentPage, int pageCount) +{ + IggyDataValue result; + IggyDataValue value[2]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = (F64)pageCount; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = (F64)currentPage - 1; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ) , m_funcSetScrollBar , 2 , value ); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_CreativeMenu.h b/Minecraft.Client/Common/UI/UIScene_CreativeMenu.h new file mode 100644 index 00000000..6fbec2ba --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_CreativeMenu.h @@ -0,0 +1,90 @@ +#pragma once + +#include "UIScene_AbstractContainerMenu.h" +#include "IUIScene_CreativeMenu.h" + +class UIScene_CreativeMenu : public UIScene_AbstractContainerMenu, public IUIScene_CreativeMenu +{ +public: + UIScene_CreativeMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_CreativeMenu;} + +protected: + UIControl_SlotList m_slotListContainer; + IggyName m_funcSetActiveTab, m_funcSetScrollBar; + + enum ETouchInput + { + ETouchInput_TouchPanel_0, + ETouchInput_TouchPanel_1, + ETouchInput_TouchPanel_2, + ETouchInput_TouchPanel_3, + ETouchInput_TouchPanel_4, + ETouchInput_TouchPanel_5, + ETouchInput_TouchPanel_6, + ETouchInput_TouchPanel_7, + ETouchInput_TouchSlider, + + ETouchInput_Count, + }; + +#ifdef __PSVITA__ + // 4J - TomK - this only needs to be a touch component on vita! + UIControl_Touch m_TouchInput[ETouchInput_Count]; +#else + UIControl_Base m_TouchInput[ETouchInput_Count]; +#endif + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene_AbstractContainerMenu) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_0], "TouchPanel_0" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_1], "TouchPanel_1" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_2], "TouchPanel_2" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_3], "TouchPanel_3" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_4], "TouchPanel_4" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_5], "TouchPanel_5" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_6], "TouchPanel_6" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchPanel_7], "TouchPanel_7" ) + UI_MAP_ELEMENT( m_TouchInput[ETouchInput_TouchSlider], "TouchPanel_Slider" ) + + UI_MAP_ELEMENT( m_slotListContainer, "containerList") + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_NAME(m_funcSetActiveTab, L"SetActiveTab") + UI_MAP_NAME(m_funcSetScrollBar, L"SetScrollBar") + 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); + + virtual void handleOtherClicked(int iPad, ESceneSection eSection, int buttonNum, bool quickKey); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +#ifdef __PSVITA__ + virtual void handleTouchInput(unsigned int iPad, S32 x, S32 y, int iId, bool bPressed, bool bRepeat, bool bReleased); + virtual UIControl* GetMainPanel(); + virtual void handleTouchBoxRebuild(); + virtual void handleTimerComplete(int id); +#endif + virtual void ScrollBar(UIVec2D pointerPos); + +private: + // IUIScene_CreativeMenu + void updateTabHighlightAndText(ECreativeInventoryTabs tab); + void updateScrollCurrentPage(int currentPage, int pageCount); + bool m_bFirstCall; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_Credits.cpp b/Minecraft.Client/Common/UI/UIScene_Credits.cpp new file mode 100644 index 00000000..11558598 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_Credits.cpp @@ -0,0 +1,677 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_Credits.h" + +#define CREDIT_ICON -2 + +SCreditTextItemDef UIScene_Credits::gs_aCreditDefs[MAX_CREDIT_STRINGS] = +{ + { L"MOJANG", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eExtraLargeText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%ls", IDS_CREDITS_ORIGINALDESIGN, NO_TRANSLATED_STRING,eLargeText }, + { L"Markus Persson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%ls", IDS_CREDITS_PMPROD, NO_TRANSLATED_STRING,eLargeText }, + { L"Daniel Kaplan", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%ls", IDS_CREDITS_RESTOFMOJANG, NO_TRANSLATED_STRING,eMediumText }, + { L"%ls", IDS_CREDITS_LEADPC, NO_TRANSLATED_STRING,eLargeText }, + { L"Jens Bergensten", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_JON_KAGSTROM, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_CEO, NO_TRANSLATED_STRING,eLargeText }, + { L"Carl Manneh", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_DOF, NO_TRANSLATED_STRING,eLargeText }, + { L"Lydia Winters", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_WCW, NO_TRANSLATED_STRING,eLargeText }, + { L"Karin Severinsson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_CUSTOMERSUPPORT, NO_TRANSLATED_STRING,eLargeText }, + { L"Marc Watson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%ls", IDS_CREDITS_DESPROG, NO_TRANSLATED_STRING,eLargeText }, + { L"Aron Nieminen", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%ls", IDS_CREDITS_CHIEFARCHITECT, NO_TRANSLATED_STRING,eLargeText }, + { L"Daniel Frisk", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_CODENINJA, NO_TRANSLATED_STRING,eLargeText }, + { L"%ls", IDS_CREDITS_TOBIAS_MOLLSTAM, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_OFFICEDJ, NO_TRANSLATED_STRING,eLargeText }, + { L"Kristoffer Jelbring", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_DEVELOPER, NO_TRANSLATED_STRING,eLargeText }, + { L"Leonard Axelsson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_BULLYCOORD, NO_TRANSLATED_STRING,eLargeText }, + { L"Jakob Porser", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_ARTDEVELOPER, NO_TRANSLATED_STRING,eLargeText }, + { L"Junkboy", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_EXPLODANIM, NO_TRANSLATED_STRING,eLargeText }, + { L"Mattis Grahm", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_CONCEPTART, NO_TRANSLATED_STRING,eLargeText }, + { L"Henrik Petterson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_CRUNCHER, NO_TRANSLATED_STRING,eLargeText }, + { L"Patrick Geuder", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%ls", IDS_CREDITS_MUSICANDSOUNDS, NO_TRANSLATED_STRING,eLargeText }, + { L"Daniel Rosenfeld (C418)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"4J Studios", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eExtraLargeText }, + { L"%ls", IDS_CREDITS_PROGRAMMING, NO_TRANSLATED_STRING,eLargeText }, + { L"Paddy Burns", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Richard Reavy", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Stuart Ross", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"James Vaughan", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Mark Hughes", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Harry Gordon", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Thomas Kronberg", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, +#ifdef _XBOX + { L"Ian le Bruce", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Andy West", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Gordon McLean", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, +#endif + +#ifdef __PSVITA__ +// 4J-PB - Aaron didn't want to be in the credits { L"Aaron Puzey", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Chris Dawson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, +#endif + + { L"%ls", IDS_CREDITS_ART, NO_TRANSLATED_STRING,eLargeText }, + { L"David Keningale", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, +#ifdef _XBOX + { L"Pat McGovern", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, +#endif + { L"Alan Redmond", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, +#ifdef _XBOX + { L"Julian Laing", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + + { L"Caitlin Goodale", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Scott Sutherland", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, +#endif + { L"Chris Reeves", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kate Wright", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michael Hansen", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, +#ifdef _XBOX + { L"Kate Flavell", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, +#endif + { L"Donald Robertson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jamie Keddie", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Thomas Naylor", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Brian Lindsay", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Hannah Watts", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Rebecca O'Neil", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + + { L"%ls", IDS_CREDITS_QA, NO_TRANSLATED_STRING,eLargeText }, + { L"Steven Gary Woodward", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, +#ifdef _XBOX + { L"Richard Black", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, +#endif + { L"George Vaughan", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%ls", IDS_CREDITS_SPECIALTHANKS, NO_TRANSLATED_STRING,eLargeText }, + { L"Chris van der Kuyl", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Roni Percy", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Anne Clarke", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Anthony Kent", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, +#ifdef _XBOX + // credits are in the XUI file +#elif defined(__PS3__) +// font credits + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%ls", IDS_DYNAFONT, NO_TRANSLATED_STRING,eLargeText }, + +#elif defined(__ORBIS__) +// font credits + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%ls", IDS_DYNAFONT, NO_TRANSLATED_STRING,eLargeText }, + +#elif defined(_DURANGO) + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"Xbox LIVE Arcade Team", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eExtraLargeText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%s", IDS_CREDITS_LEADPRODUCER, NO_TRANSLATED_STRING,eLargeText }, + { L"Roger Carpenter", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_PRODUCER, NO_TRANSLATED_STRING,eLargeText }, + { L"Stuart Platt", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Riccardo Lenzi", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_LEADTESTER, NO_TRANSLATED_STRING,eLargeText }, + { L"Bill Brown (Insight Global)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Brandon McCurry (Insight Global)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Hakim Ronaque, Joe Dunavant", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Paul Loynd, Jeffery Stephens", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Rial Lerum (Xtreme Consulting Group Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_DESIGNTEAM, NO_TRANSLATED_STRING,eLargeText }, + { L"Craig Leigh", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_DEVELOPMENTTEAM, NO_TRANSLATED_STRING,eLargeText }, + { L"Scott Guest", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jeff \"Dextor\" Blazier", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Yukie Yamaguchi", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jason Hewitt", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_RELEASEMANAGEMENT, NO_TRANSLATED_STRING,eLargeText }, + { L"Isaac Aubrey", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jordan Forbes", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Josh Mulanax", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Shogo Ishii (TekSystems)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Tyler Keenan (Xtreme Consulting Group Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Joshua Bullard (TekSystems)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"GTO-E Compliance", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"Dominic Gara", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"James Small", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + + { L"%s", IDS_CREDITS_EXECPRODUCER, NO_TRANSLATED_STRING,eLargeText }, + { L"Mark Coates", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Avi Ben-Menahem", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Earnest Yuen", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + + + { L"%s", IDS_CREDITS_XBLADIRECTOR, NO_TRANSLATED_STRING,eLargeText }, + { L"Ted Woolsey", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_BIZDEV, NO_TRANSLATED_STRING,eLargeText }, + { L"Cherie Lutz", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Peter Zetterberg", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_PORTFOLIODIRECTOR, NO_TRANSLATED_STRING,eLargeText }, + { L"Chris Charla", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_PRODUCTMANAGER, NO_TRANSLATED_STRING,eLargeText }, + { L"Daniel McConnell", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_MARKETING, NO_TRANSLATED_STRING,eLargeText }, + { L"Brandon Wells", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michael Wolf", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"John Dongelmans", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_COMMUNITYMANAGER, NO_TRANSLATED_STRING,eLargeText }, + { L"Alex Hebert", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_REDMONDLOC, NO_TRANSLATED_STRING,eLargeText }, + { L"Zeb Wedell", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Gabriella Mittiga (Pactera)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Scott Fielding (Global Studio Consulting)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Yong Zhao (Hisoft Envisage Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Shogo Ishii (Insight Global)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_EUROPELOC, NO_TRANSLATED_STRING,eLargeText }, + { L"Gerard Dunne", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Ricardo Cordoba", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Magali Lucchini", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Malika Kherfi", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Lizzy Untermann", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Ian Walsh", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Alfonsina Mossello (Keywords International Ltd)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Marika Mauri (Keywords International Ltd)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Nobuhiro Izumisawa (Keywords International Ltd)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Sebastien Faucon (Keywords International Ltd)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jose Manuel Martinez (Keywords International Ltd)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Montse Garcia (Keywords International Ltd)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_ASIALOC, NO_TRANSLATED_STRING,eLargeText }, + { L"Takashi Sasaki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Changseon Ha", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Shinya Muto (Zip Global Corporation)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Hiroshi Hosoda (Zip Global Corporation)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Natsuko Kudo (Zip Global Corporation)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Yong-Hong Park (Zip Global Corporation)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Yuko Yoshida (Zip Global Corporation)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_USERRESEARCH, NO_TRANSLATED_STRING,eLargeText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"User Research Lead", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"Tim Nichols", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"User Research Engineer", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"Michael Medlock", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kristie Fisher", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%s", IDS_CREDITS_MGSCENTRAL, NO_TRANSLATED_STRING,eLargeText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"Test Team Lead", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"Dan Smith", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_MILESTONEACCEPT, NO_TRANSLATED_STRING,eLargeText }, + { L"Justin Davis (VMC)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Microsoft Studios Sentient Development Team", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"Ellery Charlson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Frank Klier", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jason Ronald", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Cullen Waters", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Steve Jackson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Barath Vasudevan", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Derek Mantey", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Henry Sterchi", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Scott Fintel", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Soren Hannibal Nielsen", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Meetali Goel (Aditi)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Uladzimir Sadouski (Volt)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_SPECIALTHANKS, NO_TRANSLATED_STRING,eLargeText }, + + { L"Allan Murphy", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Allison Bokone", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Alvin Chen", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Arthur Yung", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Brian Tyler", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Daniel Taylor", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Dave Reed", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Duoc Nguyen", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Eric Voreis", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Evelyn Thomas", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jeff Braunstein", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jolynn Carpenter", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Justin Brown", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kareem Choudhry", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kevin Cogger", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kevin La Chapelle", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Luc Rancourt", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Matt Bronder", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michael Siebert", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Mike Harsh", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Mike Sterling", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Nick Rapp", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Orr Keshet", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Paul Hellyar", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Peter Giffin", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Richard Moe", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Scott Selfon", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Stephane St-Michel", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Steve Spiller", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Steven Trombetta", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Theo Michel", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Tina Lemire", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Tom Miller", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Travis St. Onge", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + + { L"Brianna Witherspoon (Nytec Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jim Pekola (Xtreme Consulting Group Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Greg Hjertager", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Masha Reutovski (Nytec Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Chris Henry", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Matt Golz", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Chris Gaffney (Volt)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jared Barnhill (Aditi)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Laura Hawkins", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"2nd Cavalry", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"GTO Bug Bash Team", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Oliver Miyashita", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kevin Salcedo", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Nick Bodenham", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Chris Giggins", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Ben Board", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Peter Choi", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Andy Su (CompuCom Systems Inc.)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"David Boker ", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Josh Bliggenstorfer", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Paul Amer", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Louise Smith", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Karin Behland (Aquent LLC)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"John Bruno", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Phil Spencer", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"John Smith", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Christi Davisson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jacob Farley (Aditi)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Chad Stringer (Collabera)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Rick Rispoli (Collabera)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Test by Experis", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eExtraLargeText }, + { L"%s", IDS_CREDITS_TESTMANAGER, NO_TRANSLATED_STRING,eLargeText }, + { L"Matt Brown", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Gavin Kennedy", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_SRTESTLEAD, NO_TRANSLATED_STRING,eLargeText }, + { L"Lloyd Bell", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Tim Attuquayefio", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_TESTLEAD, NO_TRANSLATED_STRING,eLargeText }, + { L"Byron R. Monzon", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Marta Alombro", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_SDET, NO_TRANSLATED_STRING,eLargeText }, + { L"Valeriy Novytskyy", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_PROJECT, NO_TRANSLATED_STRING,eLargeText }, + { L"Allyson Burk", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"David Scott", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"John Shearer", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_ADDITIONALSTE, NO_TRANSLATED_STRING,eLargeText }, + { L"Chris Merritt", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kimberlee Lyles", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Eric Ranz", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Russ Allen", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_TESTASSOCIATES, NO_TRANSLATED_STRING,eLargeText }, + { L"Michael Arvat", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Josh Breese", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"April Culberson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jason Fox", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Clayton K. Hopper", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Matthew Howells", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Alan Hume", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jacob Martin", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kevin Lourigan", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Tyler Lovemark", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_RISE_LUGO, NO_TRANSLATED_STRING,eSmallText }, + { L"Ryan Naegeli", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Isaac Price", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Masha Reutovski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Brad Shockey", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jonathan Tote", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Marc Williams", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Gillian Williams", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jeffrey Woito", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Tyler Young", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jae Yslas", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Amanda Swalling", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Ben Dienes", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Chris Kent", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Dustin Lukas", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Emily Lovering", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Nick Fowler", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + // EVEN MORE CREDITS + { L"Test by Lionbridge", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eExtraLargeText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%s", IDS_CREDITS_TESTMANAGER, NO_TRANSLATED_STRING,eLargeText }, + { L"Blazej Zawadzki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_TESTLEAD, NO_TRANSLATED_STRING,eLargeText }, + { L"Jakub Garwacki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kamil Lahti", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Mariusz Gelnicki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Karol Falak", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Lukasz Watroba", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + + { L"%s", IDS_CREDITS_PROJECT, NO_TRANSLATED_STRING,eLargeText }, + { L"Artur Grochowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Grzegorz Kohorewicz", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Lukasz Derewonko", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michal Celej", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + + { L"Senior Test Engineers", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"Jakub Rybacki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Mateusz Szymanski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Arkadiusz Szczytowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Rafal Rawski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + + { L"%s", IDS_CREDITS_TESTASSOCIATES, NO_TRANSLATED_STRING,eLargeText }, + { L"Adrian Klepacki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Aleksander Pietraszak", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + + { L"Arkadiusz Kala", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Arkadiusz Sykula", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Bartlomiej Kmita", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jakub Malinowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jan Prejs", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jedrzej Kucharek", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kamil Dabrowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Maciej Urlo", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Maciej Wygoda", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Marcin Piasecki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Marcin Piotrowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Marek Latacz", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michal Biernat", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michal Krupinski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michal Warchal", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michal Wascinski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michal Zbrzezniak", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Milosz Maciejewicz", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Pawel Kumanowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Przemyslaw Malinowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Tomasz Dabrowicz", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Tomasz Trzebiatowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Wojciech Kujawa", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + + { L"Blazej Kohorewicz", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Damian Mielnik", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Dariusz Nowakowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Dominik Rzeznicki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jacek Piotrowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jakub Rybacki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jakub Wozniakowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jaroslaw Radzio", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kamil Kaczor", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Karolina Szymanska", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Konrad Mady", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Krzysztof Galazka", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Ludwik Miszta", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Lukasz Kwiatkowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Marcin Krzysiak", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Mateusz Szymanski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michal Maslany", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michal Nyszka", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Norbert Jankowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Piotr Daszewski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Radoslaw Kozlowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Tomasz Kalowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_SPECIALTHANKS, NO_TRANSLATED_STRING,eLargeText }, + { L"David Hickey", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Sean Kellogg", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Adam Keating", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jerzy Tyminski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Paulina Sliwinska", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + + + { L"Test by Shield", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eExtraLargeText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"GTO Shared Service Test Manager", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"Natahri Felton", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Shield Test Lead", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"Matt Giddings", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Shield IT Support", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"David Grant (Compucom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Primary Team", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"Alex Chen (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Alex Hunte (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Brian Boye (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Bridgette Cummins (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Chris Carleson (Volt)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Christopher Hermey (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"David Hendrickson (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Ioana Preda (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jessica Jenkins (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Johnathan Ochs (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michael Upham (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Nicholas Johansson (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Nicholas Starner (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Torr Vickers (Volt)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Victoria Bruder (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + +#elif defined(_WIN64) +#elif defined(__PSVITA__) +// font credits + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%ls", IDS_DYNAFONT, NO_TRANSLATED_STRING,eLargeText }, + +#endif + +#ifndef _XBOX +// Miles & Iggy credits + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"", CREDIT_ICON, eCreditIcon_Iggy,eSmallText }, // extra blank line + { L"Uses Iggy.", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line +#ifdef __PS3__ + { L"Copyright (C) 2009-2013 by RAD Game Tools, Inc.", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line +#else + { L"Copyright (C) 2009-2014 by RAD Game Tools, Inc.", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line +#endif + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"", CREDIT_ICON, eCreditIcon_Miles,eSmallText }, // extra blank line + { L"Uses Miles Sound System.", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line +#ifdef __PS3__ + { L"Copyright (C) 1991-2013 by RAD Game Tools, Inc.", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line +#else + { L"Copyright (C) 1991-2014 by RAD Game Tools, Inc.", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line +#endif +#ifdef __PS3__ + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"", CREDIT_ICON, eCreditIcon_Dolby,eSmallText }, // extra blank line + { L"Dolby and the double-D symbol", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"are trademarks of Dolby Laboratories.", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line +#endif +#endif +}; + +UIScene_Credits::UIScene_Credits(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_bAddNextLabel = false; + + // How many lines of text are in the credits? + m_iNumTextDefs = MAX_CREDIT_STRINGS; + + // Are there any additional lines needed for the DLC credits? + m_iNumTextDefs+=app.GetDLCCreditsCount(); + + m_iCurrDefIndex = -1; + + // Add the first 20 Flash can cope with + for(unsigned int i = 0; i < 20; ++i) + { + ++m_iCurrDefIndex; + + // Set up the new text element. + if ( gs_aCreditDefs[i].m_iStringID[0] == NO_TRANSLATED_STRING ) + { + setNextLabel(gs_aCreditDefs[i].m_Text,gs_aCreditDefs[i].m_eType); + } + else // using additional translated string. + { + LPWSTR creditsString = new wchar_t[ 128 ]; + if(gs_aCreditDefs[i].m_iStringID[1]!=NO_TRANSLATED_STRING) + { + swprintf( creditsString, 128, gs_aCreditDefs[i].m_Text, app.GetString( gs_aCreditDefs[i].m_iStringID[0] ), app.GetString( gs_aCreditDefs[i].m_iStringID[1] ) ); + } + else + { + swprintf( creditsString, 128, gs_aCreditDefs[i].m_Text, app.GetString( gs_aCreditDefs[i].m_iStringID[0] ) ); + } + setNextLabel(creditsString,gs_aCreditDefs[i].m_eType); + delete [] creditsString; + } + } +} + +wstring UIScene_Credits::getMoviePath() +{ + return L"Credits"; +} + +void UIScene_Credits::updateTooltips() +{ + ui.SetTooltips( m_iPad, -1, IDS_TOOLTIPS_BACK); +} + +void UIScene_Credits::updateComponents() +{ + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); +} + +void UIScene_Credits::handleReload() +{ + // We don't allow this in splitscreen, so just go back + navigateBack(); +} + +void UIScene_Credits::tick() +{ + UIScene::tick(); + + if(m_bAddNextLabel) + { + m_bAddNextLabel = false; + + const SCreditTextItemDef* pDef; + + // Time to create next text item. + ++m_iCurrDefIndex; + + // Wrap back to start. + if ( m_iCurrDefIndex >= m_iNumTextDefs ) + { + m_iCurrDefIndex = 0; + } + + if(m_iCurrDefIndex >= MAX_CREDIT_STRINGS) + { + app.DebugPrintf("DLC credit %d\n",m_iCurrDefIndex-MAX_CREDIT_STRINGS); + // DLC credit + pDef = app.GetDLCCredits(m_iCurrDefIndex-MAX_CREDIT_STRINGS); + } + else + { + // Get text def for this item. + pDef = &( gs_aCreditDefs[ m_iCurrDefIndex ] ); + } + + // Set up the new text element. + if(pDef->m_Text!=NULL) // 4J-PB - think the RAD logo ones aren't set up yet and are coming is as null + { + + if ( pDef->m_iStringID[0] == CREDIT_ICON ) + { + addImage((ECreditIcons)pDef->m_iStringID[1]); + } + else if ( pDef->m_iStringID[0] == NO_TRANSLATED_STRING ) + { + setNextLabel(pDef->m_Text,pDef->m_eType); + } + else // using additional translated string. + { + LPWSTR creditsString = new wchar_t[ 128 ]; + if(pDef->m_iStringID[1]!=NO_TRANSLATED_STRING) + { + swprintf( creditsString, 128, pDef->m_Text, app.GetString( pDef->m_iStringID[0] ), app.GetString( pDef->m_iStringID[1] ) ); + } + else + { + swprintf( creditsString, 128, pDef->m_Text, app.GetString( pDef->m_iStringID[0] ) ); + } + setNextLabel(creditsString,pDef->m_eType); + delete [] creditsString; + } + } + } +} + +void UIScene_Credits::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %ls, pressed- %ls, released- %ls\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed && !repeat) + { + navigateBack(); + } + 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); + break; + } +} + +void UIScene_Credits::setNextLabel(const wstring &label, ECreditTextTypes size) +{ + IggyDataValue result; + IggyDataValue value[3]; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = (int)size; + + value[2].type = IGGY_DATATYPE_boolean; + value[2].boolval = (m_iCurrDefIndex == (m_iNumTextDefs - 1)); + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetNextLabel , 3 , value ); +} + +void UIScene_Credits::addImage(ECreditIcons icon) +{ + IggyDataValue result; + IggyDataValue value[2]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = (int)icon; + + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = (m_iCurrDefIndex == (m_iNumTextDefs - 1)); + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcAddImage , 2 , value ); +} + +void UIScene_Credits::handleRequestMoreData(F64 startIndex, bool up) +{ + m_bAddNextLabel = true; +} diff --git a/Minecraft.Client/Common/UI/UIScene_Credits.h b/Minecraft.Client/Common/UI/UIScene_Credits.h new file mode 100644 index 00000000..4116628d --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_Credits.h @@ -0,0 +1,71 @@ +#pragma once + +#include "UIScene.h" + +#define PS3_CREDITS_COUNT 75 +#define PSVITA_CREDITS_COUNT 77 +#define PS4_CREDITS_COUNT 75 +#define XBOXONE_CREDITS_COUNT (75+318) +#define MILES_AND_IGGY_CREDITS_COUNT 8 +#define DYNAMODE_FONT_CREDITS_COUNT 2 +#define PS3_DOLBY_CREDIT 4 + + +#ifdef __PS3__ +#define MAX_CREDIT_STRINGS (PS3_CREDITS_COUNT + MILES_AND_IGGY_CREDITS_COUNT + DYNAMODE_FONT_CREDITS_COUNT + PS3_DOLBY_CREDIT) +#elif defined(__ORBIS__) +#define MAX_CREDIT_STRINGS (PS4_CREDITS_COUNT + MILES_AND_IGGY_CREDITS_COUNT + DYNAMODE_FONT_CREDITS_COUNT) +#elif defined(_DURANGO) || defined _WIN64 +#define MAX_CREDIT_STRINGS (XBOXONE_CREDITS_COUNT + MILES_AND_IGGY_CREDITS_COUNT) +#elif defined(__PSVITA__) +#define MAX_CREDIT_STRINGS (PSVITA_CREDITS_COUNT + MILES_AND_IGGY_CREDITS_COUNT + DYNAMODE_FONT_CREDITS_COUNT) +#endif + +class UIScene_Credits : public UIScene +{ +private: + enum ECreditIcons + { + eCreditIcon_Iggy, + eCreditIcon_Miles, + eCreditIcon_Dolby, + }; + + static SCreditTextItemDef gs_aCreditDefs[MAX_CREDIT_STRINGS]; + + int m_iCurrDefIndex; // Index of last created text def. + int m_iNumTextDefs; // Total number of text defs in the credits. + + bool m_bAddNextLabel; + + IggyName m_funcSetNextLabel, m_funcAddImage; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_NAME(m_funcSetNextLabel, L"SetNextLabel") + UI_MAP_NAME(m_funcAddImage, L"AddImage") + UI_END_MAP_ELEMENTS_AND_NAMES() +public: + UIScene_Credits(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_Credits;} + + virtual void updateTooltips(); + virtual void updateComponents(); + + void handleReload(); + + virtual void tick(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + virtual void handleRequestMoreData(F64 startIndex, bool up); + +private: + void setNextLabel(const wstring &label, ECreditTextTypes size); + void addImage(ECreditIcons icon); +}; diff --git a/Minecraft.Client/Common/UI/UIScene_DLCMainMenu.cpp b/Minecraft.Client/Common/UI/UIScene_DLCMainMenu.cpp new file mode 100644 index 00000000..0d36dcdf --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_DLCMainMenu.cpp @@ -0,0 +1,243 @@ +#include "stdafx.h" +#include "UI.h" +#if defined(__PS3__) || defined(__ORBIS__) +#include "Common\Network\Sony\SonyCommerce.h" +#endif +#include "UIScene_DLCMainMenu.h" + +#define PLAYER_ONLINE_TIMER_ID 0 +#define PLAYER_ONLINE_TIMER_TIME 100 + +UIScene_DLCMainMenu::UIScene_DLCMainMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + // Alert the app the we want to be informed of ethernet connections + app.SetLiveLinkRequired( true ); + + m_labelOffers.init(app.GetString(IDS_DOWNLOADABLE_CONTENT_OFFERS)); + m_buttonListOffers.init(eControl_OffersList); + +#if defined _XBOX_ONE || defined __ORBIS__ + // load any local DLC images + app.LoadLocalDLCImages(); +#endif + +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + // show a timer on this menu + m_Timer.setVisible(true); + + m_bCategoriesShown=false; +#endif + + if(m_loadedResolution == eSceneResolution_1080) + { +#ifdef _DURANGO + m_labelXboxStore.init( app.GetString(IDS_XBOX_STORE) ); +#else + m_labelXboxStore.init( L"" ); +#endif + } + +#if defined(_DURANGO) + m_Timer.setVisible(false); + + m_buttonListOffers.addItem(app.GetString(IDS_DLC_MENU_SKINPACKS),e_DLC_SkinPack); + m_buttonListOffers.addItem(app.GetString(IDS_DLC_MENU_TEXTUREPACKS),e_DLC_TexturePacks); + m_buttonListOffers.addItem(app.GetString(IDS_DLC_MENU_MASHUPPACKS),e_DLC_MashupPacks); + + app.AddDLCRequest(e_Marketplace_Content); // content is skin packs, texture packs and mash-up packs + // we also need to mount the local DLC so we can tell what's been purchased + app.StartInstallDLCProcess(iPad); +#endif + + TelemetryManager->RecordMenuShown(iPad, eUIScene_DLCMainMenu, 0); + +#ifdef __ORBIS__ + sceNpCommerceShowPsStoreIcon(SCE_NP_COMMERCE_PS_STORE_ICON_RIGHT); +#elif defined __PSVITA__ + sceNpCommerce2ShowPsStoreIcon(SCE_NP_COMMERCE2_ICON_DISP_RIGHT); +#endif + +#if ( defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ ) + addTimer( PLAYER_ONLINE_TIMER_ID, PLAYER_ONLINE_TIMER_TIME ); +#endif +} + +UIScene_DLCMainMenu::~UIScene_DLCMainMenu() +{ + // Alert the app the we no longer want to be informed of ethernet connections + app.SetLiveLinkRequired( false ); +#if defined _XBOX_ONE || defined __ORBIS__ + app.FreeLocalDLCImages(); +#endif +} + +wstring UIScene_DLCMainMenu::getMoviePath() +{ + return L"DLCMainMenu"; +} + +void UIScene_DLCMainMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK ); +} + +void UIScene_DLCMainMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { +#ifdef __ORBIS__ + sceNpCommerceHidePsStoreIcon(); +#elif defined __PSVITA__ + sceNpCommerce2HidePsStoreIcon(); +#endif + navigateBack(); + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_DLCMainMenu::handlePress(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_OffersList: + { + int iIndex = (int)childId; + DLCOffersParam *param = new DLCOffersParam(); + param->iPad = m_iPad; + + param->iType = iIndex; + // promote the DLC content request type + + // Xbox One will have requested the marketplace content - there is only that type +#ifndef _XBOX_ONE + app.AddDLCRequest((eDLCMarketplaceType)iIndex, true); +#endif + killTimer(PLAYER_ONLINE_TIMER_ID); + ui.NavigateToScene(m_iPad, eUIScene_DLCOffersMenu, param); + break; + } + }; +} + +void UIScene_DLCMainMenu::handleTimerComplete(int id) +{ +#if ( defined __PS3__ || defined __ORBIS__ || defined __PSVITA__) + switch(id) + { + case PLAYER_ONLINE_TIMER_ID: +#ifndef _WINDOWS64 + if(ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())==false) + { + // check the player hasn't gone offline + // If they have, bring up the PSN warning and exit from the leaderboards + unsigned int uiIDA[1]; + uiIDA[0]=IDS_OK; + C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_CONNECTION_LOST, g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT), uiIDA,1,ProfileManager.GetPrimaryPad(),UIScene_DLCMainMenu::ExitDLCMainMenu,this, app.GetStringTable()); + } +#endif + break; + } +#endif +} + +int UIScene_DLCMainMenu::ExitDLCMainMenu(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_DLCMainMenu* pClass = (UIScene_DLCMainMenu*)pParam; + +#ifdef __ORBIS__ + sceNpCommerceHidePsStoreIcon(); +#elif defined __PSVITA__ + sceNpCommerce2HidePsStoreIcon(); +#endif + pClass->navigateBack(); + + return 0; +} + +void UIScene_DLCMainMenu::handleGainFocus(bool navBack) +{ + UIScene::handleGainFocus(navBack); + + updateTooltips(); + + if(navBack) + { + // add the timer back in +#if ( defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ ) + addTimer( PLAYER_ONLINE_TIMER_ID, PLAYER_ONLINE_TIMER_TIME ); +#endif + } +} + +void UIScene_DLCMainMenu::tick() +{ + UIScene::tick(); + +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + if((m_bCategoriesShown==false) && (app.GetCommerceCategoriesRetrieved())) + { + // disable the timer display on this menu + m_Timer.setVisible(false); + m_bCategoriesShown=true; + + // add the categories to the list box + SonyCommerce::CategoryInfo *pCategories=app.GetCategoryInfo(); + std::list::iterator iter = pCategories->subCategories.begin(); + SonyCommerce::CategoryInfoSub category; + for(int i=0;icountOfSubCategories;i++) + { + // add a button in with the subcategory + category = (SonyCommerce::CategoryInfoSub)(*iter); + + string teststring=category.categoryName; + m_buttonListOffers.addItem(teststring,i); + + iter++; + } + + // set the focus to the first thing in the categories if there are any + if(pCategories->countOfSubCategories>0) + { + m_buttonListOffers.setFocus(true); + } + else + { +#if defined __ORBIS__ || defined __PSVITA__ || defined __PS3__ + app.CheckForEmptyStore(ProfileManager.GetPrimaryPad()); +#endif + // need to display text to say no downloadable content available yet + m_labelOffers.setLabel(app.GetString(IDS_NO_DLCCATEGORIES)); + +#ifdef __ORBIS__ + // 4J-JEV: TRC Requirement (R4055), need to display this system message. + ProfileManager.DisplaySystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_EMPTY_STORE, ProfileManager.GetPrimaryPad() ); +#endif + } + + } +#endif +} + diff --git a/Minecraft.Client/Common/UI/UIScene_DLCMainMenu.h b/Minecraft.Client/Common/UI/UIScene_DLCMainMenu.h new file mode 100644 index 00000000..15272fe1 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_DLCMainMenu.h @@ -0,0 +1,50 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_DLCMainMenu : public UIScene +{ +private: + enum EControls + { + eControl_OffersList, + }; + + UIControl_ButtonList m_buttonListOffers; + UIControl_Label m_labelOffers, m_labelXboxStore; + UIControl m_Timer; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttonListOffers, "OffersList") + UI_MAP_ELEMENT( m_labelOffers, "OffersList_Title") + UI_MAP_ELEMENT( m_Timer, "Timer") + if(m_loadedResolution == eSceneResolution_1080) + { + UI_MAP_ELEMENT( m_labelXboxStore, "XboxLabel" ) + } + UI_END_MAP_ELEMENTS_AND_NAMES() + + static int ExitDLCMainMenu(void *pParam,int iPad,C4JStorage::EMessageResult result); + +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + bool m_bCategoriesShown; +#endif + +public: + UIScene_DLCMainMenu(int iPad, void *initData, UILayer *parentLayer); + ~UIScene_DLCMainMenu(); + virtual void handleTimerComplete(int id); + virtual void handleGainFocus(bool navBack); + + virtual EUIScene getSceneType() { return eUIScene_DLCMainMenu;} + virtual void tick(); + virtual void updateTooltips(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + virtual void handlePress(F64 controlId, F64 childId); +}; diff --git a/Minecraft.Client/Common/UI/UIScene_DLCOffersMenu.cpp b/Minecraft.Client/Common/UI/UIScene_DLCOffersMenu.cpp new file mode 100644 index 00000000..9dbdc3d4 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_DLCOffersMenu.cpp @@ -0,0 +1,923 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_DLCOffersMenu.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) +#include "Common\Network\Sony\SonyHttp.h" +#endif + +#ifdef __PSVITA__ +#include "PSVita\Network\SonyCommerce_Vita.h" +#endif + +#define PLAYER_ONLINE_TIMER_ID 0 +#define PLAYER_ONLINE_TIMER_TIME 100 + +UIScene_DLCOffersMenu::UIScene_DLCOffersMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + m_bProductInfoShown=false; + DLCOffersParam *param=(DLCOffersParam *)initData; + m_iProductInfoIndex=param->iType; + m_iCurrentDLC=0; + m_iTotalDLC=0; +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + m_pvProductInfo=NULL; +#endif + m_bAddAllDLCButtons=true; + + // Setup all the Iggy references we need for this scene + initialiseMovie(); + // Alert the app the we want to be informed of ethernet connections + app.SetLiveLinkRequired( true ); + + m_bIsSD=!RenderManager.IsHiDef() && !RenderManager.IsWidescreen(); + + m_labelOffers.init(app.GetString(IDS_DOWNLOADABLE_CONTENT_OFFERS)); + m_buttonListOffers.init(eControl_OffersList); + m_labelHTMLSellText.init(" "); + m_labelPriceTag.init(" "); + TelemetryManager->RecordMenuShown(m_iPad, eUIScene_DLCOffersMenu, 0); + + m_bHasPurchased = false; + m_bIsSelected = false; + + if(m_loadedResolution == eSceneResolution_1080) + { +#ifdef _DURANGO + m_labelXboxStore.init( app.GetString(IDS_XBOX_STORE) ); +#else + m_labelXboxStore.init( L"" ); +#endif + } + +#ifdef _DURANGO + m_pNoImageFor_DLC = NULL; + // If we don't yet have this DLC, we need to display a timer + m_bDLCRequiredIsRetrieved=false; + m_bIgnorePress=true; + m_bSelectionChanged=true; + // display a timer + m_Timer.setVisible(true); + +#endif + +#ifdef __ORBIS__ + //sceNpCommerceShowPsStoreIcon(SCE_NP_COMMERCE_PS_STORE_ICON_CENTER); +#endif + +#if ( defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ ) + addTimer( PLAYER_ONLINE_TIMER_ID, PLAYER_ONLINE_TIMER_TIME ); +#endif + +#ifdef __PSVITA__ + ui.TouchBoxRebuild(this); +#endif +} + +UIScene_DLCOffersMenu::~UIScene_DLCOffersMenu() +{ + // Alert the app the we no longer want to be informed of ethernet connections + app.SetLiveLinkRequired( false ); +} + +void UIScene_DLCOffersMenu::handleTimerComplete(int id) +{ +#if ( defined __PS3__ || defined __ORBIS__ || defined __PSVITA__) + switch(id) + { + case PLAYER_ONLINE_TIMER_ID: +#ifndef _WINDOWS64 + if(ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())==false) + { + // check the player hasn't gone offline + // If they have, bring up the PSN warning and exit from the DLC menu + unsigned int uiIDA[1]; + uiIDA[0]=IDS_OK; + C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_CONNECTION_LOST, g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT), uiIDA,1,ProfileManager.GetPrimaryPad(),UIScene_DLCOffersMenu::ExitDLCOffersMenu,this, app.GetStringTable()); + } +#endif + break; + } +#endif +} + +int UIScene_DLCOffersMenu::ExitDLCOffersMenu(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_DLCOffersMenu* pClass = (UIScene_DLCOffersMenu*)pParam; + +#ifdef __ORBIS__ + sceNpCommerceHidePsStoreIcon(); +#elif defined __PSVITA__ + sceNpCommerce2HidePsStoreIcon(); +#endif + ui.NavigateToHomeMenu();//iPad,eUIScene_MainMenu); + + return 0; +} + +wstring UIScene_DLCOffersMenu::getMoviePath() +{ + return L"DLCOffersMenu"; +} + +void UIScene_DLCOffersMenu::updateTooltips() +{ + int iA = -1; + if(m_bIsSelected) + { + if( !m_bHasPurchased ) + { + iA = IDS_TOOLTIPS_INSTALL; + } + else + { + iA = IDS_TOOLTIPS_REINSTALL; + } + } + ui.SetTooltips( m_iPad, iA,IDS_TOOLTIPS_BACK); +} + +void UIScene_DLCOffersMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + navigateBack(); + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_UP: + if(pressed) + { + // 4J - TomK don't proceed if there is no DLC to navigate through + if(m_iTotalDLC > 0) + { + if(m_iCurrentDLC > 0) + m_iCurrentDLC--; + + m_bProductInfoShown = false; + } + } + sendInputToMovie(key, repeat, pressed, released); + break; + + case ACTION_MENU_DOWN: + if(pressed) + { + // 4J - TomK don't proceed if there is no DLC to navigate through + if(m_iTotalDLC > 0) + { + if(m_iCurrentDLC < (m_iTotalDLC - 1)) + m_iCurrentDLC++; + + m_bProductInfoShown = false; + } + } + sendInputToMovie(key, repeat, pressed, released); + break; + + case ACTION_MENU_LEFT: + /* +#ifdef _DEBUG + static int iTextC=0; + switch(iTextC) + { + case 0: + m_labelHTMLSellText.init("Voici un fantastique mini-pack de 24 apparences pour personnaliser votre personnage Minecraft et vous mettre dans l'ambiance des fêtes de fin d'année.

1-4 joueurs
2-8 joueurs en réseau

Cet article fait l’objet d’une licence ou d’une sous-licence de Sony Computer Entertainment America, et est soumis aux conditions générales du service du réseau, au contrat d’utilisateur, aux restrictions d’utilisation de cet article et aux autres conditions applicables, disponibles sur le site www.us.playstation.com/support/useragreements. Si vous ne souhaitez pas accepter ces conditions, ne téléchargez pas ce produit. Cet article peut être utilisé avec un maximum de deux systèmes PlayStation®3 activés associés à ce compte Sony Entertainment Network. 

'Minecraft' est une marque commerciale de Notch Development AB."); + break; + case 1: + m_labelHTMLSellText.init("Un fabuloso minipack de 24 aspectos para personalizar tu personaje de Minecraft y ponerte a tono con las fiestas.

1-4 jugadores
2-8 jugadores en red

Sony Computer Entertainment America le concede la licencia o sublicencia de este artículo, que está sujeto a los términos de servicio y al acuerdo de usuario de la red. Las restricciones de uso de este artículo, así como otros términos aplicables, se encuentran en www.us.playstation.com/support/useragreements. Si no desea aceptar todos estos términos, no descargue este artículo. Este artículo puede usarse en hasta dos sistemas PlayStation®3 activados asociados con esta cuenta de Sony Entertainment Network. 

'Minecraft' es una marca comercial de Notch Development AB."); + break; + case 2: + m_labelHTMLSellText.init("Este é um incrível pacote com 24 capas para personalizar seu personagem no Minecraft e entrar no clima de final de ano.

1-4 Jogadores
Jogadores em rede 2-8

Este item está sendo licenciado ou sublicenciado para você pela Sony Computer Entertainment America e está sujeito aos Termos de Serviço da Rede e Acordo do Usuário, as restrições de uso deste item e outros termos aplicáveis estão localizados em www.us.playstation.com/support/useragreements. Caso não queira aceitar todos esses termos, não baixe este item. Este item pode ser usado com até 2 sistemas PlayStation®3 ativados associados a esta Conta de Rede Sony Entertainment. 

'Minecraft' é uma marca registrada da Notch Development AB"); + break; + } + iTextC++; + if(iTextC>2) iTextC=0; +#endif + */ + case ACTION_MENU_RIGHT: + case ACTION_MENU_OTHER_STICK_DOWN: + case ACTION_MENU_OTHER_STICK_UP: + // don't pass down PageUp or PageDown because this will cause conflicts between the buttonlist and scrollable html text component + //case ACTION_MENU_PAGEUP: + //case ACTION_MENU_PAGEDOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_DLCOffersMenu::handlePress(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_OffersList: + { +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + // buy the DLC + + vector::iterator it = m_pvProductInfo->begin(); + string teststring; + for(int i=0;i-1)) + { + int iIndex = (int)childId; + MARKETPLACE_CONTENTOFFER_INFO xOffer = StorageManager.GetOffer(iIndex); + UpdateDisplay(xOffer); + }*/ +#endif + +#if defined __PSVITA__ || defined __ORBIS__ + if(m_pvProductInfo) + { + m_bIsSelected = true; + vector::iterator it = m_pvProductInfo->begin(); + string teststring; + for(int i=0;isize(); + } + + vector::iterator it = m_pvProductInfo->begin(); + string teststring; + bool bFirstItemSet=false; + for(int i=0;idwImageBytes!=0) + { + pbImageData=pSONYDLCInfo->pbImageData; + iImageDataBytes=pSONYDLCInfo->dwImageBytes; + bDeleteData=false; // we'll clean up the local LDC images + } + else +#endif + if(info.imageUrl[0]!=0) + { + SonyHttp::getDataFromURL(info.imageUrl,(void **)&pbImageData,&iImageDataBytes); + bDeleteData=true; + } + + if(iImageDataBytes!=0) + { + // set the image + registerSubstitutionTexture(textureName,pbImageData,iImageDataBytes,bDeleteData); + m_bitmapIconOfferImage.setTextureName(textureName); + // 4J Stu - Don't delete this + //delete [] pbImageData; + } + else + { + m_bitmapIconOfferImage.setTextureName(L""); + } + } + else + { + m_bitmapIconOfferImage.setTextureName(textureName); + } + } + it++; + } + + if(bFirstItemSet==false) + { + // we were not able to add any items to the list + m_labelOffers.setLabel(app.GetString(IDS_NO_DLCCATEGORIES)); + } + else + { + // set the focus to the first thing in the categories if there are any + if(m_pvProductInfo->size()>0) + { + m_buttonListOffers.setFocus(true); + } + else + { + // need to display text to say no downloadable content available yet + m_labelOffers.setLabel(app.GetString(IDS_NO_DLCCATEGORIES)); + } + } + + m_Timer.setVisible(false); + m_bProductInfoShown=true; + } + } + else + { +#ifdef __PSVITA__ + // MGH - fixes bug 5768 on Vita - should be extended properly to work for other platforms + if((SonyCommerce_Vita::getPurchasabilityUpdated()) && app.GetCommerceProductListRetrieved()&& app.GetCommerceProductListInfoRetrieved() && m_iTotalDLC > 0) + { + + { + vector::iterator it = m_pvProductInfo->begin(); + for(int i=0;i 0) + { + + + vector::iterator it = m_pvProductInfo->begin(); + string teststring; + for(int i=0;idwImageBytes!=0) + { + pbImageData=pSONYDLCInfo->pbImageData; + iImageDataBytes=pSONYDLCInfo->dwImageBytes; + bDeleteData=false; // we'll clean up the local LDC images + } + else +#endif + { + SonyHttp::getDataFromURL(info.imageUrl,(void **)&pbImageData,&iImageDataBytes); + bDeleteData=true; + } + + if(iImageDataBytes!=0) + { + // set the image + registerSubstitutionTexture(textureName,pbImageData,iImageDataBytes, bDeleteData); + m_bitmapIconOfferImage.setTextureName(textureName); + + // 4J Stu - Don't delete this + //delete [] pbImageData; + } + else + { + m_bitmapIconOfferImage.setTextureName(L""); + } + } + else + { + m_bitmapIconOfferImage.setTextureName(textureName); + } + m_bProductInfoShown=true; + m_Timer.setVisible(false); + } + + } +#elif defined _XBOX_ONE + if(m_bAddAllDLCButtons) + { + // Is the DLC we're looking for available? + if(!m_bDLCRequiredIsRetrieved) + { + // DLCContentRetrieved is to see if the type of content has been retrieved - and on Durango there is only type 0 - XMARKETPLACE_OFFERING_TYPE_CONTENT + if(app.DLCContentRetrieved(e_Marketplace_Content)) + { + m_bDLCRequiredIsRetrieved=true; + + // Retrieve the info + GetDLCInfo(app.GetDLCOffersCount(), false); + m_bIgnorePress=false; + m_bAddAllDLCButtons=false; + + // hide the timer + m_Timer.setVisible(false); + } + } + } + + // have to wait until we have the offers + if(m_bSelectionChanged && m_bDLCRequiredIsRetrieved) + { + // need to update text and icon + if(m_buttonListOffers.hasFocus() && (getControlChildFocus()>-1)) + { + int iIndex = getControlChildFocus(); + MARKETPLACE_CONTENTOFFER_INFO xOffer = StorageManager.GetOffer(iIndex); + + if(UpdateDisplay(xOffer)) + { + // image was available + m_bSelectionChanged=false; + } + } + } + +// if(m_bBitmapOfferIconDisplayed==false) +// { +// // do we have it yet? +// if +// } + // retrieve the icons for the DLC +// if(m_vIconRetrieval.size()>0) +// { +// // for each icon, request it, and remove it from the list +// // the callback for the retrieval will update the display if needed +// +// AUTO_VAR(itEnd, m_vIconRetrieval.end()); +// for (AUTO_VAR(it, m_vIconRetrieval.begin()); it != itEnd; it++) +// { +// +// } +// +// } +#endif +} + +#if defined _XBOX_ONE +void UIScene_DLCOffersMenu::GetDLCInfo( int iOfferC, bool bUpdateOnly ) +{ + MARKETPLACE_CONTENTOFFER_INFO xOffer; + int iCount=0; + bool bNoDLCToDisplay = true; + unsigned int uiDLCCount=0; + + + if(bUpdateOnly) // Just update the info on the current list + { + + } + else + { + // clear out the list + m_buttonListOffers.clearList(); + + // need to reorder the DLC display according to dlc uiSortIndex + SORTINDEXSTRUCT *OrderA = new SORTINDEXSTRUCT [iOfferC]; + + for(int i = 0; i < iOfferC; i++) + { + xOffer = StorageManager.GetOffer(i); + // Check that this is in the list of known DLC + DLC_INFO *pDLC=app.GetDLCInfoForFullOfferID(xOffer.wszProductID); + + if(pDLC!=NULL) + { + OrderA[uiDLCCount].uiContentIndex=i; + OrderA[uiDLCCount++].uiSortIndex=pDLC->uiSortIndex; + } + else + { + app.DebugPrintf("Unknown offer - %ls\n",xOffer.wszOfferName); + } + } + + qsort( OrderA, uiDLCCount, sizeof(SORTINDEXSTRUCT), OrderSortFunction ); + + for(int i = 0; i < uiDLCCount; i++) + { + xOffer = StorageManager.GetOffer(OrderA[i].uiContentIndex); + + // Check that this is in the list of known DLC + DLC_INFO *pDLC=app.GetDLCInfoForFullOfferID(xOffer.wszProductID); + + if(pDLC==NULL) + { + // skip this one + app.DebugPrintf("Unknown offer - %ls\n",xOffer.wszOfferName); + continue; + } + + if(pDLC->eDLCType==(eDLCContentType)m_iProductInfoIndex) + { + wstring wstrTemp=xOffer.wszOfferName; + + // 4J-PB - Rog requested we remove the Minecraft at the start of the name. It's required for the Bing search, but gets in the way here + app.DebugPrintf("Adding %ls at %d\n",wstrTemp.c_str(), i); + + if(wcsncmp(L"Minecraft ",wstrTemp.c_str(),10)==0) + { + app.DebugPrintf("Removing Minecraft from name\n"); + WCHAR *pwchNewName=(WCHAR *)wstrTemp.c_str(); + wstrTemp=&pwchNewName[10]; + } + +#ifdef _XBOX_ONE + // 4J-PB - the hasPurchased comes from the local installed package info + // find the DLC in the installed packages + XCONTENT_DATA *pContentData=StorageManager.GetInstalledDLC(xOffer.wszProductID); + + if(pContentData!=NULL) + { + m_buttonListOffers.addItem(wstrTemp,!pContentData->bTrialLicense,OrderA[i].uiContentIndex); + } + else + { + m_buttonListOffers.addItem(wstrTemp,false,OrderA[i].uiContentIndex); + } +#else + m_buttonListOffers.addItem(wstrTemp,xOffer.fUserHasPurchased,OrderA[i].uiContentIndex); +#endif + + // add the required image to the retrieval queue + m_vIconRetrieval.push_back(pDLC->wchBanner); + + /** 4J JEV: + * We've filtered results out from the list, need to keep track + * of the 'actual' list index. + */ + iCount++; + } + } + + + // Check if there is nothing to display, and display the default "nothing available at this time" + if(iCount>0) + { + bNoDLCToDisplay=false; + xOffer = StorageManager.GetOffer(OrderA[0].uiContentIndex); + //m_buttonListOffers.setCurrentSelection(0); + + UpdateDisplay(xOffer); + } + delete OrderA; + } + + // turn off the timer display + //m_Timer.SetShow(FALSE); + if(bNoDLCToDisplay) + { + // set the default text + + wchar_t formatting[40]; + wstring wstrTemp = app.GetString(IDS_NO_DLCOFFERS); +// swprintf(formatting, 40, L"", m_bIsSD?12:14); +// wstrTemp = formatting + wstrTemp; + + m_labelHTMLSellText.setLabel(wstrTemp); + m_labelPriceTag.setVisible(false); + } +} + +int UIScene_DLCOffersMenu::OrderSortFunction(const void* a, const void* b) +{ + return ((SORTINDEXSTRUCT*)b)->uiSortIndex - ((SORTINDEXSTRUCT*)a)->uiSortIndex; +} + +void UIScene_DLCOffersMenu::UpdateTooltips(MARKETPLACE_CONTENTOFFER_INFO& xOffer) +{ + m_bHasPurchased = xOffer.fUserHasPurchased; + m_bIsSelected = true; + updateTooltips(); +} + +bool UIScene_DLCOffersMenu::UpdateDisplay(MARKETPLACE_CONTENTOFFER_INFO& xOffer) +{ + bool bImageAvailable=false; +#ifdef _XBOX_ONE + DLC_INFO *dlc = app.GetDLCInfoForFullOfferID(xOffer.wszProductID); +#else + DLC_INFO *dlc = app.GetDLCInfoForFullOfferID(xOffer.wszOfferName); +#endif + + if (dlc != NULL) + { + WCHAR *cString = dlc->wchBanner; + + + // is the file in the local DLC images? + // is the file in the TMS XZP? + //int iIndex = app.GetLocalTMSFileIndex(cString, true); + + if(dlc->dwImageBytes!=0) + { + //app.LoadLocalTMSFile(cString); + + // set the image - no delete + registerSubstitutionTexture(cString,dlc->pbImageData,dlc->dwImageBytes,false); + m_bitmapIconOfferImage.setTextureName(cString); + bImageAvailable=true; + } + else + { + bool bPresent = app.IsFileInMemoryTextures(cString); + if (!bPresent) + { + // Image has not come in yet + // Set the item monitored in the timer, so we can set the image when it comes in + m_pNoImageFor_DLC=dlc; + + app.AddTMSPPFileTypeRequest(dlc->eDLCType,true); + bImageAvailable=false; + //m_bitmapIconOfferImage.setTextureName(L""); + } + else + { + if(hasRegisteredSubstitutionTexture(cString)==false) + { + BYTE *pData=NULL; + DWORD dwSize=0; + app.GetMemFileDetails(cString,&pData,&dwSize); + // set the image +#ifdef _XBOX_ONE + registerSubstitutionTexture(cString,pData,dwSize); +#else + registerSubstitutionTexture(cString,pData,dwSize,true); +#endif + m_bitmapIconOfferImage.setTextureName(cString); + } + else + { + m_bitmapIconOfferImage.setTextureName(cString); + } + bImageAvailable=true; + } + } + + m_labelHTMLSellText.setLabel(xOffer.wszSellText); + + // set the price info + m_labelPriceTag.setVisible(true); + m_labelPriceTag.setLabel(xOffer.wszCurrencyPrice); + + UpdateTooltips(xOffer); + } + else + { + wchar_t formatting[40]; + wstring wstrTemp = app.GetString(IDS_NO_DLCOFFERS); + m_labelHTMLSellText.setLabel(wstrTemp.c_str()); + m_labelPriceTag.setVisible(false); + } + + return bImageAvailable; +} +#endif + +#ifdef _XBOX_ONE +void UIScene_DLCOffersMenu::HandleDLCLicenseChange() +{ + // flag an update of the display + int iOfferC=app.GetDLCOffersCount(); + + GetDLCInfo(iOfferC,false); +} +#endif // _XBOX_ONE + +#ifdef __PS3__ +void UIScene_DLCOffersMenu::HandleDLCInstalled() +{ + app.DebugPrintf(4,"UIScene_DLCOffersMenu::HandleDLCInstalled\n"); + +// m_buttonListOffers.clearList(); +// m_bAddAllDLCButtons=true; +// m_bProductInfoShown=false; +} + +// void UIScene_DLCOffersMenu::HandleDLCMountingComplete() +// { +// app.DebugPrintf(4,"UIScene_SkinSelectMenu::HandleDLCMountingComplete\n"); +//} + + +#endif \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_DLCOffersMenu.h b/Minecraft.Client/Common/UI/UIScene_DLCOffersMenu.h new file mode 100644 index 00000000..c5fcac7e --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_DLCOffersMenu.h @@ -0,0 +1,96 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_DLCOffersMenu : public UIScene +{ +private: + enum EControls + { + eControl_OffersList, + }; + + bool m_bIsSD; + bool m_bHasPurchased; + bool m_bIsSelected; + + UIControl_DLCList m_buttonListOffers; + UIControl_Label m_labelOffers, m_labelPriceTag, m_labelXboxStore; + UIControl_HTMLLabel m_labelHTMLSellText; + UIControl_BitmapIcon m_bitmapIconOfferImage; + UIControl m_Timer; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttonListOffers, "OffersList") + UI_MAP_ELEMENT( m_labelOffers, "OffersList_Title") + UI_MAP_ELEMENT( m_labelPriceTag, "PriceTag") + UI_MAP_ELEMENT( m_labelHTMLSellText, "HTMLSellText") + UI_MAP_ELEMENT( m_bitmapIconOfferImage, "DLCIcon" ) + UI_MAP_ELEMENT( m_Timer, "Timer") + + if(m_loadedResolution == eSceneResolution_1080) + { + UI_MAP_ELEMENT( m_labelXboxStore, "XboxLabel" ) + } + UI_END_MAP_ELEMENTS_AND_NAMES() +public: + UIScene_DLCOffersMenu(int iPad, void *initData, UILayer *parentLayer); + ~UIScene_DLCOffersMenu(); + static int ExitDLCOffersMenu(void *pParam,int iPad,C4JStorage::EMessageResult result); + + virtual EUIScene getSceneType() { return eUIScene_DLCOffersMenu;} + virtual void tick(); + virtual void updateTooltips(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + virtual void handlePress(F64 controlId, F64 childId); + virtual void handleSelectionChanged(F64 selectedId); + virtual void handleFocusChange(F64 controlId, F64 childId); + virtual void handleTimerComplete(int id); +#ifdef __PS3__ + virtual void HandleDLCInstalled(); +#endif + +#ifdef _XBOX_ONE + virtual void HandleDLCLicenseChange(); +#endif + +private: +#ifdef _DURANGO + void GetDLCInfo( int iOfferC, bool bUpdateOnly=false ); + void UpdateTooltips(MARKETPLACE_CONTENTOFFER_INFO& xOffer); + bool UpdateDisplay(MARKETPLACE_CONTENTOFFER_INFO& xOffer); + + static int OrderSortFunction(const void* a, const void* b); + + bool m_bIgnorePress; + bool m_bDLCRequiredIsRetrieved; + DLC_INFO *m_pNoImageFor_DLC; + + typedef struct + { + unsigned int uiContentIndex; + unsigned int uiSortIndex; + } + SORTINDEXSTRUCT; + + vector m_vIconRetrieval; + bool m_bSelectionChanged; + +#endif + + bool m_bProductInfoShown; + int m_iProductInfoIndex; + int m_iCurrentDLC; + int m_iTotalDLC; + bool m_bAddAllDLCButtons; +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + std::vector*m_pvProductInfo; +#endif +}; diff --git a/Minecraft.Client/Common/UI/UIScene_DeathMenu.cpp b/Minecraft.Client/Common/UI/UIScene_DeathMenu.cpp new file mode 100644 index 00000000..2026bfca --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_DeathMenu.cpp @@ -0,0 +1,191 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_DeathMenu.h" +#include "IUIScene_PauseMenu.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" + +UIScene_DeathMenu::UIScene_DeathMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_buttonRespawn.init(app.GetString(IDS_RESPAWN),eControl_Respawn); + m_buttonExitGame.init(app.GetString(IDS_EXIT_GAME),eControl_ExitGame); + + m_labelTitle.setLabel(app.GetString(IDS_YOU_DIED)); + + m_bIgnoreInput = false; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft != NULL && pMinecraft->localgameModes[iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[iPad]; + + // This just allows it to be shown + gameMode->getTutorial()->showTutorialPopup(false); + } +} + +UIScene_DeathMenu::~UIScene_DeathMenu() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft != NULL && pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + + // This just allows it to be shown + gameMode->getTutorial()->showTutorialPopup(true); + } +} + +wstring UIScene_DeathMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"DeathMenuSplit"; + } + else + { + return L"DeathMenu"; + } +} + +void UIScene_DeathMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT); +} + +void UIScene_DeathMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if(m_bIgnoreInput) return; + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + 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; + } +} + +void UIScene_DeathMenu::handlePress(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_Respawn: + m_bIgnoreInput = true; + app.SetAction(m_iPad,eAppAction_Respawn); +#ifdef _DURANGO + //InputManager.SetEnabledGtcButtons(_360_GTC_MENU|_360_GTC_PAUSE|_360_GTC_VIEW); +#endif + break; + case eControl_ExitGame: + { + Minecraft *pMinecraft=Minecraft::GetInstance(); + // 4J-PB - fix for #8333 - BLOCKER: If player decides to exit game, then cancels the exit player becomes stuck at game over screen + //m_bIgnoreInput = true; + // Check if it's the trial version + if(ProfileManager.IsFullVersion()) + { + + // is it the primary player exiting? + if(m_iPad==ProfileManager.GetPrimaryPad()) + { + UINT uiIDA[3]; + int playTime = -1; + if( pMinecraft->localplayers[m_iPad] != NULL ) + { + playTime = (int)pMinecraft->localplayers[m_iPad]->getSessionTimer(); + } + TelemetryManager->RecordLevelExit(m_iPad, eSen_LevelExitStatus_Failed); + +#if defined (_XBOX_ONE) || defined(__ORBIS__) + if(g_NetworkManager.IsHost() && StorageManager.GetSaveDisabled()) + { + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_EXIT_GAME_SAVE; + uiIDA[2]=IDS_EXIT_GAME_NO_SAVE; + + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, m_iPad,&IUIScene_PauseMenu::ExitGameSaveDialogReturned,this, app.GetStringTable(), 0, 0, false); + } + else + { + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned,this, app.GetStringTable(), 0, 0, false); + } + +#else + if(StorageManager.GetSaveDisabled()) + { + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_PROGRESS_LOST, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned,this, app.GetStringTable(), 0, 0, false); + } + else + { + if( g_NetworkManager.IsHost() ) + { + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_EXIT_GAME_SAVE; + uiIDA[2]=IDS_EXIT_GAME_NO_SAVE; + + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, m_iPad,&IUIScene_PauseMenu::ExitGameSaveDialogReturned,this, app.GetStringTable(), 0, 0, false); + } + else + { + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned,this, app.GetStringTable(), 0, 0, false); + } + } +#endif + } + else + { + TelemetryManager->RecordLevelExit(m_iPad, eSen_LevelExitStatus_Failed); + + // just exit the player + app.SetAction(m_iPad,eAppAction_ExitPlayer); + } + } + else + { + // is it the primary player exiting? + if(m_iPad==ProfileManager.GetPrimaryPad()) + { + TelemetryManager->RecordLevelExit(m_iPad, eSen_LevelExitStatus_Failed); + + // adjust the trial time played + ui.ReduceTrialTimerValue(); + + // exit the level + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_PROGRESS_LOST, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned,this, app.GetStringTable(), 0, 0, false); + } + else + { + TelemetryManager->RecordLevelExit(m_iPad, eSen_LevelExitStatus_Failed); + + // just exit the player + app.SetAction(m_iPad,eAppAction_ExitPlayer); + } + } + } + break; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_DeathMenu.h b/Minecraft.Client/Common/UI/UIScene_DeathMenu.h new file mode 100644 index 00000000..7285e413 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_DeathMenu.h @@ -0,0 +1,44 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_DeathMenu : public UIScene +{ +private: + enum EControls + { + eControl_Respawn, + eControl_ExitGame + }; + + bool m_bIgnoreInput; + + UIControl_Button m_buttonRespawn, m_buttonExitGame; + UIControl_Label m_labelTitle; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttonRespawn, "Respawn") + UI_MAP_ELEMENT( m_buttonExitGame, "ExitGame") + UI_MAP_ELEMENT( m_labelTitle, "Title") + UI_END_MAP_ELEMENTS_AND_NAMES() +public: + UIScene_DeathMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_DeathMenu(); + + virtual EUIScene getSceneType() { return eUIScene_DeathMenu;} + virtual void updateTooltips(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +protected: + void handlePress(F64 controlId, F64 childId); + +#ifdef _DURANGO + virtual long long getDefaultGtcButtons() { return 0; } +#endif +}; diff --git a/Minecraft.Client/Common/UI/UIScene_DebugCreateSchematic.cpp b/Minecraft.Client/Common/UI/UIScene_DebugCreateSchematic.cpp new file mode 100644 index 00000000..2a8ac9f8 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_DebugCreateSchematic.cpp @@ -0,0 +1,216 @@ +#include "stdafx.h" + +#ifdef _DEBUG_MENUS_ENABLED +#include "UI.h" +#include "UIScene_DebugCreateSchematic.h" +#include "Minecraft.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" + +UIScene_DebugCreateSchematic::UIScene_DebugCreateSchematic(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_labelTitle.init(L"Name"); + m_labelStartX.init(L"StartX"); + m_labelStartY.init(L"StartY"); + m_labelStartZ.init(L"StartZ"); + m_labelEndX.init(L"EndX"); + m_labelEndY.init(L"EndY"); + m_labelEndZ.init(L"EndZ"); + + m_textInputStartX.init(L"",eControl_StartX); + m_textInputStartY.init(L"",eControl_StartY); + m_textInputStartZ.init(L"",eControl_StartZ); + m_textInputEndX.init(L"",eControl_EndX); + m_textInputEndY.init(L"",eControl_EndY); + m_textInputEndZ.init(L"",eControl_EndZ); + m_textInputName.init(L"",eControl_Name); + + m_checkboxSaveMobs.init(L"Save Mobs", eControl_SaveMobs,false); + m_checkboxUseCompression.init(L"Use Compression", eControl_UseCompression, false); + + m_buttonCreate.init(L"Create",eControl_Create); + + m_data = new ConsoleSchematicFile::XboxSchematicInitParam(); +} + +wstring UIScene_DebugCreateSchematic::getMoviePath() +{ + return L"DebugCreateSchematic"; +} + +void UIScene_DebugCreateSchematic::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + navigateBack(); + } + break; + case ACTION_MENU_OK: + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_DebugCreateSchematic::handlePress(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_Create: + { + // We want the start to be even + if(m_data->startX > 0 && m_data->startX%2 != 0) + m_data->startX-=1; + else if(m_data->startX < 0 && m_data->startX%2 !=0) + m_data->startX-=1; + if(m_data->startY < 0) m_data->startY = 0; + else if(m_data->startY > 0 && m_data->startY%2 != 0) + m_data->startY-=1; + if(m_data->startZ > 0 && m_data->startZ%2 != 0) + m_data->startZ-=1; + else if(m_data->startZ < 0 && m_data->startZ%2 !=0) + m_data->startZ-=1; + + // We want the end to be odd to have a total size that is even + if(m_data->endX > 0 && m_data->endX%2 == 0) + m_data->endX+=1; + else if(m_data->endX < 0 && m_data->endX%2 ==0) + m_data->endX+=1; + if(m_data->endY > Level::maxBuildHeight) + m_data->endY = Level::maxBuildHeight; + else if(m_data->endY > 0 && m_data->endY%2 == 0) + m_data->endY+=1; + else if(m_data->endY < 0 && m_data->endY%2 ==0) + m_data->endY+=1; + if(m_data->endZ > 0 && m_data->endZ%2 == 0) + m_data->endZ+=1; + else if(m_data->endZ < 0 && m_data->endZ%2 ==0) + m_data->endZ+=1; + + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(), eXuiServerAction_ExportSchematic, (void *)m_data); + + navigateBack(); + } + break; + case eControl_Name: + case eControl_StartX: + case eControl_StartY: + case eControl_StartZ: + case eControl_EndX: + case eControl_EndY: + case eControl_EndZ: + m_keyboardCallbackControl = (eControls)((int)controlId); + InputManager.RequestKeyboard(L"Enter something",L"",(DWORD)0,25,&UIScene_DebugCreateSchematic::KeyboardCompleteCallback,this,C_4JInput::EKeyboardMode_Default); + break; + }; +} + +void UIScene_DebugCreateSchematic::handleCheckboxToggled(F64 controlId, bool selected) +{ + switch((int)controlId) + { + case eControl_SaveMobs: + m_data->bSaveMobs = selected; + break; + case eControl_UseCompression: + if (selected) + m_data->compressionType = APPROPRIATE_COMPRESSION_TYPE; + else + m_data->compressionType = Compression::eCompressionType_RLE; + break; + } +} + +int UIScene_DebugCreateSchematic::KeyboardCompleteCallback(LPVOID lpParam,bool bRes) +{ + UIScene_DebugCreateSchematic *pClass=(UIScene_DebugCreateSchematic *)lpParam; + + uint16_t pchText[128]; + ZeroMemory(pchText, 128 * sizeof(uint16_t) ); + InputManager.GetText(pchText); + + if(pchText[0]!=0) + { + wstring value = (wchar_t *)pchText; + int iVal = 0; + if(!value.empty()) iVal = _fromString( value ); + switch(pClass->m_keyboardCallbackControl) + { + case eControl_Name: + pClass->m_textInputName.setLabel(value); + if(!value.empty()) + { + swprintf(pClass->m_data->name,64,L"%ls", value.c_str()); + } + else + { + swprintf(pClass->m_data->name,64,L"schematic"); + } + break; + case eControl_StartX: + pClass->m_textInputStartX.setLabel(value); + + if( iVal >= (LEVEL_MAX_WIDTH * -16) || iVal < (LEVEL_MAX_WIDTH * 16)) + { + pClass->m_data->startX = iVal; + } + break; + case eControl_StartY: + pClass->m_textInputStartY.setLabel(value); + + if( iVal >= (LEVEL_MAX_WIDTH * -16) || iVal < (LEVEL_MAX_WIDTH * 16)) + { + pClass->m_data->startY = iVal; + } + break; + case eControl_StartZ: + pClass->m_textInputStartZ.setLabel(value); + + if( iVal >= (LEVEL_MAX_WIDTH * -16) || iVal < (LEVEL_MAX_WIDTH * 16)) + { + pClass->m_data->startZ = iVal; + } + break; + case eControl_EndX: + pClass->m_textInputEndX.setLabel(value); + + if( iVal >= (LEVEL_MAX_WIDTH * -16) || iVal < (LEVEL_MAX_WIDTH * 16)) + { + pClass->m_data->endX = iVal; + } + break; + case eControl_EndY: + pClass->m_textInputEndY.setLabel(value); + + if( iVal >= (LEVEL_MAX_WIDTH * -16) || iVal < (LEVEL_MAX_WIDTH * 16)) + { + pClass->m_data->endY = iVal; + } + break; + case eControl_EndZ: + pClass->m_textInputEndZ.setLabel(value); + + if( iVal >= (LEVEL_MAX_WIDTH * -16) || iVal < (LEVEL_MAX_WIDTH * 16)) + { + pClass->m_data->endZ = iVal; + } + break; + } + } + + return 0; +} +#endif \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_DebugCreateSchematic.h b/Minecraft.Client/Common/UI/UIScene_DebugCreateSchematic.h new file mode 100644 index 00000000..cbfe785d --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_DebugCreateSchematic.h @@ -0,0 +1,73 @@ +#pragma once +#ifdef _DEBUG_MENUS_ENABLED +#include "UIScene.h" +#include "..\..\Common\GameRules\ConsoleSchematicFile.h" + +class UIScene_DebugCreateSchematic : public UIScene +{ +private: + enum eControls + { + eControl_Name, + eControl_StartX, + eControl_StartY, + eControl_StartZ, + eControl_EndX, + eControl_EndY, + eControl_EndZ, + eControl_SaveMobs, + eControl_UseCompression, + eControl_Create, + }; + + eControls m_keyboardCallbackControl; + + ConsoleSchematicFile::XboxSchematicInitParam *m_data; + +public: + UIScene_DebugCreateSchematic(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_DebugCreateSchematic;} + +protected: + UIControl_TextInput m_textInputStartX, m_textInputStartY, m_textInputStartZ, m_textInputEndX, m_textInputEndY, m_textInputEndZ, m_textInputName; + UIControl_CheckBox m_checkboxSaveMobs, m_checkboxUseCompression; + UIControl_Button m_buttonCreate; + UIControl_Label m_labelStartX, m_labelStartY, m_labelStartZ, m_labelEndX, m_labelEndY, m_labelEndZ, m_labelTitle; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_textInputStartX, "StartX") + UI_MAP_ELEMENT( m_textInputStartY, "StartY") + UI_MAP_ELEMENT( m_textInputStartZ, "StartZ") + UI_MAP_ELEMENT( m_textInputEndX, "EndX") + UI_MAP_ELEMENT( m_textInputEndY, "EndY") + UI_MAP_ELEMENT( m_textInputEndZ, "EndZ") + UI_MAP_ELEMENT( m_textInputName, "Name") + + UI_MAP_ELEMENT( m_checkboxSaveMobs, "SaveMobs") + UI_MAP_ELEMENT( m_checkboxUseCompression, "UseCompression") + + UI_MAP_ELEMENT( m_buttonCreate, "Create") + + UI_MAP_ELEMENT( m_labelStartX, "LabelStartX") + UI_MAP_ELEMENT( m_labelStartY, "LabelStartY") + UI_MAP_ELEMENT( m_labelStartZ, "LabelStartZ") + UI_MAP_ELEMENT( m_labelEndX, "LabelEndX") + UI_MAP_ELEMENT( m_labelEndY, "LabelEndY") + UI_MAP_ELEMENT( m_labelEndZ, "LabelEndZ") + UI_MAP_ELEMENT( m_labelTitle, "LabelTitle") + UI_END_MAP_ELEMENTS_AND_NAMES() + + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +protected: + void handlePress(F64 controlId, F64 childId); + virtual void handleCheckboxToggled(F64 controlId, bool selected); + +private: + static int KeyboardCompleteCallback(LPVOID lpParam,const bool bRes); +}; +#endif \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_DebugOptions.cpp b/Minecraft.Client/Common/UI/UIScene_DebugOptions.cpp new file mode 100644 index 00000000..658a8517 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_DebugOptions.cpp @@ -0,0 +1,96 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_DebugOptions.h" + +LPCWSTR UIScene_DebugOptionsMenu::m_DebugCheckboxTextA[eDebugSetting_Max+1]= +{ + L"Load Saves From Local Folder Mode", + L"Write Saves To Local Folder Mode", + L"Freeze Players", //L"Not Used", + L"Display Safe Area", + L"Mobs don't attack", + L"Freeze Time", + L"Disable Weather", + L"Craft Anything", + L"Use DPad for debug", + L"Mobs don't tick", + L"Instant Mine", + L"Show UI Console", + L"Distributable Save", + L"Debug Leaderboards", + L"Height-Water-Biome Maps", + L"Superflat Nether", + //L"Light/Dark background", + L"More lightning when thundering", + L"Go To Nether", + //L"Go To End", + L"Go To Overworld", + L"Unlock All DLC", //L"Toggle Font", + L"Show Marketing Guide", +}; + +UIScene_DebugOptionsMenu::UIScene_DebugOptionsMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + unsigned int uiDebugBitmask=app.GetGameSettingsDebugMask(iPad); + + IggyValuePath *root = IggyPlayerRootPath ( getMovie() ); + for(m_iTotalCheckboxElements = 0; m_iTotalCheckboxElements < eDebugSetting_Max && m_iTotalCheckboxElements < 21; ++m_iTotalCheckboxElements) + { + wstring label(m_DebugCheckboxTextA[m_iTotalCheckboxElements]); + m_checkboxes[m_iTotalCheckboxElements].init(label,m_iTotalCheckboxElements,(uiDebugBitmask&(1<gameRenderer->GetFovVal()); + m_sliderFov.init(TempString,eControl_FOV,0,100,(int)pMinecraft->gameRenderer->GetFovVal()); + + float currentTime = pMinecraft->level->getLevelData()->getTime() % 24000; + swprintf( (WCHAR *)TempString, 256, L"Set time (unsafe) (%d)", (int)currentTime); + m_sliderTime.init(TempString,eControl_Time,0,240,currentTime/100); + + m_buttonRain.init(L"Toggle Rain",eControl_Rain); + m_buttonThunder.init(L"Toggle Thunder",eControl_Thunder); + m_buttonSchematic.init(L"Create Schematic",eControl_Schematic); + m_buttonResetTutorial.init(L"Reset profile tutorial progress",eControl_ResetTutorial); + m_buttonSetCamera.init(L"Set camera",eControl_SetCamera); + m_buttonSetDay.init(L"Set Day", eControl_SetDay); + m_buttonSetNight.init(L"Set Night", eControl_SetNight); + + m_buttonListItems.init(eControl_Items); + + int listId = 0; + for(unsigned int i = 0; i < Item::items.length; ++i) + { + if(Item::items[i] != NULL) + { + m_itemIds.push_back(i); + m_buttonListItems.addItem(app.GetString(Item::items[i]->getDescriptionId()), listId); + ++listId; + } + } + + m_buttonListEnchantments.init(eControl_Enchantments); + + for(unsigned int i = 0; i < Enchantment::validEnchantments.size(); ++i ) + { + Enchantment *ench = Enchantment::validEnchantments.at(i); + + for(unsigned int level = ench->getMinLevel(); level <= ench->getMaxLevel(); ++level) + { + m_enchantmentIdAndLevels.push_back(pair(ench->id,level)); + m_buttonListEnchantments.addItem(app.GetString( ench->getDescriptionId() ) + _toString(level) ); + } + } + + m_buttonListMobs.init(eControl_Mobs); + m_buttonListMobs.addItem( L"Chicken" ); + m_mobFactories.push_back(eTYPE_CHICKEN); + m_buttonListMobs.addItem( L"Cow" ); + m_mobFactories.push_back(eTYPE_COW); + m_buttonListMobs.addItem( L"Pig" ); + m_mobFactories.push_back(eTYPE_PIG); + m_buttonListMobs.addItem( L"Sheep" ); + m_mobFactories.push_back(eTYPE_SHEEP); + m_buttonListMobs.addItem( L"Squid" ); + m_mobFactories.push_back(eTYPE_SQUID); + m_buttonListMobs.addItem( L"Wolf" ); + m_mobFactories.push_back(eTYPE_WOLF); + m_buttonListMobs.addItem( L"Creeper" ); + m_mobFactories.push_back(eTYPE_CREEPER); + m_buttonListMobs.addItem( L"Ghast" ); + m_mobFactories.push_back(eTYPE_GHAST); + m_buttonListMobs.addItem( L"Pig Zombie" ); + m_mobFactories.push_back(eTYPE_PIGZOMBIE); + m_buttonListMobs.addItem( L"Skeleton" ); + m_mobFactories.push_back(eTYPE_SKELETON); + m_buttonListMobs.addItem( L"Slime" ); + m_mobFactories.push_back(eTYPE_SLIME); + m_buttonListMobs.addItem( L"Spider" ); + m_mobFactories.push_back(eTYPE_SPIDER); + m_buttonListMobs.addItem( L"Zombie" ); + m_mobFactories.push_back(eTYPE_ZOMBIE); + m_buttonListMobs.addItem( L"Enderman" ); + m_mobFactories.push_back(eTYPE_ENDERMAN); + m_buttonListMobs.addItem( L"Silverfish" ); + m_mobFactories.push_back(eTYPE_SILVERFISH); + m_buttonListMobs.addItem( L"Cave Spider" ); + m_mobFactories.push_back(eTYPE_CAVESPIDER); + m_buttonListMobs.addItem( L"Mooshroom" ); + m_mobFactories.push_back(eTYPE_MUSHROOMCOW); + m_buttonListMobs.addItem( L"Snow Golem" ); + m_mobFactories.push_back(eTYPE_SNOWMAN); + m_buttonListMobs.addItem( L"Ender Dragon" ); + m_mobFactories.push_back(eTYPE_ENDERDRAGON); + m_buttonListMobs.addItem( L"Blaze" ); + m_mobFactories.push_back(eTYPE_BLAZE); + m_buttonListMobs.addItem( L"Magma Cube" ); + m_mobFactories.push_back(eTYPE_LAVASLIME); +} + +wstring UIScene_DebugOverlay::getMoviePath() +{ + return L"DebugMenu"; +} + +void UIScene_DebugOverlay::customDraw(IggyCustomDrawCallbackRegion *region) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localgameModes[m_iPad] == NULL) return; + + int itemId = -1; + swscanf((wchar_t*)region->name,L"item_%d",&itemId); + if (itemId == -1 || itemId > Item::ITEM_NUM_COUNT || Item::items[itemId] == NULL) + { + app.DebugPrintf("This is not the control we are looking for\n"); + } + else + { + shared_ptr item = shared_ptr( new ItemInstance(itemId,1,0) ); + if(item != NULL) customDrawSlotControl(region,m_iPad,item,1.0f,false,false); + } +} + +void UIScene_DebugOverlay::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + navigateBack(); + } + break; + case ACTION_MENU_OK: + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + if(pressed) + { + sendInputToMovie(key, repeat, pressed, released); + } + break; + } +} + +void UIScene_DebugOverlay::handlePress(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_Items: + { + app.DebugPrintf("UIScene_DebugOverlay::handlePress for itemsList: %f\n", childId); + int id = childId; + //app.SetXuiServerAction(m_iPad, eXuiServerAction_DropItem, (void *)m_itemIds[id]); + ClientConnection *conn = Minecraft::GetInstance()->getConnection(ProfileManager.GetPrimaryPad()); + conn->send( GiveItemCommand::preparePacket(dynamic_pointer_cast(Minecraft::GetInstance()->localplayers[ProfileManager.GetPrimaryPad()]), m_itemIds[id]) ); + } + break; + case eControl_Mobs: + { + int id = childId; + if(idgetConnection(ProfileManager.GetPrimaryPad()); + conn->send( EnchantItemCommand::preparePacket(dynamic_pointer_cast(Minecraft::GetInstance()->localplayers[ProfileManager.GetPrimaryPad()]), m_enchantmentIdAndLevels[id].first, m_enchantmentIdAndLevels[id].second) ); + } + break; + case eControl_Schematic: + { +#ifndef _CONTENT_PACKAGE + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_DebugCreateSchematic,NULL,eUILayer_Debug); +#endif + } + break; + case eControl_SetCamera: + { +#ifndef _CONTENT_PACKAGE + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_DebugSetCamera,NULL,eUILayer_Debug); +#endif + } + break; + case eControl_Rain: + { + //app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_ToggleRain); + ClientConnection *conn = Minecraft::GetInstance()->getConnection(ProfileManager.GetPrimaryPad()); + conn->send( ToggleDownfallCommand::preparePacket() ); + } + break; + case eControl_Thunder: + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_ToggleThunder); + break; + case eControl_ResetTutorial: + Tutorial::debugResetPlayerSavedProgress( ProfileManager.GetPrimaryPad() ); + break; + case eControl_SetDay: + { + ClientConnection *conn = Minecraft::GetInstance()->getConnection(ProfileManager.GetPrimaryPad()); + conn->send( TimeCommand::preparePacket(false) ); + } + break; + case eControl_SetNight: + { + ClientConnection *conn = Minecraft::GetInstance()->getConnection(ProfileManager.GetPrimaryPad()); + conn->send( TimeCommand::preparePacket(true) ); + } + break; + }; +} + +void UIScene_DebugOverlay::handleSliderMove(F64 sliderId, F64 currentValue) +{ + switch((int)sliderId) + { + case eControl_Time: + { + Minecraft *pMinecraft = Minecraft::GetInstance(); + + // Need to set the time on both levels to stop the flickering as the local level + // tries to predict the time + // Only works if we are on the host machine, but shouldn't break if not + MinecraftServer::SetTime(currentValue * 100); + pMinecraft->level->getLevelData()->setTime(currentValue * 100); + + WCHAR TempString[256]; + float currentTime = currentValue * 100; + swprintf( (WCHAR *)TempString, 256, L"Set time (unsafe) (%d)", (int)currentTime); + m_sliderTime.setLabel(TempString); + } + break; + case eControl_FOV: + { + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->gameRenderer->SetFovVal((float)currentValue); + + WCHAR TempString[256]; + swprintf( (WCHAR *)TempString, 256, L"Set fov (%d)", (int)currentValue); + m_sliderFov.setLabel(TempString); + } + break; + }; +} +#endif diff --git a/Minecraft.Client/Common/UI/UIScene_DebugOverlay.h b/Minecraft.Client/Common/UI/UIScene_DebugOverlay.h new file mode 100644 index 00000000..9a0e1cd8 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_DebugOverlay.h @@ -0,0 +1,65 @@ +#pragma once +#ifdef _DEBUG_MENUS_ENABLED +#include "UIScene.h" +#include "UIControl_ButtonList.h" + +class UIScene_DebugOverlay : public UIScene +{ +private: + enum eControls + { + eControl_SetCamera, + eControl_ResetTutorial, + eControl_Schematic, + eControl_Thunder, + eControl_Rain, + eControl_FOV, + eControl_SetDay, + eControl_SetNight, + eControl_Time, + eControl_Mobs, + eControl_Enchantments, + eControl_Items, + }; + + vector m_itemIds; + vector m_mobFactories; + vector< pair > m_enchantmentIdAndLevels; +public: + UIScene_DebugOverlay(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_DebugOverlay;} + +protected: + UIControl_ButtonList m_buttonListItems, m_buttonListMobs, m_buttonListEnchantments; + UIControl_Slider m_sliderFov, m_sliderTime; + UIControl_Button m_buttonRain, m_buttonThunder, m_buttonSchematic, m_buttonResetTutorial, m_buttonSetCamera, m_buttonSetDay, m_buttonSetNight; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttonListItems, "itemsList") + UI_MAP_ELEMENT( m_buttonListEnchantments, "enchantmentsList") + UI_MAP_ELEMENT( m_buttonListMobs, "mobList") + UI_MAP_ELEMENT( m_sliderFov, "fov") + UI_MAP_ELEMENT( m_sliderTime, "time") + UI_MAP_ELEMENT( m_buttonSetDay, "setDay") + UI_MAP_ELEMENT( m_buttonSetNight, "setNight") + UI_MAP_ELEMENT( m_buttonRain, "rain") + UI_MAP_ELEMENT( m_buttonThunder, "thunder") + UI_MAP_ELEMENT( m_buttonSchematic, "schematic") + UI_MAP_ELEMENT( m_buttonResetTutorial, "resetTutorial") + UI_MAP_ELEMENT( m_buttonSetCamera, "setCamera") + UI_END_MAP_ELEMENTS_AND_NAMES() + + virtual wstring getMoviePath(); + +public: + virtual void customDraw(IggyCustomDrawCallbackRegion *region); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +protected: + void handlePress(F64 controlId, F64 childId); + virtual void handleSliderMove(F64 sliderId, F64 currentValue); +}; +#endif \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_DebugSetCamera.cpp b/Minecraft.Client/Common/UI/UIScene_DebugSetCamera.cpp new file mode 100644 index 00000000..dd5a429f --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_DebugSetCamera.cpp @@ -0,0 +1,158 @@ +#include "stdafx.h" + +#ifdef _DEBUG_MENUS_ENABLED +#include "UI.h" +#include "UIScene_DebugSetCamera.h" +#include "Minecraft.h" +#include "MultiPlayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" + +UIScene_DebugSetCamera::UIScene_DebugSetCamera(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + int playerNo = 0; + currentPosition = new DebugSetCameraPosition(); + currentPosition->player = playerNo; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + if (pMinecraft != NULL) + { + Vec3 *vec = pMinecraft->localplayers[playerNo]->getPos(1.0); + + currentPosition->m_camX = vec->x; + currentPosition->m_camY = vec->y - 1.62;// pMinecraft->localplayers[playerNo]->getHeadHeight(); + currentPosition->m_camZ = vec->z; + + currentPosition->m_yRot = pMinecraft->localplayers[playerNo]->yRot; + currentPosition->m_elev = pMinecraft->localplayers[playerNo]->xRot; + } + + WCHAR TempString[256]; + + swprintf( (WCHAR *)TempString, 256, L"%f", currentPosition->m_camX); + m_textInputX.init(TempString, eControl_CamX); + + swprintf( (WCHAR *)TempString, 256, L"%f", currentPosition->m_camY); + m_textInputY.init(TempString, eControl_CamY); + + swprintf( (WCHAR *)TempString, 256, L"%f", currentPosition->m_camZ); + m_textInputZ.init(TempString, eControl_CamZ); + + swprintf( (WCHAR *)TempString, 256, L"%f", currentPosition->m_yRot); + m_textInputYRot.init(TempString, eControl_YRot); + + swprintf( (WCHAR *)TempString, 256, L"%f", currentPosition->m_elev); + m_textInputElevation.init(TempString, eControl_Elevation); + + m_checkboxLockPlayer.init(L"Lock Player", eControl_LockPlayer, app.GetFreezePlayers()); + + m_buttonTeleport.init(L"Teleport", eControl_Teleport); + + m_labelTitle.init(L"Set Camera Position"); + m_labelCamX.init(L"CamX"); + m_labelCamY.init(L"CamY"); + m_labelCamZ.init(L"CamZ"); + m_labelYRotElev.init(L"Y-Rot & Elevation (Degs)"); +} + +wstring UIScene_DebugSetCamera::getMoviePath() +{ + return L"DebugSetCamera"; +} + +void UIScene_DebugSetCamera::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + navigateBack(); + } + break; + case ACTION_MENU_OK: + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_DebugSetCamera::handlePress(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_Teleport: + app.SetXuiServerAction( ProfileManager.GetPrimaryPad(), + eXuiServerAction_SetCameraLocation, + (void *)currentPosition); + break; + case eControl_CamX: + case eControl_CamY: + case eControl_CamZ: + case eControl_YRot: + case eControl_Elevation: + m_keyboardCallbackControl = (eControls)((int)controlId); + InputManager.RequestKeyboard(L"Enter something",L"",(DWORD)0,25,&UIScene_DebugSetCamera::KeyboardCompleteCallback,this,C_4JInput::EKeyboardMode_Default); + break; + }; +} + +void UIScene_DebugSetCamera::handleCheckboxToggled(F64 controlId, bool selected) +{ + switch((int)controlId) + { + case eControl_LockPlayer: + app.SetFreezePlayers(selected); + break; + } +} + +int UIScene_DebugSetCamera::KeyboardCompleteCallback(LPVOID lpParam,bool bRes) +{ + UIScene_DebugSetCamera *pClass=(UIScene_DebugSetCamera *)lpParam; + uint16_t pchText[2048];//[128]; + ZeroMemory(pchText, 2048/*128*/ * sizeof(uint16_t) ); + InputManager.GetText(pchText); + + if(pchText[0]!=0) + { + wstring value = (wchar_t *)pchText; + double val = 0; + if(!value.empty()) val = _fromString( value ); + switch(pClass->m_keyboardCallbackControl) + { + case eControl_CamX: + pClass->m_textInputX.setLabel(value); + pClass->currentPosition->m_camX = val; + break; + case eControl_CamY: + pClass->m_textInputY.setLabel(value); + pClass->currentPosition->m_camY = val; + break; + case eControl_CamZ: + pClass->m_textInputZ.setLabel(value); + pClass->currentPosition->m_camZ = val; + break; + case eControl_YRot: + pClass->m_textInputYRot.setLabel(value); + pClass->currentPosition->m_yRot = val; + break; + case eControl_Elevation: + pClass->m_textInputElevation.setLabel(value); + pClass->currentPosition->m_elev = val; + break; + } + } + + return 0; +} +#endif diff --git a/Minecraft.Client/Common/UI/UIScene_DebugSetCamera.h b/Minecraft.Client/Common/UI/UIScene_DebugSetCamera.h new file mode 100644 index 00000000..38db1258 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_DebugSetCamera.h @@ -0,0 +1,69 @@ +#pragma once +#ifdef _DEBUG_MENUS_ENABLED +#include "UIScene.h" + +class UIScene_DebugSetCamera : public UIScene +{ +private: + enum eControls + { + eControl_CamX, + eControl_CamY, + eControl_CamZ, + eControl_YRot, + eControl_Elevation, + eControl_LockPlayer, + eControl_Teleport, + }; + + typedef struct _FreezePlayerParam + { + int player; + bool freeze; + } FreezePlayerParam; + + DebugSetCameraPosition *currentPosition; + FreezePlayerParam *fpp; + + eControls m_keyboardCallbackControl; + +public: + UIScene_DebugSetCamera(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_DebugSetCamera;} + +protected: + UIControl_TextInput m_textInputX, m_textInputY, m_textInputZ, m_textInputYRot, m_textInputElevation; + UIControl_CheckBox m_checkboxLockPlayer; + UIControl_Button m_buttonTeleport; + UIControl_Label m_labelTitle, m_labelCamX, m_labelCamY, m_labelCamZ, m_labelYRotElev; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_textInputX, "CamX") + UI_MAP_ELEMENT( m_textInputY, "CamY") + UI_MAP_ELEMENT( m_textInputZ, "CamZ") + UI_MAP_ELEMENT( m_textInputYRot, "YRot") + UI_MAP_ELEMENT( m_textInputElevation, "Elevation") + UI_MAP_ELEMENT( m_checkboxLockPlayer, "LockPlayer") + UI_MAP_ELEMENT( m_buttonTeleport, "Teleport") + + UI_MAP_ELEMENT( m_labelTitle, "LabelTitle") + UI_MAP_ELEMENT( m_labelCamX, "LabelCamX") + UI_MAP_ELEMENT( m_labelCamY, "LabelCamY") + UI_MAP_ELEMENT( m_labelCamZ, "LabelCamZ") + UI_MAP_ELEMENT( m_labelYRotElev, "LabelYRotElev") + UI_END_MAP_ELEMENTS_AND_NAMES() + + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +protected: + void handlePress(F64 controlId, F64 childId); + virtual void handleCheckboxToggled(F64 controlId, bool selected); + +private: + static int KeyboardCompleteCallback(LPVOID lpParam,const bool bRes); +}; +#endif \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_DispenserMenu.cpp b/Minecraft.Client/Common/UI/UIScene_DispenserMenu.cpp new file mode 100644 index 00000000..1eda1660 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_DispenserMenu.cpp @@ -0,0 +1,197 @@ +#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 "UIScene_DispenserMenu.h" + +UIScene_DispenserMenu::UIScene_DispenserMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene_AbstractContainerMenu(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_labelDispenser.init(app.GetString(IDS_DISPENSER)); + + TrapScreenInput *initData = (TrapScreenInput *)_initData; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->localgameModes[initData->iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[initData->iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Trap_Menu, this); + } + + TrapMenu* menu = new TrapMenu( initData->inventory, initData->trap ); + + m_containerSize = initData->trap->getContainerSize(); + Initialize( initData->iPad, menu, true, m_containerSize, eSectionTrapUsing, eSectionTrapMax ); + + m_slotListTrap.addSlots(0, 9); + + delete initData; +} + +wstring UIScene_DispenserMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"DispenserMenuSplit"; + } + else + { + return L"DispenserMenu"; + } +} + +void UIScene_DispenserMenu::handleReload() +{ + Initialize( m_iPad, m_menu, true, m_containerSize, eSectionTrapUsing, eSectionTrapMax ); + + m_slotListTrap.addSlots(0, 9); +} + +int UIScene_DispenserMenu::getSectionColumns(ESceneSection eSection) +{ + int cols = 0; + switch( eSection ) + { + case eSectionTrapTrap: + cols = 3; + break; + case eSectionTrapInventory: + cols = 9; + break; + case eSectionTrapUsing: + cols = 9; + break; + default: + assert( false ); + break; + } + return cols; +} + +int UIScene_DispenserMenu::getSectionRows(ESceneSection eSection) +{ + int rows = 0; + switch( eSection ) + { + case eSectionTrapTrap: + rows = 3; + break; + case eSectionTrapInventory: + rows = 3; + break; + case eSectionTrapUsing: + rows = 1; + break; + default: + assert( false ); + break; + } + return rows; +} + +void UIScene_DispenserMenu::GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ) +{ + switch( eSection ) + { + case eSectionTrapTrap: + pPosition->x = m_slotListTrap.getXPos(); + pPosition->y = m_slotListTrap.getYPos(); + break; + case eSectionTrapInventory: + pPosition->x = m_slotListInventory.getXPos(); + pPosition->y = m_slotListInventory.getYPos(); + break; + case eSectionTrapUsing: + pPosition->x = m_slotListHotbar.getXPos(); + pPosition->y = m_slotListHotbar.getYPos(); + break; + default: + assert( false ); + break; + } +} + +void UIScene_DispenserMenu::GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ) +{ + UIVec2D sectionSize; + switch( eSection ) + { + case eSectionTrapTrap: + sectionSize.x = m_slotListTrap.getWidth(); + sectionSize.y = m_slotListTrap.getHeight(); + break; + case eSectionTrapInventory: + sectionSize.x = m_slotListInventory.getWidth(); + sectionSize.y = m_slotListInventory.getHeight(); + break; + case eSectionTrapUsing: + sectionSize.x = m_slotListHotbar.getWidth(); + sectionSize.y = m_slotListHotbar.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_DispenserMenu::setSectionSelectedSlot(ESceneSection eSection, int x, int y) +{ + int cols = getSectionColumns(eSection); + + int index = (y * cols) + x; + + UIControl_SlotList *slotList = NULL; + switch( eSection ) + { + case eSectionTrapTrap: + slotList = &m_slotListTrap; + break; + case eSectionTrapInventory: + slotList = &m_slotListInventory; + break; + case eSectionTrapUsing: + slotList = &m_slotListHotbar; + break; + default: + assert( false ); + break; + } + slotList->setHighlightSlot(index); +} + +UIControl *UIScene_DispenserMenu::getSection(ESceneSection eSection) +{ + UIControl *control = NULL; + switch( eSection ) + { + case eSectionTrapTrap: + control = &m_slotListTrap; + break; + case eSectionTrapInventory: + control = &m_slotListInventory; + break; + case eSectionTrapUsing: + control = &m_slotListHotbar; + break; + default: + assert( false ); + break; + } + return control; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_DispenserMenu.h b/Minecraft.Client/Common/UI/UIScene_DispenserMenu.h new file mode 100644 index 00000000..6661c7a1 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_DispenserMenu.h @@ -0,0 +1,40 @@ +#pragma once + +#include "UIScene_AbstractContainerMenu.h" +#include "IUIScene_DispenserMenu.h" + +class InventoryMenu; + +class UIScene_DispenserMenu : public UIScene_AbstractContainerMenu, public IUIScene_DispenserMenu +{ +private: + int m_containerSize; + +public: + UIScene_DispenserMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_DispenserMenu;} + +protected: + UIControl_SlotList m_slotListTrap; + UIControl_Label m_labelDispenser; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene_AbstractContainerMenu) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + UI_MAP_ELEMENT( m_slotListTrap, "Trap") + UI_MAP_ELEMENT( m_labelDispenser, "dispenserLabel") + 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); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_EULA.cpp b/Minecraft.Client/Common/UI/UIScene_EULA.cpp new file mode 100644 index 00000000..3177344d --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_EULA.cpp @@ -0,0 +1,145 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_EULA.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" + +UIScene_EULA::UIScene_EULA(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + parentLayer->addComponent(iPad,eUIComponent_Panorama); + parentLayer->addComponent(iPad,eUIComponent_Logo); + + m_buttonConfirm.init(app.GetString(IDS_TOOLTIPS_ACCEPT),eControl_Confirm); + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + wstring EULA = app.GetString(IDS_EULA); + EULA.append(L"\r\n"); + +#if defined(__PS3__) + if(app.IsEuropeanSKU()) + { + EULA.append(app.GetString(IDS_EULA_SCEE)); + // if it's the BD build + if(StorageManager.GetBootTypeDisc()) + { + EULA.append(app.GetString(IDS_EULA_SCEE_BD)); + } + } + else if(app.IsAmericanSKU()) + { + EULA.append(app.GetString(IDS_EULA_SCEA)); + } +#elif defined __ORBIS__ + if(app.IsEuropeanSKU()) + { + EULA.append(app.GetString(IDS_EULA_SCEE)); + // 4J-PB - we can't tell if it's a disc or digital version, so let's show this anyway + EULA.append(app.GetString(IDS_EULA_SCEE_BD)); + } + else if(app.IsAmericanSKU()) + { + EULA.append(app.GetString(IDS_EULA_SCEA)); + } +#endif +#else + wstring EULA = L""; +#endif + + vector paragraphs; + int lastIndex = 0; + for ( int index = EULA.find(L"\r\n", lastIndex, 2); + index != wstring::npos; + index = EULA.find(L"\r\n", lastIndex, 2) + ) + { + paragraphs.push_back( EULA.substr(lastIndex, index-lastIndex) + L" " ); + lastIndex = index + 2; + } + paragraphs.push_back( EULA.substr( lastIndex, EULA.length() - lastIndex ) ); + + for(unsigned int i = 0; i < paragraphs.size(); ++i) + { + m_labelDescription.addText(paragraphs[i],i == (paragraphs.size() - 1) ); + } + + // 4J-PB - If we have a signed in user connected, let's get the DLC now + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if( (InputManager.IsPadConnected(i) || ProfileManager.IsSignedIn(i)) ) + { + if(!app.DLCInstallProcessCompleted() && !app.DLCInstallPending()) + { + app.StartInstallDLCProcess(i); + break; + } + } + } + + m_bIgnoreInput=false; + + //ui.setFontCachingCalculationBuffer(20000); + +#ifdef __PSVITA__ + ui.TouchBoxRebuild(this); +#endif +} + +UIScene_EULA::~UIScene_EULA() +{ + m_parentLayer->removeComponent(eUIComponent_Panorama); + m_parentLayer->removeComponent(eUIComponent_Logo); +} + +wstring UIScene_EULA::getMoviePath() +{ + return L"EULA"; +} + +void UIScene_EULA::updateTooltips() +{ + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT ); +} + +void UIScene_EULA::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if(m_bIgnoreInput) return; + +#ifdef __ORBIS__ + // ignore all players except player 0 - it's their profile that is currently being used + if(iPad!=0) return; +#endif + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + case ACTION_MENU_OK: + case ACTION_MENU_DOWN: + case ACTION_MENU_UP: + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + case ACTION_MENU_OTHER_STICK_DOWN: + case ACTION_MENU_OTHER_STICK_UP: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_EULA::handlePress(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_Confirm: + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + app.SetGameSettings(0,eGameSetting_PS3_EULA_Read,1); + ui.NavigateToScene(0,eUIScene_SaveMessage); + ui.setFontCachingCalculationBuffer(-1); + break; + }; +} diff --git a/Minecraft.Client/Common/UI/UIScene_EULA.h b/Minecraft.Client/Common/UI/UIScene_EULA.h new file mode 100644 index 00000000..4715b112 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_EULA.h @@ -0,0 +1,45 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_EULA : public UIScene +{ +private: + enum EControls + { + eControl_Confirm, + }; + + bool m_bIgnoreInput; + + UIControl_Button m_buttonConfirm; + UIControl_DynamicLabel m_labelDescription; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT(m_buttonConfirm, "AcceptButton") + UI_MAP_ELEMENT(m_labelDescription, "EULAtext") + UI_END_MAP_ELEMENTS_AND_NAMES() + +public: + UIScene_EULA(int iPad, void *initData, UILayer *parentLayer); + ~UIScene_EULA(); + + virtual EUIScene getSceneType() { return eUIScene_EULA;} + + // Returns true if this scene has focus for the pad passed in +#ifndef __PS3__ + virtual bool hasFocus(int iPad) { return bHasFocus; } +#endif + virtual void updateTooltips(); + +protected: + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +protected: + void handlePress(F64 controlId, F64 childId); + + virtual long long getDefaultGtcButtons() { return 0; } +}; diff --git a/Minecraft.Client/Common/UI/UIScene_EnchantingMenu.cpp b/Minecraft.Client/Common/UI/UIScene_EnchantingMenu.cpp new file mode 100644 index 00000000..8a4f1c6d --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_EnchantingMenu.cpp @@ -0,0 +1,284 @@ +#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 "UIScene_EnchantingMenu.h" + +UIScene_EnchantingMenu::UIScene_EnchantingMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene_AbstractContainerMenu(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_labelEnchant.init(app.GetString(IDS_ENCHANT)); + + m_enchantButton[0].init(0); + m_enchantButton[1].init(1); + m_enchantButton[2].init(2); + + EnchantingScreenInput *initData = (EnchantingScreenInput *)_initData; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->localgameModes[initData->iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[initData->iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Enchanting_Menu, this); + } + + EnchantmentMenu *menu = new EnchantmentMenu(initData->inventory, initData->level, initData->x, initData->y, initData->z); + + Initialize( initData->iPad, menu, true, EnchantmentMenu::INV_SLOT_START, eSectionEnchantUsing, eSectionEnchantMax ); + + m_slotListIngredient.addSlots(EnchantmentMenu::INGREDIENT_SLOT, 1); + + app.SetRichPresenceContext(m_iPad,CONTEXT_GAME_STATE_ENCHANTING); + + delete initData; +} + +wstring UIScene_EnchantingMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"EnchantingMenuSplit"; + } + else + { + return L"EnchantingMenu"; + } +} + +void UIScene_EnchantingMenu::handleReload() +{ + Initialize( m_iPad, m_menu, true, EnchantmentMenu::INV_SLOT_START, eSectionEnchantUsing, eSectionEnchantMax ); + + m_slotListIngredient.addSlots(EnchantmentMenu::INGREDIENT_SLOT, 1); +} + +int UIScene_EnchantingMenu::getSectionColumns(ESceneSection eSection) +{ + int cols = 0; + switch( eSection ) + { + case eSectionEnchantSlot: + cols = 1; + break; + case eSectionEnchantInventory: + cols = 9; + break; + case eSectionEnchantUsing: + cols = 9; + break; + default: + assert( false ); + break; + }; + return cols; +} + +int UIScene_EnchantingMenu::getSectionRows(ESceneSection eSection) +{ + int rows = 0; + switch( eSection ) + { + case eSectionEnchantSlot: + rows = 1; + break; + case eSectionEnchantInventory: + rows = 3; + break; + case eSectionEnchantUsing: + rows = 1; + break; + default: + assert( false ); + break; + }; + return rows; +} + +void UIScene_EnchantingMenu::GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ) +{ + switch( eSection ) + { + case eSectionEnchantSlot: + pPosition->x = m_slotListIngredient.getXPos(); + pPosition->y = m_slotListIngredient.getYPos(); + break; + case eSectionEnchantInventory: + pPosition->x = m_slotListInventory.getXPos(); + pPosition->y = m_slotListInventory.getYPos(); + break; + case eSectionEnchantUsing: + pPosition->x = m_slotListHotbar.getXPos(); + pPosition->y = m_slotListHotbar.getYPos(); + break; + case eSectionEnchantButton1: + pPosition->x = m_enchantButton[0].getXPos(); + pPosition->y = m_enchantButton[0].getYPos(); + break; + case eSectionEnchantButton2: + pPosition->x = m_enchantButton[1].getXPos(); + pPosition->y = m_enchantButton[1].getYPos(); + break; + case eSectionEnchantButton3: + pPosition->x = m_enchantButton[2].getXPos(); + pPosition->y = m_enchantButton[2].getYPos(); + break; + default: + assert( false ); + break; + }; +} + +void UIScene_EnchantingMenu::GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ) +{ + UIVec2D sectionSize; + switch( eSection ) + { + case eSectionEnchantSlot: + sectionSize.x = m_slotListIngredient.getWidth(); + sectionSize.y = m_slotListIngredient.getHeight(); + break; + case eSectionEnchantInventory: + sectionSize.x = m_slotListInventory.getWidth(); + sectionSize.y = m_slotListInventory.getHeight(); + break; + case eSectionEnchantUsing: + sectionSize.x = m_slotListHotbar.getWidth(); + sectionSize.y = m_slotListHotbar.getHeight(); + break; + case eSectionEnchantButton1: + sectionSize.x = m_enchantButton[0].getWidth(); + sectionSize.y = m_enchantButton[0].getHeight(); + break; + case eSectionEnchantButton2: + sectionSize.x = m_enchantButton[1].getWidth(); + sectionSize.y = m_enchantButton[1].getHeight(); + break; + case eSectionEnchantButton3: + sectionSize.x = m_enchantButton[2].getWidth(); + sectionSize.y = m_enchantButton[2].getHeight(); + break; + default: + assert( false ); + break; + }; + + if(IsSectionSlotList(eSection)) + { + 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; + } + else + { + GetPositionOfSection(eSection, pPosition); + pSize->x = sectionSize.x; + pSize->y = sectionSize.y; + } +} + +void UIScene_EnchantingMenu::setSectionSelectedSlot(ESceneSection eSection, int x, int y) +{ + int cols = getSectionColumns(eSection); + + int index = (y * cols) + x; + + UIControl_SlotList *slotList = NULL; + switch( eSection ) + { + case eSectionEnchantSlot: + slotList = &m_slotListIngredient; + break; + case eSectionEnchantInventory: + slotList = &m_slotListInventory; + break; + case eSectionEnchantUsing: + slotList = &m_slotListHotbar; + break; + default: + assert( false ); + break; + }; + + slotList->setHighlightSlot(index); +} + +UIControl *UIScene_EnchantingMenu::getSection(ESceneSection eSection) +{ + UIControl *control = NULL; + switch( eSection ) + { + case eSectionEnchantSlot: + control = &m_slotListIngredient; + break; + case eSectionEnchantInventory: + control = &m_slotListInventory; + break; + case eSectionEnchantUsing: + control = &m_slotListHotbar; + break; + case eSectionEnchantButton1: + control = &m_enchantButton[0]; + break; + case eSectionEnchantButton2: + control = &m_enchantButton[1]; + break; + case eSectionEnchantButton3: + control = &m_enchantButton[2]; + break; + default: + assert( false ); + break; + }; + return control; +} + +void UIScene_EnchantingMenu::customDraw(IggyCustomDrawCallbackRegion *region) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localgameModes[m_iPad] == NULL) return; + + + if(wcscmp((wchar_t *)region->name,L"EnchantmentBook")==0) + { + // Setup GDraw, normal game render states and matrices + CustomDrawData *customDrawRegion = ui.setupCustomDraw(this,region); + delete customDrawRegion; + + m_enchantBook.render(region); + + // Finish GDraw and anything else that needs to be finalised + ui.endCustomDraw(region); + } + else + { + int slotId = -1; + swscanf((wchar_t*)region->name,L"slot_Button%d",&slotId); + if(slotId >= 0) + { + // Setup GDraw, normal game render states and matrices + CustomDrawData *customDrawRegion = ui.setupCustomDraw(this,region); + delete customDrawRegion; + + m_enchantButton[slotId-1].render(region); + + // Finish GDraw and anything else that needs to be finalised + ui.endCustomDraw(region); + } + else + { + UIScene_AbstractContainerMenu::customDraw(region); + } + } +} diff --git a/Minecraft.Client/Common/UI/UIScene_EnchantingMenu.h b/Minecraft.Client/Common/UI/UIScene_EnchantingMenu.h new file mode 100644 index 00000000..89ccd120 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_EnchantingMenu.h @@ -0,0 +1,54 @@ +#pragma once + +#include "UIScene_AbstractContainerMenu.h" +#include "IUIScene_EnchantingMenu.h" + +class InventoryMenu; + +class UIScene_EnchantingMenu : public UIScene_AbstractContainerMenu, public IUIScene_EnchantingMenu +{ +private: + enum EControls + { + eControl_UNKNOWN, + eControl_Button1, + eControl_Button2, + eControl_Button3, + }; +public: + UIScene_EnchantingMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_EnchantingMenu;} + +protected: + UIControl_SlotList m_slotListIngredient; + UIControl_Label m_labelEnchant; + UIControl_EnchantmentButton m_enchantButton[3]; + UIControl_EnchantmentBook m_enchantBook; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene_AbstractContainerMenu) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + UI_MAP_ELEMENT( m_slotListIngredient, "ingredient") + UI_MAP_ELEMENT( m_enchantButton[0], "Button1") + UI_MAP_ELEMENT( m_enchantButton[1], "Button2") + UI_MAP_ELEMENT( m_enchantButton[2], "Button3") + UI_MAP_ELEMENT( m_labelEnchant, "enchantLabel") + + UI_MAP_ELEMENT( m_enchantBook, "iggy_EnchantmentBook") + 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); + + virtual void customDraw(IggyCustomDrawCallbackRegion *region); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_EndPoem.cpp b/Minecraft.Client/Common/UI/UIScene_EndPoem.cpp new file mode 100644 index 00000000..f825efd0 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_EndPoem.cpp @@ -0,0 +1,271 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_EndPoem.h" +#include "UIBitmapFont.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" + +UIScene_EndPoem::UIScene_EndPoem(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + + //ui.setFontCachingCalculationBuffer(20000); + + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_bIgnoreInput = false; + + // 4J Stu - Don't need these, the AS handles the scrolling and makes it look nice +#if 0 + wstring halfScreenLineBreaks; + + if(RenderManager.IsHiDef()) + { + // HD - 17 line page + halfScreenLineBreaks = L"










"; + } + else + { + // 480 - 14 line page + halfScreenLineBreaks = L"







"; + } +#endif + + //wchar_t startTags[64]; + //swprintf(startTags,64,L"",app.GetHTMLFontSize(eHTMLSize_EndPoem)); + //noNoiseString.append(halfScreenLineBreaks); + //noNoiseString.append(halfScreenLineBreaks); + noNoiseString.append( app.GetString(IDS_WIN_TEXT) ); + noNoiseString.append( app.GetString(IDS_WIN_TEXT_PART_2) ); + noNoiseString.append( app.GetString(IDS_WIN_TEXT_PART_3) ); + + //noNoiseString.append(halfScreenLineBreaks); + + // 4J Stu - Iggy seems to strip our trailing linebreaks, so added a space to made sure it scrolls this far + noNoiseString.append( L" " ); + + noNoiseString = app.FormatHTMLString(m_iPad, noNoiseString, 0xff000000); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + wstring playerName = L""; + if(pMinecraft->localplayers[ui.GetWinUserIndex()] != NULL) + { + playerName = escapeXML( pMinecraft->localplayers[ui.GetWinUserIndex()]->getDisplayName() ); + } + else + { + playerName = escapeXML( pMinecraft->localplayers[ProfileManager.GetPrimaryPad()]->getDisplayName() ); + } + noNoiseString = replaceAll(noNoiseString,L"{*PLAYER*}",playerName); + + Random random(8124371); + int found=(int)noNoiseString.find(L"{*NOISE*}"); + int length; + while (found!=string::npos) + { + length = random.nextInt(4) + 3; + m_noiseLengths.push_back(length); + found=(int)noNoiseString.find(L"{*NOISE*}",found+1); + } + + updateNoise(); + + + // 4J-JEV: Find paragraph start and end points. + m_paragraphs = vector(); + int lastIndex = 0; + for ( int index = 0; + index != wstring::npos; + index = noiseString.find(L"

", index+12, 12) + ) + { + m_paragraphs.push_back( noiseString.substr(lastIndex, index-lastIndex) ); + lastIndex = index; + } + //lastIndex += 12; + m_paragraphs.push_back( noiseString.substr( lastIndex, noiseString.length() - lastIndex ) ); + + //m_htmlPoem.init(noiseString.c_str()); + //m_htmlPoem.startAutoScroll(); + + //wstring result = m_htmlControl.GetText(); + + //wcout << result.c_str(); + +#if TO_BE_IMPLEMENTED + m_scrollDir = 1; + HRESULT hr = XuiHtmlControlSetSmoothScroll(m_htmlControl.m_hObj, XUI_SMOOTHSCROLL_VERTICAL,TRUE,AUTO_SCROLL_SPEED,1.0f,AUTO_SCROLL_SPEED); + XuiHtmlControlVScrollBy(m_htmlControl.m_hObj,m_scrollDir * 1000); + + SetTimer(0,200); +#endif + + m_requestedLabel = 0; +} + +wstring UIScene_EndPoem::getMoviePath() +{ + return L"EndPoem"; +} + +void UIScene_EndPoem::updateTooltips() +{ + ui.SetTooltips( XUSER_INDEX_ANY, -1, m_bIgnoreInput?-1:IDS_TOOLTIPS_CONTINUE); +} + +void UIScene_EndPoem::tick() +{ + UIScene::tick(); + + if( m_requestedLabel >= 0 && m_requestedLabel < m_paragraphs.size()) + { + wstring label = m_paragraphs[m_requestedLabel]; + + IggyDataValue result; + IggyDataValue value[3]; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = m_requestedLabel; + + value[2].type = IGGY_DATATYPE_boolean; + value[2].boolval = (m_requestedLabel == (m_paragraphs.size() - 1)); + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetNextLabel , 3 , value ); + + m_requestedLabel = -1; + } +} + +void UIScene_EndPoem::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if(m_bIgnoreInput) return; + + if(pressed) ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + m_bIgnoreInput = true; + Minecraft *pMinecraft = Minecraft::GetInstance(); + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if(pMinecraft->localplayers[i] != NULL) + { + app.SetAction(i,eAppAction_Respawn); + } + } + + // This just allows it to be shown + if(pMinecraft->localgameModes[ProfileManager.GetPrimaryPad()] != NULL) pMinecraft->localgameModes[ProfileManager.GetPrimaryPad()]->getTutorial()->showTutorialPopup(true); + + updateTooltips(); + navigateBack(); + + handled = true; + } + break; + case ACTION_MENU_DOWN: + case ACTION_MENU_UP: + case ACTION_MENU_OTHER_STICK_DOWN: + case ACTION_MENU_OTHER_STICK_UP: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_EndPoem::handleDestroy() +{ + + //ui.setFontCachingCalculationBuffer(-1); +} + +void UIScene_EndPoem::handleRequestMoreData(F64 startIndex, bool up) +{ + m_requestedLabel = (int)startIndex; +} + +void UIScene_EndPoem::updateNoise() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + noiseString = noNoiseString; + + int length = 0; + wchar_t replacements[64]; + wstring replaceString = L""; + wchar_t randomChar = L'a'; + Random *random = pMinecraft->font->random; + + bool darken = false; + + wstring tag = L"{*NOISE*}"; + + AUTO_VAR(it, m_noiseLengths.begin()); + int found=(int)noiseString.find(tag); + while (found!=string::npos && it != m_noiseLengths.end() ) + { + length = *it; + ++it; + + replaceString = L""; + for(int i = 0; i < length; ++i) + { + randomChar = SharedConstants::acceptableLetters[random->nextInt((int)SharedConstants::acceptableLetters.length())]; + + wstring randomCharStr = L""; + randomCharStr.push_back(randomChar); + if(randomChar == L'<') + { + randomCharStr = L"<"; + } + else if (randomChar == L'>' ) + { + randomCharStr = L">"; + } + else if(randomChar == L'"') + { + randomCharStr = L"""; + } + else if(randomChar == L'&') + { + randomCharStr = L"&"; + } + else if(randomChar == L'\\') + { + randomCharStr = L"\\\\"; + } + else if(randomChar == L'{') + { + randomCharStr = L"}"; + } + + int randomVal = random->nextInt(2); + eMinecraftColour colour = eHTMLColor_8; + if(randomVal == 1) colour = eHTMLColor_9; + else if(randomVal == 2) colour = eHTMLColor_a; + ZeroMemory(replacements,64*sizeof(wchar_t)); + swprintf(replacements,64,L"%ls",app.GetHTMLColour(colour),randomCharStr.c_str()); + replaceString.append(replacements); + } + + noiseString.replace( found, tag.length(), replaceString ); + + //int pos = 0; + //do { + // pos = random->nextInt(SharedConstants::acceptableLetters.length()); + //} while (pMinecraft->font->charWidths[ch + 32] != pMinecraft->font->charWidths[pos + 32]); + //ib.put(listPos + 256 + random->nextInt(2) + 8 + (darken ? 16 : 0)); + //ib.put(listPos + pos + 32); + + found=(int)noiseString.find(tag,found+1); + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_EndPoem.h b/Minecraft.Client/Common/UI/UIScene_EndPoem.h new file mode 100644 index 00000000..75024f68 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_EndPoem.h @@ -0,0 +1,41 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_EndPoem : public UIScene +{ +private: + wstring noNoiseString; + wstring noiseString; + vector m_noiseLengths; + bool m_bIgnoreInput; + int m_requestedLabel; + + vector m_paragraphs; + + IggyName m_funcSetNextLabel; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_NAME(m_funcSetNextLabel, L"SetNextLabel") + UI_END_MAP_ELEMENTS_AND_NAMES() + +public: + UIScene_EndPoem(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_EndPoem;} + virtual void updateTooltips(); + +protected: + virtual wstring getMoviePath(); + +public: + virtual void tick(); + + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + virtual void handleDestroy(); + + virtual void handleRequestMoreData(F64 startIndex, bool up); + +private: + void updateNoise(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_FullscreenProgress.cpp b/Minecraft.Client/Common/UI/UIScene_FullscreenProgress.cpp new file mode 100644 index 00000000..ed31cfaf --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_FullscreenProgress.cpp @@ -0,0 +1,374 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_FullscreenProgress.h" +#include "..\..\Minecraft.h" +#include "..\..\ProgressRenderer.h" + + +UIScene_FullscreenProgress::UIScene_FullscreenProgress(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + parentLayer->addComponent(iPad,eUIComponent_Panorama); + parentLayer->addComponent(iPad,eUIComponent_Logo); + parentLayer->showComponent(iPad,eUIComponent_Logo,true); + parentLayer->showComponent(iPad,eUIComponent_MenuBackground,false); + + m_controlTimer.setVisible( false ); + + m_titleText = L""; + m_statusText = L""; + + m_lastTitle = -1; + m_lastStatus = -1; + m_lastProgress = 0; + + m_buttonConfirm.init( app.GetString( IDS_CONFIRM_OK ), eControl_Confirm ); + m_buttonConfirm.setVisible(false); + + LoadingInputParams *params = (LoadingInputParams *)initData; + + m_CompletionData = params->completionData; + m_iPad=params->completionData->iPad; + m_cancelFunc = params->cancelFunc; + m_cancelFuncParam = params->m_cancelFuncParam; + m_completeFunc = params->completeFunc; + m_completeFuncParam = params->m_completeFuncParam; + + m_cancelText = params->cancelText; + m_bWasCancelled=false; + m_bWaitForThreadToDelete = params->waitForThreadToDelete; + + // Clear the progress text + Minecraft *pMinecraft=Minecraft::GetInstance(); + pMinecraft->progressRenderer->progressStart(-1); + pMinecraft->progressRenderer->progressStage(-1); + m_progressBar.init(L"",0,0,100,0); + + // set the tip + wstring wsText= app.FormatHTMLString(m_iPad,app.GetString(app.GetNextTip())); + + wchar_t startTags[64]; + swprintf(startTags,64,L"

",app.GetHTMLColour(eHTMLColor_White)); + wsText= startTags + wsText + L"

"; + m_labelTip.init(wsText); + + addTimer(TIMER_FULLSCREEN_TIPS, TIMER_FULLSCREEN_TIPS_TIME); + + m_labelTitle.init(L""); + + m_labelTip.setVisible( m_CompletionData->bShowTips ); + + thread = new C4JThread(params->func, params->lpParam, "FullscreenProgress"); + thread->SetProcessor(CPU_CORE_UI_SCENE); // TODO 4J Stu - Make sure this is a good thread/core to use + + m_threadCompleted = false; + thread->Run(); + threadStarted = true; + +#ifdef __PSVITA__ + ui.TouchBoxRebuild(this); +#endif + +#ifdef _XBOX_ONE + ui.ShowPlayerDisplayname(false); +#endif +} + +UIScene_FullscreenProgress::~UIScene_FullscreenProgress() +{ + m_parentLayer->removeComponent(eUIComponent_Panorama); + m_parentLayer->removeComponent(eUIComponent_Logo); + + delete thread; + + delete m_CompletionData; +} + +wstring UIScene_FullscreenProgress::getMoviePath() +{ + return L"FullscreenProgress"; +} + +void UIScene_FullscreenProgress::updateTooltips() +{ + ui.SetTooltips( m_parentLayer->IsFullscreenGroup()?XUSER_INDEX_ANY:m_iPad, m_threadCompleted?IDS_TOOLTIPS_SELECT:-1, m_threadCompleted?-1:m_cancelText, -1, -1 ); +} + +void UIScene_FullscreenProgress::handleDestroy() +{ + int code = thread->GetExitCode(); + DWORD exitcode = *((DWORD *)&code); + + // If we're active, have a cancel func, and haven't already cancelled, call cancel func + if( exitcode == STILL_ACTIVE && m_cancelFunc != NULL && !m_bWasCancelled) + { + m_bWasCancelled = true; + m_cancelFunc(m_cancelFuncParam); + } +} + +void UIScene_FullscreenProgress::tick() +{ + UIScene::tick(); + + Minecraft *pMinecraft=Minecraft::GetInstance(); + + int currentProgress = pMinecraft->progressRenderer->getCurrentPercent(); + if(currentProgress < 0) currentProgress = 0; + if(currentProgress != m_lastProgress) + { + m_lastProgress = currentProgress; + m_progressBar.setProgress(currentProgress); + //app.DebugPrintf("Updated progress value\n"); + } + + int title = pMinecraft->progressRenderer->getCurrentTitle(); + if(title >= 0 && title != m_lastTitle) + { + m_lastTitle = title; + m_titleText = app.GetString( title ); + m_labelTitle.setLabel(m_titleText); + } + + ProgressRenderer::eProgressStringType eProgressType=pMinecraft->progressRenderer->getType(); + + if(eProgressType==ProgressRenderer::eProgressStringType_ID) + { + int status = pMinecraft->progressRenderer->getCurrentStatus(); + if(status >= 0 && status != m_lastStatus) + { + m_lastStatus = status; + m_statusText = app.GetString( status ); + m_progressBar.setLabel(m_statusText.c_str()); + } + } + else + { + wstring& wstrText = pMinecraft->progressRenderer->getProgressString(); + m_progressBar.setLabel(wstrText.c_str()); + } + + + int code = thread->GetExitCode(); + DWORD exitcode = *((DWORD *)&code); + + //app.DebugPrintf("CScene_FullscreenProgress Timer %d\n",pTimer->nId); + + if( exitcode != STILL_ACTIVE ) + { + // If we failed (currently used by network connection thread), navigate back + if( exitcode != S_OK ) + { + if( exitcode == ERROR_CANCELLED ) + { + // Current thread cancelled for whatever reason + // Currently used only for the CConsoleMinecraftApp::RemoteSaveThreadProc thread + // Assume to just ignore this thread as something else is now running that will + // cause another action + } + else + { + /*m_threadCompleted = true; + m_buttonConfirm.SetShow( TRUE ); + m_buttonConfirm.SetFocus( m_CompletionData->iPad ); + m_CompletionData->type = e_ProgressCompletion_NavigateToHomeMenu; + + int exitReasonStringId; + switch( app.GetDisconnectReason() ) + { + default: + exitReasonStringId = IDS_CONNECTION_FAILED; + } + Minecraft *pMinecraft=Minecraft::GetInstance(); + pMinecraft->progressRenderer->progressStartNoAbort( exitReasonStringId );*/ + //app.NavigateBack(m_CompletionData->iPad); + + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox( g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_FAILED), g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_SERVER), uiIDA,1, XUSER_INDEX_ANY,NULL,NULL, app.GetStringTable()); + + ui.NavigateToHomeMenu(); + ui.UpdatePlayerBasePositions(); + } + } + else + { + if(( m_CompletionData->bRequiresUserAction == TRUE ) && (!m_bWasCancelled)) + { + m_threadCompleted = true; + m_buttonConfirm.setVisible( true ); + updateTooltips(); + } + else + { + if(m_bWasCancelled) + { + m_threadCompleted = true; + } + app.DebugPrintf("FullScreenProgress complete with action: "); + switch(m_CompletionData->type) + { + case e_ProgressCompletion_AutosaveNavigateBack: + app.DebugPrintf("e_ProgressCompletion_AutosaveNavigateBack\n"); + { + // 4J Stu - Fix for #65437 - Customer Encountered: Code: Settings: Autosave option doesn't work when the Host goes into idle state during gameplay. + // Autosave obviously cannot occur if an ignore autosave menu is displayed, so even if we navigate back to a scene and not empty + // then we still want to reset this flag which was set true by the navigate to the fullscreen progress + ui.SetIgnoreAutosaveMenuDisplayed(m_iPad, false); + + // This just allows it to be shown + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localgameModes[ProfileManager.GetPrimaryPad()] != NULL) pMinecraft->localgameModes[ProfileManager.GetPrimaryPad()]->getTutorial()->showTutorialPopup(true); + ui.UpdatePlayerBasePositions(); + navigateBack(); + } + break; + + case e_ProgressCompletion_NavigateBack: + app.DebugPrintf("e_ProgressCompletion_NavigateBack\n"); + { + ui.UpdatePlayerBasePositions(); + navigateBack(); + } + break; + case e_ProgressCompletion_NavigateBackToScene: + app.DebugPrintf("e_ProgressCompletion_NavigateBackToScene\n"); + ui.UpdatePlayerBasePositions(); + // 4J Stu - If used correctly this scene will not have interfered with any other scene at all, so just navigate back + navigateBack(); + break; + case e_ProgressCompletion_CloseUIScenes: + app.DebugPrintf("e_ProgressCompletion_CloseUIScenes\n"); + ui.CloseUIScenes(m_CompletionData->iPad); + ui.UpdatePlayerBasePositions(); + break; + case e_ProgressCompletion_CloseAllPlayersUIScenes: + app.DebugPrintf("e_ProgressCompletion_CloseAllPlayersUIScenes\n"); + ui.CloseAllPlayersScenes(); + ui.UpdatePlayerBasePositions(); + break; + case e_ProgressCompletion_NavigateToHomeMenu: + app.DebugPrintf("e_ProgressCompletion_NavigateToHomeMenu\n"); + ui.NavigateToHomeMenu(); + ui.UpdatePlayerBasePositions(); + break; + default: + app.DebugPrintf("Default\n"); + break; + } + } + } + } +} + +void UIScene_FullscreenProgress::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //if( m_showTooltips ) + { + //ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + if(pressed) + { + sendInputToMovie(key, repeat, pressed, released); + } + break; + case ACTION_MENU_B: + case ACTION_MENU_CANCEL: + if( pressed && m_cancelFunc != NULL && !m_bWasCancelled ) + { + m_bWasCancelled = true; + m_cancelFunc( m_cancelFuncParam ); + } + break; + } + } +} + +void UIScene_FullscreenProgress::handlePress(F64 controlId, F64 childId) +{ + if(m_threadCompleted && (int)controlId == eControl_Confirm) + { + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(m_iPad, ACTION_MENU_A, false, true, false); + + // if there's a complete function, call it + if(m_completeFunc) + { + m_completeFunc(m_completeFuncParam); + } + + switch(m_CompletionData->type) + { + case e_ProgressCompletion_NavigateBack: + app.DebugPrintf("e_ProgressCompletion_NavigateBack\n"); + { + ui.UpdatePlayerBasePositions(); + navigateBack(); + } + break; + case e_ProgressCompletion_NavigateBackToScene: + app.DebugPrintf("e_ProgressCompletion_NavigateBackToScene\n"); + ui.UpdatePlayerBasePositions(); + // 4J Stu - If used correctly this scene will not have interfered with any other scene at all, so just navigate back + navigateBack(); + break; + case e_ProgressCompletion_CloseUIScenes: + app.DebugPrintf("e_ProgressCompletion_CloseUIScenes\n"); + ui.CloseUIScenes(m_CompletionData->iPad); + ui.UpdatePlayerBasePositions(); + break; + case e_ProgressCompletion_CloseAllPlayersUIScenes: + app.DebugPrintf("e_ProgressCompletion_CloseAllPlayersUIScenes\n"); + ui.CloseAllPlayersScenes(); + ui.UpdatePlayerBasePositions(); + break; + case e_ProgressCompletion_NavigateToHomeMenu: + app.DebugPrintf("e_ProgressCompletion_NavigateToHomeMenu\n"); + ui.NavigateToHomeMenu(); + ui.UpdatePlayerBasePositions(); + break; + } + } +} + +void UIScene_FullscreenProgress::handleTimerComplete(int id) +{ + switch(id) + { + case TIMER_FULLSCREEN_TIPS: + { + // display the next tip + wstring wsText=app.FormatHTMLString(m_iPad,app.GetString(app.GetNextTip())); + wchar_t startTags[64]; + swprintf(startTags,64,L"

",app.GetHTMLColour(eHTMLColor_White)); + wsText= startTags + wsText + L"

"; + m_labelTip.setLabel(wsText); + } + break; + } +} + +void UIScene_FullscreenProgress::SetWasCancelled(bool wasCancelled) +{ + m_bWasCancelled = wasCancelled; +} + +bool UIScene_FullscreenProgress::isReadyToDelete() +{ + if( m_bWaitForThreadToDelete ) + { + return !thread->isRunning(); + } + else + { + return true; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_FullscreenProgress.h b/Minecraft.Client/Common/UI/UIScene_FullscreenProgress.h new file mode 100644 index 00000000..aeb428c3 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_FullscreenProgress.h @@ -0,0 +1,69 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_FullscreenProgress : public UIScene +{ +private: + enum EControl + { + eControl_Confirm, + }; + + static const int TIMER_FULLSCREEN_TIPS = 1; + static const int TIMER_FULLSCREEN_TIPS_TIME = 7000; + + C4JThread* thread; + bool threadStarted; + UIFullscreenProgressCompletionData *m_CompletionData; + bool m_threadCompleted; + int m_iPad; + void (*m_cancelFunc)(LPVOID param); + void (*m_completeFunc)(LPVOID param); + LPVOID m_cancelFuncParam; + LPVOID m_completeFuncParam; + bool m_bWaitForThreadToDelete; + + wstring m_titleText, m_statusText; + int m_lastTitle, m_lastStatus, m_lastProgress; + int m_cancelText; + bool m_bWasCancelled; + + UIControl_Progress m_progressBar; + UIControl_Label m_labelTitle, m_labelTip; + UIControl_Button m_buttonConfirm; + UIControl m_controlTimer; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_progressBar, "ProgressBar") + UI_MAP_ELEMENT( m_labelTitle, "Title") + UI_MAP_ELEMENT( m_labelTip, "Tip") + UI_MAP_ELEMENT( m_buttonConfirm, "Confirm") + UI_MAP_ELEMENT( m_controlTimer, "Timer") + UI_END_MAP_ELEMENTS_AND_NAMES() +public: + UIScene_FullscreenProgress(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_FullscreenProgress(); + + virtual EUIScene getSceneType() { return eUIScene_FullscreenProgress;} + virtual void updateTooltips(); + virtual void handleDestroy(); + + void tick(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + + virtual long long getDefaultGtcButtons() { return 0; } + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + void handlePress(F64 controlId, F64 childId); + + virtual void handleTimerComplete(int id); + + void SetWasCancelled(bool wasCancelled); + + virtual bool isReadyToDelete(); +}; diff --git a/Minecraft.Client/Common/UI/UIScene_FurnaceMenu.cpp b/Minecraft.Client/Common/UI/UIScene_FurnaceMenu.cpp new file mode 100644 index 00000000..1ba4053d --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_FurnaceMenu.cpp @@ -0,0 +1,256 @@ +#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 "UIScene_FurnaceMenu.h" + +UIScene_FurnaceMenu::UIScene_FurnaceMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene_AbstractContainerMenu(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_labelFurnace.init(app.GetString(IDS_FURNACE)); + m_labelIngredient.init(app.GetString(IDS_INGREDIENT)); + m_labelFuel.init(app.GetString(IDS_FUEL)); + + m_progressFurnaceFire.init(L"",0,0,12,0); + m_progressFurnaceArrow.init(L"",0,0,24,0); + + FurnaceScreenInput *initData = (FurnaceScreenInput *)_initData; + m_furnace = initData->furnace; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->localgameModes[initData->iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[initData->iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Furnace_Menu, this); + } + + FurnaceMenu* menu = new FurnaceMenu( initData->inventory, initData->furnace ); + + Initialize( initData->iPad, menu, true, FurnaceMenu::INV_SLOT_START, eSectionFurnaceUsing, eSectionFurnaceMax ); + + m_slotListFuel.addSlots(FurnaceMenu::FUEL_SLOT, 1); + m_slotListIngredient.addSlots(FurnaceMenu::INGREDIENT_SLOT, 1); + m_slotListResult.addSlots(FurnaceMenu::RESULT_SLOT, 1); + + app.SetRichPresenceContext(m_iPad,CONTEXT_GAME_STATE_FORGING); + + delete initData; +} + +wstring UIScene_FurnaceMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"FurnaceMenuSplit"; + } + else + { + return L"FurnaceMenu"; + } +} + +void UIScene_FurnaceMenu::handleReload() +{ + Initialize( m_iPad, m_menu, true, FurnaceMenu::INV_SLOT_START, eSectionFurnaceUsing, eSectionFurnaceMax ); + + m_slotListFuel.addSlots(FurnaceMenu::FUEL_SLOT, 1); + m_slotListIngredient.addSlots(FurnaceMenu::INGREDIENT_SLOT, 1); + m_slotListResult.addSlots(FurnaceMenu::RESULT_SLOT, 1); +} + +void UIScene_FurnaceMenu::tick() +{ + m_progressFurnaceFire.setProgress( m_furnace->getLitProgress( 12 ) ); + m_progressFurnaceArrow.setProgress( m_furnace->getBurnProgress( 24 ) ); + UIScene_AbstractContainerMenu::tick(); +} + +int UIScene_FurnaceMenu::getSectionColumns(ESceneSection eSection) +{ + int cols = 0; + switch( eSection ) + { + case eSectionFurnaceResult: + cols = 1; + break; + case eSectionFurnaceFuel: + cols = 1; + break; + case eSectionFurnaceIngredient: + cols = 1; + break; + case eSectionFurnaceInventory: + cols = 9; + break; + case eSectionFurnaceUsing: + cols = 9; + break; + default: + assert( false ); + break; + } + return cols; +} + +int UIScene_FurnaceMenu::getSectionRows(ESceneSection eSection) +{ + int rows = 0; + switch( eSection ) + { + case eSectionFurnaceResult: + rows = 1; + break; + case eSectionFurnaceFuel: + rows = 1; + break; + case eSectionFurnaceIngredient: + rows = 1; + break; + case eSectionFurnaceInventory: + rows = 3; + break; + case eSectionFurnaceUsing: + rows = 1; + break; + default: + assert( false ); + break; + } + return rows; +} + +void UIScene_FurnaceMenu::GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ) +{ + switch( eSection ) + { + case eSectionFurnaceResult: + pPosition->x = m_slotListResult.getXPos(); + pPosition->y = m_slotListResult.getYPos(); + break; + case eSectionFurnaceFuel: + pPosition->x = m_slotListFuel.getXPos(); + pPosition->y = m_slotListFuel.getYPos(); + break; + case eSectionFurnaceIngredient: + pPosition->x = m_slotListIngredient.getXPos(); + pPosition->y = m_slotListIngredient.getYPos(); + break; + case eSectionFurnaceInventory: + pPosition->x = m_slotListInventory.getXPos(); + pPosition->y = m_slotListInventory.getYPos(); + break; + case eSectionFurnaceUsing: + pPosition->x = m_slotListHotbar.getXPos(); + pPosition->y = m_slotListHotbar.getYPos(); + break; + default: + assert( false ); + break; + } +} + +void UIScene_FurnaceMenu::GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ) +{ + UIVec2D sectionSize; + switch( eSection ) + { + case eSectionFurnaceResult: + sectionSize.x = m_slotListResult.getWidth(); + sectionSize.y = m_slotListResult.getHeight(); + break; + case eSectionFurnaceFuel: + sectionSize.x = m_slotListFuel.getWidth(); + sectionSize.y = m_slotListFuel.getHeight(); + break; + case eSectionFurnaceIngredient: + sectionSize.x = m_slotListIngredient.getWidth(); + sectionSize.y = m_slotListIngredient.getHeight(); + break; + case eSectionFurnaceInventory: + sectionSize.x = m_slotListInventory.getWidth(); + sectionSize.y = m_slotListInventory.getHeight(); + break; + case eSectionFurnaceUsing: + sectionSize.x = m_slotListHotbar.getWidth(); + sectionSize.y = m_slotListHotbar.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_FurnaceMenu::setSectionSelectedSlot(ESceneSection eSection, int x, int y) +{ + int cols = getSectionColumns(eSection); + + int index = (y * cols) + x; + + UIControl_SlotList *slotList = NULL; + switch( eSection ) + { + case eSectionFurnaceResult: + slotList = &m_slotListResult; + break; + case eSectionFurnaceFuel: + slotList = &m_slotListFuel; + break; + case eSectionFurnaceIngredient: + slotList = &m_slotListIngredient; + break; + case eSectionFurnaceInventory: + slotList = &m_slotListInventory; + break; + case eSectionFurnaceUsing: + slotList = &m_slotListHotbar; + break; + default: + assert( false ); + break; + } + + slotList->setHighlightSlot(index); +} + +UIControl *UIScene_FurnaceMenu::getSection(ESceneSection eSection) +{ + UIControl *control = NULL; + switch( eSection ) + { + case eSectionFurnaceResult: + control = &m_slotListResult; + break; + case eSectionFurnaceFuel: + control = &m_slotListFuel; + break; + case eSectionFurnaceIngredient: + control = &m_slotListIngredient; + break; + case eSectionFurnaceInventory: + control = &m_slotListInventory; + break; + case eSectionFurnaceUsing: + control = &m_slotListHotbar; + break; + default: + assert( false ); + break; + } + return control; +} diff --git a/Minecraft.Client/Common/UI/UIScene_FurnaceMenu.h b/Minecraft.Client/Common/UI/UIScene_FurnaceMenu.h new file mode 100644 index 00000000..dcea967e --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_FurnaceMenu.h @@ -0,0 +1,50 @@ +#pragma once + +#include "UIScene_AbstractContainerMenu.h" +#include "IUIScene_FurnaceMenu.h" + +class InventoryMenu; + +class UIScene_FurnaceMenu : public UIScene_AbstractContainerMenu, public IUIScene_FurnaceMenu +{ +private: + shared_ptr m_furnace; + +public: + UIScene_FurnaceMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_FurnaceMenu;} + +protected: + UIControl_SlotList m_slotListFuel, m_slotListIngredient, m_slotListResult; + UIControl_Label m_labelFurnace, m_labelIngredient, m_labelFuel; + UIControl_Progress m_progressFurnaceFire, m_progressFurnaceArrow; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene_AbstractContainerMenu) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + UI_MAP_ELEMENT( m_slotListIngredient, "Ingredient") + UI_MAP_ELEMENT( m_slotListFuel, "Fuel") + UI_MAP_ELEMENT( m_slotListResult, "Result") + UI_MAP_ELEMENT( m_labelFurnace, "Furnace_text") + UI_MAP_ELEMENT( m_labelIngredient, "Ingredient_Label") + UI_MAP_ELEMENT( m_labelFuel, "Fuel_Label") + + UI_MAP_ELEMENT( m_progressFurnaceFire, "FurnaceFire") + UI_MAP_ELEMENT( m_progressFurnaceArrow, "FurnaceArrow") + UI_END_MAP_CHILD_ELEMENTS() + UI_END_MAP_ELEMENTS_AND_NAMES() + + virtual wstring getMoviePath(); + virtual void handleReload(); + + virtual void tick(); + + 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); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_HUD.cpp b/Minecraft.Client/Common/UI/UIScene_HUD.cpp new file mode 100644 index 00000000..27eeb76b --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_HUD.cpp @@ -0,0 +1,997 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_HUD.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.boss.enderdragon.h" +#include "..\..\EnderDragonRenderer.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.effect.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" + +UIScene_HUD::UIScene_HUD(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + m_bSplitscreen = false; + + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_lastActiveSlot = 0; + m_lastScale = 1; + m_bToolTipsVisible = true; + m_lastExpProgress = 0.0f; + m_lastExpLevel = 0; + m_lastMaxHealth = 20; + m_lastHealthBlink = false; + m_lastHealthPoison = false; + m_lastMaxFood = 20; + m_lastFoodPoison = false; + m_lastAir = 10; + m_lastArmour = 0; + m_showHealth = true; + m_showFood = true; + m_showAir = true; + m_showArmour = true; + m_showExpBar = true; + m_lastRegenEffect = false; + m_lastSaturation = 0; + m_lastDragonHealth = 0.0f; + m_showDragonHealth = false; + m_ticksWithNoBoss = 0; + m_uiSelectedItemOpacityCountDown = 0; + m_displayName = L""; + m_lastShowDisplayName = true; + + SetDragonLabel( app.GetString( IDS_BOSS_ENDERDRAGON_HEALTH ) ); + SetSelectedLabel(L""); + + for(unsigned int i = 0; i < CHAT_LINES_COUNT; ++i) + { + m_labelChatText[i].init(L""); + } + m_labelJukebox.init(L""); + + addTimer(0, 100); +} + +wstring UIScene_HUD::getMoviePath() +{ + switch( m_parentLayer->getViewport() ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + m_bSplitscreen = true; + return L"HUDSplit"; + break; + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + default: + m_bSplitscreen = false; + return L"HUD"; + break; + } +} + +void UIScene_HUD::updateSafeZone() +{ + // Distance from edge + F64 safeTop = 0.0; + F64 safeBottom = 0.0; + F64 safeLeft = 0.0; + F64 safeRight = 0.0; + + switch( m_parentLayer->getViewport() ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + safeTop = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + safeRight = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + safeBottom = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + safeRight = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + safeLeft = getSafeZoneHalfWidth(); + safeTop = getSafeZoneHalfHeight(); + safeBottom = getSafeZoneHalfHeight(); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + safeRight = getSafeZoneHalfWidth(); + safeTop = getSafeZoneHalfHeight(); + safeBottom = getSafeZoneHalfHeight(); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + safeTop = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + safeTop = getSafeZoneHalfHeight(); + safeRight = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + safeBottom = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + safeBottom = getSafeZoneHalfHeight(); + safeRight = getSafeZoneHalfWidth(); + break; + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + default: + safeTop = getSafeZoneHalfHeight(); + safeBottom = getSafeZoneHalfHeight(); + safeLeft = getSafeZoneHalfWidth(); + safeRight = getSafeZoneHalfWidth(); + break; + } + setSafeZone(safeTop, safeBottom, safeLeft, safeRight); +} + +void UIScene_HUD::tick() +{ + UIScene::tick(); + if(getMovie() && app.GetGameStarted()) + { + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localgameModes[m_iPad] == NULL) + { + return; + } + + if(pMinecraft->localplayers[m_iPad]->dimension == 1) + { + if (EnderDragonRenderer::bossInstance == NULL) + { + if(m_ticksWithNoBoss<=20) + { + ++m_ticksWithNoBoss; + } + if( m_ticksWithNoBoss > 20 ) + { + ShowDragonHealth(false); + } + } + else + { + shared_ptr boss = EnderDragonRenderer::bossInstance; + // 4J Stu - Don't clear this here as it's wiped for other players + //EnderDragonRenderer::bossInstance = nullptr; + m_ticksWithNoBoss = 0; + + ShowDragonHealth(true); + SetDragonHealth( (float)boss->getSynchedHealth()/boss->getMaxHealth()); + } + } + else + { + ShowDragonHealth(false); + } + } +} + +void UIScene_HUD::customDraw(IggyCustomDrawCallbackRegion *region) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localgameModes[m_iPad] == NULL) return; + + int slot = -1; + swscanf((wchar_t*)region->name,L"slot_%d",&slot); + if (slot == -1) + { + app.DebugPrintf("This is not the control we are looking for\n"); + } + else + { + Slot *invSlot = pMinecraft->localplayers[m_iPad]->inventoryMenu->getSlot(InventoryMenu::USE_ROW_SLOT_START + slot); + shared_ptr item = invSlot->getItem(); + if(item != NULL) + { + unsigned char ucAlpha=app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_InterfaceOpacity); + float fVal; + + if(ucAlpha<80) + { + // check if we have the timer running for the opacity + unsigned int uiOpacityTimer=app.GetOpacityTimer(m_iPad); + if(uiOpacityTimer!=0) + { + if(uiOpacityTimer<10) + { + float fStep=(80.0f-(float)ucAlpha)/10.0f; + fVal=0.01f*(80.0f-((10.0f-(float)uiOpacityTimer)*fStep)); + } + else + { + fVal=0.01f*80.0f; + } + } + else + { + fVal=0.01f*(float)ucAlpha; + } + } + else + { + fVal=0.01f*(float)ucAlpha; + } + customDrawSlotControl(region,m_iPad,item,fVal,item->isFoil(),true); + } + } +} + +void UIScene_HUD::handleReload() +{ + m_lastActiveSlot = 0; + m_lastScale = 1; + m_bToolTipsVisible = true; + m_lastExpProgress = 0.0f; + m_lastExpLevel = 0; + m_lastMaxHealth = 20; + m_lastHealthBlink = false; + m_lastHealthPoison = false; + m_lastMaxFood = 20; + m_lastFoodPoison = false; + m_lastAir = 10; + m_lastArmour = 0; + m_showHealth = true; + m_showFood = true; + m_showAir = true; + m_showArmour = true; + m_showExpBar = true; + m_lastRegenEffect = false; + m_lastSaturation = 0; + m_lastDragonHealth = 0.0f; + m_showDragonHealth = false; + m_ticksWithNoBoss = 0; + m_uiSelectedItemOpacityCountDown = 0; + m_displayName = L""; + + m_labelDisplayName.setVisible(m_lastShowDisplayName); + + SetDragonLabel( app.GetString( IDS_BOSS_ENDERDRAGON_HEALTH ) ); + SetSelectedLabel(L""); + + for(unsigned int i = 0; i < CHAT_LINES_COUNT; ++i) + { + m_labelChatText[i].init(L""); + } + m_labelJukebox.init(L""); + + int iGuiScale; + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localplayers[m_iPad]->m_iScreenSection == C4JRender::VIEWPORT_TYPE_FULLSCREEN) + { + iGuiScale=app.GetGameSettings(m_iPad,eGameSetting_UISize); + } + else + { + iGuiScale=app.GetGameSettings(m_iPad,eGameSetting_UISizeSplitscreen); + } + SetHudSize(iGuiScale); + + SetDisplayName(ProfileManager.GetDisplayName(m_iPad)); + + repositionHud(); + + SetTooltipsEnabled(((ui.GetMenuDisplayed(ProfileManager.GetPrimaryPad())) || (app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_Tooltips) != 0))); +} + +void UIScene_HUD::SetHudSize(int scale) +{ + if(scale != m_lastScale) + { + m_lastScale = scale; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = scale; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcLoadHud , 1 , value ); + } +} + +void UIScene_HUD::SetExpBarProgress(float progress) +{ + if(progress != m_lastExpProgress) + { + m_lastExpProgress = progress; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = progress; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetExpBarProgress , 1 , value ); + } +} + +void UIScene_HUD::SetExpLevel(int level) +{ + if(level != m_lastExpLevel) + { + m_lastExpLevel = level; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = level; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetPlayerLevel , 1 , value ); + } +} + +void UIScene_HUD::SetActiveSlot(int slot) +{ + if(slot != m_lastActiveSlot) + { + m_lastActiveSlot = slot; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = slot; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetActiveSlot , 1 , value ); + } +} + +void UIScene_HUD::SetHealth(int iHealth, int iLastHealth, bool bBlink, bool bPoison) +{ + int maxHealth = max(iHealth, iLastHealth); + if(maxHealth != m_lastMaxHealth || bBlink != m_lastHealthBlink || bPoison != m_lastHealthPoison) + { + m_lastMaxHealth = maxHealth; + m_lastHealthBlink = bBlink; + m_lastHealthPoison = bPoison; + + IggyDataValue result; + IggyDataValue value[3]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = maxHealth; + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = bBlink; + value[2].type = IGGY_DATATYPE_boolean; + value[2].boolval = bPoison; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetHealth , 3 , value ); + } +} + +void UIScene_HUD::SetFood(int iFood, int iLastFood, bool bPoison) +{ + // Ignore iLastFood as food doesn't flash + int maxFood = iFood; //, iLastFood); + if(maxFood != m_lastMaxFood || bPoison != m_lastFoodPoison) + { + m_lastMaxFood = maxFood; + m_lastFoodPoison = bPoison; + + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = maxFood; + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = bPoison; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetFood , 2 , value ); + } +} + +void UIScene_HUD::SetAir(int iAir) +{ + if(iAir != m_lastAir) + { + app.DebugPrintf("SetAir to %d\n", iAir); + m_lastAir = iAir; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = iAir; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetAir , 1 , value ); + } +} + +void UIScene_HUD::SetArmour(int iArmour) +{ + if(iArmour != m_lastArmour) + { + app.DebugPrintf("SetArmour to %d\n", iArmour); + m_lastArmour = iArmour; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = iArmour; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetArmour , 1 , value ); + } +} + +void UIScene_HUD::ShowHealth(bool show) +{ + if(show != m_showHealth) + { + app.DebugPrintf("ShowHealth to %s\n", show?"TRUE":"FALSE"); + m_showHealth = show; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = show; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowHealth , 1 , value ); + } +} + +void UIScene_HUD::ShowFood(bool show) +{ + if(show != m_showFood) + { + app.DebugPrintf("ShowFood to %s\n", show?"TRUE":"FALSE"); + m_showFood = show; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = show; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowFood , 1 , value ); + } +} + +void UIScene_HUD::ShowAir(bool show) +{ + if(show != m_showAir) + { + app.DebugPrintf("ShowAir to %s\n", show?"TRUE":"FALSE"); + m_showAir = show; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = show; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowAir , 1 , value ); + } +} + +void UIScene_HUD::ShowArmour(bool show) +{ + if(show != m_showArmour) + { + app.DebugPrintf("ShowArmour to %s\n", show?"TRUE":"FALSE"); + m_showArmour = show; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = show; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowArmour , 1 , value ); + } +} + +void UIScene_HUD::ShowExpBar(bool show) +{ + if(show != m_showExpBar) + { + app.DebugPrintf("ShowExpBar to %s\n", show?"TRUE":"FALSE"); + m_showExpBar = show; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = show; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowExpbar , 1 , value ); + } +} + +void UIScene_HUD::SetRegenerationEffect(bool bEnabled) +{ + if(bEnabled != m_lastRegenEffect) + { + app.DebugPrintf("SetRegenerationEffect to %s\n", bEnabled?"TRUE":"FALSE"); + m_lastRegenEffect = bEnabled; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = bEnabled; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetRegenerationEffect , 1 , value ); + } +} + +void UIScene_HUD::SetFoodSaturationLevel(int iSaturation) +{ + if(iSaturation != m_lastSaturation) + { + app.DebugPrintf("Set saturation to %d\n", iSaturation); + m_lastSaturation = iSaturation; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = iSaturation; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetFoodSaturationLevel , 1 , value ); + } +} + +void UIScene_HUD::SetDragonHealth(float health) +{ + if(health != m_lastDragonHealth) + { + app.DebugPrintf("Set dragon health to %f\n", health); + m_lastDragonHealth = health; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = health; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetDragonHealth , 1 , value ); + } +} + +void UIScene_HUD::SetDragonLabel(const wstring &label) +{ + IggyDataValue result; + IggyDataValue value[1]; + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetDragonLabel , 1 , value ); +} + +void UIScene_HUD::ShowDragonHealth(bool show) +{ + if(show != m_showDragonHealth) + { + app.DebugPrintf("ShowDragonHealth to %s\n", show?"TRUE":"FALSE"); + m_showDragonHealth = show; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = show; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowDragonHealth , 1 , value ); + } +} + +void UIScene_HUD::SetSelectedLabel(const wstring &label) +{ + // 4J Stu - Timing here is kept the same as on Xbox360, even though we do it differently now and do the fade out in Flash rather than directly setting opacity + if(!label.empty()) m_uiSelectedItemOpacityCountDown = SharedConstants::TICKS_PER_SECOND * 3; + + IggyDataValue result; + IggyDataValue value[1]; + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetSelectedLabel , 1 , value ); +} + +void UIScene_HUD::HideSelectedLabel() +{ + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcHideSelectedLabel , 0 , NULL ); +} + +void UIScene_HUD::render(S32 width, S32 height, C4JRender::eViewportType viewport) +{ + if(m_bSplitscreen) + { + S32 xPos = 0; + S32 yPos = 0; + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + yPos = (S32)(ui.getScreenHeight() / 2); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + xPos = (S32)(ui.getScreenWidth() / 2); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + xPos = (S32)(ui.getScreenWidth() / 2); + yPos = (S32)(ui.getScreenHeight() / 2); + break; + } + ui.setupRenderPosition(xPos, yPos); + + S32 tileXStart = 0; + S32 tileYStart = 0; + S32 tileWidth = width; + S32 tileHeight = height; + + switch( viewport ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + tileHeight = (S32)(ui.getScreenHeight()); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + tileWidth = (S32)(ui.getScreenWidth()); + tileYStart = (S32)(m_movieHeight / 2); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + tileWidth = (S32)(ui.getScreenWidth()); + tileYStart = (S32)(m_movieHeight / 2); + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + tileYStart = (S32)(m_movieHeight / 2); + break; + } + + IggyPlayerSetDisplaySize( getMovie(), m_movieWidth, m_movieHeight ); + + m_renderWidth = tileWidth; + m_renderHeight = tileHeight; + + IggyPlayerDrawTilesStart ( getMovie() ); + IggyPlayerDrawTile ( getMovie() , + tileXStart , + tileYStart , + tileXStart + tileWidth , + tileYStart + tileHeight , + 0 ); + IggyPlayerDrawTilesEnd ( getMovie() ); + } + else + { + UIScene::render(width, height, viewport); + } +} + +void UIScene_HUD::handleTimerComplete(int id) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + + bool anyVisible = false; + if(pMinecraft->localplayers[m_iPad]!= NULL) + { + Gui *pGui = pMinecraft->gui; + //DWORD messagesToDisplay = min( CHAT_LINES_COUNT, pGui->getMessagesCount(m_iPad) ); + for( unsigned int i = 0; i < CHAT_LINES_COUNT; ++i ) + { + float opacity = pGui->getOpacity(m_iPad, i); + if( opacity > 0 ) + { + m_controlLabelBackground[i].setOpacity(opacity); + m_labelChatText[i].setOpacity(opacity); + m_labelChatText[i].setLabel( pGui->getMessagesCount(m_iPad) ? pGui->getMessage(m_iPad,i) : L"" ); + + anyVisible = true; + } + else + { + m_controlLabelBackground[i].setOpacity(0); + m_labelChatText[i].setOpacity(0); + m_labelChatText[i].setLabel(L""); + } + } + if(pGui->getJukeboxOpacity(m_iPad) > 0) anyVisible = true; + m_labelJukebox.setOpacity( pGui->getJukeboxOpacity(m_iPad) ); + m_labelJukebox.setLabel( pGui->getJukeboxMessage(m_iPad) ); + } + else + { + for( unsigned int i = 0; i < CHAT_LINES_COUNT; ++i ) + { + m_controlLabelBackground[i].setOpacity(0); + m_labelChatText[i].setOpacity(0); + m_labelChatText[i].setLabel(L""); + } + m_labelJukebox.setOpacity( 0 ); + } + + //setVisible(anyVisible); +} + +void UIScene_HUD::repositionHud() +{ + if(!m_bSplitscreen) return; + + S32 width = 0; + S32 height = 0; + m_parentLayer->getRenderDimensions( width, height ); + + switch( m_parentLayer->getViewport() ) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + height = (S32)(ui.getScreenHeight()); + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + width = (S32)(ui.getScreenWidth()); + break; + } + + app.DebugPrintf(app.USER_SR, "Reposition HUD with dims %d, %d\n", width, height ); + + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = width; + value[1].type = IGGY_DATATYPE_number; + value[1].number = height; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcRepositionHud , 2 , value ); +} + +void UIScene_HUD::ShowDisplayName(bool show) +{ + m_lastShowDisplayName = show; + m_labelDisplayName.setVisible(show); +} + +void UIScene_HUD::SetDisplayName(const wstring &displayName) +{ + if(displayName.compare(m_displayName) != 0) + { + m_displayName = displayName; + + IggyDataValue result; + IggyDataValue value[1]; + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)displayName.c_str(); + stringVal.length = displayName.length(); + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetDisplayName , 1 , value ); + + m_labelDisplayName.setVisible(m_lastShowDisplayName); + } +} + +void UIScene_HUD::SetTooltipsEnabled(bool bEnabled) +{ + if(m_bToolTipsVisible != bEnabled) + { + m_bToolTipsVisible = bEnabled; + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = bEnabled; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetTooltipsEnabled , 1 , value ); + } +} + +void UIScene_HUD::handleGameTick() +{ + if(getMovie() && app.GetGameStarted()) + { + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localgameModes[m_iPad] == NULL) + { + m_parentLayer->showComponent(m_iPad, eUIScene_HUD,false); + return; + } + m_parentLayer->showComponent(m_iPad, eUIScene_HUD,true); + + int iGuiScale; + + if(pMinecraft->localplayers[m_iPad]->m_iScreenSection == C4JRender::VIEWPORT_TYPE_FULLSCREEN) + { + iGuiScale=app.GetGameSettings(m_iPad,eGameSetting_UISize); + } + else + { + iGuiScale=app.GetGameSettings(m_iPad,eGameSetting_UISizeSplitscreen); + } + SetHudSize(iGuiScale); + + SetDisplayName(ProfileManager.GetDisplayName(m_iPad)); + + SetTooltipsEnabled(((ui.GetMenuDisplayed(ProfileManager.GetPrimaryPad())) || (app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_Tooltips) != 0))); + +#if TO_BE_IMPLEMENTED + // Move the whole hud group if we are not in fullscreen + if(pMinecraft->localplayers[m_iPad]->m_iScreenSection != C4JRender::VIEWPORT_TYPE_FULLSCREEN) + { + int iTooltipsYOffset = 0; + // if tooltips are off, set the y offset to zero + if(app.GetGameSettings(m_iPad,eGameSetting_Tooltips)==0) + { + switch(iGuiScale) + { + case 0: + iTooltipsYOffset=28;//screenHeight/10; + break; + case 2: + iTooltipsYOffset=28;//screenHeight/10; + break; + case 1: + default: + iTooltipsYOffset=28;//screenHeight/10; + break; + } + } + + float fHeight, fWidth; + GetBounds(&fWidth, &fHeight); + + int iSafezoneYHalf = 0; + switch(pMinecraft->localplayers[m_iPad]->m_iScreenSection) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + iSafezoneYHalf = -fHeight/10;// 5% (need to treat the whole screen is 2x this screen) + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + iSafezoneYHalf = (fHeight/2)-(fHeight/10);// 5% (need to treat the whole screen is 2x this screen) + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + iSafezoneYHalf = (fHeight/2)-(fHeight/10);// 5% (need to treat the whole screen is 2x this screen) + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + iSafezoneYHalf = -fHeight/10; // 5% (the whole screen is 2x this screen) + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + iSafezoneYHalf = -fHeight/10; // 5% (the whole screen is 2x this screen) + break; + }; + + D3DXVECTOR3 pos; + m_hudGroup.GetPosition(&pos); + pos.y = iTooltipsYOffset + iSafezoneYHalf; + m_hudGroup.SetPosition(&pos); + } +#endif + SetActiveSlot(pMinecraft->localplayers[m_iPad]->inventory->selected); + + // Update xp progress + if (pMinecraft->localgameModes[m_iPad]->canHurtPlayer()) + { + ShowExpBar(true); + int xpNeededForNextLevel = pMinecraft->localplayers[m_iPad]->getXpNeededForNextLevel(); + int progress = (int)(pMinecraft->localplayers[m_iPad]->experienceProgress *xpNeededForNextLevel); + SetExpBarProgress((float)progress/xpNeededForNextLevel); + } + else + { + ShowExpBar(false); + } + + // Update xp level + if (pMinecraft->localgameModes[m_iPad]->hasExperience() && pMinecraft->localplayers[m_iPad]->experienceLevel > 0) + { + SetExpLevel(pMinecraft->localplayers[m_iPad]->experienceLevel); + } + else + { + SetExpLevel(0); + } + + if (pMinecraft->localgameModes[m_iPad]->canHurtPlayer()) + { + ShowHealth(true); + ShowFood(true); + + SetRegenerationEffect(pMinecraft->localplayers[m_iPad]->hasEffect(MobEffect::regeneration)); + + // Update health + bool blink = pMinecraft->localplayers[m_iPad]->invulnerableTime / 3 % 2 == 1; + if (pMinecraft->localplayers[m_iPad]->invulnerableTime < 10) blink = false; + int iHealth = pMinecraft->localplayers[m_iPad]->getHealth(); + int iLastHealth = pMinecraft->localplayers[m_iPad]->lastHealth; + bool bHasPoison = pMinecraft->localplayers[m_iPad]->hasEffect(MobEffect::poison); + SetHealth(iHealth, iLastHealth, blink, bHasPoison); + + // Update food + //bool foodBlink = false; + FoodData *foodData = pMinecraft->localplayers[m_iPad]->getFoodData(); + int food = foodData->getFoodLevel(); + int oldFood = foodData->getLastFoodLevel(); + bool hasHungerEffect = pMinecraft->localplayers[m_iPad]->hasEffect(MobEffect::hunger); + int saturationLevel = pMinecraft->localplayers[m_iPad]->getFoodData()->getSaturationLevel(); + SetFood(food, oldFood, hasHungerEffect); + SetFoodSaturationLevel(saturationLevel); + + // Update armour + int armor = pMinecraft->localplayers[m_iPad]->getArmorValue(); + if(armor > 0) + { + ShowArmour(true); + SetArmour(armor); + } + else + { + ShowArmour(false); + } + + // Update air + if (pMinecraft->localplayers[m_iPad]->isUnderLiquid(Material::water)) + { + ShowAir(true); + int count = (int) ceil((pMinecraft->localplayers[m_iPad]->getAirSupply() - 2) * 10.0f / Player::TOTAL_AIR_SUPPLY); + SetAir(count); + } + else + { + ShowAir(false); + } + } + else + { + ShowHealth(false); + ShowFood(false); + ShowAir(false); + ShowArmour(false); + } + + if(m_uiSelectedItemOpacityCountDown>0) + { + --m_uiSelectedItemOpacityCountDown; + + // 4J Stu - Timing here is kept the same as on Xbox360, even though we do it differently now and do the fade out in Flash rather than directly setting opacity + if(m_uiSelectedItemOpacityCountDown < (SharedConstants::TICKS_PER_SECOND * 1) ) + { + HideSelectedLabel(); + m_uiSelectedItemOpacityCountDown = 0; + } + } + + unsigned char ucAlpha=app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_InterfaceOpacity); + float fVal; + + if(ucAlpha<80) + { + // if we are in a menu, set the minimum opacity for tooltips to 15% + if(ui.GetMenuDisplayed(m_iPad) && (ucAlpha<15)) + { + ucAlpha=15; + } + + // check if we have the timer running for the opacity + unsigned int uiOpacityTimer=app.GetOpacityTimer(m_iPad); + if(uiOpacityTimer!=0) + { + if(uiOpacityTimer<10) + { + float fStep=(80.0f-(float)ucAlpha)/10.0f; + fVal=0.01f*(80.0f-((10.0f-(float)uiOpacityTimer)*fStep)); + } + else + { + fVal=0.01f*80.0f; + } + } + else + { + fVal=0.01f*(float)ucAlpha; + } + } + else + { + // if we are in a menu, set the minimum opacity for tooltips to 15% + if(ui.GetMenuDisplayed(m_iPad) && (ucAlpha<15)) + { + ucAlpha=15; + } + fVal=0.01f*(float)ucAlpha; + } + setOpacity(fVal); + + bool bDisplayGui=app.GetGameStarted() && !ui.GetMenuDisplayed(m_iPad) && !(app.GetXuiAction(m_iPad)==eAppAction_AutosaveSaveGameCapturedThumbnail) && app.GetGameSettings(m_iPad,eGameSetting_DisplayHUD)!=0; + if(bDisplayGui && pMinecraft->localplayers[m_iPad] != NULL) + { + setVisible(true); + } + else + { + setVisible(false); + } + } +} diff --git a/Minecraft.Client/Common/UI/UIScene_HUD.h b/Minecraft.Client/Common/UI/UIScene_HUD.h new file mode 100644 index 00000000..cd0d8806 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_HUD.h @@ -0,0 +1,183 @@ +#pragma once + +#include "UIScene.h" + +#define CHAT_LINES_COUNT 10 + +class UIScene_HUD : public UIScene +{ +private: + bool m_bSplitscreen; + + int m_lastActiveSlot; + int m_lastScale; + bool m_bToolTipsVisible; + float m_lastExpProgress; + int m_lastExpLevel; + int m_lastMaxHealth; + bool m_lastHealthBlink, m_lastHealthPoison; + int m_lastMaxFood; + bool m_lastFoodPoison; + int m_lastAir; + int m_lastArmour; + float m_lastDragonHealth; + bool m_showDragonHealth; + int m_ticksWithNoBoss; + bool m_lastShowDisplayName; + + bool m_showHealth, m_showFood, m_showAir, m_showArmour, m_showExpBar; + bool m_lastRegenEffect; + int m_lastSaturation; + + unsigned int m_uiSelectedItemOpacityCountDown; + + wstring m_displayName; + +protected: + UIControl_Label m_labelChatText[CHAT_LINES_COUNT]; + UIControl_Label m_labelJukebox; + UIControl m_controlLabelBackground[CHAT_LINES_COUNT]; + UIControl_Label m_labelDisplayName; + + IggyName m_funcLoadHud, m_funcSetExpBarProgress, m_funcSetPlayerLevel, m_funcSetActiveSlot; + IggyName m_funcSetHealth, m_funcSetFood, m_funcSetAir, m_funcSetArmour; + IggyName m_funcShowHealth, m_funcShowFood, m_funcShowAir, m_funcShowArmour, m_funcShowExpbar; + IggyName m_funcSetRegenerationEffect, m_funcSetFoodSaturationLevel; + IggyName m_funcSetDragonHealth, m_funcSetDragonLabel, m_funcShowDragonHealth; + IggyName m_funcSetSelectedLabel, m_funcHideSelectedLabel; + IggyName m_funcRepositionHud, m_funcSetDisplayName, m_funcSetTooltipsEnabled; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT(m_labelChatText[0],"Label1") + UI_MAP_ELEMENT(m_labelChatText[1],"Label2") + UI_MAP_ELEMENT(m_labelChatText[2],"Label3") + UI_MAP_ELEMENT(m_labelChatText[3],"Label4") + UI_MAP_ELEMENT(m_labelChatText[4],"Label5") + UI_MAP_ELEMENT(m_labelChatText[5],"Label6") + UI_MAP_ELEMENT(m_labelChatText[6],"Label7") + UI_MAP_ELEMENT(m_labelChatText[7],"Label8") + UI_MAP_ELEMENT(m_labelChatText[8],"Label9") + UI_MAP_ELEMENT(m_labelChatText[9],"Label10") + + UI_MAP_ELEMENT(m_controlLabelBackground[0],"Label1Background") + UI_MAP_ELEMENT(m_controlLabelBackground[1],"Label2Background") + UI_MAP_ELEMENT(m_controlLabelBackground[2],"Label3Background") + UI_MAP_ELEMENT(m_controlLabelBackground[3],"Label4Background") + UI_MAP_ELEMENT(m_controlLabelBackground[4],"Label5Background") + UI_MAP_ELEMENT(m_controlLabelBackground[5],"Label6Background") + UI_MAP_ELEMENT(m_controlLabelBackground[6],"Label7Background") + UI_MAP_ELEMENT(m_controlLabelBackground[7],"Label8Background") + UI_MAP_ELEMENT(m_controlLabelBackground[8],"Label9Background") + UI_MAP_ELEMENT(m_controlLabelBackground[9],"Label10Background") + + UI_MAP_ELEMENT(m_labelJukebox,"Jukebox") + + UI_MAP_ELEMENT(m_labelDisplayName,"LabelGamertag") + + UI_MAP_NAME(m_funcLoadHud, L"LoadHud") + UI_MAP_NAME(m_funcSetExpBarProgress, L"SetExpBarProgress") + UI_MAP_NAME(m_funcSetPlayerLevel, L"SetPlayerLevel") + UI_MAP_NAME(m_funcSetActiveSlot, L"SetActiveSlot") + + UI_MAP_NAME(m_funcSetHealth, L"SetHealth") + UI_MAP_NAME(m_funcSetFood, L"SetFood") + UI_MAP_NAME(m_funcSetAir, L"SetAir") + UI_MAP_NAME(m_funcSetArmour, L"SetArmour") + + UI_MAP_NAME(m_funcShowHealth, L"ShowHealth") + UI_MAP_NAME(m_funcShowFood, L"ShowFood") + UI_MAP_NAME(m_funcShowAir, L"ShowAir") + UI_MAP_NAME(m_funcShowArmour, L"ShowArmour") + UI_MAP_NAME(m_funcShowExpbar, L"ShowExpBar") + + UI_MAP_NAME(m_funcSetRegenerationEffect, L"SetRegenerationEffect") + UI_MAP_NAME(m_funcSetFoodSaturationLevel, L"SetFoodSaturationLevel") + + UI_MAP_NAME(m_funcSetDragonHealth, L"SetDragonHealth") + UI_MAP_NAME(m_funcSetDragonLabel, L"SetDragonLabel") + UI_MAP_NAME(m_funcShowDragonHealth, L"ShowDragonHealthBar") + + UI_MAP_NAME(m_funcSetSelectedLabel, L"SetSelectedLabel") + UI_MAP_NAME(m_funcHideSelectedLabel, L"HideSelectedLabel") + + UI_MAP_NAME(m_funcRepositionHud, L"RepositionHud") + UI_MAP_NAME(m_funcSetDisplayName, L"SetGamertag") + + UI_MAP_NAME(m_funcSetTooltipsEnabled, L"SetTooltipsEnabled") + UI_END_MAP_ELEMENTS_AND_NAMES() + +public: + UIScene_HUD(int iPad, void *initData, UILayer *parentLayer); + + virtual void tick(); + + virtual void updateSafeZone(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + virtual EUIScene getSceneType() { return eUIScene_HUD;} + + // Returns true if this scene handles input + virtual bool stealsFocus() { return false; } + + // Returns true if this scene has focus for the pad passed in + virtual bool hasFocus(int iPad) { return false; } + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return false; } + + virtual void customDraw(IggyCustomDrawCallbackRegion *region); + + virtual void handleReload(); + +private: + void SetHudSize(int scale); + void SetExpBarProgress(float progress); + void SetExpLevel(int level); + void SetActiveSlot(int slot); + + void SetHealth(int iHealth, int iLastHealth, bool bBlink, bool bPoison); + void SetFood(int iFood, int iLastFood, bool bPoison); + void SetAir(int iAir); + void SetArmour(int iArmour); + + void ShowHealth(bool show); + void ShowFood(bool show); + void ShowAir(bool show); + void ShowArmour(bool show); + void ShowExpBar(bool show); + + void SetRegenerationEffect(bool bEnabled); + void SetFoodSaturationLevel(int iSaturation); + + void SetDragonHealth(float health); + void SetDragonLabel(const wstring &label); + void ShowDragonHealth(bool show); + + void HideSelectedLabel(); + + void SetDisplayName(const wstring &displayName); + + void SetTooltipsEnabled(bool bEnabled); + +public: + void SetSelectedLabel(const wstring &label); + void ShowDisplayName(bool show); + + void handleGameTick(); + + // RENDERING + virtual void render(S32 width, S32 height, C4JRender::eViewportType viewport); + +protected: + void handleTimerComplete(int id); + +#ifdef _DURANGO + virtual long long getDefaultGtcButtons() { return _360_GTC_PAUSE | _360_GTC_MENU | _360_GTC_VIEW; } +#endif + +private: + void repositionHud(); +}; diff --git a/Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.cpp new file mode 100644 index 00000000..3fe03325 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.cpp @@ -0,0 +1,233 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_HelpAndOptionsMenu.h" +#include "..\..\Minecraft.h" + +UIScene_HelpAndOptionsMenu::UIScene_HelpAndOptionsMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_bNotInGame=(Minecraft::GetInstance()->level==NULL); + + m_buttons[BUTTON_HAO_CHANGESKIN].init(app.GetString(IDS_CHANGE_SKIN),BUTTON_HAO_CHANGESKIN); + m_buttons[BUTTON_HAO_HOWTOPLAY].init(app.GetString(IDS_HOW_TO_PLAY),BUTTON_HAO_HOWTOPLAY); + m_buttons[BUTTON_HAO_CONTROLS].init(app.GetString(IDS_CONTROLS),BUTTON_HAO_CONTROLS); + m_buttons[BUTTON_HAO_SETTINGS].init(app.GetString(IDS_SETTINGS),BUTTON_HAO_SETTINGS); + m_buttons[BUTTON_HAO_CREDITS].init(app.GetString(IDS_CREDITS),BUTTON_HAO_CREDITS); + //m_buttons[BUTTON_HAO_REINSTALL].init(app.GetString(IDS_REINSTALL_CONTENT),BUTTON_HAO_REINSTALL); + m_buttons[BUTTON_HAO_DEBUG].init(app.GetString(IDS_DEBUG_SETTINGS),BUTTON_HAO_DEBUG); + + /* 4J-TomK - we should never remove a control before the other buttons controls are initialised! + (because vita touchboxes are rebuilt on remove since the remaining positions might change) */ + // We don't have a reinstall content, so remove the button + removeControl( &m_buttons[BUTTON_HAO_REINSTALL], false ); + + doHorizontalResizeCheck(); + +#ifdef _FINAL_BUILD + removeControl( &m_buttons[BUTTON_HAO_DEBUG], false); +#else + if(!app.DebugSettingsOn()) removeControl( &m_buttons[BUTTON_HAO_DEBUG], false); +#endif + +#ifdef _XBOX_ONE + // 4J-PB - in order to buy the skin packs, we need the signed offer ids for them, which we get in the availability info + // we need to retrieve this info though, so do it here + app.AddDLCRequest(e_Marketplace_Content); // content is skin packs, texture packs and mash-up packs + + // we also need to mount the local DLC so we can tell what's been purchased + app.StartInstallDLCProcess(iPad); +#endif + + + + // 4J-PB - do not need a storage device to see this menu - just need one when you choose to re-install them + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + + // any content to be re-installed? + if(m_iPad==ProfileManager.GetPrimaryPad() && bNotInGame) + { + // We should show the reinstall menu + app.DebugPrintf("Reinstall Menu required...\n"); + } + else + { + removeControl( &m_buttons[BUTTON_HAO_REINSTALL], false); + } + + if(app.GetLocalPlayerCount()>1) + { + // no credits in splitscreen + removeControl( &m_buttons[BUTTON_HAO_CREDITS], false); + +#if TO_BE_IMPLEMENTED + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad,false); +#endif + if(ProfileManager.GetPrimaryPad()!=m_iPad) + { + removeControl( &m_buttons[BUTTON_HAO_REINSTALL], false); + } + } + + if(!ProfileManager.IsFullVersion() )//|| ProfileManager.IsGuest(m_iPad)) + { + removeControl( &m_buttons[BUTTON_HAO_CHANGESKIN], false); + } + + //StorageManager.TMSPP_GetUserQuotaInfo(C4JStorage::eGlobalStorage_TitleUser,iPad); + //StorageManager.WebServiceRequestGetFriends(iPad); +} + +UIScene_HelpAndOptionsMenu::~UIScene_HelpAndOptionsMenu() +{ +} + +wstring UIScene_HelpAndOptionsMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"HelpAndOptionsMenuSplit"; + } + else + { + return L"HelpAndOptionsMenu"; + } +} + +void UIScene_HelpAndOptionsMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_HelpAndOptionsMenu::updateComponents() +{ + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + if(bNotInGame) + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + } + else + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,false); + + if( app.GetLocalPlayerCount() == 1 ) m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + else m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); + + } +} + +void UIScene_HelpAndOptionsMenu::handleReload() +{ +#ifdef _FINAL_BUILD + removeControl( &m_buttons[BUTTON_HAO_DEBUG], false); +#else + if(!app.DebugSettingsOn()) removeControl( &m_buttons[BUTTON_HAO_DEBUG], false); +#endif + + // 4J-PB - do not need a storage device to see this menu - just need one when you choose to re-install them + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + + // any content to be re-installed? + if(m_iPad==ProfileManager.GetPrimaryPad() && bNotInGame) + { + // We should show the reinstall menu + app.DebugPrintf("Reinstall Menu required...\n"); + } + else + { + removeControl( &m_buttons[BUTTON_HAO_REINSTALL], false); + } + + if(app.GetLocalPlayerCount()>1) + { + // no credits in splitscreen + removeControl( &m_buttons[BUTTON_HAO_CREDITS], false); + +#if TO_BE_IMPLEMENTED + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad,false); +#endif + if(ProfileManager.GetPrimaryPad()!=m_iPad) + { + removeControl( &m_buttons[BUTTON_HAO_REINSTALL], false); + } + } + + if(!ProfileManager.IsFullVersion() )//|| ProfileManager.IsGuest(m_iPad)) + { +#if TO_BE_IMPLEMENTED + m_Buttons[BUTTON_HAO_CHANGESKIN].SetEnable(FALSE); + m_Buttons[BUTTON_HAO_CHANGESKIN].EnableInput(FALSE); + // set the focus to the second button + + XuiElementSetUserFocus(m_Buttons[BUTTON_HAO_HOWTOPLAY].m_hObj, m_iPad); +#endif + } + + if(!ProfileManager.IsFullVersion() )//|| ProfileManager.IsGuest(m_iPad)) + { + removeControl( &m_buttons[BUTTON_HAO_CHANGESKIN], false); + } + + doHorizontalResizeCheck(); +} + +void UIScene_HelpAndOptionsMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed && !repeat) + { + navigateBack(); + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + //CD - Added for audio + if(pressed) + { + ui.PlayUISFX(eSFX_Press); + } + + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_HelpAndOptionsMenu::handlePress(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case BUTTON_HAO_CHANGESKIN: + ui.NavigateToScene(m_iPad, eUIScene_SkinSelectMenu); + break; + case BUTTON_HAO_HOWTOPLAY: + ui.NavigateToScene(m_iPad, eUIScene_HowToPlayMenu); + break; + case BUTTON_HAO_CONTROLS: + ui.NavigateToScene(m_iPad, eUIScene_ControlsMenu); + break; + case BUTTON_HAO_SETTINGS: + ui.NavigateToScene(m_iPad, eUIScene_SettingsMenu); + break; + case BUTTON_HAO_CREDITS: + ui.NavigateToScene(m_iPad, eUIScene_Credits); + break; + case BUTTON_HAO_REINSTALL: + ui.NavigateToScene(m_iPad, eUIScene_ReinstallMenu); + break; + case BUTTON_HAO_DEBUG: + ui.NavigateToScene(m_iPad, eUIScene_DebugOptions); + break; + } +} diff --git a/Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.h b/Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.h new file mode 100644 index 00000000..203011d3 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_HelpAndOptionsMenu.h @@ -0,0 +1,50 @@ +#pragma once + +#include "UIScene.h" + +#define BUTTON_HAO_CHANGESKIN 0 +#define BUTTON_HAO_HOWTOPLAY 1 +#define BUTTON_HAO_CONTROLS 2 +#define BUTTON_HAO_SETTINGS 3 +#define BUTTON_HAO_CREDITS 4 +#define BUTTON_HAO_REINSTALL 5 +#define BUTTON_HAO_DEBUG 6 +#define BUTTONS_HAO_MAX BUTTON_HAO_DEBUG + 1 + +class UIScene_HelpAndOptionsMenu : public UIScene +{ +private: + UIControl_Button m_buttons[BUTTONS_HAO_MAX]; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttons[BUTTON_HAO_CHANGESKIN], "Button1") + UI_MAP_ELEMENT( m_buttons[BUTTON_HAO_HOWTOPLAY], "Button2") + UI_MAP_ELEMENT( m_buttons[BUTTON_HAO_CONTROLS], "Button3") + UI_MAP_ELEMENT( m_buttons[BUTTON_HAO_SETTINGS], "Button4") + UI_MAP_ELEMENT( m_buttons[BUTTON_HAO_CREDITS], "Button5") + UI_MAP_ELEMENT( m_buttons[BUTTON_HAO_REINSTALL], "Button6") + UI_MAP_ELEMENT( m_buttons[BUTTON_HAO_DEBUG], "Button7") + UI_END_MAP_ELEMENTS_AND_NAMES() + + bool m_bNotInGame; +public: + UIScene_HelpAndOptionsMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_HelpAndOptionsMenu(); + + virtual EUIScene getSceneType() { return eUIScene_HelpAndOptionsMenu;} + + virtual void updateTooltips(); + virtual void updateComponents(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + virtual void handleReload(); + + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +protected: + void handlePress(F64 controlId, F64 childId); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_HowToPlay.cpp b/Minecraft.Client/Common/UI/UIScene_HowToPlay.cpp new file mode 100644 index 00000000..68c7591f --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_HowToPlay.cpp @@ -0,0 +1,328 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_HowToPlay.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" + +static UIScene_HowToPlay::SHowToPlayPageDef gs_aPageDefs[ eHowToPlay_NumPages ] = +{ + { IDS_HOW_TO_PLAY_WHATSNEW, 0, 0}, // eHowToPlay_WhatsNew + { IDS_HOW_TO_PLAY_BASICS, 0, 0}, // eHowToPlay_Basics + { IDS_HOW_TO_PLAY_MULTIPLAYER, 0, 0}, // eHowToPlay_Multiplayer + { IDS_HOW_TO_PLAY_HUD, 0, 0}, // eHowToPlay_HUD + { IDS_HOW_TO_PLAY_CREATIVE, UIScene_HowToPlay::eHowToPlay_LabelCreativeInventory, 1}, // eHowToPlay_Creative + { IDS_HOW_TO_PLAY_INVENTORY, UIScene_HowToPlay::eHowToPlay_LabelIInventory, 1}, // eHowToPlay_Inventory + { IDS_HOW_TO_PLAY_CHEST, UIScene_HowToPlay::eHowToPlay_LabelSCInventory, 2}, // eHowToPlay_Chest + { IDS_HOW_TO_PLAY_LARGECHEST, UIScene_HowToPlay::eHowToPlay_LabelLCInventory, 2}, // eHowToPlay_LargeChest + { IDS_HOW_TO_PLAY_ENDERCHEST, 0, 0}, // eHowToPlay_EnderChest + { IDS_HOW_TO_PLAY_CRAFTING, UIScene_HowToPlay::eHowToPlay_LabelCItem, 3}, // eHowToPlay_InventoryCrafting + { IDS_HOW_TO_PLAY_CRAFT_TABLE, UIScene_HowToPlay::eHowToPlay_LabelCTItem, 3}, // eHowToPlay_CraftTable + { IDS_HOW_TO_PLAY_FURNACE, UIScene_HowToPlay::eHowToPlay_LabelFFuel, 4}, // eHowToPlay_Furnace + { IDS_HOW_TO_PLAY_DISPENSER, UIScene_HowToPlay::eHowToPlay_LabelDText, 2}, // eHowToPlay_Dispenser + { IDS_HOW_TO_PLAY_BREWING, UIScene_HowToPlay::eHowToPlay_LabelBBrew, 2}, // eHowToPlay_Brewing + { IDS_HOW_TO_PLAY_ENCHANTMENT, UIScene_HowToPlay::eHowToPlay_LabelEEnchant, 2}, // eHowToPlay_Enchantment + { IDS_HOW_TO_PLAY_ANVIL, UIScene_HowToPlay::eHowToPlay_LabelAnvil_Inventory, 3}, // eHowToPlay_Anvil + { IDS_HOW_TO_PLAY_FARMANIMALS, 0, 0}, // eHowToPlay_Breeding + { IDS_HOW_TO_PLAY_BREEDANIMALS, 0, 0}, // eHowToPlay_Breeding + { IDS_HOW_TO_PLAY_TRADING, UIScene_HowToPlay::eHowToPlay_LabelTrading_Inventory, 5}, // eHowToPlay_Trading + { IDS_HOW_TO_PLAY_NETHERPORTAL, 0, 0}, // eHowToPlay_NetherPortal + { IDS_HOW_TO_PLAY_THEEND, 0, 0}, // eHowToPlay_NetherPortal +#ifdef _XBOX + { IDS_HOW_TO_PLAY_SOCIALMEDIA, 0, 0}, // eHowToPlay_SocialMedia + { IDS_HOW_TO_PLAY_BANLIST, 0, 0}, // eHowToPlay_BanList +#endif + { IDS_HOW_TO_PLAY_HOSTOPTIONS, 0, 0}, // eHowToPlay_HostOptions +}; + +int gs_pageToFlashMapping[eHowToPlay_NumPages] = +{ + 0, //eHowToPlay_WhatsNew = 0, + 1, //eHowToPlay_Basics, + 2, //eHowToPlay_Multiplayer, + 3, //eHowToPlay_HUD, + 4, //eHowToPlay_Creative, + 5, //eHowToPlay_Inventory, + 6, //eHowToPlay_Chest, + 7, //eHowToPlay_LargeChest, + 23, //eHowToPlay_Enderchest, + 8, //eHowToPlay_InventoryCrafting, + 9, //eHowToPlay_CraftTable, + 10, //eHowToPlay_Furnace, + 11, //eHowToPlay_Dispenser, + + 12, //eHowToPlay_Brewing, + 13, //eHowToPlay_Enchantment, + 21, //eHowToPlay_Anvil, + 14, //eHowToPlay_FarmingAnimals, + 15, //eHowToPlay_Breeding, + 22, //eHowToPlay_Trading, + + 16, //eHowToPlay_NetherPortal, + 17, //eHowToPlay_TheEnd, +#ifdef _XBOX + 18, //eHowToPlay_SocialMedia, + 19, //eHowToPlay_BanList, +#endif + 20, //eHowToPlay_HostOptions, +}; + +UIScene_HowToPlay::UIScene_HowToPlay(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + wstring inventoryString = app.GetString(IDS_INVENTORY); + m_labels[ eHowToPlay_LabelCTItem].init(app.GetString(IDS_ITEM_HATCHET_WOOD)); + m_labels[ eHowToPlay_LabelCTGroup].init(app.GetString(IDS_GROUPNAME_TOOLS)); + m_labels[ eHowToPlay_LabelCTInventory3x3].init(inventoryString); + m_labels[ eHowToPlay_LabelCItem].init(app.GetString(IDS_TILE_WORKBENCH)); + m_labels[ eHowToPlay_LabelCGroup].init(app.GetString(IDS_GROUPNAME_STRUCTURES)); + m_labels[ eHowToPlay_LabelCInventory2x2].init(inventoryString); + m_labels[ eHowToPlay_LabelFFuel].init(app.GetString(IDS_FUEL)); + m_labels[ eHowToPlay_LabelFInventory].init(inventoryString); + m_labels[ eHowToPlay_LabelFIngredient].init(app.GetString(IDS_INGREDIENT)); + m_labels[ eHowToPlay_LabelFChest].init(app.GetString(IDS_FURNACE)); + m_labels[ eHowToPlay_LabelLCInventory].init(inventoryString); + m_labels[ eHowToPlay_LabelCreativeInventory].init(app.GetString(IDS_GROUPNAME_BUILDING_BLOCKS)); + m_labels[ eHowToPlay_LabelLCChest].init(app.GetString(IDS_CHEST)); + m_labels[ eHowToPlay_LabelSCInventory].init(inventoryString); + m_labels[ eHowToPlay_LabelSCChest].init(app.GetString(IDS_CHEST)); + m_labels[ eHowToPlay_LabelIInventory].init(inventoryString); + m_labels[ eHowToPlay_LabelDInventory].init(inventoryString); + m_labels[ eHowToPlay_LabelDText].init(app.GetString(IDS_DISPENSER)); + m_labels[ eHowToPlay_LabelEEnchant].init(app.GetString(IDS_ENCHANT)); + m_labels[ eHowToPlay_LabelEInventory].init(inventoryString); + m_labels[ eHowToPlay_LabelBBrew].init(app.GetString(IDS_BREWING_STAND)); + m_labels[ eHowToPlay_LabelBInventory].init(inventoryString); + m_labels[ eHowToPlay_LabelAnvil_Inventory].init(inventoryString.c_str()); + + wstring wsTemp = app.GetString(IDS_REPAIR_COST); + wsTemp.replace( wsTemp.find(L"%d"), 2, wstring(L"8") ); + + m_labels[ eHowToPlay_LabelAnvil_Cost].init(wsTemp.c_str()); + m_labels[ eHowToPlay_LabelAnvil_ARepairAndName].init(app.GetString(IDS_REPAIR_AND_NAME)); + m_labels[ eHowToPlay_LabelTrading_Inventory].init(inventoryString.c_str()); + m_labels[ eHowToPlay_LabelTrading_Offer2].init(app.GetString(IDS_ITEM_EMERALD)); + m_labels[ eHowToPlay_LabelTrading_Offer1].init(app.GetString(IDS_ITEM_EMERALD)); + m_labels[ eHowToPlay_LabelTrading_NeededForTrade].init(app.GetString(IDS_REQUIRED_ITEMS_FOR_TRADE)); + + wsTemp = app.GetString(IDS_VILLAGER_OFFERS_ITEM); + wsTemp = replaceAll(wsTemp,L"{*VILLAGER_TYPE*}",app.GetString(IDS_VILLAGER_PRIEST)); + wsTemp.replace(wsTemp.find(L"%s"),2, app.GetString(IDS_TILE_LIGHT_GEM)); + m_labels[ eHowToPlay_LabelTrading_VillagerOffers].init(wsTemp.c_str()); + + // Extract pad and required page from init data. We just put the data into the pointer rather than using it as an address. + size_t uiInitData = ( size_t )( initData ); + + EHowToPlayPage eStartPage = ( EHowToPlayPage )( ( uiInitData >> 16 ) & 0xFFF ); // Ignores MSB which is set to 1! + + TelemetryManager->RecordMenuShown(m_iPad, eUIScene_HowToPlay, (ETelemetry_HowToPlay_SubMenuId)eStartPage); + + StartPage( eStartPage ); +} + +wstring UIScene_HowToPlay::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"HowToPlaySplit"; + } + else + { + return L"HowToPlay"; + } +} + +void UIScene_HowToPlay::updateTooltips() +{ + // Tool tips. + int iPage = ( int )( m_eCurrPage ); + + int firstPage = eHowToPlay_WhatsNew; +#ifdef __PS3__ + // If it's the blu ray, or the first Japanese digital game, there's no What's New until the first patch, which will take this line out + if(StorageManager.GetBootTypeDisc() || (app.GetProductSKU()==e_sku_SCEJ)) + { + ++firstPage; + } +#elif defined(__ORBIS__) || defined(_DURANGO) || defined(__PSVITA__) + // No What's New for the first PS4 and Xbox One builds + if(true) + { + ++firstPage; + } +#endif + + int iA = -1; + int iX = -1; + if ( iPage == firstPage ) + { + // No previous page. + iA = IDS_HOW_TO_PLAY_NEXT; + } + else if ( ( iPage + 1 ) == eHowToPlay_NumPages ) + { + // No next page. + iX = IDS_HOW_TO_PLAY_PREV; + } + else + { + iA = IDS_HOW_TO_PLAY_NEXT; + iX = IDS_HOW_TO_PLAY_PREV; + } + ui.SetTooltips( m_iPad, iA, IDS_TOOLTIPS_BACK, iX ); +} + +void UIScene_HowToPlay::handleReload() +{ + StartPage( m_eCurrPage ); +} + +void UIScene_HowToPlay::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + navigateBack(); + handled = true; + } + break; + case ACTION_MENU_A: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + if(pressed) + { + // Next page + int iNextPage = ( int )( m_eCurrPage ) + 1; + if ( iNextPage != eHowToPlay_NumPages ) + { + StartPage( ( EHowToPlayPage )( iNextPage ) ); + ui.PlayUISFX(eSFX_Press); + } + handled = true; + } + break; + case ACTION_MENU_X: + if(pressed) + { + // Previous page + int iPrevPage = ( int )( m_eCurrPage ) - 1; + +#ifdef __PS3__ + // If it's the blu ray, or the first Japanese digital game, there's no What's New until the first patch, which will take this line out + if(StorageManager.GetBootTypeDisc() || (app.GetProductSKU()==e_sku_SCEJ)) + { + if ( iPrevPage >= 0 && !((iPrevPage==eHowToPlay_WhatsNew))) + { + StartPage( ( EHowToPlayPage )( iPrevPage ) ); + ui.PlayUISFX(eSFX_Press); + } + } + else +#elif defined(__ORBIS__) || defined(_DURANGO) || defined(__PSVITA__) + // No What's New for the first PS4 and Xbox One builds + if(true) + { + if ( iPrevPage >= 0 && !((iPrevPage==eHowToPlay_WhatsNew))) + { + StartPage( ( EHowToPlayPage )( iPrevPage ) ); + ui.PlayUISFX(eSFX_Press); + } + } + else +#endif + { + if ( iPrevPage >= 0 ) + { + StartPage( ( EHowToPlayPage )( iPrevPage ) ); + ui.PlayUISFX(eSFX_Press); + } + + } + handled = true; + } + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_HowToPlay::StartPage( EHowToPlayPage ePage ) +{ + m_eCurrPage = ePage; + + // Turn on just what we need for this screen. + SHowToPlayPageDef* pDef = &( gs_aPageDefs[ m_eCurrPage ] ); + + // Replace button identifiers in the text with actual button images. + wstring replacedText = app.FormatHTMLString(m_iPad, app.GetString( pDef->m_iTextStringID )); + // 4J-PB - replace the title with the platform specific title, and the platform name +// replacedText = replaceAll(replacedText,L"{*TITLE_UPDATE_NAME*}",app.GetString(IDS_TITLE_UPDATE_NAME)); +#ifndef _WINDOWS64 + replacedText = replaceAll(replacedText,L"{*KICK_PLAYER_DESCRIPTION*}",app.GetString(IDS_KICK_PLAYER_DESCRIPTION)); +#endif +#ifdef _XBOX_ONE + replacedText = replaceAll(replacedText,L"{*PLATFORM_NAME*}",app.GetString(IDS_PLATFORM_NAME)); +#endif + replacedText = replaceAll(replacedText,L"{*BACK_BUTTON*}",app.GetString(IDS_BACK_BUTTON)); + replacedText = replaceAll(replacedText,L"{*DISABLES_ACHIEVEMENTS*}",app.GetString(IDS_HOST_OPTION_DISABLES_ACHIEVEMENTS)); + + // strip out any tab characters and repeated spaces + stripWhitespaceForHtml( replacedText, true ); + + // Set the text colour + wstring finalText(replacedText.c_str() ); + wchar_t startTags[64]; + swprintf(startTags,64,L"",app.GetHTMLColour(eHTMLColor_White)); + finalText = startTags + finalText; + + vector paragraphs; + int lastIndex = 0; + for ( int index = finalText.find(L"\r\n", lastIndex, 2); + index != wstring::npos; + index = finalText.find(L"\r\n", lastIndex, 2) + ) + { + paragraphs.push_back( finalText.substr(lastIndex, index-lastIndex) + L" " ); + lastIndex = index + 2; + } + paragraphs.push_back( finalText.substr( lastIndex, finalText.length() - lastIndex ) ); + + // Set the text in the scene + IggyDataValue result; + + IggyDataValue *value = new IggyDataValue[paragraphs.size()+1]; + IggyStringUTF16 * stringVal = new IggyStringUTF16[paragraphs.size()]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = gs_pageToFlashMapping[(int)ePage]; + + for(unsigned int i = 0; i < paragraphs.size(); ++i) + { + stringVal[i].string = (IggyUTF16 *)paragraphs[i].c_str(); + stringVal[i].length = paragraphs[i].length(); + value[i+1].type = IGGY_DATATYPE_string_UTF16; + value[i+1].string16 = stringVal[i]; + } + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcLoadPage , 1 + paragraphs.size(), value ); + + delete [] value; + delete [] stringVal; + + updateTooltips(); + + TelemetryManager->RecordMenuShown(m_iPad, eUIScene_HowToPlay, (ETelemetry_HowToPlay_SubMenuId)ePage); + +#ifdef __PSVITA__ + ui.TouchBoxRebuild(this); +#endif +} diff --git a/Minecraft.Client/Common/UI/UIScene_HowToPlay.h b/Minecraft.Client/Common/UI/UIScene_HowToPlay.h new file mode 100644 index 00000000..cff07256 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_HowToPlay.h @@ -0,0 +1,123 @@ +#pragma once + +#include "UIScene.h" + + +class UIScene_HowToPlay : public UIScene +{ +public: + enum EHowToPlayLabelControls + { + eHowToPlay_LabelNone = -1, + eHowToPlay_LabelIInventory =0, + eHowToPlay_LabelSCInventory , + eHowToPlay_LabelSCChest , + eHowToPlay_LabelLCInventory , + eHowToPlay_LabelLCChest , + eHowToPlay_LabelCItem , + eHowToPlay_LabelCGroup , + eHowToPlay_LabelCInventory2x2 , + eHowToPlay_LabelCTItem , + eHowToPlay_LabelCTGroup , + eHowToPlay_LabelCTInventory3x3 , + eHowToPlay_LabelFFuel , + eHowToPlay_LabelFInventory , + eHowToPlay_LabelFIngredient , + eHowToPlay_LabelFChest , + eHowToPlay_LabelDText , + eHowToPlay_LabelDInventory , + eHowToPlay_LabelCreativeInventory, + eHowToPlay_LabelEEnchant, + eHowToPlay_LabelEInventory, + eHowToPlay_LabelBBrew, + eHowToPlay_LabelBInventory, + eHowToPlay_LabelAnvil_Inventory, + eHowToPlay_LabelAnvil_Cost, + eHowToPlay_LabelAnvil_ARepairAndName, + eHowToPlay_LabelTrading_Inventory, + eHowToPlay_LabelTrading_Offer2, + eHowToPlay_LabelTrading_Offer1, + eHowToPlay_LabelTrading_NeededForTrade, + eHowToPlay_LabelTrading_VillagerOffers, + eHowToPlay_NumLabels + }; + + struct SHowToPlayPageDef + { + int m_iTextStringID; // -1 if not used. + int m_iLabelStartIndex; // index of the labels if there are any for the page + int m_iLabelCount; + }; + +private: + EHowToPlayPage m_eCurrPage; + + IggyName m_funcLoadPage; + UIControl_DynamicLabel m_DynamicLabel; + UIControl_Label m_labels[ eHowToPlay_NumLabels ]; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_DynamicLabel , "DynamicHtmlText" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelCTGroup ] , "Label1_9" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelCTItem ] , "Label2_9") + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelCTInventory3x3 ] , "Label3_9" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelCGroup ] , "Label1_8" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelCItem ] , "Label2_8" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelCInventory2x2 ] , "Label3_8" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelFChest ] , "Label1_10" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelFIngredient ] , "Label2_10" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelFFuel ] , "Label3_10" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelFInventory ] , "Label4_10" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelLCChest ] , "Label1_7" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelLCInventory ] , "Label2_7" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelCreativeInventory ] , "Label1_4" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelSCChest ] , "Label1_6" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelSCInventory ] , "Label2_6" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelIInventory ] , "Label1_5" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelDText ] , "Label1_11" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelDInventory ] , "Label2_11" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelEEnchant ] , "Label1_13" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelEInventory ] , "Label2_13" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelBBrew ] , "Label1_12" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelBInventory ] , "Label2_12" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelTrading_VillagerOffers ] , "Label1_22" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelTrading_NeededForTrade ] , "Label2_22" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelTrading_Inventory ] , "Label3_22" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelTrading_Offer1 ] , "Label4_22" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelTrading_Offer2 ] , "Label5_22" ) + + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelAnvil_ARepairAndName ] , "Label1_21" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelAnvil_Cost ] , "Label2_21" ) + UI_MAP_ELEMENT( m_labels[ eHowToPlay_LabelAnvil_Inventory ] , "Label3_21" ) + + UI_MAP_NAME(m_funcLoadPage, L"LoadHowToPlayPage") + UI_END_MAP_ELEMENTS_AND_NAMES() +public: + UIScene_HowToPlay(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_HowToPlay;} + virtual void updateTooltips(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + virtual void handleReload(); + + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +private: + void StartPage( EHowToPlayPage ePage ); +}; diff --git a/Minecraft.Client/Common/UI/UIScene_HowToPlayMenu.cpp b/Minecraft.Client/Common/UI/UIScene_HowToPlayMenu.cpp new file mode 100644 index 00000000..5fc6e02b --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_HowToPlayMenu.cpp @@ -0,0 +1,205 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_HowToPlayMenu.h" + +// strings for buttons in the list +unsigned int UIScene_HowToPlayMenu::m_uiHTPButtonNameA[]= +{ + IDS_HOW_TO_PLAY_MENU_WHATSNEW, // eHTPButton_WhatsNew + IDS_HOW_TO_PLAY_MENU_BASICS, // eHTPButton_Basics, + IDS_HOW_TO_PLAY_MENU_MULTIPLAYER, // eHTPButton_Multiplayer + IDS_HOW_TO_PLAY_MENU_HUD, // eHTPButton_Hud, + IDS_HOW_TO_PLAY_MENU_CREATIVE, // eHTPButton_Creative, + IDS_HOW_TO_PLAY_MENU_INVENTORY, // eHTPButton_Inventory, + IDS_HOW_TO_PLAY_MENU_CHESTS, // eHTPButton_Chest, + IDS_HOW_TO_PLAY_MENU_CRAFTING, // eHTPButton_Crafting, + IDS_HOW_TO_PLAY_MENU_FURNACE, // eHTPButton_Furnace, + IDS_HOW_TO_PLAY_MENU_DISPENSER, // eHTPButton_Dispenser, + + IDS_HOW_TO_PLAY_MENU_BREWING, // eHTPButton_Brewing, + IDS_HOW_TO_PLAY_MENU_ENCHANTMENT, // eHTPButton_Enchantment, + IDS_HOW_TO_PLAY_MENU_ANVIL, + IDS_HOW_TO_PLAY_MENU_FARMANIMALS, // eHTPButton_Breeding, + IDS_HOW_TO_PLAY_MENU_BREEDANIMALS, // eHTPButton_Breeding, + IDS_HOW_TO_PLAY_MENU_TRADING, + + IDS_HOW_TO_PLAY_MENU_NETHERPORTAL, // eHTPButton_NetherPortal, + IDS_HOW_TO_PLAY_MENU_THEEND, // eHTPButton_TheEnd, +#ifdef _XBOX + IDS_HOW_TO_PLAY_MENU_SOCIALMEDIA, // eHTPButton_SocialMedia, + IDS_HOW_TO_PLAY_MENU_BANLIST, // eHTPButton_BanningLevels, +#endif + IDS_HOW_TO_PLAY_MENU_HOSTOPTIONS, // eHTPButton_HostOptions, +}; + +// mapping the buttons to a scene value +unsigned int UIScene_HowToPlayMenu::m_uiHTPSceneA[]= +{ + eHowToPlay_WhatsNew, + eHowToPlay_Basics, + eHowToPlay_Multiplayer, + eHowToPlay_HUD, + eHowToPlay_Creative, + eHowToPlay_Inventory, + eHowToPlay_Chest, + eHowToPlay_InventoryCrafting, + eHowToPlay_Furnace, + eHowToPlay_Dispenser, + + eHowToPlay_Brewing, + eHowToPlay_Enchantment, + eHowToPlay_Anvil, + eHowToPlay_FarmingAnimals, + eHowToPlay_Breeding, + eHowToPlay_Trading, + + eHowToPlay_NetherPortal, + eHowToPlay_TheEnd, +#ifdef _XBOX + eHowToPlay_SocialMedia, + eHowToPlay_BanList, +#endif + eHowToPlay_HostOptions, +}; + +UIScene_HowToPlayMenu::UIScene_HowToPlayMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_buttonListHowTo.init(eControl_Buttons); + + for(unsigned int i = 0; i < eHTPButton_Max; ++i) + { +#ifdef __PS3__ + // If it's the blu ray, or the first Japanese digital game, there's no What's New until the first patch, which will take this line out + if(StorageManager.GetBootTypeDisc() || (app.GetProductSKU()==e_sku_SCEJ)) + { + if(!(i==eHTPButton_WhatsNew) ) + { + m_buttonListHowTo.addItem( app.GetString(m_uiHTPButtonNameA[i]) , i);//iCount++); + } + } + else +#elif defined(__ORBIS__) || defined(_DURANGO) || defined(__PSVITA__) + // No What's New for the first PS4 and Xbox One builds + if(true) + { + if(!(i==eHTPButton_WhatsNew) ) + { + m_buttonListHowTo.addItem( app.GetString(m_uiHTPButtonNameA[i]) , i);//iCount++); + } + } + else +#endif + { + m_buttonListHowTo.addItem( app.GetString(m_uiHTPButtonNameA[i]) , i);//iCount++); + } + } +} + +wstring UIScene_HowToPlayMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"HowToPlayMenuSplit"; + } + else + { + return L"HowToPlayMenu"; + } +} + +void UIScene_HowToPlayMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_HowToPlayMenu::updateComponents() +{ + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + if(bNotInGame) + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + } + else + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,false); + + if( app.GetLocalPlayerCount() == 1 ) m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + else m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); + } +} + +void UIScene_HowToPlayMenu::handleReload() +{ + for(unsigned int i = 0; i < eHTPButton_Max; ++i) + { +#ifdef __PS3__ + // If it's the blu ray, or the first Japanese digital game, there's no What's New until the first patch, which will take this line out + if(StorageManager.GetBootTypeDisc() || (app.GetProductSKU()==e_sku_SCEJ)) + { + if(!(i==eHTPButton_WhatsNew) ) + { + m_buttonListHowTo.addItem( app.GetString(m_uiHTPButtonNameA[i]) , i); + } + } + else +#elif defined(__ORBIS__) || defined(_DURANGO) || defined(__PSVITA__) + // No What's New for the first PS4 and Xbox One builds + if(true) + { + if(!(i==eHTPButton_WhatsNew) ) + { + m_buttonListHowTo.addItem( app.GetString(m_uiHTPButtonNameA[i]) , i); + } + } + else +#endif + { + m_buttonListHowTo.addItem( app.GetString(m_uiHTPButtonNameA[i]) , i); + } + } +} + +void UIScene_HowToPlayMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + navigateBack(); + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_HowToPlayMenu::handlePress(F64 controlId, F64 childId) +{ + if( (int)controlId == eControl_Buttons) + { + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + unsigned int uiInitData; + uiInitData = ( ( 1 << 31 ) | ( m_uiHTPSceneA[(int)childId] << 16 ) | ( short )( m_iPad ) ); + ui.NavigateToScene(m_iPad, eUIScene_HowToPlay, ( void* )( uiInitData ) ); + } +} diff --git a/Minecraft.Client/Common/UI/UIScene_HowToPlayMenu.h b/Minecraft.Client/Common/UI/UIScene_HowToPlayMenu.h new file mode 100644 index 00000000..5a60cdd0 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_HowToPlayMenu.h @@ -0,0 +1,68 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_HowToPlayMenu : public UIScene +{ +private: + enum EControls + { + eControl_Buttons, + }; + + enum eHTPButton + { + eHTPButton_WhatsNew = 0, + eHTPButton_Basics, + eHTPButton_Multiplayer, + eHTPButton_Hud, + eHTPButton_Creative, + eHTPButton_Inventory, + eHTPButton_Chest, + eHTPButton_Crafting, + eHTPButton_Furnace, + eHTPButton_Dispenser, + eHTPButton_Brewing, + eHTPButton_Enchantment, + eHTPButton_Anvil, + eHTPButton_FarmingAnimals, + eHTPButton_Breeding, + eHTPButton_Trading, + eHTPButton_NetherPortal, + eHTPButton_TheEnd, +#ifdef _XBOX + eHTPButton_SocialMedia, + eHTPButton_BanningLevels, +#endif + eHTPButton_HostOptions, + eHTPButton_Max, + }; + + static unsigned int m_uiHTPButtonNameA[eHTPButton_Max]; + static unsigned int m_uiHTPSceneA[eHTPButton_Max]; + + UIControl_ButtonList m_buttonListHowTo; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttonListHowTo, "HowToList") + UI_END_MAP_ELEMENTS_AND_NAMES() + +public: + UIScene_HowToPlayMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_HowToPlayMenu;} + + virtual void updateTooltips(); + virtual void updateComponents(); + + virtual void handleReload(); +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +protected: + void handlePress(F64 controlId, F64 childId); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.cpp new file mode 100644 index 00000000..de8af0ac --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.cpp @@ -0,0 +1,104 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_InGameHostOptionsMenu.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\ClientConnection.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" + +UIScene_InGameHostOptionsMenu::UIScene_InGameHostOptionsMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_checkboxFireSpreads.init(app.GetString(IDS_FIRE_SPREADS), eControl_FireSpreads, app.GetGameHostOption(eGameHostOption_FireSpreads)!=0); + m_checkboxTNT.init(app.GetString(IDS_TNT_EXPLODES), eControl_TNT, app.GetGameHostOption(eGameHostOption_TNT)!=0); + + INetworkPlayer *localPlayer = g_NetworkManager.GetLocalPlayerByUserIndex( m_iPad ); + unsigned int privs = app.GetPlayerPrivileges(localPlayer->GetSmallId()); + if(app.GetGameHostOption(eGameHostOption_CheatsEnabled) + && Player::getPlayerGamePrivilege(privs,Player::ePlayerGamePrivilege_CanTeleport) + && g_NetworkManager.GetPlayerCount() > 1) + { + m_buttonTeleportToPlayer.init(app.GetString(IDS_TELEPORT_TO_PLAYER), eControl_TeleportToPlayer); + m_buttonTeleportToMe.init(app.GetString(IDS_TELEPORT_TO_ME), eControl_TeleportToMe); + } + else + { + removeControl(&m_buttonTeleportToPlayer, true); + removeControl(&m_buttonTeleportToMe, true); + } +} + +wstring UIScene_InGameHostOptionsMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"InGameHostOptionsSplit"; + } + else + { + return L"InGameHostOptions"; + } +} + +void UIScene_InGameHostOptionsMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_InGameHostOptionsMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + unsigned int hostOptions = app.GetGameHostOption(eGameHostOption_All); + app.SetGameHostOption(hostOptions,eGameHostOption_FireSpreads,m_checkboxFireSpreads.IsChecked()); + app.SetGameHostOption(hostOptions,eGameHostOption_TNT,m_checkboxTNT.IsChecked()); + + // Send update settings packet to server + if(hostOptions != app.GetGameHostOption(eGameHostOption_All) ) + { + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr player = pMinecraft->localplayers[m_iPad]; + if(player->connection) + { + player->connection->send( shared_ptr( new ServerSettingsChangedPacket( ServerSettingsChangedPacket::HOST_IN_GAME_SETTINGS, hostOptions) ) ); + } + } + + navigateBack(); + + handled = true; + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_InGameHostOptionsMenu::handlePress(F64 controlId, F64 childId) +{ + TeleportMenuInitData *initData = new TeleportMenuInitData(); + initData->iPad = m_iPad; + initData->teleportToPlayer = false; + if( (int)controlId == eControl_TeleportToPlayer ) + { + initData->teleportToPlayer = true; + } + ui.NavigateToScene(m_iPad,eUIScene_TeleportMenu,(void*)initData); +} diff --git a/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.h b/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.h new file mode 100644 index 00000000..24711412 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_InGameHostOptionsMenu.h @@ -0,0 +1,38 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_InGameHostOptionsMenu : public UIScene +{ +private: + enum EControls + { + eControl_FireSpreads, + eControl_TNT, + eControl_TeleportToPlayer, + eControl_TeleportToMe, + }; + + UIControl_CheckBox m_checkboxFireSpreads, m_checkboxTNT; + UIControl_Button m_buttonTeleportToPlayer, m_buttonTeleportToMe; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_checkboxFireSpreads, "CheckboxFireSpreads") + UI_MAP_ELEMENT( m_checkboxTNT, "CheckboxTNT") + UI_MAP_ELEMENT( m_buttonTeleportToPlayer, "TeleportToPlayer") + UI_MAP_ELEMENT( m_buttonTeleportToMe, "TeleportPlayerToMe") + UI_END_MAP_ELEMENTS_AND_NAMES() +public: + UIScene_InGameHostOptionsMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_InGameHostOptionsMenu;} + virtual void updateTooltips(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + virtual void handlePress(F64 controlId, F64 childId); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.cpp b/Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.cpp new file mode 100644 index 00000000..5c3f73f6 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.cpp @@ -0,0 +1,605 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_InGameInfoMenu.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\ClientConnection.h" + +UIScene_InGameInfoMenu::UIScene_InGameInfoMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_buttonGameOptions.init(app.GetString(IDS_HOST_OPTIONS),eControl_GameOptions); + m_labelTitle.init(app.GetString(IDS_PLAYERS_INVITE)); + m_playerList.init(eControl_GamePlayers); + + for(unsigned int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++i) + { + m_playerNames[i] = L""; + } + + DWORD playerCount = g_NetworkManager.GetPlayerCount(); + + m_playersCount = 0; + for(DWORD i = 0; i < playerCount; ++i) + { + INetworkPlayer *player = g_NetworkManager.GetPlayerByIndex( i ); + + if( player != NULL ) + { + m_players[i] = player->GetSmallId(); + ++m_playersCount; + + wstring playerName = L""; +#ifndef _CONTENT_PACKAGE + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<GetDisplayName(); + } + + int voiceStatus = 0; + if(player != NULL && player->HasVoice() ) + { + if( player->IsMutedByLocalUser(m_iPad) ) + { + // Muted image + voiceStatus = 3; + } + else if( player->IsTalking() ) + { + // Talking image + voiceStatus = 2; + } + else + { + // Not talking image + voiceStatus = 1; + } + } + + m_playersVoiceState[i] = voiceStatus; + m_playersColourState[i] = app.GetPlayerColour( m_players[i] ); + m_playerNames[i] = playerName; + m_playerList.addItem( playerName, app.GetPlayerColour( m_players[i] ), voiceStatus); + } + } + + g_NetworkManager.RegisterPlayerChangedCallback(m_iPad, &UIScene_InGameInfoMenu::OnPlayerChanged, this); + + INetworkPlayer *thisPlayer = g_NetworkManager.GetLocalPlayerByUserIndex( m_iPad ); + m_isHostPlayer = false; + if(thisPlayer != NULL) m_isHostPlayer = thisPlayer->IsHost() == TRUE; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr localPlayer = pMinecraft->localplayers[m_iPad]; + if(!m_isHostPlayer && !localPlayer->isModerator() ) + { + removeControl( &m_buttonGameOptions, false ); + } + + updateTooltips(); + +#if TO_BE_IMPLEMENTED + SetTimer( TOOLTIP_TIMERID , INGAME_INFO_TOOLTIP_TIMER ); +#endif + + // get rid of the quadrant display if it's on + ui.HidePressStart(); + +#if TO_BE_IMPLEMENTED + SetTimer(IGNORE_KEYPRESS_TIMERID,IGNORE_KEYPRESS_TIME); +#endif +} + +wstring UIScene_InGameInfoMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"InGameInfoMenuSplit"; + } + else + { + return L"InGameInfoMenu"; + } +} + +void UIScene_InGameInfoMenu::updateTooltips() +{ + int keyX = IDS_TOOLTIPS_INVITE_FRIENDS; + int ikeyY = -1; + + XPARTY_USER_LIST partyList; + if((XPartyGetUserList( &partyList ) != XPARTY_E_NOT_IN_PARTY ) && (partyList.dwUserCount>1)) + { + keyX = IDS_TOOLTIPS_INVITE_PARTY; + } + + if(g_NetworkManager.IsLocalGame()) keyX = -1; +#ifdef __PSVITA__ + if(CGameNetworkManager::usingAdhocMode()) keyX = -1; +#endif + + + INetworkPlayer *selectedPlayer = g_NetworkManager.GetPlayerBySmallId( m_players[ m_playerList.getCurrentSelection() ] ); + + int keyA = -1; + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr localPlayer = pMinecraft->localplayers[m_iPad]; + + bool isOp = m_isHostPlayer || localPlayer->isModerator(); + bool cheats = app.GetGameHostOption(eGameHostOption_CheatsEnabled) != 0; + bool trust = app.GetGameHostOption(eGameHostOption_TrustPlayers) != 0; + + if( isOp ) + { + if(m_buttonGameOptions.hasFocus()) + { + keyA = IDS_TOOLTIPS_SELECT; + } + else if( selectedPlayer != NULL) + { + bool editingHost = selectedPlayer->IsHost(); + if( (cheats && (m_isHostPlayer || !editingHost ) ) || (!trust && (m_isHostPlayer || !editingHost)) +#if (!defined(_CONTENT_PACKAGE) && !defined(_FINAL_BUILD) && defined(_DEBUG_MENUS_ENABLED)) + || (m_isHostPlayer && editingHost) +#endif + ) + { + keyA = IDS_TOOLTIPS_PRIVILEGES; + } + else if(selectedPlayer->IsLocal() != TRUE && selectedPlayer->IsSameSystem(g_NetworkManager.GetHostPlayer()) != TRUE) + { + // Only ops will hit this, can kick anyone not local and not local to the host + keyA = IDS_TOOLTIPS_KICK; + } + } + } + +#if defined(__PS3__) || defined(__ORBIS__) + if(m_iPad == ProfileManager.GetPrimaryPad() ) ikeyY = IDS_TOOLTIPS_GAME_INVITES; +#else + if(!m_buttonGameOptions.hasFocus()) + { + // if the player is me, then view gamer profile + if(selectedPlayer != NULL && selectedPlayer->IsLocal() && selectedPlayer->GetUserIndex()==m_iPad) + { + ikeyY = IDS_TOOLTIPS_VIEW_GAMERPROFILE; + } + else + { + ikeyY = IDS_TOOLTIPS_VIEW_GAMERCARD; + } + } +#endif + ui.SetTooltips( m_iPad, keyA,IDS_TOOLTIPS_BACK,keyX,ikeyY); +} + +void UIScene_InGameInfoMenu::handleDestroy() +{ + g_NetworkManager.UnRegisterPlayerChangedCallback(m_iPad, &UIScene_InGameInfoMenu::OnPlayerChanged, this); + + m_parentLayer->removeComponent(eUIComponent_MenuBackground); +} + +void UIScene_InGameInfoMenu::handleGainFocus(bool navBack) +{ + UIScene::handleGainFocus(navBack); + if( navBack ) g_NetworkManager.RegisterPlayerChangedCallback(m_iPad, &UIScene_InGameInfoMenu::OnPlayerChanged, this); +} + +void UIScene_InGameInfoMenu::handleReload() +{ + DWORD playerCount = g_NetworkManager.GetPlayerCount(); + + m_playersCount = 0; + for(DWORD i = 0; i < playerCount; ++i) + { + INetworkPlayer *player = g_NetworkManager.GetPlayerByIndex( i ); + + if( player != NULL ) + { + m_players[i] = player->GetSmallId(); + ++m_playersCount; + + wstring playerName = L""; +#ifndef _CONTENT_PACKAGE + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<GetDisplayName(); + } + + int voiceStatus = 0; + if(player != NULL && player->HasVoice() ) + { + if( player->IsMutedByLocalUser(m_iPad) ) + { + // Muted image + voiceStatus = 3; + } + else if( player->IsTalking() ) + { + // Talking image + voiceStatus = 2; + } + else + { + // Not talking image + voiceStatus = 1; + } + } + + m_playersVoiceState[i] = voiceStatus; + m_playersColourState[i] = app.GetPlayerColour( m_players[i] ); + m_playerNames[i] = playerName; + m_playerList.addItem( playerName, app.GetPlayerColour( m_players[i] ), voiceStatus); + } + } + + INetworkPlayer *thisPlayer = g_NetworkManager.GetLocalPlayerByUserIndex( m_iPad ); + m_isHostPlayer = false; + if(thisPlayer != NULL) m_isHostPlayer = thisPlayer->IsHost() == TRUE; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr localPlayer = pMinecraft->localplayers[m_iPad]; + if(!m_isHostPlayer && !localPlayer->isModerator() ) + { + removeControl( &m_buttonGameOptions, false ); + } + + updateTooltips(); + + if(controlHasFocus(eControl_GamePlayers)) + { + m_playerList.setCurrentSelection(getControlChildFocus()); + } +} + +void UIScene_InGameInfoMenu::tick() +{ + UIScene::tick(); + + for(DWORD i = 0; i < m_playersCount; ++i) + { + INetworkPlayer *player = g_NetworkManager.GetPlayerByIndex( i ); + + if( player != NULL ) + { + m_players[i] = player->GetSmallId(); + int voiceStatus = 0; + if(player != NULL && player->HasVoice() ) + { + if( player->IsMutedByLocalUser(m_iPad) ) + { + // Muted image + voiceStatus = 3; + } + else if( player->IsTalking() ) + { + // Talking image + voiceStatus = 2; + } + else + { + // Not talking image + voiceStatus = 1; + } + } + + if(voiceStatus != m_playersVoiceState[i]) + { + m_playersVoiceState[i] = voiceStatus; + m_playerList.setVOIPIcon( i, voiceStatus ); + } + + short icon = app.GetPlayerColour( m_players[i] ); + + if(icon != m_playersColourState[i]) + { + m_playersColourState[i] = icon; + m_playerList.setPlayerIcon( i, (int)app.GetPlayerColour( m_players[i] ) ); + } + + wstring playerName = L""; +#ifndef _CONTENT_PACKAGE + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<GetDisplayName(); + } + if(playerName.compare( m_playerNames[i] ) != 0 ) + { + m_playerList.setButtonLabel(i, playerName); + m_playerNames[i] = playerName; + } + } + } +} + +void UIScene_InGameInfoMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed && !repeat) + { + ui.PlayUISFX(eSFX_Back); + navigateBack(); + } + break; + case ACTION_MENU_Y: +#if defined(__PS3__) || defined(__ORBIS__) + if(pressed && iPad == ProfileManager.GetPrimaryPad()) + { +#ifdef __PS3__ + // are we offline? + if(!ProfileManager.IsSignedInLive(iPad)) + { + // get them to sign in to online + UINT uiIDA[2]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_InGameInfoMenu::MustSignInReturnedPSN,this, app.GetStringTable()); + } + else +#endif + { +#ifdef __ORBIS__ + SQRNetworkManager_Orbis::RecvInviteGUI(); +#else // __PS3__ + int ret = sceNpBasicRecvMessageCustom(SCE_NP_BASIC_MESSAGE_MAIN_TYPE_INVITE, SCE_NP_BASIC_RECV_MESSAGE_OPTIONS_INCLUDE_BOOTABLE, SYS_MEMORY_CONTAINER_ID_INVALID); + app.DebugPrintf("sceNpBasicRecvMessageCustom return %d ( %08x )\n", ret, ret); +#endif + } + } +#else + + + if(pressed && m_playerList.hasFocus() && (m_playerList.getItemCount() > 0) && (m_playerList.getCurrentSelection() < m_playersCount) ) + { + INetworkPlayer *player = g_NetworkManager.GetPlayerBySmallId(m_players[m_playerList.getCurrentSelection()]); + if( player != NULL ) + { + PlayerUID uid = player->GetUID(); + if( uid != INVALID_XUID ) + { +#ifdef __PSVITA__ + PSVITA_STUBBED; +#else + ProfileManager.ShowProfileCard(iPad,uid); +#endif + } + } + } + +#endif + break; + case ACTION_MENU_X: + + if(pressed && !repeat && !g_NetworkManager.IsLocalGame() ) + { +#ifdef __PSVITA__ + if(CGameNetworkManager::usingAdhocMode() == false) + g_NetworkManager.SendInviteGUI(iPad); +#else + g_NetworkManager.SendInviteGUI(iPad); +#endif + } + + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_InGameInfoMenu::handlePress(F64 controlId, F64 childId) +{ + app.DebugPrintf("Pressed = %d, %d\n", (int)controlId, (int)childId); + switch((int)controlId) + { + case eControl_GameOptions: + ui.NavigateToScene(m_iPad,eUIScene_InGameHostOptionsMenu); + break; + case eControl_GamePlayers: + int currentSelection = (int)childId; + INetworkPlayer *selectedPlayer = g_NetworkManager.GetPlayerBySmallId( m_players[ currentSelection ] ); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr localPlayer = pMinecraft->localplayers[m_iPad]; + + bool isOp = m_isHostPlayer || localPlayer->isModerator(); + bool cheats = app.GetGameHostOption(eGameHostOption_CheatsEnabled) != 0; + bool trust = app.GetGameHostOption(eGameHostOption_TrustPlayers) != 0; + + if( isOp && selectedPlayer != NULL) + { + bool editingHost = selectedPlayer->IsHost(); + if( (cheats && (m_isHostPlayer || !editingHost ) ) || (!trust && (m_isHostPlayer || !editingHost)) +#if (!defined(_CONTENT_PACKAGE) && !defined(_FINAL_BUILD) && defined(_DEBUG_MENUS_ENABLED)) + || (m_isHostPlayer && editingHost) +#endif + ) + { + InGamePlayerOptionsInitData *pInitData = new InGamePlayerOptionsInitData(); + pInitData->iPad = m_iPad; + pInitData->networkSmallId = m_players[ currentSelection ]; + pInitData->playerPrivileges = app.GetPlayerPrivileges(m_players[ currentSelection ] ); + ui.NavigateToScene(m_iPad,eUIScene_InGamePlayerOptionsMenu,pInitData); + } + else if(selectedPlayer->IsLocal() != TRUE && selectedPlayer->IsSameSystem(g_NetworkManager.GetHostPlayer()) != TRUE) + { + // Only ops will hit this, can kick anyone not local and not local to the host + BYTE *smallId = new BYTE(); + *smallId = m_players[currentSelection]; + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + ui.RequestMessageBox(IDS_UNLOCK_KICK_PLAYER_TITLE, IDS_UNLOCK_KICK_PLAYER, uiIDA, 2, m_iPad,&UIScene_InGameInfoMenu::KickPlayerReturned,smallId,app.GetStringTable(),NULL,0,false); + } + } + break; + } +} + +void UIScene_InGameInfoMenu::handleFocusChange(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_GamePlayers: + m_playerList.updateChildFocus( (int) childId ); + }; + updateTooltips(); +} + +void UIScene_InGameInfoMenu::OnPlayerChanged(void *callbackParam, INetworkPlayer *pPlayer, bool leaving) +{ + UIScene_InGameInfoMenu *scene = (UIScene_InGameInfoMenu *)callbackParam; + bool playerFound = false; + int foundIndex = 0; + for(int i = 0; i < scene->m_playersCount; ++i) + { + if(!playerFound && scene->m_players[i] == pPlayer->GetSmallId() ) + { + if( scene->m_playerList.getCurrentSelection() == scene->m_playerList.getItemCount() - 1 ) + { + scene->m_playerList.setCurrentSelection( scene->m_playerList.getItemCount() - 2 ); + } + // Player removed + playerFound = true; + foundIndex = i; + } + } + + if( playerFound ) + { + --scene->m_playersCount; + scene->m_playersVoiceState[scene->m_playersCount] = 0; + scene->m_playersColourState[scene->m_playersCount] = 0; + scene->m_playerNames[scene->m_playersCount] = L""; + scene->m_playerList.removeItem(scene->m_playersCount); + } + + if( !playerFound ) + { + // Player added + scene->m_players[scene->m_playersCount] = pPlayer->GetSmallId(); + ++scene->m_playersCount; + + wstring playerName = L""; +#ifndef _CONTENT_PACKAGE + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<GetDisplayName(); + } + + int voiceStatus = 0; + if(pPlayer != NULL && pPlayer->HasVoice() ) + { + if( pPlayer->IsMutedByLocalUser(scene->m_iPad) ) + { + // Muted image + voiceStatus = 3; + } + else if( pPlayer->IsTalking() ) + { + // Talking image + voiceStatus = 2; + } + else + { + // Not talking image + voiceStatus = 1; + } + } + + scene->m_playerList.addItem( playerName, app.GetPlayerColour( scene->m_players[scene->m_playersCount - 1] ), voiceStatus); + } +} + +int UIScene_InGameInfoMenu::KickPlayerReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + BYTE smallId = *(BYTE *)pParam; + delete pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr localPlayer = pMinecraft->localplayers[iPad]; + if(localPlayer->connection) + { + localPlayer->connection->send( shared_ptr( new KickPlayerPacket(smallId) ) ); + } + } + + return 0; +} + +#if defined __PS3__ || defined __PSVITA__ +int UIScene_InGameInfoMenu::MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_InGameInfoMenu* pClass = (UIScene_InGameInfoMenu*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { +#ifdef __PS3__ + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_InGameInfoMenu::ViewInvites_SignInReturned, pClass); +#else // __PSVITA__ + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_InGameInfoMenu::ViewInvites_SignInReturned, pClass); +#endif + } + + return 0; +} + +int UIScene_InGameInfoMenu::ViewInvites_SignInReturned(void *pParam,bool bContinue, int iPad) +{ + if(bContinue==true) + { + // Check if we're signed in to LIVE + if(ProfileManager.IsSignedInLive(iPad)) + { +#ifdef __ORBIS__ + SQRNetworkManager_Orbis::RecvInviteGUI(); +#elif defined(__PS3__) + int ret = sceNpBasicRecvMessageCustom(SCE_NP_BASIC_MESSAGE_MAIN_TYPE_INVITE, SCE_NP_BASIC_RECV_MESSAGE_OPTIONS_INCLUDE_BOOTABLE, SYS_MEMORY_CONTAINER_ID_INVALID); + app.DebugPrintf("sceNpBasicRecvMessageCustom return %d ( %08x )\n", ret, ret); +#else // __PSVITA__ + PSVITA_STUBBED; +#endif + } + } + return 0; +} +#endif diff --git a/Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.h b/Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.h new file mode 100644 index 00000000..94966fa3 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_InGameInfoMenu.h @@ -0,0 +1,62 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_InGameInfoMenu : public UIScene +{ +private: + enum EControls + { + eControl_GameOptions, + eControl_GamePlayers, + }; + + bool m_isHostPlayer; + int m_playersCount; + BYTE m_players[MINECRAFT_NET_MAX_PLAYERS]; // An array of QNet small-id's + char m_playersVoiceState[MINECRAFT_NET_MAX_PLAYERS]; + short m_playersColourState[MINECRAFT_NET_MAX_PLAYERS]; + wstring m_playerNames[MINECRAFT_NET_MAX_PLAYERS]; + + UIControl_Button m_buttonGameOptions; + UIControl_PlayerList m_playerList; + UIControl_Label m_labelTitle; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttonGameOptions, "GameOptions") + UI_MAP_ELEMENT( m_playerList, "GamePlayers") + UI_MAP_ELEMENT( m_labelTitle, "Title") + UI_END_MAP_ELEMENTS_AND_NAMES() +public: + UIScene_InGameInfoMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_InGameInfoMenu;} + virtual void updateTooltips(); + + virtual void handleReload(); + + virtual void tick(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +protected: + virtual void handleGainFocus(bool navBack); + void handlePress(F64 controlId, F64 childId); + virtual void handleDestroy(); + virtual void handleFocusChange(F64 controlId, F64 childId); + +public: + static int KickPlayerReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static void OnPlayerChanged(void *callbackParam, INetworkPlayer *pPlayer, bool leaving); + +private: +#if defined(__PS3__) || defined (__PSVITA__) || defined(__ORBIS__) + static int MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ViewInvites_SignInReturned(void *pParam,bool bContinue, int iPad); +#endif +}; diff --git a/Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.cpp new file mode 100644 index 00000000..6eb22b09 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.cpp @@ -0,0 +1,438 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_InGamePlayerOptionsMenu.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\ClientConnection.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" + + +#define CHECKBOXES_TIMER_ID 0 +#define CHECKBOXES_TIMER_TIME 100 + +UIScene_InGamePlayerOptionsMenu::UIScene_InGamePlayerOptionsMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_bShouldNavBack = false; + + InGamePlayerOptionsInitData *initData = (InGamePlayerOptionsInitData *)_initData; + m_networkSmallId = initData->networkSmallId; + m_playerPrivileges = initData->playerPrivileges; + + INetworkPlayer *localPlayer = g_NetworkManager.GetLocalPlayerByUserIndex( m_iPad ); + INetworkPlayer *editingPlayer = g_NetworkManager.GetPlayerBySmallId(m_networkSmallId); + + if(editingPlayer != NULL) + { + m_labelGamertag.init(editingPlayer->GetDisplayName()); + } + + bool trustPlayers = app.GetGameHostOption(eGameHostOption_TrustPlayers) != 0; + bool cheats = app.GetGameHostOption(eGameHostOption_CheatsEnabled) != 0; + m_editingSelf = (localPlayer != NULL && localPlayer == editingPlayer); + + if( m_editingSelf || trustPlayers || editingPlayer->IsHost()) + { + removeControl( &m_checkboxes[eControl_BuildAndMine], true ); + removeControl( &m_checkboxes[eControl_UseDoorsAndSwitches], true ); + removeControl( &m_checkboxes[eControl_UseContainers], true ); + removeControl( &m_checkboxes[eControl_AttackPlayers], true ); + removeControl( &m_checkboxes[eControl_AttackAnimals], true ); + } + else + { + bool checked = (Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CannotMine)==0 && Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CannotBuild)==0); + m_checkboxes[eControl_BuildAndMine].init( app.GetString(IDS_CAN_BUILD_AND_MINE), eControl_BuildAndMine, checked); + + checked = (Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanUseDoorsAndSwitches)!=0); + m_checkboxes[eControl_UseDoorsAndSwitches].init( app.GetString(IDS_CAN_USE_DOORS_AND_SWITCHES), eControl_UseDoorsAndSwitches, checked); + + checked = (Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanUseContainers)!=0); + m_checkboxes[eControl_UseContainers].init( app.GetString(IDS_CAN_OPEN_CONTAINERS), eControl_UseContainers, checked); + + checked = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CannotAttackPlayers)==0; + m_checkboxes[eControl_AttackPlayers].init( app.GetString(IDS_CAN_ATTACK_PLAYERS), eControl_AttackPlayers, checked); + + checked = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CannotAttackAnimals)==0; + m_checkboxes[eControl_AttackAnimals].init( app.GetString(IDS_CAN_ATTACK_ANIMALS), eControl_AttackAnimals, checked); + } + + if(m_editingSelf) + { +#if (defined(_CONTENT_PACKAGE) || defined(_FINAL_BUILD) && !defined(_DEBUG_MENUS_ENABLED)) + removeControl( &m_checkboxes[eControl_Op], true ); +#else + m_checkboxes[eControl_Op].init(L"DEBUG: Creative",eControl_Op,Player::getPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CreativeMode)); +#endif + + removeControl( &m_buttonKick, true ); + removeControl( &m_checkboxes[eControl_CheatTeleport], true ); + + if(cheats) + { + bool canBeInvisible = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanToggleInvisible) != 0; + m_checkboxes[eControl_HostInvisible].SetEnable(canBeInvisible); + bool checked = canBeInvisible && (Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_Invisible)!=0 && Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_Invulnerable)!=0); + m_checkboxes[eControl_HostInvisible].init( app.GetString(IDS_INVISIBLE), eControl_HostInvisible, checked); + + bool inCreativeMode = Player::getPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CreativeMode) != 0; + if(inCreativeMode) + { + removeControl( &m_checkboxes[eControl_HostFly], true ); + removeControl( &m_checkboxes[eControl_HostHunger], true ); + } + else + { + bool canFly = Player::getPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanToggleFly); + bool canChangeHunger = Player::getPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanToggleClassicHunger); + + m_checkboxes[eControl_HostFly].SetEnable(canFly); + checked = canFly && Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanFly)!=0; + m_checkboxes[eControl_HostFly].init( app.GetString(IDS_CAN_FLY), eControl_HostFly, checked); + + m_checkboxes[eControl_HostHunger].SetEnable(canChangeHunger); + checked = canChangeHunger && Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_ClassicHunger)!=0; + m_checkboxes[eControl_HostHunger].init( app.GetString(IDS_DISABLE_EXHAUSTION), eControl_HostHunger, checked); + } + } + else + { + removeControl( &m_checkboxes[eControl_HostInvisible], true ); + removeControl( &m_checkboxes[eControl_HostFly], true ); + removeControl( &m_checkboxes[eControl_HostHunger], true ); + } + } + else + { + if(localPlayer->IsHost()) + { + // Only host can make people moderators, or enable teleporting for them + m_checkboxes[eControl_Op].init( app.GetString(IDS_MODERATOR), eControl_Op, Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_Op)!=0); + } + else + { + removeControl( &m_checkboxes[eControl_Op], true ); + } + + /*if(localPlayer->IsHost() && cheats ) + { + m_checkboxes[eControl_HostInvisible].SetEnable(true); + bool checked = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanToggleInvisible)!=0; + m_checkboxes[eControl_HostInvisible].init( app.GetString(IDS_CAN_INVISIBLE), eControl_HostInvisible, checked); + + m_checkboxes[eControl_HostFly].SetEnable(true); + checked = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanToggleFly)!=0; + m_checkboxes[eControl_HostFly].init( app.GetString(IDS_CAN_FLY), eControl_HostFly, checked); + + m_checkboxes[eControl_HostHunger].SetEnable(true); + checked = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanToggleClassicHunger)!=0; + m_checkboxes[eControl_HostHunger].init( app.GetString(IDS_CAN_DISABLE_EXHAUSTION), eControl_HostHunger, checked); + + checked = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanTeleport)!=0; + m_checkboxes[eControl_CheatTeleport].init(app.GetString(IDS_ENABLE_TELEPORT),eControl_CheatTeleport,checked); + } + else + { + removeControl( &m_checkboxes[eControl_HostInvisible], true ); + removeControl( &m_checkboxes[eControl_HostFly], true ); + removeControl( &m_checkboxes[eControl_HostHunger], true ); + removeControl( &m_checkboxes[eControl_CheatTeleport], true ); + }*/ + + if(localPlayer->IsHost() && cheats ) + { + m_checkboxes[eControl_HostInvisible].SetEnable(true); + bool checked = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanToggleInvisible)!=0; + m_checkboxes[eControl_HostInvisible].init( app.GetString(IDS_CAN_INVISIBLE), eControl_HostInvisible, checked); + + + bool inCreativeMode = Player::getPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CreativeMode) != 0; + if(inCreativeMode) + { + removeControl( &m_checkboxes[eControl_HostFly], true ); + removeControl( &m_checkboxes[eControl_HostHunger], true ); + } + else + { + m_checkboxes[eControl_HostFly].SetEnable(true); + checked = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanToggleFly)!=0; + m_checkboxes[eControl_HostFly].init( app.GetString(IDS_CAN_FLY), eControl_HostFly, checked); + + m_checkboxes[eControl_HostHunger].SetEnable(true); + checked = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanToggleClassicHunger)!=0; + m_checkboxes[eControl_HostHunger].init( app.GetString(IDS_CAN_DISABLE_EXHAUSTION), eControl_HostHunger, checked); + } + + checked = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanTeleport)!=0; + m_checkboxes[eControl_CheatTeleport].init(app.GetString(IDS_ENABLE_TELEPORT),eControl_CheatTeleport,checked); + } + else + { + removeControl( &m_checkboxes[eControl_HostInvisible], true ); + removeControl( &m_checkboxes[eControl_HostFly], true ); + removeControl( &m_checkboxes[eControl_HostHunger], true ); + removeControl( &m_checkboxes[eControl_CheatTeleport], true ); + } + + + // Can only kick people if they are not local, and not local to the host + if(editingPlayer->IsLocal() != TRUE && editingPlayer->IsSameSystem(g_NetworkManager.GetHostPlayer()) != TRUE) + { + m_buttonKick.init( app.GetString(IDS_KICK_PLAYER), eControl_Kick); + } + else + { + removeControl( &m_buttonKick, true ); + } + } + + short colourIndex = app.GetPlayerColour( m_networkSmallId ); + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = colourIndex; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetPlayerIcon , 1 , value ); + +#if TO_BE_IMPLEMENTED + if(app.GetLocalPlayerCount()>1) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + } +#endif + + m_bModeratorState = m_checkboxes[eControl_Op].IsChecked(); + + resetCheatCheckboxes(); + + addTimer(CHECKBOXES_TIMER_ID,CHECKBOXES_TIMER_TIME); + + g_NetworkManager.RegisterPlayerChangedCallback(m_iPad, &UIScene_InGamePlayerOptionsMenu::OnPlayerChanged, this); + +#ifdef __PSVITA__ + ui.TouchBoxRebuild(this); +#endif +} + +wstring UIScene_InGamePlayerOptionsMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"InGamePlayerOptionsSplit"; + } + else + { + return L"InGamePlayerOptions"; + } +} + +void UIScene_InGamePlayerOptionsMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_InGamePlayerOptionsMenu::tick() +{ + UIScene::tick(); + + if(m_bShouldNavBack) + { + m_bShouldNavBack = false; + ui.NavigateBack(m_iPad); + } +} + +void UIScene_InGamePlayerOptionsMenu::handleDestroy() +{ + g_NetworkManager.UnRegisterPlayerChangedCallback(m_iPad, &UIScene_InGamePlayerOptionsMenu::OnPlayerChanged, this); +} + +void UIScene_InGamePlayerOptionsMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + bool trustPlayers = app.GetGameHostOption(eGameHostOption_TrustPlayers) != 0; + bool cheats = app.GetGameHostOption(eGameHostOption_CheatsEnabled) != 0; + if(m_editingSelf) + { +#if (defined(_CONTENT_PACKAGE) || defined(_FINAL_BUILD) && !defined(_DEBUG_MENUS_ENABLED)) +#else + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CreativeMode,m_checkboxes[eControl_Op].IsChecked()); +#endif + if(cheats) + { + bool canBeInvisible = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanToggleInvisible) != 0; + if(canBeInvisible) Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_Invisible,m_checkboxes[eControl_HostInvisible].IsChecked()); + if(canBeInvisible) Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_Invulnerable,m_checkboxes[eControl_HostInvisible].IsChecked()); + + bool inCreativeMode = Player::getPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CreativeMode) != 0; + if(!inCreativeMode) + { + bool canFly = Player::getPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanToggleFly); + bool canChangeHunger = Player::getPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanToggleClassicHunger); + + if(canFly) Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanFly,m_checkboxes[eControl_HostFly].IsChecked()); + if(canChangeHunger) Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_ClassicHunger,m_checkboxes[eControl_HostHunger].IsChecked()); + } + } + } + else + { + INetworkPlayer *editingPlayer = g_NetworkManager.GetPlayerBySmallId(m_networkSmallId); + if(!trustPlayers && (editingPlayer != NULL && !editingPlayer->IsHost() ) ) + { + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CannotMine,!m_checkboxes[eControl_BuildAndMine].IsChecked()); + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CannotBuild,!m_checkboxes[eControl_BuildAndMine].IsChecked()); + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CannotAttackPlayers,!m_checkboxes[eControl_AttackPlayers].IsChecked()); + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CannotAttackAnimals, !m_checkboxes[eControl_AttackAnimals].IsChecked()); + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanUseDoorsAndSwitches, m_checkboxes[eControl_UseDoorsAndSwitches].IsChecked()); + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanUseContainers, m_checkboxes[eControl_UseContainers].IsChecked()); + } + + INetworkPlayer *localPlayer = g_NetworkManager.GetLocalPlayerByUserIndex( m_iPad ); + + if(localPlayer->IsHost()) + { + if(cheats) + { + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanToggleInvisible,m_checkboxes[eControl_HostInvisible].IsChecked()); + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanToggleFly,m_checkboxes[eControl_HostFly].IsChecked()); + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanToggleClassicHunger,m_checkboxes[eControl_HostHunger].IsChecked()); + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanTeleport,m_checkboxes[eControl_CheatTeleport].IsChecked()); + } + + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_Op,m_checkboxes[eControl_Op].IsChecked()); + } + } + unsigned int originalPrivileges = app.GetPlayerPrivileges(m_networkSmallId); + if(originalPrivileges != m_playerPrivileges) + { + // Send update settings packet to server + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr player = pMinecraft->localplayers[m_iPad]; + if(player->connection) + { + player->connection->send( shared_ptr( new PlayerInfoPacket( m_networkSmallId, -1, m_playerPrivileges) ) ); + } + } + navigateBack(); + + handled = true; + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_InGamePlayerOptionsMenu::handlePress(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_Kick: + { + BYTE *smallId = new BYTE(); + *smallId = m_networkSmallId; + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + ui.RequestMessageBox(IDS_UNLOCK_KICK_PLAYER_TITLE, IDS_UNLOCK_KICK_PLAYER, uiIDA, 2, m_iPad,&UIScene_InGamePlayerOptionsMenu::KickPlayerReturned,smallId,app.GetStringTable(),NULL,0,false); + } + break; + }; +} + +int UIScene_InGamePlayerOptionsMenu::KickPlayerReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + BYTE smallId = *(BYTE *)pParam; + delete pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr localPlayer = pMinecraft->localplayers[iPad]; + if(localPlayer->connection) + { + localPlayer->connection->send( shared_ptr( new KickPlayerPacket(smallId) ) ); + } + + // Fix for #61494 - [CRASH]: TU7: Code: Multiplayer: Title may crash while kicking a player from an online game. + // We cannot do a navigate back here is this actually occurs on a thread other than the main thread. On rare occasions this can clash + // with the XUI render and causes a crash. The OnPlayerChanged event should perform the navigate back on the main thread + //app.NavigateBack(iPad); + } + + return 0; +} + +void UIScene_InGamePlayerOptionsMenu::OnPlayerChanged(void *callbackParam, INetworkPlayer *pPlayer, bool leaving) +{ + app.DebugPrintf("UIScene_InGamePlayerOptionsMenu::OnPlayerChanged"); + UIScene_InGamePlayerOptionsMenu *scene = (UIScene_InGamePlayerOptionsMenu *)callbackParam; + + UIScene_InGameInfoMenu *infoScene = (UIScene_InGameInfoMenu *)scene->getBackScene(); + if(infoScene != NULL) UIScene_InGameInfoMenu::OnPlayerChanged(infoScene,pPlayer,leaving); + + if(leaving && pPlayer != NULL && pPlayer->GetSmallId() == scene->m_networkSmallId) + { + scene->m_bShouldNavBack = true; + } +} + +void UIScene_InGamePlayerOptionsMenu::resetCheatCheckboxes() +{ + bool isModerator = m_checkboxes[eControl_Op].IsChecked(); + //bool cheatsEnabled = app.GetGameHostOption(eGameHostOption_CheatsEnabled) != 0; + + if (!m_editingSelf) + { + m_checkboxes[eControl_HostInvisible].SetEnable(isModerator); + m_checkboxes[eControl_HostFly].SetEnable(isModerator); + m_checkboxes[eControl_HostHunger].SetEnable(isModerator); + m_checkboxes[eControl_CheatTeleport].SetEnable(isModerator); + } +} + +void UIScene_InGamePlayerOptionsMenu::handleCheckboxToggled(F64 controlId, bool selected) +{ + switch((int)controlId) + { + case eControl_Op: + // flag that the moderator state has changed + //resetCheatCheckboxes(); + break; + } +} + +void UIScene_InGamePlayerOptionsMenu::handleTimerComplete(int id) +{ + switch(id) + { + case CHECKBOXES_TIMER_ID: + { + bool bIsModerator = m_checkboxes[eControl_Op].IsChecked(); + if(m_bModeratorState!=bIsModerator) + { + m_bModeratorState=bIsModerator; + resetCheatCheckboxes(); + } + } + break; + } +} diff --git a/Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.h b/Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.h new file mode 100644 index 00000000..78e30f6e --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_InGamePlayerOptionsMenu.h @@ -0,0 +1,90 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_InGamePlayerOptionsMenu : public UIScene +{ +private: + enum EControls + { + // Checkboxes + eControl_BuildAndMine, + eControl_UseDoorsAndSwitches, + eControl_UseContainers, + eControl_AttackPlayers, + eControl_AttackAnimals, + eControl_Op, + eControl_CheatTeleport, + eControl_HostFly, + eControl_HostHunger, + eControl_HostInvisible, + + eControl_CHECKBOXES_COUNT, + + // Others + eControl_Kick = eControl_CHECKBOXES_COUNT, + }; + + bool m_bShouldNavBack; + bool m_editingSelf; + BYTE m_networkSmallId; + unsigned int m_playerPrivileges; + + UIControl_Label m_labelGamertag; + UIControl_CheckBox m_checkboxes[eControl_CHECKBOXES_COUNT]; + UIControl_Button m_buttonKick; + IggyName m_funcSetPlayerIcon; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_checkboxes[eControl_BuildAndMine], "CheckboxBuildAndMine") + UI_MAP_ELEMENT( m_checkboxes[eControl_UseDoorsAndSwitches], "CheckboxUseDoorsAndSwitches") + UI_MAP_ELEMENT( m_checkboxes[eControl_UseContainers], "CheckboxUseContainers") + UI_MAP_ELEMENT( m_checkboxes[eControl_AttackPlayers], "CheckboxAttackPlayers") + UI_MAP_ELEMENT( m_checkboxes[eControl_AttackAnimals], "CheckboxAttackAnimals") + UI_MAP_ELEMENT( m_checkboxes[eControl_Op], "CheckboxOp") + UI_MAP_ELEMENT( m_checkboxes[eControl_CheatTeleport], "CheckboxTeleport") + UI_MAP_ELEMENT( m_checkboxes[eControl_HostFly], "CheckboxHostFly") + UI_MAP_ELEMENT( m_checkboxes[eControl_HostHunger], "CheckboxHostHunger") + UI_MAP_ELEMENT( m_checkboxes[eControl_HostInvisible], "CheckboxHostInvisible") + + UI_MAP_ELEMENT( m_buttonKick, "ButtonKick") + + UI_MAP_ELEMENT( m_labelGamertag, "Gamertag") + + UI_MAP_NAME( m_funcSetPlayerIcon, L"SetPlayerIcon" ); + UI_END_MAP_ELEMENTS_AND_NAMES() + + bool m_bModeratorState; + + +public: + UIScene_InGamePlayerOptionsMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_InGamePlayerOptionsMenu;} + virtual void updateTooltips(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + virtual void handleCheckboxToggled(F64 controlId, bool selected); + virtual void handleTimerComplete(int id); + +public: + virtual void tick(); + + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + virtual void handleDestroy(); + virtual void handlePress(F64 controlId, F64 childId); + + + static int KickPlayerReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static void OnPlayerChanged(void *callbackParam, INetworkPlayer *pPlayer, bool leaving); + +private: + /** 4J-JEV: + For enabling/disabling 'Can Fly', 'Can Teleport', 'Can Disable Hunger' etc + used after changing the moderator checkbox. + */ + void resetCheatCheckboxes(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_InGameSaveManagementMenu.cpp b/Minecraft.Client/Common/UI/UIScene_InGameSaveManagementMenu.cpp new file mode 100644 index 00000000..b0dbc59f --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_InGameSaveManagementMenu.cpp @@ -0,0 +1,497 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_InGameSaveManagementMenu.h" + +#if defined(__ORBIS__) || defined(__PSVITA__) +#include +#endif + +int UIScene_InGameSaveManagementMenu::LoadSaveDataThumbnailReturned(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes) +{ + UIScene_InGameSaveManagementMenu *pClass= (UIScene_InGameSaveManagementMenu *)lpParam; + + app.DebugPrintf("Received data for save thumbnail\n"); + + if(pbThumbnail && dwThumbnailBytes) + { + pClass->m_saveDetails[pClass->m_iRequestingThumbnailId].pbThumbnailData = new BYTE[dwThumbnailBytes]; + memcpy(pClass->m_saveDetails[pClass->m_iRequestingThumbnailId].pbThumbnailData, pbThumbnail, dwThumbnailBytes); + pClass->m_saveDetails[pClass->m_iRequestingThumbnailId].dwThumbnailSize = dwThumbnailBytes; + } + else + { + pClass->m_saveDetails[pClass->m_iRequestingThumbnailId].pbThumbnailData = NULL; + pClass->m_saveDetails[pClass->m_iRequestingThumbnailId].dwThumbnailSize = 0; + app.DebugPrintf("Save thumbnail data is NULL, or has size 0\n"); + } + pClass->m_bSaveThumbnailReady = true; + + return 0; +} + +UIScene_InGameSaveManagementMenu::UIScene_InGameSaveManagementMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_iRequestingThumbnailId = 0; + m_iSaveInfoC=0; + m_bIgnoreInput = false; + m_iState=e_SavesIdle; + //m_bRetrievingSaveInfo=false; + + m_buttonListSaves.init(eControl_SavesList); + + m_labelSavesListTitle.init( app.GetString(IDS_SAVE_INCOMPLETE_DELETE_SAVES) ); + m_controlSavesTimer.setVisible( true ); + + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + m_spaceIndicatorSaves.init(L"",eControl_SpaceIndicator,0, (4LL *1024LL * 1024LL * 1024LL) ); +#endif + m_bUpdateSaveSize = false; + + m_bAllLoaded = false; + m_bRetrievingSaveThumbnails = false; + m_bSaveThumbnailReady = false; + m_bExitScene=false; + m_pSaveDetails=NULL; + m_bSavesDisplayed=false; + m_saveDetails = NULL; + m_iSaveDetailsCount = 0; + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) || defined(_DURANGO) + // Always clear the saves when we enter this menu + StorageManager.ClearSavesInfo(); +#endif + + // block input if we're waiting for DLC to install, and wipe the saves list. The end of dlc mounting custom message will fill the list again + if(app.StartInstallDLCProcess(m_iPad)==true || app.DLCInstallPending()) + { + // if we're waiting for DLC to mount, don't fill the save list. The custom message on end of dlc mounting will do that + m_bIgnoreInput = true; + } + else + { + Initialise(); + } + +#ifdef __PSVITA__ + if(CGameNetworkManager::usingAdhocMode() && SQRNetworkManager_AdHoc_Vita::GetAdhocStatus()) + { + g_NetworkManager.startAdhocMatching(); // create the client matching context and clear out the friends list + } + +#endif + + // If we're not ignoring input, then we aren't still waiting for the DLC to mount, and can now check for corrupt dlc. Otherwise this will happen when the dlc has finished mounting. + if( !m_bIgnoreInput) + { + app.m_dlcManager.checkForCorruptDLCAndAlert(); + } + + parentLayer->addComponent(iPad,eUIComponent_MenuBackground); +} + + +UIScene_InGameSaveManagementMenu::~UIScene_InGameSaveManagementMenu() +{ + m_parentLayer->removeComponent(eUIComponent_MenuBackground); + + if(m_saveDetails) + { + for(int i = 0; i < m_iSaveDetailsCount; ++i) + { + delete m_saveDetails[i].pbThumbnailData; + } + delete [] m_saveDetails; + } + app.LeaveSaveNotificationSection(); + StorageManager.SetSaveDisabled(false); + StorageManager.ContinueIncompleteOperation(); +} + +void UIScene_InGameSaveManagementMenu::updateTooltips() +{ + int iA = -1; + if( m_bSavesDisplayed && m_iSaveDetailsCount > 0) + { + iA = IDS_TOOLTIPS_DELETESAVE; + } + ui.SetTooltips( m_parentLayer->IsFullscreenGroup()?XUSER_INDEX_ANY:m_iPad, iA, IDS_SAVE_INCOMPLETE_RETRY_SAVING); +} + +// +void UIScene_InGameSaveManagementMenu::Initialise() +{ + m_iSaveListIndex = 0; + + // Check if we're in the trial version + if(ProfileManager.IsFullVersion()==false) + { + } + else if(StorageManager.GetSaveDisabled()) + { + GetSaveInfo(); + } + else + { + // 4J-PB - we need to check that there is enough space left to create a copy of the save (for a rename) + bool bCanRename = StorageManager.EnoughSpaceForAMinSaveGame(); + + GetSaveInfo(); + } + + m_bIgnoreInput=false; +} + +void UIScene_InGameSaveManagementMenu::handleReload() +{ + m_bIgnoreInput = false; + m_iRequestingThumbnailId = 0; + m_bAllLoaded=false; + m_bRetrievingSaveThumbnails=false; + m_bSavesDisplayed=false; + m_iSaveInfoC=0; +} + +void UIScene_InGameSaveManagementMenu::handleGainFocus(bool navBack) +{ + UIScene::handleGainFocus(navBack); + + updateTooltips(); + + if(navBack) + { + // re-enable button presses + m_bIgnoreInput=false; + } +} + +wstring UIScene_InGameSaveManagementMenu::getMoviePath() +{ + return L"SaveMenu"; +} + +void UIScene_InGameSaveManagementMenu::tick() +{ + UIScene::tick(); + + if(m_bExitScene) // navigate forward or back + { + if(!m_bRetrievingSaveThumbnails) + { + // need to wait for any callback retrieving thumbnail to complete + navigateBack(); + } + } + // Stop loading thumbnails if we navigate forwards + if(hasFocus(m_iPad)) + { + if(m_bUpdateSaveSize) + { + m_spaceIndicatorSaves.selectSave(m_iSaveListIndex); + m_bUpdateSaveSize = false; + } + + // Display the saves if we have them + if(!m_bSavesDisplayed) + { + m_pSaveDetails=StorageManager.ReturnSavesInfo(); + if(m_pSaveDetails!=NULL) + { + m_spaceIndicatorSaves.reset(); + + m_bSavesDisplayed=true; + + if(m_saveDetails!=NULL) + { + for(unsigned int i = 0; i < m_pSaveDetails->iSaveC; ++i) + { + if(m_saveDetails[i].pbThumbnailData!=NULL) + { + delete m_saveDetails[i].pbThumbnailData; + } + } + delete m_saveDetails; + } + m_saveDetails = new SaveListDetails[m_pSaveDetails->iSaveC]; + + m_iSaveDetailsCount = m_pSaveDetails->iSaveC; + for(unsigned int i = 0; i < m_pSaveDetails->iSaveC; ++i) + { +#if defined(_XBOX_ONE) + m_spaceIndicatorSaves.addSave( m_pSaveDetails->SaveInfoA[i].totalSize ); +#elif defined(__ORBIS__) + m_spaceIndicatorSaves.addSave( m_pSaveDetails->SaveInfoA[i].blocksUsed * (32 * 1024) ); +#endif +#ifdef _DURANGO + m_buttonListSaves.addItem(m_pSaveDetails->SaveInfoA[i].UTF16SaveTitle, L""); + + m_saveDetails[i].saveId = i; + memcpy(m_saveDetails[i].UTF16SaveName, m_pSaveDetails->SaveInfoA[i].UTF16SaveTitle, 128); + memcpy(m_saveDetails[i].UTF16SaveFilename, m_pSaveDetails->SaveInfoA[i].UTF16SaveFilename, MAX_SAVEFILENAME_LENGTH); +#else + m_buttonListSaves.addItem(m_pSaveDetails->SaveInfoA[i].UTF8SaveTitle, L""); + + m_saveDetails[i].saveId = i; + memcpy(m_saveDetails[i].UTF8SaveName, m_pSaveDetails->SaveInfoA[i].UTF8SaveTitle, 128); + memcpy(m_saveDetails[i].UTF8SaveFilename, m_pSaveDetails->SaveInfoA[i].UTF8SaveFilename, MAX_SAVEFILENAME_LENGTH); +#endif + } + m_controlSavesTimer.setVisible( false ); + + // set focus on the first button + + } + } + + if(!m_bExitScene && m_bSavesDisplayed && !m_bRetrievingSaveThumbnails && !m_bAllLoaded) + { + if( m_iRequestingThumbnailId < (m_buttonListSaves.getItemCount() )) + { + m_bRetrievingSaveThumbnails = true; + app.DebugPrintf("Requesting the first thumbnail\n"); + // set the save to load + PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo(); + C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveDataThumbnail(&pSaveDetails->SaveInfoA[(int)m_iRequestingThumbnailId],&LoadSaveDataThumbnailReturned,this); + + if(eLoadStatus!=C4JStorage::ESaveGame_GetSaveThumbnail) + { + // something went wrong + m_bRetrievingSaveThumbnails=false; + m_bAllLoaded = true; + } + } + } + else if (m_bSavesDisplayed && m_bSaveThumbnailReady) + { + m_bSaveThumbnailReady = false; + + // check we're not waiting to exit the scene + if(!m_bExitScene) + { + // convert to utf16 + uint16_t u16Message[MAX_SAVEFILENAME_LENGTH]; +#ifdef _DURANGO + // Already utf16 on durango + memcpy(u16Message, m_saveDetails[m_iRequestingThumbnailId].UTF16SaveFilename, MAX_SAVEFILENAME_LENGTH); +#elif defined(_WINDOWS64) + int result = ::MultiByteToWideChar( + CP_UTF8, // convert from UTF-8 + MB_ERR_INVALID_CHARS, // error on invalid chars + m_saveDetails[m_iRequestingThumbnailId].UTF8SaveFilename, // source UTF-8 string + MAX_SAVEFILENAME_LENGTH, // total length of source UTF-8 string, + // in CHAR's (= bytes), including end-of-string \0 + (wchar_t *)u16Message, // destination buffer + MAX_SAVEFILENAME_LENGTH // size of destination buffer, in WCHAR's + ); +#else +#ifdef __PS3 + size_t srcmax,dstmax; +#else + uint32_t srcmax,dstmax; + uint32_t srclen,dstlen; +#endif + srcmax=MAX_SAVEFILENAME_LENGTH; + dstmax=MAX_SAVEFILENAME_LENGTH; + +#if defined(__PS3__) + L10nResult lres= UTF8stoUTF16s((uint8_t *)m_saveDetails[m_iRequestingThumbnailId].UTF8SaveFilename,&srcmax,u16Message,&dstmax); +#else + SceCesUcsContext context; + sceCesUcsContextInit(&context); + + sceCesUtf8StrToUtf16Str(&context, (uint8_t *)m_saveDetails[m_iRequestingThumbnailId].UTF8SaveFilename,srcmax,&srclen,u16Message,dstmax,&dstlen); +#endif +#endif + if( m_saveDetails[m_iRequestingThumbnailId].pbThumbnailData ) + { + registerSubstitutionTexture((wchar_t *)u16Message,m_saveDetails[m_iRequestingThumbnailId].pbThumbnailData,m_saveDetails[m_iRequestingThumbnailId].dwThumbnailSize); + } + m_buttonListSaves.setTextureName(m_iRequestingThumbnailId, (wchar_t *)u16Message); + + ++m_iRequestingThumbnailId; + if( m_iRequestingThumbnailId < (m_buttonListSaves.getItemCount() )) + { + app.DebugPrintf("Requesting another thumbnail\n"); + // set the save to load + PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo(); + C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveDataThumbnail(&pSaveDetails->SaveInfoA[(int)m_iRequestingThumbnailId],&LoadSaveDataThumbnailReturned,this); + if(eLoadStatus!=C4JStorage::ESaveGame_GetSaveThumbnail) + { + // something went wrong + m_bRetrievingSaveThumbnails=false; + m_bAllLoaded = true; + } + } + else + { + m_bRetrievingSaveThumbnails = false; + m_bAllLoaded = true; + } + } + else + { + // stop retrieving thumbnails, and exit + m_bRetrievingSaveThumbnails = false; + } + } + } + + switch(m_iState) + { + case e_SavesIdle: + break; + case e_SavesRepopulateAfterDelete: + m_bIgnoreInput = false; + m_iRequestingThumbnailId = 0; + m_bAllLoaded=false; + m_bRetrievingSaveThumbnails=false; + m_bSavesDisplayed=false; + m_iSaveInfoC=0; + m_buttonListSaves.clearList(); + //StorageManager.ClearSavesInfo(); + //GetSaveInfo(); + m_iState=e_SavesIdle; + break; + } +} + +void UIScene_InGameSaveManagementMenu::GetSaveInfo( ) +{ + unsigned int uiSaveC=0; + + // This will return with the number retrieved in uiSaveC + + // clear the saves list + m_bSavesDisplayed = false; // we're blocking the exit from this scene until complete + m_buttonListSaves.clearList(); + m_iSaveInfoC=0; + m_controlSavesTimer.setVisible(true); + + m_pSaveDetails=StorageManager.ReturnSavesInfo(); + if(m_pSaveDetails==NULL) + { + C4JStorage::ESaveGameState eSGIStatus= StorageManager.GetSavesInfo(m_iPad,NULL,this,"save"); + } + + + return; +} + +void UIScene_InGameSaveManagementMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if(m_bIgnoreInput) return; + + // if we're retrieving save info, ignore key presses + if(!m_bSavesDisplayed) return; + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + m_bExitScene=true; +#else + navigateBack(); +#endif + handled = true; + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + sendInputToMovie(key, repeat, pressed, released); + handled = true; + break; + } +} + +void UIScene_InGameSaveManagementMenu::handleInitFocus(F64 controlId, F64 childId) +{ + app.DebugPrintf(app.USER_SR, "UIScene_InGameSaveManagementMenu::handleInitFocus - %d , %d\n", (int)controlId, (int)childId); +} + +void UIScene_InGameSaveManagementMenu::handleFocusChange(F64 controlId, F64 childId) +{ + app.DebugPrintf(app.USER_SR, "UIScene_InGameSaveManagementMenu::handleFocusChange - %d , %d\n", (int)controlId, (int)childId); + m_iSaveListIndex = childId; + if(m_bSavesDisplayed) m_bUpdateSaveSize = true; + updateTooltips(); +} + +void UIScene_InGameSaveManagementMenu::handlePress(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_SavesList: + { + m_bIgnoreInput = true; + + // delete the save game + // Have to ask the player if they are sure they want to delete this game + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_TOOLTIPS_DELETESAVE, IDS_TEXT_DELETE_SAVE, uiIDA, 2,m_iPad,&UIScene_InGameSaveManagementMenu::DeleteSaveDialogReturned,this, app.GetStringTable(),NULL,0,true); + + ui.PlayUISFX(eSFX_Press); + break; + } + } +} + +int UIScene_InGameSaveManagementMenu::DeleteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_InGameSaveManagementMenu* pClass = (UIScene_InGameSaveManagementMenu*)pParam; + // results switched for this dialog + + if(result==C4JStorage::EMessage_ResultDecline) + { + if(app.DebugSettingsOn() && app.GetLoadSavesFromFolderEnabled()) + { + pClass->m_bIgnoreInput=false; + } + else + { + StorageManager.DeleteSaveData(&pClass->m_pSaveDetails->SaveInfoA[pClass->m_iSaveListIndex],UIScene_InGameSaveManagementMenu::DeleteSaveDataReturned,pClass); + pClass->m_controlSavesTimer.setVisible( true ); + } + } + else + { + pClass->m_bIgnoreInput=false; + } + + return 0; +} + +int UIScene_InGameSaveManagementMenu::DeleteSaveDataReturned(LPVOID lpParam,bool bRes) +{ + UIScene_InGameSaveManagementMenu* pClass = (UIScene_InGameSaveManagementMenu*)lpParam; + + if(bRes) + { + // wipe the list and repopulate it + pClass->m_iState=e_SavesRepopulateAfterDelete; + } + else pClass->m_bIgnoreInput=false; + + pClass->updateTooltips(); + + return 0; +} + +bool UIScene_InGameSaveManagementMenu::hasFocus(int iPad) +{ + return bHasFocus && (iPad == m_iPad || m_iPad == XUSER_INDEX_ANY); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_InGameSaveManagementMenu.h b/Minecraft.Client/Common/UI/UIScene_InGameSaveManagementMenu.h new file mode 100644 index 00000000..3f9ace3a --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_InGameSaveManagementMenu.h @@ -0,0 +1,104 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_InGameSaveManagementMenu : public UIScene +{ +private: + enum EControls + { + eControl_SavesList, +#if defined(_XBOX_ONE) || defined(__ORBIS__) + eControl_SpaceIndicator, +#endif + }; + + enum EState + { + e_SavesIdle, + e_SavesRepopulate, + e_SavesRepopulateAfterDelete + }; + + static const int JOIN_LOAD_CREATE_BUTTON_INDEX = 0; + + SaveListDetails *m_saveDetails; + int m_iSaveDetailsCount; + +protected: + UIControl_SaveList m_buttonListSaves; + UIControl_Label m_labelSavesListTitle; + UIControl m_controlSavesTimer; +#if defined(_XBOX_ONE) || defined(__ORBIS__) + UIControl_SpaceIndicatorBar m_spaceIndicatorSaves; +#endif + +private: + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttonListSaves, "SavesList") + + UI_MAP_ELEMENT( m_labelSavesListTitle, "SavesListTitle") + + UI_MAP_ELEMENT( m_controlSavesTimer, "SavesTimer") + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + UI_MAP_ELEMENT( m_spaceIndicatorSaves, "SaveSizeBar") +#endif + UI_END_MAP_ELEMENTS_AND_NAMES() + + int m_iState; + + vector *m_saves; + + bool m_bIgnoreInput; + bool m_bAllLoaded; + bool m_bRetrievingSaveThumbnails; + bool m_bSaveThumbnailReady; + int m_iRequestingThumbnailId; + SAVE_DETAILS *m_pSaveDetails; + bool m_bSavesDisplayed; + bool m_bExitScene; + int m_iSaveInfoC; + int m_iSaveListIndex; + //int *m_iConfigA; // track the texture packs that we don't have installed + + bool m_bUpdateSaveSize; + +public: + UIScene_InGameSaveManagementMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_InGameSaveManagementMenu(); + + virtual void updateTooltips(); + + virtual void handleReload(); + virtual void handleGainFocus(bool navBack); + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + virtual void handleFocusChange(F64 controlId, F64 childId); + virtual void handleInitFocus(F64 controlId, F64 childId); + + virtual EUIScene getSceneType() { return eUIScene_LoadOrJoinMenu;} + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return true; } + + virtual bool hasFocus(int iPad); + + virtual void tick(); + +private: + void Initialise(); + void GetSaveInfo(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + + static int LoadSaveDataThumbnailReturned(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes); + static int DeleteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int DeleteSaveDataReturned(LPVOID lpParam,bool bRes); +protected: + void handlePress(F64 controlId, F64 childId); +}; diff --git a/Minecraft.Client/Common/UI/UIScene_Intro.cpp b/Minecraft.Client/Common/UI/UIScene_Intro.cpp new file mode 100644 index 00000000..2c50612f --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_Intro.cpp @@ -0,0 +1,166 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_Intro.h" + + +UIScene_Intro::UIScene_Intro(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + m_bIgnoreNavigate = false; + m_bAnimationEnded = false; + + bool bSkipESRB = false; +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + bSkipESRB = app.GetProductSKU() != e_sku_SCEA; +#elif defined(_XBOX) || defined(_DURANGO) + bSkipESRB = !ProfileManager.LocaleIsUSorCanada(); +#endif + + // 4J Stu - These map to values in the Actionscript +#ifdef _WINDOWS64 + int platformIdx = 0; +#elif defined(_XBOX) + int platformIdx = 1; +#elif defined(_DURANGO) + int platformIdx = 2; +#elif defined(__PS3__) + int platformIdx = 3; +#elif defined(__ORBIS__) + int platformIdx = 4; +#elif defined(__PSVITA__) + int platformIdx = 5; +#endif + + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = platformIdx; + + value[1].type = IGGY_DATATYPE_boolean; + value[1].boolval = bSkipESRB; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetIntroPlatform , 2 , value ); + +#ifdef __PSVITA__ + // initialise vita touch controls with ids + m_TouchToSkip.init(0); +#endif +} + +wstring UIScene_Intro::getMoviePath() +{ + return L"Intro"; +} + +void UIScene_Intro::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + if(!m_bIgnoreNavigate) + { + m_bIgnoreNavigate = true; + //ui.NavigateToHomeMenu(); +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + + // has the user seen the EULA already ? We need their options file loaded for this + C4JStorage::eOptionsCallback eStatus=app.GetOptionsCallbackStatus(0); + switch(eStatus) + { + case C4JStorage::eOptions_Callback_Read: + case C4JStorage::eOptions_Callback_Read_FileNotFound: + // we've either read it, or it wasn't found + if(app.GetGameSettings(0,eGameSetting_PS3_EULA_Read)==0) + { + ui.NavigateToScene(0,eUIScene_EULA); + } + else + { + ui.NavigateToScene(0,eUIScene_SaveMessage); + } + break; + default: + ui.NavigateToScene(0,eUIScene_EULA); + break; + } +#elif defined _XBOX_ONE + ui.NavigateToScene(0,eUIScene_MainMenu); +#else + ui.NavigateToScene(0,eUIScene_SaveMessage); +#endif + } + break; + } +} + +#ifdef __PSVITA__ +void UIScene_Intro::handleTouchInput(unsigned int iPad, S32 x, S32 y, int iId, bool bPressed, bool bRepeat, bool bReleased) +{ + if(bReleased) + { + bool handled = false; + handleInput(iPad, ACTION_MENU_OK, false, true, false, handled); + } +} +#endif + +void UIScene_Intro::handleAnimationEnd() +{ + if(!m_bIgnoreNavigate) + { + m_bIgnoreNavigate = true; + //ui.NavigateToHomeMenu(); +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + // has the user seen the EULA already ? We need their options file loaded for this + C4JStorage::eOptionsCallback eStatus=app.GetOptionsCallbackStatus(0); + switch(eStatus) + { + case C4JStorage::eOptions_Callback_Read: + case C4JStorage::eOptions_Callback_Read_FileNotFound: + // we've either read it, or it wasn't found + if(app.GetGameSettings(0,eGameSetting_PS3_EULA_Read)==0) + { + ui.NavigateToScene(0,eUIScene_EULA); + } + else + { + ui.NavigateToScene(0,eUIScene_SaveMessage); + } + break; + default: + ui.NavigateToScene(0,eUIScene_EULA); + break; + } + + +#elif defined _XBOX_ONE + // Don't navigate to the main menu if we don't have focus, as we could have the quadrant sign-in or a join game timer screen running, and then when Those finish they'll + // give the main menu focus which clears the signed in players and therefore breaks transitioning into the game + if( hasFocus( m_iPad ) ) + { + ui.NavigateToScene(0,eUIScene_MainMenu); + } + else + { + m_bAnimationEnded = true; + } +#else + ui.NavigateToScene(0,eUIScene_SaveMessage); +#endif + } +} + +void UIScene_Intro::handleGainFocus(bool navBack) +{ + // Only relevant on xbox one - if we didn't navigate to the main menu at animation end due to the timer or quadrant sign-in being up, then we'll need to + // do it now in case the user has cancelled or joining a game failed + if( m_bAnimationEnded ) + { + ui.NavigateToScene(0,eUIScene_MainMenu); + } +} diff --git a/Minecraft.Client/Common/UI/UIScene_Intro.h b/Minecraft.Client/Common/UI/UIScene_Intro.h new file mode 100644 index 00000000..8bdc030e --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_Intro.h @@ -0,0 +1,52 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_Intro : public UIScene +{ +private: + bool m_bIgnoreNavigate; + bool m_bAnimationEnded; + + IggyName m_funcSetIntroPlatform; +#ifdef __PSVITA__ + UIControl_Touch m_TouchToSkip; +#endif + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) +#ifdef __PSVITA__ + UI_MAP_ELEMENT( m_TouchToSkip, "TouchToSkip" ) +#endif + UI_MAP_NAME( m_funcSetIntroPlatform, L"SetIntroPlatform") + UI_END_MAP_ELEMENTS_AND_NAMES() + +public: + UIScene_Intro(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_Intro;} + + // Returns true if this scene has focus for the pad passed in +#ifndef __PS3__ + virtual bool hasFocus(int iPad) { return bHasFocus; } +#endif + +protected: + + + virtual wstring getMoviePath(); + +#ifdef _DURANGO + virtual long long getDefaultGtcButtons() { return 0; } +#endif + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + virtual void handleAnimationEnd(); + virtual void handleGainFocus(bool navBack); + +#ifdef __PSVITA__ + virtual void handleTouchInput(unsigned int iPad, S32 x, S32 y, int iId, bool bPressed, bool bRepeat, bool bReleased); +#endif + +}; diff --git a/Minecraft.Client/Common/UI/UIScene_InventoryMenu.cpp b/Minecraft.Client/Common/UI/UIScene_InventoryMenu.cpp new file mode 100644 index 00000000..723937d0 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_InventoryMenu.cpp @@ -0,0 +1,334 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_InventoryMenu.h" + +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.stats.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.effect.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\Minecraft.h" +#include "..\..\Options.h" +#include "..\..\EntityRenderDispatcher.h" +#include "..\..\Lighting.h" +#include "..\Tutorial\Tutorial.h" +#include "..\Tutorial\TutorialMode.h" +#include "..\Tutorial\TutorialEnum.h" + +#define INVENTORY_UPDATE_EFFECTS_TIMER_ID (10) +#define INVENTORY_UPDATE_EFFECTS_TIMER_TIME (1000) // 1 second + +UIScene_InventoryMenu::UIScene_InventoryMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene_AbstractContainerMenu(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + InventoryScreenInput *initData = (InventoryScreenInput *)_initData; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->localgameModes[initData->iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[initData->iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Inventory_Menu, this); + } + + InventoryMenu *menu = (InventoryMenu *)initData->player->inventoryMenu; + + initData->player->awardStat(GenericStats::openInventory(),GenericStats::param_openInventory()); + + Initialize( initData->iPad, menu, false, InventoryMenu::INV_SLOT_START, eSectionInventoryUsing, eSectionInventoryMax, initData->bNavigateBack ); + + m_slotListArmor.addSlots(InventoryMenu::ARMOR_SLOT_START, InventoryMenu::ARMOR_SLOT_END - InventoryMenu::ARMOR_SLOT_START); + + if(initData) delete initData; + + for(unsigned int i = 0; i < MobEffect::NUM_EFFECTS; ++i) + { + m_bEffectTime[i] = 0; + } + + updateEffectsDisplay(); + addTimer(INVENTORY_UPDATE_EFFECTS_TIMER_ID,INVENTORY_UPDATE_EFFECTS_TIMER_TIME); +} + +wstring UIScene_InventoryMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"InventoryMenuSplit"; + } + else + { + return L"InventoryMenu"; + } +} + +void UIScene_InventoryMenu::handleReload() +{ + Initialize( m_iPad, m_menu, false, InventoryMenu::INV_SLOT_START, eSectionInventoryUsing, eSectionInventoryMax, m_bNavigateBack ); + + 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) + { + m_bEffectTime[i] = 0; + } +} + +int UIScene_InventoryMenu::getSectionColumns(ESceneSection eSection) +{ + int cols = 0; + switch( eSection ) + { + case eSectionInventoryArmor: + cols = 1; + break; + case eSectionInventoryInventory: + cols = 9; + break; + case eSectionInventoryUsing: + cols = 9; + break; + default: + assert( false ); + break; + } + return cols; +} + +int UIScene_InventoryMenu::getSectionRows(ESceneSection eSection) +{ + int rows = 0; + switch( eSection ) + { + case eSectionInventoryArmor: + rows = 4; + break; + case eSectionInventoryInventory: + rows = 3; + break; + case eSectionInventoryUsing: + rows = 1; + break; + default: + assert( false ); + break; + } + return rows; +} + +void UIScene_InventoryMenu::GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ) +{ + switch( eSection ) + { + case eSectionInventoryArmor: + pPosition->x = m_slotListArmor.getXPos(); + pPosition->y = m_slotListArmor.getYPos(); + break; + case eSectionInventoryInventory: + pPosition->x = m_slotListInventory.getXPos(); + pPosition->y = m_slotListInventory.getYPos(); + break; + case eSectionInventoryUsing: + pPosition->x = m_slotListHotbar.getXPos(); + pPosition->y = m_slotListHotbar.getYPos(); + break; + default: + assert( false ); + break; + } +} + +void UIScene_InventoryMenu::GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ) +{ + UIVec2D sectionSize; + + switch( eSection ) + { + case eSectionInventoryArmor: + sectionSize.x = m_slotListArmor.getWidth(); + sectionSize.y = m_slotListArmor.getHeight(); + break; + case eSectionInventoryInventory: + sectionSize.x = m_slotListInventory.getWidth(); + sectionSize.y = m_slotListInventory.getHeight(); + break; + case eSectionInventoryUsing: + sectionSize.x = m_slotListHotbar.getWidth(); + sectionSize.y = m_slotListHotbar.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_InventoryMenu::setSectionSelectedSlot(ESceneSection eSection, int x, int y) +{ + int cols = getSectionColumns(eSection); + + int index = (y * cols) + x; + + UIControl_SlotList *slotList = NULL; + switch( eSection ) + { + case eSectionInventoryArmor: + slotList = &m_slotListArmor; + break; + case eSectionInventoryInventory: + slotList = &m_slotListInventory; + break; + case eSectionInventoryUsing: + slotList = &m_slotListHotbar; + break; + } + + slotList->setHighlightSlot(index); +} + +UIControl *UIScene_InventoryMenu::getSection(ESceneSection eSection) +{ + UIControl *control = NULL; + switch( eSection ) + { + case eSectionInventoryArmor: + control = &m_slotListArmor; + break; + case eSectionInventoryInventory: + control = &m_slotListInventory; + break; + case eSectionInventoryUsing: + control = &m_slotListHotbar; + break; + } + return control; +} + +void UIScene_InventoryMenu::customDraw(IggyCustomDrawCallbackRegion *region) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localgameModes[m_iPad] == NULL) return; + + if(wcscmp((wchar_t *)region->name,L"player")==0) + { + // Setup GDraw, normal game render states and matrices + CustomDrawData *customDrawRegion = ui.setupCustomDraw(this,region); + delete customDrawRegion; + + m_playerPreview.render(region); + + // Finish GDraw and anything else that needs to be finalised + ui.endCustomDraw(region); + } + else + { + UIScene_AbstractContainerMenu::customDraw(region); + } +} + +void UIScene_InventoryMenu::handleTimerComplete(int id) +{ + if(id == INVENTORY_UPDATE_EFFECTS_TIMER_ID) + { + updateEffectsDisplay(); + } +} + +void UIScene_InventoryMenu::updateEffectsDisplay() +{ + // Update with the current effects + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr player = pMinecraft->localplayers[m_iPad]; + + if(player == NULL) return; + + vector *activeEffects = player->getActiveEffects(); + + // 4J - TomK setup time update value array size to update the active effects + int iValue = 0; + IggyDataValue *UpdateValue = new IggyDataValue[activeEffects->size()*2]; + + for(AUTO_VAR(it, activeEffects->begin()); it != activeEffects->end(); ++it) + { + MobEffectInstance *effect = *it; + + if(effect->getDuration() >= m_bEffectTime[effect->getId()]) + { + wstring effectString = app.GetString( effect->getDescriptionId() );//I18n.get(effect.getDescriptionId()).trim(); + if (effect->getAmplifier() > 0) + { + wstring potencyString = L""; + switch(effect->getAmplifier()) + { + case 1: + potencyString = L" "; + potencyString += app.GetString( IDS_POTION_POTENCY_1 ); + break; + case 2: + potencyString = L" "; + potencyString += app.GetString( IDS_POTION_POTENCY_2 ); + break; + case 3: + potencyString = L" "; + potencyString += app.GetString( IDS_POTION_POTENCY_3 ); + break; + default: + potencyString = app.GetString( IDS_POTION_POTENCY_0 ); + break; + } + effectString += potencyString; + } + int icon = 0; + MobEffect *mobEffect = MobEffect::effects[effect->getId()]; + if (mobEffect->hasIcon()) + { + icon = mobEffect->getIcon(); + } + IggyDataValue result; + IggyDataValue value[3]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = icon; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)effectString.c_str(); + stringVal.length = effectString.length(); + value[1].type = IGGY_DATATYPE_string_UTF16; + value[1].string16 = stringVal; + + int seconds = effect->getDuration() / SharedConstants::TICKS_PER_SECOND; + value[2].type = IGGY_DATATYPE_number; + value[2].number = seconds; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcAddEffect , 3 , value ); + } + + 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) + UpdateValue[iValue].type = IGGY_DATATYPE_number; + UpdateValue[iValue].number = MobEffect::effects[effect->getId()]->getIcon(); + UpdateValue[iValue + 1].type = IGGY_DATATYPE_number; + UpdateValue[iValue + 1].number = (int)(effect->getDuration() / SharedConstants::TICKS_PER_SECOND); + iValue+=2; + } + + m_bEffectTime[effect->getId()] = effect->getDuration(); + } + + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcUpdateEffects , activeEffects->size()*2 , UpdateValue ); + + delete activeEffects; +} diff --git a/Minecraft.Client/Common/UI/UIScene_InventoryMenu.h b/Minecraft.Client/Common/UI/UIScene_InventoryMenu.h new file mode 100644 index 00000000..fb8d57a2 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_InventoryMenu.h @@ -0,0 +1,51 @@ +#pragma once + +#include "UIScene_AbstractContainerMenu.h" +#include "IUIScene_InventoryMenu.h" + +#include "..\..\..\Minecraft.World\MobEffect.h" + +class InventoryMenu; + +class UIScene_InventoryMenu : public UIScene_AbstractContainerMenu, public IUIScene_InventoryMenu +{ + friend class UIControl_MinecraftPlayer; +private: + int m_bEffectTime[MobEffect::NUM_EFFECTS]; +public: + UIScene_InventoryMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_InventoryMenu;} + +protected: + UIControl_SlotList m_slotListArmor; + UIControl_MinecraftPlayer m_playerPreview; + IggyName m_funcUpdateEffects, m_funcAddEffect; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene_AbstractContainerMenu) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + UI_MAP_ELEMENT( m_slotListArmor, "armorList") + UI_MAP_ELEMENT( m_playerPreview, "iggy_player") + + UI_MAP_NAME( m_funcUpdateEffects, L"UpdateEffects") + UI_MAP_NAME( m_funcAddEffect, L"AddEffect") + 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); + + virtual void customDraw(IggyCustomDrawCallbackRegion *region); + virtual void handleTimerComplete(int id); + +private: + void updateEffectsDisplay(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp b/Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp new file mode 100644 index 00000000..cad86dce --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_JoinMenu.cpp @@ -0,0 +1,586 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_JoinMenu.h" +#include "..\..\Minecraft.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\Options.h" +#include "..\..\MinecraftServer.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.h" + +#define UPDATE_PLAYERS_TIMER_ID 0 +#define UPDATE_PLAYERS_TIMER_TIME 30000 + +UIScene_JoinMenu::UIScene_JoinMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + JoinMenuInitData *initData = (JoinMenuInitData *)_initData; + m_selectedSession = initData->selectedSession; + m_friendInfoUpdatedOK = false; + m_friendInfoUpdatedERROR = false; + m_friendInfoRequestIssued = false; +} + +void UIScene_JoinMenu::updateTooltips() +{ + int iA = -1; + int iY = -1; + if (getControlFocus() == eControl_GamePlayers) + { +#ifdef _DURANGO + iY = IDS_TOOLTIPS_VIEW_GAMERCARD; +#endif + } + else + { + iA = IDS_TOOLTIPS_SELECT; + } + + ui.SetTooltips( DEFAULT_XUI_MENU_USER, iA, IDS_TOOLTIPS_BACK, -1, iY ); + +} + +void UIScene_JoinMenu::tick() +{ + if( !m_friendInfoRequestIssued ) + { + ui.NavigateToScene(m_iPad, eUIScene_Timer); + g_NetworkManager.GetFullFriendSessionInfo(m_selectedSession, &friendSessionUpdated, this); + m_friendInfoRequestIssued = true; + } + + if( m_friendInfoUpdatedOK ) + { + m_friendInfoUpdatedOK = false; + + m_buttonJoinGame.init(app.GetString(IDS_JOIN_GAME),eControl_JoinGame); + + m_buttonListPlayers.init(eControl_GamePlayers); + +#if defined(__PS3__) || defined(__ORBIS__) || defined __PSVITA__ + for( int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; i++ ) + { + if( m_selectedSession->data.players[i] != NULL ) + { + #ifndef _CONTENT_PACKAGE + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<data.players[i].getOnlineID()); + + #ifndef __PSVITA__ + // Append guest number (any players in an online game not signed into PSN are guests) + if( m_selectedSession->data.players[i].isSignedIntoPSN() == false ) + { + char suffix[5]; + sprintf(suffix, " (%d)", m_selectedSession->data.players[i].getQuadrant() + 1); + playerName.append(suffix); + } + #endif + m_buttonListPlayers.addItem(playerName); + } + } + else + { + // Leave the loop when we hit the first NULL player + break; + } + } +#elif defined(_DURANGO) + for( int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; i++ ) + { + if ( m_selectedSession->searchResult.m_playerNames[i].size() ) + { + m_buttonListPlayers.addItem(m_selectedSession->searchResult.m_playerNames[i]); + } + else + { + // Leave the loop when we hit the first empty player name + break; + } + } +#endif + + m_labelLabels[eLabel_Difficulty].init(app.GetString(IDS_LABEL_DIFFICULTY)); + m_labelLabels[eLabel_GameType].init(app.GetString(IDS_LABEL_GAME_TYPE)); + m_labelLabels[eLabel_GamertagsOn].init(app.GetString(IDS_LABEL_GAMERTAGS)); + m_labelLabels[eLabel_Structures].init(app.GetString(IDS_LABEL_STRUCTURES)); + m_labelLabels[eLabel_LevelType].init(app.GetString(IDS_LABEL_LEVEL_TYPE)); + m_labelLabels[eLabel_PVP].init(app.GetString(IDS_LABEL_PvP)); + m_labelLabels[eLabel_Trust].init(app.GetString(IDS_LABEL_TRUST)); + m_labelLabels[eLabel_TNTOn].init(app.GetString(IDS_LABEL_TNT)); + m_labelLabels[eLabel_FireOn].init(app.GetString(IDS_LABEL_FIRE_SPREADS)); + + unsigned int uiGameHostSettings = m_selectedSession->data.m_uiGameHostSettings; + switch(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_Difficulty)) + { + case Difficulty::EASY: + m_labelValues[eLabel_Difficulty].init( app.GetString(IDS_DIFFICULTY_TITLE_EASY) ); + break; + case Difficulty::NORMAL: + m_labelValues[eLabel_Difficulty].init( app.GetString(IDS_DIFFICULTY_TITLE_NORMAL) ); + break; + case Difficulty::HARD: + m_labelValues[eLabel_Difficulty].init( app.GetString(IDS_DIFFICULTY_TITLE_HARD) ); + break; + case Difficulty::PEACEFUL: + default: + m_labelValues[eLabel_Difficulty].init( app.GetString(IDS_DIFFICULTY_TITLE_PEACEFUL) ); + break; + } + + int option = app.GetGameHostOption(uiGameHostSettings,eGameHostOption_GameType); + if(option == GameType::CREATIVE->getId()) + { + m_labelValues[eLabel_GameType].init( app.GetString(IDS_CREATIVE) ); + } + else + { + m_labelValues[eLabel_GameType].init( app.GetString(IDS_SURVIVAL) ); + } + + if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_Gamertags)) m_labelValues[eLabel_GamertagsOn].init( app.GetString(IDS_ON) ); + else m_labelValues[eLabel_GamertagsOn].init( app.GetString(IDS_OFF) ); + + if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_Structures)) m_labelValues[eLabel_Structures].init( app.GetString(IDS_ON) ); + else m_labelValues[eLabel_Structures].init( app.GetString(IDS_OFF) ); + + if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_LevelType)) m_labelValues[eLabel_LevelType].init( app.GetString(IDS_LEVELTYPE_SUPERFLAT) ); + else m_labelValues[eLabel_LevelType].init( app.GetString(IDS_LEVELTYPE_NORMAL) ); + + if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_PvP))m_labelValues[eLabel_PVP].init( app.GetString(IDS_ON) ); + else m_labelValues[eLabel_PVP].init( app.GetString(IDS_OFF) ); + + if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_TrustPlayers)) m_labelValues[eLabel_Trust].init( app.GetString(IDS_ON) ); + else m_labelValues[eLabel_Trust].init( app.GetString(IDS_OFF) ); + + if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_TNT)) m_labelValues[eLabel_TNTOn].init( app.GetString(IDS_ON) ); + else m_labelValues[eLabel_TNTOn].init( app.GetString(IDS_OFF) ); + + if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_FireSpreads)) m_labelValues[eLabel_FireOn].init( app.GetString(IDS_ON) ); + else m_labelValues[eLabel_FireOn].init( app.GetString(IDS_OFF) ); + + m_bIgnoreInput = false; + + // Alert the app the we want to be informed of ethernet connections + app.SetLiveLinkRequired( true ); + + TelemetryManager->RecordMenuShown(m_iPad, eUIScene_JoinMenu, 0); + + addTimer(UPDATE_PLAYERS_TIMER_ID,UPDATE_PLAYERS_TIMER_TIME); + } + + if( m_friendInfoUpdatedERROR ) + { + m_buttonJoinGame.init(app.GetString(IDS_JOIN_GAME),eControl_JoinGame); + + m_buttonListPlayers.init(eControl_GamePlayers); + + m_labelLabels[eLabel_Difficulty].init(app.GetString(IDS_LABEL_DIFFICULTY)); + m_labelLabels[eLabel_GameType].init(app.GetString(IDS_LABEL_GAME_TYPE)); + m_labelLabels[eLabel_GamertagsOn].init(app.GetString(IDS_LABEL_GAMERTAGS)); + m_labelLabels[eLabel_Structures].init(app.GetString(IDS_LABEL_STRUCTURES)); + m_labelLabels[eLabel_LevelType].init(app.GetString(IDS_LABEL_LEVEL_TYPE)); + m_labelLabels[eLabel_PVP].init(app.GetString(IDS_LABEL_PvP)); + m_labelLabels[eLabel_Trust].init(app.GetString(IDS_LABEL_TRUST)); + m_labelLabels[eLabel_TNTOn].init(app.GetString(IDS_LABEL_TNT)); + m_labelLabels[eLabel_FireOn].init(app.GetString(IDS_LABEL_FIRE_SPREADS)); + + m_labelValues[eLabel_Difficulty].init(app.GetString(IDS_DIFFICULTY_TITLE_PEACEFUL)); + m_labelValues[eLabel_GameType].init( app.GetString(IDS_CREATIVE) ); + m_labelValues[eLabel_GamertagsOn].init( app.GetString(IDS_OFF) ); + m_labelValues[eLabel_Structures].init( app.GetString(IDS_OFF) ); + m_labelValues[eLabel_LevelType].init( app.GetString(IDS_LEVELTYPE_NORMAL) ); + m_labelValues[eLabel_PVP].init( app.GetString(IDS_OFF) ); + m_labelValues[eLabel_Trust].init( app.GetString(IDS_OFF) ); + m_labelValues[eLabel_TNTOn].init( app.GetString(IDS_OFF) ); + m_labelValues[eLabel_FireOn].init( app.GetString(IDS_OFF) ); + + m_friendInfoUpdatedERROR = false; + + // Show a generic network error message, not always safe to assume the error was host quitting + // without bubbling more info up from the network manager so this is the best we can do + UINT uiIDA[1]; + uiIDA[0] = IDS_CONFIRM_OK; +#ifdef _XBOX_ONE + ui.RequestMessageBox( IDS_CONNECTION_FAILED, IDS_DISCONNECTED_SERVER_QUIT, uiIDA,1,m_iPad,ErrorDialogReturned,this, app.GetStringTable()); +#else + ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA,1,m_iPad,ErrorDialogReturned,this, app.GetStringTable()); +#endif + } + + UIScene::tick(); +} + +void UIScene_JoinMenu::friendSessionUpdated(bool success, void *pParam) +{ + UIScene_JoinMenu *scene = (UIScene_JoinMenu *)pParam; + ui.NavigateBack(scene->m_iPad); + if( success ) + { + scene->m_friendInfoUpdatedOK = true; + } + else + { + scene->m_friendInfoUpdatedERROR = true; + } +} + +int UIScene_JoinMenu::ErrorDialogReturned(void *pParam, int iPad, const C4JStorage::EMessageResult) +{ + UIScene_JoinMenu *scene = (UIScene_JoinMenu *)pParam; + ui.NavigateBack(scene->m_iPad); + + return 0; +} + +void UIScene_JoinMenu::updateComponents() +{ + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); +} + +wstring UIScene_JoinMenu::getMoviePath() +{ + return L"JoinMenu"; +} + +void UIScene_JoinMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if(m_bIgnoreInput) return; + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + navigateBack(); + handled = true; + } + break; +#ifdef _DURANGO + case ACTION_MENU_Y: + if(m_selectedSession != NULL && getControlFocus() == eControl_GamePlayers && m_buttonListPlayers.getItemCount() > 0) + { + PlayerUID uid = m_selectedSession->searchResult.m_playerXuids[m_buttonListPlayers.getCurrentSelection()]; + if( uid != INVALID_XUID ) ProfileManager.ShowProfileCard(ProfileManager.GetLockedProfile(),uid); + } + break; +#endif + case ACTION_MENU_OK: + if (getControlFocus() != eControl_GamePlayers) + { + sendInputToMovie(key, repeat, pressed, released); + } + handled = true; + break; +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + sendInputToMovie(key, repeat, pressed, released); + handled = true; + break; + } +} + +void UIScene_JoinMenu::handlePress(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_JoinGame: + { + m_bIgnoreInput = true; + + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + +#ifdef _DURANGO + ProfileManager.CheckMultiplayerPrivileges(m_iPad, true, &checkPrivilegeCallback, this); +#else + StartSharedLaunchFlow(); +#endif + } + break; + case eControl_GamePlayers: + break; + }; +} + +void UIScene_JoinMenu::handleFocusChange(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_GamePlayers: + m_buttonListPlayers.updateChildFocus( (int) childId ); + }; + updateTooltips(); +} + +#ifdef _DURANGO +void UIScene_JoinMenu::checkPrivilegeCallback(LPVOID lpParam, bool hasPrivilege, int iPad) +{ + UIScene_JoinMenu* pClass = (UIScene_JoinMenu*)lpParam; + + if(hasPrivilege) + { + pClass->StartSharedLaunchFlow(); +} + else + { + pClass->m_bIgnoreInput = false; + } +} +#endif + +void UIScene_JoinMenu::StartSharedLaunchFlow() +{ + if(!app.IsLocalMultiplayerAvailable()) + { + JoinGame(this); + } + else + { + //ProfileManager.RequestSignInUI(false, false, false, true, false,&UIScene_JoinMenu::StartGame_SignInReturned, this,ProfileManager.GetPrimaryPad()); + SignInInfo info; + info.Func = &UIScene_JoinMenu::StartGame_SignInReturned; + info.lpParam = this; + info.requireOnline = true; + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_QuadrantSignin,&info); + } +} + +int UIScene_JoinMenu::StartGame_SignInReturned(void *pParam,bool bContinue, int iPad) +{ + UIScene_JoinMenu* pClass = (UIScene_JoinMenu*)pParam; + + if(bContinue==true) + { + // It's possible that the player has not signed in - they can back out + if(ProfileManager.IsSignedIn(iPad)) + { + JoinGame(pClass); + } + else + { + pClass->m_bIgnoreInput=false; + } + } + else + { + pClass->m_bIgnoreInput=false; + } + return 0; +} + +// Shared function to join the game that is the same whether we used the sign-in UI or not +void UIScene_JoinMenu::JoinGame(UIScene_JoinMenu* pClass) +{ + DWORD dwSignedInUsers = 0; + bool noPrivileges = false; + DWORD dwLocalUsersMask = 0; + bool isSignedInLive = true; + int iPadNotSignedInLive = -1; + + ProfileManager.SetLockedProfile(0); // TEMP! + + // If we're in SD mode, then only the primary player gets to play + if (app.IsLocalMultiplayerAvailable()) + { + for(unsigned int index = 0; index < XUSER_MAX_COUNT; ++index) + { + if(ProfileManager.IsSignedIn(index)) + { + if (isSignedInLive && !ProfileManager.IsSignedInLive(index)) + { + // Record the first non signed in live pad + iPadNotSignedInLive = index; + } + + if( !ProfileManager.AllowedToPlayMultiplayer(index) ) noPrivileges = true; + dwLocalUsersMask |= CGameNetworkManager::GetLocalPlayerMask(index); + isSignedInLive = isSignedInLive && ProfileManager.IsSignedInLive(index); + } + } + } + else + { + if(ProfileManager.IsSignedIn(ProfileManager.GetPrimaryPad())) + { + if( !ProfileManager.AllowedToPlayMultiplayer(ProfileManager.GetPrimaryPad()) ) noPrivileges = true; + dwLocalUsersMask |= CGameNetworkManager::GetLocalPlayerMask(ProfileManager.GetPrimaryPad()); + + isSignedInLive = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()); +#ifdef __PSVITA__ + if(CGameNetworkManager::usingAdhocMode() && SQRNetworkManager_AdHoc_Vita::GetAdhocStatus()) + isSignedInLive = true; +#endif + + } + } + + // If this is an online game but not all players are signed in to Live, stop! + if (!isSignedInLive) + { +#ifdef __ORBIS__ + // Check if PSN is unavailable because of age restriction + int npAvailability = ProfileManager.getNPAvailability(iPadNotSignedInLive); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + pClass->m_bIgnoreInput = false; + // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive if the npAvailability isn't SCE_OK + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive, NULL, NULL, app.GetStringTable()); + } + else +#endif + { + pClass->m_bIgnoreInput=false; + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + } + return; + } + + // Check if user-created content is allowed, as we cannot play multiplayer if it's not + bool noUGC = false; + BOOL pccAllowed = TRUE; + BOOL pccFriendsAllowed = TRUE; + +#if defined(__PS3__) || defined(__PSVITA__) + if(isSignedInLive) + { + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),false,&noUGC,NULL,NULL); + } +#else + ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); + if(!pccAllowed && !pccFriendsAllowed) noUGC = true; +#endif + + +#ifdef __PSVITA__ + if( CGameNetworkManager::usingAdhocMode() ) + { + noPrivileges = false; + noUGC = false; + } +#endif + + if(noUGC) + { + pClass->setVisible( true ); + pClass->m_bIgnoreInput=false; + + int messageText = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL; + if(dwSignedInUsers > 1) messageText = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL; + + ui.RequestUGCMessageBox(IDS_CONNECTION_FAILED, messageText); + } + else if(noPrivileges) + { + pClass->setVisible( true ); + pClass->m_bIgnoreInput=false; + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + } + else + { +#if defined(__ORBIS__) || defined(__PSVITA__) + bool chatRestricted = false; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),false,&chatRestricted,NULL,NULL); + if(chatRestricted) + { + ProfileManager.DisplaySystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION, ProfileManager.GetPrimaryPad() ); + } +#endif + CGameNetworkManager::eJoinGameResult result = g_NetworkManager.JoinGame( pClass->m_selectedSession, dwLocalUsersMask ); + + // Alert the app the we no longer want to be informed of ethernet connections + app.SetLiveLinkRequired( false ); + + if( result != CGameNetworkManager::JOINGAME_SUCCESS ) + { + int exitReasonStringId = -1; + switch(result) + { + case CGameNetworkManager::JOINGAME_FAIL_SERVER_FULL: + exitReasonStringId = IDS_DISCONNECTED_SERVER_FULL; + break; + } + + if( exitReasonStringId == -1 ) + { + ui.NavigateBack(pClass->m_iPad); + } + else + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox( IDS_CONNECTION_FAILED, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + exitReasonStringId = -1; + + ui.NavigateToHomeMenu(); + } + } + } +} + +void UIScene_JoinMenu::handleTimerComplete(int id) +{ + switch(id) + { + case UPDATE_PLAYERS_TIMER_ID: + { +#if TO_BE_IMPLEMENTED + PlayerUID selectedPlayerXUID = m_selectedSession->data.players[playersList.GetCurSel()]; + + bool success = g_NetworkManager.GetGameSessionInfo(m_iPad, m_selectedSession->sessionId,m_selectedSession); + + if( success ) + { + playersList.DeleteItems(0, playersList.GetItemCount()); + int selectedIndex = 0; + for(unsigned int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++i) + { + if( m_selectedSession->data.players[i] != NULL ) + { + if(m_selectedSession->data.players[i] == selectedPlayerXUID) selectedIndex = i; + playersList.InsertItems(i,1); +#ifndef _CONTENT_PACKAGE + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<data.szPlayers[i] ).c_str() ); + } + } + else + { + // Leave the loop when we hit the first NULL player + break; + } + } + playersList.SetCurSel(selectedIndex); + } +#endif + } + break; + }; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_JoinMenu.h b/Minecraft.Client/Common/UI/UIScene_JoinMenu.h new file mode 100644 index 00000000..817360ef --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_JoinMenu.h @@ -0,0 +1,98 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_JoinMenu : public UIScene +{ +private: + enum EControls + { + eControl_JoinGame, + eControl_GamePlayers + }; + + enum ELabels + { + eLabel_Difficulty, + eLabel_GameType, + eLabel_GamertagsOn, + eLabel_Structures, + eLabel_LevelType, + eLabel_PVP, + eLabel_Trust, + eLabel_TNTOn, + eLabel_FireOn, + + eLabel_COUNT + }; + + UIControl_Button m_buttonJoinGame; + UIControl_ButtonList m_buttonListPlayers; + + UIControl_Label m_labelLabels[eLabel_COUNT]; + UIControl_Label m_labelValues[eLabel_COUNT]; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttonJoinGame, "JoinGame") + UI_MAP_ELEMENT( m_buttonListPlayers, "GamePlayers") + + UI_MAP_ELEMENT( m_labelLabels[0], "Label0") + UI_MAP_ELEMENT( m_labelLabels[1], "Label1") + UI_MAP_ELEMENT( m_labelLabels[2], "Label2") + UI_MAP_ELEMENT( m_labelLabels[3], "Label3") + UI_MAP_ELEMENT( m_labelLabels[4], "Label4") + UI_MAP_ELEMENT( m_labelLabels[5], "Label5") + UI_MAP_ELEMENT( m_labelLabels[6], "Label6") + UI_MAP_ELEMENT( m_labelLabels[7], "Label7") + UI_MAP_ELEMENT( m_labelLabels[8], "Label8") + + UI_MAP_ELEMENT( m_labelValues[0], "Value0") + UI_MAP_ELEMENT( m_labelValues[1], "Value1") + UI_MAP_ELEMENT( m_labelValues[2], "Value2") + UI_MAP_ELEMENT( m_labelValues[3], "Value3") + UI_MAP_ELEMENT( m_labelValues[4], "Value4") + UI_MAP_ELEMENT( m_labelValues[5], "Value5") + UI_MAP_ELEMENT( m_labelValues[6], "Value6") + UI_MAP_ELEMENT( m_labelValues[7], "Value7") + UI_MAP_ELEMENT( m_labelValues[8], "Value8") + UI_END_MAP_ELEMENTS_AND_NAMES() + + FriendSessionInfo *m_selectedSession; + bool m_bIgnoreInput; + bool m_friendInfoRequestIssued; + bool m_friendInfoUpdatedOK; + bool m_friendInfoUpdatedERROR; + +public: + UIScene_JoinMenu(int iPad, void *initData, UILayer *parentLayer); + void tick(); + static void friendSessionUpdated(bool success, void *pParam); + static int ErrorDialogReturned(void *pParam, int iPad, const C4JStorage::EMessageResult); + + virtual void updateTooltips(); + virtual void updateComponents(); + + virtual EUIScene getSceneType() { return eUIScene_LoadMenu;} + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + virtual void handleFocusChange(F64 controlId, F64 childId); + virtual void handleTimerComplete(int id); + +protected: + void handlePress(F64 controlId, F64 childId); + + + void StartSharedLaunchFlow(); + +#ifdef _DURANGO + static void checkPrivilegeCallback(LPVOID lpParam, bool hasPrivilege, int iPad); +#endif + + static int StartGame_SignInReturned(void *pParam, bool, int); + static void JoinGame(UIScene_JoinMenu* pClass); +}; diff --git a/Minecraft.Client/Common/UI/UIScene_Keyboard.cpp b/Minecraft.Client/Common/UI/UIScene_Keyboard.cpp new file mode 100644 index 00000000..fb1cc301 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_Keyboard.cpp @@ -0,0 +1,181 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_Keyboard.h" + +#define KEYBOARD_DONE_TIMER_ID 0 +#define KEYBOARD_DONE_TIMER_TIME 100 + +UIScene_Keyboard::UIScene_Keyboard(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_EnterTextLabel.init(L"Enter Sign Text"); + + m_KeyboardTextInput.init(L"", -1); + m_KeyboardTextInput.SetCharLimit(15); + + m_ButtonSpace.init(L"Space", -1); + m_ButtonCursorLeft.init(L"Cursor Left", -1); + m_ButtonCursorRight.init(L"Cursor Right", -1); + m_ButtonCaps.init(L"Caps", -1); + m_ButtonDone.init(L"Done", 0); // only the done button needs an id, the others will never call back! + m_ButtonSymbols.init(L"Symbols", -1); + m_ButtonBackspace.init(L"Backspace", -1); + + // Initialise function keyboard Buttons and set alternative symbol button string + wstring label = L"Abc"; + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcInitFunctionButtons , 1 , value ); + + m_bKeyboardDonePressed = false; + + parentLayer->addComponent(iPad,eUIComponent_MenuBackground); +} + +UIScene_Keyboard::~UIScene_Keyboard() +{ + m_parentLayer->removeComponent(eUIComponent_MenuBackground); +} + +wstring UIScene_Keyboard::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1 && !m_parentLayer->IsFullscreenGroup()) + { + return L"KeyboardSplit"; + } + else + { + return L"Keyboard"; + } +} + +void UIScene_Keyboard::updateTooltips() +{ + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK, -1, -1); +} + +bool UIScene_Keyboard::allowRepeat(int key) +{ + // 4J - TomK - we want to allow X and Y repeats! + switch(key) + { + case ACTION_MENU_OK: + case ACTION_MENU_CANCEL: + case ACTION_MENU_A: + case ACTION_MENU_B: + case ACTION_MENU_PAUSEMENU: + //case ACTION_MENU_X: + //case ACTION_MENU_Y: + return false; + } + return true; +} + +void UIScene_Keyboard::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + IggyDataValue result; + IggyResult out; + + if(repeat || pressed) + { + switch(key) + { + case ACTION_MENU_CANCEL: + navigateBack(); + handled = true; + break; + case ACTION_MENU_X: // X + out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcBackspaceButtonPressed, 0 , NULL ); + handled = true; + break; + case ACTION_MENU_PAGEUP: // LT + out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSymbolButtonPressed, 0 , NULL ); + handled = true; + break; + case ACTION_MENU_Y: // Y + out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSpaceButtonPressed, 0 , NULL ); + handled = true; + break; + case ACTION_MENU_STICK_PRESS: // LS + out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcCapsButtonPressed, 0 , NULL ); + handled = true; + break; + case ACTION_MENU_LEFT_SCROLL: // LB + out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcCursorLeftButtonPressed, 0 , NULL ); + handled = true; + break; + case ACTION_MENU_RIGHT_SCROLL: // RB + out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcCursorRightButtonPressed, 0 , NULL ); + handled = true; + break; + case ACTION_MENU_PAUSEMENU: // Start + if(!m_bKeyboardDonePressed) + { + out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcDoneButtonPressed, 0 , NULL ); + + // kick off done timer + addTimer(KEYBOARD_DONE_TIMER_ID,KEYBOARD_DONE_TIMER_TIME); + m_bKeyboardDonePressed = true; + } + handled = true; + break; + } + } + + switch(key) + { + case ACTION_MENU_OK: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + sendInputToMovie(key, repeat, pressed, released); + handled = true; + break; + } +} + +void UIScene_Keyboard::handlePress(F64 controlId, F64 childId) +{ + if((int)controlId == 0) + { + // Done has been pressed. At this point we can query for the input string and pass it on to wherever it is needed. + // we can not query for m_KeyboardTextInput.getLabel() here because we're in an iggy callback so we need to wait a frame. + if(!m_bKeyboardDonePressed) + { + // kick off done timer + addTimer(KEYBOARD_DONE_TIMER_ID,KEYBOARD_DONE_TIMER_TIME); + m_bKeyboardDonePressed = true; + } + } +} + +void UIScene_Keyboard::handleTimerComplete(int id) +{ + if(id == KEYBOARD_DONE_TIMER_ID) + { + // remove timer + killTimer(KEYBOARD_DONE_TIMER_ID); + + // we're done here! + KeyboardDonePressed(); + } +} + +void UIScene_Keyboard::KeyboardDonePressed() +{ + // Debug + app.DebugPrintf("UI Keyboard - DONE - [%ls]\n", m_KeyboardTextInput.getLabel()); + + // ToDo: Keyboard can now pass on its final string value and close itself down + navigateBack(); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_Keyboard.h b/Minecraft.Client/Common/UI/UIScene_Keyboard.h new file mode 100644 index 00000000..f4e4c899 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_Keyboard.h @@ -0,0 +1,79 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_Keyboard : public UIScene +{ +private: + bool m_bKeyboardDonePressed; + +protected: + UIControl_Label m_EnterTextLabel; + UIControl_TextInput m_KeyboardTextInput; + UIControl_Button m_ButtonSpace, m_ButtonCursorLeft, m_ButtonCursorRight, m_ButtonCaps, m_ButtonDone, m_ButtonSymbols, m_ButtonBackspace; + + IggyName m_funcInitFunctionButtons; + IggyName m_funcCursorRightButtonPressed, m_funcCursorLeftButtonPressed, m_funcCapsButtonPressed, m_funcBackspaceButtonPressed; + IggyName m_funcSpaceButtonPressed, m_funcSymbolButtonPressed, m_funcDoneButtonPressed; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT(m_EnterTextLabel, "EnterTextLabel") + UI_MAP_ELEMENT(m_KeyboardTextInput, "KeyboardTextInput") + + UI_MAP_ELEMENT(m_ButtonSpace, "Button_space") + UI_MAP_ELEMENT(m_ButtonCursorLeft, "Button_CursorLeft") + UI_MAP_ELEMENT(m_ButtonCursorRight, "Button_CursorRight") + UI_MAP_ELEMENT(m_ButtonCaps, "Button_Caps") + UI_MAP_ELEMENT(m_ButtonDone, "Button_Done") + UI_MAP_ELEMENT(m_ButtonSymbols, "Button_symbols") + UI_MAP_ELEMENT(m_ButtonBackspace, "Button_bspace") + + UI_MAP_NAME(m_funcInitFunctionButtons, L"InitFunctionButtons"); + + UI_MAP_NAME(m_funcCursorRightButtonPressed, L"CursorRightButtonPressed"); + UI_MAP_NAME(m_funcCursorLeftButtonPressed, L"CursorLeftButtonPressed"); + UI_MAP_NAME(m_funcCapsButtonPressed, L"CapsButtonPressed"); + UI_MAP_NAME(m_funcBackspaceButtonPressed, L"BackspaceButtonPressed"); + UI_MAP_NAME(m_funcSpaceButtonPressed, L"SpaceButtonPressed"); + UI_MAP_NAME(m_funcSymbolButtonPressed, L"SymbolButtonPressed"); + UI_MAP_NAME(m_funcDoneButtonPressed, L"DoneButtonPressed"); + UI_END_MAP_ELEMENTS_AND_NAMES() + +public: + UIScene_Keyboard(int iPad, void *initData, UILayer *parentLayer); + ~UIScene_Keyboard(); + + virtual void updateTooltips(); + + virtual bool allowRepeat(int key); + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + virtual void handleTimerComplete(int id); + +protected: + void handlePress(F64 controlId, F64 childId); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +private: + void KeyboardDonePressed(); + +public: + virtual EUIScene getSceneType() { return eUIScene_Keyboard;} + + // Returns true if this scene handles input + //virtual bool stealsFocus() { return false; } + + // Returns true if this scene has focus for the pad passed in + //virtual bool hasFocus(int iPad) { return false; } + // Returns true if this scene has focus for the pad passed in +#ifndef __PS3__ + virtual bool hasFocus(int iPad) { return bHasFocus; } +#endif + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return false; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_LaunchMoreOptionsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_LaunchMoreOptionsMenu.cpp new file mode 100644 index 00000000..6d472b50 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_LaunchMoreOptionsMenu.cpp @@ -0,0 +1,462 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_LaunchMoreOptionsMenu.h" + +#define GAME_CREATE_ONLINE_TIMER_ID 0 +#define GAME_CREATE_ONLINE_TIMER_TIME 100 + +#ifdef _LARGE_WORLDS +int m_iWorldSizeTitleA[4] = +{ + IDS_WORLD_SIZE_TITLE_CLASSIC, + IDS_WORLD_SIZE_TITLE_SMALL, + IDS_WORLD_SIZE_TITLE_MEDIUM, + IDS_WORLD_SIZE_TITLE_LARGE, +}; +#endif + +UIScene_LaunchMoreOptionsMenu::UIScene_LaunchMoreOptionsMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_params = (LaunchMoreOptionsMenuInitData *)initData; + + m_labelWorldOptions.init(app.GetString(IDS_WORLD_OPTIONS)); + + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = m_params->bGenerateOptions?0:1; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetMenuType , 1 , value ); + + m_bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_params->iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_params->iPad); + + bool bOnlineGame, bInviteOnly, bAllowFriendsOfFriends; + bOnlineGame = m_params->bOnlineGame; + bInviteOnly = m_params->bInviteOnly; + bAllowFriendsOfFriends = m_params->bAllowFriendsOfFriends; + + // 4J-PB - to stop an offline game being able to select the online flag + if(ProfileManager.IsSignedInLive(m_params->iPad) == false) + { + m_checkboxes[eLaunchCheckbox_Online].SetEnable(false); + } + + if ( m_params->bOnlineSettingChangedBySystem && !m_bMultiplayerAllowed ) + { + // 4J-JEV: Disable and uncheck these boxes if they can't play multiplayer. + m_checkboxes[eLaunchCheckbox_Online].SetEnable(false); + m_checkboxes[eLaunchCheckbox_InviteOnly].SetEnable(false); + m_checkboxes[eLaunchCheckbox_AllowFoF].SetEnable(false); + + bOnlineGame = bInviteOnly = bAllowFriendsOfFriends = false; + } + else if(!m_params->bOnlineGame) + { + + m_checkboxes[eLaunchCheckbox_InviteOnly].SetEnable(false); + m_checkboxes[eLaunchCheckbox_AllowFoF].SetEnable(false); + } + + m_checkboxes[eLaunchCheckbox_Online].init(app.GetString(IDS_ONLINE_GAME),eLaunchCheckbox_Online,bOnlineGame); + m_checkboxes[eLaunchCheckbox_InviteOnly].init(app.GetString(IDS_INVITE_ONLY),eLaunchCheckbox_InviteOnly,bInviteOnly); + m_checkboxes[eLaunchCheckbox_AllowFoF].init(app.GetString(IDS_ALLOWFRIENDSOFFRIENDS),eLaunchCheckbox_AllowFoF,bAllowFriendsOfFriends); + m_checkboxes[eLaunchCheckbox_PVP].init(app.GetString(IDS_PLAYER_VS_PLAYER),eLaunchCheckbox_PVP,m_params->bPVP); + m_checkboxes[eLaunchCheckbox_TrustSystem].init(app.GetString(IDS_TRUST_PLAYERS),eLaunchCheckbox_TrustSystem,m_params->bTrust); + m_checkboxes[eLaunchCheckbox_FireSpreads].init(app.GetString(IDS_FIRE_SPREADS),eLaunchCheckbox_FireSpreads,m_params->bFireSpreads); + m_checkboxes[eLaunchCheckbox_TNT].init(app.GetString(IDS_TNT_EXPLODES),eLaunchCheckbox_TNT,m_params->bTNT); + m_checkboxes[eLaunchCheckbox_HostPrivileges].init(app.GetString(IDS_HOST_PRIVILEGES),eLaunchCheckbox_HostPrivileges,m_params->bHostPrivileges); + m_checkboxes[eLaunchCheckbox_ResetNether].init(app.GetString(IDS_RESET_NETHER),eLaunchCheckbox_ResetNether,m_params->bResetNether); + m_checkboxes[eLaunchCheckbox_Structures].init(app.GetString(IDS_GENERATE_STRUCTURES),eLaunchCheckbox_Structures,m_params->bStructures); + m_checkboxes[eLaunchCheckbox_FlatWorld].init(app.GetString(IDS_SUPERFLAT_WORLD),eLaunchCheckbox_FlatWorld,m_params->bFlatWorld); + m_checkboxes[eLaunchCheckbox_BonusChest].init(app.GetString(IDS_BONUS_CHEST),eLaunchCheckbox_BonusChest,m_params->bBonusChest); + + if(m_loadedResolution == eSceneResolution_1080) + { +#ifdef _LARGE_WORLDS + m_labelGameOptions.init( app.GetString(IDS_GAME_OPTIONS) ); + m_labelSeed.init(app.GetString(IDS_CREATE_NEW_WORLD_SEED)); + m_labelRandomSeed.init(app.GetString(IDS_CREATE_NEW_WORLD_RANDOM_SEED)); + m_editSeed.init(m_params->seed, eControl_EditSeed); + m_labelWorldSize.init(app.GetString(IDS_WORLD_SIZE)); + m_sliderWorldSize.init(app.GetString(m_iWorldSizeTitleA[m_params->worldSize]),eControl_WorldSize,0,3,m_params->worldSize); + + m_checkboxes[eLaunchCheckbox_DisableSaving].init( app.GetString(IDS_DISABLE_SAVING), eLaunchCheckbox_DisableSaving, m_params->bDisableSaving ); +#endif + } + + // Only the Xbox 360 needs a reset nether + // 4J-PB - PS3 needs it now + // #ifndef _XBOX + // if(!m_params->bGenerateOptions) removeControl( &m_checkboxes[eLaunchCheckbox_ResetNether], false ); + // #endif + + // set the default text +#ifdef _LARGE_WORLDS + wstring wsText=L""; + if(m_params->bGenerateOptions) + { + wsText = app.GetString(IDS_GAMEOPTION_SEED); + } + else + { + wsText = app.GetString(IDS_GAMEOPTION_ONLINE); + } +#else + wstring wsText=app.GetString(IDS_GAMEOPTION_ONLINE); +#endif + EHTMLFontSize size = eHTMLSize_Normal; + if(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) + { + size = eHTMLSize_Splitscreen; + } + wchar_t startTags[64]; + swprintf(startTags,64,L"",app.GetHTMLColour(eHTMLColor_White)); + wsText= startTags + wsText; + m_labelDescription.init(wsText); + + addTimer(GAME_CREATE_ONLINE_TIMER_ID,GAME_CREATE_ONLINE_TIMER_TIME); + +#ifdef __PSVITA__ + ui.TouchBoxRebuild(this); +#endif + + m_bIgnoreInput = false; + m_tabIndex = 0; +} + +void UIScene_LaunchMoreOptionsMenu::updateTooltips() +{ + int changeTabTooltip = -1; + +#ifdef _LARGE_WORLDS + if (m_loadedResolution == eSceneResolution_1080 && m_params->bGenerateOptions) + { + // Set tooltip for change tab (only two tabs) + if (m_tabIndex == 0) + { + changeTabTooltip = IDS_GAME_OPTIONS; + } + else + { + changeTabTooltip = IDS_WORLD_OPTIONS; + } + } +#endif + + // If there's a change tab tooltip, left bumper symbol should show but not the text (-2) + int lb = changeTabTooltip == -1 ? -1 : -2; + + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, -1, -1, -1, -1, lb, changeTabTooltip); +} + +void UIScene_LaunchMoreOptionsMenu::updateComponents() +{ + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); +#ifdef _LARGE_WORLDS + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); +#else + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); +#endif +} + +wstring UIScene_LaunchMoreOptionsMenu::getMoviePath() +{ + return L"LaunchMoreOptionsMenu"; +} + +void UIScene_LaunchMoreOptionsMenu::tick() +{ + UIScene::tick(); + + bool bMultiplayerAllowed = ProfileManager.IsSignedInLive(m_params->iPad) && ProfileManager.AllowedToPlayMultiplayer(m_params->iPad); + + if (bMultiplayerAllowed != m_bMultiplayerAllowed) + { + m_checkboxes[ eLaunchCheckbox_Online].SetEnable(bMultiplayerAllowed); + m_checkboxes[eLaunchCheckbox_InviteOnly].SetEnable(bMultiplayerAllowed); + m_checkboxes[ eLaunchCheckbox_AllowFoF].SetEnable(bMultiplayerAllowed); + + if (bMultiplayerAllowed) + { + m_checkboxes[ eLaunchCheckbox_Online].setChecked(true); + m_checkboxes[eLaunchCheckbox_AllowFoF].setChecked(true); + } + + m_bMultiplayerAllowed = bMultiplayerAllowed; + } +} + +void UIScene_LaunchMoreOptionsMenu::handleDestroy() +{ +#ifdef __PSVITA__ + app.DebugPrintf("missing InputManager.DestroyKeyboard on Vita !!!!!!\n"); +#endif + + // so shut down the keyboard if it is displayed +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO) + InputManager.DestroyKeyboard(); +#endif +} + +void UIScene_LaunchMoreOptionsMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if(m_bIgnoreInput) return; + + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + navigateBack(); + handled = true; + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + // 4J-JEV: Inform user why their game must be offline. +#if defined _XBOX_ONE + { + UIControl_CheckBox *checkboxOnline = &m_checkboxes[eLaunchCheckbox_Online]; + if ( pressed && controlHasFocus( checkboxOnline->getId()) && !checkboxOnline->IsEnabled() ) + { + UINT uiIDA[1] = { IDS_CONFIRM_OK }; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + } + } +#endif + + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + case ACTION_MENU_OTHER_STICK_UP: + case ACTION_MENU_OTHER_STICK_DOWN: + sendInputToMovie(key, repeat, pressed, released); + handled = true; + break; + case ACTION_MENU_LEFT_SCROLL: + case ACTION_MENU_RIGHT_SCROLL: + if(pressed && m_loadedResolution == eSceneResolution_1080) + { + // Toggle tab index + m_tabIndex = m_tabIndex == 0 ? 1 : 0; + updateTooltips(); + IggyDataValue result; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcChangeTab , 0 , NULL ); + } + break; + } +} + +void UIScene_LaunchMoreOptionsMenu::handleCheckboxToggled(F64 controlId, bool selected) +{ + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + switch((EControls)((int)controlId)) + { + case eLaunchCheckbox_Online: + m_params->bOnlineGame = selected; + break; + case eLaunchCheckbox_InviteOnly: + m_params->bInviteOnly = selected; + break; + case eLaunchCheckbox_AllowFoF: + m_params->bAllowFriendsOfFriends = selected; + break; + case eLaunchCheckbox_PVP: + m_params->bPVP = selected; + break; + case eLaunchCheckbox_TrustSystem: + m_params->bTrust = selected; + break; + case eLaunchCheckbox_FireSpreads: + m_params->bFireSpreads = selected; + break; + case eLaunchCheckbox_TNT: + m_params->bTNT = selected; + break; + case eLaunchCheckbox_HostPrivileges: + m_params->bHostPrivileges = selected; + break; + case eLaunchCheckbox_ResetNether: + m_params->bResetNether = selected; + break; + case eLaunchCheckbox_Structures: + m_params->bStructures = selected; + break; + case eLaunchCheckbox_FlatWorld: + m_params->bFlatWorld = selected; + break; + case eLaunchCheckbox_BonusChest: + m_params->bBonusChest = selected; + break; + case eLaunchCheckbox_DisableSaving: + m_params->bDisableSaving = selected; + break; + }; +} + +void UIScene_LaunchMoreOptionsMenu::handleFocusChange(F64 controlId, F64 childId) +{ + int stringId = 0; + switch((int)controlId) + { + case eLaunchCheckbox_Online: + stringId = IDS_GAMEOPTION_ONLINE; + break; + case eLaunchCheckbox_InviteOnly: + stringId = IDS_GAMEOPTION_INVITEONLY; + break; + case eLaunchCheckbox_AllowFoF: + stringId = IDS_GAMEOPTION_ALLOWFOF; + break; + case eLaunchCheckbox_PVP: + stringId = IDS_GAMEOPTION_PVP; + break; + case eLaunchCheckbox_TrustSystem: + stringId = IDS_GAMEOPTION_TRUST; + break; + case eLaunchCheckbox_FireSpreads: + stringId = IDS_GAMEOPTION_FIRE_SPREADS; + break; + case eLaunchCheckbox_TNT: + stringId = IDS_GAMEOPTION_TNT_EXPLODES; + break; + case eLaunchCheckbox_HostPrivileges: + stringId = IDS_GAMEOPTION_HOST_PRIVILEGES; + break; + case eLaunchCheckbox_ResetNether: + stringId = IDS_GAMEOPTION_RESET_NETHER; + break; + case eLaunchCheckbox_Structures: + stringId = IDS_GAMEOPTION_STRUCTURES; + break; + case eLaunchCheckbox_FlatWorld: + stringId = IDS_GAMEOPTION_SUPERFLAT; + break; + case eLaunchCheckbox_BonusChest: + stringId = IDS_GAMEOPTION_BONUS_CHEST; + break; +#ifdef _LARGE_WORLDS + case eControl_EditSeed: + stringId = IDS_GAMEOPTION_SEED; + break; + case eControl_WorldSize: + stringId = IDS_GAMEOPTION_WORLD_SIZE; + break; + case eLaunchCheckbox_DisableSaving: + stringId = IDS_GAMEOPTION_DISABLE_SAVING; + break; +#endif + }; + + wstring wsText=app.GetString(stringId); + EHTMLFontSize size = eHTMLSize_Normal; + if(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) + { + size = eHTMLSize_Splitscreen; + } + wchar_t startTags[64]; + swprintf(startTags,64,L"",app.GetHTMLColour(eHTMLColor_White)); + wsText= startTags + wsText; + + m_labelDescription.setLabel(wsText); +} + +void UIScene_LaunchMoreOptionsMenu::handleTimerComplete(int id) +{ + /*switch(id) //4J-JEV: Moved this over to the tick. + { + case GAME_CREATE_ONLINE_TIMER_ID: + { + bool bMultiplayerAllowed + = ProfileManager.IsSignedInLive(m_params->iPad) + && ProfileManager.AllowedToPlayMultiplayer(m_params->iPad); + + if (bMultiplayerAllowed != m_bMultiplayerAllowed) + { + m_checkboxes[ eLaunchCheckbox_Online].SetEnable(bMultiplayerAllowed); + m_checkboxes[eLaunchCheckbox_InviteOnly].SetEnable(bMultiplayerAllowed); + m_checkboxes[ eLaunchCheckbox_AllowFoF].SetEnable(bMultiplayerAllowed); + + m_checkboxes[eLaunchCheckbox_Online].setChecked(bMultiplayerAllowed); + + m_bMultiplayerAllowed = bMultiplayerAllowed; + } + } + break; + };*/ +} + +int UIScene_LaunchMoreOptionsMenu::KeyboardCompleteSeedCallback(LPVOID lpParam,bool bRes) +{ + UIScene_LaunchMoreOptionsMenu *pClass=(UIScene_LaunchMoreOptionsMenu *)lpParam; + pClass->m_bIgnoreInput=false; + // 4J HEG - No reason to set value if keyboard was cancelled + if (bRes) + { + uint16_t pchText[128]; + ZeroMemory(pchText, 128 * sizeof(uint16_t) ); + InputManager.GetText(pchText); + pClass->m_editSeed.setLabel((wchar_t *)pchText); + pClass->m_params->seed = (wchar_t *)pchText; + } + return 0; +} + +void UIScene_LaunchMoreOptionsMenu::handlePress(F64 controlId, F64 childId) +{ + if(m_bIgnoreInput) return; + + switch((int)controlId) + { + case eControl_EditSeed: + { + m_bIgnoreInput=true; +#ifdef __PS3__ + int language = XGetLanguage(); + switch(language) + { + case XC_LANGUAGE_JAPANESE: + case XC_LANGUAGE_KOREAN: + case XC_LANGUAGE_TCHINESE: + InputManager.RequestKeyboard(app.GetString(IDS_CREATE_NEW_WORLD_SEED),m_editSeed.getLabel(),(DWORD)0,60,&UIScene_LaunchMoreOptionsMenu::KeyboardCompleteSeedCallback,this,C_4JInput::EKeyboardMode_Default); + break; + default: + // 4J Stu - Use a different keyboard for non-asian languages so we don't have prediction on + InputManager.RequestKeyboard(app.GetString(IDS_CREATE_NEW_WORLD_SEED),m_editSeed.getLabel(),(DWORD)0,60,&UIScene_LaunchMoreOptionsMenu::KeyboardCompleteSeedCallback,this,C_4JInput::EKeyboardMode_Alphabet_Extended); + break; + } +#else + InputManager.RequestKeyboard(app.GetString(IDS_CREATE_NEW_WORLD_SEED),m_editSeed.getLabel(),(DWORD)0,60,&UIScene_LaunchMoreOptionsMenu::KeyboardCompleteSeedCallback,this,C_4JInput::EKeyboardMode_Default); +#endif + } + break; + } +} + + +void UIScene_LaunchMoreOptionsMenu::handleSliderMove(F64 sliderId, F64 currentValue) +{ + int value = (int)currentValue; + switch((int)sliderId) + { + case eControl_WorldSize: +#ifdef _LARGE_WORLDS + m_sliderWorldSize.handleSliderMove(value); + m_params->worldSize = value; + m_sliderWorldSize.setLabel(app.GetString(m_iWorldSizeTitleA[value])); +#endif + break; + } +} diff --git a/Minecraft.Client/Common/UI/UIScene_LaunchMoreOptionsMenu.h b/Minecraft.Client/Common/UI/UIScene_LaunchMoreOptionsMenu.h new file mode 100644 index 00000000..62d75115 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_LaunchMoreOptionsMenu.h @@ -0,0 +1,125 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_LaunchMoreOptionsMenu : public UIScene +{ +private: + enum EControls + { + // Add all checkboxes at the start as they also index into a checkboxes array + eLaunchCheckbox_Online, + eLaunchCheckbox_InviteOnly, + eLaunchCheckbox_AllowFoF, + eLaunchCheckbox_PVP, + eLaunchCheckbox_TrustSystem, + eLaunchCheckbox_FireSpreads, + eLaunchCheckbox_TNT, + eLaunchCheckbox_HostPrivileges, + eLaunchCheckbox_ResetNether, + eLaunchCheckbox_Structures, + eLaunchCheckbox_FlatWorld, + eLaunchCheckbox_BonusChest, + eLaunchCheckbox_DisableSaving, + + eLaunchCheckboxes_Count, + + eControl_EditSeed, + eControl_WorldSize, + }; + + UIControl m_gameOptions, m_worldOptions; + UIControl_CheckBox m_checkboxes[eLaunchCheckboxes_Count]; + UIControl_Label m_labelWorldOptions, m_labelGameOptions, m_labelDescription; + UIControl_Label m_labelSeed, m_labelRandomSeed, m_labelWorldSize; + UIControl_TextInput m_editSeed; + UIControl_Slider m_sliderWorldSize; + IggyName m_funcSetMenuType, m_funcChangeTab; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + if(m_loadedResolution == eSceneResolution_1080) + { + UI_MAP_ELEMENT( m_labelGameOptions, "LabelGame") + UI_MAP_ELEMENT( m_labelWorldOptions, "LabelWorld") + + UI_MAP_ELEMENT( m_gameOptions, "GameOptions") + UI_BEGIN_MAP_CHILD_ELEMENTS(m_gameOptions) + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_Online], "CheckboxOnline") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_InviteOnly], "CheckboxInviteOnly") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_AllowFoF], "CheckboxAllowFoF") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_PVP], "CheckboxPVP") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_TrustSystem], "CheckboxTrustSystem") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_FireSpreads], "CheckboxFireSpreads") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_TNT], "CheckboxTNT") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_HostPrivileges], "CheckboxHostPrivileges") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_ResetNether], "CheckboxResetNether") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_DisableSaving], "CheckboxDisableSaving") + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_ELEMENT(m_worldOptions, "WorldOptions") + UI_BEGIN_MAP_CHILD_ELEMENTS(m_worldOptions) + UI_MAP_ELEMENT( m_labelSeed, "Seed") + UI_MAP_ELEMENT( m_editSeed, "EditSeed") + UI_MAP_ELEMENT( m_labelRandomSeed, "RandomSeed") + UI_MAP_ELEMENT( m_labelWorldSize, "WorldSize") + UI_MAP_ELEMENT( m_sliderWorldSize, "WorldSizeSlider") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_Structures], "CheckboxStructures") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_BonusChest], "CheckboxBonusChest") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_FlatWorld], "CheckboxFlatWorld") + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_NAME( m_funcChangeTab, L"ChangeTab") + } + else + { + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_Online], "CheckboxOnline") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_InviteOnly], "CheckboxInviteOnly") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_AllowFoF], "CheckboxAllowFoF") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_PVP], "CheckboxPVP") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_TrustSystem], "CheckboxTrustSystem") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_FireSpreads], "CheckboxFireSpreads") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_TNT], "CheckboxTNT") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_HostPrivileges], "CheckboxHostPrivileges") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_ResetNether], "CheckboxResetNether") + + UI_MAP_ELEMENT( m_labelWorldOptions, "WorldOptions") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_Structures], "CheckboxStructures") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_FlatWorld], "CheckboxFlatWorld") + UI_MAP_ELEMENT( m_checkboxes[eLaunchCheckbox_BonusChest], "CheckboxBonusChest") + } + + UI_MAP_ELEMENT( m_labelDescription, "Description") + + UI_MAP_NAME( m_funcSetMenuType, L"SetMenuType") + UI_END_MAP_ELEMENTS_AND_NAMES() + + LaunchMoreOptionsMenuInitData *m_params; + bool m_bMultiplayerAllowed; + bool m_bIgnoreInput; + bool m_tabIndex; + +public: + UIScene_LaunchMoreOptionsMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual void updateTooltips(); + virtual void updateComponents(); + + virtual EUIScene getSceneType() { return eUIScene_LaunchMoreOptionsMenu;} + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + virtual void tick(); + virtual void handleDestroy(); + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + virtual void handleFocusChange(F64 controlId, F64 childId); + virtual void handleTimerComplete(int id); + static int KeyboardCompleteSeedCallback(LPVOID lpParam,const bool bRes); + virtual void handlePress(F64 controlId, F64 childId); + virtual void handleSliderMove(F64 sliderId, F64 currentValue); + +protected: + void handleCheckboxToggled(F64 controlId, bool selected); +}; diff --git a/Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.cpp new file mode 100644 index 00000000..80db57f8 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.cpp @@ -0,0 +1,1045 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_LeaderboardsMenu.h" +#include "..\Leaderboards\LeaderboardManager.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" + +#define PLAYER_ONLINE_TIMER_ID 0 +#define PLAYER_ONLINE_TIMER_TIME 100 + +// if the value is greater than 32000, it's an xzp icon that needs displayed, rather than the game icon +const int UIScene_LeaderboardsMenu::TitleIcons[UIScene_LeaderboardsMenu::NUM_LEADERBOARDS][7] = +{ + { UIControl_LeaderboardList::e_ICON_TYPE_WALKED, UIControl_LeaderboardList::e_ICON_TYPE_FALLEN, Item::minecart_Id, Item::boat_Id, NULL }, + { Tile::dirt_Id, Tile::stoneBrick_Id, Tile::sand_Id, Tile::rock_Id, Tile::gravel_Id, Tile::clay_Id, Tile::obsidian_Id }, + { Item::egg_Id, Item::wheat_Id, Tile::mushroom1_Id, Tile::reeds_Id, Item::milk_Id, Tile::pumpkin_Id, NULL }, + { UIControl_LeaderboardList::e_ICON_TYPE_ZOMBIE, UIControl_LeaderboardList::e_ICON_TYPE_SKELETON, UIControl_LeaderboardList::e_ICON_TYPE_CREEPER, UIControl_LeaderboardList::e_ICON_TYPE_SPIDER, UIControl_LeaderboardList::e_ICON_TYPE_SPIDERJOKEY, UIControl_LeaderboardList::e_ICON_TYPE_ZOMBIEPIGMAN, UIControl_LeaderboardList::e_ICON_TYPE_SLIME }, +}; +const UIScene_LeaderboardsMenu::LeaderboardDescriptor UIScene_LeaderboardsMenu::LEADERBOARD_DESCRIPTORS[UIScene_LeaderboardsMenu::NUM_LEADERBOARDS][4] = { + { + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 4, true, IDS_LEADERBOARD_TRAVELLING_PEACEFUL), // Travelling Peaceful + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 4, true, IDS_LEADERBOARD_TRAVELLING_EASY), // Travelling Easy + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 4, true, IDS_LEADERBOARD_TRAVELLING_NORMAL), // Travelling Normal + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 4, true, IDS_LEADERBOARD_TRAVELLING_HARD), // Travelling Hard + }, + { + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 7, false, IDS_LEADERBOARD_MINING_BLOCKS_PEACEFUL), // Mining Peaceful + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 7, false, IDS_LEADERBOARD_MINING_BLOCKS_EASY), // Mining Easy + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 7, false, IDS_LEADERBOARD_MINING_BLOCKS_NORMAL), // Mining Normal + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 7, false, IDS_LEADERBOARD_MINING_BLOCKS_HARD), // Mining Hard + }, + { + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 6, false, IDS_LEADERBOARD_FARMING_PEACEFUL), // Farming Peaceful + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 6, false, IDS_LEADERBOARD_FARMING_EASY), // Farming Easy + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 6, false, IDS_LEADERBOARD_FARMING_NORMAL), // Farming Normal + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 6, false, IDS_LEADERBOARD_FARMING_HARD), // Farming Hard + }, + { + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 0, false, -1), // + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 7, false, IDS_LEADERBOARD_KILLS_EASY), // Kills Easy + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 7, false, IDS_LEADERBOARD_KILLS_NORMAL), // Kills Normal + UIScene_LeaderboardsMenu::LeaderboardDescriptor( 7, false, IDS_LEADERBOARD_KILLS_HARD), // Kills Hard + }, +}; + +UIScene_LeaderboardsMenu::UIScene_LeaderboardsMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_bReady=false; + + m_bPopulatedOnce = false; + + m_newTop = m_newSel = -1; + m_isProcessingStatsRead = false; + // Ignore input until we're retrieved stats, or functions will be called in here after we've backed out of the scene + m_bIgnoreInput=true; + + // Alert the app the we want to be informed of ethernet connections + app.SetLiveLinkRequired( true ); + + LeaderboardManager::Instance()->OpenSession(); + + //GetFriends(); + + m_currentLeaderboard = 0; + m_currentDifficulty = 2; + SetLeaderboardHeader(); + m_currentFilter = LeaderboardManager::eFM_Friends; + + wchar_t filterBuffer[40]; + swprintf(filterBuffer, 40, L"%ls%ls", app.GetString(IDS_LEADERBOARD_FILTER), app.GetString(IDS_LEADERBOARD_FILTER_FRIENDS)); + m_labelFilter.init(filterBuffer); + + wchar_t entriesBuffer[40]; + swprintf(entriesBuffer, 40, L"%ls%i", app.GetString(IDS_LEADERBOARD_ENTRIES), 0); + m_labelEntries.init(entriesBuffer); + + ReadStats(-1); + +#if ( defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ ) + addTimer( PLAYER_ONLINE_TIMER_ID, PLAYER_ONLINE_TIMER_TIME ); +#endif +} + +UIScene_LeaderboardsMenu::~UIScene_LeaderboardsMenu() +{ + LeaderboardManager::Instance()->CancelOperation(); + LeaderboardManager::Instance()->CloseSession(); + + // Alert the app the we no longer want to be informed of ethernet connections + app.SetLiveLinkRequired( false ); +} + +void UIScene_LeaderboardsMenu::updateTooltips() +{ + int iTooltipFriendRequest=-1; + int iTooltipGamerCardOrProfile=-1; + +#ifdef _DURANGO + //if( m_leaderboard.m_entries.size() > 0 ) + if(m_leaderboard.m_totalEntryCount > 0) + { + unsigned int selection = m_newSel; + + // If the selected user is me, don't show Send Friend Request, and show the gamer profile, not the gamer card + + // Check that the index is actually within range of the data we've got before accessing the m_leaderboard.m_entries array + int idx = selection - GetEntryStartIndex(); + if( ( idx < 0 ) || ( idx >= m_leaderboard.m_entries.size() ) ) + { + return; + } + if(m_leaderboard.m_entries[idx].m_bPlayer) + { + iTooltipGamerCardOrProfile=IDS_TOOLTIPS_VIEW_GAMERPROFILE; + } + else + { + iTooltipGamerCardOrProfile=IDS_TOOLTIPS_VIEW_GAMERCARD; + +#ifdef _XBOX + // if we're on the friends filter, then don't show the Send Friend Request + if(!m_currentFilter == LeaderboardManager::eFM_Friends) +#endif + { + // check the entry we're on + if( m_leaderboard.m_entries.size() > 0 ) + { + if( selection >= GetEntryStartIndex() && + selection < (GetEntryStartIndex() + m_leaderboard.m_entries.size()) ) + { +#ifdef _XBOX + if( (m_leaderboard.m_entries[selection - (m_leaderboard.m_entryStartIndex-1)].m_bFriend==false) + && (m_leaderboard.m_entries[selection - (m_leaderboard.m_entryStartIndex-1)].m_bRequestedFriend==false)) +#endif + { + iTooltipFriendRequest=IDS_TOOLTIPS_SEND_FRIEND_REQUEST; + } + } + } + } + } + } +#endif + + ui.SetTooltips(m_iPad, iTooltipFriendRequest, IDS_TOOLTIPS_BACK, IDS_TOOLTIPS_CHANGE_FILTER, iTooltipGamerCardOrProfile); +} + +void UIScene_LeaderboardsMenu::updateComponents() +{ + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,!app.GetGameStarted()); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); +} + +wstring UIScene_LeaderboardsMenu::getMoviePath() +{ + return L"LeaderboardMenu"; +} + +void UIScene_LeaderboardsMenu::handleReload() +{ + // We don't allow this in splitscreen, so just go back + navigateBack(); +} + +void UIScene_LeaderboardsMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if(m_bIgnoreInput && key != ACTION_MENU_CANCEL) return; + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + // If this is not a press, do not action + if (!pressed) return; + + + /*app.DebugPrintf( + " m_newSel = %i [bottomId] = %i [topId] = %i, [size] = %i\n", + m_newSel, + m_leaderboard.m_entries.size() == 0 ? 0 : m_leaderboard.m_entries[m_leaderboard.m_entries.size()-1].m_row, + GetEntryStartIndex(), + m_leaderboard.m_entries.size() + );*/ + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + navigateBack(); + handled = true; + } + break; + case ACTION_MENU_UP: + --m_newSel; + if(m_newSel<0)m_newSel = 0; + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_DOWN: + ++m_newSel; + if(m_newSel>=m_leaderboard.m_totalEntryCount) m_newSel = m_leaderboard.m_totalEntryCount - 1; + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_LEFT_SCROLL: + case ACTION_MENU_RIGHT_SCROLL: + { + //Do nothing if a stats read is currently in progress, otherwise the system complains about to many read requests + if( pressed && m_bPopulatedOnce && LeaderboardManager::Instance()->isIdle() ) + { + //CD - Added for audio + ui.PlayUISFX(eSFX_Scroll); + + if( key == ACTION_MENU_RIGHT_SCROLL ) + { + ++m_currentDifficulty; + if( m_currentDifficulty == 4 ) + m_currentDifficulty = 0; + + if( m_currentLeaderboard == LEADERBOARD_KILLS_POSITION && m_currentDifficulty == 0 ) + m_currentDifficulty = 1; + } + else + { + if( m_currentDifficulty == 0 ) + m_currentDifficulty = 4; + --m_currentDifficulty; + + if( m_currentLeaderboard == LEADERBOARD_KILLS_POSITION && m_currentDifficulty == 0 ) + m_currentDifficulty = 3; + } + + SetLeaderboardHeader(); + + ReadStats(-1); + ui.PlayUISFX(eSFX_Press); + } + + handled = true; + } + break; + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + { + //Do nothing if a stats read is currently in progress, otherwise the system complains about to many read requests + if ( pressed && m_bPopulatedOnce && LeaderboardManager::Instance()->isIdle() ) + { + //CD - Added for audio + ui.PlayUISFX(eSFX_Scroll); + + m_bReady=false; + if(key == ACTION_MENU_RIGHT) + { + ++m_currentLeaderboard; + if( m_currentLeaderboard == NUM_LEADERBOARDS ) + m_currentLeaderboard = 0; + } + else + { + if( m_currentLeaderboard == 0 ) + m_currentLeaderboard = NUM_LEADERBOARDS; + --m_currentLeaderboard; + } + + if( m_currentLeaderboard == LEADERBOARD_KILLS_POSITION && m_currentDifficulty == 0 ) + m_currentDifficulty = 1; + + SetLeaderboardHeader(); + + ReadStats(-1); + ui.PlayUISFX(eSFX_Press); + } + handled = true; + } + break; + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + { + //Do nothing if a stats read is currently in progress, otherwise the system complains about to many read requests + if( pressed && m_bPopulatedOnce && LeaderboardManager::Instance()->isIdle() ) + { + //CD - Added for audio + ui.PlayUISFX(eSFX_Scroll); + + if( m_leaderboard.m_totalEntryCount <= 10 ) + break; + + sendInputToMovie(key, repeat, pressed, released); + +#if 0 + if( key == ACTION_MENU_PAGEUP ) + { + m_newTop = m_listGamers.GetTopItem() - 10; + + if( m_newTop < 0 ) + m_newTop = 0; + + m_newSel = m_newTop; + } + else + { + + m_newTop = m_listGamers.GetTopItem() + 10; + + if( m_newTop+10 > (int)m_leaderboard.m_totalEntryCount ) + { + m_newTop = m_leaderboard.m_totalEntryCount - 10; + if( m_newTop < 0 ) + m_newTop = 0; + } + + m_newSel = m_newTop; + } +#endif + } + handled = true; + } + break; + case ACTION_MENU_X: + { + //Do nothing if a stats read is currently in progress, otherwise the system complains about to many read requests + if( pressed && m_bPopulatedOnce && LeaderboardManager::Instance()->isIdle() ) + { + //CD - Added for audio + ui.PlayUISFX(eSFX_Scroll); + + switch( m_currentFilter ) + { + case LeaderboardManager::eFM_Friends: + { + m_currentFilter = LeaderboardManager::eFM_MyScore; + wchar_t filterBuffer[40]; + swprintf(filterBuffer, 40, L"%ls%ls", app.GetString(IDS_LEADERBOARD_FILTER), app.GetString(IDS_LEADERBOARD_FILTER_MYSCORE)); + m_labelFilter.setLabel(filterBuffer); + } + break; + case LeaderboardManager::eFM_MyScore: + { + m_currentFilter = LeaderboardManager::eFM_TopRank; + wchar_t filterBuffer[40]; + swprintf(filterBuffer, 40, L"%ls%ls", app.GetString(IDS_LEADERBOARD_FILTER), app.GetString(IDS_LEADERBOARD_FILTER_OVERALL)); + m_labelFilter.setLabel(filterBuffer); + } + break; + case LeaderboardManager::eFM_TopRank: + { + m_currentFilter = LeaderboardManager::eFM_Friends; + wchar_t filterBuffer[40]; + swprintf(filterBuffer, 40, L"%ls%ls", app.GetString(IDS_LEADERBOARD_FILTER), app.GetString(IDS_LEADERBOARD_FILTER_FRIENDS)); + m_labelFilter.setLabel(filterBuffer); + } + break; + } + + ReadStats(-1); + ui.PlayUISFX(eSFX_Press); + } + handled = true; + } + break; + case ACTION_MENU_Y: + { +#ifdef _DURANGO + //Show gamercard + //if( m_leaderboard.m_entries.size() > 0 ) + if(m_leaderboard.m_totalEntryCount > 0) + { + unsigned int selection = m_newSel; + if( selection >= GetEntryStartIndex() && + selection < (GetEntryStartIndex() + m_leaderboard.m_entries.size()) ) + { + PlayerUID uid = m_leaderboard.m_entries[selection - GetEntryStartIndex()].m_xuid; + if( uid != INVALID_XUID ) + { + ProfileManager.ShowProfileCard(ProfileManager.GetLockedProfile(),uid); + ui.PlayUISFX(eSFX_Press); + } + } + } +#endif + handled = true; + } + break; + case ACTION_MENU_A: + { +#ifdef _DURANGO + //Send friend request if the filter mode is not friend, and they're not a friend or a pending friend +#ifdef _XBOX + if( m_currentFilter != LeaderboardManager::eFM_Friends ) +#endif + { + if( m_leaderboard.m_entries.size() > 0 ) + { + unsigned int selection = m_newSel; + if( selection >= GetEntryStartIndex() && + selection < (GetEntryStartIndex() + m_leaderboard.m_entries.size()) ) + { + //If not the player and neither currently a friend or requested to be a friend + if( !m_leaderboard.m_entries[selection - GetEntryStartIndex()].m_bPlayer +#ifdef _XBOX + && !m_leaderboard.m_entries[selection - (m_leaderboard.m_entryStartIndex-1) ].m_bFriend + && !m_leaderboard.m_entries[selection - (m_leaderboard.m_entryStartIndex-1) ].m_bRequestedFriend +#endif + ) + { + PlayerUID xuid = m_leaderboard.m_entries[selection - GetEntryStartIndex()].m_xuid; + if( xuid != INVALID_XUID ) + { + ProfileManager.ShowAddFriend(m_iPad,xuid); + ui.PlayUISFX(eSFX_Press); + } + } + } + } + } +#endif + handled = true; + } + break; + } +} + +void UIScene_LeaderboardsMenu::ReadStats(int startIndex) +{ + //If startIndex == -1, then use default values + if( startIndex == -1 ) + { + m_newEntryIndex = 1; + m_newReadSize = READ_SIZE; + + m_newEntriesCount = 0; + + m_leaderboard.m_totalEntryCount = 0; + + m_listEntries.clearList(); + } + else + { + m_newEntryIndex = (unsigned int)startIndex; + // m_newReadSize = min((int)READ_SIZE, (int)m_leaderboard.m_totalEntryCount-(startIndex-1)); + } + + //app.DebugPrintf("Requesting stats read %d - %d - %d\n", m_currentLeaderboard, startIndex == -1 ? m_currentFilter : LeaderboardManager::eFM_TopRank, m_currentDifficulty); + + LeaderboardManager::EFilterMode filtermode; + if ( m_currentFilter == LeaderboardManager::eFM_MyScore + || m_currentFilter == LeaderboardManager::eFM_TopRank ) + { + filtermode = (startIndex == -1 ? m_currentFilter : LeaderboardManager::eFM_TopRank); + } + else + { + // 4J-JEV: Friends filter shouldn't switch to toprank. + filtermode = m_currentFilter; + } + + switch (filtermode) + { + case LeaderboardManager::eFM_TopRank: + LeaderboardManager::Instance()->ReadStats_TopRank( this, + m_currentDifficulty, (LeaderboardManager::EStatsType) m_currentLeaderboard, + m_newEntryIndex, m_newReadSize + ); + break; + case LeaderboardManager::eFM_MyScore: + { + PlayerUID uid; + ProfileManager.GetXUID(ProfileManager.GetPrimaryPad(),&uid, true); + LeaderboardManager::Instance()->ReadStats_MyScore( this, + m_currentDifficulty, (LeaderboardManager::EStatsType) m_currentLeaderboard, + uid /*ignored on PS3*/, + m_newReadSize + ); + } + break; + case LeaderboardManager::eFM_Friends: + { + PlayerUID uid; + ProfileManager.GetXUID(ProfileManager.GetPrimaryPad(),&uid, true); + LeaderboardManager::Instance()->ReadStats_Friends( this, + m_currentDifficulty, (LeaderboardManager::EStatsType) m_currentLeaderboard, + uid /*ignored on PS3*/, + m_newEntryIndex, m_newReadSize + ); + } + break; + } + + //Show the loading message + m_labelInfo.setLabel(app.GetString(IDS_LEADERBOARD_LOADING)); + m_labelInfo.setVisible(true); +} + +bool UIScene_LeaderboardsMenu::OnStatsReadComplete(LeaderboardManager::eStatsReturn retIn, int numResults, LeaderboardManager::ViewOut results) +{ + //CScene_Leaderboards* scene = reinterpret_cast(userdata); + + m_isProcessingStatsRead = true; + + //bool noResults = LeaderboardManager::Instance()->GetStatsState() != XboxLeaderboardManager::eStatsState_Ready; + bool ret; + + //app.DebugPrintf("Leaderboards read %d stats\n", numResults); + if (retIn == LeaderboardManager::eStatsReturn_Success) + { + m_numStats = numResults; + m_stats = results; + ret = RetrieveStats(); + } + else ret = true; + + //else LeaderboardManager::Instance()->SetStatsRetrieved(false); + + PopulateLeaderboard(retIn); + + updateTooltips(); + + m_isProcessingStatsRead = false; + + // allow user input now + m_bIgnoreInput=false; + + return ret; +} + +bool UIScene_LeaderboardsMenu::RetrieveStats() +{ + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<SetStatsRetrieved(true); + + m_newEntryIndex = 0; + m_newEntriesCount = NUM_ENTRIES; + + return true; + } + + //assert( LeaderboardManager::Instance()->GetStats() != NULL ); + //PXUSER_STATS_READ_RESULTS stats = LeaderboardManager::Instance()->GetStats(); + //if( m_currentFilter == LeaderboardManager::eFM_Friends ) LeaderboardManager::Instance()->SortFriendStats(); + + bool isDistanceLeaderboard = LEADERBOARD_DESCRIPTORS[m_currentLeaderboard][m_currentDifficulty].m_isDistanceLeaderboard; + + m_newEntriesCount = m_stats.m_numQueries; + + // First read + if( m_leaderboard.m_totalEntryCount == 0 ) + { + m_leaderboard.m_entries.clear(); + +#if _DURANGO + m_leaderboard.m_totalEntryCount = m_numStats; +#else + m_leaderboard.m_totalEntryCount = (m_currentFilter == LeaderboardManager::eFM_Friends) ? m_newEntriesCount : m_numStats; +#endif + + if( m_leaderboard.m_totalEntryCount == 0 || m_newEntriesCount == 0 ) + { + //LeaderboardManager::Instance()->SetStatsRetrieved(false); + return false; + } + + m_leaderboard.m_numColumns = m_stats.m_queries[0].m_statsSize; + + for( unsigned int entryIndex=0 ; entryIndex < m_newEntriesCount; ++entryIndex ) + { + m_leaderboard.m_entries.push_back(LeaderboardEntry()); + CopyLeaderboardEntry(&(m_stats.m_queries[entryIndex]), entryIndex, isDistanceLeaderboard); + } + + m_newEntryIndex = 0; + + // Clear these values so that we know whether or not they are set in the next block + m_newTop = -1; + m_newSel = -1; + + // If the filter mode is "My Score" then centre the list around the entries and select the player's score + if( m_currentFilter == LeaderboardManager::eFM_MyScore) + { + //Centre the leaderboard list on the entries + m_newTop = GetEntryStartIndex(); + + //Select the player entry + for( unsigned int i = GetEntryStartIndex(); i< GetEntryStartIndex() + m_leaderboard.m_entries.size(); ++i ) + { + if( m_leaderboard.m_entries[i - GetEntryStartIndex()].m_bPlayer ) + { + m_newSel = i; // this might be off the screen! + // and reposition the top one + if(m_newSel-m_newTop>9) + { + m_newTop=m_newSel-9; + } + break; + } + } + } + + // If not set, default to start index + if (m_newSel < 0) m_newTop = m_newSel = GetEntryStartIndex(); + } + // Additional read + else + { + if(m_newEntryIndex < GetEntryStartIndex() && m_newEntryIndex == 1) + { + // If we're at the top the new entries count is incorrect, so amend + m_newEntriesCount = GetEntryStartIndex(); + } + + bool deleteFront = false; + bool deleteBack = false; + + bool trim = m_leaderboard.m_entries.size() + m_newEntriesCount >= NUM_ENTRIES; + + unsigned int insertPosition = 0; + + // If the first new entry is at a smaller index than the current first entry + if(m_newEntryIndex < GetEntryStartIndex()) + { + insertPosition = 0; + if (trim) deleteBack = true; + } + else + { + insertPosition = m_leaderboard.m_entries.size(); + if (trim) deleteFront = true; + } + + m_newEntryIndex = insertPosition; + + // Copy results to entries list + for( unsigned int i=0 ; i < m_newEntriesCount ; ++i ) + { + m_leaderboard.m_entries.insert(m_leaderboard.m_entries.begin() + insertPosition, LeaderboardEntry()); + CopyLeaderboardEntry(&(m_stats.m_queries[i]), insertPosition, isDistanceLeaderboard); + + insertPosition++; + } + + if (deleteFront) + { + // Delete front x entries + m_leaderboard.m_entries.erase(m_leaderboard.m_entries.begin(), m_leaderboard.m_entries.begin() + READ_SIZE); + m_newEntryIndex -= m_newReadSize; + } + else if (deleteBack) + { + // Delete back x entries + m_leaderboard.m_entries.erase(m_leaderboard.m_entries.end() - READ_SIZE, m_leaderboard.m_entries.end()); + } + } + + return true; +} + +void UIScene_LeaderboardsMenu::CopyLeaderboardEntry(LeaderboardManager::ReadScore *statsRow, int leaderboardEntryIndex, bool isDistanceLeaderboard) +{ + LeaderboardEntry* leaderboardEntry = &(m_leaderboard.m_entries[leaderboardEntryIndex]); + + ZeroMemory(leaderboardEntry, sizeof(LeaderboardEntry)); + leaderboardEntry->m_xuid = statsRow->m_uid; + + // Copy the rank + leaderboardEntry->m_rank = statsRow->m_rank; + DWORD displayRank = leaderboardEntry->m_rank; + if(displayRank > 9999999) displayRank = 9999999; + swprintf(leaderboardEntry->m_wcRank, 12, L"%u", displayRank); + + leaderboardEntry->m_idsErrorMessage = statsRow->m_idsErrorMessage; + + // Build a row ID + if (m_currentFilter == LeaderboardManager::eFM_Friends) + { + // If friends don't ID rows by rank + leaderboardEntry->m_row = leaderboardEntryIndex; + } + else + { + leaderboardEntry->m_row = statsRow->m_rank - 1; + if (leaderboardEntryIndex > 0) { + // Check this row ID (/rank) against the last one, it might be the same + // (this happens on PS3 when players have the same score, i.e. if they share 76th position there'll be two rank 76 + // and the following entry will be rank 78) + LeaderboardEntry* prevEntry = &(m_leaderboard.m_entries[leaderboardEntryIndex - 1]); + if (leaderboardEntry->m_row <= prevEntry->m_row) + { + leaderboardEntry->m_row = prevEntry->m_row + 1; + } + } + } + +#ifdef __PS3__ + // m_name can be unicode characters somehow for Japan - should use m_onlineID + wstring wstr=convStringToWstring(statsRow->m_uid.getOnlineID()); + swprintf(leaderboardEntry->m_gamerTag, XUSER_NAME_SIZE, L"%ls",wstr.c_str()); +#else + memcpy(leaderboardEntry->m_gamerTag, statsRow->m_name.data(), statsRow->m_name.size() * sizeof(wchar_t)); +#endif + + // Copy the other columns + for( unsigned int i=0 ; im_statsSize ; i++ ) + { + leaderboardEntry->m_columns[i] = statsRow->m_statsData[i]; + ZeroMemory(leaderboardEntry->m_wcColumns[i],12*sizeof(WCHAR)); + if( !isDistanceLeaderboard ) + { + DWORD displayValue = leaderboardEntry->m_columns[i]; + if(displayValue > 99999) displayValue = 99999; + swprintf(leaderboardEntry->m_wcColumns[i], 12, L"%u",displayValue); +#ifdef _DEBUG + //app.DebugPrintf("Value - %d\n",leaderboardEntry->m_columns[i]); +#endif + } + else + { + // check how many digits we have + int iDigitC=0; + unsigned int uiVal=leaderboardEntry->m_columns[i]; +// uiVal=0xFFFFFFFF; +// leaderboardEntry->m_columns[i-1]=uiVal; + + while(uiVal!=0) + { + uiVal/=10; + iDigitC++; + } + +#ifdef _DEBUG + //app.DebugPrintf("Value - %d\n",leaderboardEntry->m_columns[i]); +#endif + if(iDigitC<4) + { + // m + swprintf(leaderboardEntry->m_wcColumns[i], 12, L"%um", leaderboardEntry->m_columns[i]); +#ifdef _DEBUG + //app.DebugPrintf("Display - %um\n", leaderboardEntry->m_columns[i]); +#endif + } + else if(iDigitC<8) + { + // km with a .X + swprintf(leaderboardEntry->m_wcColumns[i], 12, L"%.1fkm", ((float)leaderboardEntry->m_columns[i])/1000.f); +#ifdef _DEBUG + //app.DebugPrintf("Display - %.1fkm\n", ((float)leaderboardEntry->m_columns[i])/1000.f); +#endif + } + else + { + // bigger than that, so no decimal point + swprintf(leaderboardEntry->m_wcColumns[i], 12, L"%.0fkm", ((float)leaderboardEntry->m_columns[i])/1000.f); +#ifdef _DEBUG + //app.DebugPrintf("Display - %.0fkm\n", ((float)leaderboardEntry->m_columns[i])/1000.f); +#endif + } + } + } + +#ifdef _DURANGO + //Is the player + PlayerUID myXuid; + ProfileManager.GetXUID(ProfileManager.GetPrimaryPad(),&myXuid,true); + if( statsRow->m_uid == myXuid ) + { + leaderboardEntry->m_bPlayer = true; + leaderboardEntry->m_bOnline = false; + leaderboardEntry->m_bFriend = false; + leaderboardEntry->m_bRequestedFriend = false; + } + else + { + leaderboardEntry->m_bPlayer = false; + leaderboardEntry->m_bOnline = false; + leaderboardEntry->m_bFriend = false; + leaderboardEntry->m_bRequestedFriend = false; + +#ifdef _XBOX + //Check for friend status + for( unsigned int friendIndex=0 ; friendIndexm_uid ) + { + if( ( m_friends[friendIndex].dwFriendState & ( XONLINE_FRIENDSTATE_FLAG_SENTREQUEST | XONLINE_FRIENDSTATE_FLAG_RECEIVEDREQUEST ) ) == 0 ) + { + //Is friend, might be online + leaderboardEntry->m_bFriend = true; + leaderboardEntry->m_bOnline = ( m_friends[friendIndex].dwFriendState & XONLINE_FRIENDSTATE_FLAG_ONLINE ); + leaderboardEntry->m_bRequestedFriend = false; + } + else + { + //Friend request sent but not accepted yet + leaderboardEntry->m_bOnline = false; + leaderboardEntry->m_bFriend = false; + leaderboardEntry->m_bRequestedFriend = true; + } + + break; + } + } +#endif + } +#endif +} + +void UIScene_LeaderboardsMenu::PopulateLeaderboard(LeaderboardManager::eStatsReturn ret) +{ + int iValidSlots=SetLeaderboardTitleIcons(); + if( ret == LeaderboardManager::eStatsReturn_Success && m_leaderboard.m_totalEntryCount > 0 ) + { + m_listEntries.setupTitles( app.GetString( IDS_LEADERBOARD_RANK ), app.GetString( IDS_LEADERBOARD_GAMERTAG ) ); + + //Update entries display + wchar_t entriesBuffer[40]; + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L< 0) + { + m_listEntries.addDataSet( + isLast, + m_leaderboard.m_entries[i].m_row, + m_leaderboard.m_entries[i].m_rank, + m_leaderboard.m_entries[i].m_gamerTag, + + true, // 4J-JEV: Has error message to display. + + app.GetString(idsErrorMessage), + L"", L"", L"", L"", L"", L"" + ); + } + else + { + m_listEntries.addDataSet( + isLast, + m_leaderboard.m_entries[i].m_row, + m_leaderboard.m_entries[i].m_rank, + m_leaderboard.m_entries[i].m_gamerTag, + + // 4J-TomK | The bDisplayMessage Flag defines if Leaderboard Data should be + // displayed (false) or if a specific message (true - when data is private for example) + // should be displayed. The message itself should be passed on in col0! + false, + + m_leaderboard.m_entries[i].m_wcColumns[0], + m_leaderboard.m_entries[i].m_wcColumns[1], + m_leaderboard.m_entries[i].m_wcColumns[2], + m_leaderboard.m_entries[i].m_wcColumns[3], + m_leaderboard.m_entries[i].m_wcColumns[4], + m_leaderboard.m_entries[i].m_wcColumns[5], + m_leaderboard.m_entries[i].m_wcColumns[6] + ); + } + } + } + else + { + m_listEntries.setupTitles( L"", L"" ); + + //Update entries display (to zero) + wchar_t entriesBuffer[40]; + swprintf(entriesBuffer, 40, L"%ls0", app.GetString(IDS_LEADERBOARD_ENTRIES)); + m_labelEntries.setLabel(entriesBuffer); + + //Show the no results message +#if !(defined(_XBOX) || defined(_WINDOWS64)) // 4J Stu - Temp to get the win build running, but so we check this for other platforms + if (ret == LeaderboardManager::eStatsReturn_NetworkError) + m_labelInfo.setLabel(app.GetString(IDS_ERROR_NETWORK)); + else +#endif + m_labelInfo.setLabel(app.GetString(IDS_LEADERBOARD_NORESULTS)); + m_labelInfo.setVisible(true); + } + m_bPopulatedOnce = true; +} + +void UIScene_LeaderboardsMenu::SetLeaderboardHeader() +{ + m_labelLeaderboard.setLabel(app.GetString(LEADERBOARD_DESCRIPTORS[m_currentLeaderboard][m_currentDifficulty].m_title)); +} + +int UIScene_LeaderboardsMenu::SetLeaderboardTitleIcons() +{ + int iValidIcons=0; + + for(int i=0;i<7;i++) + { + if(TitleIcons[m_currentLeaderboard][i]==0) + { + //m_pHTitleIconSlots[i]->SetShow(FALSE); + } + else + { + iValidIcons++; + m_listEntries.setColumnIcon(i,TitleIcons[m_currentLeaderboard][i]); + } + } + + return iValidIcons; +} + +void UIScene_LeaderboardsMenu::customDraw(IggyCustomDrawCallbackRegion *region) +{ + int slotId = -1; + swscanf((wchar_t*)region->name,L"slot_%d",&slotId); + if (slotId == -1) + { + //app.DebugPrintf("This is not the control we are looking for\n"); + } + else + { + shared_ptr item = shared_ptr( new ItemInstance(TitleIcons[m_currentLeaderboard][slotId], 1, 0) ); + customDrawSlotControl(region,m_iPad,item,1.0f,false,false); + } +} + +void UIScene_LeaderboardsMenu::handleSelectionChanged(F64 selectedId) +{ + ui.PlayUISFX(eSFX_Focus); + m_newSel = (int)selectedId; + updateTooltips(); +} + +// Handle a request from Iggy for more data +void UIScene_LeaderboardsMenu::handleRequestMoreData(F64 startIndex, bool up) +{ + unsigned int item = (int)startIndex; + + if( m_leaderboard.m_totalEntryCount > 0 && (item+1) < GetEntryStartIndex() ) + { + if( LeaderboardManager::Instance()->isIdle() ) + { + int readIndex = (GetEntryStartIndex() + 1) - READ_SIZE; + if( readIndex <= 0 ) + readIndex = 1; + assert( readIndex >= 1 && readIndex <= (int)m_leaderboard.m_totalEntryCount ); + ReadStats(readIndex); + } + } + else if( m_leaderboard.m_totalEntryCount > 0 && (item+1) >= (GetEntryStartIndex() + m_leaderboard.m_entries.size()) ) + { + if( LeaderboardManager::Instance()->isIdle() ) + { + int readIndex = (GetEntryStartIndex() + 1) + m_leaderboard.m_entries.size(); + assert( readIndex >= 1 && readIndex <= (int)m_leaderboard.m_totalEntryCount ); + ReadStats(readIndex); + } + } +} + +void UIScene_LeaderboardsMenu::handleTimerComplete(int id) +{ +#if ( defined __PS3__ || defined __ORBIS__ || defined __PSVITA__) + switch(id) + { + case PLAYER_ONLINE_TIMER_ID: +#ifndef _WINDOWS64 + if(ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())==false) + { + // check the player hasn't gone offline + // If they have, bring up the PSN warning and exit from the leaderboards + unsigned int uiIDA[1]; + uiIDA[0]=IDS_OK; + C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_CONNECTION_LOST, g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT), uiIDA,1,ProfileManager.GetPrimaryPad(),UIScene_LeaderboardsMenu::ExitLeaderboards,this, app.GetStringTable()); + } +#endif + break; + } +#endif +} + +int UIScene_LeaderboardsMenu::ExitLeaderboards(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LeaderboardsMenu* pClass = (UIScene_LeaderboardsMenu*)pParam; + + pClass->navigateBack(); + + return 0; +} + +// Get entry start size, if no entries returns 0 +int UIScene_LeaderboardsMenu::GetEntryStartIndex() +{ + return m_leaderboard.m_entries.size() == 0 ? 0 : m_leaderboard.m_entries[0].m_row; +} diff --git a/Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.h b/Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.h new file mode 100644 index 00000000..20bf0002 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_LeaderboardsMenu.h @@ -0,0 +1,143 @@ +#pragma once + +#include "UIScene.h" +#include "..\Leaderboards\LeaderboardManager.h" + +class UIScene_LeaderboardsMenu : public UIScene, public LeaderboardReadListener +{ +private: + // 4J Stu - Because the kills leaderboard doesn't a peaceful entry there are some special + // handling to make it skip that. We have re-arranged the order of the leaderboards so + // I am making this in case we do it again. + // 4J Stu - Made it a member of the class, rather than a #define + static const int LEADERBOARD_KILLS_POSITION = 3; + + static const int NUM_LEADERBOARDS = 4;//6; //Number of leaderboards + static const int NUM_ENTRIES = 101; //Cache up to this many entries + static const int READ_SIZE = 15; //Read this many entries at a time + + struct LeaderboardDescriptor { + unsigned int m_columnCount; + bool m_isDistanceLeaderboard; + unsigned int m_title; + + LeaderboardDescriptor(unsigned int columnCount, bool isDistanceLeaderboard, unsigned int title) + { + m_columnCount = columnCount; + m_isDistanceLeaderboard = isDistanceLeaderboard; + m_title = title; + } + }; + + static const LeaderboardDescriptor LEADERBOARD_DESCRIPTORS[NUM_LEADERBOARDS][4]; + static const int TitleIcons[NUM_LEADERBOARDS][7]; + + struct LeaderboardEntry { + PlayerUID m_xuid; + unsigned int m_row; // Row identifier for passing to Iggy as a unique identifier + DWORD m_rank; + WCHAR m_wcRank[12]; + WCHAR m_gamerTag[XUSER_NAME_SIZE+1]; + //int m_locale; + unsigned int m_columns[7]; + WCHAR m_wcColumns[7][12]; + bool m_bPlayer; //Is the player + bool m_bOnline; //Is online + bool m_bFriend; //Is friend + bool m_bRequestedFriend; //Friend request sent but not answered + int m_idsErrorMessage; // 4J-JEV: Non-zero if this entry has an error message instead of results. + }; + + struct Leaderboard { + DWORD m_totalEntryCount; //Either total number of entries in leaderboard, or total number of results for a friends query + vector m_entries; + DWORD m_numColumns; + }; + + Leaderboard m_leaderboard; //All leaderboard data for the currently selected filter + + unsigned int m_currentLeaderboard; //The current leaderboard selected for view + LeaderboardManager::EFilterMode m_currentFilter; //The current filter selected + unsigned int m_currentDifficulty; //The current difficulty selected + + unsigned int m_newEntryIndex; //Index of the first entry being read + unsigned int m_newReadSize; //Number of entries in the current read operation + + unsigned int m_newEntriesCount; // Number of new entries in this update + + int m_newTop; //Index of the element that should be at the top of the list + int m_newSel; //Index of the element that should be selected in the list + + bool m_isProcessingStatsRead; + bool m_bPopulatedOnce; + bool m_bReady; + + UIControl_LeaderboardList m_listEntries; + UIControl_Label m_labelFilter, m_labelLeaderboard, m_labelEntries, m_labelInfo; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_listEntries, "Gamers") + + UI_MAP_ELEMENT( m_labelFilter, "Filter") + UI_MAP_ELEMENT( m_labelLeaderboard, "Leaderboard") + UI_MAP_ELEMENT( m_labelEntries, "Entries") + UI_MAP_ELEMENT( m_labelInfo, "Info") + UI_END_MAP_ELEMENTS_AND_NAMES() + + static int ExitLeaderboards(void *pParam,int iPad,C4JStorage::EMessageResult result); + +public: + UIScene_LeaderboardsMenu(int iPad, void *initData, UILayer *parentLayer); + ~UIScene_LeaderboardsMenu(); + + virtual void updateTooltips(); + virtual void updateComponents(); + + virtual EUIScene getSceneType() { return eUIScene_LeaderboardsMenu;} + + // Returns true if this scene has focus for the pad passed in + virtual bool hasFocus(int iPad) { return bHasFocus; } + virtual void handleTimerComplete(int id); + +private: + int GetEntryStartIndex(); + +protected: + virtual wstring getMoviePath(); + +public: + void handleReload(); + + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +private: + //Start a read request with the current parameters + void ReadStats(int startIndex); + + //Copy the stats from the raw m_stats structure into the m_leaderboards structure + int m_numStats; + LeaderboardManager::ViewOut m_stats; + bool RetrieveStats(); + + // Copy a leaderboard entry from the stats row + void CopyLeaderboardEntry(LeaderboardManager::ReadScore *statsRow, int leaderboardEntryIndex, bool isDistanceLeaderboard); + + //Populate the XUI leaderboard with the contents of m_leaderboards + void PopulateLeaderboard(LeaderboardManager::eStatsReturn ret); + + //Set the header text of the leaderboard + void SetLeaderboardHeader(); + + // Set the title icons + int SetLeaderboardTitleIcons(); + + //Callback function called when stats read completes, userdata contains pointer to instance of CScene_Leaderboards + virtual bool OnStatsReadComplete(LeaderboardManager::eStatsReturn ret, int numResults, LeaderboardManager::ViewOut results); + + virtual void customDraw(IggyCustomDrawCallbackRegion *region); + + virtual void handleSelectionChanged(F64 selectedId); + virtual void handleRequestMoreData(F64 startIndex, bool up); + + bool m_bIgnoreInput; +}; diff --git a/Minecraft.Client/Common/UI/UIScene_LoadMenu.cpp b/Minecraft.Client/Common/UI/UIScene_LoadMenu.cpp new file mode 100644 index 00000000..f08fc727 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_LoadMenu.cpp @@ -0,0 +1,1804 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_LoadMenu.h" +#include "..\..\Minecraft.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\Options.h" +#include "..\..\MinecraftServer.h" +#include "..\..\..\Minecraft.World\LevelSettings.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) +#include "Common\Network\Sony\SonyHttp.h" +#endif +#include "..\..\DLCTexturePack.h" +#if defined(__ORBIS__) || defined(__PSVITA__) +#include +#endif + +#define GAME_CREATE_ONLINE_TIMER_ID 0 +#define GAME_CREATE_ONLINE_TIMER_TIME 100 +// 4J-PB - Only Xbox will not have trial DLC patched into the game +#ifdef _XBOX +#define CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID 1 +#define CHECKFORAVAILABLETEXTUREPACKS_TIMER_TIME 50 +#endif + +int UIScene_LoadMenu::m_iDifficultyTitleSettingA[4]= +{ + IDS_DIFFICULTY_TITLE_PEACEFUL, + IDS_DIFFICULTY_TITLE_EASY, + IDS_DIFFICULTY_TITLE_NORMAL, + IDS_DIFFICULTY_TITLE_HARD +}; + +int UIScene_LoadMenu::LoadSaveDataThumbnailReturned(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes) +{ + UIScene_LoadMenu *pClass= (UIScene_LoadMenu *)lpParam; + + app.DebugPrintf("Received data for a thumbnail\n"); + + if(pbThumbnail && dwThumbnailBytes) + { + pClass->registerSubstitutionTexture(pClass->m_thumbnailName,pbThumbnail,dwThumbnailBytes); + + pClass->m_pbThumbnailData = pbThumbnail; + pClass->m_uiThumbnailSize = dwThumbnailBytes; + pClass->m_bSaveThumbnailReady = true; + } + else + { + app.DebugPrintf("Thumbnail data is NULL, or has size 0\n"); + pClass->m_bThumbnailGetFailed = true; + } + pClass->m_bRetrievingSaveThumbnail = false; + + return 0; +} + +UIScene_LoadMenu::UIScene_LoadMenu(int iPad, void *initData, UILayer *parentLayer) : IUIScene_StartGame(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + LoadMenuInitData *params = (LoadMenuInitData *)initData; + + //m_labelGameName.init(app.GetString(IDS_WORLD_NAME)); + m_labelSeed.init(L""); + m_labelCreatedMode.init(app.GetString(IDS_CREATED_IN_SURVIVAL)); + + m_buttonGamemode.init(app.GetString(IDS_GAMEMODE_SURVIVAL),eControl_GameMode); + m_buttonMoreOptions.init(app.GetString(IDS_MORE_OPTIONS),eControl_MoreOptions); + m_buttonLoadWorld.init(app.GetString(IDS_LOAD),eControl_LoadWorld); + m_texturePackList.init(app.GetString(IDS_DLC_MENU_TEXTUREPACKS), eControl_TexturePackList); + + m_labelTexturePackName.init(L""); + m_labelTexturePackDescription.init(L""); + + m_CurrentDifficulty=app.GetGameSettings(m_iPad,eGameSetting_Difficulty); + WCHAR TempString[256]; + swprintf( (WCHAR *)TempString, 256, L"%ls: %ls", app.GetString( IDS_SLIDER_DIFFICULTY ),app.GetString(m_iDifficultyTitleSettingA[app.GetGameSettings(m_iPad,eGameSetting_Difficulty)])); + m_sliderDifficulty.init(TempString,eControl_Difficulty,0,3,app.GetGameSettings(m_iPad,eGameSetting_Difficulty)); + + m_MoreOptionsParams.bGenerateOptions=FALSE; + m_MoreOptionsParams.bPVP = TRUE; + m_MoreOptionsParams.bTrust = TRUE; + m_MoreOptionsParams.bFireSpreads = TRUE; + m_MoreOptionsParams.bHostPrivileges = FALSE; + m_MoreOptionsParams.bTNT = TRUE; + m_MoreOptionsParams.iPad = iPad; + + m_iSaveGameInfoIndex=params->iSaveGameInfoIndex; + m_levelGen = params->levelGen; + + m_bGameModeSurvival=true; + m_bHasBeenInCreative = false; + + m_bSaveThumbnailReady = false; + m_bRetrievingSaveThumbnail = true; + m_bShowTimer = false; + m_pDLCPack = NULL; + m_bAvailableTexturePacksChecked=false; + m_bRequestQuadrantSignin = false; + m_iTexturePacksNotInstalled=0; + m_bRebuildTouchBoxes = false; + m_bThumbnailGetFailed = false; + m_seed = 0; + + m_bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); + // 4J-PB - read the settings for the online flag. We'll only save this setting if the user changed it. + bool bGameSetting_Online=(app.GetGameSettings(m_iPad,eGameSetting_Online)!=0); + m_MoreOptionsParams.bOnlineSettingChangedBySystem=false; + + // Set the text for friends of friends, and default to on + if( m_bMultiplayerAllowed) + { + m_MoreOptionsParams.bOnlineGame = bGameSetting_Online?TRUE:FALSE; + if(bGameSetting_Online) + { + m_MoreOptionsParams.bInviteOnly = (app.GetGameSettings(m_iPad,eGameSetting_InviteOnly)!=0)?TRUE:FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = (app.GetGameSettings(m_iPad,eGameSetting_FriendsOfFriends)!=0)?TRUE:FALSE; + } + else + { + m_MoreOptionsParams.bInviteOnly = FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = FALSE; + } + } + else + { + m_MoreOptionsParams.bOnlineGame = FALSE; + m_MoreOptionsParams.bInviteOnly = FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = FALSE; + if(bGameSetting_Online) + { + // The profile settings say Online, but either the player is offline, or they are not allowed to play online + m_MoreOptionsParams.bOnlineSettingChangedBySystem=true; + } + } + + +#if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 + if(getSceneResolution() == eSceneResolution_1080) + { + // Set up online game checkbox + bool bOnlineGame = m_MoreOptionsParams.bOnlineGame; + m_checkboxOnline.SetEnable(true); + + // 4J-PB - to stop an offline game being able to select the online flag + if(ProfileManager.IsSignedInLive(m_iPad) == false) + { + m_checkboxOnline.SetEnable(false); + } + + if(m_MoreOptionsParams.bOnlineSettingChangedBySystem) + { + m_checkboxOnline.SetEnable(false); + bOnlineGame = false; + } + + m_checkboxOnline.init(app.GetString(IDS_ONLINE_GAME), eControl_OnlineGame, bOnlineGame); + } +#endif + + // Level gen + if(m_levelGen) + { + m_labelGameName.init(m_levelGen->getDisplayName()); + if(m_levelGen->requiresTexturePack()) + { + m_MoreOptionsParams.dwTexturePack = m_levelGen->getRequiredTexturePackId(); + + m_texturePackList.setEnabled(false); + + + // retrieve the save icon from the texture pack, if there is one + TexturePack *tp = Minecraft::GetInstance()->skins->getTexturePackById(m_MoreOptionsParams.dwTexturePack); + DWORD dwImageBytes; + PBYTE pbImageData = tp->getPackIcon(dwImageBytes); + + if(dwImageBytes > 0 && pbImageData) + { + wchar_t textureName[64]; + swprintf(textureName,64,L"loadsave"); + registerSubstitutionTexture(textureName,pbImageData,dwImageBytes); + m_bitmapIcon.setTextureName( textureName ); + } + } + // Set this level as created in creative mode, so that people can't use the themed worlds as an easy way to get achievements + m_bHasBeenInCreative = true; + m_labelCreatedMode.setLabel( app.GetString(IDS_CREATED_IN_CREATIVE) ); + } + else + { + +#if defined(__PS3__) || defined(__ORBIS__)|| defined(_DURANGO) || defined (__PSVITA__) + // convert to utf16 + uint16_t u16Message[MAX_SAVEFILENAME_LENGTH]; + size_t srclen,dstlen; + srclen=MAX_SAVEFILENAME_LENGTH; + dstlen=MAX_SAVEFILENAME_LENGTH; +#ifdef __PS3__ + L10nResult lres= UTF8stoUTF16s((uint8_t *)params->saveDetails->UTF8SaveFilename,&srclen,u16Message,&dstlen); +#elif defined(_DURANGO) + // Already utf16 on durango + memcpy(u16Message,params->saveDetails->UTF16SaveFilename, MAX_SAVEFILENAME_LENGTH); +#else // __ORBIS__ + { + SceCesUcsContext Context; + sceCesUcsContextInit( &Context ); + uint32_t utf8Len, utf16Len; + sceCesUtf8StrToUtf16Str(&Context, (uint8_t *)params->saveDetails->UTF8SaveFilename, srclen, &utf8Len, u16Message, dstlen, &utf16Len); + } +#endif + m_thumbnailName = (wchar_t *)u16Message; + if(params->saveDetails->pbThumbnailData) + { + m_pbThumbnailData = params->saveDetails->pbThumbnailData; + m_uiThumbnailSize = params->saveDetails->dwThumbnailSize; + m_bSaveThumbnailReady = true; + } + else + { + app.DebugPrintf("Requesting the save thumbnail\n"); + // set the save to load + PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo(); +#ifdef _DURANGO + // On Durango, we have an extra flag possible with LoadSaveDataThumbnail, which if true will force the loading of this thumbnail even if the save data isn't sync'd from + // the cloud at this stage. This could mean that there could be a pretty large delay before the callback happens, in this case. + C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveDataThumbnail(&pSaveDetails->SaveInfoA[(int)m_iSaveGameInfoIndex],&LoadSaveDataThumbnailReturned,this,true); +#else + C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveDataThumbnail(&pSaveDetails->SaveInfoA[(int)m_iSaveGameInfoIndex],&LoadSaveDataThumbnailReturned,this); +#endif + m_bShowTimer = true; + } +#if defined(_DURANGO) + m_labelGameName.init(params->saveDetails->UTF16SaveName); +#else + + m_labelGameName.init(params->saveDetails->UTF8SaveName); +#endif +#endif + } + + TelemetryManager->RecordMenuShown(m_iPad, eUIScene_LoadMenu, 0); + m_iTexturePacksNotInstalled=0; + + // block input if we're waiting for DLC to install, and wipe the saves list. The end of dlc mounting custom message will fill the list again + if(app.StartInstallDLCProcess(m_iPad)==true) + { + // not doing a mount, so enable input + m_bIgnoreInput=true; + } + else + { + m_bIgnoreInput = false; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + int texturePacksCount = pMinecraft->skins->getTexturePackCount(); + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + + DWORD dwImageBytes; + PBYTE pbImageData = tp->getPackIcon(dwImageBytes); + + if(dwImageBytes > 0 && pbImageData) + { + wchar_t imageName[64]; + swprintf(imageName,64,L"tpack%08x",tp->getId()); + registerSubstitutionTexture(imageName, pbImageData, dwImageBytes); + m_texturePackList.addPack(i,imageName); + } + } + m_currentTexturePackIndex = pMinecraft->skins->getTexturePackIndex(m_MoreOptionsParams.dwTexturePack); + UpdateTexturePackDescription(m_currentTexturePackIndex); + m_texturePackList.selectSlot(m_currentTexturePackIndex); + + // 4J-PB - Only Xbox will not have trial DLC patched into the game +#ifdef _XBOX + // 4J-PB - there may be texture packs we don't have, so use the info from TMS for this + + // 4J-PB - Any texture packs available that we don't have installed? +#if defined(__PS3__) || defined(__ORBIS__) + if(!m_bAvailableTexturePacksChecked && app.GetCommerceProductListRetrieved()&& app.GetCommerceProductListInfoRetrieved()) +#else + if(!m_bAvailableTexturePacksChecked) +#endif + { + DLC_INFO *pDLCInfo=NULL; + + // first pass - look to see if there are any that are not in the list + bool bTexturePackAlreadyListed; + bool bNeedToGetTPD=false; + + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + bTexturePackAlreadyListed=false; +#if defined(__PS3__) || defined(__ORBIS__) + char *pchName=app.GetDLCInfoTextures(i); + pDLCInfo=app.GetDLCInfo(pchName); +#else + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); +#endif + + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + if(pDLCInfo && pDLCInfo->iConfig==tp->getDLCParentPackId()) + { + bTexturePackAlreadyListed=true; + } + } + if(bTexturePackAlreadyListed==false) + { + // some missing + bNeedToGetTPD=true; + + m_iTexturePacksNotInstalled++; + } + } + + if(bNeedToGetTPD==true) + { + // add a TMS request for them + app.DebugPrintf("+++ Adding TMSPP request for texture pack data\n"); + app.AddTMSPPFileTypeRequest(e_DLC_TexturePackData); + m_iConfigA= new int [m_iTexturePacksNotInstalled]; + m_iTexturePacksNotInstalled=0; + + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + bTexturePackAlreadyListed=false; +#if defined(__PS3__) || defined(__ORBIS__) + char *pchName=app.GetDLCInfoTextures(i); + pDLCInfo=app.GetDLCInfo(pchName); +#else + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); +#endif + + if(pDLCInfo) + { + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + if(pDLCInfo && pDLCInfo->iConfig==tp->getDLCParentPackId()) + { + bTexturePackAlreadyListed=true; + } + } + if(bTexturePackAlreadyListed==false) + { + m_iConfigA[m_iTexturePacksNotInstalled++]=pDLCInfo->iConfig; + } + } + } + } + } +#endif + } + +#ifdef _XBOX + addTimer(CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID,CHECKFORAVAILABLETEXTUREPACKS_TIMER_TIME); +#endif + + if(params) delete params; + addTimer(GAME_CREATE_ONLINE_TIMER_ID,GAME_CREATE_ONLINE_TIMER_TIME); +} + +void UIScene_LoadMenu::updateTooltips() +{ + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK, -1, -1); +} + +void UIScene_LoadMenu::updateComponents() +{ + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + + if(RenderManager.IsWidescreen()) + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + } + else + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); + } +} + +wstring UIScene_LoadMenu::getMoviePath() +{ + return L"LoadMenu"; +} + +UIControl* UIScene_LoadMenu::GetMainPanel() +{ + return &m_controlMainPanel; +} + +void UIScene_LoadMenu::tick() +{ + if(m_bShowTimer) + { + m_bShowTimer = false; + ui.NavigateToScene(m_iPad, eUIScene_Timer); + } + + if( m_bThumbnailGetFailed ) + { + // On Durango, this can happen if a save is still not been synchronised (user cancelled, or some error). Return back to give them a choice to pick another save. + ui.NavigateBack(m_iPad, false, eUIScene_LoadOrJoinMenu); + return; + } + + if( m_bSaveThumbnailReady ) + { + m_bSaveThumbnailReady = false; + + m_bitmapIcon.setTextureName( m_thumbnailName.c_str() ); + + // retrieve the seed value from the image metadata + bool bHostOptionsRead = false; + unsigned int uiHostOptions = 0; + + char szSeed[50]; + ZeroMemory(szSeed,50); + app.GetImageTextData(m_pbThumbnailData,m_uiThumbnailSize,(unsigned char *)&szSeed,uiHostOptions,bHostOptionsRead,m_MoreOptionsParams.dwTexturePack); + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + sscanf_s(szSeed, "%I64d", &m_seed); +#endif + + // #ifdef _DEBUG + // // dump out the thumbnail + // HANDLE hThumbnail = CreateFile("GAME:\\thumbnail.png", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_FLAG_RANDOM_ACCESS, NULL); + // DWORD dwBytes; + // WriteFile(hThumbnail,pbImageData,dwImageBytes,&dwBytes,NULL); + // XCloseHandle(hThumbnail); + // #endif + + if(szSeed[0]!=0) + { + WCHAR TempString[256]; + swprintf( (WCHAR *)TempString, 256, L"%ls: %hs", app.GetString( IDS_SEED ),szSeed); + m_labelSeed.setLabel(TempString); + } + else + { + m_labelSeed.setLabel(L""); + } + + // Setup all the text and checkboxes to match what the game was saved with on + if(bHostOptionsRead) + { + m_MoreOptionsParams.bPVP = app.GetGameHostOption(uiHostOptions,eGameHostOption_PvP)>0?TRUE:FALSE; + m_MoreOptionsParams.bTrust = app.GetGameHostOption(uiHostOptions,eGameHostOption_TrustPlayers)>0?TRUE:FALSE; + m_MoreOptionsParams.bFireSpreads = app.GetGameHostOption(uiHostOptions,eGameHostOption_FireSpreads)>0?TRUE:FALSE; + m_MoreOptionsParams.bTNT = app.GetGameHostOption(uiHostOptions,eGameHostOption_TNT)>0?TRUE:FALSE; + m_MoreOptionsParams.bHostPrivileges = app.GetGameHostOption(uiHostOptions,eGameHostOption_CheatsEnabled)>0?TRUE:FALSE; + m_MoreOptionsParams.bDisableSaving = app.GetGameHostOption(uiHostOptions,eGameHostOption_DisableSaving)>0?TRUE:FALSE; + + // turn off creative mode on the save + // #ifdef _DEBUG + // uiHostOptions&=~GAME_HOST_OPTION_BITMASK_BEENINCREATIVE; + // app.SetGameHostOption(eGameHostOption_HasBeenInCreative, 0); + // #endif + + m_bHasBeenInCreative = app.GetGameHostOption(uiHostOptions,eGameHostOption_HasBeenInCreative)>0; + if(app.GetGameHostOption(uiHostOptions,eGameHostOption_HasBeenInCreative)>0) + { + m_labelCreatedMode.setLabel( app.GetString(IDS_CREATED_IN_CREATIVE) ); + } + else + { + m_labelCreatedMode.setLabel( app.GetString(IDS_CREATED_IN_SURVIVAL) ); + } + + if(app.GetGameHostOption(uiHostOptions,eGameHostOption_GameType)>0) + { + m_buttonGamemode.setLabel(app.GetString(IDS_GAMEMODE_CREATIVE)); + m_bGameModeSurvival=false; + } + + bool bGameSetting_Online=(app.GetGameSettings(m_iPad,eGameSetting_Online)!=0); + if(app.GetGameHostOption(uiHostOptions,eGameHostOption_FriendsOfFriends) && !(m_bMultiplayerAllowed && bGameSetting_Online)) + { + m_MoreOptionsParams.bAllowFriendsOfFriends = TRUE; + } + } + + Minecraft *pMinecraft = Minecraft::GetInstance(); + m_currentTexturePackIndex = pMinecraft->skins->getTexturePackIndex(m_MoreOptionsParams.dwTexturePack); + + UpdateTexturePackDescription(m_currentTexturePackIndex); + + m_texturePackList.selectSlot(m_currentTexturePackIndex); + + //m_labelGameName.setLabel(m_XContentData.szDisplayName); + + ui.NavigateBack(m_iPad, false, getSceneType() ); + } + + if(m_iSetTexturePackDescription >= 0 ) + { + UpdateTexturePackDescription( m_iSetTexturePackDescription ); + m_iSetTexturePackDescription = -1; + } + if(m_bShowTexturePackDescription) + { + slideLeft(); + m_texturePackDescDisplayed = true; + + m_bShowTexturePackDescription = false; + } + + if(m_bRequestQuadrantSignin) + { + m_bRequestQuadrantSignin = false; + SignInInfo info; + info.Func = &UIScene_LoadMenu::StartGame_SignInReturned; + info.lpParam = this; + info.requireOnline = m_MoreOptionsParams.bOnlineGame; + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_QuadrantSignin,&info); + } + +#ifdef __ORBIS__ + // check the status of the PSPlus common dialog + switch (sceNpCommerceDialogUpdateStatus()) + { + case SCE_COMMON_DIALOG_STATUS_FINISHED: + { + SceNpCommerceDialogResult Result; + sceNpCommerceDialogGetResult(&Result); + sceNpCommerceDialogTerminate(); + + if(Result.authorized) + { + ProfileManager.PsPlusUpdate(ProfileManager.GetPrimaryPad(), &Result); + // they just became a PSPlus member + LoadDataComplete(this); + } + else + { + // continue offline? + UINT uiIDA[1]; + uiIDA[0]=IDS_PRO_NOTONLINE_DECLINE; + + // Give the player a warning about the texture pack missing + ui.RequestMessageBox(IDS_PLAY_OFFLINE,IDS_NO_PLAYSTATIONPLUS, uiIDA, 1, ProfileManager.GetPrimaryPad(),&UIScene_LoadMenu::ContinueOffline,this,app.GetStringTable(), 0, 0, false); + } + } + break; + default: + break; + } +#endif + + UIScene::tick(); +} + +#ifdef __ORBIS__ +int UIScene_LoadMenu::ContinueOffline(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadMenu* pClass = (UIScene_LoadMenu*)pParam; + + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultAccept) + { + pClass->m_MoreOptionsParams.bOnlineGame=false; + pClass->LoadDataComplete(pClass); + } + return 0; +} + +#endif + +void UIScene_LoadMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if(m_bIgnoreInput) return; + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + app.SetCorruptSaveDeleted(false); + navigateBack(); + handled = true; + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + + // 4J-JEV: Inform user why their game must be offline. +#if defined _XBOX_ONE + if ( pressed && controlHasFocus(m_checkboxOnline.getId()) && !m_checkboxOnline.IsEnabled() ) + { + UINT uiIDA[1] = { IDS_CONFIRM_OK }; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + } +#endif + + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + case ACTION_MENU_OTHER_STICK_UP: + case ACTION_MENU_OTHER_STICK_DOWN: + sendInputToMovie(key, repeat, pressed, released); + +#if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 + if(getSceneResolution() == eSceneResolution_1080) + { + bool bOnlineGame = m_checkboxOnline.IsChecked(); + if (m_MoreOptionsParams.bOnlineGame != bOnlineGame) + { + m_MoreOptionsParams.bOnlineGame = bOnlineGame; + + if (!m_MoreOptionsParams.bOnlineGame) + { + m_MoreOptionsParams.bInviteOnly = false; + m_MoreOptionsParams.bAllowFriendsOfFriends = false; + } + } + } +#endif + handled = true; + break; + } +} + +void UIScene_LoadMenu::handlePress(F64 controlId, F64 childId) +{ + if(m_bIgnoreInput) return; + + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + switch((int)controlId) + { + case eControl_GameMode: + if(m_bGameModeSurvival) + { + m_buttonGamemode.setLabel(app.GetString(IDS_GAMEMODE_CREATIVE)); + m_bGameModeSurvival=false; + } + else + { + m_buttonGamemode.setLabel(app.GetString(IDS_GAMEMODE_SURVIVAL)); + m_bGameModeSurvival=true; + } + break; + case eControl_MoreOptions: + ui.NavigateToScene(m_iPad, eUIScene_LaunchMoreOptionsMenu, &m_MoreOptionsParams); + break; + case eControl_TexturePackList: + { + UpdateCurrentTexturePack((int)childId); + } + break; + case eControl_LoadWorld: + { +#ifdef _DURANGO + if(m_MoreOptionsParams.bOnlineGame) + { + m_bIgnoreInput = true; + ProfileManager.CheckMultiplayerPrivileges(m_iPad, true, &checkPrivilegeCallback, this); + } + else +#endif + { + StartSharedLaunchFlow(); + } + } + break; + }; +} + +#ifdef _DURANGO +void UIScene_LoadMenu::checkPrivilegeCallback(LPVOID lpParam, bool hasPrivilege, int iPad) +{ + UIScene_LoadMenu* pClass = (UIScene_LoadMenu*)lpParam; + + if(hasPrivilege) + { + pClass->StartSharedLaunchFlow(); + } + else + { + pClass->m_bIgnoreInput = false; + } +} +#endif + +void UIScene_LoadMenu::StartSharedLaunchFlow() +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + // Check if we need to upsell the texture pack + if(m_MoreOptionsParams.dwTexturePack!=0) + { + // texture pack hasn't been set yet, so check what it will be + TexturePack *pTexturePack = pMinecraft->skins->getTexturePackById(m_MoreOptionsParams.dwTexturePack); + + if(pTexturePack==NULL) + { +#if TO_BE_IMPLEMENTED + // They've selected a texture pack they don't have yet + // upsell + CXuiCtrl4JList::LIST_ITEM_INFO ListItem; + // get the current index of the list, and then get the data + ListItem=m_pTexturePacksList->GetData(m_currentTexturePackIndex); + + + // upsell the texture pack + // tell sentient about the upsell of the full version of the skin pack + ULONGLONG ullOfferID_Full; + app.GetDLCFullOfferIDForPackID(m_MoreOptionsParams.dwTexturePack,&ullOfferID_Full); + + TelemetryManager->RecordUpsellPresented(ProfileManager.GetPrimaryPad(), eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); +#endif + + UINT uiIDA[2]; + + uiIDA[0]=IDS_TEXTUREPACK_FULLVERSION; + //uiIDA[1]=IDS_TEXTURE_PACK_TRIALVERSION; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + // Give the player a warning about the texture pack missing + ui.RequestMessageBox(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&TexturePackDialogReturned,this,app.GetStringTable(),NULL,0,false); + return; + } + } + m_bIgnoreInput = true; + + // if the profile data has been changed, then force a profile write (we save the online/invite/friends of friends settings) + // It seems we're allowed to break the 5 minute rule if it's the result of a user action + // check the checkboxes + + // Only save the online setting if the user changed it - we may change it because we're offline, but don't want that saved + if(!m_MoreOptionsParams.bOnlineSettingChangedBySystem) + { + app.SetGameSettings(m_iPad,eGameSetting_Online,m_MoreOptionsParams.bOnlineGame?1:0); + } + app.SetGameSettings(m_iPad,eGameSetting_InviteOnly,m_MoreOptionsParams.bInviteOnly?1:0); + app.SetGameSettings(m_iPad,eGameSetting_FriendsOfFriends,m_MoreOptionsParams.bAllowFriendsOfFriends?1:0); + + app.CheckGameSettingsChanged(true,m_iPad); + + // Check that we have the rights to use a texture pack we have selected. + if(m_MoreOptionsParams.dwTexturePack!=0) + { + // texture pack hasn't been set yet, so check what it will be + TexturePack *pTexturePack = pMinecraft->skins->getTexturePackById(m_MoreOptionsParams.dwTexturePack); + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)pTexturePack; + m_pDLCPack=pDLCTexPack->getDLCInfoParentPack(); + + // do we have a license? + if(m_pDLCPack && !m_pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) + { + // no + + // We need to allow people to use a trial texture pack if they are offline - we only need them online if they want to buy it. + + /* + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + + if(!ProfileManager.IsSignedInLive(m_iPad)) + { + // need to be signed in to live + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); + m_bIgnoreInput = false; + return; + } + else */ + { + // upsell +#ifdef _XBOX + DLC_INFO *pDLCInfo = app.GetDLCInfoForTrialOfferID(m_pDLCPack->getPurchaseOfferId()); + ULONGLONG ullOfferID_Full; + + if(pDLCInfo!=NULL) + { + ullOfferID_Full=pDLCInfo->ullOfferID_Full; + } + else + { + ullOfferID_Full=pTexturePack->getDLCPack()->getPurchaseOfferId(); + } + + // tell sentient about the upsell of the full version of the texture pack + TelemetryManager->RecordUpsellPresented(m_iPad, eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); +#endif + +#if defined(_WINDOWS64) || defined(_DURANGO) + // trial pack warning + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_USING_TRIAL_TEXUREPACK_WARNING, uiIDA, 1, m_iPad,&TrialTexturePackWarningReturned,this,app.GetStringTable(),NULL,0,false); +#elif defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + // trial pack warning + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + ui.RequestMessageBox(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_USING_TRIAL_TEXUREPACK_WARNING, uiIDA, 2, m_iPad,&TrialTexturePackWarningReturned,this,app.GetStringTable(),NULL,0,false); +#endif + +#if defined _XBOX_ONE || defined __ORBIS__ + StorageManager.SetSaveDisabled(true); +#endif + return; + } + } + } + +#if defined _XBOX_ONE || defined __ORBIS__ + app.SetGameHostOption(eGameHostOption_DisableSaving, m_MoreOptionsParams.bDisableSaving?1:0); + + StorageManager.SetSaveDisabled(m_MoreOptionsParams.bDisableSaving); +#endif + +#if TO_BE_IMPLEMENTED + // Reset the background downloading, in case we changed it by attempting to download a texture pack + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_AUTO); +#endif + + // Check if they have the Reset Nether flag set, and confirm they want to do this + if(m_MoreOptionsParams.bResetNether==TRUE) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_DONT_RESET_NETHER; + uiIDA[1]=IDS_RESET_NETHER; + + ui.RequestMessageBox(IDS_RESETNETHER_TITLE, IDS_RESETNETHER_TEXT, uiIDA, 2, m_iPad,&UIScene_LoadMenu::CheckResetNetherReturned,this,app.GetStringTable(),NULL,0,false); + } + else + { + LaunchGame(); + } +} + +void UIScene_LoadMenu::handleSliderMove(F64 sliderId, F64 currentValue) +{ + WCHAR TempString[256]; + int value = (int)currentValue; + switch((int)sliderId) + { + case eControl_Difficulty: + m_sliderDifficulty.handleSliderMove(value); + + app.SetGameSettings(m_iPad,eGameSetting_Difficulty,value); + swprintf( (WCHAR *)TempString, 256, L"%ls: %ls", app.GetString( IDS_SLIDER_DIFFICULTY ),app.GetString(m_iDifficultyTitleSettingA[value])); + m_sliderDifficulty.setLabel(TempString); + break; + } +} + +void UIScene_LoadMenu::handleTouchBoxRebuild() +{ + m_bRebuildTouchBoxes = true; +} + + +void UIScene_LoadMenu::handleTimerComplete(int id) +{ +#ifdef __PSVITA__ + // we cannot rebuild touch boxes in an iggy callback because it requires further iggy calls + if(m_bRebuildTouchBoxes) + { + GetMainPanel()->UpdateControl(); + ui.TouchBoxRebuild(this); + m_bRebuildTouchBoxes = false; + } +#endif + + switch(id) + { + case GAME_CREATE_ONLINE_TIMER_ID: + { + bool bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); + + if(bMultiplayerAllowed != m_bMultiplayerAllowed) + { + if( bMultiplayerAllowed ) + { + bool bGameSetting_Online=(app.GetGameSettings(m_iPad,eGameSetting_Online)!=0); + m_MoreOptionsParams.bOnlineGame = bGameSetting_Online?TRUE:FALSE; + if(bGameSetting_Online) + { + m_MoreOptionsParams.bInviteOnly = (app.GetGameSettings(m_iPad,eGameSetting_InviteOnly)!=0)?TRUE:FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = (app.GetGameSettings(m_iPad,eGameSetting_FriendsOfFriends)!=0)?TRUE:FALSE; + } + else + { + m_MoreOptionsParams.bInviteOnly = FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = FALSE; + } + } + else + { + m_MoreOptionsParams.bOnlineGame = FALSE; + m_MoreOptionsParams.bInviteOnly = FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = FALSE; + } +#if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 + if(getSceneResolution() == eSceneResolution_1080) + { + m_checkboxOnline.SetEnable(bMultiplayerAllowed); + m_checkboxOnline.setChecked(m_MoreOptionsParams.bOnlineGame); + } +#endif + + m_bMultiplayerAllowed = bMultiplayerAllowed; + } + } + break; + // 4J-PB - Only Xbox will not have trial DLC patched into the game +#ifdef _XBOX + case CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID: + { + +#if defined(__PS3__) || defined(__ORBIS__) + for(int i=0;ichImageURL); + + if(hasRegisteredSubstitutionTexture(textureName)==false) + { + PBYTE pbImageData; + int iImageDataBytes=0; + SonyHttp::getDataFromURL(pDLCInfo->chImageURL,(void **)&pbImageData,&iImageDataBytes); + + if(iImageDataBytes!=0) + { + // set the image + registerSubstitutionTexture(textureName,pbImageData,iImageDataBytes,true); + // add an item in + m_texturePackList.addPack(m_iConfigA[i],textureName); + m_iConfigA[i]=-1; + } + } + else + { + // already have the image, so add an item in + m_texturePackList.addPack(m_iConfigA[i],textureName); + m_iConfigA[i]=-1; + } + } + } + } + + bool bAllDone=true; + for(int i=0;iSaveInfoA[(int)m_iSaveGameInfoIndex].UTF8SaveTitle,pSaveDetails->SaveInfoA[(int)m_iSaveGameInfoIndex].UTF8SaveFilename); +#endif + C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveData(&pSaveDetails->SaveInfoA[(int)m_iSaveGameInfoIndex],&LoadSaveDataReturned,this); + +#if TO_BE_IMPLEMENTED + if(eLoadStatus==C4JStorage::ELoadGame_DeviceRemoved) + { + // disable saving + StorageManager.SetSaveDisabled(true); + StorageManager.SetSaveDeviceSelected(m_iPad,false); + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestMessageBox(IDS_STORAGEDEVICEPROBLEM_TITLE, IDS_FAILED_TO_LOADSAVE_TEXT, uiIDA, 1, m_iPad,&CScene_LoadGameSettings::DeviceRemovedDialogReturned,this); + + } +#endif + } + } + else + { + // ask if they're sure they want to turn this into a creative map + ui.RequestMessageBox(IDS_TITLE_START_GAME, IDS_CONFIRM_START_CREATIVE, uiIDA, 2, m_iPad,&UIScene_LoadMenu::ConfirmLoadReturned,this,app.GetStringTable(),NULL,0,false); + } + } + } + else + { + ui.RequestMessageBox(IDS_TITLE_START_GAME, IDS_CONFIRM_START_HOST_PRIVILEGES, uiIDA, 2, m_iPad,&UIScene_LoadMenu::ConfirmLoadReturned,this,app.GetStringTable(),NULL,0,false); + } + } + else + { + if(m_levelGen != NULL) + { + LoadLevelGen(m_levelGen); + } + else + { + // set the save to load + PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo(); +#ifndef _DURANGO + app.DebugPrintf("Loading save %s [%s]\n",pSaveDetails->SaveInfoA[(int)m_iSaveGameInfoIndex].UTF8SaveTitle,pSaveDetails->SaveInfoA[(int)m_iSaveGameInfoIndex].UTF8SaveFilename); +#endif + C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveData(&pSaveDetails->SaveInfoA[(int)m_iSaveGameInfoIndex],&LoadSaveDataReturned,this); + +#if TO_BE_IMPLEMENTED + if(eLoadStatus==C4JStorage::ELoadGame_DeviceRemoved) + { + // disable saving + StorageManager.SetSaveDisabled(true); + StorageManager.SetSaveDeviceSelected(m_iPad,false); + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestMessageBox(IDS_STORAGEDEVICEPROBLEM_TITLE, IDS_FAILED_TO_LOADSAVE_TEXT, uiIDA, 1, m_iPad,&CScene_LoadGameSettings::DeviceRemovedDialogReturned,this); + } +#endif + } + } + //return 0; +} + +int UIScene_LoadMenu::CheckResetNetherReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadMenu* pClass = (UIScene_LoadMenu*)pParam; + + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { + // continue and reset the nether + pClass->LaunchGame(); + } + else if(result==C4JStorage::EMessage_ResultAccept) + { + // turn off the reset nether and continue + pClass->m_MoreOptionsParams.bResetNether=FALSE; + pClass->LaunchGame(); + } + else + { + // else they chose cancel + pClass->m_bIgnoreInput=false; + } + return 0; +} + +int UIScene_LoadMenu::ConfirmLoadReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadMenu* pClass = (UIScene_LoadMenu*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + if(pClass->m_levelGen != NULL) + { + pClass->LoadLevelGen(pClass->m_levelGen); + } + else + { + // set the save to load + PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo(); +#ifndef _DURANGO + app.DebugPrintf("Loading save %s [%s]\n",pSaveDetails->SaveInfoA[(int)pClass->m_iSaveGameInfoIndex].UTF8SaveTitle,pSaveDetails->SaveInfoA[(int)pClass->m_iSaveGameInfoIndex].UTF8SaveFilename); +#endif + C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveData(&pSaveDetails->SaveInfoA[(int)pClass->m_iSaveGameInfoIndex],&LoadSaveDataReturned,pClass); + +#if TO_BE_IMPLEMENTED + if(eLoadStatus==C4JStorage::ELoadGame_DeviceRemoved) + { + // disable saving + StorageManager.SetSaveDisabled(true); + StorageManager.SetSaveDeviceSelected(m_iPad,false); + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestMessageBox(IDS_STORAGEDEVICEPROBLEM_TITLE, IDS_FAILED_TO_LOADSAVE_TEXT, uiIDA, 1, m_iPad,&CScene_LoadGameSettings::DeviceRemovedDialogReturned,this); + } +#endif + } + } + else + { + pClass->m_bIgnoreInput=false; + } + return 0; +} + +int UIScene_LoadMenu::LoadDataComplete(void *pParam) +{ + UIScene_LoadMenu* pClass = (UIScene_LoadMenu*)pParam; + + if(!pClass->m_bIsCorrupt) + { + int iPrimaryPad = ProfileManager.GetPrimaryPad(); + bool isSignedInLive = true; + bool isOnlineGame = pClass->m_MoreOptionsParams.bOnlineGame; + int iPadNotSignedInLive = -1; + bool isLocalMultiplayerAvailable = app.IsLocalMultiplayerAvailable(); + + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if (ProfileManager.IsSignedIn(i) && ((i == iPrimaryPad) || isLocalMultiplayerAvailable)) + { + if (isSignedInLive && !ProfileManager.IsSignedInLive(i)) + { + // Record the first non signed in live pad + iPadNotSignedInLive = i; + } + + isSignedInLive = isSignedInLive && ProfileManager.IsSignedInLive(i); + } + } + + // If this is an online game but not all players are signed in to Live, stop! + if (isOnlineGame && !isSignedInLive) + { +#ifdef __ORBIS__ + assert(iPadNotSignedInLive != -1); + // Check if PSN is unavailable because of age restriction + int npAvailability = ProfileManager.getNPAvailability(iPadNotSignedInLive); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + pClass->m_bIgnoreInput = false; + // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive if the npAvailability isn't SCE_OK + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive, NULL, NULL, app.GetStringTable()); + } + else + { + pClass->m_bIgnoreInput=true; + UINT uiIDA[2]; + uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1] = IDS_CANCEL; + ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPadNotSignedInLive, &UIScene_LoadMenu::MustSignInReturnedPSN, pClass, app.GetStringTable(), NULL, 0, false); + } + return 0; +#else + pClass->m_bIgnoreInput=false; + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(),NULL,0,false); + return 0; +#endif + } + + // Check if user-created content is allowed, as we cannot play multiplayer if it's not + bool noUGC = false; + BOOL pccAllowed = TRUE; + BOOL pccFriendsAllowed = TRUE; + bool bContentRestricted = false; + ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); +#if defined(__PS3__) || defined(__PSVITA__) + if(isOnlineGame) + { + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),false,NULL,&bContentRestricted,NULL); + } +#endif + +#ifdef __ORBIS__ + bool bPlayStationPlus=true; + int iPadWithNoPlaystationPlus=0; + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if(ProfileManager.IsSignedIn(i) && ((i == iPrimaryPad) || isLocalMultiplayerAvailable)) + { + if(!ProfileManager.HasPlayStationPlus(i)) + { + bPlayStationPlus=false; + iPadWithNoPlaystationPlus=i; + break; + } + } + } +#endif + noUGC = !pccAllowed && !pccFriendsAllowed; + + if(!isOnlineGame || !isLocalMultiplayerAvailable) + { + if(isOnlineGame && noUGC ) + { + pClass->setVisible( true ); + + ui.RequestUGCMessageBox(); + + pClass->m_bIgnoreInput=false; + } + else if(isOnlineGame && bContentRestricted ) + { + pClass->setVisible( true ); + + ui.RequestContentRestrictedMessageBox(); + pClass->m_bIgnoreInput=false; + } +#ifdef __ORBIS__ + else if(isOnlineGame && (bPlayStationPlus==false)) + { + pClass->setVisible( true ); + pClass->m_bIgnoreInput=false; + + // 4J-PB - we're not allowed to show the text Playstation Plus - have to call the upsell all the time! + // upsell psplus + int32_t iResult=sceNpCommerceDialogInitialize(); + + SceNpCommerceDialogParam param; + sceNpCommerceDialogParamInitialize(¶m); + param.mode=SCE_NP_COMMERCE_DIALOG_MODE_PLUS; + param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY; + param.userId = ProfileManager.getUserID(iPadWithNoPlaystationPlus); + + iResult=sceNpCommerceDialogOpen(¶m); + +// UINT uiIDA[2]; +// uiIDA[0]=IDS_PLAY_OFFLINE; +// uiIDA[1]=IDS_PLAYSTATIONPLUS_SIGNUP; +// ui.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_PLAYSTATIONPLUS, uiIDA,2,ProfileManager.GetPrimaryPad(),&UIScene_LoadMenu::PSPlusReturned,pClass, app.GetStringTable(),NULL,0,false); + } + +#endif + else + { + +#if defined(__ORBIS__) || defined(__PSVITA__) + if(isOnlineGame) + { + bool chatRestricted = false; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),false,&chatRestricted,NULL,NULL); + if(chatRestricted) + { + ProfileManager.DisplaySystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION, ProfileManager.GetPrimaryPad() ); + } + } +#endif + DWORD dwLocalUsersMask = CGameNetworkManager::GetLocalPlayerMask(ProfileManager.GetPrimaryPad()); + + // No guest problems so we don't need to force a sign-in of players here + StartGameFromSave(pClass, dwLocalUsersMask); + } + } + else + { + // 4J-PB not sure why we aren't checking the content restriction for the main player here when multiple controllers are connected - adding now + if(isOnlineGame && noUGC ) + { + pClass->setVisible( true ); + ui.RequestUGCMessageBox(); + pClass->m_bIgnoreInput=false; + } + else if(isOnlineGame && bContentRestricted ) + { + pClass->setVisible( true ); + ui.RequestContentRestrictedMessageBox(); + pClass->m_bIgnoreInput=false; + } +#ifdef __ORBIS__ + else if(bPlayStationPlus==false) + { + pClass->setVisible( true ); + pClass->m_bIgnoreInput=false; + + // 4J-PB - we're not allowed to show the text Playstation Plus - have to call the upsell all the time! + // upsell psplus + int32_t iResult=sceNpCommerceDialogInitialize(); + + SceNpCommerceDialogParam param; + sceNpCommerceDialogParamInitialize(¶m); + param.mode=SCE_NP_COMMERCE_DIALOG_MODE_PLUS; + param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY; + param.userId = ProfileManager.getUserID(iPadWithNoPlaystationPlus); + + iResult=sceNpCommerceDialogOpen(¶m); + +// UINT uiIDA[2]; +// uiIDA[0]=IDS_PLAY_OFFLINE; +// uiIDA[1]=IDS_PLAYSTATIONPLUS_SIGNUP; +// ui.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_PLAYSTATIONPLUS, uiIDA,2,ProfileManager.GetPrimaryPad(),&UIScene_LoadMenu::PSPlusReturned,pClass, app.GetStringTable(),NULL,0,false); + } +#endif + else + { + pClass->m_bRequestQuadrantSignin = true; + } + } + } + else + { + // the save is corrupt! + pClass->m_bIgnoreInput=false; + + // give the option to delete the save + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_CORRUPT_OR_DAMAGED_SAVE_TITLE, IDS_CORRUPT_OR_DAMAGED_SAVE_TEXT, uiIDA, 2, pClass->m_iPad,&UIScene_LoadMenu::DeleteSaveDialogReturned,pClass, app.GetStringTable(),NULL,0,false); + + } + + return 0; +} + +int UIScene_LoadMenu::LoadSaveDataReturned(void *pParam,bool bIsCorrupt, bool bIsOwner) +{ + UIScene_LoadMenu* pClass = (UIScene_LoadMenu*)pParam; + + pClass->m_bIsCorrupt=bIsCorrupt; + if(bIsOwner) + { + LoadDataComplete(pClass); + } + else + { + // messagebox + pClass->m_bIgnoreInput=false; + +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + // show the message that trophies are disabled + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_SAVEDATA_COPIED_TITLE, IDS_SAVEDATA_COPIED_TEXT, uiIDA, 1, + pClass->m_iPad,&UIScene_LoadMenu::TrophyDialogReturned,pClass, app.GetStringTable()); +#endif + } + + + return 0; +} + +int UIScene_LoadMenu::TrophyDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadMenu* pClass = (UIScene_LoadMenu*)pParam; + return LoadDataComplete(pClass); +} + +int UIScene_LoadMenu::DeleteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadMenu* pClass = (UIScene_LoadMenu*)pParam; + + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { + PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo(); + StorageManager.DeleteSaveData(&pSaveDetails->SaveInfoA[(int)pClass->m_iSaveGameInfoIndex],UIScene_LoadMenu::DeleteSaveDataReturned,pClass); + } + else + { + pClass->m_bIgnoreInput=false; + } + return 0; +} + +int UIScene_LoadMenu::DeleteSaveDataReturned(void *pParam,bool bSuccess) +{ + UIScene_LoadMenu* pClass = (UIScene_LoadMenu*)pParam; + + app.SetCorruptSaveDeleted(true); + pClass->navigateBack(); + + return 0; +} + +// 4J Stu - Shared functionality that is the same whether we needed a quadrant sign-in or not +void UIScene_LoadMenu::StartGameFromSave(UIScene_LoadMenu* pClass, DWORD dwLocalUsersMask) +{ + INT saveOrCheckpointId = 0; + bool validSave = StorageManager.GetSaveUniqueNumber(&saveOrCheckpointId); + TelemetryManager->RecordLevelResume(pClass->m_iPad, eSen_FriendOrMatch_Playing_With_Invited_Friends, eSen_CompeteOrCoop_Coop_and_Competitive, app.GetGameSettings(pClass->m_iPad,eGameSetting_Difficulty), app.GetLocalPlayerCount(), g_NetworkManager.GetOnlinePlayerCount(), saveOrCheckpointId); + + bool isClientSide = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && pClass->m_MoreOptionsParams.bOnlineGame; +#ifdef __PSVITA__ + if(CGameNetworkManager::usingAdhocMode()) + { + if(SQRNetworkManager_AdHoc_Vita::GetAdhocStatus())// && pClass->m_MoreOptionsParams.bOnlineGame) + isClientSide = true; + } +#endif // __PSVITA__ + + bool isPrivate = (app.GetGameSettings(pClass->m_iPad,eGameSetting_InviteOnly)>0)?true:false; + + PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo(); + + NetworkGameInitData *param = new NetworkGameInitData(); + param->seed = pClass->m_seed; + param->saveData = NULL; + param->texturePackId = pClass->m_MoreOptionsParams.dwTexturePack; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->skins->selectTexturePackById(pClass->m_MoreOptionsParams.dwTexturePack); + //pMinecraft->skins->updateUI(); + + app.SetGameHostOption(eGameHostOption_Difficulty,Minecraft::GetInstance()->options->difficulty); + app.SetGameHostOption(eGameHostOption_FriendsOfFriends,app.GetGameSettings(pClass->m_iPad,eGameSetting_FriendsOfFriends)); + app.SetGameHostOption(eGameHostOption_Gamertags,app.GetGameSettings(pClass->m_iPad,eGameSetting_GamertagsVisible)); + + app.SetGameHostOption(eGameHostOption_BedrockFog,app.GetGameSettings(pClass->m_iPad,eGameSetting_BedrockFog)?1:0); + + app.SetGameHostOption(eGameHostOption_PvP,pClass->m_MoreOptionsParams.bPVP); + app.SetGameHostOption(eGameHostOption_TrustPlayers,pClass->m_MoreOptionsParams.bTrust ); + app.SetGameHostOption(eGameHostOption_FireSpreads,pClass->m_MoreOptionsParams.bFireSpreads ); + app.SetGameHostOption(eGameHostOption_TNT,pClass->m_MoreOptionsParams.bTNT ); + app.SetGameHostOption(eGameHostOption_HostCanFly,pClass->m_MoreOptionsParams.bHostPrivileges); + app.SetGameHostOption(eGameHostOption_HostCanChangeHunger,pClass->m_MoreOptionsParams.bHostPrivileges); + app.SetGameHostOption(eGameHostOption_HostCanBeInvisible,pClass->m_MoreOptionsParams.bHostPrivileges ); + + // flag if the user wants to reset the Nether to force a Fortress with netherwart etc. + app.SetResetNether((pClass->m_MoreOptionsParams.bResetNether==TRUE)?true:false); + // clear out the app's terrain features list + app.ClearTerrainFeaturePosition(); + + app.SetGameHostOption(eGameHostOption_GameType,pClass->m_bGameModeSurvival?GameType::SURVIVAL->getId():GameType::CREATIVE->getId() ); + + g_NetworkManager.HostGame(dwLocalUsersMask,isClientSide,isPrivate,MINECRAFT_NET_MAX_PLAYERS,0); + + param->settings = app.GetGameHostOption( eGameHostOption_All ); + +#ifndef _XBOX + g_NetworkManager.FakeLocalPlayerJoined(); +#endif + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc; + loadingParams->lpParam = (LPVOID)param; + + // Reset the autosave time + app.SetAutosaveTimerTime(); + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); +} + +void UIScene_LoadMenu::checkStateAndStartGame() +{ + // Check if they have the Reset Nether flag set, and confirm they want to do this + if(m_MoreOptionsParams.bResetNether==TRUE) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_DONT_RESET_NETHER; + uiIDA[1]=IDS_RESET_NETHER; + + ui.RequestMessageBox(IDS_RESETNETHER_TITLE, IDS_RESETNETHER_TEXT, uiIDA, 2, m_iPad,&UIScene_LoadMenu::CheckResetNetherReturned,this,app.GetStringTable(),NULL,0,false); + } + else + { + LaunchGame(); + } +} + +void UIScene_LoadMenu::LoadLevelGen(LevelGenerationOptions *levelGen) +{ + bool isClientSide = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && m_MoreOptionsParams.bOnlineGame; + + // 4J Stu - If we only have one controller connected, then don't show the sign-in UI again + DWORD connectedControllers = 0; + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if( InputManager.IsPadConnected(i) || ProfileManager.IsSignedIn(i) ) ++connectedControllers; + } + + if(!isClientSide || connectedControllers == 1 || !RenderManager.IsHiDef()) + { + + // Check if user-created content is allowed, as we cannot play multiplayer if it's not + bool noUGC = false; + BOOL pccAllowed = TRUE; + BOOL pccFriendsAllowed = TRUE; + + ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); + if(!pccAllowed && !pccFriendsAllowed) noUGC = true; + + if(isClientSide && noUGC ) + { + m_bIgnoreInput=false; + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(),NULL,0,false); + return; + } + + } + + DWORD dwLocalUsersMask = 0; + + dwLocalUsersMask |= CGameNetworkManager::GetLocalPlayerMask(ProfileManager.GetPrimaryPad()); + // Load data from disc + //File saveFile( L"Tutorial\\Tutorial" ); + //LoadSaveFromDisk(&saveFile); + + StorageManager.ResetSaveData(); + // Make our next save default to the name of the level + StorageManager.SetSaveTitle(levelGen->getDefaultSaveName().c_str()); + + bool isPrivate = (app.GetGameSettings(m_iPad,eGameSetting_InviteOnly)>0)?true:false; + + g_NetworkManager.HostGame(dwLocalUsersMask,isClientSide,isPrivate,MINECRAFT_NET_MAX_PLAYERS,0); + + NetworkGameInitData *param = new NetworkGameInitData(); + param->seed = 0; + param->saveData = NULL; + param->levelGen = levelGen; + + if(levelGen->requiresTexturePack()) + { + param->texturePackId = levelGen->getRequiredTexturePackId(); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->skins->selectTexturePackById(param->texturePackId); + //pMinecraft->skins->updateUI(); + } + + + app.SetGameHostOption(eGameHostOption_Difficulty,Minecraft::GetInstance()->options->difficulty); + app.SetGameHostOption(eGameHostOption_FriendsOfFriends,app.GetGameSettings(m_iPad,eGameSetting_FriendsOfFriends)); + app.SetGameHostOption(eGameHostOption_Gamertags,app.GetGameSettings(m_iPad,eGameSetting_GamertagsVisible)); + + app.SetGameHostOption(eGameHostOption_BedrockFog,app.GetGameSettings(m_iPad,eGameSetting_BedrockFog)?1:0); + + app.SetGameHostOption(eGameHostOption_PvP,m_MoreOptionsParams.bPVP); + app.SetGameHostOption(eGameHostOption_TrustPlayers,m_MoreOptionsParams.bTrust ); + app.SetGameHostOption(eGameHostOption_FireSpreads,m_MoreOptionsParams.bFireSpreads ); + app.SetGameHostOption(eGameHostOption_TNT,m_MoreOptionsParams.bTNT ); + app.SetGameHostOption(eGameHostOption_HostCanFly,m_MoreOptionsParams.bHostPrivileges); + app.SetGameHostOption(eGameHostOption_HostCanChangeHunger,m_MoreOptionsParams.bHostPrivileges); + app.SetGameHostOption(eGameHostOption_HostCanBeInvisible,m_MoreOptionsParams.bHostPrivileges ); + + // flag if the user wants to reset the Nether to force a Fortress with netherwart etc. + app.SetResetNether((m_MoreOptionsParams.bResetNether==TRUE)?true:false); + // clear out the app's terrain features list + app.ClearTerrainFeaturePosition(); + + app.SetGameHostOption(eGameHostOption_GameType,m_bGameModeSurvival?GameType::SURVIVAL->getId():GameType::CREATIVE->getId() ); + + param->settings = app.GetGameHostOption( eGameHostOption_All ); + +#ifndef _XBOX + g_NetworkManager.FakeLocalPlayerJoined(); +#endif + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc; + loadingParams->lpParam = (LPVOID)param; + + // Reset the autosave time + app.SetAutosaveTimerTime(); + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); +} + +int UIScene_LoadMenu::StartGame_SignInReturned(void *pParam,bool bContinue, int iPad) +{ + UIScene_LoadMenu* pClass = (UIScene_LoadMenu*)pParam; + + if(bContinue==true) + { + // It's possible that the player has not signed in - they can back out + if(ProfileManager.IsSignedIn(pClass->m_iPad)) + { + int primaryPad = ProfileManager.GetPrimaryPad(); + bool noPrivileges = false; + DWORD dwLocalUsersMask = 0; + bool isSignedInLive = ProfileManager.IsSignedInLive(primaryPad); + bool isOnlineGame = pClass->m_MoreOptionsParams.bOnlineGame; + int iPadNotSignedInLive = -1; + bool isLocalMultiplayerAvailable = app.IsLocalMultiplayerAvailable(); + + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if (ProfileManager.IsSignedIn(i) && ((i == primaryPad) || isLocalMultiplayerAvailable)) + { + if (isSignedInLive && !ProfileManager.IsSignedInLive(i)) + { + // Record the first non signed in live pad + iPadNotSignedInLive = i; + } + + if( !ProfileManager.AllowedToPlayMultiplayer(i) ) noPrivileges = true; + dwLocalUsersMask |= CGameNetworkManager::GetLocalPlayerMask(i); + isSignedInLive = isSignedInLive && ProfileManager.IsSignedInLive(i); + } + } + + // If this is an online game but not all players are signed in to Live, stop! + if (isOnlineGame && !isSignedInLive) + { +#ifdef __ORBIS__ + assert(iPadNotSignedInLive != -1); + + // Check if PSN is unavailable because of age restriction + int npAvailability = ProfileManager.getNPAvailability(iPadNotSignedInLive); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + pClass->m_bIgnoreInput = false; + // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive if the npAvailability isn't SCE_OK + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive, NULL, NULL, app.GetStringTable()); + } + else + { + pClass->m_bIgnoreInput=true; + UINT uiIDA[2]; + uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1] = IDS_CANCEL; + ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPadNotSignedInLive, &UIScene_LoadMenu::MustSignInReturnedPSN, pClass, app.GetStringTable(), NULL, 0, false); + } + return 0; +#else + pClass->m_bIgnoreInput=false; + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(),NULL,0,false); + return 0; +#endif + } + + // Check if user-created content is allowed, as we cannot play multiplayer if it's not + bool noUGC = false; + BOOL pccAllowed = TRUE; + BOOL pccFriendsAllowed = TRUE; + + ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); + if(!pccAllowed && !pccFriendsAllowed) noUGC = true; + + if(isSignedInLive && isOnlineGame && (noPrivileges || noUGC) ) + { + if( noUGC ) + { + pClass->m_bIgnoreInput = false; + pClass->setVisible( true ); + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(),NULL,0,false); + } + else + { + pClass->m_bIgnoreInput = false; + pClass->setVisible( true ); + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_HOST_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(),NULL,0,false); + } + } + else + { +#if defined( __ORBIS__) || defined(__PSVITA__) + if(isOnlineGame) + { + // show the chat restriction message for all users that it applies to + for(unsigned int i = 0; i < XUSER_MAX_COUNT; i++) + { + if(ProfileManager.IsSignedInLive(i)) + { + bool chatRestricted = false; + ProfileManager.GetChatAndContentRestrictions(i,false,&chatRestricted,NULL,NULL); + if(chatRestricted) + { + ProfileManager.DisplaySystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION, i ); + } + } + } + } +#endif + // This is NOT called from a storage manager thread, and is in fact called from the main thread in the Profile library tick. Therefore we use the main threads IntCache. + StartGameFromSave(pClass, dwLocalUsersMask); + } + } + } + else + { + pClass->m_bIgnoreInput=false; + } + + return 0; +} + +void UIScene_LoadMenu::handleGainFocus(bool navBack) +{ + if(navBack) + { + +#if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 + if(getSceneResolution() == eSceneResolution_1080) + { + m_checkboxOnline.setChecked(m_MoreOptionsParams.bOnlineGame == TRUE); + } +#endif + } +} + +#ifdef __ORBIS__ +int UIScene_LoadMenu::MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadMenu* pClass = (UIScene_LoadMenu *)pParam; + pClass->m_bIgnoreInput = false; + + if(result==C4JStorage::EMessage_ResultAccept) + { + SQRNetworkManager_Orbis::AttemptPSNSignIn(&UIScene_LoadMenu::StartGame_SignInReturned, pClass, false, iPad); + } + + return 0; +} + +// int UIScene_LoadMenu::PSPlusReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +// { +// int32_t iResult; +// UIScene_LoadMenu *pClass = (UIScene_LoadMenu *)pParam; +// +// // continue offline, or upsell PS Plus? +// if(result==C4JStorage::EMessage_ResultDecline) +// { +// // upsell psplus +// iResult=sceNpCommerceDialogInitialize(); +// +// SceNpCommerceDialogParam param; +// sceNpCommerceDialogParamInitialize(¶m); +// param.mode=SCE_NP_COMMERCE_DIALOG_MODE_PLUS; +// param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY; +// param.userId = ProfileManager.getUserID(pClass->m_iPad); +// +// +// iResult=sceNpCommerceDialogOpen(¶m); +// } +// else if(result==C4JStorage::EMessage_ResultAccept) +// { +// // continue offline +// pClass->m_MoreOptionsParams.bOnlineGame=false; +// pClass->LoadDataComplete(pClass); +// } +// +// pClass->m_bIgnoreInput=false; +// return 0; +// } +#endif \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_LoadMenu.h b/Minecraft.Client/Common/UI/UIScene_LoadMenu.h new file mode 100644 index 00000000..e45fa09c --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_LoadMenu.h @@ -0,0 +1,131 @@ +#pragma once + +#include "IUIScene_StartGame.h" + +class UIScene_LoadMenu : public IUIScene_StartGame +{ +private: + enum EControls + { + eControl_GameMode, + eControl_Difficulty, + eControl_MoreOptions, + eControl_LoadWorld, + eControl_TexturePackList, + eControl_OnlineGame, + }; + + static int m_iDifficultyTitleSettingA[4]; + + UIControl m_controlMainPanel; + UIControl_Label m_labelGameName, m_labelSeed, m_labelCreatedMode; + UIControl_Button m_buttonGamemode, m_buttonMoreOptions, m_buttonLoadWorld; + UIControl_Slider m_sliderDifficulty; + UIControl_BitmapIcon m_bitmapIcon; + +#if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 + UIControl_CheckBox m_checkboxOnline; +#endif + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(IUIScene_StartGame) + UI_MAP_ELEMENT( m_controlMainPanel, "MainPanel" ) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + UI_MAP_ELEMENT( m_labelGameName, "GameName") + UI_MAP_ELEMENT( m_labelCreatedMode, "CreatedMode") + UI_MAP_ELEMENT( m_labelSeed, "Seed") + UI_MAP_ELEMENT( m_texturePackList, "TexturePackSelector") + UI_MAP_ELEMENT( m_buttonGamemode, "GameModeToggle") + +#if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 + UI_MAP_ELEMENT( m_checkboxOnline, "CheckboxOnline") +#endif + UI_MAP_ELEMENT( m_buttonMoreOptions, "MoreOptions") + UI_MAP_ELEMENT( m_buttonLoadWorld, "LoadSettings") + UI_MAP_ELEMENT( m_sliderDifficulty, "Difficulty") + UI_MAP_ELEMENT( m_bitmapIcon, "LevelIcon") + UI_END_MAP_CHILD_ELEMENTS() + UI_END_MAP_ELEMENTS_AND_NAMES() + + LevelGenerationOptions *m_levelGen; + DLCPack * m_pDLCPack; + + int m_iSaveGameInfoIndex; + int m_CurrentDifficulty; + bool m_bGameModeSurvival; + bool m_bHasBeenInCreative; + bool m_bRetrievingSaveThumbnail; + bool m_bSaveThumbnailReady; + bool m_bMultiplayerAllowed; + bool m_bShowTimer; + bool m_bAvailableTexturePacksChecked; + bool m_bRequestQuadrantSignin; + bool m_bIsCorrupt; + bool m_bThumbnailGetFailed; + __int64 m_seed; + +#ifdef __PS3__ + std::vector*m_pvProductInfo; +#endif + //int *m_iConfigA; // track the texture packs that we don't have installed + + PBYTE m_pbThumbnailData; + unsigned int m_uiThumbnailSize; + wstring m_thumbnailName; + + bool m_bRebuildTouchBoxes; +public: + UIScene_LoadMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual void updateTooltips(); + virtual void updateComponents(); + + virtual EUIScene getSceneType() { return eUIScene_LoadMenu;} + + virtual void tick(); + + virtual UIControl* GetMainPanel(); + + virtual void handleTouchBoxRebuild(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + virtual void handleTimerComplete(int id); + +protected: + void handlePress(F64 controlId, F64 childId); + void handleSliderMove(F64 sliderId, F64 currentValue); + virtual void handleGainFocus(bool navBack); + +private: + void StartSharedLaunchFlow(); + virtual void checkStateAndStartGame(); + void LoadLevelGen(LevelGenerationOptions *levelGen); + void LaunchGame(void); + +#ifdef _DURANGO + static void checkPrivilegeCallback(LPVOID lpParam, bool hasPrivilege, int iPad); +#endif + + static int ConfirmLoadReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static void StartGameFromSave(UIScene_LoadMenu* pClass, DWORD dwLocalUsersMask); + static int LoadSaveDataReturned(void *pParam,bool bIsCorrupt, bool bIsOwner); + static int TrophyDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int LoadDataComplete(void *pParam); + static int LoadSaveDataThumbnailReturned(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes); + static int CheckResetNetherReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int DeleteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int DeleteSaveDataReturned(void *pParam,bool bSuccess); + static int MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EMessageResult result); +#ifdef __ORBIS__ + //static int PSPlusReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ContinueOffline(void *pParam,int iPad,C4JStorage::EMessageResult result); +#endif + +public: + static int StartGame_SignInReturned(LPVOID pParam, bool, int); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp b/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp new file mode 100644 index 00000000..1d90da77 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp @@ -0,0 +1,3536 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_LoadOrJoinMenu.h" + +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.chunk.storage.h" +#include "..\..\..\Minecraft.World\ConsoleSaveFile.h" +#include "..\..\..\Minecraft.World\ConsoleSaveFileOriginal.h" +#include "..\..\..\Minecraft.World\ConsoleSaveFileSplit.h" +#include "..\..\ProgressRenderer.h" +#include "..\..\MinecraftServer.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\TexturePack.h" +#include "..\Network\SessionInfo.h" +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) +#include "Common\Network\Sony\SonyHttp.h" +#include "Common\Network\Sony\SonyRemoteStorage.h" +#endif +#if defined(__ORBIS__) || defined(__PSVITA__) +#include +#endif +#ifdef __PSVITA__ +#include "message_dialog.h" +#endif + + +#ifdef SONY_REMOTE_STORAGE_DOWNLOAD +unsigned long UIScene_LoadOrJoinMenu::m_ulFileSize=0L; +wstring UIScene_LoadOrJoinMenu::m_wstrStageText=L""; +#endif + + +#define JOIN_LOAD_ONLINE_TIMER_ID 0 +#define JOIN_LOAD_ONLINE_TIMER_TIME 100 + +#ifdef _XBOX +#define CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID 3 +#define CHECKFORAVAILABLETEXTUREPACKS_TIMER_TIME 50 +#endif + +#ifdef _XBOX_ONE +UIScene_LoadOrJoinMenu::ESaveTransferFiles UIScene_LoadOrJoinMenu::s_eSaveTransferFile; +unsigned long UIScene_LoadOrJoinMenu::s_ulFileSize=0L; +byteArray UIScene_LoadOrJoinMenu::s_transferData = byteArray(); +wstring UIScene_LoadOrJoinMenu::m_wstrStageText=L""; + +#ifdef _DEBUG_MENUS_ENABLED +C4JStorage::SAVETRANSFER_FILE_DETAILS UIScene_LoadOrJoinMenu::m_debugTransferDetails; +#endif +#endif + +int UIScene_LoadOrJoinMenu::LoadSaveDataThumbnailReturned(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes) +{ + UIScene_LoadOrJoinMenu *pClass= (UIScene_LoadOrJoinMenu *)lpParam; + + app.DebugPrintf("Received data for save thumbnail\n"); + + if(pbThumbnail && dwThumbnailBytes) + { + pClass->m_saveDetails[pClass->m_iRequestingThumbnailId].pbThumbnailData = new BYTE[dwThumbnailBytes]; + memcpy(pClass->m_saveDetails[pClass->m_iRequestingThumbnailId].pbThumbnailData, pbThumbnail, dwThumbnailBytes); + pClass->m_saveDetails[pClass->m_iRequestingThumbnailId].dwThumbnailSize = dwThumbnailBytes; + } + else + { + pClass->m_saveDetails[pClass->m_iRequestingThumbnailId].pbThumbnailData = NULL; + pClass->m_saveDetails[pClass->m_iRequestingThumbnailId].dwThumbnailSize = 0; + app.DebugPrintf("Save thumbnail data is NULL, or has size 0\n"); + } + pClass->m_bSaveThumbnailReady = true; + + return 0; +} + +int UIScene_LoadOrJoinMenu::LoadSaveCallback(LPVOID lpParam,bool bRes) +{ + //UIScene_LoadOrJoinMenu *pClass= (UIScene_LoadOrJoinMenu *)lpParam; + // Get the save data now + if(bRes) + { + app.DebugPrintf("Loaded save OK\n"); + } + return 0; +} + +UIScene_LoadOrJoinMenu::UIScene_LoadOrJoinMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + app.SetLiveLinkRequired( true ); + + m_iRequestingThumbnailId = 0; + m_iSaveInfoC=0; + m_bIgnoreInput = false; + m_bShowingPartyGamesOnly = false; + m_bInParty = false; + m_currentSessions = NULL; + m_iState=e_SavesIdle; + //m_bRetrievingSaveInfo=false; + + m_buttonListSaves.init(eControl_SavesList); + m_buttonListGames.init(eControl_GamesList); + + m_labelSavesListTitle.init( app.GetString(IDS_START_GAME) ); + m_labelJoinListTitle.init( app.GetString(IDS_JOIN_GAME) ); + m_labelNoGames.init( app.GetString(IDS_NO_GAMES_FOUND) ); + m_labelNoGames.setVisible( false ); + m_controlSavesTimer.setVisible( true ); + m_controlJoinTimer.setVisible( true ); + + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + m_spaceIndicatorSaves.init(L"",eControl_SpaceIndicator,0, (4LL *1024LL * 1024LL * 1024LL) ); +#endif + m_bUpdateSaveSize = false; + + m_bAllLoaded = false; + m_bRetrievingSaveThumbnails = false; + m_bSaveThumbnailReady = false; + m_bExitScene=false; + m_pSaveDetails=NULL; + m_bSavesDisplayed=false; + m_saveDetails = NULL; + m_iSaveDetailsCount = 0; + m_iTexturePacksNotInstalled = 0; + m_bCopying = false; + m_bCopyingCancelled = false; + +#ifndef _XBOX_ONE + m_bSaveTransferCancelled=false; + m_bSaveTransferInProgress=false; +#endif + m_eAction = eAction_None; + + m_bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); + +#ifdef _XBOX_ONE + // 4J-PB - in order to buy the skin packs & texture packs, we need the signed offer ids for them, which we get in the availability info + // we need to retrieve this info though, so do it here + app.AddDLCRequest(e_Marketplace_Content); // content is skin packs, texture packs and mash-up packs +#endif + + + int iLB = -1; + +#ifdef _XBOX + XPARTY_USER_LIST partyList; + + if((XPartyGetUserList( &partyList ) != XPARTY_E_NOT_IN_PARTY ) && (partyList.dwUserCount>1)) + { + m_bInParty=true; + } + else + { + m_bInParty=false; + } +#endif + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) || defined(_DURANGO) + // Always clear the saves when we enter this menu + StorageManager.ClearSavesInfo(); +#endif + + // block input if we're waiting for DLC to install, and wipe the saves list. The end of dlc mounting custom message will fill the list again + if(app.StartInstallDLCProcess(m_iPad)==true || app.DLCInstallPending()) + { + // if we're waiting for DLC to mount, don't fill the save list. The custom message on end of dlc mounting will do that + m_bIgnoreInput = true; + } + else + { + Initialise(); + } + +#ifdef __PSVITA__ + if(CGameNetworkManager::usingAdhocMode() && SQRNetworkManager_AdHoc_Vita::GetAdhocStatus()) + { + g_NetworkManager.startAdhocMatching(); // create the client matching context and clear out the friends list + } + +#endif + + UpdateGamesList(); + + g_NetworkManager.SetSessionsUpdatedCallback( &UpdateGamesListCallback, this ); + + m_initData= new JoinMenuInitData(); + + // 4J Stu - Fix for #12530 -TCR 001 BAS Game Stability: Title will crash if the player disconnects while starting a new world and then opts to play the tutorial once they have been returned to the Main Menu. + MinecraftServer::resetFlags(); + + // If we're not ignoring input, then we aren't still waiting for the DLC to mount, and can now check for corrupt dlc. Otherwise this will happen when the dlc has finished mounting. + if( !m_bIgnoreInput) + { + app.m_dlcManager.checkForCorruptDLCAndAlert(); + } + + // 4J-PB - Only Xbox will not have trial DLC patched into the game +#ifdef _XBOX + // 4J-PB - there may be texture packs we don't have, so use the info from TMS for this + + DLC_INFO *pDLCInfo=NULL; + + // first pass - look to see if there are any that are not in the list + bool bTexturePackAlreadyListed; + bool bNeedToGetTPD=false; + Minecraft *pMinecraft = Minecraft::GetInstance(); + int texturePacksCount = pMinecraft->skins->getTexturePackCount(); + + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + bTexturePackAlreadyListed=false; +#if defined(__PS3__) || defined(__ORBIS__) + char *pchDLCName=app.GetDLCInfoTextures(i); + pDLCInfo=app.GetDLCInfo(pchDLCName); +#else + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); +#endif + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + if(pDLCInfo && pDLCInfo->iConfig==tp->getDLCParentPackId()) + { + bTexturePackAlreadyListed=true; + } + } + if(bTexturePackAlreadyListed==false) + { + // some missing + bNeedToGetTPD=true; + + m_iTexturePacksNotInstalled++; + } + } + + if(bNeedToGetTPD==true) + { + // add a TMS request for them + app.DebugPrintf("+++ Adding TMSPP request for texture pack data\n"); + app.AddTMSPPFileTypeRequest(e_DLC_TexturePackData); + m_iConfigA= new int [m_iTexturePacksNotInstalled]; + m_iTexturePacksNotInstalled=0; + + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + bTexturePackAlreadyListed=false; +#if defined(__PS3__) || defined(__ORBIS__) + char *pchDLCName=app.GetDLCInfoTextures(i); + pDLCInfo=app.GetDLCInfo(pchDLCName); +#else + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); +#endif + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + if(pDLCInfo->iConfig==tp->getDLCParentPackId()) + { + bTexturePackAlreadyListed=true; + } + } + if(bTexturePackAlreadyListed==false) + { + m_iConfigA[m_iTexturePacksNotInstalled++]=pDLCInfo->iConfig; + } + } + } + + addTimer(CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID,CHECKFORAVAILABLETEXTUREPACKS_TIMER_TIME); +#endif + +#ifdef SONY_REMOTE_STORAGE_DOWNLOAD + m_eSaveTransferState = eSaveTransfer_Idle; +#endif +} + + +UIScene_LoadOrJoinMenu::~UIScene_LoadOrJoinMenu() +{ + g_NetworkManager.SetSessionsUpdatedCallback( NULL, NULL ); + app.SetLiveLinkRequired( false ); + + if(m_currentSessions) + { + for(AUTO_VAR(it, m_currentSessions->begin()); it < m_currentSessions->end(); ++it) + { + delete (*it); + } + } + +#if TO_BE_IMPLEMENTED + // Reset the background downloading, in case we changed it by attempting to download a texture pack + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_AUTO); +#endif + + if(m_saveDetails) + { + for(int i = 0; i < m_iSaveDetailsCount; ++i) + { + delete m_saveDetails[i].pbThumbnailData; + } + delete [] m_saveDetails; + } +} + +void UIScene_LoadOrJoinMenu::updateTooltips() +{ + // update the tooltips + // if the saves list has focus, then we should show the Delete Save tooltip + // if the games list has focus, then we should the the View Gamercard tooltip + int iRB=-1; + int iY = -1; + int iLB = -1; + int iX=-1; + if (DoesGamesListHaveFocus() && m_buttonListGames.getItemCount() > 0) + { + iY = IDS_TOOLTIPS_VIEW_GAMERCARD; + } + else if (DoesSavesListHaveFocus()) + { + if((m_iDefaultButtonsC > 0) && (m_iSaveListIndex >= m_iDefaultButtonsC)) + { + if(StorageManager.GetSaveDisabled()) + { + iRB=IDS_TOOLTIPS_DELETESAVE; + } + else + { + if(StorageManager.EnoughSpaceForAMinSaveGame()) + { + iRB=IDS_TOOLTIPS_SAVEOPTIONS; + } + else + { + iRB=IDS_TOOLTIPS_DELETESAVE; + } + } + } + } + else if(DoesMashUpWorldHaveFocus()) + { + // If it's a mash-up pack world, give the Hide option + iRB=IDS_TOOLTIPS_HIDE; + } + + if(m_bInParty) + { + if( m_bShowingPartyGamesOnly ) iLB = IDS_TOOLTIPS_ALL_GAMES; + else iLB = IDS_TOOLTIPS_PARTY_GAMES; + } + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + if(m_iPad == ProfileManager.GetPrimaryPad() ) iY = IDS_TOOLTIPS_GAME_INVITES; +#endif + + if(ProfileManager.IsFullVersion()==false ) + { + iRB = -1; + } + else if(StorageManager.GetSaveDisabled()) + { +#ifdef _XBOX + iX = IDS_TOOLTIPS_SELECTDEVICE; +#endif + } + else + { +#if defined _XBOX_ONE + if(ProfileManager.IsSignedInLive( m_iPad )) + { + // Is there a save from 360 on TMS? + iX=IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD; + } +#elif defined SONY_REMOTE_STORAGE_DOWNLOAD + // Is there a save from PS3 or PSVita available? + // Sony asked that this be displayed at all times so users are aware of the functionality. We'll display some text when there's no save available + //if(app.getRemoteStorage()->saveIsAvailable()) + { + bool bSignedInLive = ProfileManager.IsSignedInLive(m_iPad); + if(bSignedInLive) + { + iX=IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD; + } + } +#else + iX = IDS_TOOLTIPS_CHANGEDEVICE; +#endif + } + + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, iX, iY,-1,-1,iLB,iRB); +} + +// +void UIScene_LoadOrJoinMenu::Initialise() +{ + m_iSaveListIndex = 0; + m_iGameListIndex = 0; + + m_iDefaultButtonsC = 0; + m_iMashUpButtonsC=0; + + // Check if we're in the trial version + if(ProfileManager.IsFullVersion()==false) + { + + + AddDefaultButtons(); + +#if TO_BE_IMPLEMENTED + m_pSavesList->SetCurSelVisible(0); +#endif + } + else if(StorageManager.GetSaveDisabled()) + { +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + GetSaveInfo(); +#else + +#if TO_BE_IMPLEMENTED + if(StorageManager.GetSaveDeviceSelected(m_iPad)) +#endif + { + // saving is disabled, but we should still be able to load from a selected save device + + + + GetSaveInfo(); + } +#if TO_BE_IMPLEMENTED + else + { + AddDefaultButtons(); + m_controlSavesTimer.setVisible( false ); + } +#endif +#endif // __PS3__ || __ORBIS + } + else + { + // 4J-PB - we need to check that there is enough space left to create a copy of the save (for a rename) + bool bCanRename = StorageManager.EnoughSpaceForAMinSaveGame(); + + GetSaveInfo(); + } + + m_bIgnoreInput=false; + app.m_dlcManager.checkForCorruptDLCAndAlert(); +} + +void UIScene_LoadOrJoinMenu::updateComponents() +{ + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); +} + +void UIScene_LoadOrJoinMenu::handleDestroy() +{ +#ifdef __PSVITA__ + app.DebugPrintf("missing InputManager.DestroyKeyboard on Vita !!!!!!\n"); +#endif + + // shut down the keyboard if it is displayed +#if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO) + InputManager.DestroyKeyboard(); +#endif +} + +void UIScene_LoadOrJoinMenu::handleGainFocus(bool navBack) +{ + UIScene::handleGainFocus(navBack); + + updateTooltips(); + + // Add load online timer + addTimer(JOIN_LOAD_ONLINE_TIMER_ID,JOIN_LOAD_ONLINE_TIMER_TIME); + + if(navBack) + { + app.SetLiveLinkRequired( true ); + + m_bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); + + // re-enable button presses + m_bIgnoreInput=false; + + // block input if we're waiting for DLC to install, and wipe the saves list. The end of dlc mounting custom message will fill the list again + if(app.StartInstallDLCProcess(m_iPad)==false) + { + // not doing a mount, so re-enable input + m_bIgnoreInput=false; + } + else + { + m_bIgnoreInput=true; + m_buttonListSaves.clearList(); + m_controlSavesTimer.setVisible(true); + } + + if( m_bMultiplayerAllowed ) + { +#if TO_BE_IMPLEMENTED + HXUICLASS hClassFullscreenProgress = XuiFindClass( L"CScene_FullscreenProgress" ); + HXUICLASS hClassConnectingProgress = XuiFindClass( L"CScene_ConnectingProgress" ); + + // If we are navigating back from a full screen progress scene, then that means a connection attempt failed + if( XuiIsInstanceOf( hSceneFrom, hClassFullscreenProgress ) || XuiIsInstanceOf( hSceneFrom, hClassConnectingProgress ) ) + { + UpdateGamesList(); + } +#endif + } + else + { + m_buttonListGames.clearList(); + m_controlJoinTimer.setVisible(true); + m_labelNoGames.setVisible(false); +#if TO_BE_IMPLEMENTED + m_SavesList.InitFocus(m_iPad); +#endif + } + + // are we back here because of a delete of a corrupt save? + + if(app.GetCorruptSaveDeleted()) + { + // wipe the list and repopulate it + m_iState=e_SavesRepopulateAfterDelete; + app.SetCorruptSaveDeleted(false); + } + } +} + +void UIScene_LoadOrJoinMenu::handleLoseFocus() +{ + // Kill load online timer + killTimer(JOIN_LOAD_ONLINE_TIMER_ID); +} + +wstring UIScene_LoadOrJoinMenu::getMoviePath() +{ + return L"LoadOrJoinMenu"; +} + +void UIScene_LoadOrJoinMenu::tick() +{ + UIScene::tick(); + +#if (defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined _WINDOWS64 || defined __PSVITA__) + if(m_bExitScene) // navigate forward or back + { + if(!m_bRetrievingSaveThumbnails) + { + // need to wait for any callback retrieving thumbnail to complete + navigateBack(); + } + } + // Stop loading thumbnails if we navigate forwards + if(hasFocus(m_iPad)) + { +#if defined(_XBOX_ONE) || defined(__ORBIS__) + if(m_bUpdateSaveSize) + { + if((m_iDefaultButtonsC > 0) && (m_iSaveListIndex >= m_iDefaultButtonsC)) + { + m_spaceIndicatorSaves.selectSave(m_iSaveListIndex-m_iDefaultButtonsC); + } + else + { + m_spaceIndicatorSaves.selectSave(-1); + } + m_bUpdateSaveSize = false; + } +#endif + // Display the saves if we have them + if(!m_bSavesDisplayed) + { + m_pSaveDetails=StorageManager.ReturnSavesInfo(); + if(m_pSaveDetails!=NULL) + { + //CD - Fix - Adding define for ORBIS/XBOXONE +#if defined(_XBOX_ONE) || defined(__ORBIS__) + m_spaceIndicatorSaves.reset(); +#endif + + AddDefaultButtons(); + m_bSavesDisplayed=true; + UpdateGamesList(); + + if(m_saveDetails!=NULL) + { + for(unsigned int i = 0; i < m_iSaveDetailsCount; ++i) + { + if(m_saveDetails[i].pbThumbnailData!=NULL) + { + delete m_saveDetails[i].pbThumbnailData; + } + } + delete m_saveDetails; + } + m_saveDetails = new SaveListDetails[m_pSaveDetails->iSaveC]; + + m_iSaveDetailsCount = m_pSaveDetails->iSaveC; + for(unsigned int i = 0; i < m_pSaveDetails->iSaveC; ++i) + { +#if defined(_XBOX_ONE) + m_spaceIndicatorSaves.addSave(m_pSaveDetails->SaveInfoA[i].totalSize); +#elif defined(__ORBIS__) + m_spaceIndicatorSaves.addSave(m_pSaveDetails->SaveInfoA[i].blocksUsed * (32 * 1024) ); +#endif +#ifdef _DURANGO + m_buttonListSaves.addItem(m_pSaveDetails->SaveInfoA[i].UTF16SaveTitle, L""); + + m_saveDetails[i].saveId = i; + memcpy(m_saveDetails[i].UTF16SaveName, m_pSaveDetails->SaveInfoA[i].UTF16SaveTitle, 128); + memcpy(m_saveDetails[i].UTF16SaveFilename, m_pSaveDetails->SaveInfoA[i].UTF16SaveFilename, MAX_SAVEFILENAME_LENGTH); +#else + m_buttonListSaves.addItem(m_pSaveDetails->SaveInfoA[i].UTF8SaveTitle, L""); + + m_saveDetails[i].saveId = i; + memcpy(m_saveDetails[i].UTF8SaveName, m_pSaveDetails->SaveInfoA[i].UTF8SaveTitle, 128); + memcpy(m_saveDetails[i].UTF8SaveFilename, m_pSaveDetails->SaveInfoA[i].UTF8SaveFilename, MAX_SAVEFILENAME_LENGTH); +#endif + } + m_controlSavesTimer.setVisible( false ); + + // set focus on the first button + + } + } + + if(!m_bExitScene && m_bSavesDisplayed && !m_bRetrievingSaveThumbnails && !m_bAllLoaded) + { + if( m_iRequestingThumbnailId < (m_buttonListSaves.getItemCount() - m_iDefaultButtonsC )) + { + m_bRetrievingSaveThumbnails = true; + app.DebugPrintf("Requesting the first thumbnail\n"); + // set the save to load + PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo(); + C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveDataThumbnail(&pSaveDetails->SaveInfoA[(int)m_iRequestingThumbnailId],&LoadSaveDataThumbnailReturned,this); + + if(eLoadStatus!=C4JStorage::ESaveGame_GetSaveThumbnail) + { + // something went wrong + m_bRetrievingSaveThumbnails=false; + m_bAllLoaded = true; + } + } + } + else if (m_bSavesDisplayed && m_bSaveThumbnailReady) + { + m_bSaveThumbnailReady = false; + + // check we're not waiting to exit the scene + if(!m_bExitScene) + { + // convert to utf16 + uint16_t u16Message[MAX_SAVEFILENAME_LENGTH]; +#ifdef _DURANGO + // Already utf16 on durango + memcpy(u16Message, m_saveDetails[m_iRequestingThumbnailId].UTF16SaveFilename, MAX_SAVEFILENAME_LENGTH); +#elif defined(_WINDOWS64) + int result = ::MultiByteToWideChar( + CP_UTF8, // convert from UTF-8 + MB_ERR_INVALID_CHARS, // error on invalid chars + m_saveDetails[m_iRequestingThumbnailId].UTF8SaveFilename, // source UTF-8 string + MAX_SAVEFILENAME_LENGTH, // total length of source UTF-8 string, + // in CHAR's (= bytes), including end-of-string \0 + (wchar_t *)u16Message, // destination buffer + MAX_SAVEFILENAME_LENGTH // size of destination buffer, in WCHAR's + ); +#else +#ifdef __PS3 + size_t srcmax,dstmax; +#else + uint32_t srcmax,dstmax; + uint32_t srclen,dstlen; +#endif + srcmax=MAX_SAVEFILENAME_LENGTH; + dstmax=MAX_SAVEFILENAME_LENGTH; + +#if defined(__PS3__) + L10nResult lres= UTF8stoUTF16s((uint8_t *)m_saveDetails[m_iRequestingThumbnailId].UTF8SaveFilename,&srcmax,u16Message,&dstmax); +#else + SceCesUcsContext context; + sceCesUcsContextInit(&context); + + sceCesUtf8StrToUtf16Str(&context, (uint8_t *)m_saveDetails[m_iRequestingThumbnailId].UTF8SaveFilename,srcmax,&srclen,u16Message,dstmax,&dstlen); +#endif +#endif + if( m_saveDetails[m_iRequestingThumbnailId].pbThumbnailData ) + { + registerSubstitutionTexture((wchar_t *)u16Message,m_saveDetails[m_iRequestingThumbnailId].pbThumbnailData,m_saveDetails[m_iRequestingThumbnailId].dwThumbnailSize); + } + m_buttonListSaves.setTextureName(m_iRequestingThumbnailId + m_iDefaultButtonsC, (wchar_t *)u16Message); + + ++m_iRequestingThumbnailId; + if( m_iRequestingThumbnailId < (m_buttonListSaves.getItemCount() - m_iDefaultButtonsC )) + { + app.DebugPrintf("Requesting another thumbnail\n"); + // set the save to load + PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo(); + C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveDataThumbnail(&pSaveDetails->SaveInfoA[(int)m_iRequestingThumbnailId],&LoadSaveDataThumbnailReturned,this); + if(eLoadStatus!=C4JStorage::ESaveGame_GetSaveThumbnail) + { + // something went wrong + m_bRetrievingSaveThumbnails=false; + m_bAllLoaded = true; + } + } + else + { + m_bRetrievingSaveThumbnails = false; + m_bAllLoaded = true; + } + } + else + { + // stop retrieving thumbnails, and exit + m_bRetrievingSaveThumbnails = false; + } + } + } + + switch(m_iState) + { + case e_SavesIdle: + break; + case e_SavesRepopulate: + m_bIgnoreInput = false; + m_iState=e_SavesIdle; + m_bAllLoaded=false; + m_bRetrievingSaveThumbnails=false; + m_iRequestingThumbnailId = 0; + GetSaveInfo(); + break; + case e_SavesRepopulateAfterMashupHide: + m_bIgnoreInput = false; + m_iRequestingThumbnailId = 0; + m_bAllLoaded=false; + m_bRetrievingSaveThumbnails=false; + m_bSavesDisplayed=false; + m_iSaveInfoC=0; + m_buttonListSaves.clearList(); + GetSaveInfo(); + m_iState=e_SavesIdle; + break; + case e_SavesRepopulateAfterDelete: + case e_SavesRepopulateAfterTransferDownload: + m_bIgnoreInput = false; + m_iRequestingThumbnailId = 0; + m_bAllLoaded=false; + m_bRetrievingSaveThumbnails=false; + m_bSavesDisplayed=false; + m_iSaveInfoC=0; + m_buttonListSaves.clearList(); + StorageManager.ClearSavesInfo(); + GetSaveInfo(); + m_iState=e_SavesIdle; + break; + } +#else + if(!m_bSavesDisplayed) + { + AddDefaultButtons(); + m_bSavesDisplayed=true; + m_controlSavesTimer.setVisible( false ); + } +#endif + +#ifdef _XBOX_ONE + if(g_NetworkManager.ShouldMessageForFullSession()) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox( IDS_CONNECTION_FAILED, IDS_IN_PARTY_SESSION_FULL, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + } +#endif + + // SAVE TRANSFERS +#ifdef __ORBIS__ + // check the status of the PSPlus common dialog + switch (sceNpCommerceDialogUpdateStatus()) + { + case SCE_COMMON_DIALOG_STATUS_FINISHED: + { + SceNpCommerceDialogResult Result; + sceNpCommerceDialogGetResult(&Result); + sceNpCommerceDialogTerminate(); + + if(Result.authorized) + { + // they just became a PSPlus member + ProfileManager.PsPlusUpdate(ProfileManager.GetPrimaryPad(), &Result); + + } + else + { + + } + + // 4J-JEV: Fix for PS4 #5148 - [ONLINE] If the user attempts to join a game when they do not have Playstation Plus, the title will lose all functionality. + m_bIgnoreInput = false; + } + break; + default: + break; + } +#endif + +} + +void UIScene_LoadOrJoinMenu::GetSaveInfo() +{ + unsigned int uiSaveC=0; + + // This will return with the number retrieved in uiSaveC + + if(app.DebugSettingsOn() && app.GetLoadSavesFromFolderEnabled()) + { +#ifdef __ORBIS__ + // We need to make sure this is non-null so that we have an idea of free space + m_pSaveDetails=StorageManager.ReturnSavesInfo(); + if(m_pSaveDetails==NULL) + { + C4JStorage::ESaveGameState eSGIStatus= StorageManager.GetSavesInfo(m_iPad,NULL,this,"save"); + } +#endif + + uiSaveC = 0; +#ifdef _XBOX + File savesDir(L"GAME:\\Saves"); +#else + File savesDir(L"Saves"); +#endif + if( savesDir.exists() ) + { + m_saves = savesDir.listFiles(); + uiSaveC = (unsigned int)m_saves->size(); + } + // add the New Game and Tutorial after the saves list is retrieved, if there are any saves + + // Add two for New Game and Tutorial + unsigned int listItems = uiSaveC; + + AddDefaultButtons(); + + for(unsigned int i=0;iat(i)->getName(); + wchar_t *name = new wchar_t[wName.size()+1]; + for(unsigned int j = 0; j < wName.size(); ++j) + { + name[j] = wName[j]; + } + name[wName.size()] = 0; + m_buttonListSaves.addItem(name,L""); + } + m_bSavesDisplayed = true; + m_bAllLoaded = true; + m_bIgnoreInput = false; + } + else + { + // clear the saves list + m_bSavesDisplayed = false; // we're blocking the exit from this scene until complete + m_buttonListSaves.clearList(); + m_iSaveInfoC=0; + m_controlSavesTimer.setVisible(true); + + m_pSaveDetails=StorageManager.ReturnSavesInfo(); + if(m_pSaveDetails==NULL) + { + C4JStorage::ESaveGameState eSGIStatus= StorageManager.GetSavesInfo(m_iPad,NULL,this,"save"); + } + +#if TO_BE_IMPLEMENTED + if(eSGIStatus==C4JStorage::ESGIStatus_NoSaves) + { + uiSaveC=0; + m_controlSavesTimer.setVisible( false ); + m_SavesList.SetEnable(TRUE); + } +#endif + } + + return; +} + +void UIScene_LoadOrJoinMenu::AddDefaultButtons() +{ + m_iDefaultButtonsC = 0; + m_iMashUpButtonsC=0; + m_generators.clear(); + + m_buttonListSaves.addItem(app.GetString(IDS_CREATE_NEW_WORLD)); + m_iDefaultButtonsC++; + + int i = 0; + + for(AUTO_VAR(it, app.getLevelGenerators()->begin()); it != app.getLevelGenerators()->end(); ++it) + { + LevelGenerationOptions *levelGen = *it; + + // retrieve the save icon from the texture pack, if there is one + unsigned int uiTexturePackID=levelGen->getRequiredTexturePackId(); + + if(uiTexturePackID!=0) + { + unsigned int uiMashUpWorldsBitmask=app.GetMashupPackWorlds(m_iPad); + + if((uiMashUpWorldsBitmask & (1<<(uiTexturePackID-1024)))==0) + { + // this world is hidden, so skip + continue; + } + } + + m_generators.push_back(levelGen); + m_buttonListSaves.addItem(levelGen->getWorldName()); + + if(uiTexturePackID!=0) + { + // increment the count of the mash-up pack worlds in the save list + m_iMashUpButtonsC++; + TexturePack *tp = Minecraft::GetInstance()->skins->getTexturePackById(levelGen->getRequiredTexturePackId()); + DWORD dwImageBytes; + PBYTE pbImageData = tp->getPackIcon(dwImageBytes); + + if(dwImageBytes > 0 && pbImageData) + { + wchar_t imageName[64]; + swprintf(imageName,64,L"tpack%08x",tp->getId()); + registerSubstitutionTexture(imageName, pbImageData, dwImageBytes); + m_buttonListSaves.setTextureName( m_buttonListSaves.getItemCount() - 1, imageName ); + } + } + + ++i; + } + m_iDefaultButtonsC += i; +} + +void UIScene_LoadOrJoinMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if(m_bIgnoreInput) return; + + // if we're retrieving save info, ignore key presses + if(!m_bSavesDisplayed) return; + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + m_bExitScene=true; +#else + navigateBack(); +#endif + handled = true; + } + break; + case ACTION_MENU_X: +#if TO_BE_IMPLEMENTED + // Change device + // Fix for #12531 - TCR 001: BAS Game Stability: When a player selects to change a storage + // device, and repeatedly backs out of the SD screen, disconnects from LIVE, and then selects a SD, the title crashes. + m_bIgnoreInput=true; + StorageManager.SetSaveDevice(&CScene_MultiGameJoinLoad::DeviceSelectReturned,this,true); + ui.PlayUISFX(eSFX_Press); +#endif + // Save Transfer +#ifdef _XBOX_ONE + if(ProfileManager.IsSignedInLive( m_iPad )) + { + UIScene_LoadOrJoinMenu::s_ulFileSize=0; + LaunchSaveTransfer(); + } +#endif +#ifdef SONY_REMOTE_STORAGE_DOWNLOAD + { + bool bSignedInLive = ProfileManager.IsSignedInLive(iPad); + if(bSignedInLive) + { + LaunchSaveTransfer(); + } + } +#endif + break; + case ACTION_MENU_Y: +#if defined(__PS3__) || defined(__PSVITA__) || defined(__ORBIS__) + m_eAction = eAction_ViewInvites; + if(pressed && iPad == ProfileManager.GetPrimaryPad()) + { +#ifdef __ORBIS__ + // Check if PSN is unavailable because of age restriction + int npAvailability = ProfileManager.getNPAvailability(iPad); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + UINT uiIDA[1]; + uiIDA[0] = IDS_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + + break; + } +#endif + + // are we offline? + if(!ProfileManager.IsSignedInLive(iPad)) + { + // get them to sign in to online + UINT uiIDA[2]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(), &UIScene_LoadOrJoinMenu::MustSignInReturnedPSN, this, app.GetStringTable(),NULL,0,false); + } + else + { +#ifdef __ORBIS__ + SQRNetworkManager_Orbis::RecvInviteGUI(); +#elif defined __PSVITA__ + SQRNetworkManager_Vita::RecvInviteGUI(); +#else + int ret = sceNpBasicRecvMessageCustom(SCE_NP_BASIC_MESSAGE_MAIN_TYPE_INVITE, SCE_NP_BASIC_RECV_MESSAGE_OPTIONS_INCLUDE_BOOTABLE, SYS_MEMORY_CONTAINER_ID_INVALID); + app.DebugPrintf("sceNpBasicRecvMessageCustom return %d ( %08x )\n", ret, ret); +#endif + } + } +#elif defined(_DURANGO) + if(getControlFocus() == eControl_GamesList && m_buttonListGames.getItemCount() > 0) + { + DWORD nIndex = m_buttonListGames.getCurrentSelection(); + FriendSessionInfo *pSelectedSession = m_currentSessions->at( nIndex ); + + PlayerUID uid = pSelectedSession->searchResult.m_playerXuids[0]; + if( uid != INVALID_XUID ) ProfileManager.ShowProfileCard(ProfileManager.GetLockedProfile(),uid); + ui.PlayUISFX(eSFX_Press); + } +#endif // __PS3__ || __ORBIS__ + break; + + case ACTION_MENU_RIGHT_SCROLL: + if(DoesSavesListHaveFocus()) + { + // 4J-PB - check we are on a valid save + if((m_iDefaultButtonsC != 0) && (m_iSaveListIndex >= m_iDefaultButtonsC)) + { + m_bIgnoreInput = true; + + // Could be delete save or Save Options + if(StorageManager.GetSaveDisabled()) + { + // delete the save game + // Have to ask the player if they are sure they want to delete this game + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_TOOLTIPS_DELETESAVE, IDS_TEXT_DELETE_SAVE, uiIDA, 2, iPad,&UIScene_LoadOrJoinMenu::DeleteSaveDialogReturned,this, app.GetStringTable(),NULL,0,false); + } + else + { + if(StorageManager.EnoughSpaceForAMinSaveGame()) + { + UINT uiIDA[4]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_TITLE_RENAMESAVE; + uiIDA[2]=IDS_TOOLTIPS_DELETESAVE; + int numOptions = 3; +#ifdef SONY_REMOTE_STORAGE_UPLOAD + if(ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())) + { + numOptions = 4; + uiIDA[3]=IDS_TOOLTIPS_SAVETRANSFER_UPLOAD; + } +#endif +#if defined _XBOX_ONE || defined __ORBIS__ + numOptions = 4; + uiIDA[3]=IDS_COPYSAVE; +#endif + ui.RequestMessageBox(IDS_TOOLTIPS_SAVEOPTIONS, IDS_TEXT_SAVEOPTIONS, uiIDA, numOptions, iPad,&UIScene_LoadOrJoinMenu::SaveOptionsDialogReturned,this, app.GetStringTable(),NULL,0,false); + } + else + { + // delete the save game + // Have to ask the player if they are sure they want to delete this game + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_TOOLTIPS_DELETESAVE, IDS_TEXT_DELETE_SAVE, uiIDA, 2,iPad,&UIScene_LoadOrJoinMenu::DeleteSaveDialogReturned,this, app.GetStringTable(),NULL,0,false); + } + } + ui.PlayUISFX(eSFX_Press); + } + } + else if(DoesMashUpWorldHaveFocus()) + { + // hiding a mash-up world + if((m_iSaveListIndex != JOIN_LOAD_CREATE_BUTTON_INDEX)) + { + LevelGenerationOptions *levelGen = m_generators.at(m_iSaveListIndex - 1); + + if(!levelGen->isTutorial()) + { + if(levelGen->requiresTexturePack()) + { + unsigned int uiPackID=levelGen->getRequiredTexturePackId(); + + m_bIgnoreInput = true; + app.HideMashupPackWorld(m_iPad,uiPackID); + + // update the saves list + m_iState = e_SavesRepopulateAfterMashupHide; + } + } + } + ui.PlayUISFX(eSFX_Press); + + } + break; + case ACTION_MENU_LEFT_SCROLL: +#ifdef _XBOX + if( m_bInParty ) + { + m_bShowingPartyGamesOnly = !m_bShowingPartyGamesOnly; + UpdateGamesList(); + CXuiSceneBase::PlayUISFX(eSFX_Press); + } +#endif + break; + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + { + // if we are on the saves menu, check there are games in the games list to move to + if(DoesSavesListHaveFocus()) + { + if( m_buttonListGames.getItemCount() > 0) + { + sendInputToMovie(key, repeat, pressed, released); + } + } + else + { + sendInputToMovie(key, repeat, pressed, released); + } + } + break; + + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + sendInputToMovie(key, repeat, pressed, released); + handled = true; + break; + } +} + +int UIScene_LoadOrJoinMenu::KeyboardCompleteWorldNameCallback(LPVOID lpParam,bool bRes) +{ + // 4J HEG - No reason to set value if keyboard was cancelled + UIScene_LoadOrJoinMenu *pClass=(UIScene_LoadOrJoinMenu *)lpParam; + pClass->m_bIgnoreInput=false; + if (bRes) + { + uint16_t ui16Text[128]; + ZeroMemory(ui16Text, 128 * sizeof(uint16_t) ); + InputManager.GetText(ui16Text); + + // check the name is valid + if(ui16Text[0]!=0) + { +#if (defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined(__PSVITA__)) + // open the save and overwrite the metadata + StorageManager.RenameSaveData(pClass->m_iSaveListIndex - pClass->m_iDefaultButtonsC, ui16Text,&UIScene_LoadOrJoinMenu::RenameSaveDataReturned,pClass); +#endif + } + else + { + pClass->m_bIgnoreInput=false; + pClass->updateTooltips(); + } + } + else + { + pClass->m_bIgnoreInput=false; + pClass->updateTooltips(); + } + + + return 0; +} +void UIScene_LoadOrJoinMenu::handleInitFocus(F64 controlId, F64 childId) +{ + app.DebugPrintf(app.USER_SR, "UIScene_LoadOrJoinMenu::handleInitFocus - %d , %d\n", (int)controlId, (int)childId); +} + +void UIScene_LoadOrJoinMenu::handleFocusChange(F64 controlId, F64 childId) +{ + app.DebugPrintf(app.USER_SR, "UIScene_LoadOrJoinMenu::handleFocusChange - %d , %d\n", (int)controlId, (int)childId); + + switch((int)controlId) + { + case eControl_GamesList: + m_iGameListIndex = childId; + m_buttonListGames.updateChildFocus( (int) childId ); + break; + case eControl_SavesList: + m_iSaveListIndex = childId; + m_bUpdateSaveSize = true; + break; + }; + updateTooltips(); +} + + +#ifdef SONY_REMOTE_STORAGE_DOWNLOAD +void UIScene_LoadOrJoinMenu::remoteStorageGetSaveCallback(LPVOID lpParam, SonyRemoteStorage::Status s, int error_code) +{ + app.DebugPrintf("remoteStorageGetCallback err : 0x%08x\n", error_code); + assert(error_code == 0); + ((UIScene_LoadOrJoinMenu*)lpParam)->LoadSaveFromCloud(); +} +#endif + +void UIScene_LoadOrJoinMenu::handlePress(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_SavesList: + { + m_bIgnoreInput=true; + + int lGenID = (int)childId - 1; + + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + if((int)childId == JOIN_LOAD_CREATE_BUTTON_INDEX) + { + app.SetTutorialMode( false ); + + m_controlJoinTimer.setVisible( false ); + + app.SetCorruptSaveDeleted(false); + + CreateWorldMenuInitData *params = new CreateWorldMenuInitData(); + params->iPad = m_iPad; + ui.NavigateToScene(m_iPad,eUIScene_CreateWorldMenu,(void *)params); + } + else if (lGenID < m_generators.size()) + { + LevelGenerationOptions *levelGen = m_generators.at(lGenID); + app.SetTutorialMode( levelGen->isTutorial() ); + // Reset the autosave time + app.SetAutosaveTimerTime(); + + if(levelGen->isTutorial()) + { + LoadLevelGen(levelGen); + } + else + { + LoadMenuInitData *params = new LoadMenuInitData(); + params->iPad = m_iPad; + // need to get the iIndex from the list item, since the position in the list doesn't correspond to the GetSaveGameInfo list because of sorting + params->iSaveGameInfoIndex=-1; + //params->pbSaveRenamed=&m_bSaveRenamed; + params->levelGen = levelGen; + params->saveDetails = NULL; + + // navigate to the settings scene + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_LoadMenu, params); + } + } + else + { +#ifdef __ORBIS__ + // check if this is a damaged save + PSAVE_INFO pSaveInfo = &m_pSaveDetails->SaveInfoA[((int)childId)-m_iDefaultButtonsC]; + if(pSaveInfo->thumbnailData == NULL && pSaveInfo->modifiedTime == 0) // no thumbnail data and time of zero and zero blocks useset for corrupt files + { + // give the option to delete the save + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_CORRUPT_OR_DAMAGED_SAVE_TITLE, IDS_CORRUPT_OR_DAMAGED_SAVE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_LoadOrJoinMenu::DeleteSaveDialogReturned,this, app.GetStringTable(),NULL,0,false); + + } + else +#endif + { + app.SetTutorialMode( false ); + + if(app.DebugSettingsOn() && app.GetLoadSavesFromFolderEnabled()) + { + LoadSaveFromDisk(m_saves->at((int)childId-m_iDefaultButtonsC)); + } + else + { + LoadMenuInitData *params = new LoadMenuInitData(); + params->iPad = m_iPad; + // need to get the iIndex from the list item, since the position in the list doesn't correspond to the GetSaveGameInfo list because of sorting + params->iSaveGameInfoIndex=((int)childId)-m_iDefaultButtonsC; + //params->pbSaveRenamed=&m_bSaveRenamed; + params->levelGen = NULL; + params->saveDetails = &m_saveDetails[ ((int)childId)-m_iDefaultButtonsC ]; + +#ifdef _XBOX_ONE + // On XB1, saves might need syncing, in which case inform the user so they can decide whether they want to wait for this to happen + if( m_pSaveDetails->SaveInfoA[params->iSaveGameInfoIndex].needsSync ) + { + unsigned int uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_SYNC; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + m_loadMenuInitData = params; + ui.RequestMessageBox(IDS_LOAD_SAVED_WORLD, IDS_CONFIRM_SYNC_REQUIRED, uiIDA, 2, ProfileManager.GetPrimaryPad(),&NeedSyncMessageReturned,this,app.GetStringTable(),NULL,0,false); + } + else +#endif + { + // navigate to the settings scene + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_LoadMenu, params); + } + } + } + } + } + break; + case eControl_GamesList: + { + m_bIgnoreInput=true; + + m_eAction = eAction_JoinGame; + + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + { + int nIndex = (int)childId; + m_iGameListIndex = nIndex; + CheckAndJoinGame(nIndex); + } + + break; + } + } +} + +void UIScene_LoadOrJoinMenu::CheckAndJoinGame(int gameIndex) +{ + if( m_buttonListGames.getItemCount() > 0 && gameIndex < m_currentSessions->size() ) + { +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + // 4J-PB - is the player allowed to join games? + bool noUGC=false; + bool bContentRestricted=false; + + // we're online, since we are joining a game + ProfileManager.GetChatAndContentRestrictions(m_iPad,true,&noUGC,&bContentRestricted,NULL); + +#ifdef __ORBIS__ + // 4J Stu - On PS4 we don't restrict playing multiplayer based on chat restriction, so remove this check + noUGC = false; + + bool bPlayStationPlus=true; + int iPadWithNoPlaystationPlus=0; + bool isSignedInLive = true; + int iPadNotSignedInLive = -1; + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if( InputManager.IsPadConnected(i) || ProfileManager.IsSignedIn(i) ) + { + if (isSignedInLive && !ProfileManager.IsSignedInLive(i)) + { + // Record the first non signed in live pad + iPadNotSignedInLive = i; + } + + isSignedInLive = isSignedInLive && ProfileManager.IsSignedInLive(i); + if(ProfileManager.HasPlayStationPlus(i)==false) + { + bPlayStationPlus=false; + break; + } + } + } +#endif +#ifdef __PSVITA__ + if( CGameNetworkManager::usingAdhocMode() ) + { + bContentRestricted = false; + noUGC = false; + } +#endif + + if(noUGC) + { + // not allowed to join +#ifndef __PSVITA__ + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + // Not allowed to play online + ui.RequestMessageBox(IDS_ONLINE_GAME, IDS_CHAT_RESTRICTION_UGC, uiIDA, 1, m_iPad,NULL,this,app.GetStringTable(),NULL,0,false); +#else + // Not allowed to play online + ProfileManager.ShowSystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION, 0 ); +#endif + + m_bIgnoreInput=false; + return; + } + else if(bContentRestricted) + { + ui.RequestContentRestrictedMessageBox(); + + m_bIgnoreInput=false; + return; + } +#ifdef __ORBIS__ + // If this is an online game but not all players are signed in to Live, stop! + else if (!isSignedInLive) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + + // Check if PSN is unavailable because of age restriction + int npAvailability = ProfileManager.getNPAvailability(iPadNotSignedInLive); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + m_bIgnoreInput = false; + // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive if the npAvailability isn't SCE_OK + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive, NULL, NULL, app.GetStringTable()); + } + else + { + ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA,1,iPadNotSignedInLive, &UIScene_LoadOrJoinMenu::MustSignInReturnedPSN, this, app.GetStringTable()); + } + return; + } + else if(bPlayStationPlus==false) + { + // PS Plus upsell + // 4J-PB - we're not allowed to show the text Playstation Plus - have to call the upsell all the time! + // upsell psplus + int32_t iResult=sceNpCommerceDialogInitialize(); + + SceNpCommerceDialogParam param; + sceNpCommerceDialogParamInitialize(¶m); + param.mode=SCE_NP_COMMERCE_DIALOG_MODE_PLUS; + param.features = SCE_NP_PLUS_FEATURE_REALTIME_MULTIPLAY; + param.userId = ProfileManager.getUserID(iPadWithNoPlaystationPlus); + + iResult=sceNpCommerceDialogOpen(¶m); + + // UINT uiIDA[2]; + // uiIDA[0]=IDS_CONFIRM_OK; + // uiIDA[1]=IDS_PLAYSTATIONPLUS_SIGNUP; + // ui.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_PLAYSTATIONPLUS, uiIDA,2,ProfileManager.GetPrimaryPad(),&UIScene_LoadOrJoinMenu::PSPlusReturned,this, app.GetStringTable(),NULL,0,false); + + m_bIgnoreInput=false; + return; + } + +#endif +#endif + + //CScene_MultiGameInfo::JoinMenuInitData *initData = new CScene_MultiGameInfo::JoinMenuInitData(); + m_initData->iPad = 0;; + m_initData->selectedSession = m_currentSessions->at( gameIndex ); + + // check that we have the texture pack available + // If it's not the default texture pack + if(m_initData->selectedSession->data.texturePackParentId!=0) + { + int texturePacksCount = Minecraft::GetInstance()->skins->getTexturePackCount(); + bool bHasTexturePackInstalled=false; + + for(int i=0;iskins->getTexturePackByIndex(i); + if(tp->getDLCParentPackId()==m_initData->selectedSession->data.texturePackParentId) + { + bHasTexturePackInstalled=true; + break; + } + } + + if(bHasTexturePackInstalled==false) + { + // upsell the texture pack + // tell sentient about the upsell of the full version of the skin pack +#ifdef _XBOX + ULONGLONG ullOfferID_Full; + app.GetDLCFullOfferIDForPackID(m_initData->selectedSession->data.texturePackParentId,&ullOfferID_Full); + + TelemetryManager->RecordUpsellPresented(m_iPad, eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); +#endif + UINT uiIDA[2]; + + uiIDA[0]=IDS_TEXTUREPACK_FULLVERSION; + //uiIDA[1]=IDS_TEXTURE_PACK_TRIALVERSION; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + + // Give the player a warning about the texture pack missing + ui.RequestMessageBox(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 2, m_iPad,&UIScene_LoadOrJoinMenu::TexturePackDialogReturned,this,app.GetStringTable(),NULL,0,false); + + return; + } + } + m_controlJoinTimer.setVisible( false ); + +#ifdef _XBOX + // Reset the background downloading, in case we changed it by attempting to download a texture pack + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_AUTO); +#endif + + m_bIgnoreInput=true; + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_JoinMenu,m_initData); + } +} + +void UIScene_LoadOrJoinMenu::LoadLevelGen(LevelGenerationOptions *levelGen) +{ + // Load data from disc + //File saveFile( L"Tutorial\\Tutorial" ); + //LoadSaveFromDisk(&saveFile); + + // clear out the app's terrain features list + app.ClearTerrainFeaturePosition(); + + StorageManager.ResetSaveData(); + // Make our next save default to the name of the level + StorageManager.SetSaveTitle(levelGen->getDefaultSaveName().c_str()); + + bool isClientSide = false; + bool isPrivate = false; + // TODO int maxPlayers = MINECRAFT_NET_MAX_PLAYERS; + int maxPlayers = 8; + + if( app.GetTutorialMode() ) + { + isClientSide = false; + maxPlayers = 4; + } + + g_NetworkManager.HostGame(0,isClientSide,isPrivate,maxPlayers,0); + + NetworkGameInitData *param = new NetworkGameInitData(); + param->seed = 0; + param->saveData = NULL; + param->settings = app.GetGameHostOption( eGameHostOption_Tutorial ); + param->levelGen = levelGen; + + if(levelGen->requiresTexturePack()) + { + param->texturePackId = levelGen->getRequiredTexturePackId(); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->skins->selectTexturePackById(param->texturePackId); + //pMinecraft->skins->updateUI(); + } + +#ifndef _XBOX + g_NetworkManager.FakeLocalPlayerJoined(); +#endif + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc; + loadingParams->lpParam = (LPVOID)param; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); +} + +void UIScene_LoadOrJoinMenu::UpdateGamesListCallback(LPVOID pParam) +{ + if(pParam != NULL) + { + UIScene_LoadOrJoinMenu *pScene = (UIScene_LoadOrJoinMenu *)pParam; + pScene->UpdateGamesList(); + } +} + +void UIScene_LoadOrJoinMenu::UpdateGamesList() +{ + // If we're ignoring input scene isn't active so do nothing + if (m_bIgnoreInput) return; + + // If a texture pack is loading, or will be loading, then ignore this ( we are going to be destroyed anyway) + if( Minecraft::GetInstance()->skins->getSelected()->isLoadingData() || (Minecraft::GetInstance()->skins->needsUIUpdate() || ui.IsReloadingSkin()) ) return; + + // if we're retrieving save info, don't show the list yet as we will be ignoring press events + if(!m_bSavesDisplayed) + { + return; + } + + + FriendSessionInfo *pSelectedSession = NULL; + if(DoesGamesListHaveFocus() && m_buttonListGames.getItemCount() > 0) + { + unsigned int nIndex = m_buttonListGames.getCurrentSelection(); + pSelectedSession = m_currentSessions->at( nIndex ); + } + + SessionID selectedSessionId; + ZeroMemory(&selectedSessionId,sizeof(SessionID)); + if( pSelectedSession != NULL )selectedSessionId = pSelectedSession->sessionId; + pSelectedSession = NULL; + + m_controlJoinTimer.setVisible( false ); + + // if the saves list has focus, then we should show the Delete Save tooltip + // if the games list has focus, then we should show the View Gamercard tooltip + int iRB=-1; + int iY = -1; + int iX=-1; + + delete m_currentSessions; + m_currentSessions = g_NetworkManager.GetSessionList( m_iPad, 1, m_bShowingPartyGamesOnly ); + + // Update the xui list displayed + unsigned int xuiListSize = m_buttonListGames.getItemCount(); + unsigned int filteredListSize = (unsigned int)m_currentSessions->size(); + + BOOL gamesListHasFocus = DoesGamesListHaveFocus(); + + if(filteredListSize > 0) + { +#if TO_BE_IMPLEMENTED + if( !m_pGamesList->IsEnabled() ) + { + m_pGamesList->SetEnable(TRUE); + m_pGamesList->SetCurSel( 0 ); + } +#endif + m_labelNoGames.setVisible( false ); + m_controlJoinTimer.setVisible( false ); + } + else + { +#if TO_BE_IMPLEMENTED + m_pGamesList->SetEnable(FALSE); +#endif + m_controlJoinTimer.setVisible( false ); + m_labelNoGames.setVisible( true ); + +#if TO_BE_IMPLEMENTED + if( gamesListHasFocus ) m_pGamesList->InitFocus(m_iPad); +#endif + } + + // clear out the games list and re-fill + m_buttonListGames.clearList(); + + if( filteredListSize > 0 ) + { + // Reset the focus to the selected session if it still exists + unsigned int sessionIndex = 0; + m_buttonListGames.setCurrentSelection(0); + + for( AUTO_VAR(it, m_currentSessions->begin()); it < m_currentSessions->end(); ++it) + { + FriendSessionInfo *sessionInfo = *it; + + wchar_t textureName[64] = L"\0"; + + // Is this a default game or a texture pack game? + if(sessionInfo->data.texturePackParentId!=0) + { + // Do we have the texture pack + Minecraft *pMinecraft = Minecraft::GetInstance(); + TexturePack *tp = pMinecraft->skins->getTexturePackById(sessionInfo->data.texturePackParentId); + HRESULT hr; + + DWORD dwImageBytes=0; + PBYTE pbImageData=NULL; + + if(tp==NULL) + { + DWORD dwBytes=0; + PBYTE pbData=NULL; + app.GetTPD(sessionInfo->data.texturePackParentId,&pbData,&dwBytes); + + // is it in the tpd data ? + app.GetFileFromTPD(eTPDFileType_Icon,pbData,dwBytes,&pbImageData,&dwImageBytes ); + if(dwImageBytes > 0 && pbImageData) + { + swprintf(textureName,64,L"%ls",sessionInfo->displayLabel); + registerSubstitutionTexture(textureName,pbImageData,dwImageBytes); + } + } + else + { + pbImageData = tp->getPackIcon(dwImageBytes); + if(dwImageBytes > 0 && pbImageData) + { + swprintf(textureName,64,L"%ls",sessionInfo->displayLabel); + registerSubstitutionTexture(textureName,pbImageData,dwImageBytes); + } + } + } + else + { + // default texture pack + Minecraft *pMinecraft = Minecraft::GetInstance(); + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(0); + + DWORD dwImageBytes; + PBYTE pbImageData = tp->getPackIcon(dwImageBytes); + + if(dwImageBytes > 0 && pbImageData) + { + swprintf(textureName,64,L"%ls",sessionInfo->displayLabel); + registerSubstitutionTexture(textureName,pbImageData,dwImageBytes); + } + } + + m_buttonListGames.addItem( sessionInfo->displayLabel, textureName ); + + if(memcmp( &selectedSessionId, &sessionInfo->sessionId, sizeof(SessionID) ) == 0) + { + m_buttonListGames.setCurrentSelection(sessionIndex); + break; + } + ++sessionIndex; + } + } + + updateTooltips(); +} + +void UIScene_LoadOrJoinMenu::HandleDLCMountingComplete() +{ + Initialise(); +} + +bool UIScene_LoadOrJoinMenu::DoesSavesListHaveFocus() +{ + if( m_buttonListSaves.hasFocus() ) + { + // check it's not the first or second element (new world or tutorial) + if(m_iSaveListIndex > (m_iDefaultButtonsC-1)) + { + return true; + } + } + return false; +} + +bool UIScene_LoadOrJoinMenu::DoesMashUpWorldHaveFocus() +{ + if(m_buttonListSaves.hasFocus()) + { + // check it's not the first or second element (new world or tutorial) + if(m_iSaveListIndex > (m_iDefaultButtonsC - 1)) + { + return false; + } + + if(m_iSaveListIndex > (m_iDefaultButtonsC - 1 - m_iMashUpButtonsC)) + { + return true; + } + else return false; + } + else return false; +} + +bool UIScene_LoadOrJoinMenu::DoesGamesListHaveFocus() +{ + return m_buttonListGames.hasFocus(); +} + +void UIScene_LoadOrJoinMenu::handleTimerComplete(int id) +{ + switch(id) + { + case JOIN_LOAD_ONLINE_TIMER_ID: + { +#ifdef _XBOX + XPARTY_USER_LIST partyList; + + if((XPartyGetUserList( &partyList ) != XPARTY_E_NOT_IN_PARTY ) && (partyList.dwUserCount>1)) + { + m_bInParty=true; + } + else + { + m_bInParty=false; + } +#endif + + bool bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); + if(bMultiplayerAllowed != m_bMultiplayerAllowed) + { + if( bMultiplayerAllowed ) + { + // m_CheckboxOnline.SetEnable(TRUE); + // m_CheckboxPrivate.SetEnable(TRUE); + } + else + { + m_bInParty = false; + m_buttonListGames.clearList(); + m_controlJoinTimer.setVisible( true ); + m_labelNoGames.setVisible( false ); + } + + m_bMultiplayerAllowed = bMultiplayerAllowed; + } + } + break; + // 4J-PB - Only Xbox will not have trial DLC patched into the game +#ifdef _XBOX + case CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID: + { + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + for(int i=0;ichImageURL); + + if(hasRegisteredSubstitutionTexture(textureName)==false) + { + PBYTE pbImageData; + int iImageDataBytes=0; + SonyHttp::getDataFromURL(pDLCInfo->chImageURL,(void **)&pbImageData,&iImageDataBytes); + + if(iImageDataBytes!=0) + { + // set the image + registerSubstitutionTexture(textureName,pbImageData,iImageDataBytes,true); + m_iConfigA[i]=-1; + } + + } + } + } + } + + bool bAllDone=true; + for(int i=0;igetName().c_str()); + + __int64 fileSize = saveFile->length(); + FileInputStream fis(*saveFile); + byteArray ba(fileSize); + fis.read(ba); + fis.close(); + + + + bool isClientSide = false; + bool isPrivate = false; + int maxPlayers = MINECRAFT_NET_MAX_PLAYERS; + + if( app.GetTutorialMode() ) + { + isClientSide = false; + maxPlayers = 4; + } + + app.SetGameHostOption(eGameHostOption_GameType,GameType::CREATIVE->getId() ); + + g_NetworkManager.HostGame(0,isClientSide,isPrivate,maxPlayers,0); + + LoadSaveDataThreadParam *saveData = new LoadSaveDataThreadParam(ba.data, ba.length, saveFile->getName()); + + NetworkGameInitData *param = new NetworkGameInitData(); + param->seed = 0; + param->saveData = saveData; + param->settings = app.GetGameHostOption( eGameHostOption_All ); + param->savePlatform = savePlatform; + +#ifndef _XBOX + g_NetworkManager.FakeLocalPlayerJoined(); +#endif + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc; + loadingParams->lpParam = (LPVOID)param; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); +} + +#ifdef SONY_REMOTE_STORAGE_DOWNLOAD +void UIScene_LoadOrJoinMenu::LoadSaveFromCloud() +{ + + wchar_t wFileName[128]; + mbstowcs(wFileName, app.getRemoteStorage()->getLocalFilename(), strlen(app.getRemoteStorage()->getLocalFilename())+1); // plus null + File cloudFile(wFileName); + + + StorageManager.ResetSaveData(); + + // Make our next save default to the name of the level + wchar_t wSaveName[128]; + mbstowcs(wSaveName, app.getRemoteStorage()->getSaveNameUTF8(), strlen(app.getRemoteStorage()->getSaveNameUTF8())+1); // plus null + StorageManager.SetSaveTitle(wSaveName); + + __int64 fileSize = cloudFile.length(); + FileInputStream fis(cloudFile); + byteArray ba(fileSize); + fis.read(ba); + fis.close(); + + + + bool isClientSide = false; + bool isPrivate = false; + int maxPlayers = MINECRAFT_NET_MAX_PLAYERS; + + if( app.GetTutorialMode() ) + { + isClientSide = false; + maxPlayers = 4; + } + + app.SetGameHostOption(eGameHostOption_All, app.getRemoteStorage()->getSaveHostOptions() ); + + g_NetworkManager.HostGame(0,isClientSide,isPrivate,maxPlayers,0); + + LoadSaveDataThreadParam *saveData = new LoadSaveDataThreadParam(ba.data, ba.length, cloudFile.getName()); + + NetworkGameInitData *param = new NetworkGameInitData(); + param->seed = app.getRemoteStorage()->getSaveSeed(); + param->saveData = saveData; + param->settings = app.GetGameHostOption( eGameHostOption_All ); + param->savePlatform = app.getRemoteStorage()->getSavePlatform(); + param->texturePackId = app.getRemoteStorage()->getSaveTexturePack(); + +#ifndef _XBOX + g_NetworkManager.FakeLocalPlayerJoined(); +#endif + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc; + loadingParams->lpParam = (LPVOID)param; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); +} + +#endif //SONY_REMOTE_STORAGE_DOWNLOAD + +int UIScene_LoadOrJoinMenu::DeleteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)pParam; + // results switched for this dialog + + // Check that we have a valid save selected (can get a bad index if the save list has been refreshed) + bool validSelection= pClass->m_iDefaultButtonsC != 0 && pClass->m_iSaveListIndex >= pClass->m_iDefaultButtonsC; + + if(result==C4JStorage::EMessage_ResultDecline && validSelection) + { + if(app.DebugSettingsOn() && app.GetLoadSavesFromFolderEnabled()) + { + pClass->m_bIgnoreInput=false; + } + else + { + StorageManager.DeleteSaveData(&pClass->m_pSaveDetails->SaveInfoA[pClass->m_iSaveListIndex - pClass->m_iDefaultButtonsC], UIScene_LoadOrJoinMenu::DeleteSaveDataReturned, (LPVOID)pClass->GetCallbackUniqueId()); + pClass->m_controlSavesTimer.setVisible( true ); + } + } + else + { + pClass->m_bIgnoreInput=false; + } + + return 0; +} + +int UIScene_LoadOrJoinMenu::DeleteSaveDataReturned(LPVOID lpParam,bool bRes) +{ + ui.EnterCallbackIdCriticalSection(); + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)ui.GetSceneFromCallbackId((size_t)lpParam); + + if(pClass) + { + if(bRes) + { + // wipe the list and repopulate it + pClass->m_iState=e_SavesRepopulateAfterDelete; + } + else pClass->m_bIgnoreInput=false; + + pClass->updateTooltips(); + } + ui.LeaveCallbackIdCriticalSection(); + return 0; +} + + +int UIScene_LoadOrJoinMenu::RenameSaveDataReturned(LPVOID lpParam,bool bRes) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)lpParam; + + if(bRes) + { + pClass->m_iState=e_SavesRepopulate; + } + else pClass->m_bIgnoreInput=false; + + pClass->updateTooltips(); + + return 0; +} + +#ifdef __ORBIS__ + + +void UIScene_LoadOrJoinMenu::LoadRemoteFileFromDisk(char* remoteFilename) +{ + wchar_t wSaveName[128]; + mbstowcs(wSaveName, remoteFilename, strlen(remoteFilename)+1); // plus null + + // processConsoleSave(wSaveName, L"ProcessedSave.bin"); + + // File remoteFile(L"ProcessedSave.bin"); + File remoteFile(wSaveName); + LoadSaveFromDisk(&remoteFile, SAVE_FILE_PLATFORM_PS3); +} +#endif + + +int UIScene_LoadOrJoinMenu::SaveOptionsDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)pParam; + + // results switched for this dialog + // EMessage_ResultAccept means cancel + switch(result) + { + case C4JStorage::EMessage_ResultDecline: // rename + { + pClass->m_bIgnoreInput=true; +#ifdef _DURANGO + // bring up a keyboard + InputManager.RequestKeyboard(app.GetString(IDS_RENAME_WORLD_TITLE), (pClass->m_saveDetails[pClass->m_iSaveListIndex-pClass->m_iDefaultButtonsC]).UTF16SaveName,(DWORD)0,25,&UIScene_LoadOrJoinMenu::KeyboardCompleteWorldNameCallback,pClass,C_4JInput::EKeyboardMode_Default); +#else + // bring up a keyboard + wchar_t wSaveName[128]; + //CD - Fix - We must memset the SaveName + ZeroMemory(wSaveName, 128 * sizeof(wchar_t) ); + mbstowcs(wSaveName, pClass->m_saveDetails[pClass->m_iSaveListIndex - pClass->m_iDefaultButtonsC].UTF8SaveName, strlen(pClass->m_saveDetails->UTF8SaveName)+1); // plus null + LPWSTR ptr = wSaveName; + InputManager.RequestKeyboard(app.GetString(IDS_RENAME_WORLD_TITLE),wSaveName,(DWORD)0,25,&UIScene_LoadOrJoinMenu::KeyboardCompleteWorldNameCallback,pClass,C_4JInput::EKeyboardMode_Default); +#endif + } + break; + + case C4JStorage::EMessage_ResultThirdOption: // delete - + { + // delete the save game + // Have to ask the player if they are sure they want to delete this game + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_TOOLTIPS_DELETESAVE, IDS_TEXT_DELETE_SAVE, uiIDA, 2, iPad,&UIScene_LoadOrJoinMenu::DeleteSaveDialogReturned,pClass, app.GetStringTable(),NULL,0,false); + } + break; + +#ifdef SONY_REMOTE_STORAGE_UPLOAD + case C4JStorage::EMessage_ResultFourthOption: // upload to cloud + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + ui.RequestMessageBox(IDS_TOOLTIPS_SAVETRANSFER_UPLOAD, IDS_SAVE_TRANSFER_TEXT, uiIDA, 2, iPad,&UIScene_LoadOrJoinMenu::SaveTransferDialogReturned,pClass, app.GetStringTable(),NULL,0,false); + } + break; +#endif // SONY_REMOTE_STORAGE_UPLOAD +#if defined _XBOX_ONE || defined __ORBIS__ + case C4JStorage::EMessage_ResultFourthOption: // copy save + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + ui.RequestMessageBox(IDS_COPYSAVE, IDS_TEXT_COPY_SAVE, uiIDA, 2, iPad,&UIScene_LoadOrJoinMenu::CopySaveDialogReturned,pClass, app.GetStringTable(),NULL,0,false); + } + break; +#endif + + case C4JStorage::EMessage_Cancelled: + default: + { + // reset the tooltips + pClass->updateTooltips(); + pClass->m_bIgnoreInput=false; + } + break; + } + return 0; +} + +int UIScene_LoadOrJoinMenu::TexturePackDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadOrJoinMenu *pClass = (UIScene_LoadOrJoinMenu *)pParam; + + // Exit with or without saving + if(result==C4JStorage::EMessage_ResultAccept) + { + // we need to enable background downloading for the DLC + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); +#if TO_BE_IMPLEMENTED + ULONGLONG ullOfferID_Full; + ULONGLONG ullIndexA[1]; + app.GetDLCFullOfferIDForPackID(pClass->m_initData->selectedSession->data.texturePackParentId,&ullOfferID_Full); + + + if( result==C4JStorage::EMessage_ResultAccept ) // Full version + { + ullIndexA[0]=ullOfferID_Full; + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + + } + else // trial version + { + DLC_INFO *pDLCInfo=app.GetDLCInfoForFullOfferID(ullOfferID_Full); + ullIndexA[0]=pDLCInfo->ullOfferID_Trial; + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + } +#endif + + +#if defined _XBOX_ONE + if(ProfileManager.IsSignedIn(iPad)) + { + if (ProfileManager.IsSignedInLive(iPad)) + { + wstring ProductId; + app.GetDLCFullOfferIDForPackID(pClass->m_initData->selectedSession->data.texturePackParentId,ProductId); + + StorageManager.InstallOffer(1,(WCHAR *)ProductId.c_str(),NULL,NULL); + } + else + { + // 4J-JEV: Fix for XB1: #165863 - XR-074: Compliance: With no active network connection user is unable to convert from Trial to Full texture pack and is not messaged why. + UINT uiIDA[1] = { IDS_CONFIRM_OK }; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + } + } +#endif + + } + pClass->m_bIgnoreInput=false; + return 0; +} + +#if defined __PS3__ || defined __PSVITA__ || defined __ORBIS__ +int UIScene_LoadOrJoinMenu::MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { +#if defined(__PS3__) + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_LoadOrJoinMenu::PSN_SignInReturned, pClass); +#elif defined __PSVITA__ + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_LoadOrJoinMenu::PSN_SignInReturned, pClass); +#else + SQRNetworkManager_Orbis::AttemptPSNSignIn(&UIScene_LoadOrJoinMenu::PSN_SignInReturned, pClass, false, iPad); +#endif + } + else + { + pClass->m_bIgnoreInput = false; + } + + return 0; +} + +int UIScene_LoadOrJoinMenu::PSN_SignInReturned(void *pParam,bool bContinue, int iPad) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)pParam; + if(bContinue==true) + { + switch(pClass->m_eAction) + { + case eAction_ViewInvites: + // Check if we're signed in to LIVE + if(ProfileManager.IsSignedInLive(iPad)) + { +#if defined(__PS3__) + int ret = sceNpBasicRecvMessageCustom(SCE_NP_BASIC_MESSAGE_MAIN_TYPE_INVITE, SCE_NP_BASIC_RECV_MESSAGE_OPTIONS_INCLUDE_BOOTABLE, SYS_MEMORY_CONTAINER_ID_INVALID); + app.DebugPrintf("sceNpBasicRecvMessageCustom return %d ( %08x )\n", ret, ret); +#elif defined __PSVITA__ + // TO BE IMPLEMENTED FOR VITA + PSVITA_STUBBED; +#else + SQRNetworkManager_Orbis::RecvInviteGUI(); +#endif + } + break; + case eAction_JoinGame: + pClass->CheckAndJoinGame(pClass->m_iGameListIndex); + break; + } + } + else + { + pClass->m_bIgnoreInput = false; + } + return 0; +} +#endif + +#ifdef SONY_REMOTE_STORAGE_DOWNLOAD + +void UIScene_LoadOrJoinMenu::LaunchSaveTransfer() +{ + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &UIScene_LoadOrJoinMenu::DownloadSonyCrossSaveThreadProc; + loadingParams->lpParam = (LPVOID)this; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_NavigateBackToScene; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + + loadingParams->cancelFunc=&UIScene_LoadOrJoinMenu::CancelSaveTransferCallback; + loadingParams->m_cancelFuncParam=this; + loadingParams->cancelText=IDS_TOOLTIPS_CANCEL; + + ui.NavigateToScene(m_iPad,eUIScene_FullscreenProgress, loadingParams); +} + + + + +int UIScene_LoadOrJoinMenu::CreateDummySaveDataCallback(LPVOID lpParam,bool bRes) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) lpParam; + if(bRes) + { + pClass->m_eSaveTransferState = eSaveTransfer_GetSavesInfo; + } + else + { + pClass->m_eSaveTransferState = eSaveTransfer_Error; + app.DebugPrintf("CreateDummySaveDataCallback failed\n"); + + } + return 0; +} + +int UIScene_LoadOrJoinMenu::CrossSaveGetSavesInfoCallback(LPVOID lpParam, SAVE_DETAILS *pSaveDetails, bool bRes) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) lpParam; + if(bRes) + { + pClass->m_eSaveTransferState = eSaveTransfer_GetFileData; + } + else + { + pClass->m_eSaveTransferState = eSaveTransfer_Error; + app.DebugPrintf("CrossSaveGetSavesInfoCallback failed\n"); + } + return 0; +} + +int UIScene_LoadOrJoinMenu::LoadCrossSaveDataCallback( void *pParam,bool bIsCorrupt, bool bIsOwner ) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) pParam; + if(bIsCorrupt == false && bIsOwner) + { + pClass->m_eSaveTransferState = eSaveTransfer_CreatingNewSave; + } + else + { + pClass->m_eSaveTransferState = eSaveTransfer_Error; + app.DebugPrintf("LoadCrossSaveDataCallback failed \n"); + + } + return 0; +} + +int UIScene_LoadOrJoinMenu::CrossSaveFinishedCallback(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) pParam; + pClass->m_eSaveTransferState = eSaveTransfer_Idle; + return 0; +} + + +int UIScene_LoadOrJoinMenu::CrossSaveDeleteOnErrorReturned(LPVOID lpParam,bool bRes) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) lpParam; + pClass->m_eSaveTransferState = eSaveTransfer_ErrorMesssage; + return 0; +} + +int UIScene_LoadOrJoinMenu::RemoteSaveNotFoundCallback(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) pParam; + pClass->m_eSaveTransferState = eSaveTransfer_Idle; + return 0; +} + +// MGH - added this global to force the delete of the previous data, for the remote storage saves +// need to speak to Chris why this is necessary +bool g_bForceVitaSaveWipe = false; + + +int UIScene_LoadOrJoinMenu::DownloadSonyCrossSaveThreadProc( LPVOID lpParameter ) +{ + Compression::UseDefaultThreadStorage(); + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) lpParameter; + pClass->m_saveTransferDownloadCancelled = false; + bool bAbortCalled = false; + Minecraft *pMinecraft=Minecraft::GetInstance(); + bool bSaveFileCreated = false; + wchar_t wSaveName[128]; + + // get the save file size + pMinecraft->progressRenderer->progressStagePercentage(0); + pMinecraft->progressRenderer->progressStart(IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD); + pMinecraft->progressRenderer->progressStage( IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD ); + + ConsoleSaveFile* pSave = NULL; + + pClass->m_eSaveTransferState = eSaveTransfer_GetRemoteSaveInfo; + + + while(pClass->m_eSaveTransferState!=eSaveTransfer_Idle) + { + switch(pClass->m_eSaveTransferState) + { + case eSaveTransfer_Idle: + break; + case eSaveTransfer_GetRemoteSaveInfo: + app.DebugPrintf("UIScene_LoadOrJoinMenu getSaveInfo\n"); + app.getRemoteStorage()->getSaveInfo(); + pClass->m_eSaveTransferState = eSaveTransfer_GettingRemoteSaveInfo; + break; + case eSaveTransfer_GettingRemoteSaveInfo: + if(pClass->m_saveTransferDownloadCancelled) + { + pClass->m_eSaveTransferState = eSaveTransfer_Error; + break; + } + if(app.getRemoteStorage()->waitingForSaveInfo() == false) + { + if(app.getRemoteStorage()->saveIsAvailable()) + { + pClass->m_eSaveTransferState = eSaveTransfer_CreateDummyFile; + } + else + { + // no save available, inform the user about the functionality + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD, IDS_SAVE_TRANSFER_NOT_AVAILABLE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),RemoteSaveNotFoundCallback,pClass, app.GetStringTable(),NULL,0,false); + } + } + break; + case eSaveTransfer_CreateDummyFile: + { + StorageManager.ResetSaveData(); + byte *compData = (byte *)StorageManager.AllocateSaveData( app.getRemoteStorage()->getSaveFilesize() ); + // Make our next save default to the name of the level + const char* pNameUTF8 = app.getRemoteStorage()->getSaveNameUTF8(); + mbstowcs(wSaveName, pNameUTF8, strlen(pNameUTF8)+1); // plus null + StorageManager.SetSaveTitle(wSaveName); + PBYTE pbThumbnailData=NULL; + DWORD dwThumbnailDataSize=0; + + PBYTE pbDataSaveImage=NULL; + DWORD dwDataSizeSaveImage=0; + + StorageManager.GetDefaultSaveImage(&pbDataSaveImage, &dwDataSizeSaveImage); // Get the default save thumbnail (as set by SetDefaultImages) for use on saving games t + StorageManager.GetDefaultSaveThumbnail(&pbThumbnailData,&dwThumbnailDataSize); // Get the default save image (as set by SetDefaultImages) for use on saving games that + + BYTE bTextMetadata[88]; + ZeroMemory(bTextMetadata,88); + int iTextMetadataBytes = app.CreateImageTextData(bTextMetadata, app.getRemoteStorage()->getSaveSeed(), true, app.getRemoteStorage()->getSaveHostOptions(), app.getRemoteStorage()->getSaveTexturePack() ); + + // set the icon and save image + StorageManager.SetSaveImages(pbThumbnailData,dwThumbnailDataSize,pbDataSaveImage,dwDataSizeSaveImage,bTextMetadata,iTextMetadataBytes); + + app.getRemoteStorage()->waitForStorageManagerIdle(); + C4JStorage::ESaveGameState saveState = StorageManager.SaveSaveData( &UIScene_LoadOrJoinMenu::CreateDummySaveDataCallback, lpParameter ); + if(saveState == C4JStorage::ESaveGame_Save) + { + pClass->m_eSaveTransferState = eSaveTransfer_CreatingDummyFile; + } + else + { + app.DebugPrintf("Failed to create dummy save file\n"); + pClass->m_eSaveTransferState = eSaveTransfer_Error; + } + } + break; + case eSaveTransfer_CreatingDummyFile: + break; + case eSaveTransfer_GetSavesInfo: + { + // we can't cancel here, we need the saves info so we can delete the file + if(pClass->m_saveTransferDownloadCancelled) + { + WCHAR wcTemp[256]; + swprintf(wcTemp,256, app.GetString(IDS_CANCEL)); // MGH - should change this string to "cancelling download" + m_wstrStageText=wcTemp; + pMinecraft->progressRenderer->progressStage( m_wstrStageText ); + } + + app.getRemoteStorage()->waitForStorageManagerIdle(); + app.DebugPrintf("CALL GetSavesInfo B\n"); + C4JStorage::ESaveGameState eSGIStatus= StorageManager.GetSavesInfo(pClass->m_iPad,&UIScene_LoadOrJoinMenu::CrossSaveGetSavesInfoCallback,pClass,"save"); + pClass->m_eSaveTransferState = eSaveTransfer_GettingSavesInfo; + } + break; + case eSaveTransfer_GettingSavesInfo: + if(pClass->m_saveTransferDownloadCancelled) + { + WCHAR wcTemp[256]; + swprintf(wcTemp,256, app.GetString(IDS_CANCEL)); // MGH - should change this string to "cancelling download" + m_wstrStageText=wcTemp; + pMinecraft->progressRenderer->progressStage( m_wstrStageText ); + } + break; + + case eSaveTransfer_GetFileData: + { + bSaveFileCreated = true; + StorageManager.GetSaveUniqueFileDir(pClass->m_downloadedUniqueFilename); + + if(pClass->m_saveTransferDownloadCancelled) + { + pClass->m_eSaveTransferState = eSaveTransfer_Error; + break; + } + PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo(); + int idx = pClass->m_iSaveListIndex - pClass->m_iDefaultButtonsC; + app.getRemoteStorage()->waitForStorageManagerIdle(); + bool bGettingOK = app.getRemoteStorage()->getSaveData(pClass->m_downloadedUniqueFilename, SaveTransferReturned, pClass); + if(bGettingOK) + { + pClass->m_eSaveTransferState = eSaveTransfer_GettingFileData; + } + else + { + pClass->m_eSaveTransferState = eSaveTransfer_Error; + app.DebugPrintf("app.getRemoteStorage()->getSaveData failed\n"); + + } + } + + case eSaveTransfer_GettingFileData: + { + WCHAR wcTemp[256]; + + int dataProgress = app.getRemoteStorage()->getDataProgress(); + pMinecraft->progressRenderer->progressStagePercentage(dataProgress); + + //swprintf(wcTemp, 256, L"Downloading data : %d", dataProgress);//app.GetString(IDS_SAVETRANSFER_STAGE_GET_DATA),0,pClass->m_ulFileSize); + swprintf(wcTemp,256, app.GetString(IDS_SAVETRANSFER_STAGE_GET_DATA),dataProgress); + m_wstrStageText=wcTemp; + pMinecraft->progressRenderer->progressStage( m_wstrStageText ); + if(pClass->m_saveTransferDownloadCancelled && bAbortCalled == false) + { + app.getRemoteStorage()->abort(); + bAbortCalled = true; + } + } + break; + case eSaveTransfer_FileDataRetrieved: + pClass->m_eSaveTransferState = eSaveTransfer_LoadSaveFromDisc; + break; + case eSaveTransfer_LoadSaveFromDisc: + { + if(pClass->m_saveTransferDownloadCancelled) + { + pClass->m_eSaveTransferState = eSaveTransfer_Error; + break; + } + + PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo(); + int saveInfoIndex = -1; + for(int i=0;iiSaveC;i++) + { + if(strcmp(pSaveDetails->SaveInfoA[i].UTF8SaveFilename, pClass->m_downloadedUniqueFilename) == 0) + { + //found it + saveInfoIndex = i; + } + } + if(saveInfoIndex == -1) + { + pClass->m_eSaveTransferState = eSaveTransfer_Error; + app.DebugPrintf("CrossSaveGetSavesInfoCallback failed - couldn't find save\n"); + } + else + { +#ifdef __PS3__ + // ignore the CRC on PS3 + C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveData(&pSaveDetails->SaveInfoA[saveInfoIndex],&LoadCrossSaveDataCallback,pClass, true); +#else + C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveData(&pSaveDetails->SaveInfoA[saveInfoIndex],&LoadCrossSaveDataCallback,pClass); +#endif + if(eLoadStatus == C4JStorage::ESaveGame_Load) + { + pClass->m_eSaveTransferState = eSaveTransfer_LoadingSaveFromDisc; + } + else + { + pClass->m_eSaveTransferState = eSaveTransfer_Error; + } + } + } + break; + case eSaveTransfer_LoadingSaveFromDisc: + + break; + case eSaveTransfer_CreatingNewSave: + { + unsigned int fileSize = StorageManager.GetSaveSize(); + byteArray ba(fileSize); + StorageManager.GetSaveData(ba.data, &fileSize); + assert(ba.length == fileSize); + + + StorageManager.ResetSaveData(); + { + PBYTE pbThumbnailData=NULL; + DWORD dwThumbnailDataSize=0; + + PBYTE pbDataSaveImage=NULL; + DWORD dwDataSizeSaveImage=0; + + StorageManager.GetDefaultSaveImage(&pbDataSaveImage, &dwDataSizeSaveImage); // Get the default save thumbnail (as set by SetDefaultImages) for use on saving games t + StorageManager.GetDefaultSaveThumbnail(&pbThumbnailData,&dwThumbnailDataSize); // Get the default save image (as set by SetDefaultImages) for use on saving games that + + BYTE bTextMetadata[88]; + ZeroMemory(bTextMetadata,88); + int iTextMetadataBytes = app.CreateImageTextData(bTextMetadata, app.getRemoteStorage()->getSaveSeed(), true, app.getRemoteStorage()->getSaveHostOptions(), app.getRemoteStorage()->getSaveTexturePack() ); + + // set the icon and save image + StorageManager.SetSaveImages(pbThumbnailData,dwThumbnailDataSize,pbDataSaveImage,dwDataSizeSaveImage,bTextMetadata,iTextMetadataBytes); + } + + +#ifdef SPLIT_SAVES + ConsoleSaveFileOriginal oldFormatSave( wSaveName, ba.data, ba.length, false, app.getRemoteStorage()->getSavePlatform() ); + pSave = new ConsoleSaveFileSplit( &oldFormatSave, false, pMinecraft->progressRenderer ); + + pMinecraft->progressRenderer->progressStage(IDS_SAVETRANSFER_STAGE_SAVING); + pSave->Flush(false,false); + pClass->m_eSaveTransferState = eSaveTransfer_Saving; +#else + pSave = new ConsoleSaveFileOriginal( wSaveName, ba.data, ba.length, false, app.getRemoteStorage()->getSavePlatform() ); + pClass->m_eSaveTransferState = eSaveTransfer_Converting; + pMinecraft->progressRenderer->progressStage(IDS_SAVETRANSFER_STAGE_CONVERTING); +#endif + delete ba.data; + } + break; + case eSaveTransfer_Converting: + { + pSave->ConvertToLocalPlatform(); // check if we need to convert this file from PS3->PS4 + pClass->m_eSaveTransferState = eSaveTransfer_Saving; + pMinecraft->progressRenderer->progressStage(IDS_SAVETRANSFER_STAGE_SAVING); + StorageManager.SetSaveTitle(wSaveName); + StorageManager.SetSaveUniqueFilename(pClass->m_downloadedUniqueFilename); + + app.getRemoteStorage()->waitForStorageManagerIdle(); // we need to wait for the save system to be idle here, as Flush doesn't check for it. + pSave->Flush(false, false); + } + break; + case eSaveTransfer_Saving: + { + // On Durango/Orbis, we need to wait for all the asynchronous saving processes to complete before destroying the levels, as that will ultimately delete + // the directory level storage & therefore the ConsoleSaveSplit instance, which needs to be around until all the sub files have completed saving. +#if defined(_DURANGO) || defined(__ORBIS__) + while(StorageManager.GetSaveState() != C4JStorage::ESaveGame_Idle ) + { + Sleep(10); + StorageManager.Tick(); + } +#endif + + delete pSave; + + + pMinecraft->progressRenderer->progressStage(IDS_PROGRESS_SAVING_TO_DISC); + pClass->m_eSaveTransferState = eSaveTransfer_Succeeded; + } + break; + + case eSaveTransfer_Succeeded: + { + // if we've arrived here, the save has been created successfully + pClass->m_iState=e_SavesRepopulate; + pClass->updateTooltips(); + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + app.getRemoteStorage()->waitForStorageManagerIdle(); // wait for everything to complete before we hand control back to the player + ui.RequestMessageBox( IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD, IDS_SAVE_TRANSFER_DOWNLOADCOMPLETE, uiIDA,1,ProfileManager.GetPrimaryPad(),CrossSaveFinishedCallback,pClass, app.GetStringTable()); + pClass->m_eSaveTransferState = eSaveTransfer_Finished; + } + break; + + case eSaveTransfer_Cancelled: // this is no longer used + { + assert(0); //pClass->m_eSaveTransferState = eSaveTransfer_Idle; + } + break; + case eSaveTransfer_Error: + { + if(bSaveFileCreated) + { + if(pClass->m_saveTransferDownloadCancelled) + { + WCHAR wcTemp[256]; + swprintf(wcTemp,256, app.GetString(IDS_CANCEL)); // MGH - should change this string to "cancelling download" + m_wstrStageText=wcTemp; + pMinecraft->progressRenderer->progressStage( m_wstrStageText ); + pMinecraft->progressRenderer->progressStage( m_wstrStageText ); + } + // if the save file has already been created we have to delete it again if there's been an error + PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo(); + int saveInfoIndex = -1; + for(int i=0;iiSaveC;i++) + { + if(strcmp(pSaveDetails->SaveInfoA[i].UTF8SaveFilename, pClass->m_downloadedUniqueFilename) == 0) + { + //found it + saveInfoIndex = i; + } + } + if(saveInfoIndex == -1) + { + app.DebugPrintf("eSaveTransfer_Error failed - couldn't find save\n"); + assert(0); + pClass->m_eSaveTransferState = eSaveTransfer_ErrorMesssage; + } + else + { + // delete the save file + app.getRemoteStorage()->waitForStorageManagerIdle(); + C4JStorage::ESaveGameState eDeleteStatus = StorageManager.DeleteSaveData(&pSaveDetails->SaveInfoA[saveInfoIndex],UIScene_LoadOrJoinMenu::CrossSaveDeleteOnErrorReturned,pClass); + if(eDeleteStatus == C4JStorage::ESaveGame_Delete) + { + pClass->m_eSaveTransferState = eSaveTransfer_ErrorDeletingSave; + } + else + { + app.DebugPrintf("StorageManager.DeleteSaveData failed!!\n"); + pClass->m_eSaveTransferState = eSaveTransfer_ErrorMesssage; + } + } + } + else + { + pClass->m_eSaveTransferState = eSaveTransfer_ErrorMesssage; + } + } + break; + + case eSaveTransfer_ErrorDeletingSave: + break; + case eSaveTransfer_ErrorMesssage: + { + app.getRemoteStorage()->waitForStorageManagerIdle(); // wait for everything to complete before we hand control back to the player + if(pClass->m_saveTransferDownloadCancelled) + { + pClass->m_eSaveTransferState = eSaveTransfer_Idle; + } + else + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox( IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD, IDS_SAVE_TRANSFER_DOWNLOADFAILED, uiIDA,1,ProfileManager.GetPrimaryPad(),CrossSaveFinishedCallback,pClass, app.GetStringTable()); + pClass->m_eSaveTransferState = eSaveTransfer_Finished; + } + if(bSaveFileCreated) // save file has been created, then deleted. + pClass->m_iState=e_SavesRepopulateAfterDelete; + else + pClass->m_iState=e_SavesRepopulate; + pClass->updateTooltips(); + } + break; + case eSaveTransfer_Finished: + { + + } + // waiting to dismiss the dialog + break; + } + Sleep(50); + } + + return 0; + +} + +void UIScene_LoadOrJoinMenu::SaveTransferReturned(LPVOID lpParam, SonyRemoteStorage::Status s, int error_code) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) lpParam; + + if(s == SonyRemoteStorage::e_getDataSucceeded) + { + pClass->m_eSaveTransferState = eSaveTransfer_FileDataRetrieved; + } + else + { + pClass->m_eSaveTransferState = eSaveTransfer_Error; + app.DebugPrintf("SaveTransferReturned failed with error code : 0x%08x\n", error_code); + } + +} +ConsoleSaveFile* UIScene_LoadOrJoinMenu::SonyCrossSaveConvert() +{ + return NULL; +} + +void UIScene_LoadOrJoinMenu::CancelSaveTransferCallback(LPVOID lpParam) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) lpParam; + pClass->m_saveTransferDownloadCancelled = true; + ui.SetTooltips( DEFAULT_XUI_MENU_USER, -1, -1, -1, -1,-1,-1,-1,-1); // MGH - added - remove the "cancel" tooltip, so the player knows it's underway (really needs a "cancelling" message) +} + +#endif + + + +#ifdef SONY_REMOTE_STORAGE_UPLOAD + +void UIScene_LoadOrJoinMenu::LaunchSaveUpload() +{ + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &UIScene_LoadOrJoinMenu::UploadSonyCrossSaveThreadProc; + loadingParams->lpParam = (LPVOID)this; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_NavigateBackToScene; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + +// 4J-PB - Waiting for Sony to fix canceling a save upload + loadingParams->cancelFunc=&UIScene_LoadOrJoinMenu::CancelSaveUploadCallback; + loadingParams->m_cancelFuncParam = this; + loadingParams->cancelText=IDS_TOOLTIPS_CANCEL; + + ui.NavigateToScene(m_iPad,eUIScene_FullscreenProgress, loadingParams); + +} + +int UIScene_LoadOrJoinMenu::CrossSaveUploadFinishedCallback(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) pParam; + pClass->m_eSaveUploadState = eSaveUpload_Idle; + + return 0; +} + + +int UIScene_LoadOrJoinMenu::UploadSonyCrossSaveThreadProc( LPVOID lpParameter ) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) lpParameter; + pClass->m_saveTransferUploadCancelled = false; + bool bAbortCalled = false; + Minecraft *pMinecraft=Minecraft::GetInstance(); + + // get the save file size + pMinecraft->progressRenderer->progressStagePercentage(0); + pMinecraft->progressRenderer->progressStart(IDS_TOOLTIPS_SAVETRANSFER_UPLOAD); + pMinecraft->progressRenderer->progressStage( IDS_TOOLTIPS_SAVETRANSFER_UPLOAD ); + + PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo(); + int idx = pClass->m_iSaveListIndex - pClass->m_iDefaultButtonsC; + bool bSettingOK = app.getRemoteStorage()->setSaveData(&pSaveDetails->SaveInfoA[idx], SaveUploadReturned, pClass); + + if(bSettingOK) + { + pClass->m_eSaveUploadState = eSaveUpload_UploadingFileData; + pMinecraft->progressRenderer->progressStagePercentage(0); + } + else + { + pClass->m_eSaveUploadState = eSaveUpload_Error; + } + + while(pClass->m_eSaveUploadState!=eSaveUpload_Idle) + { + switch(pClass->m_eSaveUploadState) + { + case eSaveUpload_Idle: + break; + case eSaveUpload_UploadingFileData: + { + WCHAR wcTemp[256]; + int dataProgress = app.getRemoteStorage()->getDataProgress(); + pMinecraft->progressRenderer->progressStagePercentage(dataProgress); + + //swprintf(wcTemp, 256, L"Uploading data : %d", dataProgress);//app.GetString(IDS_SAVETRANSFER_STAGE_GET_DATA),0,pClass->m_ulFileSize); + swprintf(wcTemp,256, app.GetString(IDS_SAVETRANSFER_STAGE_PUT_DATA),dataProgress); + + m_wstrStageText=wcTemp; + pMinecraft->progressRenderer->progressStage( m_wstrStageText ); +// 4J-PB - Waiting for Sony to fix canceling a save upload + if(pClass->m_saveTransferUploadCancelled && bAbortCalled == false) + { + // we only really want to be able to cancel during the download of data, if it's taking a long time + app.getRemoteStorage()->abort(); + bAbortCalled = true; + } + } + break; + case eSaveUpload_FileDataUploaded: + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox( IDS_TOOLTIPS_SAVETRANSFER_UPLOAD, IDS_SAVE_TRANSFER_UPLOADCOMPLETE, uiIDA,1,ProfileManager.GetPrimaryPad(),CrossSaveUploadFinishedCallback,pClass, app.GetStringTable()); + pClass->m_eSaveUploadState = esaveUpload_Finished; + } + break; + case eSaveUpload_Cancelled: // this is no longer used + assert(0);// pClass->m_eSaveUploadState = eSaveUpload_Idle; + break; + case eSaveUpload_Error: + { + if(pClass->m_saveTransferUploadCancelled) + { + pClass->m_eSaveUploadState = eSaveUpload_Idle; + } + else + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox( IDS_TOOLTIPS_SAVETRANSFER_UPLOAD, IDS_SAVE_TRANSFER_UPLOADFAILED, uiIDA,1,ProfileManager.GetPrimaryPad(),CrossSaveUploadFinishedCallback,pClass, app.GetStringTable()); + pClass->m_eSaveUploadState = esaveUpload_Finished; + } + } + break; + case esaveUpload_Finished: + // waiting for dialog to be dismissed + break; + } + Sleep(50); + } + + return 0; + +} + +void UIScene_LoadOrJoinMenu::SaveUploadReturned(LPVOID lpParam, SonyRemoteStorage::Status s, int error_code) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) lpParam; + + if(pClass->m_saveTransferUploadCancelled) + { + UINT uiIDA[1] = { IDS_CONFIRM_OK }; + ui.RequestMessageBox( IDS_CANCEL_UPLOAD_TITLE, IDS_CANCEL_UPLOAD_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), CrossSaveUploadFinishedCallback, pClass, app.GetStringTable() ); + pClass->m_eSaveUploadState=esaveUpload_Finished; + } + else + { + if(s == SonyRemoteStorage::e_setDataSucceeded) + pClass->m_eSaveUploadState = eSaveUpload_FileDataUploaded; + else if ( !pClass->m_saveTransferUploadCancelled ) + pClass->m_eSaveUploadState = eSaveUpload_Error; + } +} + +void UIScene_LoadOrJoinMenu::CancelSaveUploadCallback(LPVOID lpParam) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) lpParam; + pClass->m_saveTransferUploadCancelled = true; + app.DebugPrintf("m_saveTransferUploadCancelled = true\n"); + ui.SetTooltips( DEFAULT_XUI_MENU_USER, -1, -1, -1, -1,-1,-1,-1,-1); // MGH - added - remove the "cancel" tooltip, so the player knows it's underway (really needs a "cancelling" message) + + pClass->m_bIgnoreInput = true; +} + +int UIScene_LoadOrJoinMenu::SaveTransferDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)pParam; + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultAccept) + { + // upload the save + pClass->LaunchSaveUpload(); + + pClass->m_bIgnoreInput=false; + } + else + { + pClass->m_bIgnoreInput=false; + } + return 0; +} +#endif // SONY_REMOTE_STORAGE_UPLOAD + + +#if defined _XBOX_ONE +void UIScene_LoadOrJoinMenu::LaunchSaveTransfer() +{ + SaveTransferStateContainer *stateContainer = new SaveTransferStateContainer(); + stateContainer->m_iProgress = 0; + stateContainer->m_bSaveTransferInProgress = false; + stateContainer->m_bSaveTransferCancelled = false; + stateContainer->m_iPad = m_iPad; + stateContainer->m_eSaveTransferState = C4JStorage::eSaveTransfer_Idle; + stateContainer->m_pClass = this; + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &UIScene_LoadOrJoinMenu::DownloadXbox360SaveThreadProc; + loadingParams->lpParam = (LPVOID)stateContainer; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_NavigateBackToScene; + completionData->iPad = DEFAULT_XUI_MENU_USER; + completionData->bRequiresUserAction=TRUE; + loadingParams->completionData = completionData; + + loadingParams->cancelFunc=&UIScene_LoadOrJoinMenu::CancelSaveTransferCallback; + loadingParams->m_cancelFuncParam=stateContainer; + loadingParams->cancelText=IDS_TOOLTIPS_CANCEL; + + ui.NavigateToScene(m_iPad,eUIScene_FullscreenProgress, loadingParams); +} + + + +int UIScene_LoadOrJoinMenu::DownloadXbox360SaveThreadProc( LPVOID lpParameter ) +{ + Compression::UseDefaultThreadStorage(); + + SaveTransferStateContainer *pStateContainer = (SaveTransferStateContainer *) lpParameter; + Minecraft *pMinecraft=Minecraft::GetInstance(); + ConsoleSaveFile* pSave = NULL; + + while(StorageManager.SaveTransferClearState()!=C4JStorage::eSaveTransfer_Idle) + { + Sleep(5); + } + + pStateContainer->m_bSaveTransferInProgress=true; + + UIScene_LoadOrJoinMenu::s_eSaveTransferFile = eSaveTransferFile_Marker; + RequestFileSize( pStateContainer, L"completemarker" ); + + while((pStateContainer->m_eSaveTransferState!=C4JStorage::eSaveTransfer_Idle) && pStateContainer->m_bSaveTransferInProgress && !pStateContainer->m_bSaveTransferCancelled) + { + switch(pStateContainer->m_eSaveTransferState) + { + case C4JStorage::eSaveTransfer_Idle: + break; + case C4JStorage::eSaveTransfer_FileSizeRetrieved: + switch(UIScene_LoadOrJoinMenu::s_eSaveTransferFile) + { + case eSaveTransferFile_Marker: + if(UIScene_LoadOrJoinMenu::s_ulFileSize == 0) + { + pMinecraft->progressRenderer->progressStage(IDS_SAVETRANSFER_NONE_FOUND); + pStateContainer->m_eSaveTransferState=C4JStorage::eSaveTransfer_Idle; + } + else + { + RequestFileData( pStateContainer, L"completemarker" ); + } + break; + case eSaveTransferFile_Metadata: + RequestFileData( pStateContainer, L"metadata" ); + break; + case eSaveTransferFile_SaveData: + RequestFileData( pStateContainer, L"savedata" ); + break; + }; + break; + case C4JStorage::eSaveTransfer_GettingFileData: + + break; + case C4JStorage::eSaveTransfer_FileDataRetrieved: + switch(UIScene_LoadOrJoinMenu::s_eSaveTransferFile) + { + case eSaveTransferFile_Marker: + UIScene_LoadOrJoinMenu::s_eSaveTransferFile = eSaveTransferFile_Metadata; + RequestFileSize( pStateContainer, L"metadata" ); + break; + case eSaveTransferFile_Metadata: + { + ByteArrayInputStream bais(UIScene_LoadOrJoinMenu::s_transferData); + DataInputStream dis(&bais); + + wstring saveTitle = dis.readUTF(); + StorageManager.SetSaveTitle(saveTitle.c_str()); + + wstring saveUniqueName = dis.readUTF(); + + // 4J Stu - Don't set this any more. We added it so that we could share the ban list data for this save + // However if the player downloads the same save multiple times, it will overwrite the previous version + // with that filname, and they could have made changes to it. + //StorageManager.SetSaveUniqueFilename((wchar_t *)saveUniqueName.c_str()); + + int thumbnailSize = dis.readInt(); + if(thumbnailSize > 0) + { + byteArray ba(thumbnailSize); + dis.readFully(ba); + + StorageManager.SetSaveImages(ba.data, ba.length, NULL, 0, NULL, 0); + + delete ba.data; + } + + UIScene_LoadOrJoinMenu::s_transferData = byteArray(); + UIScene_LoadOrJoinMenu::s_eSaveTransferFile = eSaveTransferFile_SaveData; + RequestFileSize( pStateContainer, L"savedata" ); + } + break; + case eSaveTransferFile_SaveData: + { +#ifdef SPLIT_SAVES + if(!pStateContainer->m_bSaveTransferCancelled) + { + ConsoleSaveFileOriginal oldFormatSave( L"Temp name", UIScene_LoadOrJoinMenu::s_transferData.data, UIScene_LoadOrJoinMenu::s_transferData.length, false, SAVE_FILE_PLATFORM_X360 ); + pSave = new ConsoleSaveFileSplit( &oldFormatSave, false, pMinecraft->progressRenderer ); + + pMinecraft->progressRenderer->progressStage(IDS_SAVETRANSFER_STAGE_SAVING); + if(!pStateContainer->m_bSaveTransferCancelled) pSave->Flush(false,false); + } + pStateContainer->m_eSaveTransferState=C4JStorage::eSaveTransfer_Saving; + +#else + pSave = new ConsoleSaveFileOriginal( wSaveName, m_transferData.data, m_transferData.length, false, SAVE_FILE_PLATFORM_X360 ); + pStateContainer->m_eSaveTransferState=C4JStorage::eSaveTransfer_Converting; +#endif + delete UIScene_LoadOrJoinMenu::s_transferData.data; + UIScene_LoadOrJoinMenu::s_transferData = byteArray(); + } + break; + }; + + pStateContainer->m_iProgress=0; + break; + case C4JStorage::eSaveTransfer_Converting: +#if 0 + pSave->ConvertToLocalPlatform(); + + pMinecraft->progressRenderer->progressStage(IDS_SAVETRANSFER_STAGE_SAVING); + if(!pStateContainer->m_bSaveTransferCancelled) pSave->Flush(false,false); + + pStateContainer->m_iProgress+=1; + if(pStateContainer->m_iProgress==101) + { + pStateContainer->m_eSaveTransferState=C4JStorage::eSaveTransfer_Saving; + pStateContainer->m_iProgress=0; + break; + } + pMinecraft->progressRenderer->progressStagePercentage(pStateContainer->m_iProgress); +#endif + break; + case C4JStorage::eSaveTransfer_Saving: + // On Durango/Orbis, we need to wait for all the asynchronous saving processes to complete before destroying the levels, as that will ultimately delete + // the directory level storage & therefore the ConsoleSaveSplit instance, which needs to be around until all the sub files have completed saving. +#if defined(_DURANGO) || defined(__ORBIS__) + pMinecraft->progressRenderer->progressStage(IDS_PROGRESS_SAVING_TO_DISC); + + while(StorageManager.GetSaveState() != C4JStorage::ESaveGame_Idle ) + { + Sleep(10); + + // 4J Stu - DO NOT tick this here. The main thread should be the only place ticking the StorageManager. You WILL get crashes. + //StorageManager.Tick(); + } +#endif + + delete pSave; + +#ifdef _XBOX_ONE + pMinecraft->progressRenderer->progressStage(IDS_SAVE_TRANSFER_DOWNLOAD_AND_CONVERT_COMPLETE); +#endif + + pStateContainer->m_eSaveTransferState=C4JStorage::eSaveTransfer_Idle; + + // wipe the list and repopulate it + if(!pStateContainer->m_bSaveTransferCancelled) pStateContainer->m_pClass->m_iState=e_SavesRepopulateAfterTransferDownload; + + //pClass->m_iProgress+=1; + //if(pClass->m_iProgress==101) + //{ + // pClass->m_iProgress=0; + // pClass->m_eSaveTransferState=C4JStorage::eSaveTransfer_Idle; + // pMinecraft->progressRenderer->progressStage( IDS_SAVE_TRANSFER_DOWNLOAD_AND_CONVERT_COMPLETE ); + + // break; + //} + //pMinecraft->progressRenderer->progressStagePercentage(pClass->m_iProgress); + + break; + } + Sleep(50); + } + + if(pStateContainer->m_bSaveTransferCancelled) + { + WCHAR wcTemp[256]; + + pStateContainer->m_bSaveTransferCancelled=false; + swprintf(wcTemp,app.GetString(IDS_SAVE_TRANSFER_DOWNLOAD_CANCELLED)); + m_wstrStageText=wcTemp; + pMinecraft->progressRenderer->progressStage( m_wstrStageText ); + + } + + pStateContainer->m_eSaveTransferState=C4JStorage::eSaveTransfer_Idle; + pStateContainer->m_bSaveTransferInProgress=false; + + delete pStateContainer; + + return 0; +} + +void UIScene_LoadOrJoinMenu::RequestFileSize( SaveTransferStateContainer *pClass, wchar_t *filename ) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + + // get the save file size + pMinecraft->progressRenderer->progressStart(IDS_SAVETRANSFER_TITLE_GET); + pMinecraft->progressRenderer->progressStage( IDS_SAVETRANSFER_STAGE_GET_DETAILS ); + +#ifdef _DEBUG_MENUS_ENABLED + if(app.GetLoadSavesFromFolderEnabled()) + { + ZeroMemory(&m_debugTransferDetails, sizeof(C4JStorage::SAVETRANSFER_FILE_DETAILS) ); + + File targetFile( wstring(L"FakeTMSPP\\").append(filename) ); + if(targetFile.exists()) m_debugTransferDetails.ulFileLen = targetFile.length(); + + SaveTransferReturned(pClass,&m_debugTransferDetails); + } + else +#endif + { + do + { + pMinecraft->progressRenderer->progressStart(IDS_SAVETRANSFER_TITLE_GET); + pMinecraft->progressRenderer->progressStage( IDS_SAVETRANSFER_STAGE_GET_DETAILS ); + Sleep(1); + pClass->m_eSaveTransferState=StorageManager.SaveTransferGetDetails(pClass->m_iPad,C4JStorage::eGlobalStorage_TitleUser,filename,&UIScene_LoadOrJoinMenu::SaveTransferReturned,pClass); + } + while(pClass->m_eSaveTransferState == C4JStorage::eSaveTransfer_Busy && !pClass->m_bSaveTransferCancelled ); + } +} + +void UIScene_LoadOrJoinMenu::RequestFileData( SaveTransferStateContainer *pClass, wchar_t *filename ) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + WCHAR wcTemp[256]; + + pMinecraft->progressRenderer->progressStagePercentage(0); + + swprintf(wcTemp,app.GetString(IDS_SAVETRANSFER_STAGE_GET_DATA),0,UIScene_LoadOrJoinMenu::s_ulFileSize); + m_wstrStageText=wcTemp; + + pMinecraft->progressRenderer->progressStage( m_wstrStageText ); + +#ifdef _DEBUG_MENUS_ENABLED + if(app.GetLoadSavesFromFolderEnabled()) + { + File targetFile( wstring(L"FakeTMSPP\\").append(filename) ); + if(targetFile.exists()) + { + HANDLE hSaveFile = CreateFile( targetFile.getPath().c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, NULL); + + m_debugTransferDetails.pbData = new BYTE[m_debugTransferDetails.ulFileLen]; + + DWORD numberOfBytesRead = 0; + ReadFile( hSaveFile,m_debugTransferDetails.pbData,m_debugTransferDetails.ulFileLen,&numberOfBytesRead,NULL); + assert(numberOfBytesRead == m_debugTransferDetails.ulFileLen); + + CloseHandle(hSaveFile); + + SaveTransferReturned(pClass,&m_debugTransferDetails); + } + } + else +#endif + { + do + { + pMinecraft->progressRenderer->progressStart(IDS_SAVETRANSFER_TITLE_GET); + pMinecraft->progressRenderer->progressStage( -1 ); + Sleep(1); + pClass->m_eSaveTransferState=StorageManager.SaveTransferGetData(pClass->m_iPad,C4JStorage::eGlobalStorage_TitleUser,filename,&UIScene_LoadOrJoinMenu::SaveTransferReturned,&UIScene_LoadOrJoinMenu::SaveTransferUpdateProgress,pClass,pClass); + } + while(pClass->m_eSaveTransferState == C4JStorage::eSaveTransfer_Busy && !pClass->m_bSaveTransferCancelled ); + } +} + +int UIScene_LoadOrJoinMenu::SaveTransferReturned(LPVOID lpParam,C4JStorage::SAVETRANSFER_FILE_DETAILS *pSaveTransferDetails) +{ + SaveTransferStateContainer* pClass = (SaveTransferStateContainer *) lpParam; + app.DebugPrintf("Save Transfer - size is %d\n",pSaveTransferDetails->ulFileLen); + + // if the file data is null, then assume this is the file size retrieval + if(pSaveTransferDetails->pbData==NULL) + { + pClass->m_eSaveTransferState=C4JStorage::eSaveTransfer_FileSizeRetrieved; + UIScene_LoadOrJoinMenu::s_ulFileSize=pSaveTransferDetails->ulFileLen; + } + else + { + delete UIScene_LoadOrJoinMenu::s_transferData.data; + UIScene_LoadOrJoinMenu::s_transferData = byteArray(pSaveTransferDetails->pbData, UIScene_LoadOrJoinMenu::s_ulFileSize); + pClass->m_eSaveTransferState=C4JStorage::eSaveTransfer_FileDataRetrieved; + } + + return 0; +} + +int UIScene_LoadOrJoinMenu::SaveTransferUpdateProgress(LPVOID lpParam,unsigned long ulBytesReceived) +{ + WCHAR wcTemp[256]; + + SaveTransferStateContainer* pClass = (SaveTransferStateContainer *) lpParam; + Minecraft *pMinecraft=Minecraft::GetInstance(); + + if(pClass->m_bSaveTransferCancelled) // was cancelled + { + pMinecraft->progressRenderer->progressStage(IDS_SAVE_TRANSFER_DOWNLOAD_CANCELLING); + swprintf(wcTemp,app.GetString(IDS_SAVE_TRANSFER_DOWNLOAD_CANCELLING)); + m_wstrStageText=wcTemp; + pMinecraft->progressRenderer->progressStage( m_wstrStageText ); + } + else + { + unsigned int uiProgress=(unsigned int)(((float)ulBytesReceived/float(UIScene_LoadOrJoinMenu::s_ulFileSize))*100.0f); + + pMinecraft->progressRenderer->progressStagePercentage(uiProgress); + swprintf(wcTemp,app.GetString(IDS_SAVETRANSFER_STAGE_GET_DATA),((float)(ulBytesReceived))/1024000.0f,((float)UIScene_LoadOrJoinMenu::s_ulFileSize)/1024000.0f); + m_wstrStageText=wcTemp; + pMinecraft->progressRenderer->progressStage( m_wstrStageText ); + } + + return 0; +} + +void UIScene_LoadOrJoinMenu::CancelSaveTransferCallback(LPVOID lpParam) +{ + SaveTransferStateContainer* pClass = (SaveTransferStateContainer *) lpParam; + + if(!pClass->m_bSaveTransferCancelled) + { + StorageManager.CancelSaveTransfer(UIScene_LoadOrJoinMenu::CancelSaveTransferCompleteCallback,pClass); + + pClass->m_bSaveTransferCancelled=true; + } + //pClass->m_bSaveTransferInProgress=false; +} + +int UIScene_LoadOrJoinMenu::CancelSaveTransferCompleteCallback(LPVOID lpParam) +{ + SaveTransferStateContainer* pClass = (SaveTransferStateContainer *) lpParam; + // change the state to idle to get the download thread to terminate + pClass->m_eSaveTransferState=C4JStorage::eSaveTransfer_Idle; + return 0; +} + +int UIScene_LoadOrJoinMenu::NeedSyncMessageReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadOrJoinMenu *pClass = (UIScene_LoadOrJoinMenu *)pParam; + LoadMenuInitData *params = (LoadMenuInitData *)pParam; + + if( result == C4JStorage::EMessage_ResultAccept ) + { + // navigate to the settings scene + ui.NavigateToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadMenu, pClass->m_loadMenuInitData); + } + else + { + delete pClass->m_loadMenuInitData; + pClass->m_bIgnoreInput = false; + } + + return 0; +} + + +#endif + + +#ifdef _XBOX_ONE +void UIScene_LoadOrJoinMenu::HandleDLCLicenseChange() +{ + // may have installed Halloween on this menu + app.StartInstallDLCProcess(m_iPad); +} +#endif + +#if defined _XBOX_ONE || defined __ORBIS__ +int UIScene_LoadOrJoinMenu::CopySaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + + LoadingInputParams *loadingParams = new LoadingInputParams(); + void *uniqueId = (LPVOID)pClass->GetCallbackUniqueId(); + loadingParams->func = &UIScene_LoadOrJoinMenu::CopySaveThreadProc; + loadingParams->lpParam = uniqueId; + loadingParams->waitForThreadToDelete = true; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_NavigateBackToScene; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + + loadingParams->cancelFunc=&UIScene_LoadOrJoinMenu::CancelCopySaveCallback; + loadingParams->m_cancelFuncParam=uniqueId; + loadingParams->cancelText=IDS_TOOLTIPS_CANCEL; + + ui.NavigateToScene(iPad,eUIScene_FullscreenProgress, loadingParams); + } + else + { + pClass->m_bIgnoreInput=false; + } + + return 0; +} + +int UIScene_LoadOrJoinMenu::CopySaveThreadProc( LPVOID lpParameter ) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + pMinecraft->progressRenderer->progressStart(IDS_PROGRESS_COPYING_SAVE); + pMinecraft->progressRenderer->progressStage( -1 ); + + ui.EnterCallbackIdCriticalSection(); + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)ui.GetSceneFromCallbackId((size_t)lpParameter); + if( pClass ) + { + pClass->m_bCopying = true; + pClass->m_bCopyingCancelled = false; + ui.LeaveCallbackIdCriticalSection(); + // Copy save data takes two callbacks - one for completion, and one for progress. The progress callback also lets us cancel the operation, if we return false. + StorageManager.CopySaveData(&pClass->m_pSaveDetails->SaveInfoA[pClass->m_iSaveListIndex - pClass->m_iDefaultButtonsC],UIScene_LoadOrJoinMenu::CopySaveDataReturned,UIScene_LoadOrJoinMenu::CopySaveDataProgress,lpParameter); + + bool bContinue = true; + do + { + Sleep(100); + ui.EnterCallbackIdCriticalSection(); + pClass = (UIScene_LoadOrJoinMenu*)ui.GetSceneFromCallbackId((size_t)lpParameter); + if( pClass ) + { + bContinue = pClass->m_bCopying; + } + else + { + bContinue = false; + } + ui.LeaveCallbackIdCriticalSection(); + } while( bContinue ); + } + else + { + ui.LeaveCallbackIdCriticalSection(); + } + + return 0; +} + +int UIScene_LoadOrJoinMenu::CopySaveDataReturned(LPVOID lpParam, bool success, C4JStorage::ESaveGameState stat) +{ + ui.EnterCallbackIdCriticalSection(); + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)ui.GetSceneFromCallbackId((size_t)lpParam); + + if(pClass) + { + if(success) + { + pClass->m_bCopying = false; + // wipe the list and repopulate it + pClass->m_iState=e_SavesRepopulateAfterDelete; + ui.LeaveCallbackIdCriticalSection(); + } + else + { +#ifdef __ORBIS__ + UINT uiIDA[1]; + // you cancelled the save on exit after choosing exit and save? You go back to the Exit choices then. + uiIDA[0]=IDS_OK; + + if( stat == C4JStorage::ESaveGame_CopyCompleteFailLocalStorage ) + { + ui.LeaveCallbackIdCriticalSection(); + ui.RequestMessageBox(IDS_COPYSAVE_FAILED_TITLE, IDS_COPYSAVE_FAILED_LOCAL, uiIDA, 1, ProfileManager.GetPrimaryPad(), CopySaveErrorDialogFinishedCallback, lpParam, app.GetStringTable()); + } + else if( stat == C4JStorage::ESaveGame_CopyCompleteFailQuota ) + { + ui.LeaveCallbackIdCriticalSection(); + ui.RequestMessageBox(IDS_COPYSAVE_FAILED_TITLE, IDS_COPYSAVE_FAILED_QUOTA, uiIDA, 1, ProfileManager.GetPrimaryPad(), CopySaveErrorDialogFinishedCallback, lpParam, app.GetStringTable()); + } + else + { + pClass->m_bCopying = false; + ui.LeaveCallbackIdCriticalSection(); + } +#else + pClass->m_bCopying = false; + ui.LeaveCallbackIdCriticalSection(); +#endif + } + } + else + { + ui.LeaveCallbackIdCriticalSection(); + } + return 0; +} + +bool UIScene_LoadOrJoinMenu::CopySaveDataProgress(LPVOID lpParam, int percent) +{ + bool bContinue = false; + ui.EnterCallbackIdCriticalSection(); + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)ui.GetSceneFromCallbackId((size_t)lpParam); + if( pClass ) + { + bContinue = !pClass->m_bCopyingCancelled; + } + ui.LeaveCallbackIdCriticalSection(); + Minecraft *pMinecraft=Minecraft::GetInstance(); + pMinecraft->progressRenderer->progressStagePercentage(percent); + + return bContinue; +} + +void UIScene_LoadOrJoinMenu::CancelCopySaveCallback(LPVOID lpParam) +{ + ui.EnterCallbackIdCriticalSection(); + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)ui.GetSceneFromCallbackId((size_t)lpParam); + if( pClass ) + { + pClass->m_bCopyingCancelled = true; + } + ui.LeaveCallbackIdCriticalSection(); +} + +int UIScene_LoadOrJoinMenu::CopySaveErrorDialogFinishedCallback(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + ui.EnterCallbackIdCriticalSection(); + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)ui.GetSceneFromCallbackId((size_t)pParam); + if( pClass ) + { + pClass->m_bCopying = false; + } + ui.LeaveCallbackIdCriticalSection(); + + return 0; +} + +#endif // _XBOX_ONE diff --git a/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.h b/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.h new file mode 100644 index 00000000..01d94b05 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.h @@ -0,0 +1,300 @@ +#pragma once + +#include "UIScene.h" + +class LevelGenerationOptions; + + +#if defined __PS3__ || defined __ORBIS__ || defined(__PSVITA__) +#define SONY_REMOTE_STORAGE_DOWNLOAD +#endif +#if defined __PS3__ || __PSVITA__ +#define SONY_REMOTE_STORAGE_UPLOAD +#endif + + +class UIScene_LoadOrJoinMenu : public UIScene +{ +private: + enum EControls + { + eControl_SavesList, + eControl_GamesList, +#if defined(_XBOX_ONE) || defined(__ORBIS__) + eControl_SpaceIndicator, +#endif + }; + + enum EState + { + e_SavesIdle, + e_SavesRepopulate, + e_SavesRepopulateAfterMashupHide, + e_SavesRepopulateAfterDelete, + e_SavesRepopulateAfterTransferDownload, + }; + + enum eActions + { + eAction_None=0, + eAction_ViewInvites, + eAction_JoinGame, + }; + eActions m_eAction; + + static const int JOIN_LOAD_CREATE_BUTTON_INDEX = 0; + + SaveListDetails *m_saveDetails; + int m_iSaveDetailsCount; + +protected: + UIControl_SaveList m_buttonListSaves; + UIControl_SaveList m_buttonListGames; + UIControl_Label m_labelSavesListTitle, m_labelJoinListTitle, m_labelNoGames; + UIControl m_controlSavesTimer, m_controlJoinTimer; +#if defined(_XBOX_ONE) || defined(__ORBIS__) + UIControl_SpaceIndicatorBar m_spaceIndicatorSaves; +#endif + +private: + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttonListSaves, "SavesList") + UI_MAP_ELEMENT( m_buttonListGames, "JoinList") + + UI_MAP_ELEMENT( m_labelSavesListTitle, "SavesListTitle") + UI_MAP_ELEMENT( m_labelJoinListTitle, "JoinListTitle") + UI_MAP_ELEMENT( m_labelNoGames, "NoGames") + + UI_MAP_ELEMENT( m_controlSavesTimer, "SavesTimer") + UI_MAP_ELEMENT( m_controlJoinTimer, "JoinTimer") + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + UI_MAP_ELEMENT( m_spaceIndicatorSaves, "SaveSizeBar") +#endif + UI_END_MAP_ELEMENTS_AND_NAMES() + + int m_iDefaultButtonsC; + int m_iMashUpButtonsC; + int m_iState; + + vector *m_currentSessions; + vector m_generators; + vector *m_saves; + + bool m_bIgnoreInput; + bool m_bAllLoaded; + bool m_bRetrievingSaveThumbnails; + bool m_bSaveThumbnailReady; + bool m_bShowingPartyGamesOnly; + bool m_bInParty; + JoinMenuInitData *m_initData; + bool m_bMultiplayerAllowed; + int m_iTexturePacksNotInstalled; + int m_iRequestingThumbnailId; + SAVE_DETAILS *m_pSaveDetails; + bool m_bSavesDisplayed; + bool m_bExitScene; + bool m_bCopying; + bool m_bCopyingCancelled; + int m_iSaveInfoC; + int m_iSaveListIndex; + int m_iGameListIndex; + //int *m_iConfigA; // track the texture packs that we don't have installed +#ifndef _XBOX_ONE + bool m_bSaveTransferInProgress; + bool m_bSaveTransferCancelled; +#endif + bool m_bUpdateSaveSize; + +public: + UIScene_LoadOrJoinMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_LoadOrJoinMenu(); + + virtual void updateTooltips(); + virtual void updateComponents(); + + virtual void handleDestroy(); + virtual void handleLoseFocus(); + virtual void handleGainFocus(bool navBack); + virtual void handleTimerComplete(int id); + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + virtual void handleFocusChange(F64 controlId, F64 childId); + virtual void handleInitFocus(F64 controlId, F64 childId); + + virtual EUIScene getSceneType() { return eUIScene_LoadOrJoinMenu;} + + static void UpdateGamesListCallback(LPVOID pParam); +#ifdef _XBOX_ONE + void HandleDLCLicenseChange(); +#endif + virtual void tick(); + +private: + void Initialise(); + void GetSaveInfo(); + void UpdateGamesList(); + void AddDefaultButtons(); + bool DoesSavesListHaveFocus(); + bool DoesMashUpWorldHaveFocus(); + bool DoesGamesListHaveFocus(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + + static int LoadSaveDataThumbnailReturned(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes); + static int LoadSaveCallback(LPVOID lpParam,bool bRes); + static int DeleteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int SaveOptionsDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int TexturePackDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int DeleteSaveDataReturned(LPVOID lpParam,bool bRes); + static int RenameSaveDataReturned(LPVOID lpParam,bool bRes); + static int KeyboardCompleteWorldNameCallback(LPVOID lpParam,bool bRes); +protected: + void handlePress(F64 controlId, F64 childId); + void LoadLevelGen(LevelGenerationOptions *levelGen); + void LoadSaveFromDisk(File *saveFile, ESavePlatform savePlatform = SAVE_FILE_PLATFORM_LOCAL); +#if defined(__PS3__) || defined(__PSVITA__) || defined(__ORBIS__) + void LoadSaveFromCloud(); +#endif +public: + virtual void HandleDLCMountingComplete(); + +#ifdef __ORBIS__ + void LoadRemoteFileFromDisk(char* remoteFilename); +#endif + +private: + void CheckAndJoinGame(int gameIndex); +#if defined(__PS3__) || defined(__PSVITA__) || defined(__ORBIS__) + static int MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int PSN_SignInReturned(void *pParam,bool bContinue, int iPad); + static void remoteStorageGetSaveCallback(LPVOID lpParam, SonyRemoteStorage::Status s, int error_code); +#endif + +#ifdef __ORBIS__ + //static int PSPlusReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); +#endif +#ifdef _XBOX_ONE + typedef struct _SaveTransferStateContainer + { + int m_iProgress; + bool m_bSaveTransferInProgress; + bool m_bSaveTransferCancelled; + int m_iPad; + C4JStorage::eSaveTransferState m_eSaveTransferState; + UIScene_LoadOrJoinMenu *m_pClass; + } SaveTransferStateContainer; + enum ESaveTransferFiles + { + eSaveTransferFile_Marker, + eSaveTransferFile_Metadata, + eSaveTransferFile_SaveData, + }; + static ESaveTransferFiles s_eSaveTransferFile; + static unsigned long s_ulFileSize; + static byteArray s_transferData; + static wstring m_wstrStageText; + LoadMenuInitData *m_loadMenuInitData; + +#ifdef _DEBUG_MENUS_ENABLED + static C4JStorage::SAVETRANSFER_FILE_DETAILS m_debugTransferDetails; +#endif + + void LaunchSaveTransfer(); + static int DownloadXbox360SaveThreadProc( LPVOID lpParameter ); + static void RequestFileSize( SaveTransferStateContainer *pClass, wchar_t *filename ); + static void RequestFileData( SaveTransferStateContainer *pClass, wchar_t *filename ); + static int SaveTransferReturned(LPVOID lpParam,C4JStorage::SAVETRANSFER_FILE_DETAILS *pSaveTransferDetails); + static int SaveTransferUpdateProgress(LPVOID lpParam,unsigned long ulBytesReceived); + static void CancelSaveTransferCallback(LPVOID lpParam); + static int NeedSyncMessageReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int CancelSaveTransferCompleteCallback(LPVOID lpParam); + +#endif + + + +#ifdef SONY_REMOTE_STORAGE_DOWNLOAD + enum eSaveTransferState + { + eSaveTransfer_Idle, + eSaveTransfer_Busy, + eSaveTransfer_GetRemoteSaveInfo, + eSaveTransfer_GettingRemoteSaveInfo, + eSaveTransfer_CreateDummyFile, + eSaveTransfer_CreatingDummyFile, + eSaveTransfer_GettingFileSize, + eSaveTransfer_FileSizeRetrieved, + eSaveTransfer_GetFileData, + eSaveTransfer_GettingFileData, + eSaveTransfer_FileDataRetrieved, + eSaveTransfer_GetSavesInfo, + eSaveTransfer_GettingSavesInfo, + eSaveTransfer_LoadSaveFromDisc, + eSaveTransfer_LoadingSaveFromDisc, + eSaveTransfer_CreatingNewSave, + eSaveTransfer_Converting, + eSaveTransfer_Saving, + eSaveTransfer_Succeeded, + eSaveTransfer_Cancelled, + eSaveTransfer_Error, + eSaveTransfer_ErrorDeletingSave, + eSaveTransfer_ErrorMesssage, + eSaveTransfer_Finished, + + }; + eSaveTransferState m_eSaveTransferState; + static unsigned long m_ulFileSize; + static wstring m_wstrStageText; + int m_iProgress; + char m_downloadedUniqueFilename[64];//SCE_SAVE_DATA_DIRNAME_DATA_MAXSIZE]; + bool m_saveTransferDownloadCancelled; + void LaunchSaveTransfer(); + static int CreateDummySaveDataCallback(LPVOID lpParam,bool bRes); + static int CrossSaveGetSavesInfoCallback(LPVOID lpParam, SAVE_DETAILS *pSaveDetails,bool bRes); + static int LoadCrossSaveDataCallback(void *pParam,bool bIsCorrupt, bool bIsOwner); + static int CrossSaveFinishedCallback(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int CrossSaveDeleteOnErrorReturned(LPVOID lpParam,bool bRes); + static int RemoteSaveNotFoundCallback(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int DownloadSonyCrossSaveThreadProc( LPVOID lpParameter ); + static void SaveTransferReturned(LPVOID lpParam, SonyRemoteStorage::Status s, int error_code); + static ConsoleSaveFile* SonyCrossSaveConvert(); + + static void CancelSaveTransferCallback(LPVOID lpParam); +#endif + +#ifdef SONY_REMOTE_STORAGE_UPLOAD + enum eSaveUploadState + { + eSaveUpload_Idle, + eSaveUpload_UploadingFileData, + eSaveUpload_FileDataUploaded, + eSaveUpload_Cancelled, + eSaveUpload_Error, + esaveUpload_Finished + }; + + eSaveUploadState m_eSaveUploadState; + bool m_saveTransferUploadCancelled; + + void LaunchSaveUpload(); + static int UploadSonyCrossSaveThreadProc( LPVOID lpParameter ); + static void SaveUploadReturned(LPVOID lpParam, SonyRemoteStorage::Status s, int error_code); + static void CancelSaveUploadCallback(LPVOID lpParam); + static int SaveTransferDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int CrossSaveUploadFinishedCallback(void *pParam,int iPad,C4JStorage::EMessageResult result); +#endif + +#if defined _XBOX_ONE || defined __ORBIS__ + static int CopySaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int CopySaveThreadProc( LPVOID lpParameter ); + static int CopySaveDataReturned( LPVOID lpParameter, bool success, C4JStorage::ESaveGameState state ); + static bool CopySaveDataProgress(LPVOID lpParam, int percent); + static void CancelCopySaveCallback(LPVOID lpParam); + static int CopySaveErrorDialogFinishedCallback(void *pParam,int iPad,C4JStorage::EMessageResult result); +#endif +}; diff --git a/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp b/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp new file mode 100644 index 00000000..7724aaaf --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp @@ -0,0 +1,2043 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\Mth.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\Random.h" +#include "..\..\User.h" +#include "..\..\MinecraftServer.h" +#include "UI.h" +#include "UIScene_MainMenu.h" +#ifdef __ORBIS__ +#include +#endif + +Random *UIScene_MainMenu::random = new Random(); + +UIScene_MainMenu::UIScene_MainMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ +#ifdef __ORBIS + //m_ePatchCheckState=ePatchCheck_Idle; + m_bRunGameChosen=false; + m_bErrorDialogRunning=false; +#endif + + + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + parentLayer->addComponent(iPad,eUIComponent_Panorama); + parentLayer->addComponent(iPad,eUIComponent_Logo); + + m_eAction=eAction_None; + m_bIgnorePress=false; + + + m_buttons[(int)eControl_PlayGame].init(app.GetString(IDS_PLAY_GAME),eControl_PlayGame); + +#ifdef _XBOX_ONE + if(!ProfileManager.IsFullVersion()) m_buttons[(int)eControl_PlayGame].setLabel(app.GetString(IDS_PLAY_TRIAL_GAME)); + app.SetReachedMainMenu(); +#endif + + m_buttons[(int)eControl_Leaderboards].init(app.GetString(IDS_LEADERBOARDS),eControl_Leaderboards); + m_buttons[(int)eControl_Achievements].init(app.GetString(IDS_ACHIEVEMENTS),eControl_Achievements); + m_buttons[(int)eControl_HelpAndOptions].init(app.GetString(IDS_HELP_AND_OPTIONS),eControl_HelpAndOptions); + if(ProfileManager.IsFullVersion()) + { + m_bTrialVersion=false; + m_buttons[(int)eControl_UnlockOrDLC].init(app.GetString(IDS_DOWNLOADABLECONTENT),eControl_UnlockOrDLC); + } + else + { + m_bTrialVersion=true; + m_buttons[(int)eControl_UnlockOrDLC].init(app.GetString(IDS_UNLOCK_FULL_GAME),eControl_UnlockOrDLC); + } + +#ifndef _DURANGO + m_buttons[(int)eControl_Exit].init(app.GetString(IDS_EXIT_GAME),eControl_Exit); +#else + m_buttons[(int)eControl_XboxHelp].init(app.GetString(IDS_XBOX_HELP_APP), eControl_XboxHelp); +#endif + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + // Not allowed to exit from a PS3 game from the game - have to use the PS button + removeControl( &m_buttons[(int)eControl_Exit], false ); + // We don't have a way to display trophies/achievements, so remove the button + removeControl( &m_buttons[(int)eControl_Achievements], false ); + m_bLaunchFullVersionPurchase=false; +#endif +#ifdef _DURANGO + // Allowed to not have achievements in the menu + removeControl( &m_buttons[(int)eControl_Achievements], false ); + // Not allowed to exit from a Xbox One game from the game - have to use the Home button + //removeControl( &m_buttons[(int)eControl_Exit], false ); + m_bWaitingForDLCInfo=false; +#endif + + doHorizontalResizeCheck(); + + m_splash = L""; + + wstring filename = L"splashes.txt"; + if( app.hasArchiveFile(filename) ) + { + byteArray splashesArray = app.getArchiveFile(filename); + ByteArrayInputStream bais(splashesArray); + InputStreamReader isr( &bais ); + BufferedReader br( &isr ); + + wstring line = L""; + while ( !(line = br.readLine()).empty() ) + { + line = trimString( line ); + if (line.length() > 0) + { + m_splashes.push_back(line); + } + } + + br.close(); + } + + m_bIgnorePress=false; + m_bLoadTrialOnNetworkManagerReady = false; + + // 4J Stu - Clear out any loaded game rules + app.setLevelGenerationOptions(NULL); + + // 4J Stu - Reset the leaving game flag so that we correctly handle signouts while in the menus + g_NetworkManager.ResetLeavingGame(); + +#if TO_BE_IMPLEMENTED + // Fix for #45154 - Frontend: DLC: Content can only be downloaded from the frontend if you have not joined/exited multiplayer + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); +#endif +} + +UIScene_MainMenu::~UIScene_MainMenu() +{ + m_parentLayer->removeComponent(eUIComponent_Panorama); + m_parentLayer->removeComponent(eUIComponent_Logo); +} + +void UIScene_MainMenu::updateTooltips() +{ + int iX = -1; + int iA = -1; + if(!m_bIgnorePress) + { + iA = IDS_TOOLTIPS_SELECT; + +#ifdef _XBOX_ONE + iX = IDS_TOOLTIPS_CHOOSE_USER; +#elif defined __PSVITA__ + if(ProfileManager.IsFullVersion()) + { + iX = IDS_TOOLTIP_CHANGE_NETWORK_MODE; + } +#endif + } + ui.SetTooltips( DEFAULT_XUI_MENU_USER, iA, -1, iX); +} + +void UIScene_MainMenu::updateComponents() +{ + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); +} + +void UIScene_MainMenu::handleGainFocus(bool navBack) +{ + UIScene::handleGainFocus(navBack); + ui.ShowPlayerDisplayname(false); + m_bIgnorePress=false; + + // 4J-JEV: This needs to come before SetLockedProfile(-1) as it wipes the XbLive contexts. + if (!navBack) + { + for (int iPad = 0; iPad < MAX_LOCAL_PLAYERS; iPad++) + { + // For returning to menus after exiting a game. + if (ProfileManager.IsSignedIn(iPad) ) + { + ProfileManager.SetCurrentGameActivity(iPad, CONTEXT_PRESENCE_MENUS, false); + } + } + } + ProfileManager.SetLockedProfile(-1); + + m_bIgnorePress = false; + updateTooltips(); + +#ifdef _DURANGO + ProfileManager.ClearGameUsers(); +#endif + + if(navBack && ProfileManager.IsFullVersion()) + { + // Replace the Unlock Full Game with Downloadable Content + m_buttons[(int)eControl_UnlockOrDLC].setLabel(app.GetString(IDS_DOWNLOADABLECONTENT)); + } + +#if TO_BE_IMPLEMENTED + // Fix for #45154 - Frontend: DLC: Content can only be downloaded from the frontend if you have not joined/exited multiplayer + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); + m_Timer.SetShow(FALSE); +#endif + m_controlTimer.setVisible( false ); + + // 4J-PB - remove the "hobo humping" message legal say we can't have, and the 1080p one for Vita +#ifdef __PSVITA__ + int splashIndex = eSplashRandomStart + 2 + random->nextInt( (int)m_splashes.size() - (eSplashRandomStart + 2) ); +#else + int splashIndex = eSplashRandomStart + 1 + random->nextInt( (int)m_splashes.size() - (eSplashRandomStart + 1) ); +#endif + + // Override splash text on certain dates + SYSTEMTIME LocalSysTime; + GetLocalTime( &LocalSysTime ); + if (LocalSysTime.wMonth == 11 && LocalSysTime.wDay == 9) + { + splashIndex = eSplashHappyBirthdayEx; + } + else if (LocalSysTime.wMonth == 6 && LocalSysTime.wDay == 1) + { + splashIndex = eSplashHappyBirthdayNotch; + } + else if (LocalSysTime.wMonth == 12 && LocalSysTime.wDay == 24) // the Java game shows this on Christmas Eve, so we will too + { + splashIndex = eSplashMerryXmas; + } + else if (LocalSysTime.wMonth == 1 && LocalSysTime.wDay == 1) + { + splashIndex = eSplashHappyNewYear; + } + //splashIndex = 47; // Very short string + //splashIndex = 194; // Very long string + //splashIndex = 295; // Coloured + //splashIndex = 296; // Noise + m_splash = m_splashes.at( splashIndex ); +} + +wstring UIScene_MainMenu::getMoviePath() +{ + return L"MainMenu"; +} + +void UIScene_MainMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + + if(m_bIgnorePress) return; + +#if defined (__ORBIS__) || defined (__PSVITA__) + // ignore all players except player 0 - it's their profile that is currently being used + if(iPad!=0) return; +#endif + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + if(pressed) + { + ProfileManager.SetPrimaryPad(iPad); + ProfileManager.SetLockedProfile(-1); + sendInputToMovie(key, repeat, pressed, released); + } + break; +#ifdef _XBOX_ONE + case ACTION_MENU_X: + if(pressed) + { + m_bIgnorePress = true; + ProfileManager.RequestSignInUI(false, false, false, false, false, ChooseUser_SignInReturned, this, iPad); + } + break; +#endif +#ifdef __PSVITA__ + case ACTION_MENU_X: + if(pressed && ProfileManager.IsFullVersion()) + { + UINT uiIDA[2]; + uiIDA[0]=IDS__NETWORK_PSN; + uiIDA[1]=IDS_NETWORK_ADHOC; + ui.RequestMessageBox(IDS_SELECT_NETWORK_MODE_TITLE, IDS_SELECT_NETWORK_MODE_TEXT, uiIDA, 2, XUSER_INDEX_ANY, &UIScene_MainMenu::SelectNetworkModeReturned,this); + } + break; +#endif + + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_MainMenu::handlePress(F64 controlId, F64 childId) +{ + int primaryPad = ProfileManager.GetPrimaryPad(); + + int (*signInReturnedFunc) (LPVOID,const bool, const int iPad) = NULL; + + switch((int)controlId) + { + case eControl_PlayGame: +#ifdef __ORBIS__ + { + m_bIgnorePress=true; + + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + ProfileManager.RefreshChatAndContentRestrictions(RefreshChatAndContentRestrictionsReturned_PlayGame, this); + } +#else + m_eAction=eAction_RunGame; + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + signInReturnedFunc = &UIScene_MainMenu::CreateLoad_SignInReturned; +#endif + break; + case eControl_Leaderboards: + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); +#ifdef __ORBIS__ + ProfileManager.RefreshChatAndContentRestrictions(RefreshChatAndContentRestrictionsReturned_Leaderboards, this); +#else + m_eAction=eAction_RunLeaderboards; + signInReturnedFunc = &UIScene_MainMenu::Leaderboards_SignInReturned; +#endif + break; + case eControl_Achievements: + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + m_eAction=eAction_RunAchievements; + signInReturnedFunc = &UIScene_MainMenu::Achievements_SignInReturned; + break; + case eControl_HelpAndOptions: + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + m_eAction=eAction_RunHelpAndOptions; + signInReturnedFunc = &UIScene_MainMenu::HelpAndOptions_SignInReturned; + break; + case eControl_UnlockOrDLC: + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + m_eAction=eAction_RunUnlockOrDLC; + signInReturnedFunc = &UIScene_MainMenu::UnlockFullGame_SignInReturned; + break; +#if defined _XBOX + case eControl_Exit: + if( ProfileManager.IsFullVersion() ) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CANCEL; + uiIDA[1]=IDS_OK; + ui.RequestMessageBox(IDS_WARNING_ARCADE_TITLE, IDS_WARNING_ARCADE_TEXT, uiIDA, 2, XUSER_INDEX_ANY,&UIScene_MainMenu::ExitGameReturned,this); + } + else + { +#ifdef _XBOX_ONE + ui.ShowPlayerDisplayname(true); +#endif + ui.NavigateToScene(primaryPad,eUIScene_TrialExitUpsell); + } + break; +#endif + +#ifdef _DURANGO + case eControl_XboxHelp: + ui.PlayUISFX(eSFX_Press); + + m_eAction=eAction_RunXboxHelp; + signInReturnedFunc = &UIScene_MainMenu::XboxHelp_SignInReturned; + break; +#endif + + default: __debugbreak(); + } + + bool confirmUser = false; + + // Note: if no sign in returned func, assume this isn't required + if (signInReturnedFunc != NULL) + { + if(ProfileManager.IsSignedIn(primaryPad)) + { + if (confirmUser) + { + ProfileManager.RequestSignInUI(false, false, true, false, true, signInReturnedFunc, this, primaryPad); + } + else + { + RunAction(primaryPad); + } + } + else + { + // Ask user to sign in + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + ui.RequestMessageBox(IDS_MUST_SIGN_IN_TITLE, IDS_MUST_SIGN_IN_TEXT, uiIDA, 2, primaryPad, &UIScene_MainMenu::MustSignInReturned, this, app.GetStringTable()); + } + } +} + +// Run current action +void UIScene_MainMenu::RunAction(int iPad) +{ + switch(m_eAction) + { + case eAction_RunGame: + RunPlayGame(iPad); + break; + case eAction_RunLeaderboards: + RunLeaderboards(iPad); + break; + case eAction_RunAchievements: + RunAchievements(iPad); + break; + case eAction_RunHelpAndOptions: + RunHelpAndOptions(iPad); + break; + case eAction_RunUnlockOrDLC: + RunUnlockOrDLC(iPad); + break; +#ifdef _DURANGO + case eAction_RunXboxHelp: + // 4J: Launch the dummy xbox help application. + WXS::User^ user = ProfileManager.GetUser(ProfileManager.GetPrimaryPad()); + Windows::Xbox::ApplicationModel::Help::Show(user); + break; +#endif + } +} + +void UIScene_MainMenu::customDraw(IggyCustomDrawCallbackRegion *region) +{ + if(wcscmp((wchar_t *)region->name,L"Splash")==0) + { + PIXBeginNamedEvent(0,"Custom draw splash"); + customDrawSplash(region); + PIXEndNamedEvent(); + } +} + +void UIScene_MainMenu::customDrawSplash(IggyCustomDrawCallbackRegion *region) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + + // 4J Stu - Move this to the ctor when the main menu is not the first scene we navigate to + ScreenSizeCalculator ssc(pMinecraft->options, pMinecraft->width_phys, pMinecraft->height_phys); + m_fScreenWidth=(float)pMinecraft->width_phys; + m_fRawWidth=(float)ssc.rawWidth; + m_fScreenHeight=(float)pMinecraft->height_phys; + m_fRawHeight=(float)ssc.rawHeight; + + + // Setup GDraw, normal game render states and matrices + CustomDrawData *customDrawRegion = ui.setupCustomDraw(this,region); + delete customDrawRegion; + + + Font *font = pMinecraft->font; + + // build and render with the game call + glDisable(GL_CULL_FACE); + glDisable(GL_DEPTH_TEST); + + glPushMatrix(); + + float width = region->x1 - region->x0; + float height = region->y1 - region->y0; + float xo = width/2; + float yo = height; + + glTranslatef(xo, yo, 0); + + glRotatef(-17, 0, 0, 1); + float sss = 1.8f - Mth::abs(Mth::sin(System::currentTimeMillis() % 1000 / 1000.0f * PI * 2) * 0.1f); + sss*=(m_fScreenWidth/m_fRawWidth); + + sss = sss * 100 / (font->width(m_splash) + 8 * 4); + glScalef(sss, sss, sss); + //drawCenteredString(font, splash, 0, -8, 0xffff00); + font->drawShadow(m_splash, 0 - (font->width(m_splash)) / 2, -8, 0xffff00); + glPopMatrix(); + + glDisable(GL_RESCALE_NORMAL); + + glEnable(GL_DEPTH_TEST); + + + // Finish GDraw and anything else that needs to be finalised + ui.endCustomDraw(region); +} + +int UIScene_MainMenu::MustSignInReturned(void *pParam, int iPad, C4JStorage::EMessageResult result) +{ + UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + // we need to specify local game here to display local and LIVE profiles in the list + switch(pClass->m_eAction) + { + case eAction_RunGame: ProfileManager.RequestSignInUI(false, true, false, false, true, &UIScene_MainMenu::CreateLoad_SignInReturned, pClass, iPad ); break; + case eAction_RunHelpAndOptions: ProfileManager.RequestSignInUI(false, false, true, false, true, &UIScene_MainMenu::HelpAndOptions_SignInReturned, pClass, iPad ); break; + case eAction_RunLeaderboards: ProfileManager.RequestSignInUI(false, false, true, false, true, &UIScene_MainMenu::Leaderboards_SignInReturned, pClass, iPad ); break; + case eAction_RunAchievements: ProfileManager.RequestSignInUI(false, false, true, false, true, &UIScene_MainMenu::Achievements_SignInReturned, pClass, iPad ); break; + case eAction_RunUnlockOrDLC: ProfileManager.RequestSignInUI(false, false, true, false, true, &UIScene_MainMenu::UnlockFullGame_SignInReturned, pClass, iPad ); break; +#ifdef _DURANGO + case eAction_RunXboxHelp: ProfileManager.RequestSignInUI(false, false, true, false, true, &UIScene_MainMenu::XboxHelp_SignInReturned, pClass, iPad ); break; +#endif + } + } + else + { + pClass->m_bIgnorePress=false; + // unlock the profile + ProfileManager.SetLockedProfile(-1); + for(int i=0;im_eAction) + { + case eAction_RunLeaderboardsPSN: + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_MainMenu::Leaderboards_SignInReturned, pClass); + break; + case eAction_RunGamePSN: + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_MainMenu::CreateLoad_SignInReturned, pClass); + break; + case eAction_RunUnlockOrDLCPSN: + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_MainMenu::UnlockFullGame_SignInReturned, pClass); + break; + } +#elif defined __PSVITA__ + switch(pClass->m_eAction) + { + case eAction_RunLeaderboardsPSN: + //CD - Must force Ad-Hoc off if they want leaderboard PSN sign-in + //Save settings change + app.SetGameSettings(0, eGameSetting_PSVita_NetworkModeAdhoc, 0); + //Force off + CGameNetworkManager::setAdhocMode(false); + //Now Sign-in + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_MainMenu::Leaderboards_SignInReturned, pClass); + break; + case eAction_RunGamePSN: + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_MainMenu::CreateLoad_SignInReturned, pClass); + break; + case eAction_RunUnlockOrDLCPSN: + //CD - Must force Ad-Hoc off if they want commerce PSN sign-in + //Save settings change + app.SetGameSettings(0, eGameSetting_PSVita_NetworkModeAdhoc, 0); + //Force off + CGameNetworkManager::setAdhocMode(false); + //Now Sign-in + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_MainMenu::UnlockFullGame_SignInReturned, pClass); + break; + } +#else + switch(pClass->m_eAction) + { + case eAction_RunLeaderboardsPSN: + SQRNetworkManager_Orbis::AttemptPSNSignIn(&UIScene_MainMenu::Leaderboards_SignInReturned, pClass, true, iPad); + break; + case eAction_RunGamePSN: + SQRNetworkManager_Orbis::AttemptPSNSignIn(&UIScene_MainMenu::CreateLoad_SignInReturned, pClass, true, iPad); + break; + case eAction_RunUnlockOrDLCPSN: + SQRNetworkManager_Orbis::AttemptPSNSignIn(&UIScene_MainMenu::UnlockFullGame_SignInReturned, pClass, true, iPad); + break; + } + +#endif + } + else + { + if( pClass->m_eAction == eAction_RunGamePSN ) + { + if( result == C4JStorage::EMessage_Cancelled) + CreateLoad_SignInReturned(pClass, false, 0); + else + CreateLoad_SignInReturned(pClass, true, 0); + } + else + { + pClass->m_bIgnorePress=false; + } + } + + return 0; +} +#endif + +int UIScene_MainMenu::HelpAndOptions_SignInReturned(void *pParam,bool bContinue,int iPad) +{ + UIScene_MainMenu *pClass = (UIScene_MainMenu *)pParam; + + if(bContinue) + { + // 4J-JEV: Don't we only need to update rich-presence if the sign-in status changes. + ProfileManager.SetCurrentGameActivity(iPad, CONTEXT_PRESENCE_MENUS, false); + +#if TO_BE_IMPLEMENTED + if(app.GetTMSDLCInfoRead()) +#endif + { + ProfileManager.SetLockedProfile(ProfileManager.GetPrimaryPad()); +#ifdef _XBOX_ONE + ui.ShowPlayerDisplayname(true); +#endif + ui.NavigateToScene(iPad,eUIScene_HelpAndOptionsMenu); + } +#if TO_BE_IMPLEMENTED + else + { + // Changing to async TMS calls + app.SetTMSAction(iPad,eTMSAction_TMSPP_RetrieveFiles_HelpAndOptions); + + // block all input + pClass->m_bIgnorePress=true; + // We want to hide everything in this scene and display a timer until we get a completion for the TMS files + for(int i=0;im_Buttons[i].SetShow(FALSE); + } + + pClass->updateTooltips(); + + pClass->m_Timer.SetShow(TRUE); + } +#endif + } + else + { + pClass->m_bIgnorePress=false; + // unlock the profile + ProfileManager.SetLockedProfile(-1); + for(int i=0;im_bIgnorePress = false; + + return 0; +} +#endif + +int UIScene_MainMenu::CreateLoad_SignInReturned(void *pParam, bool bContinue, int iPad) +{ + UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam; + + if(bContinue) + { + // 4J-JEV: We only need to update rich-presence if the sign-in status changes. + ProfileManager.SetCurrentGameActivity(iPad, CONTEXT_PRESENCE_MENUS, false); + + UINT uiIDA[1] = { IDS_OK }; + + if(ProfileManager.IsGuest(ProfileManager.GetPrimaryPad())) + { + pClass->m_bIgnorePress=false; + ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + } + else + { + ProfileManager.SetLockedProfile(ProfileManager.GetPrimaryPad()); + + + // change the minecraft player name + Minecraft::GetInstance()->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); + + if(ProfileManager.IsFullVersion()) + { + bool bSignedInLive = ProfileManager.IsSignedInLive(iPad); +#ifdef __PSVITA__ + if(CGameNetworkManager::usingAdhocMode()) + { + if(SQRNetworkManager_AdHoc_Vita::GetAdhocStatus()) + { + bSignedInLive = true; + } + else + { + // adhoc mode, but we didn't make the connection, turn off adhoc mode, and just go with whatever the regular online status is + CGameNetworkManager::setAdhocMode(false); + bSignedInLive = ProfileManager.IsSignedInLive(iPad); + } + } +#endif + + // Check if we're signed in to LIVE + if(bSignedInLive) + { + // 4J-PB - Need to check for installed DLC + if(!app.DLCInstallProcessCompleted()) app.StartInstallDLCProcess(iPad); + + if(ProfileManager.IsGuest(iPad)) + { + pClass->m_bIgnorePress=false; + ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + } + else + { + // 4J Stu - Not relevant to PS3 +#ifdef _XBOX_ONE +// if(app.GetTMSDLCInfoRead() && app.GetBanListRead(iPad)) + if(app.GetBanListRead(iPad)) + { + Minecraft *pMinecraft=Minecraft::GetInstance(); + pMinecraft->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); + + // ensure we've applied this player's settings + app.ApplyGameSettingsChanged(iPad); + +#ifdef _XBOX_ONE + ui.ShowPlayerDisplayname(true); +#endif + ui.NavigateToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); + } + else + { + app.SetTMSAction(iPad,eTMSAction_TMSPP_RetrieveFiles_RunPlayGame); + + // block all input + pClass->m_bIgnorePress=true; + // We want to hide everything in this scene and display a timer until we get a completion for the TMS files + // for(int i=0;iupdateTooltips(); + + pClass->m_controlTimer.setVisible( true ); + } +#endif +#if TO_BE_IMPLEMENTED + // check if all the TMS files are loaded + if(app.GetTMSDLCInfoRead() && app.GetTMSXUIDsFileRead() && app.GetBanListRead(iPad)) + { + if(StorageManager.SetSaveDevice(&UIScene_MainMenu::DeviceSelectReturned,pClass)==true) + { + // save device already selected + + // ensure we've applied this player's settings + app.ApplyGameSettingsChanged(ProfileManager.GetPrimaryPad()); + // check for DLC + // start timer to track DLC check finished + pClass->m_Timer.SetShow(TRUE); + XuiSetTimer(pClass->m_hObj,DLC_INSTALLED_TIMER_ID,DLC_INSTALLED_TIMER_TIME); + //app.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_MultiGameJoinLoad); + } + } + else + { + // Changing to async TMS calls + app.SetTMSAction(iPad,eTMSAction_TMSPP_RetrieveFiles_RunPlayGame); + + // block all input + pClass->m_bIgnorePress=true; + // We want to hide everything in this scene and display a timer until we get a completion for the TMS files + for(int i=0;im_Buttons[i].SetShow(FALSE); + } + + updateTooltips(); + + pClass->m_Timer.SetShow(TRUE); + } +#else + Minecraft *pMinecraft=Minecraft::GetInstance(); + pMinecraft->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); + + // ensure we've applied this player's settings + app.ApplyGameSettingsChanged(iPad); + +#ifdef _XBOX_ONE + ui.ShowPlayerDisplayname(true); +#endif + ui.NavigateToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); +#endif + } + } + else + { +#if TO_BE_IMPLEMENTED + // offline + ProfileManager.DisplayOfflineProfile(&CScene_Main::CreateLoad_OfflineProfileReturned,pClass, ProfileManager.GetPrimaryPad() ); +#else + app.DebugPrintf("Offline Profile returned not implemented\n"); +#ifdef _XBOX_ONE + ui.ShowPlayerDisplayname(true); +#endif + ui.NavigateToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); +#endif + } + } + else + { + // 4J-PB - if this is the trial game, we can't have any networking + // Can't apply the player's settings here - they haven't come back from the QuerySignInStatud call above yet. + // Need to let them action in the main loop when they come in + // ensure we've applied this player's settings + //app.ApplyGameSettingsChanged(iPad); + +#if defined(__PS3__) || defined(__ORBIS__) || defined( __PSVITA__) + // ensure we've applied this player's settings - we do have them on PS3 + app.ApplyGameSettingsChanged(iPad); +#endif + +#ifdef __ORBIS__ + if(!g_NetworkManager.IsReadyToPlayOrIdle()) + { + pClass->m_bLoadTrialOnNetworkManagerReady = true; + ui.NavigateToScene(iPad, eUIScene_Timer); + } + else +#endif + { + // go straight in to the trial level + LoadTrial(); + } + } + } + } + else + { + pClass->m_bIgnorePress=false; + + // unlock the profile + ProfileManager.SetLockedProfile(-1); + for(int i=0;im_bIgnorePress=false; + ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + } + else if(!ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())) + { + pClass->m_bIgnorePress=false; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); + } + else + { + bool bContentRestricted=false; +#if defined(__PS3__) || defined(__PSVITA__) + ProfileManager.GetChatAndContentRestrictions(iPad,true,NULL,&bContentRestricted,NULL); +#endif + if(bContentRestricted) + { + pClass->m_bIgnorePress=false; +#if !(defined(_XBOX) || defined(_WIN64)) // 4J Stu - Temp to get the win build running, but so we check this for other platforms + // you can't see leaderboards + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); +#endif + } + else + { + ProfileManager.SetLockedProfile(ProfileManager.GetPrimaryPad()); +#ifdef _XBOX_ONE + ui.ShowPlayerDisplayname(true); +#endif + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_LeaderboardsMenu); + } + } + } + else + { + pClass->m_bIgnorePress=false; + // unlock the profile + ProfileManager.SetLockedProfile(-1); + for(int i=0;im_bIgnorePress=false; + // 4J-JEV: We only need to update rich-presence if the sign-in status changes. + ProfileManager.SetCurrentGameActivity(iPad, CONTEXT_PRESENCE_MENUS, false); + + XShowAchievementsUI( ProfileManager.GetPrimaryPad() ); + } + else + { + pClass->m_bIgnorePress=false; + // unlock the profile + ProfileManager.SetLockedProfile(-1); + for(int i=0;iRunUnlockOrDLC(iPad); + } + else + { + pClass->m_bIgnorePress=false; + // unlock the profile + ProfileManager.SetLockedProfile(-1); + for(int i=0;im_errorCode = ProfileManager.getNPAvailability(ProfileManager.GetPrimaryPad()); + + bool bPatchAvailable; + switch(pClass->m_errorCode) + { + case SCE_NP_ERROR_LATEST_PATCH_PKG_EXIST: + case SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED: + bPatchAvailable=true; + break; + default: + bPatchAvailable=false; + break; + } + + if(!bPatchAvailable) + { + pClass->m_eAction=eAction_RunGame; + signInReturnedFunc = &UIScene_MainMenu::CreateLoad_SignInReturned; + } + else + { + pClass->m_bRunGameChosen=true; + pClass->m_bErrorDialogRunning=true; + int32_t ret=sceErrorDialogInitialize(); + if ( ret==SCE_OK ) + { + SceErrorDialogParam param; + sceErrorDialogParamInitialize( ¶m ); + // 4J-PB - We want to display the option to get the patch now + param.errorCode = SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED;//pClass->m_errorCode; + ret = sceUserServiceGetInitialUser( ¶m.userId ); + if ( ret == SCE_OK ) + { + ret=sceErrorDialogOpen( ¶m ); + } + return; + } + +// UINT uiIDA[1]; +// uiIDA[0]=IDS_OK; +// ui.RequestMessageBox(IDS_PATCH_AVAILABLE_TITLE, IDS_PATCH_AVAILABLE_TEXT, uiIDA, 1, XUSER_INDEX_ANY,NULL,pClass); + } + + // Check if PSN is unavailable because of age restriction + if (pClass->m_errorCode == SCE_NP_ERROR_AGE_RESTRICTION) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_PRO_NOTONLINE_DECLINE; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::PlayOfflineReturned, pClass, app.GetStringTable()); + + return; + } + + bool confirmUser = false; + + // Note: if no sign in returned func, assume this isn't required + if (signInReturnedFunc != NULL) + { + if(ProfileManager.IsSignedIn(primaryPad)) + { + if (confirmUser) + { + ProfileManager.RequestSignInUI(false, false, true, false, true, signInReturnedFunc, pClass, primaryPad); + } + else + { + pClass->RunAction(primaryPad); + } + } + else + { + // Ask user to sign in + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + ui.RequestMessageBox(IDS_MUST_SIGN_IN_TITLE, IDS_MUST_SIGN_IN_TEXT, uiIDA, 2, primaryPad, &UIScene_MainMenu::MustSignInReturned, pClass, app.GetStringTable()); + } + } +} + +void UIScene_MainMenu::RefreshChatAndContentRestrictionsReturned_Leaderboards(void *pParam) +{ + int primaryPad = ProfileManager.GetPrimaryPad(); + + UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam; + + int (*signInReturnedFunc) (LPVOID,const bool, const int iPad) = NULL; + + // 4J-PB - Check if there is a patch for the game + pClass->m_errorCode = ProfileManager.getNPAvailability(ProfileManager.GetPrimaryPad()); + + bool bPatchAvailable; + switch(pClass->m_errorCode) + { + case SCE_NP_ERROR_LATEST_PATCH_PKG_EXIST: + case SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED: + bPatchAvailable=true; + break; + default: + bPatchAvailable=false; + break; + } + + if(!bPatchAvailable) + { + pClass->m_eAction=eAction_RunLeaderboards; + signInReturnedFunc = &UIScene_MainMenu::Leaderboards_SignInReturned; + } + else + { + int32_t ret=sceErrorDialogInitialize(); + pClass->m_bErrorDialogRunning=true; + if ( ret==SCE_OK ) + { + SceErrorDialogParam param; + sceErrorDialogParamInitialize( ¶m ); + // 4J-PB - We want to display the option to get the patch now + param.errorCode = SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED;//pClass->m_errorCode; + ret = sceUserServiceGetInitialUser( ¶m.userId ); + if ( ret == SCE_OK ) + { + ret=sceErrorDialogOpen( ¶m ); + } + } + +// UINT uiIDA[1]; +// uiIDA[0]=IDS_OK; +// ui.RequestMessageBox(IDS_PATCH_AVAILABLE_TITLE, IDS_PATCH_AVAILABLE_TEXT, uiIDA, 1, XUSER_INDEX_ANY,NULL,pClass); + } + + bool confirmUser = false; + + // Update error code + pClass->m_errorCode = ProfileManager.getNPAvailability(ProfileManager.GetPrimaryPad()); + + // Check if PSN is unavailable because of age restriction + if (pClass->m_errorCode == SCE_NP_ERROR_AGE_RESTRICTION) + { + UINT uiIDA[1]; + uiIDA[0] = IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(), nullptr, pClass, app.GetStringTable()); + + return; + } + + // Note: if no sign in returned func, assume this isn't required + if (signInReturnedFunc != NULL) + { + if(ProfileManager.IsSignedIn(primaryPad)) + { + if (confirmUser) + { + ProfileManager.RequestSignInUI(false, false, true, false, true, signInReturnedFunc, pClass, primaryPad); + } + else + { + pClass->RunAction(primaryPad); + } + } + else + { + // Ask user to sign in + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + ui.RequestMessageBox(IDS_MUST_SIGN_IN_TITLE, IDS_MUST_SIGN_IN_TEXT, uiIDA, 2, primaryPad, &UIScene_MainMenu::MustSignInReturned, pClass, app.GetStringTable()); + } + } +} + +int UIScene_MainMenu::PlayOfflineReturned(void *pParam, int iPad, C4JStorage::EMessageResult result) +{ + UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + if (pClass->m_eAction == eAction_RunGame) + { + CreateLoad_SignInReturned(pClass, true, 0); + } + else + { + pClass->m_bIgnorePress=false; + } + } + else + { + pClass->m_bIgnorePress=false; + } + + return 0; +} +#endif + +void UIScene_MainMenu::RunPlayGame(int iPad) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + + // clear the remembered signed in users so their profiles get read again + app.ClearSignInChangeUsersMask(); + + app.ReleaseSaveThumbnail(); + + if(ProfileManager.IsGuest(iPad)) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + + m_bIgnorePress=false; + ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + } + else + { + ProfileManager.SetLockedProfile(iPad); + + // If the player was signed in before selecting play, we'll not have read the profile yet, so query the sign-in status to get this to happen + ProfileManager.QuerySigninStatus(); + + // 4J-PB - Need to check for installed DLC + if(!app.DLCInstallProcessCompleted()) app.StartInstallDLCProcess(iPad); + + if(ProfileManager.IsFullVersion()) + { + // are we offline? + bool bSignedInLive = ProfileManager.IsSignedInLive(iPad); +#ifdef __PSVITA__ + if(app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_PSVita_NetworkModeAdhoc) == true) + { + CGameNetworkManager::setAdhocMode(true); + bSignedInLive = SQRNetworkManager_AdHoc_Vita::GetAdhocStatus(); + app.DebugPrintf("Adhoc mode signed in : %s\n", bSignedInLive ? "true" : "false"); + } + else + { + CGameNetworkManager::setAdhocMode(false); + app.DebugPrintf("PSN mode signed in : %s\n", bSignedInLive ? "true" : "false"); + } + +#endif //__PSVITA__ + + if(!bSignedInLive) + { +#if defined(__PS3__) || defined __PSVITA__ + // enable input again + m_bIgnorePress=false; + + // Not sure why 360 doesn't need this, but leaving as __PS3__ only for now until we see that it does. Without this, on a PS3 offline game, the primary player just gets the default Player1234 type name + pMinecraft->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); + + m_eAction=eAction_RunGamePSN; + // get them to sign in to online + UINT uiIDA[2]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; + +#ifdef __PSVITA__ + if(CGameNetworkManager::usingAdhocMode()) + { + uiIDA[0]=IDS_NETWORK_ADHOC; + // this should be "Connect to adhoc network" + ui.RequestMessageBox(IDS_PRO_NOTADHOCONLINE_TITLE, IDS_PRO_NOTADHOCONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_MainMenu::MustSignInReturnedPSN,this, app.GetStringTable()); + } + else + { + /* 4J-PB - Add this after release + // Determine why they're not "signed in live" + if (ProfileManager.IsSignedInPSN(iPad)) + { + m_eAction=eAction_RunGame; + // Signed in to PSN but not connected (no internet access) + + UINT uiIDA[1]; + uiIDA[0] = IDS_PRO_NOTONLINE_DECLINE; + ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, UIScene_MainMenu::PlayOfflineReturned, this, app.GetStringTable()); + } + else + { + m_eAction=eAction_RunGamePSN; + // Not signed in to PSN + ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPad, &UIScene_MainMenu::MustSignInReturnedPSN, this, app.GetStringTable()); + return; + } */ + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_MainMenu::MustSignInReturnedPSN,this, app.GetStringTable()); + + } +#else + + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPad, &UIScene_MainMenu::MustSignInReturnedPSN, this, app.GetStringTable()); +#endif + +#elif defined __ORBIS__ + + // Determine why they're not "signed in live" + if (ProfileManager.isSignedInPSN(iPad)) + { + m_eAction=eAction_RunGame; + // Signed in to PSN but not connected (no internet access) + assert(!ProfileManager.isConnectedToPSN(iPad)); + + UINT uiIDA[1]; + uiIDA[0] = IDS_PRO_NOTONLINE_DECLINE; + ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, UIScene_MainMenu::PlayOfflineReturned, this, app.GetStringTable()); + } + else + { + m_eAction=eAction_RunGamePSN; + // Not signed in to PSN + UINT uiIDA[2]; + uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1] = IDS_PRO_NOTONLINE_DECLINE; + ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPad, &UIScene_MainMenu::MustSignInReturnedPSN, this, app.GetStringTable(), NULL, 0, false); + return; + } +#else + ProfileManager.SetLockedProfile(iPad); +#ifdef _XBOX_ONE + ui.ShowPlayerDisplayname(true); +#endif + ui.NavigateToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); +#endif + } + else + { +#ifdef _XBOX_ONE + if(!app.GetBanListRead(iPad)) + { + app.SetTMSAction(iPad,eTMSAction_TMSPP_RetrieveFiles_RunPlayGame); + + // block all input + m_bIgnorePress=true; + // We want to hide everything in this scene and display a timer until we get a completion for the TMS files +// for(int i=0;iuser->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); + // save device already selected + + // ensure we've applied this player's settings + app.ApplyGameSettingsChanged(iPad); + // check for DLC + // start timer to track DLC check finished + m_Timer.SetShow(TRUE); + XuiSetTimer(m_hObj,DLC_INSTALLED_TIMER_ID,DLC_INSTALLED_TIMER_TIME); + //app.NavigateToScene(iPad,eUIScene_MultiGameJoinLoad); + } + } + else + { + // Changing to async TMS calls + app.SetTMSAction(iPad,eTMSAction_TMSPP_RetrieveFiles_RunPlayGame); + + // block all input + m_bIgnorePress=true; + // We want to hide everything in this scene and display a timer until we get a completion for the TMS files + for(int i=0;iuser->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); + + // ensure we've applied this player's settings + app.ApplyGameSettingsChanged(iPad); + +#ifdef _XBOX_ONE + ui.ShowPlayerDisplayname(true); +#endif + ui.NavigateToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); +#endif + } + } + else + { + // 4J-PB - if this is the trial game, we can't have any networking + // go straight in to the trial level + // change the minecraft player name + Minecraft::GetInstance()->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); + + // Can't apply the player's settings here - they haven't come back from the QuerySignInStatud call above yet. + // Need to let them action in the main loop when they come in + // ensure we've applied this player's settings + //app.ApplyGameSettingsChanged(iPad); + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + // ensure we've applied this player's settings - we do have them on PS3 + app.ApplyGameSettingsChanged(iPad); +#endif + +#ifdef __ORBIS__ + if(!g_NetworkManager.IsReadyToPlayOrIdle()) + { + m_bLoadTrialOnNetworkManagerReady = true; + ui.NavigateToScene(iPad, eUIScene_Timer); + } + else +#endif + { + LoadTrial(); + } + } + } +} + +void UIScene_MainMenu::RunLeaderboards(int iPad) +{ + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + + // guests can't look at leaderboards + if(ProfileManager.IsGuest(iPad)) + { + ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + } + else if(!ProfileManager.IsSignedInLive(iPad)) + { +#if defined __PS3__ || defined __PSVITA__ + m_eAction=eAction_RunLeaderboardsPSN; + // get them to sign in to online + UINT uiIDA[1]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),&UIScene_MainMenu::MustSignInReturnedPSN,this, app.GetStringTable()); + +/* 4J-PB - Add this after release +#elif defined __PSVITA__ + m_eAction=eAction_RunLeaderboardsPSN; + // Determine why they're not "signed in live" + if (ProfileManager.IsSignedInPSN(iPad)) + { + // Signed in to PSN but not connected (no internet access) + UINT uiIDA[1]; + uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; + ui.RequestMessageBox(IDS_PRO_CURRENTLY_NOT_ONLINE_TITLE, IDS_PRO_PSNOFFLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::MustSignInReturnedPSN, this, app.GetStringTable()); + } + else + { + // Not signed in to PSN + UINT uiIDA[1]; + uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::MustSignInReturnedPSN, this, app.GetStringTable()); + return; + }*/ +#elif defined __ORBIS__ + m_eAction=eAction_RunLeaderboardsPSN; + // Determine why they're not "signed in live" + if (ProfileManager.isSignedInPSN(iPad)) + { + // Signed in to PSN but not connected (no internet access) + assert(!ProfileManager.isConnectedToPSN(iPad)); + + UINT uiIDA[1]; + uiIDA[0] = IDS_OK; + ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + } + else + { + // Not signed in to PSN + UINT uiIDA[1]; + uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::MustSignInReturnedPSN, this, app.GetStringTable()); + return; + } +#else + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); +#endif + } + else + { + // we're supposed to check for parental control restrictions before showing leaderboards + // The title enforces the user's NP parental control setting for age-based content + //restriction in network communications. + // If age restrictions are in place and the user's age does not meet + // the age restriction of the title's online service content rating (CERO, ESRB, PEGI, etc.), then the title must + //display a message such as the following and disallow online service for this user. + + bool bContentRestricted=false; +#if defined(__PS3__) || defined(__PSVITA__) + ProfileManager.GetChatAndContentRestrictions(iPad,true,NULL,&bContentRestricted,NULL); +#endif + if(bContentRestricted) + { +#if !(defined(_XBOX) || defined(_WIN64)) // 4J Stu - Temp to get the win build running, but so we check this for other platforms + // you can't see leaderboards + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,this, app.GetStringTable()); +#endif + } + else + { + ProfileManager.SetLockedProfile(iPad); + // If the player was signed in before selecting play, we'll not have read the profile yet, so query the sign-in status to get this to happen + ProfileManager.QuerySigninStatus(); + +#ifdef _XBOX_ONE + ui.ShowPlayerDisplayname(true); +#endif + ui.NavigateToScene(iPad, eUIScene_LeaderboardsMenu); + } + } +} +void UIScene_MainMenu::RunUnlockOrDLC(int iPad) +{ + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + + // Check if this means downloadable content + if(ProfileManager.IsFullVersion()) + { +#ifdef __ORBIS__ + // 4J-PB - Check if there is a patch for the game + m_errorCode = ProfileManager.getNPAvailability(ProfileManager.GetPrimaryPad()); + + bool bPatchAvailable; + switch(m_errorCode) + { + case SCE_NP_ERROR_LATEST_PATCH_PKG_EXIST: + case SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED: + bPatchAvailable=true; + break; + default: + bPatchAvailable=false; + break; + } + + if(bPatchAvailable) + { + m_bIgnorePress=false; + + int32_t ret=sceErrorDialogInitialize(); + m_bErrorDialogRunning=true; + if ( ret==SCE_OK ) + { + SceErrorDialogParam param; + sceErrorDialogParamInitialize( ¶m ); + // 4J-PB - We want to display the option to get the patch now + param.errorCode = SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED;//pClass->m_errorCode; + ret = sceUserServiceGetInitialUser( ¶m.userId ); + if ( ret == SCE_OK ) + { + ret=sceErrorDialogOpen( ¶m ); + } + } + +// UINT uiIDA[1]; +// uiIDA[0]=IDS_OK; +// ui.RequestMessageBox(IDS_PATCH_AVAILABLE_TITLE, IDS_PATCH_AVAILABLE_TEXT, uiIDA, 1, XUSER_INDEX_ANY,NULL,this); + return; + } + + // Check if PSN is unavailable because of age restriction + if (m_errorCode == SCE_NP_ERROR_AGE_RESTRICTION) + { + m_bIgnorePress=false; + UINT uiIDA[1]; + uiIDA[0] = IDS_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(), nullptr, this, app.GetStringTable()); + + return; + } +#endif + // downloadable content + if(ProfileManager.IsSignedInLive(iPad)) + { + if(ProfileManager.IsGuest(iPad)) + { + m_bIgnorePress=false; + ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + } + else + { + + // If the player was signed in before selecting play, we'll not have read the profile yet, so query the sign-in status to get this to happen + ProfileManager.QuerySigninStatus(); + +#if defined _XBOX_ONE + if(app.GetTMSDLCInfoRead()) +#endif + { + bool bContentRestricted=false; +#if defined(__PS3__) || defined(__PSVITA__) + ProfileManager.GetChatAndContentRestrictions(iPad,true,NULL,&bContentRestricted,NULL); +#endif + if(bContentRestricted) + { + m_bIgnorePress=false; +#if !(defined(_XBOX) || defined(_WIN64)) // 4J Stu - Temp to get the win build running, but so we check this for other platforms + // you can't see the store + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,this, app.GetStringTable()); +#endif + } + else + { + ProfileManager.SetLockedProfile(iPad); +#ifdef _XBOX_ONE + ui.ShowPlayerDisplayname(true); +#endif + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_DLCMainMenu); + } + } +#if defined _XBOX_ONE + else + { + // Changing to async TMS calls + app.SetTMSAction(iPad,eTMSAction_TMSPP_RetrieveFiles_DLCMain); + + // block all input + m_bIgnorePress=true; + // We want to hide everything in this scene and display a timer until we get a completion for the TMS files +// for(int i=0;iRecordUpsellPresented(iPad, eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID); + ProfileManager.DisplayFullVersionPurchase(false,iPad,eSen_UpsellID_Full_Version_Of_Game); +#endif + } + } +} + +void UIScene_MainMenu::tick() +{ + UIScene::tick(); + +#if defined(__PS3__) || defined (__ORBIS__) || defined(__PSVITA__) + if(m_bLaunchFullVersionPurchase) + { + int iCommerceState=app.GetCommerceState(); + // 4J-PB - if there's a commerce error - store down, player can't access store - let the DisplayFullVersionPurchase show the error + if((iCommerceState==CConsoleMinecraftApp::eCommerce_State_Online) || (iCommerceState==CConsoleMinecraftApp::eCommerce_State_Error)) + { + m_bLaunchFullVersionPurchase=false; + m_bIgnorePress=false; + updateTooltips(); + + // 4J-PB - need to check this user can access the store + bool bContentRestricted=false; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),true,NULL,&bContentRestricted,NULL); + if(bContentRestricted) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,this, app.GetStringTable()); + } + else + { + TelemetryManager->RecordUpsellPresented(ProfileManager.GetPrimaryPad(), eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID); + ProfileManager.DisplayFullVersionPurchase(false,ProfileManager.GetPrimaryPad(),eSen_UpsellID_Full_Version_Of_Game); + } + } + } + + // 4J-PB - check for a trial version changing to a full version + if(m_bTrialVersion) + { + if(ProfileManager.IsFullVersion()) + { + m_bTrialVersion=false; + m_buttons[(int)eControl_UnlockOrDLC].init(app.GetString(IDS_DOWNLOADABLECONTENT),eControl_UnlockOrDLC); + } + } +#endif + +#if defined _XBOX_ONE + if(m_bWaitingForDLCInfo) + { + if(app.GetTMSDLCInfoRead()) + { + m_bWaitingForDLCInfo=false; + ProfileManager.SetLockedProfile(m_iPad); + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_DLCMainMenu); + } + } + + if(g_NetworkManager.ShouldMessageForFullSession()) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox( IDS_CONNECTION_FAILED, IDS_IN_PARTY_SESSION_FULL, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + } +#endif + +#ifdef __ORBIS__ + + // process the error dialog (for a patch being available) + // SQRNetworkManager_Orbis::tickErrorDialog also runs the error dialog, so wrap this so this doesn't terminate a signin dialog + if(m_bErrorDialogRunning) + { + SceErrorDialogStatus stat = sceErrorDialogUpdateStatus(); + if( stat == SCE_ERROR_DIALOG_STATUS_FINISHED ) + { + sceErrorDialogTerminate(); + // if m_bRunGameChosen is true, we're here after selecting play game, and we should let the user continue with an offline game + if(m_bRunGameChosen) + { + m_bRunGameChosen=false; + m_eAction = eAction_RunGame; + + // give the option of continuing offline + UINT uiIDA[1]; + uiIDA[0]=IDS_PRO_NOTONLINE_DECLINE; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION_PATCH_AVAILABLE, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::PlayOfflineReturned, this, app.GetStringTable()); + + } + m_bErrorDialogRunning=false; + } + } + + if(m_bLoadTrialOnNetworkManagerReady && g_NetworkManager.IsReadyToPlayOrIdle()) + { + m_bLoadTrialOnNetworkManagerReady = false; + LoadTrial(); + } + +#endif +} + +void UIScene_MainMenu::RunAchievements(int iPad) +{ +#if TO_BE_IMPLEMENTED + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + + // guests can't look at achievements + if(ProfileManager.IsGuest(iPad)) + { + ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + } + else + { + XShowAchievementsUI( iPad ); + } +#endif +} + +void UIScene_MainMenu::RunHelpAndOptions(int iPad) +{ + if(ProfileManager.IsGuest(iPad)) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + } + else + { + // If the player was signed in before selecting play, we'll not have read the profile yet, so query the sign-in status to get this to happen + ProfileManager.QuerySigninStatus(); + +#if TO_BE_IMPLEMENTED + // 4J-PB - You can be offline and still can go into help and options + if(app.GetTMSDLCInfoRead() || !ProfileManager.IsSignedInLive(iPad)) +#endif + { + ProfileManager.SetLockedProfile(iPad); +#ifdef _XBOX_ONE + ui.ShowPlayerDisplayname(true); +#endif + ui.NavigateToScene(iPad,eUIScene_HelpAndOptionsMenu); + } +#if TO_BE_IMPLEMENTED + else + { + // Changing to async TMS calls + app.SetTMSAction(iPad,eTMSAction_TMSPP_RetrieveFiles_HelpAndOptions); + + // block all input + m_bIgnorePress=true; + // We want to hide everything in this scene and display a timer until we get a completion for the TMS files + for(int i=0;iseed = 0; + param->saveData = NULL; + param->settings = app.GetGameHostOption( eGameHostOption_Tutorial ) | app.GetGameHostOption(eGameHostOption_DisableSaving); + + vector *generators = app.getLevelGenerators(); + param->levelGen = generators->at(0); + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc; + loadingParams->lpParam = (LPVOID)param; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; + completionData->iPad = ProfileManager.GetPrimaryPad(); + loadingParams->completionData = completionData; + + ui.ShowTrialTimer(true); + +#ifdef _XBOX_ONE + ui.ShowPlayerDisplayname(true); +#endif + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); +} + +void UIScene_MainMenu::handleUnlockFullVersion() +{ + m_buttons[(int)eControl_UnlockOrDLC].setLabel(app.GetString(IDS_DOWNLOADABLECONTENT),true); +} + + +#ifdef __PSVITA__ +int UIScene_MainMenu::SelectNetworkModeReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + app.DebugPrintf("Setting network mode to PSN\n"); + app.SetGameSettings(0, eGameSetting_PSVita_NetworkModeAdhoc, 0); + } + else if(result==C4JStorage::EMessage_ResultDecline) + { + app.DebugPrintf("Setting network mode to Adhoc\n"); + app.SetGameSettings(0, eGameSetting_PSVita_NetworkModeAdhoc, 1); + } + pClass->updateTooltips(); + return 0; +} +#endif //__PSVITA__ diff --git a/Minecraft.Client/Common/UI/UIScene_MainMenu.h b/Minecraft.Client/Common/UI/UIScene_MainMenu.h new file mode 100644 index 00000000..f1b358da --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_MainMenu.h @@ -0,0 +1,175 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_MainMenu : public UIScene +{ +private: + enum EControls + { + eControl_PlayGame, + eControl_Leaderboards, + eControl_Achievements, + eControl_HelpAndOptions, + eControl_UnlockOrDLC, +#ifndef _DURANGO + eControl_Exit, +#else + eControl_XboxHelp, +#endif + eControl_Count, + }; + +// #ifdef __ORBIS__ +// enum EPatchCheck +// { +// ePatchCheck_Idle, +// ePatchCheck_Init, +// ePatchCheck_Running, +// }; +// #endif + + UIControl_Button m_buttons[eControl_Count]; + UIControl m_controlTimer; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttons[(int)eControl_PlayGame], "Button1") + UI_MAP_ELEMENT( m_buttons[(int)eControl_Leaderboards], "Button2") + UI_MAP_ELEMENT( m_buttons[(int)eControl_Achievements], "Button3") + UI_MAP_ELEMENT( m_buttons[(int)eControl_HelpAndOptions], "Button4") + UI_MAP_ELEMENT( m_buttons[(int)eControl_UnlockOrDLC], "Button5") +#ifndef _DURANGO + UI_MAP_ELEMENT( m_buttons[(int)eControl_Exit], "Button6") +#else + UI_MAP_ELEMENT( m_buttons[(int)eControl_XboxHelp], "Button6") +#endif + UI_MAP_ELEMENT( m_controlTimer, "Timer") + UI_END_MAP_ELEMENTS_AND_NAMES() + + static Random *random; + bool m_bIgnorePress; + bool m_bTrialVersion; + bool m_bLoadTrialOnNetworkManagerReady; +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + bool m_bLaunchFullVersionPurchase; +#endif + +#ifdef _XBOX_ONE + bool m_bWaitingForDLCInfo; +#endif + + float m_fScreenWidth,m_fScreenHeight; + float m_fRawWidth,m_fRawHeight; + vector m_splashes; + wstring m_splash; + enum eSplashIndexes + { + eSplashHappyBirthdayEx = 0, + eSplashHappyBirthdayNotch, + eSplashMerryXmas, + eSplashHappyNewYear, + + // The start index in the splashes vector from which we can select a random splash + eSplashRandomStart, + }; + + enum eActions + { + eAction_None=0, + eAction_RunGame, + eAction_RunLeaderboards, + eAction_RunAchievements, + eAction_RunHelpAndOptions, + eAction_RunUnlockOrDLC, +#if defined(__PS3__)|| defined(__PSVITA__) || defined(__ORBIS__) + eAction_RunLeaderboardsPSN, + eAction_RunGamePSN, + eAction_RunUnlockOrDLCPSN, +#elif defined _DURANGO + eAction_RunXboxHelp, +#endif + + }; + eActions m_eAction; +public: + UIScene_MainMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_MainMenu(); + + // Returns true if this scene has focus for the pad passed in +#ifndef __PS3__ + virtual bool hasFocus(int iPad) { return bHasFocus; } +#endif + + virtual void updateTooltips(); + virtual void updateComponents(); + + virtual EUIScene getSceneType() { return eUIScene_MainMenu;} + + virtual void customDraw(IggyCustomDrawCallbackRegion *region); +protected: + void customDrawSplash(IggyCustomDrawCallbackRegion *region); + + + virtual wstring getMoviePath(); + +public: + virtual void tick(); + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + virtual void handleUnlockFullVersion(); + +protected: + void handlePress(F64 controlId, F64 childId); + + void handleGainFocus(bool navBack); + + virtual long long getDefaultGtcButtons() { return 0; } + +private: + void RunPlayGame(int iPad); + void RunLeaderboards(int iPad); + void RunUnlockOrDLC(int iPad); + void RunAchievements(int iPad); + void RunHelpAndOptions(int iPad); + + void RunAction(int iPad); + + static void LoadTrial(); + +#ifdef _XBOX_ONE + static int ChooseUser_SignInReturned(void *pParam,bool bContinue, int iPad); +#endif + static int CreateLoad_SignInReturned(void *pParam,bool bContinue, int iPad); + static int HelpAndOptions_SignInReturned(void *pParam,bool bContinue,int iPad); + static int Achievements_SignInReturned(void *pParam,bool bContinue,int iPad); + static int MustSignInReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + +#if defined(__PS3__) || defined(__PSVITA__) || defined(__ORBIS__) + static int MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EMessageResult result); +#endif + static int Leaderboards_SignInReturned(void* pParam, bool bContinue, int iPad); + static int UnlockFullGame_SignInReturned(void *pParam,bool bContinue,int iPad); + static int ExitGameReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + +#ifdef __ORBIS__ + static void RefreshChatAndContentRestrictionsReturned_PlayGame(void *pParam); + static void RefreshChatAndContentRestrictionsReturned_Leaderboards(void *pParam); + + static int PlayOfflineReturned(void *pParam, int iPad, C4JStorage::EMessageResult result); +#endif + +#ifdef _DURANGO + static int XboxHelp_SignInReturned(void *pParam, bool bContinue, int iPad); +#endif + +#ifdef __PSVITA__ + static int SelectNetworkModeReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); +#endif + +#ifdef __ORBIS__ + //EPatchCheck m_ePatchCheckState; + bool m_bRunGameChosen; + int32_t m_errorCode; + bool m_bErrorDialogRunning; +#endif +}; diff --git a/Minecraft.Client/Common/UI/UIScene_MessageBox.cpp b/Minecraft.Client/Common/UI/UIScene_MessageBox.cpp new file mode 100644 index 00000000..6b8dc552 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_MessageBox.cpp @@ -0,0 +1,161 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_MessageBox.h" + +UIScene_MessageBox::UIScene_MessageBox(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + MessageBoxInfo *param = (MessageBoxInfo *)initData; + + m_buttonCount = param->uiOptionC; + + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = param->uiOptionC; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = param->dwFocusButton; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcInit , 2 , value ); + + int buttonIndex = 0; + if(param->uiOptionC > 3) + { + m_buttonButtons[eControl_Button0].init(app.GetString(param->uiOptionA[buttonIndex]),buttonIndex); + ++buttonIndex; + } + if(param->uiOptionC > 2) + { + m_buttonButtons[eControl_Button1].init(app.GetString(param->uiOptionA[buttonIndex]),buttonIndex); + ++buttonIndex; + } + if(param->uiOptionC > 1) + { + m_buttonButtons[eControl_Button2].init(app.GetString(param->uiOptionA[buttonIndex]),buttonIndex); + ++buttonIndex; + } + m_buttonButtons[eControl_Button3].init(app.GetString(param->uiOptionA[buttonIndex]),buttonIndex); + + m_labelTitle.init(app.GetString(param->uiTitle)); + m_labelContent.init(app.GetString(param->uiText)); + + out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcAutoResize , 0 , NULL ); + + m_Func = param->Func; + m_lpParam = param->lpParam; + + parentLayer->addComponent(iPad,eUIComponent_MenuBackground); + + // 4J-TomK - rebuild touch after auto resize +#ifdef __PSVITA__ + ui.TouchBoxRebuild(this); +#endif +} + +UIScene_MessageBox::~UIScene_MessageBox() +{ + m_parentLayer->removeComponent(eUIComponent_MenuBackground); +} + +wstring UIScene_MessageBox::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1 && !m_parentLayer->IsFullscreenGroup()) + { + return L"MessageBoxSplit"; + } + else + { + return L"MessageBox"; + } +} + +void UIScene_MessageBox::updateTooltips() +{ + ui.SetTooltips( m_parentLayer->IsFullscreenGroup()?XUSER_INDEX_ANY:m_iPad, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_CANCEL); +} + +void UIScene_MessageBox::handleReload() +{ + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = m_buttonCount; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = (F64)getControlFocus(); + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcInit , 2 , value ); + + out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcAutoResize , 0 , NULL ); +} + +void UIScene_MessageBox::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + navigateBack(); + if(m_Func) m_Func(m_lpParam, iPad, C4JStorage::EMessage_Cancelled); + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } + handled = true; +} + +void UIScene_MessageBox::handlePress(F64 controlId, F64 childId) +{ + C4JStorage::EMessageResult result = C4JStorage::EMessage_Cancelled; + switch((int)controlId) + { + case 0: + result = C4JStorage::EMessage_ResultAccept; + break; + case 1: + result = C4JStorage::EMessage_ResultDecline; + break; + case 2: + result = C4JStorage::EMessage_ResultThirdOption; + break; + case 3: + result = C4JStorage::EMessage_ResultFourthOption; + break; + } + + navigateBack(); + if(m_Func) m_Func(m_lpParam, m_iPad, result); +} + +bool UIScene_MessageBox::hasFocus(int iPad) +{ + // 4J-JEV: Fix for PS4 #5204 - [TRC][R4033] The application can be locked up by second user logging out of the system. + if (m_iPad == 255) + { + // Message box is for everyone + return bHasFocus; + } + else if (ProfileManager.IsSignedIn(m_iPad)) + { + // Owner is still present + return bHasFocus && (iPad == m_iPad); + } + else + { + // Original owner has left so let everyone interact + return bHasFocus; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_MessageBox.h b/Minecraft.Client/Common/UI/UIScene_MessageBox.h new file mode 100644 index 00000000..3c349dea --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_MessageBox.h @@ -0,0 +1,59 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_MessageBox : public UIScene +{ +private: + enum EControls + { + eControl_Button0, + eControl_Button1, + eControl_Button2, + eControl_Button3, + + eControl_COUNT + }; + + int( *m_Func)(LPVOID,int,const C4JStorage::EMessageResult); + LPVOID m_lpParam; + int m_buttonCount; + + UIControl_Button m_buttonButtons[eControl_COUNT]; + UIControl_Label m_labelTitle, m_labelContent; + IggyName m_funcInit, m_funcAutoResize; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttonButtons[eControl_Button0], "Button0") + UI_MAP_ELEMENT( m_buttonButtons[eControl_Button1], "Button1") + UI_MAP_ELEMENT( m_buttonButtons[eControl_Button2], "Button2") + UI_MAP_ELEMENT( m_buttonButtons[eControl_Button3], "Button3") + + UI_MAP_ELEMENT( m_labelTitle, "Title") + UI_MAP_ELEMENT( m_labelContent, "Content") + + UI_MAP_NAME( m_funcInit, L"Init") + UI_MAP_NAME( m_funcAutoResize, L"AutoResize") + UI_END_MAP_ELEMENTS_AND_NAMES() +public: + UIScene_MessageBox(int iPad, void *initData, UILayer *parentLayer); + ~UIScene_MessageBox(); + + virtual EUIScene getSceneType() { return eUIScene_MessageBox;} + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return false; } + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + + virtual void updateTooltips(); + +public: + virtual void handleReload(); + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + virtual bool hasFocus(int iPad); + +protected: + void handlePress(F64 controlId, F64 childId); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_PauseMenu.cpp b/Minecraft.Client/Common/UI/UIScene_PauseMenu.cpp new file mode 100644 index 00000000..d9569cc9 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_PauseMenu.cpp @@ -0,0 +1,1483 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_PauseMenu.h" +#include "..\..\MinecraftServer.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\TexturePack.h" +#include "..\..\DLCTexturePack.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#ifdef __ORBIS__ +#include +#endif + +#ifdef _DURANGO +#include "..\..\Durango\Leaderboards\DurangoStatsDebugger.h" +#endif + +#ifdef __PSVITA__ +#include "PSVita\Network\SonyCommerce_Vita.h" +#endif + +#if defined __PS3__ || defined __ORBIS__ +#define USE_SONY_REMOTE_STORAGE +#endif + +UIScene_PauseMenu::UIScene_PauseMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + m_bIgnoreInput=false; + m_eAction=eAction_None; + + m_buttons[BUTTON_PAUSE_RESUMEGAME].init(app.GetString(IDS_RESUME_GAME),BUTTON_PAUSE_RESUMEGAME); + m_buttons[BUTTON_PAUSE_HELPANDOPTIONS].init(app.GetString(IDS_HELP_AND_OPTIONS),BUTTON_PAUSE_HELPANDOPTIONS); + m_buttons[BUTTON_PAUSE_LEADERBOARDS].init(app.GetString(IDS_LEADERBOARDS),BUTTON_PAUSE_LEADERBOARDS); +#ifdef _DURANGO + m_buttons[BUTTON_PAUSE_XBOXHELP].init(app.GetString(IDS_XBOX_HELP_APP), BUTTON_PAUSE_XBOXHELP); +#else + m_buttons[BUTTON_PAUSE_ACHIEVEMENTS].init(app.GetString(IDS_ACHIEVEMENTS),BUTTON_PAUSE_ACHIEVEMENTS); +#endif +#if defined(_XBOX_ONE) || defined(__ORBIS__) + m_bTrialTexturePack = false; + if(!Minecraft::GetInstance()->skins->isUsingDefaultSkin()) + { + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + m_pDLCPack=pDLCTexPack->getDLCInfoParentPack();//tPack->getDLCPack(); + + if(!m_pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) + { + m_bTrialTexturePack = true; + } + } + + // 4J-TomK - check for all possible labels being fed into BUTTON_PAUSE_SAVEGAME (Bug 163775) + // this has to be done before button initialisation! + wchar_t saveButtonLabels[2][256]; + swprintf( saveButtonLabels[0], 256, L"%ls", app.GetString( IDS_SAVE_GAME )); + swprintf( saveButtonLabels[1], 256, L"%ls", app.GetString( IDS_DISABLE_AUTOSAVE )); + m_buttons[BUTTON_PAUSE_SAVEGAME].setAllPossibleLabels(2,saveButtonLabels); + + if(app.GetGameHostOption(eGameHostOption_DisableSaving) || m_bTrialTexturePack) + { + m_savesDisabled = true; + m_buttons[BUTTON_PAUSE_SAVEGAME].init(app.GetString(IDS_SAVE_GAME),BUTTON_PAUSE_SAVEGAME); + } + else + { + m_savesDisabled = false; + m_buttons[BUTTON_PAUSE_SAVEGAME].init(app.GetString(IDS_DISABLE_AUTOSAVE),BUTTON_PAUSE_SAVEGAME); + } +#else + m_buttons[BUTTON_PAUSE_SAVEGAME].init(app.GetString(IDS_SAVE_GAME),BUTTON_PAUSE_SAVEGAME); +#endif + m_buttons[BUTTON_PAUSE_EXITGAME].init(app.GetString(IDS_EXIT_GAME),BUTTON_PAUSE_EXITGAME); + + if(!ProfileManager.IsFullVersion()) + { + // hide the trial timer + ui.ShowTrialTimer(false); + } + + updateControlsVisibility(); + + doHorizontalResizeCheck(); + + // get rid of the quadrant display if it's on + ui.HidePressStart(); + +#if TO_BE_IMPLEMENTED + XuiSetTimer(m_hObj,IGNORE_KEYPRESS_TIMERID,IGNORE_KEYPRESS_TIME); +#endif + + if( g_NetworkManager.IsLocalGame() && g_NetworkManager.GetPlayerCount() == 1 ) + { + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)TRUE); + } + + TelemetryManager->RecordMenuShown(m_iPad, eUIScene_PauseMenu, 0); + TelemetryManager->RecordPauseOrInactive(m_iPad); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft != NULL && pMinecraft->localgameModes[iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[iPad]; + + // This just allows it to be shown + gameMode->getTutorial()->showTutorialPopup(false); + } + m_bErrorDialogRunning = false; +} + +UIScene_PauseMenu::~UIScene_PauseMenu() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft != NULL && pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + + // This just allows it to be shown + gameMode->getTutorial()->showTutorialPopup(true); + } + + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,false); + m_parentLayer->showComponent(m_iPad,eUIComponent_MenuBackground,false); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); +} + +wstring UIScene_PauseMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"PauseMenuSplit"; + } + else + { + return L"PauseMenu"; + } +} + +void UIScene_PauseMenu::tick() +{ + UIScene::tick(); + +#ifdef __PSVITA__ + // 4J-MGH - Need to check for installed DLC here, as we delay the installation of the key file on Vita + if(!app.DLCInstallProcessCompleted()) app.StartInstallDLCProcess(0); +#endif + + +#if defined _XBOX_ONE || defined __ORBIS__ + if(!m_bTrialTexturePack && m_savesDisabled != (app.GetGameHostOption(eGameHostOption_DisableSaving) != 0) && ProfileManager.GetPrimaryPad() == m_iPad ) + { + // We show the save button if saves are disabled as this lets us show a prompt to enable them (via purchasing a texture pack) + if( app.GetGameHostOption(eGameHostOption_DisableSaving) ) + { + m_savesDisabled = true; + m_buttons[BUTTON_PAUSE_SAVEGAME].setLabel( app.GetString(IDS_SAVE_GAME) ); + } + else + { + m_savesDisabled = false; + m_buttons[BUTTON_PAUSE_SAVEGAME].setLabel( app.GetString(IDS_DISABLE_AUTOSAVE) ); + } + } +#endif + +#ifdef __ORBIS__ + // Process the error dialog (for a patch being available) + if(m_bErrorDialogRunning) + { + SceErrorDialogStatus stat = sceErrorDialogUpdateStatus(); + if( stat == SCE_ERROR_DIALOG_STATUS_FINISHED ) + { + sceErrorDialogTerminate(); + m_bErrorDialogRunning=false; + } + } +#endif +} + +void UIScene_PauseMenu::updateTooltips() +{ + bool bUserisClientSide = ProfileManager.IsSignedInLive(m_iPad); + bool bIsisPrimaryHost=g_NetworkManager.IsHost() && (ProfileManager.GetPrimaryPad()==m_iPad); + +#ifdef _XBOX_ONE + bool bDisplayBanTip = !g_NetworkManager.IsLocalGame() && !bIsisPrimaryHost && !ProfileManager.IsGuest(m_iPad); +#endif + + int iY = -1; +#if defined __PS3__ || defined __ORBIS__ + if(m_iPad == ProfileManager.GetPrimaryPad() ) iY = IDS_TOOLTIPS_GAME_INVITES; +#endif + int iRB = -1; + int iX = -1; + + if(ProfileManager.IsFullVersion()) + { + if(StorageManager.GetSaveDisabled()) + { + iX = bIsisPrimaryHost?IDS_TOOLTIPS_SELECTDEVICE:-1; +#ifdef _XBOX_ONE + iRB = bDisplayBanTip?IDS_TOOLTIPS_BANLEVEL:-1; +#endif + if( CSocialManager::Instance()->IsTitleAllowedToPostImages() && CSocialManager::Instance()->AreAllUsersAllowedToPostImages() && bUserisClientSide ) + { +#ifndef __PS3__ + iY = IDS_TOOLTIPS_SHARE; +#endif + } + } + else + { + iX = bIsisPrimaryHost?IDS_TOOLTIPS_CHANGEDEVICE:-1; +#ifdef _XBOX_ONE + iRB = bDisplayBanTip?IDS_TOOLTIPS_BANLEVEL:-1; +#endif + if( CSocialManager::Instance()->IsTitleAllowedToPostImages() && CSocialManager::Instance()->AreAllUsersAllowedToPostImages() && bUserisClientSide) + { +#ifndef __PS3__ + iY = IDS_TOOLTIPS_SHARE; +#endif + } + } + } + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,iX,iY, -1,-1,-1,iRB); +} + +void UIScene_PauseMenu::updateComponents() +{ + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,false); + m_parentLayer->showComponent(m_iPad,eUIComponent_MenuBackground,true); + + if( app.GetLocalPlayerCount() == 1 ) m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + else m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); +} + +void UIScene_PauseMenu::handlePreReload() +{ +#if defined _XBOX_ONE || defined __ORBIS__ + if(ProfileManager.GetPrimaryPad() == m_iPad) + { + // 4J-TomK - check for all possible labels being fed into BUTTON_PAUSE_SAVEGAME (Bug 163775) + // this has to be done before button initialisation! + wchar_t saveButtonLabels[2][256]; + swprintf( saveButtonLabels[0], 256, L"%ls", app.GetString( IDS_SAVE_GAME )); + swprintf( saveButtonLabels[1], 256, L"%ls", app.GetString( IDS_DISABLE_AUTOSAVE )); + m_buttons[BUTTON_PAUSE_SAVEGAME].setAllPossibleLabels(2,saveButtonLabels); + } +#endif +} + +void UIScene_PauseMenu::handleReload() +{ + updateTooltips(); + updateControlsVisibility(); + +#if defined _XBOX_ONE || defined __ORBIS__ + if(ProfileManager.GetPrimaryPad() == m_iPad) + { + // We show the save button if saves are disabled as this lets us show a prompt to enable them (via purchasing a texture pack) + if( app.GetGameHostOption(eGameHostOption_DisableSaving) || m_bTrialTexturePack ) + { + m_savesDisabled = true; + m_buttons[BUTTON_PAUSE_SAVEGAME].setLabel( app.GetString(IDS_SAVE_GAME) ); + } + else + { + m_savesDisabled = false; + m_buttons[BUTTON_PAUSE_SAVEGAME].setLabel( app.GetString(IDS_DISABLE_AUTOSAVE) ); + } + } +#endif + + doHorizontalResizeCheck(); +} + +void UIScene_PauseMenu::updateControlsVisibility() +{ + // are we the primary player? + // 4J-PB - fix for 7844 & 7845 - + // TCR # 128: XLA Pause Menu: When in a multiplayer game as a client the Pause Menu does not have a Leaderboards option. + // TCR # 128: XLA Pause Menu: When in a multiplayer game as a client the Pause Menu does not have an Achievements option. + if(ProfileManager.GetPrimaryPad()==m_iPad) // && g_NetworkManager.IsHost()) + { + // are we in splitscreen? + // how many local players do we have? + if( app.GetLocalPlayerCount()>1 ) + { + // Hide the BUTTON_PAUSE_LEADERBOARDS and BUTTON_PAUSE_ACHIEVEMENTS + removeControl( &m_buttons[BUTTON_PAUSE_LEADERBOARDS], false ); +#ifndef _XBOX_ONE + removeControl( &m_buttons[BUTTON_PAUSE_ACHIEVEMENTS], false ); +#endif + } +#ifdef __PSVITA__ + // MGH added - remove leaderboards in adhoc + if(CGameNetworkManager::usingAdhocMode()) + { + removeControl( &m_buttons[BUTTON_PAUSE_LEADERBOARDS], false ); + } +#endif + + if( !g_NetworkManager.IsHost() ) + { + // Hide the BUTTON_PAUSE_SAVEGAME + removeControl( &m_buttons[BUTTON_PAUSE_SAVEGAME], false ); + } + } + else + { + // Hide the BUTTON_PAUSE_LEADERBOARDS, BUTTON_PAUSE_ACHIEVEMENTS and BUTTON_PAUSE_SAVEGAME + removeControl( &m_buttons[BUTTON_PAUSE_LEADERBOARDS], false ); +#ifndef _XBOX_ONE + removeControl( &m_buttons[BUTTON_PAUSE_ACHIEVEMENTS], false ); +#endif + removeControl( &m_buttons[BUTTON_PAUSE_SAVEGAME], false ); + } + + // is saving disabled? + if(StorageManager.GetSaveDisabled()) + { +#ifdef _XBOX + // disable save button + m_buttons[BUTTON_PAUSE_SAVEGAME].setEnable(false); +#endif + } + +#if defined(__PS3__) || defined (__PSVITA__) || defined(__ORBIS__) + // We don't have a way to display trophies/achievements, so remove the button, and we're allowed to not have it on Xbox One + removeControl( &m_buttons[BUTTON_PAUSE_ACHIEVEMENTS], false ); +#endif + +} + +void UIScene_PauseMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if(m_bIgnoreInput) + { + return; + } + + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + +#ifdef _XBOX_ONE + bool bIsisPrimaryHost=g_NetworkManager.IsHost() && (ProfileManager.GetPrimaryPad()==iPad); + bool bDisplayBanTip = !g_NetworkManager.IsLocalGame() && !bIsisPrimaryHost && !ProfileManager.IsGuest(iPad); +#endif + + switch(key) + { +#ifdef _DURANGO + case ACTION_MENU_GTC_RESUME: +#endif +#if defined(__PS3__) // not for Orbis - we want to use the pause menu (touchpad press) to select a menu item + case ACTION_MENU_PAUSEMENU: +#endif + case ACTION_MENU_CANCEL: + if(pressed) + { +#ifdef _DURANGO + //DurangoStatsDebugger::PrintStats(iPad); +#endif + + if( iPad == ProfileManager.GetPrimaryPad() && g_NetworkManager.IsLocalGame() ) + { + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)FALSE); + } + + ui.PlayUISFX(eSFX_Back); + navigateBack(); + if(!ProfileManager.IsFullVersion()) + { + ui.ShowTrialTimer(true); + } + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + if(pressed) + { + sendInputToMovie(key, repeat, pressed, released); + } + break; + +#if TO_BE_IMPLEMENTED + case VK_PAD_X: + // Change device + if(bIsisPrimaryHost) + { + // we need a function to deal with the return from this - if it changes, we need to update the pause menu and tooltips + // Fix for #12531 - TCR 001: BAS Game Stability: When a player selects to change a storage + // device, and repeatedly backs out of the SD screen, disconnects from LIVE, and then selects a SD, the title crashes. + m_bIgnoreInput=true; + + StorageManager.SetSaveDevice(&UIScene_PauseMenu::DeviceSelectReturned,this,true); + } + rfHandled = TRUE; + break; +#endif + + case ACTION_MENU_Y: + { + +#if defined(__PS3__) || defined(__ORBIS__) + if(pressed && iPad == ProfileManager.GetPrimaryPad()) + { +#ifdef __ORBIS__ + // If a patch is available, can't view invites + if (CheckForPatch()) break; +#endif + + // Are we offline? + if(!ProfileManager.IsSignedInLive(iPad)) + { + m_eAction=eAction_ViewInvitesPSN; +#ifdef __ORBIS__ + int npAvailability = ProfileManager.getNPAvailability(iPad); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive is the npAvailability isn't SCE_OK + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + } + else + // Determine why they're not "signed in live" + if (ProfileManager.isSignedInPSN(iPad)) + { + // Signed in to PSN but not connected (no internet access) + assert(!ProfileManager.isConnectedToPSN(iPad)); + + UINT uiIDA[1]; + uiIDA[0] = IDS_OK; + ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + } + else + { + // Not signed in to PSN + UINT uiIDA[1]; + uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; + ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, iPad, &UIScene_PauseMenu::MustSignInReturnedPSN, this, app.GetStringTable(), NULL, 0, false); + } +#else // __PS3__ + // get them to sign in to online + UINT uiIDA[1]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, iPad, &UIScene_PauseMenu::MustSignInReturnedPSN, this, app.GetStringTable(), NULL, 0, false); +#endif + } + else + { +#ifdef __ORBIS__ + SQRNetworkManager_Orbis::RecvInviteGUI(); +#else // __PS3__ + int ret = sceNpBasicRecvMessageCustom(SCE_NP_BASIC_MESSAGE_MAIN_TYPE_INVITE, SCE_NP_BASIC_RECV_MESSAGE_OPTIONS_INCLUDE_BOOTABLE, SYS_MEMORY_CONTAINER_ID_INVALID); + app.DebugPrintf("sceNpBasicRecvMessageCustom return %d ( %08x )\n", ret, ret); +#endif + } + } +#else +#if TO_BE_IMPLEMENTED + if(bUserisClientSide) + { + // 4J Stu - Added check in 1.8.2 bug fix (TU6) to stop repeat key presses + bool bCanScreenshot = true; + for(int j=0; j < XUSER_MAX_COUNT;++j) + { + if(app.GetXuiAction(j) == eAppAction_SocialPostScreenshot) + { + bCanScreenshot = false; + break; + } + } + if(bCanScreenshot) app.SetAction(pInputData->UserIndex,eAppAction_SocialPost); + } + rfHandled = TRUE; +#endif +#endif // __PS3__ + } + break; +#ifdef _XBOX_ONE + case ACTION_MENU_RIGHT_SCROLL: + if( bDisplayBanTip ) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_ACTION_BAN_LEVEL_TITLE, IDS_ACTION_BAN_LEVEL_DESCRIPTION, uiIDA, 2, iPad,&UIScene_PauseMenu::BanGameDialogReturned,this, app.GetStringTable(), NULL, 0, false); + + //rfHandled = TRUE; + } + break; +#endif + } +} + +void UIScene_PauseMenu::handlePress(F64 controlId, F64 childId) +{ + if(m_bIgnoreInput) return; + + switch((int)controlId) + { + case BUTTON_PAUSE_RESUMEGAME: + if( m_iPad == ProfileManager.GetPrimaryPad() && g_NetworkManager.IsLocalGame() ) + { + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)FALSE); + } + navigateBack(); + break; + case BUTTON_PAUSE_LEADERBOARDS: + { + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + + //4J Gordon: Being used for the leaderboards proper now + // guests can't look at leaderboards + if(ProfileManager.IsGuest(m_iPad)) + { + ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(), NULL, 0, false); + } + else if(!ProfileManager.IsSignedInLive(m_iPad)) + { +#ifdef __ORBIS__ + // If a patch is available, can't show leaderboard + if (CheckForPatch()) break; + + // Check for content restricted user + // Update error code + int errorCode = ProfileManager.getNPAvailability(m_iPad); + + // Check if PSN is unavailable because of age restriction + if (errorCode == SCE_NP_ERROR_AGE_RESTRICTION) + { + UINT uiIDA[1]; + uiIDA[0] = IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, m_iPad, NULL, NULL, app.GetStringTable()); + + break;; + } + +#endif + +#if defined __PS3__ || __PSVITA__ + // get them to sign in to online + m_eAction=eAction_ViewLeaderboardsPSN; + UINT uiIDA[1]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, ProfileManager.GetPrimaryPad(),&UIScene_PauseMenu::MustSignInReturnedPSN,this, app.GetStringTable(), NULL, 0, false); +#elif defined(__ORBIS__) + m_eAction=eAction_ViewLeaderboardsPSN; + int npAvailability = ProfileManager.getNPAvailability(m_iPad); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive is the npAvailability isn't SCE_OK + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, m_iPad, NULL, NULL, app.GetStringTable()); + } + else + // Determine why they're not "signed in live" + if (ProfileManager.isSignedInPSN(m_iPad)) + { + // Signed in to PSN but not connected (no internet access) + + // Id + assert(!ProfileManager.isConnectedToPSN(m_iPad)); + + UINT uiIDA[1]; + uiIDA[0] = IDS_OK; + ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, m_iPad, NULL, NULL, app.GetStringTable()); + } + else + { + // Not signed in to PSN + UINT uiIDA[1]; + uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; + ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, m_iPad, &UIScene_PauseMenu::MustSignInReturnedPSN, this, app.GetStringTable(), NULL, 0, false); + } +#else + UINT uiIDA[1] = { IDS_OK }; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, m_iPad); +#endif + } + else + { + bool bContentRestricted=false; +#if defined(__PS3__) || defined(__PSVITA__) + ProfileManager.GetChatAndContentRestrictions(m_iPad,true,NULL,&bContentRestricted,NULL); +#endif + if(bContentRestricted) + { +#if !(defined(_XBOX) || defined(_WIN64)) // 4J Stu - Temp to get the win build running, but so we check this for other platforms + // you can't see leaderboards + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, m_iPad,NULL,this, app.GetStringTable(), NULL, 0, false); +#endif + } + else + { + ui.NavigateToScene(m_iPad, eUIScene_LeaderboardsMenu); + } + } + } + break; +#ifdef _DURANGO + case BUTTON_PAUSE_XBOXHELP: + { + // 4J: Launch the crummy xbox help application. + WXS::User^ user = ProfileManager.GetUser(m_iPad); + Windows::Xbox::ApplicationModel::Help::Show(user); + } + break; +#elif TO_BE_IMPLEMENTED + case BUTTON_PAUSE_ACHIEVEMENTS: + + // guests can't look at achievements + if(ProfileManager.IsGuest(pNotifyPressData->UserIndex)) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(), NULL, 0, false); + } + else + { + XShowAchievementsUI( pNotifyPressData->UserIndex ); + } + break; +#endif + + case BUTTON_PAUSE_HELPANDOPTIONS: + ui.NavigateToScene(m_iPad,eUIScene_HelpAndOptionsMenu); + break; + case BUTTON_PAUSE_SAVEGAME: + PerformActionSaveGame(); + break; + case BUTTON_PAUSE_EXITGAME: + { + Minecraft *pMinecraft = Minecraft::GetInstance(); + // Check if it's the trial version + if(ProfileManager.IsFullVersion()) + { + UINT uiIDA[3]; + + // is it the primary player exiting? + if(m_iPad==ProfileManager.GetPrimaryPad()) + { + int playTime = -1; + if( pMinecraft->localplayers[m_iPad] != NULL ) + { + playTime = (int)pMinecraft->localplayers[m_iPad]->getSessionTimer(); + } + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + + if(g_NetworkManager.IsHost() && StorageManager.GetSaveDisabled()) + { + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_EXIT_GAME_SAVE; + uiIDA[2]=IDS_EXIT_GAME_NO_SAVE; + + if(g_NetworkManager.GetPlayerCount()>1) + { + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, m_iPad,&UIScene_PauseMenu::ExitGameSaveDialogReturned,this, app.GetStringTable(), NULL, 0, false); + } + else + { + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, m_iPad,&UIScene_PauseMenu::ExitGameSaveDialogReturned,this, app.GetStringTable(), NULL, 0, false); + } + } + else if(g_NetworkManager.IsHost() && g_NetworkManager.GetPlayerCount()>1) + { + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned, dynamic_cast(this), app.GetStringTable(), NULL, 0, false); + } + else + { + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned, dynamic_cast(this), app.GetStringTable(), NULL, 0, false); + } +#else + if(StorageManager.GetSaveDisabled()) + { + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_PROGRESS_LOST, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned,this, app.GetStringTable(), NULL, 0, false); + } + else + { + if( g_NetworkManager.IsHost() ) + { + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_EXIT_GAME_SAVE; + uiIDA[2]=IDS_EXIT_GAME_NO_SAVE; + + if(g_NetworkManager.GetPlayerCount()>1) + { + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, m_iPad,&UIScene_PauseMenu::ExitGameSaveDialogReturned,this, app.GetStringTable(), NULL, 0, false); + } + else + { + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, m_iPad,&UIScene_PauseMenu::ExitGameSaveDialogReturned,this, app.GetStringTable(), NULL, 0, false); + } + } + else + { + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned,this, app.GetStringTable(), NULL, 0, false); + } + } +#endif + } + else + { + int playTime = -1; + if( pMinecraft->localplayers[m_iPad] != NULL ) + { + playTime = (int)pMinecraft->localplayers[m_iPad]->getSessionTimer(); + } + + TelemetryManager->RecordLevelExit(m_iPad, eSen_LevelExitStatus_Exited); + + + // just exit the player + app.SetAction(m_iPad,eAppAction_ExitPlayer); + } + } + else + { + // is it the primary player exiting? + if(m_iPad==ProfileManager.GetPrimaryPad()) + { + int playTime = -1; + if( pMinecraft->localplayers[m_iPad] != NULL ) + { + playTime = (int)pMinecraft->localplayers[m_iPad]->getSessionTimer(); + } + + // adjust the trial time played + ui.ReduceTrialTimerValue(); + + // exit the level + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_PROGRESS_LOST, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned, dynamic_cast(this), app.GetStringTable(), NULL, 0, false); + + } + else + { + int playTime = -1; + if( pMinecraft->localplayers[m_iPad] != NULL ) + { + playTime = (int)pMinecraft->localplayers[m_iPad]->getSessionTimer(); + } + + TelemetryManager->RecordLevelExit(m_iPad, eSen_LevelExitStatus_Exited); + + // just exit the player + app.SetAction(m_iPad,eAppAction_ExitPlayer); + } + } + } + break; + } +} + +void UIScene_PauseMenu::PerformActionSaveGame() +{ + // is the player trying to save in the trial version? + if(!ProfileManager.IsFullVersion()) + { +#ifdef __ORBIS__ + // If a patch is available, can't buy full game + if (CheckForPatch()) return; +#endif + + // Unlock the full version? + if(!ProfileManager.IsSignedInLive(m_iPad)) + { +#if defined(__PS3__) + m_eAction=eAction_SaveGamePSN; + UINT uiIDA[2]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_PauseMenu::MustSignInReturnedPSN,this, app.GetStringTable(), NULL, 0, false); +#elif defined(__ORBIS__) + m_eAction=eAction_SaveGamePSN; + int npAvailability = ProfileManager.getNPAvailability(m_iPad); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive is the npAvailability isn't SCE_OK + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, m_iPad, NULL, NULL, app.GetStringTable()); + } + else + // Determine why they're not "signed in live" + if (ProfileManager.isSignedInPSN(m_iPad)) + { + // Signed in to PSN but not connected (no internet access) + assert(!ProfileManager.isConnectedToPSN(m_iPad)); + + UINT uiIDA[1]; + uiIDA[0] = IDS_OK; + ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, m_iPad, NULL, NULL, app.GetStringTable()); + } + else + { + // Not signed in to PSN + UINT uiIDA[1]; + uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; + ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, m_iPad, &UIScene_PauseMenu::MustSignInReturnedPSN, this, app.GetStringTable(), NULL, 0, false); + } +#endif + } + else + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + ui.RequestMessageBox(IDS_UNLOCK_TITLE, IDS_UNLOCK_TOSAVE_TEXT, uiIDA, 2,m_iPad,&UIScene_PauseMenu::UnlockFullSaveReturned,this,app.GetStringTable(), NULL, 0, false); + } + + return; + } + + // 4J-PB - Is the player trying to save but they are using a trial texturepack ? + if(!Minecraft::GetInstance()->skins->isUsingDefaultSkin()) + { + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + m_pDLCPack=pDLCTexPack->getDLCInfoParentPack();//tPack->getDLCPack(); + + if(!m_pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) + { + // upsell +#ifdef _XBOX + ULONGLONG ullOfferID_Full; + // get the dlc texture pack + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + app.GetDLCFullOfferIDForPackID(pDLCTexPack->getDLCParentPackId(),&ullOfferID_Full); + + // tell sentient about the upsell of the full version of the texture pack + TelemetryManager->RecordUpsellPresented(m_iPad, eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); +#endif + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + // Give the player a warning about the trial version of the texture pack +#ifdef __PSVITA__ + if(app.DLCInstallProcessCompleted() && !SonyCommerce_Vita::getDLCUpgradePending()) // MGH - devtrack #5861 On vita it can take a bit after the install has finished to register the purchase, so make sure we don't end up asking to purchase again +#endif + { + ui.RequestMessageBox(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, m_iPad,&UIScene_PauseMenu::WarningTrialTexturePackReturned,this,app.GetStringTable(), NULL, 0, false); + } + + return; + } + else + { + m_bTrialTexturePack = false; + } + } + + // does the save exist? + bool bSaveExists; + C4JStorage::ESaveGameState result=StorageManager.DoesSaveExist(&bSaveExists); + +#ifdef _XBOX + if(result == C4JStorage::ELoadGame_DeviceRemoved) + { + // this will be a tester trying to be clever + UINT uiIDA[2]; + uiIDA[0]=IDS_SELECTANEWDEVICE; + uiIDA[1]=IDS_NODEVICE_DECLINE; + + ui.RequestMessageBox(IDS_STORAGEDEVICEPROBLEM_TITLE, IDS_FAILED_TO_LOADSAVE_TEXT, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::DeviceRemovedDialogReturned,this, app.GetStringTable(), NULL, 0, false); + } + else +#endif + { +#if defined(_XBOX_ONE) || defined(__ORBIS__) + if(!m_savesDisabled) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_TITLE_DISABLE_AUTOSAVE, IDS_CONFIRM_DISABLE_AUTOSAVE, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::DisableAutosaveDialogReturned,this, app.GetStringTable(), NULL, 0, false); + } + else +#endif + // we need to ask if they are sure they want to overwrite the existing game + if(bSaveExists) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::SaveGameDialogReturned,this, app.GetStringTable(), NULL, 0, false); + } + else + { +#if defined(_XBOX_ONE) || defined(__ORBIS__) + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_TITLE_ENABLE_AUTOSAVE, IDS_CONFIRM_ENABLE_AUTOSAVE, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::EnableAutosaveDialogReturned,this, app.GetStringTable(), NULL, 0, false); +#else + // flag a app action of save game + app.SetAction(m_iPad,eAppAction_SaveGame); +#endif + } + } +} + +void UIScene_PauseMenu::ShowScene(bool show) +{ + app.DebugPrintf("UIScene_PauseMenu::ShowScene is not implemented\n"); +} + +void UIScene_PauseMenu::HandleDLCInstalled() +{ + // mounted DLC may have changed + if(app.StartInstallDLCProcess(m_iPad)==false) + { + // not doing a mount, so re-enable input + //m_bIgnoreInput=false; + app.DebugPrintf("UIScene_PauseMenu::HandleDLCInstalled - m_bIgnoreInput false\n"); + } + else + { + // 4J-PB - Somehow, on th edisc build, we get in here, but don't call HandleDLCMountingComplete, so input locks up + //m_bIgnoreInput=true; + app.DebugPrintf("UIScene_PauseMenu::HandleDLCInstalled - m_bIgnoreInput true\n"); + } + // this will send a CustomMessage_DLCMountingComplete when done +} + + +void UIScene_PauseMenu::HandleDLCMountingComplete() +{ + // check if we should display the save option + + //m_bIgnoreInput=false; + app.DebugPrintf("UIScene_PauseMenu::HandleDLCMountingComplete - m_bIgnoreInput false \n"); + + // if(ProfileManager.IsFullVersion()) + // { + // bool bIsisPrimaryHost=g_NetworkManager.IsHost() && (ProfileManager.GetPrimaryPad()==m_iPad); + // + // if(bIsisPrimaryHost) + // { + // m_buttons[BUTTON_PAUSE_SAVEGAME].setEnable(true); + // } + // } +} + +int UIScene_PauseMenu::UnlockFullSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)pParam; + Minecraft *pMinecraft=Minecraft::GetInstance(); + + if(result==C4JStorage::EMessage_ResultAccept) + { + if(ProfileManager.IsSignedInLive(pMinecraft->player->GetXboxPad())) + { + // 4J-PB - need to check this user can access the store +#if defined(__PS3__) || defined(__PSVITA__) + bool bContentRestricted; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),true,NULL,&bContentRestricted,NULL); + if(bContentRestricted) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,pClass, app.GetStringTable(), NULL, 0, false); + } + else +#endif + { + ProfileManager.DisplayFullVersionPurchase(false,pMinecraft->player->GetXboxPad(),eSen_UpsellID_Full_Version_Of_Game); + } + } + } + else + { + //SentientManager.RecordUpsellResponded(iPad, eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID, eSen_UpsellOutcome_Declined); + } + + return 0; +} + +int UIScene_PauseMenu::SaveGame_SignInReturned(void *pParam,bool bContinue, int iPad) +{ + UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)pParam; + + if(bContinue==true) + { + pClass->PerformActionSaveGame(); + } + + return 0; +} + +#ifdef _XBOX_ONE +int UIScene_PauseMenu::BanGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { + app.SetAction(iPad,eAppAction_BanLevel); + } + return 0; +} +#endif + +#if defined(__PS3__) || defined (__PSVITA__) || defined(__ORBIS__) +int UIScene_PauseMenu::MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { +#ifdef __PS3__ + switch(pClass->m_eAction) + { + case eAction_ViewLeaderboardsPSN: + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_PauseMenu::ViewLeaderboards_SignInReturned, pClass); + break; + case eAction_ViewInvitesPSN: + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_PauseMenu::ViewInvites_SignInReturned, pClass); + break; + case eAction_SaveGamePSN: + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_PauseMenu::SaveGame_SignInReturned, pClass); + break; + case eAction_BuyTexturePackPSN: + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_PauseMenu::BuyTexturePack_SignInReturned, pClass); + break; + } +#elif defined __PSVITA__ + switch(pClass->m_eAction) + { + case eAction_ViewLeaderboardsPSN: + //CD - Must force Ad-Hoc off if they want leaderboard PSN sign-in + //Save settings change + app.SetGameSettings(0, eGameSetting_PSVita_NetworkModeAdhoc, 0); + //Force off + CGameNetworkManager::setAdhocMode(false); + //Now Sign-in + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_PauseMenu::ViewLeaderboards_SignInReturned, pClass); + break; + case eAction_ViewInvitesPSN: + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_PauseMenu::ViewInvites_SignInReturned, pClass); + break; + case eAction_SaveGamePSN: + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_PauseMenu::SaveGame_SignInReturned, pClass); + break; + case eAction_BuyTexturePackPSN: + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_PauseMenu::BuyTexturePack_SignInReturned, pClass); + break; + } +#else + switch(pClass->m_eAction) + { + case eAction_ViewLeaderboardsPSN: + SQRNetworkManager_Orbis::AttemptPSNSignIn(&UIScene_PauseMenu::ViewLeaderboards_SignInReturned, pClass, false, iPad); + break; + case eAction_ViewInvitesPSN: + SQRNetworkManager_Orbis::AttemptPSNSignIn(&UIScene_PauseMenu::ViewInvites_SignInReturned, pClass, false, iPad); + break; + case eAction_SaveGamePSN: + SQRNetworkManager_Orbis::AttemptPSNSignIn(&UIScene_PauseMenu::SaveGame_SignInReturned, pClass, false, iPad); + break; + case eAction_BuyTexturePackPSN: + SQRNetworkManager_Orbis::AttemptPSNSignIn(&UIScene_PauseMenu::BuyTexturePack_SignInReturned, pClass, false, iPad); + break; + } +#endif + } + + return 0; +} + +int UIScene_PauseMenu::ViewLeaderboards_SignInReturned(void *pParam,bool bContinue, int iPad) +{ + UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)pParam; + + if(bContinue==true) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + + // guests can't look at leaderboards + if(ProfileManager.IsGuest(pClass->m_iPad)) + { + ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(), NULL, 0, false); + } + else if(ProfileManager.IsSignedInLive(iPad)) + { +#ifndef __ORBIS__ + bool bContentRestricted=false; + ProfileManager.GetChatAndContentRestrictions(pClass->m_iPad,true,NULL,&bContentRestricted,NULL); + if(bContentRestricted) + { + // you can't see leaderboards + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,pClass, app.GetStringTable(), NULL, 0, false); + } + else +#endif + { + ui.NavigateToScene(pClass->m_iPad, eUIScene_LeaderboardsMenu); + } + } + } + + return 0; +} + +int UIScene_PauseMenu::WarningTrialTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)pParam; + +#ifdef __ORBIS__ + // If a patch is available, can't proceed + if (pClass->CheckForPatch()) return 0; +#endif + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + if(result==C4JStorage::EMessage_ResultAccept) + { + if(!ProfileManager.IsSignedInLive(iPad)) + { + pClass->m_eAction=eAction_SaveGamePSN; +#ifdef __ORBIS__// Check if PSN is unavailable because of age restriction + int npAvailability = ProfileManager.getNPAvailability(iPad); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive is the npAvailability isn't SCE_OK + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + } + else + // Determine why they're not "signed in live" + if (ProfileManager.isSignedInPSN(iPad)) + { + // Signed in to PSN but not connected (no internet access) + assert(!ProfileManager.isConnectedToPSN(iPad)); + + UINT uiIDA[1]; + uiIDA[0] = IDS_OK; + ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + } + else + { + UINT uiIDA[1]; + uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; + ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, iPad, &UIScene_PauseMenu::MustSignInReturnedPSN, pClass, app.GetStringTable(), NULL, 0, false); + } +#else // __PS3__ + // You're not signed in to PSN! + UINT uiIDA[2]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 2, iPad,&UIScene_PauseMenu::MustSignInReturnedPSN,pClass, app.GetStringTable(), NULL, 0, false); +#endif + } + else + { +#ifndef __ORBIS__ + // 4J-PB - need to check this user can access the store + bool bContentRestricted=false; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),true,NULL,&bContentRestricted,NULL); + if(bContentRestricted) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad,NULL,pClass, app.GetStringTable(), NULL, 0, false); + } + else +#endif + { + // need to get info on the pack to see if the user has already downloaded it + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + // retrieve the store name for the skin pack + DLCPack *pDLCPack=pDLCTexPack->getDLCInfoParentPack();//tPack->getDLCPack(); + const char *pchPackName=wstringtofilename(pDLCPack->getName()); + app.DebugPrintf("Texture Pack - %s\n",pchPackName); + SONYDLC *pSONYDLCInfo=app.GetSONYDLCInfo((char *)pchPackName); + + if(pSONYDLCInfo!=NULL) + { + char chName[42]; + char chKeyName[20]; + char chSkuID[SCE_NP_COMMERCE2_SKU_ID_LEN]; + + memset(chSkuID,0,SCE_NP_COMMERCE2_SKU_ID_LEN); + // find the info on the skin pack + // we have to retrieve the skuid from the store info, it can't be hardcoded since Sony may change it. + // So we assume the first sku for the product is the one we want + + // MGH - keyname in the DLC file is 16 chars long, but there's no space for a NULL terminating char + memset(chKeyName, 0, sizeof(chKeyName)); + strncpy(chKeyName, pSONYDLCInfo->chDLCKeyname, 16); + +#ifdef __ORBIS__ + strcpy(chName, chKeyName); +#else + sprintf(chName,"%s-%s",app.GetCommerceCategory(),chKeyName); +#endif + app.GetDLCSkuIDFromProductList(chName,chSkuID); + + // 4J-PB - need to check for an empty store +#if defined __ORBIS__ || defined __PSVITA__ || defined __PS3__ + if(app.CheckForEmptyStore(iPad)==false) +#endif + { + if(app.DLCAlreadyPurchased(chSkuID)) + { + app.DownloadAlreadyPurchased(chSkuID); + } + else + { + app.Checkout(chSkuID); + } + } + } + } + } + } +#endif // + + return 0; +} + +int UIScene_PauseMenu::BuyTexturePack_SignInReturned(void *pParam,bool bContinue, int iPad) +{ + UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)pParam; + + if(bContinue==true) + { + // Check if we're signed in to LIVE + if(ProfileManager.IsSignedInLive(iPad)) + { +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + +#ifndef __ORBIS__ + // 4J-PB - need to check this user can access the store + bool bContentRestricted=false; + ProfileManager.GetChatAndContentRestrictions(iPad,true,NULL,&bContentRestricted,NULL); + if(bContentRestricted) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad,NULL,pClass, app.GetStringTable(), NULL, 0, false); + } + else +#endif + { + // need to get info on the pack to see if the user has already downloaded it + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + // retrieve the store name for the skin pack + DLCPack *pDLCPack=pDLCTexPack->getDLCInfoParentPack();//tPack->getDLCPack(); + const char *pchPackName=wstringtofilename(pDLCPack->getName()); + app.DebugPrintf("Texture Pack - %s\n",pchPackName); + SONYDLC *pSONYDLCInfo=app.GetSONYDLCInfo((char *)pchPackName); + + if(pSONYDLCInfo!=NULL) + { + char chName[42]; + char chKeyName[20]; + char chSkuID[SCE_NP_COMMERCE2_SKU_ID_LEN]; + + memset(chSkuID,0,SCE_NP_COMMERCE2_SKU_ID_LEN); + // find the info on the skin pack + // we have to retrieve the skuid from the store info, it can't be hardcoded since Sony may change it. + // So we assume the first sku for the product is the one we want + + // MGH - keyname in the DLC file is 16 chars long, but there's no space for a NULL terminating char + memset(chKeyName, 0, sizeof(chKeyName)); + strncpy(chKeyName, pSONYDLCInfo->chDLCKeyname, 16); + +#ifdef __ORBIS__ + strcpy(chName, chKeyName); +#else + sprintf(chName,"%s-%s",app.GetCommerceCategory(),chKeyName); +#endif + app.GetDLCSkuIDFromProductList(chName,chSkuID); + + // 4J-PB - need to check for an empty store +#if defined __ORBIS__ || defined __PSVITA__ || defined __PS3__ + if(app.CheckForEmptyStore(iPad)==false) +#endif + { + if(app.DLCAlreadyPurchased(chSkuID)) + { + app.DownloadAlreadyPurchased(chSkuID); + } + else + { + app.Checkout(chSkuID); + } + } + } + } +#else + // TO BE IMPEMENTED FOR ORBIS +#endif + } + } + return 0; +} + +int UIScene_PauseMenu::ViewInvites_SignInReturned(void *pParam,bool bContinue, int iPad) +{ + if(bContinue==true) + { + // Check if we're signed in to LIVE + if(ProfileManager.IsSignedInLive(iPad)) + { +#ifdef __ORBIS__ + SQRNetworkManager_Orbis::RecvInviteGUI(); +#elif defined __PS3__ + int ret = sceNpBasicRecvMessageCustom(SCE_NP_BASIC_MESSAGE_MAIN_TYPE_INVITE, SCE_NP_BASIC_RECV_MESSAGE_OPTIONS_INCLUDE_BOOTABLE, SYS_MEMORY_CONTAINER_ID_INVALID); + app.DebugPrintf("sceNpBasicRecvMessageCustom return %d ( %08x )\n", ret, ret); +#else // __PSVITA__ + PSVITA_STUBBED; +#endif + } + } + return 0; +} + + +int UIScene_PauseMenu::ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_PauseMenu *pClass = (UIScene_PauseMenu *)pParam; + // Exit with or without saving + // Decline means save in this dialog + if(result==C4JStorage::EMessage_ResultDecline || result==C4JStorage::EMessage_ResultThirdOption) + { + if( result==C4JStorage::EMessage_ResultDecline ) // Save + { + // 4J-PB - Is the player trying to save but they are using a trial texturepack ? + if(!Minecraft::GetInstance()->skins->isUsingDefaultSkin()) + { + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + DLCPack *pDLCPack=pDLCTexPack->getDLCInfoParentPack();//tPack->getDLCPack(); + if(!pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) + { +#ifdef _XBOX + // upsell + ULONGLONG ullOfferID_Full; + // get the dlc texture pack + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + app.GetDLCFullOfferIDForPackID(pDLCTexPack->getDLCParentPackId(),&ullOfferID_Full); + + // tell sentient about the upsell of the full version of the skin pack + TelemetryManager->RecordUpsellPresented(iPad, eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); +#endif + + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + // Give the player a warning about the trial version of the texture pack + ui.RequestMessageBox(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad() ,&UIScene_PauseMenu::WarningTrialTexturePackReturned, dynamic_cast(pClass),app.GetStringTable(), NULL, 0, false); + + return S_OK; + } + } + + // does the save exist? + bool bSaveExists; + StorageManager.DoesSaveExist(&bSaveExists); + // 4J-PB - we check if the save exists inside the libs + // we need to ask if they are sure they want to overwrite the existing game + if(bSaveExists) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&IUIScene_PauseMenu::ExitGameAndSaveReturned, dynamic_cast(pClass), app.GetStringTable(), NULL, 0, false); + return 0; + } + else + { +#if defined(_XBOX_ONE) || defined(__ORBIS__) + StorageManager.SetSaveDisabled(false); +#endif + MinecraftServer::getInstance()->setSaveOnExit( true ); + } + } + else + { + // been a few requests for a confirm on exit without saving + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_TITLE_DECLINE_SAVE_GAME, IDS_CONFIRM_DECLINE_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&IUIScene_PauseMenu::ExitGameDeclineSaveReturned, dynamic_cast(pClass), app.GetStringTable(), NULL, 0, false); + return 0; + } + + app.SetAction(iPad,eAppAction_ExitWorld); + } + return 0; +} + +#endif + +void UIScene_PauseMenu::SetIgnoreInput(bool ignoreInput) +{ + m_bIgnoreInput = ignoreInput; +} + +#ifdef _XBOX_ONE +void UIScene_PauseMenu::HandleDLCLicenseChange() +{ +} +#endif + +#ifdef __ORBIS__ +bool UIScene_PauseMenu::CheckForPatch() +{ + int npAvailability = ProfileManager.getNPAvailability(ProfileManager.GetPrimaryPad()); + + bool bPatchAvailable; + switch(npAvailability) + { + case SCE_NP_ERROR_LATEST_PATCH_PKG_EXIST: + case SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED: + bPatchAvailable=true; + break; + default: + bPatchAvailable=false; + break; + } + + if(bPatchAvailable) + { + int32_t ret = sceErrorDialogInitialize(); + if ( ret==SCE_OK ) + { + m_bErrorDialogRunning = true; + + SceErrorDialogParam param; + sceErrorDialogParamInitialize( ¶m ); + // 4J-PB - We want to display the option to get the patch now + param.errorCode = SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED;//pClass->m_errorCode; + ret = sceUserServiceGetInitialUser( ¶m.userId ); + if ( ret == SCE_OK ) + { + ret = sceErrorDialogOpen( ¶m ); + } + else + { + sceErrorDialogTerminate(); + } + } + } + + return bPatchAvailable; +} +#endif \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_PauseMenu.h b/Minecraft.Client/Common/UI/UIScene_PauseMenu.h new file mode 100644 index 00000000..f1bd53aa --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_PauseMenu.h @@ -0,0 +1,112 @@ +#pragma once + +#include "UIScene.h" +#include "IUIScene_PauseMenu.h" + +#define BUTTON_PAUSE_RESUMEGAME 0 +#define BUTTON_PAUSE_HELPANDOPTIONS 1 +#define BUTTON_PAUSE_LEADERBOARDS 2 + +#ifdef _XBOX_ONE +#define BUTTON_PAUSE_XBOXHELP 3 +#else +#define BUTTON_PAUSE_ACHIEVEMENTS 3 +#endif + +#define BUTTON_PAUSE_SAVEGAME 4 +#define BUTTON_PAUSE_EXITGAME 5 +#define BUTTONS_PAUSE_MAX BUTTON_PAUSE_EXITGAME + 1 + +class UIScene_PauseMenu : public UIScene, public IUIScene_PauseMenu +{ +private: + bool m_savesDisabled; + bool m_bTrialTexturePack; + bool m_bErrorDialogRunning; + + enum eActions + { + eAction_None=0, +#if defined(__PS3__) || defined(__PSVITA__) || defined(__ORBIS__) + eAction_ViewLeaderboardsPSN, + eAction_ViewInvitesPSN, + eAction_SaveGamePSN, + eAction_BuyTexturePackPSN +#endif + + }; + eActions m_eAction; + + UIControl_Button m_buttons[BUTTONS_PAUSE_MAX]; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttons[BUTTON_PAUSE_RESUMEGAME], "Button1") + UI_MAP_ELEMENT( m_buttons[BUTTON_PAUSE_HELPANDOPTIONS], "Button2") + UI_MAP_ELEMENT( m_buttons[BUTTON_PAUSE_LEADERBOARDS], "Button3") +#ifdef _DURANGO + UI_MAP_ELEMENT( m_buttons[BUTTON_PAUSE_XBOXHELP], "Button4") +#else + UI_MAP_ELEMENT( m_buttons[BUTTON_PAUSE_ACHIEVEMENTS], "Button4") +#endif + UI_MAP_ELEMENT( m_buttons[BUTTON_PAUSE_SAVEGAME], "Button5") + UI_MAP_ELEMENT( m_buttons[BUTTON_PAUSE_EXITGAME], "Button6") + UI_END_MAP_ELEMENTS_AND_NAMES() + + virtual void HandleDLCMountingComplete(); + virtual void HandleDLCInstalled(); +#ifdef _XBOX_ONE + virtual void HandleDLCLicenseChange(); +#endif + static int UnlockFullSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int SaveGame_SignInReturned(void *pParam,bool bContinue, int iPad); + +public: + UIScene_PauseMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_PauseMenu(); + + virtual EUIScene getSceneType() { return eUIScene_PauseMenu;} + + virtual void tick(); + + virtual void updateTooltips(); + virtual void updateComponents(); + virtual void handlePreReload(); + virtual void handleReload(); + +protected: + void updateControlsVisibility(); + + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +protected: + void handlePress(F64 controlId, F64 childId); + virtual void ShowScene(bool show); + virtual void SetIgnoreInput(bool ignoreInput); + bool m_bIgnoreInput; + +private: + void PerformActionSaveGame(); + +#if defined(__PS3__) || defined(__PSVITA__) || defined(__ORBIS__) + static int MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ViewLeaderboards_SignInReturned(void *pParam,bool bContinue, int iPad); + static int ViewInvites_SignInReturned(void *pParam,bool bContinue, int iPad); + static int BuyTexturePack_SignInReturned(void *pParam,bool bContinue, int iPad); + static int WarningTrialTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); +#endif + +protected: +#ifdef _XBOX_ONE + static int BanGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + virtual long long getDefaultGtcButtons() { return _360_GTC_BACK | _360_GTC_PLAY; } +#endif + +#ifdef __ORBIS__ + bool CheckForPatch(); +#endif +}; diff --git a/Minecraft.Client/Common/UI/UIScene_QuadrantSignin.cpp b/Minecraft.Client/Common/UI/UIScene_QuadrantSignin.cpp new file mode 100644 index 00000000..4f1b9742 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_QuadrantSignin.cpp @@ -0,0 +1,291 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_QuadrantSignin.h" +#include "..\..\Minecraft.h" +#if defined(__ORBIS__) +#include "Common\Network\Sony\SonyHttp.h" +#endif + +UIScene_QuadrantSignin::UIScene_QuadrantSignin(int iPad, void *_initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_signInInfo = *((SignInInfo *)_initData); + + m_bIgnoreInput = false; + + m_lastRequestedAvatar = -1; + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + m_iconRequested[i] = false; + + m_labelPressToJoin[i].init(app.GetString(IDS_MUST_SIGN_IN_TITLE)); + m_labelConnectController[i].init(L""); + m_labelAccountType[i].init(L""); + + //wchar_t num[2]; + //swprintf(num,2,L"%d",i+1); + //m_labelPlayerNumber[i].init(num); + + m_controllerStatus[i] = eControllerStatus_ConnectController; + + if(ProfileManager.IsSignedIn(i)) + { + app.DebugPrintf("Index %d is signed in\n", i); + + setControllerState(i, eControllerStatus_PlayerDetails); + m_labelDisplayName[i].init(ProfileManager.GetDisplayName(i)); + } + else if(InputManager.IsPadConnected(i)) + { + app.DebugPrintf("Index %d is not signed in\n", i); + + setControllerState(i, eControllerStatus_PressToJoin); + m_labelDisplayName[i].init(L""); + } + else + { + app.DebugPrintf("Index %d is not connected\n", i); + + setControllerState(i, eControllerStatus_ConnectController); + } + } + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + if(InputManager.IsCircleCrossSwapped()) + { + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = true; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetABSwap , 1 , value ); + } +#endif + + parentLayer->addComponent(iPad,eUIComponent_MenuBackground); +} + +UIScene_QuadrantSignin::~UIScene_QuadrantSignin() +{ + m_parentLayer->removeComponent(eUIComponent_MenuBackground); +} + +wstring UIScene_QuadrantSignin::getMoviePath() +{ + return L"QuadrantSignin"; +} + +void UIScene_QuadrantSignin::updateTooltips() +{ + ui.SetTooltips(m_iPad, IDS_TOOLTIPS_CONTINUE, IDS_TOOLTIPS_CANCEL); +} + +// Returns true if this scene has focus for the pad passed in +bool UIScene_QuadrantSignin::hasFocus(int iPad) +{ + // Allow input from any controller + return bHasFocus; +} + +bool UIScene_QuadrantSignin::hidesLowerScenes() +{ + // This is a Modal dialog, so don't need to hide the scene behind + return false; +} + +void UIScene_QuadrantSignin::tick() +{ + UIScene::tick(); + + updateState(); +} + +void UIScene_QuadrantSignin::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + app.DebugPrintf("UIScene_QuadrantSignin handling input for pad %d, key %d, repeat- %s, pressed- %s, released- %s\n", iPad, key, repeat?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + + if(!m_bIgnoreInput) + { + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + { + if(pressed) + { +#ifdef _DURANGO + if(InputManager.IsPadLocked(iPad)) + { + if(iPad != ProfileManager.GetPrimaryPad()) + { + ProfileManager.RemoveGamepadFromGame(iPad); + } + else +#endif + { + m_bIgnoreInput = true; + m_signInInfo.Func(m_signInInfo.lpParam,false,iPad); + ProfileManager.CancelProfileAvatarRequest(); + + navigateBack(); + } + } +#ifdef _DURANGO + } +#endif + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + if(pressed) + { + m_bIgnoreInput = true; + if(ProfileManager.IsSignedIn(iPad)) + { + app.DebugPrintf("Signed in pad pressed\n"); + ProfileManager.CancelProfileAvatarRequest(); + +#ifdef _DURANGO + // On Durango, if we don't navigate forward here, then when we are on the main menu, it (re)gains focus & that causes our users to get cleared + ui.NavigateToScene(m_iPad, eUIScene_Timer); +#endif + navigateBack(); + m_signInInfo.Func(m_signInInfo.lpParam,true,m_iPad); + } + else + { + app.DebugPrintf("Non-signed in pad pressed\n"); + ProfileManager.RequestSignInUI(false, false, false, true, true,&UIScene_QuadrantSignin::SignInReturned, this, iPad); + } + } + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + if(pressed) + { + sendInputToMovie(key, repeat, pressed, released); + } + break; + } + } + + handled = true; +} + +int UIScene_QuadrantSignin::SignInReturned(void *pParam,bool bContinue, int iPad) +{ + app.DebugPrintf("SignInReturned for pad %d\n", iPad); + + UIScene_QuadrantSignin *pClass = (UIScene_QuadrantSignin *)pParam; + +#ifdef _DURANGO + if(bContinue && pClass->m_signInInfo.requireOnline && ProfileManager.IsSignedIn(iPad)) + { + ProfileManager.CheckMultiplayerPrivileges(iPad, true, &checkAllPrivilegesCallback, pClass); + } + else +#endif + { + pClass->m_bIgnoreInput = false; + pClass->updateState(); + } + + return 0; +} + +#ifdef _DURANGO +void UIScene_QuadrantSignin::checkAllPrivilegesCallback(LPVOID lpParam, bool hasPrivileges, int iPad) +{ + UIScene_QuadrantSignin* pClass = (UIScene_QuadrantSignin*)lpParam; + + if(!hasPrivileges) + { + ProfileManager.RemoveGamepadFromGame(iPad); + } + pClass->m_bIgnoreInput = false; + pClass->updateState(); +} +#endif + +void UIScene_QuadrantSignin::updateState() +{ + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if(ProfileManager.IsSignedIn(i) && InputManager.IsPadConnected(i)) + { + //app.DebugPrintf("Index %d is signed in, display name - '%s'\n", i, ProfileManager.GetDisplayName(i).data()); + + setControllerState(i, eControllerStatus_PlayerDetails); + m_labelDisplayName[i].setLabel(ProfileManager.GetDisplayName(i)); + //m_buttonControllers[i].setLabel(app.GetString(IDS_TOOLTIPS_CONTINUE),i); + + if(!m_iconRequested[i]) + { + app.DebugPrintf(app.USER_SR, "Requesting avatar for %d\n", i); + if(ProfileManager.GetProfileAvatar(i, &UIScene_QuadrantSignin::AvatarReturned, this)) + { + m_iconRequested[i] = true; + m_lastRequestedAvatar = i; + } + } + } + else if(InputManager.IsPadConnected(i)) + { + //app.DebugPrintf("Index %d is not signed in\n", i); + + setControllerState(i, eControllerStatus_PressToJoin); + m_labelDisplayName[i].setLabel(L""); + m_iconRequested[i] = false; + } + else + { + //app.DebugPrintf("Index %d is not connected\n", i); + + setControllerState(i, eControllerStatus_ConnectController); + m_iconRequested[i] = false; + } + } +} + +void UIScene_QuadrantSignin::setControllerState(int iPad, EControllerStatus state) +{ + if(m_controllerStatus[iPad] != state) + { + m_controllerStatus[iPad] = state; + + IggyDataValue result; + IggyDataValue value[2]; + value[0].type = IGGY_DATATYPE_number; + value[0].number = iPad; + + value[1].type = IGGY_DATATYPE_number; + value[1].number = (int)state; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetControllerStatus , 2 , value ); + } +} + +int UIScene_QuadrantSignin::AvatarReturned(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes) +{ + UIScene_QuadrantSignin *pClass = (UIScene_QuadrantSignin *)lpParam; + app.DebugPrintf(app.USER_SR,"AvatarReturned callback\n"); + if(pbThumbnail != NULL) + { + // 4J-JEV - Added to ensure each new texture gets a unique name. + static unsigned int quadrantImageCount = 0; + + wchar_t iconName[32]; + swprintf(iconName,32,L"quadrantImage%05d",quadrantImageCount++); + + pClass->registerSubstitutionTexture(iconName,pbThumbnail,dwThumbnailBytes,true); + pClass->m_bitmapIcon[pClass->m_lastRequestedAvatar].setTextureName(iconName); + } + + pClass->m_lastRequestedAvatar = -1; + + return 0; +} diff --git a/Minecraft.Client/Common/UI/UIScene_QuadrantSignin.h b/Minecraft.Client/Common/UI/UIScene_QuadrantSignin.h new file mode 100644 index 00000000..b500fcc3 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_QuadrantSignin.h @@ -0,0 +1,110 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_QuadrantSignin : public UIScene +{ +private: + enum EControllerStatus + { + eControllerStatus_ConnectController, + eControllerStatus_PressToJoin, + eControllerStatus_PlayerDetails + }; + + bool m_bIgnoreInput; + SignInInfo m_signInInfo; + + EControllerStatus m_controllerStatus[4]; + bool m_iconRequested[4]; + + int m_lastRequestedAvatar; + + UIControl m_controlPanels[4]; + UIControl_Label m_labelPressToJoin[4], m_labelDisplayName[4], m_labelAccountType[4], m_labelPlayerNumber[4], m_labelConnectController[4]; + UIControl_BitmapIcon m_bitmapIcon[4]; + IggyName m_funcJoinButtonPressed, m_funcSetControllerStatus, m_funcSetABSwap; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT(m_controlPanels[0],"Controller1") + UI_BEGIN_MAP_CHILD_ELEMENTS(m_controlPanels[0]) + UI_MAP_ELEMENT(m_labelPressToJoin[0], "PressLabel") + + UI_MAP_ELEMENT(m_labelDisplayName[0], "GamerTag") + UI_MAP_ELEMENT(m_labelAccountType[0], "AccountType") + UI_MAP_ELEMENT(m_labelPlayerNumber[0], "PlayerNumber") + UI_MAP_ELEMENT(m_bitmapIcon[0], "PlayerPic") + + UI_MAP_ELEMENT(m_labelConnectController[0], "ConnectControllerLabel") + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_ELEMENT(m_controlPanels[1],"Controller2") + UI_BEGIN_MAP_CHILD_ELEMENTS(m_controlPanels[1]) + UI_MAP_ELEMENT(m_labelPressToJoin[1], "PressLabel") + + UI_MAP_ELEMENT(m_labelDisplayName[1], "GamerTag") + UI_MAP_ELEMENT(m_labelAccountType[1], "AccountType") + UI_MAP_ELEMENT(m_labelPlayerNumber[1], "PlayerNumber") + UI_MAP_ELEMENT(m_bitmapIcon[1], "PlayerPic") + + UI_MAP_ELEMENT(m_labelConnectController[1], "ConnectControllerLabel") + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_ELEMENT(m_controlPanels[2],"Controller3") + UI_BEGIN_MAP_CHILD_ELEMENTS(m_controlPanels[2]) + UI_MAP_ELEMENT(m_labelPressToJoin[2], "PressLabel") + + UI_MAP_ELEMENT(m_labelDisplayName[2], "GamerTag") + UI_MAP_ELEMENT(m_labelAccountType[2], "AccountType") + UI_MAP_ELEMENT(m_labelPlayerNumber[2], "PlayerNumber") + UI_MAP_ELEMENT(m_bitmapIcon[2], "PlayerPic") + + UI_MAP_ELEMENT(m_labelConnectController[2], "ConnectControllerLabel") + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_ELEMENT(m_controlPanels[3],"Controller4") + UI_BEGIN_MAP_CHILD_ELEMENTS(m_controlPanels[3]) + UI_MAP_ELEMENT(m_labelPressToJoin[3], "PressLabel") + + UI_MAP_ELEMENT(m_labelDisplayName[3], "GamerTag") + UI_MAP_ELEMENT(m_labelAccountType[3], "AccountType") + UI_MAP_ELEMENT(m_labelPlayerNumber[3], "PlayerNumber") + UI_MAP_ELEMENT(m_bitmapIcon[3], "PlayerPic") + + UI_MAP_ELEMENT(m_labelConnectController[3], "ConnectControllerLabel") + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_NAME(m_funcJoinButtonPressed, L"JoinButtonPressed") + UI_MAP_NAME(m_funcSetControllerStatus, L"SetControllerStatus") + UI_MAP_NAME(m_funcSetABSwap, L"SetABSwap") + UI_END_MAP_ELEMENTS_AND_NAMES() +public: + UIScene_QuadrantSignin(int iPad, void *initData, UILayer *parentLayer); + ~UIScene_QuadrantSignin(); + + virtual EUIScene getSceneType() { return eUIScene_QuadrantSignin;} + virtual void updateTooltips(); + + virtual bool hasFocus(int iPad); + virtual bool hidesLowerScenes(); + + void tick(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +private: + static int SignInReturned(void *pParam,bool bContinue, int iPad); + static int AvatarReturned(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes); + + void updateState(); + void setControllerState(int iPad, EControllerStatus state); + +#ifdef _DURANGO + static void checkAllPrivilegesCallback(LPVOID lpParam, bool hasPrivileges, int iPad); +#endif +}; diff --git a/Minecraft.Client/Common/UI/UIScene_ReinstallMenu.cpp b/Minecraft.Client/Common/UI/UIScene_ReinstallMenu.cpp new file mode 100644 index 00000000..3b67f79e --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_ReinstallMenu.cpp @@ -0,0 +1,110 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_ReinstallMenu.h" + +UIScene_ReinstallMenu::UIScene_ReinstallMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + +#if TO_BE_IMPLEMENTED + XuiControlSetText(m_Buttons[eControl_Theme],app.GetString(IDS_REINSTALL_THEME)); + XuiControlSetText(m_Buttons[eControl_Gamerpic1],app.GetString(IDS_REINSTALL_GAMERPIC_1)); + XuiControlSetText(m_Buttons[eControl_Gamerpic2],app.GetString(IDS_REINSTALL_GAMERPIC_2)); + XuiControlSetText(m_Buttons[eControl_Avatar1],app.GetString(IDS_REINSTALL_AVATAR_ITEM_1)); + XuiControlSetText(m_Buttons[eControl_Avatar2],app.GetString(IDS_REINSTALL_AVATAR_ITEM_2)); + XuiControlSetText(m_Buttons[eControl_Avatar3],app.GetString(IDS_REINSTALL_AVATAR_ITEM_3)); +#endif +} + +wstring UIScene_ReinstallMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"ReinstallSplit"; + } + else + { + return L"ReinstallMenu"; + } +} + +void UIScene_ReinstallMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,IDS_TOOLTIPS_SELECTDEVICE); +} + +void UIScene_ReinstallMenu::updateComponents() +{ + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + if(bNotInGame) + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + } + else + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,false); + + // 4J Stu - Do we want to show the logo in-game? + //if( app.GetLocalPlayerCount() == 1 ) m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + //else m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); + + } +} + +void UIScene_ReinstallMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed && !repeat) + { + navigateBack(); + } + 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); + break; + } +} + +void UIScene_ReinstallMenu::handlePress(F64 controlId, F64 childId) +{ +#if TO_BE_IMPLEMENTED + switch((int)controlId) + { + case BUTTON_HAO_CHANGESKIN: + ui.NavigateToScene(m_iPad, eUIScene_SkinSelectMenu); + break; + case BUTTON_HAO_HOWTOPLAY: + ui.NavigateToScene(m_iPad, eUIScene_HowToPlayMenu); + break; + case BUTTON_HAO_CONTROLS: + ui.NavigateToScene(m_iPad, eUIScene_ControlsMenu); + break; + case BUTTON_HAO_SETTINGS: + ui.NavigateToScene(m_iPad, eUIScene_SettingsMenu); + break; + case BUTTON_HAO_CREDITS: + ui.NavigateToScene(m_iPad, eUIScene_Credits); + break; + case BUTTON_HAO_REINSTALL: + ui.NavigateToScene(m_iPad, eUIScene_ReinstallMenu); + break; + case BUTTON_HAO_DEBUG: + ui.NavigateToScene(m_iPad, eUIScene_DebugOptions); + break; + } +#endif +} diff --git a/Minecraft.Client/Common/UI/UIScene_ReinstallMenu.h b/Minecraft.Client/Common/UI/UIScene_ReinstallMenu.h new file mode 100644 index 00000000..54c20a6e --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_ReinstallMenu.h @@ -0,0 +1,47 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_ReinstallMenu : public UIScene +{ +private: + enum EControls + { + eControl_Theme, + eControl_Gamerpic1, + eControl_Gamerpic2, + eControl_Avatar1, + eControl_Avatar2, + eControl_Avatar3, + eControl_COUNT, + }; + UIControl_Button m_buttons[eControl_COUNT]; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttons[eControl_Theme], "Button1") + UI_MAP_ELEMENT( m_buttons[eControl_Gamerpic1], "Button2") + UI_MAP_ELEMENT( m_buttons[eControl_Gamerpic2], "Button3") + UI_MAP_ELEMENT( m_buttons[eControl_Avatar1], "Button4") + UI_MAP_ELEMENT( m_buttons[eControl_Avatar2], "Button5") + UI_MAP_ELEMENT( m_buttons[eControl_Avatar3], "Button6") + UI_END_MAP_ELEMENTS_AND_NAMES() + + //bool m_bNotInGame; +public: + UIScene_ReinstallMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_ReinstallMenu;} + + virtual void updateTooltips(); + virtual void updateComponents(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +protected: + void handlePress(F64 controlId, F64 childId); +}; diff --git a/Minecraft.Client/Common/UI/UIScene_SaveMessage.cpp b/Minecraft.Client/Common/UI/UIScene_SaveMessage.cpp new file mode 100644 index 00000000..a91d5aa8 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SaveMessage.cpp @@ -0,0 +1,182 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_SaveMessage.h" + +#define PROFILE_LOADED_TIMER_ID 0 +#define PROFILE_LOADED_TIMER_TIME 50 + +UIScene_SaveMessage::UIScene_SaveMessage(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + parentLayer->addComponent(iPad,eUIComponent_Panorama); + parentLayer->addComponent(iPad,eUIComponent_Logo); + + m_buttonConfirm.init(app.GetString(IDS_CONFIRM_OK),eControl_Confirm); + m_labelDescription.init(app.GetString(IDS_SAVE_ICON_MESSAGE)); + + IggyDataValue result; + + // Russian needs to resize the box + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcAutoResize , 0 , NULL ); + + // 4J-PB - If we have a signed in user connected, let's get the DLC now + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if( (InputManager.IsPadConnected(i) || ProfileManager.IsSignedIn(i)) ) + { + if(!app.DLCInstallProcessCompleted() && !app.DLCInstallPending()) + { + app.StartInstallDLCProcess(i); + break; + } + } + } + + m_bIgnoreInput=false; + + // 4J-TomK - rebuild touch after auto resize +#ifdef __PSVITA__ + ui.TouchBoxRebuild(this); +#endif +} + +UIScene_SaveMessage::~UIScene_SaveMessage() +{ + m_parentLayer->removeComponent(eUIComponent_Panorama); + m_parentLayer->removeComponent(eUIComponent_Logo); +} + +wstring UIScene_SaveMessage::getMoviePath() +{ + return L"SaveMessage"; +} + +void UIScene_SaveMessage::updateTooltips() +{ + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT ); +} + +void UIScene_SaveMessage::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if(m_bIgnoreInput) return; +#if defined (__ORBIS__) || defined (__PSVITA__) + // ignore all players except player 0 - it's their profile that is currently being used + if(iPad!=0) return; +#endif + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + sendInputToMovie(key, repeat, pressed, released); + break; + // #ifdef __PS3__ + // case ACTION_MENU_Y: + // if(pressed) + // { + // // language select - switch to Greek for now + // if(app.GetMinecraftLanguage(iPad)==MINECRAFT_LANGUAGE_DEFAULT) + // { + // app.SetMinecraftLanguage(iPad,MINECRAFT_LANGUAGE_GREEK); + // } + // else + // { + // app.SetMinecraftLanguage(iPad,MINECRAFT_LANGUAGE_DEFAULT); + // } + // // reload the string table + // ui.SetupFont(); + // app.loadStringTable(); + // handleReload(); + // } + // break; + // #endif + } +} + +void UIScene_SaveMessage::handlePress(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_Confirm: + + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + m_bIgnoreInput=true; + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + // wait for the profile to be read - this has been kicked off earlier, so should be read by now + addTimer(PROFILE_LOADED_TIMER_ID,PROFILE_LOADED_TIMER_TIME); +#else + ui.NavigateToHomeMenu(); +#endif + break; + }; +} + +void UIScene_SaveMessage::handleTimerComplete(int id) +{ + switch(id) + { + case PROFILE_LOADED_TIMER_ID: + { +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + C4JStorage::eOptionsCallback eStatus=app.GetOptionsCallbackStatus(0); + + switch(eStatus) + { + case C4JStorage::eOptions_Callback_Read: + case C4JStorage::eOptions_Callback_Read_FileNotFound: + case C4JStorage::eOptions_Callback_Read_Fail: +#ifdef __PSVITA__ + case C4JStorage::eOptions_Callback_Write_Fail: + case C4JStorage::eOptions_Callback_Write: +#endif + // set defaults - which has already been done + killTimer(PROFILE_LOADED_TIMER_ID); + ui.NavigateToHomeMenu(); + SQRNetworkManager::SafeToRespondToGameBootInvite(); + app.SetOptionsCallbackStatus(0,C4JStorage::eOptions_Callback_Idle); + break; + case C4JStorage::eOptions_Callback_Read_CorruptDeleted: + killTimer(PROFILE_LOADED_TIMER_ID); + ui.NavigateToHomeMenu(); + SQRNetworkManager::SafeToRespondToGameBootInvite(); + app.SetOptionsCallbackStatus(0,C4JStorage::eOptions_Callback_Idle); + break; + case C4JStorage::eOptions_Callback_Read_Corrupt: + // get the user to delete the options file + app.DebugPrintf("Corrupt options file\n"); + app.SetOptionsCallbackStatus(0,C4JStorage::eOptions_Callback_Read_CorruptDeletePending); + m_bIgnoreInput=false; + // give the option to delete the save + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_CORRUPT_FILE, IDS_CORRUPT_OPTIONS, uiIDA, 1, + 0,&UIScene_SaveMessage::DeleteOptionsDialogReturned,this, app.GetStringTable()); + break; + } +#endif + } + + break; + } +} + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) +int UIScene_SaveMessage::DeleteOptionsDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + //UIScene_SaveMessage* pClass = (UIScene_SaveMessage*)pParam; + + // kick off the delete + StorageManager.DeleteOptionsData(iPad); + + return 0; +} +#endif diff --git a/Minecraft.Client/Common/UI/UIScene_SaveMessage.h b/Minecraft.Client/Common/UI/UIScene_SaveMessage.h new file mode 100644 index 00000000..cedc8c8f --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SaveMessage.h @@ -0,0 +1,51 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_SaveMessage : public UIScene +{ +private: + enum EControls + { + eControl_Confirm, + }; + + bool m_bIgnoreInput; + + UIControl_Button m_buttonConfirm; + UIControl_Label m_labelDescription; + IggyName m_funcAutoResize; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT(m_buttonConfirm, "Confirm") + UI_MAP_ELEMENT(m_labelDescription, "Description") + UI_MAP_NAME( m_funcAutoResize, L"AutoResize") + UI_END_MAP_ELEMENTS_AND_NAMES() + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + static int DeleteOptionsDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); +#endif + +public: + UIScene_SaveMessage(int iPad, void *initData, UILayer *parentLayer); + ~UIScene_SaveMessage(); + + virtual EUIScene getSceneType() { return eUIScene_SaveMessage;} + // Returns true if this scene has focus for the pad passed in +#ifndef __PS3__ + virtual bool hasFocus(int iPad) { return bHasFocus; } +#endif + virtual void updateTooltips(); + +protected: + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + virtual void handleTimerComplete(int id); + +protected: + void handlePress(F64 controlId, F64 childId); + + virtual long long getDefaultGtcButtons() { return 0; } +}; diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsAudioMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SettingsAudioMenu.cpp new file mode 100644 index 00000000..6d892d70 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SettingsAudioMenu.cpp @@ -0,0 +1,116 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_SettingsAudioMenu.h" + +UIScene_SettingsAudioMenu::UIScene_SettingsAudioMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + WCHAR TempString[256]; + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_MUSIC ),app.GetGameSettings(m_iPad,eGameSetting_MusicVolume)); + m_sliderMusic.init(TempString,eControl_Music,0,100,app.GetGameSettings(m_iPad,eGameSetting_MusicVolume)); + + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_SOUND ),app.GetGameSettings(m_iPad,eGameSetting_SoundFXVolume)); + m_sliderSound.init(TempString,eControl_Sound,0,100,app.GetGameSettings(m_iPad,eGameSetting_SoundFXVolume)); + + doHorizontalResizeCheck(); + + if(app.GetLocalPlayerCount()>1) + { +#if TO_BE_IMPLEMENTED + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); +#endif + } +} + +UIScene_SettingsAudioMenu::~UIScene_SettingsAudioMenu() +{ +} + +wstring UIScene_SettingsAudioMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"SettingsAudioMenuSplit"; + } + else + { + return L"SettingsAudioMenu"; + } +} + +void UIScene_SettingsAudioMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_SettingsAudioMenu::updateComponents() +{ + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + if(bNotInGame) + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + } + else + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,false); + + if( app.GetLocalPlayerCount() == 1 ) m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + else m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); + } +} + +void UIScene_SettingsAudioMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + navigateBack(); + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_SettingsAudioMenu::handleSliderMove(F64 sliderId, F64 currentValue) +{ + WCHAR TempString[256]; + int value = (int)currentValue; + switch((int)sliderId) + { + case eControl_Music: + m_sliderMusic.handleSliderMove(value); + + app.SetGameSettings(m_iPad,eGameSetting_MusicVolume,value); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_MUSIC ),value); + m_sliderMusic.setLabel(TempString); + + break; + case eControl_Sound: + m_sliderSound.handleSliderMove(value); + + app.SetGameSettings(m_iPad,eGameSetting_SoundFXVolume,value); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_SOUND ),value); + m_sliderSound.setLabel(TempString); + + break; + } +} diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsAudioMenu.h b/Minecraft.Client/Common/UI/UIScene_SettingsAudioMenu.h new file mode 100644 index 00000000..6c48b22b --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SettingsAudioMenu.h @@ -0,0 +1,38 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_SettingsAudioMenu : public UIScene +{ +private: + enum EControls + { + eControl_Music, + eControl_Sound + }; + + UIControl_Slider m_sliderMusic, m_sliderSound; // Sliders + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_sliderMusic, "Music") + UI_MAP_ELEMENT( m_sliderSound, "Sound") + UI_END_MAP_ELEMENTS_AND_NAMES() + +public: + UIScene_SettingsAudioMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_SettingsAudioMenu(); + + virtual EUIScene getSceneType() { return eUIScene_SettingsAudioMenu;} + + virtual void updateTooltips(); + virtual void updateComponents(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + virtual void handleSliderMove(F64 sliderId, F64 currentValue); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsControlMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SettingsControlMenu.cpp new file mode 100644 index 00000000..d5447f77 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SettingsControlMenu.cpp @@ -0,0 +1,116 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_SettingsControlMenu.h" + +UIScene_SettingsControlMenu::UIScene_SettingsControlMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + WCHAR TempString[256]; + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_SENSITIVITY_INGAME ),app.GetGameSettings(m_iPad,eGameSetting_Sensitivity_InGame)); + m_sliderSensitivityInGame.init(TempString,eControl_SensitivityInGame,0,200,app.GetGameSettings(m_iPad,eGameSetting_Sensitivity_InGame)); + + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_SENSITIVITY_INMENU ),app.GetGameSettings(m_iPad,eGameSetting_Sensitivity_InMenu)); + m_sliderSensitivityInMenu.init(TempString,eControl_SensitivityInMenu,0,200,app.GetGameSettings(m_iPad,eGameSetting_Sensitivity_InMenu)); + + doHorizontalResizeCheck(); + + if(app.GetLocalPlayerCount()>1) + { +#if TO_BE_IMPLEMENTED + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad,false); +#endif + } +} + +UIScene_SettingsControlMenu::~UIScene_SettingsControlMenu() +{ +} + +wstring UIScene_SettingsControlMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"SettingsControlMenuSplit"; + } + else + { + return L"SettingsControlMenu"; + } +} + +void UIScene_SettingsControlMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_SettingsControlMenu::updateComponents() +{ + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + if(bNotInGame) + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + } + else + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,false); + + if( app.GetLocalPlayerCount() == 1 ) m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + else m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); + } +} + +void UIScene_SettingsControlMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + navigateBack(); + handled = true; + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_SettingsControlMenu::handleSliderMove(F64 sliderId, F64 currentValue) +{ + WCHAR TempString[256]; + int value = (int)currentValue; + switch((int)sliderId) + { + case eControl_SensitivityInGame: + m_sliderSensitivityInGame.handleSliderMove(value); + + app.SetGameSettings(m_iPad,eGameSetting_Sensitivity_InGame,value); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_SENSITIVITY_INGAME ),value); + m_sliderSensitivityInGame.setLabel(TempString); + + break; + case eControl_SensitivityInMenu: + m_sliderSensitivityInMenu.handleSliderMove(value); + + app.SetGameSettings(m_iPad,eGameSetting_Sensitivity_InMenu,value); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_SENSITIVITY_INMENU ),value); + m_sliderSensitivityInMenu.setLabel(TempString); + + break; + } +} diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsControlMenu.h b/Minecraft.Client/Common/UI/UIScene_SettingsControlMenu.h new file mode 100644 index 00000000..6d3b864c --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SettingsControlMenu.h @@ -0,0 +1,37 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_SettingsControlMenu : public UIScene +{ +private: + enum EControls + { + eControl_SensitivityInGame, + eControl_SensitivityInMenu + }; + + UIControl_Slider m_sliderSensitivityInGame, m_sliderSensitivityInMenu; // Sliders + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_sliderSensitivityInGame, "SensitivityInGame") + UI_MAP_ELEMENT( m_sliderSensitivityInMenu, "SensitivityInMenu") + UI_END_MAP_ELEMENTS_AND_NAMES() +public: + UIScene_SettingsControlMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_SettingsControlMenu(); + + virtual EUIScene getSceneType() { return eUIScene_SettingsControlMenu;} + + virtual void updateTooltips(); + virtual void updateComponents(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + virtual void handleSliderMove(F64 sliderId, F64 currentValue); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.cpp new file mode 100644 index 00000000..1234121e --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.cpp @@ -0,0 +1,153 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_SettingsGraphicsMenu.h" + +UIScene_SettingsGraphicsMenu::UIScene_SettingsGraphicsMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_bNotInGame=(Minecraft::GetInstance()->level==NULL); + + m_checkboxClouds.init(app.GetString(IDS_CHECKBOX_RENDER_CLOUDS),eControl_Clouds,(app.GetGameSettings(m_iPad,eGameSetting_Clouds)!=0)); + m_checkboxBedrockFog.init(app.GetString(IDS_CHECKBOX_RENDER_BEDROCKFOG),eControl_BedrockFog,(app.GetGameSettings(m_iPad,eGameSetting_BedrockFog)!=0)); + m_checkboxCustomSkinAnim.init(app.GetString(IDS_CHECKBOX_CUSTOM_SKIN_ANIM),eControl_CustomSkinAnim,(app.GetGameSettings(m_iPad,eGameSetting_CustomSkinAnim)!=0)); + + + WCHAR TempString[256]; + + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_GAMMA ),app.GetGameSettings(m_iPad,eGameSetting_Gamma)); + m_sliderGamma.init(TempString,eControl_Gamma,0,100,app.GetGameSettings(m_iPad,eGameSetting_Gamma)); + + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_INTERFACEOPACITY ),app.GetGameSettings(m_iPad,eGameSetting_InterfaceOpacity)); + m_sliderInterfaceOpacity.init(TempString,eControl_InterfaceOpacity,0,100,app.GetGameSettings(m_iPad,eGameSetting_InterfaceOpacity)); + + doHorizontalResizeCheck(); + + bool bInGame=(Minecraft::GetInstance()->level!=NULL); + bool bIsPrimaryPad=(ProfileManager.GetPrimaryPad()==m_iPad); + // if we're not in the game, we need to use basescene 0 + if(bInGame) + { + // If the game has started, then you need to be the host to change the in-game gamertags + if(bIsPrimaryPad) + { + // we are the primary player on this machine, but not the game host + // are we the game host? If not, we need to remove the bedrockfog setting + if(!g_NetworkManager.IsHost()) + { + // hide the in-game bedrock fog setting + removeControl(&m_checkboxBedrockFog, true); + } + } + else + { + // We shouldn't have the bedrock fog option, or the m_CustomSkinAnim option + removeControl(&m_checkboxBedrockFog, true); + removeControl(&m_checkboxCustomSkinAnim, true); + } + } + + if(app.GetLocalPlayerCount()>1) + { +#if TO_BE_IMPLEMENTED + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); +#endif + } +} + +UIScene_SettingsGraphicsMenu::~UIScene_SettingsGraphicsMenu() +{ +} + +wstring UIScene_SettingsGraphicsMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"SettingsGraphicsMenuSplit"; + } + else + { + return L"SettingsGraphicsMenu"; + } +} + +void UIScene_SettingsGraphicsMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_SettingsGraphicsMenu::updateComponents() +{ + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + if(bNotInGame) + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + } + else + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,false); + + if( app.GetLocalPlayerCount() == 1 ) m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + else m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); + + } +} + +void UIScene_SettingsGraphicsMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + // check the checkboxes + app.SetGameSettings(m_iPad,eGameSetting_Clouds,m_checkboxClouds.IsChecked()?1:0); + app.SetGameSettings(m_iPad,eGameSetting_BedrockFog,m_checkboxBedrockFog.IsChecked()?1:0); + app.SetGameSettings(m_iPad,eGameSetting_CustomSkinAnim,m_checkboxCustomSkinAnim.IsChecked()?1:0); + + navigateBack(); + handled = true; + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_SettingsGraphicsMenu::handleSliderMove(F64 sliderId, F64 currentValue) +{ + WCHAR TempString[256]; + int value = (int)currentValue; + switch((int)sliderId) + { + case eControl_Gamma: + m_sliderGamma.handleSliderMove(value); + + app.SetGameSettings(m_iPad,eGameSetting_Gamma,value); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_GAMMA ),value); + m_sliderGamma.setLabel(TempString); + + break; + case eControl_InterfaceOpacity: + m_sliderInterfaceOpacity.handleSliderMove(value); + + app.SetGameSettings(m_iPad,eGameSetting_InterfaceOpacity,value); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_INTERFACEOPACITY ),value); + m_sliderInterfaceOpacity.setLabel(TempString); + + break; + } +} diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.h b/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.h new file mode 100644 index 00000000..e9c4905c --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.h @@ -0,0 +1,46 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_SettingsGraphicsMenu : public UIScene +{ +private: + enum EControls + { + eControl_Clouds, + eControl_BedrockFog, + eControl_CustomSkinAnim, + eControl_Gamma, + eControl_InterfaceOpacity + }; + + UIControl_CheckBox m_checkboxClouds, m_checkboxBedrockFog, m_checkboxCustomSkinAnim; // Checkboxes + UIControl_Slider m_sliderGamma, m_sliderInterfaceOpacity; // Sliders + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_checkboxClouds, "Clouds") + UI_MAP_ELEMENT( m_checkboxBedrockFog, "BedrockFog") + UI_MAP_ELEMENT( m_checkboxCustomSkinAnim, "CustomSkinAnim") + UI_MAP_ELEMENT( m_sliderGamma, "Gamma") + UI_MAP_ELEMENT( m_sliderInterfaceOpacity, "InterfaceOpacity") + UI_END_MAP_ELEMENTS_AND_NAMES() + + bool m_bNotInGame; +public: + UIScene_SettingsGraphicsMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_SettingsGraphicsMenu(); + + virtual EUIScene getSceneType() { return eUIScene_SettingsGraphicsMenu;} + + virtual void updateTooltips(); + virtual void updateComponents(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + virtual void handleSliderMove(F64 sliderId, F64 currentValue); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SettingsMenu.cpp new file mode 100644 index 00000000..4ef7eb5d --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SettingsMenu.cpp @@ -0,0 +1,168 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_SettingsMenu.h" +#include "..\..\Minecraft.h" + +UIScene_SettingsMenu::UIScene_SettingsMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + + m_buttons[BUTTON_ALL_OPTIONS].init(app.GetString(IDS_OPTIONS),BUTTON_ALL_OPTIONS); + m_buttons[BUTTON_ALL_AUDIO].init(app.GetString(IDS_AUDIO),BUTTON_ALL_AUDIO); + m_buttons[BUTTON_ALL_CONTROL].init(app.GetString(IDS_CONTROL),BUTTON_ALL_CONTROL); + m_buttons[BUTTON_ALL_GRAPHICS].init(app.GetString(IDS_GRAPHICS),BUTTON_ALL_GRAPHICS); + m_buttons[BUTTON_ALL_UI].init(app.GetString(IDS_USER_INTERFACE),BUTTON_ALL_UI); + m_buttons[BUTTON_ALL_RESETTODEFAULTS].init(app.GetString(IDS_RESET_TO_DEFAULTS),BUTTON_ALL_RESETTODEFAULTS); + + if(ProfileManager.GetPrimaryPad()!=m_iPad) + { + removeControl( &m_buttons[BUTTON_ALL_AUDIO], true); + removeControl( &m_buttons[BUTTON_ALL_GRAPHICS], true); + } + + doHorizontalResizeCheck(); + + if(app.GetLocalPlayerCount()>1) + { +#if TO_BE_IMPLEMENTED + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad,false); +#endif + } +} + +UIScene_SettingsMenu::~UIScene_SettingsMenu() +{ +} + +wstring UIScene_SettingsMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"SettingsMenuSplit"; + } + else + { + return L"SettingsMenu"; + } +} + +void UIScene_SettingsMenu::handleReload() +{ + if(ProfileManager.GetPrimaryPad()!=m_iPad) + { + removeControl( &m_buttons[BUTTON_ALL_AUDIO], true); + removeControl( &m_buttons[BUTTON_ALL_GRAPHICS], true); + } + + doHorizontalResizeCheck(); +} + +void UIScene_SettingsMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_SettingsMenu::updateComponents() +{ + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + if(bNotInGame) + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + } + else + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,false); + + if( app.GetLocalPlayerCount() == 1 ) m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + else m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); + + } +} + +void UIScene_SettingsMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + // if the profile data has been changed, then force a profile write + // It seems we're allowed to break the 5 minute rule if it's the result of a user action + + app.CheckGameSettingsChanged(true,iPad); + navigateBack(); + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_SettingsMenu::handlePress(F64 controlId, F64 childId) +{ + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + switch((int)controlId) + { + case BUTTON_ALL_OPTIONS: + ui.NavigateToScene(m_iPad, eUIScene_SettingsOptionsMenu); + break; + case BUTTON_ALL_AUDIO: + ui.NavigateToScene(m_iPad, eUIScene_SettingsAudioMenu); + break; + case BUTTON_ALL_CONTROL: + ui.NavigateToScene(m_iPad, eUIScene_SettingsControlMenu); + break; + case BUTTON_ALL_GRAPHICS: + ui.NavigateToScene(m_iPad, eUIScene_SettingsGraphicsMenu); + break; + case BUTTON_ALL_UI: + ui.NavigateToScene(m_iPad, eUIScene_SettingsUIMenu); + break; + case BUTTON_ALL_RESETTODEFAULTS: + { + // check they really want to do this + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + + ui.RequestMessageBox(IDS_DEFAULTS_TITLE, IDS_DEFAULTS_TEXT, uiIDA, 2, m_iPad,&UIScene_SettingsMenu::ResetDefaultsDialogReturned,this, app.GetStringTable(), NULL, 0, false); + } + break; + } +} + +int UIScene_SettingsMenu::ResetDefaultsDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_SettingsMenu* pClass = (UIScene_SettingsMenu*)pParam; + + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { +#if (defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) + app.SetDefaultOptions(StorageManager.GetDashboardProfileSettings(pClass->m_iPad),pClass->m_iPad); +#else + app.SetDefaultOptions(ProfileManager.GetDashboardProfileSettings(pClass->m_iPad),pClass->m_iPad); +#endif + // if the profile data has been changed, then force a profile write + // It seems we're allowed to break the 5 minute rule if it's the result of a user action + app.CheckGameSettingsChanged(true,iPad); + } + return 0; +} diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsMenu.h b/Minecraft.Client/Common/UI/UIScene_SettingsMenu.h new file mode 100644 index 00000000..7f5fe169 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SettingsMenu.h @@ -0,0 +1,47 @@ +#pragma once + +#include "UIScene.h" + +#define BUTTON_ALL_OPTIONS 0 +#define BUTTON_ALL_AUDIO 1 +#define BUTTON_ALL_CONTROL 2 +#define BUTTON_ALL_GRAPHICS 4 +#define BUTTON_ALL_UI 5 +#define BUTTON_ALL_RESETTODEFAULTS 6 +#define BUTTONS_ALL_MAX BUTTON_ALL_RESETTODEFAULTS + 1 + +class UIScene_SettingsMenu : public UIScene +{ +private: + UIControl_Button m_buttons[BUTTONS_ALL_MAX]; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttons[BUTTON_ALL_OPTIONS], "Button1") + UI_MAP_ELEMENT( m_buttons[BUTTON_ALL_AUDIO], "Button2") + UI_MAP_ELEMENT( m_buttons[BUTTON_ALL_CONTROL], "Button3") + UI_MAP_ELEMENT( m_buttons[BUTTON_ALL_GRAPHICS], "Button4") + UI_MAP_ELEMENT( m_buttons[BUTTON_ALL_UI], "Button5") + UI_MAP_ELEMENT( m_buttons[BUTTON_ALL_RESETTODEFAULTS], "Button6") + UI_END_MAP_ELEMENTS_AND_NAMES() +public: + UIScene_SettingsMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_SettingsMenu(); + + virtual EUIScene getSceneType() { return eUIScene_SettingsMenu;} + + virtual void updateTooltips(); + virtual void updateComponents(); + virtual void handleReload(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +protected: + void handlePress(F64 controlId, F64 childId); + + static int ResetDefaultsDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.cpp new file mode 100644 index 00000000..72576ded --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.cpp @@ -0,0 +1,253 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_SettingsOptionsMenu.h" + +int UIScene_SettingsOptionsMenu::m_iDifficultySettingA[4]= +{ + IDS_DIFFICULTY_PEACEFUL, + IDS_DIFFICULTY_EASY, + IDS_DIFFICULTY_NORMAL, + IDS_DIFFICULTY_HARD +}; + +int UIScene_SettingsOptionsMenu::m_iDifficultyTitleSettingA[4]= +{ + IDS_DIFFICULTY_TITLE_PEACEFUL, + IDS_DIFFICULTY_TITLE_EASY, + IDS_DIFFICULTY_TITLE_NORMAL, + IDS_DIFFICULTY_TITLE_HARD +}; + +UIScene_SettingsOptionsMenu::UIScene_SettingsOptionsMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_bNotInGame=(Minecraft::GetInstance()->level==NULL); + + m_checkboxViewBob.init(app.GetString(IDS_VIEW_BOBBING),eControl_ViewBob,(app.GetGameSettings(m_iPad,eGameSetting_ViewBob)!=0)); + m_checkboxShowHints.init(app.GetString(IDS_HINTS),eControl_ShowHints,(app.GetGameSettings(m_iPad,eGameSetting_Hints)!=0)); + m_checkboxShowTooltips.init(app.GetString(IDS_IN_GAME_TOOLTIPS),eControl_ShowTooltips,(app.GetGameSettings(m_iPad,eGameSetting_Tooltips)!=0)); + m_checkboxInGameGamertags.init(app.GetString(IDS_IN_GAME_GAMERTAGS),eControl_InGameGamertags,(app.GetGameSettings(m_iPad,eGameSetting_GamertagsVisible)!=0)); + + // check if we should display the mash-up option + if(m_bNotInGame && app.GetMashupPackWorlds(m_iPad)!=0xFFFFFFFF) + { + // the mash-up option is needed + m_bMashUpWorldsUnhideOption=true; + m_checkboxMashupWorlds.init(app.GetString(IDS_UNHIDE_MASHUP_WORLDS),eControl_ShowMashUpWorlds,false); + } + else + { + //m_checkboxMashupWorlds.init(L"",eControl_ShowMashUpWorlds,false); + removeControl(&m_checkboxMashupWorlds, true); + m_bMashUpWorldsUnhideOption=false; + } + + unsigned char ucValue=app.GetGameSettings(m_iPad,eGameSetting_Autosave); + + wchar_t autosaveLabels[9][256]; + for(unsigned int i = 0; i < 9; ++i) + { + if(i==0) + { + swprintf( autosaveLabels[i], 256, L"%ls", app.GetString( IDS_SLIDER_AUTOSAVE_OFF )); + } + else + { + swprintf( autosaveLabels[i], 256, L"%ls: %d %ls", app.GetString( IDS_SLIDER_AUTOSAVE ),i*15, app.GetString( IDS_MINUTES )); + } + + } + m_sliderAutosave.setAllPossibleLabels(9,autosaveLabels); + m_sliderAutosave.init(autosaveLabels[ucValue],eControl_Autosave,0,8,ucValue); + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + removeControl(&m_sliderAutosave,true); +#endif + + ucValue = app.GetGameSettings(m_iPad,eGameSetting_Difficulty); + wchar_t difficultyLabels[4][256]; + for(unsigned int i = 0; i < 4; ++i) + { + swprintf( difficultyLabels[i], 256, L"%ls: %ls", app.GetString( IDS_SLIDER_DIFFICULTY ),app.GetString(m_iDifficultyTitleSettingA[i])); + } + m_sliderDifficulty.setAllPossibleLabels(4,difficultyLabels); + m_sliderDifficulty.init(difficultyLabels[ucValue],eControl_Difficulty,0,3,ucValue); + + wstring wsText=app.GetString(m_iDifficultySettingA[app.GetGameSettings(m_iPad,eGameSetting_Difficulty)]); + EHTMLFontSize size = eHTMLSize_Normal; + if(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) + { + size = eHTMLSize_Splitscreen; + } + wchar_t startTags[64]; + swprintf(startTags,64,L"",app.GetHTMLColour(eHTMLColor_White)); + wsText= startTags + wsText; + + m_labelDifficultyText.init(wsText); + + // If you are in-game, only the game host can change in-game gamertags, and you can't change difficulty + // only the primary player gets to change the autosave and difficulty settings + bool bRemoveDifficulty=false; + bool bRemoveAutosave=false; + bool bRemoveInGameGamertags=false; + float fRemoveHeight=0.0f,fWidth,fHeight; + + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + bool bPrimaryPlayer = ProfileManager.GetPrimaryPad()==m_iPad; + if(!bPrimaryPlayer) + { + bRemoveDifficulty=true; + bRemoveAutosave=true; + bRemoveInGameGamertags=true; + } + + if(!bNotInGame) // in the game + { + bRemoveDifficulty=true; + if(!g_NetworkManager.IsHost()) + { + bRemoveAutosave=true; + bRemoveInGameGamertags=true; + } + } + if(bRemoveDifficulty) + { + m_labelDifficultyText.setVisible( false ); + removeControl(&m_sliderDifficulty, true); + } + + if(bRemoveAutosave) + { + removeControl(&m_sliderAutosave, true); + } + + if(bRemoveInGameGamertags) + { + removeControl(&m_checkboxInGameGamertags, true); + } + + doHorizontalResizeCheck(); + + if(app.GetLocalPlayerCount()>1) + { +#if TO_BE_IMPLEMENTED + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); +#endif + } +} + +UIScene_SettingsOptionsMenu::~UIScene_SettingsOptionsMenu() +{ +} + +wstring UIScene_SettingsOptionsMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"SettingsOptionsMenuSplit"; + } + else + { + return L"SettingsOptionsMenu"; + } +} + +void UIScene_SettingsOptionsMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_SettingsOptionsMenu::updateComponents() +{ + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + if(bNotInGame) + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + } + else + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,false); + + if( app.GetLocalPlayerCount() == 1 ) m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,RenderManager.IsHiDef()); + else m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); + + } +} + +void UIScene_SettingsOptionsMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + // check the checkboxes + app.SetGameSettings(m_iPad,eGameSetting_ViewBob,m_checkboxViewBob.IsChecked()?1:0); + app.SetGameSettings(m_iPad,eGameSetting_GamertagsVisible,m_checkboxInGameGamertags.IsChecked()?1:0); + app.SetGameSettings(m_iPad,eGameSetting_Hints,m_checkboxShowHints.IsChecked()?1:0); + app.SetGameSettings(m_iPad,eGameSetting_Tooltips,m_checkboxShowTooltips.IsChecked()?1:0); + + // the mashup option will only be shown if some worlds have been previously hidden + if(m_bMashUpWorldsUnhideOption && m_checkboxMashupWorlds.IsChecked()) + { + // unhide all worlds + app.EnableMashupPackWorlds(m_iPad); + } + + // 4J-PB - don't action changes here or we might write to the profile on backing out here and then get a change in the settings all, and write again on backing out there + //app.CheckGameSettingsChanged(true,pInputData->UserIndex); + + navigateBack(); + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_SettingsOptionsMenu::handleSliderMove(F64 sliderId, F64 currentValue) +{ + WCHAR TempString[256]; + int value = (int)currentValue; + switch((int)sliderId) + { + case eControl_Autosave: + m_sliderAutosave.handleSliderMove(value); + + app.SetGameSettings(m_iPad,eGameSetting_Autosave,value); + // Update the autosave timer + app.SetAutosaveTimerTime(); + + break; + case eControl_Difficulty: + m_sliderDifficulty.handleSliderMove(value); + + app.SetGameSettings(m_iPad,eGameSetting_Difficulty,value); + + wstring wsText=app.GetString(m_iDifficultySettingA[value]); + EHTMLFontSize size = eHTMLSize_Normal; + if(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) + { + size = eHTMLSize_Splitscreen; + } + wchar_t startTags[64]; + swprintf(startTags,64,L"",app.GetHTMLColour(eHTMLColor_White)); + wsText= startTags + wsText; + m_labelDifficultyText.setLabel(wsText.c_str()); + break; + } +} diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.h b/Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.h new file mode 100644 index 00000000..265a0790 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.h @@ -0,0 +1,57 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_SettingsOptionsMenu : public UIScene +{ +private: + enum EControls + { + eControl_ViewBob, + eControl_ShowHints, + eControl_ShowTooltips, + eControl_InGameGamertags, + eControl_ShowMashUpWorlds, + eControl_Autosave, + eControl_Difficulty + }; +protected: + static int m_iDifficultySettingA[4]; + static int m_iDifficultyTitleSettingA[4]; + +private: + UIControl_CheckBox m_checkboxViewBob, m_checkboxShowHints, m_checkboxShowTooltips, m_checkboxInGameGamertags, m_checkboxMashupWorlds; // Checkboxes + UIControl_Slider m_sliderAutosave, m_sliderDifficulty; // Sliders + UIControl_Label m_labelDifficultyText; //Text + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_checkboxViewBob, "ViewBob") + UI_MAP_ELEMENT( m_checkboxShowHints, "ShowHints") + UI_MAP_ELEMENT( m_checkboxShowTooltips, "ShowTooltips") + UI_MAP_ELEMENT( m_checkboxInGameGamertags, "InGameGamertags") + UI_MAP_ELEMENT( m_checkboxMashupWorlds, "ShowMashUpWorlds") + UI_MAP_ELEMENT( m_sliderAutosave, "Autosave") + UI_MAP_ELEMENT( m_sliderDifficulty, "Difficulty") + UI_MAP_ELEMENT( m_labelDifficultyText, "DifficultyText") + UI_END_MAP_ELEMENTS_AND_NAMES() + + bool m_bNotInGame; + bool m_bMashUpWorldsUnhideOption; +public: + UIScene_SettingsOptionsMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_SettingsOptionsMenu(); + + virtual EUIScene getSceneType() { return eUIScene_SettingsOptionsMenu;} + + virtual void updateTooltips(); + virtual void updateComponents(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + virtual void handleSliderMove(F64 sliderId, F64 currentValue); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsUIMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SettingsUIMenu.cpp new file mode 100644 index 00000000..917012d6 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SettingsUIMenu.cpp @@ -0,0 +1,183 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_SettingsUIMenu.h" + +UIScene_SettingsUIMenu::UIScene_SettingsUIMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_bNotInGame=(Minecraft::GetInstance()->level==NULL); + + m_checkboxDisplayHUD.init(app.GetString(IDS_CHECKBOX_DISPLAY_HUD),eControl_DisplayHUD,(app.GetGameSettings(m_iPad,eGameSetting_DisplayHUD)!=0)); + m_checkboxDisplayHand.init(app.GetString(IDS_CHECKBOX_DISPLAY_HAND),eControl_DisplayHand,(app.GetGameSettings(m_iPad,eGameSetting_DisplayHand)!=0)); + m_checkboxDisplayDeathMessages.init(app.GetString(IDS_CHECKBOX_DEATH_MESSAGES),eControl_DisplayDeathMessages,(app.GetGameSettings(m_iPad,eGameSetting_DeathMessages)!=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_checkboxShowSplitscreenGamertags.init(app.GetString(IDS_CHECKBOX_DISPLAY_SPLITSCREENGAMERTAGS),eControl_ShowSplitscreenGamertags,(app.GetGameSettings(m_iPad,eGameSetting_DisplaySplitscreenGamertags)!=0)); + + WCHAR TempString[256]; + + swprintf( (WCHAR *)TempString, 256, L"%ls: %d", app.GetString( IDS_SLIDER_UISIZE ),app.GetGameSettings(m_iPad,eGameSetting_UISize)+1); + m_sliderUISize.init(TempString,eControl_UISize,1,3,app.GetGameSettings(m_iPad,eGameSetting_UISize)+1); + + swprintf( (WCHAR *)TempString, 256, L"%ls: %d", app.GetString( IDS_SLIDER_UISIZESPLITSCREEN ),app.GetGameSettings(m_iPad,eGameSetting_UISizeSplitscreen)+1); + m_sliderUISizeSplitscreen.init(TempString,eControl_UISizeSplitscreen,1,3,app.GetGameSettings(m_iPad,eGameSetting_UISizeSplitscreen)+1); + + doHorizontalResizeCheck(); + + bool bInGame=(Minecraft::GetInstance()->level!=NULL); + bool bPrimaryPlayer = ProfileManager.GetPrimaryPad()==m_iPad; + + // if we're not in the game, we need to use basescene 0 + if(bInGame) + { + // If the game has started, then you need to be the host to change the in-game gamertags + if(!bPrimaryPlayer) + { + // hide things we don't want the splitscreen player changing + removeControl(&m_checkboxSplitscreen, true); + removeControl(&m_checkboxShowSplitscreenGamertags, true); + } + } + + + if(app.GetLocalPlayerCount()>1) + { +#if TO_BE_IMPLEMENTED + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); +#endif + } +} + +void UIScene_SettingsUIMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_SettingsUIMenu::updateComponents() +{ + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + if(bNotInGame) + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,true); + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + } + else + { + m_parentLayer->showComponent(m_iPad,eUIComponent_Panorama,false); + + if( app.GetLocalPlayerCount() == 1 ) m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,true); + else m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); + + } +} + +UIScene_SettingsUIMenu::~UIScene_SettingsUIMenu() +{ +} + +wstring UIScene_SettingsUIMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"SettingsUIMenuSplit"; + } + else + { + return L"SettingsUIMenu"; + } +} + +void UIScene_SettingsUIMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + // check the checkboxes + app.SetGameSettings(m_iPad,eGameSetting_DisplayHUD,m_checkboxDisplayHUD.IsChecked()?1:0); + app.SetGameSettings(m_iPad,eGameSetting_DisplayHand,m_checkboxDisplayHand.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_AnimatedCharacter,m_checkboxDisplayAnimatedCharacter.IsChecked()?1:0); + + // if the splitscreen vertical/horizontal has changed, need to update the scenes + if(app.GetGameSettings(m_iPad,eGameSetting_SplitScreenVertical)!=(m_checkboxSplitscreen.IsChecked()?1:0)) + { + // changed + app.SetGameSettings(m_iPad,eGameSetting_SplitScreenVertical,m_checkboxSplitscreen.IsChecked()?1:0); + + // close the xui scenes, so we don't have the navigate backed to menu at the wrong place + if(app.GetLocalPlayerCount()==2) + { + ui.CloseAllPlayersScenes(); + } + else + { + navigateBack(); + } + } + else + { + navigateBack(); + } + handled = true; + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + sendInputToMovie(key, repeat, pressed, released); + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_LEFT: + case ACTION_MENU_RIGHT: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_SettingsUIMenu::handleSliderMove(F64 sliderId, F64 currentValue) +{ + WCHAR TempString[256]; + int value = (int)currentValue; + switch((int)sliderId) + { + case eControl_UISize: + m_sliderUISize.handleSliderMove(value); + + swprintf( (WCHAR *)TempString, 256, L"%ls: %d", app.GetString( IDS_SLIDER_UISIZE ),value); + m_sliderUISize.setLabel(TempString); + + // is this different from the current value? + if(value != app.GetGameSettings(m_iPad,eGameSetting_UISize)+1) + { + app.SetGameSettings(m_iPad,eGameSetting_UISize,value-1); + // Apply the changes to the selected text position + ui.UpdateSelectedItemPos(m_iPad); + } + + break; + case eControl_UISizeSplitscreen: + m_sliderUISizeSplitscreen.handleSliderMove(value); + + swprintf( (WCHAR *)TempString, 256, L"%ls: %d", app.GetString( IDS_SLIDER_UISIZESPLITSCREEN ),value); + m_sliderUISizeSplitscreen.setLabel(TempString); + + if(value != app.GetGameSettings(m_iPad,eGameSetting_UISizeSplitscreen)+1) + { + // slider is 1 to 3 + app.SetGameSettings(m_iPad,eGameSetting_UISizeSplitscreen,value-1); + // Apply the changes to the selected text position + ui.UpdateSelectedItemPos(m_iPad); + } + + break; + } +} diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsUIMenu.h b/Minecraft.Client/Common/UI/UIScene_SettingsUIMenu.h new file mode 100644 index 00000000..8968bbe7 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SettingsUIMenu.h @@ -0,0 +1,53 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_SettingsUIMenu : public UIScene +{ +private: + enum EControls + { + eControl_DisplayHUD, + eControl_DisplayHand, + eControl_DisplayDeathMessages, + eControl_DisplayAnimatedCharacter, + eControl_Splitscreen, + eControl_ShowSplitscreenGamertags, + eControl_UISize, + eControl_UISizeSplitscreen + }; + + UIControl_CheckBox m_checkboxDisplayHUD, m_checkboxDisplayHand, m_checkboxDisplayDeathMessages, m_checkboxDisplayAnimatedCharacter, m_checkboxSplitscreen, m_checkboxShowSplitscreenGamertags; // Checkboxes + UIControl_Slider m_sliderUISize, m_sliderUISizeSplitscreen; // Sliders + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_checkboxDisplayHUD, "DisplayHUD") + UI_MAP_ELEMENT( m_checkboxDisplayHand, "DisplayHand") + UI_MAP_ELEMENT( m_checkboxDisplayDeathMessages, "DisplayDeathMessages") + UI_MAP_ELEMENT( m_checkboxDisplayAnimatedCharacter, "DisplayAnimatedCharacter") + UI_MAP_ELEMENT( m_checkboxSplitscreen, "Splitscreen") + UI_MAP_ELEMENT( m_checkboxShowSplitscreenGamertags, "ShowSplitscreenGamertags") + + UI_MAP_ELEMENT( m_sliderUISize, "UISize") + UI_MAP_ELEMENT( m_sliderUISizeSplitscreen, "UISizeSplitscreen") + UI_END_MAP_ELEMENTS_AND_NAMES() + + bool m_bNotInGame; +public: + UIScene_SettingsUIMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_SettingsUIMenu(); + + virtual EUIScene getSceneType() { return eUIScene_SettingsUIMenu;} + + virtual void updateTooltips(); + virtual void updateComponents(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + virtual void handleSliderMove(F64 sliderId, F64 currentValue); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_SignEntryMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SignEntryMenu.cpp new file mode 100644 index 00000000..c29bac2d --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SignEntryMenu.cpp @@ -0,0 +1,206 @@ +#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 player = pMinecraft->localplayers[m_iPad]; + if(player != NULL && player->connection && player->connection->isStarted()) + { + player->connection->send( 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 + 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(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; +#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(),(DWORD)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(),(DWORD)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(),(DWORD)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 +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_SignEntryMenu.h b/Minecraft.Client/Common/UI/UIScene_SignEntryMenu.h new file mode 100644 index 00000000..28b37d53 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SignEntryMenu.h @@ -0,0 +1,58 @@ +#pragma once + +#include "UIScene.h" + +class SignTileEntity; + +class UIScene_SignEntryMenu : public UIScene +{ +private: + enum EControls + { + // Lines should be 0-3 + eControl_Line1, + eControl_Line2, + eControl_Line3, + eControl_Line4, + eControl_Confirm + }; + + shared_ptr m_sign; + int m_iEditingLine; + bool m_bConfirmed; + bool m_bIgnoreInput; + + UIControl_Button m_buttonConfirm; + UIControl_Label m_labelMessage; + UIControl_TextInput m_textInputLines[4]; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_buttonConfirm, "Confirm") + UI_MAP_ELEMENT( m_labelMessage, "Message") + + UI_MAP_ELEMENT( m_textInputLines[0], "Line1") + UI_MAP_ELEMENT( m_textInputLines[1], "Line2") + UI_MAP_ELEMENT( m_textInputLines[2], "Line3") + UI_MAP_ELEMENT( m_textInputLines[3], "Line4") + UI_END_MAP_ELEMENTS_AND_NAMES() +public: + UIScene_SignEntryMenu(int iPad, void *initData, UILayer *parentLayer); + virtual ~UIScene_SignEntryMenu(); + + virtual EUIScene getSceneType() { return eUIScene_SignEntryMenu;} + virtual void updateTooltips(); + + virtual void tick(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +protected: + void handlePress(F64 controlId, F64 childId); + static int KeyboardCompleteCallback(LPVOID lpParam,const bool bRes); + virtual void handleDestroy(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.cpp new file mode 100644 index 00000000..6910dd65 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.cpp @@ -0,0 +1,1798 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_SkinSelectMenu.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#ifdef __ORBIS__ +#include +#elif defined __PSVITA__ +#include +#endif + +#define SKIN_SELECT_PACK_DEFAULT 0 +#define SKIN_SELECT_PACK_FAVORITES 1 +//#define SKIN_SELECT_PACK_PLAYER_CUSTOM 1 +#define SKIN_SELECT_MAX_DEFAULTS 2 + +WCHAR *UIScene_SkinSelectMenu::wchDefaultNamesA[]= +{ + L"USE LOCALISED VERSION", // Server selected + L"Steve", + L"Tennis Steve", + L"Tuxedo Steve", + L"Athlete Steve", + L"Scottish Steve", + L"Prisoner Steve", + L"Cyclist Steve", + L"Boxer Steve", +}; + +UIScene_SkinSelectMenu::UIScene_SkinSelectMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_labelSelected.init( app.GetString( IDS_SELECTED ) ); + +#ifdef __ORBIS__ + m_bErrorDialogRunning=false; +#endif + + m_bIgnoreInput=false; + m_bNoSkinsToShow = false; + + m_currentPack = NULL; + m_packIndex = SKIN_SELECT_PACK_DEFAULT; + m_skinIndex = 0; + + m_originalSkinId = app.GetPlayerSkinId(iPad); + m_currentSkinPath = app.GetPlayerSkinName(iPad); + m_selectedSkinPath = L""; + m_selectedCapePath = L""; + m_vAdditionalSkinBoxes = NULL; + + m_bSlidingSkins = false; + m_bAnimatingMove = false; + m_bSkinIndexChanged = false; + + m_currentNavigation = eSkinNavigation_Skin; + + m_currentPackCount = 0; + + m_characters[eCharacter_Current].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Forward); + + m_characters[eCharacter_Next1].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Left); + m_characters[eCharacter_Next2].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Left); + m_characters[eCharacter_Next3].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Left); + m_characters[eCharacter_Next4].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Left); + + m_characters[eCharacter_Previous1].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Right); + m_characters[eCharacter_Previous2].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Right); + m_characters[eCharacter_Previous3].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Right); + m_characters[eCharacter_Previous4].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Right); + + m_labelSkinName.init(L""); + m_labelSkinOrigin.init(L""); + + m_leftLabel = L""; + m_centreLabel = L""; + m_rightLabel = L""; + +#ifdef __PSVITA__ + // initialise vita tab controls with ids + m_TouchTabLeft.init(ETouchInput_TabLeft); + m_TouchTabRight.init(ETouchInput_TabRight); + m_TouchTabCenter.init(ETouchInput_TabCenter); + m_TouchIggyCharacters.init(ETouchInput_IggyCharacters); +#endif + + // block input if we're waiting for DLC to install. The end of dlc mounting custom message will fill the save list + if(app.StartInstallDLCProcess(m_iPad)) + { + // DLC mounting in progress, so disable input + m_bIgnoreInput=true; + + m_controlTimer.setVisible( true ); + m_controlIggyCharacters.setVisible( false ); + m_controlSkinNamePlate.setVisible( false ); + + setCharacterLocked(false); + setCharacterSelected(false); + } + else + { + m_controlTimer.setVisible( false ); + + if(app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin)>0) + { + // Change to display the favorites if there are any. The current skin will be in there (probably) - need to check for it + m_currentPack = app.m_dlcManager.getPackContainingSkin(m_currentSkinPath); + bool bFound; + if(m_currentPack != NULL) + { + m_packIndex = app.m_dlcManager.getPackIndex(m_currentPack,bFound,DLCManager::e_DLCType_Skin) + SKIN_SELECT_MAX_DEFAULTS; + } + } + + // If we have any favourites, set this to the favourites + // first validate the favorite skins - we might have uninstalled the DLC needed for them + app.ValidateFavoriteSkins(m_iPad); + + if(app.GetPlayerFavoriteSkinsCount(m_iPad)>0) + { + m_packIndex = SKIN_SELECT_PACK_FAVORITES; + } + + handlePackIndexChanged(); + } + + // Display the tooltips + +#ifdef __PSVITA__ + InitializeCriticalSection(&m_DLCInstallCS); // to prevent a race condition between the install and the mounted callback +#endif + +} + +void UIScene_SkinSelectMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, m_bNoSkinsToShow?-1:IDS_TOOLTIPS_SELECT_SKIN,IDS_TOOLTIPS_CANCEL,-1,-1,-1,-1,-1,-1,IDS_TOOLTIPS_NAVIGATE); +} + +void UIScene_SkinSelectMenu::updateComponents() +{ + m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); +} + +wstring UIScene_SkinSelectMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"SkinSelectMenuSplit"; + } + else + { + return L"SkinSelectMenu"; + } +} + +void UIScene_SkinSelectMenu::tick() +{ + UIScene::tick(); + + if(m_bSkinIndexChanged) + { + m_bSkinIndexChanged = false; + handleSkinIndexChanged(); + } + + // check for new DLC installed + + // check for the patch error dialog +#ifdef __ORBIS__ + + // process the error dialog (for a patch being available) + if(m_bErrorDialogRunning) + { + SceErrorDialogStatus stat = sceErrorDialogUpdateStatus(); + if( stat == SCE_ERROR_DIALOG_STATUS_FINISHED ) + { + sceErrorDialogTerminate(); + m_bErrorDialogRunning=false; + } + } + +#endif +} + +void UIScene_SkinSelectMenu::handleAnimationEnd() +{ + if(m_bSlidingSkins) + { + m_bSlidingSkins = false; + + m_characters[eCharacter_Current].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Forward, false); + m_characters[eCharacter_Next1].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Left, false); + m_characters[eCharacter_Previous1].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Right, false); + + m_bSkinIndexChanged = true; + //handleSkinIndexChanged(); + + m_bAnimatingMove = false; + } +} + +void UIScene_SkinSelectMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if (m_bIgnoreInput) return; + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed) + { + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + app.CheckGameSettingsChanged(true,iPad); + navigateBack(); + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + if(pressed) + { + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + // if the profile data has been changed, then force a profile write + // It seems we're allowed to break the 5 minute rule if it's the result of a user action + switch(m_packIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + app.SetPlayerSkin(iPad, m_skinIndex); + app.SetPlayerCape(iPad, 0); + m_currentSkinPath = app.GetPlayerSkinName(iPad); + m_originalSkinId = app.GetPlayerSkinId(iPad); + setCharacterSelected(true); + ui.PlayUISFX(eSFX_Press); + break; + case SKIN_SELECT_PACK_FAVORITES: + if(app.GetPlayerFavoriteSkinsCount(iPad)>0) + { + // get the pack number from the skin id + wchar_t chars[256]; + swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(iPad,m_skinIndex)); + + DLCPack *Pack=app.m_dlcManager.getPackContainingSkin(chars); + + if(Pack) + { + DLCSkinFile *skinFile = Pack->getSkinFile(chars); + app.SetPlayerSkin(iPad, skinFile->getPath()); + app.SetPlayerCape(iPad, skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape)); + setCharacterSelected(true); + m_currentSkinPath = app.GetPlayerSkinName(iPad); + m_originalSkinId = app.GetPlayerSkinId(iPad); + app.SetPlayerFavoriteSkinsPos(iPad,m_skinIndex); + } + } + break; + default: + if( m_currentPack != NULL ) + { + DLCSkinFile *skinFile = m_currentPack->getSkinFile(m_skinIndex); + + if ( !skinFile->getParameterAsBool( DLCManager::e_DLCParamType_Free ) // Is this a free skin? + && !m_currentPack->hasPurchasedFile( DLCManager::e_DLCType_Skin, skinFile->getPath() ) // do we have a license? + ) + { + // 4J-PB - check for a patch +#ifdef __ORBIS__ + // 4J-PB - Check if there is a patch for the game + int errorCode = ProfileManager.getNPAvailability(ProfileManager.GetPrimaryPad()); + + bool bPatchAvailable; + switch(errorCode) + { + case SCE_NP_ERROR_LATEST_PATCH_PKG_EXIST: + case SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED: + bPatchAvailable=true; + break; + default: + bPatchAvailable=false; + break; + } + + if(bPatchAvailable) + { + int32_t ret=sceErrorDialogInitialize(); + m_bErrorDialogRunning=true; + if ( ret==SCE_OK ) + { + SceErrorDialogParam param; + sceErrorDialogParamInitialize( ¶m ); + // 4J-PB - We want to display the option to get the patch now + param.errorCode = SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED;//pClass->m_errorCode; + ret = sceUserServiceGetInitialUser( ¶m.userId ); + if ( ret == SCE_OK ) + { + ret=sceErrorDialogOpen( ¶m ); + break; + } + } + } +#endif + + // no + UINT uiIDA[1] = { IDS_OK }; +#ifdef __ORBIS__ + // Check if PSN is unavailable because of age restriction + int npAvailability = ProfileManager.getNPAvailability(iPad); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + } + else +#endif + // We need to upsell the full version + if(ProfileManager.IsGuest(iPad)) + { + // can't buy + ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1,iPad,NULL,NULL,app.GetStringTable(),NULL,0,false); + } + // are we online? + else if(!ProfileManager.IsSignedInLive(iPad)) + { + showNotOnlineDialog(iPad); + } + else + { + // upsell +#ifdef _XBOX + DLC_INFO *pDLCInfo = app.GetDLCInfoForTrialOfferID(m_currentPack->getPurchaseOfferId()); + ULONGLONG ullOfferID_Full; + + if(pDLCInfo!=NULL) + { + ullOfferID_Full=pDLCInfo->ullOfferID_Full; + } + else + { + ullOfferID_Full=m_currentPack->getPurchaseOfferId(); + } + + // tell sentient about the upsell of the full version of the skin pack + TelemetryManager->RecordUpsellPresented(iPad, eSet_UpsellID_Skin_DLC, ullOfferID_Full & 0xFFFFFFFF); +#endif + bool bContentRestricted=false; +#if defined(__PS3__) || defined(__PSVITA__) + ProfileManager.GetChatAndContentRestrictions(m_iPad,true,NULL,&bContentRestricted,NULL); +#endif + if(bContentRestricted) + { +#if !(defined(_XBOX) || defined(_WIN64)) // 4J Stu - Temp to get the win build running, but so we check this for other platforms + // you can't see the store + UINT uiIDA[1] = { IDS_CONFIRM_OK }; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad,NULL,this, app.GetStringTable(),NULL,0,false); +#endif + } + else + { + // 4J-PB - need to check for an empty store +#if defined __ORBIS__ || defined __PSVITA__ || defined __PS3__ + if(app.CheckForEmptyStore(iPad)==false) +#endif + { + this->m_bIgnoreInput = true; + + UINT uiIDA[2] = { IDS_CONFIRM_OK, IDS_CONFIRM_CANCEL }; + ui.RequestMessageBox(IDS_UNLOCK_DLC_TITLE, IDS_UNLOCK_DLC_SKIN, uiIDA, 2, iPad,&UIScene_SkinSelectMenu::UnlockSkinReturned,this,app.GetStringTable(),NULL,0,false); + } + } + } + } + else + { + app.SetPlayerSkin(iPad, skinFile->getPath()); + app.SetPlayerCape(iPad, skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape)); + setCharacterSelected(true); + m_currentSkinPath = app.GetPlayerSkinName(iPad); + m_originalSkinId = app.GetPlayerSkinId(iPad); + + // push this onto the favorite list + AddFavoriteSkin(iPad,GET_DLC_SKIN_ID_FROM_BITMASK(m_originalSkinId)); + } + } + + ui.PlayUISFX(eSFX_Press); + break; + } + } + break; + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + if(pressed) + { + if(m_packIndex==SKIN_SELECT_PACK_FAVORITES) + { + if(app.GetPlayerFavoriteSkinsCount(iPad)==0) + { + // ignore this, since there are no skins being displayed + break; + } + } + + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + ui.PlayUISFX(eSFX_Scroll); + switch(m_currentNavigation) + { + case eSkinNavigation_Pack: + m_currentNavigation = eSkinNavigation_Skin; + break; + case eSkinNavigation_Skin: + m_currentNavigation = eSkinNavigation_Pack; + break; + }; + sendInputToMovie(key, repeat, pressed, released); + } + break; + case ACTION_MENU_LEFT: + if(pressed) + { + if( m_currentNavigation == eSkinNavigation_Skin ) + { + if(!m_bAnimatingMove) + { + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + ui.PlayUISFX(eSFX_Scroll); + + m_skinIndex = getPreviousSkinIndex(m_skinIndex); + //handleSkinIndexChanged(); + + m_bSlidingSkins = true; + m_bAnimatingMove = true; + + m_characters[eCharacter_Current].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Left, true); + m_characters[eCharacter_Previous1].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Forward, true); + + // 4J Stu - Swapped nav buttons + sendInputToMovie(ACTION_MENU_RIGHT, repeat, pressed, released); + } + } + else if( m_currentNavigation == eSkinNavigation_Pack ) + { + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + ui.PlayUISFX(eSFX_Scroll); + DWORD startingIndex = m_packIndex; + m_packIndex = getPreviousPackIndex(m_packIndex); + if(startingIndex != m_packIndex) + { + handlePackIndexChanged(); + } + } + } + break; + case ACTION_MENU_RIGHT: + if(pressed) + { + if( m_currentNavigation == eSkinNavigation_Skin ) + { + if(!m_bAnimatingMove) + { + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + ui.PlayUISFX(eSFX_Scroll); + m_skinIndex = getNextSkinIndex(m_skinIndex); + //handleSkinIndexChanged(); + + m_bSlidingSkins = true; + m_bAnimatingMove = true; + + m_characters[eCharacter_Current].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Right, true); + m_characters[eCharacter_Next1].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Forward, true); + + // 4J Stu - Swapped nav buttons + sendInputToMovie(ACTION_MENU_LEFT, repeat, pressed, released); + } + } + else if( m_currentNavigation == eSkinNavigation_Pack ) + { + ui.AnimateKeyPress(iPad, key, repeat, pressed, released); + ui.PlayUISFX(eSFX_Scroll); + DWORD startingIndex = m_packIndex; + m_packIndex = getNextPackIndex(m_packIndex); + if(startingIndex != m_packIndex) + { + handlePackIndexChanged(); + } + } + } + break; + case ACTION_MENU_OTHER_STICK_PRESS: + if(pressed) + { + ui.PlayUISFX(eSFX_Press); + if( m_currentNavigation == eSkinNavigation_Skin ) + { + m_characters[eCharacter_Current].ResetRotation(); + } + } + break; + case ACTION_MENU_OTHER_STICK_LEFT: + if(pressed) + { + if( m_currentNavigation == eSkinNavigation_Skin ) + { + m_characters[eCharacter_Current].m_incYRot = true; + } + else + { + ui.PlayUISFX(eSFX_Scroll); + } + } + else if(released) + { + m_characters[eCharacter_Current].m_incYRot = false; + } + break; + case ACTION_MENU_OTHER_STICK_RIGHT: + if(pressed) + { + if( m_currentNavigation == eSkinNavigation_Skin ) + { + m_characters[eCharacter_Current].m_decYRot = true; + } + else + { + ui.PlayUISFX(eSFX_Scroll); + } + } + else if(released) + { + m_characters[eCharacter_Current].m_decYRot = false; + } + break; + case ACTION_MENU_OTHER_STICK_UP: + if(pressed) + { + if( m_currentNavigation == eSkinNavigation_Skin ) + { + //m_previewControl->m_incXRot = true; + m_characters[eCharacter_Current].CyclePreviousAnimation(); + } + else + { + ui.PlayUISFX(eSFX_Scroll); + } + } + break; + case ACTION_MENU_OTHER_STICK_DOWN: + if(pressed) + { + if( m_currentNavigation == eSkinNavigation_Skin ) + { + //m_previewControl->m_decXRot = true; + m_characters[eCharacter_Current].CycleNextAnimation(); + } + else + { + ui.PlayUISFX(eSFX_Scroll); + } + } + break; + } +} + +void UIScene_SkinSelectMenu::InputActionOK(unsigned int iPad) +{ + ui.AnimateKeyPress(iPad, ACTION_MENU_OK, false, true, false); + + // if the profile data has been changed, then force a profile write + // It seems we're allowed to break the 5 minute rule if it's the result of a user action + switch(m_packIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + app.SetPlayerSkin(iPad, m_skinIndex); + app.SetPlayerCape(iPad, 0); + m_currentSkinPath = app.GetPlayerSkinName(iPad); + m_originalSkinId = app.GetPlayerSkinId(iPad); + setCharacterSelected(true); + ui.PlayUISFX(eSFX_Press); + break; + case SKIN_SELECT_PACK_FAVORITES: + if(app.GetPlayerFavoriteSkinsCount(iPad)>0) + { + // get the pack number from the skin id + wchar_t chars[256]; + swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(iPad,m_skinIndex)); + + DLCPack *Pack=app.m_dlcManager.getPackContainingSkin(chars); + + if(Pack) + { + DLCSkinFile *skinFile = Pack->getSkinFile(chars); + app.SetPlayerSkin(iPad, skinFile->getPath()); + app.SetPlayerCape(iPad, skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape)); + setCharacterSelected(true); + m_currentSkinPath = app.GetPlayerSkinName(iPad); + m_originalSkinId = app.GetPlayerSkinId(iPad); + app.SetPlayerFavoriteSkinsPos(iPad,m_skinIndex); + } +} + break; + default: + if( m_currentPack != NULL ) + { + bool renableInputAfterOperation = true; + m_bIgnoreInput = true; + + DLCSkinFile *skinFile = m_currentPack->getSkinFile(m_skinIndex); + + // Is this a free skin? + + if(!skinFile->getParameterAsBool( DLCManager::e_DLCParamType_Free )) + { + // do we have a license? + //if(true) + if(!m_currentPack->hasPurchasedFile( DLCManager::e_DLCType_Skin, skinFile->getPath() )) + { + // no + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + + // We need to upsell the full version + if(ProfileManager.IsGuest(iPad)) + { + // can't buy + ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1,iPad,NULL,NULL,app.GetStringTable(),NULL,0,false); + } +#if defined(__PS3__) || defined(__ORBIS__) + // are we online? + else if(!ProfileManager.IsSignedInLive(iPad)) + { + showNotOnlineDialog(iPad); + } +#endif + else + { + // upsell +#ifdef _XBOX + DLC_INFO *pDLCInfo = app.GetDLCInfoForTrialOfferID(m_currentPack->getPurchaseOfferId()); + ULONGLONG ullOfferID_Full; + + if(pDLCInfo!=NULL) + { + ullOfferID_Full=pDLCInfo->ullOfferID_Full; + } + else + { + ullOfferID_Full=m_currentPack->getPurchaseOfferId(); + } + + // tell sentient about the upsell of the full version of the skin pack + SentientManager.RecordUpsellPresented(iPad, eSet_UpsellID_Skin_DLC, ullOfferID_Full & 0xFFFFFFFF); +#endif + bool bContentRestricted=false; +#if defined(__PS3__) || defined(__PSVITA__) + ProfileManager.GetChatAndContentRestrictions(m_iPad,true,NULL,&bContentRestricted,NULL); +#endif + if(bContentRestricted) + { +#if !(defined(_XBOX) || defined(_WIN64)) // 4J Stu - Temp to get the win build running, but so we check this for other platforms + // you can't see the store + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,this, app.GetStringTable(),NULL,0,false); +#endif + } + else + { + // 4J-PB - need to check for an empty store +#if defined __ORBIS__ || defined __PSVITA__ || defined __PS3__ + if(app.CheckForEmptyStore(iPad)==false) +#endif + { + m_bIgnoreInput = true; + renableInputAfterOperation = false; + + UINT uiIDA[2] = { IDS_CONFIRM_OK, IDS_CONFIRM_CANCEL }; + ui.RequestMessageBox(IDS_UNLOCK_DLC_TITLE, IDS_UNLOCK_DLC_SKIN, uiIDA, 2, iPad,&UIScene_SkinSelectMenu::UnlockSkinReturned,this,app.GetStringTable(),NULL,0,false); + } + } + } + } + else + { + app.SetPlayerSkin(iPad, skinFile->getPath()); + app.SetPlayerCape(iPad, skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape)); + setCharacterSelected(true); + m_currentSkinPath = app.GetPlayerSkinName(iPad); + m_originalSkinId = app.GetPlayerSkinId(iPad); + + // push this onto the favorite list + AddFavoriteSkin(m_iPad,GET_DLC_SKIN_ID_FROM_BITMASK(m_originalSkinId)); + } + } + else + { + app.SetPlayerSkin(iPad, skinFile->getPath()); + app.SetPlayerCape(iPad, skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape)); + setCharacterSelected(true); + m_currentSkinPath = app.GetPlayerSkinName(iPad); + m_originalSkinId = app.GetPlayerSkinId(iPad); + + // push this onto the favorite list + AddFavoriteSkin(iPad,GET_DLC_SKIN_ID_FROM_BITMASK(m_originalSkinId)); + } + + if (renableInputAfterOperation) m_bIgnoreInput = false; + } + + ui.PlayUISFX(eSFX_Press); + break; + } +} + +void UIScene_SkinSelectMenu::customDraw(IggyCustomDrawCallbackRegion *region) +{ + int characterId = -1; + swscanf((wchar_t*)region->name,L"Character%d",&characterId); + if (characterId == -1) + { + app.DebugPrintf("Invalid character to render found\n"); + } + else + { + // Setup GDraw, normal game render states and matrices + CustomDrawData *customDrawRegion = ui.setupCustomDraw(this,region); + delete customDrawRegion; + + //app.DebugPrintf("Scissor x0= %d, y0= %d, x1= %d, y1= %d\n", region->scissor_x0, region->scissor_y0, region->scissor_x1, region->scissor_y1); + //app.DebugPrintf("Stencil mask= %d, stencil ref= %d, stencil write= %d\n", region->stencil_func_mask, region->stencil_func_ref, region->stencil_write_mask); +#ifdef __PS3__ + if(region->stencil_func_ref != 0) RenderManager.StateSetStencil(GL_EQUAL,region->stencil_func_ref,region->stencil_func_mask); +#elif __PSVITA__ + // AP - make sure the skins are only drawn inside the smokey panel + if(region->stencil_func_ref != 0) RenderManager.StateSetStencil(SCE_GXM_STENCIL_FUNC_EQUAL,region->stencil_func_mask,region->stencil_write_mask); +#else + if(region->stencil_func_ref != 0) RenderManager.StateSetStencil(GL_EQUAL,region->stencil_func_ref, region->stencil_func_mask,region->stencil_write_mask); +#endif + m_characters[characterId].render(region); + + // Finish GDraw and anything else that needs to be finalised + ui.endCustomDraw(region); + } +} + +void UIScene_SkinSelectMenu::handleSkinIndexChanged() +{ + BOOL showPrevious = FALSE, showNext = FALSE; + DWORD previousIndex = 0, nextIndex = 0; + wstring skinName = L""; + wstring skinOrigin = L""; + bool bSkinIsFree=false; + bool bLicensed=false; + DLCSkinFile *skinFile=NULL; + DLCPack *Pack=NULL; + BYTE sidePreviewControlsL,sidePreviewControlsR; + m_bNoSkinsToShow=false; + + TEXTURE_NAME backupTexture = TN_MOB_CHAR; + + setCharacterSelected(false); + + m_controlSkinNamePlate.setVisible( false ); + + if( m_currentPack != NULL ) + { + skinFile = m_currentPack->getSkinFile(m_skinIndex); + m_selectedSkinPath = skinFile->getPath(); + m_selectedCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape); + m_vAdditionalSkinBoxes = skinFile->getAdditionalBoxes(); + + skinName = skinFile->getParameterAsString( DLCManager::e_DLCParamType_DisplayName ); + skinOrigin = skinFile->getParameterAsString( DLCManager::e_DLCParamType_ThemeName ); + + if( m_selectedSkinPath.compare( m_currentSkinPath ) == 0 ) + { + setCharacterSelected(true); + } + + bSkinIsFree = skinFile->getParameterAsBool( DLCManager::e_DLCParamType_Free ); + bLicensed = m_currentPack->hasPurchasedFile( DLCManager::e_DLCType_Skin, m_selectedSkinPath ); + + setCharacterLocked(!(bSkinIsFree || bLicensed)); + + m_characters[eCharacter_Current].setVisible(true); + m_controlSkinNamePlate.setVisible( true ); + } + else + { + m_selectedSkinPath = L""; + m_selectedCapePath = L""; + m_vAdditionalSkinBoxes = NULL; + + switch(m_packIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + backupTexture = getTextureId(m_skinIndex); + + if( m_skinIndex == eDefaultSkins_ServerSelected ) + { + skinName = app.GetString(IDS_DEFAULT_SKINS); + } + else + { + skinName = wchDefaultNamesA[m_skinIndex]; + } + + if( m_originalSkinId == m_skinIndex ) + { + setCharacterSelected(true); + } + setCharacterLocked(false); + setCharacterLocked(false); + + m_characters[eCharacter_Current].setVisible(true); + m_controlSkinNamePlate.setVisible( true ); + + break; + case SKIN_SELECT_PACK_FAVORITES: + + if(app.GetPlayerFavoriteSkinsCount(m_iPad)>0) + { + // get the pack number from the skin id + wchar_t chars[256]; + swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(m_iPad,m_skinIndex)); + + Pack=app.m_dlcManager.getPackContainingSkin(chars); + if(Pack) + { + skinFile = Pack->getSkinFile(chars); + + m_selectedSkinPath = skinFile->getPath(); + m_selectedCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape); + m_vAdditionalSkinBoxes = skinFile->getAdditionalBoxes(); + + skinName = skinFile->getParameterAsString( DLCManager::e_DLCParamType_DisplayName ); + skinOrigin = skinFile->getParameterAsString( DLCManager::e_DLCParamType_ThemeName ); + + if( m_selectedSkinPath.compare( m_currentSkinPath ) == 0 ) + { + setCharacterSelected(true); + } + + bSkinIsFree = skinFile->getParameterAsBool( DLCManager::e_DLCParamType_Free ); + bLicensed = Pack->hasPurchasedFile( DLCManager::e_DLCType_Skin, m_selectedSkinPath ); + + setCharacterLocked(!(bSkinIsFree || bLicensed)); + m_controlSkinNamePlate.setVisible( true ); + } + else + { + setCharacterSelected(false); + setCharacterLocked(false); + } + } + else + { + //disable the display + m_characters[eCharacter_Current].setVisible(false); + + // change the tooltips + m_bNoSkinsToShow=true; + } + break; + } + } + + m_labelSkinName.setLabel(skinName); + m_labelSkinOrigin.setLabel(skinOrigin); + + + if(m_vAdditionalSkinBoxes && m_vAdditionalSkinBoxes->size()!=0) + { + // add the boxes to the humanoid model, but only if we've not done this already + + vector *pAdditionalModelParts = app.GetAdditionalModelParts(skinFile->getSkinID()); + if(pAdditionalModelParts==NULL) + { + pAdditionalModelParts = app.SetAdditionalSkinBoxes(skinFile->getSkinID(),m_vAdditionalSkinBoxes); + } + } + + if(skinFile!=NULL) + { + app.SetAnimOverrideBitmask(skinFile->getSkinID(),skinFile->getAnimOverrideBitmask()); + } + + m_characters[eCharacter_Current].SetTexture(m_selectedSkinPath, backupTexture); + m_characters[eCharacter_Current].SetCapeTexture(m_selectedCapePath); + + showNext = TRUE; + showPrevious = TRUE; + nextIndex = getNextSkinIndex(m_skinIndex); + previousIndex = getPreviousSkinIndex(m_skinIndex); + + wstring otherSkinPath = L""; + wstring otherCapePath = L""; + vector *othervAdditionalSkinBoxes=NULL; + wchar_t chars[256]; + + // turn off all displays + for(unsigned int i = eCharacter_Current + 1; i < eCharacter_COUNT; ++i) + { + m_characters[i].setVisible(false); + } + + unsigned int uiCurrentFavoriteC=app.GetPlayerFavoriteSkinsCount(m_iPad); + + if(m_packIndex==SKIN_SELECT_PACK_FAVORITES) + { + // might not be enough to cycle through + if(uiCurrentFavoriteC<((sidePreviewControls*2)+1)) + { + if(uiCurrentFavoriteC==0) + { + sidePreviewControlsL=sidePreviewControlsR=0; + } + // might be an odd number + else if((uiCurrentFavoriteC-1)%2==1) + { + sidePreviewControlsL=1+(uiCurrentFavoriteC-1)/2; + sidePreviewControlsR=(uiCurrentFavoriteC-1)/2; + } + else + { + sidePreviewControlsL=sidePreviewControlsR=(uiCurrentFavoriteC-1)/2; + } + } + else + { + sidePreviewControlsL=sidePreviewControlsR=sidePreviewControls; + } + } + else + { + sidePreviewControlsL=sidePreviewControlsR=sidePreviewControls; + } + + for(BYTE i = 0; i < sidePreviewControlsR; ++i) + { + if(showNext) + { + skinFile=NULL; + + m_characters[eCharacter_Next1 + i].setVisible(true); + + if( m_currentPack != NULL ) + { + skinFile = m_currentPack->getSkinFile(nextIndex); + otherSkinPath = skinFile->getPath(); + otherCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape); + othervAdditionalSkinBoxes = skinFile->getAdditionalBoxes(); + backupTexture = TN_MOB_CHAR; + } + else + { + otherSkinPath = L""; + otherCapePath = L""; + othervAdditionalSkinBoxes=NULL; + switch(m_packIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + backupTexture = getTextureId(nextIndex); + break; + case SKIN_SELECT_PACK_FAVORITES: + if(uiCurrentFavoriteC>0) + { + // get the pack number from the skin id + swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(m_iPad,nextIndex)); + + Pack=app.m_dlcManager.getPackContainingSkin(chars); + if(Pack) + { + skinFile = Pack->getSkinFile(chars); + + otherSkinPath = skinFile->getPath(); + otherCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape); + othervAdditionalSkinBoxes = skinFile->getAdditionalBoxes(); + backupTexture = TN_MOB_CHAR; + } + } + break; + default: + break; + } + + } + if(othervAdditionalSkinBoxes && othervAdditionalSkinBoxes->size()!=0) + { + vector *pAdditionalModelParts = app.GetAdditionalModelParts(skinFile->getSkinID()); + if(pAdditionalModelParts==NULL) + { + pAdditionalModelParts = app.SetAdditionalSkinBoxes(skinFile->getSkinID(),othervAdditionalSkinBoxes); + } + } + // 4J-PB - anim override needs set before SetTexture + if(skinFile!=NULL) + { + app.SetAnimOverrideBitmask(skinFile->getSkinID(),skinFile->getAnimOverrideBitmask()); + } + m_characters[eCharacter_Next1 + i].SetTexture(otherSkinPath, backupTexture); + m_characters[eCharacter_Next1 + i].SetCapeTexture(otherCapePath); + } + + nextIndex = getNextSkinIndex(nextIndex); + } + + + + for(BYTE i = 0; i < sidePreviewControlsL; ++i) + { + if(showPrevious) + { + skinFile=NULL; + + m_characters[eCharacter_Previous1 + i].setVisible(true); + + if( m_currentPack != NULL ) + { + skinFile = m_currentPack->getSkinFile(previousIndex); + otherSkinPath = skinFile->getPath(); + otherCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape); + othervAdditionalSkinBoxes = skinFile->getAdditionalBoxes(); + backupTexture = TN_MOB_CHAR; + } + else + { + otherSkinPath = L""; + otherCapePath = L""; + othervAdditionalSkinBoxes=NULL; + switch(m_packIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + backupTexture = getTextureId(previousIndex); + break; + case SKIN_SELECT_PACK_FAVORITES: + if(uiCurrentFavoriteC>0) + { + // get the pack number from the skin id + swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(m_iPad,previousIndex)); + + Pack=app.m_dlcManager.getPackContainingSkin(chars); + if(Pack) + { + skinFile = Pack->getSkinFile(chars); + + otherSkinPath = skinFile->getPath(); + otherCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape); + othervAdditionalSkinBoxes = skinFile->getAdditionalBoxes(); + backupTexture = TN_MOB_CHAR; + } + } + + break; + default: + break; + } + } + if(othervAdditionalSkinBoxes && othervAdditionalSkinBoxes->size()!=0) + { + vector *pAdditionalModelParts = app.GetAdditionalModelParts(skinFile->getSkinID()); + if(pAdditionalModelParts==NULL) + { + pAdditionalModelParts = app.SetAdditionalSkinBoxes(skinFile->getSkinID(),othervAdditionalSkinBoxes); + } + } + // 4J-PB - anim override needs set before SetTexture + if(skinFile) + { + app.SetAnimOverrideBitmask(skinFile->getSkinID(),skinFile->getAnimOverrideBitmask()); + } + m_characters[eCharacter_Previous1 + i].SetTexture(otherSkinPath, backupTexture); + m_characters[eCharacter_Previous1 + i].SetCapeTexture(otherCapePath); + } + + previousIndex = getPreviousSkinIndex(previousIndex); + } + + updateTooltips(); +} + +TEXTURE_NAME UIScene_SkinSelectMenu::getTextureId(int skinIndex) +{ + TEXTURE_NAME texture = TN_MOB_CHAR; + switch(skinIndex) + { + case eDefaultSkins_ServerSelected: + case eDefaultSkins_Skin0: + texture = TN_MOB_CHAR; + break; + case eDefaultSkins_Skin1: + texture = TN_MOB_CHAR1; + break; + case eDefaultSkins_Skin2: + texture = TN_MOB_CHAR2; + break; + case eDefaultSkins_Skin3: + texture = TN_MOB_CHAR3; + break; + case eDefaultSkins_Skin4: + texture = TN_MOB_CHAR4; + break; + case eDefaultSkins_Skin5: + texture = TN_MOB_CHAR5; + break; + case eDefaultSkins_Skin6: + texture = TN_MOB_CHAR6; + break; + case eDefaultSkins_Skin7: + texture = TN_MOB_CHAR7; + break; + }; + + return texture; +} + +int UIScene_SkinSelectMenu::getNextSkinIndex(DWORD sourceIndex) +{ + int nextSkin = sourceIndex; + + // special case for favourites + switch(m_packIndex) + { + + case SKIN_SELECT_PACK_FAVORITES: + ++nextSkin; + if(nextSkin>=app.GetPlayerFavoriteSkinsCount(m_iPad)) + { + nextSkin=0; + } + + break; + default: + ++nextSkin; + + if(m_packIndex == SKIN_SELECT_PACK_DEFAULT && nextSkin >= eDefaultSkins_Count) + { + nextSkin = eDefaultSkins_ServerSelected; + } + else if(m_currentPack != NULL && nextSkin>=m_currentPack->getSkinCount()) + { + nextSkin = 0; + } + break; + } + + + return nextSkin; +} + +int UIScene_SkinSelectMenu::getPreviousSkinIndex(DWORD sourceIndex) +{ + int previousSkin = sourceIndex; + switch(m_packIndex) + { + + case SKIN_SELECT_PACK_FAVORITES: + if(previousSkin==0) + { + previousSkin = app.GetPlayerFavoriteSkinsCount(m_iPad) - 1; + } + else + { + --previousSkin; + } + break; + default: + if(previousSkin==0) + { + if(m_packIndex == SKIN_SELECT_PACK_DEFAULT) + { + previousSkin = eDefaultSkins_Count - 1; + } + else if(m_currentPack != NULL) + { + previousSkin = m_currentPack->getSkinCount()-1; + } + } + else + { + --previousSkin; + } + break; + } + + + return previousSkin; +} + +void UIScene_SkinSelectMenu::handlePackIndexChanged() +{ + if(m_packIndex >= SKIN_SELECT_MAX_DEFAULTS) + { + m_currentPack = app.m_dlcManager.getPack(m_packIndex - SKIN_SELECT_MAX_DEFAULTS, DLCManager::e_DLCType_Skin); + } + else + { + m_currentPack = NULL; + } + m_skinIndex = 0; + if(m_currentPack != NULL) + { + bool found; + DWORD currentSkinIndex = m_currentPack->getSkinIndexAt(m_currentSkinPath, found); + if(found) m_skinIndex = currentSkinIndex; + } + else + { + switch(m_packIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + if( !GET_IS_DLC_SKIN_FROM_BITMASK(m_originalSkinId) ) + { + DWORD ugcSkinIndex = GET_UGC_SKIN_ID_FROM_BITMASK(m_originalSkinId); + DWORD defaultSkinIndex = GET_DEFAULT_SKIN_ID_FROM_BITMASK(m_originalSkinId); + if( ugcSkinIndex == 0 ) + { + m_skinIndex = (EDefaultSkins) defaultSkinIndex; + } + } + break; + case SKIN_SELECT_PACK_FAVORITES: + if(app.GetPlayerFavoriteSkinsCount(m_iPad)>0) + { + bool found; + wchar_t chars[256]; + // get the pack number from the skin id + swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(m_iPad,app.GetPlayerFavoriteSkinsPos(m_iPad))); + + DLCPack *Pack=app.m_dlcManager.getPackContainingSkin(chars); + if(Pack) + { + DWORD currentSkinIndex = Pack->getSkinIndexAt(m_currentSkinPath, found); + if(found) m_skinIndex = app.GetPlayerFavoriteSkinsPos(m_iPad); + } + } + break; + default: + break; + } + } + handleSkinIndexChanged(); + updatePackDisplay(); +} + +void UIScene_SkinSelectMenu::updatePackDisplay() +{ + m_currentPackCount = app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin) + SKIN_SELECT_MAX_DEFAULTS; + + if(m_packIndex >= SKIN_SELECT_MAX_DEFAULTS) + { + DLCPack *thisPack = app.m_dlcManager.getPack(m_packIndex - SKIN_SELECT_MAX_DEFAULTS, DLCManager::e_DLCType_Skin); + setCentreLabel(thisPack->getName().c_str()); + } + else + { + switch(m_packIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + setCentreLabel(app.GetString(IDS_NO_SKIN_PACK)); + break; + case SKIN_SELECT_PACK_FAVORITES: + setCentreLabel(app.GetString(IDS_FAVORITES_SKIN_PACK)); + break; + } + } + + int nextPackIndex = getNextPackIndex(m_packIndex); + if(nextPackIndex >= SKIN_SELECT_MAX_DEFAULTS) + { + DLCPack *thisPack = app.m_dlcManager.getPack(nextPackIndex - SKIN_SELECT_MAX_DEFAULTS, DLCManager::e_DLCType_Skin); + setRightLabel(thisPack->getName().c_str()); + } + else + { + switch(nextPackIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + setRightLabel(app.GetString(IDS_NO_SKIN_PACK)); + break; + case SKIN_SELECT_PACK_FAVORITES: + setRightLabel(app.GetString(IDS_FAVORITES_SKIN_PACK)); + break; + } + } + + int previousPackIndex = getPreviousPackIndex(m_packIndex); + if(previousPackIndex >= SKIN_SELECT_MAX_DEFAULTS) + { + DLCPack *thisPack = app.m_dlcManager.getPack(previousPackIndex - SKIN_SELECT_MAX_DEFAULTS, DLCManager::e_DLCType_Skin); + setLeftLabel(thisPack->getName().c_str()); + } + else + { + switch(previousPackIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + setLeftLabel(app.GetString(IDS_NO_SKIN_PACK)); + break; + case SKIN_SELECT_PACK_FAVORITES: + setLeftLabel(app.GetString(IDS_FAVORITES_SKIN_PACK)); + break; + } + } + +} + +int UIScene_SkinSelectMenu::getNextPackIndex(DWORD sourceIndex) +{ + int nextPack = sourceIndex; + ++nextPack; + if(nextPack > app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin) - 1 + SKIN_SELECT_MAX_DEFAULTS) + { + nextPack = SKIN_SELECT_PACK_DEFAULT; + } + + return nextPack; +} + +int UIScene_SkinSelectMenu::getPreviousPackIndex(DWORD sourceIndex) +{ + int previousPack = sourceIndex; + if (previousPack == SKIN_SELECT_PACK_DEFAULT) + { + DWORD packCount = app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin); + + if (packCount > 0) + { + previousPack = packCount + SKIN_SELECT_MAX_DEFAULTS - 1; + } + else + { + previousPack = SKIN_SELECT_MAX_DEFAULTS - 1; + } + } + else + { + --previousPack; + } + + return previousPack; +} + +void UIScene_SkinSelectMenu::setCharacterSelected(bool selected) +{ + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = selected; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetPlayerCharacterSelected , 1 , value ); +} + +void UIScene_SkinSelectMenu::setCharacterLocked(bool locked) +{ + IggyDataValue result; + IggyDataValue value[1]; + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = locked; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetCharacterLocked , 1 , value ); +} + +void UIScene_SkinSelectMenu::setLeftLabel(const wstring &label) +{ + if(label.compare(m_leftLabel) != 0) + { + m_leftLabel = label; + + IggyDataValue result; + IggyDataValue value[1]; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetLeftLabel , 1 , value ); + } +} + +void UIScene_SkinSelectMenu::setCentreLabel(const wstring &label) +{ + if(label.compare(m_centreLabel) != 0) + { + m_centreLabel = label; + + IggyDataValue result; + IggyDataValue value[1]; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetCentreLabel , 1 , value ); + } +} + +void UIScene_SkinSelectMenu::setRightLabel(const wstring &label) +{ + if(label.compare(m_rightLabel) != 0) + { + m_rightLabel = label; + + IggyDataValue result; + IggyDataValue value[1]; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)label.c_str(); + stringVal.length = label.length(); + + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetRightLabel , 1 , value ); + } +} + +#ifdef __PSVITA__ +void UIScene_SkinSelectMenu::handleTouchInput(unsigned int iPad, S32 x, S32 y, int iId, bool bPressed, bool bRepeat, bool bReleased) +{ + if(bPressed) + { + switch(iId) + { + case ETouchInput_TabLeft: + case ETouchInput_TabRight: + case ETouchInput_TabCenter: + // change to pack navigation if not already there! + if(m_currentNavigation != eSkinNavigation_Pack) + { + ui.PlayUISFX(eSFX_Scroll); + m_currentNavigation = eSkinNavigation_Pack; + sendInputToMovie(ACTION_MENU_UP, false, true, false); + } + break; + case ETouchInput_IggyCharacters: + if(m_packIndex == SKIN_SELECT_PACK_FAVORITES) + { + if(app.GetPlayerFavoriteSkinsCount(m_iPad)==0) + { + // ignore this, since there are no skins being displayed + break; + } + } + // change to skin navigation if not already there! + if(m_currentNavigation != eSkinNavigation_Skin) + { + ui.PlayUISFX(eSFX_Scroll); + m_currentNavigation = eSkinNavigation_Skin; + sendInputToMovie(ACTION_MENU_DOWN, false, true, false); + } + // remember touch x start + m_iTouchXStart = x; + m_bTouchScrolled = false; + break; + } + } + else if(bRepeat) + { + switch(iId) + { + case ETouchInput_TabLeft: + /* no action */ + break; + case ETouchInput_TabRight: + /* no action */ + break; + case ETouchInput_IggyCharacters: + if(m_currentNavigation != eSkinNavigation_Skin) + { + // not in skin select mode + break; + } + if(x < m_iTouchXStart - 50) + { + if(!m_bAnimatingMove && !m_bTouchScrolled) + { + ui.PlayUISFX(eSFX_Scroll); + m_skinIndex = getNextSkinIndex(m_skinIndex); + //handleSkinIndexChanged(); + + m_bSlidingSkins = true; + m_bAnimatingMove = true; + + m_characters[eCharacter_Current].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Right, true); + m_characters[eCharacter_Next1].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Forward, true); + + // 4J Stu - Swapped nav buttons + sendInputToMovie(ACTION_MENU_LEFT, false, true, false); + + m_bTouchScrolled = true; + } + } + else if(x > m_iTouchXStart + 50) + { + if(!m_bAnimatingMove && !m_bTouchScrolled) + { + ui.PlayUISFX(eSFX_Scroll); + + m_skinIndex = getPreviousSkinIndex(m_skinIndex); + //handleSkinIndexChanged(); + + m_bSlidingSkins = true; + m_bAnimatingMove = true; + + m_characters[eCharacter_Current].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Left, true); + m_characters[eCharacter_Previous1].SetFacing(UIControl_PlayerSkinPreview::e_SkinPreviewFacing_Forward, true); + + // 4J Stu - Swapped nav buttons + sendInputToMovie(ACTION_MENU_RIGHT, false, true, false); + + m_bTouchScrolled = true; + } + } + break; + } + } + else if(bReleased) + { + switch(iId) + { + case ETouchInput_TabLeft: + if( m_currentNavigation == eSkinNavigation_Pack ) + { + ui.PlayUISFX(eSFX_Scroll); + DWORD startingIndex = m_packIndex; + m_packIndex = getPreviousPackIndex(m_packIndex); + if(startingIndex != m_packIndex) + { + handlePackIndexChanged(); + } + } + break; + case ETouchInput_TabRight: + if( m_currentNavigation == eSkinNavigation_Pack ) + { + ui.PlayUISFX(eSFX_Scroll); + DWORD startingIndex = m_packIndex; + m_packIndex = getNextPackIndex(m_packIndex); + if(startingIndex != m_packIndex) + { + handlePackIndexChanged(); + } + } + break; + case ETouchInput_IggyCharacters: + if(!m_bTouchScrolled) + { + InputActionOK(iPad); + } + break; + } + } +} +#endif + +void UIScene_SkinSelectMenu::HandleDLCInstalled() +{ +#ifdef __PSVITA__ + EnterCriticalSection(&m_DLCInstallCS); // to prevent a race condition between the install and the mounted callback +#endif + + app.DebugPrintf(4,"UIScene_SkinSelectMenu::HandleDLCInstalled\n"); + // mounted DLC may have changed + if(app.StartInstallDLCProcess(m_iPad)==false) + { + // not doing a mount, so re-enable input + app.DebugPrintf(4,"UIScene_SkinSelectMenu::HandleDLCInstalled - not doing a mount, so re-enable input\n"); + m_bIgnoreInput=false; + } + else + { + m_bIgnoreInput=true; + m_controlTimer.setVisible( true ); + m_controlIggyCharacters.setVisible( false ); + m_controlSkinNamePlate.setVisible( false ); + } + + // this will send a CustomMessage_DLCMountingComplete when done + +#ifdef __PSVITA__ + LeaveCriticalSection(&m_DLCInstallCS); +#endif + +} + + +void UIScene_SkinSelectMenu::HandleDLCMountingComplete() +{ +#ifdef __PSVITA__ + EnterCriticalSection(&m_DLCInstallCS); // to prevent a race condition between the install and the mounted callback +#endif + app.DebugPrintf(4,"UIScene_SkinSelectMenu::HandleDLCMountingComplete\n"); + m_controlTimer.setVisible( false ); + m_controlIggyCharacters.setVisible( true ); + m_controlSkinNamePlate.setVisible( true ); + + m_packIndex = SKIN_SELECT_PACK_DEFAULT; + + if(app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin)>0) + { + m_currentPack = app.m_dlcManager.getPackContainingSkin(m_currentSkinPath); + if(m_currentPack != NULL) + { + bool bFound = false; + m_packIndex = app.m_dlcManager.getPackIndex(m_currentPack,bFound,DLCManager::e_DLCType_Skin) + SKIN_SELECT_MAX_DEFAULTS; + } + } + + // If we have any favourites, set this to the favourites + // first validate the favorite skins - we might have uninstalled the DLC needed for them + app.ValidateFavoriteSkins(m_iPad); + + if(app.GetPlayerFavoriteSkinsCount(m_iPad)>0) + { + m_packIndex = SKIN_SELECT_PACK_FAVORITES; + } + + handlePackIndexChanged(); + + m_bIgnoreInput=false; + app.m_dlcManager.checkForCorruptDLCAndAlert(); + bool bInGame=(Minecraft::GetInstance()->level!=NULL); + +#if TO_BE_IMPLEMENTED + if(bInGame) XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_AUTO); +#endif +#ifdef __PSVITA__ + LeaveCriticalSection(&m_DLCInstallCS); +#endif +} + +void UIScene_SkinSelectMenu::showNotOnlineDialog(int iPad) +{ + // need to be signed in to live. get them to sign in to online +#if defined(__PS3__) + SQRNetworkManager_PS3::AttemptPSNSignIn(NULL, this); + +#elif defined(__PSVITA__) + SQRNetworkManager_Vita::AttemptPSNSignIn(NULL, this); + +#elif defined(__ORBIS__) + SQRNetworkManager_Orbis::AttemptPSNSignIn(NULL, this, false, iPad); + +#elif defined(_DURANGO) + + UINT uiIDA[1] = { IDS_CONFIRM_OK }; + ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable() ); + +#endif +} + +int UIScene_SkinSelectMenu::UnlockSkinReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_SkinSelectMenu* pScene = (UIScene_SkinSelectMenu*)pParam; + + if ( (result == C4JStorage::EMessage_ResultAccept) + && ProfileManager.IsSignedIn(iPad) + ) + { + if (ProfileManager.IsSignedInLive(iPad)) + { +#if defined(__PS3__) || defined(__ORBIS__) || defined __PSVITA__ + // need to get info on the pack to see if the user has already downloaded it + + // retrieve the store name for the skin pack + wstring wStrPackName=pScene->m_currentPack->getName(); + const char *pchPackName=wstringtofilename(wStrPackName); + SONYDLC *pSONYDLCInfo=app.GetSONYDLCInfo((char *)pchPackName); + + if (pSONYDLCInfo != NULL) + { + char chName[42]; + char chKeyName[20]; + char chSkuID[SCE_NP_COMMERCE2_SKU_ID_LEN]; + + memset(chSkuID,0,SCE_NP_COMMERCE2_SKU_ID_LEN); + // find the info on the skin pack + // we have to retrieve the skuid from the store info, it can't be hardcoded since Sony may change it. + // So we assume the first sku for the product is the one we want + + // while the store is screwed, hardcode the sku + //sprintf(chName,"%s-%s-%s",app.GetCommerceCategory(),pSONYDLCInfo->chDLCKeyname,"EURO"); + + // MGH - keyname in the DLC file is 16 chars long, but there's no space for a NULL terminating char + memset(chKeyName, 0, sizeof(chKeyName)); + strncpy(chKeyName, pSONYDLCInfo->chDLCKeyname, 16); + +#ifdef __ORBIS__ + strcpy(chName, chKeyName); +#else + sprintf(chName,"%s-%s",app.GetCommerceCategory(),chKeyName); +#endif + app.GetDLCSkuIDFromProductList(chName,chSkuID); + +#if defined __ORBIS__ || defined __PSVITA__ || defined __PS3__ + if (app.CheckForEmptyStore(iPad) == false) +#endif + { + if (app.DLCAlreadyPurchased(chSkuID)) + { + app.DebugPrintf("Already purchased this DLC - DownloadAlreadyPurchased \n"); + app.DownloadAlreadyPurchased(chSkuID); + } + else + { + app.DebugPrintf("Not yet purchased this DLC - Checkout \n"); + app.Checkout(chSkuID); + } + } + // need to re-enable input because the user can back out of the store purchase, and we'll be stuck + pScene->m_bIgnoreInput = false; + } +#elif defined _XBOX_ONE + StorageManager.InstallOffer(1,(WCHAR *)(pScene->m_currentPack->getPurchaseOfferId().c_str()), &RenableInput, pScene, NULL); +#endif + } + else // Is signed in, but not live. + { + pScene->showNotOnlineDialog(iPad); + pScene->m_bIgnoreInput = false; + } + } + else + { + pScene->m_bIgnoreInput = false; + } + + return 0; +} + +int UIScene_SkinSelectMenu::RenableInput(LPVOID lpVoid, int, int) +{ + ((UIScene_SkinSelectMenu*) lpVoid)->m_bIgnoreInput = false; + return 0; +} + +void UIScene_SkinSelectMenu::AddFavoriteSkin(int iPad,int iSkinID) +{ + // Is this favorite skin already in the array? + unsigned int uiCurrentFavoriteSkinsCount=app.GetPlayerFavoriteSkinsCount(iPad); + + for(int i=0;i0) + { + ucPos++; + } + else + { + ucPos=0; + } + } + + app.SetPlayerFavoriteSkin(iPad,(int)ucPos,iSkinID); + app.SetPlayerFavoriteSkinsPos(m_iPad,ucPos); +} + + +void UIScene_SkinSelectMenu::handleReload() +{ + // Reinitialise a few values to prevent problems on reload + m_bIgnoreInput=false; + + m_currentNavigation = eSkinNavigation_Skin; + m_currentPackCount = 0; + + m_labelSkinName.init(L""); + m_labelSkinOrigin.init(L""); + + m_leftLabel = L""; + m_centreLabel = L""; + m_rightLabel = L""; + + handlePackIndexChanged(); +} + +#ifdef _XBOX_ONE +void UIScene_SkinSelectMenu::HandleDLCLicenseChange() +{ + // update the lock flag + handleSkinIndexChanged(); +} +#endif \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.h b/Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.h new file mode 100644 index 00000000..c9ed6691 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.h @@ -0,0 +1,189 @@ +#pragma once +#include "..\..\..\Minecraft.World\Definitions.h" +#include "UIScene.h" +#include "UIControl_PlayerSkinPreview.h" + +class UIScene_SkinSelectMenu : public UIScene +{ +private: + static WCHAR *wchDefaultNamesA[eDefaultSkins_Count]; + + // 4J Stu - How many to show on each side of the main control + static const BYTE sidePreviewControls = 4; + +#ifdef __PSVITA__ + enum ETouchInput + { + ETouchInput_TabLeft = 10, + ETouchInput_TabRight, + ETouchInput_TabCenter, + ETouchInput_IggyCharacters, + + ETouchInput_Count, + }; +#endif + + enum ESkinSelectNavigation + { + eSkinNavigation_Pack, + eSkinNavigation_Skin, + + eSkinNavigation_Count, + }; + + enum ECharacters + { + eCharacter_Current, + eCharacter_Next1, + eCharacter_Next2, + eCharacter_Next3, + eCharacter_Next4, + eCharacter_Previous1, + eCharacter_Previous2, + eCharacter_Previous3, + eCharacter_Previous4, + + eCharacter_COUNT, + }; + + UIControl_PlayerSkinPreview m_characters[eCharacter_COUNT]; + UIControl_Label m_labelSkinName, m_labelSkinOrigin; + UIControl_Label m_labelSelected; + UIControl m_controlSkinNamePlate, m_controlSelectedPanel, m_controlIggyCharacters, m_controlTimer; +#ifdef __PSVITA__ + UIControl_Touch m_TouchTabLeft, m_TouchTabRight, m_TouchTabCenter, m_TouchIggyCharacters; +#endif + IggyName m_funcSetPlayerCharacterSelected, m_funcSetCharacterLocked; + IggyName m_funcSetLeftLabel, m_funcSetRightLabel, m_funcSetCentreLabel; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) +#ifdef __PSVITA__ + UI_MAP_ELEMENT( m_TouchTabLeft, "TouchTabLeft" ) + UI_MAP_ELEMENT( m_TouchTabRight, "TouchTabRight" ) + UI_MAP_ELEMENT( m_TouchTabCenter, "TouchTabCenter" ) + UI_MAP_ELEMENT( m_TouchIggyCharacters, "TouchIggyCharacters" ) +#endif + UI_MAP_ELEMENT( m_controlSkinNamePlate, "SkinNamePlate") + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlSkinNamePlate ) + UI_MAP_ELEMENT( m_labelSkinName, "SkinTitle1") + UI_MAP_ELEMENT( m_labelSkinOrigin, "SkinTitle2") + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_ELEMENT( m_controlSelectedPanel, "SelectedPanel" ) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlSelectedPanel ) + UI_MAP_ELEMENT( m_labelSelected, "SelectedPanelLabel" ) + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_ELEMENT( m_controlTimer, "Timer" ) + + // 4J Stu - These aren't really used a AS3 controls, but adding here means that they get ticked by the scene + UI_MAP_ELEMENT( m_controlIggyCharacters, "IggyCharacters" ) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlIggyCharacters ) + UI_MAP_ELEMENT( m_characters[eCharacter_Current], "iggy_Character0" ) + + UI_MAP_ELEMENT( m_characters[eCharacter_Next1], "iggy_Character1" ) + UI_MAP_ELEMENT( m_characters[eCharacter_Next2], "iggy_Character2" ) + UI_MAP_ELEMENT( m_characters[eCharacter_Next3], "iggy_Character3" ) + UI_MAP_ELEMENT( m_characters[eCharacter_Next4], "iggy_Character4" ) + + UI_MAP_ELEMENT( m_characters[eCharacter_Previous1], "iggy_Character5" ) + UI_MAP_ELEMENT( m_characters[eCharacter_Previous2], "iggy_Character6" ) + UI_MAP_ELEMENT( m_characters[eCharacter_Previous3], "iggy_Character7" ) + UI_MAP_ELEMENT( m_characters[eCharacter_Previous4], "iggy_Character8" ) + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_NAME( m_funcSetPlayerCharacterSelected, L"SetPlayerCharacterSelected" ) + UI_MAP_NAME( m_funcSetCharacterLocked, L"SetCharacterLocked" ) + + UI_MAP_NAME( m_funcSetLeftLabel, L"SetLeftLabel" ) + UI_MAP_NAME( m_funcSetCentreLabel, L"SetCenterLabel" ) + UI_MAP_NAME( m_funcSetRightLabel, L"SetRightLabel" ) + UI_END_MAP_ELEMENTS_AND_NAMES() + + DLCPack *m_currentPack; + DWORD m_packIndex, m_skinIndex; + DWORD m_originalSkinId; + wstring m_currentSkinPath, m_selectedSkinPath, m_selectedCapePath; + vector *m_vAdditionalSkinBoxes; + + bool m_bSlidingSkins, m_bAnimatingMove; + ESkinSelectNavigation m_currentNavigation; + + bool m_bNoSkinsToShow; + DWORD m_currentPackCount; + bool m_bIgnoreInput; + bool m_bSkinIndexChanged; + wstring m_leftLabel, m_centreLabel, m_rightLabel; + + S32 m_iTouchXStart; + bool m_bTouchScrolled; +public: + UIScene_SkinSelectMenu(int iPad, void *initData, UILayer *parentLayer); +#ifdef __PSVITA__ + virtual ~UIScene_SkinSelectMenu() { DeleteCriticalSection(&m_DLCInstallCS); } +#endif + + virtual void tick(); + + virtual void updateTooltips(); + virtual void updateComponents(); + + virtual EUIScene getSceneType() { return eUIScene_SkinSelectMenu;} + + virtual void handleAnimationEnd(); + + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + virtual void customDraw(IggyCustomDrawCallbackRegion *region); + +private: + void handleSkinIndexChanged(); + int getNextSkinIndex(DWORD sourceIndex); + int getPreviousSkinIndex(DWORD sourceIndex); + + TEXTURE_NAME getTextureId(int skinIndex); + + void handlePackIndexChanged(); + void updatePackDisplay(); + int getNextPackIndex(DWORD sourceIndex); + int getPreviousPackIndex(DWORD sourceIndex); + + void setCharacterSelected(bool selected); + void setCharacterLocked(bool locked); + + void setLeftLabel(const wstring &label); + void setCentreLabel(const wstring &label); + void setRightLabel(const wstring &label); + + virtual void HandleDLCMountingComplete(); + virtual void HandleDLCInstalled(); +#ifdef _XBOX_ONE + virtual void HandleDLCLicenseChange(); +#endif + + void showNotOnlineDialog(int iPad); + + static int UnlockSkinReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int RenableInput(LPVOID lpVoid, int, int); + void AddFavoriteSkin(int iPad,int iSkinID); + + void InputActionOK(unsigned int iPad); +#ifdef __PSVITA__ + virtual void handleTouchInput(unsigned int iPad, S32 x, S32 y, int iId, bool bPressed, bool bRepeat, bool bReleased); +#endif //__PSVITA__ + virtual void handleReload(); + +#ifdef __ORBIS__ + bool m_bErrorDialogRunning; +#endif + +#ifdef __PSVITA__ + CRITICAL_SECTION m_DLCInstallCS; // to prevent a race condition between the install and the mounted callback +#endif +}; diff --git a/Minecraft.Client/Common/UI/UIScene_TeleportMenu.cpp b/Minecraft.Client/Common/UI/UIScene_TeleportMenu.cpp new file mode 100644 index 00000000..f6916d13 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_TeleportMenu.cpp @@ -0,0 +1,344 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_TeleportMenu.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\ClientConnection.h" +#include "TeleportCommand.h" + +UIScene_TeleportMenu::UIScene_TeleportMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + TeleportMenuInitData *initParam = (TeleportMenuInitData *)initData; + + m_teleportToPlayer = initParam->teleportToPlayer; + + delete initParam; + + if(m_teleportToPlayer) + { + m_labelTitle.init(app.GetString(IDS_TELEPORT_TO_PLAYER)); + } + else + { + m_labelTitle.init(app.GetString(IDS_TELEPORT_TO_ME)); + } + + m_playerList.init(eControl_GamePlayers); + + for(unsigned int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++i) + { + m_playerNames[i] = L""; + } + + DWORD playerCount = g_NetworkManager.GetPlayerCount(); + + m_playersCount = 0; + for(DWORD i = 0; i < playerCount; ++i) + { + INetworkPlayer *player = g_NetworkManager.GetPlayerByIndex( i ); + + if( player != NULL && !(player->IsLocal() && player->GetUserIndex() == m_iPad) ) + { + m_players[m_playersCount] = player->GetSmallId(); + ++m_playersCount; + + wstring playerName = L""; +#ifndef _CONTENT_PACKAGE + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<GetDisplayName(); + } + + int voiceStatus = 0; + if(player != NULL && player->HasVoice() ) + { + if( player->IsMutedByLocalUser(m_iPad) ) + { + // Muted image + voiceStatus = 3; + } + else if( player->IsTalking() ) + { + // Talking image + voiceStatus = 2; + } + else + { + // Not talking image + voiceStatus = 1; + } + } + + m_playersVoiceState[m_playersCount] = voiceStatus; + m_playersColourState[m_playersCount] = app.GetPlayerColour( m_players[m_playersCount] ); + m_playerNames[m_playersCount] = playerName; + m_playerList.addItem( playerName, app.GetPlayerColour( m_players[m_playersCount] ), voiceStatus); + } + } + + g_NetworkManager.RegisterPlayerChangedCallback(m_iPad, &UIScene_TeleportMenu::OnPlayerChanged, this); + + parentLayer->addComponent(iPad,eUIComponent_MenuBackground); + + // get rid of the quadrant display if it's on + ui.HidePressStart(); +} + +wstring UIScene_TeleportMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"InGameTeleportMenuSplit"; + } + else + { + return L"InGameTeleportMenu"; + } +} + +void UIScene_TeleportMenu::updateTooltips() +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); +} + +void UIScene_TeleportMenu::handleDestroy() +{ + g_NetworkManager.UnRegisterPlayerChangedCallback(m_iPad, &UIScene_TeleportMenu::OnPlayerChanged, this); + + m_parentLayer->removeComponent(eUIComponent_MenuBackground); +} + +void UIScene_TeleportMenu::handleGainFocus(bool navBack) +{ + if( navBack ) g_NetworkManager.RegisterPlayerChangedCallback(m_iPad, &UIScene_TeleportMenu::OnPlayerChanged, this); +} + +void UIScene_TeleportMenu::handleReload() +{ + DWORD playerCount = g_NetworkManager.GetPlayerCount(); + + m_playersCount = 0; + for(DWORD i = 0; i < playerCount; ++i) + { + INetworkPlayer *player = g_NetworkManager.GetPlayerByIndex( i ); + + if( player != NULL && !(player->IsLocal() && player->GetUserIndex() == m_iPad) ) + { + m_players[m_playersCount] = player->GetSmallId(); + ++m_playersCount; + + wstring playerName = L""; +#ifndef _CONTENT_PACKAGE + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<GetDisplayName(); + } + + int voiceStatus = 0; + if(player != NULL && player->HasVoice() ) + { + if( player->IsMutedByLocalUser(m_iPad) ) + { + // Muted image + voiceStatus = 3; + } + else if( player->IsTalking() ) + { + // Talking image + voiceStatus = 2; + } + else + { + // Not talking image + voiceStatus = 1; + } + } + + m_playersVoiceState[m_playersCount] = voiceStatus; + m_playersColourState[m_playersCount] = app.GetPlayerColour( m_players[m_playersCount] ); + m_playerNames[m_playersCount] = playerName; + m_playerList.addItem( playerName, app.GetPlayerColour( m_players[m_playersCount] ), voiceStatus); + } + } + + if(controlHasFocus(eControl_GamePlayers)) + { + m_playerList.setCurrentSelection(getControlChildFocus()); + } +} + +void UIScene_TeleportMenu::tick() +{ + UIScene::tick(); + + for(DWORD i = 0; i < m_playersCount; ++i) + { + INetworkPlayer *player = g_NetworkManager.GetPlayerBySmallId( m_players[i] ); + + if( player != NULL ) + { + m_players[i] = player->GetSmallId(); + + short icon = app.GetPlayerColour( m_players[i] ); + + if(icon != m_playersColourState[i]) + { + m_playersColourState[i] = icon; + m_playerList.setPlayerIcon( i, (int)app.GetPlayerColour( m_players[i] ) ); + } + + wstring playerName = L""; +#ifndef _CONTENT_PACKAGE + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<GetDisplayName(); + } + if(playerName.compare( m_playerNames[i] ) != 0 ) + { + m_playerList.setButtonLabel(i, playerName); + m_playerNames[i] = playerName; + } + } + } +} + +void UIScene_TeleportMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + if(pressed && !repeat) + { + ui.PlayUISFX(eSFX_Back); + navigateBack(); + } + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + case ACTION_MENU_UP: + case ACTION_MENU_DOWN: + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_TeleportMenu::handlePress(F64 controlId, F64 childId) +{ + app.DebugPrintf("Pressed = %d, %d\n", (int)controlId, (int)childId); + switch((int)controlId) + { + case eControl_GamePlayers: + int currentSelection = (int)childId; + INetworkPlayer *selectedPlayer = g_NetworkManager.GetPlayerBySmallId( m_players[ currentSelection ] ); + INetworkPlayer *thisPlayer = g_NetworkManager.GetLocalPlayerByUserIndex(m_iPad); + + shared_ptr packet; + if(m_teleportToPlayer) + { + packet = TeleportCommand::preparePacket(thisPlayer->GetUID(),selectedPlayer->GetUID()); + } + else + { + packet = TeleportCommand::preparePacket(selectedPlayer->GetUID(),thisPlayer->GetUID()); + } + ClientConnection *conn = Minecraft::GetInstance()->getConnection(m_iPad); + conn->send( packet ); + break; + } +} + +void UIScene_TeleportMenu::OnPlayerChanged(void *callbackParam, INetworkPlayer *pPlayer, bool leaving) +{ + UIScene_TeleportMenu *scene = (UIScene_TeleportMenu *)callbackParam; + bool playerFound = false; + int foundIndex = 0; + for(int i = 0; i < scene->m_playersCount; ++i) + { + if(!playerFound && scene->m_players[i] == pPlayer->GetSmallId() ) + { + if( scene->m_playerList.getCurrentSelection() == scene->m_playerList.getItemCount() - 1 ) + { + scene->m_playerList.setCurrentSelection( scene->m_playerList.getItemCount() - 2 ); + } + // Player removed + playerFound = true; + foundIndex = i; + } + } + + if( playerFound ) + { + --scene->m_playersCount; + scene->m_playersVoiceState[scene->m_playersCount] = 0; + scene->m_playersColourState[scene->m_playersCount] = 0; + scene->m_playerNames[scene->m_playersCount] = L""; + scene->m_playerList.removeItem(scene->m_playersCount); + } + + if( !playerFound ) + { + // Player added + scene->m_players[scene->m_playersCount] = pPlayer->GetSmallId(); + ++scene->m_playersCount; + + wstring playerName = L""; +#ifndef _CONTENT_PACKAGE + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<GetDisplayName(); + } + + int voiceStatus = 0; + if(pPlayer != NULL && pPlayer->HasVoice() ) + { + if( pPlayer->IsMutedByLocalUser(scene->m_iPad) ) + { + // Muted image + voiceStatus = 3; + } + else if( pPlayer->IsTalking() ) + { + // Talking image + voiceStatus = 2; + } + else + { + // Not talking image + voiceStatus = 1; + } + } + + scene->m_playerList.addItem( playerName, app.GetPlayerColour( scene->m_players[scene->m_playersCount - 1] ), voiceStatus); + } +} diff --git a/Minecraft.Client/Common/UI/UIScene_TeleportMenu.h b/Minecraft.Client/Common/UI/UIScene_TeleportMenu.h new file mode 100644 index 00000000..ebbaa2a0 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_TeleportMenu.h @@ -0,0 +1,51 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_TeleportMenu : public UIScene +{ +private: + enum EControls + { + eControl_GamePlayers, + }; + + bool m_teleportToPlayer; + int m_playersCount; + BYTE m_players[MINECRAFT_NET_MAX_PLAYERS]; // An array of QNet small-id's + char m_playersVoiceState[MINECRAFT_NET_MAX_PLAYERS]; + short m_playersColourState[MINECRAFT_NET_MAX_PLAYERS]; + wstring m_playerNames[MINECRAFT_NET_MAX_PLAYERS]; + + UIControl_PlayerList m_playerList; + UIControl_Label m_labelTitle; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_playerList, "GamePlayers") + UI_MAP_ELEMENT( m_labelTitle, "Title") + UI_END_MAP_ELEMENTS_AND_NAMES() +public: + UIScene_TeleportMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_TeleportMenu;} + + virtual void updateTooltips(); + virtual void handleReload(); + + virtual void tick(); + +protected: + // TODO: This should be pure virtual in this class + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +protected: + virtual void handleGainFocus(bool navBack); + void handlePress(F64 controlId, F64 childId); + virtual void handleDestroy(); + +public: + static void OnPlayerChanged(void *callbackParam, INetworkPlayer *pPlayer, bool leaving); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_Timer.cpp b/Minecraft.Client/Common/UI/UIScene_Timer.cpp new file mode 100644 index 00000000..61586e87 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_Timer.cpp @@ -0,0 +1,32 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_Timer.h" + + +UIScene_Timer::UIScene_Timer(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + // In normal usage, we want to hide the new background that's used during texture pack reloading + if(initData == 0) + { + m_controlBackground.setVisible(false); + } +} + +wstring UIScene_Timer::getMoviePath() +{ + return L"Timer"; +} + +void UIScene_Timer::reloadMovie() +{ + // Never needs reloaded +} + +bool UIScene_Timer::needsReloaded() +{ + // Never needs reloaded + return false; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_Timer.h b/Minecraft.Client/Common/UI/UIScene_Timer.h new file mode 100644 index 00000000..5a75103a --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_Timer.h @@ -0,0 +1,28 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_Timer : public UIScene +{ +private: + UIControl m_controlBackground; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT(m_controlBackground,"Background") + UI_END_MAP_ELEMENTS_AND_NAMES() + +public: + using UIScene::reloadMovie; + + UIScene_Timer(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_Timer;} + + // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden + virtual bool hidesLowerScenes() { return true; } + virtual void reloadMovie(); + virtual bool needsReloaded(); + +protected: + virtual wstring getMoviePath(); +}; diff --git a/Minecraft.Client/Common/UI/UIScene_TradingMenu.cpp b/Minecraft.Client/Common/UI/UIScene_TradingMenu.cpp new file mode 100644 index 00000000..dc2bac48 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_TradingMenu.cpp @@ -0,0 +1,268 @@ +#include "stdafx.h" +#include "UI.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.trading.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "MultiPlayerLocalPlayer.h" +#include "..\..\Minecraft.h" +#include "UIScene_TradingMenu.h" + +UIScene_TradingMenu::UIScene_TradingMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_showingLeftArrow = true; + m_showingRightArrow = true; + + // 4J-PB - "Villager" appears for a short time on opening the trading menu + //m_labelTrading.init( app.GetString(IDS_VILLAGER) ); + m_labelTrading.init( L"" ); + m_labelInventory.init( app.GetString(IDS_INVENTORY) ); + m_labelRequired.init( app.GetString(IDS_REQUIRED_ITEMS_FOR_TRADE) ); + + m_labelRequest1.init(L""); + m_labelRequest2.init(L""); + + TradingScreenInput *initData = (TradingScreenInput *)_initData; + m_merchant = initData->trader; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->localgameModes[iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Trading_Menu, this); + } + + m_menu = new MerchantMenu( initData->inventory, initData->trader, initData->level ); + + Minecraft::GetInstance()->localplayers[iPad]->containerMenu = m_menu; + + m_slotListRequest1.addSlots(BUY_A,1); + m_slotListRequest2.addSlots(BUY_B,1); + + m_slotListTrades.addSlots(TRADES_START,DISPLAY_TRADES_COUNT); + + m_slotListInventory.addSlots(MerchantMenu::INV_SLOT_START, 27); + m_slotListHotbar.addSlots(MerchantMenu::USE_ROW_SLOT_START, 9); + + if(initData) delete initData; + + // in this scene, we override the press sound with our own for crafting success or fail + ui.OverrideSFX(m_iPad,ACTION_MENU_A,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_OK,true); +#ifdef __ORBIS__ + ui.OverrideSFX(m_iPad,ACTION_MENU_TOUCHPAD_PRESS,true); +#endif + ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT_SCROLL,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT_SCROLL,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_UP,true); + ui.OverrideSFX(m_iPad,ACTION_MENU_DOWN,true); + + app.SetRichPresenceContext(iPad, CONTEXT_GAME_STATE_TRADING); +} + +wstring UIScene_TradingMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"TradingMenuSplit"; + } + else + { + return L"TradingMenu"; + } +} + +void UIScene_TradingMenu::updateTooltips() +{ + ui.SetTooltips(m_iPad, IDS_TOOLTIPS_TRADE, IDS_TOOLTIPS_BACK); +} + +void UIScene_TradingMenu::handleDestroy() +{ + app.DebugPrintf("UIScene_TradingMenu::handleDestroy\n"); + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + if(gameMode != NULL) gameMode->getTutorial()->changeTutorialState(m_previousTutorialState); + } + + // 4J Stu - Fix for #11302 - TCR 001: Network Connectivity: Host crashed after being killed by the client while accessing a chest during burst packet loss. + // We need to make sure that we call closeContainer() anytime this menu is closed, even if it is forced to close by some other reason (like the player dying) + if(pMinecraft->localplayers[m_iPad] != NULL) pMinecraft->localplayers[m_iPad]->closeContainer(); + + ui.OverrideSFX(m_iPad,ACTION_MENU_A,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_OK,false); +#ifdef __ORBIS__ + ui.OverrideSFX(m_iPad,ACTION_MENU_TOUCHPAD_PRESS,false); +#endif + ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT_SCROLL,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT_SCROLL,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_LEFT,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_RIGHT,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_UP,false); + ui.OverrideSFX(m_iPad,ACTION_MENU_DOWN,false); +} + +void UIScene_TradingMenu::handleReload() +{ + m_slotListRequest1.addSlots(BUY_A,1); + m_slotListRequest2.addSlots(BUY_B,1); + + m_slotListTrades.addSlots(TRADES_START,DISPLAY_TRADES_COUNT); + + m_slotListInventory.addSlots(MerchantMenu::INV_SLOT_START, 27); + m_slotListHotbar.addSlots(MerchantMenu::USE_ROW_SLOT_START, 9); +} + +void UIScene_TradingMenu::tick() +{ + UIScene::tick(); + handleTick(); +} + +void UIScene_TradingMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_InventoryMenu handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + default: + if(pressed) + { + handled = handleKeyDown(m_iPad, key, repeat); + } + break; + }; +} + +void UIScene_TradingMenu::customDraw(IggyCustomDrawCallbackRegion *region) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localgameModes[m_iPad] == NULL) return; + + shared_ptr item = nullptr; + int slotId = -1; + swscanf((wchar_t*)region->name,L"slot_%d",&slotId); + + if(slotId < MerchantMenu::USE_ROW_SLOT_END) + { + Slot *slot = m_menu->getSlot(slotId); + item = slot->getItem(); + } + else if(slotId >= TRADES_START) + { + int tradeId = (slotId - TRADES_START) + m_offersStartIndex; + if(tradeId < m_activeOffers.size()) + { + item = m_activeOffers.at(tradeId).first->getSellItem(); + } + } + else + { + int tradeId = m_selectedSlot + m_offersStartIndex; + if( tradeId < m_activeOffers.size() ) + { + switch(slotId) + { + case BUY_A: + item = m_activeOffers.at(tradeId).first->getBuyAItem(); + break; + case BUY_B: + item = m_activeOffers.at(tradeId).first->getBuyBItem(); + break; + }; + } + } + if(item != NULL) customDrawSlotControl(region,m_iPad,item,1.0f,item->isFoil(),true); +} + +void UIScene_TradingMenu::showScrollRightArrow(bool show) +{ + if(m_showingRightArrow != show) + { + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = show; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowScrollRightArrow , 1 , value ); + + m_showingRightArrow = show; + } +} + +void UIScene_TradingMenu::showScrollLeftArrow(bool show) +{ + if(m_showingLeftArrow != show) + { + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = show; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcShowScrollLeftArrow , 1 , value ); + + m_showingLeftArrow = show; + } +} + +void UIScene_TradingMenu::moveSelector(bool right) +{ + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_boolean; + value[0].boolval = right; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcMoveSelector , 1 , value ); +} + +void UIScene_TradingMenu::setTitle(const wstring &name) +{ + m_labelTrading.setLabel(name); +} + +void UIScene_TradingMenu::setRequest1Name(const wstring &name) +{ + m_labelRequest1.setLabel(name); +} + +void UIScene_TradingMenu::setRequest2Name(const wstring &name) +{ + m_labelRequest2.setLabel(name); +} + +void UIScene_TradingMenu::setRequest1RedBox(bool show) +{ + m_slotListRequest1.showSlotRedBox(0,show); +} + +void UIScene_TradingMenu::setRequest2RedBox(bool show) +{ + m_slotListRequest2.showSlotRedBox(0,show); +} + +void UIScene_TradingMenu::setTradeRedBox(int index, bool show) +{ + m_slotListTrades.showSlotRedBox(index,show); +} + +void UIScene_TradingMenu::setOfferDescription(const wstring &name, vector &unformattedStrings) +{ + IggyDataValue result; + IggyDataValue value[1]; + + IggyStringUTF16 stringVal; + stringVal.string = (IggyUTF16*)name.c_str(); + stringVal.length = name.length(); + value[0].type = IGGY_DATATYPE_string_UTF16; + value[0].string16 = stringVal; + + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetOfferDescription , 1 , value ); +} diff --git a/Minecraft.Client/Common/UI/UIScene_TradingMenu.h b/Minecraft.Client/Common/UI/UIScene_TradingMenu.h new file mode 100644 index 00000000..08263a1c --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_TradingMenu.h @@ -0,0 +1,78 @@ +#pragma once + +#include "IUIScene_TradingMenu.h" + +class InventoryMenu; + +class UIScene_TradingMenu : public UIScene, public IUIScene_TradingMenu +{ +private: + bool m_showingRightArrow, m_showingLeftArrow; + +public: + UIScene_TradingMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_TradingMenu;} + +protected: + UIControl m_controlMainPanel; + UIControl_SlotList m_slotListTrades; + UIControl_SlotList m_slotListRequest1, m_slotListRequest2; + UIControl_SlotList m_slotListHotbar, m_slotListInventory; + UIControl_Label m_labelInventory; + UIControl_Label m_labelTrading, m_labelRequired; + UIControl_Label m_labelRequest1, m_labelRequest2; + + IggyName m_funcMoveSelector, m_funcShowScrollRightArrow, m_funcShowScrollLeftArrow, m_funcSetOfferDescription; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT( m_controlMainPanel, "MainPanel" ) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + UI_MAP_ELEMENT( m_slotListTrades, "TradingBar") + UI_MAP_ELEMENT( m_slotListRequest1, "Request1") + UI_MAP_ELEMENT( m_slotListRequest2, "Request2") + + UI_MAP_ELEMENT( m_labelTrading, "VillagerText") + UI_MAP_ELEMENT( m_labelRequired, "RequiredLabel") + + UI_MAP_ELEMENT( m_labelRequest1, "Request1Label") + UI_MAP_ELEMENT( m_labelRequest2, "Request2Label") + + UI_MAP_ELEMENT( m_slotListHotbar, "HotBar") + UI_MAP_ELEMENT( m_slotListInventory, "Inventory") + UI_MAP_ELEMENT( m_labelInventory, "InventoryLabel") + + UI_END_MAP_CHILD_ELEMENTS() + + UI_MAP_NAME(m_funcMoveSelector, L"MoveSelector") + UI_MAP_NAME(m_funcShowScrollRightArrow, L"ShowScrollRightArrow") + UI_MAP_NAME(m_funcShowScrollLeftArrow, L"ShowScrollLeftArrow") + UI_MAP_NAME(m_funcSetOfferDescription, L"SetOfferDescription") + UI_END_MAP_ELEMENTS_AND_NAMES() + + virtual wstring getMoviePath(); + virtual void updateTooltips(); + virtual void handleDestroy(); + virtual void handleReload(); + + virtual void tick(); + + void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + void customDraw(IggyCustomDrawCallbackRegion *region); + + virtual void showScrollRightArrow(bool show); + virtual void showScrollLeftArrow(bool show); + virtual void moveSelector(bool right); + virtual void setTitle(const wstring &name); + virtual void setRequest1Name(const wstring &name); + virtual void setRequest2Name(const wstring &name); + + virtual void setRequest1RedBox(bool show); + virtual void setRequest2RedBox(bool show); + virtual void setTradeRedBox(int index, bool show); + + virtual void setOfferDescription(const wstring &name, vector &unformattedStrings); + + int getPad() { return m_iPad; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_TrialExitUpsell.cpp b/Minecraft.Client/Common/UI/UIScene_TrialExitUpsell.cpp new file mode 100644 index 00000000..b395bc4c --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_TrialExitUpsell.cpp @@ -0,0 +1,75 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_TrialExitUpsell.h" + + +UIScene_TrialExitUpsell::UIScene_TrialExitUpsell(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); +} + +wstring UIScene_TrialExitUpsell::getMoviePath() +{ + return L"TrialExitUpsell"; +} + +void UIScene_TrialExitUpsell::updateTooltips() +{ + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_EXIT_GAME,IDS_TOOLTIPS_BACK, IDS_UNLOCK_TITLE); +} + +void UIScene_TrialExitUpsell::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_CANCEL: + navigateBack(); + break; + case ACTION_MENU_OK: +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + if(pressed) + { + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + app.ExitGame(); + } + break; + case ACTION_MENU_X: + if(ProfileManager.IsSignedIn(iPad)) + { + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + // 4J-PB - need to check this user can access the store +#if defined(__PS3__) || defined(__PSVITA__) + bool bContentRestricted; + ProfileManager.GetChatAndContentRestrictions(ProfileManager.GetPrimaryPad(),true,NULL,&bContentRestricted,NULL); + if(bContentRestricted) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,this, app.GetStringTable()); + } + else +#endif + { + TelemetryManager->RecordUpsellPresented(iPad, eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID); + ProfileManager.DisplayFullVersionPurchase(false,iPad,eSen_UpsellID_Full_Version_Of_Game); + } + } + break; + } +} + +void UIScene_TrialExitUpsell::handleAnimationEnd() +{ + //ui.NavigateToHomeMenu(); + ui.NavigateToScene(0,eUIScene_SaveMessage); +} diff --git a/Minecraft.Client/Common/UI/UIScene_TrialExitUpsell.h b/Minecraft.Client/Common/UI/UIScene_TrialExitUpsell.h new file mode 100644 index 00000000..79e9edf5 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_TrialExitUpsell.h @@ -0,0 +1,31 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_TrialExitUpsell : public UIScene +{ +private: + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_END_MAP_ELEMENTS_AND_NAMES() + +public: + UIScene_TrialExitUpsell(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_TrialExitUpsell;} + + // Returns true if this scene has focus for the pad passed in +#ifndef __PS3__ + virtual bool hasFocus(int iPad) { return bHasFocus; } +#endif + virtual void updateTooltips(); + +protected: + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + + virtual void handleAnimationEnd(); + +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIStructs.h b/Minecraft.Client/Common/UI/UIStructs.h new file mode 100644 index 00000000..2dd03c8c --- /dev/null +++ b/Minecraft.Client/Common/UI/UIStructs.h @@ -0,0 +1,409 @@ +#pragma once + +#pragma message("UIStructs.h") + +#include "UIEnums.h" + +class Container; +class Inventory; +class BrewingStandTileEntity; +class DispenserTileEntity; +class FurnaceTileEntity; +class SignTileEntity; +class LevelGenerationOptions; +class LocalPlayer; +class Merchant; + +// 4J Stu - Structs shared by Iggy and Xui scenes. +typedef struct _UIVec2D +{ + float x; + float y; + + _UIVec2D& operator+=(const _UIVec2D &rhs) + { + x += rhs.x; + y += rhs.y; + return *this; + } +} UIVec2D; + +// Brewing +typedef struct _BrewingScreenInput +{ + shared_ptr inventory; + shared_ptr brewingStand; + int iPad; + bool bSplitscreen; +} BrewingScreenInput; + +// Chest +typedef struct _ContainerScreenInput +{ + shared_ptr inventory; + shared_ptr container; + int iPad; + bool bSplitscreen; +} ContainerScreenInput; + +// Dispenser +typedef struct _TrapScreenInput +{ + shared_ptr inventory; + shared_ptr trap; + int iPad; + bool bSplitscreen; +} TrapScreenInput; + +// Inventory and creative inventory +typedef struct _InventoryScreenInput +{ + shared_ptr player; + bool bNavigateBack; // If we came here from the crafting screen, go back to it, rather than closing the xui menus + int iPad; + bool bSplitscreen; +} InventoryScreenInput; + +// Enchanting +typedef struct _EnchantingScreenInput +{ + shared_ptr inventory; + Level *level; + int x; + int y; + int z; + int iPad; + bool bSplitscreen; +} EnchantingScreenInput; + +// Furnace +typedef struct _FurnaceScreenInput +{ + shared_ptr inventory; + shared_ptr furnace; + int iPad; + bool bSplitscreen; +} FurnaceScreenInput; + +// Crafting +typedef struct _CraftingPanelScreenInput +{ + shared_ptr player; + int iContainerType; // RECIPE_TYPE_2x2 or RECIPE_TYPE_3x3 + bool bSplitscreen; + int iPad; + int x; + int y; + int z; +} +CraftingPanelScreenInput; + +// Trading +typedef struct _TradingScreenInput +{ + shared_ptr inventory; + shared_ptr trader; + Level *level; + int iPad; + bool bSplitscreen; +} +TradingScreenInput; + +// Anvil +typedef struct _AnvilScreenInput +{ + shared_ptr inventory; + Level *level; + int x; + int y; + int z; + int iPad; + bool bSplitscreen; +} +AnvilScreenInput; + +// Sign +typedef struct _SignEntryScreenInput +{ + shared_ptr sign; + int iPad; +} SignEntryScreenInput; + +// Connecting progress +typedef struct _ConnectionProgressParams +{ + int iPad; + int stringId; + bool showTooltips; + bool setFailTimer; + int timerTime; + void (*cancelFunc)(LPVOID param); + LPVOID cancelFuncParam; + + _ConnectionProgressParams() + { + iPad = 0; + stringId = -1; + showTooltips = false; + setFailTimer = false; + timerTime = 0; + cancelFunc = NULL; + cancelFuncParam = NULL; + } +} ConnectionProgressParams; + +// Fullscreen progress +typedef struct _UIFullscreenProgressCompletionData +{ + BOOL bRequiresUserAction; + BOOL bShowBackground; + BOOL bShowLogo; + BOOL bShowTips; + ProgressionCompletionType type; + int iPad; + EUIScene scene; + + _UIFullscreenProgressCompletionData() + { + bRequiresUserAction = FALSE; + bShowBackground = TRUE; + bShowLogo = TRUE; + bShowTips = TRUE; + type = e_ProgressCompletion_NoAction; + } +} UIFullscreenProgressCompletionData; + +// Create world +typedef struct _CreateWorldMenuInitData +{ + BOOL bOnline; + BOOL bIsPrivate; + int iPad; +} +CreateWorldMenuInitData; + +// Join/Load saves list +typedef struct _SaveListDetails +{ + int saveId; + PBYTE pbThumbnailData; + DWORD dwThumbnailSize; +#ifdef _DURANGO + wchar_t UTF16SaveName[128]; + wchar_t UTF16SaveFilename[MAX_SAVEFILENAME_LENGTH]; +#else + char UTF8SaveName[128]; +#ifndef _XBOX + char UTF8SaveFilename[MAX_SAVEFILENAME_LENGTH]; +#endif +#endif + + _SaveListDetails() + { + saveId = 0; + pbThumbnailData = NULL; + dwThumbnailSize = 0; +#ifdef _DURANGO + ZeroMemory(UTF16SaveName,sizeof(wchar_t)*128); + ZeroMemory(UTF16SaveFilename,sizeof(wchar_t)*MAX_SAVEFILENAME_LENGTH); +#else + ZeroMemory(UTF8SaveName,128); +#ifndef _XBOX + ZeroMemory(UTF8SaveFilename,MAX_SAVEFILENAME_LENGTH); +#endif +#endif + } + +} SaveListDetails; + +// Load world +typedef struct _LoadMenuInitData +{ + int iPad; + int iSaveGameInfoIndex; + LevelGenerationOptions *levelGen; + SaveListDetails *saveDetails; +} +LoadMenuInitData; + +// Join Games +typedef struct _JoinMenuInitData +{ + FriendSessionInfo *selectedSession; + int iPad; +} JoinMenuInitData; + +// More Options +typedef struct _LaunchMoreOptionsMenuInitData +{ + BOOL bOnlineGame; + BOOL bInviteOnly; + BOOL bAllowFriendsOfFriends; + + BOOL bGenerateOptions; + BOOL bStructures; + BOOL bFlatWorld; + BOOL bBonusChest; + + BOOL bPVP; + BOOL bTrust; + BOOL bFireSpreads; + BOOL bTNT; + + BOOL bHostPrivileges; + BOOL bResetNether; + + BOOL bOnlineSettingChangedBySystem; + + int iPad; + + DWORD dwTexturePack; + + wstring seed; + int worldSize; + bool bDisableSaving; + + _LaunchMoreOptionsMenuInitData() + { + memset(this,0,sizeof(_LaunchMoreOptionsMenuInitData)); + bOnlineGame = TRUE; + bAllowFriendsOfFriends = TRUE; + bPVP = TRUE; + bFireSpreads = TRUE; + bTNT = TRUE; + iPad = -1; + worldSize = 3; + seed = L""; + bDisableSaving = false; + } +} +LaunchMoreOptionsMenuInitData; + +typedef struct _LoadingInputParams +{ + C4JThreadStartFunc* func; + LPVOID lpParam; + UIFullscreenProgressCompletionData *completionData; + + int cancelText; + void (*cancelFunc)(LPVOID param); + void (*completeFunc)(LPVOID param); + LPVOID m_cancelFuncParam; + LPVOID m_completeFuncParam; + bool waitForThreadToDelete; + + _LoadingInputParams() + { + func = NULL; + lpParam = NULL; + completionData = NULL; + + cancelText = -1; + cancelFunc = NULL; + completeFunc = NULL; + m_cancelFuncParam = NULL; + m_completeFuncParam = NULL; + waitForThreadToDelete = false; + } +} LoadingInputParams; + +// Tutorial +#ifndef _XBOX +class UIScene; +#endif +class Tutorial; +typedef struct _TutorialPopupInfo +{ +#ifdef _XBOX + CXuiScene *interactScene; +#else + UIScene *interactScene; +#endif + LPCWSTR desc; + LPCWSTR title; + int icon; + int iAuxVal /* = 0 */; + bool isFoil /* = false */; + bool allowFade /* = true */; + bool isReminder /*= false*/; + Tutorial *tutorial; + + _TutorialPopupInfo() + { + interactScene = NULL; + desc = L""; + title = L""; + icon = -1; + iAuxVal = 0; + isFoil = false; + allowFade = true; + isReminder = false; + tutorial = NULL; + } + +} TutorialPopupInfo; + +// Quadrant sign in +typedef struct _SignInInfo +{ + int( *Func)(LPVOID,const bool, const int iPad); + LPVOID lpParam; + bool requireOnline; +} SignInInfo; + +// Credits +typedef struct +{ + LPCWSTR m_Text; // Should contain string, optionally with %s to add in translated string ... e.g. "Andy West - %s" + int m_iStringID[2]; // May be NO_TRANSLATED_STRING if we do not require to add any translated string. + ECreditTextTypes m_eType; +} +SCreditTextItemDef; + +// Message box +typedef struct _MessageBoxInfo +{ + UINT uiTitle; + UINT uiText; + UINT *uiOptionA; + UINT uiOptionC; + DWORD dwPad; + int( *Func)(LPVOID,int,const C4JStorage::EMessageResult); + LPVOID lpParam; + //C4JStringTable *pStringTable; // 4J Stu - We don't need this for our internal message boxes + WCHAR *pwchFormatString; + DWORD dwFocusButton; +} MessageBoxInfo; + +typedef struct _DLCOffersParam +{ + int iPad; + int iOfferC; + int iType; +} +DLCOffersParam; + +typedef struct _InGamePlayerOptionsInitData +{ + int iPad; + BYTE networkSmallId; + unsigned int playerPrivileges; +} InGamePlayerOptionsInitData; + +typedef struct _DebugSetCameraPosition +{ + int player; + double m_camX, m_camY, m_camZ, m_yRot, m_elev; +} DebugSetCameraPosition; + +typedef struct _TeleportMenuInitData +{ + int iPad; + bool teleportToPlayer; +} TeleportMenuInitData; + +typedef struct _CustomDrawData +{ + float x0, y0, x1, y1; // the bounding box of the original DisplayObject, in object space + float mat[16]; +} CustomDrawData; diff --git a/Minecraft.Client/Common/UI/UITTFFont.cpp b/Minecraft.Client/Common/UI/UITTFFont.cpp new file mode 100644 index 00000000..eb343382 --- /dev/null +++ b/Minecraft.Client/Common/UI/UITTFFont.cpp @@ -0,0 +1,51 @@ +#include "stdafx.h" +#include "UI.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\File.h" +#include "UITTFFont.h" + +UITTFFont::UITTFFont(const string &path, S32 fallbackCharacter) +{ + app.DebugPrintf("UITTFFont opening %s\n",path.c_str()); + +#ifdef _UNICODE + wstring wPath = convStringToWstring(path); + HANDLE file = CreateFile(wPath.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); +#else + HANDLE file = CreateFile(path.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); +#endif + if( file == INVALID_HANDLE_VALUE ) + { + DWORD error = GetLastError(); + app.DebugPrintf("Failed to open TTF file with error code %d (%x)\n", error, error); + assert(false); + } + + DWORD dwHigh=0; + DWORD dwFileSize = GetFileSize(file,&dwHigh); + + if(dwFileSize!=0) + { + DWORD bytesRead; + + pbData = (PBYTE) new BYTE[dwFileSize]; + BOOL bSuccess = ReadFile(file,pbData,dwFileSize,&bytesRead,NULL); + if(bSuccess==FALSE) + { + app.FatalLoadError(); + } + CloseHandle(file); + + IggyFontInstallTruetypeUTF8 ( (void *)pbData, IGGY_TTC_INDEX_none, "Mojangles_TTF", -1, IGGY_FONTFLAG_none ); + + IggyFontInstallTruetypeFallbackCodepointUTF8( "Mojangles_TTF", -1, IGGY_FONTFLAG_none, fallbackCharacter ); + + // 4J Stu - These are so we can use the default flash controls + IggyFontInstallTruetypeUTF8 ( (void *)pbData, IGGY_TTC_INDEX_none, "Times New Roman", -1, IGGY_FONTFLAG_none ); + IggyFontInstallTruetypeUTF8 ( (void *)pbData, IGGY_TTC_INDEX_none, "Arial", -1, IGGY_FONTFLAG_none ); + } +} + +UITTFFont::~UITTFFont() +{ +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UITTFFont.h b/Minecraft.Client/Common/UI/UITTFFont.h new file mode 100644 index 00000000..0de7c4e0 --- /dev/null +++ b/Minecraft.Client/Common/UI/UITTFFont.h @@ -0,0 +1,12 @@ +#pragma once + +class UITTFFont +{ +private: + PBYTE pbData; + //DWORD dwDataSize; + +public: + UITTFFont(const string &path, S32 fallbackCharacter); + ~UITTFFont(); +}; diff --git a/Minecraft.Client/Common/XUI/SlotProgressControl.cpp b/Minecraft.Client/Common/XUI/SlotProgressControl.cpp new file mode 100644 index 00000000..91f362a3 --- /dev/null +++ b/Minecraft.Client/Common/XUI/SlotProgressControl.cpp @@ -0,0 +1,88 @@ +#include "stdafx.h" + +#include "..\..\..\Minecraft.World\Slot.h" +#include "..\..\..\Minecraft.World\ItemInstance.h" + +#include "SlotItemControlBase.h" +#include "SlotProgressControl.h" + +int SlotProgressControl::GetValue() +{ + int value = 0; + + HXUIOBJ hVisual, hParent; + this->GetParent( &hVisual ); + XuiElementGetParent( hVisual, &hParent); + + void* pvUserData; + XuiElementGetUserData( hParent, &pvUserData ); + + if( pvUserData != NULL ) + { + SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; + + shared_ptr item = shared_ptr(); + + if( pUserDataContainer->slot != NULL ) + { + item = pUserDataContainer->slot->getItem(); + } + else + { + item = pUserDataContainer->item; + } + + if( item != NULL ) + { + // TODO Should use getDamage instead even though it returns the same value + if( item->isDamaged() ) + value = item->getDamageValue(); + else + value = 0; + } + } + else + { + LPCWSTR name; + XuiElementGetId( hParent, &name ); + + OutputDebugStringW( name ); + OutputDebugString( "\n" ); + } + + return value; +} + +void SlotProgressControl::GetRange(int *pnRangeMin, int *pnRangeMax) +{ + *pnRangeMin = 0; + *pnRangeMax = 0; + + HXUIOBJ hVisual, hParent; + this->GetParent( &hVisual ); + XuiElementGetParent( hVisual, &hParent); + + void* pvUserData; + XuiElementGetUserData( hParent, &pvUserData ); + + if( pvUserData != NULL ) + { + SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; + + shared_ptr item = shared_ptr(); + + if( pUserDataContainer->slot != NULL ) + { + item = pUserDataContainer->slot->getItem(); + } + else + { + item = pUserDataContainer->item; + } + + if( item != NULL ) + { + *pnRangeMax = item->getMaxDamage(); + } + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/SlotProgressControl.h b/Minecraft.Client/Common/XUI/SlotProgressControl.h new file mode 100644 index 00000000..fb5ddcc1 --- /dev/null +++ b/Minecraft.Client/Common/XUI/SlotProgressControl.h @@ -0,0 +1,18 @@ +#pragma once + +#include "ProgressControlBase.h" + +class SlotProgressControl : public ProgressControlBase +{ +public: + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( SlotProgressControl, L"SlotProgressControl", XUI_CLASS_PROGRESSBAR ) + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_GET_SOURCE_TEXT(OnGetSourceDataText) + XUI_END_MSG_MAP() + + virtual int GetValue(); + virtual void GetRange(int *pnRangeMin, int *pnRangeMax); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_BasePlayer.cpp b/Minecraft.Client/Common/XUI/XUI_BasePlayer.cpp new file mode 100644 index 00000000..21348070 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_BasePlayer.cpp @@ -0,0 +1,9 @@ +#include "stdafx.h" +#include +#include "XUI_BasePlayer.h" + +HRESULT CXuiSceneBasePlayer::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + return S_OK; +} + diff --git a/Minecraft.Client/Common/XUI/XUI_BasePlayer.h b/Minecraft.Client/Common/XUI/XUI_BasePlayer.h new file mode 100644 index 00000000..fd777e6a --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_BasePlayer.h @@ -0,0 +1,13 @@ +#pragma once + +class CXuiSceneBasePlayer : public CXuiSceneImpl +{ + +protected: + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + +public: + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CXuiSceneBasePlayer, L"CXuiSceneBasePlayer", XUI_CLASS_SCENE ) +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Chat.cpp b/Minecraft.Client/Common/XUI/XUI_Chat.cpp new file mode 100644 index 00000000..3e3faa77 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Chat.cpp @@ -0,0 +1,71 @@ +#include "stdafx.h" +#include "XUI_Chat.h" +#include "..\..\Minecraft.h" +#include "..\..\Gui.h" + +HRESULT CScene_Chat::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + m_iPad = *(int *)pInitData->pvInitData; + + MapChildControls(); + + this->SetTimer(0,100); + + XuiElementGetPosition(m_hObj,&m_OriginalPosition); + + return S_OK; +} + +HRESULT CScene_Chat::OnTimer( XUIMessageTimer *pXUIMessageTimer, BOOL &bHandled) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + Gui *pGui = pMinecraft->gui; + + //DWORD messagesToDisplay = min( CHAT_LINES_COUNT, pGui->getMessagesCount(m_iPad) ); + for( unsigned int i = 0; i < CHAT_LINES_COUNT; ++i ) + { + float opacity = pGui->getOpacity(m_iPad, i); + if( opacity > 0 ) + { + m_Backgrounds[i].SetOpacity(opacity); + m_Labels[i].SetOpacity(opacity); + m_Labels[i].SetText( pGui->getMessage(m_iPad,i).c_str() ); + } + else + { + m_Backgrounds[i].SetOpacity(0); + m_Labels[i].SetOpacity(0); + } + } + if(pMinecraft->localplayers[m_iPad]!= NULL) + { + m_Jukebox.SetText( pGui->getJukeboxMessage(m_iPad).c_str() ); + m_Jukebox.SetOpacity( pGui->getJukeboxOpacity(m_iPad) ); + } + return S_OK; +} + +HRESULT CScene_Chat::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) +{ + bHandled=true; + + app.ReloadChatScene(m_iPad, bJoining); + + return S_OK; +} + +HRESULT CScene_Chat::OffsetTextPosition( float xOffset, float yOffset /*= 0.0f*/ ) +{ + D3DXVECTOR3 vPos; + float fWidth, fHeight; + XuiElementGetBounds( m_Backgrounds[0], &fWidth, &fHeight ); + for(unsigned int i = 0; i < CHAT_LINES_COUNT; ++i) + { + XuiElementGetPosition( m_Labels[i], &vPos ); + vPos.x = xOffset; + vPos.y += yOffset; + XuiElementSetPosition( m_Labels[i], &vPos ); + XuiElementSetBounds( m_Labels[i], fWidth - xOffset, fHeight ); + } + return S_OK; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Chat.h b/Minecraft.Client/Common/XUI/XUI_Chat.h new file mode 100644 index 00000000..d685e587 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Chat.h @@ -0,0 +1,59 @@ +#pragma once +#include "../media/xuiscene_chat.h" +#include "XUI_CustomMessages.h" + +#define CHAT_LINES_COUNT 10 + +class CScene_Chat : public CXuiSceneImpl +{ + +protected: + CXuiControl m_Labels[CHAT_LINES_COUNT]; + CXuiControl m_Backgrounds[CHAT_LINES_COUNT]; + CXuiControl m_Jukebox; + + D3DXVECTOR3 m_OriginalPosition; + int m_iPad; + + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_TIMER( OnTimer ) + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + XUI_END_MSG_MAP() + + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_XuiLabel1, m_Labels[0]) + MAP_CONTROL(IDC_XuiLabel2, m_Labels[1]) + MAP_CONTROL(IDC_XuiLabel3, m_Labels[2]) + MAP_CONTROL(IDC_XuiLabel4, m_Labels[3]) + MAP_CONTROL(IDC_XuiLabel5, m_Labels[4]) + MAP_CONTROL(IDC_XuiLabel6, m_Labels[5]) + MAP_CONTROL(IDC_XuiLabel7, m_Labels[6]) + MAP_CONTROL(IDC_XuiLabel8, m_Labels[7]) + MAP_CONTROL(IDC_XuiLabel9, m_Labels[8]) + MAP_CONTROL(IDC_XuiLabel10, m_Labels[9]) + MAP_CONTROL(IDC_XuiBack1, m_Backgrounds[0]) + MAP_CONTROL(IDC_XuiBack2, m_Backgrounds[1]) + MAP_CONTROL(IDC_XuiBack3, m_Backgrounds[2]) + MAP_CONTROL(IDC_XuiBack4, m_Backgrounds[3]) + MAP_CONTROL(IDC_XuiBack5, m_Backgrounds[4]) + MAP_CONTROL(IDC_XuiBack6, m_Backgrounds[5]) + MAP_CONTROL(IDC_XuiBack7, m_Backgrounds[6]) + MAP_CONTROL(IDC_XuiBack8, m_Backgrounds[7]) + MAP_CONTROL(IDC_XuiBack9, m_Backgrounds[8]) + MAP_CONTROL(IDC_XuiBack10, m_Backgrounds[9]) + MAP_CONTROL(IDC_XuiLabelJukebox, m_Jukebox) + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnTimer( XUIMessageTimer *pXUIMessageTimer, BOOL &bHandled); + HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled); + +public: + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_Chat, L"CScene_Chat", XUI_CLASS_SCENE ) + + HRESULT OffsetTextPosition( float xOffset, float yOffset = 0.0f ); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_ConnectingProgress.cpp b/Minecraft.Client/Common/XUI/XUI_ConnectingProgress.cpp new file mode 100644 index 00000000..9a82a7b3 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_ConnectingProgress.cpp @@ -0,0 +1,216 @@ +// Minecraft.cpp : Defines the entry point for the application. +// + +#include "stdafx.h" + +#include +#include "..\..\Minecraft.h" +#include "..\..\..\Minecraft.World\DisconnectPacket.h" + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_ConnectingProgress::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + ConnectionProgressParams *param = (ConnectionProgressParams *)pInitData->pvInitData; + m_iPad = param->iPad; + MapChildControls(); + + if( param->stringId >= 0 ) + { + m_title.SetText( app.GetString( param->stringId ) ); + } + else + { + m_title.SetText( L"" ); + } + + m_buttonConfirm.SetText( app.GetString( IDS_CONFIRM_OK ) ); + + if(app.GetLocalPlayerCount()>1) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad,false); + } + + CXuiSceneBase::ShowBackground( m_iPad, TRUE ); + CXuiSceneBase::ShowLogo( m_iPad, TRUE ); + + m_showTooltips = param->showTooltips; + if( param->showTooltips ) + ui.SetTooltips( m_iPad, -1, IDS_TOOLTIPS_CANCEL_JOIN, -1, -1 ); + else + ui.SetTooltips( m_iPad, -1 ); + + m_runFailTimer = param->setFailTimer; + m_timerTime = param->timerTime; + + return S_OK; +} + +// The framework calls this handler when the object is to be destroyed. +HRESULT CScene_ConnectingProgress::OnDestroy() +{ + return S_OK; +} + +//---------------------------------------------------------------------------------- +// Updates the UI when the list selection changes. +//---------------------------------------------------------------------------------- +HRESULT CScene_ConnectingProgress::OnNotifySelChanged( HXUIOBJ hObjSource, XUINotifySelChanged* pNotifySelChangedData, BOOL& bHandled ) +{ + return S_OK; +} + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_ConnectingProgress::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + if(hObjPressed == m_buttonConfirm) + { + if( m_iPad != ProfileManager.GetPrimaryPad() && g_NetworkManager.IsInSession() ) + { + // The connection failed if we see the button, so the temp player should be removed and the viewports updated again + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->removeLocalPlayerIdx(m_iPad); + } + else + { + app.NavigateToHomeMenu(); + //app.NavigateBack( ProfileManager.GetPrimaryPad() ); + } + } + + return S_OK; +} + +HRESULT CScene_ConnectingProgress::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + if( m_showTooltips ) + { + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + // Explicitly handle B button presses + if (pInputData->dwKeyCode == VK_PAD_B) + { + // Cancel the join + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->removeLocalPlayerIdx(m_iPad); + rfHandled = TRUE; + } + } + return S_OK; +} + +HRESULT CScene_ConnectingProgress::OnGetSourceDataText(XUIMessageGetSourceText *pGetSourceTextData, BOOL& bHandled) +{ + // This gets called every frame, so use it to update our two text boxes + + return S_OK; +} + +HRESULT CScene_ConnectingProgress::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ) +{ + //if(m_runFailTimer) XuiSetTimer(m_hObj,0,m_timerTime); + if( pTransition->dwTransType == XUI_TRANSITION_FROM ) + { + XuiKillTimer(m_hObj,0); + } + + return S_OK; +} + +HRESULT CScene_ConnectingProgress::OnTransitionEnd( XUIMessageTransition *pTransition, BOOL& bHandled ) +{ + // are we being destroyed? If so, don't do anything + if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) + { + return S_OK; + } + + if( pTransition->dwTransType == XUI_TRANSITION_TO ) + { + if(m_runFailTimer) XuiSetTimer(m_hObj,0,m_timerTime); + } + + return S_OK; +} + +HRESULT CScene_ConnectingProgress::OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ) +{ + // Check if the connection failed + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if( pMinecraft->m_connectionFailed[m_iPad] || !g_NetworkManager.IsInSession() ) + { + app.RemoveBackScene(m_iPad); + + // 4J-PB - timers auto repeat, so kill it + XuiKillTimer(m_hObj,0); + + int exitReasonStringId; + switch(pMinecraft->m_connectionFailedReason[m_iPad]) + { + case DisconnectPacket::eDisconnect_LoginTooLong: + exitReasonStringId = IDS_DISCONNECTED_LOGIN_TOO_LONG; + break; + case DisconnectPacket::eDisconnect_ServerFull: + exitReasonStringId = IDS_DISCONNECTED_SERVER_FULL; + break; + case DisconnectPacket::eDisconnect_Kicked: + exitReasonStringId = IDS_DISCONNECTED_KICKED; + break; + case DisconnectPacket::eDisconnect_NoUGC_AllLocal: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL; + break; + case DisconnectPacket::eDisconnect_NoUGC_Single_Local: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL; + break; + case DisconnectPacket::eDisconnect_NoUGC_Remote: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_REMOTE; + break; + case DisconnectPacket::eDisconnect_NoFlying: + exitReasonStringId = IDS_DISCONNECTED_FLYING; + break; + case DisconnectPacket::eDisconnect_Quitting: + exitReasonStringId = IDS_DISCONNECTED_SERVER_QUIT; + break; + case DisconnectPacket::eDisconnect_OutdatedServer: + exitReasonStringId = IDS_DISCONNECTED_SERVER_OLD; + break; + case DisconnectPacket::eDisconnect_OutdatedClient: + exitReasonStringId = IDS_DISCONNECTED_CLIENT_OLD; + break; + default: + exitReasonStringId = IDS_CONNECTION_LOST_SERVER; + break; + } + + if( m_iPad != ProfileManager.GetPrimaryPad() && g_NetworkManager.IsInSession() ) + { + m_buttonConfirm.SetShow(TRUE); + m_buttonConfirm.SetFocus(m_iPad); + + // Set text + m_title.SetText( app.GetString( IDS_CONNECTION_FAILED ) ); + m_status.SetText( app.GetString( exitReasonStringId ) ); + } + else + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; +#ifdef _XBOX + StorageManager.RequestMessageBox( IDS_CONNECTION_FAILED, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); +#endif + exitReasonStringId = -1; + + //app.NavigateToHomeMenu(); + app.SetAction(ProfileManager.GetPrimaryPad(),eAppAction_ExitWorld,(void *)TRUE); + } + } + + return S_OK; +} diff --git a/Minecraft.Client/Common/XUI/XUI_ConnectingProgress.h b/Minecraft.Client/Common/XUI/XUI_ConnectingProgress.h new file mode 100644 index 00000000..360ca0b0 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_ConnectingProgress.h @@ -0,0 +1,55 @@ +#pragma once +#include "../media/xuiscene_connectingprogress.h" + +class CScene_ConnectingProgress : public CXuiSceneImpl +{ +private: + int m_iPad; + bool m_runFailTimer; + int m_timerTime; + bool m_showTooltips; +protected: + // Control and Element wrapper objects. + CXuiControl m_title, m_status, m_buttonConfirm; + + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_DESTROY( OnDestroy ) + XUI_ON_XM_NOTIFY_SELCHANGED( OnNotifySelChanged ) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_GET_SOURCE_TEXT(OnGetSourceDataText) + XUI_ON_XM_TRANSITION_START( OnTransitionStart ) + XUI_ON_XM_TRANSITION_END( OnTransitionEnd ) + XUI_ON_XM_TIMER( OnTimer ) + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_Title, m_title) + MAP_CONTROL(IDC_Status, m_status) + MAP_CONTROL(IDC_ButtonConfirm, m_buttonConfirm) + END_CONTROL_MAP() + + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnDestroy(); + HRESULT OnNotifySelChanged( HXUIOBJ hObjSource, XUINotifySelChanged* pNotifySelChangedData, BOOL& bHandled ); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnGetSourceDataText(XUIMessageGetSourceText *pGetSourceTextData, BOOL& bHandled); + HRESULT OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ); + HRESULT OnTransitionEnd( XUIMessageTransition *pTransition, BOOL& bHandled ); + HRESULT OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ); +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_ConnectingProgress, L"CScene_ConnectingProgress", XUI_CLASS_SCENE ) + +private: + bool m_threadCompleted; + D3DXVECTOR3 m_OriginalPosition; + +}; diff --git a/Minecraft.Client/Common/XUI/XUI_Control_ComboBox.cpp b/Minecraft.Client/Common/XUI/XUI_Control_ComboBox.cpp new file mode 100644 index 00000000..0096da44 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Control_ComboBox.cpp @@ -0,0 +1,98 @@ +#include "stdafx.h" +#include "XUI_Control_ComboBox.h" +#include "..\Xbox_App.h" + +HRESULT CXuiControl4JComboBox::OnInit(XUIMessageInit *pInitData, BOOL& bHandled) +{ + m_ListData.nItems=0; + m_ListData.pItems=NULL; + + return S_OK; +} + +void CXuiControl4JComboBox::SetData(LIST_ITEM_INFO *pItems,int iCount) +{ + CXuiControl4JComboBox *pThis; + HRESULT hr = XuiObjectFromHandle(m_hObj, (void **) &pThis); + + // copy the data in + pThis->m_ListData.pItems= new LIST_ITEM_INFO [iCount] ; + memcpy(pThis->m_ListData.pItems,pItems,sizeof(LIST_ITEM_INFO)*iCount); + pThis->m_ListData.nItems=iCount; + + //InsertItems( 0, iCount ); +} + +int CXuiControl4JComboBox::GetSelectedIndex() +{ + return XuiListGetCurSel(GetListObject(),NULL); +} + +// Gets called every frame +HRESULT CXuiControl4JComboBox::OnGetSourceDataText(XUIMessageGetSourceText *pGetSourceTextData,BOOL& bHandled) +{ + if( ( 0 == pGetSourceTextData->iData ) && ( ( pGetSourceTextData->bItemData ) ) ) + { + pGetSourceTextData->szText = + m_ListData.pItems[pGetSourceTextData->iItem].pwszText; + bHandled = TRUE; + } + return S_OK; +} + +HRESULT CXuiControl4JComboBox::OnGetItemCountAll(XUIMessageGetItemCount *pGetItemCountData,BOOL& bHandled) +{ + pGetItemCountData->cItems = m_ListData.nItems; + bHandled = TRUE; + return S_OK; +} + +HRESULT CXuiControl4JComboBox::OnGetSourceDataImage(XUIMessageGetSourceImage *pGetSourceImageData,BOOL& bHandled) +{ + return S_OK; + + //if( ( 0 == pGetSourceImageData->iData ) && ( pGetSourceImageData->bItemData ) ) + //{ + // // Check for a brush + + // if(m_ListData.pItems[pGetSourceImageData->iItem].hXuiBrush!=NULL) + // { + // pGetSourceImageData->hBrush=m_ListData.pItems[pGetSourceImageData->iItem].hXuiBrush; + // } + // else + // { + // pGetSourceImageData->szPath = + // m_ListData.pItems[pGetSourceImageData->iItem].pwszImage; + // } + // bHandled = TRUE; + //} + //return S_OK; +} + +HRESULT CXuiControl4JComboBox::OnGetItemEnable(XUIMessageGetItemEnable *pGetItemEnableData,BOOL& bHandled) +{ + if(m_ListData.pItems!=NULL && m_ListData.nItems!=0) + { + pGetItemEnableData->bEnabled = + m_ListData.pItems[pGetItemEnableData->iItem].fEnabled; + } + bHandled = TRUE; + return S_OK; +} + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CXuiControl4JComboBox::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + // This assumes all buttons can only be pressed with the A button + CScene_Base::HandleKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + if(hObjPressed==GetValueObject()) + { + XuiElementSetShow(GetListObject(),TRUE); + XuiElementSetFocus(GetListObject()); + rfHandled = TRUE; + } + return S_OK; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Control_ComboBox.h b/Minecraft.Client/Common/XUI/XUI_Control_ComboBox.h new file mode 100644 index 00000000..28b61187 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Control_ComboBox.h @@ -0,0 +1,53 @@ +#pragma once + +class CXuiControl4JComboBox : public CXuiComboBoxImpl +{ +public: + + // Information for one list item. + typedef struct _LIST_ITEM_INFO + { + LPCWSTR pwszText; + LPCWSTR pwszImage; + HXUIBRUSH hXuiBrush; + BOOL fChecked; + BOOL fEnabled; + } + LIST_ITEM_INFO; + + // List data. + typedef struct _tagListData + { + int nItems; + LIST_ITEM_INFO *pItems; + } + LIST_DATA; + + LIST_DATA m_ListData; + XUI_IMPLEMENT_CLASS(CXuiControl4JComboBox, L"CXuiControl4JComboBox", XUI_CLASS_COMBOBOX); + + void SetData(_LIST_ITEM_INFO *pItems,int iCount); + int GetSelectedIndex(); + +protected: + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT(OnInit) + XUI_ON_XM_GET_SOURCE_TEXT(OnGetSourceDataText) + XUI_ON_XM_GET_ITEMCOUNT_ALL(OnGetItemCountAll) + XUI_ON_XM_GET_SOURCE_IMAGE(OnGetSourceDataImage) + XUI_ON_XM_GET_ITEMENABLE(OnGetItemEnable) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + + XUI_END_MSG_MAP() + + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnGetSourceDataText(XUIMessageGetSourceText *pGetSourceTextData, BOOL& bHandled); + HRESULT OnGetItemCountAll(XUIMessageGetItemCount *pGetItemCountData, BOOL& bHandled); + HRESULT OnGetSourceDataImage(XUIMessageGetSourceImage *pGetSourceImageData,BOOL& bHandled); + HRESULT OnGetItemEnable(XUIMessageGetItemEnable *pGetItemEnableData,BOOL& bHandled); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled); + + +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Controls.h b/Minecraft.Client/Common/XUI/XUI_Controls.h new file mode 100644 index 00000000..c1376ec0 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Controls.h @@ -0,0 +1,26 @@ +#pragma once + +#include "XUI_Ctrl_4JEdit.h" +#include "XUI_Ctrl_4JIcon.h" +#include "XUI_Ctrl_4JList.h" +#include "XUI_Ctrl_BrewProgress.h" +#include "XUI_Ctrl_BubblesProgress.h" +#include "XUI_Ctrl_BurnProgress.h" +#include "XUI_Ctrl_CraftIngredientSlot.h" +#include "XUI_Ctrl_EnchantButton.h" +#include "XUI_Ctrl_EnchantmentBook.h" +#include "XUI_Ctrl_EnchantmentButtonText.h" +#include "XUI_Ctrl_FireProgress.h" +#include "XUI_Ctrl_LoadingProgress.h" +#include "XUI_Ctrl_MinecraftPlayer.h" +#include "XUI_Ctrl_MinecraftSkinPreview.h" +#include "XUI_Ctrl_MinecraftSlot.h" +#include "XUI_Ctrl_MobEffect.h" +#include "XUI_Ctrl_PassthroughList.h" +#include "XUI_Ctrl_ProgressCtrlBase.h" +#include "XUI_Ctrl_SliderWrapper.h" +#include "XUI_Ctrl_SlotItem.h" +#include "XUI_Ctrl_SlotItemCtrlBase.h" +#include "XUI_Ctrl_SlotItemListItem.h" +#include "XUI_Ctrl_SlotList.h" +#include "XUI_Ctrl_SplashPulser.h" \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_4JEdit.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_4JEdit.cpp new file mode 100644 index 00000000..cc3afeca --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_4JEdit.cpp @@ -0,0 +1,200 @@ +#include "stdafx.h" +#include "XUI_Ctrl_4JEdit.h" + + + +HRESULT CXuiCtrl4JEdit::OnInit(XUIMessageInit* pInitData, BOOL& rfHandled) +{ + HRESULT hr=S_OK; + + // set a limit for the text box + m_uTextLimit=XUI_4JEDIT_MAX_CHARS-1; + XuiEditSetTextLimit(m_hObj,m_uTextLimit); + // Find the text limit. (Add one for NULL terminator) + //m_uTextLimit = min( XuiEditGetTextLimit(m_hObj) + 1, XUI_4JEDIT_MAX_CHARS); + + ZeroMemory( wchText , sizeof(WCHAR)*(m_uTextLimit+1) ); + + m_bReadOnly = false; + m_uiTitle = 0; + m_uiText =0; + m_eKeyboardMode=C_4JInput::EKeyboardMode_Default; + return hr; +} + + +HRESULT CXuiCtrl4JEdit::SetTextLimit(int iLimit) +{ + CXuiCtrl4JEdit *pThis; + HRESULT hr = XuiObjectFromHandle(m_hObj, (void **) &pThis); + if (FAILED(hr)) + return hr; + if(iLimitm_uTextLimit=iLimit; + XuiEditSetTextLimit(pThis->m_hObj,iLimit); + ZeroMemory( pThis->wchText , sizeof(WCHAR)*XUI_4JEDIT_MAX_CHARS ); + } + return S_OK; +} +HRESULT CXuiCtrl4JEdit::SetCaretPosition(int iPos) +{ + CXuiCtrl4JEdit *pThis; + HRESULT hr = XuiObjectFromHandle(m_hObj, (void **) &pThis); + if (FAILED(hr)) + return hr; + XuiEditSetCaretPosition(pThis->m_hObj,iPos); + return S_OK; +} + +HRESULT CXuiCtrl4JEdit::SetTitleAndText(unsigned int uiTitle, unsigned int uiText) +{ + CXuiCtrl4JEdit *pThis; + HRESULT hr = XuiObjectFromHandle(m_hObj, (void **) &pThis); + if (FAILED(hr)) + return hr; + pThis->m_uiTitle=uiTitle; + pThis->m_uiText=uiText; + + return S_OK; +} + +HRESULT CXuiCtrl4JEdit::SetReadOnly(bool bReadOnly) +{ + // Attempt to make the change on the actual original version of this object that XUI made itself, rather + // than the copy we make ourselves and then map to it, which shares the same handle + CXuiCtrl4JEdit *pThis; + HRESULT hr = XuiObjectFromHandle(m_hObj, (void **) &pThis); + if (FAILED(hr)) + return hr; + pThis->m_bReadOnly = bReadOnly; + + return S_OK; +} + +HRESULT CXuiCtrl4JEdit::SetKeyboardType(C_4JInput::EKeyboardMode eKeyboardMode) +{ + CXuiCtrl4JEdit *pThis; + HRESULT hr = XuiObjectFromHandle(m_hObj, (void **) &pThis); + if (FAILED(hr)) + return hr; + pThis->m_eKeyboardMode= eKeyboardMode; + return S_OK; +} + +// HRESULT CXuiCtrl4JEdit::SetIPMode(bool bIPMode) +// { +// // Attempt to make the change on the actual original version of this object that XUI made itself, rather +// // than the copy we make ourselves and then map to it, which shares the same handle +// CXuiCtrl4JEdit *pThis; +// HRESULT hr = XuiObjectFromHandle(m_hObj, (void **) &pThis); +// if (FAILED(hr)) +// return hr; +// pThis->m_bIPMode= bIPMode; +// +// return S_OK; +// } + +// HRESULT CXuiCtrl4JEdit::SetExtendedMode(bool bExtendedMode) +// { +// // Attempt to make the change on the actual original version of this object that XUI made itself, rather +// // than the copy we make ourselves and then map to it, which shares the same handle +// CXuiCtrl4JEdit *pThis; +// HRESULT hr = XuiObjectFromHandle(m_hObj, (void **) &pThis); +// if (FAILED(hr)) +// return hr; +// pThis->m_bExtendedMode= bExtendedMode; +// +// return S_OK; +// } + +HRESULT CXuiCtrl4JEdit::OnChar(XUIMessageChar* pInputData, BOOL& rfHandled) +{ + CXuiCtrl4JEdit *pThis; + HRESULT hr = XuiObjectFromHandle(m_hObj, (void **) &pThis); + if (FAILED(hr)) + return hr; + + HXUIOBJ hBaseObj; + + // need to send the key down to the base object, so that when we notify the parent, the edit control has been updated with the right text + hr=XuiGetBaseObject(pThis->m_hObj,&hBaseObj); + + XUIMessage xuiMsg; + XUIMessageChar xuiMsgChar; + XuiMessageChar( &xuiMsg, &xuiMsgChar, pInputData->wch, pInputData->dwFlags, pInputData->UserIndex ); + // Send the XM_CHAR message. + XuiSendMessage( hBaseObj, &xuiMsg ); + + rfHandled = TRUE; + SendNotifyValueChanged((int)pInputData->wch); + + return hr; +} + +HRESULT CXuiCtrl4JEdit::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + CXuiCtrl4JEdit *pThis; + HRESULT hr = XuiObjectFromHandle(m_hObj, (void **) &pThis); + if (FAILED(hr)) + return hr; + + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + //HRESULT hr = S_OK; + + if( pThis->m_bReadOnly ) return hr; + + // Find the text limit. (Add one for NULL terminator) + //m_uTextLimit = min( XuiEditGetTextLimit(m_hObj) + 1, XUI_4JEDIT_MAX_CHARS); + + if((((pInputData->dwKeyCode == VK_PAD_A) && (pInputData->wch == 0)) || (pInputData->dwKeyCode == VK_PAD_START)) && !(pInputData->dwFlags & XUI_INPUT_FLAG_REPEAT)) + { + pThis->RequestKeyboard(pInputData->UserIndex); + rfHandled = TRUE; + } + + return hr; +} + +void CXuiCtrl4JEdit::RequestKeyboard(int iPad) +{ + InputManager.RequestKeyboard(m_uiTitle,GetText(),m_uiText,iPad,wchText,m_uTextLimit+1,&CXuiCtrl4JEdit::KeyboardReturned,this,m_eKeyboardMode,app.GetStringTable()); +} + + +//----------------------------------------------------------------------------- +HRESULT CXuiCtrl4JEdit::SendNotifyValueChanged(int iValue) +{ + CXuiCtrl4JEdit *pThis; + HRESULT hr = XuiObjectFromHandle(m_hObj, (void **) &pThis); + if (FAILED(hr)) + return hr; + HXUIOBJ hParent; + //HRESULT hr=S_OK; + XUIMessage msg; + XUINotify msgNotify; + XUINotifyValueChanged msgNotifyValueChanged; + + XuiElementGetParent(pThis->m_hObj, &hParent); + XuiNotifyValueChanged(&msg, &msgNotify, &msgNotifyValueChanged, XuiGetOuter(pThis->m_hObj), iValue); + XuiBubbleMessage(XuiGetOuter(hParent), &msg); + + return hr; +} + +int CXuiCtrl4JEdit::KeyboardReturned(void *pParam,bool bSet) +{ + CXuiCtrl4JEdit* pClass = (CXuiCtrl4JEdit*)pParam; + HRESULT hr = S_OK; + + if(bSet) + { + pClass->SetText(pClass->wchText); + // need to move the caret to the end of the newly set text + XuiEditSetCaretPosition(pClass->m_hObj, (int)wcsnlen(pClass->wchText, 50)); + pClass->SendNotifyValueChanged(10); // 10 for a return + } + + return hr; +} diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_4JEdit.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_4JEdit.h new file mode 100644 index 00000000..f6899d19 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_4JEdit.h @@ -0,0 +1,44 @@ +#pragma once + +#include + +#define XUI_4JEDIT_MAX_CHARS 61 + +class CXuiCtrl4JEdit : public CXuiControlImpl +{ +public: + XUI_IMPLEMENT_CLASS(CXuiCtrl4JEdit, L"CXuiCtrl4JEdit", XUI_CLASS_EDIT) + +protected: + + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT(OnInit) + XUI_ON_XM_CHAR(OnChar) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_END_MSG_MAP() + + HRESULT OnInit(XUIMessageInit* pInitData, BOOL& rfHandled); + HRESULT OnChar(XUIMessageChar* pInputData, BOOL& rfHandled); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); +public: + HRESULT SetReadOnly(bool bReadOnly); +// HRESULT SetIPMode(bool bIPMode); +// HRESULT SetExtendedMode(bool bExtendedMode); + HRESULT SetKeyboardType(C_4JInput::EKeyboardMode eKeyboardMode); + HRESULT SetTextLimit(int iLimit); + HRESULT SetCaretPosition(int iPos); + HRESULT SetTitleAndText(unsigned int uiTitle, unsigned int uiText); + + void RequestKeyboard(int iPad); +protected: + bool m_bReadOnly; + C_4JInput::EKeyboardMode m_eKeyboardMode; + unsigned int m_uiTitle,m_uiText; + +private: + static int KeyboardReturned(void *pParam,bool bSet); + HRESULT SendNotifyValueChanged(int); + WCHAR wchText[XUI_4JEDIT_MAX_CHARS]; + unsigned int m_uTextLimit; +}; diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_4JIcon.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_4JIcon.cpp new file mode 100644 index 00000000..8895b60e --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_4JIcon.cpp @@ -0,0 +1,61 @@ +#include "stdafx.h" +#include "XUI_Ctrl_4JIcon.h" + +HRESULT CXuiCtrl4JIcon::OnInit(XUIMessageInit *pInitData, BOOL& bHandled) +{ + m_hBrush=NULL; + return S_OK; +} + +HRESULT CXuiCtrl4JIcon::OnGetSourceDataImage(XUIMessageGetSourceImage *pGetSourceImageData,BOOL& bHandled) +{ + XUIMessage Message; + XUIMessageGetSourceImage MsgGetImage; + HRESULT hr; + HXUIOBJ hObj; + + if(m_hBrush) + { + pGetSourceImageData->hBrush = m_hBrush; + bHandled = TRUE; + } + else + { + XuiMessageGetSourceImage(&Message, &MsgGetImage, pGetSourceImageData->iItem, pGetSourceImageData->iData, TRUE); + + hr = GetParent(&hObj); + + if (HRESULT_SUCCEEDED(hr)) + { + hr = XuiBubbleMessage(hObj, &Message); + + if (Message.bHandled) + { + pGetSourceImageData->hBrush = MsgGetImage.hBrush; + bHandled = TRUE; + } + } + } + return S_OK; +} + +HRESULT CXuiCtrl4JIcon::UseBrush(HXUIBRUSH hBrush) +{ + if( m_hBrush ) + { + XuiDestroyBrush( m_hBrush ); + } + m_hBrush = hBrush; + return XuiControlSetImageBrush(m_hObj,hBrush); +} + +HRESULT CXuiCtrl4JIcon::OnDestroy() +{ + + if( m_hBrush ) + { + XuiDestroyBrush( m_hBrush ); + } + + return S_OK; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_4JIcon.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_4JIcon.h new file mode 100644 index 00000000..d99f0c55 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_4JIcon.h @@ -0,0 +1,25 @@ +#pragma once + + +class CXuiCtrl4JIcon : public CXuiControlImpl +{ +public: + + XUI_IMPLEMENT_CLASS(CXuiCtrl4JIcon, L"CXuiCtrl4JIcon", XUI_CLASS_LABEL); + HRESULT UseBrush(HXUIBRUSH hBrush); + +protected: + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT(OnInit) + XUI_ON_XM_GET_SOURCE_IMAGE(OnGetSourceDataImage) + XUI_ON_XM_DESTROY( OnDestroy ) + XUI_END_MSG_MAP() + + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnGetSourceDataImage(XUIMessageGetSourceImage *pGetSourceImageData,BOOL& bHandled); + HRESULT OnDestroy(); + + HXUIBRUSH m_hBrush; +}; diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_4JList.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_4JList.cpp new file mode 100644 index 00000000..60c32909 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_4JList.cpp @@ -0,0 +1,405 @@ +#include "stdafx.h" +#include "XUI_Ctrl_4JList.h" + +static bool TimeSortFn(const void *a, const void *b); + +HRESULT CXuiCtrl4JList::OnInit(XUIMessageInit *pInitData, BOOL& bHandled) +{ + InitializeCriticalSection(&m_AccessListData); + + m_hSelectionChangedHandlerObj = NULL; + + return S_OK; +} + +void CXuiCtrl4JList::AddData( const LIST_ITEM_INFO& ItemInfo , int iSortListFromIndex, int iSortFunction) +{ + // need to allocate memory for the structure and its strings + // and remap the string pointers + DWORD dwBytes=0; + DWORD dwLen1=0; + DWORD dwLen2=0; + + if(ItemInfo.pwszText) + { + dwLen1=(int)wcslen(ItemInfo.pwszText)*sizeof(WCHAR); + dwBytes+=dwLen1+sizeof(WCHAR); + } + + if(ItemInfo.pwszImage) + { + dwLen2=(int)(wcslen(ItemInfo.pwszImage))*sizeof(WCHAR); + dwBytes+=dwLen2+sizeof(WCHAR); + } + + dwBytes+=sizeof( LIST_ITEM_INFO ); + LIST_ITEM_INFO *pItemInfo = (LIST_ITEM_INFO *)new BYTE[dwBytes]; + ZeroMemory(pItemInfo,dwBytes); + + XMemCpy( pItemInfo, &ItemInfo, sizeof( LIST_ITEM_INFO ) ); + if(dwLen1!=0) + { + XMemCpy( &pItemInfo[1], ItemInfo.pwszText, dwLen1 ); + pItemInfo->pwszText=(LPCWSTR)&pItemInfo[1]; + if(dwLen2!=0) + { + BYTE *pwszImage = ((BYTE *)&pItemInfo[1])+dwLen1+sizeof(WCHAR); + XMemCpy( pwszImage, ItemInfo.pwszImage, dwLen2 ); + pItemInfo->pwszImage=(LPCWSTR)pwszImage; + } + } + else if(dwLen2!=0) + { + XMemCpy( &pItemInfo[1], ItemInfo.pwszImage, dwLen2 ); + pItemInfo->pwszImage=(LPCWSTR)&pItemInfo[1]; + } + + EnterCriticalSection(&m_AccessListData); + + // need to remember the original index of this addition before it gets sorted - this will get used to load the game + if(iSortListFromIndex!=-1) + { + pItemInfo->iIndex=(int)m_vListData.size()-iSortListFromIndex; + } + else + { + pItemInfo->iIndex=(int)m_vListData.size(); + } + + // added to force a sort order for DLC + //pItemInfo->iSortIndex=iSortIndex; + + m_vListData.push_back(pItemInfo); + +#ifdef _DEBUG + + int iCount=0; + for (AUTO_VAR(it, m_vListData.begin()); it != m_vListData.end(); it++) + { + PLIST_ITEM_INFO pInfo=(PLIST_ITEM_INFO)*it; + app.DebugPrintf("%d. ",iCount++); + OutputDebugStringW(pInfo->pwszText); + app.DebugPrintf(" - %d\n",pInfo->iSortIndex); + + } +#endif + + + if(iSortListFromIndex!=-1) + { + switch(iSortFunction) + { + case eSortList_Date: + // sort from the index passed (to leave create world and tutorial in the saves list) + sort(m_vListData.begin()+iSortListFromIndex, m_vListData.end(),CXuiCtrl4JList::TimeSortFn); + break; + case eSortList_Alphabetical: + // alphabetical sort + sort(m_vListData.begin()+iSortListFromIndex, m_vListData.end(),CXuiCtrl4JList::AlphabeticSortFn); + break; + case eSortList_Index: + sort(m_vListData.begin()+iSortListFromIndex, m_vListData.end(),CXuiCtrl4JList::IndexSortFn); + break; + } + } + LeaveCriticalSection(&m_AccessListData); +// #ifdef _DEBUG +// +// iCount=0; +// for (AUTO_VAR(it, m_vListData.begin()); it != m_vListData.end(); it++) +// { +// PLIST_ITEM_INFO pInfo=(PLIST_ITEM_INFO)*it; +// app.DebugPrintf("After Sort - %d. ",iCount++); +// OutputDebugStringW(pInfo->pwszText); +// app.DebugPrintf(" - %d\n",pInfo->iSortIndex); +// +// } +// #endif + InsertItems( 0, 1 ); +} + +void CXuiCtrl4JList::RemoveAllData( ) +{ + EnterCriticalSection(&m_AccessListData); + + int iSize=(int)m_vListData.size(); + for(int i=0;ihXuiBrush ) + { + XuiDestroyBrush(pBack->hXuiBrush); + } + m_vListData.pop_back(); + DeleteItems( 0, 1 ); + } + + LeaveCriticalSection(&m_AccessListData); +} + +void CXuiCtrl4JList::SelectByUserData(int iData) +{ + for(unsigned int i = 0; i < m_vListData.size(); ++i) + { + if(m_vListData.at(i)->iData == iData) + { + SetCurSel(i); + SetTopItem(i); // scroll the item into view if it's not visible + break; + } + } +} + +int CXuiCtrl4JList::GetIndexByUserData(int iData) +{ + for(unsigned int i = 0; i < m_vListData.size(); ++i) + { + if(m_vListData.at(i)->iData == iData) + { + return i; + } + } + return 0; +} + +CXuiCtrl4JList::LIST_ITEM_INFO& CXuiCtrl4JList::GetData(DWORD dw) +{ + return *m_vListData[dw]; +} + +CXuiCtrl4JList::LIST_ITEM_INFO& CXuiCtrl4JList::GetDataiData(int iData) +{ + LIST_ITEM_INFO info; + + for(unsigned int i=0;idwHighDateTime)&&(info.fTime.dwLowDateTime==pFileTime->dwLowDateTime)) + { + return *m_vListData[i]; + } + } + + return *m_vListData[0]; +} + +bool CXuiCtrl4JList::TimeSortFn(const void *a, const void *b) +{ + CXuiCtrl4JList::LIST_ITEM_INFO *SaveDetailsA=(CXuiCtrl4JList::LIST_ITEM_INFO *)a; + CXuiCtrl4JList::LIST_ITEM_INFO *SaveDetailsB=(CXuiCtrl4JList::LIST_ITEM_INFO *)b; + + if(SaveDetailsA->fTime.dwHighDateTime > SaveDetailsB->fTime.dwHighDateTime) + { + return true; + } + else if(SaveDetailsA->fTime.dwHighDateTime == SaveDetailsB->fTime.dwHighDateTime) + { + if(SaveDetailsA->fTime.dwLowDateTime > SaveDetailsB->fTime.dwLowDateTime) + { + return true; + } + else + { + return false; + } + } + else + { + return false; + } + +} + +bool CXuiCtrl4JList::AlphabeticSortFn(const void *a, const void *b) +{ + CXuiCtrl4JList::LIST_ITEM_INFO *SaveDetailsA=(CXuiCtrl4JList::LIST_ITEM_INFO *)a; + CXuiCtrl4JList::LIST_ITEM_INFO *SaveDetailsB=(CXuiCtrl4JList::LIST_ITEM_INFO *)b; + + wstring wstr1=SaveDetailsA->pwszText; + wstring wstr2=SaveDetailsB->pwszText; + if(wstr1.compare(wstr2)<0) + { + return true; + } + + return false; +} + +bool CXuiCtrl4JList::IndexSortFn(const void *a, const void *b) +{ + CXuiCtrl4JList::LIST_ITEM_INFO *SaveDetailsA=(CXuiCtrl4JList::LIST_ITEM_INFO *)a; + CXuiCtrl4JList::LIST_ITEM_INFO *SaveDetailsB=(CXuiCtrl4JList::LIST_ITEM_INFO *)b; + + int iA=SaveDetailsA->iSortIndex; + int iB=SaveDetailsB->iSortIndex; + if(iA>iB) + { + return true; + } + + return false; +} + +void CXuiCtrl4JList::UpdateGraphic(int iItem,HXUIBRUSH hXuiBrush ) +{ + // need to update the one with the matching filetime + EnterCriticalSection(&m_AccessListData); + if( GetData(iItem).hXuiBrush ) + { + XuiDestroyBrush( GetData(iItem).hXuiBrush ); + } + GetData(iItem).hXuiBrush=hXuiBrush; + LeaveCriticalSection(&m_AccessListData); +} + +void CXuiCtrl4JList::UpdateText(int iItem,LPCWSTR pwszText ) +{ + // need to update the one with the matching filetime + EnterCriticalSection(&m_AccessListData); + GetData(iItem).pwszText=pwszText; + LeaveCriticalSection(&m_AccessListData); +} + +void CXuiCtrl4JList::UpdateGraphicFromiData(int iData,HXUIBRUSH hXuiBrush ) +{ + // need to update the one with the matching iData + EnterCriticalSection(&m_AccessListData); + if( GetDataiData(iData).hXuiBrush ) + { + XuiDestroyBrush( GetDataiData(iData).hXuiBrush ); + } + GetDataiData(iData).hXuiBrush=hXuiBrush; + LeaveCriticalSection(&m_AccessListData); +} + +void CXuiCtrl4JList::UpdateGraphic(FILETIME *pfTime,HXUIBRUSH hXuiBrush ) +{ + // need to update the one with the matching filetime + EnterCriticalSection(&m_AccessListData); + if( GetData(pfTime).hXuiBrush ) + { + XuiDestroyBrush( GetData(pfTime).hXuiBrush ); + } + GetData(pfTime).hXuiBrush=hXuiBrush; + LeaveCriticalSection(&m_AccessListData); +} + +// Gets called every frame +HRESULT CXuiCtrl4JList::OnGetSourceDataText(XUIMessageGetSourceText *pGetSourceTextData,BOOL& bHandled) +{ + if( ( 0 == pGetSourceTextData->iData ) && ( ( pGetSourceTextData->bItemData ) ) ) + { + EnterCriticalSection(&m_AccessListData); + pGetSourceTextData->szText = + GetData(pGetSourceTextData->iItem).pwszText; + LeaveCriticalSection(&m_AccessListData); + bHandled = TRUE; + } + return S_OK; +} + +HRESULT CXuiCtrl4JList::OnGetItemCountAll(XUIMessageGetItemCount *pGetItemCountData,BOOL& bHandled) +{ + pGetItemCountData->cItems = (int)m_vListData.size(); + bHandled = TRUE; + return S_OK; +} + +HRESULT CXuiCtrl4JList::OnGetSourceDataImage(XUIMessageGetSourceImage *pGetSourceImageData,BOOL& bHandled) +{ + if( ( 0 == pGetSourceImageData->iData ) && ( pGetSourceImageData->bItemData ) ) + { + // Check for a brush + EnterCriticalSection(&m_AccessListData); + if(GetData(pGetSourceImageData->iItem).hXuiBrush!=NULL) + { + pGetSourceImageData->hBrush=GetData(pGetSourceImageData->iItem).hXuiBrush; + } + else + { + pGetSourceImageData->szPath = + GetData(pGetSourceImageData->iItem).pwszImage; + } + LeaveCriticalSection(&m_AccessListData); + bHandled = TRUE; + } + return S_OK; +} + +HRESULT CXuiCtrl4JList::OnGetItemEnable(XUIMessageGetItemEnable *pGetItemEnableData,BOOL& bHandled) +{ + if(m_vListData.size()!=0) + { + EnterCriticalSection(&m_AccessListData); + pGetItemEnableData->bEnabled = + GetData(pGetItemEnableData->iItem).fEnabled; + LeaveCriticalSection(&m_AccessListData); + } + bHandled = TRUE; + return S_OK; +} + + +HRESULT CXuiCtrl4JList::SetBorder(DWORD dw,BOOL bShow) +{ + CXuiControl Control; + HXUIOBJ hVisual,hBorder; + GetItemControl(dw,&Control); + Control.GetVisual(&hVisual); + XuiElementGetChildById(hVisual,L"Border",&hBorder); + return XuiElementSetShow(hBorder,bShow); +} + +void CXuiCtrl4JList::SetSelectionChangedHandle(HXUIOBJ hObj) +{ + m_hSelectionChangedHandlerObj = hObj; +} + +HRESULT CXuiCtrl4JList::OnDestroy() +{ + DeleteCriticalSection(&m_AccessListData); + + if(m_vListData.size()!=0) + { + for (unsigned i = 0; i < m_vListData.size(); ++i) + { + if( m_vListData[i]->hXuiBrush ) + { + XuiDestroyBrush( m_vListData[i]->hXuiBrush ); + } + delete [] (BYTE *)m_vListData[i]; + } + } + return S_OK; +} + +HRESULT CXuiCtrl4JList::OnNotifySelChanged( HXUIOBJ hObjSource, XUINotifySelChanged* pNotifySelChangedData, BOOL& bHandled ) +{ + if(m_hSelectionChangedHandlerObj) + { + XUIMessage xuiMsg; + XUINotify xuiNotify; + XUINotifySelChanged xuiNotifySel; + XuiNotifySelChanged( &xuiMsg, &xuiNotify, &xuiNotifySel, hObjSource, pNotifySelChangedData->iItem, pNotifySelChangedData->iOldItem ); + XuiSendMessage( m_hSelectionChangedHandlerObj, &xuiMsg ); + + bHandled = xuiMsg.bHandled; + } + return S_OK; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_4JList.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_4JList.h new file mode 100644 index 00000000..11bdd456 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_4JList.h @@ -0,0 +1,78 @@ +#pragma once + + +class CXuiCtrl4JList : public CXuiListImpl +{ +public: + enum + { + eSortList_Date = 0, + eSortList_Alphabetical, + eSortList_Index, + }; + + // Information for one list item. + typedef struct _LIST_ITEM_INFO + { + LPCWSTR pwszText; + LPCWSTR pwszImage; + HXUIBRUSH hXuiBrush; + BOOL fChecked; + BOOL fEnabled; + bool bIsDamaged; // damaged save + FILETIME fTime; + int iData; // user data + int iIndex; // used for internal list sorting + int iSortIndex; // used to force an order for DLC + } + LIST_ITEM_INFO,*PLIST_ITEM_INFO; + + typedef std::vector LISTITEMINFOARRAY; + + XUI_IMPLEMENT_CLASS(CXuiCtrl4JList, L"CXuiCtrl4JList", XUI_CLASS_LIST); + + void AddData( const LIST_ITEM_INFO& ItemInfo , int iSortListFromIndex=-1, int iSortFunction=CXuiCtrl4JList::eSortList_Date); + void RemoveAllData( ); + void UpdateText(int iItem,LPCWSTR pwszText ); + void SelectByUserData(int iData); + int GetIndexByUserData(int iData); + + void UpdateGraphic(int iItem,HXUIBRUSH hXuiBrush ); + void UpdateGraphic(FILETIME *pfTime,HXUIBRUSH hXuiBrush ); + void UpdateGraphicFromiData(int iData,HXUIBRUSH hXuiBrush ); + LIST_ITEM_INFO& GetData(DWORD dw); + LIST_ITEM_INFO& GetData(FILETIME *pFileTime); + LIST_ITEM_INFO& GetDataiData(int iData); + HRESULT SetBorder(DWORD dw,BOOL bShow); // for a highlight around the current selected item in the controls layout + void SetSelectionChangedHandle(HXUIOBJ hObj); +protected: + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT(OnInit) + XUI_ON_XM_GET_SOURCE_TEXT(OnGetSourceDataText) + XUI_ON_XM_GET_ITEMCOUNT_ALL(OnGetItemCountAll) + XUI_ON_XM_GET_SOURCE_IMAGE(OnGetSourceDataImage) + XUI_ON_XM_GET_ITEMENABLE(OnGetItemEnable) + XUI_ON_XM_DESTROY( OnDestroy ) + XUI_ON_XM_NOTIFY_SELCHANGED( OnNotifySelChanged ) + XUI_END_MSG_MAP() + + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnGetSourceDataText(XUIMessageGetSourceText *pGetSourceTextData, BOOL& bHandled); + HRESULT OnGetItemCountAll(XUIMessageGetItemCount *pGetItemCountData, BOOL& bHandled); + HRESULT OnGetSourceDataImage(XUIMessageGetSourceImage *pGetSourceImageData,BOOL& bHandled); + HRESULT OnGetItemEnable(XUIMessageGetItemEnable *pGetItemEnableData,BOOL& bHandled); + HRESULT OnDestroy(); + HRESULT OnNotifySelChanged( HXUIOBJ hObjSource, XUINotifySelChanged* pNotifySelChangedData, BOOL& bHandled ); + + LISTITEMINFOARRAY m_vListData; + CRITICAL_SECTION m_AccessListData; + +private: + static bool AlphabeticSortFn(const void *a, const void *b); + static bool TimeSortFn(const void *a, const void *b); + static bool IndexSortFn(const void *a, const void *b); + + HXUIOBJ m_hSelectionChangedHandlerObj; +}; diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_BrewProgress.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_BrewProgress.cpp new file mode 100644 index 00000000..074b7300 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_BrewProgress.cpp @@ -0,0 +1,27 @@ +#include "stdafx.h" + +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\..\..\Minecraft.World\SharedConstants.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.alchemy.h" +#include "XUI_Ctrl_BrewProgress.h" + +int CXuiCtrlBrewProgress::GetValue() +{ + void* pvUserData; + this->GetUserData( &pvUserData ); + + if( pvUserData != NULL ) + { + BrewingStandTileEntity *pBrewingStandTileEntity = (BrewingStandTileEntity *)pvUserData; + + return pBrewingStandTileEntity->getBrewTime(); + } + + return 0; +} + +void CXuiCtrlBrewProgress::GetRange(int *pnRangeMin, int *pnRangeMax) +{ + *pnRangeMin = 0; + *pnRangeMax = PotionBrewing::BREWING_TIME_SECONDS * SharedConstants::TICKS_PER_SECOND; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_BrewProgress.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_BrewProgress.h new file mode 100644 index 00000000..2f057a76 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_BrewProgress.h @@ -0,0 +1,19 @@ +#pragma once +using namespace std; + +#include "XUI_Ctrl_ProgressCtrlBase.h" + +class CXuiCtrlBrewProgress : public CXuiCtrlProgressCtrlBase +{ +public: + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CXuiCtrlBrewProgress, L"CXuiCtrlBrewProgress", XUI_CLASS_PROGRESSBAR ) + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_GET_SOURCE_TEXT(OnGetSourceDataText) + XUI_END_MSG_MAP() + + virtual int GetValue(); + virtual void GetRange(int *pnRangeMin, int *pnRangeMax); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_BubblesProgress.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_BubblesProgress.cpp new file mode 100644 index 00000000..cc5d996f --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_BubblesProgress.cpp @@ -0,0 +1,52 @@ +#include "stdafx.h" + +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "XUI_Ctrl_BubblesProgress.h" + +int CXuiCtrlBubblesProgress::GetValue() +{ + void* pvUserData; + this->GetUserData( &pvUserData ); + + if( pvUserData != NULL ) + { + BrewingStandTileEntity *pBrewingStandTileEntity = (BrewingStandTileEntity *)pvUserData; + + int value = 0; + int bubbleStep = (pBrewingStandTileEntity->getBrewTime() / 2) % 7; + switch (bubbleStep) + { + case 0: + value = 0; + break; + case 6: + value = 5; + break; + case 5: + value = 10; + break; + case 4: + value = 15; + break; + case 3: + value = 20; + break; + case 2: + value = 25; + break; + case 1: + value = 30; + break; + } + + return value; + } + + return 0; +} + +void CXuiCtrlBubblesProgress::GetRange(int *pnRangeMin, int *pnRangeMax) +{ + *pnRangeMin = 0; + *pnRangeMax = 30; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_BubblesProgress.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_BubblesProgress.h new file mode 100644 index 00000000..4950cf72 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_BubblesProgress.h @@ -0,0 +1,19 @@ +#pragma once +using namespace std; + +#include "XUI_Ctrl_ProgressCtrlBase.h" + +class CXuiCtrlBubblesProgress : public CXuiCtrlProgressCtrlBase +{ +public: + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CXuiCtrlBubblesProgress, L"CXuiCtrlBubblesProgress", XUI_CLASS_PROGRESSBAR ) + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_GET_SOURCE_TEXT(OnGetSourceDataText) + XUI_END_MSG_MAP() + + virtual int GetValue(); + virtual void GetRange(int *pnRangeMin, int *pnRangeMax); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_BurnProgress.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_BurnProgress.cpp new file mode 100644 index 00000000..8e514094 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_BurnProgress.cpp @@ -0,0 +1,29 @@ +#include "stdafx.h" + +#include "..\..\..\Minecraft.World\FurnaceMenu.h" +#include "..\..\..\Minecraft.World\FurnaceTileEntity.h" +#include "XUI_Scene_Furnace.h" +#include "XUI_Ctrl_BurnProgress.h" + +int CXuiCtrlBurnProgress::GetValue() +{ + void* pvUserData; + this->GetUserData( &pvUserData ); + + if( pvUserData != NULL ) + { + FurnaceTileEntity *pFurnaceTileEntity = (FurnaceTileEntity *)pvUserData; + + // TODO This param is a magic number in Java but we should really define it somewhere with a name + // I think it is the number of states of the progress display (ie the max value) + return pFurnaceTileEntity->getBurnProgress( 24 ); + } + + return 0; +} + +void CXuiCtrlBurnProgress::GetRange(int *pnRangeMin, int *pnRangeMax) +{ + *pnRangeMin = 0; + *pnRangeMax = 24; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_BurnProgress.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_BurnProgress.h new file mode 100644 index 00000000..1c403e32 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_BurnProgress.h @@ -0,0 +1,19 @@ +#pragma once +using namespace std; + +#include "XUI_Ctrl_ProgressCtrlBase.h" + +class CXuiCtrlBurnProgress : public CXuiCtrlProgressCtrlBase +{ +public: + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CXuiCtrlBurnProgress, L"CXuiCtrlBurnProgress", XUI_CLASS_PROGRESSBAR ) + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_GET_SOURCE_TEXT(OnGetSourceDataText) + XUI_END_MSG_MAP() + + virtual int GetValue(); + virtual void GetRange(int *pnRangeMin, int *pnRangeMax); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_CraftIngredientSlot.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_CraftIngredientSlot.cpp new file mode 100644 index 00000000..82b6c3ed --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_CraftIngredientSlot.cpp @@ -0,0 +1,123 @@ +#include "stdafx.h" + +#include "XUI_Ctrl_CraftIngredientSlot.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" + +//----------------------------------------------------------------------------- +// CXuiCtrlMinecraftSlot class +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +CXuiCtrlCraftIngredientSlot::CXuiCtrlCraftIngredientSlot() +{ + m_iID=0; + m_Desc=NULL; + m_isFoil = false; + m_isDirty = false; + m_item = nullptr; +} + + + +//----------------------------------------------------------------------------- +HRESULT CXuiCtrlCraftIngredientSlot::OnInit(XUIMessageInit* pInitData, BOOL& rfHandled) +{ + HRESULT hr=S_OK; + + return hr; +} +//----------------------------------------------------------------------------- +HRESULT CXuiCtrlCraftIngredientSlot::OnCustomMessage_GetSlotItem(CustomMessage_GetSlotItem_Struct *pData, BOOL& bHandled) +{ + if( m_iID != 0 || m_item != NULL ) + { + pData->item = m_item; + pData->iItemBitField = MAKE_SLOTDISPLAY_ITEM_BITMASK(m_iID,m_iAuxVal,m_isFoil); + pData->iDataBitField = MAKE_SLOTDISPLAY_DATA_BITMASK(m_iPad, m_uiAlpha,m_bDecorations,m_iCount,m_iScale,0); + } + else + { + pData->iDataBitField = 0; + pData->szPath = L""; + } + pData->bDirty = m_isDirty ? TRUE : FALSE; + m_isDirty = false; + + bHandled = TRUE; + return S_OK; +} + +HRESULT CXuiCtrlCraftIngredientSlot::OnGetSourceText(XUIMessageGetSourceText *pGetSourceTextData,BOOL& bHandled) +{ + pGetSourceTextData->szText=m_Desc; + bHandled = TRUE; + + return S_OK; +} + +void CXuiCtrlCraftIngredientSlot::SetRedBox(BOOL bVal) +{ + HRESULT hr=S_OK; + + HXUIOBJ hObj,hObjChild; + hr=GetVisual(&hObj); + XuiElementGetChildById(hObj,L"BoxRed",&hObjChild); + XuiElementSetShow(hObjChild,bVal); + XuiElementGetChildById(hObj,L"Exclaim",&hObjChild); + XuiElementSetShow(hObjChild,bVal); +} + +void CXuiCtrlCraftIngredientSlot::SetIcon(int iPad, int iId,int iAuxVal, int iCount, int iScale, unsigned int uiAlpha,bool bDecorations,bool isFoil, BOOL bShow) +{ + m_item = nullptr; + m_iID=iId; + m_iAuxVal=iAuxVal; + + // 4J Stu - For clocks and compasses we set the aux value to a special one that signals we should use a default texture + // rather than the dynamic one for the player + // not right... auxvals for diggables are damage values, can be a lot higher + if( (m_iAuxVal & 0xFF) == 0xFF && !( iId == Item::clock_Id || iId == Item::compass_Id ) ) // 4J Stu - If the aux value is set to match any + m_iAuxVal = 0; + + // if the count comes in as 0, make it 1 + m_iCount=iCount==0?1:iCount; + m_iScale=iScale; + m_uiAlpha=uiAlpha; + m_bDecorations=bDecorations; + m_isFoil = isFoil; + + m_iPad = iPad; + m_isDirty = true; + + XuiElementSetShow(m_hObj,bShow); +} + +void CXuiCtrlCraftIngredientSlot::SetIcon(int iPad, shared_ptr item, int iScale, unsigned int uiAlpha,bool bDecorations, BOOL bShow) +{ + if(item == NULL) SetIcon(iPad, 0,0,0,0,0,false,false,bShow); + else + { + m_item = item; + m_iID = item->id; + m_iScale = iScale; + m_uiAlpha = uiAlpha; + m_bDecorations = bDecorations; + + m_iPad = iPad; + m_isDirty = true; + + XuiElementSetShow(m_hObj,bShow); + } +} + +void CXuiCtrlCraftIngredientSlot::SetDescription(LPCWSTR Desc) +{ + HRESULT hr=S_OK; + + HXUIOBJ hObj,hObjChild; + hr=GetVisual(&hObj); + XuiElementGetChildById(hObj,L"text_name",&hObjChild); + XuiControlSetText(hObjChild,Desc); + XuiElementSetShow(hObjChild,Desc==NULL?FALSE:TRUE); + m_Desc=Desc; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_CraftIngredientSlot.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_CraftIngredientSlot.h new file mode 100644 index 00000000..5cf7a7f4 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_CraftIngredientSlot.h @@ -0,0 +1,45 @@ +#pragma once + +#include +#include + + +//----------------------------------------------------------------------------- +// CXuiCtrlMinecraftSlot class +//----------------------------------------------------------------------------- +class CXuiCtrlCraftIngredientSlot : public CXuiControlImpl +{ +public: + XUI_IMPLEMENT_CLASS(CXuiCtrlCraftIngredientSlot, L"CXuiCtrlCraftIngredientSlot", XUI_CLASS_LABEL) + + CXuiCtrlCraftIngredientSlot(); + virtual ~CXuiCtrlCraftIngredientSlot() { }; + void SetRedBox(BOOL bVal); + void SetIcon(int iPad, int iId,int iAuxVal, int iCount, int iScale, unsigned int uiAlpha, bool bDecorations, bool isFoil = false, BOOL bShow=TRUE); + void SetIcon(int iPad, shared_ptr item, int iScale, unsigned int uiAlpha,bool bDecorations, BOOL bShow=TRUE); + void SetDescription(LPCWSTR Desc); +protected: + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT(OnInit) + XUI_ON_XM_GETSLOTITEM_MESSAGE(OnCustomMessage_GetSlotItem) + XUI_ON_XM_GET_SOURCE_TEXT(OnGetSourceText) + XUI_END_MSG_MAP() + + HRESULT OnCustomMessage_GetSlotItem(CustomMessage_GetSlotItem_Struct *pData, BOOL& bHandled); + HRESULT OnGetSourceText(XUIMessageGetSourceText *pGetSourceTextData, BOOL& bHandled); + HRESULT OnInit(XUIMessageInit* pInitData, BOOL& rfHandled); + +private: + shared_ptr m_item; + int m_iID; + int m_iAuxVal; + int m_iCount; + int m_iScale; + unsigned int m_uiAlpha; + int m_iPad; + bool m_bDecorations; + bool m_isFoil; + LPCWSTR m_Desc; + bool m_isDirty; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantButton.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantButton.cpp new file mode 100644 index 00000000..dfb9b5ca --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantButton.cpp @@ -0,0 +1,90 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\Font.h" +#include "..\..\Lighting.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "XUI_Scene_Enchant.h" +#include "XUI_Ctrl_EnchantButton.h" + +//----------------------------------------------------------------------------- +HRESULT CXuiCtrlEnchantmentButton::OnInit(XUIMessageInit* pInitData, BOOL& rfHandled) +{ + HRESULT hr=S_OK; + + Minecraft *pMinecraft=Minecraft::GetInstance(); + + ScreenSizeCalculator ssc(pMinecraft->options, pMinecraft->width_phys, pMinecraft->height_phys); + m_fScreenWidth=(float)pMinecraft->width_phys; + m_fRawWidth=(float)ssc.rawWidth; + m_fScreenHeight=(float)pMinecraft->height_phys; + m_fRawHeight=(float)ssc.rawHeight; + + HXUIOBJ parent = m_hObj; + HXUICLASS hcInventoryClass = XuiFindClass( L"CXuiSceneEnchant" ); + HXUICLASS currentClass; + + do + { + XuiElementGetParent(parent,&parent); + currentClass = XuiGetObjectClass( parent ); + } while (parent != NULL && !XuiClassDerivesFrom( currentClass, hcInventoryClass ) ); + + assert( parent != NULL ); + + VOID *pObj; + XuiObjectFromHandle( parent, &pObj ); + m_containerScene = (CXuiSceneEnchant *)pObj; + + m_index = 0; + m_lastCost = 0; + m_iPad = 0; + m_costString = L""; + + return hr; +} + +void CXuiCtrlEnchantmentButton::SetData(int iPad, int index) +{ + m_iPad = iPad; + m_index = index; +} + +HRESULT CXuiCtrlEnchantmentButton::OnGetSourceDataText(XUIMessageGetSourceText *pGetSourceTextData, BOOL& bHandled) +{ + EnchantmentMenu *menu = m_containerScene->getMenu(); + + int cost = menu->costs[m_index]; + + if(cost != m_lastCost) + { + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(cost > pMinecraft->localplayers[m_iPad]->experienceLevel && !pMinecraft->localplayers[m_iPad]->abilities.instabuild) + { + // Dark background + SetEnable(FALSE); + } + else + { + // Light background and focus background + SetEnable(TRUE); + } + m_costString = _toString(cost); + m_lastCost = cost; + } + if(cost == 0) + { + // Dark background + SetEnable(FALSE); + pGetSourceTextData->bDisplay = FALSE; + } + else + { + pGetSourceTextData->szText = m_costString.c_str(); + pGetSourceTextData->bDisplay = TRUE; + } + + bHandled = TRUE; + + return S_OK; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantButton.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantButton.h new file mode 100644 index 00000000..0b414d69 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantButton.h @@ -0,0 +1,33 @@ +#pragma once + +class CXuiSceneEnchant; + +class CXuiCtrlEnchantmentButton : public CXuiControlImpl +{ + friend class CXuiCtrlEnchantmentButtonText; +public: + XUI_IMPLEMENT_CLASS(CXuiCtrlEnchantmentButton, L"CXuiCtrlEnchantmentButton", XUI_CLASS_CONTROL) + +protected: + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT(OnInit) + XUI_ON_XM_GET_SOURCE_TEXT(OnGetSourceDataText) + XUI_END_MSG_MAP() + + HRESULT OnInit(XUIMessageInit* pInitData, BOOL& rfHandled); + HRESULT OnGetSourceDataText(XUIMessageGetSourceText *pGetSourceTextData, BOOL& bHandled); + +public: + void SetData(int iPad, int index); + +private: + int m_iPad; + int m_index; + int m_lastCost; + wstring m_costString; + CXuiSceneEnchant *m_containerScene; + + float m_fScreenWidth,m_fScreenHeight; + float m_fRawWidth,m_fRawHeight; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantmentBook.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantmentBook.cpp new file mode 100644 index 00000000..8a56a0ea --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantmentBook.cpp @@ -0,0 +1,346 @@ +#include "stdafx.h" + +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" + +#include "..\..\Minecraft.h" +#include "..\..\ScreenSizeCalculator.h" +#include "..\..\TileEntityRenderDispatcher.h" +#include "..\..\EnchantTableRenderer.h" +#include "..\..\Lighting.h" +#include "..\..\LocalPlayer.h" + +#include "XUI_Scene_Enchant.h" + +#include "XUI_Ctrl_EnchantmentBook.h" +#include "..\..\BookModel.h" +#include "..\..\Options.h" + +//----------------------------------------------------------------------------- +// CXuiCtrlEnchantmentBook class +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +CXuiCtrlEnchantmentBook::CXuiCtrlEnchantmentBook() : + m_bDirty(FALSE), + m_fScale(1.0f), + m_fAlpha(1.0f) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + + ScreenSizeCalculator ssc(pMinecraft->options, pMinecraft->width_phys, pMinecraft->height_phys); + m_fScreenWidth=(float)pMinecraft->width_phys; + m_fRawWidth=(float)ssc.rawWidth; + m_fScreenHeight=(float)pMinecraft->height_phys; + m_fRawHeight=(float)ssc.rawHeight; + + model = NULL; + + time = 0; + flip = oFlip = flipT = flipA = 0.0f; + open = oOpen = 0.0f; +} + +CXuiCtrlEnchantmentBook::~CXuiCtrlEnchantmentBook() +{ + //if(model != NULL) delete model; +} + +//----------------------------------------------------------------------------- +HRESULT CXuiCtrlEnchantmentBook::OnInit(XUIMessageInit* pInitData, BOOL& rfHandled) +{ + HRESULT hr=S_OK; + + HXUIOBJ parent = m_hObj; + HXUICLASS hcInventoryClass = XuiFindClass( L"CXuiSceneEnchant" ); + HXUICLASS currentClass; + + do + { + XuiElementGetParent(parent,&parent); + currentClass = XuiGetObjectClass( parent ); + } while (parent != NULL && !XuiClassDerivesFrom( currentClass, hcInventoryClass ) ); + + assert( parent != NULL ); + + VOID *pObj; + XuiObjectFromHandle( parent, &pObj ); + m_containerScene = (CXuiSceneEnchant *)pObj; + + last = nullptr; + + m_iPad = m_containerScene->getPad(); + + return hr; +} + +HRESULT CXuiCtrlEnchantmentBook::OnRender(XUIMessageRender *pRenderData, BOOL &bHandled ) +{ +#ifdef _XBOX + HXUIDC hDC = pRenderData->hDC; + + // build and render with the game call + + RenderManager.Set_matrixDirty(); + + Minecraft *pMinecraft=Minecraft::GetInstance(); + + float alpha = 1.0f; + //GetOpacity( &alpha ); + + + D3DXMATRIX matrix; + GetFullXForm(&matrix); + + float bwidth,bheight; + GetBounds(&bwidth,&bheight); + + glColor4f(1, 1, 1, alpha); + + // Annoyingly, XUI renders everything to a z of 0 so if we want to render anything that needs the z-buffer on top of it, then we need to clear it. + // Clear just the region required for this control. + D3DRECT clearRect; + clearRect.x1 = (int)(matrix._41) - 2; + clearRect.y1 = (int)(matrix._42) - 2; + clearRect.x2 = (int)(matrix._41 + ( bwidth * matrix._11 )) + 2; + clearRect.y2 = (int)(matrix._42 + ( bheight * matrix._22 )) + 2; + + RenderManager.Clear(GL_DEPTH_BUFFER_BIT, &clearRect); + + glClear(GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, m_fRawWidth, m_fRawHeight, 0, 1000, 3000); + //gluPerspective(90, (float) (320 / 240.0f), 0.5f, 3000); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0, 0, -2000); + + float xo = ( (matrix._41 + ( (bwidth*matrix._11)/2) ) / m_fScreenWidth ) * m_fRawWidth; + float yo = ( (matrix._42 + ((bheight*matrix._22)/2) ) / m_fScreenHeight ) * m_fRawHeight; + + glEnable(GL_RESCALE_NORMAL); + glEnable(GL_COLOR_MATERIAL); + + glPushMatrix(); + glTranslatef(xo, yo, 50.0f); + float ss; + + // Base scale on height of this control + // Potentially we might want separate x & y scales here + ss = ( ( (bheight*matrix._22) / m_fScreenHeight ) * m_fRawHeight ) * 1.5f; + + glScalef(-ss, ss, ss); + //glRotatef(180, 0, 0, 1); + + glRotatef(45 + 90, 0, 1, 0); + Lighting::turnOn(); + glRotatef(-45 - 90, 0, 1, 0); + + //float sss = 4; + + //glTranslatef(0, 3.3f, -16); + //glScalef(sss, sss, sss); + + int tex = pMinecraft->textures->loadTexture(TN_ITEM_BOOK); // 4J was L"/1_2_2/item/book.png" + pMinecraft->textures->bind(tex); + + glRotatef(20, 1, 0, 0); + + float a = 1; + float o = oOpen + (open - oOpen) * a; + glTranslatef((1 - o) * 0.2f, (1 - o) * 0.1f, (1 - o) * 0.25f); + glRotatef(-(1 - o) * 90 - 90, 0, 1, 0); + glRotatef(180, 1, 0, 0); + + float ff1 = oFlip + (flip - oFlip) * a + 0.25f; + float ff2 = oFlip + (flip - oFlip) * a + 0.75f; + ff1 = (ff1 - floor(ff1)) * 1.6f - 0.3f; + ff2 = (ff2 - floor(ff2)) * 1.6f - 0.3f; + + if (ff1 < 0) ff1 = 0; + if (ff2 < 0) ff2 = 0; + if (ff1 > 1) ff1 = 1; + if (ff2 > 1) ff2 = 1; + + glEnable(GL_CULL_FACE); + + if(model == NULL) + { + // Share the model the the EnchantTableRenderer + + EnchantTableRenderer *etr = (EnchantTableRenderer*)TileEntityRenderDispatcher::instance->getRenderer(eTYPE_ENCHANTMENTTABLEENTITY); + if(etr != NULL) + { + model = etr->bookModel; + } + else + { + model = new BookModel(); + } + } + + model->render(NULL, 0, ff1, ff2, o, 0, 1 / 16.0f,true); + glDisable(GL_CULL_FACE); + + glPopMatrix(); + Lighting::turnOff(); + glDisable(GL_RESCALE_NORMAL); + + XuiRenderRestoreState(hDC); + + tickBook(); + + bHandled = TRUE; + +#endif + return S_OK; +} + +//HRESULT CXuiCtrlEnchantmentBook::OnRender(XUIMessageRender *pRenderData, BOOL &bHandled ) +//{ +// HXUIDC hDC = pRenderData->hDC; +// +// RenderManager.Set_matrixDirty(); +// +// Minecraft *minecraft = Minecraft::GetInstance(); +// +// // 4J JEV: Inputs in the java, dunno what they are. +// float a = 1; +// +// D3DXMATRIX matrix; +// CXuiControl xuiControl(m_hObj); +// xuiControl.GetFullXForm(&matrix); +// float bwidth,bheight; +// xuiControl.GetBounds(&bwidth,&bheight); +// +// D3DXVECTOR3 vec, vecP, vecPP; +// xuiControl.GetPosition(&vec); +// +// CXuiElement parent, scene; +// xuiControl.GetParent(&parent); +// parent.GetPosition(&vecP); +// parent.GetParent(&scene); +// scene.GetPosition(&vecPP); +// +// float xo = ( (matrix._41 + ( (bwidth*matrix._11)/2) ) / m_fScreenWidth ) * m_fRawWidth; +// float yo = ( (matrix._42 + (bheight*matrix._22) ) / m_fScreenHeight ) * m_fRawHeight; +// +// glColor4f(1, 1, 1, 1); +// +// glPushMatrix(); +// glMatrixMode(GL_PROJECTION); +// glPushMatrix(); +// glLoadIdentity(); +// +// ScreenSizeCalculator ssc = ScreenSizeCalculator(minecraft->options, minecraft->width, minecraft->height); +// +// //glViewport((int) (ssc.getWidth() - 320) / 2 * ssc.scale, (int) (ssc.getHeight() - 240) / 2 * ssc.scale, (int) (320 * ssc.scale), (int) (240 * ssc.scale)); +// +// // 4J JEV: Trying to position it within the XUI element +// float xPos, yPos; +// xPos = (vec.x + vecP.x + vecPP.x) / (minecraft->width/2); xPos = xPos - 1; xPos = 2*xPos/3; +// yPos = (vec.y + vecP.y + vecPP.y) / (minecraft->height/2); yPos = 1 - yPos; yPos = 2*yPos/3; +// glTranslatef(xPos, yPos, 0); +// +// gluPerspective(90, (float) (320 / 240.0f), 9, 80); +// +// float sss = 1; +// glMatrixMode(GL_MODELVIEW); +// glLoadIdentity(); +// Lighting::turnOn(); +// +// glTranslatef(0, 3.3f, -16); +// glScalef(sss, sss, sss); +// +// float ss = 5; +// +// glScalef(ss, ss, ss); +// glRotatef(180, 0, 0, 1); +// +// int tex = minecraft->textures->loadTexture(TN_ITEM_BOOK); // 4J was L"/1_2_2/item/book.png" +// minecraft->textures->bind(tex); +// +// glRotatef(20, 1, 0, 0); +// +// float o = oOpen + (open - oOpen) * a; +// glTranslatef((1 - o) * 0.2f, (1 - o) * 0.1f, (1 - o) * 0.25f); +// glRotatef(-(1 - o) * 90 - 90, 0, 1, 0); +// glRotatef(180, 1, 0, 0); +// +// float ff1 = oFlip + (flip - oFlip) * a + 0.25f; +// float ff2 = oFlip + (flip - oFlip) * a + 0.75f; +// ff1 = (ff1 - floor(ff1)) * 1.6f - 0.3f; +// ff2 = (ff2 - floor(ff2)) * 1.6f - 0.3f; +// +// if (ff1 < 0) ff1 = 0; +// if (ff2 < 0) ff2 = 0; +// if (ff1 > 1) ff1 = 1; +// if (ff2 > 1) ff2 = 1; +// +// glEnable(GL_RESCALE_NORMAL); +// +// model.render(NULL, 0, ff1, ff2, o, 0, 1 / 16.0f,true); +// +// glDisable(GL_RESCALE_NORMAL); +// Lighting::turnOff(); +// glMatrixMode(GL_PROJECTION); +// //glViewport(0, 0, minecraft->width, minecraft->height); +// glPopMatrix(); +// glMatrixMode(GL_MODELVIEW); +// glPopMatrix(); +// +// Lighting::turnOff(); +// glColor4f(1, 1, 1, 1); +// +// XuiRenderRestoreState(hDC); +// +// tickBook(); +// +// bHandled = TRUE; +// +// return S_OK; +//} + +void CXuiCtrlEnchantmentBook::tickBook() +{ + EnchantmentMenu *menu = m_containerScene->getMenu(); + shared_ptr current = menu->getSlot(0)->getItem(); + if (!ItemInstance::matches(current, last)) + { + last = current; + + do + { + flipT += random.nextInt(4) - random.nextInt(4); + } while (flip <= flipT + 1 && flip >= flipT - 1); + } + + time++; + oFlip = flip; + oOpen = open; + + bool shouldBeOpen = false; + for (int i = 0; i < 3; i++) + { + if (menu->costs[i] != 0) + { + shouldBeOpen = true; + } + } + + if (shouldBeOpen) open += 0.2f; + else open -= 0.2f; + if (open < 0) open = 0; + if (open > 1) open = 1; + + + float diff = (flipT - flip) * 0.4f; + float max = 0.2f; + if (diff < -max) diff = -max; + if (diff > +max) diff = +max; + flipA += (diff - flipA) * 0.9f; + + flip = flip + flipA; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantmentBook.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantmentBook.h new file mode 100644 index 00000000..93da0768 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantmentBook.h @@ -0,0 +1,51 @@ +#pragma once +#include "..\..\..\Minecraft.World\Random.h" + +using namespace std; + +class CXuiSceneEnchant; +class BookModel; + +//----------------------------------------------------------------------------- +// CXuiCtrlEnchantPanel class +//----------------------------------------------------------------------------- +class CXuiCtrlEnchantmentBook : public CXuiControlImpl +{ +public: + XUI_IMPLEMENT_CLASS(CXuiCtrlEnchantmentBook, L"CXuiCtrlEnchantmentBook", XUI_CLASS_LABEL) + + CXuiCtrlEnchantmentBook(); + virtual ~CXuiCtrlEnchantmentBook(); + + void setChanged(); + void setOpen(bool); + +protected: + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT(OnInit) + XUI_ON_XM_RENDER(OnRender) + XUI_END_MSG_MAP() + + HRESULT OnInit(XUIMessageInit* pInitData, BOOL& rfHandled); + HRESULT OnRender(XUIMessageRender *pRenderData, BOOL &rfHandled); + +private: + BookModel *model; + Random random; + + // 4J JEV: Book animation variables. + int time; + float flip, oFlip, flipT, flipA; + float open, oOpen; + + BOOL m_bDirty; + float m_fScale,m_fAlpha; + int m_iPad; + CXuiSceneEnchant *m_containerScene; + shared_ptr last; + + float m_fScreenWidth,m_fScreenHeight; + float m_fRawWidth,m_fRawHeight; + + void tickBook(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantmentButtonText.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantmentButtonText.cpp new file mode 100644 index 00000000..702ef15d --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantmentButtonText.cpp @@ -0,0 +1,185 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\Font.h" +#include "..\..\Lighting.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "XUI_Scene_Enchant.h" +#include "XUI_Ctrl_EnchantButton.h" +#include "XUI_Ctrl_EnchantmentButtonText.h" +#include "..\..\Minecraft.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\TexturePack.h" + +#include +#include +#include +#include +#include + +//----------------------------------------------------------------------------- +HRESULT CXuiCtrlEnchantmentButtonText::OnInit(XUIMessageInit* pInitData, BOOL& rfHandled) +{ + HRESULT hr=S_OK; + + Minecraft *pMinecraft=Minecraft::GetInstance(); + + ScreenSizeCalculator ssc(pMinecraft->options, pMinecraft->width_phys, pMinecraft->height_phys); + m_fScreenWidth=(float)pMinecraft->width_phys; + m_fRawWidth=(float)ssc.rawWidth; + m_fScreenHeight=(float)pMinecraft->height_phys; + m_fRawHeight=(float)ssc.rawHeight; + + HXUIOBJ parent = m_hObj; + HXUICLASS hcInventoryClass = XuiFindClass( L"CXuiCtrlEnchantmentButton" ); + HXUICLASS currentClass; + + do + { + XuiElementGetParent(parent,&parent); + currentClass = XuiGetObjectClass( parent ); + } while (parent != NULL && !XuiClassDerivesFrom( currentClass, hcInventoryClass ) ); + + assert( parent != NULL ); + + VOID *pObj; + XuiObjectFromHandle( parent, &pObj ); + m_parentControl = (CXuiCtrlEnchantmentButton *)pObj; + + m_lastCost = 0; + m_enchantmentString = L""; + + m_textColour = app.GetHTMLColour(eTextColor_Enchant); + m_textFocusColour = app.GetHTMLColour(eTextColor_EnchantFocus); + m_textDisabledColour = app.GetHTMLColour(eTextColor_EnchantDisabled); + + return hr; +} + +HRESULT CXuiCtrlEnchantmentButtonText::OnRender(XUIMessageRender *pRenderData, BOOL &bHandled ) +{ + HXUIDC hDC = pRenderData->hDC; + CXuiControl xuiControl(m_hObj); + + // build and render with the game call + + RenderManager.Set_matrixDirty(); + + Minecraft *pMinecraft=Minecraft::GetInstance(); + + D3DXMATRIX matrix; + xuiControl.GetFullXForm(&matrix); + float bwidth,bheight; + xuiControl.GetBounds(&bwidth,&bheight); + + // Annoyingly, XUI renders everything to a z of 0 so if we want to render anything that needs the z-buffer on top of it, then we need to clear it. + // Clear just the region required for this control. + D3DRECT clearRect; + clearRect.x1 = (int)(matrix._41) - 2; + clearRect.y1 = (int)(matrix._42) - 2; + clearRect.x2 = (int)(matrix._41 + ( bwidth * matrix._11 )) + 2; + clearRect.y2 = (int)(matrix._42 + ( bheight * matrix._22 )) + 2; + + RenderManager.Clear(GL_DEPTH_BUFFER_BIT, &clearRect); + // glClear(GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, m_fScreenWidth, m_fScreenHeight, 0, 1000, 3000); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0, 0, -2000); + + + glEnable(GL_RESCALE_NORMAL); + glPushMatrix(); + glRotatef(120, 1, 0, 0); + //Lighting::turnOnGui(); + glPopMatrix(); + + + + EnchantmentMenu *menu = m_parentControl->m_containerScene->getMenu(); + + float xo = matrix._41; + float yo = matrix._42; + glTranslatef(xo, yo, 50.0f); + + float ss = 1; + + if(!m_parentControl->m_containerScene->m_bSplitscreen) + { + ss = 2; + } + + glScalef(ss, ss, ss); + + int cost = menu->costs[m_parentControl->m_index]; + + if(cost != m_lastCost) + { + m_lastCost = cost; + m_enchantmentString = EnchantmentNames::instance.getRandomName(); + } + + glColor4f(1, 1, 1, 1); + if (cost != 0) + { + wstring line = _toString(cost); + Font *font = pMinecraft->altFont; + //int col = 0x685E4A; + unsigned int col = m_textColour; + if (pMinecraft->localplayers[m_parentControl->m_iPad]->experienceLevel < cost && !pMinecraft->localplayers[m_parentControl->m_iPad]->abilities.instabuild) + { + col = m_textDisabledColour; + font->drawWordWrap(m_enchantmentString, 0, 0, bwidth/ss, col, bheight/ss); + font = pMinecraft->font; + //col = (0x80ff20 & 0xfefefe) >> 1; + //font->drawShadow(line, (bwidth - font->width(line))/ss, 7, col); + } + else + { + if (m_parentControl->HasFocus()) + { + //col = 0xffff80; + col = m_textFocusColour; + } + font->drawWordWrap(m_enchantmentString, 0, 0, bwidth/ss, col, bheight/ss); + font = pMinecraft->font; + //col = 0x80ff20; + //font->drawShadow(line, (bwidth - font->width(line))/ss, 7, col); + } + } + else + { + } + + //Lighting::turnOff(); + glDisable(GL_RESCALE_NORMAL); + + XuiRenderRestoreState(hDC); + + bHandled = TRUE; + + return S_OK; +} + +CXuiCtrlEnchantmentButtonText::EnchantmentNames CXuiCtrlEnchantmentButtonText::EnchantmentNames::instance; + +CXuiCtrlEnchantmentButtonText::EnchantmentNames::EnchantmentNames() +{ + wstring allWords = L"the elder scrolls klaatu berata niktu xyzzy bless curse light darkness fire air earth water hot dry cold wet ignite snuff embiggen twist shorten stretch fiddle destroy imbue galvanize enchant free limited range of towards inside sphere cube self other ball mental physical grow shrink demon elemental spirit animal creature beast humanoid undead fresh stale "; + std::wistringstream iss(allWords); + std::copy(std::istream_iterator< std::wstring, wchar_t, std::char_traits >(iss), std::istream_iterator< std::wstring, wchar_t, std::char_traits >(),std::back_inserter(words)); +} + +wstring CXuiCtrlEnchantmentButtonText::EnchantmentNames::getRandomName() +{ + int wordCount = random.nextInt(2) + 3; + wstring word = L""; + for (int i = 0; i < wordCount; i++) + { + if (i > 0) word += L" "; + word += words[random.nextInt(words.size())]; + } + return word; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantmentButtonText.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantmentButtonText.h new file mode 100644 index 00000000..c28b29ed --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_EnchantmentButtonText.h @@ -0,0 +1,45 @@ +#pragma once + +class CXuiSceneEnchant; + +class CXuiCtrlEnchantmentButtonText : public CXuiControlImpl +{ +public: + XUI_IMPLEMENT_CLASS(CXuiCtrlEnchantmentButtonText, L"CXuiCtrlEnchantmentButtonText", XUI_CLASS_CONTROL) + +protected: + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT(OnInit) + XUI_ON_XM_RENDER(OnRender) + XUI_END_MSG_MAP() + + HRESULT OnInit(XUIMessageInit* pInitData, BOOL& rfHandled); + HRESULT OnRender(XUIMessageRender *pRenderData, BOOL &rfHandled); + +private: + CXuiCtrlEnchantmentButton *m_parentControl; + + float m_fScreenWidth,m_fScreenHeight; + float m_fRawWidth,m_fRawHeight; + + int m_lastCost; + wstring m_enchantmentString; + + unsigned int m_textColour, m_textFocusColour, m_textDisabledColour; + + class EnchantmentNames + { + public: + static EnchantmentNames instance; + + private: + Random random; + vector words; + + EnchantmentNames(); + + public: + wstring getRandomName(); + }; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_FireProgress.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_FireProgress.cpp new file mode 100644 index 00000000..b125af39 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_FireProgress.cpp @@ -0,0 +1,29 @@ +#include "stdafx.h" + +#include "..\..\..\Minecraft.World\FurnaceMenu.h" +#include "..\..\..\Minecraft.World\FurnaceTileEntity.h" +#include "XUI_Scene_Furnace.h" +#include "XUI_Ctrl_FireProgress.h" + +int CXuiCtrlFireProgress::GetValue() +{ + void* pvUserData; + this->GetUserData( &pvUserData ); + + if( pvUserData != NULL ) + { + FurnaceTileEntity *pFurnaceTileEntity = (FurnaceTileEntity *)pvUserData; + + // TODO This param is a magic number in Java but we should really define it somewhere with a name + // I think it is the number of states of the progress display (ie the max value) + return pFurnaceTileEntity->getLitProgress( 12 ); + } + + return 0; +} + +void CXuiCtrlFireProgress::GetRange(int *pnRangeMin, int *pnRangeMax) +{ + *pnRangeMin = 0; + *pnRangeMax = 12; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_FireProgress.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_FireProgress.h new file mode 100644 index 00000000..595072ef --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_FireProgress.h @@ -0,0 +1,19 @@ +#pragma once +using namespace std; + +#include "XUI_Ctrl_ProgressCtrlBase.h" + +class CXuiCtrlFireProgress : public CXuiCtrlProgressCtrlBase +{ +public: + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CXuiCtrlFireProgress, L"CXuiCtrlFireProgress", XUI_CLASS_PROGRESSBAR ) + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_GET_SOURCE_TEXT(OnGetSourceDataText) + XUI_END_MSG_MAP() + + virtual int GetValue(); + virtual void GetRange(int *pnRangeMin, int *pnRangeMax); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_LoadingProgress.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_LoadingProgress.cpp new file mode 100644 index 00000000..3bb33440 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_LoadingProgress.cpp @@ -0,0 +1,21 @@ +#include "stdafx.h" + +#include "XUI_Ctrl_LoadingProgress.h" +#include "..\..\Minecraft.h" +#include "..\..\ProgressRenderer.h" + +int CXuiCtrlLoadingProgress::GetValue() +{ + int currentValue = 0; + + Minecraft *pMinecraft=Minecraft::GetInstance(); + currentValue = pMinecraft->progressRenderer->getCurrentPercent(); + //printf("About to render progress of %d\n", currentValue); + return currentValue; +} + +void CXuiCtrlLoadingProgress::GetRange(int *pnRangeMin, int *pnRangeMax) +{ + *pnRangeMin = 0; + *pnRangeMax = 100; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_LoadingProgress.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_LoadingProgress.h new file mode 100644 index 00000000..623393bd --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_LoadingProgress.h @@ -0,0 +1,18 @@ +#pragma once + +#include "XUI_Ctrl_ProgressCtrlBase.h" + +class CXuiCtrlLoadingProgress : public CXuiCtrlProgressCtrlBase +{ +public: + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CXuiCtrlLoadingProgress, L"CXuiCtrlLoadingProgress", XUI_CLASS_PROGRESSBAR ) + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_GET_SOURCE_TEXT(OnGetSourceDataText) + XUI_END_MSG_MAP() + + virtual int GetValue(); + virtual void GetRange(int *pnRangeMin, int *pnRangeMax); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftPlayer.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftPlayer.cpp new file mode 100644 index 00000000..02ee7c93 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftPlayer.cpp @@ -0,0 +1,190 @@ +#include "stdafx.h" +#include "..\..\Minecraft.h" +#include "..\..\ScreenSizeCalculator.h" +#include "..\..\EntityRenderDispatcher.h" +#include "..\..\Lighting.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "XUI_Ctrl_MinecraftPlayer.h" +#include "XUI_Scene_AbstractContainer.h" +#include "XUI_Scene_Inventory.h" +#include "..\..\Options.h" + +//----------------------------------------------------------------------------- +// CXuiCtrlMinecraftPlayer class +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +CXuiCtrlMinecraftPlayer::CXuiCtrlMinecraftPlayer() : + m_bDirty(FALSE), + m_fScale(1.0f), + m_fAlpha(1.0f) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + + ScreenSizeCalculator ssc(pMinecraft->options, pMinecraft->width_phys, pMinecraft->height_phys); + m_fScreenWidth=(float)pMinecraft->width_phys; + m_fRawWidth=(float)ssc.rawWidth; + m_fScreenHeight=(float)pMinecraft->height_phys; + m_fRawHeight=(float)ssc.rawHeight; +} + +//----------------------------------------------------------------------------- +HRESULT CXuiCtrlMinecraftPlayer::OnInit(XUIMessageInit* pInitData, BOOL& rfHandled) +{ + HRESULT hr=S_OK; + + HXUIOBJ parent = m_hObj; + HXUICLASS hcInventoryClass = XuiFindClass( L"CXuiSceneInventory" ); + HXUICLASS currentClass; + + do + { + XuiElementGetParent(parent,&parent); + currentClass = XuiGetObjectClass( parent ); + } while (parent != NULL && !XuiClassDerivesFrom( currentClass, hcInventoryClass ) ); + + assert( parent != NULL ); + + VOID *pObj; + XuiObjectFromHandle( parent, &pObj ); + m_containerScene = (CXuiSceneInventory *)pObj; + + m_iPad = m_containerScene->getPad(); + + return hr; +} + +HRESULT CXuiCtrlMinecraftPlayer::OnRender(XUIMessageRender *pRenderData, BOOL &bHandled ) +{ +#ifdef _XBOX + HXUIDC hDC = pRenderData->hDC; + + // build and render with the game call + + RenderManager.Set_matrixDirty(); + + Minecraft *pMinecraft=Minecraft::GetInstance(); + + glColor4f(1, 1, 1, 1); + glClear(GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, m_fRawWidth, m_fRawHeight, 0, 1000, 3000); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0, 0, -2000); + + + D3DXMATRIX matrix; + CXuiControl xuiControl(m_hObj); + xuiControl.GetFullXForm(&matrix); + float bwidth,bheight; + xuiControl.GetBounds(&bwidth,&bheight); + + float xo = ( (matrix._41 + ( (bwidth*matrix._11)/2) ) / m_fScreenWidth ) * m_fRawWidth; + float yo = ( (matrix._42 + (bheight*matrix._22) ) / m_fScreenHeight ) * m_fRawHeight; + + glEnable(GL_RESCALE_NORMAL); + glEnable(GL_COLOR_MATERIAL); + + glPushMatrix(); + glTranslatef(xo, yo - 3.5f, 50.0f); + float ss;// = 26; + + if(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) + { + ss = 24; + } + else + { + if(app.GetLocalPlayerCount()>1) + { + ss = 13; + } + else + { + ss = 26; + } + } + // Base scale on height of this control + // Potentially we might want separate x & y scales here + //ss = ( ( bheight / m_fScreenHeight ) * m_fRawHeight ); + // For testing split screen - this scale is correct for 4 player split screen + + // how many local players do we have? +// int iPlayerC=0; +// +// for(int i=0;ilocalplayers[i] != NULL) +// { +// iPlayerC++; +// } +// } +// +// switch(iPlayerC) +// { +// case 1: +// break; +// case 2: +// case 3: +// case 4: +// ss *= 0.5f; +// break; +// } + + glScalef(-ss, ss, ss); + glRotatef(180, 0, 0, 1); + + float oybr = pMinecraft->localplayers[m_iPad]->yBodyRot; + float oyr = pMinecraft->localplayers[m_iPad]->yRot; + float oxr = pMinecraft->localplayers[m_iPad]->xRot; + float oyhr = pMinecraft->localplayers[m_iPad]->yHeadRot; + + D3DXVECTOR3 pointerPosition = m_containerScene->GetCursorScreenPosition(); + //printf("Pointer screen position is x:%f, y:%f, z:%f\n",pointerPosition.x, pointerPosition.y, pointerPosition.z); + + float xd = ( matrix._41 + ( (bwidth*matrix._11)/2) ) - pointerPosition.x; + + // Need to base Y on head position, not centre of mass + float yd = ( matrix._42 + ( (bheight*matrix._22) / 2) - 40 ) - pointerPosition.y; + + glRotatef(45 + 90, 0, 1, 0); + Lighting::turnOn(); + glRotatef(-45 - 90, 0, 1, 0); + + glRotatef(-(float) atan(yd / 40.0f) * 20, 1, 0, 0); + + pMinecraft->localplayers[m_iPad]->yBodyRot = (float) atan(xd / 40.0f) * 20; + pMinecraft->localplayers[m_iPad]->yRot = (float) atan(xd / 40.0f) * 40; + pMinecraft->localplayers[m_iPad]->xRot = -(float) atan(yd / 40.0f) * 20; + pMinecraft->localplayers[m_iPad]->yHeadRot = pMinecraft->localplayers[m_iPad]->yRot; + //pMinecraft->localplayers[m_iPad]->glow = 1; + glTranslatef(0, pMinecraft->localplayers[m_iPad]->heightOffset, 0); + EntityRenderDispatcher::instance->playerRotY = 180; + + // 4J Stu - Turning on hideGui while we do this stops the name rendering in split-screen + bool wasHidingGui = pMinecraft->options->hideGui; + pMinecraft->options->hideGui = true; + EntityRenderDispatcher::instance->render(pMinecraft->localplayers[m_iPad], 0, 0, 0, 0, 1,false,false); + pMinecraft->options->hideGui = wasHidingGui; + //pMinecraft->localplayers[m_iPad]->glow = 0; + + pMinecraft->localplayers[m_iPad]->yBodyRot = oybr; + pMinecraft->localplayers[m_iPad]->yRot = oyr; + pMinecraft->localplayers[m_iPad]->xRot = oxr; + pMinecraft->localplayers[m_iPad]->yHeadRot = oyhr; + glPopMatrix(); + Lighting::turnOff(); + glDisable(GL_RESCALE_NORMAL); + + XuiRenderRestoreState(hDC); + + bHandled = TRUE; +#endif + return S_OK; + +} + + + diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftPlayer.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftPlayer.h new file mode 100644 index 00000000..fa28d6b8 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftPlayer.h @@ -0,0 +1,42 @@ +#pragma once + +#include +#include + +using namespace std; + +class TileRenderer; +class ItemRenderer; +class CXuiSceneInventory; + +//----------------------------------------------------------------------------- +// CXuiCtrlMinecraftPlayer class +//----------------------------------------------------------------------------- +class CXuiCtrlMinecraftPlayer : public CXuiControlImpl +{ +public: + XUI_IMPLEMENT_CLASS(CXuiCtrlMinecraftPlayer, L"CXuiCtrlMinecraftPlayer", XUI_CLASS_LABEL) + + CXuiCtrlMinecraftPlayer(); + virtual ~CXuiCtrlMinecraftPlayer() { }; + +protected: + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT(OnInit) + XUI_ON_XM_RENDER(OnRender) + XUI_END_MSG_MAP() + + HRESULT OnInit(XUIMessageInit* pInitData, BOOL& rfHandled); + HRESULT OnRender(XUIMessageRender *pRenderData, BOOL &rfHandled); + +private: + BOOL m_bDirty; + float m_fScale,m_fAlpha; + int m_iPad; + CXuiSceneInventory *m_containerScene; + + float m_fScreenWidth,m_fScreenHeight; + float m_fRawWidth,m_fRawHeight; + +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSkinPreview.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSkinPreview.cpp new file mode 100644 index 00000000..80750deb --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSkinPreview.cpp @@ -0,0 +1,551 @@ +#include "stdafx.h" +#include "..\..\Minecraft.h" +#include "..\..\ScreenSizeCalculator.h" +#include "..\..\EntityRenderDispatcher.h" +#include "..\..\PlayerRenderer.h" +#include "..\..\HumanoidModel.h" +#include "..\..\Lighting.h" +#include "..\..\..\Minecraft.World\Class.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "XUI_Ctrl_MinecraftSkinPreview.h" +#include "XUI_Scene_AbstractContainer.h" +#include "XUI_Scene_Inventory.h" +#include "..\..\Options.h" +#include "..\..\stubs.h" +#include "..\..\ModelPart.h" + +//#define SKIN_PREVIEW_BOB_ANIM +#define SKIN_PREVIEW_WALKING_ANIM + +//----------------------------------------------------------------------------- +// CXuiCtrlMinecraftSkinPreview class +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +CXuiCtrlMinecraftSkinPreview::CXuiCtrlMinecraftSkinPreview() : + m_bDirty(FALSE), + m_fScale(1.0f), + m_fAlpha(1.0f) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + + ScreenSizeCalculator ssc(pMinecraft->options, pMinecraft->width_phys, pMinecraft->height_phys); + m_fScreenWidth=(float)pMinecraft->width_phys; + m_fRawWidth=(float)ssc.rawWidth; + m_fScreenHeight=(float)pMinecraft->height_phys; + m_fRawHeight=(float)ssc.rawHeight; + + m_customTextureUrl = L"default"; + m_backupTexture = TN_MOB_CHAR; + m_capeTextureUrl = L""; + + m_yRot = 0; + m_xRot = 0; + + m_swingTime = 0.0f; + m_bobTick = 0.0f; + m_walkAnimSpeedO = 0.0f; + m_walkAnimSpeed = 0.0f; + m_walkAnimPos = 0.0f; + + m_bAutoRotate = false; + m_bRotatingLeft = false; + + m_incXRot = false; + m_decXRot = false; + m_incYRot = false; + m_decYRot = false; + + m_currentAnimation = e_SkinPreviewAnimation_Walking; + + m_fTargetRotation = 0.0f; + m_fOriginalRotation = 0.0f; + m_framesAnimatingRotation = 0; + m_bAnimatingToFacing = false; + m_pvAdditionalModelParts=NULL; + m_uiAnimOverrideBitmask=0L; +} + +//----------------------------------------------------------------------------- +HRESULT CXuiCtrlMinecraftSkinPreview::OnInit(XUIMessageInit* pInitData, BOOL& rfHandled) +{ + HRESULT hr=S_OK; + + return hr; +} + +void CXuiCtrlMinecraftSkinPreview::SetTexture(const wstring &url, TEXTURE_NAME backupTexture) +{ + m_customTextureUrl = url; + m_backupTexture = backupTexture; + + unsigned int uiAnimOverrideBitmask = Player::getSkinAnimOverrideBitmask( app.getSkinIdFromPath(m_customTextureUrl) ); + + if(app.GetGameSettings(eGameSetting_CustomSkinAnim)==0 ) + { + // We have a force animation for some skins (claptrap) + // 4J-PB - treat all the eAnim_Disable flags as a force anim + + if((uiAnimOverrideBitmask & HumanoidModel::m_staticBitmaskIgnorePlayerCustomAnimSetting)!=0) + { + m_uiAnimOverrideBitmask=uiAnimOverrideBitmask; + } + else + { + m_uiAnimOverrideBitmask=0; + } + } + else + { + m_uiAnimOverrideBitmask = uiAnimOverrideBitmask; + } + + app.DebugPrintf("+++ SetTexture - %d, %8x\n",app.getSkinIdFromPath(m_customTextureUrl)&0xFFFFFFF,m_uiAnimOverrideBitmask); + m_pvAdditionalModelParts=app.GetAdditionalModelParts(app.getSkinIdFromPath(m_customTextureUrl)); +} + +void CXuiCtrlMinecraftSkinPreview::SetFacing(ESkinPreviewFacing facing, bool bAnimate /*= false*/) +{ + switch(facing) + { + case e_SkinPreviewFacing_Forward: + m_fTargetRotation = 0; + m_bRotatingLeft = true; + break; + case e_SkinPreviewFacing_Left: + m_fTargetRotation = LOOK_LEFT_EXTENT; + m_bRotatingLeft = false; + break; + case e_SkinPreviewFacing_Right: + m_fTargetRotation = LOOK_RIGHT_EXTENT; + m_bRotatingLeft = true; + break; + } + + if(!bAnimate) + { + m_yRot = m_fTargetRotation; + m_bAnimatingToFacing = false; + } + else + { + m_fOriginalRotation = m_yRot; + m_bAnimatingToFacing = true; + m_framesAnimatingRotation = 0; + } +} + +void CXuiCtrlMinecraftSkinPreview::CycleNextAnimation() +{ + m_currentAnimation = (ESkinPreviewAnimations)(m_currentAnimation + 1); + if(m_currentAnimation >= e_SkinPreviewAnimation_Count) m_currentAnimation = e_SkinPreviewAnimation_Walking; + + m_swingTime = 0.0f; +} + +void CXuiCtrlMinecraftSkinPreview::CyclePreviousAnimation() +{ + m_currentAnimation = (ESkinPreviewAnimations)(m_currentAnimation - 1); + if(m_currentAnimation < e_SkinPreviewAnimation_Walking) m_currentAnimation = (ESkinPreviewAnimations)(e_SkinPreviewAnimation_Count - 1); + + m_swingTime = 0.0f; +} + +HRESULT CXuiCtrlMinecraftSkinPreview::OnRender(XUIMessageRender *pRenderData, BOOL &bHandled ) +{ + if( m_bAnimatingToFacing ) + { + ++m_framesAnimatingRotation; + m_yRot = m_fOriginalRotation + m_framesAnimatingRotation * ( (m_fTargetRotation - m_fOriginalRotation) / CHANGING_SKIN_FRAMES ); + + //if(m_framesAnimatingRotation == CHANGING_SKIN_FRAMES) m_bAnimatingToFacing = false; + } + else + { + if( m_incXRot ) IncrementXRotation(); + if( m_decXRot ) DecrementXRotation(); + if( m_incYRot ) IncrementYRotation(); + if( m_decYRot ) DecrementYRotation(); + + if(m_bAutoRotate) + { + ++m_rotateTick; + + if(m_rotateTick%4==0) + { + if(m_yRot >= LOOK_LEFT_EXTENT) + { + m_bRotatingLeft = false; + } + else if(m_yRot <= LOOK_RIGHT_EXTENT) + { + m_bRotatingLeft = true; + } + + if(m_bRotatingLeft) + { + IncrementYRotation(); + } + else + { + DecrementYRotation(); + } + } + } + } + + HXUIDC hDC = pRenderData->hDC; + + // build and render with the game call + + RenderManager.Set_matrixDirty(); + + Minecraft *pMinecraft=Minecraft::GetInstance(); + + float alpha = 1.0f; + //GetOpacity( &alpha ); + + glColor4f(1, 1, 1, alpha); + glClear(GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, m_fRawWidth, m_fRawHeight, 0, 1000, 3000); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0, 0, -2000); + + + D3DXMATRIX matrix; + GetFullXForm(&matrix); + float bwidth,bheight; + GetBounds(&bwidth,&bheight); + + float xo = ( (matrix._41 + ( (bwidth*matrix._11)/2) ) / m_fScreenWidth ) * m_fRawWidth; + float yo = ( (matrix._42 + (bheight*matrix._22) ) / m_fScreenHeight ) * m_fRawHeight; + + glEnable(GL_RESCALE_NORMAL); + glEnable(GL_COLOR_MATERIAL); + + glPushMatrix(); + glTranslatef(xo, yo - 3.5f, 50.0f); + float ss; + + // Base scale on height of this control + // Potentially we might want separate x & y scales here + ss = ( ( (bheight*matrix._22) / m_fScreenHeight ) * m_fRawHeight )/2; + + glScalef(-ss, ss, ss); + glRotatef(180, 0, 0, 1); + + //glRotatef(45 + 90, 0, 1, 0); + Lighting::turnOn(); + //glRotatef(-45 - 90, 0, 1, 0); + + glRotatef(-(float)m_xRot, 1, 0, 0); + + // 4J Stu - Turning on hideGui while we do this stops the name rendering in split-screen + bool wasHidingGui = pMinecraft->options->hideGui; + pMinecraft->options->hideGui = true; + + //EntityRenderDispatcher::instance->render(pMinecraft->localplayers[0], 0, 0, 0, 0, 1); + EntityRenderer *renderer = EntityRenderDispatcher::instance->getRenderer(eTYPE_PLAYER); + if (renderer != NULL) + { + // 4J-PB - any additional parts to turn on for this player (skin dependent) + //vector *pAdditionalModelParts=mob->GetAdditionalModelParts(); + + if(m_pvAdditionalModelParts && m_pvAdditionalModelParts->size()!=0) + { + for(AUTO_VAR(it, m_pvAdditionalModelParts->begin()); it != m_pvAdditionalModelParts->end(); ++it) + { + ModelPart *pModelPart=*it; + + pModelPart->visible=true; + } + } + + render(renderer,0,0,0,0,1); + //renderer->postRender(entity, x, y, z, rot, a); + + // hide the additional parts + if(m_pvAdditionalModelParts && m_pvAdditionalModelParts->size()!=0) + { + for(AUTO_VAR(it, m_pvAdditionalModelParts->begin()); it != m_pvAdditionalModelParts->end(); ++it) + { + ModelPart *pModelPart=*it; + + pModelPart->visible=false; + } + } + } + + pMinecraft->options->hideGui = wasHidingGui; + + glPopMatrix(); + Lighting::turnOff(); + glDisable(GL_RESCALE_NORMAL); + + XuiRenderRestoreState(hDC); + + bHandled = TRUE; + + return S_OK; +} + +// 4J Stu - Modified version of MobRenderer::render that does not require an actual entity +void CXuiCtrlMinecraftSkinPreview::render(EntityRenderer *renderer, double x, double y, double z, float rot, float a) +{ + glPushMatrix(); + glDisable(GL_CULL_FACE); + + HumanoidModel *model = (HumanoidModel *)renderer->getModel(); + + //getAttackAnim(mob, a); + //if (armor != NULL) armor->attackTime = model->attackTime; + //model->riding = mob->isRiding(); + //if (armor != NULL) armor->riding = model->riding; + + // 4J Stu - Remember to reset these values once the rendering is done if you add another one + model->attackTime = 0; + model->sneaking = false; + model->holdingRightHand = false; + model->holdingLeftHand = false; + model->idle = false; + model->eating = false; + model->eating_swing = 0; + model->eating_t = 0; + model->young = false; + model->riding = false; + + model->m_uiAnimOverrideBitmask = m_uiAnimOverrideBitmask; + + if( !m_bAnimatingToFacing ) + { + switch( m_currentAnimation ) + { + case e_SkinPreviewAnimation_Sneaking: + model->sneaking = true; + break; + case e_SkinPreviewAnimation_Attacking: + model->holdingRightHand = true; + m_swingTime++; + if (m_swingTime >= (Player::SWING_DURATION * 3) ) + { + m_swingTime = 0; + } + model->attackTime = m_swingTime / (float) (Player::SWING_DURATION * 3); + break; + default: + break; + }; + } + + + float bodyRot = m_yRot; //(mob->yBodyRotO + (mob->yBodyRot - mob->yBodyRotO) * a); + float headRot = m_yRot; //(mob->yRotO + (mob->yRot - mob->yRotO) * a); + float headRotx = 0; //(mob->xRotO + (mob->xRot - mob->xRotO) * a); + + //setupPosition(mob, x, y, z); + // is equivalent to + glTranslatef((float) x, (float) y, (float) z); + + //float bob = getBob(mob, a); +#ifdef SKIN_PREVIEW_BOB_ANIM + float bob = (m_bobTick + a)/2; + + ++m_bobTick; + if(m_bobTick>=360*2) m_bobTick = 0; +#else + float bob = 0.0f; +#endif + + //setupRotations(mob, bob, bodyRot, a); + // is equivalent to + glRotatef(180 - bodyRot, 0, 1, 0); + + float _scale = 1 / 16.0f; + glEnable(GL_RESCALE_NORMAL); + glScalef(-1, -1, 1); + + //scale(mob, a); + // is equivalent to + float s = 15 / 16.0f; + glScalef(s, s, s); + + glTranslatef(0, -24 * _scale - 0.125f / 16.0f, 0); + +#ifdef SKIN_PREVIEW_WALKING_ANIM + m_walkAnimSpeedO = m_walkAnimSpeed; + m_walkAnimSpeed += (0.1f - m_walkAnimSpeed) * 0.4f; + m_walkAnimPos += m_walkAnimSpeed; + float ws = m_walkAnimSpeedO + (m_walkAnimSpeed - m_walkAnimSpeedO) * a; + float wp = m_walkAnimPos - m_walkAnimSpeed * (1 - a); +#else + float ws = 0; + float wp = 0; +#endif + + if (ws > 1) ws = 1; + + MemSect(31); + bindTexture(m_customTextureUrl, m_backupTexture); + MemSect(0); + glEnable(GL_ALPHA_TEST); + + //model->prepareMobModel(mob, wp, ws, a); + model->render(nullptr, wp, ws, bob, headRot - bodyRot, headRotx, _scale, true); + /*for (int i = 0; i < MAX_ARMOR_LAYERS; i++) + { + if (prepareArmor(mob, i, a)) + { + armor->render(wp, ws, bob, headRot - bodyRot, headRotx, _scale, true); + glDisable(GL_BLEND); + glEnable(GL_ALPHA_TEST); + } + }*/ + + //additionalRendering(mob, a); + if (bindTexture(m_capeTextureUrl, L"" )) + { + glPushMatrix(); + glTranslatef(0, 0, 2 / 16.0f); + + double xd = 0;//(mob->xCloakO + (mob->xCloak - mob->xCloakO) * a) - (mob->xo + (mob->x - mob->xo) * a); + double yd = 0;//(mob->yCloakO + (mob->yCloak - mob->yCloakO) * a) - (mob->yo + (mob->y - mob->yo) * a); + double zd = 0;//(mob->zCloakO + (mob->zCloak - mob->zCloakO) * a) - (mob->zo + (mob->z - mob->zo) * a); + + float yr = 1;//mob->yBodyRotO + (mob->yBodyRot - mob->yBodyRotO) * a; + + double xa = sin(yr * PI / 180); + double za = -cos(yr * PI / 180); + + float flap = (float) yd * 10; + if (flap < -6) flap = -6; + if (flap > 32) flap = 32; + float lean = (float) (xd * xa + zd * za) * 100; + float lean2 = (float) (xd * za - zd * xa) * 100; + if (lean < 0) lean = 0; + + //float pow = 1;//mob->oBob + (bob - mob->oBob) * a; + + flap += 1;//sin((mob->walkDistO + (mob->walkDist - mob->walkDistO) * a) * 6) * 32 * pow; + if (model->sneaking) + { + flap += 25; + } + + glRotatef(6.0f + lean / 2 + flap, 1, 0, 0); + glRotatef(lean2 / 2, 0, 0, 1); + glRotatef(-lean2 / 2, 0, 1, 0); + glRotatef(180, 0, 1, 0); + model->renderCloak(1 / 16.0f,true); + glPopMatrix(); + } + /* + float br = mob->getBrightness(a); + int overlayColor = getOverlayColor(mob, br, a); + + if (((overlayColor >> 24) & 0xff) > 0 || mob->hurtTime > 0 || mob->deathTime > 0) + { + glDisable(GL_TEXTURE_2D); + glDisable(GL_ALPHA_TEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glDepthFunc(GL_EQUAL); + + // 4J - changed these renders to not use the compiled version of their models, because otherwise the render states set + // about (in particular the depth & alpha test) don't work with our command buffer versions + if (mob->hurtTime > 0 || mob->deathTime > 0) + { + glColor4f(br, 0, 0, 0.4f); + model->render(wp, ws, bob, headRot - bodyRot, headRotx, _scale, false); + for (int i = 0; i < MAX_ARMOR_LAYERS; i++) + { + if (prepareArmorOverlay(mob, i, a)) + { + glColor4f(br, 0, 0, 0.4f); + armor->render(wp, ws, bob, headRot - bodyRot, headRotx, _scale, false); + } + } + } + + if (((overlayColor >> 24) & 0xff) > 0) + { + float r = ((overlayColor >> 16) & 0xff) / 255.0f; + float g = ((overlayColor >> 8) & 0xff) / 255.0f; + float b = ((overlayColor) & 0xff) / 255.0f; + float aa = ((overlayColor >> 24) & 0xff) / 255.0f; + glColor4f(r, g, b, aa); + model->render(wp, ws, bob, headRot - bodyRot, headRotx, _scale, false); + for (int i = 0; i < MAX_ARMOR_LAYERS; i++) + { + if (prepareArmorOverlay(mob, i, a)) + { + glColor4f(r, g, b, aa); + armor->render(wp, ws, bob, headRot - bodyRot, headRotx, _scale, false); + } + } + } + + glDepthFunc(GL_LEQUAL); + glDisable(GL_BLEND); + glEnable(GL_ALPHA_TEST); + glEnable(GL_TEXTURE_2D); + } + */ + glDisable(GL_RESCALE_NORMAL); + + glEnable(GL_CULL_FACE); + + glPopMatrix(); + + MemSect(31); + //renderName(mob, x, y, z); + MemSect(0); + + // Reset the model values to stop the changes we made here affecting anything in game (like the player hand render) + model->attackTime = 0; + model->sneaking = false; + model->holdingRightHand = false; + model->holdingLeftHand = false; +} + +bool CXuiCtrlMinecraftSkinPreview::bindTexture(const wstring& urlTexture, int backupTexture) +{ + Textures *t = Minecraft::GetInstance()->textures; + + // 4J-PB - no http textures on the xbox, mem textures instead + + //int id = t->loadHttpTexture(urlTexture, backupTexture); + int id = t->loadMemTexture(urlTexture, backupTexture); + + if (id >= 0) + { + t->bind(id); + return true; + } + else + { + return false; + } +} + +bool CXuiCtrlMinecraftSkinPreview::bindTexture(const wstring& urlTexture, const wstring& backupTexture) +{ + Textures *t = Minecraft::GetInstance()->textures; + + // 4J-PB - no http textures on the xbox, mem textures instead + + //int id = t->loadHttpTexture(urlTexture, backupTexture); + int id = t->loadMemTexture(urlTexture, backupTexture); + + if (id >= 0) + { + t->bind(id); + return true; + } + else + { + return false; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSkinPreview.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSkinPreview.h new file mode 100644 index 00000000..22f4991b --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSkinPreview.h @@ -0,0 +1,106 @@ +#pragma once + +#include +#include +#include "..\..\Textures.h" +//#include "..\..\Xbox\DLC\DLCSkinFile.h" +#include "..\..\Model.h" + +using namespace std; + +class EntityRenderer; + +//----------------------------------------------------------------------------- +// CXuiCtrlMinecraftSkinPreview class +//----------------------------------------------------------------------------- +class CXuiCtrlMinecraftSkinPreview : public CXuiControlImpl +{ +private: + static const int LOOK_LEFT_EXTENT = 45; + static const int LOOK_RIGHT_EXTENT = -45; + + static const int CHANGING_SKIN_FRAMES = 15; + + enum ESkinPreviewAnimations + { + e_SkinPreviewAnimation_Walking, + e_SkinPreviewAnimation_Sneaking, + e_SkinPreviewAnimation_Attacking, + + e_SkinPreviewAnimation_Count, + }; +public: + enum ESkinPreviewFacing + { + e_SkinPreviewFacing_Forward, + e_SkinPreviewFacing_Left, + e_SkinPreviewFacing_Right, + }; +public: + XUI_IMPLEMENT_CLASS(CXuiCtrlMinecraftSkinPreview, L"CXuiCtrlMinecraftSkinPreview", XUI_CLASS_LABEL) + + CXuiCtrlMinecraftSkinPreview(); + virtual ~CXuiCtrlMinecraftSkinPreview() { }; + + void SetTexture(const wstring &url, TEXTURE_NAME backupTexture = TN_MOB_CHAR); + void SetCapeTexture(const wstring &url) { m_capeTextureUrl = url; } + void ResetRotation() { m_xRot = 0; m_yRot = 0; } + void IncrementYRotation() { m_yRot = (m_yRot+4); if(m_yRot >= 180) m_yRot = -180; } + void DecrementYRotation() { m_yRot = (m_yRot-4); if(m_yRot <= -180) m_yRot = 180; } + void IncrementXRotation() { m_xRot = (m_xRot+2); if(m_xRot > 22) m_xRot = 22; } + void DecrementXRotation() { m_xRot = (m_xRot-2); if(m_xRot < -22) m_xRot = -22; } + void SetAutoRotate(bool autoRotate) { m_bAutoRotate = autoRotate; } + void SetFacing(ESkinPreviewFacing facing, bool bAnimate = false); + + void CycleNextAnimation(); + void CyclePreviousAnimation(); + + bool m_incXRot, m_decXRot; + bool m_incYRot, m_decYRot; + +protected: + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT(OnInit) + XUI_ON_XM_RENDER(OnRender) + XUI_END_MSG_MAP() + + HRESULT OnInit(XUIMessageInit* pInitData, BOOL& rfHandled); + HRESULT OnRender(XUIMessageRender *pRenderData, BOOL &rfHandled); + +private: + void render(EntityRenderer *renderer, double x, double y, double z, float rot, float a); + bool bindTexture(const wstring& urlTexture, int backupTexture); + bool bindTexture(const wstring& urlTexture, const wstring& backupTexture); + + BOOL m_bDirty; + float m_fScale,m_fAlpha; + + wstring m_customTextureUrl; + TEXTURE_NAME m_backupTexture; + wstring m_capeTextureUrl; + unsigned int m_uiAnimOverrideBitmask; + + float m_fScreenWidth,m_fScreenHeight; + float m_fRawWidth,m_fRawHeight; + + int m_yRot,m_xRot; + + float m_bobTick; + + float m_walkAnimSpeedO; + float m_walkAnimSpeed; + float m_walkAnimPos; + + bool m_bAutoRotate, m_bRotatingLeft; + BYTE m_rotateTick; + float m_fTargetRotation, m_fOriginalRotation; + int m_framesAnimatingRotation; + bool m_bAnimatingToFacing; + + float m_swingTime; + + ESkinPreviewAnimations m_currentAnimation; + //vector *m_pvAdditionalBoxes; + vector *m_pvAdditionalModelParts; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSlot.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSlot.cpp new file mode 100644 index 00000000..84273eb5 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSlot.cpp @@ -0,0 +1,356 @@ +#include "stdafx.h" + +#include "..\..\ItemRenderer.h" +#include "..\..\GameRenderer.h" +#include "..\..\TileRenderer.h" +#include "..\..\Lighting.h" +#include "..\..\ScreenSizeCalculator.h" +#include "..\..\LocalPlayer.h" +#include "..\..\..\Minecraft.World\ItemInstance.h" +#include "..\..\..\Minecraft.World\Item.h" +#include "..\..\..\Minecraft.World\Tile.h" +#include "XUI_Ctrl_MinecraftSlot.h" + +//----------------------------------------------------------------------------- +// CXuiCtrlMinecraftSlot class +//----------------------------------------------------------------------------- + +// The xzp path icons for the leaderboard + +LPCWSTR CXuiCtrlMinecraftSlot::xzpIcons[15]= +{ + L"Graphics\\Leaderboard\\LeaderBoard_Icon_Skeleton.png", + L"Graphics\\Leaderboard\\LeaderBoard_Icon_Creeper.png", + L"Graphics\\Leaderboard\\LeaderBoard_Icon_SpiderJockey.png", + L"Graphics\\Leaderboard\\LeaderBoard_Icon_Spider.png", + L"Graphics\\Leaderboard\\LeaderBoard_Icon_Zombie.png", + L"Graphics\\Leaderboard\\LeaderBoard_Icon_ZombiePigman.png", + L"Graphics\\Leaderboard\\LeaderBoard_Icon_Swam.png", + L"Graphics\\Leaderboard\\LeaderBoard_Icon_Walked.png", + L"Graphics\\Leaderboard\\LeaderBoard_Icon_Fallen.png", + L"Graphics\\Leaderboard\\LeaderBoard_Icon_Portal.png", + L"Graphics\\Leaderboard\\LeaderBoard_Icon_Climbed.png", + L"Graphics\\Leaderboard\\LeaderBoard_Icon_Ghast.png", + L"Graphics\\Leaderboard\\LeaderBoard_Icon_Slime.png", + L"Graphics\\CraftIcons\\icon_structures.png", + L"Graphics\\CraftIcons\\icon_tools.png", +}; + + + +//----------------------------------------------------------------------------- +CXuiCtrlMinecraftSlot::CXuiCtrlMinecraftSlot() : + //m_hBrush(NULL), + m_bDirty(FALSE), + m_iPassThroughDataAssociation(0), + m_iPassThroughIdAssociation(0), + m_fScale(1.0f), + m_fAlpha(1.0f), + m_iID(0), + m_iCount(0), + m_iAuxVal(0), + m_bDecorations(false), + m_isFoil(false), + m_popTime(0) +{ + m_pItemRenderer = new ItemRenderer(); + m_item = nullptr; + + m_bScreenWidthSetup = false; + + Minecraft *pMinecraft=Minecraft::GetInstance(); + + if(pMinecraft != NULL) + { + m_fScreenWidth=(float)pMinecraft->width_phys; + m_fScreenHeight=(float)pMinecraft->height_phys; + m_bScreenWidthSetup = true; + } +} + +CXuiCtrlMinecraftSlot::~CXuiCtrlMinecraftSlot() +{ + delete m_pItemRenderer; +} + +VOID CXuiCtrlMinecraftSlot::SetPassThroughDataAssociation(unsigned int iID, unsigned int iData) +{ + m_item = nullptr; + m_iPassThroughIdAssociation = iID; + m_iPassThroughDataAssociation = iData; +} + +//----------------------------------------------------------------------------- +HRESULT CXuiCtrlMinecraftSlot::OnGetSourceImage(XUIMessageGetSourceImage* pData, BOOL& rfHandled) +{ + XUIMessage Message; + CustomMessage_GetSlotItem_Struct MsgGetSlotItem; + HRESULT hr; + HXUIOBJ hObj; + + CustomMessage_GetSlotItem(&Message, &MsgGetSlotItem, m_iPassThroughIdAssociation, m_iPassThroughDataAssociation); + + hr = GetParent(&hObj); + + if (HRESULT_SUCCEEDED(hr)) + { + hr = XuiBubbleMessage(hObj, &Message); + + if(hr == XUI_ERR_SOURCEDATA_ITEM) + { + // Go up the parent chain one more + HXUIOBJ hParent; + hr = XuiElementGetParent(hObj,&hParent); + hr = XuiBubbleMessage(hParent, &Message); + } + + if (Message.bHandled) + { + pData->szPath = MsgGetSlotItem.szPath; + pData->bDirty = MsgGetSlotItem.bDirty; + + if(MsgGetSlotItem.item != NULL) + { + m_item = MsgGetSlotItem.item; + m_iID = m_item->id; + m_iPad = GET_SLOTDISPLAY_USERINDEX_FROM_DATA_BITMASK(MsgGetSlotItem.iDataBitField); + m_fAlpha = ((float)GET_SLOTDISPLAY_ALPHA_FROM_DATA_BITMASK(MsgGetSlotItem.iDataBitField))/31.0f; + m_bDecorations = GET_SLOTDISPLAY_DECORATIONS_FROM_DATA_BITMASK(MsgGetSlotItem.iDataBitField); + m_fScale = ((float)GET_SLOTDISPLAY_SCALE_FROM_DATA_BITMASK(MsgGetSlotItem.iDataBitField))/10.0f; + } + else + { + m_iID = GET_SLOTDISPLAY_ID_FROM_ITEM_BITMASK(MsgGetSlotItem.iItemBitField); + + // if the id is greater than or equal to 32000, then it's an xzp icon, not a game icon + if(m_iID<32000) + { + // 4J Stu - Some parent controls may overide this, others will leave it as what we passed in + + m_iPad = GET_SLOTDISPLAY_USERINDEX_FROM_DATA_BITMASK(MsgGetSlotItem.iDataBitField); + m_fAlpha = ((float)GET_SLOTDISPLAY_ALPHA_FROM_DATA_BITMASK(MsgGetSlotItem.iDataBitField))/31.0f; + m_bDecorations = GET_SLOTDISPLAY_DECORATIONS_FROM_DATA_BITMASK(MsgGetSlotItem.iDataBitField); + m_iCount = GET_SLOTDISPLAY_COUNT_FROM_DATA_BITMASK(MsgGetSlotItem.iDataBitField); + m_fScale = ((float)GET_SLOTDISPLAY_SCALE_FROM_DATA_BITMASK(MsgGetSlotItem.iDataBitField))/10.0f; + m_popTime = GET_SLOTDISPLAY_POPTIME_FROM_DATA_BITMASK(MsgGetSlotItem.iDataBitField); + + m_iAuxVal = GET_SLOTDISPLAY_AUXVAL_FROM_ITEM_BITMASK(MsgGetSlotItem.iItemBitField); + + //m_iID = iID; + + m_isFoil = GET_SLOTDISPLAY_FOIL_FROM_ITEM_BITMASK(MsgGetSlotItem.iItemBitField); + } + else + { + pData->szPath = xzpIcons[m_iID-32000]; + } + + if(m_item != NULL && (m_item->id != m_iID || m_item->getAuxValue() != m_iAuxVal || m_item->GetCount() != m_iCount) ) m_item = nullptr; + } + + + rfHandled = TRUE; + return hr; + } + else + { + pData->szPath = L""; + } + } + + pData->bDirty = m_bDirty; + m_bDirty = FALSE; + rfHandled = TRUE; + return S_OK; +} + +//----------------------------------------------------------------------------- +HRESULT CXuiCtrlMinecraftSlot::OnInit(XUIMessageInit* pInitData, BOOL& rfHandled) +{ + //DWORD dwPropId; + HRESULT hr=S_OK; + return hr; +} + +//----------------------------------------------------------------------------- + +HRESULT CXuiCtrlMinecraftSlot::OnRender(XUIMessageRender *pRenderData, BOOL &bHandled ) +{ + // Force an update of the id + XUIMessage Message; + XUIMessageGetSourceImage MsgGetImage; + HRESULT hr; + XuiMessageGetSourceImage(&Message, &MsgGetImage, m_iPassThroughIdAssociation, m_iPassThroughDataAssociation, FALSE); + hr = XuiSendMessage(m_hObj, &Message); + + // We cannot have an Item with id 0 + if(m_item != NULL || (m_iID > 0 && m_iID<32000) ) + { + HXUIDC hDC = pRenderData->hDC; + CXuiControl xuiControl(m_hObj); + if(m_item == NULL) m_item = shared_ptr( new ItemInstance(m_iID, m_iCount, m_iAuxVal) ); + + // build and render with the game call + + RenderManager.Set_matrixDirty(); + + Minecraft *pMinecraft=Minecraft::GetInstance(); + + D3DXMATRIX matrix; + xuiControl.GetFullXForm(&matrix); + float bwidth,bheight; + xuiControl.GetBounds(&bwidth,&bheight); + + float x = matrix._41; + float y = matrix._42; + + // Base scale on height of this control, compared to height of what the item renderer normally renders (16 pixels high). Potentially + // we might want separate x & y scales here + + float scaleX = bwidth / 16.0f; + float scaleY = bheight / 16.0f; + + // apply any scale in the matrix too + scaleX *= matrix._11; + scaleY *= matrix._22; + + // Annoyingly, XUI renders everything to a z of 0 so if we want to render anything that needs the z-buffer on top of it, then we need to clear it. + // Clear just the region required for this control. + D3DRECT clearRect; + clearRect.x1 = (int)(matrix._41) - 2; + clearRect.y1 = (int)(matrix._42) - 2; + clearRect.x2 = (int)(matrix._41 + ( bwidth * matrix._11 )) + 2; + clearRect.y2 = (int)(matrix._42 + ( bheight * matrix._22 )) + 2; + + if(!m_bScreenWidthSetup) + { + Minecraft *pMinecraft=Minecraft::GetInstance(); + if(pMinecraft != NULL) + { + m_fScreenWidth=(float)pMinecraft->width_phys; + m_fScreenHeight=(float)pMinecraft->height_phys; + m_bScreenWidthSetup = true; + } + } + + RenderManager.Clear(GL_DEPTH_BUFFER_BIT, &clearRect); + // glClear(GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, m_fScreenWidth, m_fScreenHeight, 0, 1000, 3000); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0, 0, -2000); + + + glEnable(GL_RESCALE_NORMAL); + glPushMatrix(); + glRotatef(120, 1, 0, 0); + Lighting::turnOn(); + glPopMatrix(); + + + + //Make sure that pMinecraft->player is the correct player so that player specific rendering + // eg clock and compass, are rendered correctly + shared_ptr oldPlayer = pMinecraft->player; + + if( m_iPad >= 0 && m_iPad < XUSER_MAX_COUNT ) pMinecraft->player = pMinecraft->localplayers[m_iPad]; + + float pop = m_popTime; + if (pop > 0) + { + glPushMatrix(); + float squeeze = 1 + pop / (float) Inventory::POP_TIME_DURATION; + float sx = x; + float sy = y; + float sxoffs = 8 * scaleX; + float syoffs = 12 * scaleY; + glTranslatef((float)(sx + sxoffs), (float)(sy + syoffs), 0); + glScalef(1 / squeeze, (squeeze + 1) / 2, 1); + glTranslatef((float)-(sx + sxoffs), (float)-(sy + syoffs), 0); + } + + m_pItemRenderer->renderAndDecorateItem(pMinecraft->font, pMinecraft->textures, m_item, x, y,scaleX,scaleY,m_fAlpha,m_isFoil,false); + + if (pop > 0) + { + glPopMatrix(); + } + + if(m_bDecorations) + { + if((scaleX!=1.0f) ||(scaleY!=1.0f)) + { + glPushMatrix(); + glScalef(scaleX, scaleY, 1.0f); + int iX= (int)(0.5f+((float)x)/scaleX); + int iY= (int)(0.5f+((float)y)/scaleY); + + m_pItemRenderer->renderGuiItemDecorations(pMinecraft->font, pMinecraft->textures, m_item, iX, iY, m_fAlpha); + glPopMatrix(); + } + else + { + m_pItemRenderer->renderGuiItemDecorations(pMinecraft->font, pMinecraft->textures, m_item, (int)x, (int)y, m_fAlpha); + } + } + + pMinecraft->player = oldPlayer; + + Lighting::turnOff(); + glDisable(GL_RESCALE_NORMAL); + + XuiRenderRestoreState(hDC); + + bHandled = TRUE; + } + return S_OK; +} + + +void CXuiCtrlMinecraftSlot::SetIcon(int iPad, int iId,int iAuxVal, int iCount, int iScale, unsigned int uiAlpha,bool bDecorations,BOOL bShow, bool isFoil) +{ + m_item = nullptr; + m_iID=iId; + m_iAuxVal=iAuxVal; + + // aux value for diggers can go as high as 1561 + //const _Tier *_Tier::DIAMOND = new _Tier(3, 1561, 8, 3); // + // setMaxDamage(tier->getUses()); + + // int ItemInstance::getDamageValue() + // { + // return auxValue; + // } + + + if( (m_iAuxVal & 0xFF) == 0xFF) // 4J Stu - If the aux value is set to match any + m_iAuxVal = 0; + + m_iCount=iCount; + m_fScale = (float)(iScale)/10.0f; + //m_uiAlpha=uiAlpha; + m_fAlpha =((float)(uiAlpha)) / 255.0f; + m_bDecorations = bDecorations; + // mif(bDecorations) m_iDecorations=1; + // else m_iDecorations=0; + + m_iPad = iPad; + + m_isFoil = isFoil; + + XuiElementSetShow(m_hObj,bShow); +} + +void CXuiCtrlMinecraftSlot::SetIcon(int iPad, shared_ptr item, int iScale, unsigned int uiAlpha,bool bDecorations, BOOL bShow) +{ + m_item = item; + m_isFoil = item->isFoil(); + m_iPad = iPad; + m_fScale = (float)(iScale)/10.0f; + m_fAlpha =((float)(uiAlpha)) / 31; + m_bDecorations = bDecorations; + m_bDirty = TRUE; + XuiElementSetShow(m_hObj,bShow); +} diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSlot.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSlot.h new file mode 100644 index 00000000..5dafec53 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_MinecraftSlot.h @@ -0,0 +1,59 @@ +#pragma once + +#include +#include + +using namespace std; + +class TileRenderer; +class ItemRenderer; + +//----------------------------------------------------------------------------- +// CXuiCtrlMinecraftSlot class +//----------------------------------------------------------------------------- +class CXuiCtrlMinecraftSlot : public CXuiControlImpl +{ +public: + XUI_IMPLEMENT_CLASS(CXuiCtrlMinecraftSlot, L"CXuiCtrlMinecraftSlot", XUI_CLASS_LABEL) + + VOID SetPassThroughDataAssociation(unsigned int iID, unsigned int iData); + CXuiCtrlMinecraftSlot(); + virtual ~CXuiCtrlMinecraftSlot(); + + void renderGuiItem(Font *font, Textures *textures,ItemInstance *item, int x, int y); + void RenderItem(); + void SetIcon(int iPad, int iId,int iAuxVal, int iCount, int iScale, unsigned int uiAlpha,bool bDecorations,BOOL bShow, bool isFoil); + void SetIcon(int iPad, shared_ptr item, int iScale, unsigned int uiAlpha,bool bDecorations, BOOL bShow=TRUE); + +protected: + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT(OnInit) + XUI_ON_XM_GET_SOURCE_IMAGE(OnGetSourceImage) + XUI_ON_XM_RENDER(OnRender) + XUI_END_MSG_MAP() + + HRESULT OnGetSourceImage(XUIMessageGetSourceImage* pData, BOOL& rfHandled); + HRESULT OnInit(XUIMessageInit* pInitData, BOOL& rfHandled); + HRESULT OnRender(XUIMessageRender *pRenderData, BOOL &rfHandled); + +private: + shared_ptr m_item; + BOOL m_bDirty; + INT m_iPassThroughDataAssociation; + INT m_iPassThroughIdAssociation; + float m_fScale,m_fAlpha; + int m_iPad; + int m_iID; + int m_iCount; + int m_iAuxVal; + bool m_bDecorations; + bool m_isFoil; + int m_popTime; + + bool m_bScreenWidthSetup; + float m_fScreenWidth,m_fScreenHeight; + ItemRenderer *m_pItemRenderer; + + static LPCWSTR xzpIcons[15]; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_MobEffect.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_MobEffect.cpp new file mode 100644 index 00000000..23b22573 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_MobEffect.cpp @@ -0,0 +1,71 @@ +#include "stdafx.h" +#include "XUI_Ctrl_MobEffect.h" + +LPCWSTR CXuiCtrlMobEffect::iconFrameNames[MobEffect::e_MobEffectIcon_COUNT]= +{ + L"Normal", + L"Blindness", + L"Fire_Resistance", + L"Haste", + L"Hunger", + L"Invisibility", + L"Jump_Boost", + L"Mining_Fatigue", + L"Nausea", + L"Night_Vision", + L"Poison", + L"Regeneration", + L"Resistance", + L"Slowness", + L"Speed", + L"Strength", + L"Water_Breathing", + L"Weakness", +}; + +HRESULT CXuiCtrlMobEffect::OnInit(XUIMessageInit* pInitData, BOOL& rfHandled) +{ + m_icon = MobEffect::e_MobEffectIcon_None; + m_name = L""; + m_duration = L""; + return S_OK; +} + +HRESULT CXuiCtrlMobEffect::OnGetSourceDataText(XUIMessageGetSourceText *pGetSourceTextData, BOOL& bHandled) +{ + if( pGetSourceTextData->iData == 1 ) + { + pGetSourceTextData->szText = m_name.c_str(); + pGetSourceTextData->bDisplay = TRUE; + + if(FAILED(PlayVisualRange(iconFrameNames[m_icon],NULL,iconFrameNames[m_icon]))) + { + PlayVisualRange(L"Normal",NULL,L"Normal"); + } + + bHandled = TRUE; + } + else if( pGetSourceTextData->iData == 2 ) + { + pGetSourceTextData->szText = m_duration.c_str(); + pGetSourceTextData->bDisplay = TRUE; + + bHandled = TRUE; + } + return S_OK; +} + +void CXuiCtrlMobEffect::setIcon(MobEffect::EMobEffectIcon icon) +{ + m_icon = icon; +} + +void CXuiCtrlMobEffect::setName(const wstring &name) +{ + m_name = name; +} + +void CXuiCtrlMobEffect::setDuration(const wstring &duration) +{ + m_duration = duration; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_MobEffect.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_MobEffect.h new file mode 100644 index 00000000..c43e7fe9 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_MobEffect.h @@ -0,0 +1,31 @@ +#pragma once +using namespace std; + +#include "..\..\..\Minecraft.World\MobEffect.h" + +class CXuiCtrlMobEffect : public CXuiControlImpl +{ +public: + XUI_IMPLEMENT_CLASS(CXuiCtrlMobEffect, L"CXuiCtrlMobEffect", XUI_CLASS_CONTROL) + +protected: + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT(OnInit) + XUI_ON_XM_GET_SOURCE_TEXT(OnGetSourceDataText) + XUI_END_MSG_MAP() + + HRESULT OnInit(XUIMessageInit* pInitData, BOOL& rfHandled); + HRESULT OnGetSourceDataText(XUIMessageGetSourceText *pGetSourceTextData, BOOL& bHandled); + +public: + void setIcon(MobEffect::EMobEffectIcon icon); + void setName(const wstring &name); + void setDuration(const wstring &duration); + +private: + MobEffect::EMobEffectIcon m_icon; + wstring m_name; + wstring m_duration; + + static LPCWSTR iconFrameNames[MobEffect::e_MobEffectIcon_COUNT]; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_PassThroughList.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_PassThroughList.cpp new file mode 100644 index 00000000..d00762b8 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_PassThroughList.cpp @@ -0,0 +1,109 @@ +#include "stdafx.h" +#include "XUI_Ctrl_PassThroughList.h" + +HRESULT CXuiCtrlPassThroughList::OnInit(XUIMessageInit *pInitData, BOOL& bHandled) +{ + return S_OK; +} + +HRESULT CXuiCtrlPassThroughList::OnKeyDown(XUIMessageInput* pInputData, BOOL& bHandled) +{ + XUIMessage message; + XUIMessageInput messageInput; + HRESULT hr; + HXUIOBJ hObj; + + XuiMessageInput( &message, &messageInput, XUI_KEYDOWN, pInputData->dwKeyCode, pInputData->wch, pInputData->dwFlags, pInputData->UserIndex ); + + hr = GetParent(&hObj); + + if (HRESULT_SUCCEEDED(hr)) + { + hr = XuiBubbleMessage(hObj, &message); + + if (message.bHandled) + { + bHandled = TRUE; + } + } + + return S_OK; +} + +// Gets called every frame +HRESULT CXuiCtrlPassThroughList::OnGetSourceDataText(XUIMessageGetSourceText *pGetSourceTextData,BOOL& bHandled) +{ + XUIMessage Message; + XUIMessageGetSourceText MsgGetText; + HRESULT hr; + HXUIOBJ hObj; + + + XuiMessageGetSourceText(&Message, &MsgGetText, pGetSourceTextData->iItem, pGetSourceTextData->iData, pGetSourceTextData->bItemData); + + hr = GetParent(&hObj); + + if (HRESULT_SUCCEEDED(hr)) + { + hr = XuiBubbleMessage(hObj, &Message); + + if (Message.bHandled) + { + pGetSourceTextData->szText = MsgGetText.szText; + bHandled = TRUE; + } + } + return S_OK; +} + +// Gets called every frame +HRESULT CXuiCtrlPassThroughList::OnGetSourceDataImage(XUIMessageGetSourceImage *pGetSourceImageData,BOOL& bHandled) +{ + XUIMessage Message; + XUIMessageGetSourceImage MsgGetImage; + HRESULT hr; + HXUIOBJ hObj; + + + XuiMessageGetSourceImage(&Message, &MsgGetImage, pGetSourceImageData->iItem, pGetSourceImageData->iData, pGetSourceImageData->bItemData); + + hr = GetParent(&hObj); + + if (HRESULT_SUCCEEDED(hr)) + { + hr = XuiBubbleMessage(hObj, &Message); + + if (Message.bHandled) + { + pGetSourceImageData->szPath = MsgGetImage.szPath; + bHandled = TRUE; + } + } + return S_OK; +} + +HRESULT CXuiCtrlPassThroughList::OnGetItemCountAll(XUIMessageGetItemCount *pGetItemCountData,BOOL& bHandled) +{ + XUIMessage Message; + XUIMessageGetItemCount MsgGetItemCountAll; + HRESULT hr; + HXUIOBJ hObj; + + + XuiMessageGetItemCount(&Message, &MsgGetItemCountAll, XUI_ITEMCOUNT_ALL); + + hr = GetParent(&hObj); + + if (HRESULT_SUCCEEDED(hr)) + { + hr = XuiBubbleMessage(hObj, &Message); + + if (Message.bHandled) + { + pGetItemCountData->cItems = MsgGetItemCountAll.cItems; + bHandled = TRUE; + } + } + bHandled = TRUE; + return S_OK; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_PassthroughList.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_PassthroughList.h new file mode 100644 index 00000000..9e2c1bdf --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_PassthroughList.h @@ -0,0 +1,28 @@ +#pragma once + +// 4J Stu - A list control that responds by sending the message to it's parent and +// returning what the parent returns + +class CXuiCtrlPassThroughList : public CXuiListImpl +{ +public: + XUI_IMPLEMENT_CLASS(CXuiCtrlPassThroughList, L"CXuiCtrlPassThroughList", XUI_CLASS_LIST); +protected: + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT(OnInit) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_GET_SOURCE_TEXT(OnGetSourceDataText) + XUI_ON_XM_GET_SOURCE_IMAGE(OnGetSourceDataImage) + XUI_ON_XM_GET_ITEMCOUNT_ALL(OnGetItemCountAll) + XUI_END_MSG_MAP() + + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& bHandled); + HRESULT OnGetSourceDataText(XUIMessageGetSourceText *pGetSourceTextData, BOOL& bHandled); + HRESULT OnGetSourceDataImage(XUIMessageGetSourceImage *pGetSourceImageData,BOOL& bHandled); + HRESULT OnGetItemCountAll(XUIMessageGetItemCount *pGetItemCountData, BOOL& bHandled); + + +}; diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_ProgressCtrlBase.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_ProgressCtrlBase.cpp new file mode 100644 index 00000000..6d1c4ce7 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_ProgressCtrlBase.cpp @@ -0,0 +1,22 @@ +#include "stdafx.h" + +#include "XUI_Ctrl_ProgressCtrlBase.h" + +HRESULT CXuiCtrlProgressCtrlBase::OnGetSourceDataText(XUIMessageGetSourceText *pGetSourceTextData, BOOL& bHandled) +{ + // The Xui backend calls GetSourceDataText every frame to get the text for the indexed label + // We don't want to change the label, but take this opportunity to send out a message to ourself + // to update the value of the progress bar + this->SetValue( GetValue() ); + + int min, max; + this->GetRange( &min, &max ); + this->SetRange( min, max ); + + pGetSourceTextData->szText = L""; + pGetSourceTextData->bDisplay = FALSE; + + bHandled = TRUE; + + return S_OK; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_ProgressCtrlBase.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_ProgressCtrlBase.h new file mode 100644 index 00000000..7a4302d3 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_ProgressCtrlBase.h @@ -0,0 +1,11 @@ +#pragma once + +class CXuiCtrlProgressCtrlBase : public CXuiProgressBar, public CXuiElementImplBase +{ +public: + HRESULT OnGetSourceDataText(XUIMessageGetSourceText *pGetSourceTextData, BOOL& bHandled); + + // Override these in the derived classes to return the values to be displayed on the control + virtual int GetValue() = 0; + virtual void GetRange(int *pnRangeMin, int *pnRangeMax) = 0; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_SliderWrapper.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_SliderWrapper.cpp new file mode 100644 index 00000000..a4e9f6be --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_SliderWrapper.cpp @@ -0,0 +1,174 @@ +#include "stdafx.h" +#include "XUI_Ctrl_SliderWrapper.h" + +#define NO_SOUND_TIMER 0 + +HRESULT CXuiCtrlSliderWrapper::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + VOID *pObj; + HXUIOBJ hObjChild; + + XuiElementGetChildById(m_hObj,L"FocusSink",&hObjChild); + XuiObjectFromHandle( hObjChild, &pObj ); + m_pFocusSink = (CXuiControl *)pObj; + + XuiElementGetChildById(m_hObj,L"XuiSlider",&hObjChild); + XuiObjectFromHandle( hObjChild, &pObj ); + m_pSlider = (CXuiSlider *)pObj; + + m_sliderActive = false; + m_bDisplayVal=true; + m_bPlaySound=false; // make this false to avoid a sound being played in the first setting of the slider value in a scene + XuiSetTimer( m_hObj,NO_SOUND_TIMER,50); + bHandled = TRUE; + return S_OK; +} + +HRESULT CXuiCtrlSliderWrapper::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + +// switch(pInputData->dwKeyCode) +// { + +// case VK_PAD_A: +// // 4J-PB - IGNORE ! +// if(m_sliderActive) +// { +// m_pFocusSink->SetFocus(pInputData->UserIndex); +// m_sliderActive = false; +// } +// else +// { +// m_pSlider->SetFocus(pInputData->UserIndex); +// m_sliderActive = true; +// } +// rfHandled = TRUE; +// +// break; +// default: +// m_pSlider->SetFocus(pInputData->UserIndex); +// m_sliderActive = false; +// break; +// +// } +// + return S_OK; +} + +HRESULT CXuiCtrlSliderWrapper::OnNotifyValueChanged (HXUIOBJ hObjSource, XUINotifyValueChanged* pValueChangedData, BOOL& rfHandled) +{ + XUIMessage Message; + XUINotify Notify; + XUINotifyValueChanged MsgValueChanged; + HRESULT hr; + HXUIOBJ hObj; + + if(m_bPlaySound) + { + m_bPlaySound=false; + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + XuiSetTimer( m_hObj,NO_SOUND_TIMER,150); + } + + //app.DebugPrintf("Slider val changed - %d\n",pValueChangedData->nValue); + + XuiNotifyValueChanged(&Message,&Notify,&MsgValueChanged,hObjSource,pValueChangedData->nValue); + + hr = GetParent(&hObj); + + if (HRESULT_SUCCEEDED(hr)) + { + hr = XuiBubbleMessage(hObj, &Message); + rfHandled = TRUE; + } + return S_OK; +} + + +HRESULT CXuiCtrlSliderWrapper::OnTimer(XUIMessageTimer *pData,BOOL& rfHandled) +{ + if(pData->nId==NO_SOUND_TIMER) + { + XuiKillTimer(m_hObj,NO_SOUND_TIMER); + m_bPlaySound=true; + } + + return S_OK; +} + +HRESULT CXuiCtrlSliderWrapper::SetValue( int nValue ) +{ + CXuiCtrlSliderWrapper *pThis; + HRESULT hr = XuiObjectFromHandle(m_hObj, (void **) &pThis); + if (FAILED(hr)) + return hr; + + pThis->m_pSlider->SetValue(nValue); + return S_OK; +} + +HRESULT CXuiCtrlSliderWrapper::SetValueDisplay( BOOL bShow ) +{ + CXuiCtrlSliderWrapper *pThis; + HXUIOBJ hVisual,hText; + HRESULT hr = XuiObjectFromHandle(m_hObj, (void **) &pThis); + if (FAILED(hr)) + return hr; + + hr=XuiControlGetVisual(pThis->m_pSlider->m_hObj,&hVisual); + hr=XuiElementGetChildById(hVisual,L"Text_Value",&hText); + + if(hText!=NULL) + { + XuiElementSetShow(hText,bShow); + } + + return S_OK; +} + +LPCWSTR CXuiCtrlSliderWrapper::GetText( ) +{ + CXuiCtrlSliderWrapper *pThis; + HRESULT hr = XuiObjectFromHandle(m_hObj, (void **) &pThis); + if (FAILED(hr)) + return NULL; + return pThis->m_pSlider->GetText(); + //return S_OK; +} + +HRESULT CXuiCtrlSliderWrapper::SetText(LPCWSTR text , int iDataAssoc) +{ + CXuiCtrlSliderWrapper *pThis; + HRESULT hr = XuiObjectFromHandle(m_hObj, (void **) &pThis); + if (FAILED(hr)) + return hr; + + // if there's a data assoc value, find the right control for it + if(iDataAssoc!=0) + { + + } + + pThis->m_pSlider->SetText(text); + return hr; +} + +HXUIOBJ CXuiCtrlSliderWrapper::GetSlider() +{ + CXuiCtrlSliderWrapper *pThis; + HRESULT hr = XuiObjectFromHandle(m_hObj, (void **) &pThis); + if (FAILED(hr)) + return NULL; + return pThis->m_pSlider->m_hObj; +} + +HRESULT CXuiCtrlSliderWrapper::SetRange( int nRangeMin, int nRangeMax) +{ + CXuiCtrlSliderWrapper *pThis; + HRESULT hr = XuiObjectFromHandle(m_hObj, (void **) &pThis); + if (FAILED(hr)) + return hr; + pThis->m_pSlider->SetRange(nRangeMin, nRangeMax); + return S_OK; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_SliderWrapper.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_SliderWrapper.h new file mode 100644 index 00000000..03659fca --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_SliderWrapper.h @@ -0,0 +1,38 @@ +#pragma once + +class CXuiCtrlSliderWrapper : public CXuiSceneImpl +{ +private: + CXuiSlider *m_pSlider; + CXuiControl *m_pFocusSink; + bool m_sliderActive; + bool m_bDisplayVal; + bool m_bPlaySound; + +protected: + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_TIMER( OnTimer ) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_NOTIFY_VALUE_CHANGED(OnNotifyValueChanged) + XUI_END_MSG_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnNotifyValueChanged (HXUIOBJ hObjSource, XUINotifyValueChanged* pValueChangedData, BOOL& rfHandled); + HRESULT OnTimer(XUIMessageTimer *pData,BOOL& rfHandled); +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CXuiCtrlSliderWrapper, L"CXuiCtrlSliderWrapper", XUI_CLASS_SCENE ) + + HRESULT SetValue( int nValue ); + HXUIOBJ GetSlider(); + HRESULT SetRange( int nRangeMin, int nRangeMax); + LPCWSTR GetText( ); + HRESULT SetText(LPCWSTR text, int iDataAssoc=0 ); + HRESULT SetValueDisplay( BOOL bShow ); + +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItem.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItem.h new file mode 100644 index 00000000..1fad4a34 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItem.h @@ -0,0 +1,37 @@ +#pragma once +#include "XUI_Ctrl_SlotItemCtrlBase.h" + +class CXuiCtrlSlotItem : public CXuiControlImpl, public CXuiCtrlSlotItemCtrlBase +{ +public: + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CXuiCtrlSlotItem, L"CXuiCtrlSlotItem", XUI_CLASS_CONTROL ) + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_DESTROY(OnDestroy) + XUI_ON_XM_GETSLOTITEM_MESSAGE(OnCustomMessage_GetSlotItem) + + // 4J WESTY : Pointer Prototype : Added to support prototype only. + XUI_ON_XM_CONTROL_NAVIGATE( OnControlNavigate ) + + XUI_ON_XM_KEYDOWN( OnKeyDown ) + XUI_END_MSG_MAP() + + using CXuiCtrlSlotItemCtrlBase::OnInit; + HRESULT OnInit(XUIMessageInit* pInitData, BOOL& bHandled) { return this->OnInit( m_hObj, pInitData, bHandled ); }; + + using CXuiCtrlSlotItemCtrlBase::OnDestroy; + HRESULT OnDestroy() { return this->OnDestroy( m_hObj ); }; + + using CXuiCtrlSlotItemCtrlBase::OnCustomMessage_GetSlotItem; + HRESULT OnCustomMessage_GetSlotItem(CustomMessage_GetSlotItem_Struct *pData, BOOL& bHandled) { return this->OnCustomMessage_GetSlotItem( m_hObj, pData, bHandled ); }; + + // 4J WESTY : Pointer Prototype : Added to support prototype only. + using CXuiCtrlSlotItemCtrlBase::OnControlNavigate; + HRESULT OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) { return this->OnControlNavigate( m_hObj, pControlNavigateData, bHandled ); }; + + using CXuiCtrlSlotItemCtrlBase::OnKeyDown; + HRESULT OnKeyDown(XUIMessageInput *pInputData, BOOL& bHandled) { return this->OnKeyDown( m_hObj, pInputData, bHandled ); }; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItemCtrlBase.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItemCtrlBase.cpp new file mode 100644 index 00000000..87abbcd3 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItemCtrlBase.cpp @@ -0,0 +1,392 @@ +#include "stdafx.h" + +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\Slot.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\Minecraft.h" + +#include "XUI_Ctrl_SlotItemCtrlBase.h" + +HRESULT CXuiCtrlSlotItemCtrlBase::OnInit( HXUIOBJ hObj, XUIMessageInit* pInitData, BOOL& bHandled ) +{ + HRESULT hr = S_OK; + SlotControlUserDataContainer* pvUserData = new SlotControlUserDataContainer(); + hr = XuiElementSetUserData(hObj, (void *)pvUserData ); + + // 4J WESTY : Pointer Prototype : Added to support prototype only. + m_bSkipDefaultNavigation = false; + + return hr; +} + +HRESULT CXuiCtrlSlotItemCtrlBase::OnDestroy( HXUIOBJ hObj ) +{ + HRESULT hr = S_OK; + void* pvUserData; + hr = XuiElementGetUserData( hObj, &pvUserData ); + + if( pvUserData != NULL ) + { + delete pvUserData; + } + + return hr; +} + +HRESULT CXuiCtrlSlotItemCtrlBase::OnCustomMessage_GetSlotItem(HXUIOBJ hObj, CustomMessage_GetSlotItem_Struct *pData, BOOL& bHandled) +{ + shared_ptr item = shared_ptr(); + + void* pvUserData; + XuiElementGetUserData( hObj, &pvUserData ); + + SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; + + if( pUserDataContainer->slot != NULL ) + { + item = pUserDataContainer->slot->getItem(); + } + else if(pUserDataContainer->m_iPad >= 0 && pUserDataContainer->m_iPad < XUSER_MAX_COUNT) + { + shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad] ); + if(player != NULL) item = player->inventory->getCarried(); + } + + if( item != NULL ) + { + pData->item = item; + pData->iItemBitField = MAKE_SLOTDISPLAY_ITEM_BITMASK(item->id,item->getAuxValue(),item->isFoil()); + //int iAuxVal=item->getAuxValue(); + //int iCount = item->GetCount(); + // 8 bits - alpha + // 1 bit - decorations on + // 11 bits - auxval + // 6 bits - count + // 6 bits - scale + pData->iDataBitField = MAKE_SLOTDISPLAY_DATA_BITMASK(pUserDataContainer->m_iPad, (int)(31*pUserDataContainer->m_fAlpha),true,item->GetCount(),7,item->popTime); + } + else + { + //pGetSourceImageData->iData = 0; + pData->szPath = L""; + } + + bHandled = TRUE; + + return S_OK; +} + +void CXuiCtrlSlotItemCtrlBase::SetSlot( HXUIOBJ hObj, Slot* slot ) +{ + void* pvUserData; + XuiElementGetUserData( hObj, &pvUserData ); + + SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; + + pUserDataContainer->slot = slot; +} + +void CXuiCtrlSlotItemCtrlBase::SetUserIndex( HXUIOBJ hObj, int iPad ) +{ + void* pvUserData; + XuiElementGetUserData( hObj, &pvUserData ); + + SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; + + pUserDataContainer->m_iPad = iPad; +} + +void CXuiCtrlSlotItemCtrlBase::SetAlpha( HXUIOBJ hObj, float fAlpha ) +{ + void* pvUserData; + XuiElementGetUserData( hObj, &pvUserData ); + + SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; + + pUserDataContainer->m_fAlpha = fAlpha; +} + +bool CXuiCtrlSlotItemCtrlBase::isEmpty( HXUIOBJ hObj ) +{ + void* pvUserData; + XuiElementGetUserData( hObj, &pvUserData ); + SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; + + if(pUserDataContainer->slot != NULL) + { + return !pUserDataContainer->slot->hasItem(); + } + else if(pUserDataContainer->m_iPad >= 0 && pUserDataContainer->m_iPad < XUSER_MAX_COUNT) + { + shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad] ); + if(player != NULL) return player->inventory->getCarried() == NULL; + + } + return true; +} + +wstring CXuiCtrlSlotItemCtrlBase::GetItemDescription( HXUIOBJ hObj, vector &unformattedStrings ) +{ + void* pvUserData; + XuiElementGetUserData( hObj, &pvUserData ); + SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; + + if(pUserDataContainer->slot != NULL) + { + wstring desc = L""; + vector *strings = pUserDataContainer->slot->getItem()->getHoverText(Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad], false, unformattedStrings); + bool firstLine = true; + for(AUTO_VAR(it, strings->begin()); it != strings->end(); ++it) + { + wstring thisString = *it; + if(!firstLine) + { + desc.append( L"
" ); + } + else + { + firstLine = false; + wchar_t formatted[256]; + eMinecraftColour rarityColour = pUserDataContainer->slot->getItem()->getRarity()->color; + int colour = app.GetHTMLColour(rarityColour); + + if(pUserDataContainer->slot->getItem()->hasCustomHoverName()) + { + colour = app.GetHTMLColour(eTextColor_RenamedItemTitle); + } + + swprintf(formatted, 256, L"%s",colour,thisString.c_str()); + thisString = formatted; + } + desc.append( thisString ); + } + strings->clear(); + delete strings; + return desc;//app.GetString( pUserDataContainer->slot->getItem()->getDescriptionId() ); + } + else if(pUserDataContainer->m_iPad >= 0 && pUserDataContainer->m_iPad < XUSER_MAX_COUNT) + { + shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad] ); + if(player != NULL) + { + shared_ptr item = player->inventory->getCarried(); + if(item != NULL) return app.GetString( item->getDescriptionId() ); + } + + } + return L""; +} + +shared_ptr CXuiCtrlSlotItemCtrlBase::getItemInstance( HXUIOBJ hObj ) +{ + void* pvUserData; + XuiElementGetUserData( hObj, &pvUserData ); + SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; + + if(pUserDataContainer->slot != NULL) + { + return pUserDataContainer->slot->getItem(); + } + else if(pUserDataContainer->m_iPad >= 0 && pUserDataContainer->m_iPad < XUSER_MAX_COUNT) + { + shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad] ); + if(player != NULL) return player->inventory->getCarried(); + + } + return nullptr; +} + +Slot *CXuiCtrlSlotItemCtrlBase::getSlot( HXUIOBJ hObj ) +{ + void* pvUserData; + XuiElementGetUserData( hObj, &pvUserData ); + SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; + + return pUserDataContainer->slot; +} + +HRESULT CXuiCtrlSlotItemCtrlBase::OnKeyDown(HXUIOBJ hObj, XUIMessageInput *pInputData, BOOL& bHandled) +{ + if( pInputData->dwKeyCode == VK_PAD_DPAD_LEFT || + pInputData->dwKeyCode == VK_PAD_DPAD_RIGHT || + pInputData->dwKeyCode == VK_PAD_DPAD_UP || + pInputData->dwKeyCode == VK_PAD_DPAD_DOWN || + pInputData->dwKeyCode == VK_PAD_LTRIGGER || + pInputData->dwKeyCode == VK_PAD_RTRIGGER) + { + HXUIOBJ parent; + HRESULT hr; + hr = XuiElementGetParent( hObj, &parent ); + + XUIMessage message; + XUIMessageInput messageInput; + + XuiMessageInput( &message, &messageInput, XUI_KEYDOWN, pInputData->dwKeyCode, pInputData->wch, pInputData->dwFlags, pInputData->UserIndex ); + + if (HRESULT_SUCCEEDED(hr)) + { + hr = XuiBubbleMessage(parent, &message); + + if (message.bHandled) + { + bHandled = TRUE; + } + } + } + + return S_OK; +} + +// 4J WESTY : Pointer Prototype : Added to support prototype only. +HRESULT CXuiCtrlSlotItemCtrlBase::OnControlNavigate( HXUIOBJ hObj, XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) +{ + // Skip default navigation behaviour when navigation is by pointer. + if ( m_bSkipDefaultNavigation ) + { + pControlNavigateData->bSkipNavigate = TRUE; + bHandled = TRUE; + } + return S_OK; +} + +// 4J WESTY : Pointer Prototype : Added to support prototype only. +int CXuiCtrlSlotItemCtrlBase::GetObjectCount( HXUIOBJ hObj ) +{ + void* pvUserData; + XuiElementGetUserData( hObj, &pvUserData ); + SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; + + int iCount = 0; + + if(pUserDataContainer->slot != NULL) + { + if ( pUserDataContainer->slot->hasItem() ) + { + iCount = pUserDataContainer->slot->getItem()->GetCount(); + } + } + else if(pUserDataContainer->m_iPad >= 0 && pUserDataContainer->m_iPad < XUSER_MAX_COUNT) + { + shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pUserDataContainer->m_iPad] ); + if(player != NULL && player->inventory->getCarried() != NULL) + { + iCount = player->inventory->getCarried()->count; + } + + } + return iCount; +} + + +// 4J WESTY : Pointer Prototype : Added to support prototype only. +bool CXuiCtrlSlotItemCtrlBase::IsSameItemAs( HXUIOBJ hThisObj, HXUIOBJ hOtherObj ) +{ + bool bThisItemExists = false; + int iThisID = 0; + int iThisAux = 0; + + bool bOtherItemExists = false; + int iOtherID = 0; + int iOtherAux = 0; + + bool bStackedByData = false; + + // Get the info on this item. + void* pvThisUserData; + XuiElementGetUserData( hThisObj, &pvThisUserData ); + SlotControlUserDataContainer* pThisUserDataContainer = (SlotControlUserDataContainer*)pvThisUserData; + + if(pThisUserDataContainer->slot != NULL) + { + if ( pThisUserDataContainer->slot->hasItem() ) + { + iThisID = pThisUserDataContainer->slot->getItem()->id; + iThisAux = pThisUserDataContainer->slot->getItem()->getAuxValue(); + bThisItemExists = true; + bStackedByData = pThisUserDataContainer->slot->getItem()->isStackedByData(); + } + } + else if(pThisUserDataContainer->m_iPad >= 0 && pThisUserDataContainer->m_iPad < XUSER_MAX_COUNT) + { + shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pThisUserDataContainer->m_iPad] ); + if(player != NULL && player->inventory->getCarried() != NULL) + { + iThisID = player->inventory->getCarried()->id; + iThisAux = player->inventory->getCarried()->getAuxValue(); + bThisItemExists = true; + bStackedByData = player->inventory->getCarried()->isStackedByData(); + } + + } + + // Get the info on other item. + void* pvOtherUserData; + XuiElementGetUserData( hOtherObj, &pvOtherUserData ); + SlotControlUserDataContainer* pOtherUserDataContainer = (SlotControlUserDataContainer*)pvOtherUserData; + + if(pOtherUserDataContainer->slot != NULL) + { + if ( pOtherUserDataContainer->slot->hasItem() ) + { + iOtherID = pOtherUserDataContainer->slot->getItem()->id; + iOtherAux = pOtherUserDataContainer->slot->getItem()->getAuxValue(); + bOtherItemExists = true; + } + } + else if(pOtherUserDataContainer->m_iPad >= 0 && pOtherUserDataContainer->m_iPad < XUSER_MAX_COUNT) + { + shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->localplayers[pOtherUserDataContainer->m_iPad] ); + if(player != NULL && player->inventory->getCarried() != NULL) + { + iOtherID = player->inventory->getCarried()->id; + iOtherAux = player->inventory->getCarried()->getAuxValue(); + bOtherItemExists = true; + } + + } + + if ( bThisItemExists && bOtherItemExists ) + { + return ( ( iThisID == iOtherID ) && ( (bStackedByData && iThisAux == iOtherAux) || !bStackedByData ) ); + } + else + { + return false; + } +} + +// 4J WESTY : Pointer Prototype : Added to support prototype only. +// Returns number of items that can still be stacked into this slot. +int CXuiCtrlSlotItemCtrlBase::GetEmptyStackSpace( HXUIOBJ hObj ) +{ + int iResult = 0; + + void* pvUserData; + XuiElementGetUserData( hObj, &pvUserData ); + SlotControlUserDataContainer* pUserDataContainer = (SlotControlUserDataContainer*)pvUserData; + + int iCount = 0; + int iMaxStackSize = 0; + bool bStackable = false; + + if(pUserDataContainer->slot != NULL) + { + if ( pUserDataContainer->slot->hasItem() ) + { + bStackable = pUserDataContainer->slot->getItem()->isStackable(); + if ( bStackable ) + { + iCount = pUserDataContainer->slot->getItem()->GetCount(); + iMaxStackSize = min(pUserDataContainer->slot->getItem()->getMaxStackSize(), pUserDataContainer->slot->getMaxStackSize() ); + + iResult = iMaxStackSize - iCount; + + if(iResult < 0 ) iResult = 0; + } + } + } + + return iResult; +} + diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItemCtrlBase.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItemCtrlBase.h new file mode 100644 index 00000000..2fd21749 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItemCtrlBase.h @@ -0,0 +1,78 @@ +#pragma once +using namespace std; + +class Slot; +class ItemInstance; + +#include "XUI_CustomMessages.h" + +class SlotControlUserDataContainer +{ +public: + SlotControlUserDataContainer() : slot( NULL ), hProgressBar( NULL ), m_iPad( -1 ), m_fAlpha(1.0f) {}; + Slot* slot; + HXUIOBJ hProgressBar; + float m_fAlpha; + int m_iPad; +}; + +// The base class for all controls with the "ItemButton" visual +// This could be a list item or just a button. +// We need this class to be able to easily access all the parts of the visual + +class CXuiCtrlSlotItemCtrlBase +{ +private: + // 4J WESTY : Pointer Prototype : Added to support prototype only. + BOOL m_bSkipDefaultNavigation; + +public: + // We define a lot of functions as virtual. These should be implemented to call the protected version by + // passing in the HXUIOBJ of the control as the first parameter. We do not have access to that normally + // due to the inheritance structure + virtual HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) = 0; + + virtual HRESULT OnDestroy() = 0; + + virtual HRESULT OnCustomMessage_GetSlotItem(CustomMessage_GetSlotItem_Struct *pData, BOOL& bHandled) = 0; + + // 4J WESTY : Pointer Prototype : Added to support prototype only. + virtual HRESULT OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) = 0; + + virtual HRESULT OnKeyDown(XUIMessageInput *pInputData, BOOL& bHandled) = 0; + + void SetSlot( HXUIOBJ hObj, Slot* slot ); + void SetAlpha( HXUIOBJ hObj, float fAlpha ); + void SetUserIndex( HXUIOBJ hObj, int iPad ); + + bool isEmpty( HXUIOBJ hObj ); + + wstring GetItemDescription( HXUIOBJ hObj, vector &unformattedStrings ); + + shared_ptr getItemInstance( HXUIOBJ hObj ); + Slot *getSlot( HXUIOBJ hObj ); + + // 4J WESTY : Pointer Prototype : Added to support prototype only. + int GetObjectCount( HXUIOBJ hObj ); + + // 4J WESTY : Pointer Prototype : Added to support prototype only. + void SetSkipsDefaultNavigation( BOOL bSkipDefaultNavigation ) { m_bSkipDefaultNavigation = bSkipDefaultNavigation; } + + // 4J WESTY : Pointer Prototype : Added to support prototype only. + int GetEmptyStackSpace( HXUIOBJ hObj ); // Returns number of items that can still be stacked into this slot. + + // 4J WESTY : Pointer Prototype : Added to support prototype only. + bool IsSameItemAs( HXUIOBJ hThisObj, HXUIOBJ hOtherObj ); + +protected: + HRESULT OnInit( HXUIOBJ hObj, XUIMessageInit* pInitData, BOOL& bHandled ); + + HRESULT OnDestroy( HXUIOBJ hObj ); + + HRESULT OnCustomMessage_GetSlotItem(HXUIOBJ hObj, CustomMessage_GetSlotItem_Struct *pData, BOOL& bHandled); + + // 4J WESTY : Pointer Prototype : Added to support prototype only. + HRESULT OnControlNavigate(HXUIOBJ hObj, XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled); + + HRESULT OnKeyDown(HXUIOBJ hObj, XUIMessageInput *pInputData, BOOL& bHandled); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItemListItem.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItemListItem.h new file mode 100644 index 00000000..bee1b93f --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotItemListItem.h @@ -0,0 +1,38 @@ +#pragma once + +#include "XUI_Ctrl_SlotItemCtrlBase.h" + +class CXuiCtrlSlotItemListItem : public CXuiListItemImpl, public CXuiCtrlSlotItemCtrlBase +{ +public: + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CXuiCtrlSlotItemListItem, L"CXuiCtrlSlotItemListItem", XUI_CLASS_LISTITEM ) + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_DESTROY(OnDestroy) + XUI_ON_XM_GETSLOTITEM_MESSAGE(OnCustomMessage_GetSlotItem) + + // 4J WESTY : Pointer Prototype : Added to support prototype only. + XUI_ON_XM_CONTROL_NAVIGATE( OnControlNavigate ) + + XUI_ON_XM_KEYDOWN( OnKeyDown ) + XUI_END_MSG_MAP() + + using CXuiCtrlSlotItemCtrlBase::OnInit; + HRESULT OnInit(XUIMessageInit* pInitData, BOOL& bHandled) { return this->OnInit( m_hObj, pInitData, bHandled ); }; + + using CXuiCtrlSlotItemCtrlBase::OnDestroy; + HRESULT OnDestroy() { return this->OnDestroy( m_hObj ); }; + + using CXuiCtrlSlotItemCtrlBase::OnCustomMessage_GetSlotItem; + HRESULT OnCustomMessage_GetSlotItem(CustomMessage_GetSlotItem_Struct *pData, BOOL& bHandled) { return this->OnCustomMessage_GetSlotItem( m_hObj, pData, bHandled ); }; + + // 4J WESTY : Pointer Prototype : Added to support prototype only. + using CXuiCtrlSlotItemCtrlBase::OnControlNavigate; + HRESULT OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) { return this->OnControlNavigate( m_hObj, pControlNavigateData, bHandled ); } + + using CXuiCtrlSlotItemCtrlBase::OnKeyDown; + HRESULT OnKeyDown(XUIMessageInput *pInputData, BOOL& bHandled) { return this->OnKeyDown( m_hObj, pInputData, bHandled ); }; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotList.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotList.cpp new file mode 100644 index 00000000..7e51c885 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotList.cpp @@ -0,0 +1,231 @@ +#include "stdafx.h" + +#include "..\..\..\Minecraft.World\AbstractContainerMenu.h" + +#include "XUI_Ctrl_SlotItemListItem.h" +#include "XUI_Ctrl_SlotList.h" + + +//-------------------------------------------------------------------------------------- +// Name: CXuiCtrlSlotList::OnInit +// Desc: Message handler for XM_INIT +//-------------------------------------------------------------------------------------- +HRESULT CXuiCtrlSlotList::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + slotCount = 0; + + return S_OK; +} + +HRESULT CXuiCtrlSlotList::OnDestroy() +{ + return S_OK; +} + +HRESULT CXuiCtrlSlotList::OnKeyDown(XUIMessageInput *pInputData, BOOL& bHandled) +{ + if( pInputData->dwKeyCode == VK_PAD_DPAD_LEFT || + pInputData->dwKeyCode == VK_PAD_DPAD_RIGHT || + pInputData->dwKeyCode == VK_PAD_DPAD_UP || + pInputData->dwKeyCode == VK_PAD_DPAD_DOWN || + pInputData->dwKeyCode == VK_PAD_LTRIGGER || + pInputData->dwKeyCode == VK_PAD_RTRIGGER) + { + HXUIOBJ parent; + HRESULT hr; + hr = XuiElementGetParent( m_hObj, &parent ); + + XUIMessage message; + XUIMessageInput messageInput; + + XuiMessageInput( &message, &messageInput, XUI_KEYDOWN, pInputData->dwKeyCode, pInputData->wch, pInputData->dwFlags, pInputData->UserIndex ); + + if (HRESULT_SUCCEEDED(hr)) + { + hr = XuiBubbleMessage(parent, &message); + + if (message.bHandled) + { + bHandled = TRUE; + } + } + } + + return S_OK; +} + +void CXuiCtrlSlotList::SetData(int m_iPad, AbstractContainerMenu* menu, int rows, int columns, int startIndex /*= 0*/, int endIndex /*= 0*/) +{ + assert( startIndex >= 0 && startIndex < menu->getSize() ); + assert( endIndex <= menu->getSize() ); + + if( startIndex < 0 ) + { + startIndex = 0; + } + else if( startIndex > menu->getSize() ) + { + startIndex = menu->getSize(); + } + + if( endIndex == 0 ) + { + endIndex = startIndex + (rows * columns); + } + + if( endIndex > menu->getSize() ) + { + endIndex = menu->getSize(); + } + + if( startIndex > endIndex ) + { + endIndex = startIndex; + } + + assert( (rows * columns) == (endIndex - startIndex) ); + + this->rows = rows; + this->columns = columns; + + this->startIndex = startIndex; + + this->slotCount = rows * columns; + + InsertItems( 0, slotCount ); + + for(int i = 0; i < slotCount; i++) + { + CXuiCtrlSlotItemListItem* slotControl; + GetCXuiCtrlSlotItem(i, &slotControl); + + slotControl->SetSlot( slotControl->m_hObj, menu->getSlot( i + startIndex ) ); + + slotControl->SetUserIndex( slotControl->m_hObj, m_iPad ); + + slotControl = NULL; + } +} + +HRESULT CXuiCtrlSlotList::OnGetItemCountAll( XUIMessageGetItemCount *pGetItemCountData, BOOL& bHandled ) +{ + // We don't need to look at the type of request. The message map + // has already filtered out a request to retrieve all items. + pGetItemCountData->cItems = slotCount; + bHandled = TRUE; + + return( S_OK ); +} + +HRESULT CXuiCtrlSlotList::OnGetItemCountMaxLines( XUIMessageGetItemCount *pGetItemCountData, BOOL& bHandled ) +{ + // We don't need to look at the type of request. The message map + // has already filtered out a request to retrieve max lines. + pGetItemCountData->cItems = rows; + bHandled = TRUE; + + return( S_OK ); +} + +HRESULT CXuiCtrlSlotList::OnGetItemCountMaxPerLine( XUIMessageGetItemCount *pGetItemCountData, BOOL& bHandled ) +{ + // We don't need to look at the type of request. The message map + // has already filtered out a request to retrieve max per line. + pGetItemCountData->cItems = columns; + bHandled = TRUE; + + return( S_OK ); +} + +int CXuiCtrlSlotList::GetCurrentColumn() +{ + int currentItemIndex = GetCurSel(); + + return currentItemIndex % columns; +} + +int CXuiCtrlSlotList::GetCurrentRow() +{ + int currentItemIndex = GetCurSel(); + + return (currentItemIndex/columns) % rows; +} + +// Return the index in the menu object +int CXuiCtrlSlotList::GetCurrentIndex() +{ + int currentSelected = GetCurSel(); + return currentSelected + this->startIndex; +} + +void CXuiCtrlSlotList::SetCurrentSlot(int row, int column) +{ + if( row >= rows ) + { + row = rows - 1; + } + else if ( row < 0 ) + { + row = 0; + } + if( column >= columns ) + { + column = columns - 1; + } + else if ( column < 0 ) + { + column = 0; + } + int newSlot = ( row * columns ) + column; + SetCurSel( newSlot ); +} + +void CXuiCtrlSlotList::SetEntrySlot(int row, int column, XUI_CONTROL_NAVIGATE direction) +{ + // The direction is the direction in which we are leaving the previous control to get to here + // So a Navigate up means we want to start at the bottom of ourself + switch( direction ) + { + case XUI_CONTROL_NAVIGATE_UP: + { + row = rows - 1; + break; + } + case XUI_CONTROL_NAVIGATE_DOWN: + { + row = 0; + break; + } + case XUI_CONTROL_NAVIGATE_LEFT: + case XUI_CONTROL_NAVIGATE_TABBACKWARD: + { + column = columns - 1; + break; + } + case XUI_CONTROL_NAVIGATE_RIGHT: + case XUI_CONTROL_NAVIGATE_TABFORWARD: + { + column = 0; + break; + } + } + SetCurrentSlot( row, column ); +} + +void CXuiCtrlSlotList::Clicked() +{ + CXuiCtrlSlotItemListItem* slot; + GetCXuiCtrlSlotItem( GetCurSel() , &slot); + + // To get the press animation + slot->Press(); +} + +void CXuiCtrlSlotList::GetCXuiCtrlSlotItem(int itemIndex, CXuiCtrlSlotItemListItem** CXuiCtrlSlotItem) +{ + HXUIOBJ itemControl = this->GetItemControl(itemIndex); + VOID *pObj; + XuiObjectFromHandle( itemControl, &pObj ); + *CXuiCtrlSlotItem = (CXuiCtrlSlotItemListItem *)pObj; +} + diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotList.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotList.h new file mode 100644 index 00000000..d428ab14 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotList.h @@ -0,0 +1,73 @@ +#pragma once + +// Sig: HRESULT OnGetItemCountMaxLines(XUIMessageGetItemCount *pGetItemCountData, BOOL& bHandled) +#define XUI_ON_XM_GET_ITEMCOUNT_MAX_LINES(MemberFunc)\ + if (pMessage->dwMessage == XM_GET_ITEMCOUNT && ((XUIMessageGetItemCount *) pMessage->pvData)->nType == XUI_ITEMCOUNT_MAX_LINES)\ + {\ + XUIMessageGetItemCount *pData = (XUIMessageGetItemCount *) pMessage->pvData;\ + return MemberFunc(pData, pMessage->bHandled);\ + } + +// Sig: HRESULT OnGetItemCountMaxPerLine(XUIMessageGetItemCount *pGetItemCountData, BOOL& bHandled) +#define XUI_ON_XM_GET_ITEMCOUNT_MAX_PER_LINE(MemberFunc)\ + if (pMessage->dwMessage == XM_GET_ITEMCOUNT && ((XUIMessageGetItemCount *) pMessage->pvData)->nType == XUI_ITEMCOUNT_MAX_PER_LINE)\ + {\ + XUIMessageGetItemCount *pData = (XUIMessageGetItemCount *) pMessage->pvData;\ + return MemberFunc(pData, pMessage->bHandled);\ + } + +class AbstractContainerMenu; +class SlotListItemControl; +class CXuiCtrlSlotItemListItem; + +class CXuiCtrlSlotList : public CXuiListImpl +{ +public: + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CXuiCtrlSlotList, L"CXuiCtrlSlotList", XUI_CLASS_LIST ) + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_DESTROY(OnDestroy) + XUI_ON_XM_KEYDOWN( OnKeyDown ) + XUI_ON_XM_GET_ITEMCOUNT_ALL( OnGetItemCountAll ) + XUI_ON_XM_GET_ITEMCOUNT_MAX_LINES(OnGetItemCountMaxLines) + XUI_ON_XM_GET_ITEMCOUNT_MAX_PER_LINE(OnGetItemCountMaxPerLine) + XUI_END_MSG_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnDestroy(); + HRESULT OnKeyDown(XUIMessageInput *pInputData, BOOL& bHandled); + HRESULT OnGetItemCountAll( XUIMessageGetItemCount *pGetItemCountData, BOOL& bHandled ); + HRESULT OnGetItemCountMaxLines(XUIMessageGetItemCount *pGetItemCountData, BOOL& bHandled); + HRESULT OnGetItemCountMaxPerLine(XUIMessageGetItemCount *pGetItemCountData, BOOL& bHandled); + HRESULT OnRender(XUIMessageRender *pRenderData, BOOL &rfHandled); + +public: + void SetData(int m_iPad, AbstractContainerMenu* menu, int rows, int columns, int startIndex = 0, int endIndex = 0); + + int GetRows() { return rows; }; + int GetColumns() { return columns; }; + int GetCurrentColumn(); + int GetCurrentRow(); + + int GetCurrentIndex(); + + void SetCurrentSlot(int row, int column); + void SetEntrySlot(int row, int column, XUI_CONTROL_NAVIGATE direction); + + void Clicked(); + + // 4J WESTY : Pointer Prototype : Made public. + void GetCXuiCtrlSlotItem(int itemIndex, CXuiCtrlSlotItemListItem** CXuiCtrlSlotItem); + +private: + int slotCount; + int rows; + int columns; + int startIndex; + + // 4J WESTY : Pointer Prototype : Made public. + //void GetCXuiCtrlSlotItem(int itemIndex, CXuiCtrlSlotItemListItem** CXuiCtrlSlotItem); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_SplashPulser.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_SplashPulser.cpp new file mode 100644 index 00000000..2e971710 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_SplashPulser.cpp @@ -0,0 +1,94 @@ +#include "stdafx.h" +#include "..\..\Minecraft.h" +#include "..\..\ScreenSizeCalculator.h" +#include "..\..\Lighting.h" +#include "XUI_Ctrl_SplashPulser.h" +#include "..\..\Font.h" +#include "..\..\..\Minecraft.World\Mth.h" +#include "..\..\..\Minecraft.World\System.h" + +//----------------------------------------------------------------------------- +// CXuiCtrlSplashPulser class +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +CXuiCtrlSplashPulser::CXuiCtrlSplashPulser() : + m_bDirty(FALSE), + m_fScale(1.0f), + m_fAlpha(1.0f) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + + ScreenSizeCalculator ssc(pMinecraft->options, pMinecraft->width_phys, pMinecraft->height_phys); + m_fScreenWidth=(float)pMinecraft->width_phys; + m_fRawWidth=(float)ssc.rawWidth; + m_fScreenHeight=(float)pMinecraft->height_phys; + m_fRawHeight=(float)ssc.rawHeight; +} + +//----------------------------------------------------------------------------- +HRESULT CXuiCtrlSplashPulser::OnInit(XUIMessageInit* pInitData, BOOL& rfHandled) +{ + HRESULT hr=S_OK; + return hr; +} + +HRESULT CXuiCtrlSplashPulser::OnRender(XUIMessageRender *pRenderData, BOOL &bHandled ) +{ +#ifdef _XBOX + HXUIDC hDC = pRenderData->hDC; + + Minecraft *pMinecraft=Minecraft::GetInstance(); + Font *font = pMinecraft->font; + + wstring splash( GetText() ); + + // build and render with the game call + + glDisable(GL_CULL_FACE); + glDisable(GL_DEPTH_TEST); + + RenderManager.Set_matrixDirty(); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, 1280.0f, 720.0f, 0, 1000, 3000); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0, 0, -2000); + glColor4f(1.0f,1.0f,1.0f,1.0f); + + glPushMatrix(); + + D3DXMATRIX matrix; + CXuiControl xuiControl(m_hObj); + xuiControl.GetFullXForm(&matrix); + float bwidth,bheight; + xuiControl.GetBounds(&bwidth,&bheight); + + float xo = (matrix._41 + (bwidth*matrix._11)/2 ); + float yo = (matrix._42 + (bheight*matrix._22) ); + glTranslatef(xo, yo, 0); + + glRotatef(-17, 0, 0, 1); + float sss = 1.8f - Mth::abs(Mth::sin(System::currentTimeMillis() % 1000 / 1000.0f * PI * 2) * 0.1f); + sss*=(m_fScreenWidth/m_fRawWidth); + + sss = sss * 100 / (font->width(splash) + 8 * 4); + glScalef(sss, sss, sss); + //drawCenteredString(font, splash, 0, -8, 0xffff00); + font->drawShadow(splash, 0 - (font->width(splash)) / 2, -8, 0xffff00); + glPopMatrix(); + + glDisable(GL_RESCALE_NORMAL); + + glEnable(GL_DEPTH_TEST); + + XuiRenderRestoreState(hDC); + + bHandled = TRUE; +#endif + return S_OK; +} + + + diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_SplashPulser.h b/Minecraft.Client/Common/XUI/XUI_Ctrl_SplashPulser.h new file mode 100644 index 00000000..504cf4c5 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_SplashPulser.h @@ -0,0 +1,36 @@ +#pragma once + +#include +#include + +using namespace std; + +//----------------------------------------------------------------------------- +// CXuiCtrlSplashPulser class +//----------------------------------------------------------------------------- +class CXuiCtrlSplashPulser : public CXuiControlImpl +{ +public: + XUI_IMPLEMENT_CLASS(CXuiCtrlSplashPulser, L"CXuiCtrlSplashPulser", XUI_CLASS_LABEL) + + CXuiCtrlSplashPulser(); + virtual ~CXuiCtrlSplashPulser() { }; + +protected: + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT(OnInit) + XUI_ON_XM_RENDER(OnRender) + XUI_END_MSG_MAP() + + HRESULT OnInit(XUIMessageInit* pInitData, BOOL& rfHandled); + HRESULT OnRender(XUIMessageRender *pRenderData, BOOL &rfHandled); + +private: + BOOL m_bDirty; + float m_fScale,m_fAlpha; + + float m_fScreenWidth,m_fScreenHeight; + float m_fRawWidth,m_fRawHeight; + +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_CustomMessages.h b/Minecraft.Client/Common/XUI/XUI_CustomMessages.h new file mode 100644 index 00000000..888f8ad0 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_CustomMessages.h @@ -0,0 +1,193 @@ +#pragma once + +#define XM_SPLITSCREENPLAYER_MESSAGE XM_USER +#define XM_FONTRENDERERCHANGE_MESSAGE XM_USER + 1 +#define XM_DLCMOUNTED_MESSAGE XM_USER + 2 +#define XM_BASE_POSITION_CHANGED_MESSAGE XM_USER + 3 +#define XM_DLCSINSTALLED_MESSAGE XM_USER + 4 +#define XM_INVENTORYUPDATED_MESSAGE XM_USER + 5 +#define XM_TMS_DLCFILE_RETRIEVED_MESSAGE XM_USER + 6 +#define XM_TMS_BANFILE_RETRIEVED_MESSAGE XM_USER + 7 +#define XM_TMS_ALLFILES_RETRIEVED_MESSAGE XM_USER + 8 +#define XM_CUSTOMTICKSCENE_MESSAGE XM_USER + 9 +#define XM_GETSLOTITEM_MESSAGE XM_USER + 10 + +typedef struct +{ + shared_ptr item; + + // Legacy values for compatibility + int iDataBitField; + int iItemBitField; + LPCWSTR szPath; + BOOL bDirty; +} +CustomMessage_GetSlotItem_Struct; + + +// Define the prototype for your handler function +// Sig: HRESULT OnCustomMessage_GetSlotItem(CustomMessage_GetSlotItem_Struct *pData, BOOL& bHandled) + +// Define the message map macro +#define XUI_ON_XM_GETSLOTITEM_MESSAGE(MemberFunc)\ + if (pMessage->dwMessage == XM_GETSLOTITEM_MESSAGE)\ +{\ + CustomMessage_GetSlotItem_Struct *pData = (CustomMessage_GetSlotItem_Struct *) pMessage->pvData;\ + return MemberFunc(pData, pMessage->bHandled);\ +} + +static __declspec(noinline) void CustomMessage_GetSlotItem(XUIMessage *pMsg, CustomMessage_GetSlotItem_Struct* pData, int iDataBitField, int iItemBitField) +{ + XuiMessage(pMsg,XM_GETSLOTITEM_MESSAGE); + _XuiMessageExtra(pMsg,(XUIMessageData*) pData, sizeof(*pData)); + pData->item = nullptr; + pData->iDataBitField = iDataBitField; + pData->iItemBitField = iItemBitField; + pData->szPath = NULL; + pData->bDirty = false; +} + +typedef struct +{ + bool bJoining; // if you're not joining, your leaving +} +CustomMessage_Splitscreenplayer_Struct; + + +// Define the prototype for your handler function +// Sig: HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) + +// Define the message map macro +#define XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(MemberFunc)\ + if (pMessage->dwMessage == XM_SPLITSCREENPLAYER_MESSAGE)\ +{\ + CustomMessage_Splitscreenplayer_Struct *pData = (CustomMessage_Splitscreenplayer_Struct *) pMessage->pvData;\ + return MemberFunc(pData->bJoining, pMessage->bHandled);\ +} + +static __declspec(noinline) void CustomMessage_Splitscreenplayer(XUIMessage *pMsg, CustomMessage_Splitscreenplayer_Struct* pData, bool bJoining) +{ + XuiMessage(pMsg,XM_SPLITSCREENPLAYER_MESSAGE); + _XuiMessageExtra(pMsg,(XUIMessageData*) pData, sizeof(*pData)); + pData->bJoining = bJoining; +} + +// Define the prototype for your handler function +// Sig: HRESULT OnFontRendererChange() + +// Define the message map macro +#define XUI_ON_XM_FONTRENDERERCHANGE_MESSAGE(MemberFunc)\ + if (pMessage->dwMessage == XM_FONTRENDERERCHANGE_MESSAGE)\ +{\ + return MemberFunc();\ +} + +static __declspec(noinline) void CustomMessage_FontRendererChange(XUIMessage *pMsg) +{ + XuiMessage(pMsg,XM_FONTRENDERERCHANGE_MESSAGE); +} + +// Define the prototype for your handler function +// Sig: HRESULT OnDLCMounted() + +// Define the message map macro +#define XUI_ON_XM_DLCLOADED_MESSAGE(MemberFunc)\ + if (pMessage->dwMessage == XM_DLCMOUNTED_MESSAGE)\ +{\ + return MemberFunc();\ +} + +static __declspec(noinline) void CustomMessage_DLCMountingComplete(XUIMessage *pMsg) +{ + XuiMessage(pMsg,XM_DLCMOUNTED_MESSAGE); +} + +// Define the prototype for your handler function +// Sig: HRESULT OnBasePositionChanged() + +// Define the message map macro +#define XUI_ON_XM_BASE_POSITION_CHANGED_MESSAGE(MemberFunc)\ + if (pMessage->dwMessage == XM_BASE_POSITION_CHANGED_MESSAGE)\ +{\ + return MemberFunc();\ +} + +static __declspec(noinline) void CustomMessage_BasePositionChanged(XUIMessage *pMsg) +{ + XuiMessage(pMsg,XM_BASE_POSITION_CHANGED_MESSAGE); +} + +// the prototype for your handler function +// Sig: HRESULT OnDLCInstalled() + +// Define the message map macro +#define XUI_ON_XM_DLCINSTALLED_MESSAGE(MemberFunc)\ + if (pMessage->dwMessage == XM_DLCSINSTALLED_MESSAGE)\ +{\ + return MemberFunc();\ +} + +static __declspec(noinline) void CustomMessage_DLCInstalled(XUIMessage *pMsg) +{ + XuiMessage(pMsg,XM_DLCSINSTALLED_MESSAGE); +} + +// the prototype for your handler function +// Sig: HRESULT OnCustomMessage_InventoryUpdated() + +// Define the message map macro +#define XUI_ON_XM_INVENTORYUPDATED_MESSAGE(MemberFunc)\ + if (pMessage->dwMessage == XM_INVENTORYUPDATED_MESSAGE)\ +{\ + return MemberFunc();\ +} + +static __declspec(noinline) void CustomMessage_InventoryUpdated(XUIMessage *pMsg) +{ + XuiMessage(pMsg,XM_INVENTORYUPDATED_MESSAGE); +} + +// the prototype for your handler function +// Sig: HRESULT OnCustomMessage_() + +// Define the message map macro +#define XUI_ON_XM_TMS_DLCFILE_RETRIEVED_MESSAGE(MemberFunc)\ + if (pMessage->dwMessage == XM_TMS_DLCFILE_RETRIEVED_MESSAGE)\ +{\ + return MemberFunc();\ +} + +static __declspec(noinline) void CustomMessage_TMS_DLCFileRetrieved(XUIMessage *pMsg) +{ + XuiMessage(pMsg,XM_TMS_DLCFILE_RETRIEVED_MESSAGE); +} + +// the prototype for your handler function +// Sig: HRESULT OnCustomMessage_() + +// Define the message map macro +#define XUI_ON_XM_TMS_BANFILE_RETRIEVED_MESSAGE(MemberFunc)\ + if (pMessage->dwMessage == XM_TMS_BANFILE_RETRIEVED_MESSAGE)\ +{\ + return MemberFunc();\ +} + +static __declspec(noinline) void CustomMessage_TMS_BanFileRetrieved(XUIMessage *pMsg) +{ + XuiMessage(pMsg,XM_TMS_BANFILE_RETRIEVED_MESSAGE); +} + +// Define the prototype for your handler function +// Sig: HRESULT OnCustomMessage_TickScene() + +// Define the message map macro +#define XUI_ON_XM_CUSTOMTICKSCENE_MESSAGE(MemberFunc)\ + if (pMessage->dwMessage == XM_CUSTOMTICKSCENE_MESSAGE)\ +{\ + return MemberFunc();\ +} + +static __declspec(noinline) void CustomMessage_TickScene(XUIMessage *pMsg) +{ + XuiMessage(pMsg,XM_CUSTOMTICKSCENE_MESSAGE); +} diff --git a/Minecraft.Client/Common/XUI/XUI_DLCOffers.cpp b/Minecraft.Client/Common/XUI/XUI_DLCOffers.cpp new file mode 100644 index 00000000..bd05ca14 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_DLCOffers.cpp @@ -0,0 +1,886 @@ +// Minecraft.cpp : Defines the entry point for the application. +// + +#include "stdafx.h" +#include "..\..\..\Minecraft.World\ByteArrayInputStream.h" +#include "..\..\..\Minecraft.World\BufferedReader.h" +#include "..\..\..\Minecraft.World\InputStreamReader.h" +#include "..\..\..\Minecraft.World\ArrayWithLength.h" +#include +#include "XUI_Ctrl_4JIcon.h" +#include "XUI_DLCOffers.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#ifdef _XBOX +#include +#endif + +#define TIMER_ID_NETWORK_CONNECTION 1 +#define TIMER_ID_NAVIGATE_BACK 2 +// Constants + +//const wstring CScene_DLCOffers::DEFAULT_BANNER = L"Graphics/banner.png"; + +// DLC Main + +HRESULT CScene_DLCMain::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + iPad = *(int *) pInitData->pvInitData; + + MapChildControls(); + + app.SetTickTMSDLCFiles(true); + + XuiControlSetText(xList,app.GetString(IDS_DOWNLOADABLE_CONTENT_OFFERS)); + + //if(app.GetTMSDLCInfoRead()) + { + m_Timer.SetShow(FALSE); + m_bIgnoreInput=false; + + VOID *pObj; + XuiObjectFromHandle( xList, &pObj ); + list = (CXuiCtrl4JList *) pObj; + + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK ); + + CXuiCtrl4JList::LIST_ITEM_INFO *pListInfo = new CXuiCtrl4JList::LIST_ITEM_INFO [e_DLC_MAX_MinecraftStore]; + ZeroMemory(pListInfo,sizeof(CXuiCtrl4JList::LIST_ITEM_INFO)*e_DLC_MAX_MinecraftStore); + + m_bAllDLCContentRetrieved=false; + pListInfo[e_DLC_SkinPack].pwszText = app.GetString(IDS_DLC_MENU_SKINPACKS); + pListInfo[e_DLC_SkinPack].fEnabled=TRUE; + list->AddData(pListInfo[e_DLC_SkinPack]); + + pListInfo[e_DLC_TexturePacks].pwszText = app.GetString(IDS_DLC_MENU_TEXTUREPACKS); + pListInfo[e_DLC_TexturePacks].fEnabled=TRUE; + list->AddData(pListInfo[e_DLC_TexturePacks]); + + pListInfo[e_DLC_MashupPacks].pwszText = app.GetString(IDS_DLC_MENU_MASHUPPACKS); + pListInfo[e_DLC_MashupPacks].fEnabled=TRUE; + list->AddData(pListInfo[e_DLC_MashupPacks]); + + pListInfo[e_DLC_Themes].pwszText = app.GetString(IDS_DLC_MENU_THEMES); + pListInfo[e_DLC_Themes].fEnabled=TRUE; + list->AddData(pListInfo[e_DLC_Themes]); + + pListInfo[e_DLC_AvatarItems].pwszText = app.GetString(IDS_DLC_MENU_AVATARITEMS); + pListInfo[e_DLC_AvatarItems].fEnabled=TRUE; + list->AddData(pListInfo[e_DLC_AvatarItems]); + + pListInfo[e_DLC_Gamerpics].pwszText = app.GetString(IDS_DLC_MENU_GAMERPICS); + pListInfo[e_DLC_Gamerpics].fEnabled=TRUE; + list->AddData(pListInfo[e_DLC_Gamerpics]); + + app.AddDLCRequest(e_Marketplace_Content); // content is skin packs, texture packs and mash-up packs + app.AddDLCRequest(e_Marketplace_Gamerpics); + app.AddDLCRequest(e_Marketplace_Themes); + app.AddDLCRequest(e_Marketplace_AvatarItems); + + // start retrieving the images needed from TMS + app.AddTMSPPFileTypeRequest(e_DLC_SkinPack); + app.AddTMSPPFileTypeRequest(e_DLC_Gamerpics); + app.AddTMSPPFileTypeRequest(e_DLC_Themes); + app.AddTMSPPFileTypeRequest(e_DLC_AvatarItems); + app.AddTMSPPFileTypeRequest(e_DLC_TexturePacks); + app.AddTMSPPFileTypeRequest(e_DLC_MashupPacks); + } + + XuiElementInitUserFocus(xList, ProfileManager.GetPrimaryPad(), TRUE); + TelemetryManager->RecordMenuShown(iPad, eUIScene_DLCMainMenu, 0); // 4J JEV ? + + return S_OK; +} + +HRESULT CScene_DLCMain::OnDestroy() +{ + return S_OK; +} + +HRESULT CScene_DLCMain::OnTimer(XUIMessageTimer *pData,BOOL& rfHandled) +{ + if(pData->nId==TIMER_ID_NETWORK_CONNECTION) + { + if(ProfileManager.GetLiveConnectionStatus()!=XONLINE_S_LOGON_CONNECTION_ESTABLISHED) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + + StorageManager.ClearDLCOffers(); + app.ClearAndResetDLCDownloadQueue(); + } + } + else if(pData->nId==TIMER_ID_NAVIGATE_BACK) + { + if(app.CheckTMSDLCCanStop()) + { + XuiKillTimer(m_hObj,TIMER_ID_NAVIGATE_BACK); + app.NavigateBack(XUSER_INDEX_ANY); + } + } + + return S_OK; +} + + +HRESULT CScene_DLCMain::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + switch(pInputData->dwKeyCode) + { + case VK_PAD_B: + case VK_ESCAPE: + app.SetTickTMSDLCFiles(false); + + // set the timer running to navigate back when any tms retrieval has come in + XuiSetTimer(m_hObj,TIMER_ID_NAVIGATE_BACK,50); + m_bIgnoreInput=true; + m_Timer.SetShow(TRUE); + //app.NavigateBack(XUSER_INDEX_ANY); + rfHandled = TRUE; + + break; + } + + return S_OK; +} + +HRESULT CScene_DLCMain::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + if(hObjPressed==xList) + { + int iIndex; + CXuiControl pItem; + iIndex=xList.GetCurSel(&pItem); + + DLCOffersParam *param = new DLCOffersParam(); + param->iPad = iPad; + param->iType = iIndex; + + // promote the DLC content request type + app.AddDLCRequest((eDLCMarketplaceType)iIndex, true); + app.NavigateToScene(iPad,eUIScene_DLCOffersMenu, param); + } + return S_OK; +} + +HRESULT CScene_DLCMain::OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled) +{ + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK ); + + return S_OK; +} + +// DLC OFFERS + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_DLCOffers::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + DLCOffersParam *param = (DLCOffersParam *) pInitData->pvInitData; + m_iPad = param->iPad; + m_iType = param->iType; + m_iOfferC = app.GetDLCOffersCount(); + m_bIsFemale = false; + m_pNoImageFor_DLC=NULL; + bNoDLCToDisplay=true; + //hCostText=NULL; + + + // 4J JEV: Deleting this here seems simpler. + delete param; + + // If this is the avatar items, we need to init the avatar system to allow us to find out what the player avatar gender is (since we should only display tshirts etc with the right gender) + // The init reserves 3MB of memory, so we shut down on leaving this. + if(m_iType==e_DLC_AvatarItems) + { + XAVATAR_METADATA AvatarMetadata; + HRESULT hRes; + + + hRes=XAvatarInitialize(XAVATAR_COORDINATE_SYSTEM_LEFT_HANDED,0,0,0,NULL); + + // get the avatar gender + hRes=XAvatarGetMetadataLocalUser(m_iPad,&AvatarMetadata,NULL); + + m_bIsFemale= (XAVATAR_BODY_TYPE_FEMALE == XAvatarMetadataGetBodyType(&AvatarMetadata)); + // shutdown the avatar system + + XAvatarShutdown(); + } + + m_bIsSD=!RenderManager.IsHiDef() && !RenderManager.IsWidescreen(); + + MapChildControls(); + + XuiControlSetText(m_List,app.GetString(IDS_DOWNLOADABLE_CONTENT_OFFERS)); + + m_bIgnorePress=true; + + VOID *pObj; + m_hXuiBrush=NULL; + + XuiObjectFromHandle( m_List, &pObj ); + m_pOffersList = (CXuiCtrl4JList *)pObj; + m_bAllDLCContentRetrieved=false; + + XuiElementInitUserFocus(m_hObj,ProfileManager.GetPrimaryPad(),TRUE); + TelemetryManager->RecordMenuShown(m_iPad, eUIScene_DLCOffersMenu, 0); + ui.SetTooltips( DEFAULT_XUI_MENU_USER, -1,IDS_TOOLTIPS_BACK); + + // Disable the price tag display + m_PriceTag.SetShow(FALSE); + + // If we don't yet have this DLC, we need to display a timer + m_bDLCRequiredIsRetrieved=false; + + // Is the DLC we're looking for available? + if(!m_bDLCRequiredIsRetrieved) + { + if(app.DLCContentRetrieved((eDLCMarketplaceType)m_iType)) + { + m_bDLCRequiredIsRetrieved=true; + + // Retrieve the info + GetDLCInfo(app.GetDLCOffersCount(), false); + m_bIgnorePress=false; + } + } + + XuiSetTimer(m_hObj,TIMER_ID_NETWORK_CONNECTION,50); + + return S_OK; +} + +HRESULT CScene_DLCOffers::GetDLCInfo( int iOfferC, bool bUpdateOnly ) +{ + CXuiCtrl4JList::LIST_ITEM_INFO *pListInfo=NULL; + //XMARKETPLACE_CONTENTOFFER_INFO xOffer; + XMARKETPLACE_CURRENCY_CONTENTOFFER_INFO xOffer; + const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string + WCHAR szResourceLocator[ LOCATOR_SIZE ]; + ZeroMemory(szResourceLocator,sizeof(WCHAR)*LOCATOR_SIZE); + const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL); + int iCount=0; + + if(bUpdateOnly) // Just update the info on the current list + { + for(int i=0;iiGender==1) && (m_bIsFemale==true)) + { + app.DebugPrintf("Wrong gender\n"); + continue; + } + + // can't trust the offer type - partnernet is giving avatar items the CONTENT type + //if(Offer.dwOfferType==app.GetDLCContentType((eDLCContentType)m_iType)) + if(pDLC->eDLCType==(eDLCContentType)m_iType) + { + if(xOffer.fUserHasPurchased) + { + HXUIBRUSH hBrush; + + if(RenderManager.IsHiDef() || RenderManager.IsWidescreen()) + { + swprintf(szResourceLocator, LOCATOR_SIZE, L"section://%X,%ls#%ls",c_ModuleHandle,L"media", L"media/Graphics/DLC_Tick.png"); + XuiCreateTextureBrush(szResourceLocator,&hBrush); + } + else + { + swprintf(szResourceLocator, LOCATOR_SIZE, L"section://%X,%ls#%ls",c_ModuleHandle,L"media", L"media/Graphics/DLC_TickSmall.png"); + XuiCreateTextureBrush(szResourceLocator,&hBrush); + } + m_pOffersList->UpdateGraphic(i,hBrush ); + } + + iCount++; + } + } + + if(iCount>0) + { + bNoDLCToDisplay=false; + } + } + else + { + if(iOfferC!=0) + { + pListInfo = new CXuiCtrl4JList::LIST_ITEM_INFO [iOfferC]; + ZeroMemory(pListInfo,sizeof(CXuiCtrl4JList::LIST_ITEM_INFO)*iOfferC); + } + + for(int i = 0; i < iOfferC; i++) + { + xOffer = StorageManager.GetOffer(i); + + // Check that this is in the list of known DLC + DLC_INFO *pDLC=app.GetDLCInfoForFullOfferID(xOffer.qwOfferID); + if(pDLC==NULL) + { + // try the trial version + pDLC=app.GetDLCInfoForTrialOfferID(xOffer.qwOfferID); + } + + if(pDLC==NULL) + { + // skip this one +#ifdef _DEBUG + app.DebugPrintf("Unknown offer - "); + OutputDebugStringW(xOffer.wszOfferName); + app.DebugPrintf("\n"); +#endif + continue; + } + + // can't trust the offer type - partnernet is giving avatar items the CONTENT type + //if(Offer.dwOfferType==app.GetDLCContentType((eDLCContentType)m_iType)) + if(pDLC->eDLCType==(eDLCContentType)m_iType) + { + wstring wstrTemp=xOffer.wszOfferName; + + // If the string starts with Minecraft, removed that + + // Bug 49249 - JPN: Code Defect: Missing Text: String 'Minecraft' is missing in contents download screen. + // Looks like we shouldn't be removing this text for Japanese, and probably Chinese & Korean + + DWORD dwLanguage = XGetLanguage( ); + switch(dwLanguage) + { + case XC_LANGUAGE_KOREAN: + case XC_LANGUAGE_JAPANESE: + case XC_LANGUAGE_TCHINESE: + pListInfo[iCount].pwszText = xOffer.wszOfferName; + break; + default: + if(wstrTemp.compare(0,10,L"Minecraft ")==0) + { + pListInfo[iCount].pwszText = &xOffer.wszOfferName[10]; + } + else + { + pListInfo[iCount].pwszText = xOffer.wszOfferName; + } + break; + } + + pListInfo[iCount].fEnabled=TRUE; + + // store the offer index + pListInfo[iCount].iData=i; + pListInfo[iCount].iSortIndex=(int)pDLC->uiSortIndex; +#ifdef _DEBUG + app.DebugPrintf("Adding "); + OutputDebugStringW(pListInfo[iCount].pwszText); + app.DebugPrintf(" at %d\n",i); +#endif + + m_pOffersList->AddData(pListInfo[iCount],0,CXuiCtrl4JList::eSortList_Index); + //offerIndexes.push_back(i); + + if(xOffer.fUserHasPurchased) + { + HXUIBRUSH hBrush; + + if(RenderManager.IsHiDef() || RenderManager.IsWidescreen()) + { + swprintf(szResourceLocator, LOCATOR_SIZE, L"section://%X,%ls#%ls",c_ModuleHandle,L"media", L"media/Graphics/DLC_Tick.png"); + XuiCreateTextureBrush(szResourceLocator,&hBrush); + } + else + { + swprintf(szResourceLocator, LOCATOR_SIZE, L"section://%X,%ls#%ls",c_ModuleHandle,L"media", L"media/Graphics/DLC_TickSmall.png"); + XuiCreateTextureBrush(szResourceLocator,&hBrush); + } + m_pOffersList->UpdateGraphicFromiData(i,hBrush); + } + + /** 4J JEV: + * We've filtered results out from the list, need to keep track + * of the 'actual' list index. + */ + iCount++; + } + } + + // Check if there is nothing to display, and display the default "nothing available at this time" + if(iCount>0) + { + bNoDLCToDisplay=false; + } + } + + // turn off the timer display + m_Timer.SetShow(FALSE); + if(iCount!=0) + { + // get the right index for the first list item - it will have been re-sorted internally in the list + int iIndex=0; + xOffer=StorageManager.GetOffer(m_pOffersList->GetData(iIndex).iData); + m_pOffersList->SetCurSelVisible(0); + + DLC_INFO *dlc = app.GetDLCInfoForFullOfferID(xOffer.qwOfferID); + if (dlc != NULL) + { + BYTE *pData=NULL; + UINT uiSize=0; + DWORD dwSize=0; + + WCHAR *cString = dlc->wchBanner; + // is the file in the TMS XZP? + int iIndex = app.GetLocalTMSFileIndex(cString, true); + + if(iIndex!=-1) + { + // it's in the xzp + if(m_hXuiBrush!=NULL) + { + XuiDestroyBrush(m_hXuiBrush); + // clear the TMS XZP vector memory + //app.FreeLocalTMSFiles(); + } + app.LoadLocalTMSFile(cString); + XuiCreateTextureBrushFromMemory(app.TMSFileA[iIndex].pbData,app.TMSFileA[iIndex].uiSize,&m_hXuiBrush); + } + else + { + bool bPresent = app.IsFileInMemoryTextures(cString); + if (!bPresent) + { + // Image has not come in yet + // Set the item monitored in the timer, so we can set the image when it comes in + m_pNoImageFor_DLC=dlc; + } + else + { + if(m_hXuiBrush!=NULL) + { + XuiDestroyBrush(m_hXuiBrush); + // clear the TMS XZP vector memory + //app.FreeLocalTMSFiles(); + } + app.GetMemFileDetails(cString,&pData,&dwSize); + XuiCreateTextureBrushFromMemory(pData,dwSize,&m_hXuiBrush); + } + } + } + + wchar_t formatting[40]; + wstring wstrTemp = xOffer.wszSellText; + swprintf(formatting, 40, L"", m_bIsSD?12:14); + wstrTemp = formatting + wstrTemp; + + m_SellText.SetText(wstrTemp.c_str()); + m_SellText.SetShow(TRUE); + + // set the price info + m_PriceTag.SetShow(TRUE); +// swprintf(formatting, 40, L"%d",xOffer.dwPointsPrice); +// wstrTemp=wstring(formatting); +// m_PriceTag.SetText(wstrTemp.c_str()); + m_PriceTag.SetText(xOffer.wszCurrencyPrice); + + XuiElementSetShow(m_List,TRUE); + XuiElementSetFocus(m_List); + + UpdateTooltips(xOffer); + } + else if(bNoDLCToDisplay) + { + // set the default text + + wchar_t formatting[40]; + wstring wstrTemp = app.GetString(IDS_NO_DLCOFFERS); + swprintf(formatting, 40, L"", m_bIsSD?12:14); + wstrTemp = formatting + wstrTemp; + + m_SellText.SetText(wstrTemp.c_str()); + m_SellText.SetShow(TRUE); + } + return S_OK; +} + +HRESULT CScene_DLCOffers::OnDestroy() +{ + // 4J-PB - don't cancel the DLC anymore + //StorageManager.CancelGetDLCOffers(); + + // clear out any TMS images loaded from the XZP + app.FreeLocalTMSFiles(eTMSFileType_MinecraftStore); + return S_OK; +} + + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_DLCOffers::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + if(m_bIgnorePress) return S_OK; + + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + if(hObjPressed==m_List) + { + CXuiControl pItem; + int iIndex; + CXuiCtrl4JList::LIST_ITEM_INFO ItemInfo; + // get the selected item + iIndex=m_List.GetCurSel(&pItem); + ItemInfo=m_pOffersList->GetData(iIndex); + + ULONGLONG ullIndexA[1]; + + // check if it's already installed + // if(StorageManager.GetOffer(iIndex).fUserHasPurchased) + // { + // + // } + // else + // if it's already been purchased, we need to let the user download it anyway + { + ullIndexA[0]=StorageManager.GetOffer(ItemInfo.iData).qwOfferID; + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + } + } + + return S_OK; +} + +HRESULT CScene_DLCOffers::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + // Fix for Compliance fail - + // On a functional console, the game must not enter an extended unresponsive state, cause unintentional loss of player data, crash, or cause an unintended reboot of the machine. + + //if(m_bIgnorePress) return S_OK; + + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + switch(pInputData->dwKeyCode) + { + + case VK_PAD_B: + case VK_ESCAPE: + app.NavigateBack(XUSER_INDEX_ANY); + rfHandled = TRUE; + + break; + + case VK_PAD_RTHUMB_DOWN: + { + XUIHtmlScrollInfo ScrollInfo; + + XuiHtmlControlGetVScrollInfo(m_SellText.m_hObj,&ScrollInfo); + if(!ScrollInfo.bScrolling) + { + XuiHtmlControlVScrollBy(m_SellText.m_hObj,1); + } + } + break; + case VK_PAD_RTHUMB_UP: + { + XUIHtmlScrollInfo ScrollInfo; + + XuiHtmlControlGetVScrollInfo(m_SellText.m_hObj,&ScrollInfo); + if(!ScrollInfo.bScrolling) + { + XuiHtmlControlVScrollBy(m_SellText.m_hObj,-1); + } + } + break; + } + + return S_OK; +} + + +HRESULT CScene_DLCOffers::OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled) +{ + // re-enable button presses + m_bIgnorePress=false; + + return S_OK; +} + +//void CScene_DLCOffers::UpdateTooltips(XMARKETPLACE_CONTENTOFFER_INFO& xOffer) +void CScene_DLCOffers::UpdateTooltips(XMARKETPLACE_CURRENCY_CONTENTOFFER_INFO& xOffer) +{ + // if the current offer hasn't been purchased already, check if there's a trial version available + if(xOffer.fUserHasPurchased==false ) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_INSTALL,IDS_TOOLTIPS_BACK); + } + else + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_REINSTALL,IDS_TOOLTIPS_BACK); + } +} + + +HRESULT CScene_DLCOffers::OnGetSourceDataImage(XUIMessageGetSourceImage *pGetSourceImageData,BOOL& bHandled) +{ + if( pGetSourceImageData->bItemData ) + { + pGetSourceImageData->hBrush = m_hXuiBrush; + + bHandled = TRUE; + } + return S_OK; +} + +HRESULT CScene_DLCOffers::OnNotifySelChanged(HXUIOBJ hObjSource, XUINotifySelChanged *pNotifySelChangedData, BOOL& bHandled) +{ + //int index = pNotifySelChangedData->iItem; + // reset the image monitor, but not for the first selection + if(pNotifySelChangedData->iOldItem!=-1) + { + m_pNoImageFor_DLC=NULL; + } + + if (m_List.TreeHasFocus())// && offerIndexes.size() > index) + { + CXuiControl pItem; + int iIndex; + CXuiCtrl4JList::LIST_ITEM_INFO ItemInfo; + // get the selected item + iIndex=m_List.GetCurSel(&pItem); + ItemInfo=m_pOffersList->GetData(iIndex); + +// XMARKETPLACE_CONTENTOFFER_INFO xOffer= +// StorageManager.GetOffer(ItemInfo.iData); + XMARKETPLACE_CURRENCY_CONTENTOFFER_INFO xOffer= + StorageManager.GetOffer(ItemInfo.iData); + + + wchar_t formatting[40]; + wstring wstrTemp=xOffer.wszSellText; + swprintf(formatting, 40, L"",m_bIsSD?12:14); + wstrTemp = wstring(formatting) + wstrTemp; + + m_SellText.SetText(wstrTemp.c_str()); + + // set the price info + m_PriceTag.SetShow(TRUE); +// swprintf(formatting, 40, L"%d",xOffer.dwPointsPrice); +// wstrTemp=wstring(formatting); +// m_PriceTag.SetText(wstrTemp.c_str()); + m_PriceTag.SetText(xOffer.wszCurrencyPrice); + + DLC_INFO *dlc = app.GetDLCInfoForTrialOfferID(xOffer.qwOfferID); + if(dlc==NULL) + { + dlc = app.GetDLCInfoForFullOfferID(xOffer.qwOfferID); + } + + if (dlc != NULL) + { + BYTE *pImage=NULL; + UINT uiSize=0; + DWORD dwSize=0; + + WCHAR *cString = dlc->wchBanner; + + int iIndex = app.GetLocalTMSFileIndex(cString,true); + + if(iIndex!=-1) + { + // it's in the xzp + if(m_hXuiBrush!=NULL) + { + XuiDestroyBrush(m_hXuiBrush); + // clear the TMS XZP vector memory + //app.FreeLocalTMSFiles(); + } + app.LoadLocalTMSFile(cString); + XuiCreateTextureBrushFromMemory(app.TMSFileA[iIndex].pbData,app.TMSFileA[iIndex].uiSize,&m_hXuiBrush); + } + else + { + bool bPresent = app.IsFileInMemoryTextures(cString); + if (!bPresent) + { + // Image has not come in yet + // Set the item monitored in the timer, so we can set the image when it comes in + m_pNoImageFor_DLC=dlc; + + // promote it to the top of the queue of images to be retrieved + // We can't trust the dwContentCategory from partnernet - it has avatar items as content instead of avatars + app.AddTMSPPFileTypeRequest(dlc->eDLCType,true); + } + else + { + if(m_hXuiBrush!=NULL) + { + XuiDestroyBrush(m_hXuiBrush); + // clear the TMS XZP vector memory + //app.FreeLocalTMSFiles(); + } + app.GetMemFileDetails(cString,&pImage,&dwSize); + XuiCreateTextureBrushFromMemory(pImage,dwSize,&m_hXuiBrush); + } + } + } + else + { + if(m_hXuiBrush!=NULL) + { + XuiDestroyBrush(m_hXuiBrush); + // clear the TMS XZP vector memory + //app.FreeLocalTMSFiles(); + + m_hXuiBrush=NULL; + } + } + + UpdateTooltips(xOffer); + } + else + { + m_SellText.SetText(L""); + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_ACCEPT ,IDS_TOOLTIPS_BACK); + } + return S_OK; +} + + +HRESULT CScene_DLCOffers::OnTimer(XUIMessageTimer *pData,BOOL& rfHandled) +{ + // check the ethernet status - if it's disconnected, exit the xui + + if(ProfileManager.GetLiveConnectionStatus()!=XONLINE_S_LOGON_CONNECTION_ESTABLISHED) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + + m_pOffersList->RemoveAllData(); + m_iOfferC=0; + StorageManager.ClearDLCOffers(); + app.ClearAndResetDLCDownloadQueue(); + + StorageManager.RequestMessageBox(IDS_CONNECTION_LOST, IDS_CONNECTION_LOST_LIVE, uiIDA, 1, ProfileManager.GetPrimaryPad(),&CConsoleMinecraftApp::EthernetDisconnectReturned,this, app.GetStringTable()); + } + + // Is the DLC we're looking for available? + if(!m_bDLCRequiredIsRetrieved) + { + if(app.DLCContentRetrieved((eDLCMarketplaceType)m_iType)) + { + m_bDLCRequiredIsRetrieved=true; + + // Retrieve the info + GetDLCInfo(app.GetDLCOffersCount(), false); + m_bIgnorePress=false; + } + } + + // Check for any TMS image we're waiting for + if(m_pNoImageFor_DLC!=NULL) + { + // Is it present now? + WCHAR *cString = m_pNoImageFor_DLC->wchBanner; + + bool bPresent = app.IsFileInMemoryTextures(cString); + + if(bPresent) + { + BYTE *pImage=NULL; + DWORD dwSize=0; + + if(m_hXuiBrush!=NULL) + { + XuiDestroyBrush(m_hXuiBrush); + // clear the TMS XZP vector memory + //app.FreeLocalTMSFiles(); + } + app.GetMemFileDetails(cString,&pImage,&dwSize); + XuiCreateTextureBrushFromMemory(pImage,dwSize,&m_hXuiBrush); + m_pNoImageFor_DLC=NULL; + } + } + + return S_OK; +} + +// int CScene_DLCOffers::EthernetDisconnectReturned(void *pParam,int iPad,const C4JStorage::EMessageResult) +// { +// CConsoleMinecraftApp* pApp = (CConsoleMinecraftApp*)pParam; +// +// pApp->NavigateBack(XUSER_INDEX_ANY); +// +// return 0; +// } + +HRESULT CScene_DLCOffers::OnCustomMessage_DLCInstalled() +{ + // mounted DLC may have changed - need to re-run the GetDLC + ui.SetTooltips( DEFAULT_XUI_MENU_USER, -1, IDS_TOOLTIPS_BACK); + m_bIgnorePress=true; + m_pOffersList->RemoveAllData(); + m_iOfferC=0; + + // Update the dlc info + StorageManager.ClearDLCOffers(); + app.ClearAndResetDLCDownloadQueue(); + + // order these requests so the current DLC comes in first + switch(m_iType) + { + case e_DLC_Gamerpics: + app.AddDLCRequest(e_Marketplace_Gamerpics); + app.AddDLCRequest(e_Marketplace_Content); + app.AddDLCRequest(e_Marketplace_Themes); + app.AddDLCRequest(e_Marketplace_AvatarItems); + break; + case e_DLC_Themes: + app.AddDLCRequest(e_Marketplace_Themes); + app.AddDLCRequest(e_Marketplace_Content); + app.AddDLCRequest(e_Marketplace_Gamerpics); + app.AddDLCRequest(e_Marketplace_AvatarItems); + break; + case e_DLC_AvatarItems: + app.AddDLCRequest(e_Marketplace_AvatarItems); + app.AddDLCRequest(e_Marketplace_Content); + app.AddDLCRequest(e_Marketplace_Themes); + app.AddDLCRequest(e_Marketplace_Gamerpics); + break; + default: + app.AddDLCRequest(e_Marketplace_Content); + app.AddDLCRequest(e_Marketplace_Gamerpics); + app.AddDLCRequest(e_Marketplace_Themes); + app.AddDLCRequest(e_Marketplace_AvatarItems); + break; + } + + m_Timer.SetShow(TRUE); + m_bDLCRequiredIsRetrieved=false; + + return S_OK; +} diff --git a/Minecraft.Client/Common/XUI/XUI_DLCOffers.h b/Minecraft.Client/Common/XUI/XUI_DLCOffers.h new file mode 100644 index 00000000..412446d0 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_DLCOffers.h @@ -0,0 +1,136 @@ +#pragma once + +#include "../media\xuiscene_DLCOffers.h" +#include "../media\xuiscene_DLCMain.h" + + +#include "XUI_CustomMessages.h" +#include "XUI_Ctrl_4JList.h" +#include "XUI_Ctrl_4JIcon.h" +//#include "XUI_Ctrl_DLCPrice.h" + +class CXuiCtrl4JList; +class CScene_DLCOffers; +class CXuiCtrlDLCPrice; + +class CScene_DLCMain : public CXuiSceneImpl +{ + // Xui Elements + CXuiList xList; + CXuiCtrl4JList *list; + CXuiControl m_Timer; + + // Misc + int iPad, iOfferC; + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_DESTROY(OnDestroy) + XUI_ON_XM_KEYDOWN( OnKeyDown ) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_NAV_RETURN(OnNavReturn) + XUI_ON_XM_TIMER( OnTimer ) + XUI_END_MSG_MAP() + + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_XuiOffersList, xList) + MAP_CONTROL(IDC_Timer, m_Timer) + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnDestroy(); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled); + HRESULT OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled); + HRESULT OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ); + +public: + XUI_IMPLEMENT_CLASS( CScene_DLCMain, L"CScene_DLCMain", XUI_CLASS_SCENE ) + +private: + bool m_bAllDLCContentRetrieved; + bool m_bIgnoreInput; +}; + +class CScene_DLCOffers : public CXuiSceneImpl +{ +protected: + //static const wstring DEFAULT_BANNER; + + // Control and Element wrapper objects. + CXuiList m_List; + CXuiCtrl4JList *m_pOffersList; + CXuiImageElement m_Banner; + CXuiCtrl4JIcon m_TMSImage; + CXuiHtmlControl m_SellText; + CXuiControl m_PriceTag; + CXuiControl m_Timer; + HXUIBRUSH m_hXuiBrush; + + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_NOTIFY_SELCHANGED( OnNotifySelChanged ) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_DESTROY(OnDestroy) + XUI_ON_XM_NAV_RETURN(OnNavReturn) + XUI_ON_XM_TIMER( OnTimer ) + XUI_ON_XM_DLCINSTALLED_MESSAGE(OnCustomMessage_DLCInstalled) + XUI_ON_XM_GET_SOURCE_IMAGE( OnGetSourceDataImage ) + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_XuiOffersList, m_List) + MAP_CONTROL(IDC_XuiHTMLSellText, m_SellText) + MAP_CONTROL(IDC_XuiDLCPriceTag, m_PriceTag) + MAP_CONTROL(IDC_XuiDLCBanner, m_TMSImage) + MAP_CONTROL(IDC_Timer, m_Timer) + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnNotifySelChanged( HXUIOBJ hObjSource, XUINotifySelChanged* pNotifySelChangedData, BOOL& bHandled ); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnDestroy(); + HRESULT OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled); + HRESULT OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ); + HRESULT OnCustomMessage_DLCInstalled(); + HRESULT OnGetSourceDataImage(XUIMessageGetSourceImage *pGetSourceImageData,BOOL& bHandled); + + HRESULT GetDLCInfo( int iOfferC, bool bUpdateOnly=false ); + + //static int EthernetDisconnectReturned(void *pParam,int iPad,const C4JStorage::EMessageResult); + static int TMSReadCallback(void *pParam,int iPad,bool bResult); + + //void UpdateTooltips(XMARKETPLACE_CONTENTOFFER_INFO& xOffer); + void UpdateTooltips(XMARKETPLACE_CURRENCY_CONTENTOFFER_INFO& xOffer); +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_DLCOffers, L"CScene_DLCOffers", XUI_CLASS_SCENE ) + + typedef struct _DLCOffer + { + int iOfferC; + } + DLCOffer; + +private: + + //vector offerIndexes; + CScene_DLCMain *pMain; + bool m_bIgnorePress; + int m_iPad; + int m_iOfferC; + int m_iType; + bool m_bIsSD; + bool m_bAllDLCContentRetrieved; + bool m_bDLCRequiredIsRetrieved; + bool m_bIsFemale; // to only show the correct gender type offers for avatars + DLC_INFO *m_pNoImageFor_DLC; + bool bNoDLCToDisplay; // to display a default "No DLC available at this time" + +}; diff --git a/Minecraft.Client/Common/XUI/XUI_Death.cpp b/Minecraft.Client/Common/XUI/XUI_Death.cpp new file mode 100644 index 00000000..83275c14 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Death.cpp @@ -0,0 +1,242 @@ +// Minecraft.cpp : Defines the entry point for the application. +// + +#include "stdafx.h" +#include "..\XUI\XUI_Death.h" +#include +#include "..\..\..\Minecraft.World\AABB.h" +#include "..\..\..\Minecraft.World\Vec3.h" +#include "..\..\..\Minecraft.World\net.minecraft.stats.h" +#include "..\..\..\Minecraft.Client\StatsCounter.h" +#include "..\..\..\Minecraft.World\Entity.h" +#include "..\..\..\Minecraft.Client\MultiplayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\Level.h" +#include "..\..\..\Minecraft.World\ChunkSource.h" +#include "..\..\..\Minecraft.Client\ProgressRenderer.h" +#include "..\..\..\Minecraft.Client\GameRenderer.h" +#include "..\..\..\Minecraft.Client\LevelRenderer.h" +#include "..\..\..\Minecraft.World\Pos.h" +#include "..\..\..\Minecraft.World\Dimension.h" +#include "..\..\Minecraft.h" +#include "..\..\Options.h" +#include "..\..\LocalPlayer.h" +#include "..\..\..\Minecraft.World\compression.h" +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_Death::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + m_iPad = *(int *)pInitData->pvInitData; + + m_bIgnoreInput = false; + + MapChildControls(); + if(app.GetLocalPlayerCount()>1) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + } + + XuiControlSetText(m_Title,app.GetString(IDS_YOU_DIED)); + XuiControlSetText(m_Buttons[BUTTON_DEATH_RESPAWN],app.GetString(IDS_RESPAWN)); + XuiControlSetText(m_Buttons[BUTTON_DEATH_EXITGAME],app.GetString(IDS_EXIT_GAME)); + + // Display the tooltips + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT); + + return S_OK; +} + +//---------------------------------------------------------------------------------- +// Updates the UI when the list selection changes. +//---------------------------------------------------------------------------------- +HRESULT CScene_Death::OnNotifySelChanged( HXUIOBJ hObjSource, XUINotifySelChanged* pNotifySelChangedData, BOOL& bHandled ) +{ + if( hObjSource == m_Scene ) + { + /*int curSel = m_List.GetCurSel(); + + // Set the locale with the current language. + XuiSetLocale( Languages[curSel].pszLanguagePath ); + + // Apply the locale to the main scene. + XuiApplyLocale( m_hObj, NULL ); + + // Update the text for the current value. + m_Value.SetText( m_List.GetText( curSel ) );*/ + + + + bHandled = TRUE; + } + + return S_OK; +} + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_Death::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + unsigned int uiButtonCounter=0; + + while((uiButtonCounterUserIndex==ProfileManager.GetPrimaryPad()) + { + int playTime = -1; + if( pMinecraft->localplayers[pNotifyPressData->UserIndex] != NULL ) + { + playTime = (int)pMinecraft->localplayers[pNotifyPressData->UserIndex]->getSessionTimer(); + } + TelemetryManager->RecordLevelExit(pNotifyPressData->UserIndex, eSen_LevelExitStatus_Failed); + + if(StorageManager.GetSaveDisabled()) + { + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + StorageManager.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_PROGRESS_LOST, uiIDA, 2, pNotifyPressData->UserIndex,&UIScene_PauseMenu::ExitGameDialogReturned,this, app.GetStringTable()); + } + else + { + if( g_NetworkManager.IsHost() ) + { + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_EXIT_GAME_SAVE; + uiIDA[2]=IDS_EXIT_GAME_NO_SAVE; + + StorageManager.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, pNotifyPressData->UserIndex,&UIScene_PauseMenu::ExitGameSaveDialogReturned,this, app.GetStringTable()); + } + else + { + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + + StorageManager.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 2, pNotifyPressData->UserIndex,&UIScene_PauseMenu::ExitGameDialogReturned,this, app.GetStringTable()); + } + } + } + else + { + TelemetryManager->RecordLevelExit(pNotifyPressData->UserIndex, eSen_LevelExitStatus_Failed); + + // just exit the player + app.SetAction(pNotifyPressData->UserIndex,eAppAction_ExitPlayer); + } + } + else + { + // is it the primary player exiting? + if(pNotifyPressData->UserIndex==ProfileManager.GetPrimaryPad()) + { + TelemetryManager->RecordLevelExit(pNotifyPressData->UserIndex, eSen_LevelExitStatus_Failed); + + // adjust the trial time played + CXuiSceneBase::ReduceTrialTimerValue(); + + // exit the level + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + StorageManager.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_PROGRESS_LOST, uiIDA, 2, pNotifyPressData->UserIndex,&UIScene_PauseMenu::ExitGameDialogReturned,this, app.GetStringTable()); + } + else + { + TelemetryManager->RecordLevelExit(pNotifyPressData->UserIndex, eSen_LevelExitStatus_Failed); + + // just exit the player + app.SetAction(pNotifyPressData->UserIndex,eAppAction_ExitPlayer); + } + } + } + break; + case BUTTON_DEATH_RESPAWN: + { + m_bIgnoreInput = true; + app.SetAction(pNotifyPressData->UserIndex,eAppAction_Respawn); + } + + break; + default: + break; + } + + + + return S_OK; +} + +HRESULT CScene_Death::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + + switch(pInputData->dwKeyCode) + { + + case VK_PAD_B: + case VK_PAD_START: + case VK_ESCAPE: + + // kill the crafting xui + // 4J Stu - No back out, must choose + //app.CloseXuiScenes(); + + rfHandled = TRUE; + + break; + } + + return S_OK; +} + +int CScene_Death::RespawnThreadProc( void* lpParameter ) +{ + AABB::UseDefaultThreadStorage(); + Vec3::UseDefaultThreadStorage(); + Compression::UseDefaultThreadStorage(); + size_t iPad=(size_t)lpParameter; + + Minecraft *pMinecraft=Minecraft::GetInstance(); + + pMinecraft->localplayers[iPad]->respawn(); + + app.SetGameStarted(true); + pMinecraft->gameRenderer->EnableUpdateThread(); + + // If we are online, then we should wait here until the respawn is done + // If we are offline, this should release straight away + //WaitForSingleObject( pMinecraft->m_hPlayerRespawned, INFINITE ); + while(pMinecraft->localplayers[iPad]->GetPlayerRespawned()==false) + { + Sleep(50); + } + + return S_OK; +} + +HRESULT CScene_Death::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) +{ + bHandled=true; + return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Death.h b/Minecraft.Client/Common/XUI/XUI_Death.h new file mode 100644 index 00000000..62d37d0d --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Death.h @@ -0,0 +1,52 @@ +#pragma once + +#include "../media/xuiscene_Death.h" +#include "XUI_CustomMessages.h" + +#define BUTTON_DEATH_RESPAWN 0 +#define BUTTON_DEATH_EXITGAME 1 +#define BUTTONS_DEATH_MAX BUTTON_DEATH_EXITGAME + 1 + + + +class CScene_Death : public CXuiSceneImpl +{ + protected: + // Control and Element wrapper objects. + CXuiScene m_Scene; + CXuiControl m_Buttons[BUTTONS_DEATH_MAX]; + CXuiControl m_Title; + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_NOTIFY_SELCHANGED( OnNotifySelChanged ) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_Respawn, m_Buttons[BUTTON_DEATH_RESPAWN]) + MAP_CONTROL(IDC_ExitGame, m_Buttons[BUTTON_DEATH_EXITGAME]) + MAP_CONTROL(IDC_Title, m_Title) + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnNotifySelChanged( HXUIOBJ hObjSource, XUINotifySelChanged* pNotifySelChangedData, BOOL& bHandled ); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled); +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_Death, L"CScene_Death", XUI_CLASS_SCENE ) + + static int RespawnThreadProc( void* lpParameter ); +private: + bool m_bIgnoreInput; + int m_iPad; + D3DXVECTOR3 m_OriginalPosition; + +}; diff --git a/Minecraft.Client/Common/XUI/XUI_Debug.h b/Minecraft.Client/Common/XUI/XUI_Debug.h new file mode 100644 index 00000000..1fa6d3c8 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Debug.h @@ -0,0 +1,53 @@ +#pragma once + +#include "../media/xuiscene_debug.h" + +class CScene_Debug : public CXuiSceneImpl +{ + protected: + + + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_NOTIFY_SELCHANGED( OnNotifySelChanged ) + XUI_ON_XM_NOTIFY_VALUE_CHANGED( OnNotifyValueChanged ) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_CONTROL_NAVIGATE(OnControlNavigate) + XUI_END_MSG_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnNotifySelChanged( HXUIOBJ hObjSource, XUINotifySelChanged* pNotifySelChangedData, BOOL& bHandled ); + HRESULT OnNotifyValueChanged( HXUIOBJ hObjSource, XUINotifyValueChanged* pNotifyValueChanged, BOOL& bHandled ); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled); + HRESULT OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled); +public: + + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_Debug, L"CScene_Debug", XUI_CLASS_SCENE ) + +private: + + typedef struct + { + HXUIOBJ hXuiObj; + VOID *pvData; + } + DEBUGDATA; + + + static LPCWSTR m_DebugCheckboxTextA[eDebugSetting_Max+1]; + static LPCWSTR m_DebugButtonTextA[eDebugButton_Max+1]; + int m_iTotalCheckboxElements; + int m_iTotalButtonElements; + DEBUGDATA *m_DebugCheckboxDataA; + DEBUGDATA *m_DebugButtonDataA; + int m_iCurrentCheckboxElement; + int m_iCurrentButtonElement; + int m_iPad; + bool m_bOnCheckboxes; // for navigations +}; diff --git a/Minecraft.Client/Common/XUI/XUI_DebugItemEditor.cpp b/Minecraft.Client/Common/XUI/XUI_DebugItemEditor.cpp new file mode 100644 index 00000000..56b41267 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_DebugItemEditor.cpp @@ -0,0 +1,118 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\ClientConnection.h" +#include "..\..\Common\GameRules\ConsoleGameRules.h" +#include "XUI_DebugItemEditor.h" + +#ifdef _DEBUG_MENUS_ENABLED +HRESULT CScene_DebugItemEditor::OnInit( XUIMessageInit *pInitData, BOOL &bHandled ) +{ + MapChildControls(); + + ItemEditorInput *initData = (ItemEditorInput *)pInitData->pvInitData; + m_iPad = initData->iPad; + m_slot = initData->slot; + m_menu = initData->menu; + if(m_slot != NULL) m_item = m_slot->getItem(); + + if(m_item!=NULL) + { + m_icon->SetIcon(m_iPad, m_item->id,m_item->getAuxValue(),m_item->count,10,31,false,m_item->isFoil()); + m_itemName.SetText( app.GetString( Item::items[m_item->id]->getDescriptionId(m_item) ) ); + + m_itemId .SetText( _toString(m_item->id).c_str() ); + m_itemAuxValue .SetText( _toString(m_item->getAuxValue()).c_str() ); + m_itemCount .SetText( _toString(m_item->count).c_str() ); + m_item4JData .SetText( _toString(m_item->get4JData()).c_str() ); + } + + m_itemId .SetKeyboardType(C_4JInput::EKeyboardMode_Numeric); + m_itemAuxValue .SetKeyboardType(C_4JInput::EKeyboardMode_Numeric); + m_itemCount .SetKeyboardType(C_4JInput::EKeyboardMode_Numeric); + m_item4JData .SetKeyboardType(C_4JInput::EKeyboardMode_Numeric); + + m_generatedXml.SetText( CollectItemRuleDefinition::generateXml(m_item).c_str() ); + + delete initData; + + return S_OK; +} + +HRESULT CScene_DebugItemEditor::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + switch(pInputData->dwKeyCode) + { + + case VK_PAD_B: + case VK_PAD_START: + case VK_PAD_BACK: + // We need to send a packet to the server to update it's representation of this item + if(m_slot != NULL && m_menu != NULL) + { + m_slot->set(m_item); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr player = pMinecraft->localplayers[m_iPad]; + if(player != NULL && player->connection) player->connection->send( shared_ptr( new ContainerSetSlotPacket(m_menu->containerId, m_slot->index, m_item) ) ); + } + // kill the crafting xui + app.NavigateBack(m_iPad); + + rfHandled = TRUE; + + break; + + } + + return S_OK; +} + +HRESULT CScene_DebugItemEditor::OnNotifyValueChanged( HXUIOBJ hObjSource, XUINotifyValueChanged *pNotifyValueChangedData, BOOL &bHandled) +{ + if(m_item == NULL) m_item = shared_ptr( new ItemInstance(0,1,0) ); + if(hObjSource == m_itemId) + { + int id = 0; + wstring value = m_itemId.GetText(); + if(!value.empty()) id = _fromString( value ); + + // TODO Proper validation of the valid item ids + if(id > 0 && Item::items[id] != NULL) m_item->id = id; + } + else if(hObjSource == m_itemAuxValue) + { + int auxVal = 0; + wstring value = m_itemAuxValue.GetText(); + if(!value.empty()) auxVal = _fromString( value ); + if(auxVal >= 0) m_item->setAuxValue( auxVal ); + } + else if(hObjSource == m_itemCount) + { + int count = 0; + wstring value = m_itemCount.GetText(); + if(!value.empty()) count = _fromString( value ); + if(count > 0 && count <= Item::items[m_item->id]->getMaxStackSize()) m_item->count = count; + } + else if(hObjSource == m_item4JData) + { + int data = 0; + wstring value = m_item4JData.GetText(); + if(!value.empty()) data = _fromString( value ); + m_item->set4JData(data); + } + + m_icon->SetIcon(m_iPad, m_item->id,m_item->getAuxValue(),m_item->count,10,31,false,m_item->isFoil()); + + m_itemName.SetText( app.GetString( Item::items[m_item->id]->getDescriptionId(m_item) ) ); + + m_generatedXml.SetText( CollectItemRuleDefinition::generateXml(m_item).c_str() ); + return S_OK; +} +#endif \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_DebugItemEditor.h b/Minecraft.Client/Common/XUI/XUI_DebugItemEditor.h new file mode 100644 index 00000000..2e2f5b5a --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_DebugItemEditor.h @@ -0,0 +1,57 @@ +#pragma once +using namespace std; +#include "../media/xuiscene_debug_item_editor.h" + +#include "XUI_Ctrl_CraftIngredientSlot.h" +#include "XUI_Ctrl_4JEdit.h" +#include "..\..\..\Minecraft.World\ItemInstance.h" + +class CScene_DebugItemEditor : public CXuiSceneImpl +{ +#ifdef _DEBUG_MENUS_ENABLED +public: + typedef struct _ItemEditorInput + { + int iPad; + Slot *slot; + AbstractContainerMenu *menu; + } ItemEditorInput; +private: + int m_iPad; + shared_ptr m_item; + Slot *m_slot; + AbstractContainerMenu *m_menu; + + CXuiCtrlCraftIngredientSlot *m_icon; + CXuiControl m_generatedXml, m_itemName; + CXuiCtrl4JEdit m_itemId, m_itemAuxValue, m_itemCount, m_item4JData; + +protected: + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_NOTIFY_VALUE_CHANGED( OnNotifyValueChanged ) + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_itemId, m_itemId) + MAP_CONTROL(IDC_itemAuxValue, m_itemAuxValue) + MAP_CONTROL(IDC_itemCount, m_itemCount) + MAP_CONTROL(IDC_item4JData, m_item4JData) + MAP_OVERRIDE(IDC_icon, m_icon) + MAP_CONTROL(IDC_ruleXml, m_generatedXml) + MAP_CONTROL(IDC_itemName, m_itemName) + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnNotifyValueChanged( HXUIOBJ hObjSource, XUINotifyValueChanged *pNotifyValueChangedData, BOOL &bHandled); +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_DebugItemEditor, L"CScene_DebugItemEditor", XUI_CLASS_SCENE ) +#endif +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_DebugOverlay.cpp b/Minecraft.Client/Common/XUI/XUI_DebugOverlay.cpp new file mode 100644 index 00000000..a23e97b7 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_DebugOverlay.cpp @@ -0,0 +1,391 @@ +#include "stdafx.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\MultiplayerLevel.h" +#include "..\..\GameMode.h" +#include "..\..\SurvivalMode.h" +#include "..\..\CreativeMode.h" +#include "ClientConnection.h" +#include "MultiPlayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\ArrayWithLength.h" +#include "..\..\..\Minecraft.World\com.mojang.nbt.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.animal.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.monster.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.boss.enderdragon.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.saveddata.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.chunk.storage.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.storage.h" +#include "..\..\..\Minecraft.World\InputOutputStream.h" +#include "..\..\..\Minecraft.World\ConsoleSaveFileIO.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.enchantment.h" +#include "XUI_DebugOverlay.h" +#include "..\..\..\Minecraft.Client\GameRenderer.h" +#include "..\..\MinecraftServer.h" +#include "..\..\Common\Tutorial\Tutorial.h" +#include "..\..\..\Minecraft.World\net.minecraft.commands.common.h" +#include "..\..\..\Minecraft.World\ConsoleSaveFileOriginal.h" + +#ifdef _DEBUG_MENUS_ENABLED +HRESULT CScene_DebugOverlay::OnInit( XUIMessageInit *pInitData, BOOL &bHandled ) +{ + MapChildControls(); + + m_items.InsertItems( 0, 512 ); + + for(unsigned int i = 0; i < Item::items.length; ++i) + { + if(Item::items[i] != NULL) + { + //m_items.InsertItems(m_items.GetItemCount(),1); + m_itemIds.push_back(i); + m_items.SetText( m_itemIds.size() - 1, app.GetString( Item::items[i]->getDescriptionId() ) ); + } + } + + m_enchantments.InsertItems( 0, Enchantment::validEnchantments.size() ); + for(unsigned int i = 0; i < Enchantment::validEnchantments.size(); ++i ) + { + Enchantment *ench = Enchantment::validEnchantments.at(i); + + m_enchantmentIds.push_back(ench->id); + m_enchantments.SetText( i, app.GetString( ench->getDescriptionId() ) ); + } + + m_mobs.InsertItems( 0, 21 ); + + m_mobs.SetText( m_mobFactories.size(), L"Chicken" ); + m_mobFactories.push_back(eTYPE_CHICKEN); + m_mobs.SetText( m_mobFactories.size(), L"Cow" ); + m_mobFactories.push_back(eTYPE_COW); + m_mobs.SetText( m_mobFactories.size(), L"Pig" ); + m_mobFactories.push_back(eTYPE_PIG); + m_mobs.SetText( m_mobFactories.size(), L"Sheep" ); + m_mobFactories.push_back(eTYPE_SHEEP); + m_mobs.SetText( m_mobFactories.size(), L"Squid" ); + m_mobFactories.push_back(eTYPE_SQUID); + m_mobs.SetText( m_mobFactories.size(), L"Wolf" ); + m_mobFactories.push_back(eTYPE_WOLF); + m_mobs.SetText( m_mobFactories.size(), L"Creeper" ); + m_mobFactories.push_back(eTYPE_CREEPER); + m_mobs.SetText( m_mobFactories.size(), L"Ghast" ); + m_mobFactories.push_back(eTYPE_GHAST); + m_mobs.SetText( m_mobFactories.size(), L"Pig Zombie" ); + m_mobFactories.push_back(eTYPE_PIGZOMBIE); + m_mobs.SetText( m_mobFactories.size(), L"Skeleton" ); + m_mobFactories.push_back(eTYPE_SKELETON); + m_mobs.SetText( m_mobFactories.size(), L"Slime" ); + m_mobFactories.push_back(eTYPE_SLIME); + m_mobs.SetText( m_mobFactories.size(), L"Spider" ); + m_mobFactories.push_back(eTYPE_SPIDER); + m_mobs.SetText( m_mobFactories.size(), L"Zombie" ); + m_mobFactories.push_back(eTYPE_ZOMBIE); + m_mobs.SetText( m_mobFactories.size(), L"Enderman" ); + m_mobFactories.push_back(eTYPE_ENDERMAN); + m_mobs.SetText( m_mobFactories.size(), L"Silverfish" ); + m_mobFactories.push_back(eTYPE_SILVERFISH); + m_mobs.SetText( m_mobFactories.size(), L"Cave Spider" ); + m_mobFactories.push_back(eTYPE_CAVESPIDER); + m_mobs.SetText( m_mobFactories.size(), L"Mooshroom" ); + m_mobFactories.push_back(eTYPE_MUSHROOMCOW); + m_mobs.SetText( m_mobFactories.size(), L"Snow Golem" ); + m_mobFactories.push_back(eTYPE_SNOWMAN); + m_mobs.SetText( m_mobFactories.size(), L"Ender Dragon" ); + m_mobFactories.push_back(eTYPE_ENDERDRAGON); + m_mobs.SetText( m_mobFactories.size(), L"Blaze" ); + m_mobFactories.push_back(eTYPE_BLAZE); + m_mobs.SetText( m_mobFactories.size(), L"Magma Cube" ); + m_mobFactories.push_back(eTYPE_LAVASLIME); + + + Minecraft *pMinecraft = Minecraft::GetInstance(); + m_setTime.SetValue( pMinecraft->level->getLevelData()->getTime() % 24000 ); + m_setFov.SetValue( (int)pMinecraft->gameRenderer->GetFovVal()); + + XuiSetTimer(m_hObj,0,DEBUG_OVERLAY_UPDATE_TIME_PERIOD); + + bHandled = TRUE; + return S_OK; +} + +// Handler for the XM_NOTIFY message +HRESULT CScene_DebugOverlay::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + unsigned int nIndex; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if ( hObjPressed == m_items ) + { + nIndex = m_items.GetCurSel(); + if(nIndexUserIndex, eXuiServerAction_DropItem, (void *)id); + ClientConnection *conn = Minecraft::GetInstance()->getConnection(ProfileManager.GetPrimaryPad()); + conn->send( GiveItemCommand::preparePacket(dynamic_pointer_cast(Minecraft::GetInstance()->localplayers[ProfileManager.GetPrimaryPad()]), id) ); + } + } + else if ( hObjPressed == m_mobs ) + { + nIndex = m_mobs.GetCurSel(); + if(nIndexgetConnection(ProfileManager.GetPrimaryPad()); + conn->send( EnchantItemCommand::preparePacket(dynamic_pointer_cast(Minecraft::GetInstance()->localplayers[ProfileManager.GetPrimaryPad()]), m_enchantmentIds[nIndex]) ); + } + /*else if( hObjPressed == m_saveToDisc ) // 4J-JEV: Doesn't look like we use this debug option anymore. + { +#ifndef _CONTENT_PACKAGE + pMinecraft->level->save(true, NULL); + + int radius; + m_chunkRadius.GetValue(&radius); + if( radius > 0 ) + { + SaveLimitedFile(radius); + } + else + { + pMinecraft->level->getLevelStorage()->getSaveFile()->DebugFlushToFile(); + } +#endif + }*/ + else if( hObjPressed == m_createSchematic ) + { +#ifndef _CONTENT_PACKAGE + // load from the .xzp file + const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL); + + HXUIOBJ hScene; + HRESULT hr; + //const WCHAR XZP_SEPARATOR = L'#'; + const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string + WCHAR szResourceLocator[ LOCATOR_SIZE ]; + + swprintf(szResourceLocator, LOCATOR_SIZE, L"section://%X,%ls#%ls",c_ModuleHandle,L"media", L"media/"); + hr = XuiSceneCreate(szResourceLocator,app.GetSceneName(eUIScene_DebugCreateSchematic,false, false), NULL, &hScene); + this->NavigateForward(hScene); + //app.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_DebugCreateSchematic); +#endif + } + else if ( hObjPressed == m_setCamera ) + { +#ifndef _CONTENT_PACKAGE + // load from the .xzp file + const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL); + + HXUIOBJ hScene; + HRESULT hr; + //const WCHAR XZP_SEPARATOR = L'#'; + const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string + WCHAR szResourceLocator[ LOCATOR_SIZE ]; + + swprintf(szResourceLocator, LOCATOR_SIZE, L"section://%X,%ls#%ls",c_ModuleHandle,L"media", L"media/"); + hr = XuiSceneCreate(szResourceLocator,app.GetSceneName(eUIScene_DebugSetCamera, false, false), NULL, &hScene); + this->NavigateForward(hScene); + //app.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_DebugCreateSchematic); +#endif + } + else if( hObjPressed == m_toggleRain ) + { + //app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_ToggleRain); + ClientConnection *conn = Minecraft::GetInstance()->getConnection(ProfileManager.GetPrimaryPad()); + conn->send( ToggleDownfallCommand::preparePacket() ); + } + else if( hObjPressed == m_toggleThunder ) + { + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_ToggleThunder); + } + else if( hObjPressed == m_resetTutorial ) + { + Tutorial::debugResetPlayerSavedProgress( ProfileManager.GetPrimaryPad() ); + } + else if( hObjPressed == m_setDay ) + { + ClientConnection *conn = Minecraft::GetInstance()->getConnection(ProfileManager.GetPrimaryPad()); + conn->send( TimeCommand::preparePacket(false) ); + } + else if( hObjPressed == m_setNight ) + { + ClientConnection *conn = Minecraft::GetInstance()->getConnection(ProfileManager.GetPrimaryPad()); + conn->send( TimeCommand::preparePacket(true) ); + } + + rfHandled = TRUE; + return S_OK; +} + +HRESULT CScene_DebugOverlay::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + + switch(pInputData->dwKeyCode) + { + + case VK_PAD_B: + case VK_PAD_START: + case VK_PAD_BACK: + + // kill the crafting xui + app.EnableDebugOverlay(false,pInputData->UserIndex); + + rfHandled = TRUE; + + break; + + } + + return S_OK; +} + +HRESULT CScene_DebugOverlay::OnNotifyValueChanged( HXUIOBJ hObjSource, XUINotifyValueChanged *pNotifyValueChangedData, BOOL &bHandled) +{ + if( hObjSource == m_setTime ) + { + Minecraft *pMinecraft = Minecraft::GetInstance(); + + // Need to set the time on both levels to stop the flickering as the local level + // tries to predict the time + // Only works if we are on the host machine, but shouldn't break if not + MinecraftServer::SetTime(pNotifyValueChangedData->nValue); + pMinecraft->level->getLevelData()->setTime(pNotifyValueChangedData->nValue); + } + if( hObjSource == m_setFov ) + { + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->gameRenderer->SetFovVal((float)pNotifyValueChangedData->nValue); + } + return S_OK; +} + +HRESULT CScene_DebugOverlay::OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->level != NULL) + { + m_setTime.SetValue( pMinecraft->level->getLevelData()->getTime() % 24000 ); + m_setFov.SetValue( (int)pMinecraft->gameRenderer->GetFovVal()); + } + return S_OK; +} + +void CScene_DebugOverlay::SetSpawnToPlayerPos() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + + pMinecraft->level->getLevelData()->setXSpawn((int)pMinecraft->player->x); + pMinecraft->level->getLevelData()->setYSpawn((int)pMinecraft->player->y); + pMinecraft->level->getLevelData()->setZSpawn((int)pMinecraft->player->z); +} + +#ifndef _CONTENT_PACKAGE +void CScene_DebugOverlay::SaveLimitedFile(int chunkRadius) +{ + unordered_map newFileCache; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + ConsoleSaveFile *currentSave = pMinecraft->level->getLevelStorage()->getSaveFile(); + + // With a size of 0 but a value in the data pointer we should create a new save + ConsoleSaveFileOriginal newSave( currentSave->getFilename(), NULL, 0, true ); + + // TODO Make this only happen for the new save + //SetSpawnToPlayerPos(); + FileEntry *origFileEntry = currentSave->createFile( wstring( L"level.dat" ) ); + byteArray levelData( origFileEntry->getFileSize() ); + DWORD bytesRead; + currentSave->setFilePointer(origFileEntry,0,NULL,FILE_BEGIN); + currentSave->readFile( + origFileEntry, + levelData.data, // data buffer + origFileEntry->getFileSize(), // number of bytes to read + &bytesRead // number of bytes read + ); + + FileEntry *newFileEntry = newSave.createFile( wstring( L"level.dat" ) ); + DWORD bytesWritten; + newSave.writeFile( newFileEntry, + levelData.data, // data buffer + origFileEntry->getFileSize(), // number of bytes to write + &bytesWritten // number of bytes written + ); + + int playerChunkX = pMinecraft->player->xChunk; + int playerChunkZ = pMinecraft->player->zChunk; + + for(int xPos = playerChunkX - chunkRadius; xPos < playerChunkX + chunkRadius; ++xPos) + { + for(int zPos = playerChunkZ - chunkRadius; zPos < playerChunkZ + chunkRadius; ++zPos) + { + CompoundTag *chunkData=NULL; + + DataInputStream *is = RegionFileCache::getChunkDataInputStream(currentSave, L"", xPos, zPos); + if (is != NULL) + { + chunkData = NbtIo::read((DataInput *)is); + is->deleteChildStream(); + delete is; + } + app.DebugPrintf("Processing chunk (%d, %d)\n", xPos, zPos); + DataOutputStream *os = getChunkDataOutputStream(newFileCache, &newSave, L"", xPos, zPos); + if(os != NULL) + { + NbtIo::write(chunkData, os); + os->close(); + + // 4J Stu - getChunkDataOutputStream makes a new DataOutputStream that points to a new ChunkBuffer( ByteArrayOutputStream ) + // We should clean these up when we are done + os->deleteChildStream(); + delete os; + } + if(chunkData != NULL) + { + delete chunkData; + } + } + } + + newSave.DebugFlushToFile(); +} +#endif + +RegionFile *CScene_DebugOverlay::getRegionFile(unordered_map &newFileCache, ConsoleSaveFile *saveFile, const wstring &prefix, int chunkX, int chunkZ) // 4J - TODO was synchronized +{ + File file( prefix + wstring(L"r.") + _toString(chunkX>>5) + L"." + _toString(chunkZ>>5) + L".mcr" ); + + RegionFile *ref = NULL; + AUTO_VAR(it, newFileCache.find(file)); + if( it != newFileCache.end() ) + ref = it->second; + + // 4J Jev, put back in. + if (ref != NULL) + { + return ref; + } + + RegionFile *reg = new RegionFile(saveFile, &file); + newFileCache[file] = reg; // 4J - this was originally a softReferenc + return reg; +} + +DataOutputStream *CScene_DebugOverlay::getChunkDataOutputStream(unordered_map &newFileCache, ConsoleSaveFile *saveFile, const wstring &prefix, int chunkX, int chunkZ) +{ + RegionFile *r = getRegionFile(newFileCache, saveFile, prefix, chunkX, chunkZ); + return r->getChunkDataOutputStream(chunkX & 31, chunkZ & 31); +} +#endif \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_DebugOverlay.h b/Minecraft.Client/Common/XUI/XUI_DebugOverlay.h new file mode 100644 index 00000000..ed5f85c2 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_DebugOverlay.h @@ -0,0 +1,72 @@ +#pragma once +using namespace std; +#include "../media/xuiscene_debugoverlay.h" + +#define DEBUG_OVERLAY_UPDATE_TIME_PERIOD 10000 + +class RegionFile; +class DataOutputStream; +class ConsoleSaveFile; +#include "..\..\..\Minecraft.World\File.h" +#include "..\..\..\Minecraft.World\Entity.h" + +class CScene_DebugOverlay : public CXuiSceneImpl +{ +#ifdef _DEBUG_MENUS_ENABLED +private: + CXuiList m_items, m_mobs, m_enchantments; + CXuiControl m_resetTutorial, m_createSchematic, m_toggleRain, m_toggleThunder, m_setCamera; + CXuiControl m_setDay, m_setNight; + CXuiSlider m_chunkRadius, m_setTime,m_setFov; + vector m_itemIds; + vector m_mobFactories; + vector m_enchantmentIds; + +protected: + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_NOTIFY_PRESS_EX( OnNotifyPressEx ) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_NOTIFY_VALUE_CHANGED( OnNotifyValueChanged ) + XUI_ON_XM_TIMER( OnTimer ) + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_ChunkRadius, m_chunkRadius) + MAP_CONTROL(IDC_ResetTutorial, m_resetTutorial) + MAP_CONTROL(IDC_CreateSchematic, m_createSchematic) + MAP_CONTROL(IDC_ToggleRain, m_toggleRain) + MAP_CONTROL(IDC_ToggleThunder, m_toggleThunder) + MAP_CONTROL(IDC_SetDay, m_setDay) + MAP_CONTROL(IDC_SetNight, m_setNight) + MAP_CONTROL(IDC_SliderTime, m_setTime) + MAP_CONTROL(IDC_SliderFov, m_setFov) + MAP_CONTROL(IDC_MobList, m_mobs) + MAP_CONTROL(IDC_EnchantmentsList, m_enchantments) + MAP_CONTROL(IDC_ItemsList, m_items) + MAP_CONTROL(IDC_SetCamera, m_setCamera) + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnNotifyValueChanged( HXUIOBJ hObjSource, XUINotifyValueChanged *pNotifyValueChangedData, BOOL &bHandled); + HRESULT OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ); +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_DebugOverlay, L"CScene_DebugOverlay", XUI_CLASS_SCENE ) + +private: + void SetSpawnToPlayerPos(); +#ifndef _CONTENT_PACKAGE + void SaveLimitedFile(int chunkRadius); +#endif + RegionFile *getRegionFile(unordered_map &newFileCache, ConsoleSaveFile *saveFile, const wstring &prefix, int chunkX, int chunkZ); + + DataOutputStream *getChunkDataOutputStream(unordered_map &newFileCache, ConsoleSaveFile *saveFile, const wstring &prefix, int chunkX, int chunkZ); +#endif +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_DebugSchematicCreator.cpp b/Minecraft.Client/Common/XUI/XUI_DebugSchematicCreator.cpp new file mode 100644 index 00000000..66279d1f --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_DebugSchematicCreator.cpp @@ -0,0 +1,178 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "XUI_DebugSchematicCreator.h" +#include "..\..\..\Minecraft.World\ChunkSource.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" + +#ifndef _CONTENT_PACKAGE +HRESULT CScene_DebugSchematicCreator::OnInit( XUIMessageInit *pInitData, BOOL &bHandled ) +{ + MapChildControls(); + + m_startX .SetKeyboardType(C_4JInput::EKeyboardMode_Numeric); + m_startY .SetKeyboardType(C_4JInput::EKeyboardMode_Numeric); + m_startZ .SetKeyboardType(C_4JInput::EKeyboardMode_Numeric); + m_endX .SetKeyboardType(C_4JInput::EKeyboardMode_Numeric); + m_endY .SetKeyboardType(C_4JInput::EKeyboardMode_Numeric); + m_endZ .SetKeyboardType(C_4JInput::EKeyboardMode_Numeric); + + m_data = new ConsoleSchematicFile::XboxSchematicInitParam(); + + return S_OK; +} + +HRESULT CScene_DebugSchematicCreator::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + if ( hObjPressed == m_createButton ) + { + // We want the start to be even + if(m_data->startX > 0 && m_data->startX%2 != 0) + m_data->startX-=1; + else if(m_data->startX < 0 && m_data->startX%2 !=0) + m_data->startX-=1; + if(m_data->startY < 0) m_data->startY = 0; + else if(m_data->startY > 0 && m_data->startY%2 != 0) + m_data->startY-=1; + if(m_data->startZ > 0 && m_data->startZ%2 != 0) + m_data->startZ-=1; + else if(m_data->startZ < 0 && m_data->startZ%2 !=0) + m_data->startZ-=1; + + // We want the end to be odd to have a total size that is even + if(m_data->endX > 0 && m_data->endX%2 == 0) + m_data->endX+=1; + else if(m_data->endX < 0 && m_data->endX%2 ==0) + m_data->endX+=1; + if(m_data->endY > Level::maxBuildHeight) + m_data->endY = Level::maxBuildHeight; + else if(m_data->endY > 0 && m_data->endY%2 == 0) + m_data->endY+=1; + else if(m_data->endY < 0 && m_data->endY%2 ==0) + m_data->endY+=1; + if(m_data->endZ > 0 && m_data->endZ%2 == 0) + m_data->endZ+=1; + else if(m_data->endZ < 0 && m_data->endZ%2 ==0) + m_data->endZ+=1; + + wstring value = m_name.GetText(); + if(!value.empty()) + { + swprintf(m_data->name,64,L"%ls", value.c_str()); + } + else + { + swprintf(m_data->name,64,L"schematic"); + } + + m_data->bSaveMobs = m_saveMobs.IsChecked(); + +#ifdef _XBOX + if (m_useXboxCompr.IsChecked()) + m_data->compressionType = Compression::eCompressionType_LZXRLE; + else +#endif + m_data->compressionType = Compression::eCompressionType_RLE; + + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(), eXuiServerAction_ExportSchematic, (void *)m_data); + + NavigateBack(); + rfHandled = TRUE; + } + return S_OK; +} + +HRESULT CScene_DebugSchematicCreator::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + switch(pInputData->dwKeyCode) + { + + case VK_PAD_B: + case VK_PAD_START: + case VK_PAD_BACK: + NavigateBack(); + + rfHandled = TRUE; + + break; + + } + + return S_OK; +} + +HRESULT CScene_DebugSchematicCreator::OnNotifyValueChanged( HXUIOBJ hObjSource, XUINotifyValueChanged *pNotifyValueChangedData, BOOL &bHandled) +{ + if(hObjSource == m_startX) + { + int iVal = 0; + wstring value = m_startX.GetText(); + if(!value.empty()) iVal = _fromString( value ); + + if( iVal >= (LEVEL_MAX_WIDTH * -16) || iVal < (LEVEL_MAX_WIDTH * 16)) + { + m_data->startX = iVal; + } + } + else if(hObjSource == m_startY) + { + int iVal = 0; + wstring value = m_startY.GetText(); + if(!value.empty()) iVal = _fromString( value ); + + if( iVal >= (LEVEL_MAX_WIDTH * -16) || iVal < (LEVEL_MAX_WIDTH * 16)) + { + m_data->startY = iVal; + } + } + else if(hObjSource == m_startZ) + { + int iVal = 0; + wstring value = m_startZ.GetText(); + if(!value.empty()) iVal = _fromString( value ); + + if( iVal >= (LEVEL_MAX_WIDTH * -16) || iVal < (LEVEL_MAX_WIDTH * 16)) + { + m_data->startZ = iVal; + } + } + else if(hObjSource == m_endX) + { + int iVal = 0; + wstring value = m_endX.GetText(); + if(!value.empty()) iVal = _fromString( value ); + + if( iVal >= (LEVEL_MAX_WIDTH * -16) || iVal < (LEVEL_MAX_WIDTH * 16)) + { + m_data->endX = iVal; + } + } + else if(hObjSource == m_endY) + { + int iVal = 0; + wstring value = m_endY.GetText(); + if(!value.empty()) iVal = _fromString( value ); + + if( iVal >= (LEVEL_MAX_WIDTH * -16) || iVal < (LEVEL_MAX_WIDTH * 16)) + { + m_data->endY = iVal; + } + } + else if(hObjSource == m_endZ) + { + int iVal = 0; + wstring value = m_endZ.GetText(); + if(!value.empty()) iVal = _fromString( value ); + + if( iVal >= (LEVEL_MAX_WIDTH * -16) || iVal < (LEVEL_MAX_WIDTH * 16)) + { + m_data->endZ = iVal; + } + } + return S_OK; +} +#endif \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_DebugSchematicCreator.h b/Minecraft.Client/Common/XUI/XUI_DebugSchematicCreator.h new file mode 100644 index 00000000..b502d110 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_DebugSchematicCreator.h @@ -0,0 +1,49 @@ +#pragma once +#include "..\Media\xuiscene_debug_schematic_create.h" +#include "XUI_Ctrl_4JEdit.h" +#include "..\..\Common\GameRules\ConsoleSchematicFile.h" + +class CScene_DebugSchematicCreator : public CXuiSceneImpl +{ +#ifndef _CONTENT_PACKAGE +private: + CXuiControl m_createButton; + CXuiCtrl4JEdit m_name, m_startX, m_startY, m_startZ, m_endX, m_endY, m_endZ; + CXuiCheckbox m_saveMobs, m_useXboxCompr; + + ConsoleSchematicFile::XboxSchematicInitParam *m_data; + +protected: + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_NOTIFY_PRESS_EX( OnNotifyPressEx ) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_NOTIFY_VALUE_CHANGED( OnNotifyValueChanged ) + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_CreateButton, m_createButton) + MAP_CONTROL(IDC_Name, m_name) + MAP_CONTROL(IDC_StartX, m_startX) + MAP_CONTROL(IDC_StartY, m_startY) + MAP_CONTROL(IDC_StartZ, m_startZ) + MAP_CONTROL(IDC_EndX, m_endX) + MAP_CONTROL(IDC_EndY, m_endY) + MAP_CONTROL(IDC_EndZ, m_endZ) + MAP_CONTROL(IDC_SaveMobs, m_saveMobs) + MAP_CONTROL(IDC_UseXboxCompression, m_useXboxCompr) + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnNotifyValueChanged( HXUIOBJ hObjSource, XUINotifyValueChanged *pNotifyValueChangedData, BOOL &bHandled); +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_DebugSchematicCreator, L"CScene_DebugSchematicCreator", XUI_CLASS_SCENE ) +#endif +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_DebugSetCamera.cpp b/Minecraft.Client/Common/XUI/XUI_DebugSetCamera.cpp new file mode 100644 index 00000000..2227e895 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_DebugSetCamera.cpp @@ -0,0 +1,152 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "XUI_DebugSetCamera.h" +#include "..\..\..\Minecraft.World\ChunkSource.h" + +// #include "..\..\Xbox\4JLibs\inc\4J_Input.h" + +#include "..\..\Minecraft.h" +#include "..\..\MultiplayerLocalPlayer.h" + +#ifndef _CONTENT_PACKAGE +HRESULT CScene_DebugSetCamera::OnInit( XUIMessageInit *pInitData, BOOL &bHandled ) +{ + MapChildControls(); + + m_camX .SetKeyboardType(C_4JInput::EKeyboardMode_Numeric); + m_camY .SetKeyboardType(C_4JInput::EKeyboardMode_Numeric); + m_camZ .SetKeyboardType(C_4JInput::EKeyboardMode_Numeric); + m_yRot .SetKeyboardType(C_4JInput::EKeyboardMode_Numeric); + m_elevation .SetKeyboardType(C_4JInput::EKeyboardMode_Numeric); + + int playerNo = 0; + currentPosition = new DebugSetCameraPosition(); + + currentPosition->player = playerNo; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + if (pMinecraft != NULL) + { + Vec3 *vec = pMinecraft->localplayers[playerNo]->getPos(1.0); + + currentPosition->m_camX = vec->x; + currentPosition->m_camY = vec->y - 1.62;// pMinecraft->localplayers[playerNo]->getHeadHeight(); + currentPosition->m_camZ = vec->z; + + currentPosition->m_yRot = pMinecraft->localplayers[playerNo]->yRot; + currentPosition->m_elev = pMinecraft->localplayers[playerNo]->xRot; + } + + m_camX.SetKeyboardType(C_4JInput::EKeyboardMode_Full); + m_camY.SetKeyboardType(C_4JInput::EKeyboardMode_Full); + m_camZ.SetKeyboardType(C_4JInput::EKeyboardMode_Full); + m_yRot.SetKeyboardType(C_4JInput::EKeyboardMode_Full); + m_elevation.SetKeyboardType(C_4JInput::EKeyboardMode_Full); + + m_camX.SetText((CONST WCHAR *) _toString(currentPosition->m_camX).c_str()); + m_camY.SetText((CONST WCHAR *) _toString(currentPosition->m_camY + 1.62).c_str()); + m_camZ.SetText((CONST WCHAR *) _toString(currentPosition->m_camZ).c_str()); + + m_yRot.SetText((CONST WCHAR *) _toString(currentPosition->m_yRot).c_str()); + m_elevation.SetText((CONST WCHAR *) _toString(currentPosition->m_elev).c_str()); + + //fpp = new FreezePlayerParam(); + //fpp->player = playerNo; + //fpp->freeze = true; + + //m_lockPlayer.SetCheck( !fpp->freeze ); + + m_lockPlayer.SetCheck( app.GetFreezePlayers() ); + + return S_OK; +} + +HRESULT CScene_DebugSetCamera::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + if (hObjPressed == m_teleport) + { + app.SetXuiServerAction( ProfileManager.GetPrimaryPad(), + eXuiServerAction_SetCameraLocation, + (void *)currentPosition); + rfHandled = TRUE; + } + else if (hObjPressed == m_lockPlayer) + { + app.SetFreezePlayers( m_lockPlayer.IsChecked() ); + + rfHandled = TRUE; + } + + return S_OK; +} + +HRESULT CScene_DebugSetCamera::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + switch(pInputData->dwKeyCode) + { + case VK_PAD_B: + case VK_PAD_START: + case VK_PAD_BACK: + NavigateBack(); + + //delete currentPosition; + //currentPosition = NULL; + + rfHandled = TRUE; + break; + } + return S_OK; +} + +HRESULT CScene_DebugSetCamera::OnNotifyValueChanged( HXUIOBJ hObjSource, XUINotifyValueChanged *pNotifyValueChangedData, BOOL &bHandled) +{ + + // Text Boxes + if (hObjSource == m_camX) + { + double iVal = 0; + wstring value = m_camX.GetText(); + if(!value.empty()) iVal = _fromString( value ); + currentPosition->m_camX = iVal; + bHandled = TRUE; + } + else if (hObjSource == m_camY) + { + double iVal = 0; + wstring value = m_camY.GetText(); + if(!value.empty()) iVal = _fromString( value ); + currentPosition->m_camY = iVal - 1.62; + bHandled = TRUE; + } + else if (hObjSource == m_camZ) + { + double iVal = 0; + wstring value = m_camZ.GetText(); + if(!value.empty()) iVal = _fromString( value ); + currentPosition->m_camZ = iVal; + bHandled = TRUE; + } + else if (hObjSource == m_yRot) + { + double iVal = 0; + wstring value = m_yRot.GetText(); + if(!value.empty()) iVal = _fromString( value ); + currentPosition->m_yRot = iVal; + bHandled = TRUE; + } + else if (hObjSource == m_elevation) + { + double iVal = 0; + wstring value = m_elevation.GetText(); + if(!value.empty()) iVal = _fromString( value ); + currentPosition->m_elev = iVal; + bHandled = TRUE; + } + + return S_OK; +} +#endif \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_DebugSetCamera.h b/Minecraft.Client/Common/XUI/XUI_DebugSetCamera.h new file mode 100644 index 00000000..1bc662e9 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_DebugSetCamera.h @@ -0,0 +1,54 @@ +#pragma once +#include "..\Media\xuiscene_debug_set_camera.h" +#include "XUI_Ctrl_4JEdit.h" +#include "..\..\Common\GameRules\ConsoleSchematicFile.h" + +class CScene_DebugSetCamera : public CXuiSceneImpl +{ +public: + typedef struct _FreezePlayerParam + { + int player; + bool freeze; + } FreezePlayerParam; + +#ifndef _CONTENT_PACKAGE +private: + CXuiCtrl4JEdit m_camX, m_camY, m_camZ, m_yRot, m_elevation; + CXuiCheckbox m_lockPlayer; + CXuiControl m_teleport; + + DebugSetCameraPosition *currentPosition; + FreezePlayerParam *fpp; + +protected: + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_NOTIFY_PRESS_EX( OnNotifyPressEx ) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_NOTIFY_VALUE_CHANGED( OnNotifyValueChanged ) + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_CamX, m_camX) + MAP_CONTROL(IDC_CamY, m_camY) + MAP_CONTROL(IDC_CamZ, m_camZ) + MAP_CONTROL(IDC_YRot, m_yRot) + MAP_CONTROL(IDC_Elevation, m_elevation) + MAP_CONTROL(IDC_LockPlayer, m_lockPlayer) + MAP_CONTROL(IDC_Teleport, m_teleport) + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnNotifyValueChanged( HXUIOBJ hObjSource, XUINotifyValueChanged *pNotifyValueChangedData, BOOL &bHandled); +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_DebugSetCamera, L"CScene_DebugSetCamera", XUI_CLASS_SCENE ) +#endif +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_DebugTips.cpp b/Minecraft.Client/Common/XUI/XUI_DebugTips.cpp new file mode 100644 index 00000000..aaa3b06f --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_DebugTips.cpp @@ -0,0 +1,73 @@ +#include "stdafx.h" + +#include +#include "XUI_DebugTips.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_DebugTips::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + m_iPad = *(int *)pInitData->pvInitData; + + m_bIgnoreInput = false; + + MapChildControls(); + + // Display the tooltips + //ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT); + // display the next tip + wstring wsText=app.FormatHTMLString(m_iPad,app.GetString(app.GetNextTip())); + wchar_t startTags[64]; + swprintf(startTags,64,L"
",app.GetHTMLColour(eHTMLColor_White)); + wsText= startTags + wsText + L"
"; + XuiControlSetText(m_tip,wsText.c_str()); + + return S_OK; +} + + +HRESULT CScene_DebugTips::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + //ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + + switch(pInputData->dwKeyCode) + { + case VK_PAD_A: + { + + + // next tip + // display the next tip + wstring wsText=app.FormatHTMLString(m_iPad,app.GetString(app.GetNextTip())); + wchar_t startTags[64]; + swprintf(startTags,64,L"
",app.GetHTMLColour(eHTMLColor_White)); + wsText= startTags + wsText + L"
"; + XuiControlSetText(m_tip,wsText.c_str()); + + rfHandled = TRUE; + } + break; + + case VK_PAD_B: + case VK_PAD_START: + case VK_ESCAPE: + + app.NavigateBack(m_iPad); + + rfHandled = TRUE; + + break; +#ifndef _CONTENT_PACKAGE + case VK_PAD_LTHUMB_PRESS: +#ifdef _XBOX + app.OverrideFontRenderer(true); +#endif + break; +#endif + } + + return S_OK; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_DebugTips.h b/Minecraft.Client/Common/XUI/XUI_DebugTips.h new file mode 100644 index 00000000..10627d3c --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_DebugTips.h @@ -0,0 +1,38 @@ +#pragma once + +#include "../media/xuiscene_DebugTips.h" + + + + +class CScene_DebugTips : public CXuiSceneImpl +{ + protected: + // Control and Element wrapper objects. + CXuiControl m_tip; + + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_Tip, m_tip) + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_DebugTips, L"CScene_DebugTips", XUI_CLASS_SCENE ) + +private: + bool m_bIgnoreInput; + int m_iPad; + D3DXVECTOR3 m_OriginalPosition; + +}; diff --git a/Minecraft.Client/Common/XUI/XUI_FullscreenProgress.cpp b/Minecraft.Client/Common/XUI/XUI_FullscreenProgress.cpp new file mode 100644 index 00000000..f66c0d70 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_FullscreenProgress.cpp @@ -0,0 +1,375 @@ +// Minecraft.cpp : Defines the entry point for the application. +// + +#include "stdafx.h" + +#include +#include "..\..\Minecraft.h" +#include "..\..\ProgressRenderer.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\Common\Tutorial\TutorialMode.h" + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_FullscreenProgress::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + MapChildControls(); + + m_buttonConfirm.SetText( app.GetString( IDS_CONFIRM_OK ) ); + + LoadingInputParams *params = (LoadingInputParams *)pInitData->pvInitData; + + m_CompletionData = params->completionData; + m_iPad=params->completionData->iPad; + m_cancelFunc = params->cancelFunc; + m_cancelFuncParam = params->m_cancelFuncParam; + m_completeFunc = params->completeFunc; + m_completeFuncParam = params->m_completeFuncParam; + m_bWasCancelled=false; + + thread = new C4JThread(params->func, params->lpParam, "FullscreenProgress"); + thread->SetProcessor(3); // TODO 4J Stu - Make sure this is a good thread/core to use + + m_threadCompleted = false; + threadStarted = false; + //ResumeThread( thread ); + if( CXuiSceneBase::GetPlayerBasePosition(m_iPad) != CXuiSceneBase::e_BaseScene_Fullscreen && CXuiSceneBase::GetPlayerBasePosition(m_iPad) != CXuiSceneBase::e_BaseScene_NotSet) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad,false); + CXuiSceneBase::ShowLogo( m_iPad, FALSE ); + } + else + { + CXuiSceneBase::ShowLogo( m_iPad, params->completionData->bShowLogo ); + } + + CXuiSceneBase::ShowBackground( m_iPad, params->completionData->bShowBackground ); + ui.SetTooltips( m_iPad, -1, params->cancelText, -1, -1 ); + + // Clear the progress text + Minecraft *pMinecraft=Minecraft::GetInstance(); + pMinecraft->progressRenderer->progressStart(-1); + pMinecraft->progressRenderer->progressStage(-1); + + // set the tip + wstring wsText=app.FormatHTMLString(m_iPad,app.GetString(app.GetNextTip())); + wchar_t startTags[64]; + swprintf(startTags,64,L"
",app.GetHTMLColour(eHTMLColor_White)); + wsText= startTags + wsText + L"
"; + XuiControlSetText(m_tip, wsText.c_str()); + + m_tip.SetShow( m_CompletionData->bShowTips ); + + return S_OK; +} + +// The framework calls this handler when the object is to be destroyed. +HRESULT CScene_FullscreenProgress::OnDestroy() +{ + if( thread != NULL && thread != INVALID_HANDLE_VALUE ) + delete thread; + + if( m_CompletionData != NULL ) + delete m_CompletionData; + + return S_OK; +} + +HRESULT CScene_FullscreenProgress::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + switch(pInputData->dwKeyCode) + { + + case VK_PAD_B: + case VK_ESCAPE: + // 4J-JEV: Fix for Xbox360 #162749 - TU17: Save Upload: Content: UI: Player is presented with non-functional Tooltips after the Upload Save For Xbox One is completed. + if( m_cancelFunc != NULL && !m_threadCompleted ) + { + m_cancelFunc( m_cancelFuncParam ); + m_bWasCancelled=true; + } + break; + } + + return S_OK; +} + +//---------------------------------------------------------------------------------- +// Updates the UI when the list selection changes. +//---------------------------------------------------------------------------------- +HRESULT CScene_FullscreenProgress::OnNotifySelChanged( HXUIOBJ hObjSource, XUINotifySelChanged* pNotifySelChangedData, BOOL& bHandled ) +{ + + return S_OK; +} + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_FullscreenProgress::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + if(m_threadCompleted == true && hObjPressed == m_buttonConfirm) + { + // if there's a complete function, call it + if(m_completeFunc) + { + m_completeFunc(m_completeFuncParam); + } + switch(m_CompletionData->type) + { + case e_ProgressCompletion_NavigateBack: + CXuiSceneBase::ShowBackground( m_CompletionData->iPad, FALSE ); + CXuiSceneBase::ShowBackground( m_CompletionData->iPad, TRUE ); + app.NavigateBack(m_CompletionData->iPad); + // Show the other players scenes + CXuiSceneBase::ShowOtherPlayersBaseScene(m_CompletionData->iPad, true); + ui.UpdatePlayerBasePositions(); + break; + case e_ProgressCompletion_NavigateBackToScene: + CXuiSceneBase::ShowBackground( m_CompletionData->iPad, FALSE ); + CXuiSceneBase::ShowBackground( m_CompletionData->iPad, TRUE ); + CXuiSceneBase::ShowOtherPlayersBaseScene(m_CompletionData->iPad, true); + // If the pause menu is still active, then navigate back + // Otherwise close everything then navigate forwads to the pause menu + if(app.IsSceneInStack(m_CompletionData->iPad, m_CompletionData->scene)) + { + app.NavigateBack(m_CompletionData->iPad,false, m_CompletionData->scene); + } + else + { + app.CloseXuiScenesAndNavigateToScene(m_CompletionData->iPad,m_CompletionData->scene); + } + ui.UpdatePlayerBasePositions(); + break; + case e_ProgressCompletion_CloseUIScenes: + app.CloseXuiScenes(m_CompletionData->iPad); + ui.UpdatePlayerBasePositions(); + break; + case e_ProgressCompletion_CloseAllPlayersUIScenes: + app.CloseAllPlayersXuiScenes(); + ui.UpdatePlayerBasePositions(); + break; + case e_ProgressCompletion_NavigateToHomeMenu: + app.NavigateToHomeMenu(); + ui.UpdatePlayerBasePositions(); + break; + } + } + + return S_OK; +} + +HRESULT CScene_FullscreenProgress::OnGetSourceDataText(XUIMessageGetSourceText *pGetSourceTextData, BOOL& bHandled) +{ + // This gets called every frame, so use it to update our two text boxes + + Minecraft *pMinecraft=Minecraft::GetInstance(); + + int title = pMinecraft->progressRenderer->getCurrentTitle(); + if(title >= 0) + m_title.SetText( app.GetString( title ) ); + else + m_title.SetText( L"" ); + + int status = pMinecraft->progressRenderer->getCurrentStatus(); + if(status >= 0) + m_status.SetText( app.GetString( status ) ); + else + m_status.SetText( L"" ); + + return S_OK; +} + +HRESULT CScene_FullscreenProgress::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ) +{ + if(!threadStarted) + { + thread->Run(); + threadStarted = true; + XuiSetTimer(m_hObj,TIMER_FULLSCREEN_PROGRESS,TIMER_FULLSCREEN_PROGRESS_TIME); + XuiSetTimer(m_hObj,TIMER_FULLSCREEN_TIPS,TIMER_FULLSCREEN_TIPS_TIME); + } + return S_OK; +} + +HRESULT CScene_FullscreenProgress::OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ) +{ + int code = thread->GetExitCode(); + DWORD exitcode = *((DWORD *)&code); + + //app.DebugPrintf("CScene_FullscreenProgress Timer %d\n",pTimer->nId); + + if( exitcode != STILL_ACTIVE ) + { + // 4J-PB - need to kill the timers whatever happens + XuiKillTimer(m_hObj,TIMER_FULLSCREEN_PROGRESS); + XuiKillTimer(m_hObj,TIMER_FULLSCREEN_TIPS); + XuiControlSetText(m_tip,L""); + + // hide the tips bar in cause we're waiting for the user to press ok + m_tip.SetShow( FALSE ); + + // If we failed (currently used by network connection thread), navigate back + if( exitcode != S_OK ) + { + if( exitcode == ERROR_CANCELLED ) + { + // Current thread cancelled for whatever reason + // Currently used only for the CConsoleMinecraftApp::RemoteSaveThreadProc thread + // Assume to just ignore this thread as something else is now running that will + // cause another action + } + else + { + /*m_threadCompleted = true; + m_buttonConfirm.SetShow( TRUE ); + m_buttonConfirm.SetFocus( m_CompletionData->iPad ); + m_CompletionData->type = e_ProgressCompletion_NavigateToHomeMenu; + + int exitReasonStringId; + switch( app.GetDisconnectReason() ) + { + default: + exitReasonStringId = IDS_CONNECTION_FAILED; + } + Minecraft *pMinecraft=Minecraft::GetInstance(); + pMinecraft->progressRenderer->progressStartNoAbort( exitReasonStringId );*/ + //app.NavigateBack(m_CompletionData->iPad); + + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + StorageManager.RequestMessageBox( IDS_CONNECTION_FAILED, IDS_CONNECTION_LOST_SERVER, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + + app.NavigateToHomeMenu(); + ui.UpdatePlayerBasePositions(); + } + } + else + { + if(( m_CompletionData->bRequiresUserAction == TRUE ) && (!m_bWasCancelled)) + { + m_threadCompleted = true; + m_buttonConfirm.SetShow( TRUE ); + m_buttonConfirm.SetFocus( ProfileManager.GetPrimaryPad() ); + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT, -1, -1, -1 ); + } + else + { + if(m_bWasCancelled) + { + m_threadCompleted = true; + } + app.DebugPrintf("FullScreenProgress complete with action: "); + switch(m_CompletionData->type) + { + case e_ProgressCompletion_AutosaveNavigateBack: + app.DebugPrintf("e_ProgressCompletion_AutosaveNavigateBack\n"); + { + // store these - they get wiped by the destroy caused by navigateback + int iPad=m_CompletionData->iPad; + //bool bAutosaveWasMenuDisplayed=m_CompletionData->bAutosaveWasMenuDisplayed; + CXuiSceneBase::ShowBackground( iPad, FALSE ); + CXuiSceneBase::ShowLogo(iPad, FALSE ); + app.NavigateBack(iPad); + + // 4J Stu - Fix for #65437 - Customer Encountered: Code: Settings: Autosave option doesn't work when the Host goes into idle state during gameplay. + // Autosave obviously cannot occur if an ignore autosave menu is displayed, so even if we navigate back to a scene and not empty + // then we still want to reset this flag which was set true by the navigate to the fullscreen progress + app.SetIgnoreAutosaveMenuDisplayed(iPad, false); + + // the navigate back leaves SetMenuDisplayed as true, but there may not have been a menu up when autosave was kicked off +// if(bAutosaveWasMenuDisplayed==false) +// { +// app.SetMenuDisplayed(iPad,false); +// } + // Show the other players scenes + CXuiSceneBase::ShowOtherPlayersBaseScene(iPad, true); + // This just allows it to be shown + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localgameModes[ProfileManager.GetPrimaryPad()] != NULL) pMinecraft->localgameModes[ProfileManager.GetPrimaryPad()]->getTutorial()->showTutorialPopup(true); + ui.UpdatePlayerBasePositions(); + } + break; + + case e_ProgressCompletion_NavigateBack: + app.DebugPrintf("e_ProgressCompletion_NavigateBack\n"); + { + // store these - they get wiped by the destroy caused by navigateback + int iPad=m_CompletionData->iPad; + + CXuiSceneBase::ShowBackground( iPad, FALSE ); + CXuiSceneBase::ShowBackground( iPad, TRUE ); + app.NavigateBack(iPad); + // Show the other players scenes + CXuiSceneBase::ShowOtherPlayersBaseScene(iPad, true); + ui.UpdatePlayerBasePositions(); + } + break; + case e_ProgressCompletion_NavigateBackToScene: + app.DebugPrintf("e_ProgressCompletion_NavigateBackToScene\n"); + CXuiSceneBase::ShowBackground( m_CompletionData->iPad, FALSE ); + CXuiSceneBase::ShowBackground( m_CompletionData->iPad, TRUE ); + CXuiSceneBase::ShowOtherPlayersBaseScene(m_CompletionData->iPad, true); + // If the pause menu is still active, then navigate back + // Otherwise close everything then navigate forwads to the pause menu + if(app.IsSceneInStack(m_CompletionData->iPad, m_CompletionData->scene)) + { + app.NavigateBack(m_CompletionData->iPad,false, m_CompletionData->scene); + } + else + { + app.CloseXuiScenesAndNavigateToScene(m_CompletionData->iPad,m_CompletionData->scene); + } + ui.UpdatePlayerBasePositions(); + break; + case e_ProgressCompletion_CloseUIScenes: + app.DebugPrintf("e_ProgressCompletion_CloseUIScenes\n"); + app.CloseXuiScenes(m_CompletionData->iPad); + ui.UpdatePlayerBasePositions(); + break; + case e_ProgressCompletion_CloseAllPlayersUIScenes: + app.DebugPrintf("e_ProgressCompletion_CloseAllPlayersUIScenes\n"); + app.CloseAllPlayersXuiScenes(); + ui.UpdatePlayerBasePositions(); + break; + case e_ProgressCompletion_NavigateToHomeMenu: + app.DebugPrintf("e_ProgressCompletion_NavigateToHomeMenu\n"); + app.NavigateToHomeMenu(); + //ui.UpdatePlayerBasePositions(); + break; + default: + app.DebugPrintf("Default\n"); + break; + } + } + } + } + else + { + switch(pTimer->nId) + { + case TIMER_FULLSCREEN_PROGRESS: + break; + case TIMER_FULLSCREEN_TIPS: + { + // display the next tip + wstring wsText=app.FormatHTMLString(m_iPad,app.GetString(app.GetNextTip())); + wchar_t startTags[64]; + swprintf(startTags,64,L"
",app.GetHTMLColour(eHTMLColor_White)); + wsText= startTags + wsText + L"
"; + XuiControlSetText(m_tip,wsText.c_str()); + } + break; + } + } + + bHandled = TRUE; + + return( S_OK ); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_FullscreenProgress.h b/Minecraft.Client/Common/XUI/XUI_FullscreenProgress.h new file mode 100644 index 00000000..271a5781 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_FullscreenProgress.h @@ -0,0 +1,68 @@ +#pragma once +#include "../media/xuiscene_fullscreenprogress.h" +#include "..\..\..\Minecraft.World\C4JThread.h" + +#define ERROR_FULLSCREENPROGRESS_ + +class CScene_FullscreenProgress : public CXuiSceneImpl +{ +private: + C4JThread* thread; + bool threadStarted; + UIFullscreenProgressCompletionData *m_CompletionData; + + static const int TIMER_FULLSCREEN_PROGRESS = 0; + static const int TIMER_FULLSCREEN_TIPS = 1; + + static const int TIMER_FULLSCREEN_PROGRESS_TIME = 500; + static const int TIMER_FULLSCREEN_TIPS_TIME = 7000; +protected: + // Control and Element wrapper objects. + CXuiControl m_title, m_status, m_buttonConfirm, m_tip; + + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_DESTROY( OnDestroy ) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_NOTIFY_SELCHANGED( OnNotifySelChanged ) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_GET_SOURCE_TEXT(OnGetSourceDataText) + XUI_ON_XM_TRANSITION_START( OnTransitionStart ) + XUI_ON_XM_TIMER( OnTimer ) + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_Title, m_title) + MAP_CONTROL(IDC_Tip, m_tip) + MAP_CONTROL(IDC_Status, m_status) + MAP_CONTROL(IDC_ButtonConfirm, m_buttonConfirm) + END_CONTROL_MAP() + + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnDestroy(); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnNotifySelChanged( HXUIOBJ hObjSource, XUINotifySelChanged* pNotifySelChangedData, BOOL& bHandled ); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled); + HRESULT OnGetSourceDataText(XUIMessageGetSourceText *pGetSourceTextData, BOOL& bHandled); + HRESULT OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ); + HRESULT OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ); +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_FullscreenProgress, L"CScene_FullscreenProgress", XUI_CLASS_SCENE ) + +private: + bool m_threadCompleted; + int m_iPad; + void (*m_cancelFunc)(LPVOID param); + void (*m_completeFunc)(LPVOID param); + LPVOID m_cancelFuncParam; + LPVOID m_completeFuncParam; + D3DXVECTOR3 m_OriginalPosition; + bool m_bWasCancelled; + +}; diff --git a/Minecraft.Client/Common/XUI/XUI_HUD.cpp b/Minecraft.Client/Common/XUI/XUI_HUD.cpp new file mode 100644 index 00000000..286f06a7 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_HUD.cpp @@ -0,0 +1,464 @@ +#include "stdafx.h" +#include "XUI_HUD.h" +#include "..\..\Minecraft.h" +#include "..\..\Gui.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\Random.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.effect.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.material.h" + +HRESULT CXuiSceneHud::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + m_iPad = *(int *)pInitData->pvInitData; + + MapChildControls(); + + XuiElementGetPosition(m_hObj,&m_OriginalPosition); + + m_tickCount = 0; + + return S_OK; +} + +HRESULT CXuiSceneHud::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) +{ + bHandled=true; + + app.ReloadHudScene(m_iPad, bJoining); + + return S_OK; +} + +HRESULT CXuiSceneHud::OnCustomMessage_TickScene() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localgameModes[m_iPad] == NULL) return S_OK; + + ++m_tickCount; + + int iGuiScale; + + if(pMinecraft->localplayers[m_iPad]->m_iScreenSection == C4JRender::VIEWPORT_TYPE_FULLSCREEN) + { + iGuiScale=app.GetGameSettings(m_iPad,eGameSetting_UISize); + } + else + { + iGuiScale=app.GetGameSettings(m_iPad,eGameSetting_UISizeSplitscreen); + } + + int startFrame = 0; + switch(iGuiScale) + { + case 0: + XuiElementFindNamedFrame(m_hObj, L"ScaleSmall", &startFrame); + break; + case 1: + XuiElementFindNamedFrame(m_hObj, L"Normal", &startFrame); + break; + case 2: + XuiElementFindNamedFrame(m_hObj, L"ScaleLarge", &startFrame); + break; + } + if(startFrame >= 0) XuiElementPlayTimeline( m_hObj, startFrame, startFrame, startFrame, FALSE, TRUE); + + // Move the whole hud group if we are not in fullscreen + if(pMinecraft->localplayers[m_iPad]->m_iScreenSection != C4JRender::VIEWPORT_TYPE_FULLSCREEN) + { + int iTooltipsYOffset = 0; + // if tooltips are off, set the y offset to zero + if(app.GetGameSettings(m_iPad,eGameSetting_Tooltips)==0) + { + switch(iGuiScale) + { + case 0: + iTooltipsYOffset=28;//screenHeight/10; + break; + case 2: + iTooltipsYOffset=28;//screenHeight/10; + break; + case 1: + default: + iTooltipsYOffset=28;//screenHeight/10; + break; + } + } + + float fHeight, fWidth; + GetBounds(&fWidth, &fHeight); + + int iSafezoneYHalf = 0; + switch(pMinecraft->localplayers[m_iPad]->m_iScreenSection) + { + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + iSafezoneYHalf = -fHeight/10;// 5% (need to treat the whole screen is 2x this screen) + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + iSafezoneYHalf = (fHeight/2)-(fHeight/10);// 5% (need to treat the whole screen is 2x this screen) + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + iSafezoneYHalf = (fHeight/2)-(fHeight/10);// 5% (need to treat the whole screen is 2x this screen) + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + iSafezoneYHalf = -fHeight/10; // 5% (the whole screen is 2x this screen) + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + iSafezoneYHalf = -fHeight/10; // 5% (the whole screen is 2x this screen) + break; + }; + + D3DXVECTOR3 pos; + m_hudGroup.GetPosition(&pos); + pos.y = iTooltipsYOffset + iSafezoneYHalf; + m_hudGroup.SetPosition(&pos); + } + + // Update inventory + float opacity = 1.0f; + GetOpacity(&opacity); + int selected = pMinecraft->localplayers[m_iPad]->inventory->selected; + for(unsigned int j = 0; j < 9; ++j) + { + m_hotbarIcon[j]->SetSlot(m_hotbarIcon[j]->m_hObj,pMinecraft->localplayers[m_iPad]->inventoryMenu->getSlot(InventoryMenu::USE_ROW_SLOT_START + j)); + m_hotbarIcon[j]->SetUserIndex(m_hotbarIcon[j]->m_hObj, m_iPad ); + + if(j == selected) + { + m_hotbarIcon[j]->SetEnable(FALSE); //Makes the selected overlay display + } + else + { + m_hotbarIcon[j]->SetEnable(TRUE); //Hides the selected overlay display + } + + m_hotbarIcon[j]->SetAlpha( m_hotbarIcon[j]->m_hObj, opacity ); + } + + // Update xp progress + if (pMinecraft->localgameModes[m_iPad]->canHurtPlayer()) + { + int xpNeededForNextLevel = pMinecraft->localplayers[m_iPad]->getXpNeededForNextLevel(); + int progress = (int)(pMinecraft->localplayers[m_iPad]->experienceProgress *xpNeededForNextLevel); + + m_ExperienceProgress.SetShow(TRUE); + m_ExperienceProgress.SetRange(0,xpNeededForNextLevel); + m_ExperienceProgress.SetValue(progress); + } + else + { + m_ExperienceProgress.SetShow(FALSE); + } + + // Update xp level + if (pMinecraft->localgameModes[m_iPad]->hasExperience() && pMinecraft->localplayers[m_iPad]->experienceLevel > 0) + { + m_xpLevel.SetShow(TRUE); + + wchar_t formatted[10]; + swprintf(formatted, 10, L"%d",pMinecraft->localplayers[m_iPad]->experienceLevel); + + m_xpLevel.SetText(formatted); + } + else + { + m_xpLevel.SetShow(FALSE); + } + + if (pMinecraft->localgameModes[m_iPad]->canHurtPlayer()) + { + m_random.setSeed(m_tickCount * 312871); + + // Update health + int heartOffsetIndex = -1; + if (pMinecraft->localplayers[m_iPad]->hasEffect(MobEffect::regeneration)) + { + heartOffsetIndex = m_tickCount % 25; + } + + bool blink = pMinecraft->localplayers[m_iPad]->invulnerableTime / 3 % 2 == 1; + if (pMinecraft->localplayers[m_iPad]->invulnerableTime < 10) blink = false; + int iHealth = pMinecraft->localplayers[m_iPad]->getHealth(); + int iLastHealth = pMinecraft->localplayers[m_iPad]->lastHealth; + bool bHasPoison = pMinecraft->localplayers[m_iPad]->hasEffect(MobEffect::poison); + for (int icon = 0; icon < Player::MAX_HEALTH / 2; icon++) + { + if(blink) + { + if (icon * 2 + 1 < iLastHealth || icon * 2 + 1 < iHealth) + { + // Full + if(bHasPoison) + { + m_healthIcon[icon].PlayVisualRange(L"FullPoisonFlash",NULL,L"FullPoisonFlash"); + } + else + { + m_healthIcon[icon].PlayVisualRange(L"FullFlash",NULL,L"FullFlash"); + } + } + else if (icon * 2 + 1 == iLastHealth || icon * 2 + 1 == iHealth) + { + // Half + if(bHasPoison) + { + m_healthIcon[icon].PlayVisualRange(L"HalfPoisonFlash",NULL,L"HalfPoisonFlash"); + } + else + { + m_healthIcon[icon].PlayVisualRange(L"HalfFlash",NULL,L"HalfFlash"); + } + } + else + { + // Empty + m_healthIcon[icon].PlayVisualRange(L"NormalFlash",NULL,L"NormalFlash"); + } + } + else + { + if (icon * 2 + 1 < iHealth) + { + // Full + if(bHasPoison) + { + m_healthIcon[icon].PlayVisualRange(L"FullPoison",NULL,L"FullPoison"); + } + else + { + m_healthIcon[icon].PlayVisualRange(L"Full",NULL,L"Full"); + } + } + else if (icon * 2 + 1 == iHealth) + { + // Half + if(bHasPoison) + { + m_healthIcon[icon].PlayVisualRange(L"HalfPoison",NULL,L"HalfPoison"); + } + else + { + m_healthIcon[icon].PlayVisualRange(L"Half",NULL,L"Half"); + } + } + else + { + // Empty + m_healthIcon[icon].PlayVisualRange(L"Normal",NULL,L"Normal"); + } + } + + float yo = 0; + if (iHealth <= 4) + { + yo = (float)m_random.nextInt(2) * (iGuiScale+1); + } + if (icon == heartOffsetIndex) + { + yo = -2.0f * (iGuiScale+1); + } + + D3DXVECTOR3 pos; + m_healthIcon[icon].GetPosition(&pos); + // TODO - 4J Stu - This should be scaled based on gui scale and overall size (ie full, split or 480) + pos.y = yo; + m_healthIcon[icon].SetPosition(&pos); + + } + + // Update food + bool foodBlink = false; + FoodData *foodData = pMinecraft->localplayers[m_iPad]->getFoodData(); + int food = foodData->getFoodLevel(); + int oldFood = foodData->getLastFoodLevel(); + bool hasHungerEffect = pMinecraft->localplayers[m_iPad]->hasEffect(MobEffect::hunger); + int saturationLevel = pMinecraft->localplayers[m_iPad]->getFoodData()->getSaturationLevel(); + for (int icon = 0; icon < 10; icon++) + { + if(foodBlink) + { + if (icon * 2 + 1 < oldFood || icon * 2 + 1 < food) + { + // Full + if(hasHungerEffect) + { + m_foodIcon[icon].PlayVisualRange(L"FullPoisonFlash",NULL,L"FullPoisonFlash"); + } + else + { + m_foodIcon[icon].PlayVisualRange(L"FullFlash",NULL,L"FullFlash"); + } + } + else if (icon * 2 + 1 == oldFood || icon * 2 + 1 == food) + { + // Half + if(hasHungerEffect) + { + m_foodIcon[icon].PlayVisualRange(L"HalfPoisonFlash",NULL,L"HalfPoisonFlash"); + } + else + { + m_foodIcon[icon].PlayVisualRange(L"HalfFlash",NULL,L"HalfFlash"); + } + } + else + { + // Empty + m_foodIcon[icon].PlayVisualRange(L"NormalFlash",NULL,L"NormalFlash"); + } + } + else + { + if (icon * 2 + 1 < food) + { + // Full + if(hasHungerEffect) + { + m_foodIcon[icon].PlayVisualRange(L"FullPoison",NULL,L"FullPoison"); + } + else + { + m_foodIcon[icon].PlayVisualRange(L"Full",NULL,L"Full"); + } + } + else if (icon * 2 + 1 == food) + { + // Half + if(hasHungerEffect) + { + m_foodIcon[icon].PlayVisualRange(L"HalfPoison",NULL,L"HalfPoison"); + } + else + { + m_foodIcon[icon].PlayVisualRange(L"Half",NULL,L"Half"); + } + } + else + { + // Empty + if(hasHungerEffect) + { + m_foodIcon[icon].PlayVisualRange(L"NormalPoison",NULL,L"NormalPoison"); + } + else + { + m_foodIcon[icon].PlayVisualRange(L"Normal",NULL,L"Normal"); + } + } + } + + + float yo = 0; + if (saturationLevel <= 0) + { + if ((m_tickCount % (food * 3 + 1)) == 0) + { + yo = (float)(m_random.nextInt(3) - 1) * (iGuiScale+1); + } + } + + D3DXVECTOR3 pos; + m_foodIcon[icon].GetPosition(&pos); + // TODO - 4J Stu - This should be scaled based on gui scale and overall size (ie full, split or 480) + pos.y = yo; + m_foodIcon[icon].SetPosition(&pos); + } + + // Update armour + int armor = pMinecraft->localplayers[m_iPad]->getArmorValue(); + if(armor > 0) + { + m_armourGroup.SetShow(TRUE); + for (int icon = 0; icon < 10; icon++) + { + if (icon * 2 + 1 < armor) m_armourIcon[icon].PlayVisualRange(L"Full",NULL,L"Full"); + else if (icon * 2 + 1 == armor) m_armourIcon[icon].PlayVisualRange(L"Half",NULL,L"Half"); + else if (icon * 2 + 1 > armor) m_armourIcon[icon].PlayVisualRange(L"Normal",NULL,L"Normal"); + } + } + else + { + m_armourGroup.SetShow(FALSE); + } + + // Update air + if (pMinecraft->localplayers[m_iPad]->isUnderLiquid(Material::water)) + { + m_airGroup.SetShow(TRUE); + int count = (int) ceil((pMinecraft->localplayers[m_iPad]->getAirSupply() - 2) * 10.0f / Player::TOTAL_AIR_SUPPLY); + int extra = (int) ceil((pMinecraft->localplayers[m_iPad]->getAirSupply()) * 10.0f / Player::TOTAL_AIR_SUPPLY) - count; + for (int icon = 0; icon < 10; icon++) + { + // Air bubbles + if (icon < count) + { + m_airIcon[icon].SetShow(TRUE); + m_airIcon[icon].PlayVisualRange(L"Bubble",NULL,L"Bubble"); + } + else if(icon < count + extra) + { + m_airIcon[icon].SetShow(TRUE); + m_airIcon[icon].PlayVisualRange(L"Pop",NULL,L"Pop"); + } + else m_airIcon[icon].SetShow(FALSE); + } + } + else + { + m_airGroup.SetShow(FALSE); + } + } + else + { + m_healthGroup.SetShow(FALSE); + m_foodGroup.SetShow(FALSE); + m_armourGroup.SetShow(FALSE); + m_airGroup.SetShow(FALSE); + } + return S_OK; +} + +HRESULT CXuiSceneHud::OnCustomMessage_DLCInstalled() +{ + // mounted DLC may have changed + bool bPauseMenuDisplayed=false; + bool bInGame=(Minecraft::GetInstance()->level!=NULL); + // ignore this if we have menus up - they'll deal with it + for(int i=0;iskins->getSelected(); + // if(tPack->getDLCParentPackId()!=app.GetRequiredTexturePackID()) + // { + // app.DebugPrintf("DLC install finished, and the game is using a texture pack that isn't the required one\n"); + // } + return S_OK; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_HUD.h b/Minecraft.Client/Common/XUI/XUI_HUD.h new file mode 100644 index 00000000..1bf6bcbf --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_HUD.h @@ -0,0 +1,129 @@ +#pragma once +#include "../media/xuiscene_hud.h" +#include "XUI_CustomMessages.h" + +#define CHAT_LINES_COUNT 10 + +class CXuiSceneHud : public CXuiSceneImpl +{ +private: + Random m_random; + int m_tickCount; + +protected: + CXuiControl m_hudHolder; // Contains the HUD group to enable moving all elements together + CXuiControl m_hudGroup; // Contains all the HUD elements except crosshair, in a group that scales + CXuiControl m_hudScaleGroup; // Contains all the HUD elements except crosshair + CXuiControl m_hotbarGroup; + CXuiCtrlSlotItem *m_hotbarIcon[9]; + CXuiProgressBar m_ExperienceProgress; + CXuiControl m_healthGroup; + CXuiControl m_healthIcon[10]; + CXuiControl m_armourGroup; + CXuiControl m_armourIcon[10]; + CXuiControl m_foodGroup; + CXuiControl m_foodIcon[10]; + CXuiControl m_airGroup; + CXuiControl m_airIcon[10]; + CXuiControl m_xpLevel; + + D3DXVECTOR3 m_OriginalPosition; + int m_iPad; + + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + XUI_ON_XM_CUSTOMTICKSCENE_MESSAGE(OnCustomMessage_TickScene) + XUI_ON_XM_DLCINSTALLED_MESSAGE(OnCustomMessage_DLCInstalled) + XUI_ON_XM_DLCLOADED_MESSAGE(OnCustomMessage_DLCMountingComplete) + XUI_END_MSG_MAP() + + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_HudHolder, m_hudHolder) + BEGIN_MAP_CHILD_CONTROLS(m_hudHolder) + MAP_CONTROL(IDC_HudGroup, m_hudGroup) + BEGIN_MAP_CHILD_CONTROLS(m_hudGroup) + MAP_CONTROL(IDC_HudScaleGroup, m_hudScaleGroup) + BEGIN_MAP_CHILD_CONTROLS(m_hudScaleGroup) + MAP_CONTROL(IDC_Hotbar, m_hotbarGroup) + BEGIN_MAP_CHILD_CONTROLS(m_hotbarGroup) + MAP_OVERRIDE(IDC_Inventory1, m_hotbarIcon[0]) + MAP_OVERRIDE(IDC_Inventory2, m_hotbarIcon[1]) + MAP_OVERRIDE(IDC_Inventory3, m_hotbarIcon[2]) + MAP_OVERRIDE(IDC_Inventory4, m_hotbarIcon[3]) + MAP_OVERRIDE(IDC_Inventory5, m_hotbarIcon[4]) + MAP_OVERRIDE(IDC_Inventory6, m_hotbarIcon[5]) + MAP_OVERRIDE(IDC_Inventory7, m_hotbarIcon[6]) + MAP_OVERRIDE(IDC_Inventory8, m_hotbarIcon[7]) + MAP_OVERRIDE(IDC_Inventory9, m_hotbarIcon[8]) + END_MAP_CHILD_CONTROLS() + MAP_CONTROL(IDC_ExperienceProgress, m_ExperienceProgress) + MAP_CONTROL(IDC_Health, m_healthGroup) + BEGIN_MAP_CHILD_CONTROLS(m_healthGroup) + MAP_CONTROL(IDC_Health0, m_healthIcon[0]) + MAP_CONTROL(IDC_Health1, m_healthIcon[1]) + MAP_CONTROL(IDC_Health2, m_healthIcon[2]) + MAP_CONTROL(IDC_Health3, m_healthIcon[3]) + MAP_CONTROL(IDC_Health4, m_healthIcon[4]) + MAP_CONTROL(IDC_Health5, m_healthIcon[5]) + MAP_CONTROL(IDC_Health6, m_healthIcon[6]) + MAP_CONTROL(IDC_Health7, m_healthIcon[7]) + MAP_CONTROL(IDC_Health8, m_healthIcon[8]) + MAP_CONTROL(IDC_Health9, m_healthIcon[9]) + END_MAP_CHILD_CONTROLS() + MAP_CONTROL(IDC_Armour, m_armourGroup) + BEGIN_MAP_CHILD_CONTROLS(m_armourGroup) + MAP_CONTROL(IDC_Armour0, m_armourIcon[0]) + MAP_CONTROL(IDC_Armour1, m_armourIcon[1]) + MAP_CONTROL(IDC_Armour2, m_armourIcon[2]) + MAP_CONTROL(IDC_Armour3, m_armourIcon[3]) + MAP_CONTROL(IDC_Armour4, m_armourIcon[4]) + MAP_CONTROL(IDC_Armour5, m_armourIcon[5]) + MAP_CONTROL(IDC_Armour6, m_armourIcon[6]) + MAP_CONTROL(IDC_Armour7, m_armourIcon[7]) + MAP_CONTROL(IDC_Armour8, m_armourIcon[8]) + MAP_CONTROL(IDC_Armour9, m_armourIcon[9]) + END_MAP_CHILD_CONTROLS() + MAP_CONTROL(IDC_Food, m_foodGroup) + BEGIN_MAP_CHILD_CONTROLS(m_foodGroup) + MAP_CONTROL(IDC_Food0, m_foodIcon[0]) + MAP_CONTROL(IDC_Food1, m_foodIcon[1]) + MAP_CONTROL(IDC_Food2, m_foodIcon[2]) + MAP_CONTROL(IDC_Food3, m_foodIcon[3]) + MAP_CONTROL(IDC_Food4, m_foodIcon[4]) + MAP_CONTROL(IDC_Food5, m_foodIcon[5]) + MAP_CONTROL(IDC_Food6, m_foodIcon[6]) + MAP_CONTROL(IDC_Food7, m_foodIcon[7]) + MAP_CONTROL(IDC_Food8, m_foodIcon[8]) + MAP_CONTROL(IDC_Food9, m_foodIcon[9]) + END_MAP_CHILD_CONTROLS() + MAP_CONTROL(IDC_Air, m_airGroup) + BEGIN_MAP_CHILD_CONTROLS(m_airGroup) + MAP_CONTROL(IDC_Air0, m_airIcon[0]) + MAP_CONTROL(IDC_Air1, m_airIcon[1]) + MAP_CONTROL(IDC_Air2, m_airIcon[2]) + MAP_CONTROL(IDC_Air3, m_airIcon[3]) + MAP_CONTROL(IDC_Air4, m_airIcon[4]) + MAP_CONTROL(IDC_Air5, m_airIcon[5]) + MAP_CONTROL(IDC_Air6, m_airIcon[6]) + MAP_CONTROL(IDC_Air7, m_airIcon[7]) + MAP_CONTROL(IDC_Air8, m_airIcon[8]) + MAP_CONTROL(IDC_Air9, m_airIcon[9]) + END_MAP_CHILD_CONTROLS() + MAP_CONTROL(IDC_XPLevel, m_xpLevel) + END_MAP_CHILD_CONTROLS() + END_MAP_CHILD_CONTROLS() + END_MAP_CHILD_CONTROLS() + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled); + HRESULT OnCustomMessage_TickScene(); + HRESULT OnCustomMessage_DLCInstalled(); + HRESULT OnCustomMessage_DLCMountingComplete(); +public: + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CXuiSceneHud, L"CXuiSceneHud", XUI_CLASS_SCENE ) +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_HelpAndOptions.cpp b/Minecraft.Client/Common/XUI/XUI_HelpAndOptions.cpp new file mode 100644 index 00000000..9ba49e9d --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_HelpAndOptions.cpp @@ -0,0 +1,462 @@ +// Minecraft.cpp : Defines the entry point for the application. +// + +#include "stdafx.h" + +#include +#include "..\XUI\XUI_HelpAndOptions.h" + + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_HelpAndOptions::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + m_iPad = *(int *)pInitData->pvInitData; + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + + MapChildControls(); + XuiControlSetText(m_Buttons[BUTTON_HAO_CHANGESKIN],app.GetString(IDS_CHANGE_SKIN)); + XuiControlSetText(m_Buttons[BUTTON_HAO_HOWTOPLAY],app.GetString(IDS_HOW_TO_PLAY)); + XuiControlSetText(m_Buttons[BUTTON_HAO_CONTROLS],app.GetString(IDS_CONTROLS)); + XuiControlSetText(m_Buttons[BUTTON_HAO_SETTINGS],app.GetString(IDS_SETTINGS)); + XuiControlSetText(m_Buttons[BUTTON_HAO_CREDITS],app.GetString(IDS_CREDITS)); + XuiControlSetText(m_Buttons[BUTTON_HAO_REINSTALL],app.GetString(IDS_REINSTALL_CONTENT)); + XuiControlSetText(m_Buttons[BUTTON_HAO_DEBUG],app.GetString(IDS_DEBUG_SETTINGS)); + + //if(app.GetTMSDLCInfoRead()) + { + m_Timer.SetShow(FALSE); + m_bIgnoreInput=false; + + #ifndef _FINAL_BUILD + if(!app.DebugSettingsOn()) + { + m_Buttons[BUTTON_HAO_DEBUG].SetEnable(FALSE); + m_Buttons[BUTTON_HAO_DEBUG].SetShow(FALSE); + } + else + { + m_Buttons[BUTTON_HAO_DEBUG].SetEnable(TRUE); + m_Buttons[BUTTON_HAO_DEBUG].SetShow(TRUE); + + } + #endif + + // 4J-PB - do not need a storage device to see this menu - just need one when you choose to re-install them + + // any content to be re-installed? + if(m_iPad==ProfileManager.GetPrimaryPad() && bNotInGame) + { + // We should show the reinstall menu + app.DebugPrintf("Reinstall Menu required...\n"); + m_Buttons[BUTTON_HAO_REINSTALL].SetEnable(TRUE); + m_Buttons[BUTTON_HAO_REINSTALL].SetShow(TRUE); + } + else + { + m_Buttons[BUTTON_HAO_REINSTALL].SetEnable(FALSE); + m_Buttons[BUTTON_HAO_REINSTALL].SetShow(FALSE); + } + + if(app.GetLocalPlayerCount()>1) + { + // no credits in splitscreen + D3DXVECTOR3 vec; + + m_Buttons[BUTTON_HAO_CREDITS].GetPosition(&vec); + + m_Buttons[BUTTON_HAO_CREDITS].SetEnable(FALSE); + m_Buttons[BUTTON_HAO_CREDITS].SetShow(FALSE); + + m_Buttons[BUTTON_HAO_REINSTALL].SetPosition(&vec); + + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad,false); + CXuiSceneBase::ShowLogo( m_iPad, FALSE ); + + if(ProfileManager.GetPrimaryPad()!=m_iPad) + { + m_Buttons[BUTTON_HAO_DEBUG].SetEnable(FALSE); + m_Buttons[BUTTON_HAO_DEBUG].SetShow(FALSE); + } + } + else + { + if(bNotInGame) + { + CXuiSceneBase::ShowLogo( DEFAULT_XUI_MENU_USER, TRUE ); + } + else + { + CXuiSceneBase::ShowLogo( m_iPad, TRUE ); + } + } + // Display the tooltips + + // if we're not in the game, we need to use basescene 0 + if(bNotInGame) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + } + else + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + } + + + if(!ProfileManager.IsFullVersion() )//|| ProfileManager.IsGuest(m_iPad)) + { + // disable save button + m_Buttons[BUTTON_HAO_CHANGESKIN].SetEnable(FALSE); + m_Buttons[BUTTON_HAO_CHANGESKIN].EnableInput(FALSE); + // set the focus to the second button + + XuiElementSetUserFocus(m_Buttons[BUTTON_HAO_HOWTOPLAY].m_hObj, m_iPad); + } + } + /*else + { + m_bIgnoreInput=true; + m_Timer.SetShow(TRUE); + + // hide all the buttons + for(int i=0;ilevel==NULL); + m_Timer.SetShow(FALSE); + m_bIgnoreInput=false; + + // show all the buttons - except the debug settings and reinstall content + m_Buttons[BUTTON_HAO_CHANGESKIN].SetEnable(TRUE); + m_Buttons[BUTTON_HAO_CHANGESKIN].SetShow(TRUE); + m_Buttons[BUTTON_HAO_HOWTOPLAY].SetEnable(TRUE); + m_Buttons[BUTTON_HAO_HOWTOPLAY].SetShow(TRUE); + m_Buttons[BUTTON_HAO_CONTROLS].SetEnable(TRUE); + m_Buttons[BUTTON_HAO_CONTROLS].SetShow(TRUE); + m_Buttons[BUTTON_HAO_SETTINGS].SetEnable(TRUE); + m_Buttons[BUTTON_HAO_SETTINGS].SetShow(TRUE); + m_Buttons[BUTTON_HAO_CREDITS].SetEnable(TRUE); + m_Buttons[BUTTON_HAO_CREDITS].SetShow(TRUE); + + + +#ifndef _FINAL_BUILD + if(!app.DebugSettingsOn()) + { + m_Buttons[BUTTON_HAO_DEBUG].SetEnable(FALSE); + m_Buttons[BUTTON_HAO_DEBUG].SetShow(FALSE); + } + else + { + m_Buttons[BUTTON_HAO_DEBUG].SetEnable(TRUE); + m_Buttons[BUTTON_HAO_DEBUG].SetShow(TRUE); + + } +#endif + + // 4J-PB - do not need a storage device to see this menu - just need one when you choose to re-install them + + // any content to be re-installed? + if(m_iPad==ProfileManager.GetPrimaryPad() && bNotInGame) + { + // We should show the reinstall menu + app.DebugPrintf("Reinstall Menu required...\n"); + m_Buttons[BUTTON_HAO_REINSTALL].SetEnable(TRUE); + m_Buttons[BUTTON_HAO_REINSTALL].SetShow(TRUE); + } + else + { + m_Buttons[BUTTON_HAO_REINSTALL].SetEnable(FALSE); + m_Buttons[BUTTON_HAO_REINSTALL].SetShow(FALSE); + } + + if(app.GetLocalPlayerCount()>1) + { + // no credits in splitscreen + D3DXVECTOR3 vec; + + m_Buttons[BUTTON_HAO_CREDITS].GetPosition(&vec); + + m_Buttons[BUTTON_HAO_CREDITS].SetEnable(FALSE); + m_Buttons[BUTTON_HAO_CREDITS].SetShow(FALSE); + + m_Buttons[BUTTON_HAO_REINSTALL].SetPosition(&vec); + + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad,false); + CXuiSceneBase::ShowLogo( m_iPad, FALSE ); + + if(ProfileManager.GetPrimaryPad()!=m_iPad) + { + m_Buttons[BUTTON_HAO_DEBUG].SetEnable(FALSE); + m_Buttons[BUTTON_HAO_DEBUG].SetShow(FALSE); + } + } + else + { + if(bNotInGame) + { + CXuiSceneBase::ShowLogo( DEFAULT_XUI_MENU_USER, TRUE ); + } + else + { + CXuiSceneBase::ShowLogo( m_iPad, TRUE ); + } + } + // Display the tooltips + + // if we're not in the game, we need to use basescene 0 + if(bNotInGame) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + } + else + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + } + + + if(!ProfileManager.IsFullVersion() )//|| ProfileManager.IsGuest(m_iPad)) + { + // disable save button + m_Buttons[BUTTON_HAO_CHANGESKIN].SetEnable(FALSE); + m_Buttons[BUTTON_HAO_CHANGESKIN].EnableInput(FALSE); + // set the focus to the second button + + XuiElementSetUserFocus(m_Buttons[BUTTON_HAO_HOWTOPLAY].m_hObj, m_iPad); + } + else + { + XuiElementSetUserFocus(m_Buttons[BUTTON_HAO_CHANGESKIN].m_hObj, m_iPad); + } + return S_OK; +}*/ + +HRESULT CScene_HelpAndOptions::OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) +{ + pControlNavigateData->hObjDest=XuiControlGetNavigation(pControlNavigateData->hObjSource,pControlNavigateData->nControlNavigate,TRUE,TRUE); + + if(pControlNavigateData->hObjDest!=NULL) + { + bHandled=TRUE; + } + + return S_OK; +} + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_HelpAndOptions::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + unsigned int uiButtonCounter=0; + + while((uiButtonCounterUserIndex,eUIScene_HowToPlayMenu); + break; + case BUTTON_HAO_CONTROLS: + app.NavigateToScene(pNotifyPressData->UserIndex,eUIScene_ControlsMenu); + break; + case BUTTON_HAO_SETTINGS: + app.NavigateToScene(pNotifyPressData->UserIndex,eUIScene_SettingsMenu); + break; + case BUTTON_HAO_CHANGESKIN: + app.NavigateToScene(pNotifyPressData->UserIndex,eUIScene_SkinSelectMenu); + break; + case BUTTON_HAO_CREDITS: + app.NavigateToScene(pNotifyPressData->UserIndex,eUIScene_Credits); + break; + + case BUTTON_HAO_REINSTALL: + app.NavigateToScene(pNotifyPressData->UserIndex,eUIScene_ReinstallMenu); + break; + + case BUTTON_HAO_DEBUG: + app.NavigateToScene(pNotifyPressData->UserIndex,eUIScene_DebugOptions); + break; + + default: + break; + } + + return S_OK; +} + +HRESULT CScene_HelpAndOptions::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + + // ignore a held down key to avoid skipping this scene if the user changes a setting and presses B for slightly too long + if((pInputData->dwFlags&XUI_INPUT_FLAG_REPEAT)&&(pInputData->dwKeyCode==VK_PAD_B)) + { + return S_OK; + } + + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + switch(pInputData->dwKeyCode) + { + + case VK_PAD_B: + case VK_ESCAPE: + BYTE userIndex = pInputData->UserIndex; + if( !app.IsPauseMenuDisplayed(userIndex) ) + { + // If we are not from a pause menu, then we are from the main menu + userIndex = XUSER_INDEX_ANY; + } + + app.NavigateBack(userIndex); + rfHandled = TRUE; + + break; + } + + return S_OK; +} + +HRESULT CScene_HelpAndOptions::OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled) +{ + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + + if(bNotInGame) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + CXuiSceneBase::ShowLogo( DEFAULT_XUI_MENU_USER, TRUE ); + + if(m_iPad==ProfileManager.GetPrimaryPad() )//&& + // StorageManager.GetSaveDeviceSelected(m_iPad) && + // !StorageManager.GetSaveDisabled() && +// ( ProfileManager.IsAwardsFlagSet(m_iPad,eAward_mine100Blocks) || +// ProfileManager.IsAwardsFlagSet(m_iPad,eAward_kill10Creepers) || +// ProfileManager.IsAwardsFlagSet(m_iPad,eAward_eatPorkChop) || +// ProfileManager.IsAwardsFlagSet(m_iPad,eAward_play100Days) || +// ProfileManager.IsAwardsFlagSet(m_iPad,eAward_arrowKillCreeper) || +// ProfileManager.IsAwardsFlagSet(m_iPad,eAward_socialPost)) ) + { + // We should show the reinstall menu + app.DebugPrintf("Reinstall Menu required...\n"); + m_Buttons[BUTTON_HAO_REINSTALL].SetEnable(TRUE); + m_Buttons[BUTTON_HAO_REINSTALL].SetShow(TRUE); + } + else + { + m_Buttons[BUTTON_HAO_REINSTALL].SetEnable(FALSE); + m_Buttons[BUTTON_HAO_REINSTALL].SetShow(FALSE); + } + + } + else + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + if(app.GetLocalPlayerCount()>1) + { + CXuiSceneBase::ShowLogo( m_iPad, FALSE ); + } + else + { + CXuiSceneBase::ShowLogo( m_iPad, TRUE ); + } + } + + return S_OK; +} + + +// int CScene_HelpAndOptions::ResetDefaultsDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +// { +// CScene_HelpAndOptions* pClass = (CScene_HelpAndOptions*)pParam; +// +// // results switched for this dialog +// if(result==C4JStorage::EMessage_ResultDecline) +// { +// app.SetDefaultOptions(ProfileManager.GetDashboardProfileSettings(pClass->m_iPad),pClass->m_iPad); +// // if the profile data has been changed, then force a profile write +// // It seems we're allowed to break the 5 minute rule if it's the result of a user action +// app.CheckGameSettingsChanged(true,iPad); +// } +// return 0; +// } + +HRESULT CScene_HelpAndOptions::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ) +{ + if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) return S_OK; + + if(pTransition->dwTransType == XUI_TRANSITION_TO || pTransition->dwTransType == XUI_TRANSITION_BACKTO) + { + + // 4J-PB - Going to resize buttons if the text is too big to fit on any of them (Br-pt problem with the length of Unlock Full Game) + XUIRect xuiRect; + HXUIOBJ visual=NULL; + HXUIOBJ text; + float fMaxTextLen=0.0f; + float fTextVisualLen; + float fMaxButton; + float fWidth,fHeight; + + HRESULT hr=XuiControlGetVisual(m_Buttons[0].m_hObj,&visual); + hr=XuiElementGetChildById(visual,L"text_Label",&text); + hr=XuiElementGetBounds(text,&fTextVisualLen,&fHeight); + m_Buttons[0].GetBounds(&fMaxButton,&fHeight); + + + for(int i=0;ifMaxTextLen) fMaxTextLen=xuiRect.right; + } + + if(fTextVisualLen +#include "..\XUI\XUI_HelpControls.h" +#include "XUI_Ctrl_4JList.h" + +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\LevelData.h" +#include "..\..\MultiplayerLocalPlayer.h" + +#define ALIGN_START 0 +#define ALIGN_END 1 +typedef struct +{ + WCHAR wchName[20]; + int iAlign; + D3DXVECTOR3 vPos; +} +CONTROLDETAILS; + +LPCWSTR CScene_Controls::m_LayoutNameA[3]= +{ + L"1", + L"2", + L"3", +}; +CONTROLDETAILS controlDetailsA[MAX_CONTROLS]= +{ + { + L"FigA",ALIGN_END // _360_JOY_BUTTON_A + }, + { + L"FigB",ALIGN_END // _360_JOY_BUTTON_B + }, + { + L"FigX",ALIGN_END // _360_JOY_BUTTON_X + }, + { + L"FigY",ALIGN_END // _360_JOY_BUTTON_Y + }, + { + L"FigStart",ALIGN_END // _360_JOY_BUTTON_START + }, + { + L"FigBack",ALIGN_START // _360_JOY_BUTTON_BACK + }, + { + L"FigRB",ALIGN_END // _360_JOY_BUTTON_RB + }, + { + L"FigLB",ALIGN_START // _360_JOY_BUTTON_LB + }, + { + L"FigRStickButton",ALIGN_END // _360_JOY_BUTTON_RTHUMB + }, + { + L"FigLStickButton",ALIGN_START // _360_JOY_BUTTON_LTHUMB + }, + // Move + { + L"FigRStick",ALIGN_END // _360_JOY_BUTTON_RSTICK_RIGHT + }, + // Look + { + L"FigLStick",ALIGN_START // _360_JOY_BUTTON_LSTICK_RIGHT + }, + { + L"FigRT",ALIGN_END // RT + }, + { + L"FigLT",ALIGN_START // LT + }, + { + L"FigDpadR",ALIGN_START // DpadR + }, + { + L"FigDpadL",ALIGN_START // DpadL + }, + { + L"FigDpad",ALIGN_START // DpadL + }, + +}; + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_Controls::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + MapChildControls(); + XuiControlSetText(m_SouthPaw,app.GetString(IDS_SOUTHPAW)); + XuiControlSetText(m_InvertLook,app.GetString(IDS_INVERT_LOOK)); + + m_iPad=*(int *)pInitData->pvInitData; + // if we're not in the game, we need to use basescene 0 + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + bool bSplitscreen=(app.GetLocalPlayerCount()>1); + m_iCurrentTextIndex=0; + m_bCreativeMode = !bNotInGame && Minecraft::GetInstance()->localplayers[m_iPad] && Minecraft::GetInstance()->localplayers[m_iPad]->abilities.mayfly; + + if(!bNotInGame) + { + // disable the build ver display + m_BuildVer.SetShow(FALSE); + } + + if(bSplitscreen) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad,32.0f); + CXuiSceneBase::ShowLogo( m_iPad, FALSE ); + } + else + { + if(bNotInGame) + { + CXuiSceneBase::ShowLogo( DEFAULT_XUI_MENU_USER, TRUE ); + } + else + { + CXuiSceneBase::ShowLogo( m_iPad, TRUE ); + } + } + + // if we're not in the game, we need to use basescene 0 + if(bNotInGame) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + } + else + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + } + + m_iSchemeTextA[0]=IDS_CONTROLS_SCHEME0; + m_iSchemeTextA[1]=IDS_CONTROLS_SCHEME1; + m_iSchemeTextA[2]=IDS_CONTROLS_SCHEME2; + + // get the figures + HXUIOBJ hObj; + HRESULT hr; + + // turn off all the figures to start with + for(int i=0;iAddData(ListInfo[i]); + } + + m_bIgnoreNotifies=true; + m_bIgnoreNotifies=false; + int iSelected=app.GetGameSettings(m_iPad,eGameSetting_ControlScheme); + XuiControlSetText(m_SchemeList,app.GetString(IDS_CONTROLS_LAYOUT)); + hr=m_pLayoutList->SetCurSelVisible(iSelected); + m_iCurrentNavigatedControlsLayout=iSelected; + + LPWSTR layoutString = new wchar_t[ 128 ]; + swprintf( layoutString, 128, L"%ls : %ls", app.GetString( IDS_CURRENT_LAYOUT ),app.GetString(m_iSchemeTextA[iSelected])); + XuiControlSetText(m_CurrentLayout,layoutString); + + //PositionAllText(m_iPad); + + swprintf( layoutString, 128, L"%ls%ls", VER_PRODUCTVERSION_STR_W,app.DLCInstallProcessCompleted()?L"_DLC":L" "); + + m_BuildVer.SetText(layoutString); + delete [] layoutString; + + // Set check box initial states. + BOOL bInvertLook = app.GetGameSettings(m_iPad,eGameSetting_ControlInvertLook); + m_InvertLook.SetCheck( bInvertLook ); + + BOOL bSouthPaw = app.GetGameSettings(m_iPad,eGameSetting_ControlSouthPaw); + m_SouthPaw.SetCheck( bSouthPaw ); + + return S_OK; +} + + + +HRESULT CScene_Controls::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ) +{ + + if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) return S_OK; + + if(pTransition->dwTransType == XUI_TRANSITION_TO || pTransition->dwTransType == XUI_TRANSITION_BACKTO) + { + int iSelected=app.GetGameSettings(m_iPad,eGameSetting_ControlScheme); + // and update the highlight on the current selection + m_pLayoutList->SetBorder(iSelected,TRUE); + + PositionAllText(m_iPad); + } + + return S_OK; +} + +void CScene_Controls::PositionAllText(int iPad) +{ + // turn off all the figures to start with + for(int i=0;iUserIndex, pInputData->dwKeyCode); + + HRESULT hr=S_OK; + + // Explicitly handle B button presses + switch(pInputData->dwKeyCode) + { + + case VK_PAD_B: + case VK_ESCAPE: + + app.CheckGameSettingsChanged(true,pInputData->UserIndex); + app.NavigateBack(pInputData->UserIndex); + rfHandled = TRUE; + break; + } + + return hr; +} + +void CScene_Controls::PositionText(int iPad,int iTextID, unsigned char ucAction) +{ + // position the text depending on the control id + //int iTextWidth; + XUIRect xuiRect; + LPCWSTR pwchText; + D3DXVECTOR3 vpos,vScale; + HXUIOBJ hFigGroup; + unsigned int uiVal=InputManager.GetGameJoypadMaps(m_iCurrentNavigatedControlsLayout,ucAction); + + // get the visual of the fig group and use any scaling in it to adjust the text positions + XuiElementGetChildById(m_hObj,L"FigGroup",&hFigGroup); + XuiElementGetScale(hFigGroup,&vScale); + + // check the width of the control with the text set in it + if(m_TextPresenterA[m_iCurrentTextIndex]==NULL) + { + HXUIOBJ hObj=NULL; + HRESULT hr=XuiControlGetVisual(m_TextA[m_iCurrentTextIndex].m_hObj,&hObj); + hr=XuiElementGetChildById(hObj,L"Text",&m_TextPresenterA[m_iCurrentTextIndex]); + } + + pwchText=app.GetString(iTextID); + HRESULT hr=XuiTextPresenterMeasureText(m_TextPresenterA[m_iCurrentTextIndex], pwchText, &xuiRect); + m_TextA[m_iCurrentTextIndex].SetBounds(xuiRect.right,xuiRect.bottom); + + int iControlDetailsIndex=0; + switch(uiVal) + { + case _360_JOY_BUTTON_A: + iControlDetailsIndex=0; + break; + case _360_JOY_BUTTON_B: + iControlDetailsIndex=1; + break; + case _360_JOY_BUTTON_X: + iControlDetailsIndex=2; + break; + case _360_JOY_BUTTON_Y: + iControlDetailsIndex=3; + break; + case _360_JOY_BUTTON_START: + iControlDetailsIndex=4; + break; + case _360_JOY_BUTTON_BACK: + iControlDetailsIndex=5; + break; + case _360_JOY_BUTTON_RB: + iControlDetailsIndex=6; + break; + case _360_JOY_BUTTON_LB: + iControlDetailsIndex=7; + break; + case _360_JOY_BUTTON_RTHUMB: + iControlDetailsIndex=8; + break; + case _360_JOY_BUTTON_LTHUMB: + iControlDetailsIndex=9; + break; + // Look + case _360_JOY_BUTTON_RSTICK_RIGHT: + iControlDetailsIndex=10; + break; + // Move + case _360_JOY_BUTTON_LSTICK_RIGHT: + iControlDetailsIndex=11; + break; + case _360_JOY_BUTTON_RT: + iControlDetailsIndex=12; + break; + // Move + case _360_JOY_BUTTON_LT: + iControlDetailsIndex=13; + break; + case _360_JOY_BUTTON_DPAD_RIGHT: + iControlDetailsIndex=14; + break; + case _360_JOY_BUTTON_DPAD_LEFT: + iControlDetailsIndex=15; + break; + } + + hr=m_FigA[iControlDetailsIndex].SetShow(TRUE); + // position the control depending on the text width + + if(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) + { + // 480 mode - we need to scale the text positions + if(controlDetailsA[iControlDetailsIndex].iAlign==ALIGN_END) + { + vpos.x=(controlDetailsA[iControlDetailsIndex].vPos.x + 5.0f)* vScale.x; + } + else + { + vpos.x=(controlDetailsA[iControlDetailsIndex].vPos.x - 5.0f)* vScale.x - xuiRect.right; + } + + vpos.y=(controlDetailsA[iControlDetailsIndex].vPos.y * vScale.y) - (xuiRect.bottom/2.0f); + } + else + { + if(controlDetailsA[iControlDetailsIndex].iAlign==ALIGN_END) + { + vpos.x=(controlDetailsA[iControlDetailsIndex].vPos.x + 5.0f); + } + else + { + vpos.x=(controlDetailsA[iControlDetailsIndex].vPos.x - 5.0f) - xuiRect.right; + } + + vpos.y=(controlDetailsA[iControlDetailsIndex].vPos.y ) - (xuiRect.bottom/2.0f); + } + + vpos.x=floor(vpos.x); + vpos.y=floor(vpos.y); + vpos.z=0.0f; + + m_TextA[m_iCurrentTextIndex].SetPosition(&vpos); + m_TextA[m_iCurrentTextIndex].SetText(pwchText); + m_TextA[m_iCurrentTextIndex].SetShow(TRUE); + m_iCurrentTextIndex++; +} + +void CScene_Controls::PositionTextDirect(int iPad,int iTextID, int iControlDetailsIndex, bool bShow) +{ + // position the text depending on the control id + //int iTextWidth; + XUIRect xuiRect; + LPCWSTR pwchText; + D3DXVECTOR3 vpos,vScale; + HXUIOBJ hFigGroup; + + if(bShow==false) + { + m_TextA[m_iCurrentTextIndex++].SetShow(FALSE); + return; + } + // get the visual of the fig group and use any scaling in it to adjust the text positions + XuiElementGetChildById(m_hObj,L"FigGroup",&hFigGroup); + XuiElementGetScale(hFigGroup,&vScale); + + // check the width of the control with the text set in it + if(m_TextPresenterA[m_iCurrentTextIndex]==NULL) + { + HXUIOBJ hObj=NULL; + HRESULT hr=XuiControlGetVisual(m_TextA[m_iCurrentTextIndex].m_hObj,&hObj); + hr=XuiElementGetChildById(hObj,L"Text",&m_TextPresenterA[m_iCurrentTextIndex]); + } + + pwchText=app.GetString(iTextID); + HRESULT hr=XuiTextPresenterMeasureText(m_TextPresenterA[m_iCurrentTextIndex], pwchText, &xuiRect); + m_TextA[m_iCurrentTextIndex].SetBounds(xuiRect.right,xuiRect.bottom); + + + + hr=m_FigA[iControlDetailsIndex].SetShow(TRUE); + // position the control depending on the text width + + if(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) + { + // 480 mode - we need to scale the text positions + if(controlDetailsA[iControlDetailsIndex].iAlign==ALIGN_END) + { + vpos.x=(controlDetailsA[iControlDetailsIndex].vPos.x + 5.0f)* vScale.x; + } + else + { + vpos.x=(controlDetailsA[iControlDetailsIndex].vPos.x - 5.0f)* vScale.x - xuiRect.right; + } + + vpos.y=(controlDetailsA[iControlDetailsIndex].vPos.y * vScale.y) - (xuiRect.bottom/2.0f); + } + else + { + if(controlDetailsA[iControlDetailsIndex].iAlign==ALIGN_END) + { + vpos.x=(controlDetailsA[iControlDetailsIndex].vPos.x + 5.0f); + } + else + { + vpos.x=(controlDetailsA[iControlDetailsIndex].vPos.x - 5.0f) - xuiRect.right; + } + + vpos.y=(controlDetailsA[iControlDetailsIndex].vPos.y ) - (xuiRect.bottom/2.0f); + } + + vpos.x=floor(vpos.x); + vpos.y=floor(vpos.y); + vpos.z=0.0f; + + m_TextA[m_iCurrentTextIndex].SetPosition(&vpos); + m_TextA[m_iCurrentTextIndex].SetText(pwchText); + m_TextA[m_iCurrentTextIndex].SetShow(TRUE); + m_iCurrentTextIndex++; +} + +HRESULT CScene_Controls::OnNotifySelChanged( HXUIOBJ hObjSource, XUINotifySelChanged* pNotifySelChangedData, BOOL& bHandled ) +{ + if( ( !m_bIgnoreNotifies )&&( hObjSource==m_pLayoutList->m_hObj ) ) + { + m_iCurrentNavigatedControlsLayout=pNotifySelChangedData->iItem; + PositionAllText(m_iPad); + } + if(pNotifySelChangedData->iOldItem!=-1 && hObjSource==m_SchemeList ) + { + CXuiSceneBase::PlayUISFX(eSFX_Focus); + } + return S_OK; +} + + + + +HRESULT CScene_Controls::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled) +{ + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + // Handle check box changes. + if ( hObjPressed == m_InvertLook.m_hObj ) + { + BOOL bIsChecked = m_InvertLook.IsChecked(); + app.SetGameSettings(m_iPad,eGameSetting_ControlInvertLook,(unsigned char)( bIsChecked ) ); + } + else if ( hObjPressed == m_SouthPaw.m_hObj ) + { + BOOL bIsChecked = m_SouthPaw.IsChecked(); + app.SetGameSettings(m_iPad,eGameSetting_ControlSouthPaw,(unsigned char)( bIsChecked ) ); + PositionAllText(m_iPad); + } + else if( hObjPressed == m_SchemeList) + { + // check what's been selected + app.SetGameSettings(m_iPad,eGameSetting_ControlScheme,(unsigned char)m_SchemeList.GetCurSel()); + LPWSTR layoutString = new wchar_t[ 128 ]; + swprintf( layoutString, 128, L"%ls : %ls", app.GetString( IDS_CURRENT_LAYOUT ),app.GetString(m_iSchemeTextA[m_SchemeList.GetCurSel()]) ); + + XuiControlSetText(m_CurrentLayout,layoutString); + delete [] layoutString; + // and update the highlight on the current selection + for(int i=0;iGetItemCount();i++) + { + m_pLayoutList->SetBorder(i,FALSE); + } + m_pLayoutList->SetBorder(m_SchemeList.GetCurSel(),TRUE); + } + return S_OK; +} + +HRESULT CScene_Controls::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) +{ + bHandled=true; + return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining,32.0f); +} diff --git a/Minecraft.Client/Common/XUI/XUI_HelpControls.h b/Minecraft.Client/Common/XUI/XUI_HelpControls.h new file mode 100644 index 00000000..4d14953b --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_HelpControls.h @@ -0,0 +1,115 @@ +#pragma once + +#include "../media/xuiscene_controls.h" +#include "XUI_CustomMessages.h" + +class CXuiCtrl4JList; + + + +#define MAX_CONTROLS 17 +class CScene_Controls : public CXuiSceneImpl +{ + protected: + // Control and Element wrapper objects. + CXuiControl m_TextA[MAX_CONTROLS]; + HXUIOBJ m_TextPresenterA[MAX_CONTROLS]; + CXuiElement m_FigA[MAX_CONTROLS]; + CXuiList m_SchemeList; + CXuiElement m_Group; + CXuiControl m_BuildVer; + CXuiControl m_CurrentLayout; + CXuiCheckbox m_InvertLook; + CXuiCheckbox m_SouthPaw; + static LPCWSTR m_LayoutNameA[3]; + + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_NOTIFY_SELCHANGED( OnNotifySelChanged ) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + XUI_ON_XM_TRANSITION_START(OnTransitionStart) + + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_SchemeList, m_SchemeList) + MAP_CONTROL(IDC_CurrentLayout, m_CurrentLayout) + + MAP_CONTROL(IDC_XuiBuildVer, m_BuildVer) + MAP_CONTROL(IDC_XuiLabel1, m_TextA[0]) + MAP_CONTROL(IDC_XuiLabel2, m_TextA[1]) + MAP_CONTROL(IDC_XuiLabel3, m_TextA[2]) + MAP_CONTROL(IDC_XuiLabel4, m_TextA[3]) + MAP_CONTROL(IDC_XuiLabel5, m_TextA[4]) + MAP_CONTROL(IDC_XuiLabel6, m_TextA[5]) + MAP_CONTROL(IDC_XuiLabel7, m_TextA[6]) + MAP_CONTROL(IDC_XuiLabel8, m_TextA[7]) + MAP_CONTROL(IDC_XuiLabel9, m_TextA[8]) + MAP_CONTROL(IDC_XuiLabel10, m_TextA[9]) + MAP_CONTROL(IDC_XuiLabel11, m_TextA[10]) + MAP_CONTROL(IDC_XuiLabel12, m_TextA[11]) + MAP_CONTROL(IDC_XuiLabel13, m_TextA[12]) + MAP_CONTROL(IDC_XuiLabel14, m_TextA[13]) + MAP_CONTROL(IDC_XuiLabel15, m_TextA[14]) + MAP_CONTROL(IDC_XuiLabel16, m_TextA[15]) + MAP_CONTROL(IDC_XuiLabel17, m_TextA[16]) + MAP_CONTROL(IDC_FigGroup, m_Group) + MAP_CONTROL(IDC_InvertLook, m_InvertLook) + MAP_CONTROL(IDC_SouthPaw, m_SouthPaw) + BEGIN_MAP_CHILD_CONTROLS(m_Group) + MAP_CONTROL(IDC_A, m_FigA[0]) + MAP_CONTROL(IDC_B, m_FigA[1]) + MAP_CONTROL(IDC_X, m_FigA[2]) + MAP_CONTROL(IDC_Y, m_FigA[3]) + MAP_CONTROL(IDC_Start, m_FigA[4]) + MAP_CONTROL(IDC_Back, m_FigA[5]) + MAP_CONTROL(IDC_RB, m_FigA[6]) + MAP_CONTROL(IDC_LB, m_FigA[7]) + MAP_CONTROL(IDC_RStickButton, m_FigA[8]) + MAP_CONTROL(IDC_LStickButton, m_FigA[9]) + MAP_CONTROL(IDC_RStick, m_FigA[10]) + MAP_CONTROL(IDC_LStick, m_FigA[11]) + MAP_CONTROL(IDC_RT, m_FigA[12]) + MAP_CONTROL(IDC_LT, m_FigA[13]) + MAP_CONTROL(IDC_DpadR, m_FigA[14]) + MAP_CONTROL(IDC_DpadL, m_FigA[15]) + MAP_CONTROL(IDC_Dpad, m_FigA[16]) + END_MAP_CHILD_CONTROLS() + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnNotifySelChanged( HXUIOBJ hObjSource, XUINotifySelChanged* pNotifySelChangedData, BOOL& bHandled ); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled); + HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled); + HRESULT OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ); + + + void PositionText(int iPad,int iTextID, unsigned char ucAction); + void PositionTextDirect(int iPad,int iTextID, int iControlDetailsIndex, bool bShow); + void PositionAllText(int iPad); + + + int m_iCurrentTextIndex; + int m_iCurrentNavigatedControlsLayout; + int m_iSchemeTextA[3]; + int m_nItems; + int m_iPad; + CXuiCtrl4JList *m_pLayoutList; + bool m_bIgnoreNotifies; + D3DXVECTOR3 m_OriginalPosition; + bool m_bCreativeMode; + +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_Controls, L"CScene_Controls", XUI_CLASS_SCENE ) + + + +}; diff --git a/Minecraft.Client/Common/XUI/XUI_HelpCredits.cpp b/Minecraft.Client/Common/XUI/XUI_HelpCredits.cpp new file mode 100644 index 00000000..4a6ce55f --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_HelpCredits.cpp @@ -0,0 +1,688 @@ +#include "stdafx.h" +#include +#include "XUI_HelpCredits.h" + +SCreditTextItemDef CScene_Credits::gs_aCreditDefs[MAX_CREDIT_STRINGS] = +{ + { L"MOJANG", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eExtraLargeText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%s", IDS_CREDITS_ORIGINALDESIGN, NO_TRANSLATED_STRING,eLargeText }, + { L"Markus Persson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%s", IDS_CREDITS_PMPROD, NO_TRANSLATED_STRING,eLargeText }, + { L"Daniel Kaplan", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%s", IDS_CREDITS_RESTOFMOJANG, NO_TRANSLATED_STRING,eMediumText }, + { L"%s", IDS_CREDITS_LEADPC, NO_TRANSLATED_STRING,eLargeText }, + { L"Jens Bergensten", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_JON_KAGSTROM, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_CEO, NO_TRANSLATED_STRING,eLargeText }, + { L"Carl Manneh", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_DOF, NO_TRANSLATED_STRING,eLargeText }, + { L"Lydia Winters", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_WCW, NO_TRANSLATED_STRING,eLargeText }, + { L"Karin Severinsson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_CUSTOMERSUPPORT, NO_TRANSLATED_STRING,eLargeText }, + { L"Marc Watson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%s", IDS_CREDITS_DESPROG, NO_TRANSLATED_STRING,eLargeText }, + { L"Aron Nieminen", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%s", IDS_CREDITS_CHIEFARCHITECT, NO_TRANSLATED_STRING,eLargeText }, + { L"Daniel Frisk", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_CODENINJA, NO_TRANSLATED_STRING,eLargeText }, + { L"%s", IDS_CREDITS_TOBIAS_MOLLSTAM, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_OFFICEDJ, NO_TRANSLATED_STRING,eLargeText }, + { L"Kristoffer Jelbring", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_DEVELOPER, NO_TRANSLATED_STRING,eLargeText }, + { L"Leonard Axelsson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_BULLYCOORD, NO_TRANSLATED_STRING,eLargeText }, + { L"Jakob Porser", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_ARTDEVELOPER, NO_TRANSLATED_STRING,eLargeText }, + { L"Junkboy", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_EXPLODANIM, NO_TRANSLATED_STRING,eLargeText }, + { L"Mattis Grahm", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_CONCEPTART, NO_TRANSLATED_STRING,eLargeText }, + { L"Henrik Petterson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_CRUNCHER, NO_TRANSLATED_STRING,eLargeText }, + { L"Patrick Geuder", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_MUSICANDSOUNDS, NO_TRANSLATED_STRING,eLargeText }, + { L"Daniel Rosenfeld (C418)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"4J Studios", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eExtraLargeText }, + { L"%s", IDS_CREDITS_PROGRAMMING, NO_TRANSLATED_STRING,eLargeText }, + { L"Paddy Burns", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Richard Reavy", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Stuart Ross", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"James Vaughan", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Mark Hughes", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Thomas Kronberg", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Ian le Bruce", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Andy West", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Gordon McLean", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_ART, NO_TRANSLATED_STRING,eLargeText }, + { L"David Keningale", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Pat McGovern", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Alan Redmond", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Julian Laing", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Caitlin Goodale", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Scott Sutherland", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Chris Reeves", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kate Wright", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michael Hansen", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kate Flavell", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Donald Robertson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jamie Keddie", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Thomas Naylor", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Brian Lindsay", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Hannah Watts", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Rebecca O'Neil", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_QA, NO_TRANSLATED_STRING,eLargeText }, + { L"Steven Gary Woodward", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Richard Black", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"George Vaughan", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%s", IDS_CREDITS_SPECIALTHANKS, NO_TRANSLATED_STRING,eLargeText }, + { L"Chris van der Kuyl", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Roni Percy", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Anne Clarke", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Anthony Kent", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Microsoft Studios", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eExtraLargeText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + + { L"Xbox LIVE Arcade Team", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eExtraLargeText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%s", IDS_CREDITS_LEADPRODUCER, NO_TRANSLATED_STRING,eLargeText }, + { L"Roger Carpenter", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_PRODUCER, NO_TRANSLATED_STRING,eLargeText }, + { L"Stuart Platt", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Riccardo Lenzi", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_LEADTESTER, NO_TRANSLATED_STRING,eLargeText }, + { L"Bill Brown (Insight Global)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Brandon McCurry (Insight Global)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Hakim Ronaque, Joe Dunavant", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Paul Loynd, Jeffery Stephens", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Rial Lerum (Xtreme Consulting Group Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_DESIGNTEAM, NO_TRANSLATED_STRING,eLargeText }, + { L"Craig Leigh", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_DEVELOPMENTTEAM, NO_TRANSLATED_STRING,eLargeText }, + { L"Scott Guest", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jeff \"Dextor\" Blazier", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Yukie Yamaguchi", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jason Hewitt", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_RELEASEMANAGEMENT, NO_TRANSLATED_STRING,eLargeText }, + { L"Josh Mulanax", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Shogo Ishii (TekSystems)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Tyler Keenan (Xtreme Consulting Group Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Joshua Bullard (TekSystems)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_EXECPRODUCER, NO_TRANSLATED_STRING,eLargeText }, + { L"Mark Coates", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Avi Ben-Menahem", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Earnest Yuen", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_XBLADIRECTOR, NO_TRANSLATED_STRING,eLargeText }, + { L"Ted Woolsey", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_BIZDEV, NO_TRANSLATED_STRING,eLargeText }, + { L"Cherie Lutz", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Peter Zetterberg", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_PORTFOLIODIRECTOR, NO_TRANSLATED_STRING,eLargeText }, + { L"Chris Charla", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_PRODUCTMANAGER, NO_TRANSLATED_STRING,eLargeText }, + { L"Daniel McConnell", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_MARKETING, NO_TRANSLATED_STRING,eLargeText }, + { L"Brandon Wells", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michael Wolf", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"John Dongelmans", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_COMMUNITYMANAGER, NO_TRANSLATED_STRING,eLargeText }, + { L"Alex Hebert", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_REDMONDLOC, NO_TRANSLATED_STRING,eLargeText }, + { L"Zeb Wedell", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Gabriella Mittiga (Pactera)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Scott Fielding (Global Studio Consulting)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Yong Zhao (Hisoft Envisage Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Shogo Ishii (Insight Global)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_EUROPELOC, NO_TRANSLATED_STRING,eLargeText }, + { L"Gerard Dunne", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Ricardo Cordoba", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Magali Lucchini", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Malika Kherfi", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Lizzy Untermann", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Ian Walsh", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Alfonsina Mossello (Keywords International Ltd)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Marika Mauri (Keywords International Ltd)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Nobuhiro Izumisawa (Keywords International Ltd)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Sebastien Faucon (Keywords International Ltd)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jose Manuel Martinez (Keywords International Ltd)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Montse Garcia (Keywords International Ltd)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_ASIALOC, NO_TRANSLATED_STRING,eLargeText }, + { L"Takashi Sasaki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Changseon Ha", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Shinya Muto (Zip Global Corporation)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Hiroshi Hosoda (Zip Global Corporation)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Natsuko Kudo (Zip Global Corporation)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Yong-Hong Park (Zip Global Corporation)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Yuko Yoshida (Zip Global Corporation)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_USERRESEARCH, NO_TRANSLATED_STRING,eLargeText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"User Research Lead", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"Tim Nichols", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"User Research Engineer", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"Michael Medlock", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kristie Fisher", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%s", IDS_CREDITS_MGSCENTRAL, NO_TRANSLATED_STRING,eLargeText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"Test Team Lead", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"Dan Smith", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_MILESTONEACCEPT, NO_TRANSLATED_STRING,eLargeText }, + { L"Justin Davis (VMC)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Microsoft Studios Sentient Development Team", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"Ellery Charlson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Frank Klier", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jason Ronald", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Cullen Waters", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Steve Jackson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Barath Vasudevan", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Derek Mantey", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Henry Sterchi", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Scott Fintel", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Soren Hannibal Nielsen", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Meetali Goel (Aditi)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Uladzimir Sadouski (Volt)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_SPECIALTHANKS, NO_TRANSLATED_STRING,eLargeText }, + { L"Brianna Witherspoon (Nytec Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jim Pekola (Xtreme Consulting Group Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Chris Henry", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Matt Golz", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Chris Gaffney (Volt)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jared Barnhill (Aditi)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Laura Hawkins", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"2nd Cavalry", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"GTO Bug Bash Team", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Oliver Miyashita", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kevin Salcedo", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Nick Bodenham", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Chris Giggins", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Ben Board", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Peter Choi", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Andy Su (CompuCom Systems Inc.)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"David Boker ", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Josh Bliggenstorfer", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Paul Amer", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Louise Smith", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Karin Behland (Aquent LLC)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"John Bruno", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Phil Spencer", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"John Smith", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Christi Davisson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jacob Farley (Aditi)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Chad Stringer (Collabera)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Rick Rispoli (Collabera)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Test by Experis", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eExtraLargeText }, + { L"%s", IDS_CREDITS_TESTMANAGER, NO_TRANSLATED_STRING,eLargeText }, + { L"Matt Brown", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Gavin Kennedy", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_SRTESTLEAD, NO_TRANSLATED_STRING,eLargeText }, + { L"Lloyd Bell", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Tim Attuquayefio", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_TESTLEAD, NO_TRANSLATED_STRING,eLargeText }, + { L"Byron R. Monzon", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Marta Alombro", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_SDET, NO_TRANSLATED_STRING,eLargeText }, + { L"Valeriy Novytskyy", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_PROJECT, NO_TRANSLATED_STRING,eLargeText }, + { L"Allyson Burk", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"David Scott", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"John Shearer", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_ADDITIONALSTE, NO_TRANSLATED_STRING,eLargeText }, + { L"Chris Merritt", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kimberlee Lyles", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Eric Ranz", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Russ Allen", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_TESTASSOCIATES, NO_TRANSLATED_STRING,eLargeText }, + { L"Michael Arvat", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Josh Breese", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"April Culberson", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jason Fox", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Clayton K. Hopper", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Matthew Howells", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Alan Hume", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jacob Martin", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kevin Lourigan", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Tyler Lovemark", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_RISE_LUGO, NO_TRANSLATED_STRING,eSmallText }, + { L"Ryan Naegeli", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Isaac Price", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Masha Reutovski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Brad Shockey", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jonathan Tote", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Marc Williams", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Gillian Williams", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jeffrey Woito", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Tyler Young", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jae Yslas", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Amanda Swalling", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Ben Dienes", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Chris Kent", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Dustin Lukas", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Emily Lovering", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Nick Fowler", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + // EVEN MORE CREDITS + { L"Test by Lionbridge", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eExtraLargeText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"%s", IDS_CREDITS_TESTMANAGER, NO_TRANSLATED_STRING,eLargeText }, + { L"Blazej Zawadzki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"David Hickey", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_TESTLEAD, NO_TRANSLATED_STRING,eLargeText }, + { L"Jakub Garwacki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kamil Lahti", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Mariusz Gelnicki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Karol Falak", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Lukasz Watroba", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_PROJECT, NO_TRANSLATED_STRING,eLargeText }, + { L"Artur Grochowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Grzegorz Kohorewicz", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Lukasz Derewonko", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michal Celej", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Senior Test Engineers", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"Jakub Rybacki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Mateusz Szymanski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Arkadiusz Szczytowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Rafal Rawski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + + { L"%s", IDS_CREDITS_TESTASSOCIATES, NO_TRANSLATED_STRING,eLargeText }, + { L"Adrian Klepacki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Arkadiusz Kala", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Arkadiusz Sykula", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Bartlomiej Kmita", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jakub Malinowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jan Prejs", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Maciej Urlo", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Maciej Wygoda", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Marcin Piasecki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Marcin Piotrowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Marek Latacz", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michal Biernat", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michal Krupinski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michal Warchal", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michal Wascinski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michal Zbrzezniak", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Milosz Maciejewicz", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Przemyslaw Malinowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Tomasz Dabrowicz", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Tomasz Trzebiatowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + + { L"Adam Bogucki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Aleksander Pietraszak", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Arkadiusz Szczytowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Blazej Kohorewicz", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Damian Mielnik", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Dariusz Nowakowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Dominik Rzeznicki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jacek Piotrowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jakub Rybacki", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jakub Wozniakowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jaroslaw Radzio", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kamil Dabrowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kamil Kaczor", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Karolina Szymanska", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Konrad Mady", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Krzysztof Galazka", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Ludwik Miszta", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Lukasz Kwiatkowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Marcin Krzysiak", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Mateusz Szymanski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michal Maslany", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michal Nyszka", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Norbert Jankowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Piotr Daszewski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Radoslaw Kozlowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Tomasz Kalowski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"%s", IDS_CREDITS_SPECIALTHANKS, NO_TRANSLATED_STRING,eLargeText }, + { L"Adam Keating", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jerzy Tyminski", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Paulina Sliwinska", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Sean Kellogg", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + + { L"Test by Shield", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eExtraLargeText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"GTO Shared Service Test Manager", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"Natahri Felton", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Shield Test Lead", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"Matt Giddings", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Shield IT Support", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"David Grant (Compucom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Primary Team", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eLargeText }, + { L"Alex Chen (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Alex Hunte (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Brian Boye (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Bridgette Cummins (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Chris Carleson (Volt)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Christopher Hermey (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"David Hendrickson (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Ioana Preda (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Jessica Jenkins (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Johnathan Ochs (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Michael Upham (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Nicholas Johansson (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Nicholas Starner (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Torr Vickers (Volt)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Victoria Bruder (CompuCom Systems Inc)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + +}; + +// Table tells us how many text elements of each type are available in the scene. +static const int gs_aNumTextElements[ eNumTextTypes ] = +{ + 3, // CScene_Credits::eExtraLargeText + 5, // CScene_Credits::eLargeText + 5, // CScene_Credits::eMediumText + 15 // CScene_Credits::eSmallText +}; + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_Credits::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + int iPad = *(int *)pInitData->pvInitData; + + MapChildControls(); + + // if we're not in the game, we need to use basescene 0 + if(Minecraft::GetInstance()->level==NULL) + { + iPad=0; + } + + ui.SetTooltips( iPad, -1, IDS_TOOLTIPS_BACK); + + if(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) + { + CREDITS_SCREEN_MIN_Y = 200.0f/1.5f; // Y pos at which credits are removed from top of screen. + CREDITS_SCREEN_MAX_Y = 630.0f/1.5f; // Y pos at which credits appear at bottom of screen. + CREDITS_FADE_HEIGHT = 100.0f/1.5f; // Height over which credits fade in or fade out. + gs_aLineSpace[eExtraLargeText]=53.0f; + gs_aLineSpace[eLargeText]=46.0f; + gs_aLineSpace[eMediumText]=40.0f; + gs_aLineSpace[eSmallText]=21.0f; + } + else + { + CREDITS_SCREEN_MIN_Y = 200.0f; // Y pos at which credits are removed from top of screen. + CREDITS_SCREEN_MAX_Y = 630.0f; // Y pos at which credits appear at bottom of screen. + CREDITS_FADE_HEIGHT = 100.0f; // Height over which credits fade in or fade out. + gs_aLineSpace[eExtraLargeText]=80.0f; + gs_aLineSpace[eLargeText]=70.0f; + gs_aLineSpace[eMediumText]=60.0f; + gs_aLineSpace[eSmallText]=32.0f; + } + + + // Init text elements. + int iIDTag = 1; + LPWSTR idString = new wchar_t[ 32 ]; + + for ( int i = 0; i < eNumTextTypes; ++i ) + { + m_aTextTypes[ i ].m_iNextFreeElement = 0; + m_aTextTypes[ i ].m_iNumUsedElements = 0; + m_aTextTypes[ i ].m_iMaxElements = gs_aNumTextElements[ i ]; + m_aTextTypes[ i ].m_appTextElements = new CXuiControl* [ m_aTextTypes[ i ].m_iMaxElements ]; + + for ( int j = 0; j < m_aTextTypes[ i ].m_iMaxElements; ++j ) + { + swprintf( idString, 32, L"XuiText%d", iIDTag ); + ++iIDTag; + + HXUIOBJ text; + GetChildById( idString, &text ); + + VOID* pTextObj; + XuiObjectFromHandle( text, &pTextObj ); + m_aTextTypes[ i ].m_appTextElements[ j ] = (CXuiControl *)pTextObj; + m_aTextTypes[ i ].m_appTextElements[ j ]->SetShow( false ); + } + } + delete [] idString; + + // How many lines of text are in the credits? + + m_iNumTextDefs = MAX_CREDIT_STRINGS;//sizeof( gs_aCreditDefs ) / sizeof( SCreditTextItemDef ); + + // Are there any additional lines needed for the DLC credits? + m_iNumTextDefs+=app.GetDLCCreditsCount(); + + m_iCurrDefIndex = -1; + m_fMoveSinceLastDef = 0.0f; + m_fMoveToNextDef = 0.0f; + + // Add timer to tick credits update at 60Hz + HRESULT timerResult = SetTimer( CREDITS_TICK_TIMER_ID, ( 1000 / 60 ) ); + assert( timerResult == S_OK ); + + return S_OK; +} + +HRESULT CScene_Credits::OnDestroy() +{ + // Free up memory that we allocated. + for ( int i = 0; i < eNumTextTypes; ++i ) + { + delete [] m_aTextTypes[ i ].m_appTextElements; + } + + return S_OK; +} + +HRESULT CScene_Credits::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + HRESULT hr=S_OK; + + // Explicitly handle B button presses + switch(pInputData->dwKeyCode) + { + + case VK_PAD_B: + case VK_ESCAPE: + app.NavigateBack(pInputData->UserIndex); + rfHandled = TRUE; + break; + } + + + return hr; +} + +HRESULT CScene_Credits::OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) +{ + // ignore any joypads other than the main + BYTE bFocusUser=XuiElementGetFocusUser(pControlNavigateData->hObjSource); + // get the user from the control + /*if(!=ProfileManager.GetLockedProfile()) + { + bHandled=true; + return S_OK; + }*/ + return S_OK; +} + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_Credits::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + + return S_OK; +} + + + +HRESULT CScene_Credits::OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ) +{ + // Update pointer from stick input on timer. + if ( pTimer->nId == CREDITS_TICK_TIMER_ID ) + { + D3DXVECTOR3 vTextPos; + + // Do we need to spawn a new item? + if ( ( m_iCurrDefIndex == -1 ) || ( m_fMoveSinceLastDef >= m_fMoveToNextDef ) ) + { + const SCreditTextItemDef* pDef; + + // Time to create next text item. + ++m_iCurrDefIndex; + + // Wrap back to start. + if ( m_iCurrDefIndex >= m_iNumTextDefs ) + { + m_iCurrDefIndex = 0; + } + + if(m_iCurrDefIndex >= MAX_CREDIT_STRINGS) + { + // DLC credit + pDef = app.GetDLCCredits(m_iCurrDefIndex-MAX_CREDIT_STRINGS); + } + else + { + // Get text def for this item. + pDef = &( gs_aCreditDefs[ m_iCurrDefIndex ] ); + } + + int iNewTextType = ( int )( pDef->m_eType ); + STextType* pTextType = &( m_aTextTypes[ iNewTextType ] ); + + // Are there any text elements available for this item? + if ( pTextType->m_iNumUsedElements < pTextType->m_iMaxElements ) + { + // Get the correct text element to use. + CXuiControl* pElement = pTextType->m_appTextElements[ pTextType->m_iNextFreeElement ]; + + // Set up the new text element. + if ( pDef->m_iStringID[0] == NO_TRANSLATED_STRING ) + { + pElement->SetText( pDef->m_Text ); + } + else // using additional translated string. + { + LPWSTR creditsString = new wchar_t[ 128 ]; + if(pDef->m_iStringID[1]!=NO_TRANSLATED_STRING) + { + swprintf( creditsString, 128, pDef->m_Text, app.GetString( pDef->m_iStringID[0] ), app.GetString( pDef->m_iStringID[1] ) ); + } + else + { + swprintf( creditsString, 128, pDef->m_Text, app.GetString( pDef->m_iStringID[0] ) ); + } + pElement->SetText( creditsString ); + delete [] creditsString; + } + + pElement->SetShow( true ); + pElement->SetOpacity( 0.0f ); + + pElement->GetPosition( &vTextPos ); + vTextPos.y = CREDITS_SCREEN_MAX_Y; + pElement->SetPosition( &vTextPos ); + + // Set next free element of this type. + ++( pTextType->m_iNextFreeElement ); + + if ( pTextType->m_iNextFreeElement >= pTextType->m_iMaxElements ) + { + pTextType->m_iNextFreeElement = 0; + } + + ++pTextType->m_iNumUsedElements; + + int iNextDef = m_iCurrDefIndex + 1; + if ( iNextDef == m_iNumTextDefs ) + { + // Large space before looping back to start of credits. + m_fMoveToNextDef = 400.0f; + } + else if ( iNextDef < MAX_CREDIT_STRINGS ) + { + // Determine space to next item. + m_fMoveToNextDef = gs_aLineSpace[ gs_aCreditDefs[ iNextDef ].m_eType ]; + } + else + { + // Determine space to next item. + m_fMoveToNextDef = gs_aLineSpace[app.GetDLCCredits(iNextDef-MAX_CREDIT_STRINGS)->m_eType]; + } + + m_fMoveSinceLastDef = 0.0f; + } + } + + // Scroll up every active text element. + for ( int i = 0; i < eNumTextTypes; ++i ) + { + STextType* pTextType = &( m_aTextTypes[ i ] ); + + // Process in reverse order from latest one back (so that we can easily remove oldest if it has scrolled off the top). + int iElementIndex = pTextType->m_iNextFreeElement; + + --iElementIndex; + if ( iElementIndex < 0 ) + { + iElementIndex = pTextType->m_iMaxElements - 1; + } + + // For each element that it is use + for ( int j = 0; j < pTextType->m_iNumUsedElements; ++j ) + { + // Get the actual element. + CXuiControl* pElement = pTextType->m_appTextElements[ iElementIndex ]; + + // Scroll element up. + pElement->GetPosition( &vTextPos ); + vTextPos.y -= 1.0f; + pElement->SetPosition( &vTextPos ); + + // Is it off the top? + if ( vTextPos.y < CREDITS_SCREEN_MIN_Y ) + { + // Remove it. + pElement->SetShow( false ); + --( pTextType->m_iNumUsedElements ); + } + else + { + // Set transparency to fade in at bottom or out at top. + float fOpacity = 1.0f; + if ( vTextPos.y < ( CREDITS_SCREEN_MIN_Y + CREDITS_FADE_HEIGHT ) ) + { + fOpacity = ( vTextPos.y - CREDITS_SCREEN_MIN_Y ) / CREDITS_FADE_HEIGHT; + } + else if ( vTextPos.y > ( CREDITS_SCREEN_MAX_Y - CREDITS_FADE_HEIGHT ) ) + { + fOpacity = ( CREDITS_SCREEN_MAX_Y - vTextPos.y ) / CREDITS_FADE_HEIGHT; + } + pElement->SetOpacity( fOpacity ); + } + + // Determine next element index. + --iElementIndex; + if ( iElementIndex < 0 ) + { + iElementIndex = pTextType->m_iMaxElements - 1; + } + } + } + + m_fMoveSinceLastDef += 1.0f; + + // This message has been dealt with, don't pass it on further. + bHandled = TRUE; + } + return S_OK; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_HelpCredits.h b/Minecraft.Client/Common/XUI/XUI_HelpCredits.h new file mode 100644 index 00000000..e973286e --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_HelpCredits.h @@ -0,0 +1,73 @@ +#pragma once + +#define CREDITS_TICK_TIMER_ID (6) // Arbitrary timer ID used to tick credits for scrolling. + +#define MAX_CREDIT_STRINGS 360 +// 213 + +#include "..\UI\UIStructs.h" + +class CScene_Credits : public CXuiSceneImpl +{ +protected: + // Control and Element wrapper objects. + + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_CONTROL_NAVIGATE(OnControlNavigate) + XUI_ON_XM_TIMER( OnTimer ) + XUI_ON_XM_DESTROY( OnDestroy ) + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled); + HRESULT OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled); + HRESULT OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ); + HRESULT OnDestroy(); + +private: + + + struct STextType + { + // Array of pointers to text elements. + CXuiControl** m_appTextElements; + + int m_iNextFreeElement; + int m_iNumUsedElements; + int m_iMaxElements; + }; + + STextType m_aTextTypes[ eNumTextTypes ]; + + int m_iCurrDefIndex; // Index of last created text def. + float m_fMoveSinceLastDef; // How far have credits scrolled since we last created a new text item. + float m_fMoveToNextDef; // How far we need to move before starting next text item. + int m_iNumTextDefs; // Total number of text defs in the credits. + + float CREDITS_SCREEN_MIN_Y;// ( 200.0f ) // Y pos at which credits are removed from top of screen. + float CREDITS_SCREEN_MAX_Y;// ( 630.0f ) // Y pos at which credits appear at bottom of screen. + float CREDITS_FADE_HEIGHT;// ( 100.0f ) // Height over which credits fade in or fade out. + + float gs_aLineSpace[ eNumTextTypes ]; + +public: + static SCreditTextItemDef gs_aCreditDefs[MAX_CREDIT_STRINGS]; + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_Credits, L"CScene_Credits", XUI_CLASS_SCENE ) + + + +}; + diff --git a/Minecraft.Client/Common/XUI/XUI_HelpHowToPlay.cpp b/Minecraft.Client/Common/XUI/XUI_HelpHowToPlay.cpp new file mode 100644 index 00000000..5c750d03 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_HelpHowToPlay.cpp @@ -0,0 +1,238 @@ +#include "stdafx.h" + +#include +#include "..\XUI\XUI_HelpHowToPlay.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" + +static SHowToPlayPageDef gs_aPageDefs[ eHowToPlay_NumPages ] = +{ + { eHowToPlay_WhatsNew, IDS_HOW_TO_PLAY_WHATSNEW, eHowToPlay_ImageNone, 0, 0}, // eHowToPlay_WhatsNew + { eHowToPlay_TextBasics, IDS_HOW_TO_PLAY_BASICS, eHowToPlay_ImageNone, 0, 0}, // eHowToPlay_Basics + { eHowToPlay_TextMultiplayer, IDS_HOW_TO_PLAY_MULTIPLAYER, eHowToPlay_ImageNone, 0, 0}, // eHowToPlay_Multiplayer + { eHowToPlay_TextHUD, IDS_HOW_TO_PLAY_HUD, eHowToPlay_ImageHUD, 0, 0}, // eHowToPlay_HUD + { eHowToPlay_TextCreative, IDS_HOW_TO_PLAY_CREATIVE, eHowToPlay_ImageCreative, eHowToPlay_LabelCreativeInventory, 1}, // eHowToPlay_Creative + { eHowToPlay_TextInventory, IDS_HOW_TO_PLAY_INVENTORY, eHowToPlay_ImageInventory, eHowToPlay_LabelIInventory, 1}, // eHowToPlay_Inventory + { eHowToPlay_TextSmallChest, IDS_HOW_TO_PLAY_CHEST, eHowToPlay_ImageChest, eHowToPlay_LabelSCInventory, 2}, // eHowToPlay_Chest + { eHowToPlay_TextLargeChest, IDS_HOW_TO_PLAY_LARGECHEST, eHowToPlay_ImageLargeChest, eHowToPlay_LabelLCInventory, 2}, // eHowToPlay_LargeChest + { eHowToPlay_TextEnderchest, IDS_HOW_TO_PLAY_ENDERCHEST, eHowToPlay_ImageEnderChest, 0, 0}, // eHowToPlay_EnderChest + { eHowToPlay_TextCrafting, IDS_HOW_TO_PLAY_CRAFTING, eHowToPlay_ImageInventoryCrafting, eHowToPlay_LabelCItem, 3}, // eHowToPlay_InventoryCrafting + { eHowToPlay_TextCraftTable, IDS_HOW_TO_PLAY_CRAFT_TABLE, eHowToPlay_ImageCraftingTable, eHowToPlay_LabelCTItem, 3}, // eHowToPlay_CraftTable + { eHowToPlay_TextFurnace, IDS_HOW_TO_PLAY_FURNACE, eHowToPlay_ImageFurnace, eHowToPlay_LabelFFuel, 4}, // eHowToPlay_Furnace + { eHowToPlay_TextDispenser, IDS_HOW_TO_PLAY_DISPENSER, eHowToPlay_ImageDispenser, eHowToPlay_LabelDText, 2}, // eHowToPlay_Dispenser + { eHowToPlay_TextBrewing, IDS_HOW_TO_PLAY_BREWING, eHowToPlay_ImageBrewing, eHowToPlay_LabelBBrew, 2}, // eHowToPlay_Brewing + { eHowToPlay_TextEnchantment, IDS_HOW_TO_PLAY_ENCHANTMENT, eHowToPlay_ImageEnchantment, eHowToPlay_LabelEEnchant, 2}, // eHowToPlay_Enchantment + { eHowToPlay_TextAnvil, IDS_HOW_TO_PLAY_ANVIL, eHowToPlay_ImageAnvil, eHowToPlay_LabelAnvil_Inventory, 3}, // eHowToPlay_Anvil + { eHowToPlay_TextFarmingAnimals,IDS_HOW_TO_PLAY_FARMANIMALS, eHowToPlay_ImageFarmingAnimals, 0, 0}, // eHowToPlay_Farming + { eHowToPlay_TextBreeding, IDS_HOW_TO_PLAY_BREEDANIMALS, eHowToPlay_ImageBreeding, 0, 0}, // eHowToPlay_Breeding + { eHowToPlay_TextTrading, IDS_HOW_TO_PLAY_TRADING, eHowToPlay_ImageTrading, eHowToPlay_LabelTrading_Inventory, 5}, // eHowToPlay_Trading + { eHowToPlay_TextNetherPortal, IDS_HOW_TO_PLAY_NETHERPORTAL, eHowToPlay_ImageNetherPortal, 0, 0}, // eHowToPlay_NetherPortal + { eHowToPlay_TextTheEnd, IDS_HOW_TO_PLAY_THEEND, eHowToPlay_ImageTheEnd, 0, 0}, // eHowToPlay_TheEnd + { eHowToPlay_TextSocialMedia, IDS_HOW_TO_PLAY_SOCIALMEDIA, eHowToPlay_ImageNone, 0, 0}, // eHowToPlay_SocialMedia + { eHowToPlay_TextBanList, IDS_HOW_TO_PLAY_BANLIST, eHowToPlay_ImageNone, 0, 0}, // eHowToPlay_BanList + { eHowToPlay_TextHostOptions, IDS_HOW_TO_PLAY_HOSTOPTIONS, eHowToPlay_ImageNone, 0, 0}, // eHowToPlay_HostOptions +}; + + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_HowToPlay::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + // Extract pad and required page from init data. We just put the data into the pointer rather than using it as an address. + size_t uiInitData = ( size_t )( pInitData->pvInitData ); + + m_iPad = ( int )( ( short )( uiInitData & 0xFFFF ) ); + EHowToPlayPage eStartPage = ( EHowToPlayPage )( ( uiInitData >> 16 ) & 0xFFF ); // Ignores MSB which is set to 1! + + TelemetryManager->RecordMenuShown(m_iPad, eUIScene_HowToPlay, (ETelemetry_HowToPlay_SubMenuId)eStartPage); + + MapChildControls(); + + wstring wsTemp, inventoryString = app.GetString(IDS_INVENTORY); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelCTItem],app.GetString(IDS_ITEM_HATCHET_WOOD)); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelCTGroup],app.GetString(IDS_GROUPNAME_TOOLS)); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelCTInventory3x3],inventoryString.c_str()); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelCItem],app.GetString(IDS_TILE_WORKBENCH)); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelCGroup],app.GetString(IDS_GROUPNAME_STRUCTURES)); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelCInventory2x2],inventoryString.c_str()); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelFFuel],app.GetString(IDS_FUEL)); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelFInventory],inventoryString.c_str()); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelFIngredient],app.GetString(IDS_INGREDIENT)); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelFChest],app.GetString(IDS_FURNACE)); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelLCInventory],inventoryString.c_str()); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelCreativeInventory],app.GetString(IDS_GROUPNAME_BUILDING_BLOCKS)); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelLCChest],app.GetString(IDS_CHEST)); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelSCInventory],inventoryString.c_str()); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelSCChest],app.GetString(IDS_CHEST)); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelIInventory],inventoryString.c_str()); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelDInventory],inventoryString.c_str()); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelDText],app.GetString(IDS_DISPENSER)); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelEEnchant],app.GetString(IDS_ENCHANT)); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelEInventory],inventoryString.c_str()); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelBBrew],app.GetString(IDS_BREWING_STAND)); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelBInventory],inventoryString.c_str()); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelAnvil_Inventory], inventoryString.c_str()); + + wsTemp = app.GetString(IDS_REPAIR_COST); + wsTemp.replace( wsTemp.find(L"%d"), 2, wstring(L"8") ); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelAnvil_Cost], wsTemp.c_str()); + + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelAnvil_ARepairAndName], app.GetString(IDS_REPAIR_AND_NAME)); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelTrading_Inventory], inventoryString.c_str()); + //XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelTrading_Offer2], app.GetString(IDS_ITEM_HATCHET_DIAMOND)); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelTrading_Offer1], app.GetString(IDS_ITEM_EMERALD)); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelTrading_NeededForTrade], app.GetString(IDS_REQUIRED_ITEMS_FOR_TRADE)); + + wsTemp = app.GetString(IDS_VILLAGER_OFFERS_ITEM); + wsTemp = replaceAll(wsTemp,L"{*VILLAGER_TYPE*}",app.GetString(IDS_VILLAGER_PRIEST)); + wsTemp.replace(wsTemp.find(L"%s"),2, app.GetString(IDS_TILE_LIGHT_GEM)); + XuiControlSetText(m_aLabelControls[ eHowToPlay_LabelTrading_VillagerOffers], wsTemp.c_str()); + + if(app.GetLocalPlayerCount()>1) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + } + + + StartPage( eStartPage ); + + return S_OK; +} + +HRESULT CScene_HowToPlay::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + // Explicitly handle B button presses + switch(pInputData->dwKeyCode) + { + case VK_PAD_B: + case VK_ESCAPE: + { + app.NavigateBack(pInputData->UserIndex); + rfHandled = TRUE; + } + break; + case VK_PAD_A: + { + // Next page + int iNextPage = ( int )( m_eCurrPage ) + 1; + if ( iNextPage != eHowToPlay_NumPages ) + { + StartPage( ( EHowToPlayPage )( iNextPage ) ); + CXuiSceneBase::PlayUISFX(eSFX_Press); + } + rfHandled = TRUE; + } + break; + case VK_PAD_X: + { + // Next page + int iPrevPage = ( int )( m_eCurrPage ) - 1; + if ( iPrevPage >= 0 ) + { + StartPage( ( EHowToPlayPage )( iPrevPage ) ); + CXuiSceneBase::PlayUISFX(eSFX_Press); + } + rfHandled = TRUE; + } + break; + } + return S_OK; +} + + +void CScene_HowToPlay::StartPage( EHowToPlayPage ePage ) +{ + int iBaseSceneUser; + // if we're not in the game, we need to use basescene 0 + if(Minecraft::GetInstance()->level==NULL) + { + iBaseSceneUser=DEFAULT_XUI_MENU_USER; + } + else + { + iBaseSceneUser=m_iPad; + } + m_eCurrPage = ePage; + + // Turn off everything. + for ( int i = 0; i < eHowToPlay_NumTexts; ++i ) + { + m_aTextControls[ i ].SetShow( FALSE ); + } + for ( int i = 0; i < eHowToPlay_NumImages; ++i ) + { + m_aImageControls[ i ].SetShow( FALSE ); + } + for ( int i = 0; i < eHowToPlay_NumLabels; ++i ) + { + m_aLabelControls[ i ].SetShow( FALSE ); + } + + // Turn on just what we need for this screen. + SHowToPlayPageDef* pDef = &( gs_aPageDefs[ m_eCurrPage ] ); + + if ( pDef->m_iTextControlIndex != eHowToPlay_TextNone ) + { + // Replace button identifiers in the text with actual button images. + wstring replacedText = app.FormatHTMLString(m_iPad, app.GetString( pDef->m_iTextStringID )); + + // 4J-PB - replace the title with the platform specific title, and the platform name + replacedText = replaceAll(replacedText,L"{*PLATFORM_NAME*}",app.GetString(IDS_PLATFORM_NAME)); + replacedText = replaceAll(replacedText,L"{*BACK_BUTTON*}",app.GetString(IDS_BACK_BUTTON)); + replacedText = replaceAll(replacedText,L"{*DISABLES_ACHIEVEMENTS*}",app.GetString(IDS_HOST_OPTION_DISABLES_ACHIEVEMENTS)); + + // Set the text colour + wstring finalText(replacedText.c_str() ); + wchar_t startTags[64]; + swprintf(startTags,64,L"",app.GetHTMLColour(eHTMLColor_White)); + finalText = startTags + finalText; + + // Set the text in the xui scene. + m_aTextControls[ pDef->m_iTextControlIndex ].SetText( finalText.c_str() ); + + // Make it visible. + m_aTextControls[ pDef->m_iTextControlIndex ].SetShow( TRUE ); + + XuiElementSetUserFocus(m_aTextControls[ pDef->m_iTextControlIndex ].m_hObj, m_iPad); + } + + if(pDef->m_iLabelCount!=0) + { + for(int i=pDef->m_iLabelStartIndex;i<(pDef->m_iLabelStartIndex+pDef->m_iLabelCount);i++) + { + m_aLabelControls[i].SetShow( TRUE ); + } + } + + if ( pDef->m_iImageControlIndex != eHowToPlay_ImageNone ) + { + m_aImageControls[ pDef->m_iImageControlIndex ].SetShow( TRUE ); + } + + // Tool tips. + int iPage = ( int )( m_eCurrPage ); + if ( iPage == 0 ) + { + // No previous page. + ui.SetTooltips( iBaseSceneUser, IDS_HOW_TO_PLAY_NEXT, IDS_TOOLTIPS_BACK, -1 ); + } + else if ( ( iPage + 1 ) == eHowToPlay_NumPages ) + { + // No next page. + ui.SetTooltips( iBaseSceneUser, -1, IDS_TOOLTIPS_BACK, IDS_HOW_TO_PLAY_PREV ); + } + else + { + ui.SetTooltips( iBaseSceneUser, IDS_HOW_TO_PLAY_NEXT, IDS_TOOLTIPS_BACK, IDS_HOW_TO_PLAY_PREV ); + } + + TelemetryManager->RecordMenuShown(m_iPad, eUIScene_HowToPlay, (ETelemetry_HowToPlay_SubMenuId)ePage); +} + +HRESULT CScene_HowToPlay::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) +{ + bHandled=true; + return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining); +} diff --git a/Minecraft.Client/Common/XUI/XUI_HelpHowToPlay.h b/Minecraft.Client/Common/XUI/XUI_HelpHowToPlay.h new file mode 100644 index 00000000..8a37e925 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_HelpHowToPlay.h @@ -0,0 +1,217 @@ +#pragma once + +#include "../media/xuiscene_howtoplay.h" +#include "XUI_CustomMessages.h" + +enum EHowToPlayTextControls +{ + eHowToPlay_TextNone = -1, + eHowToPlay_TextWhatsNew = 0, + eHowToPlay_TextBasics, + eHowToPlay_TextMultiplayer, + eHowToPlay_TextHUD, + eHowToPlay_TextCreative, + eHowToPlay_TextInventory, + eHowToPlay_TextSmallChest, + eHowToPlay_TextLargeChest, + eHowToPlay_TextEnderchest, + eHowToPlay_TextCrafting, + eHowToPlay_TextCraftTable, + eHowToPlay_TextFurnace, + eHowToPlay_TextDispenser, + eHowToPlay_TextBrewing, + eHowToPlay_TextEnchantment, + eHowToPlay_TextAnvil, + eHowToPlay_TextFarmingAnimals, + eHowToPlay_TextBreeding, + eHowToPlay_TextTrading, + eHowToPlay_TextNetherPortal, + eHowToPlay_TextTheEnd, + eHowToPlay_TextSocialMedia, + eHowToPlay_TextBanList, + eHowToPlay_TextHostOptions, + eHowToPlay_NumTexts +}; + +enum EHowToPlayImageControls +{ + eHowToPlay_ImageNone = -1, + eHowToPlay_ImageHUD = 0, + eHowToPlay_ImageCreative, + eHowToPlay_ImageInventory, + eHowToPlay_ImageChest, + eHowToPlay_ImageLargeChest, + eHowToPlay_ImageEnderChest, + eHowToPlay_ImageInventoryCrafting, + eHowToPlay_ImageCraftingTable, + eHowToPlay_ImageFurnace, + eHowToPlay_ImageDispenser, + eHowToPlay_ImageBrewing, + eHowToPlay_ImageEnchantment, + eHowToPlay_ImageAnvil, + eHowToPlay_ImageFarmingAnimals, + eHowToPlay_ImageBreeding, + eHowToPlay_ImageTrading, + eHowToPlay_ImageNetherPortal, + eHowToPlay_ImageTheEnd, + eHowToPlay_NumImages +}; + +enum EHowToPlayLabelControls +{ + eHowToPlay_LabelNone = -1, + eHowToPlay_LabelIInventory =0, + eHowToPlay_LabelSCInventory , + eHowToPlay_LabelSCChest , + eHowToPlay_LabelLCInventory , + eHowToPlay_LabelLCChest , + eHowToPlay_LabelCItem , + eHowToPlay_LabelCGroup , + eHowToPlay_LabelCInventory2x2 , + eHowToPlay_LabelCTItem , + eHowToPlay_LabelCTGroup , + eHowToPlay_LabelCTInventory3x3 , + eHowToPlay_LabelFFuel , + eHowToPlay_LabelFInventory , + eHowToPlay_LabelFIngredient , + eHowToPlay_LabelFChest , + eHowToPlay_LabelDText , + eHowToPlay_LabelDInventory , + eHowToPlay_LabelCreativeInventory, + eHowToPlay_LabelEEnchant, + eHowToPlay_LabelEInventory, + eHowToPlay_LabelBBrew, + eHowToPlay_LabelBInventory, + eHowToPlay_LabelAnvil_Inventory, + eHowToPlay_LabelAnvil_Cost, + eHowToPlay_LabelAnvil_ARepairAndName, + eHowToPlay_LabelTrading_Inventory, + eHowToPlay_LabelTrading_Offer2, + eHowToPlay_LabelTrading_Offer1, + eHowToPlay_LabelTrading_NeededForTrade, + eHowToPlay_LabelTrading_VillagerOffers, + eHowToPlay_NumLabels +}; + +struct SHowToPlayPageDef +{ + int m_iTextControlIndex; // eHowToPlay_TextNone if not used. + int m_iTextStringID; // -1 if not used. + int m_iImageControlIndex; // eHowToPlay_ImageNone if not used. + int m_iLabelStartIndex; // index of the labels if there are any for the page + int m_iLabelCount; +}; + +class CScene_HowToPlay : public CXuiSceneImpl +{ +protected: + int m_iPad; + D3DXVECTOR3 m_OriginalPosition; + EHowToPlayPage m_eCurrPage; + + // Control and Element wrapper objects. + CXuiHtmlElement m_aTextControls[ eHowToPlay_NumTexts ]; + CXuiControl m_aImageControls[ eHowToPlay_NumImages ]; + CXuiControl m_aLabelControls[ eHowToPlay_NumLabels ]; + + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_XuiHtmlControlMultiplayer, m_aTextControls[ eHowToPlay_TextMultiplayer ] ) + MAP_CONTROL(IDC_XuiHtmlControlBasics, m_aTextControls[ eHowToPlay_TextBasics ] ) + MAP_CONTROL(IDC_XuiHtmlControlHUD, m_aTextControls[ eHowToPlay_TextHUD ] ) + MAP_CONTROL(IDC_XuiHtmlControlCreative, m_aTextControls[ eHowToPlay_TextCreative ] ) + MAP_CONTROL(IDC_XuiHtmlControlInventory, m_aTextControls[ eHowToPlay_TextInventory ] ) + MAP_CONTROL(IDC_XuiHtmlControlChest, m_aTextControls[ eHowToPlay_TextSmallChest ] ) + MAP_CONTROL(IDC_XuiHtmlControlLargeChest, m_aTextControls[ eHowToPlay_TextLargeChest ] ) + MAP_CONTROL(IDC_XuiHtmlControlEnderchest, m_aTextControls[ eHowToPlay_TextEnderchest ] ) + MAP_CONTROL(IDC_XuiHtmlControlCrafting, m_aTextControls[ eHowToPlay_TextCrafting ] ) + MAP_CONTROL(IDC_XuiHtmlControlCraftingTable, m_aTextControls[ eHowToPlay_TextCraftTable ] ) + MAP_CONTROL(IDC_XuiHtmlControlFurnace, m_aTextControls[ eHowToPlay_TextFurnace ] ) + MAP_CONTROL(IDC_XuiHtmlControlDispenser, m_aTextControls[ eHowToPlay_TextDispenser ] ) + MAP_CONTROL(IDC_XuiHtmlControlBrewing, m_aTextControls[ eHowToPlay_TextBrewing ] ) + MAP_CONTROL(IDC_XuiHtmlControlEnchantment, m_aTextControls[ eHowToPlay_TextEnchantment ] ) + MAP_CONTROL(IDC_XuiHtmlControlAnvil, m_aTextControls[ eHowToPlay_TextAnvil ] ) + MAP_CONTROL(IDC_XuiHtmlControlFarmingAnimals, m_aTextControls[ eHowToPlay_TextFarmingAnimals ] ) + MAP_CONTROL(IDC_XuiHtmlControlBreeding, m_aTextControls[ eHowToPlay_TextBreeding ] ) + MAP_CONTROL(IDC_XuiHtmlControlTrading, m_aTextControls[ eHowToPlay_TextTrading ] ) + MAP_CONTROL(IDC_XuiHtmlControlNetherPortal, m_aTextControls[ eHowToPlay_TextNetherPortal ] ) + MAP_CONTROL(IDC_XuiHtmlControlTheEnd, m_aTextControls[ eHowToPlay_TextTheEnd ] ) + MAP_CONTROL(IDC_XuiHtmlControlSocialMedia, m_aTextControls[ eHowToPlay_TextSocialMedia ] ) + MAP_CONTROL(IDC_XuiHtmlControlBanList, m_aTextControls[ eHowToPlay_TextBanList ] ) + MAP_CONTROL(IDC_XuiHtmlControlWhatsNew, m_aTextControls[ eHowToPlay_TextWhatsNew ] ) + MAP_CONTROL(IDC_XuiHtmlControlHostOptions, m_aTextControls[ eHowToPlay_TextHostOptions] ) + + MAP_CONTROL(IDC_XuiImageHUD, m_aImageControls[ eHowToPlay_ImageHUD ] ) + MAP_CONTROL(IDC_XuiImageCreative, m_aImageControls[ eHowToPlay_ImageCreative ] ) + MAP_CONTROL(IDC_XuiImageInventory, m_aImageControls[ eHowToPlay_ImageInventory ] ) + MAP_CONTROL(IDC_XuiImageChest, m_aImageControls[ eHowToPlay_ImageChest ] ) + MAP_CONTROL(IDC_XuiImageLargeChest, m_aImageControls[ eHowToPlay_ImageLargeChest ] ) + MAP_CONTROL(IDC_XuiImageEnderchest, m_aImageControls[ eHowToPlay_ImageEnderChest ] ) + MAP_CONTROL(IDC_XuiImageCrafting, m_aImageControls[ eHowToPlay_ImageInventoryCrafting ] ) + MAP_CONTROL(IDC_XuiImageCraftingTable, m_aImageControls[ eHowToPlay_ImageCraftingTable ] ) + MAP_CONTROL(IDC_XuiImageFurnace, m_aImageControls[ eHowToPlay_ImageFurnace ] ) + MAP_CONTROL(IDC_XuiImageDispenser, m_aImageControls[ eHowToPlay_ImageDispenser ] ) + MAP_CONTROL(IDC_XuiImageBrewing, m_aImageControls[ eHowToPlay_ImageBrewing ] ) + MAP_CONTROL(IDC_XuiImageEnchantment, m_aImageControls[ eHowToPlay_ImageEnchantment ] ) + MAP_CONTROL(IDC_XuiImageAnvil, m_aImageControls[ eHowToPlay_ImageAnvil ] ) + MAP_CONTROL(IDC_XuiImageBreeding, m_aImageControls[ eHowToPlay_ImageBreeding ] ) + MAP_CONTROL(IDC_XuiImageFarmingAnimals, m_aImageControls[ eHowToPlay_ImageFarmingAnimals ] ) + MAP_CONTROL(IDC_XuiImageTrading, m_aImageControls[ eHowToPlay_ImageTrading ] ) + MAP_CONTROL(IDC_XuiImageNetherPortal, m_aImageControls[ eHowToPlay_ImageNetherPortal ] ) + MAP_CONTROL(IDC_XuiImageTheEnd, m_aImageControls[ eHowToPlay_ImageTheEnd ] ) + + MAP_CONTROL(IDC_CTItem, m_aLabelControls[ eHowToPlay_LabelCTItem ] ) + MAP_CONTROL(IDC_CTGroup, m_aLabelControls[ eHowToPlay_LabelCTGroup ] ) + MAP_CONTROL(IDC_CTInventory3x3, m_aLabelControls[ eHowToPlay_LabelCTInventory3x3 ] ) + MAP_CONTROL(IDC_CItem, m_aLabelControls[ eHowToPlay_LabelCItem ] ) + MAP_CONTROL(IDC_CGroup, m_aLabelControls[ eHowToPlay_LabelCGroup ] ) + MAP_CONTROL(IDC_CInventory, m_aLabelControls[ eHowToPlay_LabelCInventory2x2 ] ) + MAP_CONTROL(IDC_FFuel, m_aLabelControls[ eHowToPlay_LabelFFuel ] ) + MAP_CONTROL(IDC_FInventory, m_aLabelControls[ eHowToPlay_LabelFInventory ] ) + MAP_CONTROL(IDC_FIngredient, m_aLabelControls[ eHowToPlay_LabelFIngredient ] ) + MAP_CONTROL(IDC_FChest, m_aLabelControls[ eHowToPlay_LabelFChest ] ) + MAP_CONTROL(IDC_LCInventory, m_aLabelControls[ eHowToPlay_LabelLCInventory ] ) + MAP_CONTROL(IDC_CIGroup, m_aLabelControls[ eHowToPlay_LabelCreativeInventory ] ) + MAP_CONTROL(IDC_LCChest, m_aLabelControls[ eHowToPlay_LabelLCChest ] ) + MAP_CONTROL(IDC_SCInventory, m_aLabelControls[ eHowToPlay_LabelSCInventory ] ) + MAP_CONTROL(IDC_SCChest, m_aLabelControls[ eHowToPlay_LabelSCChest ] ) + MAP_CONTROL(IDC_IInventory, m_aLabelControls[ eHowToPlay_LabelIInventory ] ) + MAP_CONTROL(IDC_DInventory, m_aLabelControls[ eHowToPlay_LabelDInventory ] ) + MAP_CONTROL(IDC_DText, m_aLabelControls[ eHowToPlay_LabelDText ] ) + MAP_CONTROL(IDC_EEnchant, m_aLabelControls[ eHowToPlay_LabelEEnchant ] ) + MAP_CONTROL(IDC_EInventory, m_aLabelControls[ eHowToPlay_LabelEInventory ] ) + MAP_CONTROL(IDC_BBrew, m_aLabelControls[ eHowToPlay_LabelBBrew ] ) + MAP_CONTROL(IDC_BInventory, m_aLabelControls[ eHowToPlay_LabelBInventory ] ) + MAP_CONTROL(IDC_AInventory, m_aLabelControls[ eHowToPlay_LabelAnvil_Inventory ] ) + MAP_CONTROL(IDC_ACost, m_aLabelControls[ eHowToPlay_LabelAnvil_Cost ] ) + MAP_CONTROL(IDC_ARepairAndName, m_aLabelControls[ eHowToPlay_LabelAnvil_ARepairAndName ] ) + MAP_CONTROL(IDC_TInventory, m_aLabelControls[ eHowToPlay_LabelTrading_Inventory ] ) + //MAP_CONTROL(IDC_TOffer2Label, m_aLabelControls[ eHowToPlay_LabelTrading_Offer2 ] ) + MAP_CONTROL(IDC_TOffer1Label, m_aLabelControls[ eHowToPlay_LabelTrading_Offer1 ] ) + MAP_CONTROL(IDC_TNeededForTrade, m_aLabelControls[ eHowToPlay_LabelTrading_NeededForTrade ] ) + MAP_CONTROL(IDC_TVillagerOffers, m_aLabelControls[ eHowToPlay_LabelTrading_VillagerOffers ] ) + + + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled); + + void StartPage( EHowToPlayPage ePage ); +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_HowToPlay, L"CScene_HowToPlay", XUI_CLASS_SCENE ) + + + +}; diff --git a/Minecraft.Client/Common/XUI/XUI_Helper.h b/Minecraft.Client/Common/XUI/XUI_Helper.h new file mode 100644 index 00000000..cb476185 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Helper.h @@ -0,0 +1,38 @@ +#pragma once + +#define BEGIN_CONTROL_MAP() \ + HRESULT MapChildControls() \ + { \ + HRESULT hr = S_OK; \ + CXuiElement e = m_hObj; \ + + + +#define MAP_CONTROL(name, member) \ + hr = e.GetChildById(name, &member); \ + assert(hr==0); \ + +#define BEGIN_MAP_CHILD_CONTROLS( member ) \ + { \ + CXuiElement tempE = e; \ + e = member; \ + +#define END_MAP_CHILD_CONTROLS() \ + e = tempE; \ + } \ + + +#define MAP_OVERRIDE(name, member) \ + { \ + HXUIOBJ h; \ + hr = e.GetChildById(name, &h); \ + assert(hr==0); \ + hr = XuiObjectFromHandle(h, reinterpret_cast(&member)); \ + assert(hr==0); \ + } \ + + +#define END_CONTROL_MAP() \ + return hr; \ + } \ + diff --git a/Minecraft.Client/Common/XUI/XUI_HowToPlayMenu.cpp b/Minecraft.Client/Common/XUI/XUI_HowToPlayMenu.cpp new file mode 100644 index 00000000..14046f20 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_HowToPlayMenu.cpp @@ -0,0 +1,232 @@ +#include "stdafx.h" + +#include +#include "..\XUI\XUI_HowToPlayMenu.h" +#include "..\XUI\XUI_HelpHowToPlay.h" + +// strings for buttons in the list +unsigned int CScene_HowToPlayMenu::m_uiHTPButtonNameA[]= +{ + IDS_HOW_TO_PLAY_MENU_WHATSNEW, // eHTPButton_WhatsNew + IDS_HOW_TO_PLAY_MENU_BASICS, // eHTPButton_Basics, + IDS_HOW_TO_PLAY_MENU_MULTIPLAYER, // eHTPButton_Multiplayer + IDS_HOW_TO_PLAY_MENU_HUD, // eHTPButton_Hud, + IDS_HOW_TO_PLAY_MENU_CREATIVE, // eHTPButton_Creative, + IDS_HOW_TO_PLAY_MENU_INVENTORY, // eHTPButton_Inventory, + IDS_HOW_TO_PLAY_MENU_CHESTS, // eHTPButton_Chest, + IDS_HOW_TO_PLAY_MENU_CRAFTING, // eHTPButton_Crafting, + IDS_HOW_TO_PLAY_MENU_FURNACE, // eHTPButton_Furnace, + IDS_HOW_TO_PLAY_MENU_DISPENSER, // eHTPButton_Dispenser, + + IDS_HOW_TO_PLAY_MENU_BREWING, // eHTPButton_Brewing, + IDS_HOW_TO_PLAY_MENU_ENCHANTMENT, // eHTPButton_Enchantment, + IDS_HOW_TO_PLAY_MENU_ANVIL, + IDS_HOW_TO_PLAY_MENU_FARMANIMALS, // eHTPButton_Breeding, + IDS_HOW_TO_PLAY_MENU_BREEDANIMALS, // eHTPButton_Breeding, + IDS_HOW_TO_PLAY_MENU_TRADING, + + IDS_HOW_TO_PLAY_MENU_NETHERPORTAL, // eHTPButton_NetherPortal, + IDS_HOW_TO_PLAY_MENU_THEEND, // eHTPButton_TheEnd, + IDS_HOW_TO_PLAY_MENU_SOCIALMEDIA, // eHTPButton_SocialMedia, + IDS_HOW_TO_PLAY_MENU_BANLIST, // eHTPButton_BanningLevels, + IDS_HOW_TO_PLAY_MENU_HOSTOPTIONS, // eHTPButton_HostOptions, +}; + +// mapping the buttons to a scene value +unsigned int CScene_HowToPlayMenu::m_uiHTPSceneA[]= +{ + eHowToPlay_WhatsNew, + eHowToPlay_Basics, + eHowToPlay_Multiplayer, + eHowToPlay_HUD, + eHowToPlay_Creative, + eHowToPlay_Inventory, + eHowToPlay_Chest, + eHowToPlay_InventoryCrafting, + eHowToPlay_Furnace, + eHowToPlay_Dispenser, + + eHowToPlay_Brewing, + eHowToPlay_Enchantment, + eHowToPlay_Anvil, + eHowToPlay_FarmingAnimals, + eHowToPlay_Breeding, + eHowToPlay_Trading, + + eHowToPlay_NetherPortal, + eHowToPlay_TheEnd, + eHowToPlay_SocialMedia, + eHowToPlay_BanList, + eHowToPlay_HostOptions, +}; + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_HowToPlayMenu::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + m_iPad = *(int *)pInitData->pvInitData; + // if we're not in the game, we need to use basescene 0 + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + bool bSplitscreen= app.GetLocalPlayerCount()>1; + m_ButtonList=NULL; + + //MapChildControls(); + + //m_iButtons=0; + if(bSplitscreen) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad, false); + } + + // 4J-PB - changing all versions to use a list of buttons, since we're adding some + // We're going to use a list of buttons here + CXuiElement e = m_hObj; + HRESULT hr = e.GetChildById(L"HowToListButtons", &m_ButtonList); + m_iButtons=eHTPButton_Max; + for(int i=0;ibItemData ) + { + if( pGetSourceTextData->iItem < (int)eHTPButton_Max ) + { + pGetSourceTextData->szText = app.GetString(m_uiHTPButtonNameA[pGetSourceTextData->iItem]);//m_Buttons[pGetSourceTextData->iItem].GetText(); + pGetSourceTextData->bDisplay = TRUE; + + bHandled = TRUE; + } + } + return S_OK; +} + +HRESULT CScene_HowToPlayMenu::OnGetItemCountAll(XUIMessageGetItemCount *pGetItemCountData, BOOL& bHandled) +{ + pGetItemCountData->cItems = m_iButtons; + bHandled = TRUE; + return S_OK; +} + + +HRESULT CScene_HowToPlayMenu::OnNotifySelChanged(HXUIOBJ hObjSource, XUINotifySelChanged *pNotifySelChangedData, BOOL& bHandled) +{ + // In a list, we need to play the 'focus' sound ourselves + if((pNotifySelChangedData->iOldItem!=-1) && m_ButtonList && (hObjSource==m_ButtonList.m_hObj)) + { + CXuiSceneBase::PlayUISFX(eSFX_Focus); + } + + return S_OK; +} +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_HowToPlayMenu::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + unsigned int uiInitData; + unsigned int uiButtonCounter=0; + + // 4J-PB - now using a list for all resolutions + //if((!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) || app.GetLocalPlayerCount()>1) + { + if(hObjPressed==m_ButtonList && m_ButtonList.TreeHasFocus() && (m_ButtonList.GetItemCount() > 0) && (m_ButtonList.GetCurSel() < (int)eHTPButton_Max) ) + { + uiButtonCounter=m_ButtonList.GetCurSel(); + } + } + /*else + { + while((uiButtonCounter1) + { + app.NavigateToScene(pNotifyPressData->UserIndex,eUIScene_HowToPlay, ( void* )( uiInitData ) ); + } + else + { + app.NavigateToScene(pNotifyPressData->UserIndex,eUIScene_HowToPlay, ( void* )( uiInitData ) ); + } + + rfHandled=TRUE; + return S_OK; +} + +HRESULT CScene_HowToPlayMenu::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + switch(pInputData->dwKeyCode) + { + + case VK_PAD_B: + case VK_ESCAPE: + app.NavigateBack(pInputData->UserIndex); + rfHandled = TRUE; + + break; + } + + return S_OK; +} + +HRESULT CScene_HowToPlayMenu::OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled) +{ + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + + return S_OK; +} + +HRESULT CScene_HowToPlayMenu::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) +{ + bHandled=true; + return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining,false); +} diff --git a/Minecraft.Client/Common/XUI/XUI_HowToPlayMenu.h b/Minecraft.Client/Common/XUI/XUI_HowToPlayMenu.h new file mode 100644 index 00000000..ba334c80 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_HowToPlayMenu.h @@ -0,0 +1,76 @@ +#pragma once + +#include "../media/xuiscene_howtoplay_menu.h" +#include "XUI_CustomMessages.h" + +class CScene_HowToPlayMenu : public CXuiSceneImpl +{ +protected: + + enum eHTPButton + { + eHTPButton_WhatsNew = 0, + eHTPButton_Basics, + eHTPButton_Multiplayer, + eHTPButton_Hud, + eHTPButton_Creative, + eHTPButton_Inventory, + eHTPButton_Chest, + eHTPButton_Crafting, + eHTPButton_Furnace, + eHTPButton_Dispenser, + eHTPButton_Brewing, + eHTPButton_Enchantment, + eHTPButton_Anvil, + eHTPButton_FarmingAnimals, + eHTPButton_Breeding, + eHTPButton_Trading, + eHTPButton_NetherPortal, + eHTPButton_TheEnd, + eHTPButton_SocialMedia, + eHTPButton_BanningLevels, + eHTPButton_HostOptions, + eHTPButton_Max, + }; + + // Control and Element wrapper objects. + CXuiScene m_Scene; + CXuiElement m_Background; + CXuiList m_ButtonList; + + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_NAV_RETURN(OnNavReturn) + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + XUI_ON_XM_GET_SOURCE_TEXT(OnGetSourceDataText) + XUI_ON_XM_GET_ITEMCOUNT_ALL(OnGetItemCountAll) + XUI_ON_XM_NOTIFY_SELCHANGED(OnNotifySelChanged) + + XUI_END_MSG_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled); + HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled); + HRESULT OnGetSourceDataText(XUIMessageGetSourceText *pGetSourceTextData, BOOL& bHandled); + HRESULT OnGetItemCountAll(XUIMessageGetItemCount *pGetItemCountData, BOOL& bHandled); + HRESULT OnNotifySelChanged(HXUIOBJ hObjSource, XUINotifySelChanged *pNotifySelChangedData, BOOL& bHandled); + +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_HowToPlayMenu, L"CScene_HowToPlayMenu", XUI_CLASS_SCENE ) + +private: + + int m_iPad; + D3DXVECTOR3 m_OriginalPosition; + static unsigned int m_uiHTPButtonNameA[eHTPButton_Max]; + static unsigned int m_uiHTPSceneA[eHTPButton_Max]; + int m_iButtons; +}; diff --git a/Minecraft.Client/Common/XUI/XUI_InGameHostOptions.cpp b/Minecraft.Client/Common/XUI/XUI_InGameHostOptions.cpp new file mode 100644 index 00000000..f0561745 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_InGameHostOptions.cpp @@ -0,0 +1,150 @@ +#include "stdafx.h" +#include "XUI_MultiGameCreate.h" +#include "XUI_InGameHostOptions.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\ClientConnection.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_InGameHostOptions::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + m_iPad = *(int *)pInitData->pvInitData; + + MapChildControls(); + + m_focusElement = m_CheckboxFireSpreads.m_hObj; + + XuiControlSetText(m_CheckboxFireSpreads,app.GetString(IDS_FIRE_SPREADS)); + XuiControlSetText(m_CheckboxTNTExplodes,app.GetString(IDS_TNT_EXPLODES)); + + if(app.GetLocalPlayerCount()>1) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + } + + m_CheckboxFireSpreads.SetEnable(TRUE); + m_CheckboxTNTExplodes.SetEnable(TRUE); + m_CheckboxFireSpreads.SetCheck((app.GetGameHostOption(eGameHostOption_FireSpreads)!=0)?TRUE:FALSE); + m_CheckboxTNTExplodes.SetCheck((app.GetGameHostOption(eGameHostOption_TNT)!=0)?TRUE:FALSE); + + INetworkPlayer *localPlayer = g_NetworkManager.GetLocalPlayerByUserIndex( m_iPad ); + unsigned int privs = app.GetPlayerPrivileges(localPlayer->GetSmallId()); + if ( app.GetGameHostOption(eGameHostOption_CheatsEnabled) + && Player::getPlayerGamePrivilege(privs,Player::ePlayerGamePrivilege_CanTeleport) + && (g_NetworkManager.GetPlayerCount() > 1) ) + { + m_buttonTeleportToPlayer.SetText(app.GetString(IDS_TELEPORT_TO_PLAYER)); + m_buttonTeleportToMe.SetText(app.GetString(IDS_TELEPORT_TO_ME)); + } + else + { + removeControl(m_buttonTeleportToPlayer, true); + removeControl(m_buttonTeleportToMe, true); + } + + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + + CXuiSceneBase::ShowLogo( m_iPad, FALSE ); + + + //SentientManager.RecordMenuShown(m_iPad, eUIScene_CreateWorldMenu, 0); + + return S_OK; +} + + +HRESULT CScene_InGameHostOptions::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + // Explicitly handle B button presses + switch(pInputData->dwKeyCode) + { + case VK_PAD_B: + case VK_ESCAPE: + { + unsigned int hostOptions = app.GetGameHostOption(eGameHostOption_All); + app.SetGameHostOption(hostOptions,eGameHostOption_FireSpreads,m_CheckboxFireSpreads.IsChecked()); + app.SetGameHostOption(hostOptions,eGameHostOption_TNT,m_CheckboxTNTExplodes.IsChecked()); + + // Send update settings packet to server + if(hostOptions != app.GetGameHostOption(eGameHostOption_All) ) + { + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr player = pMinecraft->localplayers[m_iPad]; + if(player != NULL && player->connection) + { + player->connection->send( shared_ptr( new ServerSettingsChangedPacket( ServerSettingsChangedPacket::HOST_IN_GAME_SETTINGS, hostOptions) ) ); + } + } + + app.NavigateBack(pInputData->UserIndex); + rfHandled = TRUE; + } + break; + } + return S_OK; +} + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_InGameHostOptions::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + if(hObjPressed == m_buttonTeleportToPlayer || hObjPressed == m_buttonTeleportToMe) + { + TeleportMenuInitData *initData = new TeleportMenuInitData(); + initData->iPad = m_iPad; + initData->teleportToPlayer = false; + if( hObjPressed == m_buttonTeleportToPlayer ) + { + initData->teleportToPlayer = true; + } + ui.NavigateToScene(m_iPad,eUIScene_TeleportMenu,(void*)initData); + } + return S_OK; +} + +void CScene_InGameHostOptions::removeControl(HXUIOBJ hObjToRemove, bool center) +{ + D3DXVECTOR3 pos; + float fControlHeight, fTempHeight, fWidth; + + bool changeFocus = m_focusElement == hObjToRemove; + + XuiElementGetBounds(hObjToRemove,&fWidth,&fControlHeight); + + // Hide this control + XuiControlSetEnable(hObjToRemove, FALSE); + XuiElementSetShow(hObjToRemove, FALSE); + + // Move future downwards nav up + HXUIOBJ controlToMove = hObjToRemove; + while(controlToMove = XuiControlGetNavigation(controlToMove, XUI_CONTROL_NAVIGATE_DOWN, FALSE, TRUE) ) + { + if(changeFocus && XuiElementIsShown(controlToMove)) + { + m_focusElement = controlToMove; + XuiElementSetUserFocus( controlToMove, m_iPad ); + changeFocus = FALSE; + } + XuiElementGetPosition(controlToMove, &pos); + pos.y -= fControlHeight; + XuiElementSetPosition(controlToMove, &pos); + } + + // Resize and move scene + GetBounds(&fWidth, &fTempHeight); + SetBounds(fWidth, fTempHeight - fControlHeight); + + GetPosition(&pos); + pos.y += fControlHeight/2; + SetPosition(&pos); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_InGameHostOptions.h b/Minecraft.Client/Common/XUI/XUI_InGameHostOptions.h new file mode 100644 index 00000000..cdc99f7c --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_InGameHostOptions.h @@ -0,0 +1,45 @@ +#pragma once +#include "..\Media\xuiscene_ingame_host_options.h" + +class CScene_InGameHostOptions : public CXuiSceneImpl +{ +protected: + CXuiScene m_GameOptionsGroup; + CXuiCheckbox m_CheckboxFireSpreads; + CXuiCheckbox m_CheckboxTNTExplodes; + CXuiControl m_buttonTeleportToPlayer, m_buttonTeleportToMe; + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_END_MSG_MAP() + + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_GameOptions, m_GameOptionsGroup) + BEGIN_MAP_CHILD_CONTROLS(m_GameOptionsGroup) + MAP_CONTROL(IDC_CheckboxFireSpreads, m_CheckboxFireSpreads) + MAP_CONTROL(IDC_CheckboxTNT, m_CheckboxTNTExplodes) + MAP_CONTROL(IDC_ButtonTeleportToPlayer, m_buttonTeleportToPlayer) + MAP_CONTROL(IDC_ButtonTeleportPlayerToMe, m_buttonTeleportToMe) + END_MAP_CHILD_CONTROLS() + END_CONTROL_MAP() + + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled); + +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_InGameHostOptions, L"CScene_InGameHostOptions", XUI_CLASS_SCENE ) + +private: + int m_iPad; + D3DXVECTOR3 m_OriginalPosition; + HXUIOBJ m_focusElement; // Only used for the remove control process + + void removeControl(HXUIOBJ hObjToRemove, bool center); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_InGameInfo.cpp b/Minecraft.Client/Common/XUI/XUI_InGameInfo.cpp new file mode 100644 index 00000000..4839013c --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_InGameInfo.cpp @@ -0,0 +1,537 @@ +#include "stdafx.h" + +#include +#include "XUI_InGameInfo.h" +#include "..\..\ServerPlayer.h" +#include "..\..\PlayerConnection.h" +#include "..\..\PlayerList.h" +#include "..\..\MinecraftServer.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\PlayerRenderer.h" +#include "XUI_InGamePlayerOptions.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\ClientConnection.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" +#include "..\..\Xbox\Network\NetworkPlayerXbox.h" + +#define IGNORE_KEYPRESS_TIMERID 0 +#define TOOLTIP_TIMERID 1 +#define IGNORE_KEYPRESS_TIME 100 + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_InGameInfo::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + m_bIgnoreKeyPresses=true; + m_iPad = *(int *)pInitData->pvInitData; + + MapChildControls(); + + XuiControlSetText(m_gameOptionsButton,app.GetString(IDS_HOST_OPTIONS)); + XuiControlSetText(m_title,app.GetString(IDS_PLAYERS_INVITE)); + + if(app.GetLocalPlayerCount()>1) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + } + + DWORD playerCount = g_NetworkManager.GetPlayerCount(); + + m_playersCount = 0; + for(DWORD i = 0; i < playerCount; ++i) + { + INetworkPlayer *player = g_NetworkManager.GetPlayerByIndex( i ); + + if( player != NULL ) + { + m_players[i] = player->GetSmallId(); + ++m_playersCount; + } + } + + g_NetworkManager.RegisterPlayerChangedCallback(m_iPad, &CScene_InGameInfo::OnPlayerChanged, this); + + INetworkPlayer *thisPlayer = g_NetworkManager.GetLocalPlayerByUserIndex( m_iPad ); + m_isHostPlayer = false; + if(thisPlayer != NULL) m_isHostPlayer = thisPlayer->IsHost() == TRUE; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr localPlayer = pMinecraft->localplayers[m_iPad]; + if(!m_isHostPlayer && !localPlayer->isModerator() ) + { + m_gameOptionsButton.SetEnable(FALSE); + m_gameOptionsButton.SetShow(FALSE); + playersList.SetFocus(m_iPad); + } + + int keyX = IDS_TOOLTIPS_INVITE_FRIENDS; + XPARTY_USER_LIST partyList; + if((XPartyGetUserList( &partyList ) != XPARTY_E_NOT_IN_PARTY ) && (partyList.dwUserCount>1)) + { + keyX = IDS_TOOLTIPS_INVITE_PARTY; + } + if(g_NetworkManager.IsLocalGame()) keyX = -1; + + int keyA = -1; + ui.SetTooltips( m_iPad, keyA,IDS_TOOLTIPS_BACK,keyX,-1); + + + CXuiSceneBase::ShowDarkOverlay( m_iPad, TRUE ); + + SetTimer( TOOLTIP_TIMERID , INGAME_INFO_TOOLTIP_TIMER ); + + // get rid of the quadrant display if it's on + CXuiSceneBase::HidePressStart(); + + SetTimer(IGNORE_KEYPRESS_TIMERID,IGNORE_KEYPRESS_TIME); + + return S_OK; +} + +HRESULT CScene_InGameInfo::OnDestroy() +{ + XuiKillTimer(m_hObj,TOOLTIP_TIMERID); + g_NetworkManager.UnRegisterPlayerChangedCallback(m_iPad, &CScene_InGameInfo::OnPlayerChanged, this); + return S_OK; +} + +//---------------------------------------------------------------------------------- +// Updates the UI when the list selection changes. +//---------------------------------------------------------------------------------- +HRESULT CScene_InGameInfo::OnNotifySelChanged( HXUIOBJ hObjSource, XUINotifySelChanged* pNotifySelChangedData, BOOL& bHandled ) +{ + if( hObjSource == playersList) + { + updateTooltips(); + + bHandled = TRUE; + } + + return S_OK; +} + +HRESULT CScene_InGameInfo::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + if(m_bIgnoreKeyPresses) return S_OK; + + // 4J-PB - ignore repeats to stop the scene displaying and quitting right away if you hold the back button down + if((pInputData->dwKeyCode==VK_PAD_BACK) &&(pInputData->dwFlags&XUI_INPUT_FLAG_REPEAT )) + { + rfHandled = TRUE; + return S_OK; + } + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + HRESULT hr = S_OK; + switch(pInputData->dwKeyCode) + { + + case VK_PAD_B: + case VK_PAD_BACK: + case VK_ESCAPE: + CXuiSceneBase::PlayUISFX(eSFX_Back); + app.CloseXuiScenes(pInputData->UserIndex); + rfHandled = TRUE; + + break; + case VK_PAD_Y: + if(playersList.TreeHasFocus() && (playersList.GetItemCount() > 0) && (playersList.GetCurSel() < m_playersCount) ) + { + INetworkPlayer *player = g_NetworkManager.GetPlayerBySmallId(m_players[playersList.GetCurSel()]); + if( player != NULL ) + { + PlayerUID xuid = ((NetworkPlayerXbox *)player)->GetUID(); + if( xuid != INVALID_XUID ) + hr = XShowGamerCardUI(pInputData->UserIndex, xuid); + } + } + break; + case VK_PAD_X: + { + if(!g_NetworkManager.IsLocalGame()) + { + XPARTY_USER_LIST partyList; + if((XPartyGetUserList( &partyList ) != XPARTY_E_NOT_IN_PARTY) && (partyList.dwUserCount>1)) + { + hr = XShowPartyUI( pInputData->UserIndex ); + } + else + { + hr = XShowFriendsUI( pInputData->UserIndex ); + } + } + } + break; + } + + + return hr; +} + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_InGameInfo::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + if( hObjPressed == playersList ) + { + INetworkPlayer *selectedPlayer = g_NetworkManager.GetPlayerBySmallId( m_players[ playersList.GetCurSel() ] ); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr localPlayer = pMinecraft->localplayers[m_iPad]; + + bool isOp = m_isHostPlayer || localPlayer->isModerator(); + bool cheats = app.GetGameHostOption(eGameHostOption_CheatsEnabled) != 0; + bool trust = app.GetGameHostOption(eGameHostOption_TrustPlayers) != 0; + + if( isOp && selectedPlayer != NULL && playersList.TreeHasFocus() && (playersList.GetItemCount() > 0) && (playersList.GetCurSel() < m_playersCount) ) + { + bool editingHost = selectedPlayer->IsHost(); + if( (cheats && (m_isHostPlayer || !editingHost ) ) + || (!trust && (m_isHostPlayer || !editingHost)) + || (m_isHostPlayer && !editingHost) +#if (!defined(_CONTENT_PACKAGE) && !defined(_FINAL_BUILD) && defined(_DEBUG_MENUS_ENABLED)) + || (m_isHostPlayer && editingHost) +#endif + ) + { + InGamePlayerOptionsInitData *pInitData = new InGamePlayerOptionsInitData(); + pInitData->iPad = m_iPad; + pInitData->networkSmallId = m_players[ playersList.GetCurSel() ]; + pInitData->playerPrivileges = app.GetPlayerPrivileges(m_players[ playersList.GetCurSel() ] ); + app.NavigateToScene(m_iPad,eUIScene_InGamePlayerOptionsMenu,pInitData); + } + else if(selectedPlayer->IsLocal() != TRUE && selectedPlayer->IsSameSystem(g_NetworkManager.GetHostPlayer()) != TRUE) + { + // Only ops will hit this, can kick anyone not local and not local to the host + BYTE *smallId = new BYTE(); + *smallId = m_players[playersList.GetCurSel()]; + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + StorageManager.RequestMessageBox(IDS_UNLOCK_KICK_PLAYER_TITLE, IDS_UNLOCK_KICK_PLAYER, uiIDA, 2, m_iPad,&CScene_InGameInfo::KickPlayerReturned,smallId,app.GetStringTable()); + } + } + } + else if( hObjPressed == m_gameOptionsButton ) + { + app.NavigateToScene(pNotifyPressData->UserIndex,eUIScene_InGameHostOptionsMenu); + } + return S_OK; +} + +HRESULT CScene_InGameInfo::OnTimer(XUIMessageTimer *pData,BOOL& rfHandled) +{ + if(pData->nId==IGNORE_KEYPRESS_TIMERID) + { + XuiKillTimer(m_hObj,IGNORE_KEYPRESS_TIMERID); + m_bIgnoreKeyPresses=false; + } + else + { + updateTooltips(); + } + + return S_OK; +} + +HRESULT CScene_InGameInfo::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ) +{ + if(pTransition->dwTransType == XUI_TRANSITION_FROM) + { + KillTimer( TOOLTIP_TIMERID ); + } + return S_OK; +} + +HRESULT CScene_InGameInfo::OnTransitionEnd( XUIMessageTransition *pTransition, BOOL& bHandled ) +{ + if(pTransition->dwTransType == XUI_TRANSITION_BACKTO) + { + SetTimer( TOOLTIP_TIMERID , INGAME_INFO_TOOLTIP_TIMER ); + g_NetworkManager.RegisterPlayerChangedCallback(m_iPad, &CScene_InGameInfo::OnPlayerChanged, this); + } + return S_OK; +} + +HRESULT CScene_InGameInfo::OnNotifySetFocus( HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled ) +{ + updateTooltips(); + return S_OK; +} + +void CScene_InGameInfo::OnPlayerChanged(void *callbackParam, INetworkPlayer *pPlayer, bool leaving) +{ + CScene_InGameInfo *scene = (CScene_InGameInfo *)callbackParam; + bool playerFound = false; + + for(int i = 0; i < scene->m_playersCount; ++i) + { + if(playerFound) + { + scene->m_players[i-1] = scene->m_players[i]; + } + else if( scene->m_players[i] == pPlayer->GetSmallId() ) + { + if( scene->playersList.GetCurSel() == scene->playersList.GetItemCount() - 1 ) + { + scene->playersList.SetCurSel( scene->playersList.GetItemCount() - 2 ); + } + // Player removed + playerFound = true; + } + } + + if( playerFound ) + { + --scene->m_playersCount; + scene->playersList.DeleteItems( scene->playersList.GetItemCount() - 1, 1 ); + } + + if( !playerFound ) + { + // Player added + scene->m_players[scene->m_playersCount] = pPlayer->GetSmallId(); + ++scene->m_playersCount; + scene->playersList.InsertItems( scene->playersList.GetItemCount(), 1 ); + } +} + + +HRESULT CScene_InGameInfo::OnGetSourceDataText(XUIMessageGetSourceText *pGetSourceTextData, BOOL& bHandled) +{ + if( pGetSourceTextData->bItemData ) + { + if( pGetSourceTextData->iItem < m_playersCount ) + { + INetworkPlayer *player = g_NetworkManager.GetPlayerBySmallId( m_players[pGetSourceTextData->iItem] ); + if( player != NULL ) + { +#ifndef _CONTENT_PACKAGE + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<szText = L"WWWWWWWWWWWWWWWW"; + } + else +#endif + { + pGetSourceTextData->szText = player->GetOnlineName(); + } + } + else + { + pGetSourceTextData->szText = L""; + } + + HRESULT hr; + HXUIOBJ hButton, hVisual, hPlayerIcon, hVoiceIcon; + hButton = playersList.GetItemControl(pGetSourceTextData->iItem); + hr=XuiControlGetVisual(hButton,&hVisual); + + // Set the players icon + hr=XuiElementGetChildById(hVisual,L"IconGroup",&hPlayerIcon); + short colourIndex = app.GetPlayerColour( m_players[pGetSourceTextData->iItem] ); + int playFrame = 0; + switch(colourIndex) + { + case 1: + XuiElementFindNamedFrame(hPlayerIcon, L"P1", &playFrame); + break; + case 2: + XuiElementFindNamedFrame(hPlayerIcon, L"P2", &playFrame); + break; + case 3: + XuiElementFindNamedFrame(hPlayerIcon, L"P3", &playFrame); + break; + case 4: + XuiElementFindNamedFrame(hPlayerIcon, L"P4", &playFrame); + break; + case 5: + XuiElementFindNamedFrame(hPlayerIcon, L"P5", &playFrame); + break; + case 6: + XuiElementFindNamedFrame(hPlayerIcon, L"P6", &playFrame); + break; + case 7: + XuiElementFindNamedFrame(hPlayerIcon, L"P7", &playFrame); + break; + case 8: + XuiElementFindNamedFrame(hPlayerIcon, L"P8", &playFrame); + break; + case 9: + XuiElementFindNamedFrame(hPlayerIcon, L"P9", &playFrame); + break; + case 10: + XuiElementFindNamedFrame(hPlayerIcon, L"P10", &playFrame); + break; + case 11: + XuiElementFindNamedFrame(hPlayerIcon, L"P11", &playFrame); + break; + case 12: + XuiElementFindNamedFrame(hPlayerIcon, L"P12", &playFrame); + break; + case 13: + XuiElementFindNamedFrame(hPlayerIcon, L"P13", &playFrame); + break; + case 14: + XuiElementFindNamedFrame(hPlayerIcon, L"P14", &playFrame); + break; + case 15: + XuiElementFindNamedFrame(hPlayerIcon, L"P15", &playFrame); + break; + case 0: + default: + XuiElementFindNamedFrame(hPlayerIcon, L"P0", &playFrame); + break; + }; + if(playFrame < 0) playFrame = 0; + XuiElementPlayTimeline(hPlayerIcon,playFrame,playFrame,playFrame,FALSE,FALSE); + + // Set the voice icon + hr=XuiElementGetChildById(hVisual,L"VoiceGroup",&hVoiceIcon); + + playFrame = -1; + if(player != NULL && player->HasVoice() ) + { + if( player->IsMutedByLocalUser(m_iPad) ) + { + // Muted image + XuiElementFindNamedFrame(hVoiceIcon, L"Muted", &playFrame); + } + else if( player->IsTalking() ) + { + // Talking image + XuiElementFindNamedFrame(hVoiceIcon, L"Speaking", &playFrame); + } + else + { + // Not talking image + XuiElementFindNamedFrame(hVoiceIcon, L"NotSpeaking", &playFrame); + } + } + + if(playFrame < 0) + { + XuiElementFindNamedFrame(hVoiceIcon, L"Normal", &playFrame); + } + XuiElementPlayTimeline(hVoiceIcon,playFrame,playFrame,playFrame,FALSE,FALSE); + + pGetSourceTextData->bDisplay = TRUE; + + bHandled = TRUE; + } + } + return S_OK; +} + +HRESULT CScene_InGameInfo::OnGetSourceDataImage(XUIMessageGetSourceImage *pGetSourceImageData,BOOL& bHandled) +{ + if( pGetSourceImageData->bItemData ) + { + if( pGetSourceImageData->iItem < m_playersCount ) + { + bHandled = TRUE; + } + } + return S_OK; +} + +HRESULT CScene_InGameInfo::OnGetItemCountAll(XUIMessageGetItemCount *pGetItemCountData, BOOL& bHandled) +{ + pGetItemCountData->cItems = m_playersCount; + bHandled = TRUE; + return S_OK; +} + +void CScene_InGameInfo::updateTooltips() +{ + int keyX = IDS_TOOLTIPS_INVITE_FRIENDS; + int ikeyY = -1; + + XPARTY_USER_LIST partyList; + if((XPartyGetUserList( &partyList ) != XPARTY_E_NOT_IN_PARTY ) && (partyList.dwUserCount>1)) + { + keyX = IDS_TOOLTIPS_INVITE_PARTY; + } + if(g_NetworkManager.IsLocalGame()) keyX = -1; + + INetworkPlayer *selectedPlayer = g_NetworkManager.GetPlayerBySmallId( m_players[ playersList.GetCurSel() ] ); + + int keyA = -1; + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr localPlayer = pMinecraft->localplayers[m_iPad]; + + bool isOp = m_isHostPlayer || localPlayer->isModerator(); + bool cheats = app.GetGameHostOption(eGameHostOption_CheatsEnabled) != 0; + bool trust = app.GetGameHostOption(eGameHostOption_TrustPlayers) != 0; + + if( isOp ) + { + if(m_gameOptionsButton.HasFocus()) + { + keyA = IDS_TOOLTIPS_SELECT; + } + else if( selectedPlayer != NULL) + { + bool editingHost = selectedPlayer->IsHost(); + if( (cheats && (m_isHostPlayer || !editingHost ) ) || (!trust && (m_isHostPlayer || !editingHost)) +#if (!defined(_CONTENT_PACKAGE) && !defined(_FINAL_BUILD) && defined(_DEBUG_MENUS_ENABLED)) + || (m_isHostPlayer && editingHost) +#endif + ) + { + keyA = IDS_TOOLTIPS_PRIVILEGES; + } + else if(selectedPlayer->IsLocal() != TRUE && selectedPlayer->IsSameSystem(g_NetworkManager.GetHostPlayer()) != TRUE) + { + // Only ops will hit this, can kick anyone not local and not local to the host + keyA = IDS_TOOLTIPS_KICK; + } + } + } + + if(!m_gameOptionsButton.HasFocus()) + { + // if the player is me, then view gamer profile + if(selectedPlayer != NULL && selectedPlayer->IsLocal() && selectedPlayer->GetUserIndex()==m_iPad) + { + ikeyY = IDS_TOOLTIPS_VIEW_GAMERPROFILE; + } + else + { + ikeyY = IDS_TOOLTIPS_VIEW_GAMERCARD; + } + } + ui.SetTooltips( m_iPad, keyA,IDS_TOOLTIPS_BACK,keyX,ikeyY); +} + + +HRESULT CScene_InGameInfo::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) +{ + bHandled=true; + return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining); +} + +int CScene_InGameInfo::KickPlayerReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + BYTE smallId = *(BYTE *)pParam; + delete pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr localPlayer = pMinecraft->localplayers[iPad]; + if(localPlayer != NULL && localPlayer->connection) + { + localPlayer->connection->send( shared_ptr( new KickPlayerPacket(smallId) ) ); + } + } + + return 0; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_InGameInfo.h b/Minecraft.Client/Common/XUI/XUI_InGameInfo.h new file mode 100644 index 00000000..8b685aaf --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_InGameInfo.h @@ -0,0 +1,84 @@ +#pragma once +using namespace std; +#include "../media/xuiscene_ingameinfo.h" +#include "XUI_CustomMessages.h" + +class INetworkPlayer; + +#define INGAME_INFO_TOOLTIP_TIMER 1000 + +#define VOICE_ICON_DATA_ID 0 +#define MAP_ICON_DATA_ID 1 +#define OPS_ICON_DATA_ID 2 + +class CScene_InGameInfo : public CXuiSceneImpl +{ +protected: + // Control and Element wrapper objects. + CXuiList playersList; + CXuiControl m_gameOptionsButton; + CXuiControl m_title; + + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_DESTROY( OnDestroy ) + XUI_ON_XM_NOTIFY_SELCHANGED( OnNotifySelChanged ) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_TIMER( OnTimer ) + XUI_ON_XM_TRANSITION_START( OnTransitionStart ) + XUI_ON_XM_TRANSITION_END( OnTransitionEnd ) + XUI_ON_XM_NOTIFY_SET_FOCUS( OnNotifySetFocus ) + + XUI_ON_XM_GET_SOURCE_TEXT(OnGetSourceDataText) + XUI_ON_XM_GET_SOURCE_IMAGE(OnGetSourceDataImage) + XUI_ON_XM_GET_ITEMCOUNT_ALL(OnGetItemCountAll) + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_GamePlayers, playersList) + MAP_CONTROL(IDC_GameOptionsButton, m_gameOptionsButton) + MAP_CONTROL(IDC_Title, m_title) + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnDestroy(); + HRESULT OnNotifySelChanged( HXUIOBJ hObjSource, XUINotifySelChanged* pNotifySelChangedData, BOOL& bHandled ); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnTimer(XUIMessageTimer *pData,BOOL& rfHandled); + HRESULT OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ); + HRESULT OnTransitionEnd( XUIMessageTransition *pTransition, BOOL& bHandled ); + HRESULT OnNotifySetFocus( HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled ); + + HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled); + + HRESULT OnGetSourceDataText(XUIMessageGetSourceText *pGetSourceTextData, BOOL& bHandled); + HRESULT OnGetSourceDataImage(XUIMessageGetSourceImage *pGetSourceImageData,BOOL& bHandled); + HRESULT OnGetItemCountAll(XUIMessageGetItemCount *pGetItemCountData, BOOL& bHandled); + +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_InGameInfo, L"CScene_InGameInfo", XUI_CLASS_SCENE ) + + static void OnPlayerChanged(void *callbackParam, INetworkPlayer *pPlayer, bool leaving); + +private: + bool m_isHostPlayer; + int m_iPad; + D3DXVECTOR3 m_OriginalPosition; + + int m_playersCount; + BYTE m_players[MINECRAFT_NET_MAX_PLAYERS]; // An array of QNet small-id's + bool m_bIgnoreKeyPresses; + + void updateTooltips(); + +public: + static int KickPlayerReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); +}; diff --git a/Minecraft.Client/Common/XUI/XUI_InGamePlayerOptions.cpp b/Minecraft.Client/Common/XUI/XUI_InGamePlayerOptions.cpp new file mode 100644 index 00000000..156cd092 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_InGamePlayerOptions.cpp @@ -0,0 +1,499 @@ +#include "stdafx.h" +#include "XUI_MultiGameCreate.h" +#include "XUI_InGamePlayerOptions.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\ClientConnection.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "XUI_InGameInfo.h" + + + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_InGamePlayerOptions::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + m_iPad = *(int *)pInitData->pvInitData; + + InGamePlayerOptionsInitData *initData = (InGamePlayerOptionsInitData *)pInitData->pvInitData; + m_iPad = initData->iPad; + m_networkSmallId = initData->networkSmallId; + m_playerPrivileges = initData->playerPrivileges; + + MapChildControls(); + + m_focusElement = m_checkboxes[eControl_BuildAndMine].m_hObj; + + m_TeleportGroup.SetShow(false); + + INetworkPlayer *localPlayer = g_NetworkManager.GetLocalPlayerByUserIndex( m_iPad ); + INetworkPlayer *editingPlayer = g_NetworkManager.GetPlayerBySmallId(m_networkSmallId); + + if(editingPlayer != NULL) + { + m_Gamertag.SetText(editingPlayer->GetOnlineName()); + } + + bool trustPlayers = app.GetGameHostOption(eGameHostOption_TrustPlayers) != 0; + bool cheats = app.GetGameHostOption(eGameHostOption_CheatsEnabled) != 0; + m_editingSelf = (localPlayer != NULL && localPlayer == editingPlayer); + + if( m_editingSelf || trustPlayers || editingPlayer->IsHost()) + { + removeControl( m_checkboxes[eControl_BuildAndMine], true ); + removeControl( m_checkboxes[eControl_UseDoorsAndSwitches], true ); + removeControl( m_checkboxes[eControl_UseContainers], true ); + removeControl( m_checkboxes[eControl_AttackPlayers], true ); + removeControl( m_checkboxes[eControl_AttackAnimals], true ); + } + else + { + bool checked = (Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CannotMine)==0 && Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CannotBuild)==0); + m_checkboxes[eControl_BuildAndMine].SetText( app.GetString(IDS_CAN_BUILD_AND_MINE) ); + m_checkboxes[eControl_BuildAndMine].SetCheck(checked); + + checked = (Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanUseDoorsAndSwitches)!=0); + m_checkboxes[eControl_UseDoorsAndSwitches].SetText( app.GetString(IDS_CAN_USE_DOORS_AND_SWITCHES) ); + m_checkboxes[eControl_UseDoorsAndSwitches].SetCheck(checked); + + checked = (Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanUseContainers)!=0); + m_checkboxes[eControl_UseContainers].SetText( app.GetString(IDS_CAN_OPEN_CONTAINERS) ); + m_checkboxes[eControl_UseContainers].SetCheck(checked); + + checked = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CannotAttackPlayers)==0; + m_checkboxes[eControl_AttackPlayers].SetText( app.GetString(IDS_CAN_ATTACK_PLAYERS) ); + m_checkboxes[eControl_AttackPlayers].SetCheck(checked); + + checked = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CannotAttackAnimals)==0; + m_checkboxes[eControl_AttackAnimals].SetText( app.GetString(IDS_CAN_ATTACK_ANIMALS) ); + m_checkboxes[eControl_AttackAnimals].SetCheck(checked); + } + + if(m_editingSelf) + { +#if (defined(_CONTENT_PACKAGE) || defined(_FINAL_BUILD) && !defined(_DEBUG_MENUS_ENABLED)) + removeControl( m_checkboxes[eControl_Op], true ); +#else + m_checkboxes[eControl_Op].SetText(L"DEBUG: Creative"); + m_checkboxes[eControl_Op].SetCheck(Player::getPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CreativeMode)); +#endif + + removeControl( m_buttonKick, true ); + removeControl( m_checkboxes[eControl_CheatTeleport], true ); + + if(cheats) + { + bool canBeInvisible = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanToggleInvisible) != 0; + m_checkboxes[eControl_HostInvisible].SetEnable(canBeInvisible); + bool checked = canBeInvisible && (Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_Invisible)!=0 && Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_Invulnerable)!=0); + m_checkboxes[eControl_HostInvisible].SetText( app.GetString(IDS_INVISIBLE) ); + m_checkboxes[eControl_HostInvisible].SetCheck(checked); + + bool inCreativeMode = Player::getPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CreativeMode) != 0; + if(inCreativeMode) + { + removeControl( m_checkboxes[eControl_HostFly], true ); + removeControl( m_checkboxes[eControl_HostHunger], true ); + } + else + { + bool canFly = Player::getPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanToggleFly); + bool canChangeHunger = Player::getPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanToggleClassicHunger); + + m_checkboxes[eControl_HostFly].SetEnable(canFly); + checked = canFly && Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanFly)!=0; + m_checkboxes[eControl_HostFly].SetText( app.GetString(IDS_CAN_FLY) ); + m_checkboxes[eControl_HostFly].SetCheck(checked); + + m_checkboxes[eControl_HostHunger].SetEnable(canChangeHunger); + checked = canChangeHunger && Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_ClassicHunger)!=0; + m_checkboxes[eControl_HostHunger].SetText( app.GetString(IDS_DISABLE_EXHAUSTION) ); + m_checkboxes[eControl_HostHunger].SetCheck(checked); + } + } + else + { + removeControl( m_checkboxes[eControl_HostInvisible], true ); + removeControl( m_checkboxes[eControl_HostFly], true ); + removeControl( m_checkboxes[eControl_HostHunger], true ); + } + } + else + { + if(localPlayer->IsHost()) + { + // Only host can make people moderators, or enable teleporting for them + m_checkboxes[eControl_Op].SetText( app.GetString(IDS_MODERATOR) ); + m_checkboxes[eControl_Op].SetCheck(Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_Op)!=0); + } + else + { + removeControl( m_checkboxes[eControl_Op], true ); + } + + if(localPlayer->IsHost() && cheats) + { + m_checkboxes[eControl_HostInvisible].SetEnable(true); + bool checked = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanToggleInvisible)!=0; + m_checkboxes[eControl_HostInvisible].SetText( app.GetString(IDS_CAN_INVISIBLE) ); + m_checkboxes[eControl_HostInvisible].SetCheck(checked); + + + bool inCreativeMode = Player::getPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CreativeMode) != 0; + if(inCreativeMode) + { + removeControl( m_checkboxes[eControl_HostFly], true ); + removeControl( m_checkboxes[eControl_HostHunger], true ); + } + else + { + m_checkboxes[eControl_HostFly].SetEnable(true); + checked = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanToggleFly)!=0; + m_checkboxes[eControl_HostFly].SetText( app.GetString(IDS_CAN_FLY) ); + m_checkboxes[eControl_HostFly].SetCheck(checked); + + m_checkboxes[eControl_HostHunger].SetEnable(true); + checked = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanToggleClassicHunger)!=0; + m_checkboxes[eControl_HostHunger].SetText( app.GetString(IDS_CAN_DISABLE_EXHAUSTION) ); + m_checkboxes[eControl_HostHunger].SetCheck(checked); + } + + checked = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanTeleport)!=0; + m_checkboxes[eControl_CheatTeleport].SetText(app.GetString(IDS_ENABLE_TELEPORT)); + m_checkboxes[eControl_CheatTeleport].SetCheck(checked); + } + else + { + removeControl( m_checkboxes[eControl_HostInvisible], true ); + removeControl( m_checkboxes[eControl_HostFly], true ); + removeControl( m_checkboxes[eControl_HostHunger], true ); + removeControl( m_checkboxes[eControl_CheatTeleport], true ); + } + + // Can only kick people if they are not local, and not local to the host + if(editingPlayer->IsLocal() != TRUE && editingPlayer->IsSameSystem(g_NetworkManager.GetHostPlayer()) != TRUE) + { + m_buttonKick.SetText( app.GetString(IDS_KICK_PLAYER)); + } + else + { + removeControl( m_buttonKick, true ); + } + } + + if(app.GetLocalPlayerCount()>1) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + } + + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + + CXuiSceneBase::ShowLogo( m_iPad, FALSE ); + + g_NetworkManager.RegisterPlayerChangedCallback(m_iPad, &CScene_InGamePlayerOptions::OnPlayerChanged, this); + + //SentientManager.RecordMenuShown(m_iPad, eUIScene_CreateWorldMenu, 0); + + resetCheatCheckboxes(); + + return S_OK; +} + +HRESULT CScene_InGamePlayerOptions::OnDestroy() +{ + g_NetworkManager.UnRegisterPlayerChangedCallback(m_iPad, &CScene_InGameInfo::OnPlayerChanged, this); + return S_OK; +} + + +HRESULT CScene_InGamePlayerOptions::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + // Explicitly handle B button presses + switch(pInputData->dwKeyCode) + { + case VK_PAD_B: + case VK_ESCAPE: + { + bool trustPlayers = app.GetGameHostOption(eGameHostOption_TrustPlayers) != 0; + bool cheats = app.GetGameHostOption(eGameHostOption_CheatsEnabled) != 0; + if(m_editingSelf) + { +#if (defined(_CONTENT_PACKAGE) || defined(_FINAL_BUILD) && !defined(_DEBUG_MENUS_ENABLED)) +#else + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CreativeMode,m_checkboxes[eControl_Op].IsChecked()); +#endif + if(cheats) + { + bool canBeInvisible = Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanToggleInvisible) != 0; + if(canBeInvisible) Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_Invisible,m_checkboxes[eControl_HostInvisible].IsChecked()); + if(canBeInvisible) Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_Invulnerable,m_checkboxes[eControl_HostInvisible].IsChecked()); + + bool inCreativeMode = Player::getPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CreativeMode) != 0; + if(!inCreativeMode) + { + bool canFly = Player::getPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanToggleFly); + bool canChangeHunger = Player::getPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanToggleClassicHunger); + + if(canFly) Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanFly,m_checkboxes[eControl_HostFly].IsChecked()); + if(canChangeHunger) Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_ClassicHunger,m_checkboxes[eControl_HostHunger].IsChecked()); + } + } + } + else + { + INetworkPlayer *editingPlayer = g_NetworkManager.GetPlayerBySmallId(m_networkSmallId); + if(!trustPlayers && (editingPlayer != NULL && !editingPlayer->IsHost() ) ) + { + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CannotMine,!m_checkboxes[eControl_BuildAndMine].IsChecked()); + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CannotBuild,!m_checkboxes[eControl_BuildAndMine].IsChecked()); + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CannotAttackPlayers,!m_checkboxes[eControl_AttackPlayers].IsChecked()); + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CannotAttackAnimals, !m_checkboxes[eControl_AttackAnimals].IsChecked()); + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanUseDoorsAndSwitches, m_checkboxes[eControl_UseDoorsAndSwitches].IsChecked()); + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanUseContainers, m_checkboxes[eControl_UseContainers].IsChecked()); + } + + INetworkPlayer *localPlayer = g_NetworkManager.GetLocalPlayerByUserIndex( m_iPad ); + + if(localPlayer->IsHost()) + { + if(cheats) + { + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanToggleInvisible,m_checkboxes[eControl_HostInvisible].IsChecked()); + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanToggleFly,m_checkboxes[eControl_HostFly].IsChecked()); + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanToggleClassicHunger,m_checkboxes[eControl_HostHunger].IsChecked()); + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_CanTeleport,m_checkboxes[eControl_CheatTeleport].IsChecked()); + } + + Player::setPlayerGamePrivilege(m_playerPrivileges,Player::ePlayerGamePrivilege_Op,m_checkboxes[eControl_Op].IsChecked()); + } + } + unsigned int originalPrivileges = app.GetPlayerPrivileges(m_networkSmallId); + if(originalPrivileges != m_playerPrivileges) + { + // Send update settings packet to server + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr player = pMinecraft->localplayers[m_iPad]; + if(player != NULL && player->connection) + { + player->connection->send( shared_ptr( new PlayerInfoPacket( m_networkSmallId, -1, m_playerPrivileges) ) ); + } + } + + app.NavigateBack(pInputData->UserIndex); + rfHandled = TRUE; + } + break; + } + return S_OK; +} + +HRESULT CScene_InGamePlayerOptions::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + //HRESULT hr = S_OK; + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + if( hObjPressed == m_buttonKick ) + { + BYTE *smallId = new BYTE(); + *smallId = m_networkSmallId; + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + StorageManager.RequestMessageBox(IDS_UNLOCK_KICK_PLAYER_TITLE, IDS_UNLOCK_KICK_PLAYER, uiIDA, 2, m_iPad,&CScene_InGamePlayerOptions::KickPlayerReturned,smallId,app.GetStringTable()); + } + else if (hObjPressed == m_checkboxes[eControl_Op] ) + { + resetCheatCheckboxes(); + } + + return S_OK; +} + +HRESULT CScene_InGamePlayerOptions::OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) +{ + pControlNavigateData->hObjDest=XuiControlGetNavigation(pControlNavigateData->hObjSource,pControlNavigateData->nControlNavigate,TRUE,TRUE); + + if(pControlNavigateData->hObjDest!=NULL) + { + bHandled=TRUE; + } + + return S_OK; +} + +int CScene_InGamePlayerOptions::KickPlayerReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + BYTE smallId = *(BYTE *)pParam; + delete pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr localPlayer = pMinecraft->localplayers[iPad]; + if(localPlayer != NULL && localPlayer->connection) + { + localPlayer->connection->send( shared_ptr( new KickPlayerPacket(smallId) ) ); + } + + // Fix for #61494 - [CRASH]: TU7: Code: Multiplayer: Title may crash while kicking a player from an online game. + // We cannot do a navigate back here is this actually occurs on a thread other than the main thread. On rare occasions this can clash + // with the XUI render and causes a crash. The OnPlayerChanged event should perform the navigate back on the main thread + //app.NavigateBack(iPad); + } + + return 0; +} + +void CScene_InGamePlayerOptions::OnPlayerChanged(void *callbackParam, INetworkPlayer *pPlayer, bool leaving) +{ + CScene_InGamePlayerOptions *scene = (CScene_InGamePlayerOptions *)callbackParam; + + HXUIOBJ hBackScene = scene->GetBackScene(); + CScene_InGameInfo* infoScene; + VOID *pObj; + XuiObjectFromHandle( hBackScene, &pObj ); + infoScene = (CScene_InGameInfo *)pObj; + if(infoScene != NULL) CScene_InGameInfo::OnPlayerChanged(infoScene,pPlayer,leaving); + + if(leaving && pPlayer != NULL && pPlayer->GetSmallId() == scene->m_networkSmallId) + { + app.NavigateBack(scene->m_iPad); + } +} + +HRESULT CScene_InGamePlayerOptions::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ) +{ + if(pTransition->dwTransType == XUI_TRANSITION_TO || pTransition->dwTransType == XUI_TRANSITION_BACKTO) + { + INetworkPlayer *editingPlayer = g_NetworkManager.GetPlayerBySmallId(m_networkSmallId); + if(editingPlayer != NULL) + { + short colourIndex = app.GetPlayerColour( m_networkSmallId ); + switch(colourIndex) + { + case 1: + m_Icon.PlayVisualRange(L"P1",NULL,L"P1"); + break; + case 2: + m_Icon.PlayVisualRange(L"P2",NULL,L"P2"); + break; + case 3: + m_Icon.PlayVisualRange(L"P3",NULL,L"P3"); + break; + case 4: + m_Icon.PlayVisualRange(L"P4",NULL,L"P4"); + break; + case 5: + m_Icon.PlayVisualRange(L"P5",NULL,L"P5"); + break; + case 6: + m_Icon.PlayVisualRange(L"P6",NULL,L"P6"); + break; + case 7: + m_Icon.PlayVisualRange(L"P7",NULL,L"P7"); + break; + case 8: + m_Icon.PlayVisualRange(L"P8",NULL,L"P8"); + break; + case 9: + m_Icon.PlayVisualRange(L"P9",NULL,L"P9"); + break; + case 10: + m_Icon.PlayVisualRange(L"P10",NULL,L"P10"); + break; + case 11: + m_Icon.PlayVisualRange(L"P11",NULL,L"P11"); + break; + case 12: + m_Icon.PlayVisualRange(L"P12",NULL,L"P12"); + break; + case 13: + m_Icon.PlayVisualRange(L"P13",NULL,L"P13"); + break; + case 14: + m_Icon.PlayVisualRange(L"P14",NULL,L"P14"); + break; + case 15: + m_Icon.PlayVisualRange(L"P15",NULL,L"P15"); + break; + case 0: + default: + m_Icon.PlayVisualRange(L"P0",NULL,L"P0"); + break; + }; + } + } + return S_OK; +} + +void CScene_InGamePlayerOptions::removeControl(HXUIOBJ hObjToRemove, bool center) +{ + D3DXVECTOR3 pos; + float fControlHeight, fTempHeight, fWidth; + + bool changeFocus = m_focusElement == hObjToRemove; + + XuiElementGetBounds(hObjToRemove,&fWidth,&fControlHeight); + + // Hide this control + XuiControlSetEnable(hObjToRemove, FALSE); + XuiElementSetShow(hObjToRemove, FALSE); + + // Move future downwards nav up + HXUIOBJ controlToMove = hObjToRemove; + while(controlToMove = XuiControlGetNavigation(controlToMove, XUI_CONTROL_NAVIGATE_DOWN, FALSE, TRUE) ) + { + if(changeFocus && XuiElementIsShown(controlToMove)) + { + m_focusElement = controlToMove; + XuiElementSetUserFocus( controlToMove, m_iPad ); + changeFocus = FALSE; + } + XuiElementGetPosition(controlToMove, &pos); + pos.y -= fControlHeight; + XuiElementSetPosition(controlToMove, &pos); + } + + // Resize and move scene + GetBounds(&fWidth, &fTempHeight); + SetBounds(fWidth, fTempHeight - fControlHeight); + + GetPosition(&pos); + pos.y += fControlHeight/2; + SetPosition(&pos); +} + +void CScene_InGamePlayerOptions::resetCheatCheckboxes() +{ + bool isModerator = m_checkboxes[eControl_Op].IsChecked(); + //bool cheatsEnabled = app.GetGameHostOption(eGameHostOption_CheatsEnabled) != 0; + + if (!m_editingSelf) + { + m_checkboxes[eControl_HostInvisible].SetEnable(isModerator); + m_checkboxes[eControl_HostInvisible].SetCheck( isModerator + && (Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanToggleInvisible) != 0) ); + + // NOT CREATIVE MODE. + { + m_checkboxes[eControl_HostFly].SetEnable(isModerator); + m_checkboxes[eControl_HostFly].SetCheck( isModerator + && (Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanToggleFly) != 0) ); + + m_checkboxes[eControl_HostHunger].SetEnable(isModerator); + m_checkboxes[eControl_HostHunger].SetCheck( isModerator + && (Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanToggleClassicHunger) != 0) ); + } + + m_checkboxes[eControl_CheatTeleport].SetEnable(isModerator); + m_checkboxes[eControl_CheatTeleport].SetCheck( isModerator + && (Player::getPlayerGamePrivilege(m_playerPrivileges, Player::ePlayerGamePrivilege_CanTeleport) != 0) ); + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_InGamePlayerOptions.h b/Minecraft.Client/Common/XUI/XUI_InGamePlayerOptions.h new file mode 100644 index 00000000..87b9de13 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_InGamePlayerOptions.h @@ -0,0 +1,96 @@ +#pragma once +#include "..\Media\xuiscene_ingame_player_options.h" + +class CScene_InGamePlayerOptions : public CXuiSceneImpl +{ +private: + enum EControls + { + // Checkboxes + eControl_BuildAndMine, + eControl_UseDoorsAndSwitches, + eControl_UseContainers, + eControl_AttackPlayers, + eControl_AttackAnimals, + eControl_Op, + eControl_CheatTeleport, + eControl_HostFly, + eControl_HostHunger, + eControl_HostInvisible, + + eControl_CHECKBOXES_COUNT, + + // Others + eControl_Kick = eControl_CHECKBOXES_COUNT, + }; + +protected: + HXUIOBJ m_focusElement; // Only used for the remove control process + + CXuiControl m_Icon; + CXuiControl m_Gamertag; + CXuiScene m_TeleportGroup; + CXuiControl m_buttonKick; + CXuiCheckbox m_checkboxes[eControl_CHECKBOXES_COUNT]; + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_DESTROY( OnDestroy ) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_CONTROL_NAVIGATE( OnControlNavigate ) + XUI_ON_XM_TRANSITION_START( OnTransitionStart ) + XUI_END_MSG_MAP() + + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_Icon, m_Icon) + MAP_CONTROL(IDC_Gamertag, m_Gamertag) + + MAP_CONTROL(IDC_CheckboxBuildAndMine, m_checkboxes[eControl_BuildAndMine]) + MAP_CONTROL(IDC_CheckboxAttackPlayers, m_checkboxes[eControl_AttackPlayers]) + MAP_CONTROL(IDC_CheckboxAttackAnimals, m_checkboxes[eControl_AttackAnimals]) + MAP_CONTROL(IDC_CheckboxUseContainers, m_checkboxes[eControl_UseContainers]) + MAP_CONTROL(IDC_CheckboxUseDoorsAndSwitches, m_checkboxes[eControl_UseDoorsAndSwitches]) + MAP_CONTROL(IDC_CheckboxOp, m_checkboxes[eControl_Op]) + MAP_CONTROL(IDC_CheckboxTeleport, m_checkboxes[eControl_CheatTeleport]) + MAP_CONTROL(IDC_CheckboxHostInvisible, m_checkboxes[eControl_HostInvisible]) + MAP_CONTROL(IDC_CheckboxHostFly, m_checkboxes[eControl_HostFly]) + MAP_CONTROL(IDC_CheckboxHostHunger, m_checkboxes[eControl_HostHunger]) + + MAP_CONTROL(IDC_ButtonKick, m_buttonKick) + END_CONTROL_MAP() + + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnDestroy(); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled); + HRESULT OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled); + HRESULT OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ); + +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_InGamePlayerOptions, L"CScene_InGamePlayerOptions", XUI_CLASS_SCENE ) + + static void OnPlayerChanged(void *callbackParam, INetworkPlayer *pPlayer, bool leaving); + +private: + bool m_editingSelf; + int m_iPad; + BYTE m_networkSmallId; + unsigned int m_playerPrivileges; + D3DXVECTOR3 m_OriginalPosition; + + void removeControl(HXUIOBJ hObjToRemove, bool center); + + /** 4J-JEV: + For enabling/disabling 'Can Fly', 'Can Teleport', 'Can Disable Hunger' etc + used after changing the moderator checkbox. + */ + void resetCheatCheckboxes(); + +public: + static int KickPlayerReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); +}; diff --git a/Minecraft.Client/Common/XUI/XUI_Intro.cpp b/Minecraft.Client/Common/XUI/XUI_Intro.cpp new file mode 100644 index 00000000..997abe5d --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Intro.cpp @@ -0,0 +1,153 @@ +// Minecraft.cpp : Defines the entry point for the application. +// + +#include "stdafx.h" + +#include +#include "..\XUI\XUI_Intro.h" + +#define TIMELINE_NORMAL 0 +#define TIMELINE_ESRBFADE 1 +#define TIMELINE_LOGOSFADE 2 + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_Intro::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + MapChildControls(); + + // We may need to display a ratings image for a while at the start... + m_bWantsToSkip=false; + m_iTimeline=TIMELINE_NORMAL; + + // 4J-PB - We can't check to see if the version is a trial or full game until after 5 seconds... + // The reason that this is a requirement is that there is a problem that occasionally happens *only* in the production + // environment (not partnernet or cert), where if you don’t wait 5 seconds, you can run into an issue where the timing + // of the call fails and the game is always identified as being the trial version even if you have upgraded to the full version. + // -Joe Dunavant + + // start a timer for the required 5 seconds, plus an extra bit to allow the lib timer to enable the xcontent license check call +#ifdef _CONTENT_PACKAGE + m_bSkippable=false; + XuiSetTimer( m_hObj,0,5200); +#else + m_bSkippable=true; +#endif + + return S_OK; +} + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_Intro::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + + return S_OK; +} + +HRESULT CScene_Intro::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + static bool bPressed=false; + + if(bPressed==false) + { + if(m_bSkippable) + { + // stop the animation + XuiElementStopTimeline(m_hObj,TRUE); + app.NavigateToScene(XUSER_INDEX_ANY,eUIScene_SaveMessage); + app.SetIntroRunning(false); + } + else + { + m_bWantsToSkip=true; + } + + bPressed=true; + } + + return S_OK; +} + +HRESULT CScene_Intro::OnTimelineEnd(HXUIOBJ hObjSource, BOOL& bHandled) +{ + int nStart, nEnd; + + if(m_bSkippable && m_bWantsToSkip) + { + // straight to the game + app.NavigateToScene(XUSER_INDEX_ANY,eUIScene_SaveMessage); + app.SetIntroRunning(false); + } + else + { + switch(m_iTimeline) + { + case TIMELINE_NORMAL: + { + // 4J-PB - lots of discussions over this because Brazil is in the NA region. This is what I have been advised to do... + //if(ProfileManager.RegionIsNorthAmerica()) + if(ProfileManager.LocaleIsUSorCanada()) + { + m_iTimeline=TIMELINE_ESRBFADE; + XuiElementFindNamedFrame( m_hObj, L"ESRBFade", &nStart ); + XuiElementFindNamedFrame( m_hObj, L"ESRBFadeEnd", &nEnd ); + XuiElementPlayTimeline( m_hObj, nStart, nStart, nEnd, FALSE, TRUE ); + } + else + { + m_iTimeline=TIMELINE_LOGOSFADE; + XuiElementFindNamedFrame( m_hObj, L"StartFade", &nStart ); + XuiElementFindNamedFrame( m_hObj, L"EndFade", &nEnd ); + XuiElementPlayTimeline( m_hObj, nStart, nStart, nEnd, FALSE, TRUE ); + } + } + break; + + case TIMELINE_ESRBFADE: + if(m_bWantsToSkip && m_bSkippable) + { + app.NavigateToScene(XUSER_INDEX_ANY,eUIScene_SaveMessage); + app.SetIntroRunning(false); + } + else + { + m_iTimeline=TIMELINE_LOGOSFADE; + XuiElementFindNamedFrame( m_hObj, L"StartFade", &nStart ); + XuiElementFindNamedFrame( m_hObj, L"EndFade", &nEnd ); + XuiElementPlayTimeline( m_hObj, nStart, nStart, nEnd, FALSE, TRUE ); + } + break; + case TIMELINE_LOGOSFADE: + app.NavigateToScene(XUSER_INDEX_ANY,eUIScene_SaveMessage); + app.SetIntroRunning(false); + break; + } + } + + return S_OK; +} + + +HRESULT CScene_Intro::OnTimer(XUIMessageTimer *pData,BOOL& rfHandled) +{ + HRESULT hr=XuiKillTimer(m_hObj,0); + m_bSkippable=true; + + if(m_bWantsToSkip) + { + // stop the animation + XuiElementStopTimeline(m_hObj,TRUE); + app.NavigateToScene(XUSER_INDEX_ANY,eUIScene_SaveMessage); + app.SetIntroRunning(false); + } + + return hr; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Intro.h b/Minecraft.Client/Common/XUI/XUI_Intro.h new file mode 100644 index 00000000..f896faed --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Intro.h @@ -0,0 +1,44 @@ +#pragma once + +#include "../media/xuiscene_intro.h" + +class CScene_Intro : public CXuiSceneImpl +{ + protected: + CXuiScene m_Scene; + CXuiControl m_4jlogo; + CXuiElement m_grpXbox; + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_TIMELINE_END(OnTimelineEnd) + XUI_ON_XM_TIMER( OnTimer ) + XUI_END_MSG_MAP() + + BEGIN_CONTROL_MAP() + //MAP_CONTROL(IDC_LogoGroup, m_grpXbox) + //BEGIN_MAP_CHILD_CONTROLS(m_grpXbox) + MAP_CONTROL(IDC_Logo4J, m_4jlogo) + //END_MAP_CHILD_CONTROLS() + + END_CONTROL_MAP() + + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnTimelineEnd(HXUIOBJ hObjSource, BOOL& bHandled); + HRESULT OnTimer(XUIMessageTimer *pData,BOOL& rfHandled); + + bool m_bSkippable; + bool m_bWantsToSkip; + int m_iTimeline; +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_Intro, L"CScene_Intro", XUI_CLASS_SCENE ) + +}; diff --git a/Minecraft.Client/Common/XUI/XUI_Leaderboards.cpp b/Minecraft.Client/Common/XUI/XUI_Leaderboards.cpp new file mode 100644 index 00000000..428b3e88 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Leaderboards.cpp @@ -0,0 +1,1202 @@ +#include "stdafx.h" +#include +#include +#include "XUI_Leaderboards.h" +#include "..\..\..\Minecraft.World\Tile.h" +#include "..\..\..\Minecraft.World\Item.h" +#include "XUI_Ctrl_CraftIngredientSlot.h" +#include "XUI_XZP_Icons.h" + +LPCWSTR CScene_Leaderboards::m_TitleIconNameA[7]= +{ + L"XuiHSlot1", + L"XuiHSlot2", + L"XuiHSlot3", + L"XuiHSlot4", + L"XuiHSlot5", + L"XuiHSlot6", + L"XuiHSlot7", +}; + +LPCWSTR CScene_Leaderboards::m_TextColumnNameA[7]= +{ + L"text_Column1", + L"text_Column2", + L"text_Column3", + L"text_Column4", + L"text_Column5", + L"text_Column6", + L"text_Column7", +}; + + +// if the value is greater than 511, it's an xzp icon that needs displayed, rather than the game icon +const int CScene_Leaderboards::TitleIcons[CScene_Leaderboards::NUM_LEADERBOARDS][7] = +{ + { XZP_ICON_WALKED, XZP_ICON_FALLEN, Item::minecart_Id, Item::boat_Id, NULL }, + { Tile::dirt_Id, Tile::stoneBrick_Id, Tile::sand_Id, Tile::rock_Id, Tile::gravel_Id, Tile::clay_Id, Tile::obsidian_Id }, + { Item::egg_Id, Item::wheat_Id, Tile::mushroom1_Id, Tile::reeds_Id, Item::milk_Id, Tile::pumpkin_Id, NULL }, + { XZP_ICON_ZOMBIE, XZP_ICON_SKELETON, XZP_ICON_CREEPER, XZP_ICON_SPIDER, XZP_ICON_SPIDERJOCKEY, XZP_ICON_ZOMBIEPIGMAN, XZP_ICON_SLIME }, +}; + +const int CScene_Leaderboards::LEADERBOARD_HEADERS[CScene_Leaderboards::NUM_LEADERBOARDS][4] = { + { SPASTRING_LB_TRAVELLING_PEACEFUL_NAME, SPASTRING_LB_TRAVELLING_EASY_NAME, SPASTRING_LB_TRAVELLING_NORMAL_NAME, SPASTRING_LB_TRAVELLING_HARD_NAME }, + { SPASTRING_LB_MINING_BLOCKS_PEACEFUL_NAME, SPASTRING_LB_MINING_BLOCKS_EASY_NAME, SPASTRING_LB_MINING_BLOCKS_NORMAL_NAME, SPASTRING_LB_MINING_BLOCKS_HARD_NAME }, + { SPASTRING_LB_FARMING_PEACEFUL_NAME, SPASTRING_LB_FARMING_EASY_NAME, SPASTRING_LB_FARMING_NORMAL_NAME, SPASTRING_LB_FARMING_HARD_NAME }, + { NULL, SPASTRING_LB_KILLS_EASY_NAME, SPASTRING_LB_KILLS_NORMAL_NAME, SPASTRING_LB_KILLS_HARD_NAME }, +}; + +const CScene_Leaderboards::LeaderboardDescriptor CScene_Leaderboards::LEADERBOARD_DESCRIPTORS[CScene_Leaderboards::NUM_LEADERBOARDS][4] = { + { + CScene_Leaderboards::LeaderboardDescriptor( STATS_VIEW_TRAVELLING_PEACEFUL, 4, STATS_COLUMN_TRAVELLING_PEACEFUL_WALKED, STATS_COLUMN_TRAVELLING_PEACEFUL_FALLEN, STATS_COLUMN_TRAVELLING_PEACEFUL_MINECART, STATS_COLUMN_TRAVELLING_PEACEFUL_BOAT, NULL, NULL, NULL,NULL), + CScene_Leaderboards::LeaderboardDescriptor( STATS_VIEW_TRAVELLING_EASY, 4, STATS_COLUMN_TRAVELLING_EASY_WALKED, STATS_COLUMN_TRAVELLING_EASY_FALLEN, STATS_COLUMN_TRAVELLING_EASY_MINECART, STATS_COLUMN_TRAVELLING_EASY_BOAT, NULL, NULL, NULL,NULL), + CScene_Leaderboards::LeaderboardDescriptor( STATS_VIEW_TRAVELLING_NORMAL, 4, STATS_COLUMN_TRAVELLING_NORMAL_WALKED, STATS_COLUMN_TRAVELLING_NORMAL_FALLEN, STATS_COLUMN_TRAVELLING_NORMAL_MINECART, STATS_COLUMN_TRAVELLING_NORMAL_BOAT, NULL, NULL, NULL,NULL), + CScene_Leaderboards::LeaderboardDescriptor( STATS_VIEW_TRAVELLING_HARD, 4, STATS_COLUMN_TRAVELLING_HARD_WALKED, STATS_COLUMN_TRAVELLING_HARD_FALLEN, STATS_COLUMN_TRAVELLING_HARD_MINECART, STATS_COLUMN_TRAVELLING_HARD_BOAT, NULL, NULL, NULL,NULL), + }, + { + CScene_Leaderboards::LeaderboardDescriptor( STATS_VIEW_MINING_BLOCKS_PEACEFUL, 7, STATS_COLUMN_MINING_BLOCKS_PEACEFUL_DIRT, STATS_COLUMN_MINING_BLOCKS_PEACEFUL_STONE, STATS_COLUMN_MINING_BLOCKS_PEACEFUL_SAND, STATS_COLUMN_MINING_BLOCKS_PEACEFUL_COBBLESTONE, STATS_COLUMN_MINING_BLOCKS_PEACEFUL_GRAVEL, STATS_COLUMN_MINING_BLOCKS_PEACEFUL_CLAY, STATS_COLUMN_MINING_BLOCKS_PEACEFUL_OBSIDIAN,NULL ), + CScene_Leaderboards::LeaderboardDescriptor( STATS_VIEW_MINING_BLOCKS_EASY, 7, STATS_COLUMN_MINING_BLOCKS_EASY_DIRT, STATS_COLUMN_MINING_BLOCKS_EASY_STONE, STATS_COLUMN_MINING_BLOCKS_EASY_SAND, STATS_COLUMN_MINING_BLOCKS_EASY_COBBLESTONE, STATS_COLUMN_MINING_BLOCKS_EASY_GRAVEL, STATS_COLUMN_MINING_BLOCKS_EASY_CLAY, STATS_COLUMN_MINING_BLOCKS_EASY_OBSIDIAN,NULL ), + CScene_Leaderboards::LeaderboardDescriptor( STATS_VIEW_MINING_BLOCKS_NORMAL, 7, STATS_COLUMN_MINING_BLOCKS_NORMAL_DIRT, STATS_COLUMN_MINING_BLOCKS_NORMAL_STONE, STATS_COLUMN_MINING_BLOCKS_NORMAL_SAND, STATS_COLUMN_MINING_BLOCKS_NORMAL_COBBLESTONE, STATS_COLUMN_MINING_BLOCKS_NORMAL_GRAVEL, STATS_COLUMN_MINING_BLOCKS_NORMAL_CLAY, STATS_COLUMN_MINING_BLOCKS_NORMAL_OBSIDIAN,NULL ), + CScene_Leaderboards::LeaderboardDescriptor( STATS_VIEW_MINING_BLOCKS_HARD, 7, STATS_COLUMN_MINING_BLOCKS_HARD_DIRT, STATS_COLUMN_MINING_BLOCKS_HARD_STONE, STATS_COLUMN_MINING_BLOCKS_HARD_SAND, STATS_COLUMN_MINING_BLOCKS_HARD_COBBLESTONE, STATS_COLUMN_MINING_BLOCKS_HARD_GRAVEL, STATS_COLUMN_MINING_BLOCKS_HARD_CLAY, STATS_COLUMN_MINING_BLOCKS_HARD_OBSIDIAN,NULL ), + }, + { + CScene_Leaderboards::LeaderboardDescriptor( STATS_VIEW_FARMING_PEACEFUL, 6, STATS_COLUMN_FARMING_PEACEFUL_EGGS, STATS_COLUMN_FARMING_PEACEFUL_WHEAT, STATS_COLUMN_FARMING_PEACEFUL_MUSHROOMS, STATS_COLUMN_FARMING_PEACEFUL_SUGARCANE, STATS_COLUMN_FARMING_PEACEFUL_MILK, STATS_COLUMN_FARMING_PEACEFUL_PUMPKINS, NULL,NULL ), + CScene_Leaderboards::LeaderboardDescriptor( STATS_VIEW_FARMING_EASY, 6, STATS_COLUMN_FARMING_EASY_EGGS, STATS_COLUMN_FARMING_PEACEFUL_WHEAT, STATS_COLUMN_FARMING_EASY_MUSHROOMS, STATS_COLUMN_FARMING_EASY_SUGARCANE, STATS_COLUMN_FARMING_EASY_MILK, STATS_COLUMN_FARMING_EASY_PUMPKINS, NULL,NULL ), + CScene_Leaderboards::LeaderboardDescriptor( STATS_VIEW_FARMING_NORMAL, 6, STATS_COLUMN_FARMING_NORMAL_EGGS, STATS_COLUMN_FARMING_NORMAL_WHEAT, STATS_COLUMN_FARMING_NORMAL_MUSHROOMS, STATS_COLUMN_FARMING_NORMAL_SUGARCANE, STATS_COLUMN_FARMING_NORMAL_MILK, STATS_COLUMN_FARMING_NORMAL_PUMPKINS, NULL,NULL ), + CScene_Leaderboards::LeaderboardDescriptor( STATS_VIEW_FARMING_HARD, 6, STATS_COLUMN_FARMING_HARD_EGGS, STATS_COLUMN_FARMING_HARD_WHEAT, STATS_COLUMN_FARMING_HARD_MUSHROOMS, STATS_COLUMN_FARMING_HARD_SUGARCANE, STATS_COLUMN_FARMING_HARD_MILK, STATS_COLUMN_FARMING_HARD_PUMPKINS, NULL,NULL ), + }, + { + CScene_Leaderboards::LeaderboardDescriptor( NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ), + CScene_Leaderboards::LeaderboardDescriptor( STATS_VIEW_KILLS_EASY, 7, STATS_COLUMN_KILLS_EASY_ZOMBIES, STATS_COLUMN_KILLS_EASY_SKELETONS, STATS_COLUMN_KILLS_EASY_CREEPERS, STATS_COLUMN_KILLS_EASY_SPIDERS, STATS_COLUMN_KILLS_EASY_SPIDERJOCKEYS, STATS_COLUMN_KILLS_EASY_ZOMBIEPIGMEN, STATS_COLUMN_KILLS_EASY_SLIME,NULL ), + CScene_Leaderboards::LeaderboardDescriptor( STATS_VIEW_KILLS_NORMAL, 7, STATS_COLUMN_KILLS_NORMAL_ZOMBIES, STATS_COLUMN_KILLS_NORMAL_SKELETONS, STATS_COLUMN_KILLS_NORMAL_CREEPERS, STATS_COLUMN_KILLS_NORMAL_SPIDERS, STATS_COLUMN_KILLS_NORMAL_SPIDERJOCKEYS, STATS_COLUMN_KILLS_NORMAL_ZOMBIEPIGMEN, STATS_COLUMN_KILLS_NORMAL_SLIME,NULL ), + CScene_Leaderboards::LeaderboardDescriptor( STATS_VIEW_KILLS_HARD, 7, STATS_COLUMN_KILLS_HARD_ZOMBIES, STATS_COLUMN_KILLS_HARD_SKELETONS, STATS_COLUMN_KILLS_HARD_CREEPERS, STATS_COLUMN_KILLS_HARD_SPIDERS, STATS_COLUMN_KILLS_HARD_SPIDERJOCKEYS, STATS_COLUMN_KILLS_HARD_ZOMBIEPIGMEN, STATS_COLUMN_KILLS_HARD_SLIME,NULL ), + }, +}; + +HRESULT CScene_Leaderboards::OnInit(XUIMessageInit *pInitData, BOOL &bHandled) +{ + m_iPad = *(int *)pInitData->pvInitData; + MapChildControls(); + m_bReady=false; + + // if we're not in the game, we need to use basescene 0 + if(Minecraft::GetInstance()->level==NULL) + { + m_iPad=DEFAULT_XUI_MENU_USER; + } + + m_bPopulatedOnce = false; + + ui.SetTooltips(m_iPad,-1, IDS_TOOLTIPS_BACK, IDS_TOOLTIPS_CHANGE_FILTER, -1); + CXuiSceneBase::ShowLogo( m_iPad, FALSE ); + + m_friends = NULL; + m_numFriends = 0; + m_filteredFriends = NULL; + m_numFilteredFriends = 0; + + m_newTop = m_newSel = -1; + + m_isProcessingStatsRead = false; + + // Alert the app the we want to be informed of ethernet connections + app.SetLiveLinkRequired( true ); + + LeaderboardManager::Instance()->OpenSession(); + + //GetFriends(); + + m_currentLeaderboard = 0; + m_currentDifficulty = 2; + SetLeaderboardHeader(); + + m_currentFilter = LeaderboardManager::eFM_Friends; + wchar_t filterBuffer[40]; + swprintf(filterBuffer, 40, L"%ls%ls", app.GetString(IDS_LEADERBOARD_FILTER), app.GetString(IDS_LEADERBOARD_FILTER_FRIENDS)); + m_textFilter.SetText(filterBuffer); + + wchar_t entriesBuffer[40]; + swprintf(entriesBuffer, 40, L"%ls%i", app.GetString(IDS_LEADERBOARD_ENTRIES), 0); + m_textEntries.SetText(entriesBuffer); + + ReadStats(-1); + + // title icons + for(int i=0;i<7;i++) + { + m_pHTitleIconSlots[i]=NULL; + m_fTitleIconXPositions[i]=0.0f; + m_fTextXPositions[i]=0.0f; + m_hTextEntryA[i]=NULL; + } + + + bHandled = TRUE; + return S_OK; +} + + +void CScene_Leaderboards::Reposition(int iNumber) +{ + float fIconSize; // including gap + float fNewIconIncrement; + D3DXVECTOR3 vPos; + + fIconSize=(m_fTitleIconXPositions[6]-m_fTitleIconXPositions[0])/6.0f; + fNewIconIncrement=(fIconSize*7.0f)/(float)iNumber; + + // reposition the title icons based on the number there are + for(int i=0;iGetPosition(&vPos); + vPos.x=m_fTitleIconXPositions[0]+(((float)i)*fNewIconIncrement)+(fNewIconIncrement-fIconSize)/2.0f; + m_pHTitleIconSlots[i]->SetPosition(&vPos); + } +} + +void CScene_Leaderboards::RepositionText(int iNumber) +{ + float fTextSize; // including gap + float fNewTextIncrement; + D3DXVECTOR3 vPos; + + fTextSize=(m_fTextXPositions[6]-m_fTextXPositions[0])/6.0f; + fNewTextIncrement=(fTextSize*7.0f)/(float)iNumber; + + // reposition the title icons based on the number there are + for(int i=0;iCancelOperation(); + LeaderboardManager::Instance()->CloseSession(); + + // Alert the app the we no longer want to be informed of ethernet connections + app.SetLiveLinkRequired( false ); + + while( m_isProcessingStatsRead ) + { + Sleep( 10 ); + } + + if( m_friends != NULL ) + delete [] m_friends; + + if( m_filteredFriends != NULL ) + delete [] m_filteredFriends; + + return S_OK; +} + +HRESULT CScene_Leaderboards::OnNotifySetFocus(HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled) +{ + UpdateTooltips(); + return S_OK; +} + +HRESULT CScene_Leaderboards::OnNotifySelChanged(HXUIOBJ hObjSource, XUINotifySelChanged *pNotifySelChangedData, BOOL& bHandled) +{ + + if(m_bReady && pNotifySelChangedData->iOldItem!=-1) + { + CXuiSceneBase::PlayUISFX(eSFX_Focus); + } + + return S_OK; +} + +void CScene_Leaderboards::UpdateTooltips() +{ + int iTooltipFriendRequest=-1; + int iTooltipGamerCardOrProfile=-1; + if( m_leaderboard.m_currentEntryCount > 0 ) + { + unsigned int selection = (unsigned int)m_listGamers.GetCurSel(); + + // if the selected user is me, don't show Send Friend Request, and show the gamer profile, not the gamer card + + // Check that the index is actually within range of the data we've got before accessing the m_leaderboard.m_entries array + int idx = selection - (m_leaderboard.m_entryStartIndex-1); + if( ( idx < 0 ) || ( idx >= NUM_ENTRIES ) ) + { + return; + } + if(m_leaderboard.m_entries[idx].m_bPlayer) + { + iTooltipGamerCardOrProfile=IDS_TOOLTIPS_VIEW_GAMERPROFILE; + } + else + { + iTooltipGamerCardOrProfile=IDS_TOOLTIPS_VIEW_GAMERCARD; + // if we're on the friends filter, then don't show the Send Friend Request + bool bIsFriend = m_currentFilter == LeaderboardManager::eFM_Friends; + + if(!bIsFriend) + { + // check the entry we're on + if( m_leaderboard.m_currentEntryCount > 0 ) + { + if( selection >= m_leaderboard.m_entryStartIndex-1 && + selection < (m_leaderboard.m_entryStartIndex+m_leaderboard.m_currentEntryCount-1) ) + { + if( (m_leaderboard.m_entries[selection - (m_leaderboard.m_entryStartIndex-1)].m_bFriend==false) && (m_leaderboard.m_entries[selection - (m_leaderboard.m_entryStartIndex-1)].m_bRequestedFriend==false)) + { + iTooltipFriendRequest=IDS_TOOLTIPS_SEND_FRIEND_REQUEST; + } + } + } + } + } + } + + // 4J-PB - no room on the screen for the LT/RT prompt + /* + if(m_leaderboard.m_currentEntryCount>11) + { + ui.SetTooltips(m_iPad, iTooltipFriendRequest, IDS_TOOLTIPS_BACK, IDS_TOOLTIPS_CHANGE_FILTER, iTooltipGamerCardOrProfile, IDS_TOOLTIPS_PAGEUP, IDS_TOOLTIPS_PAGEDOWN); + } + else*/ + { + ui.SetTooltips(m_iPad, iTooltipFriendRequest, IDS_TOOLTIPS_BACK, IDS_TOOLTIPS_CHANGE_FILTER, iTooltipGamerCardOrProfile); + } +} + +HRESULT CScene_Leaderboards::OnKeyDown(XUIMessageInput* pInputData, BOOL& bHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + switch(pInputData->dwKeyCode) + { + case VK_PAD_RSHOULDER: + case VK_PAD_LSHOULDER: + { + //Do nothing if a stats read is currently in progress, otherwise the system complains about to many read requests + if(m_bPopulatedOnce && LeaderboardManager::Instance()->isIdle() ) + { + if( pInputData->dwKeyCode == VK_PAD_RSHOULDER ) + { + ++m_currentDifficulty; + if( m_currentDifficulty == 4 ) + m_currentDifficulty = 0; + + if( m_currentLeaderboard == LEADERBOARD_KILLS_POSITION && m_currentDifficulty == 0 ) + m_currentDifficulty = 1; + } + else + { + if( m_currentDifficulty == 0 ) + m_currentDifficulty = 4; + --m_currentDifficulty; + + if( m_currentLeaderboard == LEADERBOARD_KILLS_POSITION && m_currentDifficulty == 0 ) + m_currentDifficulty = 3; + } + + SetLeaderboardHeader(); + ClearLeaderboardTitlebar(); + + ReadStats(-1); + CXuiSceneBase::PlayUISFX(eSFX_Press); + } + + bHandled = TRUE; + } + break; + case VK_PAD_LTHUMB_RIGHT: + case VK_PAD_LTHUMB_LEFT: + case VK_PAD_DPAD_LEFT: + case VK_PAD_DPAD_RIGHT: + { + //Do nothing if a stats read is currently in progress, otherwise the system complains about to many read requests + if ( m_bPopulatedOnce && LeaderboardManager::Instance()->isIdle() ) + { + m_bReady=false; + if(( pInputData->dwKeyCode == VK_PAD_LTHUMB_RIGHT ) ||(pInputData->dwKeyCode == VK_PAD_DPAD_RIGHT)) + { + ++m_currentLeaderboard; + if( m_currentLeaderboard == NUM_LEADERBOARDS ) + m_currentLeaderboard = 0; + } + else + { + if( m_currentLeaderboard == 0 ) + m_currentLeaderboard = NUM_LEADERBOARDS; + --m_currentLeaderboard; + } + + if( m_currentLeaderboard == LEADERBOARD_KILLS_POSITION && m_currentDifficulty == 0 ) + m_currentDifficulty = 1; + + SetLeaderboardHeader(); + ClearLeaderboardTitlebar(); + + + ReadStats(-1); + CXuiSceneBase::PlayUISFX(eSFX_Press); + } + bHandled = TRUE; + } + break; + case VK_PAD_LTRIGGER: + case VK_PAD_RTRIGGER: + { + //Do nothing if a stats read is currently in progress, otherwise the system complains about to many read requests + if( m_bPopulatedOnce && LeaderboardManager::Instance()->isIdle() ) + { + if( m_leaderboard.m_totalEntryCount <= 10 ) + break; + + if( pInputData->dwKeyCode == VK_PAD_LTRIGGER ) + { + m_newTop = m_listGamers.GetTopItem() - 10; + if( m_newTop < 0 ) + m_newTop = 0; + + m_newSel = m_newTop; + } + else + { + m_newTop = m_listGamers.GetTopItem() + 10; + if( m_newTop+10 > (int)m_leaderboard.m_totalEntryCount ) + { + m_newTop = m_leaderboard.m_totalEntryCount - 10; + if( m_newTop < 0 ) + m_newTop = 0; + } + + m_newSel = m_newTop; + } + //CXuiSceneBase::PlayUISFX(eSFX_Press); + } + bHandled = TRUE; + } + break; + case VK_PAD_X: + { + //Do nothing if a stats read is currently in progress, otherwise the system complains about to many read requests + if( m_bPopulatedOnce && LeaderboardManager::Instance()->isIdle() ) + { + switch( m_currentFilter ) + { + case LeaderboardManager::eFM_Friends: + { + m_currentFilter = LeaderboardManager::eFM_MyScore; + wchar_t filterBuffer[40]; + swprintf_s(filterBuffer, 40, L"%ls%ls", app.GetString(IDS_LEADERBOARD_FILTER), app.GetString(IDS_LEADERBOARD_FILTER_MYSCORE)); + m_textFilter.SetText(filterBuffer); + } + break; + case LeaderboardManager::eFM_MyScore: + { + m_currentFilter = LeaderboardManager::eFM_TopRank; + wchar_t filterBuffer[40]; + swprintf_s(filterBuffer, 40, L"%ls%ls", app.GetString(IDS_LEADERBOARD_FILTER), app.GetString(IDS_LEADERBOARD_FILTER_OVERALL)); + m_textFilter.SetText(filterBuffer); + } + break; + case LeaderboardManager::eFM_TopRank: + { + m_currentFilter = LeaderboardManager::eFM_Friends; + wchar_t filterBuffer[40]; + swprintf_s(filterBuffer, 40, L"%ls%ls", app.GetString(IDS_LEADERBOARD_FILTER), app.GetString(IDS_LEADERBOARD_FILTER_FRIENDS)); + m_textFilter.SetText(filterBuffer); + } + break; + } + + ReadStats(-1); + CXuiSceneBase::PlayUISFX(eSFX_Press); + } + bHandled = TRUE; + } + break; + case VK_PAD_Y: + { + //Show gamercard + if( m_leaderboard.m_currentEntryCount > 0 ) + { + unsigned int selection = (unsigned int)m_listGamers.GetCurSel(); + if( selection >= m_leaderboard.m_entryStartIndex-1 && + selection < (m_leaderboard.m_entryStartIndex+m_leaderboard.m_currentEntryCount-1) ) + { + PlayerUID xuid = m_leaderboard.m_entries[selection - (m_leaderboard.m_entryStartIndex-1)].m_xuid; + if( xuid != INVALID_XUID ) + { + XShowGamerCardUI(ProfileManager.GetLockedProfile(), xuid); + CXuiSceneBase::PlayUISFX(eSFX_Press); + } + } + } + bHandled = TRUE; + } + break; + case VK_PAD_A: + { + //Send friend request if the filter mode is not friend, and they're not a friend or a pending friend + if( m_currentFilter != LeaderboardManager::eFM_Friends ) + { + if( m_leaderboard.m_currentEntryCount > 0 ) + { + unsigned int selection = (unsigned int)m_listGamers.GetCurSel(); + if( selection >= m_leaderboard.m_entryStartIndex-1 && + selection < (m_leaderboard.m_entryStartIndex+m_leaderboard.m_currentEntryCount-1) ) + { + //If not the player and neither currently a friend or requested to be a friend + if( !m_leaderboard.m_entries[selection - (m_leaderboard.m_entryStartIndex-1) ].m_bPlayer && + !m_leaderboard.m_entries[selection - (m_leaderboard.m_entryStartIndex-1) ].m_bFriend && + !m_leaderboard.m_entries[selection - (m_leaderboard.m_entryStartIndex-1) ].m_bRequestedFriend ) + { + PlayerUID xuid = m_leaderboard.m_entries[selection - (m_leaderboard.m_entryStartIndex-1) ].m_xuid; + if( xuid != INVALID_XUID ) + { + XShowFriendRequestUI(ProfileManager.GetLockedProfile(), xuid); + CXuiSceneBase::PlayUISFX(eSFX_Press); + } + } + } + } + } + bHandled = TRUE; + } + break; + case VK_PAD_B: + case VK_ESCAPE: + { + BYTE userIndex = pInputData->UserIndex; + if( !app.IsPauseMenuDisplayed(userIndex) ) + { + // If we are not from a pause menu, then we are from the main menu + userIndex = XUSER_INDEX_ANY; + } + + app.NavigateBack(userIndex); + bHandled = TRUE; + } + break; + } + return S_OK; +} + +// DELETING // +#if 0 +void CScene_Leaderboards::GetFriends() +{ + DWORD resultsSize; + HANDLE hEnumerator; + DWORD ret; + + m_numFriends = 0; + + //First, get a list of (up to 100) friends (this is the maximum that the enumerator currently supports) + ret = XFriendsCreateEnumerator( ProfileManager.GetLockedProfile(), 0, 100, &resultsSize, &hEnumerator); + if( ret != ERROR_SUCCESS ) + return; + + m_friends = (XONLINE_FRIEND*) new BYTE[ resultsSize ]; + DWORD numFriends; + + ret = XEnumerate( + hEnumerator, + m_friends, + resultsSize, + &numFriends, + NULL ); + + if( ret != ERROR_SUCCESS ) + numFriends = 0; + + m_numFriends = numFriends; + + m_filteredFriends = new PlayerUID[m_numFriends+1]; + + m_numFilteredFriends = 0; + for( unsigned int friendIndex=0 ; friendIndexGetMyXUID(); +} +#endif + +void CScene_Leaderboards::ReadStats(int startIndex) +{ + //If startIndex == -1, then use default values + if( startIndex == -1 ) + { + m_newEntryIndex = 1; + m_newReadSize = READ_SIZE; + + m_leaderboard.m_totalEntryCount = 0; + m_leaderboard.m_currentEntryCount = 0; + + m_listGamers.DeleteItems(0, m_listGamers.GetItemCount()); + } + else + { + m_newEntryIndex = (unsigned int)startIndex; + m_newReadSize = min((int)READ_SIZE, (int)m_leaderboard.m_totalEntryCount-(startIndex-1)); + } + + //Setup the spec structure for the read request + /* XUSER_STATS_SPEC* spec = new XUSER_STATS_SPEC[1]; // 4j-jev, moved into xboxLeaderboardManager + spec[0].dwViewId = LEADERBOARD_DESCRIPTORS[m_currentLeaderboard][m_currentDifficulty].m_viewId; + spec[0].dwNumColumnIds = LEADERBOARD_DESCRIPTORS[m_currentLeaderboard][m_currentDifficulty].m_columnCount; + for( unsigned int i=0 ; iReadStats( + m_newEntryIndex, + m_newReadSize, + 1, + spec, + (startIndex == -1) ? m_currentFilter : LeaderboardManager::eFM_TopRank, + CScene_Leaderboards::OnStatsReadComplete, + reinterpret_cast(this), + m_numFilteredFriends, + m_filteredFriends);*/ + + switch (startIndex == -1 ? m_currentFilter : LeaderboardManager::eFM_TopRank) + { + case LeaderboardManager::eFM_TopRank: + LeaderboardManager::Instance()->ReadStats_TopRank( this, + m_currentDifficulty, (LeaderboardManager::EStatsType) m_currentLeaderboard, + m_newEntryIndex, m_newReadSize + ); + break; + case LeaderboardManager::eFM_MyScore: + LeaderboardManager::Instance()->ReadStats_MyScore( this, + m_currentDifficulty, (LeaderboardManager::EStatsType) m_currentLeaderboard, + INVALID_XUID/*ignored*/, + m_newReadSize + ); + break; + case LeaderboardManager::eFM_Friends: + LeaderboardManager::Instance()->ReadStats_Friends( this, + m_currentDifficulty, (LeaderboardManager::EStatsType) m_currentLeaderboard, + INVALID_XUID /*ignored*/, + 0 /*ignored*/, 0 /*ignored*/ + ); + break; + } + + //Show the loading message + m_textInfo.SetText(app.GetString(IDS_LEADERBOARD_LOADING)); + m_textInfo.SetShow(true); +} + +bool CScene_Leaderboards::OnStatsReadComplete(bool success, int numResults, LeaderboardManager::ViewOut results) +{ + //CScene_Leaderboards* scene = reinterpret_cast(userdata); + + m_isProcessingStatsRead = true; + + //bool noResults = LeaderboardManager::Instance()->GetStatsState() != XboxLeaderboardManager::eStatsState_Ready; + bool ret; + + if (success) + { + m_numStats = numResults; + m_stats = results; + ret = RetrieveStats(); + } + else ret = true; + + //else LeaderboardManager::Instance()->SetStatsRetrieved(false); + + PopulateLeaderboard(!success); + + m_isProcessingStatsRead = false; + + return ret; +} + + +bool CScene_Leaderboards::RetrieveStats() +{ + + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<SetStatsRetrieved(true); + + return true; + } + + //assert( LeaderboardManager::Instance()->GetStats() != NULL ); + //PXUSER_STATS_READ_RESULTS stats = LeaderboardManager::Instance()->GetStats(); + //if( m_currentFilter == LeaderboardManager::eFM_Friends ) LeaderboardManager::Instance()->SortFriendStats(); + + bool isDistanceLeaderboard = m_stats->pViews[0].dwViewId == STATS_VIEW_TRAVELLING_PEACEFUL || m_stats->pViews[0].dwViewId == STATS_VIEW_TRAVELLING_EASY || m_stats->pViews[0].dwViewId == STATS_VIEW_TRAVELLING_NORMAL || m_stats->pViews[0].dwViewId == STATS_VIEW_TRAVELLING_HARD; + + //First read + if( m_leaderboard.m_totalEntryCount == 0 ) + { + m_leaderboard.m_totalEntryCount = (m_currentFilter == LeaderboardManager::eFM_Friends) ? m_stats->pViews[0].dwNumRows : m_stats->pViews[0].dwTotalViewRows; + m_leaderboard.m_currentEntryCount = m_stats->pViews[0].dwNumRows; + + if( m_leaderboard.m_totalEntryCount == 0 || m_leaderboard.m_currentEntryCount == 0 ) + { + //LeaderboardManager::Instance()->SetStatsRetrieved(false); + return false; + } + + m_leaderboard.m_numColumns = m_stats->pViews[0].pRows[0].dwNumColumns; + + m_leaderboard.m_entryStartIndex = (m_currentFilter == LeaderboardManager::eFM_Friends) ? 1 : m_stats->pViews[0].pRows[0].dwRank; + + for( unsigned int entryIndex=0 ; entryIndexpViews[0].pRows[entryIndex]), &(m_leaderboard.m_entries[entryIndex]), isDistanceLeaderboard); + + //If the filter mode is "My Score" then centre the list around the entries and select the player's score + if( m_currentFilter == LeaderboardManager::eFM_MyScore ) + { + //Centre the leaderboard list on the entries + m_newTop = m_leaderboard.m_entryStartIndex-1; + + //Select the player entry + for( unsigned int i=m_leaderboard.m_entryStartIndex ; i9) + { + m_newTop=m_newSel-9; + } + break; + } + } + } + //Additional read + else + { + unsigned int insertPosition = 0; + + //If the first new entry is at a smaller index than the current first entry + if( m_newEntryIndex < m_leaderboard.m_entryStartIndex ) + { + if( (m_leaderboard.m_entryStartIndex-1) < m_newReadSize ) + m_newReadSize = m_leaderboard.m_entryStartIndex-1; + + //Move current entries forward + memmove((void*)(m_leaderboard.m_entries+m_newReadSize), (void*)m_leaderboard.m_entries, sizeof(LeaderboardEntry)*(NUM_ENTRIES-m_newReadSize)); + + //Set the (now smaller) entry start index + m_leaderboard.m_entryStartIndex = m_newEntryIndex; + + //We will be inserting the new entries at the start of the array + insertPosition = 0; + + //Entry count is either max possible entries or current entry count + read size, whichever is smaller + m_leaderboard.m_currentEntryCount = min((int)NUM_ENTRIES, (int)(m_leaderboard.m_currentEntryCount+m_newReadSize)); + } + //If the last new entry is at a greater position than the last possible entry + else if( m_newEntryIndex+m_newReadSize-1 >= m_leaderboard.m_entryStartIndex+NUM_ENTRIES ) + { + //Calculate the overlap (this is by how much new entries would overhang the end of the array) + int overlap = (((m_newEntryIndex-1)+m_newReadSize-1) - (m_leaderboard.m_entryStartIndex-1)) - NUM_ENTRIES + 1; + + //Move current entries backwards + memmove((void*)m_leaderboard.m_entries, (void*)(m_leaderboard.m_entries+overlap), sizeof(LeaderboardEntry)*(NUM_ENTRIES-overlap)); + + //Set the (now larger) start index + m_leaderboard.m_entryStartIndex += overlap; + + //We will be inserting the new entries at the end of the array + insertPosition = NUM_ENTRIES - m_newReadSize; + + //Entry count is max possible entries + m_leaderboard.m_currentEntryCount = NUM_ENTRIES; + } + //Otherwise we're inserting at the end of the array and there is plenty of room + else + { + insertPosition = m_leaderboard.m_currentEntryCount; + m_leaderboard.m_currentEntryCount += m_newReadSize; + } + + //For each entry in the leaderboard + for( unsigned int entryIndex=0 ; entryIndexpViews[0].pRows[entryIndex]), &(m_leaderboard.m_entries[insertPosition]), isDistanceLeaderboard); + insertPosition++; + } + } + + //LeaderboardManager::Instance()->SetStatsRetrieved(true); + return true; +} + +HRESULT CScene_Leaderboards::OnGetItemCountAll(XUIMessageGetItemCount *pGetItemCountData, BOOL& bHandled) +{ + pGetItemCountData->cItems = m_leaderboard.m_totalEntryCount; + + //if(LeaderboardManager::Instance()->GetStatsRead()) + //{ + // m_bReady=true; + //} + bHandled = TRUE; + + return S_OK; +} + +HRESULT CScene_Leaderboards::OnGetSourceDataText(XUIMessageGetSourceText *pGetSourceTextData,BOOL& bHandled) +{ + if( pGetSourceTextData->bItemData ) + { + if( m_newTop != -1 && m_newSel != -1 ) + { + HRESULT ret = m_listGamers.SetTopItem(m_newTop); + assert( ret == S_OK ); + + ret = m_listGamers.SetCurSel(m_newSel); + assert( ret == S_OK ); + + // update the tooltips + + m_newTop = m_newSel = -1; + + bHandled = true; + return S_OK; + } + + unsigned int item = pGetSourceTextData->iItem; + + if( m_leaderboard.m_totalEntryCount > 0 && (item+1) < m_leaderboard.m_entryStartIndex ) + { + if( LeaderboardManager::Instance()->isIdle() ) + { + int readIndex = m_leaderboard.m_entryStartIndex - READ_SIZE; + if( readIndex <= 0 ) + readIndex = 1; + assert( readIndex >= 1 && readIndex <= (int)m_leaderboard.m_totalEntryCount ); + ReadStats(readIndex); + } + } + else if( m_leaderboard.m_totalEntryCount > 0 && (item+1) >= (m_leaderboard.m_entryStartIndex+m_leaderboard.m_currentEntryCount) ) + { + if( LeaderboardManager::Instance()->isIdle() ) + { + int readIndex = m_leaderboard.m_entryStartIndex + m_leaderboard.m_currentEntryCount; + assert( readIndex >= 1 && readIndex <= (int)m_leaderboard.m_totalEntryCount ); + ReadStats(readIndex); + } + } + else + { + unsigned int index = item - (m_leaderboard.m_entryStartIndex-1); + if( 0 == pGetSourceTextData->iData ) + { + pGetSourceTextData->szText = m_leaderboard.m_entries[index].m_wcRank; + bHandled = TRUE; + } + else if( 1 == pGetSourceTextData->iData ) + { + pGetSourceTextData->szText = m_leaderboard.m_entries[index].m_gamerTag; + bHandled = TRUE; + } + else if( pGetSourceTextData->iData >= 3 && pGetSourceTextData->iData <= 9 ) + { + if( m_leaderboard.m_numColumns <= (unsigned int)(pGetSourceTextData->iData-3) ) + pGetSourceTextData->szText = L""; + else + pGetSourceTextData->szText = m_leaderboard.m_entries[index].m_wcColumns[pGetSourceTextData->iData-3]; + bHandled = TRUE; + } + } + } + return S_OK; +} + +HRESULT CScene_Leaderboards::OnGetSourceDataImage(XUIMessageGetSourceImage* pGetImage, BOOL& bHandled) +{ + if( (pGetImage->iData == 2) && (pGetImage->bItemData) ) + { + if( m_newTop != -1 && m_newSel != -1 ) + { + //Do nothing, alignment handled in OnGetSourceDataText + + bHandled = true; + return S_OK; + } + + unsigned int item = pGetImage->iItem; + if( m_leaderboard.m_totalEntryCount > 0 && (item+1) < m_leaderboard.m_entryStartIndex ) + { + //Do nothing, reading handled in OnGetSourceDataText + } + else if( m_leaderboard.m_totalEntryCount > 0 && (item+1) >= (m_leaderboard.m_entryStartIndex+m_leaderboard.m_currentEntryCount) ) + { + //Do nothing, reading handled in OnGetSourceDataText + } + // 4J-PB - we're not allowed to show flags any more +// else +// { +// unsigned int index = item - (m_leaderboard.m_entryStartIndex-1); +// if( m_leaderboard.m_entries[index].m_locale > 0 && m_leaderboard.m_entries[index].m_locale <= XC_LOCALE_RUSSIAN_FEDERATION ) +// pGetImage->szPath = FLAG_ICON_PATHS[ m_leaderboard.m_entries[index].m_locale-1 ]; +// bHandled = TRUE; +// } + } + + return S_OK; +} + +void CScene_Leaderboards::PopulateLeaderboard(bool noResults) +{ + HRESULT hr; + HXUIOBJ visual=NULL; + HXUIOBJ hTemp=NULL; + hr=XuiControlGetVisual(m_listGamers.m_hObj,&visual); + + if(m_pHTitleIconSlots[0]==NULL) + { + VOID *pObj; + HXUIOBJ button; + D3DXVECTOR3 vPos; + + for(int i=0;i<7;i++) + { + // retrieve the visual for the title icon + hr=XuiElementGetChildById(visual,m_TitleIconNameA[i],&button); + + XuiObjectFromHandle( button, &pObj ); + m_pHTitleIconSlots[i] = (CXuiCtrlCraftIngredientSlot *)pObj; + + // store the default position, since we'll be repositioning these depending on how many are valid for each board + m_pHTitleIconSlots[i]->GetPosition(&vPos); + m_fTitleIconXPositions[i]= vPos.x; + } + } + + int iValidSlots=SetLeaderboardTitleIcons(); + + if( !noResults && m_leaderboard.m_totalEntryCount > 0 ) + { + hr=XuiElementGetChildById(visual,L"XuiLabel_Gamertag",&hTemp); + if(hTemp) + { + XuiControlSetText(hTemp,app.GetString( IDS_LEADERBOARD_GAMERTAG )); + XuiElementSetShow(hTemp, TRUE); + } + hr=XuiElementGetChildById(visual,L"XuiLabel_Rank",&hTemp); + if(hTemp) + { + XuiControlSetText(hTemp,app.GetString( IDS_LEADERBOARD_RANK )); + XuiElementSetShow(hTemp, TRUE); + } + + //Update entries display + wchar_t entriesBuffer[40]; + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<SetShow(FALSE); + } + } + else + { + hr=XuiElementGetChildById(visual,L"XuiLabel_Gamertag",&hTemp); + if(hTemp) + { + XuiElementSetShow(hTemp, FALSE); + } + hr=XuiElementGetChildById(visual,L"XuiLabel_Rank",&hTemp); + if(hTemp) + { + XuiElementSetShow(hTemp, FALSE); + } + + //Update entries display (to zero) + wchar_t entriesBuffer[40]; + swprintf(entriesBuffer, 40, L"%ls0", app.GetString(IDS_LEADERBOARD_ENTRIES)); + m_textEntries.SetText(entriesBuffer); + + //Show the no results message + m_textInfo.SetText(app.GetString(IDS_LEADERBOARD_NORESULTS)); + m_textInfo.SetShow(true); + + // hide the icons + for(int i=0;i<7;i++) + { + m_pHTitleIconSlots[i]->SetShow(FALSE); + } + + } + + m_bPopulatedOnce = true; +} + +void CScene_Leaderboards::CopyLeaderboardEntry(PXUSER_STATS_ROW statsRow, LeaderboardEntry* leaderboardEntry, bool isDistanceLeaderboard) +{ + leaderboardEntry->m_xuid = statsRow->xuid; + + //Copy the rank + leaderboardEntry->m_rank = statsRow->dwRank; + DWORD displayRank = leaderboardEntry->m_rank; + if(displayRank > 9999999) displayRank = 9999999; + swprintf_s(leaderboardEntry->m_wcRank, 12, L"%u", displayRank); + + //strcpy(statsRow->szGamertag,"WWWWWWWWWWWWWWWW"); + + //Convert the gamertag from char to wchar_t + MultiByteToWideChar( + CP_UTF8, + 0, + statsRow->szGamertag, + strlen(statsRow->szGamertag), + leaderboardEntry->m_gamerTag, + XUSER_NAME_SIZE ); + //Null terminate the gamertag + leaderboardEntry->m_gamerTag[strlen(statsRow->szGamertag)] = L'\0'; + + //Copy the locale + //leaderboardEntry->m_locale = statsRow->pColumns[0].Value.nData; + + //Copy the other columns + for( unsigned int i=0 ; idwNumColumns ; i++ ) + { + leaderboardEntry->m_columns[i] = statsRow->pColumns[i].Value.nData; + if( !isDistanceLeaderboard ) + { + DWORD displayValue = leaderboardEntry->m_columns[i]; + if(displayValue > 99999) displayValue = 99999; + swprintf_s(leaderboardEntry->m_wcColumns[i], 12, L"%u",displayValue); +#ifdef _DEBUG + app.DebugPrintf("Value - %d\n",leaderboardEntry->m_columns[i]); +#endif + } + else + { + // check how many digits we have + int iDigitC=0; + unsigned int uiVal=leaderboardEntry->m_columns[i]; +// uiVal=0xFFFFFFFF; +// leaderboardEntry->m_columns[i-1]=uiVal; + + while(uiVal!=0) + { + uiVal/=10; + iDigitC++; + } + +#ifdef _DEBUG + app.DebugPrintf("Value - %d\n",leaderboardEntry->m_columns[i]); +#endif + if(iDigitC<4) + { + // m + swprintf_s(leaderboardEntry->m_wcColumns[i], 12, L"%um", leaderboardEntry->m_columns[i]); +#ifdef _DEBUG + app.DebugPrintf("Display - %um\n", leaderboardEntry->m_columns[i]); +#endif + } + else if(iDigitC<8) + { + // km with a .X + swprintf_s(leaderboardEntry->m_wcColumns[i], 12, L"%.1fkm", ((float)leaderboardEntry->m_columns[i])/1000.f); +#ifdef _DEBUG + app.DebugPrintf("Display - %.1fkm\n", ((float)leaderboardEntry->m_columns[i])/1000.f); +#endif + } + else + { + // bigger than that, so no decimal point + swprintf_s(leaderboardEntry->m_wcColumns[i], 12, L"%.0fkm", ((float)leaderboardEntry->m_columns[i])/1000.f); +#ifdef _DEBUG + app.DebugPrintf("Display - %.0fkm\n", ((float)leaderboardEntry->m_columns[i])/1000.f); +#endif + } + } + } + + //Is the player + if( statsRow->xuid == ((XboxLeaderboardManager*)LeaderboardManager::Instance())->GetMyXUID() ) + { + leaderboardEntry->m_bPlayer = true; + leaderboardEntry->m_bOnline = false; + leaderboardEntry->m_bFriend = false; + leaderboardEntry->m_bRequestedFriend = false; + } + else + { + leaderboardEntry->m_bPlayer = false; + leaderboardEntry->m_bOnline = false; + leaderboardEntry->m_bFriend = false; + leaderboardEntry->m_bRequestedFriend = false; + + //Check for friend status + for( unsigned int friendIndex=0 ; friendIndexxuid ) + { + if( ( m_friends[friendIndex].dwFriendState & ( XONLINE_FRIENDSTATE_FLAG_SENTREQUEST | XONLINE_FRIENDSTATE_FLAG_RECEIVEDREQUEST ) ) == 0 ) + { + //Is friend, might be online + leaderboardEntry->m_bFriend = true; + leaderboardEntry->m_bOnline = ( m_friends[friendIndex].dwFriendState & XONLINE_FRIENDSTATE_FLAG_ONLINE ); + leaderboardEntry->m_bRequestedFriend = false; + } + else + { + //Friend request sent but not accepted yet + leaderboardEntry->m_bOnline = false; + leaderboardEntry->m_bFriend = false; + leaderboardEntry->m_bRequestedFriend = true; + } + + break; + } + } + } +} + +void CScene_Leaderboards::SetLeaderboardHeader() +{ + WCHAR buffer[40]; + DWORD bufferLength = 40; + + DWORD ret = XResourceGetString(LEADERBOARD_HEADERS[m_currentLeaderboard][m_currentDifficulty], buffer, &bufferLength, NULL); + + if( ret == ERROR_SUCCESS ) + m_textLeaderboard.SetText(buffer); +} + +int CScene_Leaderboards::SetLeaderboardTitleIcons() +{ + int iValidIcons=0; + + for(int i=0;i<7;i++) + { + if(TitleIcons[m_currentLeaderboard][i]==0) + { + m_pHTitleIconSlots[i]->SetShow(FALSE); + } + else + { + iValidIcons++; + m_pHTitleIconSlots[i]->SetIcon(DEFAULT_XUI_MENU_USER,TitleIcons[m_currentLeaderboard][i],0,1,10,31,false,FALSE); + } + } + + Reposition(iValidIcons); + + return iValidIcons; +} +void CScene_Leaderboards::ClearLeaderboardTitlebar() +{ + for(int i=0;i<7;i++) + { + m_pHTitleIconSlots[i]->SetShow(FALSE); + } + + HXUIOBJ visual=NULL; + HXUIOBJ hTemp=NULL; + HRESULT hr; + hr=XuiControlGetVisual(m_listGamers.m_hObj,&visual); + + hr=XuiElementGetChildById(visual,L"XuiLabel_Gamertag",&hTemp); + if(hTemp) + { + XuiElementSetShow(hTemp, FALSE); + } + hr=XuiElementGetChildById(visual,L"XuiLabel_Rank",&hTemp); + if(hTemp) + { + XuiElementSetShow(hTemp, FALSE); + } +} diff --git a/Minecraft.Client/Common/XUI/XUI_Leaderboards.h b/Minecraft.Client/Common/XUI/XUI_Leaderboards.h new file mode 100644 index 00000000..e06f13e1 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Leaderboards.h @@ -0,0 +1,169 @@ +#pragma once +#include "XUI_Helper.h" +#include "../media/xuiscene_leaderboards.h" + +#include "..\Leaderboards\LeaderboardManager.h" + +class CXuiCtrlCraftIngredientSlot; + +class CScene_Leaderboards : public CXuiSceneImpl, public LeaderboardReadListener +{ +private: + // 4J Stu - Because the kills leaderboard doesn't a peaceful entry there are some special + // handling to make it skip that. We have re-arranged the order of the leaderboards so + // I am making this in case we do it again. + // 4J Stu - Made it a member of the class, rather than a #define + static const int LEADERBOARD_KILLS_POSITION = 3; + + static const int NUM_LEADERBOARDS = 4;//6; //Number of leaderboards + static const int NUM_ENTRIES = 101; //Cache up to this many entries + static const int READ_SIZE = 15; //Read this many entries at a time + +// static LPCWSTR FLAG_ICON_PATHS[37]; + int m_iPad; + + bool m_bPopulatedOnce; + + static const int LEADERBOARD_HEADERS[NUM_LEADERBOARDS][4]; + + static const int TitleIcons[NUM_LEADERBOARDS][7]; + static LPCWSTR m_TitleIconNameA[7]; + static LPCWSTR m_TextColumnNameA[7]; + HXUIOBJ m_hTextEntryA[7]; + + struct LeaderboardDescriptor { + DWORD m_viewId; + DWORD m_columnCount; + WORD m_columnIds[8]; + + LeaderboardDescriptor(DWORD viewId, DWORD columnCount, WORD columnId_0, WORD columnId_1, WORD columnId_2, WORD columnId_3, WORD columnId_4, WORD columnId_5, WORD columnId_6, WORD columnId_7) + { + m_viewId = viewId; + m_columnCount = columnCount; + m_columnIds[0] = columnId_0; + m_columnIds[1] = columnId_1; + m_columnIds[2] = columnId_2; + m_columnIds[3] = columnId_3; + m_columnIds[4] = columnId_4; + m_columnIds[5] = columnId_5; + m_columnIds[6] = columnId_6; + m_columnIds[7] = columnId_7; + } + }; + + static const LeaderboardDescriptor LEADERBOARD_DESCRIPTORS[NUM_LEADERBOARDS][4]; + + struct LeaderboardEntry { + PlayerUID m_xuid; + DWORD m_rank; + WCHAR m_wcRank[12]; + WCHAR m_gamerTag[XUSER_NAME_SIZE+1]; + //int m_locale; + unsigned int m_columns[7]; + WCHAR m_wcColumns[7][12]; + bool m_bPlayer; //Is the player + bool m_bOnline; //Is online + bool m_bFriend; //Is friend + bool m_bRequestedFriend; //Friend request sent but not answered + }; + + struct Leaderboard { + DWORD m_totalEntryCount; //Either total number of entries in leaderboard, or total number of results for a friends query + DWORD m_entryStartIndex; //Index of first entry + DWORD m_currentEntryCount; //Current number of entries + LeaderboardEntry m_entries[NUM_ENTRIES]; + DWORD m_numColumns; + }; + + Leaderboard m_leaderboard; //All leaderboard data for the currently selected filter + + unsigned int m_currentLeaderboard; //The current leaderboard selected for view + +#ifdef _XBOX + LeaderboardManager::EFilterMode m_currentFilter; //The current filter selected +#endif + unsigned int m_currentDifficulty; //The current difficulty selected + + unsigned int m_newEntryIndex; //Index of the first entry being read + unsigned int m_newReadSize; //Number of entries in the current read operation + + int m_newTop; //Index of the element that should be at the top of the list + int m_newSel; //Index of the element that should be selected in the list + + XONLINE_FRIEND* m_friends; //Current player's friends + unsigned int m_numFriends; //Count of friends + PlayerUID* m_filteredFriends; //List of all friend XUIDs (and player's), only counting actual friends, not pending + unsigned int m_numFilteredFriends; //Count of filtered friends + + CXuiList m_listGamers; //The XUI list showing the leaderboard info + CXuiControl m_textLeaderboard; //The XUI text box showing the current leaderboard name + CXuiControl m_textInfo; //The XUI text box showing info messages (loading, no results, etc.) + CXuiControl m_textFilter; //The XUI text box showing the current filter + CXuiControl m_textEntries; //The XUI text box showing the total number of entries in this leaderboard + CXuiCtrlCraftIngredientSlot *m_pHTitleIconSlots[7]; + float m_fTitleIconXPositions[7]; + float m_fTextXPositions[7]; + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_DESTROY( OnDestroy ) + XUI_ON_XM_KEYDOWN( OnKeyDown ) + XUI_ON_XM_GET_ITEMCOUNT_ALL(OnGetItemCountAll) + XUI_ON_XM_GET_SOURCE_TEXT(OnGetSourceDataText) + XUI_ON_XM_GET_SOURCE_IMAGE(OnGetSourceDataImage) + XUI_ON_XM_NOTIFY_SELCHANGED(OnNotifySelChanged) + XUI_ON_XM_NOTIFY_SET_FOCUS(OnNotifySetFocus) + + XUI_END_MSG_MAP() + + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_XuiListGamers, m_listGamers) + MAP_CONTROL(IDC_XuiTextLeaderboard, m_textLeaderboard) + MAP_CONTROL(IDC_XuiTextInfo, m_textInfo) + MAP_CONTROL(IDC_XuiTextFilter, m_textFilter) + MAP_CONTROL(IDC_XuiTextEntries, m_textEntries) + END_CONTROL_MAP() + + HRESULT OnInit(XUIMessageInit* pInitData, BOOL& bHandled); + HRESULT OnDestroy(); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& bHandled); + HRESULT OnGetItemCountAll(XUIMessageGetItemCount *pGetItemCountData, BOOL& bHandled); + HRESULT OnGetSourceDataText(XUIMessageGetSourceText *pGetSourceTextData, BOOL& bHandled); + HRESULT OnGetSourceDataImage(XUIMessageGetSourceImage* pGetImage, BOOL& bHandled); + HRESULT OnNotifySetFocus(HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled); + HRESULT OnNotifySelChanged(HXUIOBJ hObjSource, XUINotifySelChanged *pNotifySelChangedData, BOOL& bHandled); + + //Start a read request with the current parameters + void ReadStats(int startIndex); + + //Callback function called when stats read completes, userdata contains pointer to instance of CScene_Leaderboards + virtual bool OnStatsReadComplete(bool success, int numResults, LeaderboardManager::ViewOut results); + + //Copy the stats from the raw m_stats structure into the m_leaderboards structure + int m_numStats; + PXUSER_STATS_READ_RESULTS m_stats; + bool RetrieveStats(); + + //Populate the XUI leaderboard with the contents of m_leaderboards + void PopulateLeaderboard(bool noResults); + + //Copy a leaderboard entry from the stats row + void CopyLeaderboardEntry(PXUSER_STATS_ROW statsRow, LeaderboardEntry* leaderboardEntry, bool isDistanceLeaderboard); + + //Set the header text of the leaderboard + void SetLeaderboardHeader(); + + // Set the title icons + int SetLeaderboardTitleIcons(); + void ClearLeaderboardTitlebar(); + void Reposition(int iNumber); + void RepositionText(int iNumber); + void UpdateTooltips(); + +protected: + bool m_isProcessingStatsRead; + bool m_bReady; +public: + + XUI_IMPLEMENT_CLASS( CScene_Leaderboards, L"CScene_Leaderboards", XUI_CLASS_SCENE ) +}; diff --git a/Minecraft.Client/Common/XUI/XUI_LoadSettings.cpp b/Minecraft.Client/Common/XUI/XUI_LoadSettings.cpp new file mode 100644 index 00000000..7f32ff89 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_LoadSettings.cpp @@ -0,0 +1,1686 @@ +#include "stdafx.h" +#include +#include +#include +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\Common\Tutorial\TutorialMode.h" +#include "..\..\..\Minecraft.World\ConsoleSaveFileIO.h" +#include "..\..\LocalPlayer.h" +#include "..\..\Minecraft.h" +#include "..\..\..\Minecraft.World\AABB.h" +#include "..\..\..\Minecraft.World\Vec3.h" +#include "..\..\..\Minecraft.World\ArrayWithLength.h" +#include "..\..\..\Minecraft.World\File.h" +#include "..\..\..\Minecraft.World\InputOutputStream.h" +#include "..\..\MinecraftServer.h" +#include "..\..\Options.h" +#include "XUI_Ctrl_4JList.h" +#include "XUI_MultiGameInfo.h" +#include "XUI_MultiGameJoinLoad.h" +#include "XUI_Ctrl_4JIcon.h" +#include "XUI_LoadSettings.h" +#include "..\..\..\Minecraft.World\LevelSettings.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\TexturePack.h" +#include "..\GameRules\ConsoleGameRules.h" +#include "..\..\StringTable.h" +#include "..\..\DLCTexturePack.h" + +#define GAME_CREATE_ONLINE_TIMER_ID 0 +#define GAME_CREATE_ONLINE_TIMER_TIME 100 +#define CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID 1 +#define CHECKFORAVAILABLETEXTUREPACKS_TIMER_TIME 100 + +int CScene_LoadGameSettings::m_iDifficultyTitleSettingA[4]= +{ + IDS_DIFFICULTY_TITLE_PEACEFUL, + IDS_DIFFICULTY_TITLE_EASY, + IDS_DIFFICULTY_TITLE_NORMAL, + IDS_DIFFICULTY_TITLE_HARD +}; + + +HRESULT CScene_LoadGameSettings::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + m_hXuiBrush = NULL; + m_bSetup = false; + m_texturePackDescDisplayed = false; + m_iConfigA=NULL; + + WCHAR TempString[256]; + + m_params = (LoadMenuInitData *)pInitData->pvInitData; + + m_MoreOptionsParams.bGenerateOptions=FALSE; + m_MoreOptionsParams.bPVP = TRUE; + m_MoreOptionsParams.bTrust = TRUE; + m_MoreOptionsParams.bFireSpreads = TRUE; + m_MoreOptionsParams.bTNT = TRUE; + m_MoreOptionsParams.bHostPrivileges = FALSE; + m_MoreOptionsParams.bResetNether = FALSE; + m_MoreOptionsParams.iPad = m_params->iPad; + + // 4J-JEV: Fix for: + // TU12: Content: Gameplay: New "Mass Effect World" remembers and uses the settings of another - lately created - World. + m_MoreOptionsParams.bBonusChest = FALSE; + m_MoreOptionsParams.bFlatWorld = FALSE; + m_MoreOptionsParams.bStructures = TRUE; + + m_iPad=m_params->iPad; + m_iSaveGameInfoIndex=m_params->iSaveGameInfoIndex; + m_levelGen = m_params->levelGen; + + MapChildControls(); + + XuiControlSetText(m_MoreOptions,app.GetString(IDS_MORE_OPTIONS)); + XuiControlSetText(m_ButtonLoad,app.GetString(IDS_LOAD)); + XuiControlSetText(m_pTexturePacksList->m_hObj,app.GetString(IDS_DLC_MENU_TEXTUREPACKS)); + + m_bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); + // 4J-PB - read the settings for the online flag. We'll only save this setting if the user changed it. + bool bGameSetting_Online=(app.GetGameSettings(m_iPad,eGameSetting_Online)!=0); + m_MoreOptionsParams.bOnlineSettingChangedBySystem=false; + + // Set the text for friends of friends, and default to on + if( m_bMultiplayerAllowed) + { + m_MoreOptionsParams.bOnlineGame = bGameSetting_Online?TRUE:FALSE; + if(bGameSetting_Online) + { + m_MoreOptionsParams.bInviteOnly = (app.GetGameSettings(m_iPad,eGameSetting_InviteOnly)!=0)?TRUE:FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = (app.GetGameSettings(m_iPad,eGameSetting_FriendsOfFriends)!=0)?TRUE:FALSE; + } + else + { + m_MoreOptionsParams.bInviteOnly = FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = FALSE; + } + } + else + { + m_MoreOptionsParams.bOnlineGame = FALSE; + m_MoreOptionsParams.bInviteOnly = FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = FALSE; + if(bGameSetting_Online) + { + // The profile settings say Online, but either the player is offline, or they are not allowed to play online + m_MoreOptionsParams.bOnlineSettingChangedBySystem=true; + } + } + + XuiSetTimer(m_hObj,GAME_CREATE_ONLINE_TIMER_ID,GAME_CREATE_ONLINE_TIMER_TIME); + XuiSetTimer(m_hObj,CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID,CHECKFORAVAILABLETEXTUREPACKS_TIMER_TIME); + + m_ButtonGameMode.SetText(app.GetString(IDS_GAMEMODE_SURVIVAL)); + m_bGameModeSurvival=true; + m_CurrentDifficulty=app.GetGameSettings(m_iPad,eGameSetting_Difficulty); + m_SliderDifficulty.SetValue(m_CurrentDifficulty); + swprintf( (WCHAR *)TempString, 256, L"%ls: %ls", app.GetString( IDS_SLIDER_DIFFICULTY ),app.GetString(m_iDifficultyTitleSettingA[m_CurrentDifficulty])); + m_SliderDifficulty.SetText(TempString); + + m_bHasBeenInCreative = false; + + if(m_levelGen) + { + m_GameName.SetText(m_levelGen->getDisplayName()); + if(m_levelGen->requiresTexturePack()) + { + m_MoreOptionsParams.dwTexturePack = m_levelGen->getRequiredTexturePackId(); + m_pTexturePacksList->SetEnable(FALSE); + + // retrieve the save icon from the texture pack, if there is one + TexturePack *tp = Minecraft::GetInstance()->skins->getTexturePackById(m_MoreOptionsParams.dwTexturePack); + DWORD dwImageBytes; + PBYTE pbImageData = tp->getPackIcon(dwImageBytes); + + if(dwImageBytes > 0 && pbImageData) + { + XuiCreateTextureBrushFromMemory(pbImageData,dwImageBytes,&m_hXuiBrush); + } + + // Set this level as created in creative mode, so that people can't use the themed worlds as an easy way to get achievements + m_bHasBeenInCreative = true; + m_GameCreatedMode.SetText( app.GetString(IDS_CREATED_IN_CREATIVE) ); + } + } + else + { + // set the save icon + PBYTE pbImageData=NULL; + DWORD dwImageBytes=0; + + StorageManager.GetSaveCacheFileInfo(m_params->iSaveGameInfoIndex,m_XContentData); + StorageManager.GetSaveCacheFileInfo(m_params->iSaveGameInfoIndex,&pbImageData,&dwImageBytes); + + // if there is no thumbnail, retrieve the default one from the file. + // Don't delete the image data after creating the xuibrush, since we'll use it in the rename of the save + bool bHostOptionsRead = false; + unsigned int uiHostOptions = 0; + if(pbImageData==NULL) + { + DWORD dwResult=XContentGetThumbnail(ProfileManager.GetPrimaryPad(),&m_XContentData,NULL,&dwImageBytes,NULL); + if(dwResult==ERROR_SUCCESS) + { + pbImageData = new BYTE[dwImageBytes]; + XContentGetThumbnail(ProfileManager.GetPrimaryPad(),&m_XContentData,pbImageData,&dwImageBytes,NULL); + XuiCreateTextureBrushFromMemory(pbImageData,dwImageBytes,&m_hXuiBrush); + } + } + else + { + // retrieve the seed value from the image metadata + ZeroMemory(m_szSeed,50); + app.GetImageTextData(pbImageData,dwImageBytes,(unsigned char *)&m_szSeed,uiHostOptions,bHostOptionsRead,m_MoreOptionsParams.dwTexturePack); + XuiCreateTextureBrushFromMemory(pbImageData,dwImageBytes,&m_hXuiBrush); + +// #ifdef _DEBUG +// // dump out the thumbnail +// HANDLE hThumbnail = CreateFile("GAME:\\thumbnail.png", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_FLAG_RANDOM_ACCESS, NULL); +// DWORD dwBytes; +// WriteFile(hThumbnail,pbImageData,dwImageBytes,&dwBytes,NULL); +// XCloseHandle(hThumbnail); +// #endif + + if(m_szSeed[0]!=0) + { + swprintf( (WCHAR *)TempString, 256, L"%ls: %hs", app.GetString( IDS_SEED ),m_szSeed); + m_GameSeed.SetText(TempString); + } + else + { + m_GameSeed.SetText(L""); + } + } + + // Setup all the text and checkboxes to match what the game was saved with on + if(bHostOptionsRead) + { + m_MoreOptionsParams.bPVP = app.GetGameHostOption(uiHostOptions,eGameHostOption_PvP)>0?TRUE:FALSE; + m_MoreOptionsParams.bTrust = app.GetGameHostOption(uiHostOptions,eGameHostOption_TrustPlayers)>0?TRUE:FALSE; + m_MoreOptionsParams.bFireSpreads = app.GetGameHostOption(uiHostOptions,eGameHostOption_FireSpreads)>0?TRUE:FALSE; + m_MoreOptionsParams.bTNT = app.GetGameHostOption(uiHostOptions,eGameHostOption_TNT)>0?TRUE:FALSE; + m_MoreOptionsParams.bHostPrivileges = app.GetGameHostOption(uiHostOptions,eGameHostOption_CheatsEnabled)>0?TRUE:FALSE; + + m_bHasBeenInCreative = app.GetGameHostOption(uiHostOptions,eGameHostOption_HasBeenInCreative)>0; + if(app.GetGameHostOption(uiHostOptions,eGameHostOption_HasBeenInCreative)>0) + { + m_GameCreatedMode.SetText( app.GetString(IDS_CREATED_IN_CREATIVE) ); + } + else + { + m_GameCreatedMode.SetText( app.GetString(IDS_CREATED_IN_SURVIVAL) ); + } + + if(app.GetGameHostOption(uiHostOptions,eGameHostOption_GameType)>0) + { + m_ButtonGameMode.SetText(app.GetString(IDS_GAMEMODE_CREATIVE)); + m_bGameModeSurvival=false; + } + + if(app.GetGameHostOption(uiHostOptions,eGameHostOption_FriendsOfFriends) && !(m_bMultiplayerAllowed && bGameSetting_Online)) + { + m_MoreOptionsParams.bAllowFriendsOfFriends = TRUE; + } + } + + m_GameName.SetText(m_XContentData.szDisplayName); + } + + // 4J-PB - Load up any texture pack data we have locally in the XZP + for(int i=0;iRecordMenuShown(m_iPad, eUIScene_LoadMenu, 0); + m_iTexturePacksNotInstalled=0; + + // block input if we're waiting for DLC to install, and wipe the saves list. The end of dlc mounting custom message will fill the list again + if(app.StartInstallDLCProcess(m_iPad)==true) + { + // not doing a mount, so enable input + m_bIgnoreInput=true; + } + else + { + m_bIgnoreInput = false; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + m_pTexturePacksList->SetSelectionChangedHandle(m_hObj); + + int texturePacksCount = pMinecraft->skins->getTexturePackCount(); + CXuiCtrl4JList::LIST_ITEM_INFO ListInfo; + HRESULT hr; + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + ZeroMemory(&ListInfo,sizeof(CXuiCtrl4JList::LIST_ITEM_INFO)); + + + DWORD dwImageBytes; + PBYTE pbImageData = tp->getPackIcon(dwImageBytes); + + if(dwImageBytes > 0 && pbImageData) + { + ListInfo.fEnabled = TRUE; + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tp; + if(pDLCTexPack) + { + int id=pDLCTexPack->getDLCParentPackId(); + + if(id==0) + { + // default texture pack - should come first + ListInfo.iSortIndex=0x0FFFFFFF; + } + else + { + ListInfo.iSortIndex=id; + ListInfo.iData=id; + } + } +#ifdef _DEBUG + app.DebugPrintf("TP - "); + OutputDebugStringW(tp->getName().c_str()); + app.DebugPrintf(", sort index - %d\n",ListInfo.iSortIndex); +#endif + hr=XuiCreateTextureBrushFromMemory(pbImageData,dwImageBytes,&ListInfo.hXuiBrush); + + m_pTexturePacksList->AddData(ListInfo,0,CXuiCtrl4JList::eSortList_Index); + } + } + + m_currentTexturePackIndex = m_pTexturePacksList->GetIndexByUserData(m_MoreOptionsParams.dwTexturePack); + m_pTexturePacksList->SetCurSel(m_currentTexturePackIndex); + m_pTexturePacksList->SetTopItem(m_currentTexturePackIndex); // scroll the item into view if it's not visible + UpdateTexturePackDescription(m_currentTexturePackIndex); + + + // 4J-PB - there may be texture packs we don't have, so use the info from TMS for this + DLC_INFO *pDLCInfo=NULL; + + // first pass - look to see if there are any that are not in the list + bool bTexturePackAlreadyListed; + bool bNeedToGetTPD=false; + m_iTexturePacksNotInstalled=0; + + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + bTexturePackAlreadyListed=false; + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + if(pDLCInfo->iConfig==tp->getDLCParentPackId()) + { + bTexturePackAlreadyListed=true; + } + } + if(bTexturePackAlreadyListed==false) + { + // some missing + bNeedToGetTPD=true; + + m_iTexturePacksNotInstalled++; + } + } + + if(bNeedToGetTPD==true) + { + // add a TMS request for them + app.AddTMSPPFileTypeRequest(e_DLC_TexturePackData); + m_iConfigA= new int [m_iTexturePacksNotInstalled]; + m_iTexturePacksNotInstalled=0; + + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + bTexturePackAlreadyListed=false; + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + if(pDLCInfo->iConfig==tp->getDLCParentPackId()) + { + bTexturePackAlreadyListed=true; + } + } + if(bTexturePackAlreadyListed==false) + { + m_iConfigA[m_iTexturePacksNotInstalled++]=pDLCInfo->iConfig; + } + } + } + } + + m_bSetup = true; + + return S_OK; +} + +HRESULT CScene_LoadGameSettings::OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) +{ + pControlNavigateData->hObjDest=XuiControlGetNavigation(pControlNavigateData->hObjSource,pControlNavigateData->nControlNavigate,TRUE,TRUE); + + if(pControlNavigateData->hObjDest!=NULL) + { + bHandled=TRUE; + } + + return S_OK; +} + +HRESULT CScene_LoadGameSettings::LaunchGame(void) +{ + // stop the timer running that causes a check for new texture packs in TMS but not installed, since this will run all through the load game, and will crash if it tries to create an hbrush + XuiKillTimer(m_hObj,CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID); + + if( (m_bGameModeSurvival != true || m_bHasBeenInCreative) || m_MoreOptionsParams.bHostPrivileges == TRUE) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + if(m_bGameModeSurvival != true || m_bHasBeenInCreative) + { + // 4J-PB - Need different text for Survival mode with a level that has been saved in Creative + if(m_bGameModeSurvival) + { + StorageManager.RequestMessageBox(IDS_TITLE_START_GAME, IDS_CONFIRM_START_SAVEDINCREATIVE, uiIDA, 2, m_iPad,&CScene_LoadGameSettings::ConfirmLoadReturned,this,app.GetStringTable()); + } + else // it's creative mode + { + // has it previously been saved in creative? + if(m_bHasBeenInCreative) + { + // 4J-PB - We don't really need to tell the user this will have achievements disabled, since they already saved it in creative + // and they got the warning then + // inform them that leaderboard writes and achievements will be disabled + //StorageManager.RequestMessageBox(IDS_TITLE_START_GAME, IDS_CONFIRM_START_SAVEDINCREATIVE_CONTINUE, uiIDA, 1, m_iPad,&CScene_LoadGameSettings::ConfirmLoadReturned,this,app.GetStringTable()); + + if(m_levelGen != NULL) + { + LoadLevelGen(m_levelGen); + } + else + { + C4JStorage::ELoadGameStatus eLoadStatus=StorageManager.LoadSaveData(&m_XContentData,CScene_LoadGameSettings::LoadSaveDataReturned,this); + + if(eLoadStatus==C4JStorage::ELoadGame_DeviceRemoved) + { + // disable saving + StorageManager.SetSaveDisabled(true); + StorageManager.SetSaveDeviceSelected(m_iPad,false); + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + StorageManager.RequestMessageBox(IDS_STORAGEDEVICEPROBLEM_TITLE, IDS_FAILED_TO_LOADSAVE_TEXT, uiIDA, 1, m_iPad,&CScene_LoadGameSettings::DeviceRemovedDialogReturned,this); + + } + } + } + else + { + // ask if they're sure they want to turn this into a creative map + StorageManager.RequestMessageBox(IDS_TITLE_START_GAME, IDS_CONFIRM_START_CREATIVE, uiIDA, 2, m_iPad,&CScene_LoadGameSettings::ConfirmLoadReturned,this,app.GetStringTable()); + } + } + } + else + { + StorageManager.RequestMessageBox(IDS_TITLE_START_GAME, IDS_CONFIRM_START_HOST_PRIVILEGES, uiIDA, 2, m_iPad,&CScene_LoadGameSettings::ConfirmLoadReturned,this,app.GetStringTable()); + } + } + else + { + if(m_levelGen != NULL) + { + LoadLevelGen(m_levelGen); + } + else + { + C4JStorage::ELoadGameStatus eLoadStatus=StorageManager.LoadSaveData(&m_XContentData,CScene_LoadGameSettings::LoadSaveDataReturned,this); + + if(eLoadStatus==C4JStorage::ELoadGame_DeviceRemoved) + { + // disable saving + StorageManager.SetSaveDisabled(true); + StorageManager.SetSaveDeviceSelected(m_iPad,false); + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + StorageManager.RequestMessageBox(IDS_STORAGEDEVICEPROBLEM_TITLE, IDS_FAILED_TO_LOADSAVE_TEXT, uiIDA, 1, m_iPad,&CScene_LoadGameSettings::DeviceRemovedDialogReturned,this); + } + } + } + return 0; +} + +int CScene_LoadGameSettings::CheckResetNetherReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + CScene_LoadGameSettings* pClass = (CScene_LoadGameSettings*)pParam; + + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { + // continue and reset the nether + pClass->LaunchGame(); + } + else + { + // turn off the reset nether and continue + pClass->m_MoreOptionsParams.bResetNether=FALSE; + pClass->LaunchGame(); + } + return 0; +} + +HRESULT CScene_LoadGameSettings::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + // 4J-PB - stop people double pressing this + if(m_bIgnoreInput) return S_OK; + Minecraft *pMinecraft=Minecraft::GetInstance(); + + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + if(hObjPressed==m_ButtonLoad) + { + // Check if we need to upsell the texture pack + if(m_MoreOptionsParams.dwTexturePack!=0) + { + // texture pack hasn't been set yet, so check what it will be + TexturePack *pTexturePack = pMinecraft->skins->getTexturePackById(m_MoreOptionsParams.dwTexturePack); + + if(pTexturePack==NULL) + { + // They've selected a texture pack they don't have yet + // upsell + CXuiCtrl4JList::LIST_ITEM_INFO ListItem; + // get the current index of the list, and then get the data + ListItem=m_pTexturePacksList->GetData(m_currentTexturePackIndex); + + + // upsell the texture pack + + ULONGLONG ullOfferID_Full; + app.GetDLCFullOfferIDForPackID(ListItem.iData,&ullOfferID_Full); + + // 4J-PB - if the full offer id is 0, then the texture pack dlc load failed + if(ullOfferID_Full!=0LL) + { + // tell sentient about the upsell of the full version of the skin pack + TelemetryManager->RecordUpsellPresented(ProfileManager.GetPrimaryPad(), eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); + + UINT uiIDA[3]; + + // Need to check if the texture pack has both Full and Trial versions - we may do some as free ones, so only Full + DLC_INFO *pDLCInfo=app.GetDLCInfoForFullOfferID(ullOfferID_Full); + + if(pDLCInfo->ullOfferID_Trial!=0LL) + { + uiIDA[0]=IDS_TEXTUREPACK_FULLVERSION; + uiIDA[1]=IDS_TEXTURE_PACK_TRIALVERSION; + uiIDA[2]=IDS_CONFIRM_CANCEL; + // Give the player a warning about the texture pack missing + StorageManager.RequestMessageBox(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 3, ProfileManager.GetPrimaryPad(),&CScene_LoadGameSettings::TexturePackDialogReturned,this,app.GetStringTable()); + } + else + { + uiIDA[0]=IDS_TEXTUREPACK_FULLVERSION; + uiIDA[1]=IDS_CONFIRM_CANCEL; + // Give the player a warning about the texture pack missing + StorageManager.RequestMessageBox(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CScene_LoadGameSettings::TexturePackDialogReturned,this,app.GetStringTable()); + } + + return S_OK; + } + } + } + + // if the profile data has been changed, then force a profile write (we save the online/invite/friends of friends settings) + // It seems we're allowed to break the 5 minute rule if it's the result of a user action + // check the checkboxes + + // Only save the online setting if the user changed it - we may change it because we're offline, but don't want that saved + if(!m_MoreOptionsParams.bOnlineSettingChangedBySystem) + { + app.SetGameSettings(m_iPad,eGameSetting_Online,m_MoreOptionsParams.bOnlineGame?1:0); + } + app.SetGameSettings(m_iPad,eGameSetting_InviteOnly,m_MoreOptionsParams.bInviteOnly?1:0); + app.SetGameSettings(m_iPad,eGameSetting_FriendsOfFriends,m_MoreOptionsParams.bAllowFriendsOfFriends?1:0); + + app.CheckGameSettingsChanged(true,pNotifyPressData->UserIndex); + + SetShow( FALSE ); + m_bIgnoreInput = true; + + // Check that we have the rights to use a texture pack we have selected. + if(m_MoreOptionsParams.dwTexturePack!=0) + { + // texture pack hasn't been set yet, so check what it will be + TexturePack *pTexturePack = pMinecraft->skins->getTexturePackById(m_MoreOptionsParams.dwTexturePack); + + if(pTexturePack==NULL) + { + // DLC corrupt, so use the default textures + m_MoreOptionsParams.dwTexturePack=0; + } + else + { + m_pDLCPack=pTexturePack->getDLCPack(); + // do we have a license? + if(m_pDLCPack && !m_pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) + { + // no + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + + if(!ProfileManager.IsSignedInLive(pNotifyPressData->UserIndex)) + { + // need to be signed in to live + StorageManager.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); + return S_OK; + } + else + { + // upsell + + DLC_INFO *pDLCInfo = app.GetDLCInfoForTrialOfferID(m_pDLCPack->getPurchaseOfferId()); + ULONGLONG ullOfferID_Full; + + if(pDLCInfo!=NULL) + { + ullOfferID_Full=pDLCInfo->ullOfferID_Full; + } + else + { + ullOfferID_Full=pTexturePack->getDLCPack()->getPurchaseOfferId(); + } + + // tell sentient about the upsell of the full version of the texture pack + TelemetryManager->RecordUpsellPresented(pNotifyPressData->UserIndex, eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); + + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + //StorageManager.RequestMessageBox(IDS_UNLOCK_DLC_TITLE, IDS_UNLOCK_DLC_SKIN, uiIDA, 2, pInputData->UserIndex,&CScene_SkinSelect::UnlockSkinReturned,this,app.GetStringTable()); + StorageManager.RequestMessageBox(IDS_UNLOCK_DLC_TEXTUREPACK_TITLE, IDS_UNLOCK_DLC_TEXTUREPACK_TEXT, uiIDA, 2, pNotifyPressData->UserIndex,&CScene_LoadGameSettings::UnlockTexturePackReturned,this,app.GetStringTable()); + return S_OK; + } + } + } + } + + // Reset the background downloading, in case we changed it by attempting to download a texture pack + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_AUTO); + + // Check if they have the Reset Nether flag set, and confirm they want to do this + if(m_MoreOptionsParams.bResetNether==TRUE) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_DONT_RESET_NETHER; + uiIDA[1]=IDS_RESET_NETHER; + + StorageManager.RequestMessageBox(IDS_RESETNETHER_TITLE, IDS_RESETNETHER_TEXT, uiIDA, 2, pNotifyPressData->UserIndex,&CScene_LoadGameSettings::CheckResetNetherReturned,this,app.GetStringTable()); + } + else + { + LaunchGame(); + } + } + else if(hObjPressed==m_MoreOptions) + { + app.NavigateToScene(pNotifyPressData->UserIndex,eUIScene_LaunchMoreOptionsMenu,&m_MoreOptionsParams); + } + else if(hObjPressed == m_ButtonGameMode) + { + if(m_bGameModeSurvival) + { + m_ButtonGameMode.SetText(app.GetString(IDS_GAMEMODE_CREATIVE)); + m_bGameModeSurvival=false; + } + else + { + m_ButtonGameMode.SetText(app.GetString(IDS_GAMEMODE_SURVIVAL)); + m_bGameModeSurvival=true; + } + } + else if(hObjPressed == m_pTexturePacksList->m_hObj) + { + UpdateCurrentTexturePack(); + } + return S_OK; +} + +HRESULT CScene_LoadGameSettings::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + // Explicitly handle B button presses + switch(pInputData->dwKeyCode) + { + case VK_PAD_B: + case VK_ESCAPE: + app.SetCorruptSaveDeleted(false); + app.NavigateBack(pInputData->UserIndex); + rfHandled = TRUE; + break; + case VK_PAD_RSHOULDER: +/* if(app.m_bTransferSavesToXboxOne && ProfileManager.IsFullVersion()) + { + app.NavigateToScene(m_iPad,eUIScene_TransferToXboxOne,m_params); + } + */ + break; + } + + return S_OK; +} + +HRESULT CScene_LoadGameSettings::OnFontRendererChange() +{ + int iRB=-1; + + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK, -1, -1,-1,-1,-1,-1,-1,true); + + return S_OK; +} + +int CScene_LoadGameSettings::ConfirmLoadReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + CScene_LoadGameSettings* pClass = (CScene_LoadGameSettings*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + if(pClass->m_levelGen != NULL) + { + pClass->LoadLevelGen(pClass->m_levelGen); + } + else + { + C4JStorage::ELoadGameStatus eLoadStatus=StorageManager.LoadSaveData(&pClass->m_XContentData,CScene_LoadGameSettings::LoadSaveDataReturned,pClass); + + if(eLoadStatus==C4JStorage::ELoadGame_DeviceRemoved) + { + // disable saving + StorageManager.SetSaveDisabled(true); + StorageManager.SetSaveDeviceSelected(pClass->m_iPad,false); + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + StorageManager.RequestMessageBox(IDS_STORAGEDEVICEPROBLEM_TITLE, IDS_FAILED_TO_LOADSAVE_TEXT, uiIDA, 1, pClass->m_iPad,&CScene_LoadGameSettings::DeviceRemovedDialogReturned,pClass); + } + } + } + else + { + pClass->SetShow( TRUE ); + pClass->m_bIgnoreInput=false; + } + return 0; +} + +HRESULT CScene_LoadGameSettings::OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ) +{ + // 4J-PB - TODO - Don't think we can do this - if a 2nd player signs in here with an offline profile, the signed in LIVE player gets re-logged in, and bMultiplayerAllowed is false briefly + switch(pTimer->nId) + { + case GAME_CREATE_ONLINE_TIMER_ID: + { + bool bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); + + if(bMultiplayerAllowed != m_bMultiplayerAllowed) + { + if( bMultiplayerAllowed ) + { + bool bGameSetting_Online=(app.GetGameSettings(m_iPad,eGameSetting_Online)!=0); + m_MoreOptionsParams.bOnlineGame = bGameSetting_Online?TRUE:FALSE; + if(bGameSetting_Online) + { + m_MoreOptionsParams.bInviteOnly = (app.GetGameSettings(m_iPad,eGameSetting_InviteOnly)!=0)?TRUE:FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = (app.GetGameSettings(m_iPad,eGameSetting_FriendsOfFriends)!=0)?TRUE:FALSE; + } + else + { + m_MoreOptionsParams.bInviteOnly = FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = FALSE; + } + } + else + { + m_MoreOptionsParams.bOnlineGame = FALSE; + m_MoreOptionsParams.bInviteOnly = FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = FALSE; + } + + m_bMultiplayerAllowed = bMultiplayerAllowed; + } + } + break; + + case CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID: + { + // also check for any new texture packs info being available + // for each item in the mem list, check it's in the data list + + CXuiCtrl4JList::LIST_ITEM_INFO ListInfo; + // for each iConfig, check if the data is available, and add it to the List, then remove it from the viConfig + for(int i=0;i 0 && pbData) + { + DWORD dwImageBytes=0; + PBYTE pbImageData=NULL; + + app.GetFileFromTPD(eTPDFileType_Icon,pbData,dwBytes,&pbImageData,&dwImageBytes ); + ListInfo.fEnabled = TRUE; + ListInfo.iData = m_iConfigA[i]; + HRESULT hr=XuiCreateTextureBrushFromMemory(pbImageData,dwImageBytes,&ListInfo.hXuiBrush); + + ListInfo.iSortIndex=m_iConfigA[i]; + m_pTexturePacksList->AddData(ListInfo,0,CXuiCtrl4JList::eSortList_Index); + + m_iConfigA[i]=-1; + + m_currentTexturePackIndex = m_pTexturePacksList->GetIndexByUserData(m_MoreOptionsParams.dwTexturePack); + m_pTexturePacksList->SetCurSel(m_currentTexturePackIndex); + m_pTexturePacksList->SetTopItem(m_currentTexturePackIndex); // scroll the item into view if it's not visible + } + } + } + bool bAllDone=true; + for(int i=0;im_MoreOptionsParams.bOnlineGame; + + // 4J Stu - If we only have one controller connected, then don't show the sign-in UI again + DWORD connectedControllers = 0; + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if( InputManager.IsPadConnected(i) || ProfileManager.IsSignedIn(i) ) ++connectedControllers; + } + + if(!isClientSide || connectedControllers == 1 || !RenderManager.IsHiDef()) + { + // Check if user-created content is allowed, as we cannot play multiplayer if it's not + bool noUGC = false; + BOOL pccAllowed = TRUE; + BOOL pccFriendsAllowed = TRUE; + ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); + if(!pccAllowed && !pccFriendsAllowed) noUGC = true; + + if(isClientSide && noUGC ) + { + pClass->SetShow( TRUE ); + pClass->m_bIgnoreInput=false; + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + StorageManager.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + } + else + { + DWORD dwLocalUsersMask = CGameNetworkManager::GetLocalPlayerMask(ProfileManager.GetPrimaryPad()); + + // No guest problems so we don't need to force a sign-in of players here + StartGameFromSave(pClass, dwLocalUsersMask); + } + } + else + { + ProfileManager.RequestSignInUI(false, false, false, true, false,&CScene_LoadGameSettings::StartGame_SignInReturned, pParam,ProfileManager.GetPrimaryPad()); + } + } + else + { + // the save is corrupt! + + pClass->SetShow( TRUE ); + pClass->m_bIgnoreInput=false; + + // give the option to delete the save + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + StorageManager.RequestMessageBox(IDS_CORRUPT_OR_DAMAGED_SAVE_TITLE, IDS_CORRUPT_OR_DAMAGED_SAVE_TEXT, uiIDA, 2, + pClass->m_iPad,&CScene_LoadGameSettings::DeleteSaveDialogReturned,pClass, app.GetStringTable()); + + } + return 0; +} + +int CScene_LoadGameSettings::DeleteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + CScene_LoadGameSettings* pClass = (CScene_LoadGameSettings*)pParam; + + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { +#ifdef _XBOX + StorageManager.DeleteSaveData(&pClass->m_XContentData,CScene_LoadGameSettings::DeleteSaveDataReturned,pClass); +#endif + } + else + { + pClass->m_bIgnoreInput=false; + } + return 0; +} + +int CScene_LoadGameSettings::DeleteSaveDataReturned(void *pParam,bool bSuccess) +{ + CScene_LoadGameSettings* pClass = (CScene_LoadGameSettings*)pParam; + + app.SetCorruptSaveDeleted(true); + app.NavigateBack(pClass->m_iPad); + + return 0; +} + +int CScene_LoadGameSettings::DeviceRemovedDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + // need to back out of this scene + app.NavigateBack(iPad); + + return 0; +} + +// 4J Stu - Shared functionality that is the same whether we needed a quadrant sign-in or not +void CScene_LoadGameSettings::StartGameFromSave(CScene_LoadGameSettings* pClass, DWORD dwLocalUsersMask) +{ + INT saveOrCheckpointId = 0; + bool validSave = StorageManager.GetSaveUniqueNumber(&saveOrCheckpointId); + TelemetryManager->RecordLevelResume(pClass->m_iPad, eSen_FriendOrMatch_Playing_With_Invited_Friends, eSen_CompeteOrCoop_Coop_and_Competitive, app.GetGameSettings(pClass->m_iPad,eGameSetting_Difficulty), app.GetLocalPlayerCount(), g_NetworkManager.GetOnlinePlayerCount(), saveOrCheckpointId); + + bool isClientSide = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && pClass->m_MoreOptionsParams.bOnlineGame; + bool isPrivate = (app.GetGameSettings(pClass->m_iPad,eGameSetting_InviteOnly)>0)?true:false; + + g_NetworkManager.HostGame(dwLocalUsersMask,isClientSide,isPrivate,MINECRAFT_NET_MAX_PLAYERS,0); + + NetworkGameInitData *param = new NetworkGameInitData(); + param->seed = 0; + param->saveData = NULL; + param->texturePackId = pClass->m_MoreOptionsParams.dwTexturePack; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->skins->selectTexturePackById(pClass->m_MoreOptionsParams.dwTexturePack); + //pMinecraft->skins->updateUI(); + + app.SetGameHostOption(eGameHostOption_Difficulty,Minecraft::GetInstance()->options->difficulty); + app.SetGameHostOption(eGameHostOption_FriendsOfFriends,app.GetGameSettings(pClass->m_iPad,eGameSetting_FriendsOfFriends)); + app.SetGameHostOption(eGameHostOption_Gamertags,app.GetGameSettings(pClass->m_iPad,eGameSetting_GamertagsVisible)); + + app.SetGameHostOption(eGameHostOption_BedrockFog,app.GetGameSettings(pClass->m_iPad,eGameSetting_BedrockFog)?1:0); + + app.SetGameHostOption(eGameHostOption_PvP,pClass->m_MoreOptionsParams.bPVP); + app.SetGameHostOption(eGameHostOption_TrustPlayers,pClass->m_MoreOptionsParams.bTrust ); + app.SetGameHostOption(eGameHostOption_FireSpreads,pClass->m_MoreOptionsParams.bFireSpreads ); + app.SetGameHostOption(eGameHostOption_TNT,pClass->m_MoreOptionsParams.bTNT ); + app.SetGameHostOption(eGameHostOption_HostCanFly,pClass->m_MoreOptionsParams.bHostPrivileges); + app.SetGameHostOption(eGameHostOption_HostCanChangeHunger,pClass->m_MoreOptionsParams.bHostPrivileges); + app.SetGameHostOption(eGameHostOption_HostCanBeInvisible,pClass->m_MoreOptionsParams.bHostPrivileges ); + + // flag if the user wants to reset the Nether to force a Fortress with netherwart etc. + app.SetResetNether((pClass->m_MoreOptionsParams.bResetNether==TRUE)?true:false); + // clear out the app's terrain features list + app.ClearTerrainFeaturePosition(); + + app.SetGameHostOption(eGameHostOption_GameType,pClass->m_bGameModeSurvival?GameType::SURVIVAL->getId():GameType::CREATIVE->getId()); + + param->settings = app.GetGameHostOption( eGameHostOption_All ); + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc; + loadingParams->lpParam = (LPVOID)param; + + // Reset the autosave timer + app.SetAutosaveTimerTime(); + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + + app.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); +} + +int CScene_LoadGameSettings::StartGame_SignInReturned(void *pParam,bool bContinue, int iPad) +{ + CScene_LoadGameSettings* pClass = (CScene_LoadGameSettings*)pParam; + + if(bContinue==true) + { + // It's possible that the player has not signed in - they can back out + if(ProfileManager.IsSignedIn(iPad)) + { + DWORD dwLocalUsersMask = 0; + + bool isClientSide = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && pClass->m_MoreOptionsParams.bOnlineGame; + bool noPrivileges = false; + for(unsigned int index = 0; index < XUSER_MAX_COUNT; ++index) + { + if(ProfileManager.IsSignedIn(index) ) + { + if( !ProfileManager.AllowedToPlayMultiplayer(index) ) noPrivileges = true; + dwLocalUsersMask |= CGameNetworkManager::GetLocalPlayerMask(index); + } + } + + // Check if user-created content is allowed, as we cannot play multiplayer if it's not + bool noUGC = false; + BOOL pccAllowed = TRUE; + BOOL pccFriendsAllowed = TRUE; + ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(), false, &pccAllowed,&pccFriendsAllowed); + if(!pccAllowed && !pccFriendsAllowed) noUGC = true; + + if(isClientSide && (noPrivileges || noUGC) ) + { + if( noUGC ) + { + pClass->SetShow( TRUE ); + pClass->m_bIgnoreInput=false; + //pClass->m_bAbortSearch=false; + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + StorageManager.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + } + else + { + pClass->SetShow( TRUE ); + pClass->m_bIgnoreInput=false; + //pClass->m_bAbortSearch=false; + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + StorageManager.RequestMessageBox( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_HOST_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + } + } + else + { + StartGameFromSave(pClass, dwLocalUsersMask); + } + } + } + else + { + pClass->SetShow( TRUE ); + pClass->m_bIgnoreInput=false; + //pClass->m_bAbortSearch=false; + } + return 0; +} + + +HRESULT CScene_LoadGameSettings::OnGetSourceDataImage(XUIMessageGetSourceImage *pGetSourceImageData,BOOL& bHandled) +{ + if( pGetSourceImageData->bItemData ) + { + pGetSourceImageData->hBrush = m_hXuiBrush; + bHandled = TRUE; + } + return S_OK; +} + + +HRESULT CScene_LoadGameSettings::OnNotifyValueChanged( HXUIOBJ hObjSource, XUINotifyValueChanged* pNotifyValueChanged, BOOL& bHandled ) +{ + WCHAR TempString[256]; + + if(hObjSource==m_SliderDifficulty.GetSlider() ) + { + app.SetGameSettings(m_iPad,eGameSetting_Difficulty,pNotifyValueChanged->nValue); + swprintf( (WCHAR *)TempString, 256, L"%ls: %ls", app.GetString( IDS_SLIDER_DIFFICULTY ),app.GetString(m_iDifficultyTitleSettingA[pNotifyValueChanged->nValue])); + m_SliderDifficulty.SetText(TempString); + } + return S_OK; +} + +HRESULT CScene_LoadGameSettings::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ) +{ + //if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) return S_OK; + + if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY || + pTransition->dwTransType == XUI_TRANSITION_FROM || pTransition->dwTransType == XUI_TRANSITION_BACKFROM) + { + // 4J Stu - We may have had to unload our font renderer in this scene if one of the save files + // uses characters not in our font (eg asian chars) so restore our font renderer + // This will not do anything if our font renderer is already loaded + app.OverrideFontRenderer(true,true); + } + else if(pTransition->dwTransType == XUI_TRANSITION_TO || pTransition->dwTransType == XUI_TRANSITION_BACKTO) + { + m_SliderDifficulty.SetValueDisplay(FALSE); + // 4J-PB - Need to check for installed DLC, which might have happened while you were on the More Options scene + if(pTransition->dwTransType == XUI_TRANSITION_BACKTO) + { + // block input if we're waiting for DLC to install, and wipe the saves list. The end of dlc mounting custom message will fill the list again + if(app.StartInstallDLCProcess(m_iPad)==false) + { + // not doing a mount, so re-enable input + m_bIgnoreInput=false; + } + else + { + m_bIgnoreInput=true; + m_pTexturePacksList->RemoveAllData(); + } + } + } + + return S_OK; +} + +HRESULT CScene_LoadGameSettings::OnTransitionEnd( XUIMessageTransition *pTransition, BOOL& bHandled ) +{ + //if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) return S_OK; + + if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY || + pTransition->dwTransType == XUI_TRANSITION_FROM || pTransition->dwTransType == XUI_TRANSITION_BACKFROM) + { + } + else if(pTransition->dwTransType == XUI_TRANSITION_TO || pTransition->dwTransType == XUI_TRANSITION_BACKTO) + { + if(m_bSetup && m_texturePackDescDisplayed) + { + XUITimeline *timeline; + XUINamedFrame *startFrame, *endFrame; + GetTimeline( &timeline ); + startFrame = timeline->FindNamedFrame( L"SlideOutEnd" ); + endFrame = timeline->FindNamedFrame( L"SlideOutEnd" ); + timeline->Play( startFrame->m_dwFrame, startFrame->m_dwFrame, endFrame->m_dwFrame, FALSE, FALSE ); + m_texturePackDescDisplayed = true; + } + } + + return S_OK; +} + +int CScene_LoadGameSettings::UnlockTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + CScene_LoadGameSettings* pScene = (CScene_LoadGameSettings*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + if(ProfileManager.IsSignedIn(iPad)) + { + ULONGLONG ullIndexA[1]; + DLC_INFO *pDLCInfo = app.GetDLCInfoForTrialOfferID(pScene->m_pDLCPack->getPurchaseOfferId()); + + if(pDLCInfo!=NULL) + { + ullIndexA[0]=pDLCInfo->ullOfferID_Full; + } + else + { + ullIndexA[0]=pScene->m_pDLCPack->getPurchaseOfferId(); + } + + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + + // the license change coming in when the offer has been installed will cause this scene to refresh + } + } + else + { + TelemetryManager->RecordUpsellResponded(iPad, eSet_UpsellID_Texture_DLC, ( pScene->m_pDLCPack->getPurchaseOfferId() & 0xFFFFFFFF ), eSen_UpsellOutcome_Declined); + } + + pScene->m_bIgnoreInput = false; + pScene->SetShow( TRUE ); + + return 0; +} + +HRESULT CScene_LoadGameSettings::OnNotifySelChanged( HXUIOBJ hObjSource, XUINotifySelChanged* pNotifySelChangedData, BOOL& bHandled ) +{ + if(hObjSource == m_pTexturePacksList->m_hObj) + { + UpdateTexturePackDescription(pNotifySelChangedData->iItem); + + if(m_bSetup && !m_texturePackDescDisplayed) + { + XUITimeline *timeline; + XUINamedFrame *startFrame, *endFrame; + GetTimeline( &timeline ); + startFrame = timeline->FindNamedFrame( L"SlideOut" ); + endFrame = timeline->FindNamedFrame( L"SlideOutEnd" ); + timeline->Play( startFrame->m_dwFrame, startFrame->m_dwFrame, endFrame->m_dwFrame, FALSE, FALSE ); + m_texturePackDescDisplayed = true; + } + } + + return S_OK; +} + +HRESULT CScene_LoadGameSettings::OnNotifyKillFocus(HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled) +{ + HXUIOBJ hSourceParent, hDestParent; + XuiElementGetParent(hObjSource,&hSourceParent); + XuiElementGetParent(pNotifyFocusData->hObjOther,&hDestParent); + if(hSourceParent != hDestParent && pNotifyFocusData->hObjOther != m_pTexturePacksList->m_hObj && hSourceParent == m_pTexturePacksList->m_hObj) + { + m_pTexturePacksList->SetCurSel(m_currentTexturePackIndex); + m_pTexturePacksList->SetTopItem(m_currentTexturePackIndex); // scroll the item into view if it's not visible + } + else if(!m_texturePackDescDisplayed && pNotifyFocusData->hObjOther == m_pTexturePacksList->m_hObj) + { + int texturePacksCount = Minecraft::GetInstance()->skins->getTexturePackCount(); + if(texturePacksCount == 1) + { + XUITimeline *timeline; + XUINamedFrame *startFrame, *endFrame; + GetTimeline( &timeline ); + startFrame = timeline->FindNamedFrame( L"SlideOut" ); + endFrame = timeline->FindNamedFrame( L"SlideOutEnd" ); + timeline->Play( startFrame->m_dwFrame, startFrame->m_dwFrame, endFrame->m_dwFrame, FALSE, FALSE ); + m_texturePackDescDisplayed = true; + } + } + + return S_OK; +} + +void CScene_LoadGameSettings::UpdateTexturePackDescription(int index) +{ + int iTexPackId=m_pTexturePacksList->GetData(index).iData; + TexturePack *tp = Minecraft::GetInstance()->skins->getTexturePackById(iTexPackId); + + if(tp==NULL) + { + // this is probably a texture pack icon added from TMS + DWORD dwBytes=0,dwFileBytes=0; + PBYTE pbData=NULL,pbFileData=NULL; + + CXuiCtrl4JList::LIST_ITEM_INFO ListItem; + // get the current index of the list, and then get the data + ListItem=m_pTexturePacksList->GetData(index); + + app.GetTPD(ListItem.iData,&pbData,&dwBytes); + + app.GetFileFromTPD(eTPDFileType_Loc,pbData,dwBytes,&pbFileData,&dwFileBytes ); + if(dwFileBytes > 0 && pbFileData) + { + StringTable *pStringTable = new StringTable(pbFileData, dwFileBytes); + m_texturePackTitle.SetText(pStringTable->getString(L"IDS_DISPLAY_NAME")); + m_texturePackDescription.SetText(pStringTable->getString(L"IDS_TP_DESCRIPTION")); + } + + app.GetFileFromTPD(eTPDFileType_Icon,pbData,dwBytes,&pbFileData,&dwFileBytes ); + if(dwFileBytes >= 0 && pbFileData) + { + XuiCreateTextureBrushFromMemory(pbFileData,dwFileBytes,&m_hTexturePackIconBrush); + m_texturePackIcon->UseBrush(m_hTexturePackIconBrush); + } + app.GetFileFromTPD(eTPDFileType_Comparison,pbData,dwBytes,&pbFileData,&dwFileBytes ); + if(dwFileBytes >= 0 && pbFileData) + { + XuiCreateTextureBrushFromMemory(pbFileData,dwFileBytes,&m_hTexturePackComparisonBrush); + m_texturePackComparison->UseBrush(m_hTexturePackComparisonBrush); + } + else + { + m_texturePackComparison->UseBrush(NULL); + } + } + else + { + m_texturePackTitle.SetText(tp->getName().c_str()); + m_texturePackDescription.SetText(tp->getDesc1().c_str()); + + DWORD dwImageBytes; + PBYTE pbImageData = tp->getPackIcon(dwImageBytes); + + if(dwImageBytes > 0 && pbImageData) + { + XuiCreateTextureBrushFromMemory(pbImageData,dwImageBytes,&m_hTexturePackIconBrush); + m_texturePackIcon->UseBrush(m_hTexturePackIconBrush); + } + else + { + m_texturePackIcon->UseBrush(NULL); + } + + pbImageData = tp->getPackComparison(dwImageBytes); + + if(dwImageBytes > 0 && pbImageData) + { + XuiCreateTextureBrushFromMemory(pbImageData,dwImageBytes,&m_hTexturePackComparisonBrush); + m_texturePackComparison->UseBrush(m_hTexturePackComparisonBrush); + } + else + { + m_texturePackComparison->UseBrush(NULL); + } + } +} + +void CScene_LoadGameSettings::ClearTexturePackDescription() +{ + m_texturePackTitle.SetText(L" "); + m_texturePackDescription.SetText(L" "); + m_texturePackComparison->UseBrush(NULL); + m_texturePackIcon->UseBrush(NULL); +} + +void CScene_LoadGameSettings::UpdateCurrentTexturePack() +{ + m_currentTexturePackIndex = m_pTexturePacksList->GetCurSel(); + int iTexPackId=m_pTexturePacksList->GetData(m_currentTexturePackIndex).iData; + TexturePack *tp = Minecraft::GetInstance()->skins->getTexturePackById(iTexPackId); + + // if the texture pack is null, you don't have it yet + if(tp==NULL) + { + // Upsell + + CXuiCtrl4JList::LIST_ITEM_INFO ListItem; + // get the current index of the list, and then get the data + ListItem=m_pTexturePacksList->GetData(m_currentTexturePackIndex); + + + // upsell the texture pack + // tell sentient about the upsell of the full version of the skin pack + ULONGLONG ullOfferID_Full; + app.GetDLCFullOfferIDForPackID(ListItem.iData,&ullOfferID_Full); + + TelemetryManager->RecordUpsellPresented(ProfileManager.GetPrimaryPad(), eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); + + UINT uiIDA[3]; + + // Need to check if the texture pack has both Full and Trial versions - we may do some as free ones, so only Full + DLC_INFO *pDLCInfo=app.GetDLCInfoForFullOfferID(ullOfferID_Full); + + if(pDLCInfo->ullOfferID_Trial!=0LL) + { + uiIDA[0]=IDS_TEXTUREPACK_FULLVERSION; + uiIDA[1]=IDS_TEXTURE_PACK_TRIALVERSION; + uiIDA[2]=IDS_CONFIRM_CANCEL; + // Give the player a warning about the texture pack missing + StorageManager.RequestMessageBox(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 3, ProfileManager.GetPrimaryPad(),&CScene_LoadGameSettings::TexturePackDialogReturned,this,app.GetStringTable()); + } + else + { + uiIDA[0]=IDS_TEXTUREPACK_FULLVERSION; + uiIDA[1]=IDS_CONFIRM_CANCEL; + // Give the player a warning about the texture pack missing + StorageManager.RequestMessageBox(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CScene_LoadGameSettings::TexturePackDialogReturned,this,app.GetStringTable()); + } + + // do set the texture pack id, and on the user pressing create world, check they have it + m_MoreOptionsParams.dwTexturePack = ListItem.iData; + + return ; + } + else + { + m_MoreOptionsParams.dwTexturePack = tp->getId(); + } +} + +HRESULT CScene_LoadGameSettings::OnDestroy() +{ + if( m_hXuiBrush ) + { + XuiDestroyBrush( m_hXuiBrush ); + } + + // clear out the texture pack data + for(int i=0;igetDefaultSaveName().c_str()); + + bool isPrivate = (app.GetGameSettings(m_iPad,eGameSetting_InviteOnly)>0)?true:false; + + g_NetworkManager.HostGame(dwLocalUsersMask,isClientSide,isPrivate,MINECRAFT_NET_MAX_PLAYERS,0); + + NetworkGameInitData *param = new NetworkGameInitData(); + param->seed = 0; + param->saveData = NULL; + param->levelGen = levelGen; + + if(levelGen->requiresTexturePack()) + { + param->texturePackId = levelGen->getRequiredTexturePackId(); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->skins->selectTexturePackById(param->texturePackId); + //pMinecraft->skins->updateUI(); + } + + + app.SetGameHostOption(eGameHostOption_Difficulty,Minecraft::GetInstance()->options->difficulty); + app.SetGameHostOption(eGameHostOption_FriendsOfFriends,app.GetGameSettings(m_iPad,eGameSetting_FriendsOfFriends)); + app.SetGameHostOption(eGameHostOption_Gamertags,app.GetGameSettings(m_iPad,eGameSetting_GamertagsVisible)); + + app.SetGameHostOption(eGameHostOption_BedrockFog,app.GetGameSettings(m_iPad,eGameSetting_BedrockFog)?1:0); + + // 4J-JEV: Fix for: + // TU12: Content: Gameplay: New "Mass Effect World" remembers and uses the settings of another - lately created - World. + app.SetGameHostOption(eGameHostOption_LevelType,m_MoreOptionsParams.bFlatWorld); + app.SetGameHostOption(eGameHostOption_Structures,m_MoreOptionsParams.bStructures); + app.SetGameHostOption(eGameHostOption_BonusChest,m_MoreOptionsParams.bBonusChest); + + app.SetGameHostOption(eGameHostOption_PvP,m_MoreOptionsParams.bPVP); + app.SetGameHostOption(eGameHostOption_TrustPlayers,m_MoreOptionsParams.bTrust ); + app.SetGameHostOption(eGameHostOption_FireSpreads,m_MoreOptionsParams.bFireSpreads ); + app.SetGameHostOption(eGameHostOption_TNT,m_MoreOptionsParams.bTNT ); + app.SetGameHostOption(eGameHostOption_HostCanFly,m_MoreOptionsParams.bHostPrivileges); + app.SetGameHostOption(eGameHostOption_HostCanChangeHunger,m_MoreOptionsParams.bHostPrivileges); + app.SetGameHostOption(eGameHostOption_HostCanBeInvisible,m_MoreOptionsParams.bHostPrivileges ); + + // flag if the user wants to reset the Nether to force a Fortress with netherwart etc. + app.SetResetNether((m_MoreOptionsParams.bResetNether==TRUE)?true:false); + // clear out the app's terrain features list + app.ClearTerrainFeaturePosition(); + + app.SetGameHostOption(eGameHostOption_GameType,m_bGameModeSurvival?GameType::SURVIVAL->getId():GameType::CREATIVE->getId()); + + param->settings = app.GetGameHostOption( eGameHostOption_All ); + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc; + loadingParams->lpParam = (LPVOID)param; + + // Reset the autosave timer + app.SetAutosaveTimerTime(); + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + + app.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); +} + + +HRESULT CScene_LoadGameSettings::OnCustomMessage_DLCInstalled() +{ + // mounted DLC may have changed + if(app.StartInstallDLCProcess(m_iPad)==false) + { + // not doing a mount, so re-enable input + m_bIgnoreInput=false; + } + else + { + m_bIgnoreInput=true; + // clear out the texture pack list and do again + m_pTexturePacksList->RemoveAllData(); + m_iTexturePacksNotInstalled=0; + + } + + // this will send a CustomMessage_DLCMountingComplete when done + return S_OK; +} + + +HRESULT CScene_LoadGameSettings::OnCustomMessage_DLCMountingComplete() +{ + m_pTexturePacksList->SetSelectionChangedHandle(m_hObj); + Minecraft *pMinecraft = Minecraft::GetInstance(); + int texturePacksCount = pMinecraft->skins->getTexturePackCount(); + CXuiCtrl4JList::LIST_ITEM_INFO ListInfo; + HRESULT hr; + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + ZeroMemory(&ListInfo,sizeof(CXuiCtrl4JList::LIST_ITEM_INFO)); + + DWORD dwImageBytes; + PBYTE pbImageData = tp->getPackIcon(dwImageBytes); + + if(dwImageBytes > 0 && pbImageData) + { + ListInfo.fEnabled = TRUE; + hr=XuiCreateTextureBrushFromMemory(pbImageData,dwImageBytes,&ListInfo.hXuiBrush); + + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tp; + if(pDLCTexPack) + { + int id=pDLCTexPack->getDLCParentPackId(); + + if(id==0) + { + // default texture pack - should come first + ListInfo.iSortIndex=0x0FFFFFFF; + } + else + { + ListInfo.iSortIndex=id; + ListInfo.iData=id; + } + } + m_pTexturePacksList->AddData(ListInfo,0,CXuiCtrl4JList::eSortList_Index); + } + } + m_currentTexturePackIndex = m_pTexturePacksList->GetIndexByUserData(m_MoreOptionsParams.dwTexturePack); + m_pTexturePacksList->SetCurSel(m_currentTexturePackIndex); + m_pTexturePacksList->SetTopItem(m_currentTexturePackIndex); // scroll the item into view if it's not visible + + m_iTexturePacksNotInstalled=0; + + // 4J-PB - there may be texture packs we don't have, so use the info from TMS for this + DLC_INFO *pDLCInfo=NULL; + + // first pass - look to see if there are any that are not in the list + bool bTexturePackAlreadyListed; + bool bNeedToGetTPD=false; + + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + bTexturePackAlreadyListed=false; + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + if(pDLCInfo->iConfig==tp->getDLCParentPackId()) + { + bTexturePackAlreadyListed=true; + } + } + if(bTexturePackAlreadyListed==false) + { + // some missing + bNeedToGetTPD=true; + + m_iTexturePacksNotInstalled++; + } + } + + if(bNeedToGetTPD==true) + { + // add a TMS request for them + app.DebugPrintf("+++ Adding TMSPP request for texture pack data\n"); + app.AddTMSPPFileTypeRequest(e_DLC_TexturePackData); + if(m_iConfigA!=NULL) + { + delete m_iConfigA; + } + m_iConfigA= new int [m_iTexturePacksNotInstalled]; + m_iTexturePacksNotInstalled=0; + + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + bTexturePackAlreadyListed=false; + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + if(pDLCInfo->iConfig==tp->getDLCParentPackId()) + { + bTexturePackAlreadyListed=true; + } + } + if(bTexturePackAlreadyListed==false) + { + m_iConfigA[m_iTexturePacksNotInstalled++]=pDLCInfo->iConfig; + } + } + } + + UpdateTexturePackDescription(m_currentTexturePackIndex); + + m_bIgnoreInput=false; + app.m_dlcManager.checkForCorruptDLCAndAlert(); + return S_OK; +} + +int CScene_LoadGameSettings::TexturePackDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + CScene_LoadGameSettings *pClass = (CScene_LoadGameSettings *)pParam; +#ifdef _XBOX + pClass->m_currentTexturePackIndex = pClass->m_pTexturePacksList->GetCurSel(); + // Exit with or without saving + // Decline means install full version of the texture pack in this dialog + if(result==C4JStorage::EMessage_ResultDecline || result==C4JStorage::EMessage_ResultAccept) + { + // we need to enable background downloading for the DLC + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); + + ULONGLONG ullOfferID_Full; + ULONGLONG ullIndexA[1]; + CXuiCtrl4JList::LIST_ITEM_INFO ListItem; + // get the current index of the list, and then get the data + ListItem=pClass->m_pTexturePacksList->GetData(pClass->m_currentTexturePackIndex); + app.GetDLCFullOfferIDForPackID(ListItem.iData,&ullOfferID_Full); + + if( result==C4JStorage::EMessage_ResultAccept ) // Full version + { + ullIndexA[0]=ullOfferID_Full; + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + + } + else // trial version + { + // if there is no trial version, this is a Cancel + DLC_INFO *pDLCInfo=app.GetDLCInfoForFullOfferID(ullOfferID_Full); + if(pDLCInfo->ullOfferID_Trial!=0LL) + { + ullIndexA[0]=pDLCInfo->ullOfferID_Trial; + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + } + } + } +#endif + pClass->m_bIgnoreInput=false; + return 0; +} + +HRESULT CScene_LoadGameSettings::OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled) +{ + // update the tooltips + int iRB=-1; +#ifdef _XBOX + +#endif + CXuiSceneBase::SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK, -1, -1,-1,-1,-1,iRB); + return S_OK; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_LoadSettings.h b/Minecraft.Client/Common/XUI/XUI_LoadSettings.h new file mode 100644 index 00000000..61e934b7 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_LoadSettings.h @@ -0,0 +1,154 @@ +#pragma once +#include "../media/xuiscene_load_settings.h" +#include "XUI_Ctrl_SliderWrapper.h" +#include "XUI_Ctrl_4JIcon.h" +#include "XUI_CustomMessages.h" +#include "XUI_MultiGameLaunchMoreOptions.h" + +class CScene_LoadGameSettings : public CXuiSceneImpl +{ +public: + typedef struct + { + unsigned int uiLen; + unsigned int uiCode; + } + PNG_CHUNK; +protected: + // Control and Element wrapper objects. + CXuiScene m_MainScene; + CXuiScene m_TexturePackDetails; + CXuiControl m_GameName; + CXuiControl m_GameSeed; + CXuiControl m_GameCreatedMode; + CXuiControl m_ButtonLoad; + CXuiControl m_ButtonGameMode; + CXuiControl m_MoreOptions; + CXuiCtrl4JIcon m_GameIcon; + CXuiCtrlSliderWrapper m_SliderDifficulty; + CXuiCtrl4JList *m_pTexturePacksList; + CXuiControl m_texturePackTitle, m_texturePackDescription; + CXuiCtrl4JIcon *m_texturePackIcon, *m_texturePackComparison; + + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_CONTROL_NAVIGATE( OnControlNavigate ) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_NOTIFY_VALUE_CHANGED(OnNotifyValueChanged) + XUI_ON_XM_GET_SOURCE_IMAGE(OnGetSourceDataImage) + XUI_ON_XM_TRANSITION_START(OnTransitionStart) + XUI_ON_XM_TRANSITION_END(OnTransitionEnd) + XUI_ON_XM_FONTRENDERERCHANGE_MESSAGE(OnFontRendererChange) + XUI_ON_XM_NOTIFY_SELCHANGED( OnNotifySelChanged ) + XUI_ON_XM_TIMER( OnTimer ) + XUI_ON_XM_NOTIFY_KILL_FOCUS( OnNotifyKillFocus ) + XUI_ON_XM_DESTROY( OnDestroy ) + XUI_ON_XM_DLCINSTALLED_MESSAGE(OnCustomMessage_DLCInstalled) + XUI_ON_XM_DLCLOADED_MESSAGE(OnCustomMessage_DLCMountingComplete) + XUI_ON_XM_NAV_RETURN(OnNavReturn) + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_MainScene, m_MainScene) + BEGIN_MAP_CHILD_CONTROLS(m_MainScene) + MAP_CONTROL(IDC_XuiLoadSettings, m_ButtonLoad) + MAP_CONTROL(IDC_XuiGameModeToggle, m_ButtonGameMode) + MAP_CONTROL(IDC_XuiMoreOptions, m_MoreOptions) + MAP_CONTROL(IDC_XuiGameIcon, m_GameIcon); + MAP_CONTROL(IDC_XuiGameName, m_GameName) + MAP_CONTROL(IDC_XuiGameSeed, m_GameSeed) + MAP_CONTROL(IDC_XuiCreatedMode, m_GameCreatedMode) + MAP_CONTROL(IDC_XuiSliderDifficulty, m_SliderDifficulty) + MAP_OVERRIDE(IDC_TexturePacksList, m_pTexturePacksList) + //MAP_CONTROL(IDC_XuiGameMode, m_GameMode) + END_MAP_CHILD_CONTROLS() + MAP_CONTROL(IDC_TexturePackDetails, m_TexturePackDetails) + BEGIN_MAP_CHILD_CONTROLS(m_TexturePackDetails) + MAP_CONTROL(IDC_TexturePackName, m_texturePackTitle) + MAP_CONTROL(IDC_TexturePackDescription, m_texturePackDescription) + MAP_OVERRIDE(IDC_Icon, m_texturePackIcon) + MAP_OVERRIDE(IDC_ComparisonPic, m_texturePackComparison) + END_MAP_CHILD_CONTROLS() + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnGetSourceDataImage(XUIMessageGetSourceImage *pGetSourceImageData,BOOL& bHandled); + HRESULT OnNotifyValueChanged( HXUIOBJ hObjSource, XUINotifyValueChanged* pNotifyValueChanged, BOOL& bHandled ); + HRESULT OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ); + HRESULT OnTransitionEnd( XUIMessageTransition *pTransition, BOOL& bHandled ); + HRESULT OnFontRendererChange(); + HRESULT OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled); + HRESULT OnNotifySelChanged( HXUIOBJ hObjSource, XUINotifySelChanged* pNotifySelChangedData, BOOL& bHandled ); + HRESULT OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ); + HRESULT OnNotifyKillFocus(HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled); + HRESULT OnDestroy(); + HRESULT OnCustomMessage_DLCInstalled(); + HRESULT OnCustomMessage_DLCMountingComplete(); + HRESULT OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled); + + + static int LoadSaveDataReturned(void *pParam,bool bContinue); + static int LoadSaveDataForNameChangeReturned(void *pParam,bool bContinue); + static int DeviceRemovedDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static void StartGameFromSave(CScene_LoadGameSettings* pClass, DWORD dwLocalUsersMask); + static int StartGame_SignInReturned(void *pParam,bool bContinue, int iPad); + static int DeviceSelectReturned(void *pParam,bool bContinue); + static int ConfirmLoadReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int DeleteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int DeleteSaveDataReturned(void *pParam,bool bSuccess); + static int CheckResetNetherReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int TexturePackDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + + static int Progress(void *pParam,float fProgress); + + void LoadLevelGen(LevelGenerationOptions *levelGen); + + HRESULT LaunchGame(void); +public: + static unsigned char szPNG[8]; + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_LoadGameSettings, L"CScene_LoadGameSettings", XUI_CLASS_SCENE ) + +private: + static int UnlockTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + void UpdateTexturePackDescription(int index); + void ClearTexturePackDescription(); + void UpdateCurrentTexturePack(); + + bool m_bIgnoreInput; + HXUIBRUSH m_hXuiBrush; + HXUIBRUSH m_hTexturePackIconBrush; + HXUIBRUSH m_hTexturePackComparisonBrush; + + int m_iPad; + int m_iSaveGameInfoIndex; + bool m_bMultiplayerAllowed; + static int m_iDifficultyTitleSettingA[4]; + int m_CurrentDifficulty; + bool m_bHasBeenInCreative; + bool m_bSetup; + bool m_texturePackDescDisplayed; + + DWORD m_dwSaveFileC; +#ifdef _XBOX + C4JStorage::CACHEINFOSTRUCT *m_InfoA; +#endif + unsigned char m_szSeed[50]; + XCONTENT_DATA m_XContentData; + LaunchMoreOptionsMenuInitData m_MoreOptionsParams; + bool m_bGameModeSurvival; + unsigned int m_currentTexturePackIndex; + DLCPack * m_pDLCPack; + LevelGenerationOptions *m_levelGen; + + int m_iTexturePacksNotInstalled; + int *m_iConfigA; // track the texture packs that we don't have installed + LoadMenuInitData *m_params; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_MainMenu.cpp b/Minecraft.Client/Common/XUI/XUI_MainMenu.cpp new file mode 100644 index 00000000..7b9c1a56 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_MainMenu.cpp @@ -0,0 +1,1288 @@ +// Minecraft.cpp : Defines the entry point for the application. +// + +#include "stdafx.h" + +#include +#include "..\XUI\XUI_MainMenu.h" +#include "..\..\..\Minecraft.Client\SurvivalMode.h" +#include "..\..\..\Minecraft.World\ConsoleSaveFileIO.h" +#include "..\..\LocalPlayer.h" +#include "..\..\..\Minecraft.World\AABB.h" +#include "..\..\..\Minecraft.World\Vec3.h" +#include "..\..\User.h" +//#include "XUI_CreateLoad.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\Random.h" +#include "..\..\MinecraftServer.h" +#include "..\..\Minecraft.h" +#include "..\..\Options.h" +#include "..\..\Font.h" +#include "..\..\Common\GameRules\ConsoleGameRules.h" + +#define DLC_INSTALLED_TIMER_ID 1 +#define DLC_INSTALLED_TIMER_TIME 100 +#define TMS_TIMER_ID 2 +#define TMS_TIMER_TIME 100 +Random *CScene_Main::random = new Random(); + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_Main::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + MapChildControls(); + + XuiControlSetText(m_Buttons[BUTTON_PLAYGAME],app.GetString(IDS_PLAY_GAME)); + XuiControlSetText(m_Buttons[BUTTON_LEADERBOARDS],app.GetString(IDS_LEADERBOARDS)); + XuiControlSetText(m_Buttons[BUTTON_ACHIEVEMENTS],app.GetString(IDS_ACHIEVEMENTS)); + XuiControlSetText(m_Buttons[BUTTON_HELPANDOPTIONS],app.GetString(IDS_HELP_AND_OPTIONS)); + XuiControlSetText(m_Buttons[BUTTON_UNLOCKFULLGAME],app.GetString(IDS_UNLOCK_FULL_GAME)); + XuiControlSetText(m_Buttons[BUTTON_EXITGAME],app.GetString(IDS_EXIT_GAME)); + + m_Timer.SetShow(FALSE); + m_eAction=eAction_None; + + // Display the tooltips + HRESULT hr = S_OK; + ui.SetTooltips(DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT); + + // can't set presence until someone is signed in and playing + + // Need to check which menu items to display + + // Are we the trial version? + // store the exitgame position + m_Buttons[BUTTON_EXITGAME].GetPosition(&m_vPosExitGame); + + if(ProfileManager.IsFullVersion()) + { + // Replace the Unlock Full Game with Downloadable Content + m_Buttons[BUTTON_UNLOCKFULLGAME].SetText(app.GetString(IDS_DOWNLOADABLECONTENT)); + XuiElementSetShow(m_Buttons[BUTTON_UNLOCKFULLGAME],TRUE); + } + + // Do we have downloadable content? - We need to have this in for a Pre-Cert test, whether or not we have DLC at the time. + + + CXuiSceneBase::ShowBackground( DEFAULT_XUI_MENU_USER, TRUE ); + CXuiSceneBase::ShowLogo( DEFAULT_XUI_MENU_USER, TRUE ); + + const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string + WCHAR szResourceLocator[ LOCATOR_SIZE ]; + + // load from the .xzp file + const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL); + swprintf(szResourceLocator, LOCATOR_SIZE ,L"section://%X,%ls#%ls",c_ModuleHandle,L"media", L"media/splashes.txt"); + + BYTE *splashesData; + UINT splashesSize; + hr = XuiResourceLoadAllNoLoc(szResourceLocator, &splashesData, &splashesSize); + + if( HRESULT_SUCCEEDED( hr ) ) + { + //BufferedReader *br = new BufferedReader(new InputStreamReader(InputStream::getResourceAsStream(L"res\\title\\splashes.txt"))); //, Charset.forName("UTF-8") + byteArray splashesArray(splashesSize); + memcpy(splashesArray.data, splashesData, splashesSize); + ByteArrayInputStream *bais= new ByteArrayInputStream(splashesArray); + InputStreamReader *isr = new InputStreamReader( bais ); + BufferedReader *br = new BufferedReader( isr ); + + wstring line = L""; + while ( !(line = br->readLine()).empty() ) + { + line = trimString( line ); + if (line.length() > 0) + { + m_splashes.push_back(line); + } + } + + XuiFree(splashesData); // Frees copy returned from XuiResourceLoadAllNoLoc + + br->close(); + delete br; + delete isr; + delete bais; // Frees copy made in splashesArray + } + + XuiElementGetBounds(m_Subtitle,&m_fSubtitleWidth, &m_fSubtitleHeight); + +#if 1 + XuiElementSetShow(m_Subtitle, FALSE); + XuiElementSetShow(m_SubtitleMCFont, TRUE); +#else + XuiElementSetShow(m_Subtitle, TRUE); + XuiElementSetShow(m_SubtitleMCFont, FALSE); +#endif + + m_bIgnorePress=false; + + // 4J Stu - Clear out any loaded game rules + app.setLevelGenerationOptions(NULL); + + // Fix for #45154 - Frontend: DLC: Content can only be downloaded from the frontend if you have not joined/exited multiplayer + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); + + return S_OK; +} + +HRESULT CScene_Main::OnNotifySetFocus(HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled) +{ + // If we sign out when in the saves list, we get a notifysetfocus in the saves list after the init of the main menu + ui.SetTooltips(DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT); + + return S_OK; +} + + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_Main::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + // should we ignore the button press? This will be set if we're waiting for a callback from a function launched from a button press + if(m_bIgnorePress) return S_OK; + + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + unsigned int uiButtonCounter=0; + //Minecraft *pMinecraft=Minecraft::GetInstance(); + + while((uiButtonCounterUserIndex); + ProfileManager.SetLockedProfile(-1); + + // Determine which button was pressed, + // and call the appropriate function. + switch(uiButtonCounter) + { + case BUTTON_PLAYGAME: + // Move to the new/load game screen + // need a signed in user here + + ProfileManager.SetCurrentGameActivity(pNotifyPressData->UserIndex,CONTEXT_PRESENCE_MENUS,true); + + m_eAction=eAction_RunGame; + if(ProfileManager.IsSignedIn(pNotifyPressData->UserIndex)) + { + RunPlayGame(pNotifyPressData->UserIndex); + } + else + { + // get them to sign in + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + StorageManager.RequestMessageBox(IDS_MUST_SIGN_IN_TITLE, IDS_MUST_SIGN_IN_TEXT, uiIDA, 2, pNotifyPressData->UserIndex,&CScene_Main::MustSignInReturned,this, app.GetStringTable()); + } + + break; + + case BUTTON_LEADERBOARDS: + m_eAction=eAction_RunLeaderboards; + if(ProfileManager.IsSignedIn(pNotifyPressData->UserIndex)) + { + RunLeaderboards(pNotifyPressData->UserIndex); + } + else + { + // get them to sign in + //ProfileManager.RequestSignInUI(false, false, true,false,true, &CScene_Main::Leaderboards_SignInReturned, this); + // get them to sign in + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + StorageManager.RequestMessageBox(IDS_MUST_SIGN_IN_TITLE, IDS_MUST_SIGN_IN_TEXT, uiIDA, 2, pNotifyPressData->UserIndex,&CScene_Main::MustSignInReturned,this, app.GetStringTable()); + + } + break; + case BUTTON_ACHIEVEMENTS: + m_eAction=eAction_RunAchievements; + if(ProfileManager.IsSignedIn(pNotifyPressData->UserIndex)) + { + RunAchievements(pNotifyPressData->UserIndex); + } + else + { + // get them to sign in + //ProfileManager.RequestSignInUI(false, false, true,false,true,&CScene_Main::Achievements_SignInReturned,this ); + // get them to sign in + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + StorageManager.RequestMessageBox(IDS_MUST_SIGN_IN_TITLE, IDS_MUST_SIGN_IN_TEXT, uiIDA, 2, pNotifyPressData->UserIndex,&CScene_Main::MustSignInReturned,this, app.GetStringTable()); + + } + + break; + case BUTTON_HELPANDOPTIONS: + // need a signed in user here, so we have a profile to write to + ProfileManager.SetLockedProfile(pNotifyPressData->UserIndex); + + m_eAction=eAction_RunHelpAndOptions; + if(ProfileManager.IsSignedIn(pNotifyPressData->UserIndex)) + { + RunHelpAndOptions(pNotifyPressData->UserIndex); + } + else + { + // get them to sign in + //ProfileManager.RequestSignInUI(false, false, true,false,true,&CScene_Main::HelpAndOptions_SignInReturned,this ); + // get them to sign in + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + StorageManager.RequestMessageBox(IDS_MUST_SIGN_IN_TITLE, IDS_MUST_SIGN_IN_TEXT, uiIDA, 2, pNotifyPressData->UserIndex,&CScene_Main::MustSignInReturned,this, app.GetStringTable()); + + } + break; + // case BUTTON_RETURNTOARCADE: + // break; + case BUTTON_UNLOCKFULLGAME: + { + // need a signed in user here + ProfileManager.SetLockedProfile(pNotifyPressData->UserIndex); + + m_eAction=eAction_RunUnlockOrDLC; + if(ProfileManager.IsSignedIn(pNotifyPressData->UserIndex)) + { + RunUnlockOrDLC(pNotifyPressData->UserIndex); + } + else + { + // get them to sign in + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + StorageManager.RequestMessageBox(IDS_MUST_SIGN_IN_TITLE, IDS_MUST_SIGN_IN_TEXT, uiIDA, 2, pNotifyPressData->UserIndex,&CScene_Main::MustSignInReturned,this, app.GetStringTable()); + } + } + break; + case BUTTON_EXITGAME: + if( ProfileManager.IsFullVersion() ) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CANCEL; + uiIDA[1]=IDS_OK; + StorageManager.RequestMessageBox(IDS_WARNING_ARCADE_TITLE, IDS_WARNING_ARCADE_TEXT, uiIDA, 2, XUSER_INDEX_ANY,&CScene_Main::ExitGameReturned,this); + } + else + { + app.NavigateToScene(pNotifyPressData->UserIndex,eUIScene_TrialExitUpsell); + } + break; + + default: + break; + } + + + + return S_OK; +} + +HRESULT CScene_Main::OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled) +{ + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT); + CXuiSceneBase::ShowLogo(DEFAULT_XUI_MENU_USER,TRUE); + CXuiSceneBase::ShowBackground( DEFAULT_XUI_MENU_USER, TRUE ); + // unlock the locked profile - anyone can navigate the main menu + ProfileManager.SetLockedProfile(-1); + + // incase the debug trial version has been set + // Are we the trial version? + + m_Buttons[BUTTON_EXITGAME].GetPosition(&m_vPosExitGame); + + for(int i=0;idwTransAction==XUI_TRANSITION_ACTION_DESTROY ) return S_OK; + + if(pTransition->dwTransType == XUI_TRANSITION_TO || pTransition->dwTransType == XUI_TRANSITION_BACKTO) + { + // 4J-PB - remove the "hobo humping" message legal (Sony) say we can't have - pretty sure Microsoft would say the same if they noticed it. + int splashIndex = eSplashRandomStart + 1 + random->nextInt( (int)m_splashes.size() - (eSplashRandomStart + 1) ); + + // Override splash text on certain dates + SYSTEMTIME LocalSysTime; + GetLocalTime( &LocalSysTime ); + if (LocalSysTime.wMonth == 11 && LocalSysTime.wDay == 9) + { + splashIndex = eSplashHappyBirthdayEx; + } + else if (LocalSysTime.wMonth == 6 && LocalSysTime.wDay == 1) + { + splashIndex = eSplashHappyBirthdayNotch; + } + else if (LocalSysTime.wMonth == 12 && LocalSysTime.wDay == 24) // the Java game shows this on Christmas Eve, so we will too + { + splashIndex = eSplashMerryXmas; + } + else if (LocalSysTime.wMonth == 1 && LocalSysTime.wDay == 1) + { + splashIndex = eSplashHappyNewYear; + } + //splashIndex = 47; // Very short string + //splashIndex = 197; // Very long string + //splashIndex = 296; // Coloured + //splashIndex = 297; // Noise + wstring splash = m_splashes.at( splashIndex ); + m_Subtitle.SetText(splash.c_str()); + m_SubtitleMCFont.SetText(splash.c_str()); + +#ifndef OVERRIDE_XUI_FONT_RENDERER + XUIRect xuiRect; + HRESULT hr=S_OK; + float fWidth,fHeight; + + HXUIOBJ visual=NULL; + HXUIOBJ pulser, subtitle, text; + hr=XuiControlGetVisual(m_Subtitle.m_hObj,&visual); + hr=XuiElementGetChildById(visual,L"Pulser",&pulser); + hr=XuiElementGetChildById(pulser,L"SubTitle",&subtitle); + hr=XuiElementGetChildById(subtitle,L"Text_String",&text); + + memset(&xuiRect, 0, sizeof(xuiRect)); + // Start with a base size + XuiElementSetBounds(m_Subtitle,m_fSubtitleWidth, m_fSubtitleHeight); + hr=XuiTextPresenterMeasureText(text, splash.c_str(), &xuiRect); + XuiElementGetBounds(text,&fWidth, &fHeight); + + float diff = fWidth / (xuiRect.right+5); + + diff = min(diff,MAIN_MENU_MAX_TEXT_SCALE); + + // Resize + XuiElementGetBounds(m_Subtitle,&fWidth, &fHeight); + XuiElementSetBounds(m_Subtitle,fWidth/diff, fHeight); + + // Scale + D3DXVECTOR3 vScale(diff,diff,0); + XuiElementSetScale(m_Subtitle,&vScale); + + //Adjust pivot for animation + D3DXVECTOR3 vPivot; + XuiElementGetPivot(subtitle,&vPivot); + vPivot.x = vPivot.x + ( ( (fWidth/diff) - fWidth) / 2 ); + XuiElementSetPivot(subtitle,&vPivot); + + // 4J-PB - Going to resize buttons if the text is too big to fit on any of them (Br-pt problem with the length of Unlock Full Game) + + float fMaxTextLen=0.0f; + float fTextVisualLen; + float fMaxButton; + + hr=XuiControlGetVisual(m_Buttons[0].m_hObj,&visual); + hr=XuiElementGetChildById(visual,L"text_Label",&text); + hr=XuiElementGetBounds(text,&fTextVisualLen,&fHeight); + m_Buttons[0].GetBounds(&fMaxButton,&fHeight); + + + for(int i=0;ifMaxTextLen) fMaxTextLen=xuiRect.right; + } + + if(fTextVisualLenhObjDest=XuiControlGetNavigation(pControlNavigateData->hObjSource,pControlNavigateData->nControlNavigate,TRUE,TRUE); + + if(pControlNavigateData->hObjDest!=NULL) + { + bHandled=TRUE; + } +#endif + return S_OK; +} + +HRESULT CScene_Main::OnKeyDown(XUIMessageInput *pInputData, BOOL& bHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + // Don't set handled to true. + + return S_OK; +} + +///////////////////////////////////////////////////////////// + +int CScene_Main::SignInReturned(void *pParam,bool bContinue) +{ + CScene_Main* pClass = (CScene_Main*)pParam; + + if(bContinue==true) + { + StorageManager.SetSaveDevice(&CScene_Main::DeviceSelectReturned,pClass); + } + + + return 0; +} + +int CScene_Main::DeviceSelectReturned(void *pParam,bool bContinue) +{ + CScene_Main* pClass = (CScene_Main*)pParam; + //HRESULT hr; + + if(bContinue==true) + { + // change the minecraft player name + Minecraft::GetInstance()->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); + // ensure we've applied this player's settings + app.ApplyGameSettingsChanged(ProfileManager.GetPrimaryPad()); + // check for DLC + // start timer to track DLC check finished + pClass->m_Timer.SetShow(TRUE); + XuiSetTimer(pClass->m_hObj,DLC_INSTALLED_TIMER_ID,DLC_INSTALLED_TIMER_TIME); + + //app.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_MultiGameJoinLoad); + } + else + { + // unlock the profile + ProfileManager.SetLockedProfile(-1); + ProfileManager.SetPrimaryPad(-1); + for(int i=0;iuser->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); + + if(ProfileManager.IsFullVersion()) + { + if(StorageManager.SetSaveDevice(&CScene_Main::DeviceSelectReturned,pClass)) + { + // save device already selected + // ensure we've applied this player's settings + app.ApplyGameSettingsChanged(ProfileManager.GetPrimaryPad()); + + // check for DLC + // start timer to track DLC check finished + pClass->m_Timer.SetShow(TRUE); + XuiSetTimer(pClass->m_hObj,DLC_INSTALLED_TIMER_ID,DLC_INSTALLED_TIMER_TIME); + + //app.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_MultiGameJoinLoad); + } + } + else + { + // 4J-PB - if this is the trial game, we can't have any networking + // Can't apply the player's settings here - they haven't come back from the QuerySignInStatud call above yet. + // Need to let them action in the main loop when they come in + // ensure we've applied this player's settings + //app.ApplyGameSettingsChanged(iPad); + // go straight in to the trial level + LoadTrial(); + } + } + else + { + // force a sign-in - they were offline, and they want to be online, so don't let it display offline players + // set the bAddUser to false to allow offline to go online by selecting the already signed in player again + ProfileManager.RequestSignInUI(false, false, true,false,false,&CScene_Main::CreateLoad_SignInReturned,pClass, ProfileManager.GetPrimaryPad() ); + } + + return 0; +} + +int CScene_Main::CreateLoad_SignInReturned(void *pParam,bool bContinue, int iPad) +{ + CScene_Main* pClass = (CScene_Main*)pParam; + + if(bContinue==true) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + + if(ProfileManager.IsGuest(ProfileManager.GetPrimaryPad())) + { + StorageManager.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + } + else + { + ProfileManager.SetLockedProfile(ProfileManager.GetPrimaryPad()); + + + // change the minecraft player name + Minecraft::GetInstance()->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); + + if(ProfileManager.IsFullVersion()) + { + // Check if we're signed in to LIVE + if(ProfileManager.IsSignedInLive(iPad)) + { + // 4J-PB - Need to check for installed DLC + if(!app.DLCInstallProcessCompleted()) app.StartInstallDLCProcess(iPad); + + if(ProfileManager.IsGuest(iPad)) + { + StorageManager.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + } + else + { + // check if all the TMS files are loaded + if(app.GetTMSDLCInfoRead() && app.GetTMSXUIDsFileRead() && app.GetBanListRead(iPad)) + { + if(StorageManager.SetSaveDevice(&CScene_Main::DeviceSelectReturned,pClass)==true) + { + // save device already selected + + // ensure we've applied this player's settings + app.ApplyGameSettingsChanged(ProfileManager.GetPrimaryPad()); + // check for DLC + // start timer to track DLC check finished + pClass->m_Timer.SetShow(TRUE); + XuiSetTimer(pClass->m_hObj,DLC_INSTALLED_TIMER_ID,DLC_INSTALLED_TIMER_TIME); + //app.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_MultiGameJoinLoad); + } + } + else + { + // Changing to async TMS calls + app.SetTMSAction(iPad,eTMSAction_TMSPP_RetrieveFiles_RunPlayGame); + + // block all input + pClass->m_bIgnorePress=true; + // We want to hide everything in this scene and display a timer until we get a completion for the TMS files + for(int i=0;im_Buttons[i].SetShow(FALSE); + } + + // turn off tooltips + ui.SetTooltips(DEFAULT_XUI_MENU_USER, -1); + + pClass->m_Timer.SetShow(TRUE); + } + } + } + else + { + // offline + ProfileManager.DisplayOfflineProfile(&CScene_Main::CreateLoad_OfflineProfileReturned,pClass, ProfileManager.GetPrimaryPad() ); + } + } + else + { + // 4J-PB - if this is the trial game, we can't have any networking + // Can't apply the player's settings here - they haven't come back from the QuerySignInStatud call above yet. + // Need to let them action in the main loop when they come in + // ensure we've applied this player's settings + //app.ApplyGameSettingsChanged(iPad); + + // go straight in to the trial level + LoadTrial(); + } + } + } + else + { + // unlock the profile + ProfileManager.SetLockedProfile(-1); + for(int i=0;im_eAction) + { + case eAction_RunGame: + ProfileManager.RequestSignInUI(false, true, false,false,true,&CScene_Main::CreateLoad_SignInReturned,pClass ,iPad); + break; + case eAction_RunLeaderboards: + ProfileManager.RequestSignInUI(false, false, true,false,true, &CScene_Main::Leaderboards_SignInReturned, pClass,iPad); + break; + case eAction_RunAchievements: + ProfileManager.RequestSignInUI(false, false, true,false,true,&CScene_Main::Achievements_SignInReturned,pClass,iPad ); + break; + case eAction_RunHelpAndOptions: + ProfileManager.RequestSignInUI(false, false, true,false,true,&CScene_Main::HelpAndOptions_SignInReturned,pClass,iPad ); + break; + case eAction_RunUnlockOrDLC: + ProfileManager.RequestSignInUI(false, false, true,false,true,&CScene_Main::UnlockFullGame_SignInReturned,pClass,iPad ); + break; + + } + } + else + { + // unlock the profile + ProfileManager.SetLockedProfile(-1); + for(int i=0;im_bIgnorePress=true; + // We want to hide everything in this scene and display a timer until we get a completion for the TMS files + for(int i=0;im_Buttons[i].SetShow(FALSE); + } + + // turn off tooltips + ui.SetTooltips(DEFAULT_XUI_MENU_USER, -1); + + pClass->m_Timer.SetShow(TRUE); + } + } + else + { + // unlock the profile + ProfileManager.SetLockedProfile(-1); + for(int i=0;iRunUnlockOrDLC(iPad); + } + else + { + // unlock the profile + ProfileManager.SetLockedProfile(-1); + for(int i=0;iseed = 0; + param->saveData = NULL; + param->settings = app.GetGameHostOption( eGameHostOption_Tutorial ); + + vector *generators = app.getLevelGenerators(); + param->levelGen = generators->at(0); + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc; + loadingParams->lpParam = (LPVOID)param; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; + completionData->iPad = ProfileManager.GetPrimaryPad(); + loadingParams->completionData = completionData; + + CXuiSceneBase::ShowTrialTimer(TRUE); + + app.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); +} + + + +void CScene_Main::RunPlayGame(int iPad) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + + app.ReleaseSaveThumbnail(); + + if(ProfileManager.IsGuest(iPad)) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + + StorageManager.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + } + else + { + ProfileManager.SetLockedProfile(iPad); + + // If the player was signed in before selecting play, we'll not have read the profile yet, so query the sign-in status to get this to happen + ProfileManager.QuerySigninStatus(); + // 4J-PB - Need to check for installed DLC + if(!app.DLCInstallProcessCompleted()) app.StartInstallDLCProcess(iPad); + + if(ProfileManager.IsFullVersion()) + { + // are we offline? + if(!ProfileManager.IsSignedInLive(iPad)) + { + + ProfileManager.DisplayOfflineProfile(&CScene_Main::CreateLoad_OfflineProfileReturned,this,iPad ); + } + else + { + // Check if there is any new DLC + app.ClearNewDLCAvailable(); + StorageManager.GetAvailableDLCCount(iPad); + + // check if all the TMS files are loaded + if(app.GetTMSDLCInfoRead() && app.GetTMSXUIDsFileRead() && app.GetBanListRead(iPad)) + { + if(StorageManager.SetSaveDevice(&CScene_Main::DeviceSelectReturned,this)==true) + { + // change the minecraft player name + pMinecraft->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); + // save device already selected + + // ensure we've applied this player's settings + app.ApplyGameSettingsChanged(iPad); + // check for DLC + // start timer to track DLC check finished + m_Timer.SetShow(TRUE); + XuiSetTimer(m_hObj,DLC_INSTALLED_TIMER_ID,DLC_INSTALLED_TIMER_TIME); + //app.NavigateToScene(iPad,eUIScene_MultiGameJoinLoad); + } + } + else + { + // Changing to async TMS calls + + // flag the timer to start the TMS calls when there is nothing happening with TMS. + // fix for X360 - 162325 - TCR 001: BAS Game Stability: TU17: The game goes into an infinite loading upon entering the Play Game menu shortly after visiting the Minecraft Store + if(app.GetTMSAction(iPad)!=eTMSAction_Idle) + { + XuiSetTimer(m_hObj,TMS_TIMER_ID,TMS_TIMER_TIME); + } + else + { + app.SetTMSAction(iPad,eTMSAction_TMSPP_RetrieveFiles_RunPlayGame); + } + + // block all input + m_bIgnorePress=true; + // We want to hide everything in this scene and display a timer until we get a completion for the TMS files + for(int i=0;iuser->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); + + // Can't apply the player's settings here - they haven't come back from the QuerySignInStatud call above yet. + // Need to let them action in the main loop when they come in + // ensure we've applied this player's settings + //app.ApplyGameSettingsChanged(iPad); + LoadTrial(); + } + } +} + +HRESULT CScene_Main::OnTMSBanFileRetrieved() +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + int iPad=ProfileManager.GetLockedProfile(); + + if(StorageManager.SetSaveDevice(&CScene_Main::DeviceSelectReturned,this)==true) + { + // change the minecraft player name + pMinecraft->user->name = convStringToWstring( ProfileManager.GetGamertag(ProfileManager.GetPrimaryPad())); + // save device already selected + + // ensure we've applied this player's settings + app.ApplyGameSettingsChanged(iPad); + // check for DLC + // start timer to track DLC check finished + m_Timer.SetShow(TRUE); + XuiSetTimer(m_hObj,DLC_INSTALLED_TIMER_ID,DLC_INSTALLED_TIMER_TIME); + //app.NavigateToScene(iPad,eUIScene_MultiGameJoinLoad); + } + return S_OK; +} + +void CScene_Main::RunLeaderboards(int iPad) +{ + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + + // guests can't look at leaderboards + if(ProfileManager.IsGuest(iPad)) + { + StorageManager.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + } + else if(!ProfileManager.IsSignedInLive(iPad)) + { + StorageManager.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); + } + else + { + ProfileManager.SetLockedProfile(iPad); + // If the player was signed in before selecting play, we'll not have read the profile yet, so query the sign-in status to get this to happen + ProfileManager.QuerySigninStatus(); + + app.NavigateToScene(iPad, eUIScene_LeaderboardsMenu); + } +} +void CScene_Main::RunAchievements(int iPad) +{ + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + + // guests can't look at achievements + if(ProfileManager.IsGuest(iPad)) + { + StorageManager.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + } + else + { + XShowAchievementsUI( iPad ); + } +} +void CScene_Main::RunHelpAndOptions(int iPad) +{ + if(ProfileManager.IsGuest(iPad)) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + StorageManager.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + } + else + { + // If the player was signed in before selecting play, we'll not have read the profile yet, so query the sign-in status to get this to happen + ProfileManager.QuerySigninStatus(); + + // 4J-PB - You can be offline and still can go into help and options + if(app.GetTMSDLCInfoRead() || !ProfileManager.IsSignedInLive(iPad)) + { + app.NavigateToScene(iPad,eUIScene_HelpAndOptionsMenu); + } + else + { + // Changing to async TMS calls + app.SetTMSAction(iPad,eTMSAction_TMSPP_RetrieveFiles_HelpAndOptions); + + // block all input + m_bIgnorePress=true; + // We want to hide everything in this scene and display a timer until we get a completion for the TMS files + for(int i=0;iRecordUpsellPresented(iPad, eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID); + ProfileManager.DisplayFullVersionPurchase(false,iPad,eSen_UpsellID_Full_Version_Of_Game); + } + } +} + +int CScene_Main::TMSReadFileListReturned(void *pParam,int iPad,C4JStorage::PTMSPP_FILE_LIST pTmsFileList) +{ + CScene_Main* pClass = (CScene_Main*)pParam; + + // push the file details in to a unordered map if they are not already in there +// for(int i=0;iiCount;i++) +// { +// app.PutTMSPP_FileSize(filenametowstring(pTmsFileList->FileDetailsA[i].szFilename),pTmsFileList->FileDetailsA[i].iFileSize); +// } + return 0; +} + +int CScene_Main::TMSFileWriteReturned(void *pParam,int iPad,int iResult) +{ + CScene_Main* pClass = (CScene_Main*)pParam; + + // push the file details in to a unordered map if they are not already in there + // for(int i=0;iiCount;i++) + // { + // app.PutTMSPP_FileSize(filenametowstring(pTmsFileList->FileDetailsA[i].szFilename),pTmsFileList->FileDetailsA[i].iFileSize); + // } + return 0; +} + +int CScene_Main::TMSFileReadReturned(void *pParam,int iPad,C4JStorage::PTMSPP_FILEDATA pData) +{ + CScene_Main* pClass = (CScene_Main*)pParam; + + // push the file details in to a unordered map if they are not already in there + // for(int i=0;iiCount;i++) + // { + // app.PutTMSPP_FileSize(filenametowstring(pTmsFileList->FileDetailsA[i].szFilename),pTmsFileList->FileDetailsA[i].iFileSize); + // } + return 0; +} + +HRESULT CScene_Main::OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ) +{ + // 4J-PB - TODO - Don't think we can do this - if a 2nd player signs in here with an offline profile, the signed in LIVE player gets re-logged in, and bMultiplayerAllowed is false briefly + if( pTimer->nId == DLC_INSTALLED_TIMER_ID) + { + if(!app.DLCInstallPending()) + { + XuiKillTimer(m_hObj,DLC_INSTALLED_TIMER_ID); + m_Timer.SetShow(FALSE); + app.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_LoadOrJoinMenu); + } + } + + else if( pTimer->nId == TMS_TIMER_ID) + { + if(app.GetTMSAction(ProfileManager.GetPrimaryPad())==eTMSAction_Idle) + { + app.SetTMSAction(ProfileManager.GetPrimaryPad(),eTMSAction_TMSPP_RetrieveFiles_RunPlayGame); + XuiKillTimer(m_hObj,TMS_TIMER_ID); + } + } + + return S_OK; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_MainMenu.h b/Minecraft.Client/Common/XUI/XUI_MainMenu.h new file mode 100644 index 00000000..2e4279e4 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_MainMenu.h @@ -0,0 +1,128 @@ +#pragma once + +#include "../media/xuiscene_main.h" +#include "XUI_CustomMessages.h" + +#define BUTTON_PLAYGAME 0 +#define BUTTON_LEADERBOARDS 1 +#define BUTTON_ACHIEVEMENTS 2 +#define BUTTON_HELPANDOPTIONS 3 +#define BUTTON_UNLOCKFULLGAME 4 +#define BUTTON_EXITGAME 5 +#define BUTTONS_MAX BUTTON_EXITGAME + 1 + +#define MAIN_MENU_MAX_TEXT_SCALE 1.5f + +class Random; + +class CScene_Main : public CXuiSceneImpl +{ +private: + static Random *random; + vector m_splashes; + D3DXVECTOR3 m_vPosExitGame; + bool m_bIgnorePress; + float m_fSubtitleHeight, m_fSubtitleWidth; + CXuiControl m_Timer; + + // 4J Added + enum eSplashIndexes + { + eSplashHappyBirthdayEx = 0, + eSplashHappyBirthdayNotch, + eSplashMerryXmas, + eSplashHappyNewYear, + + // The start index in the splashes vector from which we can select a random splash + eSplashRandomStart, + }; + + enum eActions + { + eAction_None=0, + eAction_RunGame, + eAction_RunLeaderboards, + eAction_RunAchievements, + eAction_RunHelpAndOptions, + eAction_RunUnlockOrDLC, + }; + +protected: + // Control and Element wrapper objects. + CXuiScene m_Scene; + CXuiControl m_Buttons[BUTTONS_MAX]; + CXuiControl m_Subtitle, m_SubtitleMCFont; + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_NAV_RETURN(OnNavReturn) + XUI_ON_XM_TRANSITION_START(OnTransitionStart) + XUI_ON_XM_CONTROL_NAVIGATE( OnControlNavigate ) + XUI_ON_XM_KEYDOWN( OnKeyDown ) + XUI_ON_XM_NOTIFY_SET_FOCUS(OnNotifySetFocus) + XUI_ON_XM_TMS_BANFILE_RETRIEVED_MESSAGE(OnTMSBanFileRetrieved) + XUI_ON_XM_TMS_DLCFILE_RETRIEVED_MESSAGE(OnTMSDLCFileRetrieved) + XUI_ON_XM_TIMER( OnTimer ) + + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_XuiButton1, m_Buttons[BUTTON_PLAYGAME]) + MAP_CONTROL(IDC_XuiButton2, m_Buttons[BUTTON_LEADERBOARDS ]) + MAP_CONTROL(IDC_XuiButton3, m_Buttons[BUTTON_ACHIEVEMENTS ]) + MAP_CONTROL(IDC_XuiButton4, m_Buttons[BUTTON_HELPANDOPTIONS]) + MAP_CONTROL(IDC_XuiButton5, m_Buttons[BUTTON_UNLOCKFULLGAME]) + MAP_CONTROL(IDC_XuiButton6, m_Buttons[BUTTON_EXITGAME]) + MAP_CONTROL(IDC_XuiSplash, m_Subtitle) + MAP_CONTROL(IDC_XuiSplashMCFont, m_SubtitleMCFont) + MAP_CONTROL(IDC_Timer, m_Timer) + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled); + HRESULT OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled); + HRESULT OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ); + HRESULT OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled); + HRESULT OnKeyDown(XUIMessageInput *pInputData, BOOL& bHandled); + HRESULT OnNotifySetFocus(HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled); + HRESULT OnTMSBanFileRetrieved(); + HRESULT OnTMSDLCFileRetrieved( ); + HRESULT OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ); + + int SetSaveDevice(); + static void LoadTrial(); + + void RunPlayGame(int iPad); + void RunLeaderboards(int iPad); + void RunAchievements(int iPad); + void RunHelpAndOptions(int iPad); + void RunUnlockOrDLC(int iPad); + + eActions m_eAction; + +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_Main, L"CScene_Main", XUI_CLASS_SCENE ) + + static int SignInReturned(void *pParam,bool bContinue); + static int CreateLoad_SignInReturned(void *pParam,bool bContinue, int iPad); + static int CreateLoad_OfflineProfileReturned(void *pParam,bool bContinue, int iPad); + static int DeviceSelectReturned(void *pParam,bool bContinue); + static int SaveGameReturned(void *pParam,bool bContinue); + static int HelpAndOptions_SignInReturned(void *pParam,bool bContinue,int iPad); + static int ExitGameReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int AchievementsDeviceSelectReturned(void *pParam,bool bContinue); + static int Achievements_SignInReturned(void *pParam,bool bContinue,int iPad); + static int Leaderboards_SignInReturned(void* pParam, bool bContinue, int iPad); + static int UnlockFullGame_SignInReturned(void *pParam,bool bContinue,int iPad); + static int MustSignInReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); +#ifdef _XBOX + static int TMSReadFileListReturned(void *pParam,int iPad,C4JStorage::PTMSPP_FILE_LIST pTmsFileList); + static int TMSFileWriteReturned(void *pParam,int iPad,int iResult); + static int TMSFileReadReturned(void *pParam,int iPad,C4JStorage::PTMSPP_FILEDATA pData); +#endif +}; diff --git a/Minecraft.Client/Common/XUI/XUI_MultiGameCreate.cpp b/Minecraft.Client/Common/XUI/XUI_MultiGameCreate.cpp new file mode 100644 index 00000000..b3608b06 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_MultiGameCreate.cpp @@ -0,0 +1,1397 @@ +#include "stdafx.h" +#include "..\..\..\Minecraft.World\Random.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "XUI_MultiGameCreate.h" +#include "XUI_Controls.h" +#include "..\..\MinecraftServer.h" +#include "..\..\Minecraft.h" +#include "..\..\Options.h" +#include "..\..\..\Minecraft.World\LevelSettings.h" +#include "XUI_MultiGameLaunchMoreOptions.h" +#include "..\..\..\Minecraft.World\BiomeSource.h" +#include "..\..\..\Minecraft.World\IntCache.h" +#include "..\..\..\Minecraft.World\LevelType.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\TexturePack.h" +#include "..\DLC\DLCLocalisationFile.h" +#include "..\..\StringTable.h" +#include "..\..\DLCTexturePack.h" + +#define GAME_CREATE_ONLINE_TIMER_ID 0 +#define GAME_CREATE_ONLINE_TIMER_TIME 100 +#define CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID 1 +#define CHECKFORAVAILABLETEXTUREPACKS_TIMER_TIME 100 + +int CScene_MultiGameCreate::m_iDifficultyTitleSettingA[4]= +{ + IDS_DIFFICULTY_TITLE_PEACEFUL, + IDS_DIFFICULTY_TITLE_EASY, + IDS_DIFFICULTY_TITLE_NORMAL, + IDS_DIFFICULTY_TITLE_HARD +}; + + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_MultiGameCreate::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + m_bSetup = false; + m_texturePackDescDisplayed = false; + m_iConfigA=NULL; + + WCHAR TempString[256]; + MapChildControls(); + + XuiControlSetText(m_EditWorldName,app.GetString(IDS_DEFAULT_WORLD_NAME)); + XuiControlSetText(m_MoreOptions,app.GetString(IDS_MORE_OPTIONS)); + XuiControlSetText(m_NewWorld,app.GetString(IDS_CREATE_NEW_WORLD)); + + XuiControlSetText(m_labelWorldName,app.GetString(IDS_WORLD_NAME)); + XuiControlSetText(m_labelSeed,app.GetString(IDS_CREATE_NEW_WORLD_SEED)); + XuiControlSetText(m_labelRandomSeed,app.GetString(IDS_CREATE_NEW_WORLD_RANDOM_SEED)); + XuiControlSetText(m_pTexturePacksList->m_hObj,app.GetString(IDS_DLC_MENU_TEXTUREPACKS)); + + CreateWorldMenuInitData *params = (CreateWorldMenuInitData *)pInitData->pvInitData; + + m_MoreOptionsParams.bGenerateOptions=TRUE; + m_MoreOptionsParams.bStructures=TRUE; + m_MoreOptionsParams.bFlatWorld=FALSE; + m_MoreOptionsParams.bBonusChest=FALSE; + m_MoreOptionsParams.bPVP = TRUE; + m_MoreOptionsParams.bTrust = TRUE; + m_MoreOptionsParams.bFireSpreads = TRUE; + m_MoreOptionsParams.bHostPrivileges = FALSE; + m_MoreOptionsParams.bTNT = TRUE; + m_MoreOptionsParams.iPad = params->iPad; + m_iPad=params->iPad; + delete params; + + m_bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); + // 4J-PB - read the settings for the online flag. We'll only save this setting if the user changed it. + bool bGameSetting_Online=(app.GetGameSettings(m_iPad,eGameSetting_Online)!=0); + m_MoreOptionsParams.bOnlineSettingChangedBySystem=false; + + // Set the text for friends of friends, and default to on + if( m_bMultiplayerAllowed) + { + m_MoreOptionsParams.bOnlineGame = bGameSetting_Online?TRUE:FALSE; + if(bGameSetting_Online) + { + m_MoreOptionsParams.bInviteOnly = (app.GetGameSettings(m_iPad,eGameSetting_InviteOnly)!=0)?TRUE:FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = (app.GetGameSettings(m_iPad,eGameSetting_FriendsOfFriends)!=0)?TRUE:FALSE; + } + else + { + m_MoreOptionsParams.bInviteOnly = FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = FALSE; + } + } + else + { + m_MoreOptionsParams.bOnlineGame = FALSE; + m_MoreOptionsParams.bInviteOnly = FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = FALSE; + if(bGameSetting_Online) + { + // The profile settings say Online, but either the player is offline, or they are not allowed to play online + m_MoreOptionsParams.bOnlineSettingChangedBySystem=true; + } + } + + m_ButtonGameMode.SetText(app.GetString(IDS_GAMEMODE_SURVIVAL)); + m_bGameModeSurvival=true; + + m_CurrentDifficulty=app.GetGameSettings(m_iPad,eGameSetting_Difficulty); + m_SliderDifficulty.SetValue(m_CurrentDifficulty); + swprintf( (WCHAR *)TempString, 256, L"%ls: %ls", app.GetString( IDS_SLIDER_DIFFICULTY ),app.GetString(m_iDifficultyTitleSettingA[m_CurrentDifficulty])); + m_SliderDifficulty.SetText(TempString); + + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + + CXuiSceneBase::ShowLogo( DEFAULT_XUI_MENU_USER, FALSE ); + + // restrict the keyboard - don't want languages that are not supported, like cyrillic, etc. + switch(XGetLanguage()) + { + case XC_LANGUAGE_ENGLISH: + case XC_LANGUAGE_GERMAN: + case XC_LANGUAGE_FRENCH: + case XC_LANGUAGE_SPANISH: + case XC_LANGUAGE_ITALIAN: + case XC_LANGUAGE_PORTUGUESE: + case XC_LANGUAGE_JAPANESE: + case XC_LANGUAGE_TCHINESE: + case XC_LANGUAGE_KOREAN: + m_EditWorldName.SetKeyboardType(C_4JInput::EKeyboardMode_Default); + m_EditWorldName.SetKeyboardType(C_4JInput::EKeyboardMode_Default); + break; + default: + m_EditWorldName.SetKeyboardType(C_4JInput::EKeyboardMode_Full); + m_EditWorldName.SetKeyboardType(C_4JInput::EKeyboardMode_Full); + break; + } + + m_NewWorld.SetEnable(true); + + m_EditWorldName.SetTextLimit(XCONTENT_MAX_DISPLAYNAME_LENGTH); + + wstring wWorldName = m_EditWorldName.GetText(); + + // set the caret to the end of the default text + m_EditWorldName.SetCaretPosition((int)wWorldName.length()); + // In the dashboard, there's room for about 30 W characters on two lines before they go over the top of things + m_EditWorldName.SetTextLimit(25); + + m_EditWorldName.SetTitleAndText(IDS_NAME_WORLD,IDS_NAME_WORLD_TEXT); + m_EditSeed.SetTitleAndText(IDS_CREATE_NEW_WORLD,IDS_CREATE_NEW_WORLD_SEEDTEXT); + + XuiSetTimer(m_hObj,GAME_CREATE_ONLINE_TIMER_ID,GAME_CREATE_ONLINE_TIMER_TIME); + XuiSetTimer(m_hObj,CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID,CHECKFORAVAILABLETEXTUREPACKS_TIMER_TIME); + + TelemetryManager->RecordMenuShown(m_iPad, eUIScene_CreateWorldMenu, 0); + + // 4J-PB - Load up any texture pack data we have locally in the XZP + for(int i=0;iSetSelectionChangedHandle(m_hObj); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + int texturePacksCount = pMinecraft->skins->getTexturePackCount(); + CXuiCtrl4JList::LIST_ITEM_INFO ListInfo; + HRESULT hr; + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + ZeroMemory(&ListInfo,sizeof(CXuiCtrl4JList::LIST_ITEM_INFO)); + + DWORD dwImageBytes; + PBYTE pbImageData = tp->getPackIcon(dwImageBytes); + + if(dwImageBytes > 0 && pbImageData) + { + ListInfo.fEnabled = TRUE; + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tp; + if(pDLCTexPack) + { + int id=pDLCTexPack->getDLCParentPackId(); + + if(id==0) + { + // default texture pack - should come first + ListInfo.iSortIndex=0x0FFFFFFF; + } + else + { + ListInfo.iSortIndex=id; + ListInfo.iData=id; + } + } + +#ifdef _DEBUG + app.DebugPrintf("TP - "); + OutputDebugStringW(tp->getName().c_str()); + app.DebugPrintf(", sort index - %d\n",ListInfo.iSortIndex); +#endif + + hr=XuiCreateTextureBrushFromMemory(pbImageData,dwImageBytes,&ListInfo.hXuiBrush); + + m_pTexturePacksList->AddData(ListInfo,0,CXuiCtrl4JList::eSortList_Index); + } + } + + + // 4J-PB - there may be texture packs we don't have, so use the info from TMS for this + + DLC_INFO *pDLCInfo=NULL; + + // first pass - look to see if there are any that are not in the list + bool bTexturePackAlreadyListed; + bool bNeedToGetTPD=false; + + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + bTexturePackAlreadyListed=false; + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + if(pDLCInfo->iConfig==tp->getDLCParentPackId()) + { + bTexturePackAlreadyListed=true; + } + } + if(bTexturePackAlreadyListed==false) + { + // some missing + bNeedToGetTPD=true; + + m_iTexturePacksNotInstalled++; + } + } + + if(bNeedToGetTPD==true) + { + // add a TMS request for them + app.DebugPrintf("+++ Adding TMSPP request for texture pack data\n"); + app.AddTMSPPFileTypeRequest(e_DLC_TexturePackData); + m_iConfigA= new int [m_iTexturePacksNotInstalled]; + m_iTexturePacksNotInstalled=0; + + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + bTexturePackAlreadyListed=false; + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + if(pDLCInfo->iConfig==tp->getDLCParentPackId()) + { + bTexturePackAlreadyListed=true; + } + } + if(bTexturePackAlreadyListed==false) + { + m_iConfigA[m_iTexturePacksNotInstalled++]=pDLCInfo->iConfig; + } + } + } + + m_currentTexturePackIndex = pMinecraft->skins->getTexturePackIndex(0); + UpdateTexturePackDescription(m_currentTexturePackIndex); + + m_bSetup = true; + } + return S_OK; +} + + +HRESULT CScene_MultiGameCreate::OnDestroy() +{ + // clear out the texture pack data + for(int i=0;iUserIndex, VK_PAD_A); + + if(hObjPressed==m_NewWorld) + { + // Check if we need to upsell the texture pack + if(m_MoreOptionsParams.dwTexturePack!=0) + { + // texture pack hasn't been set yet, so check what it will be + TexturePack *pTexturePack = pMinecraft->skins->getTexturePackById(m_MoreOptionsParams.dwTexturePack); + + if(pTexturePack==NULL) + { + // They've selected a texture pack they don't have yet + // upsell + CXuiCtrl4JList::LIST_ITEM_INFO ListItem; + // get the current index of the list, and then get the data + ListItem=m_pTexturePacksList->GetData(m_currentTexturePackIndex); + + + // upsell the texture pack + // tell sentient about the upsell of the full version of the skin pack + ULONGLONG ullOfferID_Full; + app.GetDLCFullOfferIDForPackID(ListItem.iData,&ullOfferID_Full); + + // DLC might have been corrupt + if(ullOfferID_Full!=0LL) + { + TelemetryManager->RecordUpsellPresented(ProfileManager.GetPrimaryPad(), eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); + + UINT uiIDA[3]; + + // Need to check if the texture pack has both Full and Trial versions - we may do some as free ones, so only Full + DLC_INFO *pDLCInfo=app.GetDLCInfoForFullOfferID(ullOfferID_Full); + + if(pDLCInfo->ullOfferID_Trial!=0LL) + { + uiIDA[0]=IDS_TEXTUREPACK_FULLVERSION; + uiIDA[1]=IDS_TEXTURE_PACK_TRIALVERSION; + uiIDA[2]=IDS_CONFIRM_CANCEL; + // Give the player a warning about the texture pack missing + StorageManager.RequestMessageBox(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 3, ProfileManager.GetPrimaryPad(),&CScene_MultiGameCreate::TexturePackDialogReturned,this,app.GetStringTable()); + } + else + { + uiIDA[0]=IDS_TEXTUREPACK_FULLVERSION; + uiIDA[1]=IDS_CONFIRM_CANCEL; + // Give the player a warning about the texture pack missing + StorageManager.RequestMessageBox(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CScene_MultiGameCreate::TexturePackDialogReturned,this,app.GetStringTable()); + } + + return S_OK; + } + } + } + + m_bIgnoreInput = true; + SetShow( FALSE ); + bool isClientSide = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && m_MoreOptionsParams.bOnlineGame; + + // if the profile data has been changed, then force a profile write (we save the online/invite/friends of friends settings) + // It seems we're allowed to break the 5 minute rule if it's the result of a user action + // check the checkboxes + + // Only save the online setting if the user changed it - we may change it because we're offline, but don't want that saved + if(!m_MoreOptionsParams.bOnlineSettingChangedBySystem) + { + app.SetGameSettings(m_iPad,eGameSetting_Online,m_MoreOptionsParams.bOnlineGame?1:0); + } + app.SetGameSettings(m_iPad,eGameSetting_InviteOnly,m_MoreOptionsParams.bInviteOnly?1:0); + app.SetGameSettings(m_iPad,eGameSetting_FriendsOfFriends,m_MoreOptionsParams.bAllowFriendsOfFriends?1:0); + + app.CheckGameSettingsChanged(true,pNotifyPressData->UserIndex); + + // Check that we have the rights to use a texture pack we have selected. + if(m_MoreOptionsParams.dwTexturePack!=0) + { + // texture pack hasn't been set yet, so check what it will be + TexturePack *pTexturePack = pMinecraft->skins->getTexturePackById(m_MoreOptionsParams.dwTexturePack); + + if(pTexturePack==NULL) + { + // corrupt DLC so set it to the default textures + m_MoreOptionsParams.dwTexturePack=0; + } + else + { + m_pDLCPack=pTexturePack->getDLCPack(); + // do we have a license? + if(m_pDLCPack && !m_pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) + { + // no + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + + if(!ProfileManager.IsSignedInLive(pNotifyPressData->UserIndex)) + { + // need to be signed in to live + StorageManager.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); + return S_OK; + } + else + { + // upsell + + DLC_INFO *pDLCInfo = app.GetDLCInfoForTrialOfferID(m_pDLCPack->getPurchaseOfferId()); + ULONGLONG ullOfferID_Full; + + if(pDLCInfo!=NULL) + { + ullOfferID_Full=pDLCInfo->ullOfferID_Full; + } + else + { + ullOfferID_Full=pTexturePack->getDLCPack()->getPurchaseOfferId(); + } + + // tell sentient about the upsell of the full version of the skin pack + TelemetryManager->RecordUpsellPresented(pNotifyPressData->UserIndex, eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); + + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + + // Give the player a warning about the trial version of the texture pack + StorageManager.RequestMessageBox(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 1, pNotifyPressData->UserIndex,&CScene_MultiGameCreate::WarningTrialTexturePackReturned,this,app.GetStringTable()); + return S_OK; + } + } + } + } + + if(m_bGameModeSurvival != true || m_MoreOptionsParams.bHostPrivileges == TRUE) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + if(m_bGameModeSurvival != true) + { + StorageManager.RequestMessageBox(IDS_TITLE_START_GAME, IDS_CONFIRM_START_CREATIVE, uiIDA, 2, m_iPad,&CScene_MultiGameCreate::ConfirmCreateReturned,this,app.GetStringTable()); + } + else + { + StorageManager.RequestMessageBox(IDS_TITLE_START_GAME, IDS_CONFIRM_START_HOST_PRIVILEGES, uiIDA, 2, m_iPad,&CScene_MultiGameCreate::ConfirmCreateReturned,this,app.GetStringTable()); + } + } + else + { + // 4J Stu - If we only have one controller connected, then don't show the sign-in UI again + DWORD connectedControllers = 0; + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if( InputManager.IsPadConnected(i) || ProfileManager.IsSignedIn(i) ) ++connectedControllers; + } + + if(isClientSide && connectedControllers > 1 && RenderManager.IsHiDef()) + { + ProfileManager.RequestSignInUI(false, false, false, true, false,&CScene_MultiGameCreate::StartGame_SignInReturned, this,ProfileManager.GetPrimaryPad()); + } + else + { + // Check if user-created content is allowed, as we cannot play multiplayer if it's not + //bool isClientSide = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && m_MoreOptionsParams.bOnlineGame; + bool noUGC = false; + BOOL pccAllowed = TRUE; + BOOL pccFriendsAllowed = TRUE; + ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); + if(!pccAllowed && !pccFriendsAllowed) noUGC = true; + + if(isClientSide && noUGC ) + { + m_bIgnoreInput = false; + SetShow( TRUE ); + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + StorageManager.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + } + else + { + CreateGame(this, 0); + } + } + } + } + else if(hObjPressed==m_MoreOptions) + { + app.NavigateToScene(pNotifyPressData->UserIndex,eUIScene_LaunchMoreOptionsMenu,&m_MoreOptionsParams); + } + else if(hObjPressed == m_ButtonGameMode) + { + if(m_bGameModeSurvival) + { + m_ButtonGameMode.SetText(app.GetString(IDS_GAMEMODE_CREATIVE)); + m_bGameModeSurvival=false; + } + else + { + m_ButtonGameMode.SetText(app.GetString(IDS_GAMEMODE_SURVIVAL)); + m_bGameModeSurvival=true; + } + } + else if(hObjPressed == m_pTexturePacksList->m_hObj) + { + UpdateCurrentTexturePack(); + } + + return S_OK; +} + + +int CScene_MultiGameCreate::UnlockTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + CScene_MultiGameCreate* pScene = (CScene_MultiGameCreate*)pParam; +#ifdef _XBOX + if(result==C4JStorage::EMessage_ResultAccept) + { + if(ProfileManager.IsSignedIn(iPad)) + { + ULONGLONG ullIndexA[1]; + DLC_INFO *pDLCInfo = app.GetDLCInfoForTrialOfferID(pScene->m_pDLCPack->getPurchaseOfferId()); + + if(pDLCInfo!=NULL) + { + ullIndexA[0]=pDLCInfo->ullOfferID_Full; + } + else + { + ullIndexA[0]=pScene->m_pDLCPack->getPurchaseOfferId(); + } + + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + + // the license change coming in when the offer has been installed will cause this scene to refresh + } + } + else + { + TelemetryManager->RecordUpsellResponded(iPad, eSet_UpsellID_Texture_DLC, ( pScene->m_pDLCPack->getPurchaseOfferId() & 0xFFFFFFFF ), eSen_UpsellOutcome_Declined); + } +#endif + pScene->m_bIgnoreInput = false; + pScene->SetShow( TRUE ); + + return 0; +} + +int CScene_MultiGameCreate::WarningTrialTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + CScene_MultiGameCreate* pScene = (CScene_MultiGameCreate*)pParam; + pScene->m_bIgnoreInput = false; + pScene->SetShow( TRUE ); + bool isClientSide = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && pScene->m_MoreOptionsParams.bOnlineGame; + + + // 4J Stu - If we only have one controller connected, then don't show the sign-in UI again + DWORD connectedControllers = 0; + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if( InputManager.IsPadConnected(i) || ProfileManager.IsSignedIn(i) ) ++connectedControllers; + } + + if(isClientSide && connectedControllers > 1 && RenderManager.IsHiDef()) + { + ProfileManager.RequestSignInUI(false, false, false, true, false,&CScene_MultiGameCreate::StartGame_SignInReturned, pScene,ProfileManager.GetPrimaryPad()); + } + else + { + // Check if user-created content is allowed, as we cannot play multiplayer if it's not + bool noUGC = false; + BOOL pccAllowed = TRUE; + BOOL pccFriendsAllowed = TRUE; + ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); + if(!pccAllowed && !pccFriendsAllowed) noUGC = true; + + if(isClientSide && noUGC ) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + StorageManager.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + } + else + { + // This is called from a storage manager thread... need to set up thread storage for IntCache as CreateGame requires this to search for a suitable seed if we haven't set a seed. + IntCache::CreateNewThreadStorage(); + CreateGame(pScene, 0); + IntCache::ReleaseThreadStorage(); + } + } + + return 0; +} + +HRESULT CScene_MultiGameCreate::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + // Explicitly handle B button presses + switch(pInputData->dwKeyCode) + { + case VK_PAD_B: + case VK_ESCAPE: + app.NavigateBack(pInputData->UserIndex); + rfHandled = TRUE; + break; + } + return S_OK; +} + +HRESULT CScene_MultiGameCreate::OnNotifyValueChanged (HXUIOBJ hObjSource, XUINotifyValueChanged* pValueChangedData, BOOL& rfHandled) +{ + WCHAR TempString[256]; + + if(hObjSource == m_EditWorldName) + { + // Enable the done button when we have all of the necessary information + wstring wWorldName = m_EditWorldName.GetText(); + BOOL bHasWorldName = ( wWorldName.length()!=0); + m_NewWorld.SetEnable(bHasWorldName); + } + else if(hObjSource==m_SliderDifficulty.GetSlider() ) + { + app.SetGameSettings(m_iPad,eGameSetting_Difficulty,pValueChangedData->nValue); + swprintf( (WCHAR *)TempString, 256, L"%ls: %ls", app.GetString( IDS_SLIDER_DIFFICULTY ),app.GetString(m_iDifficultyTitleSettingA[pValueChangedData->nValue])); + m_SliderDifficulty.SetText(TempString); + } + + return S_OK; +} + +HRESULT CScene_MultiGameCreate::OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) +{ + pControlNavigateData->hObjDest=XuiControlGetNavigation(pControlNavigateData->hObjSource,pControlNavigateData->nControlNavigate,TRUE,TRUE); + + if(pControlNavigateData->hObjDest==NULL) + { + pControlNavigateData->hObjDest=pControlNavigateData->hObjSource; + } + + bHandled=TRUE; + return S_OK; +} + +HRESULT CScene_MultiGameCreate::OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ) +{ + // 4J-PB - TODO - Don't think we can do this - if a 2nd player signs in here with an offline profile, the signed in LIVE player gets re-logged in, and bMultiplayerAllowed is false briefly + switch(pTimer->nId) + { + + + case GAME_CREATE_ONLINE_TIMER_ID: + { + bool bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); + + if(bMultiplayerAllowed != m_bMultiplayerAllowed) + { + if( bMultiplayerAllowed ) + { + bool bGameSetting_Online=(app.GetGameSettings(m_iPad,eGameSetting_Online)!=0); + m_MoreOptionsParams.bOnlineGame = bGameSetting_Online?TRUE:FALSE; + if(bGameSetting_Online) + { + m_MoreOptionsParams.bInviteOnly = (app.GetGameSettings(m_iPad,eGameSetting_InviteOnly)!=0)?TRUE:FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = (app.GetGameSettings(m_iPad,eGameSetting_FriendsOfFriends)!=0)?TRUE:FALSE; + } + else + { + m_MoreOptionsParams.bInviteOnly = FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = FALSE; + } + } + else + { + m_MoreOptionsParams.bOnlineGame = FALSE; + m_MoreOptionsParams.bInviteOnly = FALSE; + m_MoreOptionsParams.bAllowFriendsOfFriends = FALSE; + } + + m_bMultiplayerAllowed = bMultiplayerAllowed; + } + } + break; + + case CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID: + { + // also check for any new texture packs info being available + // for each item in the mem list, check it's in the data list + + CXuiCtrl4JList::LIST_ITEM_INFO ListInfo; + // for each iConfig, check if the data is available, and add it to the List, then remove it from the viConfig + for(int i=0;i 0 && pbData) + { + DWORD dwImageBytes=0; + PBYTE pbImageData=NULL; + + app.GetFileFromTPD(eTPDFileType_Icon,pbData,dwBytes,&pbImageData,&dwImageBytes ); + ListInfo.fEnabled = TRUE; + ListInfo.iData = m_iConfigA[i]; + HRESULT hr=XuiCreateTextureBrushFromMemory(pbImageData,dwImageBytes,&ListInfo.hXuiBrush); + app.DebugPrintf("Adding texturepack %d from TPD\n",m_iConfigA[i]); + + ListInfo.iSortIndex=m_iConfigA[i]; + m_pTexturePacksList->AddData(ListInfo,0,CXuiCtrl4JList::eSortList_Index); + + m_iConfigA[i]=-1; + } + } + } + + bool bAllDone=true; + for(int i=0;im_MoreOptionsParams.bOnlineGame; + + // 4J Stu - If we only have one controller connected, then don't show the sign-in UI again + DWORD connectedControllers = 0; + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if( InputManager.IsPadConnected(i) || ProfileManager.IsSignedIn(i) ) ++connectedControllers; + } + + if(isClientSide && connectedControllers > 1 && RenderManager.IsHiDef()) + { + ProfileManager.RequestSignInUI(false, false, false, true, false,&CScene_MultiGameCreate::StartGame_SignInReturned, pClass,ProfileManager.GetPrimaryPad()); + } + else + { + // Check if user-created content is allowed, as we cannot play multiplayer if it's not + bool isClientSide = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && pClass->m_MoreOptionsParams.bOnlineGame; + bool noUGC = false; + BOOL pccAllowed = TRUE; + BOOL pccFriendsAllowed = TRUE; + ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); + if(!pccAllowed && !pccFriendsAllowed) noUGC = true; + + if(isClientSide && noUGC ) + { + pClass->m_bIgnoreInput = false; + pClass->SetShow( TRUE ); + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + StorageManager.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + } + else + { + // This is called from a storage manager thread... need to set up thread storage for IntCache as CreateGame requires this to search for a suitable seed if we haven't set a seed. + IntCache::CreateNewThreadStorage(); + CreateGame(pClass, 0); + IntCache::ReleaseThreadStorage(); + } + } + } + else + { + pClass->m_bIgnoreInput = false; + pClass->SetShow( TRUE ); + } + return 0; +} + +int CScene_MultiGameCreate::StartGame_SignInReturned(void *pParam,bool bContinue, int iPad) +{ + CScene_MultiGameCreate* pClass = (CScene_MultiGameCreate*)pParam; + + if(bContinue==true) + { + // It's possible that the player has not signed in - they can back out + if(ProfileManager.IsSignedIn(iPad)) + { + DWORD dwLocalUsersMask = 0; + + bool isClientSide = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && pClass->m_MoreOptionsParams.bOnlineGame; + bool noPrivileges = false; + + for(unsigned int index = 0; index < XUSER_MAX_COUNT; ++index) + { + if(ProfileManager.IsSignedIn(index) ) + { + if( !ProfileManager.AllowedToPlayMultiplayer(index) ) noPrivileges = true; + dwLocalUsersMask |= CGameNetworkManager::GetLocalPlayerMask(index); + } + } + + // Check if user-created content is allowed, as we cannot play multiplayer if it's not + bool noUGC = false; + BOOL pccAllowed = TRUE; + BOOL pccFriendsAllowed = TRUE; + ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); + if(!pccAllowed && !pccFriendsAllowed) noUGC = true; + + if(isClientSide && (noPrivileges || noUGC) ) + { + if( noUGC ) + { + pClass->m_bIgnoreInput = false; + pClass->SetShow( TRUE ); + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + StorageManager.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + } + else + { + pClass->m_bIgnoreInput = false; + pClass->SetShow( TRUE ); + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + StorageManager.RequestMessageBox( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_HOST_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + } + } + else + { + // This is NOT called from a storage manager thread, and is in fact called from the main thread in the Profile library tick. Therefore we use the main threads IntCache. + CreateGame(pClass, dwLocalUsersMask); + } + } + } + else + { + pClass->m_bIgnoreInput = false; + pClass->SetShow( TRUE ); + } + return 0; +} + +// 4J Stu - Shared functionality that is the same whether we needed a quadrant sign-in or not +void CScene_MultiGameCreate::CreateGame(CScene_MultiGameCreate* pClass, DWORD dwLocalUsersMask) +{ + // stop the timer running that causes a check for new texture packs in TMS but not installed, since this will run all through the create game, and will crash if it tries to create an hbrush + XuiKillTimer(pClass->m_hObj,CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID); + + bool isClientSide = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && pClass->m_MoreOptionsParams.bOnlineGame; + bool isPrivate = pClass->m_MoreOptionsParams.bInviteOnly?true:false; + + // clear out the app's terrain features list + app.ClearTerrainFeaturePosition(); + + // create the world and launch + wstring wWorldName = pClass->m_EditWorldName.GetText(); + + StorageManager.ResetSaveData(); + // Make our next save default to the name of the level + StorageManager.SetSaveTitle((wchar_t *)wWorldName.c_str()); + + BOOL bHasSeed = (pClass->m_EditSeed.GetText() != NULL); + + wstring wSeed; + if(bHasSeed) + { + wSeed=pClass->m_EditSeed.GetText(); + } + else + { + // random + wSeed=L""; + } + + // start the game + bool isFlat = (pClass->m_MoreOptionsParams.bFlatWorld==TRUE); + __int64 seedValue = 0; //BiomeSource::findSeed(isFlat?LevelType::lvl_flat:LevelType::lvl_normal); // 4J - was (new Random())->nextLong() - now trying to actually find a seed to suit our requirements + + if (wSeed.length() != 0) + { + __int64 value = 0; + unsigned int len = (unsigned int)wSeed.length(); + + //Check if the input string contains a numerical value + bool isNumber = true; + for( unsigned int i = 0 ; i < len ; ++i ) + if( wSeed.at(i) < L'0' || wSeed.at(i) > L'9' ) + if( !(i==0 && wSeed.at(i) == L'-' ) ) + { + isNumber = false; + break; + } + + //If the input string is a numerical value, convert it to a number + if( isNumber ) + value = _fromString<__int64>(wSeed); + + //If the value is not 0 use it, otherwise use the algorithm from the java String.hashCode() function to hash it + if( value != 0 ) + seedValue = value; + else + { + int hashValue = 0; + for( unsigned int i = 0 ; i < len ; ++i ) + hashValue = 31 * hashValue + wSeed.at(i); + seedValue = hashValue; + } + + } + else + { + seedValue = BiomeSource::findSeed(isFlat?LevelType::lvl_flat:LevelType::lvl_normal); // 4J - was (new Random())->nextLong() - now trying to actually find a seed to suit our requirements + } + + g_NetworkManager.HostGame(dwLocalUsersMask,isClientSide,isPrivate,MINECRAFT_NET_MAX_PLAYERS,0); + + NetworkGameInitData *param = new NetworkGameInitData(); + param->seed = seedValue; + param->saveData = NULL; + param->texturePackId = pClass->m_MoreOptionsParams.dwTexturePack; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->skins->selectTexturePackById(pClass->m_MoreOptionsParams.dwTexturePack); + //pMinecraft->skins->updateUI(); + + app.SetGameHostOption(eGameHostOption_Difficulty,Minecraft::GetInstance()->options->difficulty); + app.SetGameHostOption(eGameHostOption_FriendsOfFriends,pClass->m_MoreOptionsParams.bAllowFriendsOfFriends); + app.SetGameHostOption(eGameHostOption_Gamertags,app.GetGameSettings(pClass->m_iPad,eGameSetting_GamertagsVisible)?1:0); + + app.SetGameHostOption(eGameHostOption_BedrockFog,app.GetGameSettings(pClass->m_iPad,eGameSetting_BedrockFog)?1:0); + +// CXuiList listObject; +// listObject.Attach( pClass->m_GameMode.GetListObject() ); + app.SetGameHostOption(eGameHostOption_GameType,pClass->m_bGameModeSurvival?GameType::SURVIVAL->getId():GameType::CREATIVE->getId()); + app.SetGameHostOption(eGameHostOption_LevelType,pClass->m_MoreOptionsParams.bFlatWorld ); + app.SetGameHostOption(eGameHostOption_Structures,pClass->m_MoreOptionsParams.bStructures ); + app.SetGameHostOption(eGameHostOption_BonusChest,pClass->m_MoreOptionsParams.bBonusChest ); + + app.SetGameHostOption(eGameHostOption_PvP,pClass->m_MoreOptionsParams.bPVP); + app.SetGameHostOption(eGameHostOption_TrustPlayers,pClass->m_MoreOptionsParams.bTrust ); + app.SetGameHostOption(eGameHostOption_FireSpreads,pClass->m_MoreOptionsParams.bFireSpreads ); + app.SetGameHostOption(eGameHostOption_TNT,pClass->m_MoreOptionsParams.bTNT ); + app.SetGameHostOption(eGameHostOption_HostCanFly,pClass->m_MoreOptionsParams.bHostPrivileges); + app.SetGameHostOption(eGameHostOption_HostCanChangeHunger,pClass->m_MoreOptionsParams.bHostPrivileges); + app.SetGameHostOption(eGameHostOption_HostCanBeInvisible,pClass->m_MoreOptionsParams.bHostPrivileges ); + + + param->settings = app.GetGameHostOption( eGameHostOption_All ); + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc; + loadingParams->lpParam = (LPVOID)param; + + // Reset the autosave time + app.SetAutosaveTimerTime(); + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + + app.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); +} + +HRESULT CScene_MultiGameCreate::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ) +{ + if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) return S_OK; + + if(pTransition->dwTransType == XUI_TRANSITION_TO || pTransition->dwTransType == XUI_TRANSITION_BACKTO) + { + m_SliderDifficulty.SetValueDisplay(FALSE); + } + + return S_OK; +} + +HRESULT CScene_MultiGameCreate::OnTransitionEnd( XUIMessageTransition *pTransition, BOOL& bHandled ) +{ + //if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) return S_OK; + + if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY || + pTransition->dwTransType == XUI_TRANSITION_FROM || pTransition->dwTransType == XUI_TRANSITION_BACKFROM) + { + } + else if(pTransition->dwTransType == XUI_TRANSITION_TO || pTransition->dwTransType == XUI_TRANSITION_BACKTO) + { + if(m_bSetup && m_texturePackDescDisplayed) + { + XUITimeline *timeline; + XUINamedFrame *startFrame, *endFrame; + GetTimeline( &timeline ); + startFrame = timeline->FindNamedFrame( L"SlideOutEnd" ); + endFrame = timeline->FindNamedFrame( L"SlideOutEnd" ); + timeline->Play( startFrame->m_dwFrame, startFrame->m_dwFrame, endFrame->m_dwFrame, FALSE, FALSE ); + m_texturePackDescDisplayed = true; + } + // 4J-PB - Need to check for installed DLC, which might have happened while you were on the info scene + if(pTransition->dwTransType == XUI_TRANSITION_BACKTO) + { + // Can't call this here because if you back out of the load info screen and then go back in and load a game, it will attempt to use the dlc as it's running a mount of the dlc + + // block input if we're waiting for DLC to install, and wipe the saves list. The end of dlc mounting custom message will fill the list again + if(app.StartInstallDLCProcess(m_iPad)==false) + { + // not doing a mount, so re-enable input + m_bIgnoreInput=false; + } + else + { + m_bIgnoreInput=true; + m_pTexturePacksList->RemoveAllData(); + } + } + + } + + return S_OK; +} + +HRESULT CScene_MultiGameCreate::OnNotifySelChanged( HXUIOBJ hObjSource, XUINotifySelChanged* pNotifySelChangedData, BOOL& bHandled ) +{ + if(hObjSource == m_pTexturePacksList->m_hObj) + { + UpdateTexturePackDescription(pNotifySelChangedData->iItem); + + // 4J-JEV: Removed expand description check, taken care of elsewhere. + } + + return S_OK; +} + +HRESULT CScene_MultiGameCreate::OnNotifyKillFocus(HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled) +{ + HXUIOBJ hSourceParent, hDestParent; + XuiElementGetParent(hObjSource,&hSourceParent); + XuiElementGetParent(pNotifyFocusData->hObjOther,&hDestParent); + if(hSourceParent != hDestParent && pNotifyFocusData->hObjOther != m_pTexturePacksList->m_hObj && hSourceParent == m_pTexturePacksList->m_hObj) + { + m_pTexturePacksList->SetCurSel(m_currentTexturePackIndex); + m_pTexturePacksList->SetTopItem(m_currentTexturePackIndex); // scroll the item into view if it's not visible + } + else if(!m_texturePackDescDisplayed && pNotifyFocusData->hObjOther == m_pTexturePacksList->m_hObj) + { + // 4J-JEV: Shouldn't we always do this? + //int texturePacksCount = Minecraft::GetInstance()->skins->getTexturePackCount(); + //if(texturePacksCount == 1) + //{ + XUITimeline *timeline; + XUINamedFrame *startFrame, *endFrame; + GetTimeline( &timeline ); + startFrame = timeline->FindNamedFrame( L"SlideOut" ); + endFrame = timeline->FindNamedFrame( L"SlideOutEnd" ); + timeline->Play( startFrame->m_dwFrame, startFrame->m_dwFrame, endFrame->m_dwFrame, FALSE, FALSE ); + m_texturePackDescDisplayed = true; + //} + } + + return S_OK; +} + +void CScene_MultiGameCreate::UpdateTexturePackDescription(int index) +{ + int iTexPackId=m_pTexturePacksList->GetData(index).iData; + TexturePack *tp = Minecraft::GetInstance()->skins->getTexturePackById(iTexPackId); + + if(tp==NULL) + { + // this is probably a texture pack icon added from TMS + + DWORD dwBytes=0,dwFileBytes=0; + PBYTE pbData=NULL,pbFileData=NULL; + + CXuiCtrl4JList::LIST_ITEM_INFO ListItem; + // get the current index of the list, and then get the data + ListItem=m_pTexturePacksList->GetData(index); + + app.GetTPD(ListItem.iData,&pbData,&dwBytes); + + app.GetFileFromTPD(eTPDFileType_Loc,pbData,dwBytes,&pbFileData,&dwFileBytes ); + if(dwFileBytes > 0 && pbFileData) + { + StringTable *pStringTable = new StringTable(pbFileData, dwFileBytes); + m_texturePackTitle.SetText(pStringTable->getString(L"IDS_DISPLAY_NAME")); + m_texturePackDescription.SetText(pStringTable->getString(L"IDS_TP_DESCRIPTION")); + } + + app.GetFileFromTPD(eTPDFileType_Icon,pbData,dwBytes,&pbFileData,&dwFileBytes ); + if(dwFileBytes >= 0 && pbFileData) + { + XuiCreateTextureBrushFromMemory(pbFileData,dwFileBytes,&m_hTexturePackIconBrush); + m_texturePackIcon->UseBrush(m_hTexturePackIconBrush); + } + app.GetFileFromTPD(eTPDFileType_Comparison,pbData,dwBytes,&pbFileData,&dwFileBytes ); + if(dwFileBytes >= 0 && pbFileData) + { + XuiCreateTextureBrushFromMemory(pbFileData,dwFileBytes,&m_hTexturePackComparisonBrush); + m_texturePackComparison->UseBrush(m_hTexturePackComparisonBrush); + } + else + { + m_texturePackComparison->UseBrush(NULL); + } + } + else + { + m_texturePackTitle.SetText(tp->getName().c_str()); + m_texturePackDescription.SetText(tp->getDesc1().c_str()); + + DWORD dwImageBytes; + PBYTE pbImageData = tp->getPackIcon(dwImageBytes); + + if(dwImageBytes > 0 && pbImageData) + { + XuiCreateTextureBrushFromMemory(pbImageData,dwImageBytes,&m_hTexturePackIconBrush); + m_texturePackIcon->UseBrush(m_hTexturePackIconBrush); + } + + pbImageData = tp->getPackComparison(dwImageBytes); + + if(dwImageBytes > 0 && pbImageData) + { + XuiCreateTextureBrushFromMemory(pbImageData,dwImageBytes,&m_hTexturePackComparisonBrush); + m_texturePackComparison->UseBrush(m_hTexturePackComparisonBrush); + } + else + { + m_texturePackComparison->UseBrush(NULL); + } + } +} + +void CScene_MultiGameCreate::UpdateCurrentTexturePack() +{ + m_currentTexturePackIndex = m_pTexturePacksList->GetCurSel(); + int iTexPackId=m_pTexturePacksList->GetData(m_currentTexturePackIndex).iData; + TexturePack *tp = Minecraft::GetInstance()->skins->getTexturePackById(iTexPackId); + + // if the texture pack is null, you don't have it yet + if(tp==NULL) + { + // Upsell + + CXuiCtrl4JList::LIST_ITEM_INFO ListItem; + // get the current index of the list, and then get the data + ListItem=m_pTexturePacksList->GetData(m_currentTexturePackIndex); + + + // upsell the texture pack + // tell sentient about the upsell of the full version of the skin pack + ULONGLONG ullOfferID_Full; + app.GetDLCFullOfferIDForPackID(ListItem.iData,&ullOfferID_Full); + + TelemetryManager->RecordUpsellPresented(ProfileManager.GetPrimaryPad(), eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); + + UINT uiIDA[3]; + + // Need to check if the texture pack has both Full and Trial versions - we may do some as free ones, so only Full + DLC_INFO *pDLCInfo=app.GetDLCInfoForFullOfferID(ullOfferID_Full); + + if(pDLCInfo->ullOfferID_Trial!=0LL) + { + uiIDA[0]=IDS_TEXTUREPACK_FULLVERSION; + uiIDA[1]=IDS_TEXTURE_PACK_TRIALVERSION; + uiIDA[2]=IDS_CONFIRM_CANCEL; + // Give the player a warning about the texture pack missing + StorageManager.RequestMessageBox(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 3, ProfileManager.GetPrimaryPad(),&CScene_MultiGameCreate::TexturePackDialogReturned,this,app.GetStringTable()); + } + else + { + uiIDA[0]=IDS_TEXTUREPACK_FULLVERSION; + uiIDA[1]=IDS_CONFIRM_CANCEL; + // Give the player a warning about the texture pack missing + StorageManager.RequestMessageBox(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CScene_MultiGameCreate::TexturePackDialogReturned,this,app.GetStringTable()); + } + + // do set the texture pack id, and on the user pressing create world, check they have it + m_MoreOptionsParams.dwTexturePack = ListItem.iData; + return ; + } + else + { + m_MoreOptionsParams.dwTexturePack = tp->getId(); + } +} + +int CScene_MultiGameCreate::TexturePackDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + CScene_MultiGameCreate *pClass = (CScene_MultiGameCreate *)pParam; + pClass->m_currentTexturePackIndex = pClass->m_pTexturePacksList->GetCurSel(); + // Exit with or without saving + // Decline means install full version of the texture pack in this dialog + if(result==C4JStorage::EMessage_ResultDecline || result==C4JStorage::EMessage_ResultAccept) + { + // we need to enable background downloading for the DLC + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); + + ULONGLONG ullOfferID_Full; + ULONGLONG ullIndexA[1]; + CXuiCtrl4JList::LIST_ITEM_INFO ListItem; + // get the current index of the list, and then get the data + ListItem=pClass->m_pTexturePacksList->GetData(pClass->m_currentTexturePackIndex); + app.GetDLCFullOfferIDForPackID(ListItem.iData,&ullOfferID_Full); + + if( result==C4JStorage::EMessage_ResultAccept ) // Full version + { + ullIndexA[0]=ullOfferID_Full; + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + + } + else // trial version + { + // if there is no trial version, this is a Cancel + DLC_INFO *pDLCInfo=app.GetDLCInfoForFullOfferID(ullOfferID_Full); + if(pDLCInfo->ullOfferID_Trial!=0LL) + { + ullIndexA[0]=pDLCInfo->ullOfferID_Trial; + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + } + } + } + pClass->m_bIgnoreInput=false; + return 0; +} + +HRESULT CScene_MultiGameCreate::OnCustomMessage_DLCInstalled() +{ + // mounted DLC may have changed + if(app.StartInstallDLCProcess(m_iPad)==false) + { + // not doing a mount, so re-enable input + m_bIgnoreInput=false; + } + else + { + m_bIgnoreInput=true; + // clear out the texture pack list + m_pTexturePacksList->RemoveAllData(); + ClearTexturePackDescription(); + } + // this will send a CustomMessage_DLCMountingComplete when done + return S_OK; +} + +HRESULT CScene_MultiGameCreate::OnCustomMessage_DLCMountingComplete() +{ + // refill the texture pack list + m_pTexturePacksList->SetSelectionChangedHandle(m_hObj); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + int texturePacksCount = pMinecraft->skins->getTexturePackCount(); + CXuiCtrl4JList::LIST_ITEM_INFO ListInfo; + HRESULT hr; + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + ZeroMemory(&ListInfo,sizeof(CXuiCtrl4JList::LIST_ITEM_INFO)); + + DWORD dwImageBytes; + PBYTE pbImageData = tp->getPackIcon(dwImageBytes); + + if(dwImageBytes > 0 && pbImageData) + { + ListInfo.fEnabled = TRUE; + hr=XuiCreateTextureBrushFromMemory(pbImageData,dwImageBytes,&ListInfo.hXuiBrush); + + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tp; + if(pDLCTexPack) + { + int id=pDLCTexPack->getDLCParentPackId(); + + if(id==0) + { + // default texture pack - should come first + ListInfo.iSortIndex=0x0FFFFFFF; + } + else + { + ListInfo.iSortIndex=id; + ListInfo.iData=id; + } + } + m_pTexturePacksList->AddData(ListInfo,0,CXuiCtrl4JList::eSortList_Index); + } + } + + m_iTexturePacksNotInstalled=0; + + // 4J-PB - there may be texture packs we don't have, so use the info from TMS for this + // REMOVE UNTIL WORKING + DLC_INFO *pDLCInfo=NULL; + + // first pass - look to see if there are any that are not in the list + bool bTexturePackAlreadyListed; + bool bNeedToGetTPD=false; + + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + bTexturePackAlreadyListed=false; + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + if(pDLCInfo->iConfig==tp->getDLCParentPackId()) + { + bTexturePackAlreadyListed=true; + } + } + if(bTexturePackAlreadyListed==false) + { + // some missing + bNeedToGetTPD=true; + + m_iTexturePacksNotInstalled++; + } + } + + if(bNeedToGetTPD==true) + { + // add a TMS request for them + app.DebugPrintf("+++ Adding TMSPP request for texture pack data\n"); + app.AddTMSPPFileTypeRequest(e_DLC_TexturePackData); + if(m_iConfigA!=NULL) + { + delete m_iConfigA; + } + m_iConfigA= new int [m_iTexturePacksNotInstalled]; + m_iTexturePacksNotInstalled=0; + + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + bTexturePackAlreadyListed=false; + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + if(pDLCInfo->iConfig==tp->getDLCParentPackId()) + { + bTexturePackAlreadyListed=true; + } + } + if(bTexturePackAlreadyListed==false) + { + m_iConfigA[m_iTexturePacksNotInstalled++]=pDLCInfo->iConfig; + } + } + } + + m_currentTexturePackIndex = pMinecraft->skins->getTexturePackIndex(0); + UpdateTexturePackDescription(m_currentTexturePackIndex); + + m_bSetup = true; + m_bIgnoreInput=false; + app.m_dlcManager.checkForCorruptDLCAndAlert(); + return S_OK; +} + +void CScene_MultiGameCreate::ClearTexturePackDescription() +{ + m_texturePackTitle.SetText(L" "); + m_texturePackDescription.SetText(L" "); + m_texturePackComparison->UseBrush(NULL); + m_texturePackIcon->UseBrush(NULL); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_MultiGameCreate.h b/Minecraft.Client/Common/XUI/XUI_MultiGameCreate.h new file mode 100644 index 00000000..5b4e6ef7 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_MultiGameCreate.h @@ -0,0 +1,118 @@ +#pragma once +#include "..\Media\xuiscene_multi_create.h" +#include "XUI_Ctrl_4JEdit.h" +#include "XUI_Ctrl_SliderWrapper.h" +#include "XUI_MultiGameLaunchMoreOptions.h" + +class CXuiCtrl4JList; +class CXuiCtrl4JIcon; + +class CScene_MultiGameCreate : public CXuiSceneImpl +{ +protected: + CXuiScene m_MainScene; + CXuiScene m_TexturePackDetails; + CXuiControl m_NewWorld; + CXuiControl m_labelWorldName; + CXuiControl m_labelSeed; + CXuiControl m_labelRandomSeed; + CXuiControl m_MoreOptions; + CXuiCtrl4JEdit m_EditSeed; + CXuiCtrl4JEdit m_EditWorldName; + CXuiControl m_ButtonGameMode; + CXuiCtrlSliderWrapper m_SliderDifficulty; + CXuiCtrl4JList *m_pTexturePacksList; + CXuiControl m_texturePackTitle, m_texturePackDescription; + CXuiCtrl4JIcon *m_texturePackIcon, *m_texturePackComparison; + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_NOTIFY_VALUE_CHANGED(OnNotifyValueChanged) + XUI_ON_XM_CONTROL_NAVIGATE(OnControlNavigate) + XUI_ON_XM_TIMER( OnTimer ) + XUI_ON_XM_TRANSITION_START(OnTransitionStart) + XUI_ON_XM_TRANSITION_END(OnTransitionEnd) + XUI_ON_XM_NOTIFY_SELCHANGED( OnNotifySelChanged ) + XUI_ON_XM_NOTIFY_KILL_FOCUS( OnNotifyKillFocus ) + XUI_ON_XM_DLCINSTALLED_MESSAGE(OnCustomMessage_DLCInstalled) + XUI_ON_XM_DLCLOADED_MESSAGE(OnCustomMessage_DLCMountingComplete) + XUI_ON_XM_DESTROY( OnDestroy ) + XUI_END_MSG_MAP() + + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_MainScene, m_MainScene) + BEGIN_MAP_CHILD_CONTROLS(m_MainScene) + MAP_CONTROL(IDC_XuiLabelWorldName, m_labelWorldName) + MAP_CONTROL(IDC_XuiLabelSeed, m_labelSeed) + MAP_CONTROL(IDC_XuiLabelRandomSeed, m_labelRandomSeed) + MAP_CONTROL(IDC_XuiGameModeToggle, m_ButtonGameMode) + MAP_CONTROL(IDC_XuiNewWorld, m_NewWorld) + MAP_CONTROL(IDC_XuiMoreOptions, m_MoreOptions) + MAP_CONTROL(IDC_XuiEditSeed, m_EditSeed) + MAP_CONTROL(IDC_XuiEditWorldName, m_EditWorldName) + MAP_CONTROL(IDC_XuiSliderDifficulty, m_SliderDifficulty) + MAP_OVERRIDE(IDC_TexturePacksList, m_pTexturePacksList) + END_MAP_CHILD_CONTROLS() + MAP_CONTROL(IDC_TexturePackDetails, m_TexturePackDetails) + BEGIN_MAP_CHILD_CONTROLS(m_TexturePackDetails) + MAP_CONTROL(IDC_TexturePackName, m_texturePackTitle) + MAP_CONTROL(IDC_TexturePackDescription, m_texturePackDescription) + MAP_OVERRIDE(IDC_Icon, m_texturePackIcon) + MAP_OVERRIDE(IDC_ComparisonPic, m_texturePackComparison) + END_MAP_CHILD_CONTROLS() + END_CONTROL_MAP() + + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnNotifyValueChanged (HXUIOBJ hObjSource, XUINotifyValueChanged* pValueChangedData, BOOL& rfHandled); + HRESULT OnControlNavigate( XUIMessageControlNavigate *pControlNavigateData, BOOL &bHandled); + HRESULT OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ); + HRESULT OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ); + HRESULT OnTransitionEnd( XUIMessageTransition *pTransition, BOOL& bHandled ); + HRESULT OnNotifySelChanged( HXUIOBJ hObjSource, XUINotifySelChanged* pNotifySelChangedData, BOOL& bHandled ); + HRESULT OnNotifyKillFocus(HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled); + HRESULT OnCustomMessage_DLCInstalled(); + HRESULT OnCustomMessage_DLCMountingComplete(); + HRESULT OnDestroy(); + +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_MultiGameCreate, L"CScene_MultiGameCreate", XUI_CLASS_SCENE ) + +private: + static int LoadSaveDataReturned(void *pParam,bool bContinue); + static int StartGame_SignInReturned(void *pParam,bool bContinue, int iPad); + static void CreateGame(CScene_MultiGameCreate* pClass, DWORD dwLocalUsersMask); + static int ConfirmCreateReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int UnlockTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int WarningTrialTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int TexturePackDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + + + void ToggleShowSaveList(); + void UpdateTexturePackDescription(int index); + void ClearTexturePackDescription(); + void UpdateCurrentTexturePack(); + + bool m_bMultiplayerAllowed; + int m_iPad; + int m_CurrentDifficulty; + static int m_iDifficultyTitleSettingA[4]; + LaunchMoreOptionsMenuInitData m_MoreOptionsParams; + bool m_bGameModeSurvival; + bool m_bIgnoreInput; + unsigned int m_currentTexturePackIndex; + DLCPack * m_pDLCPack; + bool m_bSetup; + bool m_texturePackDescDisplayed; + HXUIBRUSH m_hTexturePackIconBrush; + HXUIBRUSH m_hTexturePackComparisonBrush; + int *m_iConfigA; // track the texture packs that we don't have installed + int m_iTexturePacksNotInstalled; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_MultiGameInfo.cpp b/Minecraft.Client/Common/XUI/XUI_MultiGameInfo.cpp new file mode 100644 index 00000000..bbfa243b --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_MultiGameInfo.cpp @@ -0,0 +1,392 @@ +#include "stdafx.h" +#include +#include +#include +#include "..\..\..\Minecraft.World\LevelSettings.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "XUI_MultiGameInfo.h" +#include "XUI_MultiGameJoinLoad.h" +#include "..\..\..\Minecraft.World\LevelSettings.h" +#include "..\..\..\Minecraft.World\Difficulty.h" + +#define UPDATE_PLAYERS_TIMER_ID 0 +#define UPDATE_PLAYERS_TIMER_TIME 30000 + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_MultiGameInfo::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + MapChildControls(); + + XuiControlSetText(playersList,app.GetString(IDS_PLAYERS)); + XuiControlSetText(m_JoinGame,app.GetString(IDS_JOIN_GAME)); + XuiControlSetText(m_labelDifficulty,app.GetString(IDS_LABEL_DIFFICULTY)); + XuiControlSetText(m_labelGameType,app.GetString(IDS_LABEL_GAME_TYPE)); + XuiControlSetText(m_labelGamertagsOn,app.GetString(IDS_LABEL_GAMERTAGS)); + XuiControlSetText(m_labelStructuresOn,app.GetString(IDS_LABEL_STRUCTURES)); + XuiControlSetText(m_labelLevelType,app.GetString(IDS_LABEL_LEVEL_TYPE)); + XuiControlSetText(m_labelPvP,app.GetString(IDS_LABEL_PvP)); + XuiControlSetText(m_labelTrust,app.GetString(IDS_LABEL_TRUST)); + XuiControlSetText(m_labelTNTOn,app.GetString(IDS_LABEL_TNT)); + XuiControlSetText(m_labelFireOn,app.GetString(IDS_LABEL_FIRE_SPREADS)); + + JoinMenuInitData *initData = (JoinMenuInitData *)pInitData->pvInitData; + m_selectedSession = initData->selectedSession; + m_iPad = initData->iPad; + // 4J-PB - don't delete this - it's part of the joinload structure + //delete initData; + + for(unsigned int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++i) + { + if( m_selectedSession->data.players[i] != NULL ) + { + playersList.InsertItems(i,1); +#ifndef _CONTENT_PACKAGE + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<data.szPlayers[i] ).c_str() ); + } + } + else + { + // Leave the loop when we hit the first NULL player + break; + } + } + + unsigned int uiGameHostSettings = m_selectedSession->data.m_uiGameHostSettings; + switch(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_Difficulty)) + { + case Difficulty::EASY: + m_difficulty.SetText( app.GetString(IDS_DIFFICULTY_TITLE_EASY) ); + break; + case Difficulty::NORMAL: + m_difficulty.SetText( app.GetString(IDS_DIFFICULTY_TITLE_NORMAL) ); + break; + case Difficulty::HARD: + m_difficulty.SetText( app.GetString(IDS_DIFFICULTY_TITLE_HARD) ); + break; + case Difficulty::PEACEFUL: + default: + m_difficulty.SetText( app.GetString(IDS_DIFFICULTY_TITLE_PEACEFUL) ); + break; + } + + unsigned int hostOption = app.GetGameHostOption(uiGameHostSettings,eGameHostOption_GameType); + + if (hostOption == GameType::CREATIVE->getId()) + { + m_GameType.SetText( app.GetString(IDS_CREATIVE) ); + } + else if (hostOption == GameType::SURVIVAL->getId()) + { + m_GameType.SetText( app.GetString(IDS_SURVIVAL) ); + } + else + { + m_GameType.SetText( app.GetString(IDS_SURVIVAL) ); + } + + if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_Gamertags)) m_gamertagsOn.SetText( app.GetString(IDS_ON) ); + else m_gamertagsOn.SetText( app.GetString(IDS_OFF) ); + + if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_Structures)) m_structuresOn.SetText( app.GetString(IDS_ON) ); + else m_structuresOn.SetText( app.GetString(IDS_OFF) ); + + if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_LevelType)) m_levelType.SetText( app.GetString(IDS_LEVELTYPE_SUPERFLAT) ); + else m_levelType.SetText( app.GetString(IDS_LEVELTYPE_NORMAL) ); + + if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_PvP)) m_pvpOn.SetText( app.GetString(IDS_ON) ); + else m_pvpOn.SetText( app.GetString(IDS_OFF) ); + + if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_TrustPlayers)) m_trustPlayers.SetText( app.GetString(IDS_ON) ); + else m_trustPlayers.SetText( app.GetString(IDS_OFF) ); + + if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_TNT)) m_tntOn.SetText( app.GetString(IDS_ON) ); + else m_tntOn.SetText( app.GetString(IDS_OFF) ); + + if(app.GetGameHostOption(uiGameHostSettings,eGameHostOption_FireSpreads)) m_fireOn.SetText( app.GetString(IDS_ON) ); + else m_fireOn.SetText( app.GetString(IDS_OFF) ); + + m_bIgnoreInput = false; + + // Alert the app the we want to be informed of ethernet connections + app.SetLiveLinkRequired( true ); + + TelemetryManager->RecordMenuShown(m_iPad, eUIScene_JoinMenu, 0); + + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK ); + + XuiSetTimer(m_hObj,UPDATE_PLAYERS_TIMER_ID,UPDATE_PLAYERS_TIMER_TIME); + + return S_OK; +} + + + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_MultiGameInfo::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + if ( hObjPressed == m_JoinGame ) + { + // check we have the texture pack required for the game + + + SetShow( FALSE ); + m_bIgnoreInput=true; + + // 4J Stu - If we only have one controller connected, then don't show the sign-in UI again + DWORD connectedControllers = 0; + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if( InputManager.IsPadConnected(i) || ProfileManager.IsSignedIn(i) ) ++connectedControllers; + } + + if(connectedControllers == 1 || !RenderManager.IsHiDef()) + { + JoinGame( this ); + } + else + { + ProfileManager.RequestSignInUI(false, false, false, true, false,&CScene_MultiGameInfo::StartGame_SignInReturned, this,ProfileManager.GetPrimaryPad()); + } + } + + return S_OK; +} + +HRESULT CScene_MultiGameInfo::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + HRESULT hr = S_OK; + + // Explicitly handle B button presses + switch(pInputData->dwKeyCode) + { + case VK_PAD_B: + case VK_ESCAPE: + app.NavigateBack(pInputData->UserIndex); + rfHandled = TRUE; + break; + case VK_PAD_Y: + if(m_selectedSession != NULL && playersList.TreeHasFocus() && playersList.GetItemCount() > 0) + { + PlayerUID xuid = m_selectedSession->data.players[playersList.GetCurSel()]; + if( xuid != INVALID_XUID ) + hr = XShowGamerCardUI(ProfileManager.GetLockedProfile(), xuid); + } + break; + } + + return hr; +} + +HRESULT CScene_MultiGameInfo::OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled) +{ + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK); + + return S_OK; +} + +HRESULT CScene_MultiGameInfo::OnNotifySelChanged(HXUIOBJ hObjSource, XUINotifySelChanged *pNotifySelChangedData, BOOL& bHandled) +{ + if(pNotifySelChangedData->iOldItem!=-1) + { + CXuiSceneBase::PlayUISFX(eSFX_Focus); + } + bHandled = TRUE; + + return S_OK; +} + +HRESULT CScene_MultiGameInfo::OnNotifySetFocus(HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled) +{ + if( playersList.TreeHasFocus() && playersList.GetItemCount() > 0 ) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, -1, IDS_TOOLTIPS_BACK, -1, IDS_TOOLTIPS_VIEW_GAMERCARD ); + bHandled = TRUE; + } + return S_OK; +} + +HRESULT CScene_MultiGameInfo::OnNotifyKillFocus(HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled) +{ + if( pNotifyFocusData->hObjOther == m_JoinGame ) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK ); + bHandled = TRUE; + } + return S_OK; +} + +int CScene_MultiGameInfo::StartGame_SignInReturned(void *pParam,bool bContinue, int iPad) +{ + CScene_MultiGameInfo* pClass = (CScene_MultiGameInfo*)pParam; + + if(bContinue==true) + { + // It's possible that the player has not signed in - they can back out + if(ProfileManager.IsSignedIn(iPad)) + { + JoinGame(pClass); + } + } + else + { + pClass->SetShow( TRUE ); + pClass->m_bIgnoreInput=false; + } + return 0; +} + +// Shared function to join the game that is the same whether we used the sign-in UI or not +void CScene_MultiGameInfo::JoinGame(CScene_MultiGameInfo* pClass) +{ + DWORD dwLocalUsersMask = 0; + bool noPrivileges = false; + DWORD dwSignedInUsers = 0; + + // if we're in SD mode, then only the primary player gets to play + if(RenderManager.IsHiDef()) + { + for(unsigned int index = 0; index < XUSER_MAX_COUNT; ++index) + { + if(ProfileManager.IsSignedIn(index) ) + { + ++dwSignedInUsers; + if( !ProfileManager.AllowedToPlayMultiplayer(index) ) noPrivileges = true; + dwLocalUsersMask |= CGameNetworkManager::GetLocalPlayerMask(index); + } + } + } + else + { + if(ProfileManager.IsSignedIn(ProfileManager.GetPrimaryPad()) ) + { + ++dwSignedInUsers; + if( !ProfileManager.AllowedToPlayMultiplayer(ProfileManager.GetPrimaryPad()) ) noPrivileges = true; + dwLocalUsersMask |= CGameNetworkManager::GetLocalPlayerMask(ProfileManager.GetPrimaryPad()); + } + } + + // Check if user-created content is allowed, as we cannot play multiplayer if it's not + bool noUGC = false; + BOOL pccAllowed = TRUE; + BOOL pccFriendsAllowed = TRUE; + ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); + if(!pccAllowed && !pccFriendsAllowed) noUGC = true; + + if(noUGC) + { + pClass->SetShow( TRUE ); + pClass->m_bIgnoreInput=false; + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + + int messageText = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL; + if(dwSignedInUsers > 1) messageText = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL; + + StorageManager.RequestMessageBox( IDS_CONNECTION_FAILED, messageText, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + + } + else if(noPrivileges) + { + pClass->SetShow( TRUE ); + pClass->m_bIgnoreInput=false; + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + StorageManager.RequestMessageBox( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + } + else + { + CGameNetworkManager::eJoinGameResult result = g_NetworkManager.JoinGame( pClass->m_selectedSession, dwLocalUsersMask ); + + // Alert the app the we no longer want to be informed of ethernet connections + app.SetLiveLinkRequired( false ); + + if( result != CGameNetworkManager::JOINGAME_SUCCESS ) + { + int exitReasonStringId = -1; + switch(result) + { + case CGameNetworkManager::JOINGAME_FAIL_SERVER_FULL: + exitReasonStringId = IDS_DISCONNECTED_SERVER_FULL; + break; + } + + if( exitReasonStringId == -1 ) + { + app.NavigateBack(ProfileManager.GetPrimaryPad()); + } + else + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + StorageManager.RequestMessageBox( IDS_CONNECTION_FAILED, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + exitReasonStringId = -1; + + app.NavigateToHomeMenu(); + } + } + } +} + +HRESULT CScene_MultiGameInfo::OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ) +{ + if ( pTimer->nId == UPDATE_PLAYERS_TIMER_ID) + { + PlayerUID selectedPlayerXUID = m_selectedSession->data.players[playersList.GetCurSel()]; + + bool success = g_NetworkManager.GetGameSessionInfo(m_iPad, m_selectedSession->sessionId,m_selectedSession); + + if( success ) + { + playersList.DeleteItems(0, playersList.GetItemCount()); + int selectedIndex = 0; + for(unsigned int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++i) + { + if( m_selectedSession->data.players[i] != NULL ) + { + if(m_selectedSession->data.players[i] == selectedPlayerXUID) selectedIndex = i; + playersList.InsertItems(i,1); +#ifndef _CONTENT_PACKAGE + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<data.szPlayers[i] ).c_str() ); + } + } + else + { + // Leave the loop when we hit the first NULL player + break; + } + } + playersList.SetCurSel(selectedIndex); + } + } + + return S_OK; +} + + diff --git a/Minecraft.Client/Common/XUI/XUI_MultiGameInfo.h b/Minecraft.Client/Common/XUI/XUI_MultiGameInfo.h new file mode 100644 index 00000000..9664640b --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_MultiGameInfo.h @@ -0,0 +1,85 @@ +#pragma once +using namespace std; +#include +#include +#include "..\Media\xuiscene_multi_gameinfo.h" + +class FriendSessionInfo; + +class CScene_MultiGameInfo : public CXuiSceneImpl +{ +protected: + CXuiList playersList; + CXuiControl m_JoinGame; + CXuiControl m_GameSettingsGroup; + CXuiControl m_difficulty, m_GameType, m_gamertagsOn, m_structuresOn, m_levelType, m_pvpOn, m_trustPlayers, m_tntOn, m_fireOn; + CXuiControl m_labelDifficulty, m_labelGameType, m_labelGamertagsOn, m_labelStructuresOn, m_labelLevelType, m_labelPvP, m_labelTrust, m_labelTNTOn, m_labelFireOn; + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_NAV_RETURN(OnNavReturn) + XUI_ON_XM_NOTIFY_SELCHANGED(OnNotifySelChanged) + XUI_ON_XM_NOTIFY_SET_FOCUS(OnNotifySetFocus) + XUI_ON_XM_NOTIFY_KILL_FOCUS(OnNotifyKillFocus) + XUI_ON_XM_TIMER(OnTimer) + + XUI_END_MSG_MAP() + + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_JoinGame, m_JoinGame) + MAP_CONTROL(IDC_GamePlayers, playersList) + + MAP_CONTROL(IDC_GameSettings, m_GameSettingsGroup) + BEGIN_MAP_CHILD_CONTROLS(m_GameSettingsGroup) + MAP_CONTROL(IDC_GamertagsOn, m_gamertagsOn) + MAP_CONTROL(IDC_StructuresOn, m_structuresOn) + MAP_CONTROL(IDC_Difficulty, m_difficulty) + MAP_CONTROL(IDC_GameType, m_GameType) + MAP_CONTROL(IDC_LevelType, m_levelType) + MAP_CONTROL(IDC_PvP, m_pvpOn) + MAP_CONTROL(IDC_Trust, m_trustPlayers) + MAP_CONTROL(IDC_TNTOn, m_tntOn) + MAP_CONTROL(IDC_FireOn, m_fireOn) + + MAP_CONTROL(IDC_LabelGamertagsOn, m_labelGamertagsOn) + MAP_CONTROL(IDC_LabelStructuresOn, m_labelStructuresOn) + MAP_CONTROL(IDC_LabelDifficulty, m_labelDifficulty) + MAP_CONTROL(IDC_LabelGameType, m_labelGameType) + MAP_CONTROL(IDC_LabelLevelType, m_labelLevelType) + MAP_CONTROL(IDC_LabelPvP, m_labelPvP) + MAP_CONTROL(IDC_LabelTrust, m_labelTrust) + MAP_CONTROL(IDC_LabelTNTOn, m_labelTNTOn) + MAP_CONTROL(IDC_LabelFireOn, m_labelFireOn) + END_MAP_CHILD_CONTROLS() + END_CONTROL_MAP() + + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled); + HRESULT OnNotifySelChanged(HXUIOBJ hObjSource, XUINotifySelChanged *pNotifySelChangedData, BOOL& bHandled); + HRESULT OnNotifySetFocus(HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled); + HRESULT OnNotifyKillFocus(HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled); + HRESULT OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ); + +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_MultiGameInfo, L"CScene_MultiGameInfo", XUI_CLASS_SCENE ) + + + +protected: + FriendSessionInfo *m_selectedSession; + unsigned char m_localPlayers; + bool m_bIgnoreInput; + int m_iPad; + + static int StartGame_SignInReturned(void *pParam,bool bContinue, int iPad); + static void JoinGame(CScene_MultiGameInfo* pClass); + +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_MultiGameJoinLoad.cpp b/Minecraft.Client/Common/XUI/XUI_MultiGameJoinLoad.cpp new file mode 100644 index 00000000..73f25da5 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_MultiGameJoinLoad.cpp @@ -0,0 +1,2767 @@ +#include "stdafx.h" +#include +#include +#include +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\Common\Tutorial\TutorialMode.h" +#include "..\..\..\Minecraft.World\ConsoleSaveFileIO.h" +#include "..\..\LocalPlayer.h" +#include "..\..\Minecraft.h" +#include "..\..\ProgressRenderer.h" +#include "..\..\..\Minecraft.World\AABB.h" +#include "..\..\..\Minecraft.World\Vec3.h" +#include "..\..\..\Minecraft.World\ArrayWithLength.h" +#include "..\..\..\Minecraft.World\File.h" +#include "..\..\..\Minecraft.World\InputOutputStream.h" +#include "XUI_Ctrl_4JList.h" +#include "XUI_Ctrl_4JIcon.h" +#include "XUI_LoadSettings.h" +#include "XUI_MultiGameInfo.h" +#include "XUI_MultiGameJoinLoad.h" +#include "XUI_MultiGameCreate.h" +#include "..\..\MinecraftServer.h" +#include "..\..\Options.h" + +#include "..\GameRules\LevelGenerationOptions.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\TexturePack.h" +#include "..\..\..\Minecraft.World\LevelSettings.h" + +#define CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID 3 +#define CHECKFORAVAILABLETEXTUREPACKS_TIMER_TIME 100 + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_MultiGameJoinLoad::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + + m_iPad=*(int *)pInitData->pvInitData; + m_bReady=false; + MapChildControls(); + + m_iTexturePacksNotInstalled=0; + m_iConfigA=NULL; + + XuiControlSetText(m_LabelNoGames,app.GetString(IDS_NO_GAMES_FOUND)); + XuiControlSetText(m_GamesList,app.GetString(IDS_JOIN_GAME)); + XuiControlSetText(m_SavesList,app.GetString(IDS_START_GAME)); + + + const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string + WCHAR szResourceLocator[ LOCATOR_SIZE ]; + + const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL); + swprintf(szResourceLocator, LOCATOR_SIZE ,L"section://%X,%ls#%ls",c_ModuleHandle,L"media", L"media/Graphics/TexturePackIcon.png"); + + m_DefaultMinecraftIconSize = 0; + HRESULT hr = XuiResourceLoadAllNoLoc(szResourceLocator, &m_DefaultMinecraftIconData, &m_DefaultMinecraftIconSize); + + m_localPlayers = 1; + m_bKillSaveInfoEnumerate=false; + + m_bShowingPartyGamesOnly = false; + + m_bRetrievingSaveInfo=false; + m_bSaveTransferInProgress=false; + + // check for a default custom cloak in the global storage + // 4J-PB - changed to a config file +// if(ProfileManager.IsSignedInLive( m_iPad )) +// { +// app.InstallDefaultCape(); +// } + + m_initData= new JoinMenuInitData(); + m_bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); + + XPARTY_USER_LIST partyList; + + if((XPartyGetUserList( &partyList ) != XPARTY_E_NOT_IN_PARTY ) && (partyList.dwUserCount>1)) + { + m_bInParty=true; + } + else + { + m_bInParty=false; + } + + int iLB = -1; + if(m_bInParty) iLB = IDS_TOOLTIPS_PARTY_GAMES; + + XuiSetTimer(m_hObj,JOIN_LOAD_ONLINE_TIMER_ID,JOIN_LOAD_ONLINE_TIMER_TIME); + + m_iSaveInfoC=0; + + VOID *pObj; + XuiObjectFromHandle( m_SavesList, &pObj ); + m_pSavesList = (CXuiCtrl4JList *)pObj; + + XuiObjectFromHandle( m_GamesList, &pObj ); + m_pGamesList = (CXuiCtrl4JList *)pObj; + + // block input if we're waiting for DLC to install, and wipe the saves list. The end of dlc mounting custom message will fill the list again + if(app.StartInstallDLCProcess(m_iPad)==true) + { + // not doing a mount, so enable input + m_bIgnoreInput=true; + } + else + { + // if we're waiting for DLC to mount, don't fill the save list. The custom message on end of dlc mounting will do that + m_bIgnoreInput=false; + + + + m_iChangingSaveGameInfoIndex = 0; + + m_generators = app.getLevelGenerators(); + m_iDefaultButtonsC = 0; + m_iMashUpButtonsC=0; + + // check if we're in the trial version + if(ProfileManager.IsFullVersion()==false) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK, -1, -1, -1, -1,iLB); + + AddDefaultButtons(); + + m_pSavesList->SetCurSelVisible(0); + } + else if(StorageManager.GetSaveDisabled()) + { + if(StorageManager.GetSaveDeviceSelected(m_iPad)) + { + // saving is disabled, but we should still be able to load from a selected save device + + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,IDS_TOOLTIPS_CHANGEDEVICE,-1,-1,-1,iLB,IDS_TOOLTIPS_DELETESAVE); + + GetSaveInfo(); + } + else + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,IDS_TOOLTIPS_SELECTDEVICE,-1,-1,-1,iLB); + + AddDefaultButtons(); + m_SavesListTimer.SetShow( FALSE ); + + m_pSavesList->SetCurSelVisible(0); + } + } + else + { + // 4J-PB - we need to check that there is enough space left to create a copy of the save (for a rename) + bool bCanRename = StorageManager.EnoughSpaceForAMinSaveGame(); + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,IDS_TOOLTIPS_CHANGEDEVICE,-1,-1,-1,-1,bCanRename?IDS_TOOLTIPS_SAVEOPTIONS:IDS_TOOLTIPS_DELETESAVE); + + GetSaveInfo(); + } + } + //XuiElementSetDisableFocusRecursion( m_pGamesList->m_hObj, TRUE); + + UpdateGamesList(); + + g_NetworkManager.SetSessionsUpdatedCallback( &CScene_MultiGameJoinLoad::UpdateGamesListCallback, this ); + + // 4J Stu - Fix for #12530 -TCR 001 BAS Game Stability: Title will crash if the player disconnects while starting a new world and then opts to play the tutorial once they have been returned to the Main Menu. + MinecraftServer::resetFlags(); + + // If we're not ignoring input, then we aren't still waiting for the DLC to mount, and can now check for corrupt dlc. Otherwise this will happen when the dlc has finished mounting. + if( !m_bIgnoreInput) + { + app.m_dlcManager.checkForCorruptDLCAndAlert(); + } + + + // 4J-PB - Load up any texture pack data we have locally in the XZP + for(int i=0;iskins->getTexturePackCount(); + //CXuiCtrl4JList::LIST_ITEM_INFO ListInfo; + //HRESULT hr; + + + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + bTexturePackAlreadyListed=false; + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + if(pDLCInfo->iConfig==tp->getDLCParentPackId()) + { + bTexturePackAlreadyListed=true; + } + } + if(bTexturePackAlreadyListed==false) + { + // some missing + bNeedToGetTPD=true; + + m_iTexturePacksNotInstalled++; + } + } + + if(bNeedToGetTPD==true) + { + // add a TMS request for them + app.DebugPrintf("+++ Adding TMSPP request for texture pack data\n"); + app.AddTMSPPFileTypeRequest(e_DLC_TexturePackData); + m_iConfigA= new int [m_iTexturePacksNotInstalled]; + m_iTexturePacksNotInstalled=0; + + for(unsigned int i = 0; i < app.GetDLCInfoTexturesOffersCount(); ++i) + { + bTexturePackAlreadyListed=false; + ULONGLONG ull=app.GetDLCInfoTexturesFullOffer(i); + pDLCInfo=app.GetDLCInfoForFullOfferID(ull); + for(unsigned int i = 0; i < texturePacksCount; ++i) + { + TexturePack *tp = pMinecraft->skins->getTexturePackByIndex(i); + if(pDLCInfo->iConfig==tp->getDLCParentPackId()) + { + bTexturePackAlreadyListed=true; + } + } + if(bTexturePackAlreadyListed==false) + { + m_iConfigA[m_iTexturePacksNotInstalled++]=pDLCInfo->iConfig; + } + } + } + + XuiSetTimer(m_hObj,CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID,CHECKFORAVAILABLETEXTUREPACKS_TIMER_TIME); + + return S_OK; +} + +void CScene_MultiGameJoinLoad::AddDefaultButtons() +{ + CXuiCtrl4JList::LIST_ITEM_INFO ListInfo; + + // Add two for New Game and Tutorial + ZeroMemory(&ListInfo,sizeof(CXuiCtrl4JList::LIST_ITEM_INFO)); + + ListInfo.pwszText = app.GetString(IDS_CREATE_NEW_WORLD); + ListInfo.fEnabled = TRUE; + ListInfo.iData = -1; + m_pSavesList->AddData(ListInfo); + + int iSavesListIndex = 0; + int iGeneratorIndex = 0; + m_iMashUpButtonsC=0; + + for(AUTO_VAR(it, m_generators->begin()); it != m_generators->end(); ++it) + { + LevelGenerationOptions *levelGen = *it; + ListInfo.pwszText = levelGen->getWorldName(); + ListInfo.fEnabled = TRUE; + ListInfo.iData = iGeneratorIndex++; // used to index into the list of generators + + // need to check if the user has disabled this pack in the save display list + unsigned int uiTexturePackID=levelGen->getRequiredTexturePackId(); + + if(uiTexturePackID!=0) + { + unsigned int uiMashUpWorldsBitmask=app.GetMashupPackWorlds(m_iPad); + + if((uiMashUpWorldsBitmask & (1<<(uiTexturePackID-1024)))==0) + { + // this world is hidden, so skip + continue; + } + } + m_pSavesList->AddData(ListInfo); + + // retrieve the save icon from the texture pack, if there is one + if(uiTexturePackID!=0) + { + // increment the count of the mash-up pack worlds in the save list + m_iMashUpButtonsC++; + TexturePack *tp = Minecraft::GetInstance()->skins->getTexturePackById(levelGen->getRequiredTexturePackId()); + DWORD dwImageBytes; + PBYTE pbImageData = tp->getPackIcon(dwImageBytes); + HXUIBRUSH hXuiBrush; + + if(dwImageBytes > 0 && pbImageData) + { + XuiCreateTextureBrushFromMemory(pbImageData,dwImageBytes,&hXuiBrush); + // the index inside the list item for this will be i+1 because they start at m_vListData.size(), so the first etry (tutorial) is 1 + m_pSavesList->UpdateGraphic(iSavesListIndex+1,hXuiBrush); + } + } + + ++iSavesListIndex; + } + + m_iDefaultButtonsC = iSavesListIndex + 1; +} + + +HRESULT CScene_MultiGameJoinLoad::GetSaveInfo( ) +{ + unsigned int uiSaveC=0; + + // This will return with the number retrieved in uiSaveC + + if(app.DebugSettingsOn() && app.GetLoadSavesFromFolderEnabled()) + { + uiSaveC = 0; + File savesDir(L"GAME:\\Saves"); + if( savesDir.exists() ) + { + m_saves = savesDir.listFiles(); + uiSaveC = (unsigned int)m_saves->size(); + } + // add the New Game and Tutorial after the saves list is retrieved, if there are any saves + + // Add two for New Game and Tutorial + unsigned int listItems = uiSaveC; + + CXuiCtrl4JList::LIST_ITEM_INFO ListInfo; + ZeroMemory(&ListInfo,sizeof(CXuiCtrl4JList::LIST_ITEM_INFO)); + + AddDefaultButtons(); + + for(unsigned int i=0;iat(i)->getName(); + wchar_t *name = new wchar_t[wName.size()+1]; + for(unsigned int j = 0; j < wName.size(); ++j) + { + name[j] = wName[j]; + } + name[wName.size()] = 0; + ListInfo.pwszText = name; + ListInfo.fEnabled=TRUE; + ListInfo.iData = -1; + m_pSavesList->AddData(ListInfo); + } + m_pSavesList->SetCurSelVisible(0); + } + else + { + m_bRetrievingSaveInfo=true; // we're blocking the exit from this scene until complete + + // clear the saves list + m_pSavesList->RemoveAllData(); + + m_iSaveInfoC=0; +#ifdef _XBOX + C4JStorage::ESGIStatus eSGIStatus=StorageManager.GetSavesInfo(ProfileManager.GetPrimaryPad(),&CScene_MultiGameJoinLoad::GetSavesInfoCallback,this,"savegame.dat"); + + if(eSGIStatus==C4JStorage::ESGIStatus_NoSaves) + { + uiSaveC=0; + m_SavesListTimer.SetShow( FALSE ); + m_SavesList.SetEnable(TRUE); + } +#else + + //C4JStorage::ESaveGameState eStatus=StorageManager.GetSavesInfo(ProfileManager.GetPrimaryPad(),&CScene_MultiGameJoinLoad::GetSavesInfoCallback,this,"savegame.dat"); + +#endif + } + + return S_OK; +} + +HRESULT CScene_MultiGameJoinLoad::OnDestroy() +{ + g_NetworkManager.SetSessionsUpdatedCallback( NULL, NULL ); + + for(AUTO_VAR(it, currentSessions.begin()); it < currentSessions.end(); ++it) + { + delete (*it); + } + + if(m_bSaveTransferInProgress) + { + CancelSaveUploadCallback(this); + } + + // Reset the background downloading, in case we changed it by attempting to download a texture pack + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_AUTO); + + // clear out the texture pack data + for(int i=0;im_bIgnoreInput=false; + return 0; +} +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_MultiGameJoinLoad::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + + // if we're retrieving save info, ignore key presses + if(m_bRetrievingSaveInfo) + { + return S_OK; + } + + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + if ( hObjPressed == m_GamesList ) + { + m_bIgnoreInput=true; + + DWORD nIndex = m_pGamesList->GetCurSel(); + + if( m_pGamesList->GetItemCount() > 0 && nIndex < currentSessions.size() ) + { + //CScene_MultiGameInfo::JoinMenuInitData *initData = new CScene_MultiGameInfo::JoinMenuInitData(); + m_initData->iPad = m_iPad; + m_initData->selectedSession = currentSessions.at( nIndex ); + + // check that we have the texture pack available + // If it's not the default texture pack + if(m_initData->selectedSession->data.texturePackParentId!=0) + { + int texturePacksCount = Minecraft::GetInstance()->skins->getTexturePackCount(); + bool bHasTexturePackInstalled=false; + + for(int i=0;iskins->getTexturePackByIndex(i); + if(tp->getDLCParentPackId()==m_initData->selectedSession->data.texturePackParentId) + { + bHasTexturePackInstalled=true; + break; + } + } + + if(bHasTexturePackInstalled==false) + { + // upsell the texture pack + // tell sentient about the upsell of the full version of the skin pack + ULONGLONG ullOfferID_Full; + app.GetDLCFullOfferIDForPackID(m_initData->selectedSession->data.texturePackParentId,&ullOfferID_Full); + + TelemetryManager->RecordUpsellPresented(pNotifyPressData->UserIndex, eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); + + UINT uiIDA[3]; + + // Need to check if the texture pack has both Full and Trial versions - we may do some as free ones, so only Full + DLC_INFO *pDLCInfo=app.GetDLCInfoForFullOfferID(ullOfferID_Full); + + if(pDLCInfo->ullOfferID_Trial!=0LL) + { + uiIDA[0]=IDS_TEXTUREPACK_FULLVERSION; + uiIDA[1]=IDS_TEXTURE_PACK_TRIALVERSION; + uiIDA[2]=IDS_CONFIRM_CANCEL; + // Give the player a warning about the texture pack missing + StorageManager.RequestMessageBox(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 3, ProfileManager.GetPrimaryPad(),&CScene_MultiGameJoinLoad::TexturePackDialogReturned,this,app.GetStringTable()); + } + else + { + uiIDA[0]=IDS_TEXTUREPACK_FULLVERSION; + uiIDA[1]=IDS_CONFIRM_CANCEL; + // Give the player a warning about the texture pack missing + StorageManager.RequestMessageBox(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CScene_MultiGameJoinLoad::TexturePackDialogReturned,this,app.GetStringTable()); + } + + return S_OK; + } + } + + m_NetGamesListTimer.SetShow( FALSE ); + + // Reset the background downloading, in case we changed it by attempting to download a texture pack + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_AUTO); + + // kill the texture pack check timer + XuiKillTimer(m_hObj,CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID); + app.NavigateToScene(pNotifyPressData->UserIndex,eUIScene_JoinMenu,m_initData); + } + } + else if(hObjPressed==m_SavesList) + { + m_bIgnoreInput=true; + + CXuiControl pItem; + int iIndex; + // get the selected item + iIndex=m_SavesList.GetCurSel(&pItem); + + CXuiCtrl4JList::LIST_ITEM_INFO info = m_pSavesList->GetData(iIndex); + + if(iIndex == JOIN_LOAD_CREATE_BUTTON_INDEX) + { + app.SetTutorialMode( false ); + m_NetGamesListTimer.SetShow( FALSE ); + + app.SetCorruptSaveDeleted(false); + + CreateWorldMenuInitData *params = new CreateWorldMenuInitData(); + params->iPad = m_iPad; + app.NavigateToScene(pNotifyPressData->UserIndex,eUIScene_CreateWorldMenu,(void *)params); + } + else if(info.iData >= 0) + { + LevelGenerationOptions *levelGen = m_generators->at(info.iData); + app.SetTutorialMode( levelGen->isTutorial() ); + // Reset the autosave time + app.SetAutosaveTimerTime(); + + if(levelGen->isTutorial()) + { + LoadLevelGen(levelGen); + } + else + { + LoadMenuInitData *params = new LoadMenuInitData(); + params->iPad = m_iPad; + // need to get the iIndex from the list item, since the position in the list doesn't correspond to the GetSaveGameInfo list because of sorting + params->iSaveGameInfoIndex=-1; + //params->pbSaveRenamed=&m_bSaveRenamed; + params->levelGen = levelGen; + + // navigate to the settings scene + app.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_LoadMenu, params); + } + } + else + { + // check if this is a damaged save + if(m_pSavesList->GetData(iIndex).bIsDamaged) + { + // give the option to delete the save + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + StorageManager.RequestMessageBox(IDS_CORRUPT_OR_DAMAGED_SAVE_TITLE, IDS_CORRUPT_OR_DAMAGED_SAVE_TEXT, uiIDA, 2, pNotifyPressData->UserIndex,&CScene_MultiGameJoinLoad::DeleteSaveDialogReturned,this, app.GetStringTable()); + } + else + { + app.SetTutorialMode( false ); + if(app.DebugSettingsOn() && app.GetLoadSavesFromFolderEnabled()) + { + LoadSaveFromDisk(m_saves->at(iIndex-m_iDefaultButtonsC)); + } + else + { + LoadMenuInitData *params = new LoadMenuInitData(); + params->iPad = m_iPad; + // need to get the iIndex from the list item, since the position in the list doesn't correspond to the GetSaveGameInfo list because of sorting + params->iSaveGameInfoIndex=m_pSavesList->GetData(iIndex).iIndex-m_iDefaultButtonsC; + //params->pbSaveRenamed=&m_bSaveRenamed; + params->levelGen = NULL; + + // kill the texture pack timer + XuiKillTimer(m_hObj,CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID); + // navigate to the settings scene + app.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_LoadMenu, params); + } + } + } + } + + return S_OK; +} + +HRESULT CScene_MultiGameJoinLoad::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + + // if we're retrieving save info, ignore key presses + if(m_bRetrievingSaveInfo) + { + return S_OK; + } + + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + HRESULT hr = S_OK; + + // Explicitly handle B button presses + switch(pInputData->dwKeyCode) + { + case VK_PAD_B: + case VK_ESCAPE: + m_NetGamesListTimer.SetShow( FALSE ); + + app.NavigateBack(XUSER_INDEX_ANY); + rfHandled = TRUE; + break; + case VK_PAD_X: + + // Change device + // Fix for #12531 - TCR 001: BAS Game Stability: When a player selects to change a storage + // device, and repeatedly backs out of the SD screen, disconnects from LIVE, and then selects a SD, the title crashes. + m_bIgnoreInput=true; + StorageManager.SetSaveDevice(&CScene_MultiGameJoinLoad::DeviceSelectReturned,this,true); + CXuiSceneBase::PlayUISFX(eSFX_Press); + break; + case VK_PAD_Y: + if(m_pGamesList->TreeHasFocus() && m_pGamesList->GetItemCount() > 0) + { + DWORD nIndex = m_pGamesList->GetCurSel(); + FriendSessionInfo *pSelectedSession = currentSessions.at( nIndex ); + + PlayerUID xuid = pSelectedSession->data.hostPlayerUID; + if( xuid != INVALID_XUID ) + hr = XShowGamerCardUI(ProfileManager.GetLockedProfile(), xuid); + CXuiSceneBase::PlayUISFX(eSFX_Press); + } + else if(DoesSavesListHaveFocus()) + { + // save transfer - make sure they want to overwrite a save that is up there + if(ProfileManager.IsSignedInLive( m_iPad )) + { + // 4J-PB - required for a delete of the save if it's found to be a corrupted save + DWORD nIndex = m_pSavesList->GetCurSel(); + m_iChangingSaveGameInfoIndex=m_pSavesList->GetData(nIndex).iIndex; + + UINT uiIDA[2]; + uiIDA[0]=IDS_UPLOAD_SAVE; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + ui.RequestMessageBox(IDS_SAVE_TRANSFER_TITLE, IDS_SAVE_TRANSFER_TEXT, uiIDA, 2, pInputData->UserIndex,&CScene_MultiGameJoinLoad::SaveTransferDialogReturned,this, app.GetStringTable()); + } + } + break; + case VK_PAD_RSHOULDER: + if(DoesSavesListHaveFocus()) + { + m_bIgnoreInput = true; + + int iIndex=m_SavesList.GetCurSel(); + m_iChangingSaveGameInfoIndex=m_pSavesList->GetData(iIndex).iIndex; + + // Could be delete save or Save Options + if(StorageManager.GetSaveDisabled()) + { + // delete the save game + // Have to ask the player if they are sure they want to delete this game + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + StorageManager.RequestMessageBox(IDS_TOOLTIPS_DELETESAVE, IDS_TEXT_DELETE_SAVE, uiIDA, 2, pInputData->UserIndex,&CScene_MultiGameJoinLoad::DeleteSaveDialogReturned,this, app.GetStringTable()); + } + else + { + if(StorageManager.EnoughSpaceForAMinSaveGame()) + { + UINT uiIDA[3]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_TITLE_RENAMESAVE; + uiIDA[2]=IDS_TOOLTIPS_DELETESAVE; + StorageManager.RequestMessageBox(IDS_TOOLTIPS_SAVEOPTIONS, IDS_TEXT_SAVEOPTIONS, uiIDA, 3, pInputData->UserIndex,&CScene_MultiGameJoinLoad::SaveOptionsDialogReturned,this, app.GetStringTable()); + } + else + { + // delete the save game + // Have to ask the player if they are sure they want to delete this game + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + StorageManager.RequestMessageBox(IDS_TOOLTIPS_DELETESAVE, IDS_TEXT_DELETE_SAVE, uiIDA, 2, pInputData->UserIndex,&CScene_MultiGameJoinLoad::DeleteSaveDialogReturned,this, app.GetStringTable()); + } + } + CXuiSceneBase::PlayUISFX(eSFX_Press); + + } + else if(DoesMashUpWorldHaveFocus()) + { + // hiding a mash-up world + // get the mash-up pack id + CXuiControl pItem; + int iIndex; + iIndex=m_SavesList.GetCurSel(&pItem); + + CXuiCtrl4JList::LIST_ITEM_INFO info = m_pSavesList->GetData(iIndex); + if((iIndex != JOIN_LOAD_CREATE_BUTTON_INDEX) && (info.iData >= 0)) + { + LevelGenerationOptions *levelGen = m_generators->at(info.iData); + + if(!levelGen->isTutorial()) + { + if(levelGen->requiresTexturePack()) + { + unsigned int uiPackID=levelGen->getRequiredTexturePackId(); + + m_bIgnoreInput = true; + app.HideMashupPackWorld(m_iPad,uiPackID); + + // update the saves list + m_pSavesList->RemoveAllData(); + m_iSaveInfoC=0; + GetSaveInfo(); + m_bIgnoreInput = false; + } + } + } + + CXuiSceneBase::PlayUISFX(eSFX_Press); + + } + break; + case VK_PAD_LSHOULDER: + if( m_bInParty ) + { + m_bShowingPartyGamesOnly = !m_bShowingPartyGamesOnly; + UpdateGamesList(); + CXuiSceneBase::PlayUISFX(eSFX_Press); + } + break; + } + + return hr; +} + +HRESULT CScene_MultiGameJoinLoad::OnNavReturn(HXUIOBJ hSceneFrom,BOOL& rfHandled) +{ + + CXuiSceneBase::ShowLogo( DEFAULT_XUI_MENU_USER, TRUE ); + // start the texture pack timer again + XuiSetTimer(m_hObj,CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID,CHECKFORAVAILABLETEXTUREPACKS_TIMER_TIME); + + m_bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); + + // re-enable button presses + m_bIgnoreInput=false; + + if( m_bMultiplayerAllowed ) + { + HXUICLASS hClassFullscreenProgress = XuiFindClass( L"CScene_FullscreenProgress" ); + HXUICLASS hClassConnectingProgress = XuiFindClass( L"CScene_ConnectingProgress" ); + + // If we are navigating back from a full screen progress scene, then that means a connection attempt failed + if( XuiIsInstanceOf( hSceneFrom, hClassFullscreenProgress ) || XuiIsInstanceOf( hSceneFrom, hClassConnectingProgress ) ) + { + UpdateGamesList(); + } + } + else + { + m_pGamesList->RemoveAllData(); + //m_GamesList.DeleteItems(0, m_GamesList.GetItemCount() ); + m_pGamesList->SetEnable(FALSE); + //XuiElementSetDisableFocusRecursion( m_pGamesList->m_hObj, TRUE); + m_NetGamesListTimer.SetShow( TRUE ); + m_LabelNoGames.SetShow( FALSE ); + m_SavesList.InitFocus(m_iPad); + } + + // are we back here because of a delete of a corrupt save? + + if(app.GetCorruptSaveDeleted()) + { + // need to re-get the saves list and update the display + // clear the saves list + m_pSavesList->RemoveAllData(); + m_iSaveInfoC=0; + GetSaveInfo(); + app.SetCorruptSaveDeleted(false); + } + + int iY = -1; + int iRB=-1; + if( DoesGamesListHaveFocus() ) + { + iY = IDS_TOOLTIPS_VIEW_GAMERCARD; + } + else if(DoesSavesListHaveFocus()) + { + if(ProfileManager.IsSignedInLive( m_iPad )) + { + iY=IDS_TOOLTIPS_UPLOAD_SAVE_FOR_XBOXONE; + } + + if(StorageManager.GetSaveDisabled()) + { + iRB=IDS_TOOLTIPS_DELETESAVE; + } + else + { + // 4J-PB - we need to check that there is enough space left to create a copy of the save (for a rename) + + if(StorageManager.EnoughSpaceForAMinSaveGame()) + { + iRB=IDS_TOOLTIPS_SAVEOPTIONS; + } + else + { + iRB=IDS_TOOLTIPS_DELETESAVE; + + } + } + } + else if(DoesMashUpWorldHaveFocus()) + { + // If it's a mash-up pack world, give the Hide option + iRB=IDS_TOOLTIPS_HIDE; + } + + int iLB = -1; + if(m_bInParty) + { + if( m_bShowingPartyGamesOnly ) iLB = IDS_TOOLTIPS_ALL_GAMES; + else iLB = IDS_TOOLTIPS_PARTY_GAMES; + } + + if(ProfileManager.IsFullVersion()==false ) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, -1, -1,-1,-1,iLB); + } + else if(StorageManager.GetSaveDisabled()) + { + // clear out the saves list, since the disable save may have happened in the load screen because of a device removal + + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,IDS_TOOLTIPS_SELECTDEVICE,iY,-1,-1,iLB,iRB); + } + else + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, IDS_TOOLTIPS_CHANGEDEVICE, iY,-1,-1,iLB,iRB); + } + + return S_OK; +} + +HRESULT CScene_MultiGameJoinLoad::OnNotifySelChanged(HXUIOBJ hObjSource, XUINotifySelChanged *pNotifySelChangedData, BOOL& bHandled) +{ + + if(m_bReady) + { + CXuiSceneBase::PlayUISFX(eSFX_Focus); + } + + return S_OK; +} + + +HRESULT CScene_MultiGameJoinLoad::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ) +{ + //if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) return S_OK; + + if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY || + pTransition->dwTransType == XUI_TRANSITION_FROM || pTransition->dwTransType == XUI_TRANSITION_BACKFROM) + { + // 4J Stu - We may have had to unload our font renderer in this scene if one of the save files + // uses characters not in our font (eg asian chars) so restore our font renderer + // This will not do anything if our font renderer is already loaded + app.OverrideFontRenderer(true,true); + + KillTimer(JOIN_LOAD_ONLINE_TIMER_ID); + } + else if(pTransition->dwTransType == XUI_TRANSITION_TO || pTransition->dwTransType == XUI_TRANSITION_BACKTO) + { + SetTimer(JOIN_LOAD_ONLINE_TIMER_ID,JOIN_LOAD_ONLINE_TIMER_TIME); + // 4J-PB - Need to check for installed DLC, which might have happened while you were on the info scene + if(pTransition->dwTransType == XUI_TRANSITION_BACKTO) + { + // Can't call this here because if you back out of the load info screen and then go back in and load a game, it will attempt to use the dlc as it's running a mount of the dlc + + // block input if we're waiting for DLC to install, and wipe the saves list. The end of dlc mounting custom message will fill the list again + if(app.StartInstallDLCProcess(m_iPad)==false) + { + // not doing a mount, so re-enable input + m_bIgnoreInput=false; + } + else + { + m_bIgnoreInput=true; + m_pSavesList->RemoveAllData(); + m_SavesListTimer.SetShow( TRUE ); + } + } + } + + return S_OK; +} + +HRESULT CScene_MultiGameJoinLoad::OnFontRendererChange() +{ + // update the tooltips + // if the saves list has focus, then we should show the Delete Save tooltip + // if the games list has focus, then we should the the View Gamercard tooltip + int iRB=-1; + int iY = -1; + if( DoesGamesListHaveFocus() ) + { + iY = IDS_TOOLTIPS_VIEW_GAMERCARD; + } + else if(DoesSavesListHaveFocus()) + { + if(ProfileManager.IsSignedInLive( m_iPad )) + { + iY=IDS_TOOLTIPS_UPLOAD_SAVE_FOR_XBOXONE; + } + if(StorageManager.GetSaveDisabled()) + { + iRB=IDS_TOOLTIPS_DELETESAVE; + } + else + { + if(StorageManager.EnoughSpaceForAMinSaveGame()) + { + iRB=IDS_TOOLTIPS_SAVEOPTIONS; + } + else + { + iRB=IDS_TOOLTIPS_DELETESAVE; + } + } + } + else if(DoesMashUpWorldHaveFocus()) + { + // If it's a mash-up pack world, give the Hide option + iRB=IDS_TOOLTIPS_HIDE; + } + + int iLB = -1; + if(m_bInParty) + { + if( m_bShowingPartyGamesOnly ) iLB = IDS_TOOLTIPS_ALL_GAMES; + else iLB = IDS_TOOLTIPS_PARTY_GAMES; + } + + if(ProfileManager.IsFullVersion()==false ) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, -1, iY,-1,-1,iLB,-1,-1,true); + } + else if(StorageManager.GetSaveDisabled()) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,IDS_TOOLTIPS_SELECTDEVICE,iY,-1,-1,iLB,iRB,-1,true); + } + else + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, IDS_TOOLTIPS_CHANGEDEVICE, iY,-1,-1,iLB,iRB,-1,true); + } + return S_OK; +} + +HRESULT CScene_MultiGameJoinLoad::OnNotifySetFocus(HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled) +{ + // update the tooltips + // if the saves list has focus, then we should show the Delete Save tooltip + // if the games list has focus, then we should the the View Gamercard tooltip + int iRB=-1; + int iY = -1; + if( DoesGamesListHaveFocus() ) + { + iY = IDS_TOOLTIPS_VIEW_GAMERCARD; + } + else if(DoesSavesListHaveFocus()) + { + if(ProfileManager.IsSignedInLive( m_iPad )) + { + iY=IDS_TOOLTIPS_UPLOAD_SAVE_FOR_XBOXONE; + } + if(StorageManager.GetSaveDisabled()) + { + iRB=IDS_TOOLTIPS_DELETESAVE; + } + else + { + if(StorageManager.EnoughSpaceForAMinSaveGame()) + { + iRB=IDS_TOOLTIPS_SAVEOPTIONS; + } + else + { + iRB=IDS_TOOLTIPS_DELETESAVE; + } + } + } + else if(DoesMashUpWorldHaveFocus()) + { + // If it's a mash-up pack world, give the Hide option + iRB=IDS_TOOLTIPS_HIDE; + } + + int iLB = -1; + if(m_bInParty) + { + if( m_bShowingPartyGamesOnly ) iLB = IDS_TOOLTIPS_ALL_GAMES; + else iLB = IDS_TOOLTIPS_PARTY_GAMES; + } + + if(ProfileManager.IsFullVersion()==false ) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, -1, iY,-1,-1,iLB,-1); + } + else if(StorageManager.GetSaveDisabled()) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,IDS_TOOLTIPS_SELECTDEVICE,iY,-1,-1,iLB,iRB); + } + else + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, IDS_TOOLTIPS_CHANGEDEVICE, iY,-1,-1,iLB,iRB); + } + return S_OK; +} + +HRESULT CScene_MultiGameJoinLoad::OnNotifyKillFocus(HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled) +{ + return S_OK; +} + +bool CScene_MultiGameJoinLoad::DoesSavesListHaveFocus() +{ + HXUIOBJ hParentObj,hObj=TreeGetFocus(); + + if(hObj!=NULL) + { + // get the parent and see if it's the saves list + XuiElementGetParent(hObj,&hParentObj); + if(hParentObj==m_SavesList.m_hObj) + { + // check it's not the first or second element (new world or tutorial) + if(m_SavesList.GetCurSel()>(m_iDefaultButtonsC-1)) + { + return true; + } + } + } + return false; +} + +bool CScene_MultiGameJoinLoad::DoesMashUpWorldHaveFocus() +{ + HXUIOBJ hParentObj,hObj=TreeGetFocus(); + + if(hObj!=NULL) + { + // get the parent and see if it's the saves list + XuiElementGetParent(hObj,&hParentObj); + if(hParentObj==m_SavesList.m_hObj) + { + // check it's not the first or second element (new world or tutorial) + if(m_SavesList.GetCurSel()>(m_iDefaultButtonsC-1)) + { + return false; + } + + if(m_SavesList.GetCurSel()>(m_iDefaultButtonsC - 1 - m_iMashUpButtonsC)) + { + return true; + } + else return false; + } + else return false; + } + return false; +} + +bool CScene_MultiGameJoinLoad::DoesGamesListHaveFocus() +{ + HXUIOBJ hParentObj,hObj=TreeGetFocus(); + + if(hObj!=NULL) + { + // get the parent and see if it's the saves list + XuiElementGetParent(hObj,&hParentObj); + if(hParentObj==m_pGamesList->m_hObj) + { + return true; + } + } + return false; +} + +void CScene_MultiGameJoinLoad::UpdateGamesListCallback(LPVOID lpParam) +{ + if(lpParam != NULL) + { + CScene_MultiGameJoinLoad* pClass = (CScene_MultiGameJoinLoad *) lpParam; + // check this there's no save transfer in progress + if(!pClass->m_bSaveTransferInProgress) + { + pClass->UpdateGamesList(); + } + } +} + +void CScene_MultiGameJoinLoad::UpdateGamesList() +{ + if( m_bIgnoreInput ) return; + + // if we're retrieving save info, don't show the list yet as we will be ignoring press events + if(m_bRetrievingSaveInfo) + { + return; + } + + DWORD nIndex = -1; + FriendSessionInfo *pSelectedSession = NULL; + if(m_pGamesList->TreeHasFocus() && m_pGamesList->GetItemCount() > 0) + { + nIndex = m_pGamesList->GetCurSel(); + pSelectedSession = currentSessions.at( nIndex ); + } + + SessionID selectedSessionId; + if( pSelectedSession != NULL )selectedSessionId = pSelectedSession->sessionId; + pSelectedSession = NULL; + + for(AUTO_VAR(it, currentSessions.begin()); it < currentSessions.end(); ++it) + { + delete (*it); + } + currentSessions.clear(); + + m_NetGamesListTimer.SetShow( FALSE ); + + // if the saves list has focus, then we should show the Delete Save tooltip + // if the games list has focus, then we should show the View Gamercard tooltip + int iRB=-1; + int iY = -1; + + if( DoesGamesListHaveFocus() ) + { + iY = IDS_TOOLTIPS_VIEW_GAMERCARD; + } + else if(DoesSavesListHaveFocus()) + { + if(ProfileManager.IsSignedInLive( m_iPad )) + { + iY=IDS_TOOLTIPS_UPLOAD_SAVE_FOR_XBOXONE; + } + if(StorageManager.GetSaveDisabled()) + { + iRB=IDS_TOOLTIPS_DELETESAVE; + } + else + { + if(StorageManager.EnoughSpaceForAMinSaveGame()) + { + iRB=IDS_TOOLTIPS_SAVEOPTIONS; + } + else + { + iRB=IDS_TOOLTIPS_DELETESAVE; + } + } + } + else if(DoesMashUpWorldHaveFocus()) + { + // If it's a mash-up pack world, give the Hide option + iRB=IDS_TOOLTIPS_HIDE; + } + + int iLB = -1; + if(m_bInParty) + { + if( m_bShowingPartyGamesOnly ) iLB = IDS_TOOLTIPS_ALL_GAMES; + else iLB = IDS_TOOLTIPS_PARTY_GAMES; + } + + if(ProfileManager.IsFullVersion()==false ) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, -1, iY,-1,-1,iLB,-1); + } + else if(StorageManager.GetSaveDisabled()) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,IDS_TOOLTIPS_SELECTDEVICE,iY,-1,-1,iLB,iRB); + } + else + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, IDS_TOOLTIPS_CHANGEDEVICE, iY,-1,-1,iLB,iRB); + } + + currentSessions = *g_NetworkManager.GetSessionList( m_iPad, m_localPlayers, m_bShowingPartyGamesOnly ); + + // Update the xui list displayed + unsigned int xuiListSize = m_pGamesList->GetItemCount(); + unsigned int filteredListSize = (unsigned int)currentSessions.size(); + + BOOL gamesListHasFocus = m_pGamesList->TreeHasFocus(); + + if(filteredListSize > 0) + { + if( !m_pGamesList->IsEnabled() ) + { + m_pGamesList->SetEnable(TRUE); + //XuiElementSetDisableFocusRecursion( m_pGamesList->m_hObj, FALSE); + m_pGamesList->SetCurSel( 0 ); + } + m_LabelNoGames.SetShow( FALSE ); + m_NetGamesListTimer.SetShow( FALSE ); + } + else + { + m_pGamesList->SetEnable(FALSE); + //XuiElementSetDisableFocusRecursion(m_pGamesList->m_hObj, TRUE); + m_NetGamesListTimer.SetShow( FALSE ); + m_LabelNoGames.SetShow( TRUE ); + + if( gamesListHasFocus ) m_pGamesList->InitFocus(m_iPad); + } + + // clear out the games list and re-fill + m_pGamesList->RemoveAllData(); + + if( filteredListSize > 0 ) + { + // Reset the focus to the selected session if it still exists + unsigned int sessionIndex = 0; + m_pGamesList->SetCurSel(0); + + for( AUTO_VAR(it, currentSessions.begin()); it < currentSessions.end(); ++it) + { + FriendSessionInfo *sessionInfo = *it; + HXUIBRUSH hXuiBrush; + CXuiCtrl4JList::LIST_ITEM_INFO ListInfo; + + ZeroMemory(&ListInfo,sizeof(CXuiCtrl4JList::LIST_ITEM_INFO)); + + ListInfo.pwszText = sessionInfo->displayLabel; + ListInfo.fEnabled = TRUE; + ListInfo.iData = sessionIndex; + m_pGamesList->AddData(ListInfo); + // display an icon too + + // Is this a default game or a texture pack game? + if(sessionInfo->data.texturePackParentId!=0) + { + // Do we have the texture pack + Minecraft *pMinecraft = Minecraft::GetInstance(); + TexturePack *tp = pMinecraft->skins->getTexturePackById(sessionInfo->data.texturePackParentId); + HRESULT hr; + + DWORD dwImageBytes=0; + PBYTE pbImageData=NULL; + + if(tp==NULL) + { + DWORD dwBytes=0; + PBYTE pbData=NULL; + app.GetTPD(sessionInfo->data.texturePackParentId,&pbData,&dwBytes); + + // is it in the tpd data ? + app.GetFileFromTPD(eTPDFileType_Icon,pbData,dwBytes,&pbImageData,&dwImageBytes ); + if(dwImageBytes > 0 && pbImageData) + { + hr=XuiCreateTextureBrushFromMemory(pbImageData,dwImageBytes,&hXuiBrush); + m_pGamesList->UpdateGraphic(sessionIndex,hXuiBrush); + } + } + else + { + pbImageData = tp->getPackIcon(dwImageBytes); + if(dwImageBytes > 0 && pbImageData) + { + hr=XuiCreateTextureBrushFromMemory(pbImageData,dwImageBytes,&hXuiBrush); + m_pGamesList->UpdateGraphic(sessionIndex,hXuiBrush); + } + } + } + else + { + // default texture pack + XuiCreateTextureBrushFromMemory(m_DefaultMinecraftIconData,m_DefaultMinecraftIconSize,&hXuiBrush); + m_pGamesList->UpdateGraphic(sessionIndex,hXuiBrush); + } + + + if(memcmp( &selectedSessionId, &sessionInfo->sessionId, sizeof(SessionID) ) == 0) + { + m_pGamesList->SetCurSel(sessionIndex); + break; + } + ++sessionIndex; + } + } +} + +void CScene_MultiGameJoinLoad::UpdateGamesList(DWORD dwNumResults, IQNetGameSearch *pGameSearch) +{ + // We don't use the QNet callback, but could resurrect this if we ever do normal matchmaking, but updated to work as the function above +#if 0 + const XSESSION_SEARCHRESULT *pSearchResult; + const XNQOSINFO * pxnqi; + + if(m_searches>0) + --m_searches; + + if(m_searches==0) + { + m_NetGamesListTimer.SetShow( FALSE ); + + // if the saves list has focus, then we should show the Delete Save tooltip + // if the games list has focus, then we should show the View Gamercard tooltip + int iRB=-1; + int iY = -1; + + if( DoesGamesListHaveFocus() ) + { + iY = IDS_TOOLTIPS_VIEW_GAMERCARD; + } + else if(DoesSavesListHaveFocus()) + { + iRB=IDS_TOOLTIPS_DELETESAVE; + } + + int iLB = -1; + if(m_bInParty) + { + if( m_bShowingPartyGamesOnly ) iLB = IDS_TOOLTIPS_ALL_GAMES + else iLB = IDS_TOOLTIPS_PARTY_GAMES; + } + + if(ProfileManager.IsFullVersion()==false ) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, -1, iY,-1,-1,iLB,iRB); + } + else if(StorageManager.GetSaveDisabled()) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,IDS_TOOLTIPS_SELECTDEVICE,iY,-1,-1,iLB,iRB); + } + else + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, IDS_TOOLTIPS_CHANGEDEVICE, iY,-1,-1,iLB,iRB); + } + } + + if( dwNumResults == 0 ) + { + if(m_searches==0 && m_GamesList.GetItemCount() == 0) + { + m_LabelNoGames.SetShow( TRUE ); + } + return; + } + + unsigned int startOffset = m_GamesList.GetItemCount(); + //m_GamesList.InsertItems(startOffset,dwNumResults); + //m_GamesList.SetEnable(TRUE); + //XuiElementSetDisableFocusRecursion( m_GamesList.m_hObj, FALSE); + + // Loop through all the results. + for( DWORD dwResult = 0; dwResult < pGameSearch->GetNumResults(); dwResult++ ) + { + + pSearchResult = pGameSearch->GetSearchResultAtIndex( dwResult ); + + // No room for us, so ignore it + if(pSearchResult->dwOpenPublicSlots < m_localPlayers) + continue; + + FriendSessionInfo *sessionInfo = NULL; + bool foundSession = false; + for(AUTO_VAR(it, friendsSessions.begin()); it < friendsSessions.end(); ++it) + { + sessionInfo = *it; + if(memcmp( &pSearchResult->info.sessionID, &sessionInfo->sessionId, sizeof(SessionID) ) == 0) + { + sessionInfo->searchResult = *pSearchResult; + sessionInfo->displayLabel = new wchar_t[100]; + foundSession = true; + break; + } + } + + // We received a search result for a session no longer in our list of friends sessions + if(!foundSession) + continue; + + // Print some info about this result. + //printf( "Search result %u:\n", dwResult ); + //printf( " public slots open = %u, filled = %u\n", pSearchResult->dwOpenPublicSlots, pSearchResult->dwFilledPublicSlots ); + //printf( " private slots open = %u, filled = %u\n", pSearchResult->dwOpenPrivateSlots, pSearchResult->dwFilledPrivateSlots ); + + // See if this result was contacted successfully via QoS probes. + pxnqi = pGameSearch->GetQosInfoAtIndex( dwResult ); + if( pxnqi->bFlags & XNET_XNQOSINFO_TARGET_CONTACTED ) + { + // Print the round trip time and the rough estimation of + // bandwidth. + app.DebugPrintf( " RTT min = %u, med = %u\n", pxnqi->wRttMinInMsecs, pxnqi->wRttMedInMsecs ); + app.DebugPrintf( " bps up = %u, down = %u\n", pxnqi->dwUpBitsPerSec, pxnqi->dwDnBitsPerSec ); + + if(pxnqi->cbData > 0) + { + sessionInfo->data = *(GameSessionData *)pxnqi->pbData; + + wstring gamerName = convStringToWstring(sessionInfo->data.hostName); + swprintf(sessionInfo->displayLabel,L"%ls's Game", gamerName.c_str() ); + } + else + { + swprintf(sessionInfo->displayLabel,L"Unknown host Game"); + } + + // If this host wasn't disabled use this one. + if( !( pxnqi->bFlags & XNET_XNQOSINFO_TARGET_DISABLED ) && sessionInfo->data.netVersion == MINECRAFT_NET_VERSION ) + { + //printf("This game is valid\n"); + filteredResults.push_back(sessionInfo); + m_GamesList.InsertItems(startOffset,1); + m_GamesList.SetText(startOffset,sessionInfo->displayLabel); + startOffset++; + } +#ifndef _CONTENT_PACKAGE + if( sessionInfo->data.netVersion != MINECRAFT_NET_VERSION ) + { + wprintf(L"%ls version of %d does not match our version of %d\n", sessionInfo->displayLabel, sessionInfo->data.netVersion, MINECRAFT_NET_VERSION); + } +#endif + } + } + + if( m_GamesList.GetItemCount() == 0) + { + m_LabelNoGames.SetShow( TRUE ); + } + else + { + m_GamesList.SetEnable(TRUE); + XuiElementSetDisableFocusRecursion( m_GamesList.m_hObj, FALSE); + if( DoesGamesListHaveFocus() ) + { + m_GamesList.SetCurSel(0); + } + } +#endif +} + +/*void CScene_MultiGameJoinLoad::UpdateGamesListLabels() +{ + for( unsigned int i = 0; i < currentSessions.size(); ++i ) + { + FriendSessionInfo *sessionInfo = currentSessions.at(i); + m_GamesList.SetText(i,sessionInfo->displayLabel); + HXUIBRUSH hBrush; + CXuiCtrl4JList::LIST_ITEM_INFO info = m_pGamesList->GetData(i); + + // display an icon too + XuiCreateTextureBrushFromMemory(m_DefaultMinecraftIconData,m_DefaultMinecraftIconSize,&hBrush); + m_pGamesList->UpdateGraphic(i,hBrush); + } +#if 0 + XUIRect xuiRect; + HXUIOBJ item = XuiListGetItemControl(m_GamesList,0); + + HXUIOBJ hObj=NULL; + HXUIOBJ hTextPres=NULL; + HRESULT hr=XuiControlGetVisual(item,&hObj); + hr=XuiElementGetChildById(hObj,L"text_Label",&hTextPres); + + unsigned char displayLabelViewableStartIndex = 0; + for( unsigned int i = 0; i < currentSessions.size(); ++i ) + { + FriendSessionInfo *sessionInfo = currentSessions.at(i); + + if(hTextPres != NULL ) + { + hr=XuiTextPresenterMeasureText(hTextPres, sessionInfo->displayLabel, &xuiRect); + + float fWidth, fHeight; + XuiElementGetBounds(hTextPres,&fWidth,&fHeight); + int characters = (fWidth/xuiRect.right) * sessionInfo->displayLabelLength; + + if( characters < sessionInfo->displayLabelLength ) + { + static wchar_t temp[100]; + ZeroMemory(temp, (100)*sizeof(wchar_t)); + wcsncpy_s( temp, sessionInfo->displayLabel+sessionInfo->displayLabelViewableStartIndex, characters ); + m_GamesList.SetText(i,temp); + sessionInfo->displayLabelViewableStartIndex++; + if( sessionInfo->displayLabelViewableStartIndex >= sessionInfo->displayLabelLength ) sessionInfo->displayLabelViewableStartIndex = 0; + } + } + } +#endif +}*/ + +void CScene_MultiGameJoinLoad::SearchForGameCallback(void *param, DWORD dwNumResults, IQNetGameSearch *pGameSearch) +{ +#if 0 + HXUIOBJ hObj = (HXUIOBJ)param; + + void *pObj; + XuiObjectFromHandle( hObj, &pObj); + CScene_MultiGameJoinLoad *MultiGameJoinLoad = (CScene_MultiGameJoinLoad *)pObj; + + MultiGameJoinLoad->UpdateGamesList(dwNumResults, pGameSearch); +#endif +} + +int CScene_MultiGameJoinLoad::DeviceSelectReturned(void *pParam,bool bContinue) +{ + CScene_MultiGameJoinLoad* pClass = (CScene_MultiGameJoinLoad*)pParam; + //HRESULT hr; + + if(bContinue==true) + { + // if the saves list has focus, then we should show the Delete Save tooltip + // if the games list has focus, then we should show the View Gamercard tooltip + int iRB=-1; + int iY = -1; + if( pClass->DoesGamesListHaveFocus() ) + { + iY = IDS_TOOLTIPS_VIEW_GAMERCARD; + } + else if(pClass->DoesSavesListHaveFocus()) + { + if(ProfileManager.IsSignedInLive( pClass->m_iPad )) + { + iY=IDS_TOOLTIPS_UPLOAD_SAVE_FOR_XBOXONE; + } + if(StorageManager.GetSaveDisabled()) + { + iRB=IDS_TOOLTIPS_DELETESAVE; + } + else + { + if(StorageManager.EnoughSpaceForAMinSaveGame()) + { + iRB=IDS_TOOLTIPS_SAVEOPTIONS; + } + else + { + iRB=IDS_TOOLTIPS_DELETESAVE; + } + } + } + else if(pClass->DoesMashUpWorldHaveFocus()) + { + // If it's a mash-up pack world, give the Hide option + iRB=IDS_TOOLTIPS_HIDE; + } + + int iLB = -1; + if(pClass->m_bInParty) + { + if( pClass->m_bShowingPartyGamesOnly ) iLB = IDS_TOOLTIPS_ALL_GAMES; + else iLB = IDS_TOOLTIPS_PARTY_GAMES; + } + + //BOOL bOnlineGame=pClass->m_CheckboxOnline.IsChecked(); + + // refresh the saves list (if there is a device selected) + + // clear out the list first + + if(StorageManager.GetSaveDisabled()) + { + if(StorageManager.GetSaveDeviceSelected(pClass->m_iPad)) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,IDS_TOOLTIPS_CHANGEDEVICE,iY,-1,-1,iLB,iRB); + // saving is disabled, but we should still be able to load from a selected save device + pClass->GetSaveInfo(); + } + else + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,IDS_TOOLTIPS_SELECTDEVICE,iY,-1,-1,iLB,iRB); + // clear the saves list + pClass->m_pSavesList->RemoveAllData(); + + pClass->m_iSaveInfoC=0; + //pClass->m_iThumbnailsLoadedC=0; + + pClass->AddDefaultButtons(); + + pClass->m_SavesListTimer.SetShow( FALSE ); + + pClass->m_pSavesList->SetCurSelVisible(0); + } + } + else + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,IDS_TOOLTIPS_CHANGEDEVICE,iY,-1,-1,iLB,iRB); + pClass->GetSaveInfo(); + } + } + + // enable input again + pClass->m_bIgnoreInput=false; + + return 0; +} + +HRESULT CScene_MultiGameJoinLoad::OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ) +{ + // 4J-PB - TODO - Don't think we can do this - if a 2nd player signs in here with an offline profile, the signed in LIVE player gets re-logged in, and bMultiplayerAllowed is false briefly + switch(pTimer->nId) + { + + + case JOIN_LOAD_ONLINE_TIMER_ID: + { + XPARTY_USER_LIST partyList; + + if((XPartyGetUserList( &partyList ) != XPARTY_E_NOT_IN_PARTY ) && (partyList.dwUserCount>1)) + { + m_bInParty=true; + } + else + { + m_bInParty=false; + } + + bool bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_iPad); + if(bMultiplayerAllowed != m_bMultiplayerAllowed) + { + if( bMultiplayerAllowed ) + { +// m_CheckboxOnline.SetEnable(TRUE); +// m_CheckboxPrivate.SetEnable(TRUE); + } + else + { + m_bInParty = false; + m_pGamesList->RemoveAllData(); + //m_GamesList.DeleteItems(0, m_GamesList.GetItemCount() ); + m_pGamesList->SetEnable(FALSE); + //XuiElementSetDisableFocusRecursion( m_pGamesList->m_hObj, TRUE); + m_NetGamesListTimer.SetShow( TRUE ); + m_LabelNoGames.SetShow( FALSE ); + } + + int iLB = -1; + if(m_bInParty) + { + if( m_bShowingPartyGamesOnly ) iLB = IDS_TOOLTIPS_ALL_GAMES; + else iLB = IDS_TOOLTIPS_PARTY_GAMES; + } + int iRB=-1; + int iY=-1; + + if( DoesGamesListHaveFocus() ) + { + } + else if(DoesSavesListHaveFocus()) + { + if(ProfileManager.IsSignedInLive( m_iPad )) + { + iY=IDS_TOOLTIPS_UPLOAD_SAVE_FOR_XBOXONE; + } + + if(StorageManager.GetSaveDisabled()) + { + iRB=IDS_TOOLTIPS_DELETESAVE; + } + else + { + if(StorageManager.EnoughSpaceForAMinSaveGame()) + { + iRB=IDS_TOOLTIPS_SAVEOPTIONS; + } + else + { + iRB=IDS_TOOLTIPS_DELETESAVE; + } + } + } + else if(DoesMashUpWorldHaveFocus()) + { + // If it's a mash-up pack world, give the Hide option + iRB=IDS_TOOLTIPS_HIDE; + } + + if(ProfileManager.IsFullVersion()==false ) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, -1, -1,-1,-1,iLB); + } + else if(StorageManager.GetSaveDisabled()) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,IDS_TOOLTIPS_SELECTDEVICE,-1,-1,-1,iLB,iRB); + } + else + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, IDS_TOOLTIPS_CHANGEDEVICE,iY,-1,-1,iLB,iRB); + } + m_bMultiplayerAllowed = bMultiplayerAllowed; + } + } + break; + case JOIN_LOAD_SEARCH_MINIMUM_TIMER_ID: + { + XuiKillTimer( m_hObj, JOIN_LOAD_SEARCH_MINIMUM_TIMER_ID ); + m_NetGamesListTimer.SetShow( FALSE ); + m_LabelNoGames.SetShow( TRUE ); + } + break; + case JOIN_LOAD_SCROLL_GAME_NAMES_TIMER_ID: + { + // This is called by the gameslist callback function, so isn't needed on a timer + //UpdateGamesListLabels(); + } + break; + case CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID: + { + // also check for any new texture packs info being available + // for each item in the mem list, check it's in the data list + + //CXuiCtrl4JList::LIST_ITEM_INFO ListInfo; + // for each iConfig, check if the data is available, and add it to the List, then remove it from the viConfig + + for(int i=0;i 0 && pbData) + { + //update the games list + UpdateGamesList(); + + m_iConfigA[i]=-1; + } + } + } + bool bAllDone=true; + for(int i=0;im_bIgnoreInput=false; + } + return 0; +} +*/ + +int CScene_MultiGameJoinLoad::StartGame_SignInReturned(void *pParam,bool bContinue, int iPad) +{ + CScene_MultiGameJoinLoad* pClass = (CScene_MultiGameJoinLoad*)pParam; + + if(bContinue==true) + { + // It's possible that the player has not signed in - they can back out + if(ProfileManager.IsSignedIn(iPad)) + { + DWORD dwLocalUsersMask = 0; + + for(unsigned int index = 0; index < XUSER_MAX_COUNT; ++index) + { + if(ProfileManager.IsSignedIn(index) ) + { + dwLocalUsersMask |= CGameNetworkManager::GetLocalPlayerMask(index); + } + } + StartGameFromSave(pClass, dwLocalUsersMask); + } + } + else + { + pClass->m_bIgnoreInput=false; + } + return 0; +} + +// 4J Stu - Shared functionality that is the same whether we needed a quadrant sign-in or not +void CScene_MultiGameJoinLoad::StartGameFromSave(CScene_MultiGameJoinLoad* pClass, DWORD dwLocalUsersMask) +{ + /*bool isClientSide = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && pClass->m_CheckboxOnline.IsChecked() == TRUE; + //bool isPrivate = pClass->m_CheckboxPrivate.IsChecked() == TRUE; + + SenStatGameEvent(ProfileManager.GetPrimaryPad(),eTelemetryGameEvent_Load,Minecraft::GetInstance()->options->difficulty, isClientSide, ProfileManager.IsFullVersion(), 1,0 ); + + g_NetworkManager.HostGame(dwLocalUsersMask,isClientSide,isPrivate,MINECRAFT_NET_MAX_PLAYERS,0); + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc; + loadingParams->lpParam = NULL; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + + app.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams);*/ +} + +int CScene_MultiGameJoinLoad::DeleteSaveDataReturned(void *pParam,bool bSuccess) +{ + CScene_MultiGameJoinLoad* pClass = (CScene_MultiGameJoinLoad*)pParam; + + if(bSuccess==true) + { + // need to re-get the saves list and update the display + // clear the saves list + pClass->m_pSavesList->RemoveAllData(); + pClass->m_iSaveInfoC=0; + pClass->GetSaveInfo(); + } + + pClass->m_bIgnoreInput=false; + + return 0; +} + +void CScene_MultiGameJoinLoad::LoadLevelGen(LevelGenerationOptions *levelGen) +{ + // Load data from disc + //File saveFile( L"Tutorial\\Tutorial" ); + //LoadSaveFromDisk(&saveFile); + + // clear out the app's terrain features list + app.ClearTerrainFeaturePosition(); + + StorageManager.ResetSaveData(); + // Make our next save default to the name of the level + StorageManager.SetSaveTitle(levelGen->getDefaultSaveName().c_str()); + + bool isClientSide = false; + bool isPrivate = false; + int maxPlayers = MINECRAFT_NET_MAX_PLAYERS; + + if( app.GetTutorialMode() ) + { + isClientSide = false; + maxPlayers = 4; + } + + g_NetworkManager.HostGame(0,isClientSide,isPrivate,maxPlayers,0); + + NetworkGameInitData *param = new NetworkGameInitData(); + param->seed = 0; + param->saveData = NULL; + param->settings = app.GetGameHostOption( eGameHostOption_Tutorial ); + param->levelGen = levelGen; + + if(levelGen->requiresTexturePack()) + { + param->texturePackId = levelGen->getRequiredTexturePackId(); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + pMinecraft->skins->selectTexturePackById(param->texturePackId); + //pMinecraft->skins->updateUI(); + } + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc; + loadingParams->lpParam = (LPVOID)param; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + + app.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); +} + +void CScene_MultiGameJoinLoad::LoadSaveFromDisk(File *saveFile) +{ + // we'll only be coming in here when the tutorial is loaded now + + StorageManager.ResetSaveData(); + + // Make our next save default to the name of the level + StorageManager.SetSaveTitle(saveFile->getName().c_str()); + + __int64 fileSize = saveFile->length(); + FileInputStream fis(*saveFile); + byteArray ba(fileSize); + fis.read(ba); + fis.close(); + + bool isClientSide = false; + bool isPrivate = false; + int maxPlayers = MINECRAFT_NET_MAX_PLAYERS; + + if( app.GetTutorialMode() ) + { + isClientSide = false; + maxPlayers = 4; + } + + app.SetGameHostOption(eGameHostOption_GameType,GameType::CREATIVE->getId()); + + g_NetworkManager.HostGame(0,isClientSide,isPrivate,maxPlayers,0); + + LoadSaveDataThreadParam *saveData = new LoadSaveDataThreadParam(ba.data, ba.length, saveFile->getName()); + + NetworkGameInitData *param = new NetworkGameInitData(); + param->seed = 0; + param->saveData = saveData; + param->settings = app.GetGameHostOption( eGameHostOption_All ); + + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc; + loadingParams->lpParam = (LPVOID)param; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; + completionData->iPad = DEFAULT_XUI_MENU_USER; + loadingParams->completionData = completionData; + + app.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); +} + +int CScene_MultiGameJoinLoad::DeleteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + CScene_MultiGameJoinLoad* pClass = (CScene_MultiGameJoinLoad*)pParam; + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { + if(app.DebugSettingsOn() && app.GetLoadSavesFromFolderEnabled()) + { + pClass->m_bIgnoreInput=false; + } + else + { + XCONTENT_DATA XContentData; + StorageManager.GetSaveCacheFileInfo(pClass->m_iChangingSaveGameInfoIndex-pClass->m_iDefaultButtonsC,XContentData); + StorageManager.DeleteSaveData(&XContentData,CScene_MultiGameJoinLoad::DeleteSaveDataReturned,pClass); + pClass->m_SavesListTimer.SetShow( TRUE ); + } + } + else + { + pClass->m_bIgnoreInput=false; + } + return 0; +} + +int CScene_MultiGameJoinLoad::SaveTransferDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + CScene_MultiGameJoinLoad* pClass = (CScene_MultiGameJoinLoad*)pParam; + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultAccept) + { + // upload the save + + // first load the save + int iIndex=pClass->m_pSavesList->GetData(pClass->m_pSavesList->GetCurSel()).iIndex-pClass->m_iDefaultButtonsC; + XCONTENT_DATA ContentData; + + // 4J-PB - ensure we've switched to the right title group id for uploading to + app.TMSPP_SetTitleGroupID(SAVETRANSFER_GROUP_ID); + StorageManager.GetSaveCacheFileInfo(iIndex,ContentData); + C4JStorage::ELoadGameStatus eLoadStatus=StorageManager.LoadSaveData(&ContentData,CScene_MultiGameJoinLoad::LoadSaveDataReturned,pClass); + + pClass->m_bIgnoreInput=false; + } + else + { + pClass->m_bIgnoreInput=false; + } + return 0; +} + +int CScene_MultiGameJoinLoad::UploadSaveForXboxOneThreadProc( LPVOID lpParameter ) +{ + CScene_MultiGameJoinLoad* pClass = (CScene_MultiGameJoinLoad *) lpParameter; + Minecraft *pMinecraft = Minecraft::GetInstance(); + + pMinecraft->progressRenderer->progressStart(IDS_SAVE_TRANSFER_TITLE); + pMinecraft->progressRenderer->progressStage( IDS_SAVE_TRANSFER_UPLOADING ); + + // Delete the marker file + DeleteFile(pClass, "completemarker"); + if(!WaitForTransferComplete(pClass)) return 0; + + // Upload the save data + { + unsigned int uiSaveBytes; + uiSaveBytes=StorageManager.GetSaveSize(); + pClass->m_pbSaveTransferData=new BYTE [uiSaveBytes]; + + StorageManager.GetSaveData(pClass->m_pbSaveTransferData,&uiSaveBytes); + + app.DebugPrintf("Uploading save data (%d bytes)\n", uiSaveBytes); + UploadFile(pClass, "savedata", pClass->m_pbSaveTransferData, uiSaveBytes); + } + + if(!WaitForTransferComplete(pClass)) return 0; + if(pClass->m_bTransferFail) + { + // something went wrong, user has been informed + pMinecraft->progressRenderer->progressStage( IDS_SAVE_TRANSFER_UPLOADFAILED ); + return 0; + } + + // Upload the metadata and thumbnail + { + ByteArrayOutputStream baos; + DataOutputStream dos(&baos); + + LPCWSTR title = StorageManager.GetSaveTitle(); + dos.writeUTF(title); + + char szUniqueMapName[14]; + StorageManager.GetSaveUniqueFilename(szUniqueMapName); + dos.writeUTF(convStringToWstring(szUniqueMapName)); + + { + // set the save icon + PBYTE pbImageData=NULL; + DWORD dwImageBytes=0; + XCONTENT_DATA XContentData; + int iIndex=pClass->m_pSavesList->GetData(pClass->m_pSavesList->GetCurSel()).iIndex-pClass->m_iDefaultButtonsC; + StorageManager.GetSaveCacheFileInfo(iIndex,XContentData); + StorageManager.GetSaveCacheFileInfo(iIndex,&pbImageData,&dwImageBytes); + + // if there is no thumbnail, retrieve the default one from the file. + // Don't delete the image data after creating the xuibrush, since we'll use it in the rename of the save + if(pbImageData==NULL) + { + DWORD dwResult=XContentGetThumbnail(ProfileManager.GetPrimaryPad(),&XContentData,NULL,&dwImageBytes,NULL); + if(dwResult==ERROR_SUCCESS) + { + pClass->m_pbSaveTransferData = new BYTE[dwImageBytes]; + pbImageData = pClass->m_pbSaveTransferData; // Copy pointer so that we can use the same name as the library owned one, but m_pbSaveTransferData will get deleted when done + XContentGetThumbnail(ProfileManager.GetPrimaryPad(),&XContentData,pbImageData,&dwImageBytes,NULL); + } + } + + dos.writeInt(dwImageBytes); + + byteArray ba(pbImageData, dwImageBytes); + dos.write(ba); + } + + pClass->m_pbSaveTransferData=new BYTE [baos.size()]; + memcpy(pClass->m_pbSaveTransferData,baos.buf.data,baos.size()); + + app.DebugPrintf("Uploading meta data (%d bytes)\n", baos.size()); + UploadFile(pClass, "metadata", pClass->m_pbSaveTransferData, baos.size()); + } + + // Wait for metadata and thumbnail + if(!WaitForTransferComplete(pClass)) return 0; + if(pClass->m_bTransferFail) + { + // something went wrong, user has been informed + pMinecraft->progressRenderer->progressStage( IDS_SAVE_TRANSFER_UPLOADFAILED ); + return 0; + } + + // Upload the marker file + { + char singleByteData[1] = {1}; + app.DebugPrintf("Uploading marker (%d bytes)\n", 1); + UploadFile(pClass, "completemarker", &singleByteData, 1); + } + + // Wait for marker + if(!WaitForTransferComplete(pClass)) return 0; + if(pClass->m_bTransferFail) + { + // something went wrong, user has been informed + pMinecraft->progressRenderer->progressStage( IDS_SAVE_TRANSFER_UPLOADFAILED ); + + return 0; + } + // change text for completion confirmation + pMinecraft->progressRenderer->progressStage( IDS_SAVE_TRANSFER_UPLOADCOMPLETE ); + + // done + return 0; +} + +void CScene_MultiGameJoinLoad::DeleteFile(CScene_MultiGameJoinLoad *pClass, char *filename) +{ + pClass->m_fProgress=0.0f; + pClass->m_bTransferComplete=false; + + C4JStorage::ETMSStatus result = StorageManager.TMSPP_DeleteFile( + ProfileManager.GetPrimaryPad(), + filename, + C4JStorage::TMS_FILETYPE_BINARY, + &CScene_MultiGameJoinLoad::DeleteComplete, + pClass, + NULL); + + if(result != C4JStorage::ETMSStatus_DeleteInProgress) + { + DeleteComplete(pClass,ProfileManager.GetPrimaryPad(), -1); + } +} + +void CScene_MultiGameJoinLoad::UploadFile(CScene_MultiGameJoinLoad *pClass, char *filename, LPVOID data, DWORD size) +{ + pClass->m_fProgress=0.0f; + pClass->m_bTransferComplete=false; + + C4JStorage::ETMSStatus result = StorageManager.TMSPP_WriteFileWithProgress( + ProfileManager.GetPrimaryPad(), + C4JStorage::eGlobalStorage_TitleUser, + C4JStorage::TMS_FILETYPE_BINARY, + C4JStorage::TMS_UGCTYPE_NONE, + filename, + (CHAR *)data, + size, + &CScene_MultiGameJoinLoad::TransferComplete,pClass, 0, + &CScene_MultiGameJoinLoad::Progress,pClass); + +#ifdef _DEBUG_MENUS_ENABLED + if(app.GetWriteSavesToFolderEnabled()) + { + File targetFileDir(L"GAME:\\FakeTMSPP"); + if(!targetFileDir.exists()) targetFileDir.mkdir(); + string path = string( wstringtofilename( targetFileDir.getPath() ) ).append("\\").append(filename); + HANDLE hSaveFile = CreateFile( path.c_str(), GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_FLAG_RANDOM_ACCESS, NULL); + + DWORD numberOfBytesWritten = 0; + WriteFile( hSaveFile,data,size,&numberOfBytesWritten,NULL); + assert(numberOfBytesWritten == size); + + CloseHandle(hSaveFile); + } +#endif + + if(result != C4JStorage::ETMSStatus_WriteInProgress) + { + TransferComplete(pClass,ProfileManager.GetPrimaryPad(), -1); + } +} + +bool CScene_MultiGameJoinLoad::WaitForTransferComplete( CScene_MultiGameJoinLoad *pClass ) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + // loop until complete + while(pClass->m_bTransferComplete==false) + { + // check for a cancel + if(pClass->m_bSaveTransferInProgress==false) + { + // cancelled + return false; + } + Sleep(50); + // update the progress + pMinecraft->progressRenderer->progressStagePercentage((unsigned int)(pClass->m_fProgress*100.0f)); + } + + // was there a transfer error? + + return true; +} + +int CScene_MultiGameJoinLoad::SaveOptionsDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + CScene_MultiGameJoinLoad* pClass = (CScene_MultiGameJoinLoad*)pParam; + + // results switched for this dialog + // EMessage_ResultAccept means cancel + if(result==C4JStorage::EMessage_ResultDecline || result==C4JStorage::EMessage_ResultThirdOption) + { + if(result==C4JStorage::EMessage_ResultDecline) // rename + { + ZeroMemory(pClass->m_wchNewName,sizeof(WCHAR)*XCONTENT_MAX_DISPLAYNAME_LENGTH); + // bring up a keyboard + InputManager.RequestKeyboard(IDS_RENAME_WORLD_TITLE,L"",IDS_RENAME_WORLD_TEXT,iPad,pClass->m_wchNewName,XCONTENT_MAX_DISPLAYNAME_LENGTH,&CScene_MultiGameJoinLoad::KeyboardReturned,pClass,C_4JInput::EKeyboardMode_Default,app.GetStringTable()); + } + else // delete + { + // delete the save game + // Have to ask the player if they are sure they want to delete this game + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + StorageManager.RequestMessageBox(IDS_TOOLTIPS_DELETESAVE, IDS_TEXT_DELETE_SAVE, uiIDA, 2, iPad,&CScene_MultiGameJoinLoad::DeleteSaveDialogReturned,pClass, app.GetStringTable()); + //pClass->m_bIgnoreInput=false; + } + } + else + { + pClass->m_bIgnoreInput=false; + } + return 0; +} + +int CScene_MultiGameJoinLoad::LoadSaveDataReturned(void *pParam,bool bContinue) +{ + CScene_MultiGameJoinLoad* pClass = (CScene_MultiGameJoinLoad*)pParam; + + if(bContinue==true) + { + pClass->m_bSaveTransferInProgress=true; + LoadingInputParams *loadingParams = new LoadingInputParams(); + loadingParams->func = &CScene_MultiGameJoinLoad::UploadSaveForXboxOneThreadProc; + loadingParams->lpParam = (LPVOID)pParam; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->type = e_ProgressCompletion_NavigateBack; + completionData->iPad = DEFAULT_XUI_MENU_USER; + completionData->bRequiresUserAction=TRUE; + loadingParams->completionData = completionData; + + loadingParams->cancelFunc=&CScene_MultiGameJoinLoad::CancelSaveUploadCallback; + loadingParams->completeFunc=&CScene_MultiGameJoinLoad::SaveUploadCompleteCallback; + loadingParams->m_cancelFuncParam=pClass; + loadingParams->m_completeFuncParam=pClass; + loadingParams->cancelText=IDS_TOOLTIPS_CANCEL; + + app.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); + } + else + { + // switch back to the normal title group id + app.TMSPP_SetTitleGroupID(GROUP_ID); + + // the save is corrupt! + + pClass->SetShow( TRUE ); + pClass->m_bIgnoreInput=false; + + // give the option to delete the save + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + StorageManager.RequestMessageBox(IDS_CORRUPT_OR_DAMAGED_SAVE_TITLE, IDS_CORRUPT_OR_DAMAGED_SAVE_TEXT, uiIDA, 2, + pClass->m_iPad,&CScene_MultiGameJoinLoad::DeleteSaveDialogReturned,pClass, app.GetStringTable()); + + } + + return 0; +} + +int CScene_MultiGameJoinLoad::Progress(void *pParam,float fProgress) +{ + CScene_MultiGameJoinLoad* pClass = (CScene_MultiGameJoinLoad*)pParam; + + app.DebugPrintf("Progress - %f\n",fProgress); + pClass->m_fProgress=fProgress; + return 0; +} + +int CScene_MultiGameJoinLoad::TransferComplete(void *pParam,int iPad, int iResult) +{ + CScene_MultiGameJoinLoad* pClass = (CScene_MultiGameJoinLoad*)pParam; + + delete [] pClass->m_pbSaveTransferData; + pClass->m_pbSaveTransferData = NULL; + if(iResult!=0) + { + // There was a transfer fail + // Display a dialog + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + StorageManager.RequestMessageBox(IDS_SAVE_TRANSFER_TITLE, IDS_SAVE_TRANSFER_UPLOADFAILED, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,NULL,app.GetStringTable()); + pClass->m_bTransferFail=true; + } + else + { + pClass->m_bTransferFail=false; + } + pClass->m_bTransferComplete=true; + //pClass->m_bSaveTransferInProgress=false; + return 0; +} + +int CScene_MultiGameJoinLoad::DeleteComplete(void *pParam,int iPad, int iResult) +{ + CScene_MultiGameJoinLoad* pClass = (CScene_MultiGameJoinLoad*)pParam; + pClass->m_bTransferComplete=true; + return 0; +} + +int CScene_MultiGameJoinLoad::KeyboardReturned(void *pParam,bool bSet) +{ + CScene_MultiGameJoinLoad* pClass = (CScene_MultiGameJoinLoad*)pParam; + HRESULT hr = S_OK; + + // if the user has left the name empty, treat this as backing out + if((pClass->m_wchNewName[0]!=0) && bSet) + { +#ifdef _XBOX + XCONTENT_DATA XContentData; + StorageManager.GetSaveCacheFileInfo(pClass->m_iChangingSaveGameInfoIndex-pClass->m_iDefaultButtonsC,XContentData); + + C4JStorage::ELoadGameStatus eLoadStatus=StorageManager.LoadSaveData(&XContentData,CScene_MultiGameJoinLoad::LoadSaveDataForRenameReturned,pClass); + + if(eLoadStatus==C4JStorage::ELoadGame_DeviceRemoved) + { + // disable saving + StorageManager.SetSaveDisabled(true); + StorageManager.SetSaveDeviceSelected(ProfileManager.GetPrimaryPad(),false); + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + StorageManager.RequestMessageBox(IDS_STORAGEDEVICEPROBLEM_TITLE, IDS_FAILED_TO_LOADSAVE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),&CScene_MultiGameJoinLoad::DeviceRemovedDialogReturned,pClass); + } +#else + // rename the save + +#endif + } + else + { + pClass->m_bIgnoreInput=false; + } + + return hr; +} + +int CScene_MultiGameJoinLoad::LoadSaveDataForRenameReturned(void *pParam,bool bContinue) +{ + CScene_MultiGameJoinLoad* pClass = (CScene_MultiGameJoinLoad*)pParam; +#ifdef _XBOX + if(bContinue==true) + { + // set the save icon + PBYTE pbImageData=NULL; + DWORD dwImageBytes=0; + HXUIBRUSH hXuiBrush; + XCONTENT_DATA XContentData; + StorageManager.GetSaveCacheFileInfo(pClass->m_iChangingSaveGameInfoIndex-pClass->m_iDefaultButtonsC,XContentData); + StorageManager.GetSaveCacheFileInfo(pClass->m_iChangingSaveGameInfoIndex-pClass->m_iDefaultButtonsC,&pbImageData,&dwImageBytes); + + // if there is no thumbnail, retrieve the default one from the file. + // Don't delete the image data after creating the xuibrush, since we'll use it in the rename of the save + if(pbImageData==NULL) + { + DWORD dwResult=XContentGetThumbnail(ProfileManager.GetPrimaryPad(),&XContentData,NULL,&dwImageBytes,NULL); + if(dwResult==ERROR_SUCCESS) + { + pbImageData = new BYTE[dwImageBytes]; + XContentGetThumbnail(ProfileManager.GetPrimaryPad(),&XContentData,pbImageData,&dwImageBytes,NULL); + XuiCreateTextureBrushFromMemory(pbImageData,dwImageBytes,&hXuiBrush); + } + } + else + { + XuiCreateTextureBrushFromMemory(pbImageData,dwImageBytes,&hXuiBrush); + } + // save the data with this icon + StorageManager.CopySaveDataToNewSave( pbImageData,dwImageBytes,pClass->m_wchNewName,&CScene_MultiGameJoinLoad::CopySaveReturned,pClass); + } + else +#endif + { + //pClass->SetShow( TRUE ); + pClass->m_bIgnoreInput=false; + } + return 0; +} + +int CScene_MultiGameJoinLoad::CopySaveReturned(void *pParam,bool bResult) +{ + CScene_MultiGameJoinLoad* pClass = (CScene_MultiGameJoinLoad*)pParam; +#ifdef _XBOX + if(bResult) + { + // and delete the old save + XCONTENT_DATA XContentData; + StorageManager.GetSaveCacheFileInfo(pClass->m_iChangingSaveGameInfoIndex-pClass->m_iDefaultButtonsC,XContentData); + StorageManager.DeleteSaveData(&XContentData,CScene_MultiGameJoinLoad::DeleteSaveDataReturned,pClass); + pClass->m_SavesListTimer.SetShow( TRUE ); + } + else +#endif + { + //pClass->SetShow( TRUE ); + pClass->m_bIgnoreInput=false; + } + + return 0; +} + +int CScene_MultiGameJoinLoad::TexturePackDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + CScene_MultiGameJoinLoad *pClass = (CScene_MultiGameJoinLoad *)pParam; + + // Exit with or without saving + // Decline means install full version of the texture pack in this dialog + if(result==C4JStorage::EMessage_ResultDecline || result==C4JStorage::EMessage_ResultAccept) + { + // we need to enable background downloading for the DLC + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); + + ULONGLONG ullOfferID_Full; + ULONGLONG ullIndexA[1]; + app.GetDLCFullOfferIDForPackID(pClass->m_initData->selectedSession->data.texturePackParentId,&ullOfferID_Full); + + if( result==C4JStorage::EMessage_ResultAccept ) // Full version + { + ullIndexA[0]=ullOfferID_Full; + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + + } + else // trial version + { + // if there is no trial version, this is a Cancel + DLC_INFO *pDLCInfo=app.GetDLCInfoForFullOfferID(ullOfferID_Full); + if(pDLCInfo->ullOfferID_Trial!=0LL) + { + ullIndexA[0]=pDLCInfo->ullOfferID_Trial; + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + } + } + } + pClass->m_bIgnoreInput=false; + return 0; +} + +HRESULT CScene_MultiGameJoinLoad::OnCustomMessage_DLCInstalled() +{ + // mounted DLC may have changed + + if(app.StartInstallDLCProcess(m_iPad)==false) + { + // not doing a mount, so re-enable input + m_bIgnoreInput=false; + } + else + { + m_bIgnoreInput=true; + // clear out the saves list and re-fill + + m_pSavesList->RemoveAllData(); + m_SavesListTimer.SetShow( TRUE ); + } + // this will send a CustomMessage_DLCMountingComplete when done + return S_OK; +} + +HRESULT CScene_MultiGameJoinLoad::OnCustomMessage_DLCMountingComplete() +{ + + VOID *pObj; + XuiObjectFromHandle( m_SavesList, &pObj ); + m_pSavesList = (CXuiCtrl4JList *)pObj; + + m_iChangingSaveGameInfoIndex = 0; + + m_generators = app.getLevelGenerators(); + m_iDefaultButtonsC = 0; + m_iMashUpButtonsC = 0; + XPARTY_USER_LIST partyList; + + if((XPartyGetUserList( &partyList ) != XPARTY_E_NOT_IN_PARTY ) && (partyList.dwUserCount>1)) + { + m_bInParty=true; + } + else + { + m_bInParty=false; + } + + int iLB = -1; + + int iY=-1; + if(DoesSavesListHaveFocus()) + { + if(ProfileManager.IsSignedInLive( m_iPad )) + { + iY=IDS_TOOLTIPS_UPLOAD_SAVE_FOR_XBOXONE; + } + } + if(m_bInParty) iLB = IDS_TOOLTIPS_PARTY_GAMES; + // check if we're in the trial version + if(ProfileManager.IsFullVersion()==false) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK, -1, -1, -1, -1,iLB); + + AddDefaultButtons(); + + m_pSavesList->SetCurSelVisible(0); + } + else if(StorageManager.GetSaveDisabled()) + { + if(StorageManager.GetSaveDeviceSelected(m_iPad)) + { + // saving is disabled, but we should still be able to load from a selected save device + + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,IDS_TOOLTIPS_CHANGEDEVICE,iY,-1,-1,iLB,IDS_TOOLTIPS_DELETESAVE); + + GetSaveInfo(); + } + else + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,IDS_TOOLTIPS_SELECTDEVICE,iY,-1,-1,iLB); + + AddDefaultButtons(); + m_SavesListTimer.SetShow( FALSE ); + + m_pSavesList->SetCurSelVisible(0); + } + } + else + { + // 4J-PB - we need to check that there is enough space left to create a copy of the save (for a rename) + bool bCanRename = StorageManager.EnoughSpaceForAMinSaveGame(); + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,IDS_TOOLTIPS_CHANGEDEVICE,iY,-1,-1,-1,bCanRename?IDS_TOOLTIPS_SAVEOPTIONS:IDS_TOOLTIPS_DELETESAVE); + + GetSaveInfo(); + } + + m_bIgnoreInput=false; + app.m_dlcManager.checkForCorruptDLCAndAlert(); + return S_OK; +} + +/* +void CScene_MultiGameJoinLoad::UpdateTooltips() +{ + int iA=IDS_TOOLTIPS_SELECT; + int iB=IDS_TOOLTIPS_BACK; + int iX=-1; + int iY=-1 + int iLB = -1; + XPARTY_USER_LIST partyList; + + if((XPartyGetUserList( &partyList ) != XPARTY_E_NOT_IN_PARTY ) && (partyList.dwUserCount>1)) + { + m_bInParty=true; + } + else + { + m_bInParty=false; + } + + if(m_bInParty) iLB = IDS_TOOLTIPS_PARTY_GAMES; + + if(ProfileManager.IsFullVersion()==false) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK, -1, -1, -1, -1,iLB); + } + else if(StorageManager.GetSaveDisabled()) + { + if(StorageManager.GetSaveDeviceSelected(m_iPad)) + { + // saving is disabled, but we should still be able to load from a selected save device + iX=IDS_TOOLTIPS_CHANGEDEVICE; + iRB=IDS_TOOLTIPS_DELETESAVE; + } + else + { + iX=IDS_TOOLTIPS_SELECTDEVICE; + } + } + else + { + // 4J-PB - we need to check that there is enough space left to create a copy of the save (for a rename) + bool bCanRename = StorageManager.EnoughSpaceForAMinSaveGame(); + + if(bCanRename) + { + iRB=IDS_TOOLTIPS_SAVEOPTIONS; + } + else + { + iRB=IDS_TOOLTIPS_DELETESAVE; + } + } + + ui.SetTooltips( DEFAULT_XUI_MENU_USER, iA,iB, iX, iY, iLT, iRT,iLB, iRB); +} +*/ + + + +#ifdef _XBOX +bool CScene_MultiGameJoinLoad::GetSavesInfoCallback(LPVOID pParam,int iTotalSaveInfoC, C4JStorage::CACHEINFOSTRUCT *InfoA, int iPad, HRESULT hResult) +{ + CScene_MultiGameJoinLoad *pClass=(CScene_MultiGameJoinLoad *)pParam; + CXuiCtrl4JList::LIST_ITEM_INFO ListInfo; + PBYTE pbImageData=(PBYTE)InfoA; + PBYTE pbCurrentImagePtr; + HXUIBRUSH hXuiBrush; + HRESULT hr; + + // move the image data pointer to the right place + if(iTotalSaveInfoC!=0) + { + pbImageData+=sizeof(C4JStorage::CACHEINFOSTRUCT)*iTotalSaveInfoC; + } + + pClass->m_SavesListTimer.SetShow( FALSE ); + pClass->m_SavesList.SetEnable(TRUE); + + pClass->AddDefaultButtons(); + + for(int i=0;im_pSavesList->AddData(ListInfo,-1); + + // update the graphic on the list item + + // if there is no thumbnail, this is a corrupt file + if(InfoA[i].dwImageBytes!=0) + { + pbCurrentImagePtr=pbImageData+InfoA[i].dwImageOffset; + hr=XuiCreateTextureBrushFromMemory(pbCurrentImagePtr,InfoA[i].dwImageBytes,&hXuiBrush); + pClass->m_pSavesList->UpdateGraphic(i+pClass->m_iDefaultButtonsC,hXuiBrush ); + } + else + { + // we could put in a damaged save icon here + const DWORD LOCATOR_SIZE = 256; // Use this to allocate space to hold a ResourceLocator string + WCHAR szResourceLocator[ LOCATOR_SIZE ]; + const ULONG_PTR c_ModuleHandle = (ULONG_PTR)GetModuleHandle(NULL); + + swprintf(szResourceLocator, LOCATOR_SIZE, L"section://%X,%ls#%ls",c_ModuleHandle,L"media", L"media/Graphics/MinecraftBrokenIcon.png"); + + XuiCreateTextureBrush(szResourceLocator,&hXuiBrush); + pClass->m_pSavesList->UpdateGraphic(i+pClass->m_iDefaultButtonsC,hXuiBrush ); + } + } + } + + pClass->m_iSaveInfoC=iTotalSaveInfoC; + + // If there are some saves, then set the focus to be on the most recent one, which will be the first one after the create and tutorial + if(iTotalSaveInfoC>0) + { + pClass->m_pSavesList->SetCurSelVisible(pClass->m_iDefaultButtonsC); + pClass->m_bReady=true; + } + + pClass->m_bRetrievingSaveInfo=false; + + // It's possible that the games list is updated but we haven't displayed it yet as we were still waiting on saves list to load + // This is to fix a bug where joining a game before the saves list has loaded causes a crash when this callback is called + // as the scene no longer exists + pClass->UpdateGamesList(); + + // Fix for #45154 - Frontend: DLC: Content can only be downloaded from the frontend if you have not joined/exited multiplayer + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_AUTO); + + return false; +} +#else +int CScene_MultiGameJoinLoad::GetSavesInfoCallback(LPVOID lpParam,const bool) +{ + return true; +} +#endif + +void CScene_MultiGameJoinLoad::CancelSaveUploadCallback(LPVOID lpParam) +{ + CScene_MultiGameJoinLoad* pClass = (CScene_MultiGameJoinLoad *) lpParam; + + StorageManager.TMSPP_CancelWriteFileWithProgress(pClass->m_iPad); + + pClass->m_bSaveTransferInProgress=false; + + // change back to the normal title group id + app.TMSPP_SetTitleGroupID(GROUP_ID); +// app.getRemoteStorage()->abort(); +// pClass->m_eSaveUploadState = eSaveUpload_Idle; + + UINT uiIDA[1] = { IDS_CONFIRM_OK }; + ui.RequestMessageBox(IDS_XBONE_CANCEL_UPLOAD_TITLE, IDS_XBONE_CANCEL_UPLOAD_TEXT, uiIDA, 1, pClass->m_iPad, NULL, NULL, app.GetStringTable()); +} + +void CScene_MultiGameJoinLoad::SaveUploadCompleteCallback(LPVOID lpParam) +{ + CScene_MultiGameJoinLoad* pClass = (CScene_MultiGameJoinLoad *) lpParam; + + pClass->m_bSaveTransferInProgress=false; + // change back to the normal title group id + app.TMSPP_SetTitleGroupID(GROUP_ID); + // app.getRemoteStorage()->abort(); + // pClass->m_eSaveUploadState = eSaveUpload_Idle; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_MultiGameJoinLoad.h b/Minecraft.Client/Common/XUI/XUI_MultiGameJoinLoad.h new file mode 100644 index 00000000..e91fbac2 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_MultiGameJoinLoad.h @@ -0,0 +1,168 @@ +#pragma once +using namespace std; +#include +#include "..\Media\xuiscene_multi_joinload.h" +#include "XUI_CustomMessages.h" + + +#define JOIN_LOAD_CREATE_BUTTON_INDEX 0 + +#define JOIN_LOAD_ONLINE_TIMER_ID 0 +#define JOIN_LOAD_ONLINE_TIMER_TIME 100 +#define JOIN_LOAD_SEARCH_MINIMUM_TIMER_ID 1 +#define JOIN_LOAD_SEARCH_MINIMUM_TIMER_TIME 2000 +#define JOIN_LOAD_SCROLL_GAME_NAMES_TIMER_ID 2 +#define JOIN_LOAD_SCROLL_GAME_NAMES_TIMER_TIME 1000 + +class CXuiCtrl4JList; +class LevelGenerationOptions; +class CScene_MultiGameInfo; + +class CScene_MultiGameJoinLoad : public CXuiSceneImpl +{ +protected: + CXuiCtrl4JList *m_pSavesList; + CXuiCtrl4JList *m_pGamesList; + CXuiList m_SavesList; + CXuiList m_GamesList; + CXuiControl m_SavesListTimer; + CXuiControl m_NetGamesListTimer; + CXuiControl m_LabelNoGames; + int m_iPad; + + bool m_bShowingPartyGamesOnly; + bool m_bInParty; + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_DESTROY(OnDestroy) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_NAV_RETURN(OnNavReturn) + XUI_ON_XM_NOTIFY_SELCHANGED(OnNotifySelChanged) + XUI_ON_XM_NOTIFY_SET_FOCUS(OnNotifySetFocus) + XUI_ON_XM_NOTIFY_KILL_FOCUS(OnNotifyKillFocus) + XUI_ON_XM_TIMER( OnTimer ) + XUI_ON_XM_TRANSITION_START(OnTransitionStart) + XUI_ON_XM_FONTRENDERERCHANGE_MESSAGE(OnFontRendererChange) + XUI_ON_XM_DLCINSTALLED_MESSAGE(OnCustomMessage_DLCInstalled) + XUI_ON_XM_DLCLOADED_MESSAGE(OnCustomMessage_DLCMountingComplete) + + XUI_END_MSG_MAP() + + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_GamesList, m_GamesList) + MAP_CONTROL(IDC_SavesTimer, m_SavesListTimer) + MAP_CONTROL(IDC_Timer, m_NetGamesListTimer) + MAP_CONTROL(IDC_LabelNoGames, m_LabelNoGames) + MAP_CONTROL(IDC_SavesList, m_SavesList) + END_CONTROL_MAP() + + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnDestroy(); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled); + HRESULT OnNotifySelChanged(HXUIOBJ hObjSource, XUINotifySelChanged *pNotifySelChangedData, BOOL& bHandled); + HRESULT OnNotifySetFocus(HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled); + HRESULT OnNotifyKillFocus(HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled); + HRESULT OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ); + HRESULT OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ); + HRESULT OnFontRendererChange(); + HRESULT OnCustomMessage_DLCInstalled(); + HRESULT OnCustomMessage_DLCMountingComplete(); + + +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_MultiGameJoinLoad, L"CScene_MultiGameJoinLoad", XUI_CLASS_SCENE ) + +private: + bool DoesSavesListHaveFocus(); + bool DoesGamesListHaveFocus(); + bool DoesMashUpWorldHaveFocus(); + +public: + static void UpdateGamesListCallback(LPVOID pParam); + +private: + void AddDefaultButtons(); + void UpdateGamesList(); + void UpdateGamesList(DWORD dwNumResults, IQNetGameSearch *pGameSearch); + //void UpdateGamesListLabels(); + static void SearchForGameCallback(void *hObj, DWORD dwNumResults, IQNetGameSearch *pGameSearch); + static int DeviceSelectReturned(void *pParam,bool bContinue); + + unsigned char m_localPlayers; + + HRESULT GetSaveInfo( ); + static int LoadSaveDataReturned(void *pParam,bool bContinue); + static int DeleteSaveDataReturned(void *pParam,bool bSuccess); + + unsigned int m_uiSaveC; + void LoadLevelGen(LevelGenerationOptions *levelGen); + void LoadSaveFromDisk(File *saveFile); + + // callback +#ifdef _XBOX + static bool GetSavesInfoCallback(LPVOID pParam,int iInstalledC, C4JStorage::CACHEINFOSTRUCT *InfoA, int iPad, HRESULT hRes); +#else + static int GetSavesInfoCallback(LPVOID lpParam,const bool); +#endif + static int DeleteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int SaveOptionsDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int DeviceRemovedDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int StartGame_SignInReturned(void *pParam,bool bContinue, int iPad); + static int CopySaveReturned(void *pParam,bool bResult); + static int LoadSaveDataForRenameReturned(void *pParam,bool bContinue); + static int KeyboardReturned(void *pParam,bool bSet); + static void StartGameFromSave(CScene_MultiGameJoinLoad* pClass, DWORD dwLocalUsersMask); + static int TexturePackDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int SaveTransferDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + + static int Progress(void *pParam,float fProgress); + static int TransferComplete(void *pParam,int i1, int i2); + static int DeleteComplete(void *pParam,int i1, int i2); + static int UploadSaveForXboxOneThreadProc( LPVOID lpParameter ); + static void DeleteFile(CScene_MultiGameJoinLoad *pClass, char *filename); + static void UploadFile(CScene_MultiGameJoinLoad *pClass, char *filename, LPVOID data, DWORD size); + static bool WaitForTransferComplete( CScene_MultiGameJoinLoad *pClass ); + static void CancelSaveUploadCallback(LPVOID lpParam); + static void SaveUploadCompleteCallback(LPVOID lpParam); + + + bool m_bIgnoreInput; + vector *m_saves; + + int m_iSaveInfoC; + int m_iDefaultButtonsC; + int m_iMashUpButtonsC; + int m_iChangingSaveGameInfoIndex; + + bool m_bMultiplayerAllowed; + bool m_bKillSaveInfoEnumerate; + + vector currentSessions; + bool m_bReady; + bool m_bRetrievingSaveInfo; + //bool m_bSaveRenamed; + WCHAR m_wchNewName[XCONTENT_MAX_DISPLAYNAME_LENGTH]; + unsigned char m_szSeed[50]; + + vector *m_generators; + JoinMenuInitData *m_initData; + + UINT m_DefaultMinecraftIconSize; + PBYTE m_DefaultMinecraftIconData; + int *m_iConfigA; // track the texture packs that we don't have installed + int m_iTexturePacksNotInstalled; + PBYTE m_pbSaveTransferData; + + float m_fProgress; + bool m_bTransferComplete; + bool m_bTransferFail; + bool m_bSaveTransferInProgress; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_MultiGameLaunchMoreOptions.cpp b/Minecraft.Client/Common/XUI/XUI_MultiGameLaunchMoreOptions.cpp new file mode 100644 index 00000000..08656111 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_MultiGameLaunchMoreOptions.cpp @@ -0,0 +1,306 @@ +#include "stdafx.h" +#include "XUI_MultiGameCreate.h" +#include "XUI_MultiGameLaunchMoreOptions.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\Minecraft.h" + +#define GAME_CREATE_ONLINE_TIMER_ID 0 +#define GAME_CREATE_ONLINE_TIMER_TIME 100 + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_MultiGameLaunchMoreOptions::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + MapChildControls(); + + XuiControlSetText(m_CheckboxOnline,app.GetString(IDS_ONLINE_GAME)); + XuiControlSetText(m_CheckboxInviteOnly,app.GetString(IDS_INVITE_ONLY)); + XuiControlSetText(m_CheckboxAllowFoF,app.GetString(IDS_ALLOWFRIENDSOFFRIENDS)); + XuiControlSetText(m_CheckboxPVP,app.GetString(IDS_PLAYER_VS_PLAYER)); + XuiControlSetText(m_CheckboxTrustPlayers,app.GetString(IDS_TRUST_PLAYERS)); + XuiControlSetText(m_CheckboxFireSpreads,app.GetString(IDS_FIRE_SPREADS)); + XuiControlSetText(m_CheckboxTNTExplodes,app.GetString(IDS_TNT_EXPLODES)); + XuiControlSetText(m_CheckboxHostPrivileges,app.GetString(IDS_HOST_PRIVILEGES)); + XuiControlSetText(m_CheckboxResetNether,app.GetString(IDS_RESET_NETHER)); + XuiControlSetText(m_LabelWorldOptions,app.GetString(IDS_WORLD_OPTIONS)); + XuiControlSetText(m_CheckboxStructures,app.GetString(IDS_GENERATE_STRUCTURES)); + XuiControlSetText(m_CheckboxFlatWorld,app.GetString(IDS_SUPERFLAT_WORLD)); + XuiControlSetText(m_CheckboxBonusChest,app.GetString(IDS_BONUS_CHEST)); + + m_params = (LaunchMoreOptionsMenuInitData *)pInitData->pvInitData; + + if(m_params->bGenerateOptions) + { + m_CheckboxStructures.SetEnable(TRUE); + m_CheckboxFlatWorld.SetEnable(TRUE); + m_CheckboxBonusChest.SetEnable(TRUE); + m_CheckboxStructures.SetCheck(m_params->bStructures); + m_CheckboxFlatWorld.SetCheck (m_params->bFlatWorld); + m_CheckboxBonusChest.SetCheck(m_params->bBonusChest); + + // This is a create world, so don't need Reset Nether + float fHeight, fCheckboxHeight, fWidth; + m_CheckboxResetNether.GetBounds(&fWidth, &fCheckboxHeight); + + m_HostOptionGroup.GetBounds(&fWidth, &fHeight); + m_HostOptionGroup.SetBounds(fWidth, fHeight - fCheckboxHeight); + + GetBounds(&fWidth,&fHeight); + SetBounds(fWidth, fHeight - fCheckboxHeight); + + D3DXVECTOR3 pos; + GetPosition(&pos); + pos.y += (fCheckboxHeight/2); + SetPosition(&pos); + + m_GenerationGroup.GetPosition(&pos); + pos.y -= fCheckboxHeight; + m_GenerationGroup.SetPosition(&pos); + + m_CheckboxResetNether.SetShow(FALSE); + } + else + { + float fHeight, fGroupHeight, fWidth; + m_GenerationGroup.GetBounds(&fWidth, &fGroupHeight); + m_GenerationGroup.SetShow(FALSE); + m_GenerationGroup.SetEnable(FALSE); + m_CheckboxStructures.SetShow(FALSE); + m_CheckboxFlatWorld.SetShow(FALSE); + m_CheckboxBonusChest.SetShow(FALSE); + + GetBounds(&fWidth,&fHeight); + SetBounds(fWidth, fHeight +10 - fGroupHeight); + + D3DXVECTOR3 pos; + GetPosition(&pos); + pos.y += (fGroupHeight/2); + SetPosition(&pos); + + m_CheckboxResetNether.SetEnable(TRUE); + m_CheckboxResetNether.SetCheck(m_params->bResetNether); + } + + m_CheckboxPVP.SetEnable(TRUE); + m_CheckboxTrustPlayers.SetEnable(TRUE); + m_CheckboxFireSpreads.SetEnable(TRUE); + m_CheckboxTNTExplodes.SetEnable(TRUE); + m_CheckboxHostPrivileges.SetEnable(TRUE); + + m_CheckboxPVP.SetCheck(m_params->bPVP); + m_CheckboxTrustPlayers.SetCheck (m_params->bTrust); + m_CheckboxFireSpreads.SetCheck(m_params->bFireSpreads); + m_CheckboxTNTExplodes.SetCheck(m_params->bTNT); + m_CheckboxHostPrivileges.SetCheck(m_params->bHostPrivileges); + + + m_CheckboxOnline.SetCheck(m_params->bOnlineGame); + m_CheckboxInviteOnly.SetCheck(m_params->bInviteOnly); + m_CheckboxAllowFoF.SetCheck(m_params->bAllowFriendsOfFriends); + + m_bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_params->iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_params->iPad); + if(m_params->bOnlineSettingChangedBySystem) + { + m_CheckboxOnline.SetCheck(FALSE); + m_CheckboxOnline.SetEnable(FALSE); + m_CheckboxInviteOnly.SetCheck(FALSE); + m_CheckboxInviteOnly.SetEnable(FALSE); + m_CheckboxAllowFoF.SetCheck(FALSE); + m_CheckboxAllowFoF.SetEnable(FALSE); + } + else if(!m_params->bOnlineGame) + { + m_CheckboxInviteOnly.SetEnable(FALSE); + m_CheckboxAllowFoF.SetEnable(FALSE); + } + + XuiSetTimer(m_hObj,GAME_CREATE_ONLINE_TIMER_ID,GAME_CREATE_ONLINE_TIMER_TIME); + + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + + CXuiSceneBase::ShowLogo( DEFAULT_XUI_MENU_USER, FALSE ); + + + //SentientManager.RecordMenuShown(m_params->iPad, eUIScene_CreateWorldMenu, 0); + + return S_OK; +} + + +HRESULT CScene_MultiGameLaunchMoreOptions::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + // Explicitly handle B button presses + switch(pInputData->dwKeyCode) + { + case VK_PAD_B: + case VK_ESCAPE: + m_params->bOnlineGame = m_CheckboxOnline.IsChecked(); + m_params->bInviteOnly = m_CheckboxInviteOnly.IsChecked(); + m_params->bAllowFriendsOfFriends = m_CheckboxAllowFoF.IsChecked(); + + m_params->bStructures = m_CheckboxStructures.IsChecked(); + m_params->bFlatWorld = m_CheckboxFlatWorld.IsChecked(); + m_params->bBonusChest = m_CheckboxBonusChest.IsChecked(); + m_params->bPVP = m_CheckboxPVP.IsChecked(); + m_params->bTrust = m_CheckboxTrustPlayers.IsChecked(); + m_params->bFireSpreads = m_CheckboxFireSpreads.IsChecked(); + m_params->bTNT = m_CheckboxTNTExplodes.IsChecked(); + + m_params->bHostPrivileges = m_CheckboxHostPrivileges.IsChecked(); + + m_params->bResetNether = m_CheckboxResetNether.IsChecked(); + + app.NavigateBack(pInputData->UserIndex); + rfHandled = TRUE; + break; + } + return S_OK; +} + + +HRESULT CScene_MultiGameLaunchMoreOptions::OnNotifySetFocus( HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled ) +{ + int stringId = 0; + if(hObjSource == m_CheckboxStructures) + { + stringId = IDS_GAMEOPTION_STRUCTURES; + } + else if(hObjSource == m_CheckboxOnline) + { + stringId = IDS_GAMEOPTION_ONLINE; + } + else if(hObjSource == m_CheckboxInviteOnly) + { + stringId = IDS_GAMEOPTION_INVITEONLY; + } + else if(hObjSource == m_CheckboxAllowFoF) + { + stringId = IDS_GAMEOPTION_ALLOWFOF; + } + else if(hObjSource == m_CheckboxFlatWorld) + { + stringId = IDS_GAMEOPTION_SUPERFLAT; + } + else if(hObjSource == m_CheckboxBonusChest) + { + stringId = IDS_GAMEOPTION_BONUS_CHEST; + } + else if(hObjSource == m_CheckboxPVP) + { + stringId = IDS_GAMEOPTION_PVP; + } + else if(hObjSource == m_CheckboxTrustPlayers) + { + stringId = IDS_GAMEOPTION_TRUST; + } + else if(hObjSource == m_CheckboxFireSpreads) + { + stringId = IDS_GAMEOPTION_FIRE_SPREADS; + } + else if(hObjSource == m_CheckboxTNTExplodes) + { + stringId = IDS_GAMEOPTION_TNT_EXPLODES; + } + else if(hObjSource == m_CheckboxHostPrivileges) + { + stringId = IDS_GAMEOPTION_HOST_PRIVILEGES; + } + else if(hObjSource == m_CheckboxResetNether) + { + stringId = IDS_GAMEOPTION_RESET_NETHER; + } + + wstring wsText=app.GetString(stringId); + int size = 14; + if(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) + { + size = 12; + } + wchar_t startTags[64]; + swprintf(startTags,64,L"",app.GetHTMLColour(eHTMLColor_White), size); + wsText= startTags + wsText; + + m_Description.SetText(wsText.c_str()); + return S_OK; +} + +HRESULT CScene_MultiGameLaunchMoreOptions::OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) +{ + pControlNavigateData->hObjDest=XuiControlGetNavigation(pControlNavigateData->hObjSource,pControlNavigateData->nControlNavigate,TRUE,TRUE); + + if(pControlNavigateData->hObjDest!=NULL) + { + bHandled=TRUE; + } + + return S_OK; +} + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_MultiGameLaunchMoreOptions::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + if(hObjPressed==m_CheckboxOnline) + { + if(m_CheckboxOnline.IsChecked()) + { + m_CheckboxInviteOnly.SetEnable(TRUE); + m_CheckboxAllowFoF.SetEnable(TRUE); + } + else + { + m_CheckboxInviteOnly.SetCheck(FALSE); + m_CheckboxInviteOnly.SetEnable(FALSE); + m_CheckboxAllowFoF.SetCheck(FALSE); + m_CheckboxAllowFoF.SetEnable(FALSE); + } + } + return S_OK; +} + +HRESULT CScene_MultiGameLaunchMoreOptions::OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ) +{ + // 4J-PB - TODO - Don't think we can do this - if a 2nd player signs in here with an offline profile, the signed in LIVE player gets re-logged in, and bMultiplayerAllowed is false briefly + if( pTimer->nId == GAME_CREATE_ONLINE_TIMER_ID) + { + bool bMultiplayerAllowed = ProfileManager.IsSignedInLive( m_params->iPad ) && ProfileManager.AllowedToPlayMultiplayer(m_params->iPad); + + if(bMultiplayerAllowed != m_bMultiplayerAllowed) + { + if( bMultiplayerAllowed ) + { + bool bGameSetting_Online=(app.GetGameSettings(m_params->iPad,eGameSetting_Online)!=0); + m_CheckboxOnline.SetCheck(bGameSetting_Online?TRUE:FALSE); + if(bGameSetting_Online) + { + m_CheckboxInviteOnly.SetCheck((app.GetGameSettings(m_params->iPad,eGameSetting_InviteOnly)!=0)?TRUE:FALSE); + m_CheckboxAllowFoF.SetCheck((app.GetGameSettings(m_params->iPad,eGameSetting_FriendsOfFriends)!=0)?TRUE:FALSE); + } + else + { + m_CheckboxInviteOnly.SetCheck(FALSE); + m_CheckboxAllowFoF.SetCheck(FALSE); + } + } + else + { + m_CheckboxOnline.SetCheck(FALSE); + m_CheckboxOnline.SetEnable(FALSE); + m_CheckboxInviteOnly.SetCheck(FALSE); + m_CheckboxInviteOnly.SetEnable(FALSE); + m_CheckboxAllowFoF.SetCheck(FALSE); + } + + m_bMultiplayerAllowed = bMultiplayerAllowed; + } + } + + return S_OK; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_MultiGameLaunchMoreOptions.h b/Minecraft.Client/Common/XUI/XUI_MultiGameLaunchMoreOptions.h new file mode 100644 index 00000000..92876240 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_MultiGameLaunchMoreOptions.h @@ -0,0 +1,75 @@ +#pragma once +using namespace std; +#include "..\Media\xuiscene_multi_launch_more_options.h" + +class CScene_MultiGameLaunchMoreOptions : public CXuiSceneImpl +{ +protected: + CXuiScene m_GenerationGroup, m_HostOptionGroup; + CXuiCheckbox m_CheckboxOnline; + CXuiCheckbox m_CheckboxInviteOnly; + CXuiCheckbox m_CheckboxAllowFoF; + CXuiCheckbox m_CheckboxStructures; + CXuiCheckbox m_CheckboxFlatWorld; + CXuiCheckbox m_CheckboxBonusChest; + CXuiCheckbox m_CheckboxPVP; + CXuiCheckbox m_CheckboxTrustPlayers; + CXuiCheckbox m_CheckboxFireSpreads; + CXuiCheckbox m_CheckboxTNTExplodes; + CXuiCheckbox m_CheckboxHostPrivileges; + CXuiCheckbox m_CheckboxResetNether; + CXuiControl m_Description; + CXuiControl m_LabelWorldOptions; + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_NOTIFY_SET_FOCUS( OnNotifySetFocus ) + XUI_ON_XM_CONTROL_NAVIGATE( OnControlNavigate ) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_TIMER( OnTimer ) + XUI_END_MSG_MAP() + + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_GenerationOptions, m_GenerationGroup) + BEGIN_MAP_CHILD_CONTROLS(m_GenerationGroup) + MAP_CONTROL(IDC_WorldOptions, m_LabelWorldOptions) + MAP_CONTROL(IDC_CheckboxStructures, m_CheckboxStructures) + MAP_CONTROL(IDC_CheckboxFlatWorld, m_CheckboxFlatWorld) + MAP_CONTROL(IDC_CheckboxBonusChest, m_CheckboxBonusChest) + END_MAP_CHILD_CONTROLS() + + MAP_CONTROL(IDC_HostOptions, m_HostOptionGroup) + BEGIN_MAP_CHILD_CONTROLS(m_HostOptionGroup) + MAP_CONTROL(IDC_CheckboxOnline, m_CheckboxOnline) + MAP_CONTROL(IDC_CheckboxInviteOnly, m_CheckboxInviteOnly) + MAP_CONTROL(IDC_CheckboxAllowFoF, m_CheckboxAllowFoF) + MAP_CONTROL(IDC_CheckboxPVP, m_CheckboxPVP) + MAP_CONTROL(IDC_CheckboxTrustSystem, m_CheckboxTrustPlayers) + MAP_CONTROL(IDC_CheckboxFireSpreads, m_CheckboxFireSpreads) + MAP_CONTROL(IDC_CheckboxTNT, m_CheckboxTNTExplodes) + MAP_CONTROL(IDC_CheckboxHostPrivileges, m_CheckboxHostPrivileges) + MAP_CONTROL(IDC_CheckboxResetNether, m_CheckboxResetNether) + END_MAP_CHILD_CONTROLS() + + MAP_CONTROL(IDC_Description, m_Description) + END_CONTROL_MAP() + + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnNotifySetFocus( HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled ); + HRESULT OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled); + HRESULT OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ); + +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_MultiGameLaunchMoreOptions, L"CScene_MultiGameLaunchMoreOptions", XUI_CLASS_SCENE ) + +private: + LaunchMoreOptionsMenuInitData *m_params; + bool m_bMultiplayerAllowed; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_NewUpdateMessage.cpp b/Minecraft.Client/Common/XUI/XUI_NewUpdateMessage.cpp new file mode 100644 index 00000000..49b524ff --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_NewUpdateMessage.cpp @@ -0,0 +1,90 @@ + + +#include "stdafx.h" + // #include "XUI_Ctrl_4JIcon.h" +#include "XUI_NewUpdateMessage.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" + + +HRESULT CScene_NewUpdateMessage::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + m_iPad = *(int *) pInitData->pvInitData; + m_bIsSD=!RenderManager.IsHiDef() && !RenderManager.IsWidescreen(); + + MapChildControls(); + + ui.SetTooltips( DEFAULT_XUI_MENU_USER, -1, IDS_TOOLTIPS_BACK ); + + // set the text in the XuiHTMLMessage + wchar_t formatting[40]; + wstring wstrTemp = app.GetString(IDS_TITLEUPDATE); + swprintf(formatting, 40, L"", m_bIsSD?12:14); + wstrTemp = formatting + wstrTemp; + + wstring wsText=app.FormatHTMLString(m_iPad,wstrTemp); + m_HTMLText.SetText(wsText.c_str()); + m_HTMLText.SetShow(TRUE); + + TelemetryManager->RecordMenuShown(m_iPad, eUIScene_NewUpdateMessage, 0); + + return S_OK; +} + + + +HRESULT CScene_NewUpdateMessage::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + switch(pInputData->dwKeyCode) + { + case VK_PAD_B: + case VK_ESCAPE: + { + int iVal=app.GetGameSettings(m_iPad,eGameSetting_DisplayUpdateMessage); + if(iVal>0) iVal--; + + // set the update text as seen, by clearing the flag + app.SetGameSettings(m_iPad,eGameSetting_DisplayUpdateMessage,iVal); + // force a profile write + app.CheckGameSettingsChanged(true,m_iPad); + app.NavigateBack(XUSER_INDEX_ANY); + rfHandled = TRUE; + } + + break; + case VK_PAD_RTHUMB_DOWN: + case VK_PAD_LTHUMB_DOWN: + { + XUIHtmlScrollInfo ScrollInfo; + + XuiHtmlControlGetVScrollInfo(m_HTMLText.m_hObj,&ScrollInfo); + if(!ScrollInfo.bScrolling) + { + XuiHtmlControlVScrollBy(m_HTMLText.m_hObj,1); + } + } + break; + case VK_PAD_RTHUMB_UP: + case VK_PAD_LTHUMB_UP: + { + XUIHtmlScrollInfo ScrollInfo; + + XuiHtmlControlGetVScrollInfo(m_HTMLText.m_hObj,&ScrollInfo); + if(!ScrollInfo.bScrolling) + { + XuiHtmlControlVScrollBy(m_HTMLText.m_hObj,-1); + } + } + break; } + + return S_OK; +} + +HRESULT CScene_NewUpdateMessage::OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled) +{ + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK ); + + return S_OK; +} + diff --git a/Minecraft.Client/Common/XUI/XUI_NewUpdateMessage.h b/Minecraft.Client/Common/XUI/XUI_NewUpdateMessage.h new file mode 100644 index 00000000..8c4fbb36 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_NewUpdateMessage.h @@ -0,0 +1,31 @@ +#pragma once + +#include "../media\xuiscene_NewUpdateMessage.h" + +class CScene_NewUpdateMessage : public CXuiSceneImpl +{ + // Xui Elements + CXuiHtmlControl m_HTMLText; + // Misc + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN( OnKeyDown ) + XUI_ON_XM_NAV_RETURN(OnNavReturn) + + XUI_END_MSG_MAP() + + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_XuiHTMLMessage, m_HTMLText) + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled); + +public: + XUI_IMPLEMENT_CLASS( CScene_NewUpdateMessage, L"CScene_NewUpdateMessage", XUI_CLASS_SCENE ) + +private: + int m_iPad; + bool m_bIsSD; +}; diff --git a/Minecraft.Client/Common/XUI/XUI_PartnernetPassword.cpp b/Minecraft.Client/Common/XUI/XUI_PartnernetPassword.cpp new file mode 100644 index 00000000..76b820d3 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_PartnernetPassword.cpp @@ -0,0 +1,70 @@ +#include "stdafx.h" +#include "XUI_PartnernetPassword.h" +#include "..\XUI\XUI_Ctrl_4JList.h" + +#ifdef _CONTENT_PACKAGE +#ifndef _FINAL_BUILD + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_PartnernetPassword::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + MapChildControls(); + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT); + + m_PartnernetPassword.SetEnable(true); + + m_PartnernetPassword.SetTextLimit(XCONTENT_MAX_DISPLAYNAME_LENGTH); + + // set the caret to the end of the default text + m_PartnernetPassword.SetCaretPosition(0); + m_PartnernetPassword.SetKeyboardType(C_4JInput::EKeyboardMode_Phone); + + m_PartnernetPassword.SetTitleAndText(IDS_NAME_WORLD,IDS_NAME_WORLD_TEXT); + + return S_OK; +} + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_PartnernetPassword::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + if(hObjPressed==m_OK) + { + // create the world and launch + wstring wPassword = m_PartnernetPassword.GetText(); + if(wPassword==L"5183") + { + app.NavigateBack(pNotifyPressData->UserIndex); + app.SetPartnernetPasswordRunning(false); + ui.SetTooltips( DEFAULT_XUI_MENU_USER, -1); + } + rfHandled = TRUE; + } + + return S_OK; +} + +HRESULT CScene_PartnernetPassword::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + // Explicitly handle B button presses + switch(pInputData->dwKeyCode) + { + case VK_PAD_A: + case VK_PAD_B: + case VK_ESCAPE: + rfHandled = TRUE; + break; + } + return S_OK; +} + +#endif +#endif \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_PartnernetPassword.h b/Minecraft.Client/Common/XUI/XUI_PartnernetPassword.h new file mode 100644 index 00000000..b05206c0 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_PartnernetPassword.h @@ -0,0 +1,40 @@ +#pragma once +#include "..\Media\xuiscene_partnernetpassword.h" +#include "XUI_Ctrl_4JEdit.h" + +#ifdef _CONTENT_PACKAGE +#ifndef _FINAL_BUILD + +class CScene_PartnernetPassword : public CXuiSceneImpl +{ + +protected: + CXuiCtrl4JEdit m_PartnernetPassword; + CXuiControl m_OK; + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_END_MSG_MAP() + + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_XuiEditPartnernetPassword, m_PartnernetPassword) + MAP_CONTROL(IDC_XuiOK, m_OK) + END_CONTROL_MAP() + + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled); + +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_PartnernetPassword, L"CScene_PartnernetPassword", XUI_CLASS_SCENE ) + +}; + +#endif +#endif diff --git a/Minecraft.Client/Common/XUI/XUI_PauseMenu.cpp b/Minecraft.Client/Common/XUI/XUI_PauseMenu.cpp new file mode 100644 index 00000000..4de74d1f --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_PauseMenu.cpp @@ -0,0 +1,1219 @@ +// Minecraft.cpp : Defines the entry point for the application. +// + +#include "stdafx.h" + +#include +#include "..\..\..\Minecraft.World\AABB.h" +#include "..\..\..\Minecraft.World\Vec3.h" +#include "..\..\..\Minecraft.World\net.minecraft.stats.h" +#include "..\..\..\Minecraft.Client\StatsCounter.h" +#include "..\..\..\Minecraft.World\Entity.h" +#include "..\..\..\Minecraft.World\Level.h" +#include "..\..\..\Minecraft.Client\MultiplayerLocalPlayer.h" +#include "..\..\MinecraftServer.h" +#include "..\..\MultiPlayerLevel.h" +#include "..\..\ProgressRenderer.h" +#include "..\..\..\Minecraft.World\DisconnectPacket.h" +#include "..\..\Minecraft.h" +#include "..\..\Options.h" +#include "..\..\..\Minecraft.World\compression.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\TexturePack.h" +#include "..\..\DLCTexturePack.h" + +#define IGNORE_KEYPRESS_TIMERID 0 +#define IGNORE_KEYPRESS_TIME 100 + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT UIScene_PauseMenu::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + m_bIgnoreInput=true; + m_iPad = *(int *)pInitData->pvInitData; + bool bUserisClientSide = ProfileManager.IsSignedInLive(m_iPad); + + app.DebugPrintf("PAUSE PRESS PROCESSING - ipad = %d, UIScene_PauseMenu::OnInit\n",m_iPad); + + bool bIsisPrimaryHost=g_NetworkManager.IsHost() && (ProfileManager.GetPrimaryPad()==m_iPad); + bool bDisplayBanTip = !g_NetworkManager.IsLocalGame() && !bIsisPrimaryHost && !ProfileManager.IsGuest(m_iPad); + + MapChildControls(); + + XuiControlSetText(m_Buttons[BUTTON_PAUSE_RESUMEGAME],app.GetString(IDS_RESUME_GAME)); + XuiControlSetText(m_Buttons[BUTTON_PAUSE_HELPANDOPTIONS],app.GetString(IDS_HELP_AND_OPTIONS)); + XuiControlSetText(m_Buttons[BUTTON_PAUSE_LEADERBOARDS],app.GetString(IDS_LEADERBOARDS)); + XuiControlSetText(m_Buttons[BUTTON_PAUSE_ACHIEVEMENTS],app.GetString(IDS_ACHIEVEMENTS)); + XuiControlSetText(m_Buttons[BUTTON_PAUSE_SAVEGAME],app.GetString(IDS_SAVE_GAME)); + XuiControlSetText(m_Buttons[BUTTON_PAUSE_EXITGAME],app.GetString(IDS_EXIT_GAME)); + + if(app.GetLocalPlayerCount()>1) + { + m_bSplitscreen = true; + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad,false); + CXuiSceneBase::ShowLogo( m_iPad, FALSE ); + } + else + { + m_bSplitscreen = false; + CXuiSceneBase::ShowLogo( m_iPad, TRUE ); + } + + // test award the theme + //ProfileManager.Award( ProfileManager.GetPrimaryPad(), eAward_socialPost ); + // Display the tooltips, we are only allowed to display "SHARE" if we have the capability (TCR). + + if(!ProfileManager.IsFullVersion()) + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + // hide the trial timer + CXuiSceneBase::ShowTrialTimer(FALSE); + } + else if(StorageManager.GetSaveDisabled()) + { + if( CSocialManager::Instance()->IsTitleAllowedToPostImages() && CSocialManager::Instance()->AreAllUsersAllowedToPostImages() && bUserisClientSide ) + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,bIsisPrimaryHost?IDS_TOOLTIPS_SELECTDEVICE:-1,IDS_TOOLTIPS_SHARE, -1,-1,-1,bDisplayBanTip?IDS_TOOLTIPS_BANLEVEL:-1); + } + else + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,bIsisPrimaryHost?IDS_TOOLTIPS_SELECTDEVICE:-1,-1,-1,-1,-1,bDisplayBanTip?IDS_TOOLTIPS_BANLEVEL:-1); + } + } + else + { + if( CSocialManager::Instance()->IsTitleAllowedToPostImages() && CSocialManager::Instance()->AreAllUsersAllowedToPostImages() && bUserisClientSide) + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,bIsisPrimaryHost?IDS_TOOLTIPS_CHANGEDEVICE:-1,IDS_TOOLTIPS_SHARE, -1,-1,-1,bDisplayBanTip?IDS_TOOLTIPS_BANLEVEL:-1); + } + else + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,bIsisPrimaryHost?IDS_TOOLTIPS_CHANGEDEVICE:-1,-1, -1,-1,-1,bDisplayBanTip?IDS_TOOLTIPS_BANLEVEL:-1); + } + } + + CXuiSceneBase::ShowDarkOverlay( m_iPad, TRUE ); + + // are we the primary player? + // 4J-PB - fix for 7844 & 7845 - + // TCR # 128: XLA Pause Menu: When in a multiplayer game as a client the Pause Menu does not have a Leaderboards option. + // TCR # 128: XLA Pause Menu: When in a multiplayer game as a client the Pause Menu does not have an Achievements option. + if(ProfileManager.GetPrimaryPad()==m_iPad) // && g_NetworkManager.IsHost()) + { + // are we in splitscreen? + // how many local players do we have? + + D3DXVECTOR3 vPos; + if( app.GetLocalPlayerCount()>1 ) + { + m_Buttons[BUTTON_PAUSE_LEADERBOARDS].GetPosition(&vPos); + m_Buttons[BUTTON_PAUSE_SAVEGAME].SetPosition(&vPos); + m_Buttons[BUTTON_PAUSE_ACHIEVEMENTS].GetPosition(&vPos); + m_Buttons[BUTTON_PAUSE_EXITGAME].SetPosition(&vPos); + // Hide the BUTTON_PAUSE_LEADERBOARDS and BUTTON_PAUSE_ACHIEVEMENTS + XuiElementSetShow(m_Buttons[BUTTON_PAUSE_LEADERBOARDS],FALSE); + XuiElementSetShow(m_Buttons[BUTTON_PAUSE_ACHIEVEMENTS],FALSE); + } + + if( !g_NetworkManager.IsHost() ) + { + m_Buttons[BUTTON_PAUSE_SAVEGAME].GetPosition(&vPos); + m_Buttons[BUTTON_PAUSE_EXITGAME].SetPosition(&vPos); + // Hide the BUTTON_PAUSE_SAVEGAME + XuiElementSetShow(m_Buttons[BUTTON_PAUSE_SAVEGAME],FALSE); + } + } + else + { + D3DXVECTOR3 vPos; + m_Buttons[BUTTON_PAUSE_LEADERBOARDS].GetPosition(&vPos); + m_Buttons[BUTTON_PAUSE_EXITGAME].SetPosition(&vPos); + // Hide the BUTTON_PAUSE_LEADERBOARDS, BUTTON_PAUSE_ACHIEVEMENTS and BUTTON_PAUSE_SAVEGAME + XuiElementSetShow(m_Buttons[BUTTON_PAUSE_LEADERBOARDS],FALSE); + XuiElementSetShow(m_Buttons[BUTTON_PAUSE_ACHIEVEMENTS],FALSE); + XuiElementSetShow(m_Buttons[BUTTON_PAUSE_SAVEGAME],FALSE); + } + + // is saving disabled? + if(StorageManager.GetSaveDisabled()) + { + // disable save button + m_Buttons[BUTTON_PAUSE_SAVEGAME].SetEnable(FALSE); + m_Buttons[BUTTON_PAUSE_SAVEGAME].EnableInput(FALSE); + } + + m_iLastButtonPressed=0; + + // get rid of the quadrant display if it's on + CXuiSceneBase::HidePressStart(); + + XuiSetTimer(m_hObj,IGNORE_KEYPRESS_TIMERID,IGNORE_KEYPRESS_TIME); + + if( g_NetworkManager.IsLocalGame() && g_NetworkManager.GetPlayerCount() == 1 ) + { + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)TRUE); + } + + TelemetryManager->RecordMenuShown(m_iPad, eUIScene_PauseMenu, 0); + TelemetryManager->RecordPauseOrInactive(m_iPad); + + return S_OK; +} + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT UIScene_PauseMenu::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + unsigned int uiButtonCounter=0; + + while((uiButtonCounterUserIndex!=pMinecraft->player->GetXboxPad()) return S_OK; + + // Determine which button was pressed, + // and call the appropriate function. + + // store the last button pressed, so on a nav back we can set the focus properly + m_iLastButtonPressed=uiButtonCounter; + switch(uiButtonCounter) + { + case BUTTON_PAUSE_RESUMEGAME: + if( m_iPad == ProfileManager.GetPrimaryPad() && g_NetworkManager.IsLocalGame() ) + { + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)FALSE); + } + app.CloseXuiScenes(pNotifyPressData->UserIndex); + break; + + case BUTTON_PAUSE_LEADERBOARDS: + { + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + + //4J Gordon: Being used for the leaderboards proper now + // guests can't look at leaderboards + if(ProfileManager.IsGuest(pNotifyPressData->UserIndex)) + { + StorageManager.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + } + else if(!ProfileManager.IsSignedInLive(pNotifyPressData->UserIndex)) + { + StorageManager.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); + } + else + { + app.NavigateToScene(pNotifyPressData->UserIndex, eUIScene_LeaderboardsMenu); + } + } + break; + case BUTTON_PAUSE_ACHIEVEMENTS: + // guests can't look at achievements + if(ProfileManager.IsGuest(pNotifyPressData->UserIndex)) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + StorageManager.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + } + else + { + XShowAchievementsUI( pNotifyPressData->UserIndex ); + } + + break; + case BUTTON_PAUSE_HELPANDOPTIONS: + if(app.GetLocalPlayerCount()>1) + { + app.NavigateToScene(pNotifyPressData->UserIndex,eUIScene_HelpAndOptionsMenu); + } + else + { + app.NavigateToScene(pNotifyPressData->UserIndex,eUIScene_HelpAndOptionsMenu); + } + break; + + case BUTTON_PAUSE_SAVEGAME: + { + // 4J-PB - Is the player trying to save but they are using a trial texturepack ? + if(!Minecraft::GetInstance()->skins->isUsingDefaultSkin()) + { + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + m_pDLCPack=pDLCTexPack->getDLCInfoParentPack();//tPack->getDLCPack(); + + if(!m_pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) + { + // upsell + ULONGLONG ullOfferID_Full; + // get the dlc texture pack + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + app.GetDLCFullOfferIDForPackID(pDLCTexPack->getDLCParentPackId(),&ullOfferID_Full); + + // tell sentient about the upsell of the full version of the texture pack + TelemetryManager->RecordUpsellPresented(pNotifyPressData->UserIndex, eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); + + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + // Give the player a warning about the trial version of the texture pack + StorageManager.RequestMessageBox(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, pNotifyPressData->UserIndex,&UIScene_PauseMenu::WarningTrialTexturePackReturned,this,app.GetStringTable()); + + return S_OK; + } + } + + // does the save exist? + bool bSaveExists; + C4JStorage::ELoadGameStatus result=StorageManager.DoesSaveExist(&bSaveExists); + + if(result == C4JStorage::ELoadGame_DeviceRemoved) + { + // this will be a tester trying to be clever + UINT uiIDA[2]; + uiIDA[0]=IDS_SELECTANEWDEVICE; + uiIDA[1]=IDS_NODEVICE_DECLINE; + + StorageManager.RequestMessageBox(IDS_STORAGEDEVICEPROBLEM_TITLE, IDS_FAILED_TO_LOADSAVE_TEXT, uiIDA, 2, pNotifyPressData->UserIndex,&UIScene_PauseMenu::DeviceRemovedDialogReturned,this); + } + else + { + // we need to ask if they are sure they want to overwrite the existing game + if(bSaveExists) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + StorageManager.RequestMessageBox(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, pNotifyPressData->UserIndex,&UIScene_PauseMenu::SaveGameDialogReturned,this, app.GetStringTable()); + } + else + { + // flag a app action of save game + app.SetAction(pNotifyPressData->UserIndex,eAppAction_SaveGame); + } + } + } + + break; + case BUTTON_PAUSE_EXITGAME: + { + // Check if it's the trial version + if(ProfileManager.IsFullVersion()) + { + UINT uiIDA[3]; + + // is it the primary player exiting? + if(pNotifyPressData->UserIndex==ProfileManager.GetPrimaryPad()) + { + int playTime = -1; + if( pMinecraft->localplayers[pNotifyPressData->UserIndex] != NULL ) + { + playTime = (int)pMinecraft->localplayers[pNotifyPressData->UserIndex]->getSessionTimer(); + } + + if(StorageManager.GetSaveDisabled()) + { + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + StorageManager.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_PROGRESS_LOST, uiIDA, 2, pNotifyPressData->UserIndex,&UIScene_PauseMenu::ExitGameDialogReturned,this, app.GetStringTable()); + } + else + { + if( g_NetworkManager.IsHost() ) + { + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_EXIT_GAME_SAVE; + uiIDA[2]=IDS_EXIT_GAME_NO_SAVE; + + if(g_NetworkManager.GetPlayerCount()>1) + { + StorageManager.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, pNotifyPressData->UserIndex,&UIScene_PauseMenu::ExitGameSaveDialogReturned,this, app.GetStringTable()); + } + else + { + StorageManager.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, pNotifyPressData->UserIndex,&UIScene_PauseMenu::ExitGameSaveDialogReturned,this, app.GetStringTable()); + } + } + else + { + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + + StorageManager.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 2, pNotifyPressData->UserIndex,&UIScene_PauseMenu::ExitGameDialogReturned,this, app.GetStringTable()); + } + } + } + else + { + int playTime = -1; + if( pMinecraft->localplayers[pNotifyPressData->UserIndex] != NULL ) + { + playTime = (int)pMinecraft->localplayers[pNotifyPressData->UserIndex]->getSessionTimer(); + } + + TelemetryManager->RecordLevelExit(pNotifyPressData->UserIndex, eSen_LevelExitStatus_Exited); + + + // just exit the player + app.SetAction(pNotifyPressData->UserIndex,eAppAction_ExitPlayer); + } + } + else + { + // is it the primary player exiting? + if(pNotifyPressData->UserIndex==ProfileManager.GetPrimaryPad()) + { + int playTime = -1; + if( pMinecraft->localplayers[pNotifyPressData->UserIndex] != NULL ) + { + playTime = (int)pMinecraft->localplayers[pNotifyPressData->UserIndex]->getSessionTimer(); + } + + // adjust the trial time played + CXuiSceneBase::ReduceTrialTimerValue(); + + // exit the level + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + StorageManager.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_PROGRESS_LOST, uiIDA, 2, pNotifyPressData->UserIndex,&UIScene_PauseMenu::ExitGameDialogReturned,this, app.GetStringTable()); + } + else + { + int playTime = -1; + if( pMinecraft->localplayers[pNotifyPressData->UserIndex] != NULL ) + { + playTime = (int)pMinecraft->localplayers[pNotifyPressData->UserIndex]->getSessionTimer(); + } + + TelemetryManager->RecordLevelExit(pNotifyPressData->UserIndex, eSen_LevelExitStatus_Exited); + + // just exit the player + app.SetAction(pNotifyPressData->UserIndex,eAppAction_ExitPlayer); + } + } + } + break; + default: + break; + } + + return S_OK; +} + +HRESULT UIScene_PauseMenu::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + // ignore repeated start presses to avoid the scene closing before it's opened + if((pInputData->dwKeyCode==VK_PAD_START) &&(pInputData->dwFlags&XUI_INPUT_FLAG_REPEAT )) + { + rfHandled = TRUE; + return S_OK; + } + + bool bIsisPrimaryHost=g_NetworkManager.IsHost() && (ProfileManager.GetPrimaryPad()==m_iPad); + bool bDisplayBanTip = !g_NetworkManager.IsLocalGame() && !bIsisPrimaryHost && !ProfileManager.IsGuest(m_iPad); + bool bUserisClientSide = ProfileManager.IsSignedInLive(m_iPad); + + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + app.DebugPrintf("PAUSE- Keydown in the xui %d flags = %d\n",pInputData->dwKeyCode,pInputData->dwFlags); + + + switch(pInputData->dwKeyCode) + { + + case VK_PAD_B: + case VK_PAD_START: + case VK_ESCAPE: + app.DebugPrintf("PAUSE PRESS PROCESSING - ipad = %d, UIScene_PauseMenu::OnKeyDown - LEAVING PAUSE MENU\n",m_iPad); + + if( m_iPad == ProfileManager.GetPrimaryPad() && g_NetworkManager.IsLocalGame() ) + { + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)FALSE); + } + + CXuiSceneBase::PlayUISFX(eSFX_Back); + app.CloseXuiScenes(pInputData->UserIndex); + if(!ProfileManager.IsFullVersion()) + { + CXuiSceneBase::ShowTrialTimer(TRUE); + } + rfHandled = TRUE; + + break; + + case VK_PAD_X: + // Change device + if(bIsisPrimaryHost) + { + // we need a function to deal with the return from this - if it changes, we need to update the pause menu and tooltips + // Fix for #12531 - TCR 001: BAS Game Stability: When a player selects to change a storage + // device, and repeatedly backs out of the SD screen, disconnects from LIVE, and then selects a SD, the title crashes. + m_bIgnoreInput=true; + + StorageManager.SetSaveDevice(&UIScene_PauseMenu::DeviceSelectReturned,this,true); + } + rfHandled = TRUE; + break; + + + case VK_PAD_Y: + { + if(bUserisClientSide) + { + // 4J Stu - Added check in 1.8.2 bug fix (TU6) to stop repeat key presses + bool bCanScreenshot = true; + for(int j=0; j < XUSER_MAX_COUNT;++j) + { + if(app.GetXuiAction(j) == eAppAction_SocialPostScreenshot) + { + bCanScreenshot = false; + break; + } + } + if(bCanScreenshot) app.SetAction(pInputData->UserIndex,eAppAction_SocialPost); + } + rfHandled = TRUE; + } + break; + + case VK_PAD_RSHOULDER: + if( bDisplayBanTip ) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + StorageManager.RequestMessageBox(IDS_ACTION_BAN_LEVEL_TITLE, IDS_ACTION_BAN_LEVEL_DESCRIPTION, uiIDA, 2, pInputData->UserIndex,&UIScene_PauseMenu::BanGameDialogReturned,this, app.GetStringTable()); + + rfHandled = TRUE; + } + break; + + // handle a keyboard Return specifically, because we've turned off the VK_A_OR_START for the pause menu, since this should exit the menu, rather than cause the button to be activated + case VK_RETURN: + // call OnNotifyPressEx directly to trigger the button press action + + HXUIOBJ hObjPressed=TreeGetFocus(); + XUINotifyPress NotifyPressData; + BOOL rfHandled=FALSE; + + NotifyPressData.UserIndex=pInputData->UserIndex; + OnNotifyPressEx(hObjPressed,&NotifyPressData,rfHandled); + + break; + } + + return S_OK; +} + +HRESULT UIScene_PauseMenu::OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled) +{ + bool bIsisPrimaryHost=g_NetworkManager.IsHost() && (ProfileManager.GetPrimaryPad()==m_iPad); + bool bDisplayBanTip = !g_NetworkManager.IsLocalGame() && !bIsisPrimaryHost && !ProfileManager.IsGuest(m_iPad); + bool bUserisClientSide = ProfileManager.IsSignedInLive(m_iPad); + + // Display the tooltips, we are only allowed to display "SHARE" if we have the capability (TCR). + if(StorageManager.GetSaveDisabled()) + { + if( ProfileManager.IsFullVersion() && CSocialManager::Instance()->IsTitleAllowedToPostImages() && CSocialManager::Instance()->AreAllUsersAllowedToPostImages() && bUserisClientSide) + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,bIsisPrimaryHost?IDS_TOOLTIPS_SELECTDEVICE:-1,IDS_TOOLTIPS_SHARE, -1,-1,-1,bDisplayBanTip?IDS_TOOLTIPS_BANLEVEL:-1); + } + else + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,-1,-1, -1,-1,-1,bDisplayBanTip?IDS_TOOLTIPS_BANLEVEL:-1); + } + } + else + { + if( CSocialManager::Instance()->IsTitleAllowedToPostImages() && CSocialManager::Instance()->AreAllUsersAllowedToPostImages() && bUserisClientSide) + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,bIsisPrimaryHost?IDS_TOOLTIPS_CHANGEDEVICE:-1,IDS_TOOLTIPS_SHARE, -1,-1,-1,bDisplayBanTip?IDS_TOOLTIPS_BANLEVEL:-1); + + } + else + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,bIsisPrimaryHost?IDS_TOOLTIPS_CHANGEDEVICE:-1,-1, -1,-1,-1,bDisplayBanTip?IDS_TOOLTIPS_BANLEVEL:-1); + } + } + + // set the focus to the last button we were on + XuiElementSetUserFocus(m_Buttons[m_iLastButtonPressed],m_iPad); + + CXuiSceneBase::ShowBackground( m_iPad, FALSE ); + CXuiSceneBase::ShowDarkOverlay( m_iPad, TRUE ); + + bool isWrongSize = false; + if(app.GetLocalPlayerCount()==1) + { + // If we were created as a splitscreen scene, then it's now going to be in the wrong place. Get rid of this scene. + if(m_bSplitscreen) + { + CXuiSceneBase::ShowLogo( m_iPad, FALSE ); + isWrongSize = true; + } + else + { + CXuiSceneBase::ShowLogo( m_iPad, TRUE ); + } + } + else + { + CXuiSceneBase::ShowLogo( m_iPad, FALSE ); + if(!m_bSplitscreen) isWrongSize = true; + } + + if(isWrongSize) + { + if( m_iPad == ProfileManager.GetPrimaryPad() && g_NetworkManager.IsLocalGame() ) + { + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)FALSE); + } + + app.CloseXuiScenes(m_iPad); + if(!ProfileManager.IsFullVersion()) + { + CXuiSceneBase::ShowTrialTimer(TRUE); + } + } + + return S_OK; +} + +HRESULT UIScene_PauseMenu::OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) +{ + pControlNavigateData->hObjDest=XuiControlGetNavigation(pControlNavigateData->hObjSource,pControlNavigateData->nControlNavigate,TRUE,TRUE); + + if(pControlNavigateData->hObjDest!=NULL) + { + bHandled=TRUE; + } + + return S_OK; +} + +int UIScene_PauseMenu::BanGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { + // 4J Stu - Only do this if we are currently idle, don't want the (relatively) low priority ban task overriding something else + if(app.GetXuiAction(iPad) == eAppAction_Idle) app.SetAction(iPad,eAppAction_BanLevel); + } + return 0; +} + +int UIScene_PauseMenu::DeviceSelectReturned(void *pParam,bool bContinue) +{ + // Has someone pulled the ethernet cable and caused the pause menu to be closed before this callback returns? + if(!app.IsPauseMenuDisplayed(ProfileManager.GetPrimaryPad())) + { + return 0; + } + + UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)pParam; + bool bIsisPrimaryHost=g_NetworkManager.IsHost() && (ProfileManager.GetPrimaryPad()==pClass->m_iPad); + bool bDisplayBanTip = !g_NetworkManager.IsLocalGame() && !bIsisPrimaryHost && !ProfileManager.IsGuest(pClass->m_iPad); + bool bUserisClientSide = ProfileManager.IsSignedInLive(pClass->m_iPad); + + //Whatever happen, we need to update the pause menu and the tooltips + // Display the tooltips, we are only allowed to display "SHARE" if we have the capability (TCR). + if(StorageManager.GetSaveDisabled()) + { + if( ProfileManager.IsFullVersion() && CSocialManager::Instance()->IsTitleAllowedToPostImages() && CSocialManager::Instance()->AreAllUsersAllowedToPostImages() && bUserisClientSide) + { + ui.SetTooltips( pClass->m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,bIsisPrimaryHost?IDS_TOOLTIPS_SELECTDEVICE:-1,IDS_TOOLTIPS_SHARE, -1,-1,-1,bDisplayBanTip?IDS_TOOLTIPS_BANLEVEL:-1); + } + else + { + ui.SetTooltips( pClass->m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,-1,-1, -1,-1,-1,bDisplayBanTip?IDS_TOOLTIPS_BANLEVEL:-1); + } + // disable save button + // set the focus on to another button + pClass->m_Buttons[BUTTON_PAUSE_SAVEGAME].SetEnable(FALSE); + pClass->m_Buttons[BUTTON_PAUSE_SAVEGAME].EnableInput(FALSE); + + pClass->m_Buttons[BUTTON_PAUSE_RESUMEGAME].InitFocus(pClass->m_iPad); + } + else + { + if( CSocialManager::Instance()->IsTitleAllowedToPostImages() && CSocialManager::Instance()->AreAllUsersAllowedToPostImages() && bUserisClientSide) + { + ui.SetTooltips(pClass->m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,bIsisPrimaryHost?IDS_TOOLTIPS_CHANGEDEVICE:-1,IDS_TOOLTIPS_SHARE, -1,-1,-1,bDisplayBanTip?IDS_TOOLTIPS_BANLEVEL:-1); + } + else + { + ui.SetTooltips( pClass->m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,bIsisPrimaryHost?IDS_TOOLTIPS_CHANGEDEVICE:-1,-1, -1,-1,-1,bDisplayBanTip?IDS_TOOLTIPS_BANLEVEL:-1); + } + // enable save button + pClass->m_Buttons[BUTTON_PAUSE_SAVEGAME].SetEnable(TRUE); + pClass->m_Buttons[BUTTON_PAUSE_SAVEGAME].EnableInput(TRUE); + + } + + pClass->m_bIgnoreInput=false; + return 0; +} + +HRESULT UIScene_PauseMenu::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) +{ + bHandled=true; + return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining,false); +} + +HRESULT UIScene_PauseMenu::OnTimer(XUIMessageTimer *pData,BOOL& rfHandled) +{ + if(pData->nId==IGNORE_KEYPRESS_TIMERID) + { + XuiKillTimer(m_hObj,IGNORE_KEYPRESS_TIMERID); + + // block input if we're waiting for DLC to install, and wipe the saves list. The end of dlc mounting custom message will fill the list again + if(app.StartInstallDLCProcess(m_iPad)==true) + { + // not doing a mount, so enable input + m_bIgnoreInput=true; + } + else + { + m_bIgnoreInput=false; + } + } + + return S_OK; +} + + +HRESULT UIScene_PauseMenu::OnDestroy() +{ + //XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_AUTO); + TelemetryManager->RecordUnpauseOrActive(m_iPad); + + if( m_iPad == ProfileManager.GetPrimaryPad() && g_NetworkManager.IsLocalGame() ) + { + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)FALSE); + } + + return S_OK; +} + +int UIScene_PauseMenu::DeviceRemovedDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { + // continue without saving + StorageManager.SetSaveDisabled(true); + StorageManager.SetSaveDeviceSelected(ProfileManager.GetPrimaryPad(),false); + + // Has someone pulled the ethernet cable and caused the pause menu to be closed before this callback returns? + if(app.IsPauseMenuDisplayed(ProfileManager.GetPrimaryPad())) + { + UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)pParam; + + // use the device select returned function to wipe the saves list and change the tooltip + pClass->DeviceSelectReturned(pClass,true); + } + } + else + { + // Change device + if(app.IsPauseMenuDisplayed(ProfileManager.GetPrimaryPad())) + { + UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)pParam; + StorageManager.SetSaveDevice(&UIScene_PauseMenu::DeviceSelectReturned,pClass,true); + } + } + return 0; +} + +HRESULT UIScene_PauseMenu::OnCustomMessage_DLCInstalled() +{ + // mounted DLC may have changed + if(app.StartInstallDLCProcess(m_iPad)==false) + { + // not doing a mount, so re-enable input + m_bIgnoreInput=false; + } + else + { + m_bIgnoreInput=true; + } + // this will send a CustomMessage_DLCMountingComplete when done + return S_OK; +} + +HRESULT UIScene_PauseMenu::OnCustomMessage_DLCMountingComplete() +{ + m_bIgnoreInput=false; + app.m_dlcManager.checkForCorruptDLCAndAlert(); + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_AUTO); + return S_OK; +} + +void UIScene_PauseMenu::ShowScene(bool show) +{ + SetShow(show?TRUE:FALSE); +} + +int UIScene_PauseMenu::WarningTrialTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_PauseMenu* pScene = (UIScene_PauseMenu*)pParam; + + //pScene->m_bIgnoreInput = false; + pScene->ShowScene( true ); + if(result==C4JStorage::EMessage_ResultAccept) + { + if(ProfileManager.IsSignedIn(iPad)) + { + ULONGLONG ullIndexA[1]; + + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + // get the dlc texture pack + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + // Need to get the parent packs id, since this may be one of many child packs with their own ids + app.GetDLCFullOfferIDForPackID(pDLCTexPack->getDLCParentPackId(),&ullIndexA[0]); + + // need to allow downloads here, or the player would need to quit the game to let the download of a texture pack happen. This might affect the network traffic, since the download could take all the bandwidth... + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); + + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + } + } + else + { + TelemetryManager->RecordUpsellResponded(iPad, eSet_UpsellID_Texture_DLC, ( pScene->m_pDLCPack->getPurchaseOfferId() & 0xFFFFFFFF ), eSen_UpsellOutcome_Declined); + } + + + return 0; +} + +int UIScene_PauseMenu::ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_PauseMenu *pClass = (UIScene_PauseMenu *)pParam; + // Exit with or without saving + // Decline means save in this dialog + if(result==C4JStorage::EMessage_ResultDecline || result==C4JStorage::EMessage_ResultThirdOption) + { + if( result==C4JStorage::EMessage_ResultDecline ) // Save + { + // 4J-PB - Is the player trying to save but they are using a trial texturepack ? + if(!Minecraft::GetInstance()->skins->isUsingDefaultSkin()) + { + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + DLCPack *pDLCPack=pDLCTexPack->getDLCInfoParentPack();//tPack->getDLCPack(); + if(!pDLCPack->hasPurchasedFile( DLCManager::e_DLCType_Texture, L"" )) + { +#ifdef _XBOX + // upsell + ULONGLONG ullOfferID_Full; + // get the dlc texture pack + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + app.GetDLCFullOfferIDForPackID(pDLCTexPack->getDLCParentPackId(),&ullOfferID_Full); + + // tell sentient about the upsell of the full version of the skin pack + TelemetryManager->RecordUpsellPresented(iPad, eSet_UpsellID_Texture_DLC, ullOfferID_Full & 0xFFFFFFFF); +#endif + + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + // Give the player a warning about the trial version of the texture pack + ui.RequestMessageBox(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad() ,&UIScene_PauseMenu::WarningTrialTexturePackReturned,pClass,app.GetStringTable()); + + return S_OK; + } + } + + // does the save exist? + bool bSaveExists; + StorageManager.DoesSaveExist(&bSaveExists); + // 4J-PB - we check if the save exists inside the libs + // we need to ask if they are sure they want to overwrite the existing game + if(bSaveExists) + { + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_PauseMenu::ExitGameAndSaveReturned,pClass, app.GetStringTable()); + return 0; + } + else + { + MinecraftServer::getInstance()->setSaveOnExit( true ); + } + } + else + { + // been a few requests for a confirm on exit without saving + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + ui.RequestMessageBox(IDS_TITLE_DECLINE_SAVE_GAME, IDS_CONFIRM_DECLINE_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_PauseMenu::ExitGameDeclineSaveReturned, dynamic_cast(pClass), app.GetStringTable()); + return 0; + } + + app.SetAction(iPad,eAppAction_ExitWorld); + } + return 0; +} + +int UIScene_PauseMenu::ExitGameDeclineSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { + MinecraftServer::getInstance()->setSaveOnExit( false ); + // flag a app action of exit game + app.SetAction(iPad,eAppAction_ExitWorld); + } + else + { + // has someone disconnected the ethernet here, causing the pause menu to shut? + if(ui.IsPauseMenuDisplayed(ProfileManager.GetPrimaryPad())) + { + IUIScene_PauseMenu* pClass = (IUIScene_PauseMenu*)pParam; + UINT uiIDA[3]; + // you cancelled the save on exit after choosing exit and save? You go back to the Exit choices then. + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_EXIT_GAME_SAVE; + uiIDA[2]=IDS_EXIT_GAME_NO_SAVE; + + if(g_NetworkManager.GetPlayerCount()>1) + { + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, ProfileManager.GetPrimaryPad(),&UIScene_PauseMenu::ExitGameSaveDialogReturned,pClass, app.GetStringTable(), 0, 0, false); + } + else + { + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, ProfileManager.GetPrimaryPad(),&UIScene_PauseMenu::ExitGameSaveDialogReturned,pClass, app.GetStringTable(), 0, 0, false); + } + } + + } + return 0; +} + +int UIScene_PauseMenu::ExitGameAndSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + // 4J-PB - we won't come in here if we have a trial texture pack + + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { + MinecraftServer::getInstance()->setSaveOnExit( true ); + // flag a app action of exit game + app.SetAction(iPad,eAppAction_ExitWorld); + } + else + { + // has someone disconnected the ethernet here, causing the pause menu to shut? + if(ui.IsPauseMenuDisplayed(ProfileManager.GetPrimaryPad())) + { + UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)pParam; + UINT uiIDA[3]; + // you cancelled the save on exit after choosing exit and save? You go back to the Exit choices then. + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_EXIT_GAME_SAVE; + uiIDA[2]=IDS_EXIT_GAME_NO_SAVE; + + if(g_NetworkManager.GetPlayerCount()>1) + { + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, ProfileManager.GetPrimaryPad(),&UIScene_PauseMenu::ExitGameSaveDialogReturned,pClass, app.GetStringTable(), 0, 0, false); + } + else + { + ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, ProfileManager.GetPrimaryPad(),&UIScene_PauseMenu::ExitGameSaveDialogReturned,pClass, app.GetStringTable(), 0, 0, false); + } + } + + } + return 0; +} + +int UIScene_PauseMenu::SaveGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { + // flag a app action of save game + app.SetAction(iPad,eAppAction_SaveGame); + } + return 0; +} + +int UIScene_PauseMenu::ExitGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { + app.SetAction(iPad,eAppAction_ExitWorld); + } + return 0; +} + +int UIScene_PauseMenu::SaveWorldThreadProc( LPVOID lpParameter ) +{ + bool bAutosave=(bool)lpParameter; + if(bAutosave) + { + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_AutoSaveGame); + } + else + { + app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_SaveGame); + } + + // Share AABB & Vec3 pools with default (main thread) - should be ok as long as we don't tick the main thread whilst this thread is running + AABB::UseDefaultThreadStorage(); + Vec3::UseDefaultThreadStorage(); + Compression::UseDefaultThreadStorage(); + + Minecraft *pMinecraft=Minecraft::GetInstance(); + + //wprintf(L"Loading world on thread\n"); + + if(ProfileManager.IsFullVersion()) + { + app.SetGameStarted(false); + + while( app.GetXuiServerAction(ProfileManager.GetPrimaryPad() ) != eXuiServerAction_Idle && !MinecraftServer::serverHalted() ) + { + Sleep(10); + } + + if(!MinecraftServer::serverHalted() && !app.GetChangingSessionType() ) app.SetGameStarted(true); + } + + HRESULT hr = S_OK; + if(app.GetChangingSessionType()) + { + // 4J Stu - This causes the fullscreenprogress scene to ignore the action it was given + hr = ERROR_CANCELLED; + } + return hr; +} + +int UIScene_PauseMenu::ExitWorldThreadProc( void* lpParameter ) +{ + // Share AABB & Vec3 pools with default (main thread) - should be ok as long as we don't tick the main thread whilst this thread is running + AABB::UseDefaultThreadStorage(); + Vec3::UseDefaultThreadStorage(); + Compression::UseDefaultThreadStorage(); + + //app.SetGameStarted(false); + + _ExitWorld(lpParameter); + + return S_OK; +} + +// This function performs the meat of exiting from a level. It should be called from a thread other than the main thread. +void UIScene_PauseMenu::_ExitWorld(LPVOID lpParameter) +{ + Minecraft *pMinecraft=Minecraft::GetInstance(); + + int exitReasonStringId = pMinecraft->progressRenderer->getCurrentTitle(); + int exitReasonTitleId = IDS_CONNECTION_LOST; + + bool saveStats = true; + if (pMinecraft->isClientSide() || g_NetworkManager.IsInSession()) + { + if(lpParameter != NULL ) + { + // 4J-PB - check if we have lost connection to Live + if(ProfileManager.GetLiveConnectionStatus()!=XONLINE_S_LOGON_CONNECTION_ESTABLISHED ) + { + exitReasonStringId = IDS_CONNECTION_LOST_LIVE; + } + else + { + switch( app.GetDisconnectReason() ) + { + case DisconnectPacket::eDisconnect_Kicked: + exitReasonStringId = IDS_DISCONNECTED_KICKED; + break; + case DisconnectPacket::eDisconnect_NoUGC_AllLocal: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; + case DisconnectPacket::eDisconnect_NoUGC_Single_Local: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; +#ifdef _XBOX + case DisconnectPacket::eDisconnect_NoUGC_Remote: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_REMOTE; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; +#endif + case DisconnectPacket::eDisconnect_NoFlying: + exitReasonStringId = IDS_DISCONNECTED_FLYING; + break; + case DisconnectPacket::eDisconnect_Quitting: + exitReasonStringId = IDS_DISCONNECTED_SERVER_QUIT; + break; + case DisconnectPacket::eDisconnect_NoFriendsInGame: + exitReasonStringId = IDS_DISCONNECTED_NO_FRIENDS_IN_GAME; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; + case DisconnectPacket::eDisconnect_Banned: + exitReasonStringId = IDS_DISCONNECTED_BANNED; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; + case DisconnectPacket::eDisconnect_NotFriendsWithHost: + exitReasonStringId = IDS_NOTALLOWED_FRIENDSOFFRIENDS; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; + case DisconnectPacket::eDisconnect_OutdatedServer: + exitReasonStringId = IDS_DISCONNECTED_SERVER_OLD; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; + case DisconnectPacket::eDisconnect_OutdatedClient: + exitReasonStringId = IDS_DISCONNECTED_CLIENT_OLD; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; + case DisconnectPacket::eDisconnect_ServerFull: + exitReasonStringId = IDS_DISCONNECTED_SERVER_FULL; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; + default: + exitReasonStringId = IDS_CONNECTION_LOST_SERVER; + } + } + //pMinecraft->progressRenderer->progressStartNoAbort( exitReasonStringId ); + + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + // 4J Stu - Fix for #48669 - TU5: Code: Compliance: TCR #15: Incorrect/misleading messages after signing out a profile during online game session. + // If the primary player is signed out, then that is most likely the cause of the disconnection so don't display a message box. This will allow the message box requested by the libraries to be brought up + if( ProfileManager.IsSignedIn(ProfileManager.GetPrimaryPad())) ui.RequestMessageBox( exitReasonTitleId, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + exitReasonStringId = -1; + + // 4J - Force a disconnection, this handles the situation that the server has already disconnected + if( pMinecraft->levels[0] != NULL ) pMinecraft->levels[0]->disconnect(false); + if( pMinecraft->levels[1] != NULL ) pMinecraft->levels[1]->disconnect(false); + if( pMinecraft->levels[2] != NULL ) pMinecraft->levels[2]->disconnect(false); + } + else + { + exitReasonStringId = IDS_EXITING_GAME; + pMinecraft->progressRenderer->progressStartNoAbort( IDS_EXITING_GAME ); + if( pMinecraft->levels[0] != NULL ) pMinecraft->levels[0]->disconnect(); + if( pMinecraft->levels[1] != NULL ) pMinecraft->levels[1]->disconnect(); + if( pMinecraft->levels[2] != NULL ) pMinecraft->levels[2]->disconnect(); + } + + // 4J Stu - This only does something if we actually have a server, so don't need to do any other checks + MinecraftServer::HaltServer(); + + // We need to call the stats & leaderboards save before we exit the session + // 4J We need to do this in a QNet callback where it is safe + //pMinecraft->forceStatsSave(); + saveStats = false; + + // 4J Stu - Leave the session once the disconnect packet has been sent + g_NetworkManager.LeaveGame(FALSE); + } + else + { + if(lpParameter != NULL && ProfileManager.IsSignedIn(ProfileManager.GetPrimaryPad()) ) + { + switch( app.GetDisconnectReason() ) + { + case DisconnectPacket::eDisconnect_Kicked: + exitReasonStringId = IDS_DISCONNECTED_KICKED; + break; + case DisconnectPacket::eDisconnect_NoUGC_AllLocal: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; + case DisconnectPacket::eDisconnect_NoUGC_Single_Local: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; +#ifdef _XBOX + case DisconnectPacket::eDisconnect_NoUGC_Remote: + exitReasonStringId = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_REMOTE; + exitReasonTitleId = IDS_CONNECTION_FAILED; + break; +#endif + case DisconnectPacket::eDisconnect_Quitting: + exitReasonStringId = IDS_DISCONNECTED_SERVER_QUIT; + break; + case DisconnectPacket::eDisconnect_NoMultiplayerPrivilegesJoin: + exitReasonStringId = IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT; + break; + case DisconnectPacket::eDisconnect_OutdatedServer: + exitReasonStringId = IDS_DISCONNECTED_SERVER_OLD; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; + case DisconnectPacket::eDisconnect_OutdatedClient: + exitReasonStringId = IDS_DISCONNECTED_CLIENT_OLD; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; + case DisconnectPacket::eDisconnect_ServerFull: + exitReasonStringId = IDS_DISCONNECTED_SERVER_FULL; + exitReasonTitleId = IDS_CANTJOIN_TITLE; + break; + default: + exitReasonStringId = IDS_DISCONNECTED; + } + //pMinecraft->progressRenderer->progressStartNoAbort( exitReasonStringId ); + + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestMessageBox( exitReasonTitleId, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + exitReasonStringId = -1; + } + } + // Fix for #93148 - TCR 001: BAS Game Stability: Title will crash for the multiplayer client if host of the game will exit during the clients loading to created world. + while( g_NetworkManager.IsNetworkThreadRunning() ) + { + Sleep(1); + } + pMinecraft->setLevel(NULL,exitReasonStringId,nullptr,saveStats); + + TelemetryManager->Flush(); + + app.m_gameRules.unloadCurrentGameRules(); + //app.m_Audio.unloadCurrentAudioDetails(); + + MinecraftServer::resetFlags(); + + // Fix for #48385 - BLACK OPS :TU5: Functional: Client becomes pseudo soft-locked when returned to the main menu after a remote disconnect + // Make sure there is text explaining why the player is waiting + pMinecraft->progressRenderer->progressStart(IDS_EXITING_GAME); + + // Fix for #13259 - CRASH: Gameplay: loading process is halted when player loads saved data + // We can't start/join a new game until the session is destroyed, so wait for it to be idle again + while( g_NetworkManager.IsInSession() ) + { + Sleep(1); + } + + app.SetChangingSessionType(false); + app.SetReallyChangingSessionType(false); +} + +void UIScene_PauseMenu::SetIgnoreInput(bool ignoreInput) +{ + m_bIgnoreInput = ignoreInput; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_PauseMenu.h b/Minecraft.Client/Common/XUI/XUI_PauseMenu.h new file mode 100644 index 00000000..9c0e0015 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_PauseMenu.h @@ -0,0 +1,89 @@ +#pragma once +#include "../media/xuiscene_Pause.h" +#include "..\UI\IUIScene_PauseMenu.h" +#include "XUI_CustomMessages.h" + +#define BUTTON_PAUSE_RESUMEGAME 0 +#define BUTTON_PAUSE_HELPANDOPTIONS 1 +#define BUTTON_PAUSE_LEADERBOARDS 2 +#define BUTTON_PAUSE_ACHIEVEMENTS 3 +#define BUTTON_PAUSE_SAVEGAME 4 +#define BUTTON_PAUSE_EXITGAME 5 +#define BUTTONS_PAUSE_MAX BUTTON_PAUSE_EXITGAME + 1 + + + +class UIScene_PauseMenu : public CXuiSceneImpl, public IUIScene_PauseMenu +{ + protected: + // Control and Element wrapper objects. + CXuiScene m_Scene; + CXuiControl m_Buttons[BUTTONS_PAUSE_MAX]; + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_NAV_RETURN(OnNavReturn) + XUI_ON_XM_CONTROL_NAVIGATE( OnControlNavigate ) + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + XUI_ON_XM_TIMER( OnTimer ) + XUI_ON_XM_DESTROY(OnDestroy) + XUI_ON_XM_DLCINSTALLED_MESSAGE(OnCustomMessage_DLCInstalled) + XUI_ON_XM_DLCLOADED_MESSAGE(OnCustomMessage_DLCMountingComplete) + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_XuiButton1, m_Buttons[BUTTON_PAUSE_RESUMEGAME]) + MAP_CONTROL(IDC_XuiButton2, m_Buttons[BUTTON_PAUSE_HELPANDOPTIONS ]) + MAP_CONTROL(IDC_XuiButton3, m_Buttons[BUTTON_PAUSE_LEADERBOARDS ]) + MAP_CONTROL(IDC_XuiButton4, m_Buttons[BUTTON_PAUSE_ACHIEVEMENTS]) + MAP_CONTROL(IDC_XuiButton5, m_Buttons[BUTTON_PAUSE_SAVEGAME]) + MAP_CONTROL(IDC_XuiButton6, m_Buttons[BUTTON_PAUSE_EXITGAME]) + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled); + HRESULT OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled); + HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled); + HRESULT OnTimer(XUIMessageTimer *pData,BOOL& rfHandled); + HRESULT OnDestroy(); + HRESULT OnCustomMessage_DLCInstalled(); + HRESULT OnCustomMessage_DLCMountingComplete(); + +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( UIScene_PauseMenu, L"CScene_Pause", XUI_CLASS_SCENE ) + + static int BanGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int DeviceSelectReturned(void *pParam,bool bContinue); + static int DeviceRemovedDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int WarningTrialTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ExitGameDeclineSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ExitGameAndSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int SaveGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int ExitGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + + static int SaveWorldThreadProc( void* lpParameter ); + static int ExitWorldThreadProc( void* lpParameter ); + static void _ExitWorld(LPVOID lpParameter); // Call only from a thread + + +protected: + virtual void ShowScene(bool show); + virtual void SetIgnoreInput(bool ignoreInput); + +private: + int m_iPad; + int m_iLastButtonPressed; + D3DXVECTOR3 m_OriginalPosition; + bool m_bIgnoreInput; + bool m_bSplitscreen; + +}; diff --git a/Minecraft.Client/Common/XUI/XUI_Reinstall.cpp b/Minecraft.Client/Common/XUI/XUI_Reinstall.cpp new file mode 100644 index 00000000..c1e06c0d --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Reinstall.cpp @@ -0,0 +1,339 @@ +// Minecraft.cpp : Defines the entry point for the application. +// + +#include "stdafx.h" + +#include +#include "..\XUI\XUI_Reinstall.h" +#include "..\..\..\Minecraft.World\AABB.h" +#include "..\..\..\Minecraft.World\Vec3.h" +#include "..\..\..\Minecraft.World\net.minecraft.stats.h" +#include "..\..\..\Minecraft.Client\StatsCounter.h" +#include "..\..\..\Minecraft.World\Entity.h" +#include "..\..\..\Minecraft.World\Level.h" +#include "..\..\..\Minecraft.Client\LocalPlayer.h" +#include "..\..\MinecraftServer.h" +#include "..\..\ProgressRenderer.h" +#include "..\..\..\Minecraft.World\DisconnectPacket.h" +#include "..\..\Minecraft.h" +#include "..\..\Options.h" + + + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_Reinstall::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + // We'll only be in this menu from the main menu, not in game + m_iPad = *(int *)pInitData->pvInitData; + + m_bIgnoreInput=false; + MapChildControls(); + + XuiControlSetText(m_Buttons[BUTTON_REINSTALL_THEME],app.GetString(IDS_REINSTALL_THEME)); + XuiControlSetText(m_Buttons[BUTTON_REINSTALL_GAMERPIC1],app.GetString(IDS_REINSTALL_GAMERPIC_1)); + XuiControlSetText(m_Buttons[BUTTON_REINSTALL_GAMERPIC2],app.GetString(IDS_REINSTALL_GAMERPIC_2)); + XuiControlSetText(m_Buttons[BUTTON_REINSTALL_AVATAR1],app.GetString(IDS_REINSTALL_AVATAR_ITEM_1)); + XuiControlSetText(m_Buttons[BUTTON_REINSTALL_AVATAR2],app.GetString(IDS_REINSTALL_AVATAR_ITEM_2)); + XuiControlSetText(m_Buttons[BUTTON_REINSTALL_AVATAR3],app.GetString(IDS_REINSTALL_AVATAR_ITEM_3)); + + int iFirstEnabled=-1; + + // we can only come in here if we are the primary player, it's the full version, and we have some content to re-install + + if(ProfileManager.IsAwardsFlagSet(m_iPad,eAward_mine100Blocks) ) + { + m_Buttons[BUTTON_REINSTALL_GAMERPIC1].SetEnable(TRUE); + m_Buttons[BUTTON_REINSTALL_GAMERPIC1].EnableInput(TRUE); + if(iFirstEnabled==-1) iFirstEnabled=BUTTON_REINSTALL_GAMERPIC1; + } + else + { + m_Buttons[BUTTON_REINSTALL_GAMERPIC1].SetEnable(FALSE); + m_Buttons[BUTTON_REINSTALL_GAMERPIC1].EnableInput(FALSE); + } + + if(ProfileManager.IsAwardsFlagSet(m_iPad,eAward_kill10Creepers) ) + { + m_Buttons[BUTTON_REINSTALL_GAMERPIC2].SetEnable(TRUE); + m_Buttons[BUTTON_REINSTALL_GAMERPIC2].EnableInput(TRUE); + if(iFirstEnabled==-1) iFirstEnabled=BUTTON_REINSTALL_GAMERPIC2; + } + else + { + m_Buttons[BUTTON_REINSTALL_GAMERPIC2].SetEnable(FALSE); + m_Buttons[BUTTON_REINSTALL_GAMERPIC2].EnableInput(FALSE); + } + if(ProfileManager.IsAwardsFlagSet(m_iPad,eAward_eatPorkChop) ) + { + m_Buttons[BUTTON_REINSTALL_AVATAR1].SetEnable(TRUE); + m_Buttons[BUTTON_REINSTALL_AVATAR1].EnableInput(TRUE); + if(iFirstEnabled==-1) iFirstEnabled=BUTTON_REINSTALL_AVATAR1; + } + else + { + m_Buttons[BUTTON_REINSTALL_AVATAR1].SetEnable(FALSE); + m_Buttons[BUTTON_REINSTALL_AVATAR1].EnableInput(FALSE); + } + if(ProfileManager.IsAwardsFlagSet(m_iPad,eAward_play100Days) ) + { + m_Buttons[BUTTON_REINSTALL_AVATAR2].SetEnable(TRUE); + m_Buttons[BUTTON_REINSTALL_AVATAR2].EnableInput(TRUE); + if(iFirstEnabled==-1) iFirstEnabled=BUTTON_REINSTALL_AVATAR2; + } + else + { + m_Buttons[BUTTON_REINSTALL_AVATAR2].SetEnable(FALSE); + m_Buttons[BUTTON_REINSTALL_AVATAR2].EnableInput(FALSE); + } + if(ProfileManager.IsAwardsFlagSet(m_iPad,eAward_arrowKillCreeper) ) + { + m_Buttons[BUTTON_REINSTALL_AVATAR3].SetEnable(TRUE); + m_Buttons[BUTTON_REINSTALL_AVATAR3].EnableInput(TRUE); + if(iFirstEnabled==-1) iFirstEnabled=BUTTON_REINSTALL_AVATAR3; + } + else + { + m_Buttons[BUTTON_REINSTALL_AVATAR3].SetEnable(FALSE); + m_Buttons[BUTTON_REINSTALL_AVATAR3].EnableInput(FALSE); + } + if(ProfileManager.IsAwardsFlagSet(m_iPad,eAward_socialPost) ) + { + m_Buttons[BUTTON_REINSTALL_THEME].SetEnable(TRUE); + m_Buttons[BUTTON_REINSTALL_THEME].EnableInput(TRUE); + if(iFirstEnabled==-1) iFirstEnabled=BUTTON_REINSTALL_THEME; + } + else + { + m_Buttons[BUTTON_REINSTALL_THEME].SetEnable(FALSE); + m_Buttons[BUTTON_REINSTALL_THEME].EnableInput(FALSE); + } + + // if iFirstEnabled is still -1 then we shouldn't set focus to a button + if(iFirstEnabled!=-1) + { + m_Buttons[iFirstEnabled].InitFocus(m_iPad); + } + + // allow the user to change the storage device + if(!StorageManager.GetSaveDeviceSelected(m_iPad)) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,IDS_TOOLTIPS_SELECTDEVICE); + } + else + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,IDS_TOOLTIPS_CHANGEDEVICE); + } + + return S_OK; +} + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_Reinstall::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + unsigned int uiButtonCounter=0; + + while((uiButtonCounterUserIndex, eAward_socialPost, true ); + break; + case BUTTON_REINSTALL_GAMERPIC1: + ProfileManager.Award( pNotifyPressData->UserIndex, eAward_mine100Blocks, true); + break; + case BUTTON_REINSTALL_GAMERPIC2: + ProfileManager.Award( pNotifyPressData->UserIndex, eAward_kill10Creepers, true); + break; + case BUTTON_REINSTALL_AVATAR1: + ProfileManager.Award( pNotifyPressData->UserIndex, eAward_eatPorkChop, true ); + break; + case BUTTON_REINSTALL_AVATAR2: + ProfileManager.Award( pNotifyPressData->UserIndex, eAward_play100Days, true ); + break; + case BUTTON_REINSTALL_AVATAR3: + ProfileManager.Award( pNotifyPressData->UserIndex, eAward_arrowKillCreeper, true ); + break; + } + + return S_OK; +} + +HRESULT CScene_Reinstall::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + switch(pInputData->dwKeyCode) + { + case VK_PAD_B: + case VK_PAD_START: + case VK_ESCAPE: + app.NavigateBack(m_iPad); + rfHandled = TRUE; + + break; + case VK_PAD_X: + // Change device + // we need a function to deal with the return from this - if it changes, we need to update the tooltips + // Fix for #12531 - TCR 001: BAS Game Stability: When a player selects to change a storage + // device, and repeatedly backs out of the SD screen, disconnects from LIVE, and then selects a SD, the title crashes. + m_bIgnoreInput=true; + StorageManager.SetSaveDevice(&CScene_Reinstall::DeviceSelectReturned,this,true); + + rfHandled = TRUE; + break; + } + + return S_OK; +} + +HRESULT CScene_Reinstall::OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled) +{ + + return S_OK; +} + +HRESULT CScene_Reinstall::OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) +{ + pControlNavigateData->hObjDest=XuiControlGetNavigation(pControlNavigateData->hObjSource,pControlNavigateData->nControlNavigate,TRUE,TRUE); + + if(pControlNavigateData->hObjDest!=NULL) + { + bHandled=TRUE; + } + + return S_OK; +} + +HRESULT CScene_Reinstall::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ) +{ + if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) return S_OK; + + if(pTransition->dwTransType == XUI_TRANSITION_TO || pTransition->dwTransType == XUI_TRANSITION_BACKTO) + { + + // 4J-PB - Going to resize buttons if the text is too big to fit on any of them (Br-pt problem with the length of Unlock Full Game) + XUIRect xuiRect; + HXUIOBJ visual=NULL; + HXUIOBJ text; + float fMaxTextLen=0.0f; + float fTextVisualLen; + float fMaxButton; + float fWidth,fHeight; + + HRESULT hr=XuiControlGetVisual(m_Buttons[0].m_hObj,&visual); + hr=XuiElementGetChildById(visual,L"text_Label",&text); + hr=XuiElementGetBounds(text,&fTextVisualLen,&fHeight); + m_Buttons[0].GetBounds(&fMaxButton,&fHeight); + + + for(int i=0;ifMaxTextLen) fMaxTextLen=xuiRect.right; + } + + if(fTextVisualLenm_iPad)) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,IDS_TOOLTIPS_SELECTDEVICE); + } + else + { + ui.SetTooltips(DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,IDS_TOOLTIPS_CHANGEDEVICE); + } + + pClass->m_bIgnoreInput=false; + return 0; +} + +int CScene_Reinstall::DeviceSelectReturned_AndReinstall(void *pParam,bool bContinue) +{ + CScene_Reinstall* pClass = (CScene_Reinstall*)pParam; + + if(!StorageManager.GetSaveDeviceSelected(pClass->m_iPad)) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,IDS_TOOLTIPS_SELECTDEVICE); + } + else + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK,IDS_TOOLTIPS_CHANGEDEVICE); + // reinstall + switch(pClass->m_iLastButtonPressed) + { + case BUTTON_REINSTALL_THEME: + ProfileManager.Award( pClass->m_iPad, eAward_socialPost, true ); + break; + case BUTTON_REINSTALL_GAMERPIC1: + ProfileManager.Award( pClass->m_iPad, eAward_mine100Blocks, true); + break; + case BUTTON_REINSTALL_GAMERPIC2: + ProfileManager.Award( pClass->m_iPad, eAward_kill10Creepers, true); + break; + case BUTTON_REINSTALL_AVATAR1: + ProfileManager.Award( pClass->m_iPad, eAward_eatPorkChop, true ); + break; + case BUTTON_REINSTALL_AVATAR2: + ProfileManager.Award( pClass->m_iPad, eAward_play100Days, true ); + break; + case BUTTON_REINSTALL_AVATAR3: + ProfileManager.Award( pClass->m_iPad, eAward_arrowKillCreeper, true ); + break; + } + } + pClass->m_bIgnoreInput=false; + return 0; +} + + diff --git a/Minecraft.Client/Common/XUI/XUI_Reinstall.h b/Minecraft.Client/Common/XUI/XUI_Reinstall.h new file mode 100644 index 00000000..06b823cb --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Reinstall.h @@ -0,0 +1,63 @@ +#pragma once + +#include "../media/xuiscene_Reinstall.h" + +#define BUTTON_REINSTALL_THEME 0 +#define BUTTON_REINSTALL_GAMERPIC1 1 +#define BUTTON_REINSTALL_GAMERPIC2 2 +#define BUTTON_REINSTALL_AVATAR1 3 +#define BUTTON_REINSTALL_AVATAR2 4 +#define BUTTON_REINSTALL_AVATAR3 5 +#define BUTTONS_REINSTALL_MAX BUTTON_REINSTALL_AVATAR3 + 1 + + + +class CScene_Reinstall : public CXuiSceneImpl +{ + protected: + // Control and Element wrapper objects. + CXuiControl m_Buttons[BUTTONS_REINSTALL_MAX]; + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_TRANSITION_START(OnTransitionStart) + XUI_ON_XM_NAV_RETURN(OnNavReturn) + XUI_ON_XM_CONTROL_NAVIGATE( OnControlNavigate ) + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_XuiButton1, m_Buttons[BUTTON_REINSTALL_THEME ]) + MAP_CONTROL(IDC_XuiButton2, m_Buttons[BUTTON_REINSTALL_GAMERPIC1 ]) + MAP_CONTROL(IDC_XuiButton3, m_Buttons[BUTTON_REINSTALL_GAMERPIC2 ]) + MAP_CONTROL(IDC_XuiButton4, m_Buttons[BUTTON_REINSTALL_AVATAR1 ]) + MAP_CONTROL(IDC_XuiButton5, m_Buttons[BUTTON_REINSTALL_AVATAR2 ]) + MAP_CONTROL(IDC_XuiButton6, m_Buttons[BUTTON_REINSTALL_AVATAR3 ]) + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled); + HRESULT OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled); + HRESULT OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ); + + static int DeviceSelectReturned(void *pParam,bool bContinue); + static int DeviceSelectReturned_AndReinstall(void *pParam,bool bContinue); +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_Reinstall, L"CScene_Reinstall", XUI_CLASS_SCENE ) + + //static int InstallReturned(void *pParam,bool bContinue); + +private: + int m_iPad; + int m_iLastButtonPressed; + bool m_bIgnoreInput; + + +}; diff --git a/Minecraft.Client/Common/XUI/XUI_SaveMessage.cpp b/Minecraft.Client/Common/XUI/XUI_SaveMessage.cpp new file mode 100644 index 00000000..7c816033 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_SaveMessage.cpp @@ -0,0 +1,76 @@ +#include "stdafx.h" +#include +#include "..\XUI\XUI_SaveMessage.h" + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_SaveMessage::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + MapChildControls(); + CXuiSceneBase::ShowBackground( DEFAULT_XUI_MENU_USER, TRUE ); + CXuiSceneBase::ShowLogo( DEFAULT_XUI_MENU_USER, TRUE ); + + m_button.SetText(app.GetString(IDS_CONFIRM_OK)); + + m_SaveMessage.SetText(app.GetString(IDS_SAVE_ICON_MESSAGE)); + + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT ); + + // 4J-PB - If we have a signed in user connected, let's get the DLC now + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if( (InputManager.IsPadConnected(i) || ProfileManager.IsSignedIn(i)) ) + { + if(!app.DLCInstallProcessCompleted() && !app.DLCInstallPending()) + { + app.StartInstallDLCProcess(i); + break; + } + } + } + + // set a timer on the saving message screen, so we continue after 8 seconds + XuiSetTimer( m_hObj,0,8000); + m_bIgnoreInput=false; + return S_OK; +} + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_SaveMessage::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + XuiKillTimer(m_hObj,0); + app.NavigateToScene(XUSER_INDEX_ANY,eUIScene_MainMenu); + rfHandled = TRUE; + return S_OK; +} + +HRESULT CScene_SaveMessage::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + return S_OK; +} + +// 4J-PB - added for Compliance fail - +// Games must enter an interactive state that accepts player input within 20 seconds after the initial start-up sequence. +// If an animation or cinematic shown during the start-up sequence runs longer than 20 seconds, it must be skippable using the START button or natural input. +HRESULT CScene_SaveMessage::OnTimer(XUIMessageTimer *pData,BOOL& rfHandled) +{ + m_bIgnoreInput=true; + XuiKillTimer(m_hObj,0); + app.NavigateToScene(XUSER_INDEX_ANY,eUIScene_MainMenu); + + return S_OK; +} + + diff --git a/Minecraft.Client/Common/XUI/XUI_SaveMessage.h b/Minecraft.Client/Common/XUI/XUI_SaveMessage.h new file mode 100644 index 00000000..3e84541c --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_SaveMessage.h @@ -0,0 +1,36 @@ +#pragma once + +#include "../media/xuiscene_savemessage.h" + +class CScene_SaveMessage : public CXuiSceneImpl +{ + protected: + CXuiControl m_button; + CXuiControl m_SaveMessage; + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_TIMER( OnTimer ) + XUI_END_MSG_MAP() + + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_ConfirmButton, m_button) + MAP_CONTROL(IDC_Description, m_SaveMessage) + END_CONTROL_MAP() + + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnTimer( XUIMessageTimer *pXUIMessageTimer, BOOL &bHandled); + + bool m_bIgnoreInput; +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_SaveMessage, L"CScene_SaveMessage", XUI_CLASS_SCENE ) + +}; diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_AbstractContainer.cpp b/Minecraft.Client/Common/XUI/XUI_Scene_AbstractContainer.cpp new file mode 100644 index 00000000..10369d5e --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_AbstractContainer.cpp @@ -0,0 +1,475 @@ +#include "stdafx.h" +#include +#include +#include + +#include "..\..\..\Minecraft.World\Player.h" +#include "..\..\..\Minecraft.Client\LocalPlayer.h" +#include "..\..\..\Minecraft.Client\Minecraft.h" +#include "..\..\..\Minecraft.Client\GameMode.h" +#include "..\..\..\Minecraft.World\AbstractContainerMenu.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\Tile.h" +#include "..\..\..\Minecraft.World\FurnaceRecipes.h" +#include "..\..\..\Minecraft.World\Recipy.h" +#include "..\..\..\Minecraft.World\Recipes.h" +#include "..\..\..\Minecraft.World\ArmorRecipes.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" + +#include "..\..\Common\Tutorial\Tutorial.h" +#include "..\..\Common\Tutorial\TutorialMode.h" + +#include "XUI_Ctrl_SlotList.h" +#include "XUI_Ctrl_SlotItem.h" +#include "XUI_Ctrl_SlotItemListItem.h" +#include "XUI_Scene_AbstractContainer.h" +#ifdef _DEBUG_MENUS_ENABLED +#include "XUI_DebugItemEditor.h" +#endif + +#define IGNORE_KEYPRESS_TIMERID 11 +#define IGNORE_KEYPRESS_TIME 100 + +void CXuiSceneAbstractContainer::PlatformInitialize(int iPad, int startIndex) +{ + m_bIgnoreKeyPresses=true; + m_iPad = iPad; + + XuiControlSetText(m_InventoryText,app.GetString(IDS_INVENTORY)); + + // Determine min and max extents for pointer, it needs to be able to move off the container to drop items. + float fPanelWidth, fPanelHeight; + float fPointerWidth, fPointerHeight; + + // We may have varying depths of controls here, so base off the pointers parent + HXUIOBJ parent; + XuiElementGetBounds( m_pointerControl->m_hObj, &fPointerWidth, &fPointerHeight ); + XuiElementGetParent( m_pointerControl->m_hObj, &parent ); + m_pointerControl->SetShow(TRUE); + XuiElementGetBounds( parent, &fPanelWidth, &fPanelHeight ); + // Get size of pointer + m_fPointerImageOffsetX = floor(fPointerWidth/2.0f); + m_fPointerImageOffsetY = floor(fPointerHeight/2.0f); + + m_fPanelMinX = 0.0f; + m_fPanelMaxX = fPanelWidth; + m_fPanelMinY = 0.0f; + m_fPanelMaxY = fPanelHeight; + + // 4J-PB - need to limit this in splitscreen + if(app.GetLocalPlayerCount()>1) + { + // don't let the pointer go into someone's screen + m_fPointerMinY = floor(fPointerHeight/2.0f); + } + else + { + m_fPointerMinY = -fPointerHeight; + } + m_fPointerMinX = -fPointerWidth; + m_fPointerMaxX = fPanelWidth + fPointerWidth; + m_fPointerMaxY = fPanelHeight + (fPointerHeight/2); + +// m_hPointerText=NULL; +// m_hPointerTextBkg=NULL; + + UIVec2D itemPos; + UIVec2D itemSize; + GetItemScreenData( m_eCurrSection, 0, &( itemPos ), &( itemSize ) ); + + UIVec2D sectionPos; + GetPositionOfSection( m_eCurrSection, &( sectionPos ) ); + + UIVec2D vPointerPos = sectionPos; + vPointerPos += itemPos; + vPointerPos.x += ( itemSize.x / 2.0f ); + vPointerPos.y += ( itemSize.y / 2.0f ); + + vPointerPos.x -= m_fPointerImageOffsetX; + vPointerPos.y -= m_fPointerImageOffsetY; + + D3DXVECTOR3 newPointerPos; + newPointerPos.x = vPointerPos.x; + newPointerPos.y = vPointerPos.y; + newPointerPos.z = 0.0f; + m_pointerControl->SetPosition( &newPointerPos ); + m_pointerPos.x = newPointerPos.x; + m_pointerPos.y = newPointerPos.y; + +#ifdef USE_POINTER_ACCEL + m_fPointerVelX = 0.0f; + m_fPointerVelY = 0.0f; + m_fPointerAccelX = 0.0f; + m_fPointerAccelY = 0.0f; +#endif + + // Add timer to poll controller stick input at 60Hz + HRESULT timerResult = SetTimer( POINTER_INPUT_TIMER_ID, ( 1000 / 60 ) ); + assert( timerResult == S_OK ); + + XuiSetTimer(m_hObj,IGNORE_KEYPRESS_TIMERID,IGNORE_KEYPRESS_TIME); + + // Disable the default navigation behaviour for all slot lsit items (prevent old style cursor navigation). + for ( int iSection = m_eFirstSection; iSection < m_eMaxSection; ++iSection ) + { + ESceneSection eSection = ( ESceneSection )( iSection ); + + if(!IsSectionSlotList(eSection)) continue; + + // Get dimensions of this section. + int iNumRows; + int iNumColumns; + int iNumItems = GetSectionDimensions( eSection, &( iNumColumns ), &( iNumRows ) ); + + for ( int iItem = 0; iItem < iNumItems; ++iItem ) + { + CXuiCtrlSlotItemListItem* pCXuiCtrlSlotItem; + GetSectionSlotList( eSection )->GetCXuiCtrlSlotItem( iItem, &( pCXuiCtrlSlotItem ) ); + pCXuiCtrlSlotItem->SetSkipsDefaultNavigation( TRUE ); + } + } +} + +// 4J Stu - Added to support auto-save. Need to re-associate on a navigate back +void CXuiSceneAbstractContainer::InitDataAssociations(int iPad, AbstractContainerMenu *menu, int startIndex /*= 0*/) +{ + // TODO Inventory dimensions need defined as constants + m_inventoryControl->SetData( iPad, menu, 3, 9, startIndex, startIndex + 3*9 ); + + // TODO Inventory dimensions need defined as constants + m_useRowControl->SetData( iPad, menu, 1, 9, startIndex + 3*9, startIndex + 4*9 ); + + m_pointerControl->SetUserIndex(m_pointerControl->m_hObj, iPad); +} + +int CXuiSceneAbstractContainer::getSectionColumns(ESceneSection eSection) +{ + return GetSectionSlotList( eSection )->GetColumns(); +} + +int CXuiSceneAbstractContainer::getSectionRows(ESceneSection eSection) +{ + return GetSectionSlotList( eSection )->GetRows(); +} + +// Adding this so we can turn off the pointer text background, since it flickers on then off at the start of a scene where a tutorial popup is +HRESULT CXuiSceneAbstractContainer::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ) +{ + if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) return S_OK; + + if(pTransition->dwTransType == XUI_TRANSITION_TO || pTransition->dwTransType == XUI_TRANSITION_BACKTO) + { + // 4J Stu - Added to support auto-save. Need to re-associate on a navigate back + if(pTransition->dwTransType == XUI_TRANSITION_BACKTO) + { + // Add timer to poll controller stick input at 60Hz + HRESULT timerResult = SetTimer( POINTER_INPUT_TIMER_ID, ( 1000 / 60 ) ); + assert( timerResult == S_OK ); + + InitDataAssociations(m_iPad, m_menu); + } + + HXUIOBJ hObj=NULL; + HRESULT hr=XuiControlGetVisual(m_pointerControl->m_hObj,&hObj); + hr=XuiElementGetChildById(hObj,L"text_measurer",&m_hPointerTextMeasurer); + hr=XuiElementGetChildById(hObj,L"text_name",&m_hPointerText); + hr=XuiElementGetChildById(hObj,L"text_panel",&m_hPointerTextBkg); + hr=XuiElementGetChildById(hObj,L"pointer_image",&m_hPointerImg); + XuiElementSetShow(m_hPointerText,FALSE); + XuiElementSetShow(m_hPointerTextBkg,FALSE); + } + + return S_OK; +} + + +D3DXVECTOR3 CXuiSceneAbstractContainer::GetCursorScreenPosition() +{ + return app.GetElementScreenPosition(m_pointerControl->m_hObj); +} + +HRESULT CXuiSceneAbstractContainer::OnKeyDown(XUIMessageInput *pInputData, BOOL& bHandled) +{ + if(m_bIgnoreKeyPresses) return S_OK; + + bHandled = handleKeyDown(pInputData->UserIndex, mapVKToAction(pInputData->dwKeyCode), (pInputData->dwFlags & XUI_INPUT_FLAG_REPEAT) != 0); + + return S_OK; +} + +int CXuiSceneAbstractContainer::mapVKToAction(int vk) +{ + int action = MINECRAFT_ACTION_MAX; + switch(vk) + { + case VK_PAD_A: + action = ACTION_MENU_A; + break; + case VK_PAD_B: + case VK_PAD_START: + action = ACTION_MENU_B; + break; + case VK_PAD_X: + action = ACTION_MENU_X; + break; + case VK_PAD_Y: + action = ACTION_MENU_Y; + break; + case VK_PAD_DPAD_LEFT: + action = ACTION_MENU_LEFT; + break; + case VK_PAD_DPAD_RIGHT: + action = ACTION_MENU_RIGHT; + break; + case VK_PAD_DPAD_UP: + action = ACTION_MENU_UP; + break; + case VK_PAD_DPAD_DOWN: + action = ACTION_MENU_DOWN; + break; + case VK_PAD_LTRIGGER: + action = ACTION_MENU_PAGEUP; + break; + case VK_PAD_RTRIGGER: + action = ACTION_MENU_PAGEDOWN; + break; + case VK_PAD_LSHOULDER: + action = ACTION_MENU_LEFT_SCROLL; + break; + case VK_PAD_RSHOULDER: + action = ACTION_MENU_RIGHT_SCROLL; + break; + case VK_PAD_RTHUMB_UP: + action = ACTION_MENU_OTHER_STICK_UP; + break; + case VK_PAD_RTHUMB_DOWN: + action = ACTION_MENU_OTHER_STICK_DOWN; + break; + case VK_PAD_RTHUMB_RIGHT: + action = ACTION_MENU_OTHER_STICK_RIGHT; + break; + case VK_PAD_RTHUMB_LEFT: + action = ACTION_MENU_OTHER_STICK_LEFT; + break; + }; + + return action; +} + +void CXuiSceneAbstractContainer::handleSectionClick(ESceneSection eSection) +{ + CXuiCtrlSlotList *slotList = GetSectionSlotList( eSection ); + slotList->Clicked(); +} + +HRESULT CXuiSceneAbstractContainer::handleCustomTimer( XUIMessageTimer *pTimer, BOOL& bHandled ) +{ + return S_OK; +} + +// Returns XUI position of given scene section. +void CXuiSceneAbstractContainer::GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ) +{ + D3DXVECTOR3 xuiPos; + GetSectionControl( eSection )->GetPosition( &xuiPos ); + pPosition->x = xuiPos.x; + pPosition->y = xuiPos.y; +} + +void CXuiSceneAbstractContainer::GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ) +{ + D3DXVECTOR3 xuiPos; + if(IsSectionSlotList(eSection)) + { + // Get slot item. + CXuiCtrlSlotItemListItem* pCXuiCtrlSlotItem; + GetSectionSlotList( eSection )->GetCXuiCtrlSlotItem( iItemIndex, &( pCXuiCtrlSlotItem ) ); + + // Get size of slot. + pCXuiCtrlSlotItem->GetBounds( &( pSize->x ), &( pSize->y ) ); + + // Get position of slot. + pCXuiCtrlSlotItem->GetPosition( &xuiPos ); + pPosition->x = xuiPos.x; + pPosition->y = xuiPos.y; + } + else + { + // Get size of control + GetSectionControl( eSection )->GetBounds( &( pSize->x ), &( pSize->y ) ); + + // Get position of control + GetSectionControl( eSection )->GetPosition( &xuiPos ); + pPosition->x = xuiPos.x; + pPosition->y = xuiPos.y; + } +} + +shared_ptr CXuiSceneAbstractContainer::getSlotItem(ESceneSection eSection, int iSlot) +{ + CXuiCtrlSlotItemListItem* pCXuiCtrlSlotItem; + GetSectionSlotList( eSection )->GetCXuiCtrlSlotItem( iSlot, &( pCXuiCtrlSlotItem ) ); + return pCXuiCtrlSlotItem->getItemInstance( pCXuiCtrlSlotItem->m_hObj ); +} + +bool CXuiSceneAbstractContainer::isSlotEmpty(ESceneSection eSection, int iSlot) +{ + CXuiCtrlSlotItemListItem* pCXuiCtrlSlotItem; + GetSectionSlotList( eSection )->GetCXuiCtrlSlotItem( iSlot, &( pCXuiCtrlSlotItem ) ); + return pCXuiCtrlSlotItem->isEmpty( pCXuiCtrlSlotItem->m_hObj ); +} + +HRESULT CXuiSceneAbstractContainer::OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ) +{ + HRESULT hr = S_OK; + + // Update pointer from stick input on timer. + if ( pTimer->nId == POINTER_INPUT_TIMER_ID ) + { + + onMouseTick(); + D3DXVECTOR3 pointerPos; + pointerPos.x = m_pointerPos.x; + pointerPos.y = m_pointerPos.y; + pointerPos.z = 0.0f; + m_pointerControl->SetPosition( &pointerPos ); + // This message has been dealt with, don't pass it on further. + bHandled = TRUE; + } + else if ( pTimer->nId == IGNORE_KEYPRESS_TIMERID) + { + KillTimer(IGNORE_KEYPRESS_TIMERID); + m_bIgnoreKeyPresses=false; + } + else + { + // Some scenes may have their own timers for other events, so handle them here + hr = handleCustomTimer( pTimer, bHandled ); + } + return hr; +} + +HRESULT CXuiSceneAbstractContainer::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) +{ + bHandled=true; + return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining); +} + +bool CXuiSceneAbstractContainer::doesSectionTreeHaveFocus(ESceneSection eSection) +{ + return GetSectionControl( eSection )->TreeHasFocus(); +} + +void CXuiSceneAbstractContainer::setSectionFocus(ESceneSection eSection, int iPad) +{ + HRESULT focusResult = GetSectionControl( eSection )->SetFocus( iPad ); + assert( focusResult == S_OK ); +} + +void CXuiSceneAbstractContainer::setSectionSelectedSlot(ESceneSection eSection, int x, int y) +{ + GetSectionSlotList( eSection )->SetCurrentSlot(y,x); +} + +void CXuiSceneAbstractContainer::setFocusToPointer(int iPad) +{ + m_pointerControl->SetFocus( iPad ); +} + +void CXuiSceneAbstractContainer::SetPointerText(const wstring &description, vector &unformattedStrings, bool newSlot) +{ + if(description.empty()) + { + m_pointerControl->SetText(L""); + XuiElementSetShow(m_hPointerText,FALSE); + XuiElementSetShow(m_hPointerTextBkg,FALSE); + return; + } + + bool smallPointer = m_bSplitscreen || (!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()); + wstring desc = L"(smallPointer ? 12 :14) + L"\">" + description + L""; + + XUIRect tempXuiRect, xuiRect; + HRESULT hr; + xuiRect.right = 0; + + for(AUTO_VAR(it, unformattedStrings.begin()); it != unformattedStrings.end(); ++it) + { + XuiTextPresenterMeasureText(m_hPointerTextMeasurer, parseXMLSpecials((*it)).c_str(), &tempXuiRect); + if(tempXuiRect.right > xuiRect.right) xuiRect = tempXuiRect; + } + + // Set size with the new width so that the HTML height check is correct + XuiElementSetBounds(m_hPointerTextBkg,xuiRect.right+4.0f+4.0f+4.0f,xuiRect.bottom); // edge graphics are 8 pixels, with 4 for the border, extra 4 for the background is fudge + XuiElementSetBounds(m_hPointerText,xuiRect.right+4.0f+4.0f,xuiRect.bottom); // edge graphics are 8 pixels, text is centred + + XuiHtmlSetText(m_hPointerText, desc.c_str() ); + + // Check if we need to resize the box + XUIContentDims contentDims; + XuiHtmlGetContentDims(m_hPointerText,&contentDims); + xuiRect.bottom = contentDims.nContentHeight; + + // get the size of the button, and apply the change in size due to the text to the whole button + float fImgWidth,fImgHeight; + XuiElementGetBounds(m_hPointerImg,&fImgWidth, &fImgHeight); + // 4J-PB - changing to calculate values + D3DXVECTOR3 vPosText, vPosTextBkg,vPosImg; + + XuiElementGetPosition(m_hPointerImg,&vPosImg); + XuiElementGetPosition(m_hPointerText,&vPosText); + XuiElementGetPosition(m_hPointerTextBkg,&vPosTextBkg); + + // Set the new height + XuiElementSetBounds(m_hPointerTextBkg,xuiRect.right+4.0f+4.0f+4.0f,xuiRect.bottom+4.0f+4.0f); // edge graphics are 8 pixels, with 4 for the border, extra 4 for the background is fudge + XuiElementSetBounds(m_hPointerText,xuiRect.right+4.0f+4.0f,xuiRect.bottom+4.0f+4.0f); // edge graphics are 8 pixels, text is centred + + // position the text and panel relative to the pointer image + vPosTextBkg.x=vPosImg.x+fImgWidth*0.6f; + vPosText.x=vPosTextBkg.x + 4; + vPosTextBkg.y=vPosImg.y-(xuiRect.bottom+4.0f+4.0f)+fImgWidth*0.4f; + vPosText.y=vPosTextBkg.y + 4; + + XuiElementSetPosition(m_hPointerText,&vPosText); + XuiElementSetPosition(m_hPointerTextBkg,&vPosTextBkg); + + XuiElementSetShow(m_hPointerTextBkg,TRUE); + XuiElementSetShow(m_hPointerText,TRUE); +} + +void CXuiSceneAbstractContainer::adjustPointerForSafeZone() +{ + D3DXVECTOR2 baseSceneOrigin; + float baseWidth, baseHeight; + if(CXuiSceneBase::GetBaseSceneSafeZone( m_iPad, baseSceneOrigin, baseWidth, baseHeight)) + { + D3DXMATRIX pointerBackgroundMatrix; + XuiElementGetFullXForm( m_hPointerTextBkg, &pointerBackgroundMatrix); + + float width, height; + XuiElementGetBounds( m_hPointerTextBkg, &width, &height ); + + if( ( (pointerBackgroundMatrix._41 / pointerBackgroundMatrix._11) + width) > (baseSceneOrigin.x + baseWidth) ) + { + //app.DebugPrintf("Pointer is outside the safe zone for this base scene\n"); + + // get the size of the button, and apply the change in size due to the text to the whole button + float fImgWidth,fImgHeight; + XuiElementGetBounds(m_hPointerImg,&fImgWidth, &fImgHeight); + // 4J-PB - changing to calculate values + D3DXVECTOR3 vPosText, vPosTextBkg,vPosImg; + + XuiElementGetPosition(m_hPointerImg,&vPosImg); + XuiElementGetPosition(m_hPointerText,&vPosText); + XuiElementGetPosition(m_hPointerTextBkg,&vPosTextBkg); + + // position the text and panel relative to the pointer image + vPosTextBkg.x= (vPosImg.x+fImgWidth*0.4f) - width; + vPosText.x=vPosTextBkg.x + 4; + + XuiElementSetPosition(m_hPointerText,&vPosText); + XuiElementSetPosition(m_hPointerTextBkg,&vPosTextBkg); + } + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_AbstractContainer.h b/Minecraft.Client/Common/XUI/XUI_Scene_AbstractContainer.h new file mode 100644 index 00000000..ca191db5 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_AbstractContainer.h @@ -0,0 +1,83 @@ +#pragma once +#include "..\UI\IUIScene_AbstractContainerMenu.h" +#include "XUI_CustomMessages.h" +#include "..\..\Common\Tutorial\TutorialEnum.h" + +class CXuiCtrlSlotList; +class CXuiCtrlSlotItem; +class AbstractContainerMenu; +class Slot; + +class CXuiSceneAbstractContainer : public CXuiSceneImpl, public virtual IUIScene_AbstractContainerMenu +{ +public: + BOOL isPauseScreen() { + return FALSE; + }; + + D3DXVECTOR3 GetCursorScreenPosition(); + +protected: + virtual void PlatformInitialize(int iPad, int startIndex); + virtual void InitDataAssociations(int iPad, AbstractContainerMenu *menu, int startIndex = 0); + + CXuiCtrlSlotList* m_inventoryControl; + CXuiCtrlSlotList* m_useRowControl; + CXuiCtrlSlotItem* m_pointerControl; + CXuiControl m_InventoryText; + + HRESULT OnKeyDown(XUIMessageInput *pInputData, BOOL& bHandled); + // Timer function to poll stick input and update pointer position. + HRESULT OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ); + HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled); + HRESULT OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ); + +protected: + // 4J JEV - Wanted to override onClick method in XUI_Scene_Inventory_Creative, + // so am making this protected. + + +protected: + int m_iPad; + D3DXVECTOR3 m_OriginalPosition; + bool m_bIgnoreKeyPresses; + +private: + int mapVKToAction(int vk); + +protected: + virtual HRESULT handleCustomTimer( XUIMessageTimer *pTimer, BOOL& bHandled ); + +public: + int getPad() { return m_iPad; } + +#ifdef USE_POINTER_ACCEL + float m_fPointerVelX; + float m_fPointerVelY; + + float m_fPointerAccelX; + float m_fPointerAccelY; +#endif + + + HXUIOBJ m_hPointerTextMeasurer; + HXUIOBJ m_hPointerText; + HXUIOBJ m_hPointerTextBkg; + HXUIOBJ m_hPointerImg; + + virtual int getSectionColumns(ESceneSection eSection); + virtual int getSectionRows(ESceneSection eSection); + virtual CXuiControl* GetSectionControl( ESceneSection eSection ) = 0; + virtual CXuiCtrlSlotList* GetSectionSlotList( ESceneSection eSection ) = 0; + virtual void GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ); + virtual void GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ); + void handleSectionClick(ESceneSection eSection); + virtual bool doesSectionTreeHaveFocus(ESceneSection eSection); + virtual void setSectionFocus(ESceneSection eSection, int iPad); + void setSectionSelectedSlot(ESceneSection eSection, int x, int y); + void setFocusToPointer(int iPad); + void SetPointerText(const wstring &description, vector &unformattedStrings, bool newSlot); + virtual shared_ptr getSlotItem(ESceneSection eSection, int iSlot); + virtual bool isSlotEmpty(ESceneSection eSection, int iSlot); + virtual void adjustPointerForSafeZone(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_Anvil.cpp b/Minecraft.Client/Common/XUI/XUI_Scene_Anvil.cpp new file mode 100644 index 00000000..4a8617b4 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Anvil.cpp @@ -0,0 +1,242 @@ +#include "stdafx.h" + +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\Common\Tutorial\Tutorial.h" +#include "..\..\Common\Tutorial\TutorialMode.h" +#include "..\..\Common\Tutorial\TutorialEnum.h" +#include "..\..\Minecraft.h" +#include "XUI_Ctrl_SlotList.h" +#include "XUI_Scene_Anvil.h" + + +//-------------------------------------------------------------------------------------- +// Name: CXuiSceneAnvil::OnInit +// Desc: Message handler for XM_INIT +//-------------------------------------------------------------------------------------- +HRESULT CXuiSceneAnvil::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + MapChildControls(); + + XuiControlSetText(m_anvilText,app.GetString(IDS_REPAIR_AND_NAME)); + + m_cross.SetShow(FALSE); + m_editName.SetText(L""); + m_editName.SetTextLimit(30); + m_editName.SetTitleAndText(IDS_TITLE_RENAME,IDS_TITLE_RENAME); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + AnvilScreenInput* initData = (AnvilScreenInput*)pInitData->pvInitData; + m_iPad=initData->iPad; + m_bSplitscreen=initData->bSplitscreen; + m_inventory = initData->inventory; + + // if we are in splitscreen, then we need to figure out if we want to move this scene + + if(m_bSplitscreen) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + } + + if( pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Anvil_Menu, this); + } + + m_repairMenu = new RepairMenu( initData->inventory, initData->level, initData->x, initData->y, initData->z, pMinecraft->localplayers[m_iPad] ); + m_repairMenu->addSlotListener(this); + + InitDataAssociations(m_iPad, m_repairMenu); + + delete initData; + + CXuiSceneAbstractContainer::Initialize( m_iPad, m_repairMenu, true, RepairMenu::INV_SLOT_START, eSectionAnvilUsing, eSectionAnvilMax ); + + //ProfileManager.SetRichPresenceContextValue(m_iPad,CONTEXT_GAME_STATE,CONTEXT_GAME_STATE_FORGING); + + XuiSetTimer(m_hObj,ANVIL_UPDATE_TIMER_ID,ANVIL_UPDATE_TIMER_TIME); + + return S_OK; +} + +HRESULT CXuiSceneAnvil::OnDestroy() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if( pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + if(gameMode != NULL) gameMode->getTutorial()->changeTutorialState(m_previousTutorialState); + } + + // 4J Stu - Fix for #11302 - TCR 001: Network Connectivity: Host crashed after being killed by the client while accessing a chest during burst packet loss. + // We need to make sure that we call closeContainer() anytime this menu is closed, even if it is forced to close by some other reason (like the player dying) + if(Minecraft::GetInstance()->localplayers[m_iPad] != NULL) Minecraft::GetInstance()->localplayers[m_iPad]->closeContainer(); + return S_OK; +} + +HRESULT CXuiSceneAnvil::OnNotifyValueChanged (HXUIOBJ hObjSource, XUINotifyValueChanged* pValueChangedData, BOOL& rfHandled) +{ + if(hObjSource == m_editName) + { + wstring newValue = m_editName.GetText(); + LPCWSTR szText=newValue.c_str(); + stripWhitespaceForHtml(newValue); + + // strip leading spaces + wstring b; + int start = (int)newValue.find_first_not_of(L" "); + int end = (int)newValue.find_last_not_of(L" "); + + if( start == wstring::npos ) + { + // the string is all space + newValue=L""; + } + else + { + if( end == wstring::npos ) end = (int)newValue.size()-1; + b = newValue.substr(start,(end-start)+1); + newValue=b; + } + + // 4J-PB - This was stopping the player deleting the last character in the name using the chatpad + //if(!newValue.empty() && !(newValue.size() == 1 && newValue.at(0) == L' ')) + { + newValue = escapeXML(newValue); + m_itemName = newValue; + updateItemName(); + } +// else +// { +// LPCWSTR szText=m_itemName.c_str(); +// m_editName.SetText(szText); +// m_editName.SetCaretPosition(m_itemName.length()); +// } + } + + return S_OK; +} + +HRESULT CXuiSceneAnvil::handleCustomTimer( XUIMessageTimer *pTimer, BOOL& bHandled ) +{ + if(pTimer->nId == ANVIL_UPDATE_TIMER_ID) + { + handleTick(); + bHandled = TRUE; + } + return S_OK; +} + +CXuiControl* CXuiSceneAnvil::GetSectionControl( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionAnvilItem1: + return (CXuiControl *)m_ingredient1Control; + break; + case eSectionAnvilItem2: + return (CXuiControl *)m_ingredient2Control; + break; + case eSectionAnvilResult: + return (CXuiControl *)m_resultControl; + break; + case eSectionAnvilName: + return (CXuiControl *)&m_editName; + break; + case eSectionAnvilInventory: + return (CXuiControl *)m_inventoryControl; + break; + case eSectionAnvilUsing: + return (CXuiControl *)m_useRowControl; + break; + default: + assert( false ); + break; + } + return NULL; +} + +CXuiCtrlSlotList* CXuiSceneAnvil::GetSectionSlotList( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionAnvilItem1: + return m_ingredient1Control; + break; + case eSectionAnvilItem2: + return m_ingredient2Control; + break; + case eSectionAnvilResult: + return m_resultControl; + break; + case eSectionAnvilInventory: + return m_inventoryControl; + break; + case eSectionAnvilUsing: + return m_useRowControl; + break; + default: + assert( false ); + break; + } + return NULL; +} + +// 4J Stu - Added to support auto-save. Need to re-associate on a navigate back +void CXuiSceneAnvil::InitDataAssociations(int iPad, AbstractContainerMenu *menu, int startIndex /*= 0*/) +{ + // TODO Inventory dimensions need defined as constants + m_resultControl->SetData( iPad, menu, 1, 1, RepairMenu::RESULT_SLOT ); + + m_ingredient1Control->SetData( iPad, menu, 1, 1, RepairMenu::INPUT_SLOT ); + m_ingredient2Control->SetData( iPad, menu, 1, 1, RepairMenu::ADDITIONAL_SLOT); + + //m_litProgressControl->SetUserData( initData->furnace.get() ); + + //m_burnProgress->SetUserData( initData->furnace.get() ); + + CXuiSceneAbstractContainer::InitDataAssociations(iPad, menu, RepairMenu::INV_SLOT_START); +} + +void CXuiSceneAnvil::handleEditNamePressed() +{ + // 4J Stu - The edit control already handles A/Start presses, so ignore anything else + //m_editName.RequestKeyboard(m_iPad); +} + +void CXuiSceneAnvil::setEditNameValue(const wstring &name) +{ + wstring parsedName = parseXMLSpecials(name); + m_editName.SetText(parsedName.c_str()); + m_editName.SetCaretPosition(parsedName.length()); +} + +void CXuiSceneAnvil::setEditNameEditable(bool enabled) +{ +} + +void CXuiSceneAnvil::setCostLabel(const wstring &label, bool canAfford) +{ + if(canAfford) + { + m_affordableText.SetText(label.c_str()); + m_affordableText.SetShow(TRUE); + m_expensiveText.SetShow(FALSE); + } + else + { + m_expensiveText.SetText(label.c_str()); + m_affordableText.SetShow(FALSE); + m_expensiveText.SetShow(TRUE); + } +} + +void CXuiSceneAnvil::showCross(bool show) +{ + m_cross.SetShow(show?TRUE:FALSE); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_Anvil.h b/Minecraft.Client/Common/XUI/XUI_Scene_Anvil.h new file mode 100644 index 00000000..2b16c8ab --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Anvil.h @@ -0,0 +1,88 @@ +#pragma once +using namespace std; +#include "..\Media\xuiscene_anvil.h" +#include "XUI_Scene_AbstractContainer.h" +#include "..\UI\IUIScene_AnvilMenu.h" +#include "Common\XUI\XUI_Ctrl_4JEdit.h" + +#define ANVIL_UPDATE_TIMER_ID (10) +#define ANVIL_UPDATE_TIMER_TIME (1000) // 1 second + +//-------------------------------------------------------------------------------------- +// Scene implementation class. +//-------------------------------------------------------------------------------------- +class CXuiSceneAnvil : public CXuiSceneAbstractContainer, public IUIScene_AnvilMenu +{ +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CXuiSceneAnvil, L"CXuiSceneAnvil", XUI_CLASS_SCENE ) + +protected: + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN( OnKeyDown ) + XUI_ON_XM_DESTROY( OnDestroy ) + XUI_ON_XM_TIMER( OnTimer ) // Poll stick input on a timer. + XUI_ON_XM_TRANSITION_START(OnTransitionStart) + XUI_ON_XM_NOTIFY_VALUE_CHANGED(OnNotifyValueChanged) + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_Group, m_sceneGroup) + BEGIN_MAP_CHILD_CONTROLS( m_sceneGroup ) + // Common to all abstract container scenes + MAP_OVERRIDE(IDC_Inventory, m_inventoryControl) + MAP_OVERRIDE(IDC_UseRow, m_useRowControl) + MAP_OVERRIDE(IDC_Pointer, m_pointerControl) + MAP_CONTROL(IDC_InventoryText,m_InventoryText) + + MAP_OVERRIDE(IDC_Ingredient, m_ingredient1Control) + MAP_OVERRIDE(IDC_Ingredient2, m_ingredient2Control) + MAP_OVERRIDE(IDC_Result, m_resultControl) + + MAP_CONTROL(IDC_AnvilTextInput, m_editName) + + MAP_CONTROL(IDC_AnvilText,m_anvilText) + MAP_CONTROL(IDC_LabelAffordable,m_affordableText) + MAP_CONTROL(IDC_LabelExpensive,m_expensiveText) + MAP_CONTROL(IDC_AnvilCross,m_cross) + END_MAP_CHILD_CONTROLS() + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnDestroy(); + HRESULT OnNotifyValueChanged (HXUIOBJ hObjSource, XUINotifyValueChanged* pValueChangedData, BOOL& rfHandled); +// HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled); + + virtual HRESULT handleCustomTimer( XUIMessageTimer *pTimer, BOOL& bHandled ); + + virtual void InitDataAssociations(int iPad, AbstractContainerMenu *menu, int startIndex = 0); + +private: + CXuiCtrlSlotList *m_ingredient1Control; + CXuiCtrlSlotList *m_ingredient2Control; + CXuiCtrlSlotList *m_resultControl; + + CXuiCtrl4JEdit m_editName; + + CXuiControl m_anvilText; + CXuiControl m_affordableText; + CXuiControl m_expensiveText; + CXuiControl m_cross; + CXuiControl m_sceneGroup; + + virtual CXuiControl* GetSectionControl( ESceneSection eSection ); + virtual CXuiCtrlSlotList* GetSectionSlotList( ESceneSection eSection ); + +protected: + virtual void handleEditNamePressed(); + virtual void setEditNameValue(const wstring &name); + virtual void setEditNameEditable(bool enabled); + virtual void setCostLabel(const wstring &label, bool canAfford); + virtual void showCross(bool show); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_Base.cpp b/Minecraft.Client/Common/XUI/XUI_Scene_Base.cpp new file mode 100644 index 00000000..03782c79 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Base.cpp @@ -0,0 +1,2243 @@ +#include "stdafx.h" + +#include +#include "..\..\MultiplayerLevel.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\StatsCounter.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\net.minecraft.stats.h" +#include "..\..\Minecraft.h" + +#include "..\..\..\Minecraft.World\net.minecraft.world.level.h" +#include "..\..\..\Minecraft.World\LevelData.h" +#include "XUI_CustomMessages.h" +#include "..\..\..\Minecraft.World\Dimension.h" +#include "..\..\..\Minecraft.World\SharedConstants.h" +#include "..\..\GameMode.h" +#include "..\..\EnderDragonRenderer.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.boss.enderdragon.h" +#include "..\..\TexturePackRepository.h" +#include "..\..\TexturePack.h" +#include "..\..\DLCTexturePack.h" + +#define PRESS_START_TIMER 0 + +CXuiSceneBase *CXuiSceneBase::Instance = NULL; +DWORD CXuiSceneBase::m_dwTrialTimerLimitSecs=DYNAMIC_CONFIG_DEFAULT_TRIAL_TIME; +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CXuiSceneBase::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + ASSERT( CXuiSceneBase::Instance == NULL ); + CXuiSceneBase::Instance = this; + + m_iWrongTexturePackTickC=20*5; // default 5 seconds before bringing up the upsell for not having the texture pack + MapChildControls(); + + // Display the tooltips + HRESULT hr = S_OK; + CXuiElement xuiElement = m_hObj; + HXUIOBJ hTemp; + + + m_hEmptyQuadrantLogo=NULL; + XuiElementGetChildById(m_hObj,L"EmptyQuadrantLogo",&m_hEmptyQuadrantLogo); + + D3DXVECTOR3 lastPos; + for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + for( unsigned int i = 0; i < BUTTONS_TOOLTIP_MAX; ++i ) + { + m_visible[idx][ i ] = FALSE; + m_iCurrentTooltipTextID[idx][i]=-1; + hTooltipText[idx][i]=NULL; + hTooltipTextSmall[idx][i]=NULL; + // set all tooltips to shown FALSE by default + m_Buttons[idx][i].SetShow( FALSE ); + m_ButtonsSmall[idx][i].SetShow( FALSE ); + } + + XuiElementGetPosition( m_bottomLeftAnchorPoint[idx].m_hObj, &lastPos); + lastPos.y-=110; + + m_bCrouching[idx]=false; + m_uiSelectedItemOpacityCountDown[idx] =0; + m_bossHealthVisible[idx] = FALSE; + + switch(idx) + { + case 0: + XuiElementGetChildById(m_hObj,L"BasePlayer0",&hTemp); + XuiElementGetChildById(hTemp,L"XuiGamertag",&m_hGamerTagA[0]); + break; + case 1: + XuiElementGetChildById(m_hObj,L"BasePlayer1",&hTemp); + XuiElementGetChildById(hTemp,L"XuiGamertag",&m_hGamerTagA[1]); + break; + case 2: + XuiElementGetChildById(m_hObj,L"BasePlayer2",&hTemp); + XuiElementGetChildById(hTemp,L"XuiGamertag",&m_hGamerTagA[2]); + break; + case 3: + XuiElementGetChildById(m_hObj,L"BasePlayer3",&hTemp); + XuiElementGetChildById(hTemp,L"XuiGamertag",&m_hGamerTagA[3]); + break; + } + } + + m_ticksWithNoBoss = 0; + + UpdatePlayerBasePositions(); + + m_iQuadrantsMask=0; + + return S_OK; +} + +HRESULT CXuiSceneBase::OnTimer(XUIMessageTimer *pData,BOOL& rfHandled) +{ + if(pData->nId==PRESS_START_TIMER) + { + XuiKillTimer(m_hObj,PRESS_START_TIMER); + XuiElementStopTimeline(m_hObj,TRUE); + m_PressStart.SetShow(FALSE); + + // clear the quadrants + m_iQuadrantsMask=0; + + HXUIOBJ hObj=NULL,hQuadrant; + + HRESULT hr=XuiControlGetVisual(m_PressStart.m_hObj,&hObj); + + for(int i=0;iskins->getSelected(); + + if(tPack->getId()!=app.GetRequiredTexturePackID()) + { + // we're not using the texture pack we need + + //Is it available? + TexturePack * pRequiredTPack=pMinecraft->skins->getTexturePackById(app.GetRequiredTexturePackID()); + if(pRequiredTPack!=NULL) + { + // we can switch to the required pack + // reset the timer + m_iWrongTexturePackTickC=20*60*5; // reset to 5 minutes + + pMinecraft->skins->selectTexturePackById(app.GetRequiredTexturePackID()); + + // probably had background downloads enabled, so turn them off + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_AUTO); + } + else + { + // decrement the counter + m_iWrongTexturePackTickC--; + + if(m_iWrongTexturePackTickC==0) + { + // action + app.SetAction(ProfileManager.GetPrimaryPad(),eAppAction_TexturePackRequired); + + // reset the timer + m_iWrongTexturePackTickC=20*60*5; // reset to 5 minutes + } + } + } + } + + if (EnderDragonRenderer::bossInstance == NULL) + { + if(m_ticksWithNoBoss<=20) + { + ++m_ticksWithNoBoss; + } + } + else + { + shared_ptr boss = EnderDragonRenderer::bossInstance; + EnderDragonRenderer::bossInstance = nullptr; + m_ticksWithNoBoss = 0; + + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if(pMinecraft->localplayers[i] != NULL && pMinecraft->localplayers[i]->dimension == 1 && !ui.GetMenuDisplayed(i) && app.GetGameSettings(i,eGameSetting_DisplayHUD)) + { + int iGuiScale; + + if(pMinecraft->localplayers[i]->m_iScreenSection == C4JRender::VIEWPORT_TYPE_FULLSCREEN) + { + iGuiScale=app.GetGameSettings(i,eGameSetting_UISize); + } + else + { + iGuiScale=app.GetGameSettings(i,eGameSetting_UISizeSplitscreen); + } + m_BossHealthGroup[i].SetShow(TRUE); + m_BossHealthText[i].SetText( app.GetString( IDS_BOSS_ENDERDRAGON_HEALTH ) ); + + if(pMinecraft->localplayers[i]->m_iScreenSection == C4JRender::VIEWPORT_TYPE_FULLSCREEN) + { + switch(iGuiScale) + { + case 0: + m_pBossHealthProgress = m_BossHealthProgress1; + m_BossHealthProgress1[i].SetShow(TRUE); + m_BossHealthProgress2[i].SetShow(FALSE); + m_BossHealthProgress3[i].SetShow(FALSE); + if(m_BossHealthProgress1_small[i]!=NULL) + { + m_BossHealthProgress1_small[i].SetShow(FALSE); + m_BossHealthProgress2_small[i].SetShow(FALSE); + m_BossHealthProgress3_small[i].SetShow(FALSE); + } + + + break; + case 1: + m_pBossHealthProgress = m_BossHealthProgress2; + m_BossHealthProgress1[i].SetShow(FALSE); + m_BossHealthProgress2[i].SetShow(TRUE); + m_BossHealthProgress3[i].SetShow(FALSE); + if(m_BossHealthProgress1_small[i]!=NULL) + { + m_BossHealthProgress1_small[i].SetShow(FALSE); + m_BossHealthProgress2_small[i].SetShow(FALSE); + m_BossHealthProgress3_small[i].SetShow(FALSE); + } + + break; + case 2: + m_pBossHealthProgress = m_BossHealthProgress3; + m_BossHealthProgress1[i].SetShow(FALSE); + m_BossHealthProgress2[i].SetShow(FALSE); + m_BossHealthProgress3[i].SetShow(TRUE); + if(m_BossHealthProgress1_small[i]!=NULL) + { + m_BossHealthProgress1_small[i].SetShow(FALSE); + m_BossHealthProgress2_small[i].SetShow(FALSE); + m_BossHealthProgress3_small[i].SetShow(FALSE); + } + + break; + } + } + else + { + // if we have 2 player top & bottom, we can use the fullscreen bar + if((pMinecraft->localplayers[i]->m_iScreenSection == C4JRender::VIEWPORT_TYPE_SPLIT_TOP) || + (pMinecraft->localplayers[i]->m_iScreenSection == C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM)) + { + switch(iGuiScale) + { + case 0: + m_pBossHealthProgress = m_BossHealthProgress1; + m_BossHealthProgress1[i].SetShow(TRUE); + m_BossHealthProgress2[i].SetShow(FALSE); + m_BossHealthProgress3[i].SetShow(FALSE); + if(m_BossHealthProgress1_small[i]!=NULL) + { + m_BossHealthProgress1_small[i].SetShow(FALSE); + m_BossHealthProgress2_small[i].SetShow(FALSE); + m_BossHealthProgress3_small[i].SetShow(FALSE); + } + + break; + case 1: + m_pBossHealthProgress = m_BossHealthProgress2; + m_BossHealthProgress1[i].SetShow(FALSE); + m_BossHealthProgress2[i].SetShow(TRUE); + m_BossHealthProgress3[i].SetShow(FALSE); + if(m_BossHealthProgress1_small[i]!=NULL) + { + m_BossHealthProgress1_small[i].SetShow(FALSE); + m_BossHealthProgress2_small[i].SetShow(FALSE); + m_BossHealthProgress3_small[i].SetShow(FALSE); + } + break; + case 2: + m_pBossHealthProgress = m_BossHealthProgress3; + m_BossHealthProgress1[i].SetShow(FALSE); + m_BossHealthProgress2[i].SetShow(FALSE); + m_BossHealthProgress3[i].SetShow(TRUE); + if(m_BossHealthProgress1_small[i]!=NULL) + { + m_BossHealthProgress1_small[i].SetShow(FALSE); + m_BossHealthProgress2_small[i].SetShow(FALSE); + m_BossHealthProgress3_small[i].SetShow(FALSE); + } + break; + } + } + else + { + // use the small versions + switch(iGuiScale) + { + case 0: + m_pBossHealthProgress = m_BossHealthProgress1_small; + m_BossHealthProgress1_small[i].SetShow(TRUE); + m_BossHealthProgress2_small[i].SetShow(FALSE); + m_BossHealthProgress3_small[i].SetShow(FALSE); + m_BossHealthProgress1[i].SetShow(FALSE); + m_BossHealthProgress2[i].SetShow(FALSE); + m_BossHealthProgress3[i].SetShow(FALSE); + + break; + case 1: + m_pBossHealthProgress = m_BossHealthProgress2_small; + m_BossHealthProgress1_small[i].SetShow(FALSE); + m_BossHealthProgress2_small[i].SetShow(TRUE); + m_BossHealthProgress3_small[i].SetShow(FALSE); + m_BossHealthProgress1[i].SetShow(FALSE); + m_BossHealthProgress2[i].SetShow(FALSE); + m_BossHealthProgress3[i].SetShow(FALSE); + break; + case 2: + m_pBossHealthProgress = m_BossHealthProgress3_small; + m_BossHealthProgress1_small[i].SetShow(FALSE); + m_BossHealthProgress2_small[i].SetShow(FALSE); + m_BossHealthProgress3_small[i].SetShow(TRUE); + m_BossHealthProgress1[i].SetShow(FALSE); + m_BossHealthProgress2[i].SetShow(FALSE); + m_BossHealthProgress3[i].SetShow(FALSE); + break; + } + } + } + + m_pBossHealthProgress[i].SetRange(0, boss->getMaxHealth() ); + m_pBossHealthProgress[i].SetValue( boss->getSynchedHealth() ); + m_bossHealthVisible[i] = TRUE; + + _UpdateSelectedItemPos(i); + } + else if( m_bossHealthVisible[i] == TRUE) + { + m_BossHealthGroup[i].SetShow(FALSE); + m_bossHealthVisible[i] = FALSE; + + _UpdateSelectedItemPos(i); + } + } + } + + for(int i=0;i 0) --m_uiSelectedItemOpacityCountDown[i]; + if( m_ticksWithNoBoss > 20 ) + { + m_BossHealthGroup[i].SetShow(FALSE); + m_bossHealthVisible[i] = FALSE; + + _UpdateSelectedItemPos(i); + } + + // check if we have the timer running for the opacity + unsigned int uiOpacityTimer=m_uiSelectedItemOpacityCountDown[i]; + + if(uiOpacityTimer>0 && !ui.GetMenuDisplayed(i) && app.GetGameStarted()) + { + if(uiOpacityTimer < (SharedConstants::TICKS_PER_SECOND * 1) ) + { + float fStep=(80.0f)/10.0f; + float fVal=0.01f*(80.0f-((10.0f-(float)uiOpacityTimer)*fStep)); + + XuiElementSetOpacity(m_selectedItemA[i],fVal); + XuiElementSetOpacity(m_selectedItemSmallA[i],fVal); + } + + if( m_playerBaseScenePosition[i] == e_BaseScene_Fullscreen ) + { + m_selectedItemA[i].SetShow(TRUE); + m_selectedItemSmallA[i].SetShow(FALSE); + } + else + { + m_selectedItemA[i].SetShow(FALSE); + m_selectedItemSmallA[i].SetShow(TRUE); + } + } + else + { + m_selectedItemA[i].SetShow(FALSE); + m_selectedItemSmallA[i].SetShow(FALSE); + } + + unsigned char ucAlpha=app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_InterfaceOpacity); + float fVal; + + if(ucAlpha<80) + { + // if we are in a menu, set the minimum opacity for tooltips to 15% + if(ui.GetMenuDisplayed(i) && (ucAlpha<15)) + { + ucAlpha=15; + } + + // check if we have the timer running for the opacity + unsigned int uiOpacityTimer=app.GetOpacityTimer(i); + if(uiOpacityTimer!=0) + { + if(uiOpacityTimer<10) + { + float fStep=(80.0f-(float)ucAlpha)/10.0f; + fVal=0.01f*(80.0f-((10.0f-(float)uiOpacityTimer)*fStep)); + } + else + { + fVal=0.01f*80.0f; + } + } + else + { + fVal=0.01f*(float)ucAlpha; + } + } + else + { + // if we are in a menu, set the minimum opacity for tooltips to 15% + if(ui.GetMenuDisplayed(i) && (ucAlpha<15)) + { + ucAlpha=15; + } + fVal=0.01f*(float)ucAlpha; + } + XuiElementSetOpacity(app.GetCurrentHUDScene(i),fVal); + + XUIMessage xuiMsg; + CustomMessage_TickScene( &xuiMsg ); + XuiSendMessage( app.GetCurrentHUDScene(i), &xuiMsg ); + + bool bDisplayGui=app.GetGameStarted() && !ui.GetMenuDisplayed(i) && !(app.GetXuiAction(i)==eAppAction_AutosaveSaveGameCapturedThumbnail) && app.GetGameSettings(i,eGameSetting_DisplayHUD)!=0; + if(bDisplayGui && pMinecraft->localplayers[i] != NULL) + { + XuiElementSetShow(app.GetCurrentHUDScene(i),TRUE); + } + else + { + XuiElementSetShow(app.GetCurrentHUDScene(i),FALSE); + } + } +} + +HRESULT CXuiSceneBase::_SetEnableTooltips( unsigned int iPad, BOOL bVal ) +{ + for(int i=0;i=0) + { + pString=app.GetString(iTextID); + } + + if(hTooltipText[iPad][uiTooltip]==NULL) + { + HXUIOBJ hObj=NULL; + hr=XuiControlGetVisual(m_Buttons[iPad][uiTooltip].m_hObj,&hObj); + hr=XuiElementGetChildById(hObj,L"text_ButtonText",&hTooltipText[iPad][uiTooltip]); + hr=XuiElementGetPosition(hTooltipText[iPad][uiTooltip],&m_vPosTextInTooltip[uiTooltip]); + } + + if(hTooltipTextSmall[iPad][uiTooltip]==NULL) + { + HXUIOBJ hObj=NULL; + hr=XuiControlGetVisual(m_ButtonsSmall[iPad][uiTooltip].m_hObj,&hObj); + hr=XuiElementGetChildById(hObj,L"text_ButtonText",&hTooltipTextSmall[iPad][uiTooltip]); + hr=XuiElementGetPosition(hTooltipTextSmall[iPad][uiTooltip],&m_vPosTextInTooltipSmall[uiTooltip]); + } + + if(iTextID>=0) + { + hr=XuiTextPresenterMeasureText(hTooltipText[iPad][uiTooltip], pString, &xuiRect); + + // Change the size of the whole button to be the width of the measured text, plus the position the text element starts in the visual (which is the offset by the size of the button graphic) + XuiElementGetBounds(m_Buttons[iPad][uiTooltip].m_hObj,&fWidth, &fHeight); + XuiElementSetBounds(m_Buttons[iPad][uiTooltip].m_hObj,xuiRect.right+1+m_vPosTextInTooltip[uiTooltip].x,fHeight); + + // Change the width of the text element to be the width of the measured text + XuiElementGetBounds(hTooltipText[iPad][uiTooltip],&fWidth, &fHeight); + XuiElementSetBounds(hTooltipText[iPad][uiTooltip],xuiRect.right,fHeight); + + + hr=XuiTextPresenterMeasureText(hTooltipTextSmall[iPad][uiTooltip], pString, &xuiRectSmall); + + // Change the size of the whole button to be the width of the measured text, plus the position the text element starts in the visual (which is the offset by the size of the button graphic) + XuiElementGetBounds(m_ButtonsSmall[iPad][uiTooltip].m_hObj,&fWidth, &fHeight); + XuiElementSetBounds(m_ButtonsSmall[iPad][uiTooltip].m_hObj,xuiRectSmall.right+1+m_vPosTextInTooltipSmall[uiTooltip].x,fHeight); + + // Change the width of the text element to be the width of the measured text + XuiElementGetBounds(hTooltipTextSmall[iPad][uiTooltip],&fWidth, &fHeight); + XuiElementSetBounds(hTooltipTextSmall[iPad][uiTooltip],xuiRectSmall.right,fHeight); + + m_Buttons[iPad][uiTooltip].SetText(pString); + m_ButtonsSmall[iPad][uiTooltip].SetText(pString); + } + else + { + m_Buttons[iPad][uiTooltip].SetText(L""); + XuiElementGetBounds(m_Buttons[iPad][uiTooltip].m_hObj,&fWidth, &fHeight); + XuiElementSetBounds(m_Buttons[iPad][uiTooltip].m_hObj,m_vPosTextInTooltip[uiTooltip].x,fHeight); + + m_ButtonsSmall[iPad][uiTooltip].SetText(L""); + XuiElementGetBounds(m_ButtonsSmall[iPad][uiTooltip].m_hObj,&fWidth, &fHeight); + XuiElementSetBounds(m_ButtonsSmall[iPad][uiTooltip].m_hObj,m_vPosTextInTooltipSmall[uiTooltip].x,fHeight); + } + + m_iCurrentTooltipTextID[iPad][uiTooltip]=iTextID; + + ReLayout(iPad); + + return hr; +} + +HRESULT CXuiSceneBase::_RefreshTooltips( unsigned int iPad) +{ + // if the tooltip is showing, refresh it to update the opacity + for(int tooltip=0;tooltiplevel!=NULL) + { + __int64 i64TimeOfDay =0; + // are we in the Nether? - Leave the time as 0 if we are, so we show daylight + if(pMinecraft->level->dimension->id==0) + { + i64TimeOfDay = pMinecraft->level->getLevelData()->getTime() % 24000; + } + + if(i64TimeOfDay>14000) + { + hr=XuiElementSetShow(hNight,TRUE); + hr=XuiElementSetShow(hDay,FALSE); + } + else + { + hr=XuiElementSetShow(hNight,FALSE); + hr=XuiElementSetShow(hDay,TRUE); + } + } + else + { + hr=XuiElementSetShow(hNight,FALSE); + hr=XuiElementSetShow(hDay,TRUE); + } + } + hr=XuiElementSetShow(m_Background[iPad],bShow); + + return hr; +} + +HRESULT CXuiSceneBase::_ShowDarkOverlay( unsigned int iPad, BOOL bShow ) +{ + return XuiElementSetShow(m_DarkOverlay[iPad],bShow); +} + +HRESULT CXuiSceneBase::_ShowLogo( unsigned int iPad, BOOL bShow ) +{ + return XuiElementSetShow(m_Logo[iPad],bShow); +} + +HRESULT CXuiSceneBase::_ShowPressStart(unsigned int iPad) +{ + XUIRect xuiRect; + LPCWSTR pString=app.GetString(IDS_PRESS_START_TO_JOIN);; + float fWidth,fHeight,fWidthChange; + + XuiSetTimer( m_hObj,PRESS_START_TIMER,3000); + m_iQuadrantsMask|=1<m_dwTrialTimerLimitSecs) + { + dwTimeTicks=m_dwTrialTimerLimitSecs; + } + + dwTimeTicks=m_dwTrialTimerLimitSecs-dwTimeTicks; + +#ifndef _CONTENT_PACKAGE + if(true) +#else + // display the time - only if there's less than 3 minutes + if(dwTimeTicks<180) +#endif + { + int iMins=dwTimeTicks/60; + int iSeconds=dwTimeTicks%60; + swprintf( wcTime, 20, L"%d:%02d",iMins,iSeconds); + m_TrialTimer.SetText(wcTime); + } + else + { + m_TrialTimer.SetText(L""); + } + + // are we out of time? + if(dwTimeTicks==0) + { + // Trial over + app.SetAction(iPad,eAppAction_TrialOver); + } + + return S_OK; +} + +void CXuiSceneBase::_ReduceTrialTimerValue() +{ + DWORD dwTimeTicks=(int)app.getTrialTimer(); + + if(dwTimeTicks>m_dwTrialTimerLimitSecs) + { + dwTimeTicks=m_dwTrialTimerLimitSecs; + } + + m_dwTrialTimerLimitSecs-=dwTimeTicks; +} + +HRESULT CXuiSceneBase::_ShowTrialTimer(BOOL bVal) +{ + m_TrialTimer.SetShow(bVal); + return S_OK; +} + +bool CXuiSceneBase::_PressStartPlaying(unsigned int iPad) +{ + return m_iQuadrantsMask&(1<1280x720 + scale.x = 2.0f; scale.y = 1.5f; scale.z = 1.0f; + XuiElementSetScale(m_hObj, &scale); + + return S_OK; + } + + + if( position != e_BaseScene_Fullscreen ) + { + // Scale up the tooltips so we can read them + /* + scale.x = 0.75f; scale.y = 0.75f; scale.z = 1.0f; + XuiElementSetScale(m_TooltipGroup[iPad], &scale); + fTooltipHeight*=scale.y; + */ + fTooltipHeight = fTooltipHeightSmall; + + scale.x = 0.5f; scale.y = 0.5f; scale.z = 1.0f; + XuiElementSetScale(m_CrouchIcon[iPad], &scale); + XuiElementSetScale(m_Logo[iPad].m_hObj, &scale); + } + else + { + // if we are not in high def mode, then we need to scale the m_BasePlayerScene scene by 2 (we're using the 640x360 scenes) + scale.x = 1.0f; scale.y = 1.0f; scale.z = 1.0f; + XuiElementSetScale(m_BasePlayerScene[iPad], &scale ); + XuiElementSetScale(m_TooltipGroup[iPad], &scale); + XuiElementSetScale(m_CrouchIcon[iPad], &scale); + XuiElementSetScale(m_Logo[iPad].m_hObj, &scale); + } + + + // The move applies to the whole scene, so we'll need to move tooltips back in some cases + switch( position ) + { + // No position adjustment + case e_BaseScene_Fullscreen: + tooltipsPos.x=SAFEZONE_HALF_WIDTH; + tooltipsPos.y=XUI_BASE_SCENE_HEIGHT-SAFEZONE_HALF_HEIGHT-fTooltipHeight; + crouchIconPos.x=SAFEZONE_HALF_WIDTH; + crouchIconPos.y=SAFEZONE_HALF_HEIGHT; + fBackWidth=XUI_BASE_SCENE_WIDTH; + fBackHeight=XUI_BASE_SCENE_HEIGHT; + + XuiElementGetPosition(m_selectedItemA[iPad], &vBossHealthPos); + vBossHealthPos.x = XUI_BASE_SCENE_WIDTH_HALF-(fBossHealthWidth/2); + vBossHealthPos.y = SAFEZONE_HALF_HEIGHT; + break; + case e_BaseScene_Top_Left: + tooltipsPos.x=SAFEZONE_HALF_WIDTH; + tooltipsPos.y=XUI_BASE_SCENE_HEIGHT_HALF-fTooltipHeight; + crouchIconPos.x=SAFEZONE_HALF_WIDTH; + crouchIconPos.y=SAFEZONE_HALF_HEIGHT; + fBackWidth=XUI_BASE_SCENE_WIDTH_HALF; + fBackHeight=XUI_BASE_SCENE_HEIGHT_HALF; + vGamertagPos.x=XUI_BASE_SCENE_WIDTH_HALF-fGamertagWidth - 10.0f; + vGamertagPos.y=SAFEZONE_HALF_HEIGHT; + vBossHealthPos.x = XUI_BASE_SCENE_WIDTH_QUARTER-(fBossHealthWidth/2); + vBossHealthPos.y = SAFEZONE_HALF_HEIGHT; + break; + case e_BaseScene_Top: // Top & Bottom - indent by a quarter screen + pos.x += XUI_BASE_SCENE_WIDTH_QUARTER; + tooltipsPos.x=SAFEZONE_HALF_WIDTH - XUI_BASE_SCENE_WIDTH_QUARTER; + tooltipsPos.y=XUI_BASE_SCENE_HEIGHT_HALF-fTooltipHeight; + crouchIconPos.x=SAFEZONE_HALF_WIDTH-XUI_BASE_SCENE_WIDTH_QUARTER; + crouchIconPos.y=SAFEZONE_HALF_HEIGHT; + fBackHeight=XUI_BASE_SCENE_HEIGHT_HALF; + fBackWidth=XUI_BASE_SCENE_WIDTH; + vBackPos.x=-XUI_BASE_SCENE_WIDTH_QUARTER; + vBackPos.y=0.0f; + vGamertagPos.x=XUI_BASE_SCENE_WIDTH - XUI_BASE_SCENE_WIDTH_QUARTER - fGamertagWidth - SAFEZONE_HALF_WIDTH; + vGamertagPos.y=SAFEZONE_HALF_HEIGHT; + vBossHealthPos.x = XUI_BASE_SCENE_WIDTH_QUARTER-(fBossHealthWidth/2); + vBossHealthPos.y = SAFEZONE_HALF_HEIGHT; + break; + case e_BaseScene_Bottom: + pos.x += XUI_BASE_SCENE_WIDTH_QUARTER; + pos.y += XUI_BASE_SCENE_HEIGHT_HALF; + tooltipsPos.x=SAFEZONE_HALF_WIDTH - XUI_BASE_SCENE_WIDTH_QUARTER; + tooltipsPos.y=XUI_BASE_SCENE_HEIGHT_HALF-SAFEZONE_HALF_HEIGHT-fTooltipHeight; + crouchIconPos.x=SAFEZONE_HALF_WIDTH-XUI_BASE_SCENE_WIDTH_QUARTER; + crouchIconPos.y=0.0f; + fBackHeight=XUI_BASE_SCENE_HEIGHT_HALF; + fBackWidth=XUI_BASE_SCENE_WIDTH; + vBackPos.x=-XUI_BASE_SCENE_WIDTH_QUARTER; + vBackPos.y=0.0f; + vGamertagPos.x=XUI_BASE_SCENE_WIDTH - XUI_BASE_SCENE_WIDTH_QUARTER - fGamertagWidth - SAFEZONE_HALF_WIDTH; + vGamertagPos.y=0.0f; + vBossHealthPos.x = XUI_BASE_SCENE_WIDTH_QUARTER-(fBossHealthWidth/2); + vBossHealthPos.y = 0.0f; + break; + case e_BaseScene_Bottom_Left: + pos.y += XUI_BASE_SCENE_HEIGHT_HALF; + tooltipsPos.x=SAFEZONE_HALF_WIDTH; + tooltipsPos.y=XUI_BASE_SCENE_HEIGHT_HALF-SAFEZONE_HALF_HEIGHT-fTooltipHeight; + crouchIconPos.x=SAFEZONE_HALF_WIDTH; + crouchIconPos.y=0.0f; + fBackWidth=XUI_BASE_SCENE_WIDTH_HALF; + fBackHeight=XUI_BASE_SCENE_HEIGHT_HALF; + vGamertagPos.x=XUI_BASE_SCENE_WIDTH_HALF-fGamertagWidth- 10.0f; + vGamertagPos.y=0.0f; + vBossHealthPos.x = XUI_BASE_SCENE_WIDTH_QUARTER-(fBossHealthWidth/2); + vBossHealthPos.y = 0.0f; + break; + case e_BaseScene_Bottom_Right: + pos.x += XUI_BASE_SCENE_WIDTH_HALF; + pos.y += XUI_BASE_SCENE_HEIGHT_HALF; + tooltipsPos.x=0.0f; + tooltipsPos.y=XUI_BASE_SCENE_HEIGHT_HALF-SAFEZONE_HALF_HEIGHT-fTooltipHeight; + crouchIconPos.x=0.0f; + crouchIconPos.y=0.0f; + fBackWidth=XUI_BASE_SCENE_WIDTH_HALF; + fBackHeight=XUI_BASE_SCENE_HEIGHT_HALF; + vGamertagPos.x=XUI_BASE_SCENE_WIDTH_HALF-fGamertagWidth-SAFEZONE_HALF_WIDTH; + vGamertagPos.y=0.0f; + vBossHealthPos.x = XUI_BASE_SCENE_WIDTH_QUARTER-(fBossHealthWidth/2); + vBossHealthPos.y = 0.0f; + break; + case e_BaseScene_Left: + pos.y += XUI_BASE_SCENE_HEIGHT_QUARTER; + tooltipsPos.x=SAFEZONE_HALF_WIDTH; + tooltipsPos.y=XUI_BASE_SCENE_HEIGHT_HALF+XUI_BASE_SCENE_HEIGHT_QUARTER-SAFEZONE_HALF_HEIGHT-fTooltipHeight; + crouchIconPos.x=SAFEZONE_HALF_WIDTH; + crouchIconPos.y=SAFEZONE_HALF_HEIGHT; + fBackWidth=XUI_BASE_SCENE_WIDTH_HALF; + fBackHeight=XUI_BASE_SCENE_HEIGHT; + vBackPos.x=0.0f; + vBackPos.y=-XUI_BASE_SCENE_HEIGHT_QUARTER; + vGamertagPos.x=XUI_BASE_SCENE_WIDTH_HALF-fGamertagWidth- 10.0f; + vGamertagPos.y=SAFEZONE_HALF_HEIGHT - XUI_BASE_SCENE_HEIGHT_QUARTER; + vBossHealthPos.x = XUI_BASE_SCENE_WIDTH_QUARTER-(fBossHealthWidth/2); + vBossHealthPos.y = SAFEZONE_HALF_HEIGHT-XUI_BASE_SCENE_HEIGHT_QUARTER; + break; + case e_BaseScene_Right: + pos.x += XUI_BASE_SCENE_WIDTH_HALF; + pos.y += XUI_BASE_SCENE_HEIGHT_QUARTER; + tooltipsPos.x=0.0f; + tooltipsPos.y=XUI_BASE_SCENE_HEIGHT_HALF+XUI_BASE_SCENE_HEIGHT_QUARTER-SAFEZONE_HALF_HEIGHT-fTooltipHeight; + crouchIconPos.x=0.0f; + crouchIconPos.y=SAFEZONE_HALF_HEIGHT; + fBackWidth=XUI_BASE_SCENE_WIDTH_HALF; + fBackHeight=XUI_BASE_SCENE_HEIGHT; + vBackPos.x=0.0f; + vBackPos.y=-XUI_BASE_SCENE_HEIGHT_QUARTER; + vGamertagPos.x=XUI_BASE_SCENE_WIDTH_HALF-fGamertagWidth-SAFEZONE_HALF_WIDTH; + vGamertagPos.y=SAFEZONE_HALF_HEIGHT - XUI_BASE_SCENE_HEIGHT_QUARTER; + vBossHealthPos.x = XUI_BASE_SCENE_WIDTH_QUARTER-(fBossHealthWidth/2); + vBossHealthPos.y = SAFEZONE_HALF_HEIGHT-XUI_BASE_SCENE_HEIGHT_QUARTER; + break; + case e_BaseScene_Top_Right: + pos.x += XUI_BASE_SCENE_WIDTH_HALF; + tooltipsPos.x=0.0f; + tooltipsPos.y=XUI_BASE_SCENE_HEIGHT_HALF-fTooltipHeight; + crouchIconPos.x=0.0f; + crouchIconPos.y=SAFEZONE_HALF_HEIGHT; + fBackWidth=XUI_BASE_SCENE_WIDTH_HALF; + fBackHeight=XUI_BASE_SCENE_HEIGHT_HALF; + vGamertagPos.x=XUI_BASE_SCENE_WIDTH_HALF-fGamertagWidth-SAFEZONE_HALF_WIDTH; + vGamertagPos.y=SAFEZONE_HALF_HEIGHT; + vBossHealthPos.x = XUI_BASE_SCENE_WIDTH_QUARTER-(fBossHealthWidth/2); + vBossHealthPos.y = SAFEZONE_HALF_HEIGHT; + break; + } + + XuiElementSetPosition(m_BasePlayerScene[iPad], &pos ); + XuiElementSetPosition( m_TooltipGroup[iPad].m_hObj, &tooltipsPos); + XuiElementSetPosition( m_TooltipGroupSmall[iPad].m_hObj, &tooltipsPos); + XuiElementSetPosition( m_CrouchIcon[iPad].m_hObj, &crouchIconPos); + XuiElementSetPosition( m_DarkOverlay[iPad].m_hObj, &vBackPos ); + XuiElementSetBounds( m_DarkOverlay[iPad].m_hObj, fBackWidth, fBackHeight); + XuiElementSetPosition( m_Background[iPad].m_hObj, &vBackPos ); + XuiElementSetBounds( m_Background[iPad].m_hObj, fBackWidth, fBackHeight ); + vGamertagPos.z=0.0f; + XuiElementSetPosition( m_hGamerTagA[iPad], &vGamertagPos ); + XuiElementSetPosition( m_BossHealthGroup[iPad], &vBossHealthPos ); + + + // 4J Stu - If we already have some scenes open, then call this to update their positions + // Fix for #10960 - All Lang: UI: Split-screen: Changing split screen mode (vertical/horizontal) make window layout strange + if(Minecraft::GetInstance() != NULL && Minecraft::GetInstance()->localplayers[iPad]!=NULL) + { + // 4J-PB - Can only do this once we know what the player's UI settings are, so we need to have the player game settings read + _UpdateSelectedItemPos(iPad); + XUIMessage xuiMsg; + CustomMessage_Splitscreenplayer_Struct myMsgData; + CustomMessage_Splitscreenplayer( &xuiMsg, &myMsgData, false); + XuiBroadcastMessage( GetPlayerBaseScene(iPad), &xuiMsg ); + } + // tell the xui scenes that the base position has changed + XUIMessage xuiMsg; + CustomMessage_BasePositionChanged( &xuiMsg ); + XuiBroadcastMessage( GetPlayerBaseScene(iPad), &xuiMsg ); + + return S_OK; +} + +// The function uses the game mode to decide the offsets for the select item. It needs to be called after the game has loaded. +void CXuiSceneBase::_UpdateSelectedItemPos(unsigned int iPad) +{ + D3DXVECTOR3 selectedItemPos; + selectedItemPos.x = selectedItemPos.y = selectedItemPos.z = 0.0f; + float fSelectedItemWidth, fSelectedItemHeight; + XuiElementGetBounds(m_selectedItemSmallA[iPad],&fSelectedItemWidth, &fSelectedItemHeight); + + float yOffset = 0.0f; + + if( m_bossHealthVisible[iPad] == TRUE ) + { + float tempWidth; + XuiElementGetBounds(m_BossHealthGroup[iPad],&tempWidth, &yOffset); + } + + + // Only adjust if fullscreen for now, leaving code to move others if required, but it's too far up the screen when on the bottom quadrants + if( (m_playerBaseScenePosition[iPad] == e_BaseScene_Fullscreen) && + (RenderManager.IsHiDef() || RenderManager.IsWidescreen()) ) + { + D3DXVECTOR3 selectedItemPos; + selectedItemPos.z=0.0f; + float scale, fTempWidth, fTooltipHeight, fTooltipHeightSmall, fSelectedItemWidth, fSelectedItemHeight, fSelectedItemSmallWidth, fSelectedItemSmallHeight; + XuiElementGetBounds(m_TooltipGroup[iPad].m_hObj,&fTempWidth, &fTooltipHeight); + XuiElementGetBounds(m_TooltipGroupSmall[iPad].m_hObj,&fTempWidth, &fTooltipHeightSmall); + XuiElementGetBounds(m_selectedItemA[iPad],&fSelectedItemWidth, &fSelectedItemHeight); + XuiElementGetBounds(m_selectedItemSmallA[iPad],&fSelectedItemSmallWidth, &fSelectedItemSmallHeight); + if( m_playerBaseScenePosition[iPad] != e_BaseScene_Fullscreen ) + { + fTooltipHeight = fTooltipHeightSmall; + fSelectedItemHeight = fSelectedItemSmallHeight; + + scale = 0.5f; + } + else + { + // if we are not in high def mode, then we need to scale the m_BasePlayerScene scene by 2 (we're using the 640x360 scenes) + scale = 1.0f; + } + + // The move applies to the whole scene, so we'll need to move tooltips back in some cases + + selectedItemPos.y=XUI_BASE_SCENE_HEIGHT-SAFEZONE_HALF_HEIGHT-fTooltipHeight - fSelectedItemHeight; + selectedItemPos.x = XUI_BASE_SCENE_WIDTH_HALF - (fSelectedItemWidth/2.0f); + + // Adjust selectedItemPos based on what gui is displayed + + + // 4J-PB - selected the gui scale based on the slider settings, and on whether we're in Creative or Survival + float fYOffset=0.0f; + + unsigned char ucGuiScale=app.GetGameSettings(iPad,eGameSetting_UISize) + 2; + + if(Minecraft::GetInstance() != NULL && Minecraft::GetInstance()->localgameModes[iPad] != NULL && Minecraft::GetInstance()->localgameModes[iPad]->canHurtPlayer()) + { + // SURVIVAL MODE - Move up further because of hearts, shield and xp + switch(ucGuiScale) + { + case 3: + fYOffset = -130.0f; + break; + case 4: + fYOffset = -168.0f; + break; + default: // 2 + fYOffset = -94.0f; + break; + } + } + else + { + switch(ucGuiScale) + { + case 3: + fYOffset = -83.0f; + break; + case 4: + fYOffset = -114.0f; + break; + default: // 2 + fYOffset = -58.0f; + break; + } + } + + + selectedItemPos.y+=fYOffset - 40.0f; // 40 for the XP display + + XuiElementSetPosition( m_selectedItemA[iPad].m_hObj, &selectedItemPos ); + + //XuiElementSetPosition( m_selectedItemSmallA[iPad].m_hObj, &selectedItemPos ); + } + else + { + // The move applies to the whole scene, so we'll need to move tooltips back in some cases + switch( m_playerBaseScenePosition[iPad] ) + { + case e_BaseScene_Fullscreen: + // 480 non-widescreen + selectedItemPos.x = XUI_BASE_SCENE_WIDTH_QUARTER - (fSelectedItemWidth/2.0f); + selectedItemPos.y = SAFEZONE_HALF_HEIGHT + yOffset; + break; + case e_BaseScene_Top_Left: + selectedItemPos.x = XUI_BASE_SCENE_WIDTH_QUARTER - (fSelectedItemWidth/2.0f); + selectedItemPos.y = SAFEZONE_HALF_HEIGHT + yOffset; + break; + case e_BaseScene_Top: // Top & Bottom - indent by a quarter screen + selectedItemPos.x = XUI_BASE_SCENE_WIDTH_QUARTER - (fSelectedItemWidth/2.0f); + selectedItemPos.y = SAFEZONE_HALF_HEIGHT + yOffset; + break; + case e_BaseScene_Bottom: + selectedItemPos.x = XUI_BASE_SCENE_WIDTH_QUARTER - (fSelectedItemWidth/2.0f); + selectedItemPos.y = 0.0f + yOffset; + break; + case e_BaseScene_Bottom_Left: + selectedItemPos.x = XUI_BASE_SCENE_WIDTH_QUARTER - (fSelectedItemWidth/2.0f); + selectedItemPos.y = 0.0f + yOffset; + break; + case e_BaseScene_Bottom_Right: + selectedItemPos.x = XUI_BASE_SCENE_WIDTH_QUARTER - (fSelectedItemWidth/2.0f); + selectedItemPos.y = 0.0f + yOffset; + break; + case e_BaseScene_Left: + selectedItemPos.x = XUI_BASE_SCENE_WIDTH_QUARTER - (fSelectedItemWidth/2.0f); + selectedItemPos.y = XUI_BASE_SCENE_HEIGHT_HALF;// + yOffset; - don't need the offset for the boss health since we're displaying the item at the bottom of the screen, not the top + break; + case e_BaseScene_Right: + selectedItemPos.x = XUI_BASE_SCENE_WIDTH_QUARTER - (fSelectedItemWidth/2.0f); + selectedItemPos.y = XUI_BASE_SCENE_HEIGHT_HALF;// + yOffset; - don't need the offset for the boss health since we're displaying the item at the bottom of the screen, not the top + break; + case e_BaseScene_Top_Right: + selectedItemPos.x = XUI_BASE_SCENE_WIDTH_QUARTER - (fSelectedItemWidth/2.0f); + selectedItemPos.y = SAFEZONE_HALF_HEIGHT + yOffset; + break; + } + + // 4J-PB - If it's in split screen vertical, adjust the position + // Adjust selectedItemPos based on what gui is displayed + if((m_playerBaseScenePosition[iPad]==e_BaseScene_Left) || (m_playerBaseScenePosition[iPad]==e_BaseScene_Right)) + { + float scale=0.5f; + selectedItemPos.y -= (scale * 88.0f); + if(Minecraft::GetInstance() != NULL && Minecraft::GetInstance()->localgameModes[iPad] != NULL && Minecraft::GetInstance()->localgameModes[iPad]->canHurtPlayer()) + { + selectedItemPos.y -= (scale * 80.0f); + } + + // 4J-PB - selected the gui scale based on the slider settings + unsigned char ucGuiScale; + float fYOffset=0.0f; + if(m_playerBaseScenePosition[iPad]==e_BaseScene_Fullscreen) + { + ucGuiScale=app.GetGameSettings(iPad,eGameSetting_UISize) + 2; + } + else + { + ucGuiScale=app.GetGameSettings(iPad,eGameSetting_UISizeSplitscreen) + 2; + } + switch(ucGuiScale) + { + case 3: + fYOffset = 55.0f; + break; + case 4: + fYOffset = 45.0f; + break; + default: // 2 + fYOffset = 85.0f; + break; + } + selectedItemPos.y+=fYOffset; + } + + XuiElementSetPosition( m_selectedItemSmallA[iPad].m_hObj, &selectedItemPos ); + XuiElementSetPosition( m_selectedItemA[iPad].m_hObj, &selectedItemPos ); + } +} + +CXuiSceneBase::EBaseScenePosition CXuiSceneBase::_GetPlayerBasePosition(int iPad) +{ + return m_playerBaseScenePosition[iPad]; +} + +void CXuiSceneBase::_SetEmptyQuadrantLogo(int iPad,EBaseScenePosition ePos) +{ + if(m_hEmptyQuadrantLogo!=NULL) + { + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if(m_playerBaseScenePosition[i] == e_BaseScene_Fullscreen) + { + // Someone is fullscreen, so don't show this + XuiElementSetShow(m_hEmptyQuadrantLogo,FALSE); + return; + } + } + + D3DXVECTOR3 pos; + + // get the bounds of the logo + + pos.z=0.0f; + switch( ePos ) + { + case e_BaseScene_Top_Left: + pos.x=64.0f; + pos.y=36.0f; + break; + case e_BaseScene_Top_Right: + pos.x=640.0+64.0f; + pos.y=36.0f; + break; + case e_BaseScene_Bottom_Left: + pos.x=64.0f; + pos.y=360.0f+36.0f; + break; + case e_BaseScene_Bottom_Right: + pos.x=640.0+64.0f; + pos.y=360.0f+36.0f; + break; + } + + // set the opacity of the logo + if(ProfileManager.GetLockedProfile()!=-1) + { + unsigned char ucAlpha=app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_InterfaceOpacity); + XuiElementSetOpacity(m_hEmptyQuadrantLogo,0.01f*(float)ucAlpha); + } + + XuiElementSetPosition(m_hEmptyQuadrantLogo, &pos ); + XuiElementSetShow(m_hEmptyQuadrantLogo,TRUE); + } +} + + +HRESULT CXuiSceneBase::_PlayUISFX(ESoundEffect eSound) +{ + HRESULT hr; + bool bUsingTexturepackWithAudio=false; + + // are we using a mash-up pack? + if(!Minecraft::GetInstance()->skins->isUsingDefaultSkin()) + { + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + if(tPack->hasAudio()) + { + bUsingTexturepackWithAudio=true; + } + } + + /*if(bUsingTexturepackWithAudio) + { + switch(eSound) + { + case eSFX_Back: + hr=XuiSoundPlay(m_SFXA[eSFX_Craft]); + break; + case eSFX_Craft: + hr=XuiSoundPlay(m_SFXA[eSFX_Craft]); + break; + case eSFX_CraftFail: + hr=XuiSoundPlay(m_SFXA[eSFX_Craft]); + break; + case eSFX_Focus: + hr=XuiSoundPlay(m_SFXA[eSFX_Craft]); + break; + case eSFX_Press: + hr=XuiSoundPlay(m_SFXA[eSFX_Craft]); + break; + case eSFX_Scroll: + hr=XuiSoundPlay(m_SFXA[eSFX_Craft]); + break; + default: + hr=S_OK; + break; + } + } + else*/ + { + + switch(eSound) + { + case eSFX_Back: + hr=XuiSoundPlay(m_SFXA[eSFX_Back]); + break; + case eSFX_Craft: + hr=XuiSoundPlay(m_SFXA[eSFX_Craft]); + break; + case eSFX_CraftFail: + hr=XuiSoundPlay(m_SFXA[eSFX_CraftFail]); + break; + case eSFX_Focus: + hr=XuiSoundPlay(m_SFXA[eSFX_Focus]); + break; + case eSFX_Press: + hr=XuiSoundPlay(m_SFXA[eSFX_Press]); + break; + case eSFX_Scroll: + hr=XuiSoundPlay(m_SFXA[eSFX_Scroll]); + break; + default: + hr=S_OK; + break; + } + } + return hr; +} + + +HRESULT CXuiSceneBase::_DisplayGamertag( unsigned int iPad, BOOL bDisplay ) +{ + + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<localplayers[iPad]!=NULL) + { + wstring wsGamertag = convStringToWstring( ProfileManager.GetGamertag(iPad)); + XuiControlSetText(m_hGamerTagA[iPad],wsGamertag.c_str()); + + } + else + { + XuiControlSetText(m_hGamerTagA[iPad],L""); + } + } + } + // The host decides whether these are on or off + if(app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_DisplaySplitscreenGamertags)!=0) + { + XuiElementSetShow(m_hGamerTagA[iPad],bDisplay); + + // set the opacity of the gamertag + if((bDisplay==TRUE) &&(ProfileManager.GetLockedProfile()!=-1)) + { + unsigned char ucAlpha=app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_InterfaceOpacity); + float fVal; + + if(ucAlpha<80) + { + // check if we have the timer running for the opacity + unsigned int uiOpacityTimer=app.GetOpacityTimer(ProfileManager.GetPrimaryPad()); + if(uiOpacityTimer!=0) + { + if(uiOpacityTimer<10) + { + float fStep=(80.0f-(float)ucAlpha)/10.0f; + fVal=0.01f*(80.0f-((10.0f-(float)uiOpacityTimer)*fStep)); + } + else + { + fVal=0.01f*80.0f; + } + } + else + { + fVal=0.01f*(float)ucAlpha; + } + } + else + { + fVal=0.01f*(float)ucAlpha; + } + XuiElementSetOpacity(m_hGamerTagA[iPad],0.01f*fVal); + } + } + else + { + XuiElementSetShow(m_hGamerTagA[iPad],FALSE); + } + + return S_OK; +} + +void CXuiSceneBase::_SetSelectedItem( unsigned int iPad, const wstring& name) +{ + if(app.GetGameSettings(eGameSetting_Hints) == 0 || name.empty()) + { + m_selectedItemA[iPad].SetShow(FALSE); + m_selectedItemSmallA[iPad].SetShow(FALSE); + } + else + { + m_uiSelectedItemOpacityCountDown[iPad] = SharedConstants::TICKS_PER_SECOND * 3; + if(m_playerBaseScenePosition[iPad] == e_BaseScene_Fullscreen) + { + m_selectedItemSmallA[iPad].SetShow(FALSE); + m_selectedItemA[iPad].SetShow(TRUE); + m_selectedItemA[iPad].SetText(name.c_str()); + +// D3DXVECTOR3 vPos; +// XuiElementGetPosition( m_selectedItemA[iPad].m_hObj, &vPos ); +// XuiElementSetPosition( m_selectedItemA[iPad].m_hObj, &vPos ); + + float fVal=0.8f;//0.01f*(float)80; + XuiElementSetOpacity(m_selectedItemA[iPad].m_hObj,fVal); + } + else + { + m_selectedItemA[iPad].SetShow(FALSE); + m_selectedItemSmallA[iPad].SetShow(TRUE); + m_selectedItemSmallA[iPad].SetText(name.c_str()); + +// D3DXVECTOR3 vPos; +// XuiElementGetPosition( m_selectedItemSmallA[iPad].m_hObj, &vPos ); +// XuiElementSetPosition( m_selectedItemSmallA[iPad].m_hObj, &vPos ); + + float fVal=0.8f;//0.01f*(float)80; + XuiElementSetOpacity(m_selectedItemSmallA[iPad].m_hObj,fVal); + } + } +} + +void CXuiSceneBase::_HideAllGameUIElements() +{ + for(int i=0;i0 && lastVisible!=-1 ) + { + float width, height; + XuiElementGetBounds(m_Buttons[iPad][lastVisible].m_hObj, &width, &height); + + // 4J Stu - This is for horizontal layout, will need changed if we do vertical layout + lastPos.x += width + m_iTooltipSpacingGap; + + XuiElementGetBounds(m_ButtonsSmall[iPad][lastVisible].m_hObj, &width, &height); + // 4J Stu - This is for horizontal layout, will need changed if we do vertical layout + lastPosSmall.x += width + m_iTooltipSpacingGapSmall; + } + XuiElementSetPosition( m_Buttons[iPad][i].m_hObj, &lastPos); + XuiElementSetPosition( m_ButtonsSmall[iPad][i].m_hObj, &lastPosSmall); + + lastVisible = i; + } + } +} + +void CXuiSceneBase::TickAllBaseScenes() +{ + if( CXuiSceneBase::Instance != NULL ) + { + CXuiSceneBase::Instance->_TickAllBaseScenes(); + } +} + +HRESULT CXuiSceneBase::SetEnableTooltips( unsigned int iPad, BOOL bVal ) +{ + if( CXuiSceneBase::Instance != NULL ) + { + return CXuiSceneBase::Instance->_SetEnableTooltips(iPad, bVal ); + } + return S_OK; +} + +HRESULT CXuiSceneBase::SetTooltipText( unsigned int iPad, unsigned int tooltip, int iTextID ) +{ + if( CXuiSceneBase::Instance != NULL ) + { + return CXuiSceneBase::Instance->_SetTooltipText(iPad, tooltip, iTextID ); + } + return S_OK; +} + +HRESULT CXuiSceneBase::RefreshTooltips( unsigned int iPad) +{ + if( CXuiSceneBase::Instance != NULL ) + { + return CXuiSceneBase::Instance->_RefreshTooltips(iPad); + } + return S_OK; +} + +HRESULT CXuiSceneBase::ShowTooltip( unsigned int iPad, unsigned int tooltip, bool show ) +{ + if( CXuiSceneBase::Instance != NULL ) + { + return CXuiSceneBase::Instance->_ShowTooltip(iPad, tooltip, show ); + } + return S_OK; +} + +HRESULT CXuiSceneBase::ShowSafeArea( BOOL bShow ) +{ + if( CXuiSceneBase::Instance != NULL ) + { + return CXuiSceneBase::Instance->_ShowSafeArea(bShow ); + } + return S_OK; +} + +HRESULT CXuiSceneBase::SetTooltips( unsigned int iPad, int iA, int iB, int iX, int iY , int iLT, int iRT, int iRB, int iLB, int iLS, bool forceUpdate /*= false*/ ) +{ + if( CXuiSceneBase::Instance != NULL ) + { + // Enable all the tooltips. We should disable them in the scenes as required + CXuiSceneBase::Instance->_SetTooltipsEnabled( iPad ); + + int iTooptipsA[BUTTONS_TOOLTIP_MAX]; + iTooptipsA[BUTTON_TOOLTIP_A]=iA; + iTooptipsA[BUTTON_TOOLTIP_B]=iB; + iTooptipsA[BUTTON_TOOLTIP_X]=iX; + iTooptipsA[BUTTON_TOOLTIP_Y]=iY; + iTooptipsA[BUTTON_TOOLTIP_LT]=iLT; + iTooptipsA[BUTTON_TOOLTIP_RT]=iRT; + iTooptipsA[BUTTON_TOOLTIP_LB]=iRB; + iTooptipsA[BUTTON_TOOLTIP_RB]=iLB; + iTooptipsA[BUTTON_TOOLTIP_LS]=iLS; + + for(int i=0;iSetTooltipText(iPad, i, -1 ); + CXuiSceneBase::Instance->_ShowTooltip(iPad, i, false ); + //CXuiSceneBase::Instance->m_iCurrentTooltipTextID[iPad][i]=-1; + } + else if(iTooptipsA[i]==-2) + { + CXuiSceneBase::Instance->_ShowTooltip(iPad, i, true ); + CXuiSceneBase::Instance->SetTooltipText(iPad, i, -2 ); + } + else + { + // does the tooltip need to change? + if(CXuiSceneBase::Instance->m_iCurrentTooltipTextID[iPad][i]!=iTooptipsA[i] || forceUpdate) + { + CXuiSceneBase::Instance->SetTooltipText(iPad, i, iTooptipsA[i] ); + } + CXuiSceneBase::Instance->_ShowTooltip(iPad, i, true ); + } + } + + } + return S_OK; +} + +HRESULT CXuiSceneBase::SetTooltipsEnabled( unsigned int iPad, bool bA, bool bB, bool bX, bool bY,bool bLT, bool bRT, bool bLB, bool bRB, bool bLS) +{ + return CXuiSceneBase::Instance->_SetTooltipsEnabled(iPad, bA, bB, bX, bY, bLT, bRT, bLB, bRB, bLS ); +} + +HRESULT CXuiSceneBase::EnableTooltip( unsigned int iPad, unsigned int tooltip, bool enable ) +{ + return CXuiSceneBase::Instance->_EnableTooltip(iPad, tooltip, enable); +} + +HRESULT CXuiSceneBase::AnimateKeyPress(DWORD userIndex, DWORD dwKeyCode) +{ + return CXuiSceneBase::Instance->_AnimateKeyPress(userIndex, dwKeyCode ); +} + +HRESULT CXuiSceneBase::ShowSavingMessage( unsigned int iPad, C4JStorage::ESavingMessage eVal ) +{ + if( CXuiSceneBase::Instance != NULL ) + { + return CXuiSceneBase::Instance->_ShowSavingMessage(iPad, eVal); + } + + return S_OK; +} + +HRESULT CXuiSceneBase::ShowBackground( unsigned int iPad, BOOL bShow ) +{ + return CXuiSceneBase::Instance->_ShowBackground(iPad, bShow ); +} + +HRESULT CXuiSceneBase::ShowDarkOverlay( unsigned int iPad, BOOL bShow ) +{ + return CXuiSceneBase::Instance->_ShowDarkOverlay(iPad, bShow ); +} + +HRESULT CXuiSceneBase::ShowLogo( unsigned int iPad, BOOL bShow ) +{ + return CXuiSceneBase::Instance->_ShowLogo(iPad, bShow ); +} + +HRESULT CXuiSceneBase::ShowPressStart(unsigned int iPad) +{ + CXuiSceneBase::Instance->_ShowPressStart(iPad); + return S_OK; +} + +HRESULT CXuiSceneBase::ShowOtherPlayersBaseScene(int iPad, bool show) +{ + CXuiSceneBase::Instance->_ShowOtherPlayersBaseScene(iPad, show); + return S_OK; +} + +HRESULT CXuiSceneBase::UpdateAutosaveCountdownTimer(unsigned int uiSeconds) +{ + CXuiSceneBase::Instance->_UpdateAutosaveCountdownTimer(uiSeconds); + return S_OK; +} + +HRESULT CXuiSceneBase::ShowAutosaveCountdownTimer(BOOL bVal) +{ + CXuiSceneBase::Instance->_ShowAutosaveCountdownTimer(bVal); + return S_OK; +} + +HRESULT CXuiSceneBase::UpdateTrialTimer(unsigned int iPad) +{ + CXuiSceneBase::Instance->_UpdateTrialTimer(iPad); + return S_OK; +} +HRESULT CXuiSceneBase::ShowTrialTimer(BOOL bVal) +{ + CXuiSceneBase::Instance->_ShowTrialTimer(bVal); + return S_OK; +} + +void CXuiSceneBase::ReduceTrialTimerValue() +{ + CXuiSceneBase::Instance->_ReduceTrialTimerValue(); +} + +bool CXuiSceneBase::PressStartPlaying(unsigned int iPad) +{ + return CXuiSceneBase::Instance->_PressStartPlaying(iPad); +} + +HRESULT CXuiSceneBase::HidePressStart() +{ + return CXuiSceneBase::Instance->_HidePressStart(); +} + +HRESULT CXuiSceneBase::SetPlayerBaseScenePosition( unsigned int iPad, EBaseScenePosition position ) +{ + return CXuiSceneBase::Instance->_SetPlayerBaseScenePosition(iPad, position ); +} + +HRESULT CXuiSceneBase::SetPlayerBasePositions(EBaseScenePosition pad0, EBaseScenePosition pad1, EBaseScenePosition pad2, EBaseScenePosition pad3) +{ + SetPlayerBaseScenePosition( 0, pad0 ); + SetPlayerBaseScenePosition( 1, pad1 ); + SetPlayerBaseScenePosition( 2, pad2 ); + SetPlayerBaseScenePosition( 3, pad3 ); + + return S_OK; +} + +HRESULT CXuiSceneBase::UpdatePlayerBasePositions() +{ + EBaseScenePosition padPositions[XUSER_MAX_COUNT]; + + for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + padPositions[idx] = e_BaseScene_NotSet; + } + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + // If the game is not started (or is being held paused for a bit) then display all scenes fullscreen + if( pMinecraft == NULL ) + { + for( BYTE idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + padPositions[idx] = e_BaseScene_Fullscreen; + } + } + + // If the game is not in split-screen, then display the primary pad at fullscreen + else if(app.GetLocalPlayerCount()<2) + { + int primaryPad = ProfileManager.GetPrimaryPad(); + padPositions[primaryPad] = e_BaseScene_Fullscreen; + + // May need to turn off the player who just left + for( BYTE idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + DisplayGamertag(idx,FALSE); + } + } + + // We are in splitscreen so work out where each player should be + else + { + + for( BYTE idx = 0; idx < XUSER_MAX_COUNT; ++idx) + { + if(pMinecraft->localplayers[idx] != NULL) + { + if(pMinecraft->localplayers[idx]->m_iScreenSection==C4JRender::VIEWPORT_TYPE_FULLSCREEN) + { + DisplayGamertag(idx,FALSE); + } + else + { + DisplayGamertag(idx,TRUE); + } + + switch( pMinecraft->localplayers[idx]->m_iScreenSection) + { + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + padPositions[idx] = e_BaseScene_Fullscreen; + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + padPositions[idx] = e_BaseScene_Top; + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + padPositions[idx] = e_BaseScene_Bottom; + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: + padPositions[idx] = e_BaseScene_Left; + break; + case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: + padPositions[idx] = e_BaseScene_Right; + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + padPositions[idx] = e_BaseScene_Top_Left; + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + padPositions[idx] = e_BaseScene_Top_Right; + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + padPositions[idx] = e_BaseScene_Bottom_Left; + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + padPositions[idx] = e_BaseScene_Bottom_Right; + break; + } + } + else + { + padPositions[idx] = e_BaseScene_NotSet; + DisplayGamertag(idx,FALSE); + } + } + } + + return SetPlayerBasePositions(padPositions[0], padPositions[1], padPositions[2], padPositions[3]); +} + +CXuiSceneBase::EBaseScenePosition CXuiSceneBase::GetPlayerBasePosition(int iPad) +{ + return CXuiSceneBase::Instance->_GetPlayerBasePosition(iPad); +} + +void CXuiSceneBase::UpdateSelectedItemPos(int iPad) +{ + CXuiSceneBase::Instance->_UpdateSelectedItemPos(iPad); +} + +HXUIOBJ CXuiSceneBase::GetPlayerBaseScene(int iPad) +{ + return CXuiSceneBase::Instance->_GetPlayerBaseScene(iPad); +} + +HRESULT CXuiSceneBase::PlayUISFX(ESoundEffect eSound) +{ + return CXuiSceneBase::Instance->_PlayUISFX(eSound); +} + +void CXuiSceneBase::SetEmptyQuadrantLogo(int iScreenSection) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + EBaseScenePosition ePos=e_BaseScene_Top_Left; + int iPad; + // find the empty player + for( iPad = 0; iPad < XUSER_MAX_COUNT; ++iPad) + { + if(pMinecraft->localplayers[iPad] == NULL) + { + switch( iScreenSection) + { + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: + ePos = e_BaseScene_Top_Left; + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: + ePos = e_BaseScene_Top_Right; + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: + ePos = e_BaseScene_Bottom_Left; + break; + case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: + ePos = e_BaseScene_Bottom_Right; + break; + } + break; + } + } + + CXuiSceneBase::Instance->_SetEmptyQuadrantLogo(iPad,ePos); +} + +HRESULT CXuiSceneBase::DisplayGamertag( unsigned int iPad, BOOL bDisplay ) +{ + + CXuiSceneBase::Instance->_DisplayGamertag(iPad,bDisplay); + return S_OK; +} + +void CXuiSceneBase::SetSelectedItem( unsigned int iPad, const wstring &name) +{ + CXuiSceneBase::Instance->_SetSelectedItem(iPad,name); +} + +void CXuiSceneBase::HideAllGameUIElements() +{ + CXuiSceneBase::Instance->_HideAllGameUIElements(); +} + +bool CXuiSceneBase::GetBaseSceneSafeZone( unsigned int iPad, D3DXVECTOR2 &origin, float &width, float &height ) +{ + return CXuiSceneBase::Instance->_GetBaseSceneSafeZone(iPad,origin,width,height); +} + + +#ifndef _XBOX +void CXuiSceneBase::CreateBaseSceneInstance() +{ + CXuiSceneBase *sceneBase = new CXuiSceneBase(); + BOOL handled; + sceneBase->OnInit(NULL,handled); +} +#endif \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_Base.h b/Minecraft.Client/Common/XUI/XUI_Scene_Base.h new file mode 100644 index 00000000..1a5b5d87 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Base.h @@ -0,0 +1,432 @@ +#pragma once + +#include "../media/xuiscene_base.h" +#include "XUI_Ctrl_SlotItem.h" +#include "XUI_CustomMessages.h" +#include "..\UI\UIEnums.h" +#include "..\..\..\Minecraft.World\SoundTypes.h" + +#define BUTTON_TOOLTIP_A 0 +#define BUTTON_TOOLTIP_B 1 +#define BUTTON_TOOLTIP_X 2 +#define BUTTON_TOOLTIP_Y 3 +#define BUTTON_TOOLTIP_LT 4 +#define BUTTON_TOOLTIP_RT 5 +#define BUTTON_TOOLTIP_LB 6 +#define BUTTON_TOOLTIP_RB 7 +#define BUTTON_TOOLTIP_LS 8 +#define BUTTONS_TOOLTIP_MAX 9 + +#define SFX_BACK 0 +#define SFX_CRAFT 1 +#define SFX_CRAFTFAIL 2 +#define SFX_FOCUS 3 +#define SFX_PRESS 4 +#define SFX_SCROLL 5 +#define SFX_MAX 6 + + +// This should be our target screen height and width +#define XUI_BASE_SCENE_WIDTH 1280.0f +#define XUI_BASE_SCENE_HEIGHT 720.0f + +#define XUI_BASE_SCENE_WIDTH_HALF 640.0f +#define XUI_BASE_SCENE_HEIGHT_HALF 360.0f +#define XUI_BASE_SCENE_WIDTH_QUARTER 320.0f +#define XUI_BASE_SCENE_HEIGHT_QUARTER 180.0f +#define SAFEZONE_HALF_HEIGHT 36.0f +#define SAFEZONE_HALF_WIDTH 64.0f + +// How much we scale each base for splitscreen (should be 0.5f) +#define XUI_BASE_SPLITSCREEN_SCALE 1.0f//0.5f // 4J-PB - TODO - move scenes instead + +// We make the tooltips bigger as they are unreadable when scaled by the above +#define XUI_BASE_SPLIT_TOOLTIPS_SCALE 1.0f//1.5f + +// The percentage of starting size that the tooltips grow by +#define XUI_BASE_SPLIT_TOOLTIPS_DIFF (XUI_BASE_SPLIT_TOOLTIPS_SCALE - 1.0f) + +class CXuiSceneBase : public CXuiSceneImpl +{ +public: + enum EBaseScenePosition + { + e_BaseScene_NotSet, + + // 1 player + e_BaseScene_Fullscreen, + + // 2 Player split-screen + e_BaseScene_Top, + e_BaseScene_Bottom, + e_BaseScene_Left, + e_BaseScene_Right, + + // 3/4 Player split-screen + e_BaseScene_Top_Left, + e_BaseScene_Top_Right, + e_BaseScene_Bottom_Left, + e_BaseScene_Bottom_Right, + }; + +protected: + static const int m_iTooltipSpacingGap=10; + static const int m_iTooltipSpacingGapSmall=5; + D3DXVECTOR3 m_vPosTextInTooltip[BUTTONS_TOOLTIP_MAX]; + D3DXVECTOR3 m_vPosTextInTooltipSmall[BUTTONS_TOOLTIP_MAX]; + D3DXVECTOR3 vLogoPosA[XUSER_MAX_COUNT]; + + // We have a group of these per player + CXuiScene m_BasePlayerScene[XUSER_MAX_COUNT]; + // Control and Element wrapper objects. + CXuiControl m_TooltipGroup[XUSER_MAX_COUNT]; + CXuiControl m_Buttons[XUSER_MAX_COUNT][BUTTONS_TOOLTIP_MAX]; + CXuiControl m_TooltipGroupSmall[XUSER_MAX_COUNT]; + CXuiControl m_ButtonsSmall[XUSER_MAX_COUNT][BUTTONS_TOOLTIP_MAX]; + CXuiControl m_bottomLeftAnchorPoint[XUSER_MAX_COUNT]; + CXuiControl m_topLeftAnchorPoint[XUSER_MAX_COUNT]; + CXuiControl m_SavingIcon; + CXuiControl m_Background[XUSER_MAX_COUNT]; + CXuiControl m_DarkOverlay[XUSER_MAX_COUNT]; + CXuiControl m_Logo[XUSER_MAX_COUNT]; + CXuiControl m_CrouchIcon[XUSER_MAX_COUNT]; + CXuiControl m_PressStart; + CXuiControl m_TrialTimer; + CXuiControl m_SafeArea; + CXuiControl m_BossHealthGroup[XUSER_MAX_COUNT]; + CXuiControl m_BossHealthText[XUSER_MAX_COUNT]; + CXuiProgressBar *m_pBossHealthProgress; + CXuiProgressBar m_BossHealthProgress1[XUSER_MAX_COUNT]; + CXuiProgressBar m_BossHealthProgress2[XUSER_MAX_COUNT]; + CXuiProgressBar m_BossHealthProgress3[XUSER_MAX_COUNT]; + CXuiProgressBar m_BossHealthProgress1_small[XUSER_MAX_COUNT]; + CXuiProgressBar m_BossHealthProgress2_small[XUSER_MAX_COUNT]; + CXuiProgressBar m_BossHealthProgress3_small[XUSER_MAX_COUNT]; + int m_ticksWithNoBoss; + CXuiSound m_SFXA[SFX_MAX]; + HXUIOBJ m_hEmptyQuadrantLogo; + HXUIOBJ m_hGamerTagA[XUSER_MAX_COUNT]; + CXuiControl m_selectedItemA[XUSER_MAX_COUNT]; + CXuiControl m_selectedItemSmallA[XUSER_MAX_COUNT]; + + BOOL m_visible[XUSER_MAX_COUNT][BUTTONS_TOOLTIP_MAX]; + BOOL m_bossHealthVisible[XUSER_MAX_COUNT]; + int m_iWrongTexturePackTickC; + + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_TIMER( OnTimer ) + XUI_ON_XM_SKIN_CHANGED( OnSkinChanged ) +// XUI_ON_XM_DLCINSTALLED_MESSAGE(OnCustomMessage_DLCInstalled) +// XUI_ON_XM_DLCLOADED_MESSAGE(OnCustomMessage_DLCMountingComplete) + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_XuiPressStartMessage, m_PressStart) + MAP_CONTROL(IDC_XuiTrialTimer, m_TrialTimer) + MAP_CONTROL(IDC_XuiSavingIcon, m_SavingIcon) + MAP_CONTROL(IDC_SafeArea, m_SafeArea) + MAP_CONTROL(IDC_XuiSoundXACTBack, m_SFXA[SFX_BACK]) + MAP_CONTROL(IDC_XuiSoundXACTCraft,m_SFXA[SFX_CRAFT]) + MAP_CONTROL(IDC_XuiSoundXACTCraftFail,m_SFXA[SFX_CRAFTFAIL]) + MAP_CONTROL(IDC_XuiSoundXACTPress,m_SFXA[SFX_PRESS]) + MAP_CONTROL(IDC_XuiSoundXACTFocus,m_SFXA[SFX_FOCUS]) + MAP_CONTROL(IDC_XuiSoundXACTScroll,m_SFXA[SFX_SCROLL]) + + //MAP_CONTROL(IDC_BossHealth, m_BossHealthGroup) + //BEGIN_MAP_CHILD_CONTROLS(m_BossHealthGroup) + // MAP_CONTROL(IDC_TitleText, m_BossHealthText) + // MAP_CONTROL(IDC_ProgressBar, m_BossHealthProgress) + //END_MAP_CHILD_CONTROLS() + + MAP_CONTROL(IDC_BasePlayer0, m_BasePlayerScene[0]) + BEGIN_MAP_CHILD_CONTROLS(m_BasePlayerScene[0]) + MAP_CONTROL(IDC_BottomLeftAnchorPoint, m_bottomLeftAnchorPoint[0]) + MAP_CONTROL(IDC_TopLeftAnchorPoint, m_topLeftAnchorPoint[0]) + MAP_CONTROL(IDC_Tooltips, m_TooltipGroup[0]) + BEGIN_MAP_CHILD_CONTROLS(m_TooltipGroup[0]) + MAP_CONTROL(IDC_AButton, m_Buttons[0][BUTTON_TOOLTIP_A]) + MAP_CONTROL(IDC_BButton, m_Buttons[0][BUTTON_TOOLTIP_B]) + MAP_CONTROL(IDC_XButton, m_Buttons[0][BUTTON_TOOLTIP_X]) + MAP_CONTROL(IDC_YButton, m_Buttons[0][BUTTON_TOOLTIP_Y]) + MAP_CONTROL(IDC_LTrigger, m_Buttons[0][BUTTON_TOOLTIP_LT]) + MAP_CONTROL(IDC_RTrigger, m_Buttons[0][BUTTON_TOOLTIP_RT]) + MAP_CONTROL(IDC_RBButton, m_Buttons[0][BUTTON_TOOLTIP_RB]) + MAP_CONTROL(IDC_LBButton, m_Buttons[0][BUTTON_TOOLTIP_LB]) + MAP_CONTROL(IDC_LStick, m_Buttons[0][BUTTON_TOOLTIP_LS]) + END_MAP_CHILD_CONTROLS() + MAP_CONTROL(IDC_TooltipsSmall, m_TooltipGroupSmall[0]) + BEGIN_MAP_CHILD_CONTROLS(m_TooltipGroupSmall[0]) + MAP_CONTROL(IDC_AButton, m_ButtonsSmall[0][BUTTON_TOOLTIP_A]) + MAP_CONTROL(IDC_BButton, m_ButtonsSmall[0][BUTTON_TOOLTIP_B]) + MAP_CONTROL(IDC_XButton, m_ButtonsSmall[0][BUTTON_TOOLTIP_X]) + MAP_CONTROL(IDC_YButton, m_ButtonsSmall[0][BUTTON_TOOLTIP_Y]) + MAP_CONTROL(IDC_LTrigger, m_ButtonsSmall[0][BUTTON_TOOLTIP_LT]) + MAP_CONTROL(IDC_RTrigger, m_ButtonsSmall[0][BUTTON_TOOLTIP_RT]) + MAP_CONTROL(IDC_RBButton, m_ButtonsSmall[0][BUTTON_TOOLTIP_RB]) + MAP_CONTROL(IDC_LBButton, m_ButtonsSmall[0][BUTTON_TOOLTIP_LB]) + MAP_CONTROL(IDC_LStick, m_ButtonsSmall[0][BUTTON_TOOLTIP_LS]) + END_MAP_CHILD_CONTROLS() + MAP_CONTROL(IDC_Background, m_Background[0]) + MAP_CONTROL(IDC_XuiDarkOverlay, m_DarkOverlay[0]) + MAP_CONTROL(IDC_Logo, m_Logo[0]) + MAP_CONTROL(IDC_SelectedItem, m_selectedItemA[0]) + MAP_CONTROL(IDC_SelectedItemSmall, m_selectedItemSmallA[0]) + MAP_CONTROL(IDC_BossHealth, m_BossHealthGroup[0]) + BEGIN_MAP_CHILD_CONTROLS(m_BossHealthGroup[0]) + MAP_CONTROL(IDC_TitleText, m_BossHealthText[0]) + MAP_CONTROL(IDC_ProgressBar1, m_BossHealthProgress1[0]) + MAP_CONTROL(IDC_ProgressBar2, m_BossHealthProgress2[0]) + MAP_CONTROL(IDC_ProgressBar3, m_BossHealthProgress3[0]) + MAP_CONTROL(IDC_ProgressBar1_small, m_BossHealthProgress1_small[0]) + MAP_CONTROL(IDC_ProgressBar2_small, m_BossHealthProgress2_small[0]) + MAP_CONTROL(IDC_ProgressBar3_small, m_BossHealthProgress3_small[0]) + END_MAP_CHILD_CONTROLS() + END_MAP_CHILD_CONTROLS() + + MAP_CONTROL(IDC_BasePlayer1, m_BasePlayerScene[1]) + BEGIN_MAP_CHILD_CONTROLS(m_BasePlayerScene[1]) + MAP_CONTROL(IDC_BottomLeftAnchorPoint, m_bottomLeftAnchorPoint[1]) + MAP_CONTROL(IDC_TopLeftAnchorPoint, m_topLeftAnchorPoint[1]) + MAP_CONTROL(IDC_Tooltips, m_TooltipGroup[1]) + BEGIN_MAP_CHILD_CONTROLS(m_TooltipGroup[1]) + MAP_CONTROL(IDC_AButton, m_Buttons[1][BUTTON_TOOLTIP_A]) + MAP_CONTROL(IDC_BButton, m_Buttons[1][BUTTON_TOOLTIP_B]) + MAP_CONTROL(IDC_XButton, m_Buttons[1][BUTTON_TOOLTIP_X]) + MAP_CONTROL(IDC_YButton, m_Buttons[1][BUTTON_TOOLTIP_Y]) + MAP_CONTROL(IDC_LTrigger, m_Buttons[1][BUTTON_TOOLTIP_LT]) + MAP_CONTROL(IDC_RTrigger, m_Buttons[1][BUTTON_TOOLTIP_RT]) + MAP_CONTROL(IDC_RBButton, m_Buttons[1][BUTTON_TOOLTIP_RB]) + MAP_CONTROL(IDC_LBButton, m_Buttons[1][BUTTON_TOOLTIP_LB]) + MAP_CONTROL(IDC_LStick, m_Buttons[1][BUTTON_TOOLTIP_LS]) + END_MAP_CHILD_CONTROLS() + MAP_CONTROL(IDC_TooltipsSmall, m_TooltipGroupSmall[1]) + BEGIN_MAP_CHILD_CONTROLS(m_TooltipGroupSmall[1]) + MAP_CONTROL(IDC_AButton, m_ButtonsSmall[1][BUTTON_TOOLTIP_A]) + MAP_CONTROL(IDC_BButton, m_ButtonsSmall[1][BUTTON_TOOLTIP_B]) + MAP_CONTROL(IDC_XButton, m_ButtonsSmall[1][BUTTON_TOOLTIP_X]) + MAP_CONTROL(IDC_YButton, m_ButtonsSmall[1][BUTTON_TOOLTIP_Y]) + MAP_CONTROL(IDC_LTrigger, m_ButtonsSmall[1][BUTTON_TOOLTIP_LT]) + MAP_CONTROL(IDC_RTrigger, m_ButtonsSmall[1][BUTTON_TOOLTIP_RT]) + MAP_CONTROL(IDC_RBButton, m_ButtonsSmall[1][BUTTON_TOOLTIP_RB]) + MAP_CONTROL(IDC_LBButton, m_ButtonsSmall[1][BUTTON_TOOLTIP_LB]) + MAP_CONTROL(IDC_LStick, m_ButtonsSmall[1][BUTTON_TOOLTIP_LS]) + END_MAP_CHILD_CONTROLS() + MAP_CONTROL(IDC_Background, m_Background[1]) + MAP_CONTROL(IDC_XuiDarkOverlay, m_DarkOverlay[1]) + MAP_CONTROL(IDC_Logo, m_Logo[1]) + MAP_CONTROL(IDC_SelectedItem, m_selectedItemA[1]) + MAP_CONTROL(IDC_SelectedItemSmall, m_selectedItemSmallA[1]) + MAP_CONTROL(IDC_BossHealth, m_BossHealthGroup[1]) + BEGIN_MAP_CHILD_CONTROLS(m_BossHealthGroup[1]) + MAP_CONTROL(IDC_TitleText, m_BossHealthText[1]) + MAP_CONTROL(IDC_ProgressBar1, m_BossHealthProgress1[1]) + MAP_CONTROL(IDC_ProgressBar2, m_BossHealthProgress2[1]) + MAP_CONTROL(IDC_ProgressBar3, m_BossHealthProgress3[1]) + MAP_CONTROL(IDC_ProgressBar1_small, m_BossHealthProgress1_small[1]) + MAP_CONTROL(IDC_ProgressBar2_small, m_BossHealthProgress2_small[1]) + MAP_CONTROL(IDC_ProgressBar3_small, m_BossHealthProgress3_small[1]) + END_MAP_CHILD_CONTROLS() + END_MAP_CHILD_CONTROLS() + + MAP_CONTROL(IDC_BasePlayer2, m_BasePlayerScene[2]) + BEGIN_MAP_CHILD_CONTROLS(m_BasePlayerScene[2]) + MAP_CONTROL(IDC_BottomLeftAnchorPoint, m_bottomLeftAnchorPoint[2]) + MAP_CONTROL(IDC_TopLeftAnchorPoint, m_topLeftAnchorPoint[2]) + MAP_CONTROL(IDC_Tooltips, m_TooltipGroup[2]) + BEGIN_MAP_CHILD_CONTROLS(m_TooltipGroup[2]) + MAP_CONTROL(IDC_AButton, m_Buttons[2][BUTTON_TOOLTIP_A]) + MAP_CONTROL(IDC_BButton, m_Buttons[2][BUTTON_TOOLTIP_B]) + MAP_CONTROL(IDC_XButton, m_Buttons[2][BUTTON_TOOLTIP_X]) + MAP_CONTROL(IDC_YButton, m_Buttons[2][BUTTON_TOOLTIP_Y]) + MAP_CONTROL(IDC_LTrigger, m_Buttons[2][BUTTON_TOOLTIP_LT]) + MAP_CONTROL(IDC_RTrigger, m_Buttons[2][BUTTON_TOOLTIP_RT]) + MAP_CONTROL(IDC_RBButton, m_Buttons[2][BUTTON_TOOLTIP_RB]) + MAP_CONTROL(IDC_LBButton, m_Buttons[2][BUTTON_TOOLTIP_LB]) + MAP_CONTROL(IDC_LStick, m_Buttons[2][BUTTON_TOOLTIP_LS]) + END_MAP_CHILD_CONTROLS() + MAP_CONTROL(IDC_TooltipsSmall, m_TooltipGroupSmall[2]) + BEGIN_MAP_CHILD_CONTROLS(m_TooltipGroupSmall[2]) + MAP_CONTROL(IDC_AButton, m_ButtonsSmall[2][BUTTON_TOOLTIP_A]) + MAP_CONTROL(IDC_BButton, m_ButtonsSmall[2][BUTTON_TOOLTIP_B]) + MAP_CONTROL(IDC_XButton, m_ButtonsSmall[2][BUTTON_TOOLTIP_X]) + MAP_CONTROL(IDC_YButton, m_ButtonsSmall[2][BUTTON_TOOLTIP_Y]) + MAP_CONTROL(IDC_LTrigger, m_ButtonsSmall[2][BUTTON_TOOLTIP_LT]) + MAP_CONTROL(IDC_RTrigger, m_ButtonsSmall[2][BUTTON_TOOLTIP_RT]) + MAP_CONTROL(IDC_RBButton, m_ButtonsSmall[2][BUTTON_TOOLTIP_RB]) + MAP_CONTROL(IDC_LBButton, m_ButtonsSmall[2][BUTTON_TOOLTIP_LB]) + MAP_CONTROL(IDC_LStick, m_ButtonsSmall[2][BUTTON_TOOLTIP_LS]) + END_MAP_CHILD_CONTROLS() + MAP_CONTROL(IDC_Background, m_Background[2]) + MAP_CONTROL(IDC_XuiDarkOverlay, m_DarkOverlay[2]) + MAP_CONTROL(IDC_Logo, m_Logo[2]) + MAP_CONTROL(IDC_SelectedItem, m_selectedItemA[2]) + MAP_CONTROL(IDC_SelectedItemSmall, m_selectedItemSmallA[2]) + MAP_CONTROL(IDC_BossHealth, m_BossHealthGroup[2]) + BEGIN_MAP_CHILD_CONTROLS(m_BossHealthGroup[2]) + MAP_CONTROL(IDC_TitleText, m_BossHealthText[2]) + MAP_CONTROL(IDC_ProgressBar1, m_BossHealthProgress1[2]) + MAP_CONTROL(IDC_ProgressBar2, m_BossHealthProgress2[2]) + MAP_CONTROL(IDC_ProgressBar3, m_BossHealthProgress3[2]) + MAP_CONTROL(IDC_ProgressBar1_small, m_BossHealthProgress1_small[2]) + MAP_CONTROL(IDC_ProgressBar2_small, m_BossHealthProgress2_small[2]) + MAP_CONTROL(IDC_ProgressBar3_small, m_BossHealthProgress3_small[2]) + END_MAP_CHILD_CONTROLS() + END_MAP_CHILD_CONTROLS() + + MAP_CONTROL(IDC_BasePlayer3, m_BasePlayerScene[3]) + BEGIN_MAP_CHILD_CONTROLS(m_BasePlayerScene[3]) + MAP_CONTROL(IDC_BottomLeftAnchorPoint, m_bottomLeftAnchorPoint[3]) + MAP_CONTROL(IDC_TopLeftAnchorPoint, m_topLeftAnchorPoint[3]) + MAP_CONTROL(IDC_Tooltips, m_TooltipGroup[3]) + BEGIN_MAP_CHILD_CONTROLS(m_TooltipGroup[3]) + MAP_CONTROL(IDC_AButton, m_Buttons[3][BUTTON_TOOLTIP_A]) + MAP_CONTROL(IDC_BButton, m_Buttons[3][BUTTON_TOOLTIP_B]) + MAP_CONTROL(IDC_XButton, m_Buttons[3][BUTTON_TOOLTIP_X]) + MAP_CONTROL(IDC_YButton, m_Buttons[3][BUTTON_TOOLTIP_Y]) + MAP_CONTROL(IDC_LTrigger, m_Buttons[3][BUTTON_TOOLTIP_LT]) + MAP_CONTROL(IDC_RTrigger, m_Buttons[3][BUTTON_TOOLTIP_RT]) + MAP_CONTROL(IDC_RBButton, m_Buttons[3][BUTTON_TOOLTIP_RB]) + MAP_CONTROL(IDC_LBButton, m_Buttons[3][BUTTON_TOOLTIP_LB]) + MAP_CONTROL(IDC_LStick, m_Buttons[3][BUTTON_TOOLTIP_LS]) + END_MAP_CHILD_CONTROLS() + MAP_CONTROL(IDC_TooltipsSmall, m_TooltipGroupSmall[3]) + BEGIN_MAP_CHILD_CONTROLS(m_TooltipGroupSmall[3]) + MAP_CONTROL(IDC_AButton, m_ButtonsSmall[3][BUTTON_TOOLTIP_A]) + MAP_CONTROL(IDC_BButton, m_ButtonsSmall[3][BUTTON_TOOLTIP_B]) + MAP_CONTROL(IDC_XButton, m_ButtonsSmall[3][BUTTON_TOOLTIP_X]) + MAP_CONTROL(IDC_YButton, m_ButtonsSmall[3][BUTTON_TOOLTIP_Y]) + MAP_CONTROL(IDC_LTrigger, m_ButtonsSmall[3][BUTTON_TOOLTIP_LT]) + MAP_CONTROL(IDC_RTrigger, m_ButtonsSmall[3][BUTTON_TOOLTIP_RT]) + MAP_CONTROL(IDC_RBButton, m_ButtonsSmall[3][BUTTON_TOOLTIP_RB]) + MAP_CONTROL(IDC_LBButton, m_ButtonsSmall[3][BUTTON_TOOLTIP_LB]) + MAP_CONTROL(IDC_LStick, m_Buttons[3][BUTTON_TOOLTIP_LS]) + END_MAP_CHILD_CONTROLS() + MAP_CONTROL(IDC_Background, m_Background[3]) + MAP_CONTROL(IDC_XuiDarkOverlay, m_DarkOverlay[3]) + MAP_CONTROL(IDC_Logo, m_Logo[3]) + MAP_CONTROL(IDC_SelectedItem, m_selectedItemA[3]) + MAP_CONTROL(IDC_SelectedItemSmall, m_selectedItemSmallA[3]) + MAP_CONTROL(IDC_BossHealth, m_BossHealthGroup[3]) + BEGIN_MAP_CHILD_CONTROLS(m_BossHealthGroup[3]) + MAP_CONTROL(IDC_TitleText, m_BossHealthText[3]) + MAP_CONTROL(IDC_ProgressBar1, m_BossHealthProgress1[3]) + MAP_CONTROL(IDC_ProgressBar2, m_BossHealthProgress2[3]) + MAP_CONTROL(IDC_ProgressBar3, m_BossHealthProgress3[3]) + MAP_CONTROL(IDC_ProgressBar1_small, m_BossHealthProgress1_small[3]) + MAP_CONTROL(IDC_ProgressBar2_small, m_BossHealthProgress2_small[3]) + MAP_CONTROL(IDC_ProgressBar3_small, m_BossHealthProgress3_small[3]) + END_MAP_CHILD_CONTROLS() + END_MAP_CHILD_CONTROLS() + + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnTimer(XUIMessageTimer *pData,BOOL& rfHandled); + HRESULT OnSkinChanged(BOOL& bHandled); +// HRESULT OnCustomMessage_DLCInstalled(); +// HRESULT OnCustomMessage_DLCMountingComplete(); + +public: + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CXuiSceneBase, L"CXuiSceneBase", XUI_CLASS_SCENE ) + +private: + void _TickAllBaseScenes(); + HRESULT _SetTooltipText( unsigned int iPad, unsigned int tooltip, int iTextID ); + HRESULT _SetEnableTooltips( unsigned int iPad, BOOL bVal ); + HRESULT _ShowTooltip( unsigned int iPad, unsigned int tooltip, bool show ); + HRESULT _SetTooltipsEnabled( unsigned int iPad, bool bA = true, bool bB = true, bool bX = true, bool bY = true, bool bLT = true, bool bRT = true, bool bLB=true, bool bRB = true, bool bLS = true); + HRESULT _RefreshTooltips( unsigned int iPad); + HRESULT _EnableTooltip( unsigned int iPad, unsigned int tooltip, bool enable ); + HRESULT _ShowSavingMessage( unsigned int iPad, C4JStorage::ESavingMessage eVal ); + HRESULT _ShowBackground( unsigned int iPad, BOOL bShow ); + HRESULT _ShowDarkOverlay( unsigned int iPad, BOOL bShow ); + HRESULT _ShowLogo( unsigned int iPad, BOOL bShow ); + HRESULT _ShowPressStart(unsigned int iPad); + HRESULT _UpdateAutosaveCountdownTimer(unsigned int uiSeconds); + HRESULT _ShowAutosaveCountdownTimer(BOOL bVal); + HRESULT _UpdateTrialTimer(unsigned int iPad); + HRESULT _ShowTrialTimer(BOOL bVal); + void _ReduceTrialTimerValue(); + HRESULT _HidePressStart(); + HRESULT _ShowSafeArea( BOOL bShow ); + HRESULT _ShowOtherPlayersBaseScene(int iPad, bool show); + bool _PressStartPlaying(unsigned int iPad); + HRESULT _SetPlayerBaseScenePosition( unsigned int iPad, EBaseScenePosition position ); + void _UpdateSelectedItemPos( unsigned int iPad); + EBaseScenePosition _GetPlayerBasePosition(int iPad); + HRESULT _AnimateKeyPress(DWORD userIndex, DWORD dwKeyCode); + HXUIOBJ _GetPlayerBaseScene(int iPad) {return m_BasePlayerScene[iPad].m_hObj;} + HRESULT _PlayUISFX(ESoundEffect eSound); + void _SetEmptyQuadrantLogo(int iPad,EBaseScenePosition ePos); + HRESULT _DisplayGamertag( unsigned int iPad, BOOL bDisplay ); + void _SetSelectedItem( unsigned int iPad, const wstring& name); + void _HideAllGameUIElements(); + bool _GetBaseSceneSafeZone( unsigned int iPad, D3DXVECTOR2 &origin, float &width, float &height); + + void ReLayout( unsigned int iPad ); + +private: + static CXuiSceneBase *Instance; + int m_iCurrentTooltipTextID[XUSER_MAX_COUNT][BUTTONS_TOOLTIP_MAX]; + HXUIOBJ hTooltipText[XUSER_MAX_COUNT][BUTTONS_TOOLTIP_MAX]; + HXUIOBJ hTooltipTextSmall[XUSER_MAX_COUNT][BUTTONS_TOOLTIP_MAX]; + EBaseScenePosition m_playerBaseScenePosition[XUSER_MAX_COUNT]; + bool m_bCrouching[XUSER_MAX_COUNT]; + int m_iQuadrantsMask; + unsigned int m_uiSelectedItemOpacityCountDown[XUSER_MAX_COUNT]; + +public: + static DWORD m_dwTrialTimerLimitSecs; + +public: + static CXuiSceneBase *GetInstance() { return Instance; } + static void TickAllBaseScenes(); + static HRESULT SetTooltipText( unsigned int iPad, unsigned int tooltip, int iTextID ); + static HRESULT SetEnableTooltips( unsigned int iPad, BOOL bVal ); + static HRESULT ShowTooltip( unsigned int iPad, unsigned int tooltip, bool show ); + static HRESULT SetTooltips( unsigned int iPad, int iA, int iB=-1, int iX=-1, int iY=-1 , int iLT=-1, int iRT=-1, int iLB=-1, int iRB=-1, int iLS=-1, bool forceUpdate = false); + static HRESULT RefreshTooltips( unsigned int iPad); + static HRESULT EnableTooltip( unsigned int iPad, unsigned int tooltip, bool enable ); + static HRESULT SetTooltipsEnabled( unsigned int iPad, bool bA = true, bool bB = true, bool bX = true, bool bY = true, bool bLT = true, bool bRT = true, bool bLB = true, bool bRB=true, bool bLS=true); + static HRESULT AnimateKeyPress(DWORD userIndex, DWORD dwKeyCode); + static HRESULT ShowSavingMessage( unsigned int iPad, C4JStorage::ESavingMessage eVal); + static HRESULT ShowBackground( unsigned int iPad, BOOL bShow ); + static HRESULT ShowDarkOverlay( unsigned int iPad, BOOL bShow ); + static HRESULT ShowLogo( unsigned int iPad, BOOL bShow ); + static HRESULT UpdateAutosaveCountdownTimer(unsigned int uiSeconds); + static HRESULT ShowAutosaveCountdownTimer(BOOL bVal); + static HRESULT UpdateTrialTimer(unsigned int iPad); + static HRESULT ShowTrialTimer(BOOL bVal); + static void ReduceTrialTimerValue(); + static HRESULT HidePressStart(); + static HRESULT ShowSafeArea( BOOL bShow ); + static HRESULT ShowOtherPlayersBaseScene(int iPad, bool show); + + static HRESULT ShowPressStart(unsigned int iPad); + static bool PressStartPlaying(unsigned int iPad); + static HRESULT SetPlayerBaseScenePosition( unsigned int iPad, EBaseScenePosition position ); + static HRESULT SetPlayerBasePositions(EBaseScenePosition pad0, EBaseScenePosition pad1, EBaseScenePosition pad2, EBaseScenePosition pad3); + static HRESULT UpdatePlayerBasePositions(); + static EBaseScenePosition GetPlayerBasePosition(int iPad); + static void UpdateSelectedItemPos(int iPad); + + + static HXUIOBJ GetPlayerBaseScene(int iPad); + static HRESULT PlayUISFX(ESoundEffect eSound); + static void SetEmptyQuadrantLogo(int iSection); + static HRESULT DisplayGamertag( unsigned int iPad, BOOL bDisplay ); + static void SetSelectedItem( unsigned int iPad, const wstring &name); + static void HideAllGameUIElements(); + + // Returns details on the fully transformed (ie screen space) base scene position, adjusted for safe zones + static bool GetBaseSceneSafeZone( unsigned int iPad, D3DXVECTOR2 &origin, float &width, float &height); + +#ifndef _XBOX + static void CreateBaseSceneInstance(); +#endif +}; diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_BrewingStand.cpp b/Minecraft.Client/Common/XUI/XUI_Scene_BrewingStand.cpp new file mode 100644 index 00000000..cf600966 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_BrewingStand.cpp @@ -0,0 +1,156 @@ +#include "stdafx.h" + +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\Common\Tutorial\Tutorial.h" +#include "..\..\Common\Tutorial\TutorialMode.h" +#include "..\..\Common\Tutorial\TutorialEnum.h" +#include "..\..\Minecraft.h" +#include "XUI_Ctrl_SlotList.h" +#include "XUI_Scene_BrewingStand.h" +#include "XUI_Ctrl_BrewProgress.h" +#include "XUI_Ctrl_BubblesProgress.h" + + +//-------------------------------------------------------------------------------------- +// Name: CXuiSceneBrewingStand::OnInit +// Desc: Message handler for XM_INIT +//-------------------------------------------------------------------------------------- +HRESULT CXuiSceneBrewingStand::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + MapChildControls(); + + XuiControlSetText(m_BrewingStandText,app.GetString(IDS_BREWING_STAND)); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + BrewingScreenInput* initData = (BrewingScreenInput*)pInitData->pvInitData; + m_iPad=initData->iPad; + m_bSplitscreen=initData->bSplitscreen; + + // if we are in splitscreen, then we need to figure out if we want to move this scene + + if(m_bSplitscreen) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + } + +#ifdef _XBOX + if( pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Brewing_Menu, this); + } +#endif + + BrewingStandMenu* menu = new BrewingStandMenu( initData->inventory, initData->brewingStand ); + + + InitDataAssociations(m_iPad, menu); + + m_progressControl->SetUserData( initData->brewingStand.get() ); + + m_bubbleProgress->SetUserData( initData->brewingStand.get() ); + + delete initData; + + CXuiSceneAbstractContainer::Initialize( m_iPad, menu, true, BrewingStandMenu::INV_SLOT_START, eSectionBrewingUsing, eSectionBrewingMax ); + + //app.SetRichPresenceContextValue(m_iPad,CONTEXT_GAME_STATE_FORGING); + + return S_OK; +} + +HRESULT CXuiSceneBrewingStand::OnDestroy() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + +#ifdef _XBOX + if( pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + if(gameMode != NULL) gameMode->getTutorial()->changeTutorialState(m_previousTutorialState); + } +#endif + + // 4J Stu - Fix for #11302 - TCR 001: Network Connectivity: Host crashed after being killed by the client while accessing a chest during burst packet loss. + // We need to make sure that we call closeContainer() anytime this menu is closed, even if it is forced to close by some other reason (like the player dying) + if(Minecraft::GetInstance()->localplayers[m_iPad] != NULL) Minecraft::GetInstance()->localplayers[m_iPad]->closeContainer(); + return S_OK; +} + +CXuiControl* CXuiSceneBrewingStand::GetSectionControl( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionBrewingBottle1: + return (CXuiControl *)m_bottle1Control; + break; + case eSectionBrewingBottle2: + return (CXuiControl *)m_bottle2Control; + break; + case eSectionBrewingBottle3: + return (CXuiControl *)m_bottle3Control; + break; + case eSectionBrewingIngredient: + return (CXuiControl *)m_ingredientControl; + break; + case eSectionBrewingInventory: + return (CXuiControl *)m_inventoryControl; + break; + case eSectionBrewingUsing: + return (CXuiControl *)m_useRowControl; + break; + default: + assert( false ); + break; + } + return NULL; +} + +CXuiCtrlSlotList* CXuiSceneBrewingStand::GetSectionSlotList( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionBrewingBottle1: + return m_bottle1Control; + break; + case eSectionBrewingBottle2: + return m_bottle2Control; + break; + case eSectionBrewingBottle3: + return m_bottle3Control; + break; + case eSectionBrewingIngredient: + return m_ingredientControl; + break; + case eSectionBrewingInventory: + return m_inventoryControl; + break; + case eSectionBrewingUsing: + return m_useRowControl; + break; + default: + assert( false ); + break; + } + return NULL; +} + +// 4J Stu - Added to support auto-save. Need to re-associate on a navigate back +void CXuiSceneBrewingStand::InitDataAssociations(int iPad, AbstractContainerMenu *menu, int startIndex /*= 0*/) +{ + // TODO Inventory dimensions need defined as constants + m_ingredientControl->SetData( iPad, menu, 1, 1, BrewingStandMenu::INGREDIENT_SLOT ); + + m_bottle1Control->SetData( iPad, menu, 1, 1, BrewingStandMenu::BOTTLE_SLOT_START ); + m_bottle2Control->SetData( iPad, menu, 1, 1, BrewingStandMenu::BOTTLE_SLOT_START + 1); + m_bottle3Control->SetData( iPad, menu, 1, 1, BrewingStandMenu::BOTTLE_SLOT_START + 2); + + //m_litProgressControl->SetUserData( initData->furnace.get() ); + + //m_burnProgress->SetUserData( initData->furnace.get() ); + + CXuiSceneAbstractContainer::InitDataAssociations(iPad, menu, BrewingStandMenu::INV_SLOT_START); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_BrewingStand.h b/Minecraft.Client/Common/XUI/XUI_Scene_BrewingStand.h new file mode 100644 index 00000000..370b6b18 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_BrewingStand.h @@ -0,0 +1,75 @@ +#pragma once +using namespace std; +#include "..\Media\xuiscene_brewingstand.h" +#include "XUI_Scene_AbstractContainer.h" +#include "..\UI\IUIScene_BrewingMenu.h" + +class CXuiCtrlSlotList; +class CXuiCtrlBrewProgress; +class CXuiCtrlBubblesProgress; + +//-------------------------------------------------------------------------------------- +// Scene implementation class. +//-------------------------------------------------------------------------------------- +class CXuiSceneBrewingStand : public CXuiSceneAbstractContainer, public IUIScene_BrewingMenu +{ +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CXuiSceneBrewingStand, L"CXuiSceneBrewingStand", XUI_CLASS_SCENE ) + +protected: + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN( OnKeyDown ) + XUI_ON_XM_DESTROY( OnDestroy ) + XUI_ON_XM_TIMER( OnTimer ) // Poll stick input on a timer. + XUI_ON_XM_TRANSITION_START(OnTransitionStart) + + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_Group, m_sceneGroup) + BEGIN_MAP_CHILD_CONTROLS( m_sceneGroup ) + // Common to all abstract container scenes + MAP_OVERRIDE(IDC_Inventory, m_inventoryControl) + MAP_OVERRIDE(IDC_UseRow, m_useRowControl) + MAP_OVERRIDE(IDC_Pointer, m_pointerControl) + MAP_CONTROL(IDC_InventoryText,m_InventoryText) + + MAP_OVERRIDE(IDC_Ingredient, m_ingredientControl) + MAP_OVERRIDE(IDC_Bottle1, m_bottle1Control) + MAP_OVERRIDE(IDC_Bottle2, m_bottle2Control) + MAP_OVERRIDE(IDC_Bottle3, m_bottle3Control) + + MAP_OVERRIDE(IDC_Progress, m_progressControl) + MAP_OVERRIDE(IDC_Bubbles, m_bubbleProgress) + MAP_CONTROL(IDC_BrewingStandText,m_BrewingStandText) + END_MAP_CHILD_CONTROLS() + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnDestroy(); +// HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled); + + virtual void InitDataAssociations(int iPad, AbstractContainerMenu *menu, int startIndex = 0); + +private: + CXuiCtrlSlotList *m_ingredientControl; + CXuiCtrlSlotList *m_bottle1Control; + CXuiCtrlSlotList *m_bottle2Control; + CXuiCtrlSlotList *m_bottle3Control; + + CXuiCtrlBrewProgress *m_progressControl; + CXuiCtrlBubblesProgress *m_bubbleProgress; + CXuiControl m_BrewingStandText; + + CXuiControl m_sceneGroup; + + virtual CXuiControl* GetSectionControl( ESceneSection eSection ); + virtual CXuiCtrlSlotList* GetSectionSlotList( ESceneSection eSection ); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_Container.cpp b/Minecraft.Client/Common/XUI/XUI_Scene_Container.cpp new file mode 100644 index 00000000..39b836d2 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Container.cpp @@ -0,0 +1,162 @@ +#include "stdafx.h" + +#include "..\..\..\Minecraft.World\Container.h" +#include "..\..\..\Minecraft.World\ContainerMenu.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "XUI_Ctrl_SlotList.h" +#include "XUI_Scene_Container.h" +#include "XUI_Ctrl_SlotItemListItem.h" +#include "XUI_Ctrl_SlotItem.h" +#include "..\..\Common\Tutorial\Tutorial.h" +#include "..\..\Common\Tutorial\TutorialMode.h" +#include "..\..\Common\Tutorial\TutorialEnum.h" + +// The height of one row of slots +//#define ROW_HEIGHT 42.0f - comes from the pointer height in the xui + +// The number of container rows that are visible in the Xui file at it's default size +#define CONTAINER_DEFAULT_ROWS 3 + + +//-------------------------------------------------------------------------------------- +// Name: CXuiSceneContainer::OnInit +// Desc: Message handler for XM_INIT +//-------------------------------------------------------------------------------------- +HRESULT CXuiSceneContainer::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + D3DXVECTOR3 vec; + MapChildControls(); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + ContainerScreenInput* initData = (ContainerScreenInput*)pInitData->pvInitData; + + XuiControlSetText(m_ChestText,app.GetString(initData->container->getName())); + + ContainerMenu* menu = new ContainerMenu( initData->inventory, initData->container ); + + shared_ptr container = initData->container; + m_iPad=initData->iPad; + m_bSplitscreen=initData->bSplitscreen; + +#ifdef _XBOX + if( pMinecraft->localgameModes[initData->iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[initData->iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Container_Menu, this); + } +#endif + + // if we are in splitscreen, then we need to figure out if we want to move this scene + int rows = container->getContainerSize() / 9; + // use the pointer size in the xui to set the row height + float fPointerWidth,fPointerHeight; + + if(m_bSplitscreen) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + } + m_pointerControl->GetBounds(&fPointerWidth, &fPointerHeight); + + // Adjust the height to show the correct number of container rows + float height, width; + this->GetBounds( &width, &height ); + int rowDiff = CONTAINER_DEFAULT_ROWS - rows; + //height = height - (rowDiff * ROW_HEIGHT); + height = height - (rowDiff * fPointerHeight); + this->SetBounds( width, height ); + + // Update the position after the height change so that we are still centred + D3DXVECTOR3 vPos; + this->GetPosition( &vPos ); + vPos.y = vPos.y + ( (rowDiff * fPointerHeight) / 2 ); + // Make sure that the y offset is even for SD modes, as the y in xui coordinates will end up being scaled by a factor of 1.5 + // to get it into actual back buffer coordinates, and we need those to remain whole numbers to avoid issues with point sampling + if(!RenderManager.IsHiDef()) + { + int iY = (int)(vPos.y); + iY &= 0xfffffffe; + vPos.y = (float)iY; + } + this->SetPosition( &vPos ); + + InitDataAssociations(initData->iPad, menu); + + CXuiSceneAbstractContainer::Initialize( initData->iPad, menu, true, container->getContainerSize(), eSectionContainerUsing, eSectionContainerMax ); + + delete initData; + + return S_OK; +} + +HRESULT CXuiSceneContainer::OnDestroy() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + +#ifdef _XBOX + if( pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + if(gameMode != NULL) gameMode->getTutorial()->changeTutorialState(m_previousTutorialState); + } +#endif + + // 4J Stu - Fix for #11302 - TCR 001: Network Connectivity: Host crashed after being killed by the client while accessing a chest during burst packet loss. + // We need to make sure that we call closeContainer() anytime this menu is closed, even if it is forced to close by some other reason (like the player dying) + if(Minecraft::GetInstance()->localplayers[m_iPad] != NULL) Minecraft::GetInstance()->localplayers[m_iPad]->closeContainer(); + return S_OK; +} + +CXuiControl* CXuiSceneContainer::GetSectionControl( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionContainerChest: + return (CXuiControl *)m_containerControl; + break; + case eSectionContainerInventory: + return (CXuiControl *)m_inventoryControl; + break; + case eSectionContainerUsing: + return (CXuiControl *)m_useRowControl; + break; + default: + assert( false ); + break; + } + return NULL; +} + +CXuiCtrlSlotList* CXuiSceneContainer::GetSectionSlotList( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionContainerChest: + return m_containerControl; + break; + case eSectionContainerInventory: + return m_inventoryControl; + break; + case eSectionContainerUsing: + return m_useRowControl; + break; + default: + assert( false ); + break; + } + return NULL; +} + +// 4J Stu - Added to support auto-save. Need to re-associate on a navigate back +void CXuiSceneContainer::InitDataAssociations(int iPad, AbstractContainerMenu *menu, int startIndex /*= 0*/) +{ + int containerSize = menu->getSize() - (27 + 9); + int rows = containerSize / 9; + + // TODO Inventory dimensions need defined as constants + m_containerControl->SetData( iPad, menu, rows, 9, 0 ); + + CXuiSceneAbstractContainer::InitDataAssociations(iPad, menu, containerSize); +} + diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_Container.h b/Minecraft.Client/Common/XUI/XUI_Scene_Container.h new file mode 100644 index 00000000..475a6974 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Container.h @@ -0,0 +1,57 @@ +#pragma once +#include "..\Media\xuiscene_container.h" +#include "XUI_Scene_AbstractContainer.h" +#include "XUI_CustomMessages.h" +#include "..\UI\IUIScene_ContainerMenu.h" + +//-------------------------------------------------------------------------------------- +// Scene implementation class. +//-------------------------------------------------------------------------------------- +class CXuiSceneContainer : public CXuiSceneAbstractContainer, public IUIScene_ContainerMenu +{ +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CXuiSceneContainer, L"CXuiSceneContainer", XUI_CLASS_SCENE ) + +protected: + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN( OnKeyDown ) + XUI_ON_XM_DESTROY( OnDestroy ) + XUI_ON_XM_TIMER( OnTimer ) // Poll stick input on a timer. + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + XUI_ON_XM_TRANSITION_START(OnTransitionStart) + + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + // Common to all abstract container scenes + MAP_CONTROL(IDC_Group, m_sceneGroup) + BEGIN_MAP_CHILD_CONTROLS( m_sceneGroup ) + MAP_OVERRIDE(IDC_Inventory, m_inventoryControl) + MAP_OVERRIDE(IDC_UseRow, m_useRowControl) + MAP_OVERRIDE(IDC_Pointer, m_pointerControl) + MAP_CONTROL(IDC_InventoryText,m_InventoryText) + + MAP_OVERRIDE(IDC_Container, m_containerControl) + MAP_CONTROL(IDC_ChestText,m_ChestText) + END_MAP_CHILD_CONTROLS() + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnDestroy(); + //HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) { return S_OK;} + + virtual void InitDataAssociations(int iPad, AbstractContainerMenu *menu, int startIndex = 0); + +private: + CXuiCtrlSlotList* m_containerControl; + CXuiControl m_sceneGroup; + CXuiControl m_ChestText; + + virtual CXuiControl* GetSectionControl( ESceneSection eSection ); + virtual CXuiCtrlSlotList* GetSectionSlotList( ESceneSection eSection ); +}; diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_CraftingPanel.cpp b/Minecraft.Client/Common/XUI/XUI_Scene_CraftingPanel.cpp new file mode 100644 index 00000000..a5dc6584 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_CraftingPanel.cpp @@ -0,0 +1,636 @@ +// Minecraft.cpp : Defines the entry point for the application. +// + +#include "stdafx.h" + +#include +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.crafting.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\Tile.h" +#include "..\..\..\Minecraft.World\net.minecraft.stats.h" +#include "..\..\Common\Tutorial\Tutorial.h" +#include "..\..\Common\Tutorial\TutorialMode.h" +#include "..\..\Common\Tutorial\TutorialEnum.h" +#include "..\..\Minecraft.h" +#include "XUI_Ctrl_CraftIngredientSlot.h" +#include "XUI_Ctrl_SlotList.h" + +#define IGNORE_KEYPRESS_TIMERID 0 +#define IGNORE_KEYPRESS_TIME 100 + +////////////////////////////////////////////////////////////////////////// +// +// +// +////////////////////////////////////////////////////////////////////////// +CXuiSceneCraftingPanel::CXuiSceneCraftingPanel() +{ +} + +////////////////////////////////////////////////////////////////////////// +// +// OnInit +// +////////////////////////////////////////////////////////////////////////// +HRESULT CXuiSceneCraftingPanel::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + m_bIgnoreKeyPresses=true; + + D3DXVECTOR3 vec; + VOID *pObj; + CraftingPanelScreenInput* pCraftingPanelData = (CraftingPanelScreenInput*)pInitData->pvInitData; + m_iContainerType=pCraftingPanelData->iContainerType; + m_pPlayer=pCraftingPanelData->player; + m_iPad=pCraftingPanelData->iPad; + m_bSplitscreen=pCraftingPanelData->bSplitscreen; + + HRESULT hr = S_OK; + + MapChildControls(); + + if(m_iContainerType==RECIPE_TYPE_2x2) + { + // TODO Inventory dimensions need defined as constants + m_inventoryControl->SetData( m_iPad, m_pPlayer->inventoryMenu, 3, 9, InventoryMenu::INV_SLOT_START, InventoryMenu::INV_SLOT_END ); + + // TODO Inventory dimensions need defined as constants + m_useRowControl->SetData( m_iPad, m_pPlayer->inventoryMenu, 1, 9, InventoryMenu::USE_ROW_SLOT_START, InventoryMenu::USE_ROW_SLOT_END ); + } + else + { + CraftingMenu *menu = new CraftingMenu(m_pPlayer->inventory, m_pPlayer->level, pCraftingPanelData->x, pCraftingPanelData->y, pCraftingPanelData->z); + Minecraft::GetInstance()->localplayers[m_iPad]->containerMenu = menu; + // TODO Inventory dimensions need defined as constants + m_inventoryControl->SetData( m_iPad, menu, 3, 9, CraftingMenu::INV_SLOT_START, CraftingMenu::INV_SLOT_END ); + + // TODO Inventory dimensions need defined as constants + m_useRowControl->SetData( m_iPad, menu, 1, 9, CraftingMenu::USE_ROW_SLOT_START, CraftingMenu::USE_ROW_SLOT_END ); + } + + delete pCraftingPanelData; + + // if we are in splitscreen, then we need to figure out if we want to move this scene + if(m_bSplitscreen) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + } + + XuiElementSetShow(m_hGrid,TRUE); + XuiElementSetShow(m_hPanel,TRUE); + + // Set up the CXuiCtrlCraftIngredientSlots + if(m_iContainerType==RECIPE_TYPE_3x3) + { + m_pCursors=m_pHSlotsCraftingTableCursors; + + m_iIngredientsMaxSlotC = m_iIngredients3x3SlotC; + for(int i=0;iGetPosition(&m_vSlot0Pos); + m_pHSlotsBrushImageControl[1]->GetPosition(&vec); + m_fSlotSize=vec.x-m_vSlot0Pos.x; + + // store the slot 0 highlight position + m_hHighlight.GetPosition(&m_vSlot0HighlightPos); + // Store the V slot position + m_hScrollBar2.GetPosition(&m_vSlot0V2ScrollPos); + m_hScrollBar3.GetPosition(&m_vSlot0V3ScrollPos); + + // get the position of the slot from the xui, and apply any offset needed + for(int i=0;iSetShow(FALSE); + } + + XuiElementSetShow(m_hGridInventory,FALSE); + + m_hScrollBar2.SetShow(FALSE); + m_hScrollBar3.SetShow(FALSE); + + app.SetRichPresenceContext(m_iPad,CONTEXT_GAME_STATE_CRAFTING); + m_GroupName.SetText(GetGroupNameText(m_pGroupA[m_iGroupIndex])); + + UpdateTooltips(); + + // Update the tutorial state + Minecraft *pMinecraft = Minecraft::GetInstance(); + +#ifdef _XBOX + if( pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + if(m_iContainerType==RECIPE_TYPE_2x2) + { + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_2x2Crafting_Menu, this); + } + else + { + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_3x3Crafting_Menu, this); + } + } +#endif + + XuiSetTimer(m_hObj,IGNORE_KEYPRESS_TIMERID,IGNORE_KEYPRESS_TIME); + + return S_OK; +} + +////////////////////////////////////////////////////////////////////////// +// +// OnTransitionEnd +// +////////////////////////////////////////////////////////////////////////// +HRESULT CXuiSceneCraftingPanel::OnTransitionEnd( XUIMessageTransition *pTransData, BOOL& bHandled ) +{ + // are we being destroyed? If so, don't do anything + if(pTransData->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) + { + return S_OK; + } + + // Fix for issue caused by autosave while crafting is up + if(pTransData->dwTransType == XUI_TRANSITION_TO || pTransData->dwTransType == XUI_TRANSITION_BACKTO) + { + // Update the tab icons + if(m_iContainerType==RECIPE_TYPE_3x3) + { + for(int i=0;iUserIndex, mapVKToAction(pInputData->dwKeyCode), (pInputData->dwFlags & XUI_INPUT_FLAG_REPEAT) != 0); + + return S_OK; +} + +int CXuiSceneCraftingPanel::mapVKToAction(int vk) +{ + int action = MINECRAFT_ACTION_MAX; + switch(vk) + { + case VK_PAD_A: + action = ACTION_MENU_A; + break; + case VK_PAD_B: + case VK_PAD_START: + action = ACTION_MENU_B; + break; + case VK_PAD_X: + action = ACTION_MENU_X; + break; + case VK_PAD_Y: + action = ACTION_MENU_Y; + break; + case VK_PAD_DPAD_LEFT: + case VK_PAD_LTHUMB_LEFT: + action = ACTION_MENU_LEFT; + break; + case VK_PAD_DPAD_RIGHT: + case VK_PAD_LTHUMB_RIGHT: + action = ACTION_MENU_RIGHT; + break; + case VK_PAD_LTHUMB_UP: + case VK_PAD_DPAD_UP: + action = ACTION_MENU_UP; + break; + case VK_PAD_LTHUMB_DOWN: + case VK_PAD_DPAD_DOWN: + action = ACTION_MENU_DOWN; + break; + case VK_PAD_LTRIGGER: + action = ACTION_MENU_PAGEUP; + break; + case VK_PAD_RTRIGGER: + action = ACTION_MENU_PAGEDOWN; + break; + case VK_PAD_LSHOULDER: + action = ACTION_MENU_LEFT_SCROLL; + break; + case VK_PAD_RSHOULDER: + action = ACTION_MENU_RIGHT_SCROLL; + break; + case VK_PAD_RTHUMB_UP: + action = ACTION_MENU_OTHER_STICK_UP; + break; + case VK_PAD_RTHUMB_DOWN: + action = ACTION_MENU_OTHER_STICK_DOWN; + break; + case VK_PAD_RTHUMB_RIGHT: + action = ACTION_MENU_OTHER_STICK_RIGHT; + break; + case VK_PAD_RTHUMB_LEFT: + action = ACTION_MENU_OTHER_STICK_LEFT; + break; + }; + + return action; +} + +////////////////////////////////////////////////////////////////////////// +// +// OnGetSourceImage +// +////////////////////////////////////////////////////////////////////////// +HRESULT CXuiSceneCraftingPanel::OnGetSourceImage(XUIMessageGetSourceImage* pData, BOOL& rfHandled) +{ + HRESULT hr = S_OK; + //int iId=pData->iItem; + int iId=(pData->iData>>22)&0x1FF; + pData->szPath = NULL; + pData->bDirty=true; + rfHandled = TRUE; + return hr; +} + +////////////////////////////////////////////////////////////////////////// +// +// OnDestroy +// +////////////////////////////////////////////////////////////////////////// +HRESULT CXuiSceneCraftingPanel::OnDestroy() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + +#ifdef _XBOX + if( pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + if(gameMode != NULL) gameMode->getTutorial()->changeTutorialState(m_previousTutorialState); + } +#endif + + // We need to make sure that we call closeContainer() anytime this menu is closed, even if it is forced to close by some other reason (like the player dying) + if(Minecraft::GetInstance()->localplayers[m_iPad] != NULL) Minecraft::GetInstance()->localplayers[m_iPad]->closeContainer(); + + return S_OK; +} + +HRESULT CXuiSceneCraftingPanel::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) +{ + bHandled=true; + return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining); +} + +HRESULT CXuiSceneCraftingPanel::OnTimer(XUIMessageTimer *pData,BOOL& rfHandled) +{ + if(pData->nId==IGNORE_KEYPRESS_TIMERID) + { + XuiKillTimer(m_hObj,IGNORE_KEYPRESS_TIMERID); + m_bIgnoreKeyPresses=false; + } + + return S_OK; +} + +HRESULT CXuiSceneCraftingPanel::OnKillFocus(HXUIOBJ hObjGettingFocus, BOOL& bHandled) +{ + return S_OK; +} + +int CXuiSceneCraftingPanel::getPad() +{ + return m_iPad; +} + +void CXuiSceneCraftingPanel::hideAllHSlots() +{ + for(int i=0;iSetShow(FALSE); + } +} + +void CXuiSceneCraftingPanel::hideAllVSlots() +{ + for(int i=0;iSetShow(FALSE); + } +} + + +void CXuiSceneCraftingPanel::hideAllIngredientsSlots() +{ + for(int i=0;iSetShow(FALSE); + } +} + +void CXuiSceneCraftingPanel::setCraftHSlotItem(int iPad, int iIndex, shared_ptr item, unsigned int uiAlpha) +{ + m_pHSlotsBrushImageControl[iIndex]->SetIcon(iPad, item, 9, uiAlpha, false); + //m_pHSlotsBrushImageControl[iIndex]->SetPassThroughDataAssociation(MAKE_SLOTDISPLAY_ITEM_BITMASK(item->id,item->getAuxValue(),item->isFoil()),MAKE_SLOTDISPLAY_DATA_BITMASK (iPad, uiAlpha, false, item->GetCount(), 9,0) ); + //m_pHSlotsBrushImageControl[iIndex]->SetShow(TRUE); +} + +void CXuiSceneCraftingPanel::setCraftVSlotItem(int iPad, int iIndex, shared_ptr item, unsigned int uiAlpha) +{ + m_pVSlotsBrushImageControl[iIndex]->SetIcon(iPad, item, 9, uiAlpha, false); + //m_pVSlotsBrushImageControl[iIndex]->SetPassThroughDataAssociation(MAKE_SLOTDISPLAY_ITEM_BITMASK(item->id,item->getAuxValue(),item->isFoil()),MAKE_SLOTDISPLAY_DATA_BITMASK (iPad, uiAlpha, false, item->GetCount(), 9,0) ); + //m_pVSlotsBrushImageControl[iIndex]->SetShow(TRUE); +} + +void CXuiSceneCraftingPanel::setCraftingOutputSlotItem(int iPad, shared_ptr item) +{ + if(item == NULL) + { + m_pCraftingOutput->SetIcon(iPad, 0,0,0,0,0,false); + } + else + { + m_pCraftingOutput->SetIcon(iPad, item->id,item->getAuxValue(),item->GetCount(),12,31,true,item->isFoil()); + } +} + +void CXuiSceneCraftingPanel::setCraftingOutputSlotRedBox(bool show) +{ + m_pCraftingOutput->SetRedBox(show?TRUE:FALSE); +} + +void CXuiSceneCraftingPanel::setIngredientSlotItem(int iPad, int index, shared_ptr item) +{ + if(item == NULL) + { + m_pCraftingIngredientA[index]->SetIcon(iPad, 0,0,0,0,0,false); + } + else + { + m_pCraftingIngredientA[index]->SetIcon(m_iPad, item->id,item->getAuxValue(),0,8,31,false); + } +} + +void CXuiSceneCraftingPanel::setIngredientSlotRedBox(int index, bool show) +{ + m_pCraftingIngredientA[index]->SetRedBox(show?TRUE:FALSE); +} + +void CXuiSceneCraftingPanel::setIngredientDescriptionItem(int iPad, int index, shared_ptr item) +{ + m_pCraftIngredientDescA[index]->SetIcon(iPad, item->id,item->getAuxValue(),item->GetCount(),8,31,TRUE,item->isFoil(),FALSE); +} + +void CXuiSceneCraftingPanel::setIngredientDescriptionRedBox(int index, bool show) +{ + m_pCraftIngredientDescA[index]->SetRedBox(show?TRUE:FALSE); +} + +void CXuiSceneCraftingPanel::setIngredientDescriptionText(int index, LPCWSTR text) +{ + m_pCraftIngredientDescA[index]->SetDescription(text); +} + +void CXuiSceneCraftingPanel::setShowCraftHSlot(int iIndex, bool show) +{ + m_pHSlotsBrushImageControl[iIndex]->SetShow(show?TRUE:FALSE); +} + +void CXuiSceneCraftingPanel::showTabHighlight(int iIndex, bool show) +{ + m_hTabGroupA[iIndex].SetShow(show?TRUE:FALSE); +} + +void CXuiSceneCraftingPanel::setGroupText(LPCWSTR text) +{ + m_GroupName.SetText(text); +} + +void CXuiSceneCraftingPanel::setDescriptionText(LPCWSTR text) +{ + m_DescriptionText.SetText(text); +} + +void CXuiSceneCraftingPanel::setItemText(LPCWSTR text) +{ + m_ItemName.SetText(text); +} + +void CXuiSceneCraftingPanel::UpdateMultiPanel() +{ + switch(m_iDisplayDescription) + { + case DISPLAY_INVENTORY: + // turn off all the ingredients display + for(int i=0;i<4;i++) + { + m_pCraftIngredientDescA[i]->SetShow(FALSE); + } + + XuiElementSetShow(m_hGridInventory,TRUE); + XuiControlSetText(m_InventoryText,app.GetString(IDS_INVENTORY)); + XuiElementSetShow(m_InventoryText,TRUE); + break; + case DISPLAY_DESCRIPTION: + // turn off the inventory + XuiElementSetShow(m_hGridInventory,FALSE); + XuiElementSetShow(m_DescriptionText,TRUE); + XuiElementSetShow(m_InventoryText,FALSE); + break; + case DISPLAY_INGREDIENTS: + // turn off all the descriptions + XuiElementSetShow(m_DescriptionText,FALSE); + + // display the ingredients + for(int i=0;iSetShow(TRUE); + } + + if(m_iIngredientsC==0) + { + XuiElementSetShow(m_InventoryText,FALSE); + } + else + { + XuiControlSetText(m_InventoryText,app.GetString(IDS_INGREDIENTS)); + XuiElementSetShow(m_InventoryText,TRUE); + } + break; + } +} + +void CXuiSceneCraftingPanel::scrollDescriptionUp() +{ + XUIHtmlScrollInfo ScrollInfo; + + XuiHtmlControlGetVScrollInfo(m_DescriptionText.m_hObj,&ScrollInfo); + if(!ScrollInfo.bScrolling) + { + XuiHtmlControlVScrollBy(m_DescriptionText.m_hObj,-1); + } +} + +void CXuiSceneCraftingPanel::scrollDescriptionDown() +{ + XUIHtmlScrollInfo ScrollInfo; + + XuiHtmlControlGetVScrollInfo(m_DescriptionText.m_hObj,&ScrollInfo); + if(!ScrollInfo.bScrolling) + { + XuiHtmlControlVScrollBy(m_DescriptionText.m_hObj,1); + } +} + +void CXuiSceneCraftingPanel::updateHighlightAndScrollPositions() +{ + D3DXVECTOR3 vec; + + vec.z=0.0f; + vec.x=m_vSlot0HighlightPos.x + (m_iCurrentSlotHIndex*m_fSlotSize); + vec.y=m_vSlot0HighlightPos.y + ((m_iCurrentSlotVIndex-1)*m_fSlotSize); // vslot 1 is the centred one + m_hHighlight.SetPosition(&vec); + + // Update the scroll icons for all h boxes + for(int i=0;i1)) + { + m_pCursors[i].SetShow(TRUE); + } + else + { + m_pCursors[i].SetShow(FALSE); + } + } + + if(CanBeMadeA[m_iCurrentSlotHIndex].iCount<2) + { + m_hScrollBar2.SetShow(FALSE); + m_hScrollBar3.SetShow(FALSE); + } + else if(CanBeMadeA[m_iCurrentSlotHIndex].iCount<3) + { + // 2 slot + vec.x=m_vSlot0V2ScrollPos.x + (m_iCurrentSlotHIndex*m_fSlotSize); + vec.y=m_vSlot0V2ScrollPos.y; + m_hScrollBar2.SetPosition(&vec); + m_hScrollBar2.SetShow(TRUE); + m_hScrollBar3.SetShow(FALSE); + } + else + { + // 3 slot + vec.x=m_vSlot0V3ScrollPos.x + (m_iCurrentSlotHIndex*m_fSlotSize); + vec.y=m_vSlot0V3ScrollPos.y;//+m_fSlotSize; + + m_hScrollBar3.SetPosition(&vec); + m_hScrollBar2.SetShow(FALSE); + m_hScrollBar3.SetShow(TRUE); + } +} + +void CXuiSceneCraftingPanel::updateVSlotPositions(int iSlots, int i) +{ + D3DXVECTOR3 vec; + if(iSlots==2) + { + vec.y=m_vSlot0Pos.y + (1-i)*m_fSlotSize; + } + else + { + vec.y=m_vSlot0Pos.y + (i-1)*m_fSlotSize; + } + vec.x=m_vSlot0Pos.x + m_iCurrentSlotHIndex*m_fSlotSize; + vec.z=0.0f; + m_pVSlotsBrushImageControl[i]->SetPosition(&vec); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_CraftingPanel.h b/Minecraft.Client/Common/XUI/XUI_Scene_CraftingPanel.h new file mode 100644 index 00000000..0c6e22ff --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_CraftingPanel.h @@ -0,0 +1,205 @@ +#pragma once +using namespace std; + +#include "../media/xuiscene_craftingpanel_2x2.h" +#include "XUI_Ctrl_MinecraftSlot.h" +#include "..\..\..\Minecraft.World\Recipy.h" +#include "XUI_Ctrl_CraftIngredientSlot.h" +#include "..\..\..\Minecraft.World\Item.h" +#include "XUI_CustomMessages.h" +#include "..\..\Common\Tutorial\TutorialEnum.h" +#include "..\UI\IUIScene_CraftingMenu.h" + +class CXuiCtrlSlotList; + +class CXuiSceneCraftingPanel : public CXuiSceneImpl, public IUIScene_CraftingMenu +{ +public: + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CXuiSceneCraftingPanel, L"CXuiSceneCraftingPanel", XUI_CLASS_SCENE ) + + protected: + // Control and Element wrapper objects. + + CXuiImageElement m_hPanel; + CXuiImageElement m_hHighlight; + CXuiImageElement m_hScrollBar3; + CXuiImageElement m_hScrollBar2; + CXuiControl m_GroupName; + CXuiHtmlControl m_DescriptionText; + CXuiControl m_ItemName,m_InventoryText; + CXuiElement m_Group; + CXuiElement m_hGrid; + CXuiElement m_hGridInventory; + CXuiImageElement m_hTabGroupA[m_iMaxGroup3x3]; + CXuiControl m_hGroupIconA[m_iMaxGroup3x3]; + CXuiControl m_pHSlotsCraftingCursors[m_iMaxHCraftingSlotC]; + CXuiControl m_pHSlotsCraftingTableCursors[m_iMaxHSlotC]; + CXuiControl *m_pCursors; + CXuiControl m_hCraftIngredientA[m_iIngredients3x3SlotC]; + CXuiControl m_hCraftIngredientDescA[4]; // Max ingredients is 4 for bread + CXuiControl m_hCraftOutput; + CXuiControl m_sceneGroup; + + CXuiCtrlSlotList* m_inventoryControl; + CXuiCtrlSlotList* m_useRowControl; + + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_TRANSITION_END( OnTransitionEnd) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_GET_SOURCE_IMAGE(OnGetSourceImage) + XUI_ON_XM_DESTROY( OnDestroy ) + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + XUI_ON_XM_TIMER( OnTimer ) + XUI_ON_XM_KILL_FOCUS( OnKillFocus) + XUI_ON_XM_INVENTORYUPDATED_MESSAGE( OnCustomMessage_InventoryUpdated ) + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_Group, m_sceneGroup) + BEGIN_MAP_CHILD_CONTROLS(m_sceneGroup) + MAP_CONTROL(IDC_MainPanel,m_hPanel) + MAP_CONTROL(IDC_XuiGroupName,m_GroupName) + + MAP_CONTROL(IDC_SceneCraftScrollGroup, m_Group) + BEGIN_MAP_CHILD_CONTROLS(m_Group) + MAP_CONTROL(IDC_XuiHighlight,m_hHighlight) + MAP_CONTROL(IDC_XuiImageScrollBar,m_hScrollBar3) + MAP_CONTROL(IDC_XuiImageScrollBar2Slot,m_hScrollBar2) + MAP_OVERRIDE(IDC_XuiHSlot0, m_pHSlotsBrushImageControl[0]) + MAP_OVERRIDE(IDC_XuiHSlot1, m_pHSlotsBrushImageControl[1]) + MAP_OVERRIDE(IDC_XuiHSlot2, m_pHSlotsBrushImageControl[2]) + MAP_OVERRIDE(IDC_XuiHSlot3, m_pHSlotsBrushImageControl[3]) + MAP_OVERRIDE(IDC_XuiHSlot4, m_pHSlotsBrushImageControl[4]) + MAP_OVERRIDE(IDC_XuiHSlot5, m_pHSlotsBrushImageControl[5]) + MAP_OVERRIDE(IDC_XuiHSlot6, m_pHSlotsBrushImageControl[6]) + MAP_OVERRIDE(IDC_XuiHSlot7, m_pHSlotsBrushImageControl[7]) + MAP_OVERRIDE(IDC_XuiHSlot8, m_pHSlotsBrushImageControl[8]) + MAP_OVERRIDE(IDC_XuiHSlot9, m_pHSlotsBrushImageControl[9]) + MAP_OVERRIDE(IDC_XuiHSlot10, m_pHSlotsBrushImageControl[10]) + MAP_OVERRIDE(IDC_XuiHSlot11, m_pHSlotsBrushImageControl[11]) + + + MAP_OVERRIDE(IDC_XuiVSlot0, m_pVSlotsBrushImageControl[0]) + MAP_OVERRIDE(IDC_XuiVSlot1, m_pVSlotsBrushImageControl[1]) + MAP_OVERRIDE(IDC_XuiVSlot2, m_pVSlotsBrushImageControl[2]) + + END_MAP_CHILD_CONTROLS() + + MAP_CONTROL(IDC_Group_Tab_Icons, m_Group) + BEGIN_MAP_CHILD_CONTROLS(m_Group) + MAP_CONTROL(IDC_Icon_1,m_hGroupIconA[0]) + MAP_CONTROL(IDC_Icon_2,m_hGroupIconA[1]) + MAP_CONTROL(IDC_Icon_3,m_hGroupIconA[2]) + MAP_CONTROL(IDC_Icon_4,m_hGroupIconA[3]) + MAP_CONTROL(IDC_Icon_5,m_hGroupIconA[4]) + MAP_CONTROL(IDC_Icon_6,m_hGroupIconA[5]) + MAP_CONTROL(IDC_Icon_7,m_hGroupIconA[6]) + + END_MAP_CHILD_CONTROLS() + + + MAP_CONTROL(IDC_Group_Tab_Images, m_Group) + BEGIN_MAP_CHILD_CONTROLS(m_Group) + MAP_CONTROL(IDC_TabImage1,m_hTabGroupA[0]) + MAP_CONTROL(IDC_TabImage2,m_hTabGroupA[1]) + MAP_CONTROL(IDC_TabImage3,m_hTabGroupA[2]) + MAP_CONTROL(IDC_TabImage4,m_hTabGroupA[3]) + MAP_CONTROL(IDC_TabImage5,m_hTabGroupA[4]) + MAP_CONTROL(IDC_TabImage6,m_hTabGroupA[5]) + MAP_CONTROL(IDC_TabImage7,m_hTabGroupA[6]) + + END_MAP_CHILD_CONTROLS() + + + MAP_CONTROL(IDC_Grid, m_hGrid) + BEGIN_MAP_CHILD_CONTROLS(m_hGrid) + MAP_CONTROL(IDC_XuiHTMLText,m_DescriptionText) + MAP_CONTROL(IDC_Inventory,m_InventoryText) + MAP_CONTROL(IDC_XuiItemName,m_ItemName) + MAP_CONTROL(IDC_CraftingInput1,m_hCraftIngredientA[0]) + MAP_CONTROL(IDC_CraftingInput2,m_hCraftIngredientA[1]) + MAP_CONTROL(IDC_CraftingInput3,m_hCraftIngredientA[2]) + MAP_CONTROL(IDC_CraftingInput4,m_hCraftIngredientA[3]) + MAP_CONTROL(IDC_CraftingInput5,m_hCraftIngredientA[4]) + MAP_CONTROL(IDC_CraftingInput6,m_hCraftIngredientA[5]) + MAP_CONTROL(IDC_CraftingInput7,m_hCraftIngredientA[6]) + MAP_CONTROL(IDC_CraftingInput8,m_hCraftIngredientA[7]) + MAP_CONTROL(IDC_CraftingInput9,m_hCraftIngredientA[8]) + MAP_CONTROL(IDC_Ingredient1,m_hCraftIngredientDescA[0]) + MAP_CONTROL(IDC_Ingredient2,m_hCraftIngredientDescA[1]) + MAP_CONTROL(IDC_Ingredient3,m_hCraftIngredientDescA[2]) + MAP_CONTROL(IDC_Ingredient4,m_hCraftIngredientDescA[3]) + + MAP_CONTROL(IDC_CraftingOutputRed,m_hCraftOutput) + END_MAP_CHILD_CONTROLS() + + MAP_CONTROL(IDC_InventoryGrid, m_hGridInventory) + BEGIN_MAP_CHILD_CONTROLS(m_hGridInventory) + MAP_OVERRIDE(IDC_Inventory, m_inventoryControl) + MAP_OVERRIDE(IDC_UseRow, m_useRowControl) + END_MAP_CHILD_CONTROLS() + END_MAP_CHILD_CONTROLS() + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnTransitionEnd( XUIMessageTransition *pTransData, BOOL& bHandled); + HRESULT OnGetSourceImage(XUIMessageGetSourceImage* pData, BOOL& rfHandled); + HRESULT OnDestroy(); + HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled); + HRESULT OnTimer(XUIMessageTimer *pData,BOOL& rfHandled); + HRESULT OnKillFocus(HXUIOBJ hObjGettingFocus, BOOL& bHandled); + HRESULT OnCustomMessage_InventoryUpdated(); + + CXuiSceneCraftingPanel(); + ~CXuiSceneCraftingPanel() { } + +private: + float m_fSlotSize; + D3DXVECTOR3 m_vSlot0Pos; + D3DXVECTOR3 m_vSlot0HighlightPos; + D3DXVECTOR3 m_vSlot0V2ScrollPos; + D3DXVECTOR3 m_vSlot0V3ScrollPos; + + CXuiCtrlCraftIngredientSlot *m_pCraftingOutput; + CXuiCtrlCraftIngredientSlot *m_pCraftingIngredientA[m_iIngredients3x3SlotC]; + CXuiCtrlCraftIngredientSlot *m_pCraftIngredientDescA[4]; + CXuiCtrlMinecraftSlot *m_pHSlotsBrushImageControl[m_iMaxHSlotC]; + CXuiCtrlMinecraftSlot *m_pVSlotsBrushImageControl[m_iMaxDisplayedVSlotC]; + CXuiControl *GroupTypeIconA[Recipy::eGroupType_Max]; + int m_iPad; + D3DXVECTOR3 m_OriginalPosition; + + int mapVKToAction(int vk); + +protected: + virtual int getPad(); + virtual void hideAllHSlots(); + virtual void hideAllVSlots(); + virtual void hideAllIngredientsSlots(); + virtual void setCraftHSlotItem(int iPad, int iIndex, shared_ptr item, unsigned int uiAlpha); + virtual void setCraftVSlotItem(int iPad, int iIndex, shared_ptr item, unsigned int uiAlpha); + virtual void setCraftingOutputSlotItem(int iPad, shared_ptr item); + virtual void setCraftingOutputSlotRedBox(bool show); + virtual void setIngredientSlotItem(int iPad, int index, shared_ptr item); + virtual void setIngredientSlotRedBox(int index, bool show); + virtual void setIngredientDescriptionItem(int iPad, int index, shared_ptr item); + virtual void setIngredientDescriptionRedBox(int index, bool show); + virtual void setIngredientDescriptionText(int index, LPCWSTR text); + virtual void setShowCraftHSlot(int iIndex, bool show); + virtual void showTabHighlight(int iIndex, bool show); + virtual void setGroupText(LPCWSTR text); + virtual void setDescriptionText(LPCWSTR text); + virtual void setItemText(LPCWSTR text); + virtual void scrollDescriptionUp(); + virtual void scrollDescriptionDown(); + virtual void updateHighlightAndScrollPositions(); + virtual void updateVSlotPositions(int iSlots, int i); + + virtual void UpdateMultiPanel(); +}; diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_Enchant.cpp b/Minecraft.Client/Common/XUI/XUI_Scene_Enchant.cpp new file mode 100644 index 00000000..5b3c7226 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Enchant.cpp @@ -0,0 +1,144 @@ +#include "stdafx.h" + +#include "..\..\..\Minecraft.World\AbstractContainerMenu.h" +#include "..\..\..\Minecraft.World\Slot.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.dimension.h" + +//#include "..\..\..\Minecraft.World\net.minecraft.stats.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\Common\Tutorial\Tutorial.h" +#include "..\..\Common\Tutorial\TutorialMode.h" +#include "..\..\Common\Tutorial\TutorialEnum.h" +#include "..\..\Minecraft.h" +#include "XUI_Ctrl_SlotList.h" + +#include "XUI_Scene_Enchant.h" +#include "XUI_Scene_Inventory.h" +#include "XUI_Ctrl_EnchantButton.h" + +//-------------------------------------------------------------------------------------- +// Name: CXuiSceneEnchant::OnInit +// Desc: Message handler for XM_INIT +//-------------------------------------------------------------------------------------- +HRESULT CXuiSceneEnchant::OnInit( XUIMessageInit *pInitData, BOOL &bHandled ) +{ + D3DXVECTOR3 vec; + MapChildControls(); + + XuiControlSetText(m_EnchantText,app.GetString(IDS_ENCHANT)); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + EnchantingScreenInput *initData = (EnchantingScreenInput *) pInitData->pvInitData; + m_iPad=initData->iPad; + m_bSplitscreen=initData->bSplitscreen; + + // if we are in splitscreen, then we need to figure out if we want to move this scene + + if(m_bSplitscreen) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + } + +#ifdef _XBOX + if( pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Enchanting_Menu, this); + } +#endif + + EnchantmentMenu *menu = new EnchantmentMenu(initData->inventory, initData->level, initData->x, initData->y, initData->z); + + InitDataAssociations(initData->iPad, menu); + + m_enchant1->SetEnable(FALSE); + m_enchant2->SetEnable(FALSE); + m_enchant3->SetEnable(FALSE); + m_enchant1->SetData(m_iPad, 0); + m_enchant2->SetData(m_iPad, 1); + m_enchant3->SetData(m_iPad, 2); + + CXuiSceneAbstractContainer::Initialize( initData->iPad, menu, false, EnchantmentMenu::INV_SLOT_START, CXuiSceneAbstractContainer::eSectionEnchantUsing, CXuiSceneAbstractContainer::eSectionEnchantMax ); + + delete initData; + + return S_OK; +} + +HRESULT CXuiSceneEnchant::OnDestroy() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + +#ifdef _XBOX + if( pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + if(gameMode != NULL) gameMode->getTutorial()->changeTutorialState(m_previousTutorialState); + } +#endif + + // 4J Stu - Fix for #11302 - TCR 001: Network Connectivity: Host crashed after being killed by the client while accessing a chest during burst packet loss. + // We need to make sure that we call closeContainer() anytime this menu is closed, even if it is forced to close by some other reason (like the player dying) + if(Minecraft::GetInstance()->localplayers[m_iPad] != NULL) Minecraft::GetInstance()->localplayers[m_iPad]->closeContainer(); + return S_OK; +} + +CXuiControl* CXuiSceneEnchant::GetSectionControl( ESceneSection eSection ) +{ + switch( eSection ) + { + case CXuiSceneAbstractContainer::eSectionEnchantInventory: + return (CXuiControl *)m_inventoryControl; + break; + case CXuiSceneAbstractContainer::eSectionEnchantUsing: + return (CXuiControl *)m_useRowControl; + break; + case CXuiSceneAbstractContainer::eSectionEnchantSlot: + return (CXuiControl *)m_ingredientControl; + break; + case eSectionEnchantButton1: + return m_enchant1; + break; + case eSectionEnchantButton2: + return m_enchant2; + break; + case eSectionEnchantButton3: + return m_enchant3; + break; + default: + assert( false ); + break; + } + return NULL; +} + +CXuiCtrlSlotList* CXuiSceneEnchant::GetSectionSlotList( ESceneSection eSection ) +{ + switch( eSection ) + { + case CXuiSceneAbstractContainer::eSectionEnchantInventory: + return m_inventoryControl; + break; + case CXuiSceneAbstractContainer::eSectionEnchantUsing: + return m_useRowControl; + break; + case CXuiSceneAbstractContainer::eSectionEnchantSlot: + return m_ingredientControl; + break; + default: + assert( false ); + break; + } + return NULL; +} + +// 4J Stu - Added to support auto-save. Need to re-associate on a navigate back +void CXuiSceneEnchant::InitDataAssociations(int iPad, AbstractContainerMenu *menu, int startIndex /*= 0*/) +{ + m_ingredientControl->SetData( iPad, menu, 1, 1, EnchantmentMenu::INGREDIENT_SLOT ); + + CXuiSceneAbstractContainer::InitDataAssociations(iPad, menu, EnchantmentMenu::INV_SLOT_START); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_Enchant.h b/Minecraft.Client/Common/XUI/XUI_Scene_Enchant.h new file mode 100644 index 00000000..5cab04a4 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Enchant.h @@ -0,0 +1,78 @@ +#pragma once +using namespace std; + +#include "..\Media\xuiscene_enchant.h" + +#include "..\..\BookModel.h" + +#include "XUI_Ctrl_SlotList.h" +#include "XUI_Ctrl_EnchantmentBook.h" +#include "XUI_Scene_AbstractContainer.h" +#include "..\UI\IUIScene_EnchantingMenu.h" +#include "XUI_CustomMessages.h" + +#include "XUI_Scene_Enchant.h" + +#include "..\..\..\Minecraft.World\AbstractContainerMenu.h" +#include "..\..\..\Minecraft.World\SimpleContainer.h" + +class Level; +class CXuiCtrlEnchantmentButton; +class EnchantmentMenu; + +//-------------------------------------------------------------------------------------- +// Scene implementation class. +//-------------------------------------------------------------------------------------- +class CXuiSceneEnchant : public CXuiSceneAbstractContainer, public IUIScene_EnchantingMenu +{ + friend class CXuiCtrlEnchantmentButtonText; +public: + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CXuiSceneEnchant, L"CXuiSceneEnchant", XUI_CLASS_SCENE ) + +protected: + CXuiCtrlEnchantmentButton *m_enchant1; + CXuiCtrlEnchantmentButton *m_enchant2; + CXuiCtrlEnchantmentButton *m_enchant3; + CXuiControl m_sceneGroup; + CXuiCtrlSlotList* m_ingredientControl; + CXuiControl m_EnchantText; + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN( OnKeyDown ) + XUI_ON_XM_DESTROY( OnDestroy ) + XUI_ON_XM_TIMER( OnTimer ) // Poll stick input on a timer. + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + XUI_ON_XM_TRANSITION_START(OnTransitionStart) + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_Group, m_sceneGroup) + BEGIN_MAP_CHILD_CONTROLS( m_sceneGroup ) + // Common to all abstract container scenes + MAP_OVERRIDE(IDC_Inventory, m_inventoryControl) + MAP_OVERRIDE(IDC_UseRow, m_useRowControl) + MAP_OVERRIDE(IDC_Pointer, m_pointerControl) + MAP_CONTROL(IDC_InventoryText,m_InventoryText) + + MAP_OVERRIDE(IDC_Ingredient, m_ingredientControl) + MAP_OVERRIDE(IDC_EnchantButton1, m_enchant1) + MAP_OVERRIDE(IDC_EnchantButton2, m_enchant2) + MAP_OVERRIDE(IDC_EnchantButton3, m_enchant3) + MAP_CONTROL(IDC_EnchantText,m_EnchantText) + END_MAP_CHILD_CONTROLS() + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnDestroy(); + + virtual void InitDataAssociations(int iPad, AbstractContainerMenu *menu, int startIndex = 0); + +private: + + virtual CXuiControl* GetSectionControl( ESceneSection eSection ); + virtual CXuiCtrlSlotList* GetSectionSlotList( ESceneSection eSection ); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_Furnace.cpp b/Minecraft.Client/Common/XUI/XUI_Scene_Furnace.cpp new file mode 100644 index 00000000..832d6b4c --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Furnace.cpp @@ -0,0 +1,153 @@ +#include "stdafx.h" + +#include "..\..\..\Minecraft.World\FurnaceMenu.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\Common\Tutorial\Tutorial.h" +#include "..\..\Common\Tutorial\TutorialMode.h" +#include "..\..\Common\Tutorial\TutorialEnum.h" +#include "..\..\Minecraft.h" +#include "XUI_Ctrl_SlotList.h" +#include "XUI_Scene_Furnace.h" +#include "XUI_Ctrl_BurnProgress.h" +#include "XUI_Ctrl_FireProgress.h" + + +//-------------------------------------------------------------------------------------- +// Name: CXuiSceneFurnace::OnInit +// Desc: Message handler for XM_INIT +//-------------------------------------------------------------------------------------- +HRESULT CXuiSceneFurnace::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + MapChildControls(); + + XuiControlSetText(m_FurnaceText,app.GetString(IDS_FURNACE)); + XuiControlSetText(m_IngredientText,app.GetString(IDS_INGREDIENT)); + XuiControlSetText(m_FuelText,app.GetString(IDS_FUEL)); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + FurnaceScreenInput* initData = (FurnaceScreenInput*)pInitData->pvInitData; + m_iPad=initData->iPad; + m_bSplitscreen=initData->bSplitscreen; + + // if we are in splitscreen, then we need to figure out if we want to move this scene + + if(m_bSplitscreen) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + } + +#ifdef _XBOX + if( pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Furnace_Menu, this); + } +#endif + + FurnaceMenu* menu = new FurnaceMenu( initData->inventory, initData->furnace ); + + + InitDataAssociations(m_iPad, menu); + + m_litProgressControl->SetUserData( initData->furnace.get() ); + + m_burnProgress->SetUserData( initData->furnace.get() ); + + CXuiSceneAbstractContainer::Initialize( m_iPad, menu, true, FurnaceMenu::INV_SLOT_START, eSectionFurnaceUsing, eSectionFurnaceMax ); + + app.SetRichPresenceContext(m_iPad,CONTEXT_GAME_STATE_FORGING); + + delete initData; + + return S_OK; +} + +HRESULT CXuiSceneFurnace::OnDestroy() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + +#ifdef _XBOX + if( pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + if(gameMode != NULL) gameMode->getTutorial()->changeTutorialState(m_previousTutorialState); + } +#endif + + // 4J Stu - Fix for #11302 - TCR 001: Network Connectivity: Host crashed after being killed by the client while accessing a chest during burst packet loss. + // We need to make sure that we call closeContainer() anytime this menu is closed, even if it is forced to close by some other reason (like the player dying) + if(Minecraft::GetInstance()->localplayers[m_iPad] != NULL) Minecraft::GetInstance()->localplayers[m_iPad]->closeContainer(); + return S_OK; +} + +CXuiControl* CXuiSceneFurnace::GetSectionControl( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionFurnaceResult: + return (CXuiControl *)m_resultControl; + break; + case eSectionFurnaceFuel: + return (CXuiControl *)m_fuelControl; + break; + case eSectionFurnaceIngredient: + return (CXuiControl *)m_ingredientControl; + break; + case eSectionFurnaceInventory: + return (CXuiControl *)m_inventoryControl; + break; + case eSectionFurnaceUsing: + return (CXuiControl *)m_useRowControl; + break; + default: + assert( false ); + break; + } + return NULL; +} + +CXuiCtrlSlotList* CXuiSceneFurnace::GetSectionSlotList( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionFurnaceResult: + return m_resultControl; + break; + case eSectionFurnaceFuel: + return m_fuelControl; + break; + case eSectionFurnaceIngredient: + return m_ingredientControl; + break; + case eSectionFurnaceInventory: + return m_inventoryControl; + break; + case eSectionFurnaceUsing: + return m_useRowControl; + break; + default: + assert( false ); + break; + } + return NULL; +} + +// 4J Stu - Added to support auto-save. Need to re-associate on a navigate back +void CXuiSceneFurnace::InitDataAssociations(int iPad, AbstractContainerMenu *menu, int startIndex /*= 0*/) +{ + // TODO Inventory dimensions need defined as constants + m_ingredientControl->SetData( iPad, menu, 1, 1, FurnaceMenu::INGREDIENT_SLOT ); + + m_fuelControl->SetData( iPad, menu, 1, 1, FurnaceMenu::FUEL_SLOT ); + + m_resultControl->SetData( iPad, menu, 1, 1, FurnaceMenu::RESULT_SLOT ); + + //m_litProgressControl->SetUserData( initData->furnace.get() ); + + //m_burnProgress->SetUserData( initData->furnace.get() ); + + CXuiSceneAbstractContainer::InitDataAssociations(iPad, menu, FurnaceMenu::INV_SLOT_START); +} + diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_Furnace.h b/Minecraft.Client/Common/XUI/XUI_Scene_Furnace.h new file mode 100644 index 00000000..22cbf262 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Furnace.h @@ -0,0 +1,79 @@ +#pragma once +using namespace std; +#include "..\Media\xuiscene_furnace.h" +#include "XUI_Scene_AbstractContainer.h" +#include "..\UI\IUIScene_FurnaceMenu.h" + +class CXuiCtrlSlotList; +class CXuiCtrlFireProgress; +class CXuiCtrlBurnProgress; + +//-------------------------------------------------------------------------------------- +// Scene implementation class. +//-------------------------------------------------------------------------------------- +class CXuiSceneFurnace : public CXuiSceneAbstractContainer, public IUIScene_FurnaceMenu +{ +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CXuiSceneFurnace, L"CXuiSceneFurnace", XUI_CLASS_SCENE ) + +protected: + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN( OnKeyDown ) + XUI_ON_XM_DESTROY( OnDestroy ) + XUI_ON_XM_TIMER( OnTimer ) // Poll stick input on a timer. + XUI_ON_XM_TRANSITION_START(OnTransitionStart) + + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_Group, m_sceneGroup) + BEGIN_MAP_CHILD_CONTROLS( m_sceneGroup ) + // Common to all abstract container scenes + MAP_OVERRIDE(IDC_Inventory, m_inventoryControl) + MAP_OVERRIDE(IDC_UseRow, m_useRowControl) + MAP_OVERRIDE(IDC_Pointer, m_pointerControl) + MAP_CONTROL(IDC_InventoryText,m_InventoryText) + + MAP_OVERRIDE(IDC_Ingredient, m_ingredientControl) + MAP_OVERRIDE(IDC_Fuel, m_fuelControl) + MAP_OVERRIDE(IDC_Result, m_resultControl) + + MAP_OVERRIDE(IDC_Lit, m_litProgressControl) + MAP_OVERRIDE(IDC_Burn, m_burnProgress) + + MAP_CONTROL(IDC_FurnaceText,m_FurnaceText) + MAP_CONTROL(IDC_IngredientText,m_IngredientText) + MAP_CONTROL(IDC_FuelText,m_FuelText) + END_MAP_CHILD_CONTROLS() + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnDestroy(); +// HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled); + + virtual void InitDataAssociations(int iPad, AbstractContainerMenu *menu, int startIndex = 0); + +private: + CXuiCtrlSlotList *m_ingredientControl; + CXuiCtrlSlotList *m_fuelControl; + CXuiCtrlSlotList *m_resultControl; + + CXuiCtrlFireProgress *m_litProgressControl; + CXuiCtrlBurnProgress *m_burnProgress; + + CXuiControl m_FurnaceText; + CXuiControl m_IngredientText; + CXuiControl m_FuelText; + + CXuiControl m_sceneGroup; + + virtual CXuiControl* GetSectionControl( ESceneSection eSection ); + virtual CXuiCtrlSlotList* GetSectionSlotList( ESceneSection eSection ); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_Inventory.cpp b/Minecraft.Client/Common/XUI/XUI_Scene_Inventory.cpp new file mode 100644 index 00000000..04e77e5e --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Inventory.cpp @@ -0,0 +1,234 @@ +#include "stdafx.h" + +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.stats.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.effect.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\Common\Tutorial\Tutorial.h" +#include "..\..\Common\Tutorial\TutorialMode.h" +#include "..\..\Common\Tutorial\TutorialEnum.h" +#include "..\..\Minecraft.h" +#include "XUI_Controls.h" +#include "XUI_Scene_Inventory.h" + + +//-------------------------------------------------------------------------------------- +// Name: CXuiSceneInventory::OnInit +// Desc: Message handler for XM_INIT +//-------------------------------------------------------------------------------------- +HRESULT CXuiSceneInventory::OnInit( XUIMessageInit *pInitData, BOOL &bHandled ) +{ + D3DXVECTOR3 vec; + MapChildControls(); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + InventoryScreenInput *initData = (InventoryScreenInput *)pInitData->pvInitData; + m_iPad=initData->iPad; + m_bSplitscreen=initData->bSplitscreen; + + // if we are in splitscreen, then we need to figure out if we want to move this scene + + if(m_bSplitscreen) + { + if(m_bSplitscreen) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + } + } + +#ifdef _XBOX + if( pMinecraft->localgameModes[initData->iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[initData->iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Inventory_Menu, this); + } +#endif + + InventoryMenu *menu = dynamic_cast( initData->player->inventoryMenu ); + +#if 0 + // TODO Inventory dimensions need defined as constants + m_armorGroup->SetData( initData->iPad, menu, 4, 1, InventoryMenu::ARMOR_SLOT_START ); +#endif + InitDataAssociations(initData->iPad, menu); + + initData->player->awardStat(GenericStats::openInventory(), GenericStats::param_noArgs()); + + CXuiSceneAbstractContainer::Initialize( initData->iPad, menu, false, InventoryMenu::INV_SLOT_START, eSectionInventoryUsing, eSectionInventoryMax, initData->bNavigateBack ); + + delete initData; + + float fWidth; + m_effectsGroup.GetBounds(&fWidth, &m_effectAreaHeight); // Get total height available for effects display + m_hEffectDisplayA[0]->GetBounds(&fWidth, &m_effectDisplayHeight); // Get height of one effect + + D3DXVECTOR3 firstEffectPos, secondEffectPos; + m_hEffectDisplayA[0]->GetPosition(&firstEffectPos); + m_hEffectDisplayA[1]->GetPosition(&secondEffectPos); + m_effectDisplaySpacing = firstEffectPos.y - secondEffectPos.y; // Stack from the bottom + + updateEffectsDisplay(); + XuiSetTimer(m_hObj,INVENTORY_UPDATE_EFFECTS_TIMER_ID,INVENTORY_UPDATE_EFFECTS_TIMER_TIME); + + return S_OK; +} + +HRESULT CXuiSceneInventory::OnDestroy() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if( pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + if(gameMode != NULL) gameMode->getTutorial()->changeTutorialState(m_previousTutorialState); + } + + // 4J Stu - Fix for #11302 - TCR 001: Network Connectivity: Host crashed after being killed by the client while accessing a chest during burst packet loss. + // We need to make sure that we call closeContainer() anytime this menu is closed, even if it is forced to close by some other reason (like the player dying) + if(Minecraft::GetInstance()->localplayers[m_iPad] != NULL) Minecraft::GetInstance()->localplayers[m_iPad]->closeContainer(); + return S_OK; +} + +HRESULT CXuiSceneInventory::handleCustomTimer( XUIMessageTimer *pTimer, BOOL& bHandled ) +{ + if(pTimer->nId == INVENTORY_UPDATE_EFFECTS_TIMER_ID) + { + updateEffectsDisplay(); + bHandled = TRUE; + } + return S_OK; +} + +CXuiControl* CXuiSceneInventory::GetSectionControl( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionInventoryArmor: + return (CXuiControl *)m_armorGroup; + break; + case eSectionInventoryInventory: + return (CXuiControl *)m_inventoryControl; + break; + case eSectionInventoryUsing: + return (CXuiControl *)m_useRowControl; + break; + default: + assert( false ); + break; + } + return NULL; +} + +CXuiCtrlSlotList* CXuiSceneInventory::GetSectionSlotList( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionInventoryArmor: + return m_armorGroup; + break; + case eSectionInventoryInventory: + return m_inventoryControl; + break; + case eSectionInventoryUsing: + return m_useRowControl; + break; + default: + assert( false ); + break; + } + return NULL; +} + +// 4J Stu - Added to support auto-save. Need to re-associate on a navigate back +void CXuiSceneInventory::InitDataAssociations(int iPad, AbstractContainerMenu *menu, int startIndex /*= 0*/) +{ + // TODO Inventory dimensions need defined as constants + m_armorGroup->SetData( iPad, menu, 4, 1, InventoryMenu::ARMOR_SLOT_START ); + + CXuiSceneAbstractContainer::InitDataAssociations(iPad, menu, InventoryMenu::INV_SLOT_START); +} + +void CXuiSceneInventory::updateEffectsDisplay() +{ + // Update with the current effects + Minecraft *pMinecraft = Minecraft::GetInstance(); + shared_ptr player = pMinecraft->localplayers[m_iPad]; + + if(player == NULL) return; + + vector *activeEffects = player->getActiveEffects(); + + // Work out how to arrange the effects + int effectCount = (int)activeEffects->size(); + + // Total size of all effects + spacing, minus spacing for the last effect + float fHeight = (effectCount * m_effectDisplaySpacing) - (m_effectDisplaySpacing - m_effectDisplayHeight); + float fNextEffectYOffset = m_effectDisplaySpacing; + + if(fHeight > m_effectAreaHeight) + { + fNextEffectYOffset = (m_effectAreaHeight + 1) / effectCount; + fNextEffectYOffset = floor(fNextEffectYOffset); + } + + // Fill out details for display + D3DXVECTOR3 position; + m_hEffectDisplayA[0]->GetPosition(&position); + AUTO_VAR(it, activeEffects->begin()); + for(unsigned int i = 0; i < MAX_EFFECTS; ++i) + { + if(it != activeEffects->end()) + { + m_hEffectDisplayA[i]->SetShow(TRUE); + + if(i > 0) position.y -= fNextEffectYOffset; // Stack from the bottom + m_hEffectDisplayA[i]->SetPosition(&position); + + MobEffectInstance *effect = *it; + + MobEffect *mobEffect = MobEffect::effects[effect->getId()]; + if (mobEffect->hasIcon()) + { + m_hEffectDisplayA[i]->setIcon(mobEffect->getIcon()); + } + + wstring effectString = app.GetString( effect->getDescriptionId() );//I18n.get(effect.getDescriptionId()).trim(); + if (effect->getAmplifier() > 0) + { + wstring potencyString = L""; + switch(effect->getAmplifier()) + { + case 1: + potencyString = L" "; + potencyString += app.GetString( IDS_POTION_POTENCY_1 ); + break; + case 2: + potencyString = L" "; + potencyString += app.GetString( IDS_POTION_POTENCY_2 ); + break; + case 3: + potencyString = L" "; + potencyString += app.GetString( IDS_POTION_POTENCY_3 ); + break; + default: + potencyString = app.GetString( IDS_POTION_POTENCY_0 ); + break; + } + effectString += potencyString; + } + m_hEffectDisplayA[i]->setName(effectString); + + wstring durationString = MobEffect::formatDuration(effect); + m_hEffectDisplayA[i]->setDuration(durationString); + + ++it; + } + else + { + m_hEffectDisplayA[i]->SetShow(FALSE); + } + } + delete activeEffects; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_Inventory.h b/Minecraft.Client/Common/XUI/XUI_Scene_Inventory.h new file mode 100644 index 00000000..2a7b305c --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Inventory.h @@ -0,0 +1,89 @@ +#pragma once +using namespace std; +#include "..\Media\xuiscene_inventory.h" +#include "XUI_Scene_AbstractContainer.h" +#include "XUI_CustomMessages.h" +#include "..\UI\IUIScene_InventoryMenu.h" + +#define INVENTORY_UPDATE_EFFECTS_TIMER_ID (10) +#define INVENTORY_UPDATE_EFFECTS_TIMER_TIME (1000) // 1 second + +class CXuiCtrlMobEffect; + +//-------------------------------------------------------------------------------------- +// Scene implementation class. +//-------------------------------------------------------------------------------------- +class CXuiSceneInventory : public CXuiSceneAbstractContainer, public IUIScene_InventoryMenu +{ +private: + static const int MAX_EFFECTS = 10; +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CXuiSceneInventory, L"CXuiSceneInventory", XUI_CLASS_SCENE ) + +protected: + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN( OnKeyDown ) + XUI_ON_XM_DESTROY( OnDestroy ) + XUI_ON_XM_TIMER( OnTimer ) // Poll stick input on a timer. + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + XUI_ON_XM_TRANSITION_START(OnTransitionStart) + + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_Group, m_sceneGroup) + BEGIN_MAP_CHILD_CONTROLS( m_sceneGroup ) + // Common to all abstract container scenes + MAP_OVERRIDE(IDC_Inventory, m_inventoryControl) + MAP_OVERRIDE(IDC_UseRow, m_useRowControl) + MAP_OVERRIDE(IDC_Pointer, m_pointerControl) + MAP_CONTROL(IDC_InventoryText,m_InventoryText) + + MAP_OVERRIDE(IDC_Armor, m_armorGroup) + END_MAP_CHILD_CONTROLS() + + MAP_CONTROL(IDC_EffectsGroup, m_effectsGroup) + BEGIN_MAP_CHILD_CONTROLS( m_effectsGroup ) + MAP_OVERRIDE(IDC_Effect1, m_hEffectDisplayA[0]) + MAP_OVERRIDE(IDC_Effect2, m_hEffectDisplayA[1]) + MAP_OVERRIDE(IDC_Effect3, m_hEffectDisplayA[2]) + MAP_OVERRIDE(IDC_Effect4, m_hEffectDisplayA[3]) + MAP_OVERRIDE(IDC_Effect5, m_hEffectDisplayA[4]) + MAP_OVERRIDE(IDC_Effect6, m_hEffectDisplayA[5]) + MAP_OVERRIDE(IDC_Effect7, m_hEffectDisplayA[6]) + MAP_OVERRIDE(IDC_Effect8, m_hEffectDisplayA[7]) + MAP_OVERRIDE(IDC_Effect9, m_hEffectDisplayA[8]) + MAP_OVERRIDE(IDC_Effect10, m_hEffectDisplayA[9]) + END_MAP_CHILD_CONTROLS() + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnDestroy(); + //HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) {return S_OK;} + + virtual void InitDataAssociations(int iPad, AbstractContainerMenu *menu, int startIndex = 0); + + virtual HRESULT handleCustomTimer( XUIMessageTimer *pTimer, BOOL& bHandled ); + +private: + float m_effectDisplayHeight; + float m_effectDisplaySpacing; + float m_effectAreaHeight; + + CXuiCtrlSlotList* m_armorGroup; + + CXuiControl m_sceneGroup; + + CXuiControl m_effectsGroup; + CXuiCtrlMobEffect *m_hEffectDisplayA[MAX_EFFECTS]; + + virtual CXuiControl* GetSectionControl( ESceneSection eSection ); + virtual CXuiCtrlSlotList* GetSectionSlotList( ESceneSection eSection ); + + void updateEffectsDisplay(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_Inventory_Creative.cpp b/Minecraft.Client/Common/XUI/XUI_Scene_Inventory_Creative.cpp new file mode 100644 index 00000000..0793fc9e --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Inventory_Creative.cpp @@ -0,0 +1,209 @@ +#include "stdafx.h" + +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" + +#include "..\..\..\Minecraft.World\Container.h" +#include "..\..\..\Minecraft.World\Slot.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.player.h" + +#include "..\..\..\Minecraft.World\net.minecraft.stats.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\Common\Tutorial\Tutorial.h" +#include "..\..\Common\Tutorial\TutorialMode.h" +#include "..\..\Minecraft.h" + +#include "XUI_Scene_AbstractContainer.h" +#include "XUI_Ctrl_SlotItem.h" +#include "XUI_Ctrl_SlotList.h" +#include "XUI_Ctrl_SlotItemListItem.h" + +#include "..\..\Common\Potion_macros.h" + +//-------------------------------------------------------------------------------------- +// Name: CXuiSceneInventoryCreative::OnInit +// Desc: Message handler for XM_INIT +//-------------------------------------------------------------------------------------- +HRESULT CXuiSceneInventoryCreative::OnInit( XUIMessageInit *pInitData, BOOL &bHandled ) +{ + D3DXVECTOR3 vec; + MapChildControls(); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + InventoryScreenInput *initData = (InventoryScreenInput *)pInitData->pvInitData; + m_iPad=initData->iPad; + m_bSplitscreen=initData->bSplitscreen; + + // if we are in splitscreen, then we need to figure out if we want to move this scene + + if(m_bSplitscreen) + { + if(m_bSplitscreen) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + } + } + +#ifdef _XBOX + if( pMinecraft->localgameModes[initData->iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[initData->iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Creative_Inventory_Menu, this); + } +#endif + + // 4J JEV - Does this still count as opening the inventory? + initData->player->awardStat(GenericStats::openInventory(), GenericStats::param_noArgs()); + + // 4J JEV - Item Picker Menu + shared_ptr creativeContainer = shared_ptr(new SimpleContainer( 0, TabSpec::MAX_SIZE + 9 )); + itemPickerMenu = new ItemPickerMenu(creativeContainer, initData->player->inventory); + + // 4J JEV - InitDataAssociations. + m_containerControl->SetData( initData->iPad, itemPickerMenu, TabSpec::rows, TabSpec::columns, 0, TabSpec::MAX_SIZE ); + m_useRowControl->SetData( initData->iPad, itemPickerMenu, 1, 9, TabSpec::MAX_SIZE, TabSpec::MAX_SIZE + 9 ); + m_pointerControl->SetUserIndex(m_pointerControl->m_hObj, initData->iPad); + + // Initialize superclass. + CXuiSceneAbstractContainer::Initialize( initData->iPad, itemPickerMenu, false, -1, eSectionInventoryCreativeUsing, eSectionInventoryCreativeMax, initData->bNavigateBack ); + + delete initData; + + // Change the point at which the cursor stops so we can't move the pointer over the tabs + D3DXVECTOR3 containerPos; + m_containerControl->GetPosition(&containerPos); + m_fPointerMinY += containerPos.y; + + // 4J JEV - Settup Tabs + for (int i = 0; i < eCreativeInventoryTab_COUNT; i++) + { + m_hTabGroupA[i].SetShow(FALSE); + } + + m_curTab = eCreativeInventoryTab_COUNT; + switchTab(eCreativeInventoryTab_BuildingBlocks); + + return S_OK; +} + +HRESULT CXuiSceneInventoryCreative::OnDestroy() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + +#ifdef _XBOX + if( pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + if(gameMode != NULL) gameMode->getTutorial()->changeTutorialState(m_previousTutorialState); + } +#endif + + // 4J Stu - Fix for #11302 - TCR 001: Network Connectivity: Host crashed after being killed by the client while accessing a chest during burst packet loss. + // We need to make sure that we call closeContainer() anytime this menu is closed, even if it is forced to close by some other reason (like the player dying) + if(Minecraft::GetInstance()->localplayers[m_iPad] != NULL) Minecraft::GetInstance()->localplayers[m_iPad]->closeContainer(); + return S_OK; +} + +////////////////////////////////////////////////////////////////////////// +// +// OnTransitionEnd +// +////////////////////////////////////////////////////////////////////////// +HRESULT CXuiSceneInventoryCreative::OnTransitionEnd( XUIMessageTransition *pTransData, BOOL& bHandled ) +{ + // are we being destroyed? If so, don't do anything + if(pTransData->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) + { + return S_OK; + } + + // Fix for issue caused by autosave while crafting is up + if(pTransData->dwTransType == XUI_TRANSITION_TO || pTransData->dwTransType == XUI_TRANSITION_BACKTO) + { + for(int i=0;im_icon,NULL,specs[i]->m_icon); + XuiElementSetShow(m_hGroupIconA[i].m_hObj,TRUE); + } + } + + return S_OK; +} + +CXuiControl* CXuiSceneInventoryCreative::GetSectionControl( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionInventoryCreativeUsing: + return (CXuiControl *)m_useRowControl; + break; + case eSectionInventoryCreativeSelector: + return (CXuiControl *)m_containerControl; + break; + default: + assert( false ); + break; + } + return NULL; +} + +CXuiCtrlSlotList* CXuiSceneInventoryCreative::GetSectionSlotList( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionInventoryCreativeUsing: + return m_useRowControl; + break; + case eSectionInventoryCreativeSelector: + return m_containerControl; + break; + default: + assert( false ); + break; + } + return NULL; +} + +void CXuiSceneInventoryCreative::updateTabHighlightAndText(ECreativeInventoryTabs tab) +{ + if (m_curTab < eCreativeInventoryTab_COUNT) + { + m_hTabGroupA[m_curTab].SetShow(FALSE); + } + + m_hTabGroupA[tab].SetShow(TRUE); + wstring wsText=app.GetString(specs[tab]->m_descriptionId); + m_GroupDescription.SetText(wsText.c_str()); + m_GroupDescription.SetShow(TRUE); +} + +void CXuiSceneInventoryCreative::updateScrollCurrentPage(int currentPage, int pageCount) +{ + m_pageSlider.SetEnable(pageCount > 1); + + if(pageCount == 1) + { + m_pageSlider.SetRange(0,1); + m_pageSlider.SetValue(0); + } + else + { + m_pageSlider.SetRange(0,pageCount - 1); + m_pageSlider.SetValue(currentPage - 1); + } + + m_scrollUp.SetShow(currentPage > 1); + m_scrollUp.PlayOptionalVisual(L"ScrollMore",L"EndScrollMore"); + + + m_scrollDown.SetShow(currentPage < pageCount); + m_scrollDown.PlayOptionalVisual(L"ScrollMore",L"EndScrollMore"); + + //wchar_t pageNum[10]; + //swprintf(pageNum,10,L"%d/%d",currentPage,pageCount); + //m_pageNumber.SetText(pageNum); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_Inventory_Creative.h b/Minecraft.Client/Common/XUI/XUI_Scene_Inventory_Creative.h new file mode 100644 index 00000000..bb3ff976 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Inventory_Creative.h @@ -0,0 +1,104 @@ +#pragma once +using namespace std; + +#include "..\Media\xuiscene_inventory_creative.h" +#include "XUI_Scene_AbstractContainer.h" +#include "XUI_CustomMessages.h" +#include "..\..\..\Minecraft.World\AbstractContainerMenu.h" +#include "..\..\..\Minecraft.World\SimpleContainer.h" + +#include "..\UI\IUIScene_CreativeMenu.h" + +#include + +//-------------------------------------------------------------------------------------- +// Scene implementation class. +//-------------------------------------------------------------------------------------- +class CXuiSceneInventoryCreative : public CXuiSceneAbstractContainer, public IUIScene_CreativeMenu +{ +public: + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CXuiSceneInventoryCreative, L"CXuiSceneInventoryCreative", XUI_CLASS_SCENE ) + +protected: + + CXuiControl m_hTabGroupA[eCreativeInventoryTab_COUNT]; + CXuiControl m_hGroupIconA[eCreativeInventoryTab_COUNT]; + CXuiElement m_Group; + CXuiControl m_GroupDescription; + + CXuiSlider m_pageSlider; + CXuiControl m_scrollUp, m_scrollDown;//, m_pageNumber; + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN( OnKeyDown ) + XUI_ON_XM_DESTROY( OnDestroy ) + XUI_ON_XM_TIMER( OnTimer ) // Poll stick input on a timer. + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + XUI_ON_XM_TRANSITION_START(OnTransitionStart) + XUI_ON_XM_TRANSITION_END( OnTransitionEnd) + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_Group, m_sceneGroup) + BEGIN_MAP_CHILD_CONTROLS( m_sceneGroup ) + // Common to all abstract container scenes + MAP_OVERRIDE(IDC_UseRow, m_useRowControl) + MAP_OVERRIDE(IDC_Pointer, m_pointerControl) + MAP_OVERRIDE(IDC_Container, m_containerControl) + + MAP_CONTROL(IDC_XuiSlider,m_pageSlider) + //MAP_CONTROL(IDC_PageNumber,m_pageNumber) + MAP_CONTROL(IDC_ScrollDown,m_scrollDown) + MAP_CONTROL(IDC_ScrollUp,m_scrollUp) + + MAP_CONTROL(IDC_InventoryText,m_GroupDescription) + + // 4J JEV - Tabs + MAP_CONTROL(IDC_Group_Tab_Icons, m_Group) + BEGIN_MAP_CHILD_CONTROLS(m_Group) + MAP_CONTROL(IDC_Icon_1,m_hGroupIconA[0]) + MAP_CONTROL(IDC_Icon_2,m_hGroupIconA[1]) + MAP_CONTROL(IDC_Icon_3,m_hGroupIconA[2]) + MAP_CONTROL(IDC_Icon_4,m_hGroupIconA[3]) + MAP_CONTROL(IDC_Icon_5,m_hGroupIconA[4]) + MAP_CONTROL(IDC_Icon_6,m_hGroupIconA[5]) + MAP_CONTROL(IDC_Icon_7,m_hGroupIconA[6]) + MAP_CONTROL(IDC_Icon_8,m_hGroupIconA[7]) + END_MAP_CHILD_CONTROLS() + MAP_CONTROL(IDC_Group_Tab_Images, m_Group) + BEGIN_MAP_CHILD_CONTROLS(m_Group) + MAP_CONTROL(IDC_TabImage1,m_hTabGroupA[0]) + MAP_CONTROL(IDC_TabImage2,m_hTabGroupA[1]) + MAP_CONTROL(IDC_TabImage3,m_hTabGroupA[2]) + MAP_CONTROL(IDC_TabImage4,m_hTabGroupA[3]) + MAP_CONTROL(IDC_TabImage5,m_hTabGroupA[4]) + MAP_CONTROL(IDC_TabImage6,m_hTabGroupA[5]) + MAP_CONTROL(IDC_TabImage7,m_hTabGroupA[6]) + MAP_CONTROL(IDC_TabImage8,m_hTabGroupA[7]) + END_MAP_CHILD_CONTROLS() + + END_MAP_CHILD_CONTROLS() + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnDestroy(); + HRESULT OnTransitionEnd( XUIMessageTransition *pTransData, BOOL& bHandled); + //HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) {return S_OK;} + +private: + CXuiControl m_sceneGroup; + + virtual CXuiControl* GetSectionControl( ESceneSection eSection ); + virtual CXuiCtrlSlotList* GetSectionSlotList( ESceneSection eSection ); + + CXuiCtrlSlotList* m_containerControl; + +private: + // IUIScene_CreativeMenu + void updateTabHighlightAndText(ECreativeInventoryTabs tab); + void updateScrollCurrentPage(int currentPage, int pageCount); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_Trading.cpp b/Minecraft.Client/Common/XUI/XUI_Scene_Trading.cpp new file mode 100644 index 00000000..fec13460 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Trading.cpp @@ -0,0 +1,320 @@ +#include "stdafx.h" + +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.trading.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\Common\Tutorial\Tutorial.h" +#include "..\..\Common\Tutorial\TutorialMode.h" +#include "..\..\Common\Tutorial\TutorialEnum.h" +#include "..\..\Minecraft.h" +#include "XUI_Ctrl_SlotList.h" +#include "XUI_Scene_Trading.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\JavaMath.h" + +//-------------------------------------------------------------------------------------- +// Name: CXuiSceneTrading::OnInit +// Desc: Message handler for XM_INIT +//-------------------------------------------------------------------------------------- +HRESULT CXuiSceneTrading::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + MapChildControls(); + + //XuiControlSetText(m_villagerText,app.GetString(IDS_VILLAGER)); + XuiControlSetText(m_inventoryLabel,app.GetString(IDS_INVENTORY)); + XuiControlSetText(m_requiredLabel,app.GetString(IDS_REQUIRED_ITEMS_FOR_TRADE)); + + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + TradingScreenInput* initData = (TradingScreenInput *)pInitData->pvInitData; + m_iPad=initData->iPad; + m_bSplitscreen=initData->bSplitscreen; + m_merchant = initData->trader; + + // if we are in splitscreen, then we need to figure out if we want to move this scene + + if(m_bSplitscreen) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + } + + if( pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Trading_Menu, this); + } + + m_menu = new MerchantMenu( initData->inventory, initData->trader, initData->level ); + Minecraft::GetInstance()->localplayers[m_iPad]->containerMenu = m_menu; + + // TODO Inventory dimensions need defined as constants + m_inventoryControl->SetData( m_iPad, m_menu, 3, 9, MerchantMenu::INV_SLOT_START, MerchantMenu::INV_SLOT_END ); + + // TODO Inventory dimensions need defined as constants + m_useRowControl->SetData( m_iPad, m_menu, 1, 9, MerchantMenu::USE_ROW_SLOT_START, MerchantMenu::USE_ROW_SLOT_END ); + + delete initData; + + D3DXVECTOR3 vec; + // store the slot 0 position + m_tradeHSlots[0]->GetPosition(&m_vTradeSlot0Pos); + m_tradeHSlots[1]->GetPosition(&vec); + m_fSlotSize=vec.x-m_vTradeSlot0Pos.x; + + // store the slot 0 highlight position + m_tradingSelector.GetPosition(&m_vSelectorInitialPos); + + //app.SetRichPresenceContextValue(m_iPad,CONTEXT_GAME_STATE_FORGING); + + XuiSetTimer(m_hObj,TRADING_UPDATE_TIMER_ID,TRADING_UPDATE_TIMER_TIME); + + ui.SetTooltips(m_iPad, -1, IDS_TOOLTIPS_EXIT); + + return S_OK; +} + +HRESULT CXuiSceneTrading::OnDestroy() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if( pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + if(gameMode != NULL) gameMode->getTutorial()->changeTutorialState(m_previousTutorialState); + } + + // 4J Stu - Fix for #11302 - TCR 001: Network Connectivity: Host crashed after being killed by the client while accessing a chest during burst packet loss. + // We need to make sure that we call closeContainer() anytime this menu is closed, even if it is forced to close by some other reason (like the player dying) + if(Minecraft::GetInstance()->localplayers[m_iPad] != NULL) Minecraft::GetInstance()->localplayers[m_iPad]->closeContainer(); + return S_OK; +} + +HRESULT CXuiSceneTrading::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ) +{ + if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) return S_OK; + + if(pTransition->dwTransType == XUI_TRANSITION_TO || pTransition->dwTransType == XUI_TRANSITION_BACKTO) + { + HXUIOBJ hObj=NULL; + HRESULT hr=XuiControlGetVisual(m_offerInfoControl.m_hObj,&hObj); + hr=XuiElementGetChildById(hObj,L"text_measurer",&m_hOfferInfoTextMeasurer); + hr=XuiElementGetChildById(hObj,L"text_name",&m_hOfferInfoText); + hr=XuiElementGetChildById(hObj,L"text_panel",&m_hOfferInfoTextBkg); + } + + return S_OK; +} + +HRESULT CXuiSceneTrading::OnKeyDown(XUIMessageInput *pInputData, BOOL& bHandled) +{ + bHandled = handleKeyDown(pInputData->UserIndex, mapVKToAction(pInputData->dwKeyCode), (pInputData->dwFlags & XUI_INPUT_FLAG_REPEAT) != 0); + + return S_OK; +} + +HRESULT CXuiSceneTrading::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) +{ + bHandled=true; + return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining); +} + +HRESULT CXuiSceneTrading::OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ) +{ + if(pTimer->nId == TRADING_UPDATE_TIMER_ID) + { + handleTick(); + bHandled = TRUE; + } + return S_OK; +} + +int CXuiSceneTrading::mapVKToAction(int vk) +{ + int action = MINECRAFT_ACTION_MAX; + switch(vk) + { + case VK_PAD_A: + action = ACTION_MENU_A; + break; + case VK_PAD_B: + case VK_PAD_START: + action = ACTION_MENU_B; + break; + case VK_PAD_X: + action = ACTION_MENU_X; + break; + case VK_PAD_Y: + action = ACTION_MENU_Y; + break; + case VK_PAD_DPAD_LEFT: + case VK_PAD_LTHUMB_LEFT: + action = ACTION_MENU_LEFT; + break; + case VK_PAD_DPAD_RIGHT: + case VK_PAD_LTHUMB_RIGHT: + action = ACTION_MENU_RIGHT; + break; + case VK_PAD_LTHUMB_UP: + case VK_PAD_DPAD_UP: + action = ACTION_MENU_UP; + break; + case VK_PAD_LTHUMB_DOWN: + case VK_PAD_DPAD_DOWN: + action = ACTION_MENU_DOWN; + break; + case VK_PAD_LTRIGGER: + action = ACTION_MENU_PAGEUP; + break; + case VK_PAD_RTRIGGER: + action = ACTION_MENU_PAGEDOWN; + break; + case VK_PAD_LSHOULDER: + action = ACTION_MENU_LEFT_SCROLL; + break; + case VK_PAD_RSHOULDER: + action = ACTION_MENU_RIGHT_SCROLL; + break; + case VK_PAD_RTHUMB_UP: + action = ACTION_MENU_OTHER_STICK_UP; + break; + case VK_PAD_RTHUMB_DOWN: + action = ACTION_MENU_OTHER_STICK_DOWN; + break; + case VK_PAD_RTHUMB_RIGHT: + action = ACTION_MENU_OTHER_STICK_RIGHT; + break; + case VK_PAD_RTHUMB_LEFT: + action = ACTION_MENU_OTHER_STICK_LEFT; + break; + }; + + return action; +} + +void CXuiSceneTrading::showScrollRightArrow(bool show) +{ + m_scrollRight.SetShow(show?TRUE:FALSE); + m_scrollRight.PlayOptionalVisual(L"ScrollMore",L"EndScrollMore"); +} + +void CXuiSceneTrading::showScrollLeftArrow(bool show) +{ + m_scrollLeft.SetShow(show?TRUE:FALSE); + m_scrollLeft.PlayOptionalVisual(L"ScrollMore",L"EndScrollMore"); +} + +void CXuiSceneTrading::moveSelector(bool right) +{ + D3DXVECTOR3 vec; + + vec.z=0.0f; + vec.x=m_vSelectorInitialPos.x + (m_selectedSlot*m_fSlotSize); + vec.y=m_vSelectorInitialPos.y; + m_tradingSelector.SetPosition(&vec); +} + +void CXuiSceneTrading::setTitle(const wstring &name) +{ + XuiControlSetText(m_villagerText,name.c_str()); +} + +void CXuiSceneTrading::setRequest1Name(const wstring &name) +{ + m_request1Label.SetText(name.c_str()); +} + +void CXuiSceneTrading::setRequest2Name(const wstring &name) +{ + m_request2Label.SetText(name.c_str()); +} + +void CXuiSceneTrading::setRequest1RedBox(bool show) +{ + m_request1Control->SetRedBox(show?TRUE:FALSE); +} + +void CXuiSceneTrading::setRequest2RedBox(bool show) +{ + m_request2Control->SetRedBox(show?TRUE:FALSE); +} + +void CXuiSceneTrading::setTradeRedBox(int index, bool show) +{ + m_tradeHSlots[index]->SetRedBox(show?TRUE:FALSE); +} + +void CXuiSceneTrading::setRequest1Item(shared_ptr item) +{ + m_request1Control->SetIcon(getPad(), item, 12, 31, true); +} + +void CXuiSceneTrading::setRequest2Item(shared_ptr item) +{ + m_request2Control->SetIcon(getPad(), item, 12, 31, true); +} + +void CXuiSceneTrading::setTradeItem(int index, shared_ptr item) +{ + m_tradeHSlots[index]->SetIcon(getPad(), item, 12, 31, true); +} + +void CXuiSceneTrading::setOfferDescription(const wstring &name, vector &unformattedStrings) +{ + if(name.empty()) + { + m_offerInfoControl.SetText(L""); + m_offerInfoControl.SetShow(FALSE); + return; + } + + bool smallPointer = m_bSplitscreen || (!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()); + wstring desc = L"(smallPointer ? 12 :14) + L"\">" + name + L""; + + XUIRect tempXuiRect, xuiRect; + HRESULT hr; + xuiRect.right = 0; + + for(AUTO_VAR(it, unformattedStrings.begin()); it != unformattedStrings.end(); ++it) + { + XuiTextPresenterMeasureText(m_hOfferInfoTextMeasurer, (*it).c_str(), &tempXuiRect); + if(tempXuiRect.right > xuiRect.right) xuiRect = tempXuiRect; + } + + // Set size with the new width so that the HTML height check is correct + XuiElementSetBounds(m_hOfferInfoTextBkg,xuiRect.right+4.0f+4.0f+4.0f,xuiRect.bottom); // edge graphics are 8 pixels, with 4 for the border, extra 4 for the background is fudge + XuiElementSetBounds(m_hOfferInfoText,xuiRect.right+4.0f+4.0f,xuiRect.bottom); // edge graphics are 8 pixels, text is centred + + XuiHtmlSetText(m_hOfferInfoText, desc.c_str() ); + + // Check if we need to resize the box + XUIContentDims contentDims; + XuiHtmlGetContentDims(m_hOfferInfoText,&contentDims); + xuiRect.bottom = contentDims.nContentHeight; + + // Set the new height + float backgroundWidth = xuiRect.right+4.0f+4.0f+4.0f; + XuiElementSetBounds(m_hOfferInfoTextBkg,backgroundWidth,xuiRect.bottom+4.0f+4.0f); // edge graphics are 8 pixels, with 4 for the border, extra 4 for the background is fudge + XuiElementSetBounds(m_hOfferInfoText,xuiRect.right+4.0f+4.0f,xuiRect.bottom+4.0f+4.0f); // edge graphics are 8 pixels, text is centred + + m_offerInfoControl.SetShow(TRUE); + + D3DXVECTOR3 highlightPos, offerInfoPos; + float highlightWidth, highlightHeight; + m_tradingSelector.GetPosition(&highlightPos); + m_tradingSelector.GetBounds(&highlightWidth,&highlightHeight); + m_offerInfoControl.GetPosition(&offerInfoPos); + + if(m_selectedSlot < DISPLAY_TRADES_COUNT/2) + { + // Display on the right + offerInfoPos.x = Math::round(highlightPos.x + highlightWidth * 1.1); + } + else + { + // Display on the left + offerInfoPos.x = Math::round(highlightPos.x - backgroundWidth - highlightWidth * 0.1); + } + m_offerInfoControl.SetPosition(&offerInfoPos); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_Trading.h b/Minecraft.Client/Common/XUI/XUI_Scene_Trading.h new file mode 100644 index 00000000..72194cbc --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Trading.h @@ -0,0 +1,128 @@ +#pragma once +using namespace std; +#include "..\Media\xuiscene_trading.h" +#include "..\UI\IUIScene_TradingMenu.h" + +#define TRADING_UPDATE_TIMER_ID (10) +#define TRADING_UPDATE_TIMER_TIME (50) + +//-------------------------------------------------------------------------------------- +// Scene implementation class. +//-------------------------------------------------------------------------------------- +class CXuiSceneTrading : public CXuiSceneImpl, public IUIScene_TradingMenu +{ +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CXuiSceneTrading, L"CXuiSceneTrading", XUI_CLASS_SCENE ) + +private: + CXuiCtrlCraftIngredientSlot *m_request1Control; + CXuiCtrlCraftIngredientSlot *m_request2Control; + + CXuiCtrlCraftIngredientSlot *m_tradeHSlots[7]; + + CXuiControl m_request1Label, m_request2Label; + CXuiControl m_inventoryLabel, m_requiredLabel; + + CXuiControl m_villagerText; + CXuiControl m_scrollLeft, m_scrollRight, m_tradingSelector; + + CXuiControl m_sceneGroup; + CXuiElement m_hGridInventory; + + CXuiCtrlSlotList* m_inventoryControl; + CXuiCtrlSlotList* m_useRowControl; + + CXuiControl m_offerInfoControl; + HXUIOBJ m_hOfferInfoTextMeasurer; + HXUIOBJ m_hOfferInfoText; + HXUIOBJ m_hOfferInfoTextBkg; + +protected: + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN( OnKeyDown ) + XUI_ON_XM_DESTROY( OnDestroy ) + XUI_ON_XM_TIMER( OnTimer ) + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + XUI_ON_XM_TRANSITION_START(OnTransitionStart) + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_Group, m_sceneGroup) + BEGIN_MAP_CHILD_CONTROLS( m_sceneGroup ) + MAP_OVERRIDE(IDC_Request1, m_request1Control) + MAP_OVERRIDE(IDC_Request2, m_request2Control) + + MAP_OVERRIDE(IDC_TradingBar0, m_tradeHSlots[0]) + MAP_OVERRIDE(IDC_TradingBar1, m_tradeHSlots[1]) + MAP_OVERRIDE(IDC_TradingBar2, m_tradeHSlots[2]) + MAP_OVERRIDE(IDC_TradingBar3, m_tradeHSlots[3]) + MAP_OVERRIDE(IDC_TradingBar4, m_tradeHSlots[4]) + MAP_OVERRIDE(IDC_TradingBar5, m_tradeHSlots[5]) + MAP_OVERRIDE(IDC_TradingBar6, m_tradeHSlots[6]) + + MAP_CONTROL(IDC_Offer1Label, m_request1Label) + MAP_CONTROL(IDC_Offer2Label, m_request2Label) + + MAP_CONTROL(IDC_VillagerText,m_villagerText) + MAP_CONTROL(IDC_InventoryLabel,m_inventoryLabel) + MAP_CONTROL(IDC_RequiredLabel,m_requiredLabel) + + MAP_CONTROL(IDC_ScrollLeftArrow,m_scrollLeft) + MAP_CONTROL(IDC_ScrollRightArrow,m_scrollRight) + MAP_CONTROL(IDC_TradingSelector,m_tradingSelector) + + MAP_CONTROL(IDC_HtmlTextPanel,m_offerInfoControl) + + MAP_CONTROL(IDC_InventoryGrid, m_hGridInventory) + BEGIN_MAP_CHILD_CONTROLS(m_hGridInventory) + MAP_OVERRIDE(IDC_Inventory, m_inventoryControl) + MAP_OVERRIDE(IDC_UseRow, m_useRowControl) + END_MAP_CHILD_CONTROLS() + END_MAP_CHILD_CONTROLS() + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnDestroy(); + HRESULT OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ); + HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled); + HRESULT OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ); + +protected: + int m_iPad; + D3DXVECTOR3 m_OriginalPosition; + bool m_bSplitscreen; + +public: + int getPad() { return m_iPad; } + +private: + + float m_fSlotSize; + D3DXVECTOR3 m_vTradeSlot0Pos; + D3DXVECTOR3 m_vSelectorInitialPos; + + int mapVKToAction(int vk); +protected: + virtual void showScrollRightArrow(bool show); + virtual void showScrollLeftArrow(bool show); + virtual void moveSelector(bool right); + virtual void setRequest1Name(const wstring &name); + virtual void setRequest2Name(const wstring &name); + virtual void setTitle(const wstring &name); + + virtual void setRequest1RedBox(bool show); + virtual void setRequest2RedBox(bool show); + virtual void setTradeRedBox(int index, bool show); + + virtual void setRequest1Item(shared_ptr item); + virtual void setRequest2Item(shared_ptr item); + virtual void setTradeItem(int index, shared_ptr item); + + virtual void setOfferDescription(const wstring &name, vector &unformattedStrings); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_Trap.cpp b/Minecraft.Client/Common/XUI/XUI_Scene_Trap.cpp new file mode 100644 index 00000000..99dc6e4c --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Trap.cpp @@ -0,0 +1,122 @@ +#include "stdafx.h" + +#include "..\..\..\Minecraft.World\DispenserTileEntity.h" +#include "..\..\..\Minecraft.World\TrapMenu.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "XUI_Ctrl_SlotList.h" +#include "XUI_Scene_Trap.h" +#include "..\..\Common\Tutorial\Tutorial.h" +#include "..\..\Common\Tutorial\TutorialMode.h" +#include "..\..\Common\Tutorial\TutorialEnum.h" + +//-------------------------------------------------------------------------------------- +// Name: CXuiSceneTrap::OnInit +// Desc: Message handler for XM_INIT +//-------------------------------------------------------------------------------------- +HRESULT CXuiSceneTrap::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + D3DXVECTOR3 vec; + MapChildControls(); + + XuiControlSetText(m_DispenserText,app.GetString(IDS_DISPENSER)); + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + TrapScreenInput* initData = (TrapScreenInput*)pInitData->pvInitData; + m_iPad=initData->iPad; + m_bSplitscreen=initData->bSplitscreen; + +#ifdef _XBOX + if( pMinecraft->localgameModes[initData->iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[initData->iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Trap_Menu, this); + } +#endif + // if we are in splitscreen, then we need to figure out if we want to move this scene + + if(m_bSplitscreen) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + } + + TrapMenu* menu = new TrapMenu( initData->inventory, initData->trap ); + + InitDataAssociations(initData->iPad, menu); + + CXuiSceneAbstractContainer::Initialize( initData->iPad, menu, true, initData->trap->getContainerSize(), eSectionTrapUsing, eSectionTrapMax ); + + delete initData; + + return S_OK; +} + +HRESULT CXuiSceneTrap::OnDestroy() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + +#ifdef _XBOX + if( pMinecraft->localgameModes[m_iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[m_iPad]; + if(gameMode != NULL) gameMode->getTutorial()->changeTutorialState(m_previousTutorialState); + } +#endif + + // 4J Stu - Fix for #11302 - TCR 001: Network Connectivity: Host crashed after being killed by the client while accessing a chest during burst packet loss. + // We need to make sure that we call closeContainer() anytime this menu is closed, even if it is forced to close by some other reason (like the player dying) + if(Minecraft::GetInstance()->localplayers[m_iPad] != NULL) Minecraft::GetInstance()->localplayers[m_iPad]->closeContainer(); + return S_OK; +} + +CXuiControl* CXuiSceneTrap::GetSectionControl( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionTrapTrap: + return (CXuiControl *)m_trapControl; + break; + case eSectionTrapInventory: + return (CXuiControl *)m_inventoryControl; + break; + case eSectionTrapUsing: + return (CXuiControl *)m_useRowControl; + break; + default: + assert( false ); + break; + } + return NULL; +} + +CXuiCtrlSlotList* CXuiSceneTrap::GetSectionSlotList( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionTrapTrap: + return m_trapControl; + break; + case eSectionTrapInventory: + return m_inventoryControl; + break; + case eSectionTrapUsing: + return m_useRowControl; + break; + default: + assert( false ); + break; + } + return NULL; +} + +// 4J Stu - Added to support auto-save. Need to re-associate on a navigate back +void CXuiSceneTrap::InitDataAssociations(int iPad, AbstractContainerMenu *menu, int startIndex /*= 0*/) +{ + int containerSize = menu->getSize() - (27 + 9); + + // TODO Inventory dimensions need defined as constants + m_trapControl->SetData( iPad, menu, 3, 3, 0 ); + + CXuiSceneAbstractContainer::InitDataAssociations(iPad, menu, containerSize); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_Trap.h b/Minecraft.Client/Common/XUI/XUI_Scene_Trap.h new file mode 100644 index 00000000..3008a7ca --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Trap.h @@ -0,0 +1,62 @@ +#pragma once +using namespace std; +#include "..\Media\xuiscene_trap.h" +#include "XUI_Scene_AbstractContainer.h" +#include "..\UI\IUIScene_DispenserMenu.h" +#include "XUI_CustomMessages.h" + +class Container; +class DispenserTileEntity; + +//-------------------------------------------------------------------------------------- +// Scene implementation class. +//-------------------------------------------------------------------------------------- +class CXuiSceneTrap : public CXuiSceneAbstractContainer, public IUIScene_DispenserMenu +{ +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CXuiSceneTrap, L"CXuiSceneTrap", XUI_CLASS_SCENE ) + +protected: + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN( OnKeyDown ) + XUI_ON_XM_DESTROY( OnDestroy ) + XUI_ON_XM_TIMER( OnTimer ) // Poll stick input on a timer. + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + XUI_ON_XM_TRANSITION_START(OnTransitionStart) + + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + // Common to all abstract container scenes + MAP_CONTROL(IDC_Group, m_sceneGroup) + BEGIN_MAP_CHILD_CONTROLS( m_sceneGroup ) + + MAP_OVERRIDE(IDC_Inventory, m_inventoryControl) + MAP_OVERRIDE(IDC_UseRow, m_useRowControl) + MAP_OVERRIDE(IDC_Pointer, m_pointerControl) + MAP_CONTROL(IDC_InventoryText,m_InventoryText) + + MAP_CONTROL(IDC_DispenserText,m_DispenserText) + MAP_OVERRIDE(IDC_Trap, m_trapControl) + END_MAP_CHILD_CONTROLS() + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnDestroy(); + //HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) {return S_OK;} + + virtual void InitDataAssociations(int iPad, AbstractContainerMenu *menu, int startIndex = 0); +private: + CXuiCtrlSlotList* m_trapControl; + CXuiControl m_sceneGroup; + CXuiControl m_DispenserText; + + virtual CXuiControl* GetSectionControl( ESceneSection eSection ); + virtual CXuiCtrlSlotList* GetSectionSlotList( ESceneSection eSection ); + +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_Win.cpp b/Minecraft.Client/Common/XUI/XUI_Scene_Win.cpp new file mode 100644 index 00000000..0f0c678b --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Win.cpp @@ -0,0 +1,302 @@ +// Minecraft.cpp : Defines the entry point for the application. +// + +#include "stdafx.h" +#include "..\..\Minecraft.h" +#include "..\..\Common\Tutorial\TutorialMode.h" +#include "..\..\Font.h" +#include "..\..\..\Minecraft.World\Random.h" +#include "..\..\..\Minecraft.World\SharedConstants.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "XUI_Scene_Win.h" + +BYTE CScene_Win::s_winUserIndex = 0; + +const float CScene_Win::AUTO_SCROLL_SPEED = 1.0f; +const float CScene_Win::PLAYER_SCROLL_SPEED = 3.0f; + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_Win::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + m_iPad = *(int *)pInitData->pvInitData; + + m_bIgnoreInput = false; + + MapChildControls(); + + // Display the tooltips + ui.SetTooltips( m_iPad, -1, IDS_TOOLTIPS_CONTINUE); + + wstring halfScreenLineBreaks; + + if(RenderManager.IsHiDef()) + { + // HD - 17 line page + halfScreenLineBreaks = L"










"; + } + else + { + // 480 - 14 line page + halfScreenLineBreaks = L"







"; + } + + noNoiseString = L""; + noNoiseString.append(halfScreenLineBreaks); + noNoiseString.append(halfScreenLineBreaks); + noNoiseString.append( app.GetString(IDS_WIN_TEXT) ); + noNoiseString.append( app.GetString(IDS_WIN_TEXT_PART_2) ); + noNoiseString.append( app.GetString(IDS_WIN_TEXT_PART_3) ); + + noNoiseString.append(halfScreenLineBreaks); + + noNoiseString.append( L"" ); + + noNoiseString = app.FormatHTMLString(m_iPad, noNoiseString, 0xff000000); + + Random random(8124371); + int found=(int)noNoiseString.find_first_of(L"{"); + int length; + while (found!=string::npos) + { + length = random.nextInt(4) + 3; + m_noiseLengths.push_back(length); + found=(int)noNoiseString.find_first_of(L"{",found+1); + } + + Minecraft *pMinecraft = Minecraft::GetInstance(); + + if(pMinecraft->localplayers[s_winUserIndex] != NULL) + { + noNoiseString = replaceAll(noNoiseString,L"{*PLAYER*}",pMinecraft->localplayers[s_winUserIndex]->name); + } + else + { + noNoiseString = replaceAll(noNoiseString,L"{*PLAYER*}",pMinecraft->localplayers[ProfileManager.GetPrimaryPad()]->name); + } + + updateNoise(); + + m_htmlControl.SetText(noiseString.c_str()); + + //wstring result = m_htmlControl.GetText(); + + //wcout << result.c_str(); + + m_scrollDir = 1; + HRESULT hr = XuiHtmlControlSetSmoothScroll(m_htmlControl.m_hObj, XUI_SMOOTHSCROLL_VERTICAL,TRUE,AUTO_SCROLL_SPEED,1.0f,AUTO_SCROLL_SPEED); + XuiHtmlControlVScrollBy(m_htmlControl.m_hObj,m_scrollDir * 1000); + + SetTimer(0,200); + + return S_OK; +} + +HRESULT CScene_Win::OnTimer( XUIMessageTimer *pXUIMessageTimer, BOOL &bHandled) +{ + if(!TreeHasFocus()) return S_OK; + + // This is required to animate the "noise" strings in the text, however this makes scrolling really jumpy + // as well as causing line lengths to change as we do not have a monspaced font. Disabling for now. +#if 0 + updateNoise(); + + XUIHtmlScrollInfo scrollInfo; + HRESULT hr = m_htmlControl.GetVScrollInfo(&scrollInfo); + m_htmlControl.SetText(noiseString.c_str()); + //wcout << noiseString.c_str(); + //hr = m_htmlControl.SetVScrollPos(scrollInfo.nPos+2); + hr = m_htmlControl.SetVScrollPos(scrollInfo.nPos); +#endif + XuiHtmlControlVScrollBy(m_htmlControl.m_hObj,m_scrollDir * 1000); + + return S_OK; +} + +HRESULT CScene_Win::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + switch(pInputData->dwKeyCode) + { + + case VK_PAD_B: + case VK_PAD_START: + case VK_ESCAPE: + { + KillTimer(0); + m_bIgnoreInput = true; + Minecraft *pMinecraft = Minecraft::GetInstance(); + app.CloseAllPlayersXuiScenes(); + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + if(pMinecraft->localplayers[i] != NULL) + { + app.SetAction(i,eAppAction_Respawn); + } + } + + // Show the other players scenes + CXuiSceneBase::ShowOtherPlayersBaseScene(pInputData->UserIndex, true); + // This just allows it to be shown + if(pMinecraft->localgameModes[ProfileManager.GetPrimaryPad()] != NULL) pMinecraft->localgameModes[ProfileManager.GetPrimaryPad()]->getTutorial()->showTutorialPopup(true); + ui.UpdatePlayerBasePositions(); + + rfHandled = TRUE; + } + break; + case VK_PAD_RTHUMB_UP: + case VK_PAD_LTHUMB_UP: + m_scrollDir = -1; + // Fall through + case VK_PAD_RTHUMB_DOWN: + case VK_PAD_LTHUMB_DOWN: + { + HRESULT hr = XuiHtmlControlSetSmoothScroll(m_htmlControl.m_hObj, XUI_SMOOTHSCROLL_VERTICAL,TRUE,AUTO_SCROLL_SPEED,1.0f,PLAYER_SCROLL_SPEED); + } + break; + } + + return S_OK; +} + +HRESULT CScene_Win::OnKeyUp(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + + switch(pInputData->dwKeyCode) + { + case VK_PAD_RTHUMB_UP: + case VK_PAD_LTHUMB_UP: + case VK_PAD_RTHUMB_DOWN: + case VK_PAD_LTHUMB_DOWN: + { + m_scrollDir = 1; + HRESULT hr = XuiHtmlControlSetSmoothScroll(m_htmlControl.m_hObj, XUI_SMOOTHSCROLL_VERTICAL,TRUE,AUTO_SCROLL_SPEED,1.0f,AUTO_SCROLL_SPEED); + } + break; + } + + return S_OK; +} + +HRESULT CScene_Win::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) +{ + bHandled=true; + return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining); +} + +void CScene_Win::updateNoise() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + noiseString = noNoiseString; + + int length = 0; + wchar_t replacements[64]; + wstring replaceString = L""; + wchar_t randomChar = L'a'; + Random *random = pMinecraft->font->random; + + bool darken = false; + + wstring tag = L"{*NOISE*}"; + + AUTO_VAR(it, m_noiseLengths.begin()); + int found=(int)noiseString.find_first_of(L"{"); + while (found!=string::npos && it != m_noiseLengths.end() ) + { + length = *it; + ++it; + + replaceString = L""; + for(int i = 0; i < length; ++i) + { + randomChar = SharedConstants::acceptableLetters[random->nextInt((int)SharedConstants::acceptableLetters.length())]; + + wstring randomCharStr = L""; + randomCharStr.push_back(randomChar); + if(randomChar == L'<') + { + randomCharStr = L"<"; + } + else if (randomChar == L'>' ) + { + randomCharStr = L">"; + } + else if(randomChar == L'"') + { + randomCharStr = L"""; + } + else if(randomChar == L'&') + { + randomCharStr = L"&"; + } + else if(randomChar == L'\\') + { + randomCharStr = L"\\\\"; + } + else if(randomChar == L'{') + { + randomCharStr = L"}"; + } + + int randomVal = random->nextInt(2); + eMinecraftColour colour = eHTMLColor_8; + if(randomVal == 1) colour = eHTMLColor_9; + else if(randomVal == 2) colour = eHTMLColor_a; + ZeroMemory(replacements,64*sizeof(wchar_t)); + swprintf(replacements,64,L"%ls",app.GetHTMLColour(colour),randomCharStr.c_str()); + replaceString.append(replacements); + } + + noiseString.replace( found, tag.length(), replaceString ); + + //int pos = 0; + //do { + // pos = random->nextInt(SharedConstants::acceptableLetters.length()); + //} while (pMinecraft->font->charWidths[ch + 32] != pMinecraft->font->charWidths[pos + 32]); + //ib.put(listPos + 256 + random->nextInt(2) + 8 + (darken ? 16 : 0)); + //ib.put(listPos + pos + 32); + + found=(int)noiseString.find_first_of(L"{",found+1); + } +} + +HRESULT CScene_Win::OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled) +{ + SetTimer(0,200); + + // turn off the gamertags in splitscreen for the primary player, since they are about to be made fullscreen + CXuiSceneBase::HideAllGameUIElements(); + + // Hide the other players scenes + CXuiSceneBase::ShowOtherPlayersBaseScene(ProfileManager.GetPrimaryPad(), false); + + // This just allows it to be shown + if(Minecraft::GetInstance()->localgameModes[ProfileManager.GetPrimaryPad()] != NULL) Minecraft::GetInstance()->localgameModes[ProfileManager.GetPrimaryPad()]->getTutorial()->showTutorialPopup(false); + + // Temporarily make this scene fullscreen + CXuiSceneBase::SetPlayerBaseScenePosition( ProfileManager.GetPrimaryPad(), CXuiSceneBase::e_BaseScene_Fullscreen ); + + // Display the tooltips + ui.SetTooltips( m_iPad, -1, IDS_TOOLTIPS_CONTINUE); + + XuiHtmlControlVScrollBy(m_htmlControl.m_hObj,m_scrollDir * 1000); + + return S_OK; +} + +HRESULT CScene_Win::OnNavForward(XUIMessageNavForward *pNavForwardData, BOOL& bHandled) +{ + XuiHtmlControlVScrollBy(m_htmlControl.m_hObj,0); + XUIHtmlScrollInfo scrollInfo; + HRESULT hr = m_htmlControl.GetVScrollInfo(&scrollInfo); + hr = m_htmlControl.SetVScrollPos(scrollInfo.nPos); + KillTimer(0); + + return S_OK; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Scene_Win.h b/Minecraft.Client/Common/XUI/XUI_Scene_Win.h new file mode 100644 index 00000000..7a5e9da0 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Scene_Win.h @@ -0,0 +1,58 @@ +#pragma once + +#include "../media/xuiscene_Win.h" +#include "XUI_CustomMessages.h" + +class CScene_Win : public CXuiSceneImpl +{ +private: + static const float AUTO_SCROLL_SPEED; + static const float PLAYER_SCROLL_SPEED; +protected: + CXuiHtmlControl m_htmlControl; + + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_TIMER( OnTimer ) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_KEYUP(OnKeyUp) + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + XUI_ON_XM_NAV_RETURN(OnNavReturn) + XUI_ON_XM_NAV_FORWARD(OnNavForward) + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_HtmlControl, m_htmlControl) + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnTimer( XUIMessageTimer *pXUIMessageTimer, BOOL &bHandled); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnKeyUp(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled); + HRESULT OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled); + HRESULT OnNavForward(XUIMessageNavForward *pNavForwardData, BOOL& bHandled); +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_Win, L"CScene_Win", XUI_CLASS_SCENE ) + +private: + bool m_bIgnoreInput; + int m_iPad; + D3DXVECTOR3 m_OriginalPosition; + wstring noNoiseString; + wstring noiseString; + int m_scrollDir; + + vector m_noiseLengths; + + void updateNoise(); + +public: + static BYTE s_winUserIndex; + static void setWinUserIndex(BYTE winUserIndex) { s_winUserIndex = winUserIndex; } +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_SettingsAll.cpp b/Minecraft.Client/Common/XUI/XUI_SettingsAll.cpp new file mode 100644 index 00000000..c6dc7118 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_SettingsAll.cpp @@ -0,0 +1,227 @@ +// Minecraft.cpp : Defines the entry point for the application. +// + +#include "stdafx.h" +#include "..\XUI\XUI_SettingsAll.h" + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_SettingsAll::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + //WCHAR TempString[256]; + m_iPad=*(int *)pInitData->pvInitData; + // if we're not in the game, we need to use basescene 0 + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + + MapChildControls(); + + XuiControlSetText(m_Buttons[BUTTON_ALL_OPTIONS],app.GetString(IDS_OPTIONS)); + XuiControlSetText(m_Buttons[BUTTON_ALL_AUDIO],app.GetString(IDS_AUDIO)); + XuiControlSetText(m_Buttons[BUTTON_ALL_CONTROL],app.GetString(IDS_CONTROL)); + XuiControlSetText(m_Buttons[BUTTON_ALL_GRAPHICS],app.GetString(IDS_GRAPHICS)); + XuiControlSetText(m_Buttons[BUTTON_ALL_UI],app.GetString(IDS_USER_INTERFACE)); + XuiControlSetText(m_Buttons[BUTTON_ALL_RESETTODEFAULTS],app.GetString(IDS_RESET_TO_DEFAULTS)); + + if(ProfileManager.GetPrimaryPad()!=m_iPad) + { + D3DXVECTOR3 vec,vecControl; + m_Buttons[BUTTON_ALL_AUDIO].SetShow(FALSE); + m_Buttons[BUTTON_ALL_AUDIO].SetEnable(FALSE); + m_Buttons[BUTTON_ALL_GRAPHICS].SetShow(FALSE); + m_Buttons[BUTTON_ALL_GRAPHICS].SetEnable(FALSE); + + float fButtonWidth, fButtonHeight; + m_Buttons[BUTTON_ALL_GRAPHICS].GetPosition(&vecControl); + m_Buttons[BUTTON_ALL_RESETTODEFAULTS].GetBounds(&fButtonWidth, &fButtonHeight); + m_Buttons[BUTTON_ALL_RESETTODEFAULTS].SetPosition(&vecControl); + + m_Buttons[BUTTON_ALL_CONTROL].GetPosition(&vec); + m_Buttons[BUTTON_ALL_UI].SetPosition(&vec); + + m_Buttons[BUTTON_ALL_AUDIO].GetPosition(&vec); + m_Buttons[BUTTON_ALL_CONTROL].SetPosition(&vec); + + // Resize the whole scene + float fWidth, fHeight; + GetBounds(&fWidth, &fHeight); + SetBounds(fWidth, vecControl.y+fButtonHeight); + } + + // if we're not in the game, we need to use basescene 0 + if(bNotInGame) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + CXuiSceneBase::ShowBackground( DEFAULT_XUI_MENU_USER, TRUE ); + } + else + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + CXuiSceneBase::ShowBackground( m_iPad, FALSE ); + } + + if(app.GetLocalPlayerCount()>1) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad,false); + CXuiSceneBase::ShowLogo( m_iPad, FALSE ); + } + else + { + if(bNotInGame) + { + CXuiSceneBase::ShowLogo( DEFAULT_XUI_MENU_USER, TRUE ); + } + else + { + CXuiSceneBase::ShowLogo( m_iPad, TRUE ); + } + } + + return S_OK; +} + + + + +HRESULT CScene_SettingsAll::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + HRESULT hr=S_OK; + + // Explicitly handle B button presses + switch(pInputData->dwKeyCode) + { + case VK_PAD_B: + case VK_ESCAPE: + // if the profile data has been changed, then force a profile write + // It seems we're allowed to break the 5 minute rule if it's the result of a user action + + app.CheckGameSettingsChanged(true,pInputData->UserIndex); + + app.NavigateBack(pInputData->UserIndex); + rfHandled = TRUE; + break; + } + + return hr; +} + +HRESULT CScene_SettingsAll::OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) +{ + // added so we can skip greyed out items + pControlNavigateData->hObjDest=XuiControlGetNavigation(pControlNavigateData->hObjSource,pControlNavigateData->nControlNavigate,TRUE,TRUE); + + if(pControlNavigateData->hObjDest!=NULL) + { + bHandled=TRUE; + } + + return S_OK; +} + +HRESULT CScene_SettingsAll::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ) +{ + //HRESULT hr; + if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) return S_OK; + + if(pTransition->dwTransType == XUI_TRANSITION_TO || pTransition->dwTransType == XUI_TRANSITION_BACKTO) + { + // 4J-PB - Going to resize buttons if the text is too big to fit on any of them (Br-pt problem with the length of Unlock Full Game) + } + + return S_OK; +} + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_SettingsAll::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + unsigned int uiButtonCounter=0; + + while((uiButtonCounterUserIndex,eUIScene_SettingsOptionsMenu); + break; + case BUTTON_ALL_AUDIO: + app.NavigateToScene(pNotifyPressData->UserIndex,eUIScene_SettingsAudioMenu); + break; + case BUTTON_ALL_CONTROL: + app.NavigateToScene(pNotifyPressData->UserIndex,eUIScene_SettingsControlMenu); + break; + case BUTTON_ALL_GRAPHICS: + app.NavigateToScene(pNotifyPressData->UserIndex,eUIScene_SettingsGraphicsMenu); + break; + case BUTTON_ALL_UI: + app.NavigateToScene(pNotifyPressData->UserIndex,eUIScene_SettingsUIMenu); + break; + case BUTTON_ALL_RESETTODEFAULTS: + { + // check they really want to do this + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_CANCEL; + uiIDA[1]=IDS_CONFIRM_OK; + + StorageManager.RequestMessageBox(IDS_DEFAULTS_TITLE, IDS_DEFAULTS_TEXT, uiIDA, 2, pNotifyPressData->UserIndex,&CScene_SettingsAll::ResetDefaultsDialogReturned,this, app.GetStringTable()); + } + break; + + } + + rfHandled=TRUE; + return S_OK; +} + +HRESULT CScene_SettingsAll::OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled) +{ + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + + // if we're not in the game, we need to use basescene 0 + if(bNotInGame) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + CXuiSceneBase::ShowLogo( DEFAULT_XUI_MENU_USER, TRUE ); + } + else + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + if(!RenderManager.IsHiDef() || app.GetLocalPlayerCount()>1) + { + CXuiSceneBase::ShowLogo( m_iPad, FALSE ); + } + else + { + CXuiSceneBase::ShowLogo( m_iPad, TRUE ); + } + } + + return S_OK; +} + +HRESULT CScene_SettingsAll::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) +{ + bHandled=true; + return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining); +} + +int CScene_SettingsAll::ResetDefaultsDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + //CScene_SettingsAll* pClass = (CScene_SettingsAll*)pParam; + + // results switched for this dialog + if(result==C4JStorage::EMessage_ResultDecline) + { + app.SetDefaultOptions(ProfileManager.GetDashboardProfileSettings(iPad),iPad); + // if the profile data has been changed, then force a profile write + // It seems we're allowed to break the 5 minute rule if it's the result of a user action + app.CheckGameSettingsChanged(true,iPad); + } + return 0; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_SettingsAll.h b/Minecraft.Client/Common/XUI/XUI_SettingsAll.h new file mode 100644 index 00000000..217f6c73 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_SettingsAll.h @@ -0,0 +1,59 @@ +#pragma once + +#include "../media/xuiscene_settings_all.h" +#include "XUI_Ctrl_SliderWrapper.h" +#include "XUI_CustomMessages.h" + +#define BUTTON_ALL_OPTIONS 0 +#define BUTTON_ALL_AUDIO 1 +#define BUTTON_ALL_CONTROL 2 +#define BUTTON_ALL_GRAPHICS 4 +#define BUTTON_ALL_UI 5 +#define BUTTON_ALL_RESETTODEFAULTS 6 +#define BUTTONS_ALL_MAX BUTTON_ALL_RESETTODEFAULTS + 1 + +class CScene_SettingsAll : public CXuiSceneImpl +{ +protected: + + CXuiControl m_Buttons[BUTTONS_ALL_MAX]; + + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN( OnKeyDown ) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_CONTROL_NAVIGATE( OnControlNavigate ) + XUI_ON_XM_TRANSITION_START(OnTransitionStart) + XUI_ON_XM_NAV_RETURN(OnNavReturn) + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + XUI_END_MSG_MAP() + + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_XuiButtonOptions, m_Buttons[BUTTON_ALL_OPTIONS]) + MAP_CONTROL(IDC_XuiButtonAudio, m_Buttons[BUTTON_ALL_AUDIO]) + MAP_CONTROL(IDC_XuiButtonControl, m_Buttons[BUTTON_ALL_CONTROL]) + MAP_CONTROL(IDC_XuiButtonGraphics, m_Buttons[BUTTON_ALL_GRAPHICS]) + MAP_CONTROL(IDC_XuiButtonUI, m_Buttons[BUTTON_ALL_UI]) + MAP_CONTROL(IDC_XuiButtonResetToDefaults, m_Buttons[BUTTON_ALL_RESETTODEFAULTS]) + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled); + HRESULT OnKeyDown(XUIMessageInput *pInputData, BOOL& bHandled); + HRESULT OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled); + HRESULT OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ); + HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled); + HRESULT OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled); + static int ResetDefaultsDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + + int m_iPad; + + D3DXVECTOR3 m_OriginalPosition; + +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_SettingsAll, L"CScene_SettingsAll", XUI_CLASS_SCENE ) +}; diff --git a/Minecraft.Client/Common/XUI/XUI_SettingsAudio.cpp b/Minecraft.Client/Common/XUI/XUI_SettingsAudio.cpp new file mode 100644 index 00000000..0f0fe2e3 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_SettingsAudio.cpp @@ -0,0 +1,263 @@ +#include "stdafx.h" +#include "..\XUI\XUI_SettingsAudio.h" + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_SettingsAudio::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + WCHAR TempString[256]; + m_iPad=*(int *)pInitData->pvInitData; + // if we're not in the game, we need to use basescene 0 + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + + MapChildControls(); + + // Display the tooltips + HRESULT hr = S_OK; + HXUIOBJ hSlider; + + m_SliderA[SLIDER_SETTINGS_MUSIC].SetValue(app.GetGameSettings(m_iPad,eGameSetting_MusicVolume)); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_MUSIC ),app.GetGameSettings(m_iPad,eGameSetting_MusicVolume)); + m_SliderA[SLIDER_SETTINGS_MUSIC].SetText(TempString); + + m_SliderA[SLIDER_SETTINGS_SOUND].SetValue(app.GetGameSettings(m_iPad,eGameSetting_SoundFXVolume)); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_SOUND ),app.GetGameSettings(m_iPad,eGameSetting_SoundFXVolume)); + m_SliderA[SLIDER_SETTINGS_SOUND].SetText(TempString); + + // only the primary player gets to change the music and sound settings + // only the primary player gets to change the gamma and splitscreen settings + // only the primary player gets to change the difficulty settings + if(ProfileManager.GetPrimaryPad()!=m_iPad) + { + D3DXVECTOR3 vec; + + m_SliderA[SLIDER_SETTINGS_MUSIC].GetPosition(&vec); + m_SliderA[SLIDER_SETTINGS_MUSIC].SetEnable(FALSE); + m_SliderA[SLIDER_SETTINGS_MUSIC].SetShow(FALSE); + hr=XuiElementGetChildById(m_SliderA[SLIDER_SETTINGS_MUSIC].m_hObj,L"XuiSlider",&hSlider); + XuiElementSetShow(hSlider,FALSE); + XuiControlSetEnable(hSlider,FALSE); + m_SliderA[SLIDER_SETTINGS_SOUND].SetEnable(FALSE); + m_SliderA[SLIDER_SETTINGS_SOUND].SetShow(FALSE); + hr=XuiElementGetChildById(m_SliderA[SLIDER_SETTINGS_SOUND].m_hObj,L"XuiSlider",&hSlider); + XuiElementSetShow(hSlider,FALSE); + XuiControlSetEnable(hSlider,FALSE); + } + + + // if we're not in the game, we need to use basescene 0 + if(bNotInGame) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + CXuiSceneBase::ShowBackground( DEFAULT_XUI_MENU_USER, TRUE ); + } + else + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + CXuiSceneBase::ShowBackground( m_iPad, FALSE ); + } + + + if(app.GetLocalPlayerCount()>1) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + CXuiSceneBase::ShowLogo( m_iPad, FALSE ); + } + else + { + if(bNotInGame) + { + CXuiSceneBase::ShowLogo( DEFAULT_XUI_MENU_USER, TRUE ); + } + else + { + CXuiSceneBase::ShowLogo( m_iPad, TRUE ); + } + } + + return S_OK; +} + +HRESULT CScene_SettingsAudio::OnNotifyValueChanged( HXUIOBJ hObjSource, XUINotifyValueChanged* pNotifyValueChanged, BOOL& bHandled ) +{ + WCHAR TempString[256]; + + if(hObjSource==m_SliderA[SLIDER_SETTINGS_MUSIC].GetSlider() ) + { + app.SetGameSettings(m_iPad,eGameSetting_MusicVolume,pNotifyValueChanged->nValue); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_MUSIC ),pNotifyValueChanged->nValue); + m_SliderA[SLIDER_SETTINGS_MUSIC].SetText(TempString); + } + else if(hObjSource==m_SliderA[SLIDER_SETTINGS_SOUND].GetSlider() ) + { + app.SetGameSettings(m_iPad,eGameSetting_SoundFXVolume,pNotifyValueChanged->nValue); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_SOUND ),pNotifyValueChanged->nValue); + m_SliderA[SLIDER_SETTINGS_SOUND].SetText(TempString); + } + + + return S_OK; +} + + +HRESULT CScene_SettingsAudio::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + HRESULT hr=S_OK; + + // Explicitly handle B button presses + switch(pInputData->dwKeyCode) + { + case VK_PAD_B: + case VK_ESCAPE: + // if the profile data has been changed, then force a profile write + // It seems we're allowed to break the 5 minute rule if it's the result of a user action + + // Not in this scene - app.CheckGameSettingsChanged(true,pInputData->UserIndex); + + app.NavigateBack(pInputData->UserIndex); + rfHandled = TRUE; + break; + } + + return hr; +} + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_SettingsAudio::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + return S_OK; +} + +HRESULT CScene_SettingsAudio::OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) +{ + // added so we can skip greyed out items + pControlNavigateData->hObjDest=XuiControlGetNavigation(pControlNavigateData->hObjSource,pControlNavigateData->nControlNavigate,TRUE,TRUE); + + if(pControlNavigateData->hObjDest!=NULL) + { + bHandled=TRUE; + } + + return S_OK; +} + +HRESULT CScene_SettingsAudio::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ) +{ + HRESULT hr; + WCHAR TempString[256]; + if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) return S_OK; + + if(pTransition->dwTransType == XUI_TRANSITION_TO || pTransition->dwTransType == XUI_TRANSITION_BACKTO) + { + // 4J-PB - Going to resize buttons if the text is too big to fit on any of them (Br-pt problem with the length of Unlock Full Game) + + float fMaxTextLen=0.0f; + float fMaxLen=0.0f; + + // sliders first + HXUIOBJ hSlider,hVisual,hText;//,hCheckboxText; + XUIRect xuiRect; + float fWidth,fHeight,fTemp; + D3DXVECTOR3 vec,vecCheckboxText,vSlider,vecCheckbox; + + // don't display values on these - we handle that + for(int i=0;ifMaxTextLen) fMaxTextLen=xuiRect.right; + if(fWidth>fMaxLen) fMaxLen=fWidth; + } + + if(fMaxLen1) + { + // scene width needs to be more that the text width on buttons + fWidth=vSlider.x; + vec.x=floorf((640.0f-(fMaxTextLen+fWidth))/2.0f); + XuiElementSetPosition(m_hObj,&vec); + XuiElementSetBounds(m_hObj,fMaxTextLen+(fWidth*2.0f),fHeight); + } + else + { + fWidth=vSlider.x; + vec.x=floorf((1280.0f-(fMaxTextLen+fWidth))/2.0f); + XuiElementSetPosition(m_hObj,&vec); + XuiElementSetBounds(m_hObj,fMaxTextLen+(fWidth*2.0f),fHeight); + } + // Need to refresh the scenes visual since the object size has now changed + XuiControlAttachVisual(m_hObj); + + // centre is vec.x+(fWidth/2) + for(int i=0;ilevel==NULL); + + // if we're not in the game, we need to use basescene 0 + if(bNotInGame) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + } + else + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + } + + return S_OK; +} + +HRESULT CScene_SettingsAudio::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) +{ + bHandled=true; + return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining); +} + diff --git a/Minecraft.Client/Common/XUI/XUI_SettingsAudio.h b/Minecraft.Client/Common/XUI/XUI_SettingsAudio.h new file mode 100644 index 00000000..c77f5798 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_SettingsAudio.h @@ -0,0 +1,53 @@ +#pragma once + +#include "../media/xuiscene_settings_audio.h" +#include "XUI_Ctrl_SliderWrapper.h" +#include "XUI_CustomMessages.h" + +#define SLIDER_SETTINGS_MUSIC 0 +#define SLIDER_SETTINGS_SOUND 1 + +#define SLIDER_SETTINGS_AUDIO_MAX SLIDER_SETTINGS_SOUND + 1 +class CScene_SettingsAudio : public CXuiSceneImpl +{ +protected: + CXuiCtrlSliderWrapper m_SliderA[SLIDER_SETTINGS_AUDIO_MAX]; + + CXuiControl m_ButtonOptions; + + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN( OnKeyDown ) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_NOTIFY_VALUE_CHANGED( OnNotifyValueChanged ) + XUI_ON_XM_CONTROL_NAVIGATE( OnControlNavigate ) + XUI_ON_XM_TRANSITION_START(OnTransitionStart) + XUI_ON_XM_NAV_RETURN(OnNavReturn) + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + + XUI_END_MSG_MAP() + + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_XuiSliderMusic, m_SliderA[SLIDER_SETTINGS_MUSIC]) + MAP_CONTROL(IDC_XuiSliderSound, m_SliderA[SLIDER_SETTINGS_SOUND]) + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnKeyDown(XUIMessageInput *pInputData, BOOL& bHandled); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled); + HRESULT OnNotifyValueChanged( HXUIOBJ hObjSource, XUINotifyValueChanged* pNotifyValueChanged, BOOL& bHandled ); + HRESULT OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled); + HRESULT OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ); + HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled); + HRESULT OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled); + + int m_iPad; + D3DXVECTOR3 m_OriginalPosition; + +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_SettingsAudio, L"CScene_SettingsAudio", XUI_CLASS_SCENE ) +}; diff --git a/Minecraft.Client/Common/XUI/XUI_SettingsControl.cpp b/Minecraft.Client/Common/XUI/XUI_SettingsControl.cpp new file mode 100644 index 00000000..7e2835a2 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_SettingsControl.cpp @@ -0,0 +1,241 @@ +// Minecraft.cpp : Defines the entry point for the application. +// + +#include "stdafx.h" +#include "..\XUI\XUI_SettingsControl.h" + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_SettingsControl::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + WCHAR TempString[256]; + m_iPad=*(int *)pInitData->pvInitData; + // if we're not in the game, we need to use basescene 0 + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + + MapChildControls(); + + // Display the tooltips + + m_SliderA[SLIDER_SETTINGS_SENSITIVITY_INGAME].SetValue(app.GetGameSettings(m_iPad,eGameSetting_Sensitivity_InGame)); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_SENSITIVITY_INGAME ),app.GetGameSettings(m_iPad,eGameSetting_Sensitivity_InGame)); + m_SliderA[SLIDER_SETTINGS_SENSITIVITY_INGAME].SetText(TempString); + + m_SliderA[SLIDER_SETTINGS_SENSITIVITY_INMENU].SetValue(app.GetGameSettings(m_iPad,eGameSetting_Sensitivity_InMenu)); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_SENSITIVITY_INMENU ),app.GetGameSettings(m_iPad,eGameSetting_Sensitivity_InMenu)); + m_SliderA[SLIDER_SETTINGS_SENSITIVITY_INMENU].SetText(TempString); + + // if we're not in the game, we need to use basescene 0 + if(bNotInGame) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + CXuiSceneBase::ShowBackground( DEFAULT_XUI_MENU_USER, TRUE ); + } + else + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + CXuiSceneBase::ShowBackground( m_iPad, FALSE ); + } + + + if(app.GetLocalPlayerCount()>1) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad,false); + CXuiSceneBase::ShowLogo( m_iPad, FALSE ); + } + else + { + if(bNotInGame) + { + CXuiSceneBase::ShowLogo( DEFAULT_XUI_MENU_USER, TRUE ); + } + else + { + CXuiSceneBase::ShowLogo( m_iPad, TRUE ); + } + } + + return S_OK; +} + +HRESULT CScene_SettingsControl::OnNotifyValueChanged( HXUIOBJ hObjSource, XUINotifyValueChanged* pNotifyValueChanged, BOOL& bHandled ) +{ + WCHAR TempString[256]; + + if(hObjSource==m_SliderA[SLIDER_SETTINGS_SENSITIVITY_INGAME].GetSlider() ) + { + app.SetGameSettings(m_iPad,eGameSetting_Sensitivity_InGame,pNotifyValueChanged->nValue); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_SENSITIVITY_INGAME ),pNotifyValueChanged->nValue); + m_SliderA[SLIDER_SETTINGS_SENSITIVITY_INGAME].SetText(TempString); + } + else if(hObjSource==m_SliderA[SLIDER_SETTINGS_SENSITIVITY_INMENU].GetSlider() ) + { + app.SetGameSettings(m_iPad,eGameSetting_Sensitivity_InMenu,pNotifyValueChanged->nValue); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_SENSITIVITY_INMENU ),pNotifyValueChanged->nValue); + m_SliderA[SLIDER_SETTINGS_SENSITIVITY_INMENU].SetText(TempString); + } + + return S_OK; +} + + +HRESULT CScene_SettingsControl::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + HRESULT hr=S_OK; + + // Explicitly handle B button presses + switch(pInputData->dwKeyCode) + { + case VK_PAD_B: + case VK_ESCAPE: + // if the profile data has been changed, then force a profile write + // It seems we're allowed to break the 5 minute rule if it's the result of a user action + + // not in this scene - app.CheckGameSettingsChanged(true,pInputData->UserIndex); + + app.NavigateBack(pInputData->UserIndex); + rfHandled = TRUE; + break; + } + + return hr; +} + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_SettingsControl::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + return S_OK; +} + +HRESULT CScene_SettingsControl::OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) +{ + // added so we can skip greyed out items + pControlNavigateData->hObjDest=XuiControlGetNavigation(pControlNavigateData->hObjSource,pControlNavigateData->nControlNavigate,TRUE,TRUE); + + if(pControlNavigateData->hObjDest!=NULL) + { + bHandled=TRUE; + } + + return S_OK; +} + +HRESULT CScene_SettingsControl::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ) +{ + HRESULT hr; + WCHAR TempString[256]; + if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) return S_OK; + + if(pTransition->dwTransType == XUI_TRANSITION_TO || pTransition->dwTransType == XUI_TRANSITION_BACKTO) + { + // 4J-PB - Going to resize buttons if the text is too big to fit on any of them (Br-pt problem with the length of Unlock Full Game) + + float fMaxTextLen=0.0f; + float fMaxLen=0.0f; + + // sliders first + HXUIOBJ hSlider,hVisual,hText;//,hCheckboxText; + XUIRect xuiRect; + float fWidth,fHeight,fTemp; + D3DXVECTOR3 vec,vecCheckboxText,vSlider,vecCheckbox; + + // don't display values on these - we handle that + for(int i=0;ifMaxTextLen) fMaxTextLen=xuiRect.right; + if(fWidth>fMaxLen) fMaxLen=fWidth; + } + + if(fMaxLen1) + { + // scene width needs to be more that the text width on buttons + fWidth=vSlider.x; + vec.x=floorf((640.0f-(fMaxTextLen+fWidth))/2.0f); + XuiElementSetPosition(m_hObj,&vec); + XuiElementSetBounds(m_hObj,fMaxTextLen+(fWidth*2.0f),fHeight); + } + else + { + fWidth=vSlider.x; + vec.x=floorf((1280.0f-(fMaxTextLen+fWidth))/2.0f); + XuiElementSetPosition(m_hObj,&vec); + XuiElementSetBounds(m_hObj,fMaxTextLen+(fWidth*2.0f),fHeight); + } + + // centre is vec.x+(fWidth/2) + for(int i=0;ilevel==NULL); + + // if we're not in the game, we need to use basescene 0 + if(bNotInGame) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + } + else + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + } + + return S_OK; +} + +HRESULT CScene_SettingsControl::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) +{ + bHandled=true; + return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining); +} + diff --git a/Minecraft.Client/Common/XUI/XUI_SettingsControl.h b/Minecraft.Client/Common/XUI/XUI_SettingsControl.h new file mode 100644 index 00000000..67e43699 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_SettingsControl.h @@ -0,0 +1,52 @@ +#pragma once + +#include "../media/xuiscene_settings_control.h" +#include "XUI_Ctrl_SliderWrapper.h" +#include "XUI_CustomMessages.h" + +#define SLIDER_SETTINGS_SENSITIVITY_INGAME 0 +#define SLIDER_SETTINGS_SENSITIVITY_INMENU 1 + +#define SLIDER_SETTINGS_CONTROL_MAX SLIDER_SETTINGS_SENSITIVITY_INMENU + 1 +class CScene_SettingsControl : public CXuiSceneImpl +{ +protected: + CXuiCtrlSliderWrapper m_SliderA[SLIDER_SETTINGS_CONTROL_MAX]; + + CXuiControl m_ButtonOptions; + + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN( OnKeyDown ) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_NOTIFY_VALUE_CHANGED( OnNotifyValueChanged ) + XUI_ON_XM_CONTROL_NAVIGATE( OnControlNavigate ) + XUI_ON_XM_TRANSITION_START(OnTransitionStart) + XUI_ON_XM_NAV_RETURN(OnNavReturn) + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + XUI_END_MSG_MAP() + + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_XuiSliderSensitivityInGame, m_SliderA[SLIDER_SETTINGS_SENSITIVITY_INGAME]) + MAP_CONTROL(IDC_XuiSliderSensitivityInMenu, m_SliderA[SLIDER_SETTINGS_SENSITIVITY_INMENU]) + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnKeyDown(XUIMessageInput *pInputData, BOOL& bHandled); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled); + HRESULT OnNotifyValueChanged( HXUIOBJ hObjSource, XUINotifyValueChanged* pNotifyValueChanged, BOOL& bHandled ); + HRESULT OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled); + HRESULT OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ); + HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled); + HRESULT OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled); + + int m_iPad; + D3DXVECTOR3 m_OriginalPosition; + +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_SettingsControl, L"CScene_SettingsControl", XUI_CLASS_SCENE ) +}; diff --git a/Minecraft.Client/Common/XUI/XUI_SettingsGraphics.cpp b/Minecraft.Client/Common/XUI/XUI_SettingsGraphics.cpp new file mode 100644 index 00000000..48a933e2 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_SettingsGraphics.cpp @@ -0,0 +1,333 @@ +// Minecraft.cpp : Defines the entry point for the application. +// + +#include "stdafx.h" +#include "..\XUI\XUI_SettingsGraphics.h" + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_SettingsGraphics::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + WCHAR TempString[256]; + m_iPad=*(int *)pInitData->pvInitData; + // if we're not in the game, we need to use basescene 0 + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + bool bIsPrimaryPad=(ProfileManager.GetPrimaryPad()==m_iPad); + + MapChildControls(); + + // Display the tooltips + + m_Clouds.SetCheck( (app.GetGameSettings(m_iPad,eGameSetting_Clouds)!=0)?TRUE:FALSE); + m_Clouds.SetText(app.GetString( IDS_CHECKBOX_RENDER_CLOUDS )); + + m_SliderA[SLIDER_SETTINGS_GAMMA].SetValue(app.GetGameSettings(m_iPad,eGameSetting_Gamma)); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_GAMMA ),app.GetGameSettings(m_iPad,eGameSetting_Gamma)); + m_SliderA[SLIDER_SETTINGS_GAMMA].SetText(TempString); + + m_SliderA[SLIDER_SETTINGS_INTERFACE_OPACITY].SetValue(app.GetGameSettings(m_iPad,eGameSetting_InterfaceOpacity)); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_INTERFACEOPACITY ),app.GetGameSettings(m_iPad,eGameSetting_InterfaceOpacity)); + m_SliderA[SLIDER_SETTINGS_INTERFACE_OPACITY].SetText(TempString); + + m_BedrockFog.SetCheck( (app.GetGameSettings(m_iPad,eGameSetting_BedrockFog)!=0)?TRUE:FALSE); + m_BedrockFog.SetText(app.GetString( IDS_CHECKBOX_RENDER_BEDROCKFOG )); + + m_CustomSkinAnim.SetCheck( (app.GetGameSettings(m_iPad,eGameSetting_CustomSkinAnim)!=0)?TRUE:FALSE); + m_CustomSkinAnim.SetText(app.GetString( IDS_CHECKBOX_CUSTOM_SKIN_ANIM )); + + // if we're not in the game, we need to use basescene 0 + if(bNotInGame) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + CXuiSceneBase::ShowBackground( DEFAULT_XUI_MENU_USER, TRUE ); + } + else + { + // If the game has started, then you need to be the host to change the in-game gamertags + if(bIsPrimaryPad) + { + // are we the game host? If not, we need to remove the bedrockfog setting + if(!g_NetworkManager.IsHost()) + { + // we are the primary player on this machine, but not the game host + D3DXVECTOR3 vec; + // hide the in-game bedrock fog setting + m_BedrockFog.SetShow(FALSE); + + // m_SliderA[SLIDER_SETTINGS_INTERFACE_OPACITY] -> m_SliderA[SLIDER_SETTINGS_GAMMA] + // m_SliderA[SLIDER_SETTINGS_GAMMA] -> m_CustomSkinAnim + // m_CustomSkinAnim -> m_BedrockFog + + XuiElementGetPosition(m_SliderA[SLIDER_SETTINGS_GAMMA],&vec); + m_SliderA[SLIDER_SETTINGS_INTERFACE_OPACITY].SetPosition(&vec); + + XuiElementGetPosition(m_CustomSkinAnim,&vec); + m_SliderA[SLIDER_SETTINGS_GAMMA].SetPosition(&vec); + + XuiElementGetPosition(m_BedrockFog,&vec); + m_CustomSkinAnim.SetPosition(&vec); + + // reduce the size of the background + float fWidth, fHeight, fbgnWidth, fBgnHeight; + m_BedrockFog.GetBounds(&fWidth, &fHeight); + GetBounds(&fbgnWidth, &fBgnHeight); + fBgnHeight-=fHeight; + SetBounds(fbgnWidth, fBgnHeight); + } + } + else + { + // We shouldn't have the bedrock fog option, or the m_CustomSkinAnim option + m_BedrockFog.SetShow(FALSE); + m_CustomSkinAnim.SetShow(FALSE); + + D3DXVECTOR3 vec,vecGamma,vecOpacity; + float fSliderYDiff; + + // m_SliderA[SLIDER_SETTINGS_INTERFACE_OPACITY] -> m_BedrockFog + // m_SliderA[SLIDER_SETTINGS_GAMMA] -> m_BedrockFog + + m_SliderA[SLIDER_SETTINGS_GAMMA].GetPosition(&vecGamma); + m_SliderA[SLIDER_SETTINGS_INTERFACE_OPACITY].GetPosition(&vecOpacity); + fSliderYDiff=vecOpacity.y-vecGamma.y; + + XuiElementGetPosition(m_BedrockFog,&vec); + m_SliderA[SLIDER_SETTINGS_GAMMA].SetPosition(&vec); + vec.y+=fSliderYDiff; + m_SliderA[SLIDER_SETTINGS_INTERFACE_OPACITY].SetPosition(&vec); + + // reduce the size of the background + float fWidth, fHeight, fbgnWidth, fBgnHeight; + GetBounds(&fbgnWidth, &fBgnHeight); + m_BedrockFog.GetBounds(&fWidth, &fHeight); + fBgnHeight-=fHeight; + m_CustomSkinAnim.GetBounds(&fWidth, &fHeight); + fBgnHeight-=fHeight; + SetBounds(fbgnWidth, fBgnHeight); + } + + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + CXuiSceneBase::ShowBackground( m_iPad, FALSE ); + } + + + if(app.GetLocalPlayerCount()>1) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + CXuiSceneBase::ShowLogo( m_iPad, FALSE ); + } + else + { + if(bNotInGame) + { + CXuiSceneBase::ShowLogo( DEFAULT_XUI_MENU_USER, TRUE ); + } + else + { + CXuiSceneBase::ShowLogo( m_iPad, TRUE ); + } + } + + return S_OK; +} + +HRESULT CScene_SettingsGraphics::OnNotifyValueChanged( HXUIOBJ hObjSource, XUINotifyValueChanged* pNotifyValueChanged, BOOL& bHandled ) +{ + WCHAR TempString[256]; + + if(hObjSource==m_SliderA[SLIDER_SETTINGS_GAMMA].GetSlider() ) + { + app.SetGameSettings(m_iPad,eGameSetting_Gamma,pNotifyValueChanged->nValue); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_GAMMA ),pNotifyValueChanged->nValue); + m_SliderA[SLIDER_SETTINGS_GAMMA].SetText(TempString); + } + else if(hObjSource==m_SliderA[SLIDER_SETTINGS_INTERFACE_OPACITY].GetSlider() ) + { + app.SetGameSettings(m_iPad,eGameSetting_InterfaceOpacity,pNotifyValueChanged->nValue); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_INTERFACEOPACITY ),pNotifyValueChanged->nValue); + m_SliderA[SLIDER_SETTINGS_INTERFACE_OPACITY].SetText(TempString); + } + + return S_OK; +} + + +HRESULT CScene_SettingsGraphics::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + HRESULT hr=S_OK; + + // Explicitly handle B button presses + switch(pInputData->dwKeyCode) + { + case VK_PAD_B: + case VK_ESCAPE: + // if the profile data has been changed, then force a profile write + // It seems we're allowed to break the 5 minute rule if it's the result of a user action + + // not in this scene - app.CheckGameSettingsChanged(true,pInputData->UserIndex); + + // check the checkboxes + app.SetGameSettings(m_iPad,eGameSetting_Clouds,m_Clouds.IsChecked()?1:0); + app.SetGameSettings(m_iPad,eGameSetting_BedrockFog,m_BedrockFog.IsChecked()?1:0); + app.SetGameSettings(m_iPad,eGameSetting_CustomSkinAnim,m_CustomSkinAnim.IsChecked()?1:0); + + app.NavigateBack(pInputData->UserIndex); + rfHandled = TRUE; + break; + } + + return hr; +} + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_SettingsGraphics::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + return S_OK; +} + +HRESULT CScene_SettingsGraphics::OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) +{ + // added so we can skip greyed out items + pControlNavigateData->hObjDest=XuiControlGetNavigation(pControlNavigateData->hObjSource,pControlNavigateData->nControlNavigate,TRUE,TRUE); + + if(pControlNavigateData->hObjDest!=NULL) + { + bHandled=TRUE; + } + + return S_OK; +} + +HRESULT CScene_SettingsGraphics::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ) +{ + HRESULT hr; + WCHAR TempString[256]; + if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) return S_OK; + + if(pTransition->dwTransType == XUI_TRANSITION_TO || pTransition->dwTransType == XUI_TRANSITION_BACKTO) + { + // 4J-PB - Going to resize buttons if the text is too big to fit on any of them (Br-pt problem with the length of Unlock Full Game) + + float fMaxTextLen=0.0f; + float fMaxLen=0.0f; + + // sliders first + HXUIOBJ hSlider,hVisual,hText,hCheckboxText; + XUIRect xuiRect; + float fWidth,fHeight,fTemp; + D3DXVECTOR3 vec,vecCheckboxText,vSlider,vecCheckbox; + + // don't display values on these - we handle that + for(int i=0;ifMaxTextLen) fMaxTextLen=xuiRect.right; + if(fWidth>fMaxLen) fMaxLen=fWidth; + } + + // now the clouds checkbox - let's just use the visual we already have... + hr=XuiTextPresenterMeasureText(hText, m_Clouds.GetText(), &xuiRect); + hr=XuiTextPresenterMeasureText(hCheckboxText, m_Clouds.GetText(), &xuiRect); + m_Clouds.GetBounds(&fWidth,&fHeight); + // need to add the size of the checkbox graphic + if((xuiRect.right+vecCheckbox.x+vecCheckboxText.x)>fMaxTextLen) fMaxTextLen=xuiRect.right+vecCheckbox.x+vecCheckboxText.x; + if(fWidth>fMaxLen) fMaxLen=fWidth; + + if(fMaxLen1) + { + // scene width needs to be more that the text width on buttons + fWidth=vSlider.x; + vec.x=floorf((640.0f-(fMaxTextLen+fWidth))/2.0f); + XuiElementSetPosition(m_hObj,&vec); + XuiElementSetBounds(m_hObj,fMaxTextLen+(fWidth*2.0f),fHeight); + } + else + { + fWidth=vSlider.x; + vec.x=floorf((1280.0f-(fMaxTextLen+fWidth))/2.0f); + XuiElementSetPosition(m_hObj,&vec); + XuiElementSetBounds(m_hObj,fMaxTextLen+(fWidth*2.0f),fHeight); + } + // Need to refresh the scenes visual since the object size has now changed + XuiControlAttachVisual(m_hObj); + + // centre is vec.x+(fWidth/2) + for(int i=0;ilevel==NULL); + + // if we're not in the game, we need to use basescene 0 + if(bNotInGame) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + } + else + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + } + + return S_OK; +} + +HRESULT CScene_SettingsGraphics::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) +{ + bHandled=true; + return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining); +} + diff --git a/Minecraft.Client/Common/XUI/XUI_SettingsGraphics.h b/Minecraft.Client/Common/XUI/XUI_SettingsGraphics.h new file mode 100644 index 00000000..224dedd7 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_SettingsGraphics.h @@ -0,0 +1,60 @@ +#pragma once + +#include "../media/xuiscene_settings_graphics.h" +#include "XUI_Ctrl_SliderWrapper.h" +#include "XUI_CustomMessages.h" + + +#define SLIDER_SETTINGS_GAMMA 0 +#define SLIDER_SETTINGS_INTERFACE_OPACITY 1 + + +#define SLIDER_SETTINGS_GRAPHICS_MAX SLIDER_SETTINGS_INTERFACE_OPACITY + 1 +class CScene_SettingsGraphics : public CXuiSceneImpl +{ +protected: + CXuiCtrlSliderWrapper m_SliderA[SLIDER_SETTINGS_GRAPHICS_MAX]; + CXuiCheckbox m_Clouds; + CXuiCheckbox m_BedrockFog; + CXuiCheckbox m_CustomSkinAnim; + + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN( OnKeyDown ) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_NOTIFY_VALUE_CHANGED( OnNotifyValueChanged ) + XUI_ON_XM_CONTROL_NAVIGATE( OnControlNavigate ) + XUI_ON_XM_TRANSITION_START(OnTransitionStart) + XUI_ON_XM_NAV_RETURN(OnNavReturn) + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + + XUI_END_MSG_MAP() + + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_XuiClouds, m_Clouds) + MAP_CONTROL(IDC_XuiBedrockFog, m_BedrockFog) + MAP_CONTROL(IDC_XuiCustomSkinAnim, m_CustomSkinAnim) + MAP_CONTROL(IDC_XuiSliderGamma, m_SliderA[SLIDER_SETTINGS_GAMMA]) + MAP_CONTROL(IDC_XuiSliderInterfaceOpacity, m_SliderA[SLIDER_SETTINGS_INTERFACE_OPACITY]) + + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnKeyDown(XUIMessageInput *pInputData, BOOL& bHandled); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled); + HRESULT OnNotifyValueChanged( HXUIOBJ hObjSource, XUINotifyValueChanged* pNotifyValueChanged, BOOL& bHandled ); + HRESULT OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled); + HRESULT OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ); + HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled); + HRESULT OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled); + + int m_iPad; + D3DXVECTOR3 m_OriginalPosition; + +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_SettingsGraphics, L"CScene_SettingsGraphics", XUI_CLASS_SCENE ) +}; diff --git a/Minecraft.Client/Common/XUI/XUI_SettingsOptions.cpp b/Minecraft.Client/Common/XUI/XUI_SettingsOptions.cpp new file mode 100644 index 00000000..526847c7 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_SettingsOptions.cpp @@ -0,0 +1,508 @@ +// Minecraft.cpp : Defines the entry point for the application. +// + +#include "stdafx.h" +#include "..\XUI\XUI_SettingsOptions.h" + +int CScene_SettingsOptions::m_iDifficultySettingA[4]= +{ + IDS_DIFFICULTY_PEACEFUL, + IDS_DIFFICULTY_EASY, + IDS_DIFFICULTY_NORMAL, + IDS_DIFFICULTY_HARD +}; + +int CScene_SettingsOptions::m_iDifficultyTitleSettingA[4]= +{ + IDS_DIFFICULTY_TITLE_PEACEFUL, + IDS_DIFFICULTY_TITLE_EASY, + IDS_DIFFICULTY_TITLE_NORMAL, + IDS_DIFFICULTY_TITLE_HARD +}; + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_SettingsOptions::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + WCHAR TempString[256]; + m_iPad=*(int *)pInitData->pvInitData; + // if we're not in the game, we need to use basescene 0 + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + bool bPrimaryPlayer = ProfileManager.GetPrimaryPad()==m_iPad; + + MapChildControls(); + + XuiControlSetText(m_ViewBob,app.GetString(IDS_VIEW_BOBBING)); + XuiControlSetText(m_Hints,app.GetString(IDS_HINTS)); + XuiControlSetText(m_Tooltips,app.GetString(IDS_IN_GAME_TOOLTIPS)); + XuiControlSetText(m_InGameGamertags,app.GetString(IDS_IN_GAME_GAMERTAGS)); + XuiControlSetText(m_MashUpWorlds,app.GetString(IDS_UNHIDE_MASHUP_WORLDS)); + + // check if we should display the mash-up option + if(bNotInGame && app.GetMashupPackWorlds(m_iPad)!=0xFFFFFFFF) + { + // the mash-up option is needed + m_bMashUpWorldsUnhideOption=true; + m_MashUpWorlds.SetShow(TRUE); + } + else + { + m_bMashUpWorldsUnhideOption=false; + m_MashUpWorlds.SetShow(FALSE); + } + + // Display the tooltips + HRESULT hr = S_OK; + HXUIOBJ hSlider; + + unsigned char ucValue=app.GetGameSettings(m_iPad,eGameSetting_Autosave); + m_SliderA[SLIDER_SETTINGS_AUTOSAVE].SetValue(ucValue); + if(ucValue==0) + { + swprintf( (WCHAR *)TempString, 256, L"%ls", app.GetString( IDS_SLIDER_AUTOSAVE_OFF )); + } + else + { + swprintf( (WCHAR *)TempString, 256, L"%ls: %d %ls", app.GetString( IDS_SLIDER_AUTOSAVE ),ucValue*15, app.GetString( IDS_MINUTES )); + } + + m_SliderA[SLIDER_SETTINGS_AUTOSAVE].SetText(TempString); + + + m_ViewBob.SetCheck( (app.GetGameSettings(m_iPad,eGameSetting_ViewBob)!=0)?TRUE:FALSE); + m_InGameGamertags.SetCheck( (app.GetGameSettings(m_iPad,eGameSetting_GamertagsVisible)!=0)?TRUE:FALSE); + m_Hints.SetCheck( (app.GetGameSettings(m_iPad,eGameSetting_Hints)!=0)?TRUE:FALSE); + m_Tooltips.SetCheck( (app.GetGameSettings(m_iPad,eGameSetting_Tooltips)!=0)?TRUE:FALSE); + + m_SliderA[SLIDER_SETTINGS_DIFFICULTY].SetValue(app.GetGameSettings(m_iPad,eGameSetting_Difficulty)); + swprintf( (WCHAR *)TempString, 256, L"%ls: %ls", app.GetString( IDS_SLIDER_DIFFICULTY ),app.GetString(m_iDifficultyTitleSettingA[app.GetGameSettings(m_iPad,eGameSetting_Difficulty)])); + m_SliderA[SLIDER_SETTINGS_DIFFICULTY].SetText(TempString); + + + wstring wsText=app.GetString(m_iDifficultySettingA[app.GetGameSettings(m_iPad,eGameSetting_Difficulty)]); + int size = 14; + if(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) + { + size = 12; + } + wchar_t startTags[64]; + swprintf(startTags,64,L"",app.GetHTMLColour(eHTMLColor_White),size); + wsText= startTags + wsText; + + m_DifficultyText.SetText(wsText.c_str()); + + + // If you are in-game, only the game host can change in-game gamertags, and you can't change difficulty + // only the primary player gets to change the autosave and difficulty settings + + bool bRemoveDifficulty=false; + bool bRemoveAutosave=false; + bool bRemoveInGameGamertags=false; + float fRemoveHeight=0.0f,fWidth,fHeight; + float fSlidersMoveUp=0.0f; + + if(!bPrimaryPlayer) + { + bRemoveDifficulty=true; + bRemoveAutosave=true; + bRemoveInGameGamertags=true; + } + + if(!bNotInGame) // in the game + { + bRemoveDifficulty=true; + if(!g_NetworkManager.IsHost()) + { + bRemoveAutosave=true; + bRemoveInGameGamertags=true; + } + } + + D3DXVECTOR3 vec1,vec2; + XuiElementGetPosition(m_ViewBob,&vec1); + XuiElementGetPosition(m_Hints,&vec2); + + float fCheckboxHeight=vec2.y-vec1.y; + + if(bRemoveDifficulty) + { + m_SliderA[SLIDER_SETTINGS_DIFFICULTY].SetEnable(FALSE); + m_SliderA[SLIDER_SETTINGS_DIFFICULTY].SetShow(FALSE); + m_DifficultyText.SetShow(FALSE); + hr=XuiElementGetChildById(m_SliderA[SLIDER_SETTINGS_DIFFICULTY].m_hObj,L"XuiSlider",&hSlider); + XuiElementSetShow(hSlider,FALSE); + XuiControlSetEnable(hSlider,FALSE); + m_SliderA[SLIDER_SETTINGS_DIFFICULTY].GetBounds(&fWidth,&fHeight); + fRemoveHeight+=fHeight+4.0f; // add padding + } + else + { + wstring wsText=app.GetString(m_iDifficultySettingA[app.GetGameSettings(m_iPad,eGameSetting_Difficulty)]); + int size = 14; + if(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) + { + size = 12; + } + wchar_t startTags[64]; + swprintf(startTags,64,L"",app.GetHTMLColour(eHTMLColor_White),size); + wsText= startTags + wsText; + + m_DifficultyText.SetText(wsText.c_str()); + } + + if(bRemoveAutosave) + { + m_SliderA[SLIDER_SETTINGS_AUTOSAVE].SetEnable(FALSE); + m_SliderA[SLIDER_SETTINGS_AUTOSAVE].SetShow(FALSE); + hr=XuiElementGetChildById(m_SliderA[SLIDER_SETTINGS_AUTOSAVE].m_hObj,L"XuiSlider",&hSlider); + XuiElementSetShow(hSlider,FALSE); + XuiControlSetEnable(hSlider,FALSE); + m_SliderA[SLIDER_SETTINGS_AUTOSAVE].GetBounds(&fWidth,&fHeight); + fRemoveHeight+=fHeight+4.0f; // add padding + } + + if(bRemoveInGameGamertags) + { + m_InGameGamertags.SetShow(FALSE); + m_InGameGamertags.SetEnable(FALSE); + m_InGameGamertags.GetBounds(&fWidth, &fHeight); + + // move the mash-up worlds option up + if(m_bMashUpWorldsUnhideOption) + { + D3DXVECTOR3 vec; + XuiElementGetPosition(m_InGameGamertags,&vec); + m_MashUpWorlds.SetPosition(&vec); + } + fRemoveHeight+=fCheckboxHeight;//fHeight+4.0f; // add padding + fSlidersMoveUp+=fCheckboxHeight; + } + + if(!m_bMashUpWorldsUnhideOption) + { + m_MashUpWorlds.SetShow(FALSE); + m_MashUpWorlds.SetEnable(FALSE); + m_MashUpWorlds.GetBounds(&fWidth, &fHeight); + fRemoveHeight+=fCheckboxHeight; + fSlidersMoveUp+=fCheckboxHeight; + } + + + if(fRemoveHeight>0.0f) + { + D3DXVECTOR3 vec; + // autosave should move up by the height of the number of checkboxes hidden + m_SliderA[SLIDER_SETTINGS_AUTOSAVE].GetPosition(&vec); + vec.y-=fSlidersMoveUp; + m_SliderA[SLIDER_SETTINGS_AUTOSAVE].SetPosition(&vec); + m_SliderA[SLIDER_SETTINGS_DIFFICULTY].GetPosition(&vec); + vec.y-=fSlidersMoveUp; + m_SliderA[SLIDER_SETTINGS_DIFFICULTY].SetPosition(&vec); + m_DifficultyText.GetPosition(&vec); + vec.y-=fSlidersMoveUp; + m_DifficultyText.SetPosition(&vec); + + float fbgnWidth, fBgnHeight; + GetBounds(&fbgnWidth, &fBgnHeight); + fBgnHeight-=fRemoveHeight; + SetBounds(fbgnWidth, fBgnHeight); + } + + // if we're not in the game, we need to use basescene 0 + if(bNotInGame) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + CXuiSceneBase::ShowBackground( DEFAULT_XUI_MENU_USER, TRUE ); + } + else + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + CXuiSceneBase::ShowBackground( m_iPad, FALSE ); + } + + if(app.GetLocalPlayerCount()>1) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + CXuiSceneBase::ShowLogo( m_iPad, FALSE ); + } + else + { + if(bNotInGame) + { + // can't show the logo for 480 mode + if(!RenderManager.IsHiDef()) + { + CXuiSceneBase::ShowLogo( DEFAULT_XUI_MENU_USER, FALSE ); + } + else + { + CXuiSceneBase::ShowLogo( DEFAULT_XUI_MENU_USER, TRUE ); + } + } + else + { + // can't show the logo for 480 mode + if(!RenderManager.IsHiDef()) + { + CXuiSceneBase::ShowLogo( m_iPad, FALSE ); + } + else + { + CXuiSceneBase::ShowLogo( m_iPad, TRUE ); + } + } + } + + return S_OK; +} + +HRESULT CScene_SettingsOptions::OnNotifyValueChanged( HXUIOBJ hObjSource, XUINotifyValueChanged* pNotifyValueChanged, BOOL& bHandled ) +{ + WCHAR TempString[256]; + + if(hObjSource==m_SliderA[SLIDER_SETTINGS_AUTOSAVE].GetSlider() ) + { + app.SetGameSettings(m_iPad,eGameSetting_Autosave,pNotifyValueChanged->nValue); + // Update the autosave timer + app.SetAutosaveTimerTime(); + + if(pNotifyValueChanged->nValue==0) + { + swprintf( (WCHAR *)TempString, 256, L"%ls", app.GetString( IDS_SLIDER_AUTOSAVE_OFF )); + } + else + { + app.SetAutosaveTimerTime(); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d %ls", app.GetString( IDS_SLIDER_AUTOSAVE ),pNotifyValueChanged->nValue*15, app.GetString( IDS_MINUTES )); + } + m_SliderA[SLIDER_SETTINGS_AUTOSAVE].SetText(TempString); + } + else if(hObjSource==m_SliderA[SLIDER_SETTINGS_DIFFICULTY].GetSlider() ) + { + app.SetGameSettings(m_iPad,eGameSetting_Difficulty,pNotifyValueChanged->nValue); + swprintf( (WCHAR *)TempString, 256, L"%ls: %ls", app.GetString( IDS_SLIDER_DIFFICULTY ),app.GetString(m_iDifficultyTitleSettingA[pNotifyValueChanged->nValue])); + m_SliderA[SLIDER_SETTINGS_DIFFICULTY].SetText(TempString); + + wstring wsText=app.GetString(m_iDifficultySettingA[pNotifyValueChanged->nValue]); + int size = 14; + if(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) + { + size = 12; + } + wchar_t startTags[64]; + swprintf(startTags,64,L"",app.GetHTMLColour(eHTMLColor_White),size); + wsText= startTags + wsText; + m_DifficultyText.SetText(wsText.c_str()); + } + return S_OK; +} + + +HRESULT CScene_SettingsOptions::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + HRESULT hr=S_OK; + + // Explicitly handle B button presses + switch(pInputData->dwKeyCode) + { + case VK_PAD_B: + case VK_ESCAPE: + // if the profile data has been changed, then force a profile write + // It seems we're allowed to break the 5 minute rule if it's the result of a user action + + // check the checkboxes + app.SetGameSettings(m_iPad,eGameSetting_ViewBob,m_ViewBob.IsChecked()?1:0); + app.SetGameSettings(m_iPad,eGameSetting_GamertagsVisible,m_InGameGamertags.IsChecked()?1:0); + app.SetGameSettings(m_iPad,eGameSetting_Hints,m_Hints.IsChecked()?1:0); + app.SetGameSettings(m_iPad,eGameSetting_Tooltips,m_Tooltips.IsChecked()?1:0); + + // the mashup option will only be shown if some worlds have been previously hidden + if(m_bMashUpWorldsUnhideOption && m_MashUpWorlds.IsChecked()) + { + // unhide all worlds + app.EnableMashupPackWorlds(m_iPad); + } + + // 4J-PB - don't action changes here or we might write to the profile on backing out here and then get a change in the settings all, and write again on backing out there + //app.CheckGameSettingsChanged(true,pInputData->UserIndex); + + app.NavigateBack(pInputData->UserIndex); + rfHandled = TRUE; + break; + } + + return hr; +} + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_SettingsOptions::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + return S_OK; +} + +HRESULT CScene_SettingsOptions::OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) +{ + // added so we can skip greyed out items + pControlNavigateData->hObjDest=XuiControlGetNavigation(pControlNavigateData->hObjSource,pControlNavigateData->nControlNavigate,TRUE,TRUE); + + if(pControlNavigateData->hObjDest!=NULL) + { + bHandled=TRUE; + } + + return S_OK; +} + +HRESULT CScene_SettingsOptions::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ) +{ + HRESULT hr; + WCHAR TempString[256]; + + if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) return S_OK; + + if(pTransition->dwTransType == XUI_TRANSITION_TO || pTransition->dwTransType == XUI_TRANSITION_BACKTO) + { + + // 4J-PB - Going to resize buttons if the text is too big to fit on any of them (Br-pt problem with the length of Unlock Full Game) + + float fMaxTextLen=0.0f; + float fMaxLen=0.0f; + + + // sliders first + HXUIOBJ hSlider,hVisual,hText,hCheckboxText; + XUIRect xuiRect; + float fWidth,fHeight;//,fTemp; + D3DXVECTOR3 vec,vSlider,vecCheckboxText,vecCheckbox; + + // don't display values on these - we handle that + for(int i=0;ifMaxTextLen) fMaxTextLen=xuiRect.right; + if(fWidth>fMaxLen) fMaxLen=fWidth; + } + + // now the VisibleOnMaps checkbox - let's just use the visual we already have... + hr=XuiTextPresenterMeasureText(hCheckboxText, m_InGameGamertags.GetText(), &xuiRect); + m_InGameGamertags.GetBounds(&fWidth,&fHeight); + // need to add the size of the checkbox graphic + if((xuiRect.right+vecCheckbox.x+vecCheckboxText.x)>fMaxTextLen) fMaxTextLen=xuiRect.right+vecCheckbox.x+vecCheckboxText.x; + if(fWidth>fMaxLen) fMaxLen=fWidth; + + // now the m_Hints checkbox - let's just use the visual we already have... + hr=XuiTextPresenterMeasureText(hCheckboxText, m_Hints.GetText(), &xuiRect); + m_Hints.GetBounds(&fWidth,&fHeight); + // need to add the size of the checkbox graphic + if((xuiRect.right+vecCheckbox.x+vecCheckboxText.x)>fMaxTextLen) fMaxTextLen=xuiRect.right+vecCheckbox.x+vecCheckboxText.x; + if(fWidth>fMaxLen) fMaxLen=fWidth; + + // now the m_Tooltips checkbox - let's just use the visual we already have... + hr=XuiTextPresenterMeasureText(hCheckboxText, m_Tooltips.GetText(), &xuiRect); + m_Tooltips.GetBounds(&fWidth,&fHeight); + // need to add the size of the checkbox graphic + if((xuiRect.right+vecCheckbox.x+vecCheckboxText.x)>fMaxTextLen) fMaxTextLen=xuiRect.right+vecCheckbox.x+vecCheckboxText.x; + if(fWidth>fMaxLen) fMaxLen=fWidth; + + if(fMaxLen1) + { + // scene width needs to be more that the text width on buttons + fWidth=vSlider.x; + vec.x=floorf((640.0f-(fMaxTextLen+fWidth))/2.0f); + XuiElementSetPosition(m_hObj,&vec); + XuiElementSetBounds(m_hObj,fMaxTextLen+(fWidth*2.0f),fHeight); + } + else + { + fWidth=vSlider.x; + vec.x=floorf((1280.0f-(fMaxTextLen+fWidth))/2.0f); + XuiElementSetPosition(m_hObj,&vec); + XuiElementSetBounds(m_hObj,fMaxTextLen+(fWidth*2.0f),fHeight); + } + // Need to refresh the scenes visual since the object size has now changed + XuiControlAttachVisual(m_hObj); + + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + + if(bNotInGame) + { + float fDiffTextW; + // reposition the difficulty text - this is positioned from the scene, so will be a negative value + m_DifficultyText.GetPosition(&vec); + m_DifficultyText.GetBounds(&fDiffTextW,&fHeight); + vec.x=floor((fMaxTextLen+(fWidth*2.0f)-fDiffTextW)/2.0f); + m_DifficultyText.SetPosition(&vec); + } + + // centre is vec.x+(fWidth/2) + //for(int i=0;ipvInitData; + // if we're not in the game, we need to use basescene 0 + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + bool bPrimaryPlayer = ProfileManager.GetPrimaryPad()==m_iPad; + + MapChildControls(); + + m_SplitScreen.SetCheck( (app.GetGameSettings(m_iPad,eGameSetting_SplitScreenVertical)!=0)?TRUE:FALSE); + m_SplitScreen.SetText(app.GetString( IDS_CHECKBOX_VERTICAL_SPLIT_SCREEN ) ); + + m_SplitScreenGamertags.SetCheck( (app.GetGameSettings(m_iPad,eGameSetting_DisplaySplitscreenGamertags)!=0)?TRUE:FALSE); + m_SplitScreenGamertags.SetText(app.GetString( IDS_CHECKBOX_DISPLAY_SPLITSCREENGAMERTAGS )); + + m_SliderA[SLIDER_SETTINGS_UISIZE].SetValue(app.GetGameSettings(m_iPad,eGameSetting_UISize)+1); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d", app.GetString( IDS_SLIDER_UISIZE ),app.GetGameSettings(m_iPad,eGameSetting_UISize)+1); + m_SliderA[SLIDER_SETTINGS_UISIZE].SetText(TempString); + + m_SliderA[SLIDER_SETTINGS_UISIZESPLITSCREEN].SetValue(app.GetGameSettings(m_iPad,eGameSetting_UISizeSplitscreen)+1); + swprintf( (WCHAR *)TempString, 256, L"%ls: %d", app.GetString( IDS_SLIDER_UISIZESPLITSCREEN ),app.GetGameSettings(m_iPad,eGameSetting_UISizeSplitscreen)+1); + m_SliderA[SLIDER_SETTINGS_UISIZESPLITSCREEN].SetText(TempString); + + m_DisplayHUD.SetCheck( (app.GetGameSettings(m_iPad,eGameSetting_DisplayHUD)!=0)?TRUE:FALSE); + m_DisplayHUD.SetText(app.GetString( IDS_CHECKBOX_DISPLAY_HUD )); + + m_DisplayHand.SetCheck( (app.GetGameSettings(m_iPad,eGameSetting_DisplayHand)!=0)?TRUE:FALSE); + m_DisplayHand.SetText(app.GetString( IDS_CHECKBOX_DISPLAY_HAND )); + + m_DeathMessages.SetCheck( (app.GetGameSettings(m_iPad,eGameSetting_DeathMessages)!=0)?TRUE:FALSE); + m_DeathMessages.SetText(app.GetString( IDS_CHECKBOX_DEATH_MESSAGES )); + + m_AnimatedCharacter.SetCheck( (app.GetGameSettings(m_iPad,eGameSetting_AnimatedCharacter)!=0)?TRUE:FALSE); + m_AnimatedCharacter.SetText(app.GetString( IDS_CHECKBOX_ANIMATED_CHARACTER )); + + // if we're not in the game, we need to use basescene 0 + if(bNotInGame) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + CXuiSceneBase::ShowBackground( DEFAULT_XUI_MENU_USER, TRUE ); + } + else + { + // If the game has started, then you need to be the host to change the in-game gamertags + if(!bPrimaryPlayer) + { + // hide things we don't want the splitscreen player changing + m_SplitScreen.SetShow(FALSE); + m_SplitScreen.SetEnable(FALSE); + m_SplitScreenGamertags.SetShow(FALSE); + m_SplitScreenGamertags.SetEnable(FALSE); + + // move the sliders up, and resize the scene + float fRemoveHeight=0.0f, fHeight, fWidth; + D3DXVECTOR3 vec; + + m_SplitScreen.GetBounds(&fWidth, &fHeight); + fRemoveHeight+=fHeight+4.0f; // add padding + m_SplitScreenGamertags.GetBounds(&fWidth, &fHeight); + fRemoveHeight+=fHeight+4.0f; // add padding + + m_SliderA[SLIDER_SETTINGS_UISIZE].GetPosition(&vec); + vec.y-=fRemoveHeight; + m_SliderA[SLIDER_SETTINGS_UISIZE].SetPosition(&vec); + m_SliderA[SLIDER_SETTINGS_UISIZESPLITSCREEN].GetPosition(&vec); + vec.y-=fRemoveHeight; + m_SliderA[SLIDER_SETTINGS_UISIZESPLITSCREEN].SetPosition(&vec); + + GetBounds(&fWidth, &fHeight); + fHeight-=fRemoveHeight; + SetBounds(fWidth, fHeight); + } + + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + CXuiSceneBase::ShowBackground( m_iPad, FALSE ); + } + + + if(app.GetLocalPlayerCount()>1) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + CXuiSceneBase::ShowLogo( m_iPad, FALSE ); + } + else + { + if(bNotInGame) + { + CXuiSceneBase::ShowLogo( DEFAULT_XUI_MENU_USER, TRUE ); + } + else + { + CXuiSceneBase::ShowLogo( m_iPad, TRUE ); + } + } + + return S_OK; +} + +HRESULT CScene_SettingsUI::OnNotifyValueChanged( HXUIOBJ hObjSource, XUINotifyValueChanged* pNotifyValueChanged, BOOL& bHandled ) +{ + WCHAR TempString[256]; + + if(hObjSource==m_SliderA[SLIDER_SETTINGS_UISIZE].GetSlider() ) + { + // slider is 1 to 3 + + // is this different from the current value? + swprintf( (WCHAR *)TempString, 256, L"%ls: %d", app.GetString( IDS_SLIDER_UISIZE ),pNotifyValueChanged->nValue); + m_SliderA[SLIDER_SETTINGS_UISIZE].SetText(TempString); + if(pNotifyValueChanged->nValue != app.GetGameSettings(m_iPad,eGameSetting_UISize)+1) + { + app.SetGameSettings(m_iPad,eGameSetting_UISize,pNotifyValueChanged->nValue-1); + // Apply the changes to the selected text position + CXuiSceneBase::UpdateSelectedItemPos(m_iPad); + } + } + else if(hObjSource==m_SliderA[SLIDER_SETTINGS_UISIZESPLITSCREEN].GetSlider() ) + { + swprintf( (WCHAR *)TempString, 256, L"%ls: %d", app.GetString( IDS_SLIDER_UISIZESPLITSCREEN ),pNotifyValueChanged->nValue); + m_SliderA[SLIDER_SETTINGS_UISIZESPLITSCREEN].SetText(TempString); + + if(pNotifyValueChanged->nValue != app.GetGameSettings(m_iPad,eGameSetting_UISizeSplitscreen)+1) + { + // slider is 1 to 3 + app.SetGameSettings(m_iPad,eGameSetting_UISizeSplitscreen,pNotifyValueChanged->nValue-1); + // Apply the changes to the selected text position + CXuiSceneBase::UpdateSelectedItemPos(m_iPad); + } + } + + return S_OK; +} + + +HRESULT CScene_SettingsUI::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + HRESULT hr=S_OK; + + // Explicitly handle B button presses + switch(pInputData->dwKeyCode) + { + case VK_PAD_B: + case VK_ESCAPE: + // if the profile data has been changed, then force a profile write + // It seems we're allowed to break the 5 minute rule if it's the result of a user action + + // not in this scene - app.CheckGameSettingsChanged(true,pInputData->UserIndex); + + // check the checkboxes + app.SetGameSettings(m_iPad,eGameSetting_DisplayHUD,m_DisplayHUD.IsChecked()?1:0); + app.SetGameSettings(m_iPad,eGameSetting_DisplayHand,m_DisplayHand.IsChecked()?1:0); + app.SetGameSettings(m_iPad,eGameSetting_DisplaySplitscreenGamertags,m_SplitScreenGamertags.IsChecked()?1:0); + app.SetGameSettings(m_iPad,eGameSetting_DeathMessages,m_DeathMessages.IsChecked()?1:0); + app.SetGameSettings(m_iPad,eGameSetting_AnimatedCharacter,m_AnimatedCharacter.IsChecked()?1:0); + + // if the splitscreen vertical/horizontal has changed, need to update the scenes + if(app.GetGameSettings(m_iPad,eGameSetting_SplitScreenVertical)!=(m_SplitScreen.IsChecked()?1:0)) + { + // changed + app.SetGameSettings(m_iPad,eGameSetting_SplitScreenVertical,m_SplitScreen.IsChecked()?1:0); + + // close the xui scenes, so we don't have the navigate backed to menu at the wrong place + if(app.GetLocalPlayerCount()==2) + { + app.CloseAllPlayersXuiScenes(); + } + else + { + app.NavigateBack(pInputData->UserIndex); + } + } + else + { + app.NavigateBack(pInputData->UserIndex); + } + + + rfHandled = TRUE; + break; + } + + return hr; +} + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_SettingsUI::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + return S_OK; +} + +HRESULT CScene_SettingsUI::OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) +{ + // added so we can skip greyed out items + pControlNavigateData->hObjDest=XuiControlGetNavigation(pControlNavigateData->hObjSource,pControlNavigateData->nControlNavigate,TRUE,TRUE); + + if(pControlNavigateData->hObjDest!=NULL) + { + bHandled=TRUE; + } + + return S_OK; +} + +HRESULT CScene_SettingsUI::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ) +{ + HRESULT hr; + WCHAR TempString[256]; + if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) return S_OK; + + if(pTransition->dwTransType == XUI_TRANSITION_TO || pTransition->dwTransType == XUI_TRANSITION_BACKTO) + { + // 4J-PB - Going to resize buttons if the text is too big to fit on any of them (Br-pt problem with the length of Unlock Full Game) + + float fMaxTextLen=0.0f; + float fMaxLen=0.0f; + + // sliders first + HXUIOBJ hSlider,hVisual,hText,hCheckboxText; + XUIRect xuiRect; + float fWidth,fHeight;//,fTemp; + D3DXVECTOR3 vec,vecCheckboxText,vSlider,vecCheckbox; + + hr=XuiControlGetVisual(m_SplitScreen.m_hObj,&hVisual); + hr=XuiElementGetChildById(hVisual,L"text_Button",&hCheckboxText); + hr=XuiElementGetPosition(hCheckboxText,&vecCheckboxText); + hr=XuiElementGetPosition(m_SplitScreen.m_hObj,&vecCheckbox); + hr=XuiElementGetChildById(m_SliderA[SLIDER_SETTINGS_UISIZESPLITSCREEN].m_hObj,L"XuiSlider",&hSlider); + hr=XuiControlGetVisual(hSlider,&hVisual); + hr=XuiElementGetChildById(hVisual,L"text_Label",&hText); + hr=XuiElementGetPosition(m_SliderA[SLIDER_SETTINGS_UISIZE].m_hObj,&vSlider); + + + // don't display values on these - we handle that + for(int i=0;ifMaxTextLen) fMaxTextLen=xuiRect.right; + if(fWidth>fMaxLen) fMaxLen=fWidth; + } + + // now the m_SplitScreen checkbox - let's just use the visual we already have... + + hr=XuiTextPresenterMeasureText(hCheckboxText, m_SplitScreen.GetText(), &xuiRect); + m_SplitScreen.GetBounds(&fWidth,&fHeight); + // need to add the size of the checkbox graphic + if((xuiRect.right+vecCheckbox.x+vecCheckboxText.x)>fMaxTextLen) fMaxTextLen=xuiRect.right+vecCheckbox.x+vecCheckboxText.x; + if(fWidth>fMaxLen) fMaxLen=fWidth; + + // now the m_SplitScreenGamertags checkbox - let's just use the visual we already have... + + hr=XuiTextPresenterMeasureText(hCheckboxText, m_SplitScreenGamertags.GetText(), &xuiRect); + m_SplitScreenGamertags.GetBounds(&fWidth,&fHeight); + // need to add the size of the checkbox graphic + if((xuiRect.right+vecCheckbox.x+vecCheckboxText.x)>fMaxTextLen) fMaxTextLen=xuiRect.right+vecCheckbox.x+vecCheckboxText.x; + if(fWidth>fMaxLen) fMaxLen=fWidth; + + // now the m_DisplayHUD checkbox - let's just use the visual we already have... + + hr=XuiTextPresenterMeasureText(hCheckboxText, m_DisplayHUD.GetText(), &xuiRect); + m_DisplayHUD.GetBounds(&fWidth,&fHeight); + // need to add the size of the checkbox graphic + if((xuiRect.right+vecCheckbox.x+vecCheckboxText.x)>fMaxTextLen) fMaxTextLen=xuiRect.right+vecCheckbox.x+vecCheckboxText.x; + if(fWidth>fMaxLen) fMaxLen=fWidth; + + + // now the m_DisplayHand checkbox - let's just use the visual we already have... + hr=XuiTextPresenterMeasureText(hCheckboxText, m_DisplayHand.GetText(), &xuiRect); + m_DisplayHand.GetBounds(&fWidth,&fHeight); + // need to add the size of the checkbox graphic + if((xuiRect.right+vecCheckbox.x+vecCheckboxText.x)>fMaxTextLen) fMaxTextLen=xuiRect.right+vecCheckbox.x+vecCheckboxText.x; + if(fWidth>fMaxLen) fMaxLen=fWidth; + + + // now the m_DeathMessages checkbox - let's just use the visual we already have... + hr=XuiTextPresenterMeasureText(hCheckboxText, m_DeathMessages.GetText(), &xuiRect); + m_DeathMessages.GetBounds(&fWidth,&fHeight); + // need to add the size of the checkbox graphic + if((xuiRect.right+vecCheckbox.x+vecCheckboxText.x)>fMaxTextLen) fMaxTextLen=xuiRect.right+vecCheckbox.x+vecCheckboxText.x; + if(fWidth>fMaxLen) fMaxLen=fWidth; + + if(fMaxLen1) + { + // scene width needs to be more that the text width on buttons + fWidth=vSlider.x; + vec.x=floorf((640.0f-(fMaxTextLen+fWidth))/2.0f); + XuiElementSetPosition(m_hObj,&vec); + XuiElementSetBounds(m_hObj,fMaxTextLen+(fWidth*2.0f),fHeight); + } + else + { + fWidth=vSlider.x; + vec.x=floorf((1280.0f-(fMaxTextLen+fWidth))/2.0f); + XuiElementSetPosition(m_hObj,&vec); + XuiElementSetBounds(m_hObj,fMaxTextLen+(fWidth*2.0f),fHeight); + } + + m_SplitScreen.SetBounds(fMaxTextLen,fHeight); + m_SplitScreenGamertags.SetBounds(fMaxTextLen,fHeight); + m_DisplayHUD.SetBounds(fMaxTextLen,fHeight); + m_DisplayHand.SetBounds(fMaxTextLen,fHeight); + m_DeathMessages.SetBounds(fMaxTextLen,fHeight); + + // Need to refresh the scenes visual since the object size has now changed + XuiControlAttachVisual(m_hObj); + } + } + + return S_OK; +} + +HRESULT CScene_SettingsUI::OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled) +{ + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + + // if we're not in the game, we need to use basescene 0 + if(bNotInGame) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + } + else + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + } + + return S_OK; +} + +HRESULT CScene_SettingsUI::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) +{ + bHandled=true; + return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining); +} + diff --git a/Minecraft.Client/Common/XUI/XUI_SettingsUI.h b/Minecraft.Client/Common/XUI/XUI_SettingsUI.h new file mode 100644 index 00000000..12bffead --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_SettingsUI.h @@ -0,0 +1,65 @@ +#pragma once + +#include "../media/xuiscene_settings_UI.h" +#include "XUI_Ctrl_SliderWrapper.h" +#include "XUI_CustomMessages.h" + + +#define SLIDER_SETTINGS_UISIZE 0 +#define SLIDER_SETTINGS_UISIZESPLITSCREEN 1 + + +#define SLIDER_SETTINGS_UI_MAX SLIDER_SETTINGS_UISIZESPLITSCREEN + 1 +class CScene_SettingsUI : public CXuiSceneImpl +{ +protected: + CXuiCtrlSliderWrapper m_SliderA[SLIDER_SETTINGS_UI_MAX]; + CXuiCheckbox m_DisplayHUD; + CXuiCheckbox m_DisplayHand; + CXuiCheckbox m_DeathMessages; + CXuiCheckbox m_AnimatedCharacter; + CXuiCheckbox m_SplitScreen; + CXuiCheckbox m_SplitScreenGamertags; + + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN( OnKeyDown ) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_NOTIFY_VALUE_CHANGED( OnNotifyValueChanged ) + XUI_ON_XM_CONTROL_NAVIGATE( OnControlNavigate ) + XUI_ON_XM_TRANSITION_START(OnTransitionStart) + XUI_ON_XM_NAV_RETURN(OnNavReturn) + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + XUI_END_MSG_MAP() + + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_XuiSplitScreen, m_SplitScreen) + MAP_CONTROL(IDC_XuiShowSplitscreenGamertags, m_SplitScreenGamertags) + MAP_CONTROL(IDC_XuiDisplayHUD, m_DisplayHUD) + MAP_CONTROL(IDC_XuiDisplayHand, m_DisplayHand) + MAP_CONTROL(IDC_XuiDisplayDeathMessages, m_DeathMessages) + MAP_CONTROL(IDC_XuiShowAnimatedCharacter, m_AnimatedCharacter) + MAP_CONTROL(IDC_XuiSliderUISize, m_SliderA[SLIDER_SETTINGS_UISIZE]) + MAP_CONTROL(IDC_XuiSliderUISizeSplitscreen, m_SliderA[SLIDER_SETTINGS_UISIZESPLITSCREEN]) + + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnKeyDown(XUIMessageInput *pInputData, BOOL& bHandled); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled); + HRESULT OnNotifyValueChanged( HXUIOBJ hObjSource, XUINotifyValueChanged* pNotifyValueChanged, BOOL& bHandled ); + HRESULT OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled); + HRESULT OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ); + HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled); + HRESULT OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled); + + int m_iPad; + D3DXVECTOR3 m_OriginalPosition; + +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_SettingsUI, L"CScene_SettingsUI", XUI_CLASS_SCENE ) +}; diff --git a/Minecraft.Client/Common/XUI/XUI_SignEntry.cpp b/Minecraft.Client/Common/XUI/XUI_SignEntry.cpp new file mode 100644 index 00000000..378ac147 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_SignEntry.cpp @@ -0,0 +1,113 @@ +#include "stdafx.h" +#include "..\..\..\MultiplayerLevel.h" +#include "..\..\..\Minecraft.World\SignTileEntity.h" +#include "..\..\..\Minecraft.World\Entity.h" +#include "..\..\..\Minecraft.World\Level.h" +#include "..\..\..\Minecraft.Client\LocalPlayer.h" +#include "..\..\..\Minecraft.Client\ClientConnection.h" +#include "..\..\..\Minecraft.Client\MultiPlayerLocalPlayer.h" +#include "XUI_SignEntry.h" + +HRESULT CScene_SignEntry::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + MapChildControls(); + + XuiControlSetText(m_ButtonDone,app.GetString(IDS_DONE)); + XuiControlSetText(m_labelEditSign,app.GetString(IDS_EDIT_SIGN_MESSAGE)); + + SignEntryScreenInput* initData = (SignEntryScreenInput*)pInitData->pvInitData; + m_sign = initData->sign; + + CXuiSceneBase::ShowDarkOverlay( initData->iPad, TRUE ); + CXuiSceneBase::ShowLogo( initData->iPad, FALSE); + ui.SetTooltips( initData->iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + + if(app.GetLocalPlayerCount()>1) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,initData->iPad); + } + + + for(unsigned int i = 0; iGetMessage(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); + } + + + return S_OK; +} + +HRESULT CScene_SignEntry::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + if(hObjPressed==m_ButtonDone) + { + // 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_signRows[i].GetText(); + m_sign->SetMessage(i,temp); + } + + m_sign->setChanged(); + + Minecraft *pMinecraft=Minecraft::GetInstance(); + // need to send the new data + if (pMinecraft->level->isClientSide) + { + shared_ptr player = pMinecraft->localplayers[pNotifyPressData->UserIndex]; + if(player != NULL && player->connection && player->connection->isStarted()) + { + player->connection->send( shared_ptr( new SignUpdatePacket(m_sign->x, m_sign->y, m_sign->z, m_sign->IsVerified(), m_sign->IsCensored(), m_sign->GetMessages()) ) ); + } + } + app.CloseXuiScenes(pNotifyPressData->UserIndex); + } + return S_OK; +} + +HRESULT CScene_SignEntry::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + switch(pInputData->dwKeyCode) + { + case VK_PAD_B: + case VK_ESCAPE: + // user backed out, so wipe the sign + wstring temp=L""; + + for(int i=0;i<4;i++) + { + m_sign->SetMessage(i,temp); + } + + app.CloseXuiScenes(pInputData->UserIndex); + rfHandled = TRUE; + + CXuiSceneBase::PlayUISFX(eSFX_Back); + break; + } + + + return S_OK; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_SignEntry.h b/Minecraft.Client/Common/XUI/XUI_SignEntry.h new file mode 100644 index 00000000..4f8c44d2 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_SignEntry.h @@ -0,0 +1,49 @@ +#pragma once +#include "../media/xuiscene_signentry.h" +#include "XUI_Ctrl_4JEdit.h" +#include "XUI_CustomMessages.h" + +#define SIGN_ENTRY_ROWS_MAX 4 + +class SignTileEntity; + +class CScene_SignEntry : public CXuiSceneImpl +{ + protected: + // Control and Element wrapper objects. + CXuiCtrl4JEdit m_signRows[4]; + CXuiControl m_ButtonDone; + CXuiControl m_labelEditSign; + + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_EditSignMessage, m_labelEditSign) + MAP_CONTROL(IDC_ButtonDone, m_ButtonDone) + MAP_CONTROL(IDC_EditLineOne, m_signRows[0]) + MAP_CONTROL(IDC_EditLineTwo, m_signRows[1]) + MAP_CONTROL(IDC_EditLineThree, m_signRows[2]) + MAP_CONTROL(IDC_EditLineFour, m_signRows[3]) + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_SignEntry, L"CScene_SignEntry", XUI_CLASS_SCENE ) + +private: + shared_ptr m_sign; + D3DXVECTOR3 m_OriginalPosition; + +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_SkinSelect.cpp b/Minecraft.Client/Common/XUI/XUI_SkinSelect.cpp new file mode 100644 index 00000000..ee706610 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_SkinSelect.cpp @@ -0,0 +1,1444 @@ +#include "stdafx.h" +#include "XUI_SkinSelect.h" +#include "XUI_Ctrl_MinecraftSkinPreview.h" + +#define SKIN_SELECT_PACK_DEFAULT 0 +#define SKIN_SELECT_PACK_FAVORITES 1 +//#define SKIN_SELECT_PACK_PLAYER_CUSTOM 1 +#define SKIN_SELECT_MAX_DEFAULTS 2 + +WCHAR *CScene_SkinSelect::wchDefaultNamesA[]= +{ + L"USE LOCALISED VERSION", // Server selected + L"Steve", + L"Tennis Steve", + L"Tuxedo Steve", + L"Athlete Steve", + L"Scottish Steve", + L"Prisoner Steve", + L"Cyclist Steve", + L"Boxer Steve", +}; + + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_SkinSelect::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + m_iPad=*(int *)pInitData->pvInitData; + // if we're not in the game, we need to use basescene 0 + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + m_bIgnoreInput=false; + + // 4J Stu - Added this so that we have skins loaded + // 4J-PB - Need to check for installed DLC + //if( (!app.DLCInstalled() || app.m_dlcManager.NeedsUpdated()) && !app.DLCInstallPending()) app.StartInstallDLCProcess(m_iPad); + + // StartInstallDLCProcess will check for all conditions within the call + MapChildControls(); + + m_selectedText.SetText( app.GetString( IDS_SELECTED ) ); + + updateClipping(); + + m_packIndex = SKIN_SELECT_PACK_DEFAULT; + m_skinIndex = 0; + m_currentSkinPath = app.GetPlayerSkinName(m_iPad); + m_originalSkinId = app.GetPlayerSkinId(m_iPad); + m_currentPack = NULL; + m_bSlidingSkins = false; + m_bAnimatingMove = false; + currentPackCount = 0; + + m_currentNavigation = eSkinNavigation_Skin; + m_normalTabs.SetShow( TRUE ); + m_selectedTabs.SetShow( FALSE ); + m_packLeft.SetEnable(FALSE); + m_packRight.SetEnable(FALSE); + + + for(BYTE i = 0; i < sidePreviewControls; ++i) + { + //m_previewNextControl->SetAutoRotate(true); + m_previewNextControls[i]->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Left); + //m_previewPreviousControl->SetAutoRotate(true); + m_previewPreviousControls[i]->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Right); + } + + // block input if we're waiting for DLC to install. The end of dlc mounting custom message will fill the save list + if(app.StartInstallDLCProcess(m_iPad)) + { + // DLC mounting in progress, so disable input + m_bIgnoreInput=true; + m_timer.SetShow( TRUE ); + m_charactersGroup.SetShow( FALSE ); + m_skinDetails.SetShow( FALSE ); + m_imagePadlock.SetShow( FALSE ); + m_selectedGroup.SetShow( FALSE ); + } + else + { + m_timer.SetShow( FALSE ); + + if(app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin)>0) + { + // Change to display the favorites if there are any. The current skin will be in there (probably) - need to check for it + m_currentPack = app.m_dlcManager.getPackContainingSkin(m_currentSkinPath); + bool bFound; + if(m_currentPack != NULL) + { + m_packIndex = app.m_dlcManager.getPackIndex(m_currentPack,bFound,DLCManager::e_DLCType_Skin) + SKIN_SELECT_MAX_DEFAULTS; + } + } + + // If we have any favourites, set this to the favourites + // first validate the favorite skins - we might have uninstalled the DLC needed for them + app.ValidateFavoriteSkins(m_iPad); + + if(app.GetPlayerFavoriteSkinsCount(m_iPad)>0) + { + m_packIndex = SKIN_SELECT_PACK_FAVORITES; + } + + handlePackIndexChanged(); + updateCurrentFocus(); + } + + // Display the tooltips + + // if we're not in the game, we need to use basescene 0 + if(bNotInGame) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT_SKIN,IDS_TOOLTIPS_CANCEL,-1,-1,-1,-1,-1,-1,IDS_TOOLTIPS_NAVIGATE); + CXuiSceneBase::ShowBackground( DEFAULT_XUI_MENU_USER, TRUE ); + } + else + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT_SKIN,IDS_TOOLTIPS_CANCEL,-1,-1,-1,-1,-1,-1,IDS_TOOLTIPS_NAVIGATE); + CXuiSceneBase::ShowBackground( m_iPad, FALSE ); + CXuiSceneBase::ShowDarkOverlay( m_iPad, TRUE ); + } + + + if(app.GetLocalPlayerCount()>1) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad, false); + CXuiSceneBase::ShowLogo( m_iPad, FALSE ); + } + else + { + if(bNotInGame) + { + CXuiSceneBase::ShowLogo( DEFAULT_XUI_MENU_USER, FALSE ); + } + else + { + CXuiSceneBase::ShowLogo( m_iPad, FALSE ); + } + } + + return S_OK; +} + + +HRESULT CScene_SkinSelect::OnKeyUp(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + + switch(pInputData->dwKeyCode) + { + case VK_PAD_RTHUMB_LEFT: + m_previewControl->m_incYRot = false; + break; + case VK_PAD_RTHUMB_RIGHT: + m_previewControl->m_decYRot = false; + break; + case VK_PAD_RTHUMB_UP: + //m_previewControl->m_incXRot = false; + break; + case VK_PAD_RTHUMB_DOWN: + //m_previewControl->m_decXRot = false; + break; + case VK_PAD_RTHUMB_UPLEFT: + m_previewControl->m_incYRot = false; + //m_previewControl->m_incXRot = false; + break; + case VK_PAD_RTHUMB_UPRIGHT: + m_previewControl->m_decYRot = false; + //m_previewControl->m_incXRot = false; + break; + case VK_PAD_RTHUMB_DOWNRIGHT: + m_previewControl->m_decYRot = false; + //m_previewControl->m_decXRot = false; + break; + case VK_PAD_RTHUMB_DOWNLEFT: + m_previewControl->m_incYRot = false; + //m_previewControl->m_decXRot = false; + break; + } + return S_OK; +} + + +HRESULT CScene_SkinSelect::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + + // 4J Stu - We don't want the press anim to play for the scrolling unless we are actually scrolling + //ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + // ignore any key press if we are animating a move + //if(m_bAnimatingMove) return S_OK; + + HRESULT hr=S_OK; + + // Explicitly handle B button presses + switch(pInputData->dwKeyCode) + { + case VK_PAD_A: + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + // if the profile data has been changed, then force a profile write + // It seems we're allowed to break the 5 minute rule if it's the result of a user action + switch(m_packIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + app.SetPlayerSkin(pInputData->UserIndex, m_skinIndex); + app.SetPlayerCape(pInputData->UserIndex, 0); + m_currentSkinPath = app.GetPlayerSkinName(m_iPad); + m_originalSkinId = app.GetPlayerSkinId(m_iPad); + m_selectedGroup.SetShow( TRUE ); + CXuiSceneBase::PlayUISFX(eSFX_Press); + break; + case SKIN_SELECT_PACK_FAVORITES: + if(app.GetPlayerFavoriteSkinsCount(m_iPad)>0) + { + // get the pack number from the skin id + wchar_t chars[256]; + swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(m_iPad,m_skinIndex)); + + DLCPack *Pack=app.m_dlcManager.getPackContainingSkin(chars); + + if(Pack) + { + DLCSkinFile *skinFile = Pack->getSkinFile(chars); + app.SetPlayerSkin(pInputData->UserIndex, skinFile->getPath()); + app.SetPlayerCape(pInputData->UserIndex, skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape)); + m_selectedGroup.SetShow( TRUE ); + m_currentSkinPath = app.GetPlayerSkinName(m_iPad); + m_originalSkinId = app.GetPlayerSkinId(m_iPad); + app.SetPlayerFavoriteSkinsPos(m_iPad,m_skinIndex); + } + } + break; + default: + if( m_currentPack != NULL ) + { + DLCSkinFile *skinFile = m_currentPack->getSkinFile(m_skinIndex); + + // Is this a free skin? + + if(!skinFile->getParameterAsBool( DLCManager::e_DLCParamType_Free )) + { + // do we have a license? + if(!m_currentPack->hasPurchasedFile( DLCManager::e_DLCType_Skin, skinFile->getPath() )) + { + // no + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + + // We need to upsell the full version + if(ProfileManager.IsGuest(m_iPad)) + { + // can't buy + StorageManager.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + } + // are we online? + else if(!ProfileManager.IsSignedInLive(pInputData->UserIndex)) + { + // need to be signed in to live + StorageManager.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); + } + else + { + // upsell + + DLC_INFO *pDLCInfo = app.GetDLCInfoForTrialOfferID(m_currentPack->getPurchaseOfferId()); + ULONGLONG ullOfferID_Full; + + if(pDLCInfo!=NULL) + { + ullOfferID_Full=pDLCInfo->ullOfferID_Full; + } + else + { + ullOfferID_Full=m_currentPack->getPurchaseOfferId(); + } + + // tell sentient about the upsell of the full version of the skin pack + TelemetryManager->RecordUpsellPresented(pInputData->UserIndex, eSet_UpsellID_Skin_DLC, ullOfferID_Full & 0xFFFFFFFF); + + UINT uiIDA[2]; + uiIDA[0]=IDS_CONFIRM_OK; + uiIDA[1]=IDS_CONFIRM_CANCEL; + + StorageManager.RequestMessageBox(IDS_UNLOCK_DLC_TITLE, IDS_UNLOCK_DLC_SKIN, uiIDA, 2, pInputData->UserIndex,&CScene_SkinSelect::UnlockSkinReturned,this,app.GetStringTable()); + } + } + else + { + app.SetPlayerSkin(pInputData->UserIndex, skinFile->getPath()); + app.SetPlayerCape(pInputData->UserIndex, skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape)); + m_selectedGroup.SetShow( TRUE ); + m_currentSkinPath = app.GetPlayerSkinName(m_iPad); + m_originalSkinId = app.GetPlayerSkinId(m_iPad); + + // push this onto the favorite list + AddFavoriteSkin(m_iPad,GET_DLC_SKIN_ID_FROM_BITMASK(m_originalSkinId)); + } + } + else + { + app.SetPlayerSkin(pInputData->UserIndex, skinFile->getPath()); + app.SetPlayerCape(pInputData->UserIndex, skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape)); + m_selectedGroup.SetShow( TRUE ); + m_currentSkinPath = app.GetPlayerSkinName(m_iPad); + m_originalSkinId = app.GetPlayerSkinId(m_iPad); + + // push this onto the favorite list + AddFavoriteSkin(m_iPad,GET_DLC_SKIN_ID_FROM_BITMASK(m_originalSkinId)); + + } + } + + CXuiSceneBase::PlayUISFX(eSFX_Press); + break; + } + + break; + case VK_PAD_B: + case VK_ESCAPE: + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + app.CheckGameSettingsChanged(true,pInputData->UserIndex); + + app.NavigateBack(pInputData->UserIndex); + rfHandled = TRUE; + break; +#if 0 + case VK_PAD_RSHOULDER: + { + DWORD startingIndex = m_packIndex; + m_packIndex = getNextPackIndex(m_packIndex); + if(startingIndex != m_packIndex) + { + handlePackIndexChanged(); + } + } + break; + case VK_PAD_LSHOULDER: + { + DWORD startingIndex = m_packIndex; + m_packIndex = getPreviousPackIndex(m_packIndex); + if(startingIndex != m_packIndex) + { + handlePackIndexChanged(); + } + } + break; +#endif + case VK_PAD_DPAD_UP: + case VK_PAD_LTHUMB_UP: + case VK_PAD_DPAD_DOWN: + case VK_PAD_LTHUMB_DOWN: + { + if(m_packIndex==SKIN_SELECT_PACK_FAVORITES) + { + if(app.GetPlayerFavoriteSkinsCount(m_iPad)==0) + { + // ignore this, since there are no skins being displayed + break; + } + } + + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + switch(m_currentNavigation) + { + case eSkinNavigation_Pack: + m_currentNavigation = eSkinNavigation_Skin; + break; + case eSkinNavigation_Skin: + m_currentNavigation = eSkinNavigation_Pack; + break; + }; + updateCurrentFocus(); + } + break; + case VK_PAD_DPAD_LEFT: + case VK_PAD_LTHUMB_LEFT: + { + if( m_currentNavigation == eSkinNavigation_Skin ) + { + if(!m_bAnimatingMove) + { + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + + m_skinIndex = getPreviousSkinIndex(m_skinIndex); + //handleSkinIndexChanged(); + + m_bSlidingSkins = true; + m_bAnimatingMove = true; + + m_previewControl->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Left, true); + m_previewPreviousControls[0]->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Forward, true); + + int startFrame, endFrame; + HRESULT hr = m_charactersGroup.FindNamedFrame(L"CycleRight", &startFrame); + hr = m_charactersGroup.FindNamedFrame( L"EndCycleRight", &endFrame); + hr = m_charactersGroup.PlayTimeline(startFrame, startFrame,endFrame,FALSE,FALSE); + } + } + else if( m_currentNavigation == eSkinNavigation_Pack ) + { + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + DWORD startingIndex = m_packIndex; + m_packIndex = getPreviousPackIndex(m_packIndex); + if(startingIndex != m_packIndex) + { + handlePackIndexChanged(); + } + } + } + break; + case VK_PAD_DPAD_RIGHT: + case VK_PAD_LTHUMB_RIGHT: + { + if( m_currentNavigation == eSkinNavigation_Skin ) + { + if(!m_bAnimatingMove) + { + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + m_skinIndex = getNextSkinIndex(m_skinIndex); + //handleSkinIndexChanged(); + + m_bSlidingSkins = true; + m_bAnimatingMove = true; + + m_previewControl->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Right, true); + m_previewNextControls[0]->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Forward, true); + + int startFrame, endFrame; + HRESULT hr = m_charactersGroup.FindNamedFrame(L"CycleLeft", &startFrame); + hr = m_charactersGroup.FindNamedFrame( L"EndCycleLeft", &endFrame); + hr = m_charactersGroup.PlayTimeline(startFrame, startFrame,endFrame,FALSE,FALSE); + } + } + else if( m_currentNavigation == eSkinNavigation_Pack ) + { + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + DWORD startingIndex = m_packIndex; + m_packIndex = getNextPackIndex(m_packIndex); + if(startingIndex != m_packIndex) + { + handlePackIndexChanged(); + } + } + } + break; + case VK_PAD_RTHUMB_PRESS: + CXuiSceneBase::PlayUISFX(eSFX_Press); + if( m_currentNavigation == eSkinNavigation_Skin ) + { + m_previewControl->ResetRotation(); + } + break; + case VK_PAD_RTHUMB_LEFT: + if( m_currentNavigation == eSkinNavigation_Skin ) + { + m_previewControl->m_incYRot = true; + } + else + { + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + } + break; + case VK_PAD_RTHUMB_RIGHT: + if( m_currentNavigation == eSkinNavigation_Skin ) + { + m_previewControl->m_decYRot = true; + } + else + { + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + } + break; + case VK_PAD_RTHUMB_UP: + if( m_currentNavigation == eSkinNavigation_Skin ) + { + //m_previewControl->m_incXRot = true; + m_previewControl->CyclePreviousAnimation(); + } + else + { + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + } + break; + case VK_PAD_RTHUMB_DOWN: + if( m_currentNavigation == eSkinNavigation_Skin ) + { + //m_previewControl->m_decXRot = true; + m_previewControl->CycleNextAnimation(); + } + else + { + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + } + break; + case VK_PAD_RTHUMB_UPLEFT: + if( m_currentNavigation == eSkinNavigation_Skin ) + { + m_previewControl->m_incYRot = true; + //m_previewControl->m_incXRot = true; + } + else + { + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + } + break; + case VK_PAD_RTHUMB_UPRIGHT: + if( m_currentNavigation == eSkinNavigation_Skin ) + { + m_previewControl->m_decYRot = true; + //m_previewControl->m_incXRot = true; + } + else + { + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + } + break; + case VK_PAD_RTHUMB_DOWNRIGHT: + if( m_currentNavigation == eSkinNavigation_Skin ) + { + m_previewControl->m_decYRot = true; + //m_previewControl->m_decXRot = true; + } + else + { + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + } + break; + case VK_PAD_RTHUMB_DOWNLEFT: + if( m_currentNavigation == eSkinNavigation_Skin ) + { + m_previewControl->m_incYRot = true; + //m_previewControl->m_decXRot = true; + } + else + { + CXuiSceneBase::PlayUISFX(eSFX_Scroll); + } + break; + } + + return hr; +} + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_SkinSelect::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + return S_OK; +} + +HRESULT CScene_SkinSelect::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ) +{ + if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) return S_OK; + + if(pTransition->dwTransType == XUI_TRANSITION_TO || pTransition->dwTransType == XUI_TRANSITION_BACKTO) + { + + } + + return S_OK; +} + +HRESULT CScene_SkinSelect::OnTimelineEnd(HXUIOBJ hObjSource, BOOL& bHandled) +{ + if( hObjSource == m_charactersGroup ) + { + if(m_bSlidingSkins) + { + m_bSlidingSkins = false; + + int startFrame, endFrame; + HRESULT hr = m_charactersGroup.FindNamedFrame(L"Normal", &startFrame); + hr = m_charactersGroup.FindNamedFrame( L"Normal", &endFrame); + hr = m_charactersGroup.PlayTimeline(startFrame, startFrame,endFrame,FALSE,FALSE); + } + else + { + m_previewControl->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Forward, false); + m_previewNextControls[0]->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Left, false); + m_previewPreviousControls[0]->SetFacing(CXuiCtrlMinecraftSkinPreview::e_SkinPreviewFacing_Right, false); + + handleSkinIndexChanged(); + + m_bAnimatingMove = false; + + bHandled = TRUE; + } + } + return S_OK; +} + + +HRESULT CScene_SkinSelect::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) +{ + bHandled=true; + return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining,false); +} + + + + +HRESULT CScene_SkinSelect::OnBasePositionChanged() +{ + updateClipping(); + + return S_OK; +} + +void CScene_SkinSelect::handleSkinIndexChanged() +{ + BOOL showPrevious = FALSE, showNext = FALSE; + DWORD previousIndex = 0, nextIndex = 0; + wstring skinName = L""; + wstring skinOrigin = L""; + bool bSkinIsFree=false; + bool bLicensed=false; + DLCSkinFile *skinFile=NULL; + DLCPack *Pack=NULL; + BYTE sidePreviewControlsL,sidePreviewControlsR; + bool bNoSkinsToShow=false; + + TEXTURE_NAME backupTexture = TN_MOB_CHAR; + m_selectedGroup.SetShow( FALSE ); + m_skinDetails.SetShow( FALSE ); + + if( m_currentPack != NULL ) + { + skinFile = m_currentPack->getSkinFile(m_skinIndex); + m_selectedSkinPath = skinFile->getPath(); + m_selectedCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape); + m_vAdditionalSkinBoxes = skinFile->getAdditionalBoxes(); + + skinName = skinFile->getParameterAsString( DLCManager::e_DLCParamType_DisplayName ); + skinOrigin = skinFile->getParameterAsString( DLCManager::e_DLCParamType_ThemeName ); + + if( m_selectedSkinPath.compare( m_currentSkinPath ) == 0 ) + { + m_selectedGroup.SetShow( TRUE ); + } + else + { + m_selectedGroup.SetShow( FALSE ); + } + + bSkinIsFree = skinFile->getParameterAsBool( DLCManager::e_DLCParamType_Free ); + bLicensed = m_currentPack->hasPurchasedFile( DLCManager::e_DLCType_Skin, m_selectedSkinPath ); + + m_imagePadlock.SetShow( (bSkinIsFree || bLicensed) ?FALSE:TRUE ); + m_previewControl->SetShow(TRUE); + m_skinDetails.SetShow( TRUE ); + } + else + { + m_selectedSkinPath = L""; + m_selectedCapePath = L""; + m_vAdditionalSkinBoxes = NULL; + + switch(m_packIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + backupTexture = getTextureId(m_skinIndex); + + if( m_skinIndex == eDefaultSkins_ServerSelected ) + { + skinName = app.GetString(IDS_DEFAULT_SKINS); + } + else + { + skinName = wchDefaultNamesA[m_skinIndex]; + } + + if( m_originalSkinId == m_skinIndex ) + { + m_selectedGroup.SetShow( TRUE ); + } + else + { + m_selectedGroup.SetShow( FALSE ); + } + m_imagePadlock.SetShow( FALSE ); + m_previewControl->SetShow(TRUE); + m_skinDetails.SetShow( TRUE ); + + break; + case SKIN_SELECT_PACK_FAVORITES: + + if(app.GetPlayerFavoriteSkinsCount(m_iPad)>0) + { + // get the pack number from the skin id + wchar_t chars[256]; + swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(m_iPad,m_skinIndex)); + + Pack=app.m_dlcManager.getPackContainingSkin(chars); + if(Pack) + { + skinFile = Pack->getSkinFile(chars); + + m_selectedSkinPath = skinFile->getPath(); + m_selectedCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape); + m_vAdditionalSkinBoxes = skinFile->getAdditionalBoxes(); + + skinName = skinFile->getParameterAsString( DLCManager::e_DLCParamType_DisplayName ); + skinOrigin = skinFile->getParameterAsString( DLCManager::e_DLCParamType_ThemeName ); + + if( m_selectedSkinPath.compare( m_currentSkinPath ) == 0 ) + { + m_selectedGroup.SetShow( TRUE ); + } + else + { + m_selectedGroup.SetShow( FALSE ); + } + + bSkinIsFree = skinFile->getParameterAsBool( DLCManager::e_DLCParamType_Free ); + bLicensed = Pack->hasPurchasedFile( DLCManager::e_DLCType_Skin, m_selectedSkinPath ); + + m_imagePadlock.SetShow( (bSkinIsFree || bLicensed) ?FALSE:TRUE ); + m_skinDetails.SetShow( TRUE ); + } + else + { + m_selectedGroup.SetShow( FALSE ); + m_imagePadlock.SetShow( FALSE ); + } + } + else + { + //disable the display + m_previewControl->SetShow(FALSE); + // change the tooltips + bNoSkinsToShow=true; + } + break; + + } + } + m_text.SetText(skinName.c_str()); + m_originText.SetText(skinOrigin.c_str()); + + if(m_vAdditionalSkinBoxes && m_vAdditionalSkinBoxes->size()!=0) + { + // add the boxes to the humanoid model, but only if we've not done this already + vector *pAdditionalModelParts = app.GetAdditionalModelParts(skinFile->getSkinID()); + if(pAdditionalModelParts==NULL) + { + pAdditionalModelParts = app.SetAdditionalSkinBoxes(skinFile->getSkinID(),m_vAdditionalSkinBoxes); + } + } + + if(skinFile!=NULL) + { + app.SetAnimOverrideBitmask(skinFile->getSkinID(),skinFile->getAnimOverrideBitmask()); + } + + m_previewControl->SetTexture(m_selectedSkinPath, backupTexture); + m_previewControl->SetCapeTexture(m_selectedCapePath); + + showNext = TRUE; + showPrevious = TRUE; + nextIndex = getNextSkinIndex(m_skinIndex); + previousIndex = getPreviousSkinIndex(m_skinIndex); + + wstring otherSkinPath = L""; + wstring otherCapePath = L""; + vector *othervAdditionalSkinBoxes=NULL; + wchar_t chars[256]; + + // turn off all displays + for(BYTE i = 0; i < sidePreviewControls; ++i) + { + m_previewNextControls[i]->SetShow(FALSE); + m_previewPreviousControls[i]->SetShow(FALSE); + } + + unsigned int uiCurrentFavoriteC=app.GetPlayerFavoriteSkinsCount(m_iPad); + + if(m_packIndex==SKIN_SELECT_PACK_FAVORITES) + { + // might not be enough to cycle through + if(uiCurrentFavoriteC<((sidePreviewControls*2)+1)) + { + if(uiCurrentFavoriteC==0) + { + sidePreviewControlsL=sidePreviewControlsR=0; + } + // might be an odd number + else if((uiCurrentFavoriteC-1)%2==1) + { + sidePreviewControlsL=1+(uiCurrentFavoriteC-1)/2; + sidePreviewControlsR=(uiCurrentFavoriteC-1)/2; + } + else + { + sidePreviewControlsL=sidePreviewControlsR=(uiCurrentFavoriteC-1)/2; + } + } + else + { + sidePreviewControlsL=sidePreviewControlsR=sidePreviewControls; + } + } + else + { + sidePreviewControlsL=sidePreviewControlsR=sidePreviewControls; + } + + for(BYTE i = 0; i < sidePreviewControlsR; ++i) + { + if(showNext) + { + skinFile=NULL; + m_previewNextControls[i]->SetShow(TRUE); + + if( m_currentPack != NULL ) + { + skinFile = m_currentPack->getSkinFile(nextIndex); + otherSkinPath = skinFile->getPath(); + otherCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape); + othervAdditionalSkinBoxes = skinFile->getAdditionalBoxes(); + backupTexture = TN_MOB_CHAR; + } + else + { + otherSkinPath = L""; + otherCapePath = L""; + othervAdditionalSkinBoxes=NULL; + switch(m_packIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + backupTexture = getTextureId(nextIndex); + break; + case SKIN_SELECT_PACK_FAVORITES: + if(uiCurrentFavoriteC>0) + { + // get the pack number from the skin id + swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(m_iPad,nextIndex)); + + Pack=app.m_dlcManager.getPackContainingSkin(chars); + if(Pack) + { + skinFile = Pack->getSkinFile(chars); + + otherSkinPath = skinFile->getPath(); + otherCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape); + othervAdditionalSkinBoxes = skinFile->getAdditionalBoxes(); + backupTexture = TN_MOB_CHAR; + } + } + break; + default: + break; + } + + } + if(othervAdditionalSkinBoxes && othervAdditionalSkinBoxes->size()!=0) + { + vector *pAdditionalModelParts = app.GetAdditionalModelParts(skinFile->getSkinID()); + if(pAdditionalModelParts==NULL) + { + pAdditionalModelParts = app.SetAdditionalSkinBoxes(skinFile->getSkinID(),othervAdditionalSkinBoxes); + } + } + // 4J-PB - anim override needs set before SetTexture + if(skinFile!=NULL) + { + app.SetAnimOverrideBitmask(skinFile->getSkinID(),skinFile->getAnimOverrideBitmask()); + } + m_previewNextControls[i]->SetTexture(otherSkinPath, backupTexture); + m_previewNextControls[i]->SetCapeTexture(otherCapePath); + + + } + + nextIndex = getNextSkinIndex(nextIndex); + } + + + + for(BYTE i = 0; i < sidePreviewControlsL; ++i) + { + if(showPrevious) + { + skinFile=NULL; + m_previewPreviousControls[i]->SetShow(TRUE); + + if( m_currentPack != NULL ) + { + skinFile = m_currentPack->getSkinFile(previousIndex); + otherSkinPath = skinFile->getPath(); + otherCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape); + othervAdditionalSkinBoxes = skinFile->getAdditionalBoxes(); + backupTexture = TN_MOB_CHAR; + } + else + { + otherSkinPath = L""; + otherCapePath = L""; + othervAdditionalSkinBoxes=NULL; + switch(m_packIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + backupTexture = getTextureId(previousIndex); + break; + case SKIN_SELECT_PACK_FAVORITES: + if(uiCurrentFavoriteC>0) + { + // get the pack number from the skin id + swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(m_iPad,previousIndex)); + + Pack=app.m_dlcManager.getPackContainingSkin(chars); + if(Pack) + { + skinFile = Pack->getSkinFile(chars); + + otherSkinPath = skinFile->getPath(); + otherCapePath = skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape); + othervAdditionalSkinBoxes = skinFile->getAdditionalBoxes(); + backupTexture = TN_MOB_CHAR; + } + } + + break; + default: + break; + } + } + if(othervAdditionalSkinBoxes && othervAdditionalSkinBoxes->size()!=0) + { + vector *pAdditionalModelParts = app.GetAdditionalModelParts(skinFile->getSkinID()); + if(pAdditionalModelParts==NULL) + { + pAdditionalModelParts = app.SetAdditionalSkinBoxes(skinFile->getSkinID(),othervAdditionalSkinBoxes); + } + } + // 4J-PB - anim override needs set before SetTexture + if(skinFile) + { + app.SetAnimOverrideBitmask(skinFile->getSkinID(),skinFile->getAnimOverrideBitmask()); + } + m_previewPreviousControls[i]->SetTexture(otherSkinPath, backupTexture); + m_previewPreviousControls[i]->SetCapeTexture(otherCapePath); + } + + previousIndex = getPreviousSkinIndex(previousIndex); + } + + // update the tooltips + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + + if(bNoSkinsToShow) + { + if(bNotInGame) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, -1,IDS_TOOLTIPS_CANCEL,-1,-1,-1,-1,-1,-1,IDS_TOOLTIPS_NAVIGATE); + CXuiSceneBase::ShowBackground( DEFAULT_XUI_MENU_USER, TRUE ); + } + else + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT_SKIN,IDS_TOOLTIPS_CANCEL,-1,-1,-1,-1,-1,-1,IDS_TOOLTIPS_NAVIGATE); + CXuiSceneBase::ShowBackground( m_iPad, FALSE ); + CXuiSceneBase::ShowDarkOverlay( m_iPad, TRUE ); + } + + } + else + { + if(bNotInGame) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT_SKIN,IDS_TOOLTIPS_CANCEL,-1,-1,-1,-1,-1,-1,IDS_TOOLTIPS_NAVIGATE); + CXuiSceneBase::ShowBackground( DEFAULT_XUI_MENU_USER, TRUE ); + } + else + { + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT_SKIN,IDS_TOOLTIPS_CANCEL,-1,-1,-1,-1,-1,-1,IDS_TOOLTIPS_NAVIGATE); + CXuiSceneBase::ShowBackground( m_iPad, FALSE ); + CXuiSceneBase::ShowDarkOverlay( m_iPad, TRUE ); + } + + } + + updateCurrentFocus(); +} + +void CScene_SkinSelect::handlePackIndexChanged() +{ + if(m_packIndex >= SKIN_SELECT_MAX_DEFAULTS) + { + m_currentPack = app.m_dlcManager.getPack(m_packIndex - SKIN_SELECT_MAX_DEFAULTS, DLCManager::e_DLCType_Skin); + } + else + { + m_currentPack = NULL; + } + m_skinIndex = 0; + if(m_currentPack != NULL) + { + bool found; + DWORD currentSkinIndex = m_currentPack->getSkinIndexAt(m_currentSkinPath, found); + if(found) m_skinIndex = currentSkinIndex; + } + else + { + switch(m_packIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + if( !GET_IS_DLC_SKIN_FROM_BITMASK(m_originalSkinId) ) + { + DWORD ugcSkinIndex = GET_UGC_SKIN_ID_FROM_BITMASK(m_originalSkinId); + DWORD defaultSkinIndex = GET_DEFAULT_SKIN_ID_FROM_BITMASK(m_originalSkinId); + if( ugcSkinIndex == 0 ) + { + m_skinIndex = (EDefaultSkins) defaultSkinIndex; + } + } + break; + case SKIN_SELECT_PACK_FAVORITES: + if(app.GetPlayerFavoriteSkinsCount(m_iPad)>0) + { + bool found; + wchar_t chars[256]; + // get the pack number from the skin id + swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(m_iPad,app.GetPlayerFavoriteSkinsPos(m_iPad))); + + DLCPack *Pack=app.m_dlcManager.getPackContainingSkin(chars); + if(Pack) + { + DWORD currentSkinIndex = Pack->getSkinIndexAt(m_currentSkinPath, found); + if(found) m_skinIndex = app.GetPlayerFavoriteSkinsPos(m_iPad); + } + } + break; + default: + break; + } + } + handleSkinIndexChanged(); + updatePackDisplay(); +} + +void CScene_SkinSelect::updatePackDisplay() +{ + currentPackCount = app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin) + SKIN_SELECT_MAX_DEFAULTS; + + m_packLeft.SetShow(TRUE); + m_packRight.SetShow(TRUE); + + if(m_packIndex >= SKIN_SELECT_MAX_DEFAULTS) + { + DLCPack *thisPack = app.m_dlcManager.getPack(m_packIndex - SKIN_SELECT_MAX_DEFAULTS, DLCManager::e_DLCType_Skin); + m_packCenter.SetText(thisPack->getName().c_str()); + } + else + { + switch(m_packIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + m_packCenter.SetText(app.GetString(IDS_NO_SKIN_PACK)); + break; + case SKIN_SELECT_PACK_FAVORITES: + m_packCenter.SetText(app.GetString(IDS_FAVORITES_SKIN_PACK)); + break; + } + } + + int nextPackIndex = getNextPackIndex(m_packIndex); + if(nextPackIndex >= SKIN_SELECT_MAX_DEFAULTS) + { + DLCPack *thisPack = app.m_dlcManager.getPack(nextPackIndex - SKIN_SELECT_MAX_DEFAULTS, DLCManager::e_DLCType_Skin); + m_packRight.SetText(thisPack->getName().c_str()); + } + else + { + switch(nextPackIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + m_packRight.SetText(app.GetString(IDS_NO_SKIN_PACK)); + break; + case SKIN_SELECT_PACK_FAVORITES: + m_packRight.SetText(app.GetString(IDS_FAVORITES_SKIN_PACK)); + break; + } + } + + int previousPackIndex = getPreviousPackIndex(m_packIndex); + if(previousPackIndex >= SKIN_SELECT_MAX_DEFAULTS) + { + DLCPack *thisPack = app.m_dlcManager.getPack(previousPackIndex - SKIN_SELECT_MAX_DEFAULTS, DLCManager::e_DLCType_Skin); + m_packLeft.SetText(thisPack->getName().c_str()); + } + else + { + switch(previousPackIndex) + { + case SKIN_SELECT_PACK_DEFAULT: + m_packLeft.SetText(app.GetString(IDS_NO_SKIN_PACK)); + break; + case SKIN_SELECT_PACK_FAVORITES: + m_packLeft.SetText(app.GetString(IDS_FAVORITES_SKIN_PACK)); + break; + } + } + +} + +void CScene_SkinSelect::updateCurrentFocus() +{ + XUITimeline *timeline; + XUINamedFrame *startFrame; + XuiElementGetTimeline( m_skinDetails.m_hObj, &timeline); + switch(m_currentNavigation) + { + case eSkinNavigation_Pack: + XuiElementSetUserFocus( m_packCenter.m_hObj, m_iPad ); + startFrame = timeline->FindNamedFrame( L"Unselected" ); + m_normalTabs.SetShow( FALSE ); + m_selectedTabs.SetShow( TRUE ); + m_packLeft.SetEnable(TRUE); + m_packRight.SetEnable(TRUE); + break; + case eSkinNavigation_Skin: + XuiElementSetUserFocus( m_skinDetails.m_hObj, m_iPad ); + startFrame = timeline->FindNamedFrame( L"Selected" ); + m_normalTabs.SetShow( TRUE ); + m_selectedTabs.SetShow( FALSE ); + m_packLeft.SetEnable(FALSE); + m_packRight.SetEnable(FALSE); + break; + }; + timeline->Play( startFrame->m_dwFrame, startFrame->m_dwFrame, startFrame->m_dwFrame, FALSE, FALSE ); +} + +TEXTURE_NAME CScene_SkinSelect::getTextureId(int skinIndex) +{ + TEXTURE_NAME texture = TN_MOB_CHAR; + switch(skinIndex) + { + case eDefaultSkins_ServerSelected: + case eDefaultSkins_Skin0: + texture = TN_MOB_CHAR; + break; + case eDefaultSkins_Skin1: + texture = TN_MOB_CHAR1; + break; + case eDefaultSkins_Skin2: + texture = TN_MOB_CHAR2; + break; + case eDefaultSkins_Skin3: + texture = TN_MOB_CHAR3; + break; + case eDefaultSkins_Skin4: + texture = TN_MOB_CHAR4; + break; + case eDefaultSkins_Skin5: + texture = TN_MOB_CHAR5; + break; + case eDefaultSkins_Skin6: + texture = TN_MOB_CHAR6; + break; + case eDefaultSkins_Skin7: + texture = TN_MOB_CHAR7; + break; + }; + + return texture; +} + +int CScene_SkinSelect::getNextSkinIndex(DWORD sourceIndex) +{ + int nextSkin = sourceIndex; + + // special case for favourites + switch(m_packIndex) + { + + case SKIN_SELECT_PACK_FAVORITES: + ++nextSkin; + if(nextSkin>=app.GetPlayerFavoriteSkinsCount(m_iPad)) + { + nextSkin=0; + } + + break; + default: + ++nextSkin; + + if(m_packIndex == SKIN_SELECT_PACK_DEFAULT && nextSkin >= eDefaultSkins_Count) + { + nextSkin = eDefaultSkins_ServerSelected; + } + else if(m_currentPack != NULL && nextSkin>=m_currentPack->getSkinCount()) + { + nextSkin = 0; + } + break; + } + + + return nextSkin; +} + +int CScene_SkinSelect::getPreviousSkinIndex(DWORD sourceIndex) +{ + int previousSkin = sourceIndex; + switch(m_packIndex) + { + + case SKIN_SELECT_PACK_FAVORITES: + if(previousSkin==0) + { + previousSkin = app.GetPlayerFavoriteSkinsCount(m_iPad) - 1; + } + else + { + --previousSkin; + } + break; + default: + if(previousSkin==0) + { + if(m_packIndex == SKIN_SELECT_PACK_DEFAULT) + { + previousSkin = eDefaultSkins_Count - 1; + } + else if(m_currentPack != NULL) + { + previousSkin = m_currentPack->getSkinCount()-1; + } + } + else + { + --previousSkin; + } + break; + } + + + return previousSkin; +} + +int CScene_SkinSelect::getNextPackIndex(DWORD sourceIndex) +{ + int nextPack = sourceIndex; + ++nextPack; + if(nextPack > app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin) - 1 + SKIN_SELECT_MAX_DEFAULTS) + { + nextPack = SKIN_SELECT_PACK_DEFAULT; + } + + return nextPack; +} + +int CScene_SkinSelect::getPreviousPackIndex(DWORD sourceIndex) +{ + int previousPack = sourceIndex; + if(previousPack == SKIN_SELECT_PACK_DEFAULT) + { + if(app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin) > 0) + { + previousPack = app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin) - 1 + SKIN_SELECT_MAX_DEFAULTS; + } + else + { + previousPack = SKIN_SELECT_MAX_DEFAULTS - 1; + } + } + else + { + --previousPack; + } + + return previousPack; +} + +void CScene_SkinSelect::updateClipping() +{ + DWORD dwPropertyId; + XUIElementPropVal propertyVal; + propertyVal.Clear(); + HRESULT hr = XuiObjectGetPropertyId( m_charactersGroup.m_hObj, L"ClipChildren", &dwPropertyId); + switch( CXuiSceneBase::GetPlayerBasePosition(m_iPad) ) + { + case CXuiSceneBase::e_BaseScene_Left: + case CXuiSceneBase::e_BaseScene_Right: + case CXuiSceneBase::e_BaseScene_Top_Left: + case CXuiSceneBase::e_BaseScene_Top_Right: + case CXuiSceneBase::e_BaseScene_Bottom_Left: + case CXuiSceneBase::e_BaseScene_Bottom_Right: + case CXuiSceneBase::e_BaseScene_Top: + case CXuiSceneBase::e_BaseScene_Bottom: + propertyVal.SetBoolVal(TRUE); + break; + case CXuiSceneBase::e_BaseScene_Fullscreen: + default: + propertyVal.SetBoolVal(FALSE); + break; + }; + hr = XuiObjectSetProperty(m_charactersGroup.m_hObj,dwPropertyId,0,&propertyVal); +} + +int CScene_SkinSelect::UnlockSkinReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + CScene_SkinSelect* pScene = (CScene_SkinSelect*)pParam; +#ifdef _XBOX + if(result==C4JStorage::EMessage_ResultAccept) + { + if(ProfileManager.IsSignedIn(iPad)) + { + ULONGLONG ullIndexA[1]; + DLC_INFO *pDLCInfo = app.GetDLCInfoForTrialOfferID(pScene->m_currentPack->getPurchaseOfferId()); + + if(pDLCInfo!=NULL) + { + ullIndexA[0]=pDLCInfo->ullOfferID_Full; + } + else + { + ullIndexA[0]=pScene->m_currentPack->getPurchaseOfferId(); + } + + // If we're in-game, then we need to enable DLC downloads. They'll be set back to Auto on leaving the pause menu + if(Minecraft::GetInstance()->level!=NULL) + { + // need to allow downloads here, or the player would need to quit the game to let the download of a skin pack happen. This might affect the network traffic, since the download could take all the bandwidth... + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); + } + + StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + + // the license change coming in when the offer has been installed will cause this scene to refresh + } + } + else + { + TelemetryManager->RecordUpsellResponded(iPad, eSet_UpsellID_Skin_DLC, ( pScene->m_currentPack->getPurchaseOfferId() & 0xFFFFFFFF ), eSen_UpsellOutcome_Declined); + } +#endif + return 0; +} + +HRESULT CScene_SkinSelect::OnCustomMessage_DLCInstalled() +{ + // mounted DLC may have changed + if(app.StartInstallDLCProcess(m_iPad)==false) + { + // not doing a mount, so re-enable input + m_bIgnoreInput=false; + } + else + { + m_bIgnoreInput=true; + m_timer.SetShow( TRUE ); + m_charactersGroup.SetShow( FALSE ); + m_skinDetails.SetShow( FALSE ); + } + + // this will send a CustomMessage_DLCMountingComplete when done + return S_OK; +} + +HRESULT CScene_SkinSelect::OnCustomMessage_DLCMountingComplete() +{ + + m_timer.SetShow( FALSE ); + m_charactersGroup.SetShow( TRUE ); + m_skinDetails.SetShow( TRUE ); + m_packIndex = SKIN_SELECT_PACK_DEFAULT; + + if(app.m_dlcManager.getPackCount(DLCManager::e_DLCType_Skin)>0) + { + m_currentPack = app.m_dlcManager.getPackContainingSkin(m_currentSkinPath); + if(m_currentPack != NULL) + { + bool bFound = false; + m_packIndex = app.m_dlcManager.getPackIndex(m_currentPack,bFound,DLCManager::e_DLCType_Skin) + SKIN_SELECT_MAX_DEFAULTS; + } + } + + // If we have any favourites, set this to the favourites + // first validate the favorite skins - we might have uninstalled the DLC needed for them + app.ValidateFavoriteSkins(m_iPad); + + if(app.GetPlayerFavoriteSkinsCount(m_iPad)>0) + { + m_packIndex = SKIN_SELECT_PACK_FAVORITES; + } + + handlePackIndexChanged(); + updateCurrentFocus(); + m_bIgnoreInput=false; + app.m_dlcManager.checkForCorruptDLCAndAlert(); + bool bInGame=(Minecraft::GetInstance()->level!=NULL); + + if(bInGame) XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_AUTO); + + return S_OK; +} + +void CScene_SkinSelect::AddFavoriteSkin(int iPad,int iSkinID) +{ + // Is this favorite skin already in the array? + unsigned int uiCurrentFavoriteSkinsCount=app.GetPlayerFavoriteSkinsCount(m_iPad); + + for(int i=0;i0) + { + ucPos++; + } + else + { + ucPos=0; + } + } + + app.SetPlayerFavoriteSkin(iPad,(int)ucPos,iSkinID); + app.SetPlayerFavoriteSkinsPos(m_iPad,ucPos); + +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_SkinSelect.h b/Minecraft.Client/Common/XUI/XUI_SkinSelect.h new file mode 100644 index 00000000..dbbb388c --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_SkinSelect.h @@ -0,0 +1,150 @@ +#pragma once + +#include "../media/xuiscene_skinselect.h" +#include "XUI_CustomMessages.h" +#include "..\..\..\Minecraft.World\Definitions.h" +#include "..\..\Textures.h" + +class DLCPack; + +class CXuiCtrlMinecraftSkinPreview; + +class CScene_SkinSelect : public CXuiSceneImpl +{ +private: + static WCHAR *wchDefaultNamesA[eDefaultSkins_Count]; + + // 4J Stu - How many to show on each side of the main control + static const BYTE sidePreviewControls = 4; + + enum ESkinSelectNavigation + { + eSkinNavigation_Pack, + eSkinNavigation_Skin, + + eSkinNavigation_Count, + }; + +protected: + CXuiControl m_skinDetails, m_text, m_originText; + CXuiCtrlMinecraftSkinPreview *m_previewControl; + CXuiCtrlMinecraftSkinPreview *m_previewPreviousControls[sidePreviewControls]; + CXuiCtrlMinecraftSkinPreview *m_previewNextControls[sidePreviewControls]; + CXuiControl m_packGroup, m_charactersGroup; + CXuiControl m_packLeft, m_packRight, m_packCenter; + CXuiImageElement m_imagePadlock; + CXuiElement m_selectedGroup; + CXuiControl m_selectedText; + CXuiControl m_timer; + CXuiElement m_tabGroup; + CXuiElement m_normalTabs, m_selectedTabs; + + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN( OnKeyDown ) + XUI_ON_XM_KEYUP( OnKeyUp ) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_TRANSITION_START(OnTransitionStart) + XUI_ON_XM_TIMELINE_END( OnTimelineEnd ) + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + XUI_ON_XM_DLCLOADED_MESSAGE(OnCustomMessage_DLCMountingComplete) + XUI_ON_XM_BASE_POSITION_CHANGED_MESSAGE(OnBasePositionChanged) + XUI_ON_XM_DLCINSTALLED_MESSAGE(OnCustomMessage_DLCInstalled) + XUI_END_MSG_MAP() + + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_Timer, m_timer) + + MAP_CONTROL(IDC_PackGroup, m_packGroup) + BEGIN_MAP_CHILD_CONTROLS( m_packGroup) + MAP_CONTROL(IDC_Left, m_packLeft) + MAP_CONTROL(IDC_Center, m_packCenter) + MAP_CONTROL(IDC_Right, m_packRight) + END_MAP_CHILD_CONTROLS() + + MAP_CONTROL(IDC_TabBar, m_tabGroup) + BEGIN_MAP_CHILD_CONTROLS( m_tabGroup ) + MAP_CONTROL(IDC_Selected, m_selectedTabs ) + MAP_CONTROL(IDC_Normal, m_normalTabs ) + END_MAP_CHILD_CONTROLS() + + MAP_CONTROL(IDC_SelectedGroup, m_selectedGroup) + BEGIN_MAP_CHILD_CONTROLS( m_selectedGroup ) + MAP_CONTROL(IDC_SelectedText, m_selectedText) + END_MAP_CHILD_CONTROLS() + + MAP_CONTROL(IDC_Locked, m_imagePadlock) + + MAP_CONTROL(IDC_SkinDetails, m_skinDetails) + BEGIN_MAP_CHILD_CONTROLS( m_skinDetails) + MAP_CONTROL(IDC_SkinName, m_text) + MAP_CONTROL(IDC_OriginName, m_originText) + END_MAP_CHILD_CONTROLS() + + MAP_CONTROL(IDC_Characters, m_charactersGroup) + BEGIN_MAP_CHILD_CONTROLS( m_charactersGroup ) + MAP_OVERRIDE(IDC_Character, m_previewControl) + MAP_OVERRIDE(IDC_CharacterPrevious1, m_previewPreviousControls[0]) + MAP_OVERRIDE(IDC_CharacterPrevious2, m_previewPreviousControls[1]) + MAP_OVERRIDE(IDC_CharacterPrevious3, m_previewPreviousControls[2]) + MAP_OVERRIDE(IDC_CharacterPrevious4, m_previewPreviousControls[3]) + MAP_OVERRIDE(IDC_CharacterNext1, m_previewNextControls[0]) + MAP_OVERRIDE(IDC_CharacterNext2, m_previewNextControls[1]) + MAP_OVERRIDE(IDC_CharacterNext3, m_previewNextControls[2]) + MAP_OVERRIDE(IDC_CharacterNext4, m_previewNextControls[3]) + END_MAP_CHILD_CONTROLS() + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnKeyDown(XUIMessageInput *pInputData, BOOL& bHandled); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled); + HRESULT OnKeyUp(XUIMessageInput *pInputData, BOOL& bHandled); + HRESULT OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ); + HRESULT OnTimelineEnd(HXUIOBJ hObjSource, BOOL& bHandled); + HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled); + HRESULT OnCustomMessage_DLCInstalled(); + HRESULT OnCustomMessage_DLCMountingComplete(); + HRESULT OnBasePositionChanged(); + + int m_iPad; + D3DXVECTOR3 m_OriginalPosition; + wstring m_currentSkinPath, m_selectedSkinPath, m_selectedCapePath; + vector *m_vAdditionalSkinBoxes; + //vector *m_vAdditionalModelParts; + DWORD m_originalSkinId; + + DLCPack *m_currentPack; + DWORD m_packIndex, m_skinIndex; +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_SkinSelect, L"CScene_SkinSelect", XUI_CLASS_SCENE ) + +private: + void handleSkinIndexChanged(); + void handlePackIndexChanged(); + void updatePackDisplay(); + void updateCurrentFocus(); + TEXTURE_NAME getTextureId(int skinIndex); + + int getNextSkinIndex(DWORD sourceIndex); + int getPreviousSkinIndex(DWORD sourceIndex); + + int getNextPackIndex(DWORD sourceIndex); + int getPreviousPackIndex(DWORD sourceIndex); + + void updateClipping(); + + static int UnlockSkinReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + + void AddFavoriteSkin(int iPad,int iSkinID); + + bool m_bSlidingSkins, m_bAnimatingMove; + + DWORD currentPackCount; + + ESkinSelectNavigation m_currentNavigation; + bool m_bIgnoreInput; +}; diff --git a/Minecraft.Client/Common/XUI/XUI_SocialPost.cpp b/Minecraft.Client/Common/XUI/XUI_SocialPost.cpp new file mode 100644 index 00000000..f237e7d8 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_SocialPost.cpp @@ -0,0 +1,147 @@ +// Minecraft.cpp : Defines the entry point for the application. +// + +#include "stdafx.h" + +#include +#include "..\XUI\XUI_SocialPost.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\SharedConstants.h" +#include "..\..\..\Minecraft.World\Random.h" +#include "..\..\..\Minecraft.Client\SurvivalMode.h" +#include "..\..\..\Minecraft.Client\CreateWorldScreen.h" +#include "..\..\..\Minecraft.World\ConsoleSaveFileIO.h" +#include "..\..\..\Minecraft.World\AABB.h" +#include "..\..\..\Minecraft.World\Vec3.h" +#include "..\..\LocalPlayer.h" + + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_SocialPost::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + m_iPad = *(int *)pInitData->pvInitData; + + MapChildControls(); + + XuiControlSetText(m_text,app.GetString(IDS_SOCIAL_TEXT)); + XuiControlSetText(m_LabelCaption,app.GetString(IDS_SOCIAL_LABEL_CAPTION)); + XuiControlSetText(m_EditCaption,app.GetString(IDS_SOCIAL_DEFAULT_CAPTION)); + XuiControlSetText(m_LabelDescription,app.GetString(IDS_SOCIAL_LABEL_DESCRIPTION)); + XuiControlSetText(m_EditDesc,app.GetString(IDS_SOCIAL_DEFAULT_DESCRIPTION)); + XuiControlSetText(m_OK,app.GetString(IDS_CONFIRM_OK)); + + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + + + m_EditCaption.SetTextLimit(MAX_SOCIALPOST_CAPTION); + m_EditDesc.SetTextLimit(MAX_SOCIALPOST_DESC); + + // Hardcoded so posts will have this in + m_wTitle = L"Minecraft: Xbox 360 Edition"; + + m_EditCaption.SetTitleAndText(IDS_NAME_CAPTION,IDS_NAME_CAPTION_TEXT); + m_EditDesc.SetTitleAndText(IDS_NAME_DESC,IDS_NAME_DESC_TEXT); + + wstring wCaption = m_EditCaption.GetText(); + wstring wDesc = m_EditDesc.GetText(); + + // set the caret to the end of the default text + m_EditCaption.SetCaretPosition((int)wCaption.length()); + m_EditDesc.SetCaretPosition((int)wDesc.length()); + + BOOL bHasAllText = /*( wTitle.length()!=0) && */(wCaption.length()!=0) && (wDesc.length()!=0); + + m_OK.SetEnable(bHasAllText); + + if(app.GetLocalPlayerCount()>1) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad,false); + } + + TelemetryManager->RecordMenuShown(m_iPad, eUIScene_SocialPost, 0); + + return S_OK; +} + + +HRESULT CScene_SocialPost::OnNotifyValueChanged (HXUIOBJ hObjSource, XUINotifyValueChanged* pValueChangedData, BOOL& rfHandled) +{ wstring wCaption = m_EditCaption.GetText(); +wstring wDesc = m_EditDesc.GetText(); + + + if(/*(hObjSource == m_EditTitle) || */(hObjSource == m_EditCaption) || (hObjSource == m_EditDesc)) + { + // Enable the done button when we have all of the necessary information + //wstring wTitle = m_EditTitle.GetText(); + wstring wCaption = m_EditCaption.GetText(); + wstring wDesc = m_EditDesc.GetText(); + + BOOL bHasAllText = /*( wTitle.length()!=0) &&*/ (wCaption.length()!=0) && (wDesc.length()!=0); + m_OK.SetEnable(bHasAllText); + } + + return S_OK; +} + +HRESULT CScene_SocialPost::OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) +{ + pControlNavigateData->hObjDest=XuiControlGetNavigation(pControlNavigateData->hObjSource,pControlNavigateData->nControlNavigate,TRUE,TRUE); + + if(pControlNavigateData->hObjDest==NULL) + { + pControlNavigateData->hObjDest=pControlNavigateData->hObjSource; + } + + bHandled=TRUE; + return S_OK; +} + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_SocialPost::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + if(hObjPressed==m_OK) + { + CSocialManager::Instance()->SetSocialPostText(m_wTitle.c_str(),m_EditCaption.GetText(),m_EditDesc.GetText()); + + CSocialManager::Instance()->PostImageToSocialNetwork( eFacebook, pNotifyPressData->UserIndex, false); + + app.NavigateBack(pNotifyPressData->UserIndex); + } + + return S_OK; +} + + +HRESULT CScene_SocialPost::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + //HXUIOBJ hFocus=XuiElementGetFocus(); + switch(pInputData->dwKeyCode) + { + + case VK_PAD_B: + case VK_ESCAPE: + app.NavigateBack(pInputData->UserIndex); + rfHandled = TRUE; + + break; + } + + + return S_OK; +} + + +HRESULT CScene_SocialPost::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) +{ + bHandled=true; + return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining,false); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_SocialPost.h b/Minecraft.Client/Common/XUI/XUI_SocialPost.h new file mode 100644 index 00000000..0dd37fa6 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_SocialPost.h @@ -0,0 +1,59 @@ +#pragma once + +#include "../media\xuiscene_socialpost.h" +#include "XUI_Ctrl_4JEdit.h" +#include "XUI_CustomMessages.h" + + +class CScene_SocialPost : public CXuiSceneImpl +{ + protected: + // Control and Element wrapper objects. + CXuiControl m_OK; + CXuiCtrl4JEdit m_EditCaption; + CXuiCtrl4JEdit m_EditDesc; + CXuiControl m_text, m_LabelCaption, m_LabelDescription; + wstring m_wTitle; + + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_NOTIFY_VALUE_CHANGED(OnNotifyValueChanged) + XUI_ON_XM_CONTROL_NAVIGATE( OnControlNavigate ) + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + //MAP_CONTROL(IDC_XuiEditTitle, m_EditTitle) + MAP_CONTROL(IDC_XuiLabelText, m_text) + MAP_CONTROL(IDC_XuiLabelCaption, m_LabelCaption) + MAP_CONTROL(IDC_XuiLabelDescription, m_LabelDescription) + MAP_CONTROL(IDC_XuiEditCaption, m_EditCaption) + MAP_CONTROL(IDC_XuiEditDescription, m_EditDesc) + MAP_CONTROL(IDC_XuiOK, m_OK) + + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnNotifyValueChanged (HXUIOBJ hObjSource, XUINotifyValueChanged* pValueChangedData, BOOL& rfHandled); + HRESULT OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled); + HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled); + + D3DXVECTOR3 m_OriginalPosition; + int m_iPad; + +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_SocialPost, L"CScene_SocialPost", XUI_CLASS_SCENE ) + + + +}; diff --git a/Minecraft.Client/Common/XUI/XUI_Teleport.cpp b/Minecraft.Client/Common/XUI/XUI_Teleport.cpp new file mode 100644 index 00000000..1d6ac3bf --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Teleport.cpp @@ -0,0 +1,312 @@ +#include "stdafx.h" + +#include +#include "XUI_Teleport.h" +#include "..\..\ServerPlayer.h" +#include "..\..\PlayerConnection.h" +#include "..\..\PlayerList.h" +#include "..\..\MinecraftServer.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\PlayerRenderer.h" +#include "XUI_InGamePlayerOptions.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\ClientConnection.h" +#include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" +#include "..\..\Xbox\Network\NetworkPlayerXbox.h" +#include "TeleportCommand.h" + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_Teleport::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + TeleportMenuInitData *initParam = (TeleportMenuInitData *)pInitData->pvInitData; + + m_iPad = initParam->iPad; + m_teleportToPlayer = initParam->teleportToPlayer; + + delete initParam; + + MapChildControls(); + + if(m_teleportToPlayer) + { + m_title.SetText(app.GetString(IDS_TELEPORT_TO_PLAYER)); + } + else + { + m_title.SetText(app.GetString(IDS_TELEPORT_TO_ME)); + } + + if(app.GetLocalPlayerCount()>1) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + } + + DWORD playerCount = g_NetworkManager.GetPlayerCount(); + + m_playersCount = 0; + for(DWORD i = 0; i < playerCount; ++i) + { + INetworkPlayer *player = g_NetworkManager.GetPlayerByIndex( i ); + + if( player != NULL && !(player->IsLocal() && player->GetUserIndex() == m_iPad) ) + { + m_players[m_playersCount] = player->GetSmallId(); + ++m_playersCount; + } + } + + g_NetworkManager.RegisterPlayerChangedCallback(m_iPad, &CScene_Teleport::OnPlayerChanged, this); + + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_SELECT,IDS_TOOLTIPS_BACK); + + CXuiSceneBase::ShowDarkOverlay( m_iPad, TRUE ); + + return S_OK; +} + +HRESULT CScene_Teleport::OnDestroy() +{ + g_NetworkManager.UnRegisterPlayerChangedCallback(m_iPad, &CScene_Teleport::OnPlayerChanged, this); + return S_OK; +} + +HRESULT CScene_Teleport::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + HRESULT hr = S_OK; + switch(pInputData->dwKeyCode) + { + + case VK_PAD_B: + case VK_PAD_BACK: + case VK_ESCAPE: + CXuiSceneBase::PlayUISFX(eSFX_Back); + app.NavigateBack(pInputData->UserIndex); + rfHandled = TRUE; + + break; + } + + + return hr; +} + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_Teleport::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + if( hObjPressed == playersList ) + { + INetworkPlayer *selectedPlayer = g_NetworkManager.GetPlayerBySmallId( m_players[ playersList.GetCurSel() ] ); + INetworkPlayer *thisPlayer = g_NetworkManager.GetLocalPlayerByUserIndex(m_iPad); + + shared_ptr packet; + if(m_teleportToPlayer) + { + packet = TeleportCommand::preparePacket(thisPlayer->GetUID(),selectedPlayer->GetUID()); + } + else + { + packet = TeleportCommand::preparePacket(selectedPlayer->GetUID(),thisPlayer->GetUID()); + } + ClientConnection *conn = Minecraft::GetInstance()->getConnection(m_iPad); + conn->send( packet ); + } + return S_OK; +} + +void CScene_Teleport::OnPlayerChanged(void *callbackParam, INetworkPlayer *pPlayer, bool leaving) +{ + CScene_Teleport *scene = (CScene_Teleport *)callbackParam; + bool playerFound = false; + + for(int i = 0; i < scene->m_playersCount; ++i) + { + if(playerFound) + { + scene->m_players[i-1] = scene->m_players[i]; + } + else if( scene->m_players[i] == pPlayer->GetSmallId() ) + { + if( scene->playersList.GetCurSel() == scene->playersList.GetItemCount() - 1 ) + { + scene->playersList.SetCurSel( scene->playersList.GetItemCount() - 2 ); + } + // Player removed + playerFound = true; + } + } + + if( playerFound ) + { + --scene->m_playersCount; + scene->playersList.DeleteItems( scene->playersList.GetItemCount() - 1, 1 ); + } + + if( !playerFound ) + { + // Player added + scene->m_players[scene->m_playersCount] = pPlayer->GetSmallId(); + ++scene->m_playersCount; + scene->playersList.InsertItems( scene->playersList.GetItemCount(), 1 ); + } +} + +HRESULT CScene_Teleport::OnGetSourceDataText(XUIMessageGetSourceText *pGetSourceTextData, BOOL& bHandled) +{ + if( pGetSourceTextData->bItemData ) + { + if( pGetSourceTextData->iItem < m_playersCount ) + { + INetworkPlayer *player = g_NetworkManager.GetPlayerBySmallId( m_players[pGetSourceTextData->iItem] ); + if( player != NULL ) + { +#ifndef _CONTENT_PACKAGE + if(app.DebugSettingsOn() && (app.GetGameSettingsDebugMask()&(1L<szText = L"WWWWWWWWWWWWWWWW"; + } + else +#endif + { + pGetSourceTextData->szText = player->GetOnlineName(); + } + } + else + { + pGetSourceTextData->szText = L""; + } + + HRESULT hr; + HXUIOBJ hButton, hVisual, hPlayerIcon, hVoiceIcon; + hButton = playersList.GetItemControl(pGetSourceTextData->iItem); + hr=XuiControlGetVisual(hButton,&hVisual); + + // Set the players icon + hr=XuiElementGetChildById(hVisual,L"IconGroup",&hPlayerIcon); + short colourIndex = app.GetPlayerColour( m_players[pGetSourceTextData->iItem] ); + int playFrame = 0; + switch(colourIndex) + { + case 1: + XuiElementFindNamedFrame(hPlayerIcon, L"P1", &playFrame); + break; + case 2: + XuiElementFindNamedFrame(hPlayerIcon, L"P2", &playFrame); + break; + case 3: + XuiElementFindNamedFrame(hPlayerIcon, L"P3", &playFrame); + break; + case 4: + XuiElementFindNamedFrame(hPlayerIcon, L"P4", &playFrame); + break; + case 5: + XuiElementFindNamedFrame(hPlayerIcon, L"P5", &playFrame); + break; + case 6: + XuiElementFindNamedFrame(hPlayerIcon, L"P6", &playFrame); + break; + case 7: + XuiElementFindNamedFrame(hPlayerIcon, L"P7", &playFrame); + break; + case 8: + XuiElementFindNamedFrame(hPlayerIcon, L"P8", &playFrame); + break; + case 9: + XuiElementFindNamedFrame(hPlayerIcon, L"P9", &playFrame); + break; + case 10: + XuiElementFindNamedFrame(hPlayerIcon, L"P10", &playFrame); + break; + case 11: + XuiElementFindNamedFrame(hPlayerIcon, L"P11", &playFrame); + break; + case 12: + XuiElementFindNamedFrame(hPlayerIcon, L"P12", &playFrame); + break; + case 13: + XuiElementFindNamedFrame(hPlayerIcon, L"P13", &playFrame); + break; + case 14: + XuiElementFindNamedFrame(hPlayerIcon, L"P14", &playFrame); + break; + case 15: + XuiElementFindNamedFrame(hPlayerIcon, L"P15", &playFrame); + break; + case 0: + default: + XuiElementFindNamedFrame(hPlayerIcon, L"P0", &playFrame); + break; + }; + if(playFrame < 0) playFrame = 0; + XuiElementPlayTimeline(hPlayerIcon,playFrame,playFrame,playFrame,FALSE,FALSE); + + // Set the voice icon + hr=XuiElementGetChildById(hVisual,L"VoiceGroup",&hVoiceIcon); + + playFrame = -1; + if(player != NULL && player->HasVoice() ) + { + if( player->IsMutedByLocalUser(m_iPad) ) + { + // Muted image + XuiElementFindNamedFrame(hVoiceIcon, L"Muted", &playFrame); + } + else if( player->IsTalking() ) + { + // Talking image + XuiElementFindNamedFrame(hVoiceIcon, L"Speaking", &playFrame); + } + else + { + // Not talking image + XuiElementFindNamedFrame(hVoiceIcon, L"NotSpeaking", &playFrame); + } + } + + if(playFrame < 0) + { + XuiElementFindNamedFrame(hVoiceIcon, L"Normal", &playFrame); + } + XuiElementPlayTimeline(hVoiceIcon,playFrame,playFrame,playFrame,FALSE,FALSE); + + pGetSourceTextData->bDisplay = TRUE; + + bHandled = TRUE; + } + } + return S_OK; +} + +HRESULT CScene_Teleport::OnGetSourceDataImage(XUIMessageGetSourceImage *pGetSourceImageData,BOOL& bHandled) +{ + if( pGetSourceImageData->bItemData ) + { + if( pGetSourceImageData->iItem < m_playersCount ) + { + bHandled = TRUE; + } + } + return S_OK; +} + +HRESULT CScene_Teleport::OnGetItemCountAll(XUIMessageGetItemCount *pGetItemCountData, BOOL& bHandled) +{ + pGetItemCountData->cItems = m_playersCount; + bHandled = TRUE; + return S_OK; +} + +HRESULT CScene_Teleport::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) +{ + bHandled=true; + return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_Teleport.h b/Minecraft.Client/Common/XUI/XUI_Teleport.h new file mode 100644 index 00000000..cf60eab0 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_Teleport.h @@ -0,0 +1,64 @@ +#pragma once +using namespace std; +#include "../media/xuiscene_teleportmenu.h" +#include "XUI_CustomMessages.h" + +class INetworkPlayer; + +#define VOICE_ICON_DATA_ID 0 +#define MAP_ICON_DATA_ID 1 +#define OPS_ICON_DATA_ID 2 + +class CScene_Teleport : public CXuiSceneImpl +{ +protected: + // Control and Element wrapper objects. + CXuiList playersList; + CXuiControl m_title; + + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_DESTROY( OnDestroy ) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_KEYDOWN(OnKeyDown) + + XUI_ON_XM_GET_SOURCE_TEXT(OnGetSourceDataText) + XUI_ON_XM_GET_SOURCE_IMAGE(OnGetSourceDataImage) + XUI_ON_XM_GET_ITEMCOUNT_ALL(OnGetItemCountAll) + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_GamePlayers, playersList) + MAP_CONTROL(IDC_Title, m_title) + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnDestroy(); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + + HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled); + + HRESULT OnGetSourceDataText(XUIMessageGetSourceText *pGetSourceTextData, BOOL& bHandled); + HRESULT OnGetSourceDataImage(XUIMessageGetSourceImage *pGetSourceImageData,BOOL& bHandled); + HRESULT OnGetItemCountAll(XUIMessageGetItemCount *pGetItemCountData, BOOL& bHandled); + +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_Teleport, L"CScene_Teleport", XUI_CLASS_SCENE ) + + static void OnPlayerChanged(void *callbackParam, INetworkPlayer *pPlayer, bool leaving); + +private: + int m_iPad; + D3DXVECTOR3 m_OriginalPosition; + bool m_teleportToPlayer; + + int m_playersCount; + BYTE m_players[MINECRAFT_NET_MAX_PLAYERS]; // An array of QNet small-id's +}; diff --git a/Minecraft.Client/Common/XUI/XUI_TextEntry.cpp b/Minecraft.Client/Common/XUI/XUI_TextEntry.cpp new file mode 100644 index 00000000..8934350d --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_TextEntry.cpp @@ -0,0 +1,172 @@ +#include "stdafx.h" +#include "XUI_TextEntry.h" +#include "..\..\MultiplayerLocalPlayer.h" + + +CScene_TextEntry::CommandParams CScene_TextEntry::CommandA[CScene_TextEntry::eCommand_MAX]= +{ + { L"goto", L"%s%c%d%c%d" }, + { L"give", L"%s%c%s" } +}; + +HRESULT CScene_TextEntry::Init_Commands() +{ + for(int i=0;ipvInitData; + m_iPad=params->iPad; + m_wchInitialChar=params->wch; + delete params; + + WCHAR wchEditText[40]; + + Init_Commands(); + + ZeroMemory(wchEditText,sizeof(WCHAR)*40); + wchEditText[0]=tolower(m_wchInitialChar); + + m_EditText.SetTextLimit(40); + m_EditText.SetText(wchEditText); + // set the caret to the end of the default text + m_EditText.SetCaretPosition(1); + + m_EditText.SetTitleAndText(IDS_NAME_WORLD,IDS_NAME_WORLD_TEXT); + + ui.SetTooltips( m_iPad, IDS_TOOLTIPS_EXECUTE_COMMAND, IDS_TOOLTIPS_BACK); + return S_OK; +} + +HRESULT CScene_TextEntry::OnNotifyValueChanged (HXUIOBJ hObjSource, XUINotifyValueChanged* pValueChangedData, BOOL& rfHandled) +{ + // If the user presses return, interpret the string, and exit + if(pValueChangedData->nValue==10) + { + LPCWSTR pText = m_EditText.GetText(); + + if(pText) + { + wstring wText = pText; + InterpretString(wText); + } + + app.NavigateBack(m_iPad); + rfHandled = TRUE; + } + + return S_OK; +} + +HRESULT CScene_TextEntry::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + // Explicitly handle B button presses + switch(pInputData->dwKeyCode) + { + case VK_PAD_A: + { + LPCWSTR pText = m_EditText.GetText(); + + if(pText) + { + wstring wText = pText; + InterpretString(wText); + } + + app.NavigateBack(m_iPad); + rfHandled = TRUE; + } + break; + + case VK_PAD_B: + case VK_ESCAPE: + + app.NavigateBack(pInputData->UserIndex); + rfHandled = TRUE; + break; + } + return S_OK; +} + +HRESULT CScene_TextEntry::InterpretString(wstring &wsText) +{ + wstring wsFormat; + WCHAR wchCommand[40]; + int iCommand=-1; + WCHAR wchSep[2]; + +#ifdef __PS3__ + // 4J Stu - The Xbox version uses swscanf_s which isn't available in GCC. + swscanf(wsText.c_str(), L"%40s", wchCommand); +#else + swscanf_s(wsText.c_str(), L"%s", wchCommand,40); +#endif + + AUTO_VAR(it, m_CommandSet.find(wchCommand)); + if(it != m_CommandSet.end()) + { + // found it + + iCommand=it->second; + + switch(iCommand) + { + case eCommand_Teleport: + { + int x,z; + +#ifdef __PS3__ + // 4J Stu - The Xbox version uses swscanf_s which isn't available in GCC. + swscanf(wsText.c_str(), L"%40s%c%d%c%d", wchCommand,wchSep,&x,wchSep,&z); +#else + swscanf_s(wsText.c_str(), L"%s%c%d%c%d", wchCommand,40,wchSep,2,&x,wchSep,2, &z); +#endif + + app.DebugPrintf("eCommand_Teleport x=%d z=%d\n",x,z); + + // check the bounds + int iBound=54*16; + if( (x>-iBound) && (x-iBound) && (zlocalplayers[m_iPad]->teleportTo(x,pMinecraft->localplayers[m_iPad]->y,z); + } + } + break; + case eCommand_Give: + { + int iItem,iCount; + +#ifdef __PS3__ + // 4J Stu - The Xbox version uses swscanf_s which isn't available in GCC. + swscanf(wsText.c_str(), L"%40s%c%d%c%d", wchCommand,wchSep,&iItem,wchSep,&iCount); +#else + swscanf_s(wsText.c_str(), L"%s%c%d%c%d", wchCommand,40,wchSep,2,&iItem,wchSep,2, &iCount); +#endif + app.DebugPrintf("eCommand_Give, item=%d count=%d\n",iItem,iCount); + Minecraft *pMinecraft=Minecraft::GetInstance(); + for(int i=0;ilocalplayers[m_iPad]->drop(); // shared_ptr(new ItemInstance( iItem, 1, 0 )) ); + } + + break; + default: + app.DebugPrintf("Unknown command\n"); + break; + } + } + + return S_OK; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_TextEntry.h b/Minecraft.Client/Common/XUI/XUI_TextEntry.h new file mode 100644 index 00000000..70dcf30b --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_TextEntry.h @@ -0,0 +1,64 @@ +#pragma once +#include "..\Media\xuiscene_text_entry.h" +#include "XUI_Ctrl_4JEdit.h" + + +class CScene_TextEntry : public CXuiSceneImpl +{ +public: + typedef struct _XuiTextInputParams + { + int iPad; + WCHAR wch; + } + XuiTextInputParams; + + typedef struct _CommamndParams + { + WCHAR wchCommand[40]; + WCHAR wchFormat[40]; + } + CommandParams; + + enum + { + eCommand_Teleport=0, + eCommand_Give, + eCommand_MAX + } + eCommands; + +protected: + CXuiCtrl4JEdit m_EditText; + + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_NOTIFY_VALUE_CHANGED(OnNotifyValueChanged) + XUI_ON_XM_KEYDOWN(OnKeyDown) + + XUI_END_MSG_MAP() + + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_XuiEditText, m_EditText) + END_CONTROL_MAP() + + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnNotifyValueChanged (HXUIOBJ hObjSource, XUINotifyValueChanged* pValueChangedData, BOOL& rfHandled); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + + HRESULT InterpretString(wstring &wsText); + HRESULT Init_Commands(); +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_TextEntry, L"CScene_TextEntry", XUI_CLASS_SCENE ) + +private: + int m_iPad; + WCHAR m_wchInitialChar; + static CommandParams CommandA[eCommand_MAX]; + unordered_map m_CommandSet; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_TransferToXboxOne.cpp b/Minecraft.Client/Common/XUI/XUI_TransferToXboxOne.cpp new file mode 100644 index 00000000..5a2e67b4 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_TransferToXboxOne.cpp @@ -0,0 +1,569 @@ +#include "stdafx.h" +#include +#include +#include + +#include "XUI_Ctrl_4JList.h" +#include "XUI_Ctrl_4JIcon.h" +#include "XUI_LoadSettings.h" +#include "..\..\ProgressRenderer.h" +#include "XUI_TransferToXboxOne.h" + + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_TransferToXboxOne::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + m_iX=-1; + m_params = (LoadMenuInitData *)pInitData->pvInitData; + + m_iPad=m_params->iPad; + + m_bRetrievingSaveInfo=false; + m_bIgnoreInput=false; + MapChildControls(); + + VOID *pObj; + XuiObjectFromHandle( m_SavesSlotList, &pObj ); + m_pSavesSlotList = (CXuiCtrl4JList *)pObj; + + m_pbImageData=NULL; + m_dwImageBytes=0; + + StorageManager.GetSaveCacheFileInfo(m_params->iSaveGameInfoIndex,m_XContentData); + StorageManager.GetSaveCacheFileInfo(m_params->iSaveGameInfoIndex,&m_pbImageData,&m_dwImageBytes); + + + m_SavesSlotListTimer.SetShow(TRUE); + + + XuiControlSetText(m_SavesSlotList,app.GetString(IDS_XBONE_SELECTSLOT)); + + // insert the current save slot names + m_MaxSlotC=app.m_uiTransferSlotC; + m_pSlotDataA = new SLOTDATA [m_MaxSlotC]; + ZeroMemory(m_pSlotDataA,sizeof(SLOTDATA)*m_MaxSlotC); + + + // saves will be called slot1 to slotx + // there will be a details file with the names and png of each slot + m_pbSlotListFile=NULL; + m_uiSlotListFileBytes=0; + + if(StorageManager.TMSPP_InFileList(C4JStorage::eGlobalStorage_TitleUser,m_iPad,L"XboxOne/SlotList")) + { + // there is a slot list file with details of the saves + C4JStorage::ETMSStatus status=StorageManager.TMSPP_ReadFile(m_iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,"XboxOne/SlotList",&CScene_TransferToXboxOne::TMSPPSlotListReturned,this); + m_iX=IDS_TOOLTIPS_CLEARSLOTS; + } + else + { + CXuiCtrl4JList::LIST_ITEM_INFO ListInfo; + + ZeroMemory(&ListInfo,sizeof(CXuiCtrl4JList::LIST_ITEM_INFO)); + + // create dummy slots + for(int i=0;iAddData(ListInfo); + } + m_SavesSlotListTimer.SetShow(FALSE); + } + + + CXuiSceneBase::SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, m_iX, -1,-1,-1,-1,-1,-1,true); + + return S_OK; +} + +//---------------------------------------------------------------------------------- +// TMSPPSlotListReturned callback +//---------------------------------------------------------------------------------- +int CScene_TransferToXboxOne::TMSPPWriteReturned(LPVOID pParam,int iPad,int iUserData) +{ + CScene_TransferToXboxOne* pClass = (CScene_TransferToXboxOne *) pParam; + pClass->m_bWaitingForWrite=false; + + return 0; +} + +//---------------------------------------------------------------------------------- +// TMSPPSlotListReturned callback +//---------------------------------------------------------------------------------- +int CScene_TransferToXboxOne::TMSPPDeleteReturned(LPVOID pParam,int iPad,int iUserData) +{ + CScene_TransferToXboxOne* pClass = (CScene_TransferToXboxOne *) pParam; + pClass->m_SavesSlotListTimer.SetShow(FALSE); + pClass->m_bIgnoreInput=false; + + // update the slots + delete pClass->m_pbSlotListFile; + pClass->m_pbSlotListFile=NULL; + pClass->m_uiSlotListFileBytes=0; + pClass->m_pSavesSlotList->RemoveAllData(); + CXuiCtrl4JList::LIST_ITEM_INFO ListInfo; + + ZeroMemory(&ListInfo,sizeof(CXuiCtrl4JList::LIST_ITEM_INFO)); + // clear our slot info + ZeroMemory(pClass->m_pSlotDataA,sizeof(SLOTDATA)*pClass->m_MaxSlotC); + + for(int i=0;im_MaxSlotC;i++) + { + memcpy(pClass->m_pSlotDataA[i].wchSaveTitle,app.GetString(IDS_XBONE_EMPTYSLOT),sizeof(WCHAR)*XCONTENT_MAX_DISPLAYNAME_LENGTH); + ListInfo.pwszText = app.GetString(IDS_XBONE_EMPTYSLOT); + ListInfo.fEnabled = TRUE; + ListInfo.iData = -1; + pClass->m_pSavesSlotList->AddData(ListInfo); + } + + return 0; +} + +//---------------------------------------------------------------------------------- +// TMSPPSlotListReturned callback +//---------------------------------------------------------------------------------- +int CScene_TransferToXboxOne::TMSPPSlotListReturned(LPVOID pParam,int iPad,int iUserData,C4JStorage::PTMSPP_FILEDATA pFileData, LPCSTR szFilename) +{ + CScene_TransferToXboxOne* pClass = (CScene_TransferToXboxOne *) pParam; + unsigned int uiSlotListFileSlots=*((unsigned int *)pFileData->pbData); + pClass->m_pbSlotListFile=pFileData->pbData; + pClass->m_uiSlotListFileBytes=pFileData->dwSize; + + // clear our slot info + ZeroMemory(pClass->m_pSlotDataA,sizeof(SLOTDATA)*pClass->m_MaxSlotC); + // set the empty slot strings + for(int i=0;im_MaxSlotC;i++) + { + memcpy(pClass->m_pSlotDataA[i].wchSaveTitle,app.GetString(IDS_XBONE_EMPTYSLOT),sizeof(WCHAR)*XCONTENT_MAX_DISPLAYNAME_LENGTH); + } + // update our slot info with the data from the file - might have less slots + unsigned int uiNewSlotsC=(pClass->m_MaxSlotCm_MaxSlotC:uiSlotListFileSlots; + memcpy(pClass->m_pSlotDataA,pClass->m_pbSlotListFile + sizeof(unsigned int),sizeof(SLOTDATA)*uiNewSlotsC); + + CXuiCtrl4JList::LIST_ITEM_INFO ListInfo; + + ZeroMemory(&ListInfo,sizeof(CXuiCtrl4JList::LIST_ITEM_INFO)); + PBYTE pbImageData=pClass->m_pbSlotListFile + sizeof(unsigned int) + sizeof(SLOTDATA)*uiSlotListFileSlots; + + // fill out the slot info + for(int i=0;im_MaxSlotC;i++) + { + if(im_pSlotDataA[i].wchSaveTitle; + ListInfo.fEnabled = TRUE; + ListInfo.iData = -1; + pClass->m_pSavesSlotList->AddData(ListInfo); + + if(pClass->m_pSlotDataA[i].uiImageLength!=0) + { + XuiCreateTextureBrushFromMemory(pbImageData,pClass->m_pSlotDataA[i].uiImageLength,&pClass->m_hXuiBrush); + pClass->m_pSavesSlotList->UpdateGraphic(i,pClass->m_hXuiBrush); + // increment the image data pointer + pbImageData+=pClass->m_pSlotDataA[i].uiImageLength; + } + } + else + { + // make it blank + ListInfo.pwszText = app.GetString(IDS_XBONE_EMPTYSLOT); + ListInfo.fEnabled = TRUE; + ListInfo.iData = -1; + pClass->m_pSavesSlotList->AddData(ListInfo); + } + } + pClass->m_SavesSlotListTimer.SetShow(FALSE); + return 0; + +} + +//---------------------------------------------------------------------------------- +// Handler for OnDestroy +//---------------------------------------------------------------------------------- +HRESULT CScene_TransferToXboxOne::OnDestroy() +{ + return S_OK; +} + +//---------------------------------------------------------------------------------- +// Handler for the button press message. +//---------------------------------------------------------------------------------- +HRESULT CScene_TransferToXboxOne::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + + // if we're retrieving save info, ignore key presses + if(m_bRetrievingSaveInfo) + { + return S_OK; + } + + // This assumes all buttons can only be pressed with the A button + ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A); + + if(hObjPressed==m_SavesSlotList) + { + m_bIgnoreInput=true; + + // update the info in the SlotList file + CXuiControl pItem; + int iIndex; + + // get the selected item + iIndex=m_SavesSlotList.GetCurSel(&pItem); + + // check if there is a save there + + CXuiCtrl4JList::LIST_ITEM_INFO info = m_pSavesSlotList->GetData(iIndex); + if(info.pwszImage!=NULL) + { + // we have a save here + // Are you sure, etc. + } + + // update the data + memcpy(m_pSlotDataA[iIndex].wchSaveTitle,m_XContentData.szDisplayName,sizeof(WCHAR)*XCONTENT_MAX_DISPLAYNAME_LENGTH); + m_pSavesSlotList->UpdateText(iIndex,m_pSlotDataA[iIndex].wchSaveTitle); + + // if there is no thumbnail, retrieve the default one from the file. + // Don't delete the image data after creating the xuibrush, since we'll use it in the rename of the save + bool bHostOptionsRead = false; + unsigned int uiHostOptions = 0; + + XuiCreateTextureBrushFromMemory(m_pbImageData,m_dwImageBytes,&m_hXuiBrush); + m_pSavesSlotList->UpdateGraphic(iIndex,m_hXuiBrush); + + m_pSlotDataA[iIndex].uiImageLength=m_dwImageBytes; + + m_bIgnoreInput=false; + + // finished so navigate back + //app.NavigateBack(XUSER_INDEX_ANY); + BuildSlotFile(iIndex,m_pbImageData,m_dwImageBytes); + } + + return S_OK; +} + +HRESULT CScene_TransferToXboxOne::BuildSlotFile(int iIndexBeingUpdated,PBYTE pbImageData,DWORD dwImageBytes ) +{ + SLOTDATA *pCurrentSlotData=NULL; + PBYTE pbCurrentSlotDataPtr=NULL; + // there may be no slot file yet + if(m_pbSlotListFile!=NULL) + { + pCurrentSlotData=(SLOTDATA *)(m_pbSlotListFile+sizeof(unsigned int)); + pbCurrentSlotDataPtr=m_pbSlotListFile + sizeof(unsigned int) + sizeof(SLOTDATA)*m_MaxSlotC; + } + + m_uiSlotID=iIndexBeingUpdated; + + // memory required - first int is the number of slots in this file, in case that changes later + unsigned int uiBytesRequired=sizeof(unsigned int) + sizeof(SLOTDATA)*m_MaxSlotC; + for(int i=0;ifunc = &CScene_TransferToXboxOne::UploadSaveForXboxOneThreadProc; + loadingParams->lpParam = (LPVOID)this; + + UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); + completionData->bShowBackground=TRUE; + completionData->bShowLogo=TRUE; + completionData->iPad = m_iPad; + completionData->type = e_ProgressCompletion_NavigateBackToScene; + completionData->scene = eUIScene_LoadMenu; + loadingParams->completionData = completionData; + + app.NavigateToScene(m_iPad,eUIScene_FullscreenProgress, loadingParams); + + return S_OK; +} + +int CScene_TransferToXboxOne::UploadSaveForXboxOneThreadProc( LPVOID lpParameter ) +{ + HRESULT hr = S_OK; + char szFilename[32]; + CScene_TransferToXboxOne* pClass = (CScene_TransferToXboxOne *) lpParameter; + Minecraft *pMinecraft = Minecraft::GetInstance(); + unsigned int uiComplete=0; + pClass->m_bWaitingForWrite=true; + pMinecraft->progressRenderer->progressStart(IDS_XBONE_UPLOAD_SAVE_TITLE); + pMinecraft->progressRenderer->progressStage( IDS_XBONE_UPLOAD_METADATA ); + // now write the new slot data file to global storage, and then write the save data + C4JStorage::ETMSStatus eStatus=StorageManager.TMSPP_WriteFile(pClass->m_iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,C4JStorage::TMS_UGCTYPE_NONE,"XboxOne/SlotList",(PCHAR) pClass->m_pbSlotListFile, pClass->m_uiSlotListFileBytes, + &CScene_TransferToXboxOne::TMSPPWriteReturned,lpParameter, 0); + + if(eStatus!=C4JStorage::ETMSStatus_WriteInProgress) + { + // failed + pClass->m_bWaitingForWrite=false; + } + else + { + // loop waiting for the write to complete + uiComplete=0; + while(pClass->m_bWaitingForWrite && (hr == S_OK)) + { + Sleep(50); + uiComplete++; + if(uiComplete>100) uiComplete=100; + + pMinecraft->progressRenderer->progressStagePercentage(uiComplete); + + if(app.GetChangingSessionType()) + { + // 4J Stu - This causes the fullscreenprogress scene to ignore the action it was given + hr = ERROR_CANCELLED; + } + } + + if(hr!=S_OK) return -1; + + // finish the bar + for(int i=uiComplete;i<100;i++) + { + Sleep(5); + pMinecraft->progressRenderer->progressStagePercentage(i); + } + + + // now upload the save data + pMinecraft->progressRenderer->progressStage( IDS_XBONE_UPLOAD_SAVE ); + + // write the save file, and increment the progress percentage + pMinecraft->progressRenderer->progressStagePercentage(25); + pClass->m_bSaveDataReceived=false; + C4JStorage::ELoadGameStatus eLoadStatus=StorageManager.LoadSaveData(&pClass->m_XContentData,CScene_TransferToXboxOne::LoadSaveDataReturned,lpParameter); + + // sleep until we have the data + while(pClass->m_bSaveDataReceived==false) + { + Sleep(50); + } + + // write the save to user TMS + + // break the file up into 256K chunks + unsigned int uiChunkSize=262144; + unsigned int uiBytesLeft=pClass->m_uiStorageLength; + C4JStorage::ETMSStatus eStatus; + // max file size would be 100*256K + unsigned int uiPercentageChunk=100/(pClass->m_uiStorageLength/uiChunkSize); + uiComplete=0; + + if(uiPercentageChunk==0) uiPercentageChunk=1; + + for(int i=0;i<(pClass->m_uiStorageLength/uiChunkSize)+1;i++) + { + sprintf( szFilename, "XboxOne/Slot%.2d%.2d", pClass->m_uiSlotID,i ); + PCHAR pchData=((PCHAR)pClass->m_pvSaveMem)+i*uiChunkSize; + + pClass->m_bWaitingForWrite=true; + if(uiBytesLeft>=uiChunkSize) + { + eStatus=StorageManager.TMSPP_WriteFile(pClass->m_iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,C4JStorage::TMS_UGCTYPE_NONE,szFilename,pchData, uiChunkSize, + &CScene_TransferToXboxOne::TMSPPWriteReturned,lpParameter, 0); + uiBytesLeft-=uiChunkSize; + } + else + { + // last bit of the file to upload is less than uiChunkSize + eStatus=StorageManager.TMSPP_WriteFile(pClass->m_iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,C4JStorage::TMS_UGCTYPE_NONE,szFilename,pchData, uiBytesLeft, + &CScene_TransferToXboxOne::TMSPPWriteReturned,lpParameter, 0); + } + + // wait until + if(eStatus!=C4JStorage::ETMSStatus_WriteInProgress) + { + // failed + pClass->m_bWaitingForWrite=false; + } + else + { + // loop waiting for the write to complete + while(pClass->m_bWaitingForWrite && (hr == S_OK)) + { + Sleep(50); + } + uiComplete+=uiPercentageChunk; + if(uiComplete>100) uiComplete=100; + + // update the progress + pMinecraft->progressRenderer->progressStagePercentage(uiComplete); + } + } + + + + delete pClass->m_pvSaveMem; + } + return hr; +} + +int CScene_TransferToXboxOne::LoadSaveDataReturned(void *pParam,bool bContinue) +{ + CScene_TransferToXboxOne* pClass = (CScene_TransferToXboxOne*)pParam; + + if(bContinue==true) + { + unsigned int uiFileSize = StorageManager.GetSaveSize(); + pClass->m_pvSaveMem = new BYTE [uiFileSize]; + pClass->m_uiStorageLength=0; + + StorageManager.GetSaveData( pClass->m_pvSaveMem, &pClass->m_uiStorageLength ); + + pClass->m_bSaveDataReceived=true; + } + + return 0; +} + +HRESULT CScene_TransferToXboxOne::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + if(m_bIgnoreInput) return S_OK; + + // if we're retrieving save info, ignore key presses + if(m_bRetrievingSaveInfo) + { + return S_OK; + } + + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + HRESULT hr = S_OK; + + // Explicitly handle B button presses + switch(pInputData->dwKeyCode) + { + case VK_PAD_B: + case VK_ESCAPE: + + app.NavigateBack(XUSER_INDEX_ANY); + rfHandled = TRUE; + break; + case VK_PAD_X: + // wipe the save slots + if(m_pbSlotListFile!=NULL) + { + m_SavesSlotListTimer.SetShow(TRUE); + m_bIgnoreInput=true; + + C4JStorage::ETMSStatus eStatus=StorageManager.TMSPP_DeleteFile(m_iPad,"XboxOne/SlotList",C4JStorage::TMS_FILETYPE_BINARY,&CScene_TransferToXboxOne::TMSPPDeleteReturned,this, 0); + + } + + break; + } + + return hr; +} + +HRESULT CScene_TransferToXboxOne::OnNotifySelChanged(HXUIOBJ hObjSource, XUINotifySelChanged *pNotifySelChangedData, BOOL& bHandled) +{ + + //if(m_bReady) + { + CXuiSceneBase::PlayUISFX(eSFX_Focus); + } + + return S_OK; +} + + +HRESULT CScene_TransferToXboxOne::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ) +{ + //if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) return S_OK; + + if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY || + pTransition->dwTransType == XUI_TRANSITION_FROM || pTransition->dwTransType == XUI_TRANSITION_BACKFROM) + { + // 4J Stu - We may have had to unload our font renderer in this scene if one of the save files + // uses characters not in our font (eg asian chars) so restore our font renderer + // This will not do anything if our font renderer is already loaded + app.OverrideFontRenderer(true,true); + } + + return S_OK; +} + +HRESULT CScene_TransferToXboxOne::OnFontRendererChange() +{ + // update the tooltips + CXuiSceneBase::SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, m_iX, -1,-1,-1,-1,-1,-1,true); + + return S_OK; +} + +HRESULT CScene_TransferToXboxOne::OnNotifySetFocus(HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled) +{ + // update the tooltips + CXuiSceneBase::SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, m_iX, -1,-1,-1,-1,-1,-1,true); + + return S_OK; +} + +HRESULT CScene_TransferToXboxOne::OnNotifyKillFocus(HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled) +{ + return S_OK; +} + + diff --git a/Minecraft.Client/Common/XUI/XUI_TransferToXboxOne.h b/Minecraft.Client/Common/XUI/XUI_TransferToXboxOne.h new file mode 100644 index 00000000..f08de59a --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_TransferToXboxOne.h @@ -0,0 +1,88 @@ +#pragma once +using namespace std; +//#include + +#include "..\Media\xuiscene_TransferToXboxOne.h" + + +class CXuiCtrl4JList; + +class CScene_TransferToXboxOne : public CXuiSceneImpl +{ +protected: + + typedef struct + { + WCHAR wchSaveTitle[XCONTENT_MAX_DISPLAYNAME_LENGTH]; + unsigned int uiImageLength; + } + SLOTDATA; + + CXuiCtrl4JList *m_pSavesSlotList; + CXuiList m_SavesSlotList; + CXuiControl m_SavesSlotListTimer; + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_DESTROY(OnDestroy) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_NOTIFY_PRESS_EX(OnNotifyPressEx) + XUI_ON_XM_NOTIFY_SELCHANGED(OnNotifySelChanged) + XUI_ON_XM_NOTIFY_SET_FOCUS(OnNotifySetFocus) + XUI_ON_XM_NOTIFY_KILL_FOCUS(OnNotifyKillFocus) + XUI_ON_XM_TRANSITION_START(OnTransitionStart) + XUI_ON_XM_FONTRENDERERCHANGE_MESSAGE(OnFontRendererChange) + + XUI_END_MSG_MAP() + + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_SavesSlotTimer, m_SavesSlotListTimer) + MAP_CONTROL(IDC_SavesSlotsList, m_SavesSlotList) + END_CONTROL_MAP() + + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnDestroy(); + HRESULT OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData,BOOL& rfHandled); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnNavReturn(HXUIOBJ hObj,BOOL& rfHandled); + HRESULT OnNotifySelChanged(HXUIOBJ hObjSource, XUINotifySelChanged *pNotifySelChangedData, BOOL& bHandled); + HRESULT OnNotifySetFocus(HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled); + HRESULT OnNotifyKillFocus(HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled); + HRESULT OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ); + HRESULT OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled ); + HRESULT OnFontRendererChange(); + +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_TransferToXboxOne, L"CScene_TransferToXboxOne", XUI_CLASS_SCENE ) + + static int TMSPPSlotListReturned(LPVOID pParam,int iPad,int iUserData,C4JStorage::PTMSPP_FILEDATA pFileData, LPCSTR szFilename); + static int TMSPPWriteReturned(LPVOID pParam,int iPad,int iUserData); + static int TMSPPDeleteReturned(LPVOID pParam,int iPad,int iUserData); + static int UploadSaveForXboxOneThreadProc( LPVOID lpParameter ); + static int LoadSaveDataReturned(void *pParam,bool bContinue); +private: + HRESULT BuildSlotFile(int iIndexBeingUpdated,PBYTE pbImageData,DWORD dwImageBytes); + + bool m_bIgnoreInput; + bool m_bRetrievingSaveInfo; + int m_iPad; + int m_MaxSlotC; + int m_iX; // tooltip for clearing all slots if there are saves in them + LoadMenuInitData *m_params; + XCONTENT_DATA m_XContentData; + PBYTE m_pbImageData; + DWORD m_dwImageBytes; + HXUIBRUSH m_hXuiBrush; + PBYTE m_pbSlotListFile; + unsigned int m_uiSlotListFileBytes; + SLOTDATA *m_pSlotDataA; + bool m_bWaitingForWrite; + void *m_pvSaveMem; + unsigned int m_uiStorageLength; + bool m_bSaveDataReceived; + unsigned int m_uiSlotID; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_TrialExitUpsell.cpp b/Minecraft.Client/Common/XUI/XUI_TrialExitUpsell.cpp new file mode 100644 index 00000000..51121099 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_TrialExitUpsell.cpp @@ -0,0 +1,136 @@ +#include "stdafx.h" +#include "XUI_TrialExitUpsell.h" + +// wchImages[TRIAL_EXIT_UPSELL_IMAGE_COUNT] +WCHAR *CScene_TrialExitUpsell::wchImages[]= +{ + L"Graphics/UpsellScreenshots/Screenshot1.png", + L"Graphics/UpsellScreenshots/Screenshot2.png", + L"Graphics/UpsellScreenshots/Screenshot3.png", + L"Graphics/UpsellScreenshots/Screenshot4.png", + L"Graphics/UpsellScreenshots/Screenshot5.png", + L"Graphics/UpsellScreenshots/Screenshot6.png", + L"Graphics/UpsellScreenshots/Screenshot7.png", + L"Graphics/UpsellScreenshots/Screenshot8.png" +}; + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_TrialExitUpsell::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + m_iPad=*(int *)pInitData->pvInitData; + + MapChildControls(); + + m_bCanExit = true; + m_bFadeStarted = false; + m_bShowingImage1 = true; + m_imagesShown = 0; + + m_image1.SetImagePath( wchImages[m_imagesShown] ); + SetTimer( 0, TRIAL_EXIT_UPSELL_IMAGE_DISPLAY_TIME); + + CXuiSceneBase::ShowBackground(DEFAULT_XUI_MENU_USER , FALSE); + CXuiSceneBase::ShowLogo(DEFAULT_XUI_MENU_USER , FALSE); + + if( m_bCanExit ) + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_EXIT_GAME,IDS_TOOLTIPS_BACK, IDS_UNLOCK_TITLE); + } + else + { + ui.SetTooltips( DEFAULT_XUI_MENU_USER, -1,IDS_TOOLTIPS_BACK, IDS_UNLOCK_TITLE); + } + + return S_OK; +} + +HRESULT CScene_TrialExitUpsell::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled) +{ + // ignore repeats + if(pInputData->dwFlags&XUI_INPUT_FLAG_REPEAT) return S_OK; + + ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode); + + HRESULT hr=S_OK; + + // Explicitly handle B button presses + switch(pInputData->dwKeyCode) + { + case VK_PAD_A: +#ifdef _XBOX + if( m_bCanExit ) + { + XLaunchNewImage(XLAUNCH_KEYWORD_DASH_ARCADE, 0); + } +#endif + break; + case VK_PAD_B: + case VK_ESCAPE: + app.NavigateBack(pInputData->UserIndex); + rfHandled = TRUE; + break; + case VK_PAD_X: + if(ProfileManager.IsSignedIn(pInputData->UserIndex)) + { + TelemetryManager->RecordUpsellPresented(pInputData->UserIndex, eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID); + ProfileManager.DisplayFullVersionPurchase(false,pInputData->UserIndex,eSen_UpsellID_Full_Version_Of_Game); + } + break; + } + + return hr; +} + +HRESULT CScene_TrialExitUpsell::OnTimelineEnd(HXUIOBJ hObjSource, BOOL& bHandled) +{ + if(m_bFadeStarted) + { + m_bFadeStarted = false; + m_bShowingImage1 = !m_bShowingImage1; + // We start a timer so we know when this image has been displayed for the required time + return SetTimer( 0, TRIAL_EXIT_UPSELL_IMAGE_DISPLAY_TIME); + } + else + { + return S_OK; + } +} + +HRESULT CScene_TrialExitUpsell::OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ) +{ + int nStart, nEnd; + + KillTimer(0); + + ++m_imagesShown; + if( m_imagesShown >= TRIAL_EXIT_UPSELL_IMAGE_COUNT ) + { + m_imagesShown = 0; //Loop round to the start + m_bCanExit = true; + + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_EXIT_GAME,IDS_TOOLTIPS_BACK, IDS_UNLOCK_TITLE); + } + + if( m_bShowingImage1 ) + { + m_image2.SetImagePath( wchImages[m_imagesShown] ); + + FindNamedFrame( L"Fade1to2", &nStart ); + FindNamedFrame( L"EndFade1to2", &nEnd ); + PlayTimeline( nStart, nStart, nEnd, FALSE, TRUE ); + m_bFadeStarted = true; + } + else + { + m_image1.SetImagePath( wchImages[m_imagesShown] ); + + FindNamedFrame( L"Fade2to1", &nStart ); + FindNamedFrame( L"EndFade2to1", &nEnd ); + PlayTimeline( nStart, nStart, nEnd, FALSE, TRUE ); + m_bFadeStarted = true; + } + + return S_OK; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_TrialExitUpsell.h b/Minecraft.Client/Common/XUI/XUI_TrialExitUpsell.h new file mode 100644 index 00000000..748b36a2 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_TrialExitUpsell.h @@ -0,0 +1,46 @@ +#pragma once + +#include "../media/xuiscene_trialexitupsell.h" + +#define TRIAL_EXIT_UPSELL_IMAGE_DISPLAY_TIME 3000 + +#define TRIAL_EXIT_UPSELL_IMAGE_COUNT 8 + +class CScene_TrialExitUpsell : public CXuiSceneImpl +{ +private: + static WCHAR *wchImages[TRIAL_EXIT_UPSELL_IMAGE_COUNT]; + +protected: + CXuiImageElement m_image1, m_image2; + + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_KEYDOWN(OnKeyDown) + XUI_ON_XM_TIMELINE_END(OnTimelineEnd) + XUI_ON_XM_TIMER( OnTimer ) + XUI_END_MSG_MAP() + + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_XuiImage1, m_image1) + MAP_CONTROL(IDC_XuiImage2, m_image2) + END_CONTROL_MAP() + + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled); + HRESULT OnTimelineEnd(HXUIOBJ hObjSource, BOOL& bHandled); + HRESULT OnTimer( XUIMessageTimer *pTimer, BOOL& bHandled ); + + int m_iPad; + bool m_bCanExit; + bool m_bFadeStarted; + bool m_bShowingImage1; + unsigned char m_imagesShown; +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_TrialExitUpsell, L"CScene_TrialExitUpsell", XUI_CLASS_SCENE ) + +}; diff --git a/Minecraft.Client/Common/XUI/XUI_TutorialPopup.cpp b/Minecraft.Client/Common/XUI/XUI_TutorialPopup.cpp new file mode 100644 index 00000000..98951d81 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_TutorialPopup.cpp @@ -0,0 +1,603 @@ +#include "stdafx.h" +#include "..\..\Common\Tutorial\Tutorial.h" +#include "..\..\MultiplayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" +#include "..\..\..\Minecraft.World\Tile.h" +#include "..\..\..\Minecraft.World\Item.h" +#include "XUI_Ctrl_CraftIngredientSlot.h" +#include "XUI_XZP_Icons.h" + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_TutorialPopup::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + HRESULT hr = S_OK; + + tutorial = (Tutorial *)pInitData->pvInitData; + m_iPad = tutorial->getPad(); + + MapChildControls(); + + // splitscreen? + // if we are in splitscreen, then we need to figure out if we want to move this scene + if(app.GetLocalPlayerCount()>1) + { + app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); + } + + m_textFontSize = _fromString( m_fontSizeControl.GetText() ); + m_fontSizeControl.SetShow(false); + + m_interactScene = NULL; + m_lastSceneMovedLeft = false; + m_bAllowFade = false; + + SetShow(false); + XuiSetTimer(m_hObj,TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID,TUTORIAL_POPUP_MOVE_SCENE_TIME); + + return hr; +} + +HRESULT CScene_TutorialPopup::OnDestroy() +{ + return S_OK; +} + +HRESULT CScene_TutorialPopup::OnTimer(XUIMessageTimer *pData,BOOL& rfHandled) +{ + if( pData->nId == TUTORIAL_POPUP_FADE_TIMER_ID ) + { + XuiKillTimer(m_hObj,TUTORIAL_POPUP_FADE_TIMER_ID); + SetShow( false ); + XuiSetTimer(m_hObj,TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID,TUTORIAL_POPUP_MOVE_SCENE_TIME); + } + else if( pData->nId == TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID ) + { + UpdateInteractScenePosition(IsShown() == TRUE); + XuiKillTimer(m_hObj,TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID); + } + + return S_OK; +} + +void CScene_TutorialPopup::UpdateInteractScenePosition(bool visible) +{ + if( m_interactScene == NULL ) return; + + // 4J-PB - check this players screen section to see if we should allow the animation + bool bAllowAnim=false; + HXUICLASS sceneClass = XuiGetObjectClass( m_interactScene->m_hObj ); + + HXUICLASS inventoryClass = XuiFindClass( L"CXuiSceneInventory" ); + HXUICLASS furnaceClass = XuiFindClass( L"CXuiSceneFurnace" ); + HXUICLASS craftingClass = XuiFindClass( L"CXuiSceneCraftingPanel" ); + HXUICLASS trapClass = XuiFindClass( L"CXuiSceneTrap" ); + HXUICLASS containerClass = XuiFindClass( L"CXuiSceneContainer" ); + HXUICLASS creativeInventoryClass = XuiFindClass( L"CXuiSceneInventoryCreative" ); + HXUICLASS enchantingClass = XuiFindClass( L"CXuiSceneEnchant" ); + HXUICLASS brewingClass = XuiFindClass( L"CXuiSceneBrewingStand" ); + HXUICLASS anvilClass = XuiFindClass( L"CXuiSceneAnvil" ); + HXUICLASS tradingClass = XuiFindClass( L"CXuiSceneTrading" ); + BOOL isCraftingScene = XuiClassDerivesFrom( sceneClass, craftingClass ); + BOOL isCreativeScene = XuiClassDerivesFrom( sceneClass, creativeInventoryClass ); + + switch(Minecraft::GetInstance()->localplayers[m_iPad]->m_iScreenSection) + { + case C4JRender::VIEWPORT_TYPE_FULLSCREEN: + case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: + case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: + bAllowAnim=true; + break; + default: + // anim allowed for everything except the crafting 2x2 and 3x3, and the creative menu + if(!isCraftingScene && !isCreativeScene) + { + bAllowAnim=true; + } + break; + } + + if(bAllowAnim) + { + + XUITimeline *timeline; + XUINamedFrame *startFrame; + XUINamedFrame *endFrame; + bool movingLeft = false; + // Also returns TRUE if they are the same (which is what we want) + if( XuiClassDerivesFrom( sceneClass, inventoryClass ) || + XuiClassDerivesFrom( sceneClass, furnaceClass ) || + XuiClassDerivesFrom( sceneClass, trapClass ) || + XuiClassDerivesFrom( sceneClass, containerClass ) || + XuiClassDerivesFrom( sceneClass, enchantingClass ) || + XuiClassDerivesFrom( sceneClass, brewingClass ) || + XuiClassDerivesFrom( sceneClass, anvilClass ) || + XuiClassDerivesFrom( sceneClass, tradingClass ) || + isCreativeScene || + isCraftingScene == TRUE ) + { + XuiElementGetTimeline( m_interactScene->m_hObj, &timeline); + if(visible) + { + startFrame = timeline->FindNamedFrame( L"MoveLeft" ); + endFrame = timeline->FindNamedFrame( L"EndMoveLeft" ); + movingLeft = true; + } + else + { + startFrame = timeline->FindNamedFrame( L"MoveRight" ); + endFrame = timeline->FindNamedFrame( L"EndMoveRight" ); + } + + if( (m_lastInteractSceneMoved != m_interactScene && movingLeft) || ( m_lastInteractSceneMoved == m_interactScene && m_lastSceneMovedLeft != movingLeft ) ) + { + timeline->Play( startFrame->m_dwFrame, startFrame->m_dwFrame, endFrame->m_dwFrame, FALSE, FALSE ); + + m_lastInteractSceneMoved = m_interactScene; + m_lastSceneMovedLeft = movingLeft; + } + } + } + +} + +HRESULT CScene_TutorialPopup::_SetDescription(CXuiScene *interactScene, LPCWSTR desc, LPCWSTR title, bool allowFade, bool isReminder) +{ + HRESULT hr = S_OK; + m_interactScene = interactScene; + if( interactScene != m_lastInteractSceneMoved ) m_lastInteractSceneMoved = NULL; + if(desc == NULL) + { + SetShow( false ); + XuiSetTimer(m_hObj,TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID,TUTORIAL_POPUP_MOVE_SCENE_TIME); + XuiKillTimer(m_hObj,TUTORIAL_POPUP_FADE_TIMER_ID); + } + else + { + SetShow( true ); + XuiSetTimer(m_hObj,TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID,TUTORIAL_POPUP_MOVE_SCENE_TIME); + + if( allowFade ) + { + //Initialise a timer to fade us out again + XuiSetTimer(m_hObj,TUTORIAL_POPUP_FADE_TIMER_ID,tutorial->GetTutorialDisplayMessageTime()); + } + else + { + XuiKillTimer(m_hObj,TUTORIAL_POPUP_FADE_TIMER_ID); + } + m_bAllowFade = allowFade; + + if(isReminder) + { + wstring text(app.GetString( IDS_TUTORIAL_REMINDER )); + text.append( desc ); + // set the text colour + wchar_t formatting[40]; + swprintf(formatting, 40, L"",app.GetHTMLColour(eHTMLColor_White),m_textFontSize); + text = formatting + text; + + hr = m_description.SetText( text.c_str() ); + } + else + { + wstring text(desc); + // set the text colour + wchar_t formatting[40]; + swprintf(formatting, 40, L"",app.GetHTMLColour(eHTMLColor_White),m_textFontSize); + text = formatting + text; + + hr = m_description.SetText( text.c_str() ); + } + + D3DXVECTOR3 titlePos; + hr = XuiElementGetPosition( m_title, &titlePos ); + + BOOL titleShowAtStart = m_title.IsShown(); + if( title != NULL && title[0] != 0 ) + { + m_title.SetText( title ); + m_title.SetShow(TRUE); + } + else + { + m_title.SetText( L"" ); + m_title.SetShow(FALSE); + } + BOOL titleShowAtEnd = m_title.IsShown(); + if(titleShowAtStart != titleShowAtEnd) + { + float fHeight, fWidth, fTitleHeight, fDescHeight, fDescWidth; + m_title.GetBounds(&fWidth,&fTitleHeight); + GetBounds(&fWidth,&fHeight); + + + // 4J Stu - For some reason when we resize the scene it resets the size of the HTML control + // We don't want that to happen, so get it's size before and set it back after + m_description.GetBounds(&fDescWidth,&fDescHeight); + if(titleShowAtEnd) + { + titlePos.y += fTitleHeight; + + SetBounds(fWidth, fHeight + fTitleHeight); + } + else + { + SetBounds(fWidth, fHeight - fTitleHeight); + } + XuiElementSetPosition( m_description, &titlePos ); + m_description.SetBounds(fDescWidth, fDescHeight); + } + + // Check if we need to resize the box + XUIContentDims contentDims; + m_description.GetContentDims(&contentDims); + + int heightDiff = contentDims.nContentHeight - contentDims.nPageHeight; + + float fHeight, fWidth; + GetBounds(&fWidth,&fHeight); + SetBounds(fWidth, fHeight + heightDiff); + + m_description.GetBounds(&fWidth,&fHeight); + m_description.SetBounds(fWidth, (float)(contentDims.nPageHeight + heightDiff)); + } + return hr; +} + +HRESULT CScene_TutorialPopup::SetDescription(int iPad, TutorialPopupInfo *info) +{ + HRESULT hr = S_OK; + +#ifdef _XBOX + HXUIOBJ hObj = app.GetCurrentTutorialScene(iPad); + HXUICLASS thisClass = XuiFindClass( L"CScene_TutorialPopup" ); + HXUICLASS objClass = XuiGetObjectClass( hObj ); + + // Also returns TRUE if they are the same (which is what we want) + if( XuiClassDerivesFrom( objClass, thisClass ) ) + { + + CScene_TutorialPopup *pThis; + hr = XuiObjectFromHandle(hObj, (void **) &pThis); + if (FAILED(hr)) + return hr; + + wstring parsed = pThis->_SetIcon(info->icon, info->iAuxVal, info->isFoil, info->desc); + parsed = pThis->_SetImage( parsed ); + parsed = CScene_TutorialPopup::ParseDescription(iPad, parsed); + if(parsed.empty()) + { + hr = pThis->_SetDescription( info->interactScene, NULL, NULL, info->allowFade, info->isReminder ); + } + else + { + hr = pThis->_SetDescription( info->interactScene, parsed.c_str(), info->title, info->allowFade, info->isReminder ); + } + } +#endif + return hr; +} + +wstring CScene_TutorialPopup::_SetIcon(int icon, int iAuxVal, bool isFoil, LPCWSTR desc) +{ + wstring temp(desc); + + BOOL iconShowAtStart = m_pCraftingPic->IsShown(); + + if( icon != TUTORIAL_NO_ICON ) + { + bool itemIsFoil = false; + itemIsFoil = (shared_ptr(new ItemInstance(icon,1,iAuxVal)))->isFoil(); + if(!itemIsFoil) itemIsFoil = isFoil; + + m_pCraftingPic->SetIcon(m_iPad, icon,iAuxVal,1,10,31,false,itemIsFoil); + } + else + { + wstring openTag(L"{*ICON*}"); + wstring closeTag(L"{*/ICON*}"); + int iconTagStartPos = (int)temp.find(openTag); + int iconStartPos = iconTagStartPos + (int)openTag.length(); + if( iconTagStartPos > 0 && iconStartPos < (int)temp.length() ) + { + int iconEndPos = (int)temp.find( closeTag, iconStartPos ); + + if(iconEndPos > iconStartPos && iconEndPos < (int)temp.length() ) + { + wstring id = temp.substr(iconStartPos, iconEndPos - iconStartPos); + + vector idAndAux = stringSplit(id,L':'); + + int iconId = _fromString(idAndAux[0]); + + if(idAndAux.size() > 1) + { + iAuxVal = _fromString(idAndAux[1]); + } + else + { + iAuxVal = 0; + } + + bool itemIsFoil = false; + itemIsFoil = (shared_ptr(new ItemInstance(iconId,1,iAuxVal)))->isFoil(); + if(!itemIsFoil) itemIsFoil = isFoil; + + m_pCraftingPic->SetIcon(m_iPad, iconId,iAuxVal,1,10,31,false,itemIsFoil); + + temp.replace(iconTagStartPos, iconEndPos - iconTagStartPos + closeTag.length(), L""); + } + } + + // remove any icon text + else if(temp.find(L"{*CraftingTableIcon*}")!=wstring::npos) + { + m_pCraftingPic->SetIcon(m_iPad, Tile::workBench->id,0,1,10,31,false); + } + else if(temp.find(L"{*SticksIcon*}")!=wstring::npos) + { + m_pCraftingPic->SetIcon(m_iPad, Item::stick->id,0,1,10,31,false); + } + else if(temp.find(L"{*PlanksIcon*}")!=wstring::npos) + { + m_pCraftingPic->SetIcon(m_iPad, Tile::wood->id,0,1,10,31,false); + } + else if(temp.find(L"{*WoodenShovelIcon*}")!=wstring::npos) + { + m_pCraftingPic->SetIcon(m_iPad, Item::shovel_wood->id,0,1,10,31,false); + } + else if(temp.find(L"{*WoodenHatchetIcon*}")!=wstring::npos) + { + m_pCraftingPic->SetIcon(m_iPad, Item::hatchet_wood->id,0,1,10,31,false); + } + else if(temp.find(L"{*WoodenPickaxeIcon*}")!=wstring::npos) + { + m_pCraftingPic->SetIcon(m_iPad, Item::pickAxe_wood->id,0,1,10,31,false); + } + else if(temp.find(L"{*FurnaceIcon*}")!=wstring::npos) + { + m_pCraftingPic->SetIcon(m_iPad, Tile::furnace_Id,0,1,10,31,false); + } + else if(temp.find(L"{*WoodenDoorIcon*}")!=wstring::npos) + { + m_pCraftingPic->SetIcon(m_iPad, Item::door_wood->id,0,1,10,31,false); + } + else if(temp.find(L"{*TorchIcon*}")!=wstring::npos) + { + m_pCraftingPic->SetIcon(m_iPad, Tile::torch_Id,0,1,10,31,false); + } + else if(temp.find(L"{*BoatIcon*}")!=wstring::npos) + { + m_pCraftingPic->SetIcon(m_iPad, Item::boat_Id,0,1,10,31,false); + } + else if(temp.find(L"{*FishingRodIcon*}")!=wstring::npos) + { + m_pCraftingPic->SetIcon(m_iPad, Item::fishingRod_Id,0,1,10,31,false); + } + else if(temp.find(L"{*FishIcon*}")!=wstring::npos) + { + m_pCraftingPic->SetIcon(m_iPad, Item::fish_raw_Id,0,1,10,31,false); + } + else if(temp.find(L"{*MinecartIcon*}")!=wstring::npos) + { + m_pCraftingPic->SetIcon(m_iPad, Item::minecart_Id,0,1,10,31,false); + } + else if(temp.find(L"{*RailIcon*}")!=wstring::npos) + { + m_pCraftingPic->SetIcon(m_iPad, Tile::rail_Id,0,1,10,31,false); + } + else if(temp.find(L"{*PoweredRailIcon*}")!=wstring::npos) + { + m_pCraftingPic->SetIcon(m_iPad, Tile::goldenRail_Id,0,1,10,31,false); + } + else if(temp.find(L"{*StructuresIcon*}")!=wstring::npos) + { + m_pCraftingPic->SetIcon(m_iPad, XZP_ICON_STRUCTURES,0,1,10,31,false); + } + else if(temp.find(L"{*ToolsIcon*}")!=wstring::npos) + { + m_pCraftingPic->SetIcon(m_iPad, XZP_ICON_TOOLS,0,1,10,31,false); + } + else if(temp.find(L"{*StoneIcon*}")!=wstring::npos) + { + m_pCraftingPic->SetIcon(m_iPad, Tile::rock_Id,0,1,10,31,false); + } + else + { + // hide the icon slot + m_pCraftingPic->SetIcon(m_iPad, 0,0,0,0,0,false,false,FALSE); + } + } + + BOOL iconShowAtEnd = m_pCraftingPic->IsShown(); + if(iconShowAtStart != iconShowAtEnd) + { + float fHeight, fWidth, fIconHeight, fDescHeight, fDescWidth; + m_pCraftingPic->GetBounds(&fWidth,&fIconHeight); + GetBounds(&fWidth,&fHeight); + + + // 4J Stu - For some reason when we resize the scene it resets the size of the HTML control + // We don't want that to happen, so get it's size before and set it back after + m_description.GetBounds(&fDescWidth,&fDescHeight); + if(iconShowAtEnd) + { + SetBounds(fWidth, fHeight + fIconHeight); + } + else + { + SetBounds(fWidth, fHeight - fIconHeight); + } + m_description.SetBounds(fDescWidth, fDescHeight); + } + + return temp; +} + +wstring CScene_TutorialPopup::_SetImage(wstring &desc) +{ + + BOOL imageShowAtStart = m_image.IsShown(); + + wstring openTag(L"{*IMAGE*}"); + wstring closeTag(L"{*/IMAGE*}"); + int imageTagStartPos = (int)desc.find(openTag); + int imageStartPos = imageTagStartPos + (int)openTag.length(); + if( imageTagStartPos > 0 && imageStartPos < (int)desc.length() ) + { + int imageEndPos = (int)desc.find( closeTag, imageStartPos ); + + if(imageEndPos > imageStartPos && imageEndPos < (int)desc.length() ) + { + wstring id = desc.substr(imageStartPos, imageEndPos - imageStartPos); + m_image.SetImagePath( id.c_str() ); + m_image.SetShow( TRUE ); + + desc.replace(imageTagStartPos, imageEndPos - imageTagStartPos + closeTag.length(), L""); + } + } + else + { + // hide the icon slot + m_image.SetShow( FALSE ); + } + + BOOL imageShowAtEnd = m_image.IsShown(); + if(imageShowAtStart != imageShowAtEnd) + { + float fHeight, fWidth, fIconHeight, fDescHeight, fDescWidth; + m_image.GetBounds(&fWidth,&fIconHeight); + GetBounds(&fWidth,&fHeight); + + + // 4J Stu - For some reason when we resize the scene it resets the size of the HTML control + // We don't want that to happen, so get it's size before and set it back after + m_description.GetBounds(&fDescWidth,&fDescHeight); + if(imageShowAtEnd) + { + SetBounds(fWidth, fHeight + fIconHeight); + } + else + { + SetBounds(fWidth, fHeight - fIconHeight); + } + m_description.SetBounds(fDescWidth, fDescHeight); + } + + return desc; +} + + +wstring CScene_TutorialPopup::ParseDescription(int iPad, wstring &text) +{ + text = replaceAll(text, L"{*CraftingTableIcon*}", L""); + text = replaceAll(text, L"{*SticksIcon*}", L""); + text = replaceAll(text, L"{*PlanksIcon*}", L""); + text = replaceAll(text, L"{*WoodenShovelIcon*}", L""); + text = replaceAll(text, L"{*WoodenHatchetIcon*}", L""); + text = replaceAll(text, L"{*WoodenPickaxeIcon*}", L""); + text = replaceAll(text, L"{*FurnaceIcon*}", L""); + text = replaceAll(text, L"{*WoodenDoorIcon*}", L""); + text = replaceAll(text, L"{*TorchIcon*}", L""); + text = replaceAll(text, L"{*MinecartIcon*}", L""); + text = replaceAll(text, L"{*BoatIcon*}", L""); + text = replaceAll(text, L"{*FishingRodIcon*}", L""); + text = replaceAll(text, L"{*FishIcon*}", L""); + text = replaceAll(text, L"{*RailIcon*}", L""); + text = replaceAll(text, L"{*PoweredRailIcon*}", L""); + text = replaceAll(text, L"{*StructuresIcon*}", L""); + text = replaceAll(text, L"{*ToolsIcon*}", L""); + text = replaceAll(text, L"{*StoneIcon*}", L""); + + if( app.GetLocalPlayerCount() > 1 ) + { + // TODO TU-1 - This should really be a string as well rather than hardcoded here + text = replaceAll(text, L"{*EXIT_PICTURE*}", L"
" ); + + // TODO TU-1 - This should also be separate strings, or move these things out of a localisable file so we can add/change them at will + text = replaceAll(text, L"height=\"30\" width=\"30\"", L"height=\"20\" width=\"20\""); + } + else + { + text = replaceAll(text, L"{*EXIT_PICTURE*}", app.GetString( IDS_TUTORIAL_HTML_EXIT_PICTURE ) ); + } + /* +#define MINECRAFT_ACTION_RENDER_DEBUG ACTION_INGAME_13 +#define MINECRAFT_ACTION_PAUSEMENU ACTION_INGAME_15 +#define MINECRAFT_ACTION_SNEAK_TOGGLE ACTION_INGAME_17 + */ + + return app.FormatHTMLString(iPad,text); +} + +HRESULT CScene_TutorialPopup::_SetVisible(bool show) +{ + HRESULT hr = this->SetShow( show ); + + if( show && m_bAllowFade ) + { + //Initialise a timer to fade us out again + XuiSetTimer(m_hObj,TUTORIAL_POPUP_FADE_TIMER_ID,tutorial->GetTutorialDisplayMessageTime()); + } + + return hr; +} + +bool CScene_TutorialPopup::_IsSceneVisible() +{ + bool isVisible = this->IsShown()==TRUE?true:false; + + return isVisible; +} + +HRESULT CScene_TutorialPopup::SetSceneVisible(int iPad, bool show) +{ + HRESULT hr = S_OK; + + HXUIOBJ hObj = app.GetCurrentTutorialScene(iPad); + HXUICLASS thisClass = XuiFindClass( L"CScene_TutorialPopup" ); + HXUICLASS objClass = XuiGetObjectClass( hObj ); + + // Also returns TRUE if they are the same (which is what we want) + if( XuiClassDerivesFrom( objClass, thisClass ) ) + { + CScene_TutorialPopup *pThis; + hr = XuiObjectFromHandle(hObj, (void **) &pThis); + if (FAILED(hr)) + return hr; + + hr = pThis->_SetVisible( show ); + } + return hr; +} + + +HRESULT CScene_TutorialPopup::OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled) +{ + bHandled=true; + return app.AdjustSplitscreenScene_PlayerChanged(m_hObj,&m_OriginalPosition,m_iPad,bJoining); +} + +bool CScene_TutorialPopup::IsSceneVisible(int iPad) +{ + bool isVisible = false; + HRESULT hr; + + HXUIOBJ hObj = app.GetCurrentTutorialScene(iPad); + HXUICLASS thisClass = XuiFindClass( L"CScene_TutorialPopup" ); + HXUICLASS objClass = XuiGetObjectClass( hObj ); + + // Also returns TRUE if they are the same (which is what we want) + if( XuiClassDerivesFrom( objClass, thisClass ) ) + { + CScene_TutorialPopup *pThis; + hr = XuiObjectFromHandle(hObj, (void **) &pThis); + if (FAILED(hr)) + return false; + + isVisible = pThis->_IsSceneVisible(); + } + return isVisible; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_TutorialPopup.h b/Minecraft.Client/Common/XUI/XUI_TutorialPopup.h new file mode 100644 index 00000000..65716759 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_TutorialPopup.h @@ -0,0 +1,78 @@ +#pragma once +#include "../media/xuiscene_tutorialpopup.h" +#include "XUI_CustomMessages.h" + +class Tutorial; +class CXuiCtrlCraftIngredientSlot; + +#define TUTORIAL_POPUP_FADE_TIMER_ID 0 +#define TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID 1 +#define TUTORIAL_POPUP_MOVE_SCENE_TIME 500 + +class CScene_TutorialPopup : public CXuiSceneImpl +{ +private: + Tutorial *tutorial; + + // A scene that may be displayed behind the popup that the player is using, that will need shifted so we can see it clearly. + CXuiScene *m_interactScene, *m_lastInteractSceneMoved; + bool m_lastSceneMovedLeft; + bool m_bAllowFade; + + int m_iPad; + + CXuiHtmlControl m_description; + CXuiCtrlCraftIngredientSlot *m_pCraftingPic; + CXuiControl m_title; + CXuiImageElement m_image; + + CXuiControl m_fontSizeControl; + + int m_textFontSize; + D3DXVECTOR3 m_OriginalPosition; + +protected: + // Message map. Here we tie messages to message handlers. + XUI_BEGIN_MSG_MAP() + XUI_ON_XM_INIT( OnInit ) + XUI_ON_XM_TIMER(OnTimer) + XUI_ON_XM_DESTROY( OnDestroy ) + XUI_ON_XM_SPLITSCREENPLAYER_MESSAGE(OnCustomMessage_Splitscreenplayer) + XUI_END_MSG_MAP() + + // Control mapping to objects + BEGIN_CONTROL_MAP() + MAP_CONTROL(IDC_Title, m_title) + MAP_CONTROL(IDC_Description, m_description) + MAP_OVERRIDE(IDC_XuiInventoryPic, m_pCraftingPic) + MAP_CONTROL(IDC_XuiImage, m_image) + MAP_CONTROL(IDC_FontSize, m_fontSizeControl) + + END_CONTROL_MAP() + + HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled ); + HRESULT OnTimer(XUIMessageTimer *pData,BOOL& rfHandled); + HRESULT OnDestroy(); + HRESULT OnCustomMessage_Splitscreenplayer(bool bJoining, BOOL& bHandled); +public: + + // Define the class. The class name must match the ClassOverride property + // set for the scene in the UI Authoring tool. + XUI_IMPLEMENT_CLASS( CScene_TutorialPopup, L"CScene_TutorialPopup", XUI_CLASS_SCENE ) + +private: + HRESULT _SetDescription(CXuiScene *interactScene, LPCWSTR desc, LPCWSTR title, bool allowFade, bool isReminder); + wstring _SetIcon(int icon, int iAuxVal, bool isFoil, LPCWSTR desc); + wstring _SetImage(wstring &desc); + HRESULT _SetVisible(bool show); + bool _IsSceneVisible(); + void UpdateInteractScenePosition(bool visible); + +public: + static HRESULT SetDescription(int iPad, TutorialPopupInfo *info); + static wstring ParseDescription(int iPad, wstring &text); + + static HRESULT SetSceneVisible(int iPad, bool show); + static bool IsSceneVisible(int iPad); + +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_XZP_Icons.h b/Minecraft.Client/Common/XUI/XUI_XZP_Icons.h new file mode 100644 index 00000000..46a1c22d --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_XZP_Icons.h @@ -0,0 +1,20 @@ +#pragma once + +#define XZP_ICON_SKELETON 32000 +#define XZP_ICON_CREEPER 32001 +#define XZP_ICON_SPIDERJOCKEY 32002 +#define XZP_ICON_SPIDER 32003 +#define XZP_ICON_ZOMBIE 32004 +#define XZP_ICON_ZOMBIEPIGMAN 32005 +#define XZP_ICON_SWAM 32006 +#define XZP_ICON_WALKED 32007 +#define XZP_ICON_FALLEN 32008 +#define XZP_ICON_PORTAL 32009 +#define XZP_ICON_CLIMBED 32010 +#define XZP_ICON_GHAST 32011 +#define XZP_ICON_SLIME 32012 +#define XZP_ICON_STRUCTURES 32013 +#define XZP_ICON_TOOLS 32014 + +#define XZP_ICON_SHANK_01 0 +#define XZP_ICON_SHANK_03 1 \ No newline at end of file diff --git a/Minecraft.Client/Common/XUI/XUI_debug.cpp b/Minecraft.Client/Common/XUI/XUI_debug.cpp new file mode 100644 index 00000000..61b818a0 --- /dev/null +++ b/Minecraft.Client/Common/XUI/XUI_debug.cpp @@ -0,0 +1,391 @@ +// Minecraft.cpp : Defines the entry point for the application. +// + +#include "stdafx.h" + +#include +#include "XUI_Debug.h" +#include "..\..\..\Minecraft.Client\StatsCounter.h" + +LPCWSTR CScene_Debug::m_DebugCheckboxTextA[eDebugSetting_Max+1]= +{ + L"Load Saves From Local Folder Mode", + L"Write Saves To Local Folder Mode", + L"Freeze Players", //L"Not Used", + L"Display Safe Area", + L"Mobs don't attack", + L"Freeze Time", + L"Disable Weather", + L"Craft Anything", + L"Use DPad for debug", + L"Mobs don't tick", + L"Instant Mine", + L"Show UI Console", + L"Distributable Save", + L"Debug Leaderboards", + L"Height-Water-Biome Maps", + L"Superflat nether", + //L"Light/Dark background", + L"More lightning when thundering", + L"", +}; + +LPCWSTR CScene_Debug::m_DebugButtonTextA[eDebugButton_Max+1]= +{ + L"Award Theme", + L"Award Avatar Item 1", + L"Award Avatar Item 2", + L"Award Avatar Item 3", + L"Award Gamerpic 1", + L"Award Gamerpic 2", + L"Check Tips", + L"Wipe Leaderboards", + L"", +}; + + + +//---------------------------------------------------------------------------------- +// Performs initialization tasks - retrieves controls. +//---------------------------------------------------------------------------------- +HRESULT CScene_Debug::OnInit( XUIMessageInit* pInitData, BOOL& bHandled ) +{ + m_iPad=*(int *)pInitData->pvInitData; + + // set text and enable any debug options required + int iCheckboxIndex=0; + int iButtonIndex=0; + float fWidth=500.0f; + float fX=240.0f; + float fY=200.0f; + float fYInc=5.0f; + float fControlHeight=25.0f; + + if((!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) || app.GetLocalPlayerCount()>1) + { + fWidth=250.0f; + fX=30.0f; + fY=30.0f; + fYInc=5.0f; + fControlHeight=15.0f; + } + + CXuiCheckbox *pCheckbox; + CXuiControl *pButton; + m_iTotalCheckboxElements=0; + m_iTotalButtonElements=0; + m_bOnCheckboxes=true; + + // count the items + while((*m_DebugCheckboxTextA[m_iTotalCheckboxElements])!=0) + { + m_iTotalCheckboxElements++; + } + + m_DebugCheckboxDataA= new DEBUGDATA [m_iTotalCheckboxElements]; + + while((*m_DebugCheckboxTextA[iCheckboxIndex])!=0) + { + XuiCreateObject( XUI_CLASS_CHECKBOX, &m_DebugCheckboxDataA[iCheckboxIndex].hXuiObj ); + XuiObjectFromHandle( m_DebugCheckboxDataA[iCheckboxIndex].hXuiObj, &m_DebugCheckboxDataA[iCheckboxIndex].pvData ); + + pCheckbox = (CXuiCheckbox *)m_DebugCheckboxDataA[iCheckboxIndex].pvData; + //m_phXuiObjA[iElementIndex] = pCheckbox->m_hObj; + pCheckbox->SetText(m_DebugCheckboxTextA[iCheckboxIndex]); + pCheckbox->SetShow(TRUE); + + D3DXVECTOR3 vPos; + float tx,ty; + pCheckbox->GetBounds(&tx,&ty); + pCheckbox->SetBounds(fWidth,fControlHeight); + vPos.x=fX; + vPos.y=fY; + vPos.z=0.0f; + pCheckbox->SetPosition(&vPos); + fY+=fControlHeight+fYInc; + + XuiElementAddChild(m_hObj,m_DebugCheckboxDataA[iCheckboxIndex].hXuiObj); + + iCheckboxIndex++; + } + + // and the buttons + if((!RenderManager.IsHiDef() && !RenderManager.IsWidescreen())|| app.GetLocalPlayerCount()>1) + { + fWidth=260.0f; + fX=300.0f; + fY=30.0f; + fControlHeight=40.0f; + } + else + { + fWidth=350.0f; + fX=750.0f; + fY=200.0f; + fControlHeight=40.0f; + } + + + + while((*m_DebugButtonTextA[m_iTotalButtonElements])!=0) + { + m_iTotalButtonElements++; + } + + m_DebugButtonDataA= new DEBUGDATA [m_iTotalButtonElements]; + + while((*m_DebugButtonTextA[iButtonIndex])!=0) + { + XuiCreateObject( XUI_CLASS_BUTTON, &m_DebugButtonDataA[iButtonIndex].hXuiObj ); + XuiObjectFromHandle( m_DebugButtonDataA[iButtonIndex].hXuiObj, &m_DebugButtonDataA[iButtonIndex].pvData ); + + pButton = (CXuiControl *)m_DebugButtonDataA[iButtonIndex].pvData; + //m_phXuiObjA[iElementIndex] = pCheckbox->m_hObj; + pButton->SetText(m_DebugButtonTextA[iButtonIndex]); + pButton->SetShow(TRUE); + + D3DXVECTOR3 vPos; + float tx,ty; + pButton->GetBounds(&tx,&ty); + pButton->SetBounds(fWidth,fControlHeight); + vPos.x=fX; + vPos.y=fY; + vPos.z=0.0f; + pButton->SetPosition(&vPos); + fY+=fControlHeight+fYInc; + + XuiElementAddChild(m_hObj,m_DebugButtonDataA[iButtonIndex].hXuiObj); + + // if you're not the primary player, disable all these - you need a storage device for them + + if(ProfileManager.GetPrimaryPad()!=m_iPad) + { + XuiControlSetEnable(m_DebugButtonDataA[iButtonIndex].hXuiObj,FALSE); + } + iButtonIndex++; + } + + + + unsigned int uiDebugBitmask=app.GetGameSettingsDebugMask(m_iPad); + + for(int i=0;iSetCheck( (uiDebugBitmask&(1<UserIndex, pInputData->dwKeyCode); + + HRESULT hr=S_OK; + int iCurrentBitmaskIndex=0; + unsigned int uiDebugBitmask=0L; + + // Explicitly handle X button presses + if (pInputData->dwKeyCode == VK_PAD_B) + { + // check all the settings + for(int i=0;iIsChecked()?(1<UserIndex)) + { + app.SetGameSettingsDebugMask(pInputData->UserIndex,uiDebugBitmask); + if(app.DebugSettingsOn()) + { + app.ActionDebugMask(pInputData->UserIndex); + } + else + { + // force debug mask off + app.ActionDebugMask(pInputData->UserIndex,true); + } + + app.CheckGameSettingsChanged(true,pInputData->UserIndex); + } + app.NavigateBack(pInputData->UserIndex); + rfHandled = TRUE; + } + + + return hr; +} + + +HRESULT CScene_Debug::OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) +{ + if(m_bOnCheckboxes) + { + // If it's not from the current control, ignore it + if(m_DebugCheckboxDataA[m_iCurrentCheckboxElement].hXuiObj!=pControlNavigateData->hObjSource) return S_OK; + + switch(pControlNavigateData->nControlNavigate) + { + case XUI_CONTROL_NAVIGATE_UP: + if(m_iCurrentCheckboxElement>0) + { + m_iCurrentCheckboxElement--; + XuiElementSetUserFocus(m_DebugCheckboxDataA[m_iCurrentCheckboxElement].hXuiObj, m_iPad); + } + break; + case XUI_CONTROL_NAVIGATE_DOWN: + if((m_iCurrentCheckboxElement+1)hObjSource) return S_OK; + + switch(pControlNavigateData->nControlNavigate) + { + case XUI_CONTROL_NAVIGATE_UP: + if(m_iCurrentButtonElement>0) + { + m_iCurrentButtonElement--; + XuiElementSetUserFocus(m_DebugButtonDataA[m_iCurrentButtonElement].hXuiObj, m_iPad); + } + break; + case XUI_CONTROL_NAVIGATE_DOWN: + if((m_iCurrentButtonElement+1)UserIndex, VK_PAD_A); + + int iButton=0; + + while((iButtonUserIndex, eAward_socialPost ); + break; + case eDebugButton_Avatar_Item_1: + ProfileManager.Award( pNotifyPressData->UserIndex, eAward_eatPorkChop ); + break; + case eDebugButton_Avatar_Item_2: + ProfileManager.Award( pNotifyPressData->UserIndex, eAward_play100Days ); + break; + case eDebugButton_Avatar_Item_3: + ProfileManager.Award( pNotifyPressData->UserIndex, eAward_arrowKillCreeper ); + break; + case eDebugButton_Gamerpic_1: + ProfileManager.Award( pNotifyPressData->UserIndex, eAward_mine100Blocks ); + break; + case eDebugButton_Gamerpic_2: + ProfileManager.Award( pNotifyPressData->UserIndex, eAward_kill10Creepers ); + break; + case eDebugButton_CheckTips: + app.NavigateToScene(pNotifyPressData->UserIndex,eUIScene_DebugTips); + break; + + case eDebugButton_WipeLeaderboards: +#ifdef _DEBUG +// commenting out so it doesn't get done by mistake +// Minecraft::GetInstance()->stats[pNotifyPressData->UserIndex]->WipeLeaderboards(); +#endif + break; + + } + + return S_OK; +} + diff --git a/Minecraft.Client/Common/res/1_2_2/achievement/bg.png b/Minecraft.Client/Common/res/1_2_2/achievement/bg.png new file mode 100644 index 00000000..23dd85a8 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/achievement/bg.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/achievement/icons.png b/Minecraft.Client/Common/res/1_2_2/achievement/icons.png new file mode 100644 index 00000000..6a3f3ea5 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/achievement/icons.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/armor/chain_1.png b/Minecraft.Client/Common/res/1_2_2/armor/chain_1.png new file mode 100644 index 00000000..3632af5b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/armor/chain_1.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/armor/chain_2.png b/Minecraft.Client/Common/res/1_2_2/armor/chain_2.png new file mode 100644 index 00000000..330425b1 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/armor/chain_2.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/armor/cloth_1.png b/Minecraft.Client/Common/res/1_2_2/armor/cloth_1.png new file mode 100644 index 00000000..f3cf4aa3 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/armor/cloth_1.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/armor/cloth_2.png b/Minecraft.Client/Common/res/1_2_2/armor/cloth_2.png new file mode 100644 index 00000000..15fb9084 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/armor/cloth_2.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/armor/diamond_1.png b/Minecraft.Client/Common/res/1_2_2/armor/diamond_1.png new file mode 100644 index 00000000..339da658 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/armor/diamond_1.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/armor/diamond_2.png b/Minecraft.Client/Common/res/1_2_2/armor/diamond_2.png new file mode 100644 index 00000000..c220c123 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/armor/diamond_2.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/armor/gold_1.png b/Minecraft.Client/Common/res/1_2_2/armor/gold_1.png new file mode 100644 index 00000000..885f309b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/armor/gold_1.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/armor/gold_2.png b/Minecraft.Client/Common/res/1_2_2/armor/gold_2.png new file mode 100644 index 00000000..9d1ea3b3 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/armor/gold_2.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/armor/iron_1.png b/Minecraft.Client/Common/res/1_2_2/armor/iron_1.png new file mode 100644 index 00000000..374ab076 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/armor/iron_1.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/armor/iron_2.png b/Minecraft.Client/Common/res/1_2_2/armor/iron_2.png new file mode 100644 index 00000000..53af4f4d Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/armor/iron_2.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/armor/power.png b/Minecraft.Client/Common/res/1_2_2/armor/power.png new file mode 100644 index 00000000..809539ca Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/armor/power.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/art/kz.png b/Minecraft.Client/Common/res/1_2_2/art/kz.png new file mode 100644 index 00000000..ecc4823e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/art/kz.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/environment/clouds.png b/Minecraft.Client/Common/res/1_2_2/environment/clouds.png new file mode 100644 index 00000000..b4a78c2f Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/environment/clouds.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/environment/light_normal.png b/Minecraft.Client/Common/res/1_2_2/environment/light_normal.png new file mode 100644 index 00000000..023f3cd5 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/environment/light_normal.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/environment/rain.png b/Minecraft.Client/Common/res/1_2_2/environment/rain.png new file mode 100644 index 00000000..75d775b1 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/environment/rain.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/environment/snow.png b/Minecraft.Client/Common/res/1_2_2/environment/snow.png new file mode 100644 index 00000000..84417c5c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/environment/snow.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/alternate.png b/Minecraft.Client/Common/res/1_2_2/font/alternate.png new file mode 100644 index 00000000..70a732e6 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/alternate.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/default.png b/Minecraft.Client/Common/res/1_2_2/font/default.png new file mode 100644 index 00000000..96094378 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/default.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_00.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_00.png new file mode 100644 index 00000000..badaa89a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_00.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_01.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_01.png new file mode 100644 index 00000000..8b13263a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_01.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_02.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_02.png new file mode 100644 index 00000000..b7f79b67 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_02.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_03.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_03.png new file mode 100644 index 00000000..66c8da1e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_03.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_04.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_04.png new file mode 100644 index 00000000..f809f53a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_04.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_05.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_05.png new file mode 100644 index 00000000..abeeb179 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_05.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_06.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_06.png new file mode 100644 index 00000000..b1b982ef Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_06.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_07.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_07.png new file mode 100644 index 00000000..9006d79c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_07.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_09.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_09.png new file mode 100644 index 00000000..c7b8eb75 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_09.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_0A.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_0A.png new file mode 100644 index 00000000..febfc861 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_0A.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_0B.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_0B.png new file mode 100644 index 00000000..23a7d7fa Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_0B.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_0C.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_0C.png new file mode 100644 index 00000000..eaffa7e7 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_0C.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_0D.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_0D.png new file mode 100644 index 00000000..0f49ce7e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_0D.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_0E.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_0E.png new file mode 100644 index 00000000..23d740d3 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_0E.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_0F.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_0F.png new file mode 100644 index 00000000..ebfda315 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_0F.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_10.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_10.png new file mode 100644 index 00000000..9f534d18 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_10.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_11.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_11.png new file mode 100644 index 00000000..3fd49256 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_11.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_12.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_12.png new file mode 100644 index 00000000..0733830b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_12.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_13.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_13.png new file mode 100644 index 00000000..c242e269 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_13.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_14.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_14.png new file mode 100644 index 00000000..244a23af Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_14.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_15.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_15.png new file mode 100644 index 00000000..c9508d10 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_15.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_16.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_16.png new file mode 100644 index 00000000..09f817c1 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_16.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_17.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_17.png new file mode 100644 index 00000000..ab12c1b8 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_17.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_18.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_18.png new file mode 100644 index 00000000..abd40b8d Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_18.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_19.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_19.png new file mode 100644 index 00000000..b009479e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_19.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_1A.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_1A.png new file mode 100644 index 00000000..eb856e9b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_1A.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_1B.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_1B.png new file mode 100644 index 00000000..343d1db7 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_1B.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_1C.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_1C.png new file mode 100644 index 00000000..89d5a5b9 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_1C.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_1D.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_1D.png new file mode 100644 index 00000000..58f621a4 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_1D.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_1E.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_1E.png new file mode 100644 index 00000000..9c7fbf3b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_1E.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_1F.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_1F.png new file mode 100644 index 00000000..a88a086a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_1F.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_20.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_20.png new file mode 100644 index 00000000..7f58416b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_20.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_21.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_21.png new file mode 100644 index 00000000..66964996 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_21.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_22.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_22.png new file mode 100644 index 00000000..c12beacd Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_22.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_23.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_23.png new file mode 100644 index 00000000..dc081c91 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_23.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_24.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_24.png new file mode 100644 index 00000000..a72608b9 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_24.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_25.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_25.png new file mode 100644 index 00000000..fba91722 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_25.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_26.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_26.png new file mode 100644 index 00000000..9641f840 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_26.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_27.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_27.png new file mode 100644 index 00000000..a6d99c8a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_27.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_28.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_28.png new file mode 100644 index 00000000..358a414b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_28.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_29.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_29.png new file mode 100644 index 00000000..7ece5346 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_29.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_2A.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_2A.png new file mode 100644 index 00000000..6713fbf1 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_2A.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_2B.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_2B.png new file mode 100644 index 00000000..7108270b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_2B.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_2C.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_2C.png new file mode 100644 index 00000000..04369ea6 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_2C.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_2D.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_2D.png new file mode 100644 index 00000000..3a43bf9f Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_2D.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_2E.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_2E.png new file mode 100644 index 00000000..f17a127d Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_2E.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_2F.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_2F.png new file mode 100644 index 00000000..8049f83d Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_2F.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_30.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_30.png new file mode 100644 index 00000000..87a1b6d7 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_30.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_31.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_31.png new file mode 100644 index 00000000..d1a9e1ba Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_31.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_32.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_32.png new file mode 100644 index 00000000..06b38098 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_32.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_33.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_33.png new file mode 100644 index 00000000..31372341 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_33.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_34.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_34.png new file mode 100644 index 00000000..75240d6b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_34.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_35.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_35.png new file mode 100644 index 00000000..c53366d3 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_35.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_36.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_36.png new file mode 100644 index 00000000..89dd0147 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_36.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_37.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_37.png new file mode 100644 index 00000000..86818e12 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_37.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_38.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_38.png new file mode 100644 index 00000000..0d7ce9ba Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_38.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_39.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_39.png new file mode 100644 index 00000000..323e0c3d Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_39.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_3A.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_3A.png new file mode 100644 index 00000000..8b2b4d8b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_3A.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_3B.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_3B.png new file mode 100644 index 00000000..f42d51d4 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_3B.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_3C.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_3C.png new file mode 100644 index 00000000..083a92da Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_3C.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_3D.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_3D.png new file mode 100644 index 00000000..465b9b47 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_3D.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_3E.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_3E.png new file mode 100644 index 00000000..66c7d97e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_3E.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_3F.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_3F.png new file mode 100644 index 00000000..fd557b58 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_3F.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_40.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_40.png new file mode 100644 index 00000000..f66192f6 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_40.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_41.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_41.png new file mode 100644 index 00000000..e73f5a4d Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_41.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_42.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_42.png new file mode 100644 index 00000000..abd075ce Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_42.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_43.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_43.png new file mode 100644 index 00000000..823bf103 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_43.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_44.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_44.png new file mode 100644 index 00000000..750ddf51 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_44.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_45.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_45.png new file mode 100644 index 00000000..055b239c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_45.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_46.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_46.png new file mode 100644 index 00000000..b019f5a9 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_46.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_47.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_47.png new file mode 100644 index 00000000..7a3fe80f Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_47.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_48.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_48.png new file mode 100644 index 00000000..80c3065a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_48.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_49.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_49.png new file mode 100644 index 00000000..d6c54c06 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_49.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_4A.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_4A.png new file mode 100644 index 00000000..438126be Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_4A.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_4B.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_4B.png new file mode 100644 index 00000000..0067b629 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_4B.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_4C.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_4C.png new file mode 100644 index 00000000..613d57f2 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_4C.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_4D.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_4D.png new file mode 100644 index 00000000..bd9b8b3e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_4D.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_4E.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_4E.png new file mode 100644 index 00000000..0475ccca Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_4E.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_4F.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_4F.png new file mode 100644 index 00000000..8fb06bd2 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_4F.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_50.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_50.png new file mode 100644 index 00000000..19ef3f63 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_50.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_51.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_51.png new file mode 100644 index 00000000..8c2cc60e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_51.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_52.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_52.png new file mode 100644 index 00000000..a1615f61 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_52.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_53.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_53.png new file mode 100644 index 00000000..d303d8b1 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_53.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_54.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_54.png new file mode 100644 index 00000000..7bc45be4 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_54.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_55.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_55.png new file mode 100644 index 00000000..457996ca Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_55.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_56.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_56.png new file mode 100644 index 00000000..10a8f788 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_56.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_57.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_57.png new file mode 100644 index 00000000..e147b255 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_57.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_58.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_58.png new file mode 100644 index 00000000..f0ffb445 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_58.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_59.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_59.png new file mode 100644 index 00000000..13f0155f Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_59.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_5A.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_5A.png new file mode 100644 index 00000000..5d5f7c74 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_5A.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_5B.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_5B.png new file mode 100644 index 00000000..e5d33f53 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_5B.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_5C.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_5C.png new file mode 100644 index 00000000..4a292e8b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_5C.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_5D.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_5D.png new file mode 100644 index 00000000..975f832f Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_5D.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_5E.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_5E.png new file mode 100644 index 00000000..5e64061a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_5E.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_5F.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_5F.png new file mode 100644 index 00000000..52d12d3a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_5F.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_60.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_60.png new file mode 100644 index 00000000..6d677ab6 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_60.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_61.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_61.png new file mode 100644 index 00000000..28e6e314 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_61.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_62.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_62.png new file mode 100644 index 00000000..29b64848 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_62.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_63.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_63.png new file mode 100644 index 00000000..e4f5bbc7 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_63.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_64.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_64.png new file mode 100644 index 00000000..6ca84df0 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_64.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_65.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_65.png new file mode 100644 index 00000000..73000a53 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_65.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_66.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_66.png new file mode 100644 index 00000000..54a6506c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_66.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_67.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_67.png new file mode 100644 index 00000000..a326f389 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_67.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_68.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_68.png new file mode 100644 index 00000000..26c2c086 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_68.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_69.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_69.png new file mode 100644 index 00000000..cf28465b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_69.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_6A.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_6A.png new file mode 100644 index 00000000..f8a399a4 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_6A.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_6B.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_6B.png new file mode 100644 index 00000000..1ad415cf Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_6B.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_6C.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_6C.png new file mode 100644 index 00000000..c359f2b5 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_6C.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_6D.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_6D.png new file mode 100644 index 00000000..b1f96be8 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_6D.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_6E.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_6E.png new file mode 100644 index 00000000..4b69dc89 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_6E.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_6F.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_6F.png new file mode 100644 index 00000000..9678cdd3 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_6F.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_70.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_70.png new file mode 100644 index 00000000..245ee9f4 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_70.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_71.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_71.png new file mode 100644 index 00000000..54721e1d Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_71.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_72.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_72.png new file mode 100644 index 00000000..aad17f8c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_72.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_73.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_73.png new file mode 100644 index 00000000..858e409b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_73.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_74.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_74.png new file mode 100644 index 00000000..2613bbe4 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_74.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_75.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_75.png new file mode 100644 index 00000000..78fdb417 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_75.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_76.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_76.png new file mode 100644 index 00000000..232ebe3f Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_76.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_77.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_77.png new file mode 100644 index 00000000..1e0045c4 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_77.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_78.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_78.png new file mode 100644 index 00000000..24a124c2 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_78.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_79.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_79.png new file mode 100644 index 00000000..53fdd3e5 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_79.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_7A.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_7A.png new file mode 100644 index 00000000..2dcc560f Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_7A.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_7B.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_7B.png new file mode 100644 index 00000000..544dfe95 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_7B.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_7C.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_7C.png new file mode 100644 index 00000000..a476ce3c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_7C.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_7D.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_7D.png new file mode 100644 index 00000000..b547d5bb Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_7D.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_7E.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_7E.png new file mode 100644 index 00000000..83feea20 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_7E.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_7F.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_7F.png new file mode 100644 index 00000000..beb0bed4 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_7F.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_80.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_80.png new file mode 100644 index 00000000..c97da9c0 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_80.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_81.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_81.png new file mode 100644 index 00000000..6c5944cc Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_81.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_82.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_82.png new file mode 100644 index 00000000..6c1fe0e4 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_82.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_83.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_83.png new file mode 100644 index 00000000..423c90a0 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_83.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_84.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_84.png new file mode 100644 index 00000000..8f2e8c85 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_84.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_85.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_85.png new file mode 100644 index 00000000..1799c0d3 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_85.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_86.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_86.png new file mode 100644 index 00000000..ddf36edb Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_86.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_87.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_87.png new file mode 100644 index 00000000..6950664e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_87.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_88.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_88.png new file mode 100644 index 00000000..ba2afc91 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_88.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_89.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_89.png new file mode 100644 index 00000000..54f7f0f4 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_89.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_8A.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_8A.png new file mode 100644 index 00000000..44a98609 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_8A.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_8B.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_8B.png new file mode 100644 index 00000000..f8411526 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_8B.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_8C.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_8C.png new file mode 100644 index 00000000..f0e0faac Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_8C.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_8D.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_8D.png new file mode 100644 index 00000000..3448dfa2 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_8D.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_8E.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_8E.png new file mode 100644 index 00000000..24e378ae Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_8E.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_8F.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_8F.png new file mode 100644 index 00000000..da8116b1 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_8F.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_90.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_90.png new file mode 100644 index 00000000..8d322441 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_90.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_91.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_91.png new file mode 100644 index 00000000..25161436 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_91.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_92.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_92.png new file mode 100644 index 00000000..1dce777e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_92.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_93.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_93.png new file mode 100644 index 00000000..0cd88c45 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_93.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_94.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_94.png new file mode 100644 index 00000000..e4ed8ffb Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_94.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_95.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_95.png new file mode 100644 index 00000000..c2351611 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_95.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_96.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_96.png new file mode 100644 index 00000000..8dd0b6ea Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_96.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_97.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_97.png new file mode 100644 index 00000000..e9f15153 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_97.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_98.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_98.png new file mode 100644 index 00000000..ccf000c8 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_98.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_99.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_99.png new file mode 100644 index 00000000..181cd07b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_99.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_9A.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_9A.png new file mode 100644 index 00000000..75c49f6e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_9A.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_9B.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_9B.png new file mode 100644 index 00000000..9501459d Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_9B.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_9C.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_9C.png new file mode 100644 index 00000000..af54e47e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_9C.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_9D.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_9D.png new file mode 100644 index 00000000..1c61203a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_9D.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_9E.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_9E.png new file mode 100644 index 00000000..ad805f8a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_9E.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_9F.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_9F.png new file mode 100644 index 00000000..f1632c08 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_9F.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_A0.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_A0.png new file mode 100644 index 00000000..c11b46ae Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_A0.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_A1.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_A1.png new file mode 100644 index 00000000..79a554a2 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_A1.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_A2.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_A2.png new file mode 100644 index 00000000..712577b9 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_A2.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_A3.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_A3.png new file mode 100644 index 00000000..8913bc96 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_A3.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_A4.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_A4.png new file mode 100644 index 00000000..39f7f989 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_A4.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_A5.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_A5.png new file mode 100644 index 00000000..865620be Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_A5.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_A6.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_A6.png new file mode 100644 index 00000000..69012bcd Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_A6.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_A7.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_A7.png new file mode 100644 index 00000000..efd1cd11 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_A7.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_A8.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_A8.png new file mode 100644 index 00000000..55b79c02 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_A8.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_A9.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_A9.png new file mode 100644 index 00000000..a275c39b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_A9.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_AA.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_AA.png new file mode 100644 index 00000000..5394ac7c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_AA.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_AB.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_AB.png new file mode 100644 index 00000000..96a74786 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_AB.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_AC.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_AC.png new file mode 100644 index 00000000..bd34b867 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_AC.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_AD.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_AD.png new file mode 100644 index 00000000..026899f9 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_AD.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_AE.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_AE.png new file mode 100644 index 00000000..49cfab89 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_AE.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_AF.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_AF.png new file mode 100644 index 00000000..b6b666df Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_AF.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_B0.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_B0.png new file mode 100644 index 00000000..28dc440e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_B0.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_B1.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_B1.png new file mode 100644 index 00000000..d944e6f1 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_B1.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_B2.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_B2.png new file mode 100644 index 00000000..ad6eaca4 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_B2.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_B3.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_B3.png new file mode 100644 index 00000000..0e11fadd Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_B3.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_B4.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_B4.png new file mode 100644 index 00000000..03e74324 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_B4.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_B5.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_B5.png new file mode 100644 index 00000000..4ebc7df6 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_B5.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_B6.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_B6.png new file mode 100644 index 00000000..7c73305a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_B6.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_B7.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_B7.png new file mode 100644 index 00000000..299ca4ee Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_B7.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_B8.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_B8.png new file mode 100644 index 00000000..964f094a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_B8.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_B9.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_B9.png new file mode 100644 index 00000000..2a4ba15d Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_B9.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_BA.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_BA.png new file mode 100644 index 00000000..e8e32e6d Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_BA.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_BB.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_BB.png new file mode 100644 index 00000000..130a7a6e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_BB.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_BC.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_BC.png new file mode 100644 index 00000000..31584307 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_BC.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_BD.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_BD.png new file mode 100644 index 00000000..3c369874 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_BD.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_BE.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_BE.png new file mode 100644 index 00000000..bc1e4d90 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_BE.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_BF.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_BF.png new file mode 100644 index 00000000..95174381 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_BF.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_C0.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_C0.png new file mode 100644 index 00000000..f5af2962 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_C0.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_C1.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_C1.png new file mode 100644 index 00000000..b42f7982 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_C1.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_C2.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_C2.png new file mode 100644 index 00000000..483f9212 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_C2.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_C3.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_C3.png new file mode 100644 index 00000000..05b8c2bc Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_C3.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_C4.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_C4.png new file mode 100644 index 00000000..e1f23a14 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_C4.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_C5.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_C5.png new file mode 100644 index 00000000..8490de77 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_C5.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_C6.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_C6.png new file mode 100644 index 00000000..92123f77 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_C6.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_C7.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_C7.png new file mode 100644 index 00000000..86f444fc Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_C7.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_C8.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_C8.png new file mode 100644 index 00000000..e5e7f70c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_C8.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_C9.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_C9.png new file mode 100644 index 00000000..b289f71b Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_C9.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_CA.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_CA.png new file mode 100644 index 00000000..5c3e6196 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_CA.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_CB.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_CB.png new file mode 100644 index 00000000..314e4134 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_CB.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_CC.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_CC.png new file mode 100644 index 00000000..75d5e30e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_CC.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_CD.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_CD.png new file mode 100644 index 00000000..73a44121 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_CD.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_CE.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_CE.png new file mode 100644 index 00000000..c0836349 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_CE.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_CF.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_CF.png new file mode 100644 index 00000000..be4094a8 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_CF.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_D0.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_D0.png new file mode 100644 index 00000000..955bdbbb Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_D0.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_D1.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_D1.png new file mode 100644 index 00000000..8a50a7b6 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_D1.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_D2.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_D2.png new file mode 100644 index 00000000..eebd5ae5 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_D2.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_D3.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_D3.png new file mode 100644 index 00000000..2d3f63a2 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_D3.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_D4.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_D4.png new file mode 100644 index 00000000..b95104f6 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_D4.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_D5.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_D5.png new file mode 100644 index 00000000..ab562fbf Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_D5.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_D6.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_D6.png new file mode 100644 index 00000000..a181bd8c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_D6.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_D7.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_D7.png new file mode 100644 index 00000000..83057df8 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_D7.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_F9.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_F9.png new file mode 100644 index 00000000..d683df45 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_F9.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_FA.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_FA.png new file mode 100644 index 00000000..25182d04 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_FA.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_FB.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_FB.png new file mode 100644 index 00000000..b6de14e3 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_FB.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_FC.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_FC.png new file mode 100644 index 00000000..0cfaa52c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_FC.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_FD.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_FD.png new file mode 100644 index 00000000..79687861 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_FD.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_FE.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_FE.png new file mode 100644 index 00000000..9b508ba6 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_FE.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_FF.png b/Minecraft.Client/Common/res/1_2_2/font/glyph_FF.png new file mode 100644 index 00000000..da328a78 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_FF.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/font/glyph_sizes.bin b/Minecraft.Client/Common/res/1_2_2/font/glyph_sizes.bin new file mode 100644 index 00000000..69c857e3 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/font/glyph_sizes.bin differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/alchemy.png b/Minecraft.Client/Common/res/1_2_2/gui/alchemy.png new file mode 100644 index 00000000..214a44bc Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/alchemy.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/allitems.png b/Minecraft.Client/Common/res/1_2_2/gui/allitems.png new file mode 100644 index 00000000..e1e5d779 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/allitems.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/background.png b/Minecraft.Client/Common/res/1_2_2/gui/background.png new file mode 100644 index 00000000..b29e0092 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/background.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/container.png b/Minecraft.Client/Common/res/1_2_2/gui/container.png new file mode 100644 index 00000000..bd1d383c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/container.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/crafting.png b/Minecraft.Client/Common/res/1_2_2/gui/crafting.png new file mode 100644 index 00000000..da831189 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/crafting.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/crash_logo.png b/Minecraft.Client/Common/res/1_2_2/gui/crash_logo.png new file mode 100644 index 00000000..78c5ef17 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/crash_logo.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/enchant.png b/Minecraft.Client/Common/res/1_2_2/gui/enchant.png new file mode 100644 index 00000000..0fddfd4c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/enchant.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/furnace.png b/Minecraft.Client/Common/res/1_2_2/gui/furnace.png new file mode 100644 index 00000000..8527289e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/furnace.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/gui.png b/Minecraft.Client/Common/res/1_2_2/gui/gui.png new file mode 100644 index 00000000..70c39540 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/gui.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/icons.png b/Minecraft.Client/Common/res/1_2_2/gui/icons.png new file mode 100644 index 00000000..e5d56d73 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/icons.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/inventory.png b/Minecraft.Client/Common/res/1_2_2/gui/inventory.png new file mode 100644 index 00000000..4d991169 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/inventory.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/items.png b/Minecraft.Client/Common/res/1_2_2/gui/items.png new file mode 100644 index 00000000..8f8a877e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/items.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/particles.png b/Minecraft.Client/Common/res/1_2_2/gui/particles.png new file mode 100644 index 00000000..ac7e39f4 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/particles.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/slot.png b/Minecraft.Client/Common/res/1_2_2/gui/slot.png new file mode 100644 index 00000000..caf4786a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/slot.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/trap.png b/Minecraft.Client/Common/res/1_2_2/gui/trap.png new file mode 100644 index 00000000..594860a6 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/trap.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/gui/unknown_pack.png b/Minecraft.Client/Common/res/1_2_2/gui/unknown_pack.png new file mode 100644 index 00000000..3a45a90e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/gui/unknown_pack.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/item/arrows.png b/Minecraft.Client/Common/res/1_2_2/item/arrows.png new file mode 100644 index 00000000..75c58287 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/item/arrows.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/item/boat.png b/Minecraft.Client/Common/res/1_2_2/item/boat.png new file mode 100644 index 00000000..132a0f7c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/item/boat.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/item/book.png b/Minecraft.Client/Common/res/1_2_2/item/book.png new file mode 100644 index 00000000..ae411ff2 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/item/book.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/item/cart.png b/Minecraft.Client/Common/res/1_2_2/item/cart.png new file mode 100644 index 00000000..ba73b60d Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/item/cart.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/item/chest.png b/Minecraft.Client/Common/res/1_2_2/item/chest.png new file mode 100644 index 00000000..fece5e1a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/item/chest.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/item/door.png b/Minecraft.Client/Common/res/1_2_2/item/door.png new file mode 100644 index 00000000..52df2d92 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/item/door.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/item/largechest.png b/Minecraft.Client/Common/res/1_2_2/item/largechest.png new file mode 100644 index 00000000..fb6e94fe Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/item/largechest.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/item/sign.png b/Minecraft.Client/Common/res/1_2_2/item/sign.png new file mode 100644 index 00000000..e8294724 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/item/sign.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/item/xporb.png b/Minecraft.Client/Common/res/1_2_2/item/xporb.png new file mode 100644 index 00000000..33670ee6 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/item/xporb.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/dial.png b/Minecraft.Client/Common/res/1_2_2/misc/dial.png new file mode 100644 index 00000000..140e7e34 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/dial.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/explosion.png b/Minecraft.Client/Common/res/1_2_2/misc/explosion.png new file mode 100644 index 00000000..732069b3 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/explosion.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/foliagecolor.png b/Minecraft.Client/Common/res/1_2_2/misc/foliagecolor.png new file mode 100644 index 00000000..81673cae Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/foliagecolor.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/footprint.png b/Minecraft.Client/Common/res/1_2_2/misc/footprint.png new file mode 100644 index 00000000..e29b6a6d Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/footprint.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/glint.png b/Minecraft.Client/Common/res/1_2_2/misc/glint.png new file mode 100644 index 00000000..67732093 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/glint.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/grasscolor.png b/Minecraft.Client/Common/res/1_2_2/misc/grasscolor.png new file mode 100644 index 00000000..a6d9c209 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/grasscolor.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/mapbg.png b/Minecraft.Client/Common/res/1_2_2/misc/mapbg.png new file mode 100644 index 00000000..ff2faaa7 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/mapbg.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/mapicons.png b/Minecraft.Client/Common/res/1_2_2/misc/mapicons.png new file mode 100644 index 00000000..9f325237 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/mapicons.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/particlefield.png b/Minecraft.Client/Common/res/1_2_2/misc/particlefield.png new file mode 100644 index 00000000..c8c56415 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/particlefield.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/pumpkinblur.png b/Minecraft.Client/Common/res/1_2_2/misc/pumpkinblur.png new file mode 100644 index 00000000..c6e2ffc9 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/pumpkinblur.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/shadow.png b/Minecraft.Client/Common/res/1_2_2/misc/shadow.png new file mode 100644 index 00000000..06d999b2 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/shadow.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/tunnel.png b/Minecraft.Client/Common/res/1_2_2/misc/tunnel.png new file mode 100644 index 00000000..dc479e07 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/tunnel.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/vignette.png b/Minecraft.Client/Common/res/1_2_2/misc/vignette.png new file mode 100644 index 00000000..f236acb3 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/vignette.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/water.png b/Minecraft.Client/Common/res/1_2_2/misc/water.png new file mode 100644 index 00000000..8b92f9bc Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/water.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/misc/watercolor.png b/Minecraft.Client/Common/res/1_2_2/misc/watercolor.png new file mode 100644 index 00000000..38bff05e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/misc/watercolor.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/cat_black.png b/Minecraft.Client/Common/res/1_2_2/mob/cat_black.png new file mode 100644 index 00000000..028ffcd1 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/cat_black.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/cat_red.png b/Minecraft.Client/Common/res/1_2_2/mob/cat_red.png new file mode 100644 index 00000000..5ca3fa1e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/cat_red.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/cat_siamese.png b/Minecraft.Client/Common/res/1_2_2/mob/cat_siamese.png new file mode 100644 index 00000000..70a88aed Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/cat_siamese.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/cavespider.png b/Minecraft.Client/Common/res/1_2_2/mob/cavespider.png new file mode 100644 index 00000000..288e5c3c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/cavespider.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/char.png b/Minecraft.Client/Common/res/1_2_2/mob/char.png new file mode 100644 index 00000000..7cfa08a8 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/char.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/chicken.png b/Minecraft.Client/Common/res/1_2_2/mob/chicken.png new file mode 100644 index 00000000..d4812939 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/chicken.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/cow.png b/Minecraft.Client/Common/res/1_2_2/mob/cow.png new file mode 100644 index 00000000..4264021e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/cow.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/creeper.png b/Minecraft.Client/Common/res/1_2_2/mob/creeper.png new file mode 100644 index 00000000..e0a5e0a1 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/creeper.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/beam.png b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/beam.png new file mode 100644 index 00000000..b0042418 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/beam.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/body.png b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/body.png new file mode 100644 index 00000000..e604a7ce Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/body.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/crystal.png b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/crystal.png new file mode 100644 index 00000000..f825ed69 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/crystal.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/dragon.png b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/dragon.png new file mode 100644 index 00000000..6abddc82 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/dragon.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/ender.png b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/ender.png new file mode 100644 index 00000000..2ea98241 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/ender.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/ender_eyes.png b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/ender_eyes.png new file mode 100644 index 00000000..1a98ba1c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/ender_eyes.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/shuffle.png b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/shuffle.png new file mode 100644 index 00000000..89be1d71 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/enderdragon/shuffle.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/enderman.png b/Minecraft.Client/Common/res/1_2_2/mob/enderman.png new file mode 100644 index 00000000..11b05d0e Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/enderman.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/enderman_eyes.png b/Minecraft.Client/Common/res/1_2_2/mob/enderman_eyes.png new file mode 100644 index 00000000..8265fd7f Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/enderman_eyes.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/fire.png b/Minecraft.Client/Common/res/1_2_2/mob/fire.png new file mode 100644 index 00000000..05364b49 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/fire.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/ghast.png b/Minecraft.Client/Common/res/1_2_2/mob/ghast.png new file mode 100644 index 00000000..e83a60da Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/ghast.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/ghast_fire.png b/Minecraft.Client/Common/res/1_2_2/mob/ghast_fire.png new file mode 100644 index 00000000..fff9718c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/ghast_fire.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/lava.png b/Minecraft.Client/Common/res/1_2_2/mob/lava.png new file mode 100644 index 00000000..036812f2 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/lava.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/ozelot.png b/Minecraft.Client/Common/res/1_2_2/mob/ozelot.png new file mode 100644 index 00000000..7a0b8b39 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/ozelot.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/pig.png b/Minecraft.Client/Common/res/1_2_2/mob/pig.png new file mode 100644 index 00000000..1ed505b5 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/pig.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/pigman.png b/Minecraft.Client/Common/res/1_2_2/mob/pigman.png new file mode 100644 index 00000000..c900b362 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/pigman.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/pigzombie.png b/Minecraft.Client/Common/res/1_2_2/mob/pigzombie.png new file mode 100644 index 00000000..0a0a25a4 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/pigzombie.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/redcow.png b/Minecraft.Client/Common/res/1_2_2/mob/redcow.png new file mode 100644 index 00000000..c0a2c976 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/redcow.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/saddle.png b/Minecraft.Client/Common/res/1_2_2/mob/saddle.png new file mode 100644 index 00000000..aaea7a6d Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/saddle.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/sheep.png b/Minecraft.Client/Common/res/1_2_2/mob/sheep.png new file mode 100644 index 00000000..647d0dd2 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/sheep.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/sheep_fur.png b/Minecraft.Client/Common/res/1_2_2/mob/sheep_fur.png new file mode 100644 index 00000000..f1291a5f Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/sheep_fur.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/silverfish.png b/Minecraft.Client/Common/res/1_2_2/mob/silverfish.png new file mode 100644 index 00000000..cc84f1d0 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/silverfish.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/skeleton.png b/Minecraft.Client/Common/res/1_2_2/mob/skeleton.png new file mode 100644 index 00000000..9d223394 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/skeleton.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/slime.png b/Minecraft.Client/Common/res/1_2_2/mob/slime.png new file mode 100644 index 00000000..42fc8736 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/slime.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/snowman.png b/Minecraft.Client/Common/res/1_2_2/mob/snowman.png new file mode 100644 index 00000000..7cab7144 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/snowman.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/spider.png b/Minecraft.Client/Common/res/1_2_2/mob/spider.png new file mode 100644 index 00000000..08344a83 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/spider.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/spider_eyes.png b/Minecraft.Client/Common/res/1_2_2/mob/spider_eyes.png new file mode 100644 index 00000000..2a7734f9 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/spider_eyes.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/squid.png b/Minecraft.Client/Common/res/1_2_2/mob/squid.png new file mode 100644 index 00000000..ff3f5b0a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/squid.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/villager.png b/Minecraft.Client/Common/res/1_2_2/mob/villager.png new file mode 100644 index 00000000..1a496f33 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/villager.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/villager/butcher.png b/Minecraft.Client/Common/res/1_2_2/mob/villager/butcher.png new file mode 100644 index 00000000..702cb8cf Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/villager/butcher.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/villager/farmer.png b/Minecraft.Client/Common/res/1_2_2/mob/villager/farmer.png new file mode 100644 index 00000000..683c3d51 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/villager/farmer.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/villager/librarian.png b/Minecraft.Client/Common/res/1_2_2/mob/villager/librarian.png new file mode 100644 index 00000000..5b7da625 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/villager/librarian.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/villager/priest.png b/Minecraft.Client/Common/res/1_2_2/mob/villager/priest.png new file mode 100644 index 00000000..928eab46 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/villager/priest.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/villager/smith.png b/Minecraft.Client/Common/res/1_2_2/mob/villager/smith.png new file mode 100644 index 00000000..c70b4bb8 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/villager/smith.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/villager/villager.png b/Minecraft.Client/Common/res/1_2_2/mob/villager/villager.png new file mode 100644 index 00000000..aa3afde8 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/villager/villager.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/villager_golem.png b/Minecraft.Client/Common/res/1_2_2/mob/villager_golem.png new file mode 100644 index 00000000..24c46185 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/villager_golem.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/wolf.png b/Minecraft.Client/Common/res/1_2_2/mob/wolf.png new file mode 100644 index 00000000..7a723066 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/wolf.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/wolf_angry.png b/Minecraft.Client/Common/res/1_2_2/mob/wolf_angry.png new file mode 100644 index 00000000..89b3d2d6 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/wolf_angry.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/wolf_tame.png b/Minecraft.Client/Common/res/1_2_2/mob/wolf_tame.png new file mode 100644 index 00000000..d46e572c Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/wolf_tame.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/mob/zombie.png b/Minecraft.Client/Common/res/1_2_2/mob/zombie.png new file mode 100644 index 00000000..5f39fd80 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/mob/zombie.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/pack.png b/Minecraft.Client/Common/res/1_2_2/pack.png new file mode 100644 index 00000000..973a7cf2 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/pack.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/pack.txt b/Minecraft.Client/Common/res/1_2_2/pack.txt new file mode 100644 index 00000000..c14bb3b4 --- /dev/null +++ b/Minecraft.Client/Common/res/1_2_2/pack.txt @@ -0,0 +1,2 @@ +The default look of Minecraft + diff --git a/Minecraft.Client/Common/res/1_2_2/particles.png b/Minecraft.Client/Common/res/1_2_2/particles.png new file mode 100644 index 00000000..de34f1b9 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/particles.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/terrain.png b/Minecraft.Client/Common/res/1_2_2/terrain.png new file mode 100644 index 00000000..4d2270b8 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/terrain.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/terrain/moon.png b/Minecraft.Client/Common/res/1_2_2/terrain/moon.png new file mode 100644 index 00000000..61cebbc7 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/terrain/moon.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/terrain/moon_phases.png b/Minecraft.Client/Common/res/1_2_2/terrain/moon_phases.png new file mode 100644 index 00000000..ce239ea7 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/terrain/moon_phases.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/terrain/sun.png b/Minecraft.Client/Common/res/1_2_2/terrain/sun.png new file mode 100644 index 00000000..43ba79a9 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/terrain/sun.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/title/bg/panorama0.png b/Minecraft.Client/Common/res/1_2_2/title/bg/panorama0.png new file mode 100644 index 00000000..8ba1dadd Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/title/bg/panorama0.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/title/bg/panorama1.png b/Minecraft.Client/Common/res/1_2_2/title/bg/panorama1.png new file mode 100644 index 00000000..c16841ad Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/title/bg/panorama1.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/title/bg/panorama2.png b/Minecraft.Client/Common/res/1_2_2/title/bg/panorama2.png new file mode 100644 index 00000000..0436d776 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/title/bg/panorama2.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/title/bg/panorama3.png b/Minecraft.Client/Common/res/1_2_2/title/bg/panorama3.png new file mode 100644 index 00000000..2c7ad778 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/title/bg/panorama3.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/title/bg/panorama4.png b/Minecraft.Client/Common/res/1_2_2/title/bg/panorama4.png new file mode 100644 index 00000000..03900967 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/title/bg/panorama4.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/title/bg/panorama5.png b/Minecraft.Client/Common/res/1_2_2/title/bg/panorama5.png new file mode 100644 index 00000000..0331ad4a Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/title/bg/panorama5.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/title/black.png b/Minecraft.Client/Common/res/1_2_2/title/black.png new file mode 100644 index 00000000..dc2ad3e7 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/title/black.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/title/credits.txt b/Minecraft.Client/Common/res/1_2_2/title/credits.txt new file mode 100644 index 00000000..8f593e24 --- /dev/null +++ b/Minecraft.Client/Common/res/1_2_2/title/credits.txt @@ -0,0 +1,57 @@ +[C]§f=============== +[C]§eMinecraft Credits +[C]§f=============== + +§7Created by: +§f Markus Persson + +§7Game design, programming and graphics: +§f Markus Persson +§f Jens Bergensten + +§7Music and sound: +§f Daniel Rosenfeld + +§7Ingame artwork and paintings: +§f Kristoffer Zetterstrand + +§7End game narrative: +§f Julian Gough + +§7Website development: +§f Tobias Möllstam +§f Daniel Frisk +§f Leonard Axelsson +§f Jens Bergensten +§f Markus Persson + +§7Logo and promotional artwork: +§f Markus Toivonen + +§7Business and administration: +§f Carl Manneh +§f Daniel Kaplan + +§7Director of fun: +§f Lydia Winters + +§7Number crunching and statistics: +§f Patrick Geuder + +§7Additional programming: +§f Paul Spooner +§f Ryan 'Scaevolus' Hitchman +§f Elliot 'Hippoplatimus' Segal + +§7Technologies used: +§f Java by Oracle +§f LWJGL by many talented people +§f "3d Sound System" by Paul Lamb +§f JOrbis by JCraft + + + + + + +§f"Twenty years from now you will be more disappointed by the things that you didn't do than by the ones you did do. So throw off the bowlines. Sail away from the safe harbor. Catch the trade winds in your sails. Explore. Dream. Discover." §7- Mark Twain \ No newline at end of file diff --git a/Minecraft.Client/Common/res/1_2_2/title/earlyplayers.txt b/Minecraft.Client/Common/res/1_2_2/title/earlyplayers.txt new file mode 100644 index 00000000..eee4d7bc --- /dev/null +++ b/Minecraft.Client/Common/res/1_2_2/title/earlyplayers.txt @@ -0,0 +1,722 @@ +ez +Racccccer12 +UlyssesSlaughter +newspaperboy55 +eatwhitefish +AmpTxFeaR +danteELITE +SoulPL +Ami2804 +Infamus +Rufus1852 +Raymoo9 +Muhs +MuHW +Steelion +Zee_Man +jackpeneycad +Mugz +Goonerman97 +Mimoun +bjoel2 +Pottux +timdv +DDJD9 +Damien27 +TheEyesOfLife +muji +Private_Public +BrickInTheHead +TimeZ +rip1427 +lennonzb654 +Parger129 +Snowbar +Vladivostok1 +Ginger879 +instagibb +marhom +paramime +RyleLGS +verbel +trovanon +Thorizzle +NinjaManBLAM +mudu +Delirus +SmickeyMcgee +MathewMkay +UncleMonteh +BigZ94 +tomtheuseless +Damien76 +Muff +snijboon1 +fuzzyliam780 +Gigith +Kanten +Jimmybean +Soulsy +SoulSR +Timic +deadlus +damien86 +Timin +Hutchenstein +damien95 +azoreanjeff +quackstar84 +korokun +randomshot +Triss247 +Tythiss +Murf +samwise +Murg +loltank +Murx +Harbinger617 +musa +killian123 +gumigoo +Soulix +BrettsFly +BrianBoyko +zarkboy +Mupz +Elad98 +tkranyak +kazeako +Turbopenguin42 +Tubbywatch +zionishe +johnyliltoe +Riczone +gamesta62 +AHungryHungarian +mups +varun_nath93 +Ratherdash +XenosEriadin +Vaedritol +dannyrocker +Mull +Tonya01 +sully96 +NJL97 +interfect +novack +spacepotatoman +Timan +funkjosh +teecubed333 +Snarkout89 +Nubsawce +DoubleOBond +Vault48 +Ninjila +DevonWargod +jkjk600 +Mulm +nathan329 +Mimore +reisyukaku +Georukh +Tokiko +NotBaldwin +zerox106 +Marakuja +Murhapuro +Bigbrown4114493 +boggyman123 +peter_buchan +Doozle +jpeuvion +iNTENZOR +Muzn +David987654321 +zjcain877 +nerbil +thaboyster +mitchyslick +Sirius_Amory +slatts +AndrijaG1 +JeffersonWilson +partyvan0 +Muzk +Muwo +TaoTev +sustainablejoe +destroyer451 +mune +hivemind101 +timbo +timba +Nodlehs +robotnik185 +darthmaul22 +jtslug +Shazbar +Brawlfanboy +nickschober +Muss +AceFantastic +deloctyte +Teck87 +sOuLsK +gnomerman +Sgt_Grumbles +imgreglol +InvertedMutiny +h4rris +CommodoreSkippy +Toysrmi +Slashwrists +SickThiele +Krakatoah +rellimnoraa +Muty +TazDontTap +borscht +Mikomaxless +blamblamblam +HelloMeow +Souleh +accronym +Darkokillzall +Nathan271 +djmousey +metalchaos +GentleBro +RorySmale +vipiao +Proffen93 +EwanJackson +doozey +Mikedood +blaskkaffe +josefkenny +Burned_Toast +Gigify +Justin_Joffrion +Yourself +MysterySMJ +Newbyninja +MidgetCo +Compwiz1993 +raymosh +Lucifersknight +irrationalistic +Shazbot +Lunchebox +kansom +shoggdog +mult +Fulibor +Murr +bails12 +Runn3R +scottlfc96 +Tim_K +Acctubi +suckonmyproness +Heenix +Fudgelette +deadmat +RedMageZidane +lukyluke +TaosSW +tegera1 +ThePaperclip +Arcsoft +Nik_Mahmood +Mark42 +Novaok +instagibz +ophelia123 +Mulk +nyleva +tazelhoff +liamh101 +lichking155 +drunkster +Timothy +Munk +Ginger987 +link825 +verado +markaidos13 +Sniper_Kill98 +czechplz +Sanctuary1 +TheBrokenOne +bdogproductions1 +mvit +LewisBroderick +Verace +picardan +Eskill +VictoriouSecret +Knightstrike +StatutoryApe66 +drewscreations +ollieg80 +anuador +Magneticmyst +Alaflex +OneOfTheAbove +TheEvilPenguin +Eskilo +voigt88 +ArtfulDodger42 +ws141 +BlondeUnknown +Pillsbury27530 +Stressless +DoctorProto +Evil_Otto +piippe +gohoosiers29 +Tullymanbanana +erikolanan +Muzy +loopylouise +drakkheim +VJ396768 +Invisix +Nametaker40 +mwoody +Jalathas +Wyrelade +starjik +Verail +frjulia +Mutagen +Zed_Boss +babymuseum +squiresfan +lephareamousse +Tilex +Larrss12 +VorSandwich +wollemamoth +Exodeux +O8GC +Keeko15 +danjt42 +farmerfarley +Ryan_Cook +Zharger +squalllion1uk +10882 +SLAPPAYURFACE +Tilan +nukerman +Arachnid0101 +Bzkill +toshiro7 +Link777 +ethos231 +olliedag +garrison888 +atronajs +Rafiki1996 +devinmrn +PutNameHere +JasonFozzy +ddj88 +MinwuWhite +imedio +JCabasquini +Raymose +Wyvryn +Artemisser +jcurses +Levis96 +MVec +Intenzio +Antthemighty +Coltrex +luckydog1123 +Utterballe +Kahdgar +doom195 +Bb505 +mnj777 +Teuprobont +koroke2 +ImaShortKid +Doomliquor +mvst +Helelos +Shuma22 +Zxcvbnmkj +TiLeN +spintherism +Aellia +Wrenky +Bipolarbear +TheShipoopi +Barkerman47 +Atercrest +ZeroPoints +Techvi +austinpika +Jinjithillion +PaRaDOX_578 +rocketseed +m616vp +GrasshopperInPJs +snyper1243 +Tash_Michael +Llamathelegend +MidgetMe +SOCCERKICK +Link709 +nathan420 +pleasedont +pants12 +Tilon +Tuddywutwut +slatie +Marict +bobless +musp +bigkev169 +AngryRhetoric +MisterYura +guster11 +thommyt +DiannaoChong +Nernums +Dartheh +Nyholtern +ApertureSci +heythomwhatsup +DarthFJ +sfbobz +Tiksi +irishgranader +LichKing112 +tim96 +tim92 +karlos_kumma +lomelith +flyers1980 +Penzane121 +p0megranates +xKRYPTiiCx +TheXshot +mrtibgfdk +techne +alanaki2 +derlandsknecht +Regrub +SgtWesticles +Tee_Bee +3b +eljay808 +George1997 +magnusgerner +MOMA231 +Mariko +haffissx +str3ss +Arkanatos +Ereh_Dogon +Tokida +Crimsonwave +NECHTOVIKING +dakota6565 +unjustend +kanuck +uncountedvermin +Dreamslinger +zach_pwns1 +mini_ninja +Timoteh +Hoppip +GracefulTed +The_WasteLands +TyphoonFour +TheNetherhero +namapus +Clowreisung +Mariel +jyscal +AndyR311 +hoshinokaze +Genshinin +Eddie0715 +erikadair +o7uk +DINOhurp +Sheridan +runnie +Eskiel +starian +Sakisbrat +Symbiote100 +Aramande +kantra +Gundozer +bongis1 +Mwonti +guspa01 +lightjedi5 +Darthim +asian0sensation +Techie +andocmdo +PatrickDyderski +pottan +darthd1 +8U +JetForceGemini1 +tk300 +thomjoo +dragonking17 +leekyboy +spike6599 +Anthony_Stone +TehJammers +LudVichzme +Crunchy_Chicken +Asytra +Hopper +Kantos +Starion +Xaiano +Tim87 +kurtje89 +ansemx13 +tiong +Tony_Perkis +Cephalopod +techk8 +Abbsence +NeonLotus +Slaveg +marfnl +Balisung +Funky_Zebra +xblah1242 +Leprkan +VerbNounGuy +MegaLoser +Delirix +Eladon +tman12354 +clorigu2 +Sputters +UnlabledMilk +Techin +Mark15 +scriptersx +starink +DGmustard +MarioG +Csheroe +nnutnut +TheCloak +shodan1138 +bigz2k +Tikot +TheAndy97 +L4rsThomas +mario1 +mariok +tadtad994 +bsdpunk +BigZ33 +LittleRaptor +Cazif +mwnj +Kjermy +TheKanKin +cousinoer5 +Goddish +Feragon +Adz666 +Radar38 +AK47Xeall +41dasircyril27 +Cazic +RinPinion +skinnyondrums +Nehmulos +User123abc +JockBassman +DragonKing06 +xXcr1sXx +Groblox +bonghit +cy1337 +exzzz +Kantuz +Jemeni +aronz11 +Nepthan +FlygonWing +MechaDolphin +Gamoocha +stark62 +raven10165 +MrBlackswordsman +wanderingman +fzuul +RedneckNinja +Cygggy +Navysealcdr +KenjiNinja +GaMeOvEr_Mac +Dr_Zandi +jiffman +Synthetic_Moose +kittemusen +Asyvan +GamerTheHut +Tim34 +g33kster +memnarch +Cazen +BLASTER504 +Nylhin +ClosetAxelsexual +toxicman44 +MrSalvador +Locaido +slava8 +vangunda +Tricky14 +Nathan051 +8BitAce +swashyson +juxxi +jclong98 +andy8271 +crystaldeluxe +Bongers +mariio +michellevisuano +glendrine +Rockeysa +DrillDazer +slaven +doclobsta +jcirque +Aldurg +underd0g +Blockbyblockx +Lathyrus +bjogje +Harbulblum +Jemeyr +faja2485 +jojo11 +muushu +McTwist +Parilax +BumTheBobo +Jerkakame +hawkeyeff7 +Xsdfa +JoJo07 +mwtb +proffenke +endairo +Kintine +wraytehbeast +onarga88 +Scoodles +Kurunth +Madcat2575 +MothBones +Grindforit +CaptMarion +RjRocket +abbysall19 +nicksandvich +Lil_Richard3 +onigame +DarthG1 +Swiftnsilent +Mini_Zen +hmv007 +my2k +McDeathNugget +Tinus +ag00dnewb +MarioZ +matidios +runjmc +cazjs +Blue1681 +Parilus +asger1002 +AzraelEternity +npack72 +KingGeebs +kmmeerts +samwii1 +tiohn +Bigbyrd39 +damienix +nathan105 +MartianCat +CraimerX +ErikyErik +TheClock +n1njabread +levinet +Dagabond +Supernurd +TNASESRaider +saki2fifty +green731 +Tnextdoor +jojo56 +lolcoptr +Tekneus +Sockrates +CraZyKoKeNo +PillowTalk +darkconsole +aus_smurf +Mwoa +Starman_MD +Dr_Tom +Dooxie +Feralparrot +Ewstar +Bonedust +MrTomnus +Marexx +RoughOutline +Bugler +Wonderwhale +nikeneo +damieng0 +Lolsarfesh +jemen9 +sdsmittie +MarkSoupial +Danthefat2 +TechTF +darkquilan +shnoka +DamienDe +JrFlav +ExiledRen1250 +theevilone +Disciple_of_Bob +lazormaggot +grantcallahan +MnehDroid +xnoobonex +slax01 +MarfXD +sniperwolf329 +ChestStrongwell +Poundcake \ No newline at end of file diff --git a/Minecraft.Client/Common/res/1_2_2/title/mclogo.png b/Minecraft.Client/Common/res/1_2_2/title/mclogo.png new file mode 100644 index 00000000..a69254d2 Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/title/mclogo.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/title/mojang.png b/Minecraft.Client/Common/res/1_2_2/title/mojang.png new file mode 100644 index 00000000..023f0b4f Binary files /dev/null and b/Minecraft.Client/Common/res/1_2_2/title/mojang.png differ diff --git a/Minecraft.Client/Common/res/1_2_2/title/splashes.txt b/Minecraft.Client/Common/res/1_2_2/title/splashes.txt new file mode 100644 index 00000000..567f890d --- /dev/null +++ b/Minecraft.Client/Common/res/1_2_2/title/splashes.txt @@ -0,0 +1,304 @@ +This message will never appear on the splash screen, isn't that weird? +Hobo humping slobo babe! +This text is hard to read if you play the game at the default resolution, but at 1080p it's fine! +As seen on TV! +Awesome! +100% pure! +May contain nuts! +Better than Prey! +More polygons! +Sexy! +Limited edition! +Flashing letters! +Made by Notch! +It's here! +Best in class! +It's finished! +Kind of dragon free! +Excitement! +More than 500 sold! +One of a kind! +Heaps of hits on YouTube! +Indev! +Spiders everywhere! +Check it out! +Holy cow, man! +It's a game! +Made in Sweden! +Uses LWJGL! +Reticulating splines! +Minecraft! +Yaaay! +Singleplayer! +Keyboard compatible! +Undocumented! +Ingots! +Exploding creepers! +That's no moon! +l33t! +Create! +Survive! +Dungeon! +Exclusive! +The bee's knees! +Down with O.P.P.! +Closed source! +Classy! +Wow! +Not on steam! +Oh man! +Awesome community! +Pixels! +Teetsuuuuoooo! +Kaaneeeedaaaa! +Now with difficulty! +Enhanced! +90% bug free! +Pretty! +12 herbs and spices! +Fat free! +Absolutely no memes! +Free dental! +Ask your doctor! +Minors welcome! +Cloud computing! +Legal in Finland! +Hard to label! +Technically good! +Bringing home the bacon! +Indie! +GOTY! +Ceci n'est pas une title screen! +Euclidian! +Now in 3D! +Inspirational! +Herregud! +Complex cellular automata! +Yes, sir! +Played by cowboys! +OpenGL 1.2! +Thousands of colors! +Try it! +Age of Wonders is better! +Try the mushroom stew! +Sensational! +Hot tamale, hot hot tamale! +Play him off, keyboard cat! +Guaranteed! +Macroscopic! +Bring it on! +Random splash! +Call your mother! +Monster infighting! +Loved by millions! +Ultimate edition! +Freaky! +You've got a brand new key! +Water proof! +Uninflammable! +Whoa, dude! +All inclusive! +Tell your friends! +NP is not in P! +Notch <3 ez! +Music by C418! +Livestreamed! +Haunted! +Polynomial! +Terrestrial! +All is full of love! +Full of stars! +Scientific! +Cooler than Spock! +Collaborate and listen! +Never dig down! +Take frequent breaks! +Not linear! +Han shot first! +Nice to meet you! +Buckets of lava! +Ride the pig! +Larger than Earth! +sqrt(-1) love you! +Phobos anomaly! +Punching wood! +Falling off cliffs! +0% sugar! +150% hyperbole! +Synecdoche! +Let's danec! +Seecret Friday update! +Reference implementation! +Lewd with two dudes with food! +Kiss the sky! +20 GOTO 10! +Verlet intregration! +Peter Griffin! +Do not distribute! +Cogito ergo sum! +4815162342 lines of code! +A skeleton popped out! +The Work of Notch! +The sum of its parts! +BTAF used to be good! +I miss ADOM! +umop-apisdn! +OICU812! +Bring me Ray Cokes! +Finger-licking! +Thematic! +Pneumatic! +Sublime! +Octagonal! +Une baguette! +Gargamel plays it! +Rita is the new top dog! +SWM forever! +Representing Edsbyn! +Matt Damon! +Supercalifragilisticexpialidocious! +Consummate V's! +Cow Tools! +Double buffered! +Fan fiction! +Flaxkikare! +Jason! Jason! Jason! +Hotter than the sun! +Internet enabled! +Autonomous! +Engage! +Fantasy! +DRR! DRR! DRR! +Kick it root down! +Regional resources! +Woo, facepunch! +Woo, somethingawful! +Woo, /v/! +Woo, tigsource! +Woo, minecraftforum! +Woo, worldofminecraft! +Woo, reddit! +Woo, 2pp! +Google anlyticsed! +Now supports åäö! +Give us Gordon! +Tip your waiter! +Very fun! +12345 is a bad password! +Vote for net neutrality! +Lives in a pineapple under the sea! +MAP11 has two names! +Omnipotent! +Gasp! +...! +Bees, bees, bees, bees! +Jag känner en bot! +Haha, LOL! +Hampsterdance! +Switches and ores! +Menger sponge! +idspispopd! +Eple (original edit)! +So fresh, so clean! +Slow acting portals! +Try the Nether! +Don't look directly at the bugs! +Oh, ok, Pigmen! +Finally with ladders! +Scary! +Play Minecraft, Watch Topgear, Get Pig! +Twittered about! +Jump up, jump up, and get down! +Joel is neat! +A riddle, wrapped in a mystery! +Huge tracts of land! +Welcome to your Doom! +Stay a while, stay forever! +Stay a while and listen! +Treatment for your rash! +"Autological" is! +Information wants to be free! +"Almost never" is an interesting concept! +Lots of truthiness! +The creeper is a spy! +Turing complete! +It's groundbreaking! +Let our battle's begin! +The sky is the limit! +Jeb has amazing hair! +Casual gaming! +Undefeated! +Kinda like Lemmings! +Follow the train, CJ! +Leveraging synergy! +DungeonQuest is unfair! +110813! +90210! +Check out the far lands! +Tyrion would love it! +Also try VVVVVV! +Also try Super Meat Boy! +Also try Terraria! +Also try Mount And Blade! +Also try Project Zomboid! +Also try World of Goo! +Also try Limbo! +Also try Pixeljunk Shooter! +Also try Braid! +That's super! +Bread is pain! +Read more books! +Khaaaaaaaaan! +Less addictive than TV Tropes! +More addictive than lemonade! +Bigger than a bread box! +Millions of peaches! +Fnord! +This is my true form! +Totally forgot about Dre! +Don't bother with the clones! +Pumpkinhead! +Made by Jeb! +Has an ending! +Finally complete! +Feature packed! +Boots with the fur! +Stop, hammertime! +Testificates! +Conventional! +Homeomorphic to a 3-sphere! +Doesn't avoid double negatives! +Place ALL the blocks! +Does barrel rolls! +Meeting expectations! +PC gaming since 1873! +Ghoughpteighbteau tchoghs! +Déjà vu! +Déjà vu! +Got your nose! +Haley loves Elan! +Afraid of the big, black bat! +Doesn't use the U-word! +Child's play! +See you next Friday or so! +From the streets of Södermalm! +150 bpm for 400000 minutes! +Technologic! +Funk soul brother! +Pumpa kungen! +日本ãƒãƒ­ãƒ¼ï¼ +한국 안녕하세요! +Helo Cymru! +Cześć Polska! +ä½ å¥½ä¸­å›½ï¼ +Привет РоÑÑиÑ! +Γεια σου Ελλάδα! +My life for Aiur! +Lennart lennart = new Lennart(); +I see your vocabulary has improved! +Who put it there? +You can't explain that! +if not ok then return end +§1C§2o§3l§4o§5r§6m§7a§8t§9i§ac +§kFUNKY LOL +SOPA means LOSER in Swedish diff --git a/Minecraft.Client/Common/res/1_2_2/title/win.txt b/Minecraft.Client/Common/res/1_2_2/title/win.txt new file mode 100644 index 00000000..72775248 --- /dev/null +++ b/Minecraft.Client/Common/res/1_2_2/title/win.txt @@ -0,0 +1,151 @@ +§3I see the player you mean. + +§2PLAYERNAME? + +§3Yes. Take care. It has reached a higher level now. It can read our thoughts. + +§2That doesn't matter. It thinks we are part of the game. + +§3I like this player. It played well. It did not give up. + +§2It is reading our thoughts as though they were words on a screen. + +§3That is how it chooses to imagine many things, when it is deep in the dream of a game. + +§2Words make a wonderful interface. Very flexible. And less terrifying than staring at the reality behind the screen. + +§3They used to hear voices. Before players could read. Back in the days when those who did not play called the players witches, and warlocks. And players dreamed they flew through the air, on sticks powered by demons. + +§2What did this player dream? + +§3This player dreamed of sunlight and trees. Of fire and water. It dreamed it created. And it dreamed it destroyed. It dreamed it hunted, and was hunted. It dreamed of shelter. + +§2Hah, the original interface. A million years old, and it still works. But what true structure did this player create, in the reality behind the screen? + +§3It worked, with a million others, to sculpt a true world in a fold of the §f§k§a§b§3, and created a §f§k§a§b§3 for §f§k§a§b§3, in the §f§k§a§b§3. + +§2It cannot read that thought. + +§3No. It has not yet achieved the highest level. That, it must achieve in the long dream of life, not the short dream of a game. + +§2Does it know that we love it? That the universe is kind? + +§3Sometimes, through the noise of its thoughts, it hears the universe, yes. + +§2But there are times it is sad, in the long dream. It creates worlds that have no summer, and it shivers under a black sun, and it takes its sad creation for reality. + +§3To cure it of sorrow would destroy it. The sorrow is part of its own private task. We cannot interfere. + +§2Sometimes when they are deep in dreams, I want to tell them, they are building true worlds in reality. Sometimes I want to tell them of their importance to the universe. Sometimes, when they have not made a true connection in a while, I want to help them to speak the word they fear. + +§3It reads our thoughts. + +§2Sometimes I do not care. Sometimes I wish to tell them, this world you take for truth is merely §f§k§a§b§2 and §f§k§a§b§2, I wish to tell them that they are §f§k§a§b§2 in the §f§k§a§b§2. They see so little of reality, in their long dream. + +§3And yet they play the game. + +§2But it would be so easy to tell them... + +§3Too strong for this dream. To tell them how to live is to prevent them living. + +§2I will not tell the player how to live. + +§3The player is growing restless. + +§2I will tell the player a story. + +§3But not the truth. + +§2No. A story that contains the truth safely, in a cage of words. Not the naked truth that can burn over any distance. + +§3Give it a body, again. + +§2Yes. Player... + +§3Use its name. + +§2PLAYERNAME. Player of games. + +§3Good. + +§2Take a breath, now. Take another. Feel air in your lungs. Let your limbs return. Yes, move your fingers. Have a body again, under gravity, in air. Respawn in the long dream. There you are. Your body touching the universe again at every point, as though you were separate things. As though we were separate things. + +§3Who are we? Once we were called the spirit of the mountain. Father sun, mother moon. Ancestral spirits, animal spirits. Jinn. Ghosts. The green man. Then gods, demons. Angels. Poltergeists. Aliens, extraterrestrials. Leptons, quarks. The words change. We do not change. + +§2We are the universe. We are everything you think isn't you. You are looking at us now, through your skin and your eyes. And why does the universe touch your skin, and throw light on you? To see you, player. To know you. And to be known. I shall tell you a story. + +§2Once upon a time, there was a player. + +§3The player was you, PLAYERNAME. + +§2Sometimes it thought itself human, on the thin crust of a spinning globe of molten rock. The ball of molten rock circled a ball of blazing gas that was three hundred and thirty thousand times more massive than it. They were so far apart that light took eight minutes to cross the gap. The light was information from a star, and it could burn your skin from a hundred and fifty million kilometres away. + +§2Sometimes the player dreamed it was a miner, on the surface of a world that was flat, and infinite. The sun was a square of white. The days were short; there was much to do; and death was a temporary inconvenience. + +§3Sometimes the player dreamed it was lost in a story. + +§2Sometimes the player dreamed it was other things, in other places. Sometimes these dreams were disturbing. Sometimes very beautiful indeed. Sometimes the player woke from one dream into another, then woke from that into a third. + +§3Sometimes the player dreamed it watched words on a screen. + +§2Let's go back. + +§2The atoms of the player were scattered in the grass, in the rivers, in the air, in the ground. A woman gathered the atoms; she drank and ate and inhaled; and the woman assembled the player, in her body. + +§2And the player awoke, from the warm, dark world of its mother's body, into the long dream. + +§2And the player was a new story, never told before, written in letters of DNA. And the player was a new program, never run before, generated by a sourcecode a billion years old. And the player was a new human, never alive before, made from nothing but milk and love. + +§3You are the player. The story. The program. The human. Made from nothing but milk and love. + +§2Let's go further back. + +§2The seven billion billion billion atoms of the player's body were created, long before this game, in the heart of a star. So the player, too, is information from a star. And the player moves through a story, which is a forest of information planted by a man called Julian, on a flat, infinite world created by a man called Markus, that exists inside a small, private world created by the player, who inhabits a universe created by... + +§3Shush. Sometimes the player created a small, private world that was soft and warm and simple. Sometimes hard, and cold, and complicated. Sometimes it built a model of the universe in its head; flecks of energy, moving through vast empty spaces. Sometimes it called those flecks "electrons" and "protons". + +§2Sometimes it called them "planets" and "stars". + +§2Sometimes it believed it was in a universe that was made of energy that was made of offs and ons; zeros and ones; lines of code. Sometimes it believed it was playing a game. Sometimes it believed it was reading words on a screen. + +§3You are the player, reading words... + +§2Shush... Sometimes the player read lines of code on a screen. Decoded them into words; decoded words into meaning; decoded meaning into feelings, emotions, theories, ideas, and the player started to breathe faster and deeper and realised it was alive, it was alive, those thousand deaths had not been real, the player was alive + +§3You. You. You are alive. + +§2and sometimes the player believed the universe had spoken to it through the sunlight that came through the shuffling leaves of the summer trees + +§3and sometimes the player believed the universe had spoken to it through the light that fell from the crisp night sky of winter, where a fleck of light in the corner of the player's eye might be a star a million times as massive as the sun, boiling its planets to plasma in order to be visible for a moment to the player, walking home at the far side of the universe, suddenly smelling food, almost at the familiar door, about to dream again + +§2and sometimes the player believed the universe had spoken to it through the zeros and ones, through the electricity of the world, through the scrolling words on a screen at the end of a dream + +§3and the universe said I love you + +§2and the universe said you have played the game well + +§3and the universe said everything you need is within you + +§2and the universe said you are stronger than you know + +§3and the universe said you are the daylight + +§2and the universe said you are the night + +§3and the universe said the darkness you fight is within you + +§2and the universe said the light you seek is within you + +§3and the universe said you are not alone + +§2and the universe said you are not separate from every other thing + +§3and the universe said you are the universe tasting itself, talking to itself, reading its own code + +§2and the universe said I love you because you are love. + +§3And the game was over and the player woke up from the dream. And the player began a new dream. And the player dreamed again, dreamed better. And the player was the universe. And the player was love. + +§3You are the player. + +§2Wake up. diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Candy/Data/TexturePack.xzp b/Minecraft.Client/Common/res/TitleUpdate/DLC/Candy/Data/TexturePack.xzp new file mode 100644 index 00000000..f2e865fc Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Candy/Data/TexturePack.xzp differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Candy/Data/x16Data.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/Candy/Data/x16Data.pck new file mode 100644 index 00000000..50d5d4ee Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Candy/Data/x16Data.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/City/Data/TexturePack.xzp b/Minecraft.Client/Common/res/TitleUpdate/DLC/City/Data/TexturePack.xzp new file mode 100644 index 00000000..b2d02efd Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/City/Data/TexturePack.xzp differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/City/Data/x32Data.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/City/Data/x32Data.pck new file mode 100644 index 00000000..4968ba01 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/City/Data/x32Data.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Fantasy/Data/TexturePack.xzp b/Minecraft.Client/Common/res/TitleUpdate/DLC/Fantasy/Data/TexturePack.xzp new file mode 100644 index 00000000..87fc9d91 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Fantasy/Data/TexturePack.xzp differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Fantasy/Data/x32Data.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/Fantasy/Data/x32Data.pck new file mode 100644 index 00000000..9d909b93 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Fantasy/Data/x32Data.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Halloween/Data/TexturePack.xzp b/Minecraft.Client/Common/res/TitleUpdate/DLC/Halloween/Data/TexturePack.xzp new file mode 100644 index 00000000..ce7ea034 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Halloween/Data/TexturePack.xzp differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Halloween/Data/x16Data.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/Halloween/Data/x16Data.pck new file mode 100644 index 00000000..9da2ef1b Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Halloween/Data/x16Data.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/Data/GameRules.grf b/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/Data/GameRules.grf new file mode 100644 index 00000000..05fb95d1 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/Data/GameRules.grf differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/Data/TexturePack.xzp b/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/Data/TexturePack.xzp new file mode 100644 index 00000000..73339be4 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/Data/TexturePack.xzp differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/Data/x16Data.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/Data/x16Data.pck new file mode 100644 index 00000000..63d88194 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/Data/x16Data.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/TexturePack.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/TexturePack.pck new file mode 100644 index 00000000..fddfbb38 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Halo/TexturePack.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/GameRules.grf b/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/GameRules.grf new file mode 100644 index 00000000..48816b27 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/GameRules.grf differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/TexturePack.xzp b/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/TexturePack.xzp new file mode 100644 index 00000000..5b2df78a Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/TexturePack.xzp differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/masseffect.mcs b/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/masseffect.mcs new file mode 100644 index 00000000..c3e1cb8d Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/masseffect.mcs differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/x16Data.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/x16Data.pck new file mode 100644 index 00000000..2c01acae Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/Data/x16Data.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/TexturePack.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/TexturePack.pck new file mode 100644 index 00000000..e0576ed8 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/MassEffect/TexturePack.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Natural/Data/TexturePack.xzp b/Minecraft.Client/Common/res/TitleUpdate/DLC/Natural/Data/TexturePack.xzp new file mode 100644 index 00000000..34f7dc99 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Natural/Data/TexturePack.xzp differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Natural/Data/x32Data.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/Natural/Data/x32Data.pck new file mode 100644 index 00000000..4224184c Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Natural/Data/x32Data.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Plastic/Data/TexturePack.xzp b/Minecraft.Client/Common/res/TitleUpdate/DLC/Plastic/Data/TexturePack.xzp new file mode 100644 index 00000000..033840eb Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Plastic/Data/TexturePack.xzp differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Plastic/Data/x16Data.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/Plastic/Data/x16Data.pck new file mode 100644 index 00000000..b5b5c14a Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Plastic/Data/x16Data.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/Data/GameRules.grf b/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/Data/GameRules.grf new file mode 100644 index 00000000..d52e6b03 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/Data/GameRules.grf differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/Data/TexturePack.xzp b/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/Data/TexturePack.xzp new file mode 100644 index 00000000..45c24d41 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/Data/TexturePack.xzp differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/Data/x16Data.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/Data/x16Data.pck new file mode 100644 index 00000000..82a5965d Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/Data/x16Data.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/TexturePack.pck b/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/TexturePack.pck new file mode 100644 index 00000000..2dc382a1 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/DLC/Skyrim/TexturePack.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildAll.cmd b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildAll.cmd new file mode 100644 index 00000000..06175558 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildAll.cmd @@ -0,0 +1,10 @@ +@ECHO OFF + +call .\BuildGameRule.cmd Tutorial +call .\BuildGameRule_PS3.cmd Tutorial +call .\BuildGameRule_Windows64.cmd Tutorial +call .\BuildGameRule_Durango.cmd Tutorial +call .\BuildGameRule_Orbis.cmd Tutorial +call .\BuildGameRule_PSVita.cmd Tutorial + +pause diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule.cmd b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule.cmd new file mode 100644 index 00000000..4594adf2 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule.cmd @@ -0,0 +1,19 @@ +ECHO OFF + +set RULENAME=%1 +cd %RULENAME% +rem set TOOLS=..\..\..\..\..\..\Tools + +ECHO "Building Localisation" +%TOOLS%\NewLocalisationPacker.exe --oldFormat Microsoft %CD%\Strings_Xbox360 %CD%\languages.loc + +ECHO "Building Game Rules" +%TOOLS%\GameRulesPacker -i %CD%\GameRules.xml -o %CD%\ -c lzxrle + +ECHO "Building DLC Pack" +%TOOLS%\DLC_DataCreator2_CL %CD%\%RULENAME%.xml + +rem Return the new tutorial. +copy %RULENAME%.pck ..\..\%RULENAME%.pck + +cd .. \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule_Durango.cmd b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule_Durango.cmd new file mode 100644 index 00000000..bebbbd8e --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule_Durango.cmd @@ -0,0 +1,28 @@ +@ECHO OFF + +set RULENAME=%1 +cd %RULENAME% + +rem set TOOLS=..\..\..\..\..\..\Tools + +echo Durango + +echo Building Localisation... +%TOOLS%\NewLocalisationPacker --oldFormat Microsoft %CD%\Strings_Durango %CD%\languages.loc + +echo Building Game Rules... +%TOOLS%\GameRulesPacker -i %CD%\GameRules.xml -o %CD%\ -c zlibrle + +echo Building DLC Pack... +%TOOLS%\DLC_DataCreator2_CL --LittleEndian %CD%\%RULENAME%.xml + +rem Return the new tutorial. +copy %RULENAME%.pck ..\..\%RULENAME%_Durango.pck + +echo Cleaning-up... +rem del %CD%\languages.loc +rem del %CD%\GameRules.grf +rem del %CD%\%RULENAME%.pck + +echo Finished. +cd .. \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule_Orbis.cmd b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule_Orbis.cmd new file mode 100644 index 00000000..3f2411a2 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule_Orbis.cmd @@ -0,0 +1,28 @@ +@ECHO OFF + +set RULENAME=%1 +cd %RULENAME% + +rem set TOOLS=..\..\..\..\..\..\Tools + +echo Orbis + +echo Building Localisation... +%TOOLS%\NewLocalisationPacker --oldFormat Sony %CD%\Strings_Orbis %CD%\languages.loc + +echo Building Game Rules... +%TOOLS%\GameRulesPacker -i %CD%\GameRules.xml -o %CD%\ -c zlibrle + +echo Building DLC Pack... +%TOOLS%\DLC_DataCreator2_CL --LittleEndian %CD%\%RULENAME%.xml + +rem Return the new tutorial. +copy %RULENAME%.pck ..\..\%RULENAME%_Orbis.pck + +echo Cleaning-up... +rem del %CD%\languages.loc +rem del %CD%\GameRules.grf +rem del %CD%\%RULENAME%.pck + +echo Finished. +cd .. \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule_PS3.cmd b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule_PS3.cmd new file mode 100644 index 00000000..9cdfd387 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule_PS3.cmd @@ -0,0 +1,28 @@ +@ECHO OFF + +set RULENAME=%1 +cd %RULENAME% + +rem set TOOLS=..\..\..\..\..\..\Tools + +echo Play Station 3 + +echo Building Localisation... +%TOOLS%\NewLocalisationPacker --oldFormat Sony %CD%\Strings_PS3 %CD%\languages.loc + +echo Building Game Rules... +%TOOLS%\GameRulesPacker -i %CD%\GameRules.xml -o %CD%\ -c edgezlibrle + +echo Building DLC Pack... +%TOOLS%\DLC_DataCreator2_CL %CD%\%RULENAME%.xml + +rem Return the new tutorial. +copy %RULENAME%.pck ..\..\%RULENAME%_PS3.pck + +echo Cleaning-up... +rem del %CD%\languages.loc +rem del %CD%\GameRules.grf +rem del %CD%\%RULENAME%.pck + +echo Finished. +cd .. \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule_PSVita.cmd b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule_PSVita.cmd new file mode 100644 index 00000000..7891eb20 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule_PSVita.cmd @@ -0,0 +1,28 @@ +@ECHO OFF + +set RULENAME=%1 +cd %RULENAME% + +rem set TOOLS=..\..\..\..\..\..\Tools + +echo PSVita + +echo Building Localisation... +%TOOLS%\NewLocalisationPacker --oldFormat Sony %CD%\Strings_PSVita %CD%\languages.loc + +echo Building Game Rules... +%TOOLS%\GameRulesPacker -i %CD%\GameRules.xml -o %CD%\ -c zlibrle + +echo Building DLC Pack... +%TOOLS%\DLC_DataCreator2_CL --LittleEndian %CD%\%RULENAME%.xml + +rem Return the new tutorial. +copy %RULENAME%.pck ..\..\%RULENAME%_PSVita.pck + +echo Cleaning-up... +rem del %CD%\languages.loc +rem del %CD%\GameRules.grf +rem del %CD%\%RULENAME%.pck + +echo Finished. +cd .. \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule_Windows64.cmd b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule_Windows64.cmd new file mode 100644 index 00000000..8e9b730b --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule_Windows64.cmd @@ -0,0 +1,28 @@ +@ECHO OFF + +set RULENAME=%1 +cd %RULENAME% + +rem set TOOLS=..\..\..\..\..\..\Tools + +echo Windows 64 + +echo Building Localisation... +%TOOLS%\NewLocalisationPacker --oldFormat Microsoft %CD%\Strings_Win64 %CD%\languages.loc + +echo Building Game Rules... +%TOOLS%\GameRulesPacker -i %CD%\GameRules.xml -o %CD%\ -c zlibrle + +echo Building DLC Pack... +%TOOLS%\DLC_DataCreator2_CL --LittleEndian %CD%\%RULENAME%.xml + +rem Return the new tutorial. +copy %RULENAME%.pck ..\..\%RULENAME%_Windows64.pck + +echo Cleaning-up... +rem del %CD%\languages.loc +rem del %CD%\GameRules.grf +rem del %CD%\%RULENAME%.pck + +echo Finished. +cd .. \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule_Xbox.cmd b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule_Xbox.cmd new file mode 100644 index 00000000..fde98245 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/BuildGameRule_Xbox.cmd @@ -0,0 +1,28 @@ +@ECHO OFF + +set RULENAME=%1 +cd %RULENAME% + +rem set TOOLS=..\..\..\..\..\..\Tools + +echo Xbox 360 + +echo Building Localisation... +%TOOLS%\NewLocalisationPacker.exe --oldFormat Microsoft %CD%\Strings_Xbox360 %CD%\languages.loc + +echo Building Game Rules... +%TOOLS%\GameRulesPacker -i %CD%\GameRules.xml -o %CD%\ -c lzxrle + +echo Building DLC Pack... +%TOOLS%\DLC_DataCreator2_CL %CD%\%RULENAME%.xml + +rem Return the new tutorial. +copy %RULENAME%.pck ..\..\%RULENAME%_Xbox.pck + +echo Cleaning-up... +rem del %CD%\languages.loc +rem del %CD%\GameRules.grf +rem del %CD%\%RULENAME%.pck + +echo Finished. +cd .. \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.sln b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.sln new file mode 100644 index 00000000..31c1bd39 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.sln @@ -0,0 +1,30 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GameRules", "GameRules.vcxproj", "{0DD2FD59-36AC-476F-9201-D687A4CE9E98}" +EndProject +Global + GlobalSection(TeamFoundationVersionControl) = preSolution + SccNumberOfProjects = 2 + SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C} + SccTeamFoundationServer = http://tfs_server:8080/tfs/storiespark + SccProjectUniqueName0 = GameRules.vcxproj + SccLocalPath0 = . + SccLocalPath1 = . + EndGlobalSection + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Xbox 360 = Debug|Xbox 360 + Release|Xbox 360 = Release|Xbox 360 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0DD2FD59-36AC-476F-9201-D687A4CE9E98}.Debug|Xbox 360.ActiveCfg = Debug|Xbox 360 + {0DD2FD59-36AC-476F-9201-D687A4CE9E98}.Debug|Xbox 360.Build.0 = Debug|Xbox 360 + {0DD2FD59-36AC-476F-9201-D687A4CE9E98}.Debug|Xbox 360.Deploy.0 = Debug|Xbox 360 + {0DD2FD59-36AC-476F-9201-D687A4CE9E98}.Release|Xbox 360.ActiveCfg = Release|Xbox 360 + {0DD2FD59-36AC-476F-9201-D687A4CE9E98}.Release|Xbox 360.Build.0 = Release|Xbox 360 + {0DD2FD59-36AC-476F-9201-D687A4CE9E98}.Release|Xbox 360.Deploy.0 = Release|Xbox 360 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj new file mode 100644 index 00000000..0bcb4e30 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj @@ -0,0 +1,103 @@ + + + + + Debug + Xbox 360 + + + Release + Xbox 360 + + + + {0DD2FD59-36AC-476F-9201-D687A4CE9E98} + MakeFileProj + SAK + SAK + SAK + SAK + + + + Makefile + + + Makefile + + + + + + + + + + + + + + + _DEBUG;$(NMakePreprocessorDefinitions) + BuildGameRule.cmd Tutorial + + + GameRules.xex + NDEBUG;$(NMakePreprocessorDefinitions) + + + + + + + + CopyToHardDrive + + + + + + Designer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + + + + + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj.filters b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj.filters new file mode 100644 index 00000000..9c46ad82 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj.filters @@ -0,0 +1,114 @@ + + + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {ab02d5da-7fb3-494b-a636-03764d9a8acd} + + + {e1a87048-bca2-46e6-a234-91d7d64eb983} + + + {da425f4a-cf76-48e8-87cb-d9fda0f42365} + + + {c0ba5f53-4881-495e-8158-5d87f379426d} + + + {61651432-41a1-42f0-a853-c7795d813418} + + + {e194e42b-1c9b-4e35-9a4b-dabd68eab3e0} + + + + + Tutorial + + + Tutorial\Loc + + + Tutorial\Loc\Microsoft + + + Tutorial\Loc\Microsoft + + + Tutorial\Loc\Microsoft + + + Tutorial\Loc\Microsoft + + + Tutorial\Loc\Microsoft + + + Tutorial\Loc\Microsoft + + + Tutorial\Loc\Microsoft + + + Tutorial\Loc\Microsoft + + + Tutorial\Loc\Microsoft + + + Packs + + + Tutorial\schematics + + + Tutorial\schematics + + + Tutorial\schematics + + + Tutorial\schematics + + + Tutorial\schematics + + + Tutorial\schematics + + + Tutorial\schematics + + + Tutorial\schematics + + + Tutorial\schematics + + + Tutorial\schematics + + + Tutorial\schematics + + + Tutorial\schematics + + + + + + + + + + + + + Shared + + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj.vspscc b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj.vspscc new file mode 100644 index 00000000..b6d32892 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRules.vcxproj.vspscc @@ -0,0 +1,10 @@ +"" +{ +"FILE_VERSION" = "9237" +"ENLISTMENT_CHOICE" = "NEVER" +"PROJECT_FILE_RELATIVE_PATH" = "" +"NUMBER_OF_EXCLUDED_FILES" = "0" +"ORIGINAL_PROJECT_FILE_PATH" = "" +"NUMBER_OF_NESTED_PROJECTS" = "0" +"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" +} diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRulesDefinition.xsd b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRulesDefinition.xsd new file mode 100644 index 00000000..a41f6865 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/GameRulesDefinition.xsd @@ -0,0 +1,2848 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Count children + + + + + Accumulate childrens goals + + + + + + + + + + Crafting Table + + + + + Chest + + + + + Furnace + + + + + Dispenser + + + + + + + + + + Mineshaft + + + + + Nether Bridge + + + + + Temples + + + + + Stronghold + + + + + Village + + + + + + + + + + SOUTH + + + + + WEST + + + + + NORTH + + + + + EAST + + + + + + + + + + NORTH + + + + + SOUTH + + + + + WEST + + + + + EAST + + + + + + + + + + Overworld + + + + + Nether + + + + + The End + + + + + + + + + + Protection + + + + + Fire Protection + + + + + Feather Falling + + + + + Blast Protection + + + + + Projectile Protection + + + + + Respiration + + + + + Aqua Affinity + + + + + Thorns + + + + + Sharpness + + + + + Smite + + + + + Bane of Arthropods + + + + + Knockback + + + + + Fire Aspect + + + + + Looting + + + + + Efficiency + + + + + Silk Touch + + + + + Unbreaking + + + + + Fortune + + + + + Power + + + + + Punch + + + + + Flame + + + + + Infinity + + + + + + + + + + Air + + + + + Stone + + + + + Grass Block + + + + + Dirt + + + + + Cobblestone + + + + + Wooden Planks + + + + + Sapling + + + + + Bedrock + + + + + Water + + + + + Water + + + + + Lava + + + + + Lava + + + + + Sand + + + + + Gravel + + + + + Gold Ore + + + + + Iron Ore + + + + + Coal Ore + + + + + Wood + + + + + Leaves + + + + + Sponge + + + + + Glass + + + + + Lapis Lazuli Ore + + + + + Lapis Lazuli Block + + + + + Dispenser + + + + + Sandstone + + + + + Note Block + + + + + Bed + + + + + Powered Rail + + + + + Detector Rail + + + + + Sticky Piston + + + + + Web + + + + + Shrub + + + + + Dead Bush + + + + + Piston + + + + + Piston + + + + + Wool + + + + + Piston + + + + + Flower + + + + + Rose + + + + + Mushroom + + + + + Mushroom + + + + + Block of Gold + + + + + Block of Iron + + + + + Stone Slab + + + + + Stone Slab + + + + + Bricks + + + + + TNT + + + + + Bookshelf + + + + + Moss Stone + + + + + Obsidian + + + + + Torch + + + + + Fire + + + + + Monster Spawner + + + + + Wooden Stairs + + + + + Chest + + + + + Redstone Dust + + + + + Diamond Ore + + + + + Block of Diamond + + + + + Crafting Table + + + + + Crops + + + + + Farmland + + + + + Furnace + + + + + Furnace + + + + + Sign + + + + + Wooden Door + + + + + Ladder + + + + + Rail + + + + + Stone Stairs + + + + + Sign + + + + + Lever + + + + + Pressure Plate + + + + + Iron Door + + + + + Pressure Plate + + + + + Redstone Ore + + + + + Redstone Ore + + + + + Redstone Torch + + + + + Redstone Torch + + + + + Button + + + + + Snow + + + + + Ice + + + + + Snow + + + + + Cactus + + + + + Clay + + + + + Sugar Cane + + + + + Jukebox + + + + + Fence + + + + + Pumpkin + + + + + Netherrack + + + + + Soul Sand + + + + + Glowstone + + + + + Portal + + + + + Jack-O-Lantern + + + + + Cake + + + + + Redstone Repeater + + + + + Redstone Repeater + + + + + Locked Chest + + + + + Trapdoor + + + + + Silverfish Stone + + + + + Stone Bricks + + + + + Mushroom + + + + + Mushroom + + + + + Iron Bars + + + + + Glass Pane + + + + + Melon + + + + + Pumpkin Stem + + + + + Melon Stem + + + + + Vines + + + + + Fence Gate + + + + + Brick Stairs + + + + + Stone Brick Stairs + + + + + Mycelium + + + + + Lily Pad + + + + + Nether Brick + + + + + Nether Brick Fence + + + + + Nether Brick Stairs + + + + + Nether Wart + + + + + Enchantment Table + + + + + Brewing Stand + + + + + Cauldron + + + + + End Portal + + + + + End Portal Frame + + + + + End Stone + + + + + Dragon Egg + + + + + Redstone Lamp + + + + + Redstone Lamp + + + + + Oak Wood Slab + + + + + Oak Wood Slab + + + + + Cocoa + + + + + Sandstone Stairs + + + + + Emerald Ore + + + + + Ender Chest + + + + + Tripwire Hook + + + + + Tripwire + + + + + Block of Emerald + + + + + Spruce Wood Stairs + + + + + Birch Wood Stairs + + + + + Jungle Wood Stairs + + + + + Cobblestone Wall + + + + + Flower Pot + + + + + Carrots + + + + + Potatoes + + + + + Button + + + + + Skull + + + + + Anvil + + + + + Nether Quartz Ore + + + + + Block of Quartz + + + + + Quartz Stairs + + + + + Carpet + + + + + + + + + + Stone + + + + + Grass Block + + + + + Dirt + + + + + Cobblestone + + + + + Wooden Planks + + + + + Sapling + + + + + Bedrock + + + + + Water + + + + + Water + + + + + Lava + + + + + Lava + + + + + Sand + + + + + Gravel + + + + + Gold Ore + + + + + Iron Ore + + + + + Coal Ore + + + + + Wood + + + + + Leaves + + + + + Sponge + + + + + Glass + + + + + Lapis Lazuli Ore + + + + + Lapis Lazuli Block + + + + + Dispenser + + + + + Sandstone + + + + + Note Block + + + + + Bed + + + + + Powered Rail + + + + + Detector Rail + + + + + Sticky Piston + + + + + Web + + + + + Tall Grass + + + + + Dead Bush + + + + + Piston + + + + + Piston + + + + + Wool + + + + + Piston + + + + + Flower + + + + + Rose + + + + + Mushroom + + + + + Mushroom + + + + + Block of Gold + + + + + Block of Iron + + + + + Stone Slab + + + + + Stone Slab + + + + + Bricks + + + + + TNT + + + + + Bookshelf + + + + + Moss Stone + + + + + Obsidian + + + + + Torch + + + + + Fire + + + + + Monster Spawner + + + + + Wooden Stairs + + + + + Chest + + + + + Redstone Dust + + + + + Diamond Ore + + + + + Block of Diamond + + + + + Crafting Table + + + + + Crops + + + + + Farmland + + + + + Furnace + + + + + Furnace + + + + + Sign + + + + + Wooden Door + + + + + Ladder + + + + + Rail + + + + + Stone Stairs + + + + + Sign + + + + + Lever + + + + + Pressure Plate + + + + + Iron Door + + + + + Pressure Plate + + + + + Redstone Ore + + + + + Redstone Ore + + + + + Redstone Torch + + + + + Redstone Torch + + + + + Button + + + + + Snow + + + + + Ice + + + + + Snow + + + + + Cactus + + + + + Clay + + + + + Sugar Cane + + + + + Jukebox + + + + + Fence + + + + + Pumpkin + + + + + Netherrack + + + + + Soul Sand + + + + + Glowstone + + + + + Portal + + + + + Jack-O-Lantern + + + + + Cake + + + + + Redstone Repeater + + + + + Redstone Repeater + + + + + Locked Chest + + + + + Trapdoor + + + + + Silverfish Stone + + + + + Stone Bricks + + + + + Mushroom + + + + + Mushroom + + + + + Iron Bars + + + + + Glass Pane + + + + + Melon + + + + + Pumpkin Stem + + + + + Melon Stem + + + + + Vines + + + + + Fence Gate + + + + + Brick Stairs + + + + + Stone Brick Stairs + + + + + Mycelium + + + + + Lily Pad + + + + + Nether Brick + + + + + Nether Brick Fence + + + + + Nether Brick Stairs + + + + + Nether Wart + + + + + Enchantment Table + + + + + Brewing Stand + + + + + Cauldron + + + + + End Portal + + + + + End Portal Frame + + + + + End Stone + + + + + Dragon Egg + + + + + Redstone Lamp + + + + + Redstone Lamp + + + + + Oak Wood Slab + + + + + Oak Wood Slab + + + + + Cocoa + + + + + Sandstone Stairs + + + + + Emerald Ore + + + + + Ender Chest + + + + + Tripwire Hook + + + + + Tripwire + + + + + Block of Emerald + + + + + Spruce Wood Stairs + + + + + Birch Wood Stairs + + + + + Jungle Wood Stairs + + + + + Cobblestone Wall + + + + + Flower Pot + + + + + Carrots + + + + + Potatoes + + + + + Button + + + + + Skull + + + + + Anvil + + + + + Nether Quartz Ore + + + + + Block of Quartz + + + + + Quartz Stairs + + + + + Carpet + + + + + Iron Shovel + + + + + Iron Pickaxe + + + + + Iron Axe + + + + + Flint and Steel + + + + + Apple + + + + + Bow + + + + + Arrow + + + + + Coal + + + + + Diamond + + + + + Iron Ingot + + + + + Gold Ingot + + + + + Iron Sword + + + + + Wooden Sword + + + + + Wooden Shovel + + + + + Wooden Pickaxe + + + + + Wooden Axe + + + + + Stone Sword + + + + + Stone Shovel + + + + + Stone Pickaxe + + + + + Stone Axe + + + + + Diamond Sword + + + + + Diamond Shovel + + + + + Diamond Pickaxe + + + + + Diamond Axe + + + + + Stick + + + + + Bowl + + + + + Mushroom Stew + + + + + Golden Sword + + + + + Golden Shovel + + + + + Golden Pickaxe + + + + + Golden Axe + + + + + String + + + + + Feather + + + + + Gunpowder + + + + + Wooden Hoe + + + + + Stone Hoe + + + + + Iron Hoe + + + + + Diamond Hoe + + + + + Golden Hoe + + + + + Seeds + + + + + Wheat + + + + + Bread + + + + + Leather Cap + + + + + Leather Tunic + + + + + Leather Pants + + + + + Leather Boots + + + + + Chain Helmet + + + + + Chain Chestplate + + + + + Chain Leggings + + + + + Chain Boots + + + + + Iron Helmet + + + + + Iron Chestplate + + + + + Iron Leggings + + + + + Iron Boots + + + + + Diamond Helmet + + + + + Diamond Chestplate + + + + + Diamond Leggings + + + + + Diamond Boots + + + + + Golden Helmet + + + + + Golden Chestplate + + + + + Golden Leggings + + + + + Golden Boots + + + + + Flint + + + + + Raw Porkchop + + + + + Cooked Porkchop + + + + + Painting + + + + + Golden Apple + + + + + Sign + + + + + Wooden Door + + + + + Bucket + + + + + Water Bucket + + + + + Lava Bucket + + + + + Minecart + + + + + Saddle + + + + + Iron Door + + + + + Redstone + + + + + Snowball + + + + + Boat + + + + + Leather + + + + + Milk Bucket + + + + + Brick + + + + + Clay + + + + + Sugar Canes + + + + + Paper + + + + + Book + + + + + Slimeball + + + + + Minecart with Chest + + + + + Minecart with Furnace + + + + + Egg + + + + + Compass + + + + + Fishing Rod + + + + + Clock + + + + + Glowstone Dust + + + + + Raw Fish + + + + + Cooked Fish + + + + + Dye Powder + + + + + Bone + + + + + Sugar + + + + + Cake + + + + + Bed + + + + + Redstone Repeater + + + + + Cookie + + + + + Map + + + + + Shears + + + + + Melon Slice + + + + + Pumpkin Seeds + + + + + Melon Seeds + + + + + Raw Beef + + + + + Steak + + + + + Raw Chicken + + + + + Cooked Chicken + + + + + Rotten Flesh + + + + + Ender Pearl + + + + + Blaze Rod + + + + + Ghast Tear + + + + + Gold Nugget + + + + + Nether Wart + + + + + {*splash*}{*prefix*}Potion {*postfix*} + + + + + Glass Bottle + + + + + Spider Eye + + + + + Fermented Spider Eye + + + + + Blaze Powder + + + + + Magma Cream + + + + + Brewing Stand + + + + + Cauldron + + + + + Eye of Ender + + + + + Glistering Melon + + + + + Spawn {*CREATURE*} + + + + + Bottle o' Enchanting + + + + + Fire Charge + + + + + Emerald + + + + + Item Frame + + + + + Flower Pot + + + + + Carrot + + + + + Potato + + + + + Baked Potato + + + + + Poisonous Potato + + + + + Golden Carrot + + + + + Skull + + + + + Carrot on a Stick + + + + + Pumpkin Pie + + + + + Enchanted Book + + + + + Nether Brick + + + + + Nether Quartz + + + + + Music Disc - "13" + + + + + Music Disc - "cat" + + + + + Music Disc - "blocks" + + + + + Music Disc - "chirp" + + + + + Music Disc - "far" + + + + + Music Disc - "mall" + + + + + Music Disc - "mellohi" + + + + + Music Disc - "stal" + + + + + Music Disc - "strad" + + + + + Music Disc - "ward" + + + + + Music Disc - "11" + + + + + Music Disc - "where are we now" + + + + + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/GameRules.grf b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/GameRules.grf new file mode 100644 index 00000000..3628e09a Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/GameRules.grf differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/GameRules.grh b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/GameRules.grh new file mode 100644 index 00000000..602a525b Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/GameRules.grh differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/GameRules.xml b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/GameRules.xml new file mode 100644 index 00000000..77fcefaa Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/GameRules.xml differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/de-DE.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/de-DE.lang new file mode 100644 index 00000000..7311b639 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/de-DE.lang @@ -0,0 +1,4 @@ + +Du hast {*progress*} von {*goal*} Schallplatten gefunden! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/es-ES.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/es-ES.lang new file mode 100644 index 00000000..df610909 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/es-ES.lang @@ -0,0 +1,5 @@ + +¡Has encontrado {*progress*} de {*goal*} discos! + + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/fr-FR.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/fr-FR.lang new file mode 100644 index 00000000..c01e36b4 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/fr-FR.lang @@ -0,0 +1,4 @@ + +Vous avez trouvé {*progress*} / {*goal*} disques ! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/it-IT.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/it-IT.lang new file mode 100644 index 00000000..ef0b627c --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/it-IT.lang @@ -0,0 +1,4 @@ + +Hai trovato {*progress*} dischi su {*goal*}! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/ja-JP.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/ja-JP.lang new file mode 100644 index 00000000..cae65a04 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/ja-JP.lang @@ -0,0 +1,4 @@ + +音楽ディスクを見ã¤ã‘ã¾ã—㟠({*progress*}/{*goal*}) + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/ko-KR.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/ko-KR.lang new file mode 100644 index 00000000..e67d5517 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/ko-KR.lang @@ -0,0 +1,4 @@ + +ìŒì•… ë””ìŠ¤í¬ {*progress*}/{*goal*}ìž¥ì„ ì°¾ì•˜ìŠµë‹ˆë‹¤! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/pt-BR.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/pt-BR.lang new file mode 100644 index 00000000..82f11c82 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/pt-BR.lang @@ -0,0 +1,4 @@ + +Você encontrou {*progress*} de {*goal*} discos de música! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/pt-PT.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/pt-PT.lang new file mode 100644 index 00000000..381f4567 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/pt-PT.lang @@ -0,0 +1,4 @@ + +Encontraste {*progress*} de {*goal*} Discos de Música! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/zh-CHT.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/zh-CHT.lang new file mode 100644 index 00000000..8c04f771 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/Microsoft/zh-CHT.lang @@ -0,0 +1,4 @@ + +您已經找到 {*progress*}/{*goal*} å¼µå”±ç‰‡ï¼ + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/en-EN.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/en-EN.lang new file mode 100644 index 00000000..cfda2eb8 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings/en-EN.lang @@ -0,0 +1,5 @@ + + + You have found {*progress*} of {*goal*} Music Discs! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/de-DE.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/de-DE.lang new file mode 100644 index 00000000..02775ada --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/de-DE.lang @@ -0,0 +1,4 @@ + +Du hast {*progress*} von {*goal*} Schallplatten gefunden! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/es-ES.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/es-ES.lang new file mode 100644 index 00000000..2d91f76e --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/es-ES.lang @@ -0,0 +1,5 @@ + +¡Has encontrado {*progress*} de {*goal*} discos! + + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/fr-FR.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/fr-FR.lang new file mode 100644 index 00000000..eba483f8 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/fr-FR.lang @@ -0,0 +1,4 @@ + +Vous avez trouvé {*progress*} / {*goal*} disques ! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/it-IT.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/it-IT.lang new file mode 100644 index 00000000..f0883a6c --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/it-IT.lang @@ -0,0 +1,4 @@ + +Hai trovato {*progress*} dischi su {*goal*}! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/ja-JP.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/ja-JP.lang new file mode 100644 index 00000000..b95f8692 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/ja-JP.lang @@ -0,0 +1,4 @@ + +音楽ディスクを見ã¤ã‘ã¾ã—㟠({*progress*}/{*goal*}) + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/ko-KR.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/ko-KR.lang new file mode 100644 index 00000000..87cb920d --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/ko-KR.lang @@ -0,0 +1,4 @@ + +ìŒì•… ë””ìŠ¤í¬ {*progress*}/{*goal*}ìž¥ì„ ì°¾ì•˜ìŠµë‹ˆë‹¤! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/pt-BR.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/pt-BR.lang new file mode 100644 index 00000000..bcfbbe79 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/pt-BR.lang @@ -0,0 +1,4 @@ + +Você encontrou {*progress*} de {*goal*} discos de música! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/pt-PT.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/pt-PT.lang new file mode 100644 index 00000000..917482c6 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/pt-PT.lang @@ -0,0 +1,4 @@ + +Encontraste {*progress*} de {*goal*} Discos de Música! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/zh-CHT.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/zh-CHT.lang new file mode 100644 index 00000000..461ae695 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/Microsoft/zh-CHT.lang @@ -0,0 +1,4 @@ + +您已經找到 {*progress*}/{*goal*} å¼µå”±ç‰‡ï¼ + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/en-EN.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/en-EN.lang new file mode 100644 index 00000000..7d85ded6 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Durango/en-EN.lang @@ -0,0 +1,5 @@ + + + You have found {*progress*} of {*goal*} Music Discs! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/da-DA.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/da-DA.lang new file mode 100644 index 00000000..efc321d9 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/da-DA.lang @@ -0,0 +1,6 @@ + + + + Du har fundet {*progress*} af {*goal*} musikplader! + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/de-DE.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/de-DE.lang new file mode 100644 index 00000000..02775ada --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/de-DE.lang @@ -0,0 +1,4 @@ + +Du hast {*progress*} von {*goal*} Schallplatten gefunden! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/es-ES.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/es-ES.lang new file mode 100644 index 00000000..2d91f76e --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/es-ES.lang @@ -0,0 +1,5 @@ + +¡Has encontrado {*progress*} de {*goal*} discos! + + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/fi-FI.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/fi-FI.lang new file mode 100644 index 00000000..229e1e14 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/fi-FI.lang @@ -0,0 +1,6 @@ + + + + Olet löytänyt {*progress*}/{*goal*} musiikkilevyistä! + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/fr-FR.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/fr-FR.lang new file mode 100644 index 00000000..eba483f8 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/fr-FR.lang @@ -0,0 +1,4 @@ + +Vous avez trouvé {*progress*} / {*goal*} disques ! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/it-IT.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/it-IT.lang new file mode 100644 index 00000000..f0883a6c --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/it-IT.lang @@ -0,0 +1,4 @@ + +Hai trovato {*progress*} dischi su {*goal*}! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/ja-JP.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/ja-JP.lang new file mode 100644 index 00000000..b95f8692 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/ja-JP.lang @@ -0,0 +1,4 @@ + +音楽ディスクを見ã¤ã‘ã¾ã—㟠({*progress*}/{*goal*}) + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/ko-KR.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/ko-KR.lang new file mode 100644 index 00000000..87cb920d --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/ko-KR.lang @@ -0,0 +1,4 @@ + +ìŒì•… ë””ìŠ¤í¬ {*progress*}/{*goal*}ìž¥ì„ ì°¾ì•˜ìŠµë‹ˆë‹¤! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/la-LAS.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/la-LAS.lang new file mode 100644 index 00000000..61f2842b --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/la-LAS.lang @@ -0,0 +1,6 @@ + + + + ¡Has encontrado {*progress*} de {*goal*} discos! + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/nl-NL.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/nl-NL.lang new file mode 100644 index 00000000..a1710841 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/nl-NL.lang @@ -0,0 +1,6 @@ + + + + Je hebt {*progress*} van {*goal*} muziekplaten gevonden! + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/no-NO.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/no-NO.lang new file mode 100644 index 00000000..a3d244be --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/no-NO.lang @@ -0,0 +1,6 @@ + + + + Du har funnet {*progress*} av {*goal*} musikkplater! + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/pl-PL.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/pl-PL.lang new file mode 100644 index 00000000..5b5c99d2 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/pl-PL.lang @@ -0,0 +1,6 @@ + + + + UdaÅ‚o ci siÄ™ znaleźć {*progress*} z {*goal*} pÅ‚yt muzycznych! + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/pt-BR.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/pt-BR.lang new file mode 100644 index 00000000..bcfbbe79 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/pt-BR.lang @@ -0,0 +1,4 @@ + +Você encontrou {*progress*} de {*goal*} discos de música! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/pt-PT.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/pt-PT.lang new file mode 100644 index 00000000..917482c6 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/pt-PT.lang @@ -0,0 +1,4 @@ + +Encontraste {*progress*} de {*goal*} Discos de Música! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/ru-RU.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/ru-RU.lang new file mode 100644 index 00000000..7a1c49fa --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/ru-RU.lang @@ -0,0 +1,5 @@ + + + Ð’Ñ‹ нашли {*progress*} из {*goal*} музыкальных диÑков! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/sv-SV.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/sv-SV.lang new file mode 100644 index 00000000..3745f9da --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/sv-SV.lang @@ -0,0 +1,6 @@ + + + + Du har hittat {*progress*} av {*goal*} musikskivor! + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/tr-TR.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/tr-TR.lang new file mode 100644 index 00000000..778361fb --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/tr-TR.lang @@ -0,0 +1,6 @@ + + + + {*goal*} Müzik Plağından {*progress*} tanesini buldun! + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/zh-CHT.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/zh-CHT.lang new file mode 100644 index 00000000..461ae695 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/Sony/zh-CHT.lang @@ -0,0 +1,4 @@ + +您已經找到 {*progress*}/{*goal*} å¼µå”±ç‰‡ï¼ + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/en-EN.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/en-EN.lang new file mode 100644 index 00000000..7d85ded6 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Orbis/en-EN.lang @@ -0,0 +1,5 @@ + + + You have found {*progress*} of {*goal*} Music Discs! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/da-DA.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/da-DA.lang new file mode 100644 index 00000000..efc321d9 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/da-DA.lang @@ -0,0 +1,6 @@ + + + + Du har fundet {*progress*} af {*goal*} musikplader! + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/de-DE.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/de-DE.lang new file mode 100644 index 00000000..02775ada --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/de-DE.lang @@ -0,0 +1,4 @@ + +Du hast {*progress*} von {*goal*} Schallplatten gefunden! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/es-ES.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/es-ES.lang new file mode 100644 index 00000000..2d91f76e --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/es-ES.lang @@ -0,0 +1,5 @@ + +¡Has encontrado {*progress*} de {*goal*} discos! + + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/fi-FI.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/fi-FI.lang new file mode 100644 index 00000000..229e1e14 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/fi-FI.lang @@ -0,0 +1,6 @@ + + + + Olet löytänyt {*progress*}/{*goal*} musiikkilevyistä! + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/fr-FR.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/fr-FR.lang new file mode 100644 index 00000000..eba483f8 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/fr-FR.lang @@ -0,0 +1,4 @@ + +Vous avez trouvé {*progress*} / {*goal*} disques ! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/it-IT.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/it-IT.lang new file mode 100644 index 00000000..f0883a6c --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/it-IT.lang @@ -0,0 +1,4 @@ + +Hai trovato {*progress*} dischi su {*goal*}! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/ja-JP.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/ja-JP.lang new file mode 100644 index 00000000..b95f8692 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/ja-JP.lang @@ -0,0 +1,4 @@ + +音楽ディスクを見ã¤ã‘ã¾ã—㟠({*progress*}/{*goal*}) + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/ko-KR.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/ko-KR.lang new file mode 100644 index 00000000..87cb920d --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/ko-KR.lang @@ -0,0 +1,4 @@ + +ìŒì•… ë””ìŠ¤í¬ {*progress*}/{*goal*}ìž¥ì„ ì°¾ì•˜ìŠµë‹ˆë‹¤! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/la-LAS.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/la-LAS.lang new file mode 100644 index 00000000..61f2842b --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/la-LAS.lang @@ -0,0 +1,6 @@ + + + + ¡Has encontrado {*progress*} de {*goal*} discos! + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/nl-NL.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/nl-NL.lang new file mode 100644 index 00000000..a1710841 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/nl-NL.lang @@ -0,0 +1,6 @@ + + + + Je hebt {*progress*} van {*goal*} muziekplaten gevonden! + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/no-NO.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/no-NO.lang new file mode 100644 index 00000000..a3d244be --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/no-NO.lang @@ -0,0 +1,6 @@ + + + + Du har funnet {*progress*} av {*goal*} musikkplater! + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/pl-PL.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/pl-PL.lang new file mode 100644 index 00000000..5b5c99d2 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/pl-PL.lang @@ -0,0 +1,6 @@ + + + + UdaÅ‚o ci siÄ™ znaleźć {*progress*} z {*goal*} pÅ‚yt muzycznych! + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/pt-BR.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/pt-BR.lang new file mode 100644 index 00000000..bcfbbe79 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/pt-BR.lang @@ -0,0 +1,4 @@ + +Você encontrou {*progress*} de {*goal*} discos de música! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/pt-PT.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/pt-PT.lang new file mode 100644 index 00000000..917482c6 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/pt-PT.lang @@ -0,0 +1,4 @@ + +Encontraste {*progress*} de {*goal*} Discos de Música! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/ru-RU.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/ru-RU.lang new file mode 100644 index 00000000..7a1c49fa --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/ru-RU.lang @@ -0,0 +1,5 @@ + + + Ð’Ñ‹ нашли {*progress*} из {*goal*} музыкальных диÑков! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/sv-SV.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/sv-SV.lang new file mode 100644 index 00000000..3745f9da --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/sv-SV.lang @@ -0,0 +1,6 @@ + + + + Du har hittat {*progress*} av {*goal*} musikskivor! + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/tr-TR.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/tr-TR.lang new file mode 100644 index 00000000..778361fb --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/tr-TR.lang @@ -0,0 +1,6 @@ + + + + {*goal*} Müzik Plağından {*progress*} tanesini buldun! + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/zh-CHT.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/zh-CHT.lang new file mode 100644 index 00000000..461ae695 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/Sony/zh-CHT.lang @@ -0,0 +1,4 @@ + +您已經找到 {*progress*}/{*goal*} å¼µå”±ç‰‡ï¼ + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/en-EN.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/en-EN.lang new file mode 100644 index 00000000..7d85ded6 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PS3/en-EN.lang @@ -0,0 +1,5 @@ + + + You have found {*progress*} of {*goal*} Music Discs! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/da-DA.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/da-DA.lang new file mode 100644 index 00000000..efc321d9 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/da-DA.lang @@ -0,0 +1,6 @@ + + + + Du har fundet {*progress*} af {*goal*} musikplader! + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/de-DE.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/de-DE.lang new file mode 100644 index 00000000..02775ada --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/de-DE.lang @@ -0,0 +1,4 @@ + +Du hast {*progress*} von {*goal*} Schallplatten gefunden! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/es-ES.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/es-ES.lang new file mode 100644 index 00000000..2d91f76e --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/es-ES.lang @@ -0,0 +1,5 @@ + +¡Has encontrado {*progress*} de {*goal*} discos! + + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/fi-FI.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/fi-FI.lang new file mode 100644 index 00000000..229e1e14 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/fi-FI.lang @@ -0,0 +1,6 @@ + + + + Olet löytänyt {*progress*}/{*goal*} musiikkilevyistä! + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/fr-FR.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/fr-FR.lang new file mode 100644 index 00000000..eba483f8 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/fr-FR.lang @@ -0,0 +1,4 @@ + +Vous avez trouvé {*progress*} / {*goal*} disques ! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/it-IT.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/it-IT.lang new file mode 100644 index 00000000..f0883a6c --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/it-IT.lang @@ -0,0 +1,4 @@ + +Hai trovato {*progress*} dischi su {*goal*}! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/ja-JP.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/ja-JP.lang new file mode 100644 index 00000000..b95f8692 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/ja-JP.lang @@ -0,0 +1,4 @@ + +音楽ディスクを見ã¤ã‘ã¾ã—㟠({*progress*}/{*goal*}) + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/ko-KR.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/ko-KR.lang new file mode 100644 index 00000000..87cb920d --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/ko-KR.lang @@ -0,0 +1,4 @@ + +ìŒì•… ë””ìŠ¤í¬ {*progress*}/{*goal*}ìž¥ì„ ì°¾ì•˜ìŠµë‹ˆë‹¤! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/la-LAS.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/la-LAS.lang new file mode 100644 index 00000000..61f2842b --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/la-LAS.lang @@ -0,0 +1,6 @@ + + + + ¡Has encontrado {*progress*} de {*goal*} discos! + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/nl-NL.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/nl-NL.lang new file mode 100644 index 00000000..a1710841 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/nl-NL.lang @@ -0,0 +1,6 @@ + + + + Je hebt {*progress*} van {*goal*} muziekplaten gevonden! + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/no-NO.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/no-NO.lang new file mode 100644 index 00000000..a3d244be --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/no-NO.lang @@ -0,0 +1,6 @@ + + + + Du har funnet {*progress*} av {*goal*} musikkplater! + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/pl-PL.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/pl-PL.lang new file mode 100644 index 00000000..5b5c99d2 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/pl-PL.lang @@ -0,0 +1,6 @@ + + + + UdaÅ‚o ci siÄ™ znaleźć {*progress*} z {*goal*} pÅ‚yt muzycznych! + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/pt-BR.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/pt-BR.lang new file mode 100644 index 00000000..bcfbbe79 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/pt-BR.lang @@ -0,0 +1,4 @@ + +Você encontrou {*progress*} de {*goal*} discos de música! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/pt-PT.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/pt-PT.lang new file mode 100644 index 00000000..917482c6 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/pt-PT.lang @@ -0,0 +1,4 @@ + +Encontraste {*progress*} de {*goal*} Discos de Música! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/ru-RU.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/ru-RU.lang new file mode 100644 index 00000000..7a1c49fa --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/ru-RU.lang @@ -0,0 +1,5 @@ + + + Ð’Ñ‹ нашли {*progress*} из {*goal*} музыкальных диÑков! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/sv-SV.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/sv-SV.lang new file mode 100644 index 00000000..3745f9da --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/sv-SV.lang @@ -0,0 +1,6 @@ + + + + Du har hittat {*progress*} av {*goal*} musikskivor! + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/tr-TR.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/tr-TR.lang new file mode 100644 index 00000000..778361fb --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/tr-TR.lang @@ -0,0 +1,6 @@ + + + + {*goal*} Müzik Plağından {*progress*} tanesini buldun! + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/zh-CHT.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/zh-CHT.lang new file mode 100644 index 00000000..461ae695 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/Sony/zh-CHT.lang @@ -0,0 +1,4 @@ + +您已經找到 {*progress*}/{*goal*} å¼µå”±ç‰‡ï¼ + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/en-EN.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/en-EN.lang new file mode 100644 index 00000000..7d85ded6 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_PSVita/en-EN.lang @@ -0,0 +1,5 @@ + + + You have found {*progress*} of {*goal*} Music Discs! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/de-DE.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/de-DE.lang new file mode 100644 index 00000000..02775ada --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/de-DE.lang @@ -0,0 +1,4 @@ + +Du hast {*progress*} von {*goal*} Schallplatten gefunden! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/es-ES.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/es-ES.lang new file mode 100644 index 00000000..2d91f76e --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/es-ES.lang @@ -0,0 +1,5 @@ + +¡Has encontrado {*progress*} de {*goal*} discos! + + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/fr-FR.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/fr-FR.lang new file mode 100644 index 00000000..eba483f8 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/fr-FR.lang @@ -0,0 +1,4 @@ + +Vous avez trouvé {*progress*} / {*goal*} disques ! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/it-IT.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/it-IT.lang new file mode 100644 index 00000000..f0883a6c --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/it-IT.lang @@ -0,0 +1,4 @@ + +Hai trovato {*progress*} dischi su {*goal*}! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/ja-JP.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/ja-JP.lang new file mode 100644 index 00000000..b95f8692 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/ja-JP.lang @@ -0,0 +1,4 @@ + +音楽ディスクを見ã¤ã‘ã¾ã—㟠({*progress*}/{*goal*}) + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/ko-KR.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/ko-KR.lang new file mode 100644 index 00000000..87cb920d --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/ko-KR.lang @@ -0,0 +1,4 @@ + +ìŒì•… ë””ìŠ¤í¬ {*progress*}/{*goal*}ìž¥ì„ ì°¾ì•˜ìŠµë‹ˆë‹¤! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/pt-BR.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/pt-BR.lang new file mode 100644 index 00000000..bcfbbe79 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/pt-BR.lang @@ -0,0 +1,4 @@ + +Você encontrou {*progress*} de {*goal*} discos de música! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/pt-PT.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/pt-PT.lang new file mode 100644 index 00000000..917482c6 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/pt-PT.lang @@ -0,0 +1,4 @@ + +Encontraste {*progress*} de {*goal*} Discos de Música! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/zh-CHT.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/zh-CHT.lang new file mode 100644 index 00000000..461ae695 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/Microsoft/zh-CHT.lang @@ -0,0 +1,4 @@ + +您已經找到 {*progress*}/{*goal*} å¼µå”±ç‰‡ï¼ + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/en-EN.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/en-EN.lang new file mode 100644 index 00000000..7d85ded6 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Win64/en-EN.lang @@ -0,0 +1,5 @@ + + + You have found {*progress*} of {*goal*} Music Discs! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/de-DE.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/de-DE.lang new file mode 100644 index 00000000..02775ada --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/de-DE.lang @@ -0,0 +1,4 @@ + +Du hast {*progress*} von {*goal*} Schallplatten gefunden! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/es-ES.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/es-ES.lang new file mode 100644 index 00000000..2d91f76e --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/es-ES.lang @@ -0,0 +1,5 @@ + +¡Has encontrado {*progress*} de {*goal*} discos! + + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/fr-FR.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/fr-FR.lang new file mode 100644 index 00000000..eba483f8 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/fr-FR.lang @@ -0,0 +1,4 @@ + +Vous avez trouvé {*progress*} / {*goal*} disques ! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/it-IT.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/it-IT.lang new file mode 100644 index 00000000..f0883a6c --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/it-IT.lang @@ -0,0 +1,4 @@ + +Hai trovato {*progress*} dischi su {*goal*}! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/ja-JP.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/ja-JP.lang new file mode 100644 index 00000000..b95f8692 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/ja-JP.lang @@ -0,0 +1,4 @@ + +音楽ディスクを見ã¤ã‘ã¾ã—㟠({*progress*}/{*goal*}) + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/ko-KR.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/ko-KR.lang new file mode 100644 index 00000000..87cb920d --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/ko-KR.lang @@ -0,0 +1,4 @@ + +ìŒì•… ë””ìŠ¤í¬ {*progress*}/{*goal*}ìž¥ì„ ì°¾ì•˜ìŠµë‹ˆë‹¤! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/pt-BR.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/pt-BR.lang new file mode 100644 index 00000000..bcfbbe79 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/pt-BR.lang @@ -0,0 +1,4 @@ + +Você encontrou {*progress*} de {*goal*} discos de música! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/pt-PT.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/pt-PT.lang new file mode 100644 index 00000000..917482c6 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/pt-PT.lang @@ -0,0 +1,4 @@ + +Encontraste {*progress*} de {*goal*} Discos de Música! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/zh-CHT.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/zh-CHT.lang new file mode 100644 index 00000000..461ae695 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/Microsoft/zh-CHT.lang @@ -0,0 +1,4 @@ + +您已經找到 {*progress*}/{*goal*} å¼µå”±ç‰‡ï¼ + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/en-EN.lang b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/en-EN.lang new file mode 100644 index 00000000..7d85ded6 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Strings_Xbox360/en-EN.lang @@ -0,0 +1,5 @@ + + + You have found {*progress*} of {*goal*} Music Discs! + + diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Tutorial.pck b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Tutorial.pck new file mode 100644 index 00000000..fc4b9530 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Tutorial.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Tutorial.xml b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Tutorial.xml new file mode 100644 index 00000000..325eb3fd Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/Tutorial.xml differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/languages.loc b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/languages.loc new file mode 100644 index 00000000..50ef48d4 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/languages.loc differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Boat.sch b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Boat.sch new file mode 100644 index 00000000..323e10d5 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Boat.sch differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/CasTes1.sch b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/CasTes1.sch new file mode 100644 index 00000000..de373732 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/CasTes1.sch differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/CasTes2.sch b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/CasTes2.sch new file mode 100644 index 00000000..a7140c60 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/CasTes2.sch differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/JungleTemp.sch b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/JungleTemp.sch new file mode 100644 index 00000000..9f6003b7 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/JungleTemp.sch differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Lava.sch b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Lava.sch new file mode 100644 index 00000000..1e162408 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Lava.sch differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/MinecraftSign.sch b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/MinecraftSign.sch new file mode 100644 index 00000000..3625264a Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/MinecraftSign.sch differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Mushroom.sch b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Mushroom.sch new file mode 100644 index 00000000..8b012bbe Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Mushroom.sch differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/PillarHouse.sch b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/PillarHouse.sch new file mode 100644 index 00000000..ae95dcc9 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/PillarHouse.sch differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Pyramid.sch b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Pyramid.sch new file mode 100644 index 00000000..5c7ea6b2 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Pyramid.sch differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/RuinedHouse.sch b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/RuinedHouse.sch new file mode 100644 index 00000000..c7844400 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/RuinedHouse.sch differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Ship.sch b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Ship.sch new file mode 100644 index 00000000..6aa37242 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Ship.sch differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Smithy.sch b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Smithy.sch new file mode 100644 index 00000000..c1847304 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Smithy.sch differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/SnowHouse.sch b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/SnowHouse.sch new file mode 100644 index 00000000..17a3b250 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/SnowHouse.sch differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Spider.sch b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Spider.sch new file mode 100644 index 00000000..e6049259 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Spider.sch differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Stairs.sch b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Stairs.sch new file mode 100644 index 00000000..33943c2a Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Stairs.sch differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/StoneCircle.sch b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/StoneCircle.sch new file mode 100644 index 00000000..0c06ec53 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/StoneCircle.sch differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/StoneTemp.sch b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/StoneTemp.sch new file mode 100644 index 00000000..f227b0ec Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/StoneTemp.sch differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Tower.sch b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Tower.sch new file mode 100644 index 00000000..102fdff2 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/Tower.sch differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/UWChamber.sch b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/UWChamber.sch new file mode 100644 index 00000000..f1c0e2c7 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/Tutorial/schematics/UWChamber.sch differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/launchCMD.cmd b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/launchCMD.cmd new file mode 100644 index 00000000..d21751d7 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/GameRules/BuildOnly/launchCMD.cmd @@ -0,0 +1 @@ +cmd & \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/Tutorial.pck b/Minecraft.Client/Common/res/TitleUpdate/GameRules/Tutorial.pck new file mode 100644 index 00000000..8f44945b Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/Tutorial.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/Tutorial_Durango.pck b/Minecraft.Client/Common/res/TitleUpdate/GameRules/Tutorial_Durango.pck new file mode 100644 index 00000000..d5e1d6b0 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/Tutorial_Durango.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/GameRules/Tutorial_Orbis.pck b/Minecraft.Client/Common/res/TitleUpdate/GameRules/Tutorial_Orbis.pck new file mode 100644 index 00000000..fc4b9530 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/GameRules/Tutorial_Orbis.pck differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/audio/AdditionalMusic.xwb b/Minecraft.Client/Common/res/TitleUpdate/audio/AdditionalMusic.xwb new file mode 100644 index 00000000..ebea388f Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/audio/AdditionalMusic.xwb differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/audio/Minecraft.xgs b/Minecraft.Client/Common/res/TitleUpdate/audio/Minecraft.xgs new file mode 100644 index 00000000..5d6c55be Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/audio/Minecraft.xgs differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/audio/additional.xsb b/Minecraft.Client/Common/res/TitleUpdate/audio/additional.xsb new file mode 100644 index 00000000..e60b3524 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/audio/additional.xsb differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/audio/additional.xwb b/Minecraft.Client/Common/res/TitleUpdate/audio/additional.xwb new file mode 100644 index 00000000..983306db Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/audio/additional.xwb differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/audio/minecraft.xsb b/Minecraft.Client/Common/res/TitleUpdate/audio/minecraft.xsb new file mode 100644 index 00000000..2154729d Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/audio/minecraft.xsb differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_1.png b/Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_1.png new file mode 100644 index 00000000..ebcfc411 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_1.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_1_b.png b/Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_1_b.png new file mode 100644 index 00000000..546397d5 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_1_b.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_2.png b/Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_2.png new file mode 100644 index 00000000..8d8bba6c Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_2.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_2_b.png b/Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_2_b.png new file mode 100644 index 00000000..56556598 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/armor/cloth_2_b.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/armor/power.png b/Minecraft.Client/Common/res/TitleUpdate/res/armor/power.png new file mode 100644 index 00000000..809539ca Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/armor/power.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/art/kz.png b/Minecraft.Client/Common/res/TitleUpdate/res/art/kz.png new file mode 100644 index 00000000..4cb9a07c Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/art/kz.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/colours.col b/Minecraft.Client/Common/res/TitleUpdate/res/colours.col new file mode 100644 index 00000000..abe91ebe Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/colours.col differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/colours.xml b/Minecraft.Client/Common/res/TitleUpdate/res/colours.xml new file mode 100644 index 00000000..f6a85645 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/res/colours.xml @@ -0,0 +1,283 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/font/Default.png b/Minecraft.Client/Common/res/TitleUpdate/res/font/Default.png new file mode 100644 index 00000000..07ec8d9d Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/font/Default.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/font/Mojangles_11.png b/Minecraft.Client/Common/res/TitleUpdate/res/font/Mojangles_11.png new file mode 100644 index 00000000..cfa86446 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/font/Mojangles_11.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/font/Mojangles_7.png b/Minecraft.Client/Common/res/TitleUpdate/res/font/Mojangles_7.png new file mode 100644 index 00000000..9de84520 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/font/Mojangles_7.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/item/book.png b/Minecraft.Client/Common/res/TitleUpdate/res/item/book.png new file mode 100644 index 00000000..708eaab6 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/item/book.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/item/enderchest.png b/Minecraft.Client/Common/res/TitleUpdate/res/item/enderchest.png new file mode 100644 index 00000000..dc26c059 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/item/enderchest.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/items.png b/Minecraft.Client/Common/res/TitleUpdate/res/items.png new file mode 100644 index 00000000..c86026a0 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/items.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/misc/additionalmapicons.png b/Minecraft.Client/Common/res/TitleUpdate/res/misc/additionalmapicons.png new file mode 100644 index 00000000..3f61270b Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/misc/additionalmapicons.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/misc/explosion.png b/Minecraft.Client/Common/res/TitleUpdate/res/misc/explosion.png new file mode 100644 index 00000000..242d9115 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/misc/explosion.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/misc/footprint.png b/Minecraft.Client/Common/res/TitleUpdate/res/misc/footprint.png new file mode 100644 index 00000000..2260afeb Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/misc/footprint.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/misc/glint.png b/Minecraft.Client/Common/res/TitleUpdate/res/misc/glint.png new file mode 100644 index 00000000..ec9a3d1c Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/misc/glint.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/misc/mapicons.png b/Minecraft.Client/Common/res/TitleUpdate/res/misc/mapicons.png new file mode 100644 index 00000000..8371a52a Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/misc/mapicons.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/misc/particlefield.png b/Minecraft.Client/Common/res/TitleUpdate/res/misc/particlefield.png new file mode 100644 index 00000000..ea256619 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/misc/particlefield.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/misc/tunnel.png b/Minecraft.Client/Common/res/TitleUpdate/res/misc/tunnel.png new file mode 100644 index 00000000..2f82e845 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/misc/tunnel.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/enderdragon/beam.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/enderdragon/beam.png new file mode 100644 index 00000000..9ddd1d15 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/enderdragon/beam.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/enderdragon/ender.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/enderdragon/ender.png new file mode 100644 index 00000000..f82ef136 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/enderdragon/ender.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/enderdragon/ender_eyes.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/enderdragon/ender_eyes.png new file mode 100644 index 00000000..b16c9a50 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/enderdragon/ender_eyes.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/enderman_eyes.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/enderman_eyes.png new file mode 100644 index 00000000..5e3f4782 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/enderman_eyes.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/redcow.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/redcow.png new file mode 100644 index 00000000..1d94cc0d Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/redcow.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/skeleton_wither.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/skeleton_wither.png new file mode 100644 index 00000000..b0db19df Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/skeleton_wither.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/snowman.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/snowman.png new file mode 100644 index 00000000..be61ec92 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/snowman.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/butcher.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/butcher.png new file mode 100644 index 00000000..935352f1 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/butcher.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/farmer.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/farmer.png new file mode 100644 index 00000000..d01778ab Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/farmer.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/librarian.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/librarian.png new file mode 100644 index 00000000..73b99518 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/librarian.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/priest.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/priest.png new file mode 100644 index 00000000..14ae9398 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/priest.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/smith.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/smith.png new file mode 100644 index 00000000..a97c37f9 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/smith.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/villager.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/villager.png new file mode 100644 index 00000000..f002b0e5 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/villager/villager.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/wolf_collar.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/wolf_collar.png new file mode 100644 index 00000000..62d85725 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/wolf_collar.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/wolf_tame.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/wolf_tame.png new file mode 100644 index 00000000..18830a05 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/wolf_tame.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/zombie.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/zombie.png new file mode 100644 index 00000000..333fcd6e Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/zombie.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/mob/zombie_villager.png b/Minecraft.Client/Common/res/TitleUpdate/res/mob/zombie_villager.png new file mode 100644 index 00000000..0b2cecef Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/mob/zombie_villager.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/particles.png b/Minecraft.Client/Common/res/TitleUpdate/res/particles.png new file mode 100644 index 00000000..aed54da5 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/particles.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/terrain.png b/Minecraft.Client/Common/res/TitleUpdate/res/terrain.png new file mode 100644 index 00000000..d5d3751d Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/terrain.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/terrainMipMapLevel2.png b/Minecraft.Client/Common/res/TitleUpdate/res/terrainMipMapLevel2.png new file mode 100644 index 00000000..771bb2d5 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/terrainMipMapLevel2.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/terrainMipMapLevel3.png b/Minecraft.Client/Common/res/TitleUpdate/res/terrainMipMapLevel3.png new file mode 100644 index 00000000..900ba0f3 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/terrainMipMapLevel3.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_0.png b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_0.png new file mode 100644 index 00000000..cf8910f6 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_0.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_0.txt b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_0.txt new file mode 100644 index 00000000..58d1715d --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_0.txt @@ -0,0 +1,16 @@ +8, +9, +10, +11, +12, +13, +14, +15, +0, +1, +2, +3, +4, +5, +6, +7, diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_1.png b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_1.png new file mode 100644 index 00000000..6db92ac4 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_1.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_1.txt b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_1.txt new file mode 100644 index 00000000..0519ecba --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/fire_1.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava.png b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava.png new file mode 100644 index 00000000..78bb29d5 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava.txt b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava.txt new file mode 100644 index 00000000..b0a7c084 --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava.txt @@ -0,0 +1,38 @@ +0*2 +1*2 +2*2 +3*2 +4*2 +5*2 +6*2 +7*2 +8*2 +9*2 +10*2 +11*2 +12*2 +13*2 +14*2 +15*2 +16*2 +17*2 +18*2 +19*2 +18*2 +17*2 +16*2 +15*2 +14*2 +13*2 +12*2 +11*2 +10*2 +9*2 +8*2 +7*2 +6*2 +5*2 +4*2 +3*2 +2*2 +1*2 diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava_flow.png b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava_flow.png new file mode 100644 index 00000000..af07f91d Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava_flow.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava_flow.txt b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava_flow.txt new file mode 100644 index 00000000..2e6ca4fc --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/lava_flow.txt @@ -0,0 +1,16 @@ +0*3 +1*3 +2*3 +3*3 +4*3 +5*3 +6*3 +7*3 +8*3 +9*3 +10*3 +11*3 +12*3 +13*3 +14*3 +15*3 diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/portal.png b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/portal.png new file mode 100644 index 00000000..96859e2d Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/portal.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/portal.txt b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/portal.txt new file mode 100644 index 00000000..0519ecba --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/portal.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water.png b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water.png new file mode 100644 index 00000000..c7e90b07 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water.txt b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water.txt new file mode 100644 index 00000000..d8fe765a --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water.txt @@ -0,0 +1,32 @@ +0*2 +1*2 +2*2 +3*2 +4*2 +5*2 +6*2 +7*2 +8*2 +9*2 +10*2 +11*2 +12*2 +13*2 +14*2 +15*2 +16*2 +17*2 +18*2 +19*2 +20*2 +21*2 +22*2 +23*2 +24*2 +25*2 +26*2 +27*2 +28*2 +29*2 +30*2 +31*2 diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water_flow.png b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water_flow.png new file mode 100644 index 00000000..e72280c4 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water_flow.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water_flow.txt b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water_flow.txt new file mode 100644 index 00000000..0519ecba --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/res/textures/blocks/water_flow.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/items/clock.png b/Minecraft.Client/Common/res/TitleUpdate/res/textures/items/clock.png new file mode 100644 index 00000000..069a0abf Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/textures/items/clock.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/items/clock.txt b/Minecraft.Client/Common/res/TitleUpdate/res/textures/items/clock.txt new file mode 100644 index 00000000..0519ecba --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/res/textures/items/clock.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/items/compass.png b/Minecraft.Client/Common/res/TitleUpdate/res/textures/items/compass.png new file mode 100644 index 00000000..9dcbdfe6 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/res/textures/items/compass.png differ diff --git a/Minecraft.Client/Common/res/TitleUpdate/res/textures/items/compass.txt b/Minecraft.Client/Common/res/TitleUpdate/res/textures/items/compass.txt new file mode 100644 index 00000000..0519ecba --- /dev/null +++ b/Minecraft.Client/Common/res/TitleUpdate/res/textures/items/compass.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Minecraft.Client/Common/res/TitleUpdate/tutorialDiff b/Minecraft.Client/Common/res/TitleUpdate/tutorialDiff new file mode 100644 index 00000000..be9e2e60 Binary files /dev/null and b/Minecraft.Client/Common/res/TitleUpdate/tutorialDiff differ diff --git a/Minecraft.Client/Common/res/achievement/bg.png b/Minecraft.Client/Common/res/achievement/bg.png new file mode 100644 index 00000000..23dd85a8 Binary files /dev/null and b/Minecraft.Client/Common/res/achievement/bg.png differ diff --git a/Minecraft.Client/Common/res/achievement/icons.png b/Minecraft.Client/Common/res/achievement/icons.png new file mode 100644 index 00000000..6a3f3ea5 Binary files /dev/null and b/Minecraft.Client/Common/res/achievement/icons.png differ diff --git a/Minecraft.Client/Common/res/armor/chain_1.png b/Minecraft.Client/Common/res/armor/chain_1.png new file mode 100644 index 00000000..3632af5b Binary files /dev/null and b/Minecraft.Client/Common/res/armor/chain_1.png differ diff --git a/Minecraft.Client/Common/res/armor/chain_2.png b/Minecraft.Client/Common/res/armor/chain_2.png new file mode 100644 index 00000000..330425b1 Binary files /dev/null and b/Minecraft.Client/Common/res/armor/chain_2.png differ diff --git a/Minecraft.Client/Common/res/armor/cloth_1.png b/Minecraft.Client/Common/res/armor/cloth_1.png new file mode 100644 index 00000000..f3cf4aa3 Binary files /dev/null and b/Minecraft.Client/Common/res/armor/cloth_1.png differ diff --git a/Minecraft.Client/Common/res/armor/cloth_2.png b/Minecraft.Client/Common/res/armor/cloth_2.png new file mode 100644 index 00000000..15fb9084 Binary files /dev/null and b/Minecraft.Client/Common/res/armor/cloth_2.png differ diff --git a/Minecraft.Client/Common/res/armor/diamond_1.png b/Minecraft.Client/Common/res/armor/diamond_1.png new file mode 100644 index 00000000..339da658 Binary files /dev/null and b/Minecraft.Client/Common/res/armor/diamond_1.png differ diff --git a/Minecraft.Client/Common/res/armor/diamond_2.png b/Minecraft.Client/Common/res/armor/diamond_2.png new file mode 100644 index 00000000..c220c123 Binary files /dev/null and b/Minecraft.Client/Common/res/armor/diamond_2.png differ diff --git a/Minecraft.Client/Common/res/armor/gold_1.png b/Minecraft.Client/Common/res/armor/gold_1.png new file mode 100644 index 00000000..885f309b Binary files /dev/null and b/Minecraft.Client/Common/res/armor/gold_1.png differ diff --git a/Minecraft.Client/Common/res/armor/gold_2.png b/Minecraft.Client/Common/res/armor/gold_2.png new file mode 100644 index 00000000..9d1ea3b3 Binary files /dev/null and b/Minecraft.Client/Common/res/armor/gold_2.png differ diff --git a/Minecraft.Client/Common/res/armor/iron_1.png b/Minecraft.Client/Common/res/armor/iron_1.png new file mode 100644 index 00000000..374ab076 Binary files /dev/null and b/Minecraft.Client/Common/res/armor/iron_1.png differ diff --git a/Minecraft.Client/Common/res/armor/iron_2.png b/Minecraft.Client/Common/res/armor/iron_2.png new file mode 100644 index 00000000..53af4f4d Binary files /dev/null and b/Minecraft.Client/Common/res/armor/iron_2.png differ diff --git a/Minecraft.Client/Common/res/armor/power.png b/Minecraft.Client/Common/res/armor/power.png new file mode 100644 index 00000000..809539ca Binary files /dev/null and b/Minecraft.Client/Common/res/armor/power.png differ diff --git a/Minecraft.Client/Common/res/art/kz.png b/Minecraft.Client/Common/res/art/kz.png new file mode 100644 index 00000000..ecc4823e Binary files /dev/null and b/Minecraft.Client/Common/res/art/kz.png differ diff --git a/Minecraft.Client/Common/res/audio/Minecraft.xgs b/Minecraft.Client/Common/res/audio/Minecraft.xgs new file mode 100644 index 00000000..9761e4ca Binary files /dev/null and b/Minecraft.Client/Common/res/audio/Minecraft.xgs differ diff --git a/Minecraft.Client/Common/res/audio/minecraft.xsb b/Minecraft.Client/Common/res/audio/minecraft.xsb new file mode 100644 index 00000000..4bfe9120 Binary files /dev/null and b/Minecraft.Client/Common/res/audio/minecraft.xsb differ diff --git a/Minecraft.Client/Common/res/audio/resident.xwb b/Minecraft.Client/Common/res/audio/resident.xwb new file mode 100644 index 00000000..3fa725a1 Binary files /dev/null and b/Minecraft.Client/Common/res/audio/resident.xwb differ diff --git a/Minecraft.Client/Common/res/audio/streamed.xwb b/Minecraft.Client/Common/res/audio/streamed.xwb new file mode 100644 index 00000000..ec2fb4ed Binary files /dev/null and b/Minecraft.Client/Common/res/audio/streamed.xwb differ diff --git a/Minecraft.Client/Common/res/environment/clouds.png b/Minecraft.Client/Common/res/environment/clouds.png new file mode 100644 index 00000000..b4a78c2f Binary files /dev/null and b/Minecraft.Client/Common/res/environment/clouds.png differ diff --git a/Minecraft.Client/Common/res/environment/rain.png b/Minecraft.Client/Common/res/environment/rain.png new file mode 100644 index 00000000..75d775b1 Binary files /dev/null and b/Minecraft.Client/Common/res/environment/rain.png differ diff --git a/Minecraft.Client/Common/res/environment/snow.png b/Minecraft.Client/Common/res/environment/snow.png new file mode 100644 index 00000000..84417c5c Binary files /dev/null and b/Minecraft.Client/Common/res/environment/snow.png differ diff --git a/Minecraft.Client/Common/res/font/Mojangles_11.png b/Minecraft.Client/Common/res/font/Mojangles_11.png new file mode 100644 index 00000000..1b8af338 Binary files /dev/null and b/Minecraft.Client/Common/res/font/Mojangles_11.png differ diff --git a/Minecraft.Client/Common/res/font/Mojangles_7.png b/Minecraft.Client/Common/res/font/Mojangles_7.png new file mode 100644 index 00000000..2ad933fe Binary files /dev/null and b/Minecraft.Client/Common/res/font/Mojangles_7.png differ diff --git a/Minecraft.Client/Common/res/font/default.png b/Minecraft.Client/Common/res/font/default.png new file mode 100644 index 00000000..96094378 Binary files /dev/null and b/Minecraft.Client/Common/res/font/default.png differ diff --git a/Minecraft.Client/Common/res/gui/background.png b/Minecraft.Client/Common/res/gui/background.png new file mode 100644 index 00000000..b29e0092 Binary files /dev/null and b/Minecraft.Client/Common/res/gui/background.png differ diff --git a/Minecraft.Client/Common/res/gui/container.png b/Minecraft.Client/Common/res/gui/container.png new file mode 100644 index 00000000..bd1d383c Binary files /dev/null and b/Minecraft.Client/Common/res/gui/container.png differ diff --git a/Minecraft.Client/Common/res/gui/crafting.png b/Minecraft.Client/Common/res/gui/crafting.png new file mode 100644 index 00000000..da831189 Binary files /dev/null and b/Minecraft.Client/Common/res/gui/crafting.png differ diff --git a/Minecraft.Client/Common/res/gui/furnace.png b/Minecraft.Client/Common/res/gui/furnace.png new file mode 100644 index 00000000..a5834e19 Binary files /dev/null and b/Minecraft.Client/Common/res/gui/furnace.png differ diff --git a/Minecraft.Client/Common/res/gui/gui.png b/Minecraft.Client/Common/res/gui/gui.png new file mode 100644 index 00000000..81af329e Binary files /dev/null and b/Minecraft.Client/Common/res/gui/gui.png differ diff --git a/Minecraft.Client/Common/res/gui/icons.png b/Minecraft.Client/Common/res/gui/icons.png new file mode 100644 index 00000000..73fe9bbd Binary files /dev/null and b/Minecraft.Client/Common/res/gui/icons.png differ diff --git a/Minecraft.Client/Common/res/gui/inventory.png b/Minecraft.Client/Common/res/gui/inventory.png new file mode 100644 index 00000000..0b5f2916 Binary files /dev/null and b/Minecraft.Client/Common/res/gui/inventory.png differ diff --git a/Minecraft.Client/Common/res/gui/items.png b/Minecraft.Client/Common/res/gui/items.png new file mode 100644 index 00000000..3f51245f Binary files /dev/null and b/Minecraft.Client/Common/res/gui/items.png differ diff --git a/Minecraft.Client/Common/res/gui/logo.png b/Minecraft.Client/Common/res/gui/logo.png new file mode 100644 index 00000000..b7c28795 Binary files /dev/null and b/Minecraft.Client/Common/res/gui/logo.png differ diff --git a/Minecraft.Client/Common/res/gui/particles.png b/Minecraft.Client/Common/res/gui/particles.png new file mode 100644 index 00000000..ac7e39f4 Binary files /dev/null and b/Minecraft.Client/Common/res/gui/particles.png differ diff --git a/Minecraft.Client/Common/res/gui/slot.png b/Minecraft.Client/Common/res/gui/slot.png new file mode 100644 index 00000000..4eb39baf Binary files /dev/null and b/Minecraft.Client/Common/res/gui/slot.png differ diff --git a/Minecraft.Client/Common/res/gui/trap.png b/Minecraft.Client/Common/res/gui/trap.png new file mode 100644 index 00000000..594860a6 Binary files /dev/null and b/Minecraft.Client/Common/res/gui/trap.png differ diff --git a/Minecraft.Client/Common/res/gui/unknown_pack.png b/Minecraft.Client/Common/res/gui/unknown_pack.png new file mode 100644 index 00000000..3a45a90e Binary files /dev/null and b/Minecraft.Client/Common/res/gui/unknown_pack.png differ diff --git a/Minecraft.Client/Common/res/item/arrows.png b/Minecraft.Client/Common/res/item/arrows.png new file mode 100644 index 00000000..75c58287 Binary files /dev/null and b/Minecraft.Client/Common/res/item/arrows.png differ diff --git a/Minecraft.Client/Common/res/item/boat.png b/Minecraft.Client/Common/res/item/boat.png new file mode 100644 index 00000000..132a0f7c Binary files /dev/null and b/Minecraft.Client/Common/res/item/boat.png differ diff --git a/Minecraft.Client/Common/res/item/cart.png b/Minecraft.Client/Common/res/item/cart.png new file mode 100644 index 00000000..32af68e3 Binary files /dev/null and b/Minecraft.Client/Common/res/item/cart.png differ diff --git a/Minecraft.Client/Common/res/item/door.png b/Minecraft.Client/Common/res/item/door.png new file mode 100644 index 00000000..52df2d92 Binary files /dev/null and b/Minecraft.Client/Common/res/item/door.png differ diff --git a/Minecraft.Client/Common/res/item/sign.png b/Minecraft.Client/Common/res/item/sign.png new file mode 100644 index 00000000..e8294724 Binary files /dev/null and b/Minecraft.Client/Common/res/item/sign.png differ diff --git a/Minecraft.Client/Common/res/misc/dial.png b/Minecraft.Client/Common/res/misc/dial.png new file mode 100644 index 00000000..140e7e34 Binary files /dev/null and b/Minecraft.Client/Common/res/misc/dial.png differ diff --git a/Minecraft.Client/Common/res/misc/foliagecolor.png b/Minecraft.Client/Common/res/misc/foliagecolor.png new file mode 100644 index 00000000..81673cae Binary files /dev/null and b/Minecraft.Client/Common/res/misc/foliagecolor.png differ diff --git a/Minecraft.Client/Common/res/misc/footprint.png b/Minecraft.Client/Common/res/misc/footprint.png new file mode 100644 index 00000000..e29b6a6d Binary files /dev/null and b/Minecraft.Client/Common/res/misc/footprint.png differ diff --git a/Minecraft.Client/Common/res/misc/grasscolor.png b/Minecraft.Client/Common/res/misc/grasscolor.png new file mode 100644 index 00000000..a6d9c209 Binary files /dev/null and b/Minecraft.Client/Common/res/misc/grasscolor.png differ diff --git a/Minecraft.Client/Common/res/misc/mapbg.png b/Minecraft.Client/Common/res/misc/mapbg.png new file mode 100644 index 00000000..3f67e74c Binary files /dev/null and b/Minecraft.Client/Common/res/misc/mapbg.png differ diff --git a/Minecraft.Client/Common/res/misc/mapicons.png b/Minecraft.Client/Common/res/misc/mapicons.png new file mode 100644 index 00000000..2dd03d19 Binary files /dev/null and b/Minecraft.Client/Common/res/misc/mapicons.png differ diff --git a/Minecraft.Client/Common/res/misc/pumpkinblur.png b/Minecraft.Client/Common/res/misc/pumpkinblur.png new file mode 100644 index 00000000..c6e2ffc9 Binary files /dev/null and b/Minecraft.Client/Common/res/misc/pumpkinblur.png differ diff --git a/Minecraft.Client/Common/res/misc/shadow.png b/Minecraft.Client/Common/res/misc/shadow.png new file mode 100644 index 00000000..06d999b2 Binary files /dev/null and b/Minecraft.Client/Common/res/misc/shadow.png differ diff --git a/Minecraft.Client/Common/res/misc/vignette.png b/Minecraft.Client/Common/res/misc/vignette.png new file mode 100644 index 00000000..f236acb3 Binary files /dev/null and b/Minecraft.Client/Common/res/misc/vignette.png differ diff --git a/Minecraft.Client/Common/res/misc/water.png b/Minecraft.Client/Common/res/misc/water.png new file mode 100644 index 00000000..8b92f9bc Binary files /dev/null and b/Minecraft.Client/Common/res/misc/water.png differ diff --git a/Minecraft.Client/Common/res/misc/watercolor.png b/Minecraft.Client/Common/res/misc/watercolor.png new file mode 100644 index 00000000..8537e0d0 Binary files /dev/null and b/Minecraft.Client/Common/res/misc/watercolor.png differ diff --git a/Minecraft.Client/Common/res/mob/char.png b/Minecraft.Client/Common/res/mob/char.png new file mode 100644 index 00000000..7cfa08a8 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/char.png differ diff --git a/Minecraft.Client/Common/res/mob/char1.png b/Minecraft.Client/Common/res/mob/char1.png new file mode 100644 index 00000000..41576e63 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/char1.png differ diff --git a/Minecraft.Client/Common/res/mob/char2.png b/Minecraft.Client/Common/res/mob/char2.png new file mode 100644 index 00000000..b921f856 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/char2.png differ diff --git a/Minecraft.Client/Common/res/mob/char3.png b/Minecraft.Client/Common/res/mob/char3.png new file mode 100644 index 00000000..c7a39868 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/char3.png differ diff --git a/Minecraft.Client/Common/res/mob/char4.png b/Minecraft.Client/Common/res/mob/char4.png new file mode 100644 index 00000000..25dcfec4 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/char4.png differ diff --git a/Minecraft.Client/Common/res/mob/char5.png b/Minecraft.Client/Common/res/mob/char5.png new file mode 100644 index 00000000..4cc80ac1 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/char5.png differ diff --git a/Minecraft.Client/Common/res/mob/char6.png b/Minecraft.Client/Common/res/mob/char6.png new file mode 100644 index 00000000..74a71c4f Binary files /dev/null and b/Minecraft.Client/Common/res/mob/char6.png differ diff --git a/Minecraft.Client/Common/res/mob/char7.png b/Minecraft.Client/Common/res/mob/char7.png new file mode 100644 index 00000000..5018dc45 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/char7.png differ diff --git a/Minecraft.Client/Common/res/mob/chicken.png b/Minecraft.Client/Common/res/mob/chicken.png new file mode 100644 index 00000000..d4812939 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/chicken.png differ diff --git a/Minecraft.Client/Common/res/mob/cow.png b/Minecraft.Client/Common/res/mob/cow.png new file mode 100644 index 00000000..2080ebcb Binary files /dev/null and b/Minecraft.Client/Common/res/mob/cow.png differ diff --git a/Minecraft.Client/Common/res/mob/creeper.png b/Minecraft.Client/Common/res/mob/creeper.png new file mode 100644 index 00000000..e0a5e0a1 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/creeper.png differ diff --git a/Minecraft.Client/Common/res/mob/ghast.png b/Minecraft.Client/Common/res/mob/ghast.png new file mode 100644 index 00000000..e83a60da Binary files /dev/null and b/Minecraft.Client/Common/res/mob/ghast.png differ diff --git a/Minecraft.Client/Common/res/mob/ghast_fire.png b/Minecraft.Client/Common/res/mob/ghast_fire.png new file mode 100644 index 00000000..fff9718c Binary files /dev/null and b/Minecraft.Client/Common/res/mob/ghast_fire.png differ diff --git a/Minecraft.Client/Common/res/mob/pig.png b/Minecraft.Client/Common/res/mob/pig.png new file mode 100644 index 00000000..5c1efc2d Binary files /dev/null and b/Minecraft.Client/Common/res/mob/pig.png differ diff --git a/Minecraft.Client/Common/res/mob/pigman.png b/Minecraft.Client/Common/res/mob/pigman.png new file mode 100644 index 00000000..c900b362 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/pigman.png differ diff --git a/Minecraft.Client/Common/res/mob/pigzombie.png b/Minecraft.Client/Common/res/mob/pigzombie.png new file mode 100644 index 00000000..0a0a25a4 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/pigzombie.png differ diff --git a/Minecraft.Client/Common/res/mob/saddle.png b/Minecraft.Client/Common/res/mob/saddle.png new file mode 100644 index 00000000..aaea7a6d Binary files /dev/null and b/Minecraft.Client/Common/res/mob/saddle.png differ diff --git a/Minecraft.Client/Common/res/mob/sheep.png b/Minecraft.Client/Common/res/mob/sheep.png new file mode 100644 index 00000000..98cfa9ac Binary files /dev/null and b/Minecraft.Client/Common/res/mob/sheep.png differ diff --git a/Minecraft.Client/Common/res/mob/sheep_fur.png b/Minecraft.Client/Common/res/mob/sheep_fur.png new file mode 100644 index 00000000..f1291a5f Binary files /dev/null and b/Minecraft.Client/Common/res/mob/sheep_fur.png differ diff --git a/Minecraft.Client/Common/res/mob/skeleton.png b/Minecraft.Client/Common/res/mob/skeleton.png new file mode 100644 index 00000000..9d223394 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/skeleton.png differ diff --git a/Minecraft.Client/Common/res/mob/slime.png b/Minecraft.Client/Common/res/mob/slime.png new file mode 100644 index 00000000..42fc8736 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/slime.png differ diff --git a/Minecraft.Client/Common/res/mob/spider.png b/Minecraft.Client/Common/res/mob/spider.png new file mode 100644 index 00000000..08344a83 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/spider.png differ diff --git a/Minecraft.Client/Common/res/mob/spider_eyes.png b/Minecraft.Client/Common/res/mob/spider_eyes.png new file mode 100644 index 00000000..2a7734f9 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/spider_eyes.png differ diff --git a/Minecraft.Client/Common/res/mob/squid.png b/Minecraft.Client/Common/res/mob/squid.png new file mode 100644 index 00000000..ff3f5b0a Binary files /dev/null and b/Minecraft.Client/Common/res/mob/squid.png differ diff --git a/Minecraft.Client/Common/res/mob/wolf.png b/Minecraft.Client/Common/res/mob/wolf.png new file mode 100644 index 00000000..4b24458f Binary files /dev/null and b/Minecraft.Client/Common/res/mob/wolf.png differ diff --git a/Minecraft.Client/Common/res/mob/wolf_angry.png b/Minecraft.Client/Common/res/mob/wolf_angry.png new file mode 100644 index 00000000..89b3d2d6 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/wolf_angry.png differ diff --git a/Minecraft.Client/Common/res/mob/wolf_tame.png b/Minecraft.Client/Common/res/mob/wolf_tame.png new file mode 100644 index 00000000..159f45b5 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/wolf_tame.png differ diff --git a/Minecraft.Client/Common/res/mob/zombie.png b/Minecraft.Client/Common/res/mob/zombie.png new file mode 100644 index 00000000..0ab70895 Binary files /dev/null and b/Minecraft.Client/Common/res/mob/zombie.png differ diff --git a/Minecraft.Client/Common/res/pack.png b/Minecraft.Client/Common/res/pack.png new file mode 100644 index 00000000..973a7cf2 Binary files /dev/null and b/Minecraft.Client/Common/res/pack.png differ diff --git a/Minecraft.Client/Common/res/particles.png b/Minecraft.Client/Common/res/particles.png new file mode 100644 index 00000000..e1ec7d2d Binary files /dev/null and b/Minecraft.Client/Common/res/particles.png differ diff --git a/Minecraft.Client/Common/res/terrain.png b/Minecraft.Client/Common/res/terrain.png new file mode 100644 index 00000000..244f7668 Binary files /dev/null and b/Minecraft.Client/Common/res/terrain.png differ diff --git a/Minecraft.Client/Common/res/terrain/moon.png b/Minecraft.Client/Common/res/terrain/moon.png new file mode 100644 index 00000000..61cebbc7 Binary files /dev/null and b/Minecraft.Client/Common/res/terrain/moon.png differ diff --git a/Minecraft.Client/Common/res/terrain/sun.png b/Minecraft.Client/Common/res/terrain/sun.png new file mode 100644 index 00000000..d3433441 Binary files /dev/null and b/Minecraft.Client/Common/res/terrain/sun.png differ diff --git a/Minecraft.Client/Common/res/title/black.png b/Minecraft.Client/Common/res/title/black.png new file mode 100644 index 00000000..dc2ad3e7 Binary files /dev/null and b/Minecraft.Client/Common/res/title/black.png differ diff --git a/Minecraft.Client/Common/res/title/mclogo.png b/Minecraft.Client/Common/res/title/mclogo.png new file mode 100644 index 00000000..752da0e7 Binary files /dev/null and b/Minecraft.Client/Common/res/title/mclogo.png differ diff --git a/Minecraft.Client/Common/res/title/mojang.png b/Minecraft.Client/Common/res/title/mojang.png new file mode 100644 index 00000000..829cfc45 Binary files /dev/null and b/Minecraft.Client/Common/res/title/mojang.png differ diff --git a/Minecraft.Client/Common/xuiscene_base.h b/Minecraft.Client/Common/xuiscene_base.h new file mode 100644 index 00000000..a4e71ad6 --- /dev/null +++ b/Minecraft.Client/Common/xuiscene_base.h @@ -0,0 +1,176 @@ +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" +#define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_TooltipsSmall L"TooltipsSmall" +#define IDC_SelectedItem L"SelectedItem" +#define IDC_SelectedItemSmall L"SelectedItemSmall" +#define IDC_TitleText L"TitleText" +#define IDC_ProgressBar1 L"ProgressBar1" +#define IDC_ProgressBar2 L"ProgressBar2" +#define IDC_ProgressBar3 L"ProgressBar3" +#define IDC_ProgressBar1_small L"ProgressBar1_small" +#define IDC_ProgressBar2_small L"ProgressBar2_small" +#define IDC_ProgressBar3_small L"ProgressBar3_small" +#define IDC_BossHealth L"BossHealth" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_XuiGamertag L"XuiGamertag" +#define IDC_BasePlayer3 L"BasePlayer3" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" +#define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_TooltipsSmall L"TooltipsSmall" +#define IDC_SelectedItem L"SelectedItem" +#define IDC_SelectedItemSmall L"SelectedItemSmall" +#define IDC_TitleText L"TitleText" +#define IDC_ProgressBar1 L"ProgressBar1" +#define IDC_ProgressBar2 L"ProgressBar2" +#define IDC_ProgressBar3 L"ProgressBar3" +#define IDC_ProgressBar1_small L"ProgressBar1_small" +#define IDC_ProgressBar2_small L"ProgressBar2_small" +#define IDC_ProgressBar3_small L"ProgressBar3_small" +#define IDC_BossHealth L"BossHealth" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_XuiGamertag L"XuiGamertag" +#define IDC_BasePlayer2 L"BasePlayer2" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" +#define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_TooltipsSmall L"TooltipsSmall" +#define IDC_SelectedItem L"SelectedItem" +#define IDC_SelectedItemSmall L"SelectedItemSmall" +#define IDC_TitleText L"TitleText" +#define IDC_ProgressBar1 L"ProgressBar1" +#define IDC_ProgressBar2 L"ProgressBar2" +#define IDC_ProgressBar3 L"ProgressBar3" +#define IDC_ProgressBar1_small L"ProgressBar1_small" +#define IDC_ProgressBar2_small L"ProgressBar2_small" +#define IDC_ProgressBar3_small L"ProgressBar3_small" +#define IDC_BossHealth L"BossHealth" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_XuiGamertag L"XuiGamertag" +#define IDC_BasePlayer1 L"BasePlayer1" +#define IDC_BottomLeftAnchorPoint L"BottomLeftAnchorPoint" +#define IDC_TopLeftAnchorPoint L"TopLeftAnchorPoint" +#define IDC_XuiDarkOverlay L"XuiDarkOverlay" +#define IDC_Background L"Background" +#define IDC_Logo L"Logo" +#define IDC_XuiSceneHudRoot L"XuiSceneHudRoot" +#define IDC_XuiSceneChatRoot L"XuiSceneChatRoot" +#define IDC_XuiSceneContainer L"XuiSceneContainer" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_Tooltips L"Tooltips" +#define IDC_LStick L"LStick" +#define IDC_LBButton L"LBButton" +#define IDC_RBButton L"RBButton" +#define IDC_RTrigger L"RTrigger" +#define IDC_LTrigger L"LTrigger" +#define IDC_YButton L"YButton" +#define IDC_XButton L"XButton" +#define IDC_BButton L"BButton" +#define IDC_AButton L"AButton" +#define IDC_TooltipsSmall L"TooltipsSmall" +#define IDC_SelectedItem L"SelectedItem" +#define IDC_SelectedItemSmall L"SelectedItemSmall" +#define IDC_TitleText L"TitleText" +#define IDC_ProgressBar1 L"ProgressBar1" +#define IDC_ProgressBar2 L"ProgressBar2" +#define IDC_ProgressBar3 L"ProgressBar3" +#define IDC_ProgressBar1_small L"ProgressBar1_small" +#define IDC_ProgressBar2_small L"ProgressBar2_small" +#define IDC_ProgressBar3_small L"ProgressBar3_small" +#define IDC_BossHealth L"BossHealth" +#define IDC_XuiSceneTutorialContainer L"XuiSceneTutorialContainer" +#define IDC_XuiGamertag L"XuiGamertag" +#define IDC_BasePlayer0 L"BasePlayer0" +#define IDC_XuiPressStartMessage L"XuiPressStartMessage" +#define IDC_XuiSceneDebugContainer L"XuiSceneDebugContainer" +#define IDC_XuiSavingIcon L"XuiSavingIcon" +#define IDC_XuiTrialTimer L"XuiTrialTimer" +#define IDC_SafeArea L"SafeArea" +#define IDC_XuiSoundXACTBack L"XuiSoundXACTBack" +#define IDC_XuiSoundXACTCraft L"XuiSoundXACTCraft" +#define IDC_XuiSoundXACTCraftFail L"XuiSoundXACTCraftFail" +#define IDC_XuiSoundXACTFocus L"XuiSoundXACTFocus" +#define IDC_XuiSoundXACTPress L"XuiSoundXACTPress" +#define IDC_XuiSoundXACTScroll L"XuiSoundXACTScroll" +#define IDC_XuiBaseScene L"XuiBaseScene" diff --git a/Minecraft.Client/Common/zlib/adler32.c b/Minecraft.Client/Common/zlib/adler32.c new file mode 100644 index 00000000..33d70c60 --- /dev/null +++ b/Minecraft.Client/Common/zlib/adler32.c @@ -0,0 +1,178 @@ +/* adler32.c -- compute the Adler-32 checksum of a data stream + * Copyright (C) 1995-2011 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ +#include "zutil.h" + +#define local static + +local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); + +#define BASE 65521 /* largest prime smaller than 65536 */ +#define NMAX 5552 +/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ + +#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} +#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); +#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); +#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); +#define DO16(buf) DO8(buf,0); DO8(buf,8); + +/* use NO_DIVIDE if your processor does not do division in hardware -- + try it both ways to see which is faster */ +#ifdef NO_DIVIDE +/* note that this assumes BASE is 65521, where 65536 % 65521 == 15 + (thank you to John Reiser for pointing this out) */ +# define CHOP(a) \ + do { \ + unsigned long tmp = a >> 16; \ + a &= 0xffffUL; \ + a += (tmp << 4) - tmp; \ + } while (0) +# define MOD28(a) \ + do { \ + CHOP(a); \ + if (a >= BASE) a -= BASE; \ + } while (0) +# define MOD(a) \ + do { \ + CHOP(a); \ + MOD28(a); \ + } while (0) +# define MOD63(a) \ + do { /* this assumes a is not negative */ \ + z_off64_t tmp = a >> 32; \ + a &= 0xffffffffL; \ + a += (tmp << 8) - (tmp << 5) + tmp; \ + tmp = a >> 16; \ + a &= 0xffffL; \ + a += (tmp << 4) - tmp; \ + tmp = a >> 16; \ + a &= 0xffffL; \ + a += (tmp << 4) - tmp; \ + if (a >= BASE) a -= BASE; \ + } while (0) +#else +# define MOD(a) a %= BASE +# define MOD28(a) a %= BASE +# define MOD63(a) a %= BASE +#endif + +/* ========================================================================= */ +uLong ZEXPORT adler32(adler, buf, len) + uLong adler; + const Bytef *buf; + uInt len; +{ + unsigned long sum2; + unsigned n; + + /* split Adler-32 into component sums */ + sum2 = (adler >> 16) & 0xffff; + adler &= 0xffff; + + /* in case user likes doing a byte at a time, keep it fast */ + if (len == 1) { + adler += buf[0]; + if (adler >= BASE) + adler -= BASE; + sum2 += adler; + if (sum2 >= BASE) + sum2 -= BASE; + return adler | (sum2 << 16); + } + + /* initial Adler-32 value (deferred check for len == 1 speed) */ + if (buf == Z_NULL) + return 1L; + + /* in case short lengths are provided, keep it somewhat fast */ + if (len < 16) { + while (len--) { + adler += *buf++; + sum2 += adler; + } + if (adler >= BASE) + adler -= BASE; + MOD28(sum2); /* only added so many BASE's */ + return adler | (sum2 << 16); + } + + /* do length NMAX blocks -- requires just one modulo operation */ + while (len >= NMAX) { + len -= NMAX; + n = NMAX / 16; /* NMAX is divisible by 16 */ + do { + DO16(buf); /* 16 sums unrolled */ + buf += 16; + } while (--n); + MOD(adler); + MOD(sum2); + } + + /* do remaining bytes (less than NMAX, still just one modulo) */ + if (len) { /* avoid modulos if none remaining */ + while (len >= 16) { + len -= 16; + DO16(buf); + buf += 16; + } + while (len--) { + adler += *buf++; + sum2 += adler; + } + MOD(adler); + MOD(sum2); + } + + /* return recombined sums */ + return adler | (sum2 << 16); +} + +/* ========================================================================= */ +local uLong adler32_combine_(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off64_t len2; +{ + unsigned long sum1; + unsigned long sum2; + unsigned rem; + + /* for negative len, return invalid adler32 as a clue for debugging */ + if (len2 < 0) + return 0xffffffffUL; + + /* the derivation of this formula is left as an exercise for the reader */ + MOD63(len2); /* assumes len2 >= 0 */ + rem = (unsigned)len2; + sum1 = adler1 & 0xffff; + sum2 = rem * sum1; + MOD(sum2); + sum1 += (adler2 & 0xffff) + BASE - 1; + sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; + if (sum1 >= BASE) sum1 -= BASE; + if (sum1 >= BASE) sum1 -= BASE; + if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1); + if (sum2 >= BASE) sum2 -= BASE; + return sum1 | (sum2 << 16); +} + +/* ========================================================================= */ +uLong ZEXPORT adler32_combine(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off_t len2; +{ + return adler32_combine_(adler1, adler2, len2); +} + +uLong ZEXPORT adler32_combine64(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off64_t len2; +{ + return adler32_combine_(adler1, adler2, len2); +} diff --git a/Minecraft.Client/Common/zlib/compress.c b/Minecraft.Client/Common/zlib/compress.c new file mode 100644 index 00000000..6f3f2593 --- /dev/null +++ b/Minecraft.Client/Common/zlib/compress.c @@ -0,0 +1,81 @@ +/* compress.c -- compress a memory buffer + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +/* =========================================================================== + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least 0.1% larger than sourceLen plus + 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ +int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; + int level; +{ + z_stream stream; + int err; + + stream.next_in = (z_const Bytef *)source; + stream.avail_in = (uInt)sourceLen; +#ifdef MAXSEG_64K + /* Check for source > 64K on 16-bit machine: */ + if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; +#endif + stream.next_out = dest; + stream.avail_out = (uInt)*destLen; + if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + stream.opaque = (voidpf)0; + + err = deflateInit(&stream, level); + if (err != Z_OK) return err; + + err = deflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + deflateEnd(&stream); + return err == Z_OK ? Z_BUF_ERROR : err; + } + *destLen = stream.total_out; + + err = deflateEnd(&stream); + return err; +} + +/* =========================================================================== + */ +int ZEXPORT compress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); +} + + +/* =========================================================================== + If the default memLevel or windowBits for deflateInit() is changed, then + this function needs to be updated. + */ +uLong ZEXPORT compressBound (sourceLen) + uLong sourceLen; +{ + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + + (sourceLen >> 25) + 13; +} diff --git a/Minecraft.Client/Common/zlib/crc32.c b/Minecraft.Client/Common/zlib/crc32.c new file mode 100644 index 00000000..979a7190 --- /dev/null +++ b/Minecraft.Client/Common/zlib/crc32.c @@ -0,0 +1,425 @@ +/* crc32.c -- compute the CRC-32 of a data stream + * Copyright (C) 1995-2006, 2010, 2011, 2012 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Thanks to Rodney Brown for his contribution of faster + * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing + * tables for updating the shift register in one step with three exclusive-ors + * instead of four steps with four exclusive-ors. This results in about a + * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. + */ + +/* @(#) $Id$ */ + +/* + Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore + protection on the static variables used to control the first-use generation + of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should + first call get_crc_table() to initialize the tables before allowing more than + one thread to use crc32(). + + DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h. + */ + +#ifdef MAKECRCH +# include +# ifndef DYNAMIC_CRC_TABLE +# define DYNAMIC_CRC_TABLE +# endif /* !DYNAMIC_CRC_TABLE */ +#endif /* MAKECRCH */ + +#include "zutil.h" /* for STDC and FAR definitions */ + +#define local static + +/* Definitions for doing the crc four data bytes at a time. */ +#if !defined(NOBYFOUR) && defined(Z_U4) +# define BYFOUR +#endif +#ifdef BYFOUR + local unsigned long crc32_little OF((unsigned long, + const unsigned char FAR *, unsigned)); + local unsigned long crc32_big OF((unsigned long, + const unsigned char FAR *, unsigned)); +# define TBLS 8 +#else +# define TBLS 1 +#endif /* BYFOUR */ + +/* Local functions for crc concatenation */ +local unsigned long gf2_matrix_times OF((unsigned long *mat, + unsigned long vec)); +local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); +local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2)); + + +#ifdef DYNAMIC_CRC_TABLE + +local volatile int crc_table_empty = 1; +local z_crc_t FAR crc_table[TBLS][256]; +local void make_crc_table OF((void)); +#ifdef MAKECRCH + local void write_table OF((FILE *, const z_crc_t FAR *)); +#endif /* MAKECRCH */ +/* + Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by + x (which is shifting right by one and adding x^32 mod p if the bit shifted + out is a one). We start with the highest power (least significant bit) of + q and repeat for all eight bits of q. + + The first table is simply the CRC of all possible eight bit values. This is + all the information needed to generate CRCs on data a byte at a time for all + combinations of CRC register values and incoming bytes. The remaining tables + allow for word-at-a-time CRC calculation for both big-endian and little- + endian machines, where a word is four bytes. +*/ +local void make_crc_table() +{ + z_crc_t c; + int n, k; + z_crc_t poly; /* polynomial exclusive-or pattern */ + /* terms of polynomial defining this crc (except x^32): */ + static volatile int first = 1; /* flag to limit concurrent making */ + static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; + + /* See if another task is already doing this (not thread-safe, but better + than nothing -- significantly reduces duration of vulnerability in + case the advice about DYNAMIC_CRC_TABLE is ignored) */ + if (first) { + first = 0; + + /* make exclusive-or pattern from polynomial (0xedb88320UL) */ + poly = 0; + for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++) + poly |= (z_crc_t)1 << (31 - p[n]); + + /* generate a crc for every 8-bit value */ + for (n = 0; n < 256; n++) { + c = (z_crc_t)n; + for (k = 0; k < 8; k++) + c = c & 1 ? poly ^ (c >> 1) : c >> 1; + crc_table[0][n] = c; + } + +#ifdef BYFOUR + /* generate crc for each value followed by one, two, and three zeros, + and then the byte reversal of those as well as the first table */ + for (n = 0; n < 256; n++) { + c = crc_table[0][n]; + crc_table[4][n] = ZSWAP32(c); + for (k = 1; k < 4; k++) { + c = crc_table[0][c & 0xff] ^ (c >> 8); + crc_table[k][n] = c; + crc_table[k + 4][n] = ZSWAP32(c); + } + } +#endif /* BYFOUR */ + + crc_table_empty = 0; + } + else { /* not first */ + /* wait for the other guy to finish (not efficient, but rare) */ + while (crc_table_empty) + ; + } + +#ifdef MAKECRCH + /* write out CRC tables to crc32.h */ + { + FILE *out; + + out = fopen("crc32.h", "w"); + if (out == NULL) return; + fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); + fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); + fprintf(out, "local const z_crc_t FAR "); + fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); + write_table(out, crc_table[0]); +# ifdef BYFOUR + fprintf(out, "#ifdef BYFOUR\n"); + for (k = 1; k < 8; k++) { + fprintf(out, " },\n {\n"); + write_table(out, crc_table[k]); + } + fprintf(out, "#endif\n"); +# endif /* BYFOUR */ + fprintf(out, " }\n};\n"); + fclose(out); + } +#endif /* MAKECRCH */ +} + +#ifdef MAKECRCH +local void write_table(out, table) + FILE *out; + const z_crc_t FAR *table; +{ + int n; + + for (n = 0; n < 256; n++) + fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", + (unsigned long)(table[n]), + n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); +} +#endif /* MAKECRCH */ + +#else /* !DYNAMIC_CRC_TABLE */ +/* ======================================================================== + * Tables of CRC-32s of all single-byte values, made by make_crc_table(). + */ +#include "crc32.h" +#endif /* DYNAMIC_CRC_TABLE */ + +/* ========================================================================= + * This function can be used by asm versions of crc32() + */ +const z_crc_t FAR * ZEXPORT get_crc_table() +{ +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + return (const z_crc_t FAR *)crc_table; +} + +/* ========================================================================= */ +#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) +#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 + +/* ========================================================================= */ +unsigned long ZEXPORT crc32(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + uInt len; +{ + if (buf == Z_NULL) return 0UL; + +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + +#ifdef BYFOUR + if (sizeof(void *) == sizeof(ptrdiff_t)) { + z_crc_t endian; + + endian = 1; + if (*((unsigned char *)(&endian))) + return crc32_little(crc, buf, len); + else + return crc32_big(crc, buf, len); + } +#endif /* BYFOUR */ + crc = crc ^ 0xffffffffUL; + while (len >= 8) { + DO8; + len -= 8; + } + if (len) do { + DO1; + } while (--len); + return crc ^ 0xffffffffUL; +} + +#ifdef BYFOUR + +/* ========================================================================= */ +#define DOLIT4 c ^= *buf4++; \ + c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ + crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] +#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 + +/* ========================================================================= */ +local unsigned long crc32_little(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + register z_crc_t c; + register const z_crc_t FAR *buf4; + + c = (z_crc_t)crc; + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + len--; + } + + buf4 = (const z_crc_t FAR *)(const void FAR *)buf; + while (len >= 32) { + DOLIT32; + len -= 32; + } + while (len >= 4) { + DOLIT4; + len -= 4; + } + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + } while (--len); + c = ~c; + return (unsigned long)c; +} + +/* ========================================================================= */ +#define DOBIG4 c ^= *++buf4; \ + c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ + crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] +#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 + +/* ========================================================================= */ +local unsigned long crc32_big(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + register z_crc_t c; + register const z_crc_t FAR *buf4; + + c = ZSWAP32((z_crc_t)crc); + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + len--; + } + + buf4 = (const z_crc_t FAR *)(const void FAR *)buf; + buf4--; + while (len >= 32) { + DOBIG32; + len -= 32; + } + while (len >= 4) { + DOBIG4; + len -= 4; + } + buf4++; + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + } while (--len); + c = ~c; + return (unsigned long)(ZSWAP32(c)); +} + +#endif /* BYFOUR */ + +#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ + +/* ========================================================================= */ +local unsigned long gf2_matrix_times(mat, vec) + unsigned long *mat; + unsigned long vec; +{ + unsigned long sum; + + sum = 0; + while (vec) { + if (vec & 1) + sum ^= *mat; + vec >>= 1; + mat++; + } + return sum; +} + +/* ========================================================================= */ +local void gf2_matrix_square(square, mat) + unsigned long *square; + unsigned long *mat; +{ + int n; + + for (n = 0; n < GF2_DIM; n++) + square[n] = gf2_matrix_times(mat, mat[n]); +} + +/* ========================================================================= */ +local uLong crc32_combine_(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off64_t len2; +{ + int n; + unsigned long row; + unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ + unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ + + /* degenerate case (also disallow negative lengths) */ + if (len2 <= 0) + return crc1; + + /* put operator for one zero bit in odd */ + odd[0] = 0xedb88320UL; /* CRC-32 polynomial */ + row = 1; + for (n = 1; n < GF2_DIM; n++) { + odd[n] = row; + row <<= 1; + } + + /* put operator for two zero bits in even */ + gf2_matrix_square(even, odd); + + /* put operator for four zero bits in odd */ + gf2_matrix_square(odd, even); + + /* apply len2 zeros to crc1 (first square will put the operator for one + zero byte, eight zero bits, in even) */ + do { + /* apply zeros operator for this bit of len2 */ + gf2_matrix_square(even, odd); + if (len2 & 1) + crc1 = gf2_matrix_times(even, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + if (len2 == 0) + break; + + /* another iteration of the loop with odd and even swapped */ + gf2_matrix_square(odd, even); + if (len2 & 1) + crc1 = gf2_matrix_times(odd, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + } while (len2 != 0); + + /* return combined crc */ + crc1 ^= crc2; + return crc1; +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off_t len2; +{ + return crc32_combine_(crc1, crc2, len2); +} + +uLong ZEXPORT crc32_combine64(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off64_t len2; +{ + return crc32_combine_(crc1, crc2, len2); +} diff --git a/Minecraft.Client/Common/zlib/crc32.h b/Minecraft.Client/Common/zlib/crc32.h new file mode 100644 index 00000000..9e0c7781 --- /dev/null +++ b/Minecraft.Client/Common/zlib/crc32.h @@ -0,0 +1,441 @@ +/* crc32.h -- tables for rapid CRC calculation + * Generated automatically by crc32.c + */ + +local const z_crc_t FAR crc_table[TBLS][256] = +{ + { + 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, + 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, + 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, + 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, + 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, + 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, + 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, + 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, + 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, + 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, + 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, + 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, + 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, + 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, + 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, + 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, + 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, + 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, + 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, + 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, + 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, + 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, + 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, + 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, + 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, + 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, + 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, + 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, + 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, + 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, + 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, + 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, + 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, + 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, + 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, + 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, + 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, + 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, + 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, + 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, + 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, + 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, + 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, + 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, + 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, + 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, + 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, + 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, + 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, + 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, + 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, + 0x2d02ef8dUL +#ifdef BYFOUR + }, + { + 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, + 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, + 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, + 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, + 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, + 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, + 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, + 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, + 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, + 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, + 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, + 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, + 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, + 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, + 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, + 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, + 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, + 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, + 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, + 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, + 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, + 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, + 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, + 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, + 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, + 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, + 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, + 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, + 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, + 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, + 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, + 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, + 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, + 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, + 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, + 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, + 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, + 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, + 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, + 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, + 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, + 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, + 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, + 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, + 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, + 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, + 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, + 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, + 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, + 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, + 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, + 0x9324fd72UL + }, + { + 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, + 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, + 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, + 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, + 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, + 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, + 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, + 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, + 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, + 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, + 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, + 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, + 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, + 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, + 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, + 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, + 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, + 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, + 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, + 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, + 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, + 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, + 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, + 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, + 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, + 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, + 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, + 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, + 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, + 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, + 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, + 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, + 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, + 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, + 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, + 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, + 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, + 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, + 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, + 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, + 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, + 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, + 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, + 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, + 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, + 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, + 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, + 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, + 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, + 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, + 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, + 0xbe9834edUL + }, + { + 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, + 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, + 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, + 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, + 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, + 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, + 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, + 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, + 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, + 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, + 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, + 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, + 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, + 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, + 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, + 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, + 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, + 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, + 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, + 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, + 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, + 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, + 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, + 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, + 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, + 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, + 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, + 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, + 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, + 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, + 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, + 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, + 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, + 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, + 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, + 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, + 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, + 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, + 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, + 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, + 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, + 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, + 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, + 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, + 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, + 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, + 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, + 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, + 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, + 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, + 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, + 0xde0506f1UL + }, + { + 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, + 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, + 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, + 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, + 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, + 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, + 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, + 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, + 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, + 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, + 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, + 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, + 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, + 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, + 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, + 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, + 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, + 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, + 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, + 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, + 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, + 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, + 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, + 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, + 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, + 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, + 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, + 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, + 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, + 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, + 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, + 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, + 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, + 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, + 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, + 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, + 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, + 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, + 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, + 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, + 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, + 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, + 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, + 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, + 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, + 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, + 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, + 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, + 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, + 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, + 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, + 0x8def022dUL + }, + { + 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, + 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, + 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, + 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, + 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, + 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, + 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, + 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, + 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, + 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, + 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, + 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, + 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, + 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, + 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, + 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, + 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, + 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, + 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, + 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, + 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, + 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, + 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, + 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, + 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, + 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, + 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, + 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, + 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, + 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, + 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, + 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, + 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, + 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, + 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, + 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, + 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, + 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, + 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, + 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, + 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, + 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, + 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, + 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, + 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, + 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, + 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, + 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, + 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, + 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, + 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, + 0x72fd2493UL + }, + { + 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, + 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, + 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, + 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, + 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, + 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, + 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, + 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, + 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, + 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, + 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, + 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, + 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, + 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, + 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, + 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, + 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, + 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, + 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, + 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, + 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, + 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, + 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, + 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, + 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, + 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, + 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, + 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, + 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, + 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, + 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, + 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, + 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, + 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, + 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, + 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, + 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, + 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, + 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, + 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, + 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, + 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, + 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, + 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, + 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, + 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, + 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, + 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, + 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, + 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, + 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, + 0xed3498beUL + }, + { + 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, + 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, + 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, + 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, + 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, + 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, + 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, + 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, + 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, + 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, + 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, + 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, + 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, + 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, + 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, + 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, + 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, + 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, + 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, + 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, + 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, + 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, + 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, + 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, + 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, + 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, + 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, + 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, + 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, + 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, + 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, + 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, + 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, + 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, + 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, + 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, + 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, + 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, + 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, + 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, + 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, + 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, + 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, + 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, + 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, + 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, + 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, + 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, + 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, + 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, + 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, + 0xf10605deUL +#endif + } +}; diff --git a/Minecraft.Client/Common/zlib/deflate.c b/Minecraft.Client/Common/zlib/deflate.c new file mode 100644 index 00000000..69695770 --- /dev/null +++ b/Minecraft.Client/Common/zlib/deflate.c @@ -0,0 +1,1967 @@ +/* deflate.c -- compress data using the deflation algorithm + * Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process depends on being able to identify portions + * of the input text which are identical to earlier input (within a + * sliding window trailing behind the input currently being processed). + * + * The most straightforward technique turns out to be the fastest for + * most input files: try all possible matches and select the longest. + * The key feature of this algorithm is that insertions into the string + * dictionary are very simple and thus fast, and deletions are avoided + * completely. Insertions are performed at each input character, whereas + * string matches are performed only when the previous match ends. So it + * is preferable to spend more time in matches to allow very fast string + * insertions and avoid deletions. The matching algorithm for small + * strings is inspired from that of Rabin & Karp. A brute force approach + * is used to find longer strings when a small match has been found. + * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze + * (by Leonid Broukhis). + * A previous version of this file used a more sophisticated algorithm + * (by Fiala and Greene) which is guaranteed to run in linear amortized + * time, but has a larger average cost, uses more memory and is patented. + * However the F&G algorithm may be faster for some highly redundant + * files if the parameter max_chain_length (described below) is too large. + * + * ACKNOWLEDGEMENTS + * + * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and + * I found it in 'freeze' written by Leonid Broukhis. + * Thanks to many people for bug reports and testing. + * + * REFERENCES + * + * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". + * Available in http://tools.ietf.org/html/rfc1951 + * + * A description of the Rabin and Karp algorithm is given in the book + * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. + * + * Fiala,E.R., and Greene,D.H. + * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 + * + */ + +/* @(#) $Id$ */ + +#include "deflate.h" + +const char deflate_copyright[] = + " deflate 1.2.8 Copyright 1995-2013 Jean-loup Gailly and Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* =========================================================================== + * Function prototypes. + */ +typedef enum { + need_more, /* block not completed, need more input or more output */ + block_done, /* block flush performed */ + finish_started, /* finish started, need only more output at next deflate */ + finish_done /* finish done, accept no more input or output */ +} block_state; + +typedef block_state (*compress_func) OF((deflate_state *s, int flush)); +/* Compression function. Returns the block state after the call. */ + +local void fill_window OF((deflate_state *s)); +local block_state deflate_stored OF((deflate_state *s, int flush)); +local block_state deflate_fast OF((deflate_state *s, int flush)); +#ifndef FASTEST +local block_state deflate_slow OF((deflate_state *s, int flush)); +#endif +local block_state deflate_rle OF((deflate_state *s, int flush)); +local block_state deflate_huff OF((deflate_state *s, int flush)); +local void lm_init OF((deflate_state *s)); +local void putShortMSB OF((deflate_state *s, uInt b)); +local void flush_pending OF((z_streamp strm)); +local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); +#ifdef ASMV + void match_init OF((void)); /* asm code initialization */ + uInt longest_match OF((deflate_state *s, IPos cur_match)); +#else +local uInt longest_match OF((deflate_state *s, IPos cur_match)); +#endif + +#ifdef DEBUG +local void check_match OF((deflate_state *s, IPos start, IPos match, + int length)); +#endif + +/* =========================================================================== + * Local data + */ + +#define NIL 0 +/* Tail of hash chains */ + +#ifndef TOO_FAR +# define TOO_FAR 4096 +#endif +/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ + +/* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ +typedef struct config_s { + ush good_length; /* reduce lazy search above this match length */ + ush max_lazy; /* do not perform lazy search above this match length */ + ush nice_length; /* quit search above this match length */ + ush max_chain; + compress_func func; +} config; + +#ifdef FASTEST +local const config configuration_table[2] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ +#else +local const config configuration_table[10] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ +/* 2 */ {4, 5, 16, 8, deflate_fast}, +/* 3 */ {4, 6, 32, 32, deflate_fast}, + +/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ +/* 5 */ {8, 16, 32, 32, deflate_slow}, +/* 6 */ {8, 16, 128, 128, deflate_slow}, +/* 7 */ {8, 32, 128, 256, deflate_slow}, +/* 8 */ {32, 128, 258, 1024, deflate_slow}, +/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ +#endif + +/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 + * For deflate_fast() (levels <= 3) good is ignored and lazy has a different + * meaning. + */ + +#define EQUAL 0 +/* result of memcmp for equal strings */ + +#ifndef NO_DUMMY_DECL +struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ +#endif + +/* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */ +#define RANK(f) (((f) << 1) - ((f) > 4 ? 9 : 0)) + +/* =========================================================================== + * Update a hash value with the given input byte + * IN assertion: all calls to to UPDATE_HASH are made with consecutive + * input characters, so that a running hash key can be computed from the + * previous key instead of complete recalculation each time. + */ +#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) + + +/* =========================================================================== + * Insert string str in the dictionary and set match_head to the previous head + * of the hash chain (the most recent string with same hash key). Return + * the previous length of the hash chain. + * If this file is compiled with -DFASTEST, the compression level is forced + * to 1, and no hash chains are maintained. + * IN assertion: all calls to to INSERT_STRING are made with consecutive + * input characters and the first MIN_MATCH bytes of str are valid + * (except for the last MIN_MATCH-1 bytes of the input file). + */ +#ifdef FASTEST +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#else +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#endif + +/* =========================================================================== + * Initialize the hash table (avoiding 64K overflow for 16 bit systems). + * prev[] will be initialized on the fly. + */ +#define CLEAR_HASH(s) \ + s->head[s->hash_size-1] = NIL; \ + zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); + +/* ========================================================================= */ +int ZEXPORT deflateInit_(strm, level, version, stream_size) + z_streamp strm; + int level; + const char *version; + int stream_size; +{ + return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, + Z_DEFAULT_STRATEGY, version, stream_size); + /* To do: ignore strm->next_in if we use it as window */ +} + +/* ========================================================================= */ +int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + version, stream_size) + z_streamp strm; + int level; + int method; + int windowBits; + int memLevel; + int strategy; + const char *version; + int stream_size; +{ + deflate_state *s; + int wrap = 1; + static const char my_version[] = ZLIB_VERSION; + + ushf *overlay; + /* We overlay pending_buf and d_buf+l_buf. This works since the average + * output size for (length,distance) codes is <= 24 bits. + */ + + if (version == Z_NULL || version[0] != my_version[0] || + stream_size != sizeof(z_stream)) { + return Z_VERSION_ERROR; + } + if (strm == Z_NULL) return Z_STREAM_ERROR; + + strm->msg = Z_NULL; + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + + if (windowBits < 0) { /* suppress zlib wrapper */ + wrap = 0; + windowBits = -windowBits; + } +#ifdef GZIP + else if (windowBits > 15) { + wrap = 2; /* write gzip wrapper instead */ + windowBits -= 16; + } +#endif + if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || + windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || + strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ + s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); + if (s == Z_NULL) return Z_MEM_ERROR; + strm->state = (struct internal_state FAR *)s; + s->strm = strm; + + s->wrap = wrap; + s->gzhead = Z_NULL; + s->w_bits = windowBits; + s->w_size = 1 << s->w_bits; + s->w_mask = s->w_size - 1; + + s->hash_bits = memLevel + 7; + s->hash_size = 1 << s->hash_bits; + s->hash_mask = s->hash_size - 1; + s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); + + s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); + s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); + s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); + + s->high_water = 0; /* nothing written to s->window yet */ + + s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ + + overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); + s->pending_buf = (uchf *) overlay; + s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); + + if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || + s->pending_buf == Z_NULL) { + s->status = FINISH_STATE; + strm->msg = ERR_MSG(Z_MEM_ERROR); + deflateEnd (strm); + return Z_MEM_ERROR; + } + s->d_buf = overlay + s->lit_bufsize/sizeof(ush); + s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; + + s->level = level; + s->strategy = strategy; + s->method = (Byte)method; + + return deflateReset(strm); +} + +/* ========================================================================= */ +int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) + z_streamp strm; + const Bytef *dictionary; + uInt dictLength; +{ + deflate_state *s; + uInt str, n; + int wrap; + unsigned avail; + z_const unsigned char *next; + + if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL) + return Z_STREAM_ERROR; + s = strm->state; + wrap = s->wrap; + if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead) + return Z_STREAM_ERROR; + + /* when using zlib wrappers, compute Adler-32 for provided dictionary */ + if (wrap == 1) + strm->adler = adler32(strm->adler, dictionary, dictLength); + s->wrap = 0; /* avoid computing Adler-32 in read_buf */ + + /* if dictionary would fill window, just replace the history */ + if (dictLength >= s->w_size) { + if (wrap == 0) { /* already empty otherwise */ + CLEAR_HASH(s); + s->strstart = 0; + s->block_start = 0L; + s->insert = 0; + } + dictionary += dictLength - s->w_size; /* use the tail */ + dictLength = s->w_size; + } + + /* insert dictionary into window and hash */ + avail = strm->avail_in; + next = strm->next_in; + strm->avail_in = dictLength; + strm->next_in = (z_const Bytef *)dictionary; + fill_window(s); + while (s->lookahead >= MIN_MATCH) { + str = s->strstart; + n = s->lookahead - (MIN_MATCH-1); + do { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + } while (--n); + s->strstart = str; + s->lookahead = MIN_MATCH-1; + fill_window(s); + } + s->strstart += s->lookahead; + s->block_start = (long)s->strstart; + s->insert = s->lookahead; + s->lookahead = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + strm->next_in = next; + strm->avail_in = avail; + s->wrap = wrap; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateResetKeep (strm) + z_streamp strm; +{ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { + return Z_STREAM_ERROR; + } + + strm->total_in = strm->total_out = 0; + strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ + strm->data_type = Z_UNKNOWN; + + s = (deflate_state *)strm->state; + s->pending = 0; + s->pending_out = s->pending_buf; + + if (s->wrap < 0) { + s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ + } + s->status = s->wrap ? INIT_STATE : BUSY_STATE; + strm->adler = +#ifdef GZIP + s->wrap == 2 ? crc32(0L, Z_NULL, 0) : +#endif + adler32(0L, Z_NULL, 0); + s->last_flush = Z_NO_FLUSH; + + _tr_init(s); + + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateReset (strm) + z_streamp strm; +{ + int ret; + + ret = deflateResetKeep(strm); + if (ret == Z_OK) + lm_init(strm->state); + return ret; +} + +/* ========================================================================= */ +int ZEXPORT deflateSetHeader (strm, head) + z_streamp strm; + gz_headerp head; +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (strm->state->wrap != 2) return Z_STREAM_ERROR; + strm->state->gzhead = head; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflatePending (strm, pending, bits) + unsigned *pending; + int *bits; + z_streamp strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (pending != Z_NULL) + *pending = strm->state->pending; + if (bits != Z_NULL) + *bits = strm->state->bi_valid; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflatePrime (strm, bits, value) + z_streamp strm; + int bits; + int value; +{ + deflate_state *s; + int put; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) + return Z_BUF_ERROR; + do { + put = Buf_size - s->bi_valid; + if (put > bits) + put = bits; + s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid); + s->bi_valid += put; + _tr_flush_bits(s); + value >>= put; + bits -= put; + } while (bits); + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateParams(strm, level, strategy) + z_streamp strm; + int level; + int strategy; +{ + deflate_state *s; + compress_func func; + int err = Z_OK; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + func = configuration_table[s->level].func; + + if ((strategy != s->strategy || func != configuration_table[level].func) && + strm->total_in != 0) { + /* Flush the last buffer: */ + err = deflate(strm, Z_BLOCK); + if (err == Z_BUF_ERROR && s->pending == 0) + err = Z_OK; + } + if (s->level != level) { + s->level = level; + s->max_lazy_match = configuration_table[level].max_lazy; + s->good_match = configuration_table[level].good_length; + s->nice_match = configuration_table[level].nice_length; + s->max_chain_length = configuration_table[level].max_chain; + } + s->strategy = strategy; + return err; +} + +/* ========================================================================= */ +int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) + z_streamp strm; + int good_length; + int max_lazy; + int nice_length; + int max_chain; +{ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + s->good_match = good_length; + s->max_lazy_match = max_lazy; + s->nice_match = nice_length; + s->max_chain_length = max_chain; + return Z_OK; +} + +/* ========================================================================= + * For the default windowBits of 15 and memLevel of 8, this function returns + * a close to exact, as well as small, upper bound on the compressed size. + * They are coded as constants here for a reason--if the #define's are + * changed, then this function needs to be changed as well. The return + * value for 15 and 8 only works for those exact settings. + * + * For any setting other than those defaults for windowBits and memLevel, + * the value returned is a conservative worst case for the maximum expansion + * resulting from using fixed blocks instead of stored blocks, which deflate + * can emit on compressed data for some combinations of the parameters. + * + * This function could be more sophisticated to provide closer upper bounds for + * every combination of windowBits and memLevel. But even the conservative + * upper bound of about 14% expansion does not seem onerous for output buffer + * allocation. + */ +uLong ZEXPORT deflateBound(strm, sourceLen) + z_streamp strm; + uLong sourceLen; +{ + deflate_state *s; + uLong complen, wraplen; + Bytef *str; + + /* conservative upper bound for compressed data */ + complen = sourceLen + + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; + + /* if can't get parameters, return conservative bound plus zlib wrapper */ + if (strm == Z_NULL || strm->state == Z_NULL) + return complen + 6; + + /* compute wrapper length */ + s = strm->state; + switch (s->wrap) { + case 0: /* raw deflate */ + wraplen = 0; + break; + case 1: /* zlib wrapper */ + wraplen = 6 + (s->strstart ? 4 : 0); + break; + case 2: /* gzip wrapper */ + wraplen = 18; + if (s->gzhead != Z_NULL) { /* user-supplied gzip header */ + if (s->gzhead->extra != Z_NULL) + wraplen += 2 + s->gzhead->extra_len; + str = s->gzhead->name; + if (str != Z_NULL) + do { + wraplen++; + } while (*str++); + str = s->gzhead->comment; + if (str != Z_NULL) + do { + wraplen++; + } while (*str++); + if (s->gzhead->hcrc) + wraplen += 2; + } + break; + default: /* for compiler happiness */ + wraplen = 6; + } + + /* if not default parameters, return conservative bound */ + if (s->w_bits != 15 || s->hash_bits != 8 + 7) + return complen + wraplen; + + /* default settings: return tight bound for that case */ + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + + (sourceLen >> 25) + 13 - 6 + wraplen; +} + +/* ========================================================================= + * Put a short in the pending buffer. The 16-bit value is put in MSB order. + * IN assertion: the stream state is correct and there is enough room in + * pending_buf. + */ +local void putShortMSB (s, b) + deflate_state *s; + uInt b; +{ + put_byte(s, (Byte)(b >> 8)); + put_byte(s, (Byte)(b & 0xff)); +} + +/* ========================================================================= + * Flush as much pending output as possible. All deflate() output goes + * through this function so some applications may wish to modify it + * to avoid allocating a large strm->next_out buffer and copying into it. + * (See also read_buf()). + */ +local void flush_pending(strm) + z_streamp strm; +{ + unsigned len; + deflate_state *s = strm->state; + + _tr_flush_bits(s); + len = s->pending; + if (len > strm->avail_out) len = strm->avail_out; + if (len == 0) return; + + zmemcpy(strm->next_out, s->pending_out, len); + strm->next_out += len; + s->pending_out += len; + strm->total_out += len; + strm->avail_out -= len; + s->pending -= len; + if (s->pending == 0) { + s->pending_out = s->pending_buf; + } +} + +/* ========================================================================= */ +int ZEXPORT deflate (strm, flush) + z_streamp strm; + int flush; +{ + int old_flush; /* value of flush param for previous deflate call */ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL || + flush > Z_BLOCK || flush < 0) { + return Z_STREAM_ERROR; + } + s = strm->state; + + if (strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0) || + (s->status == FINISH_STATE && flush != Z_FINISH)) { + ERR_RETURN(strm, Z_STREAM_ERROR); + } + if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); + + s->strm = strm; /* just in case */ + old_flush = s->last_flush; + s->last_flush = flush; + + /* Write the header */ + if (s->status == INIT_STATE) { +#ifdef GZIP + if (s->wrap == 2) { + strm->adler = crc32(0L, Z_NULL, 0); + put_byte(s, 31); + put_byte(s, 139); + put_byte(s, 8); + if (s->gzhead == Z_NULL) { + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, OS_CODE); + s->status = BUSY_STATE; + } + else { + put_byte(s, (s->gzhead->text ? 1 : 0) + + (s->gzhead->hcrc ? 2 : 0) + + (s->gzhead->extra == Z_NULL ? 0 : 4) + + (s->gzhead->name == Z_NULL ? 0 : 8) + + (s->gzhead->comment == Z_NULL ? 0 : 16) + ); + put_byte(s, (Byte)(s->gzhead->time & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, s->gzhead->os & 0xff); + if (s->gzhead->extra != Z_NULL) { + put_byte(s, s->gzhead->extra_len & 0xff); + put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); + } + if (s->gzhead->hcrc) + strm->adler = crc32(strm->adler, s->pending_buf, + s->pending); + s->gzindex = 0; + s->status = EXTRA_STATE; + } + } + else +#endif + { + uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; + uInt level_flags; + + if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) + level_flags = 0; + else if (s->level < 6) + level_flags = 1; + else if (s->level == 6) + level_flags = 2; + else + level_flags = 3; + header |= (level_flags << 6); + if (s->strstart != 0) header |= PRESET_DICT; + header += 31 - (header % 31); + + s->status = BUSY_STATE; + putShortMSB(s, header); + + /* Save the adler32 of the preset dictionary: */ + if (s->strstart != 0) { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + strm->adler = adler32(0L, Z_NULL, 0); + } + } +#ifdef GZIP + if (s->status == EXTRA_STATE) { + if (s->gzhead->extra != Z_NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + + while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) + break; + } + put_byte(s, s->gzhead->extra[s->gzindex]); + s->gzindex++; + } + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (s->gzindex == s->gzhead->extra_len) { + s->gzindex = 0; + s->status = NAME_STATE; + } + } + else + s->status = NAME_STATE; + } + if (s->status == NAME_STATE) { + if (s->gzhead->name != Z_NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + int val; + + do { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) { + val = 1; + break; + } + } + val = s->gzhead->name[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (val == 0) { + s->gzindex = 0; + s->status = COMMENT_STATE; + } + } + else + s->status = COMMENT_STATE; + } + if (s->status == COMMENT_STATE) { + if (s->gzhead->comment != Z_NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + int val; + + do { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) { + val = 1; + break; + } + } + val = s->gzhead->comment[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (val == 0) + s->status = HCRC_STATE; + } + else + s->status = HCRC_STATE; + } + if (s->status == HCRC_STATE) { + if (s->gzhead->hcrc) { + if (s->pending + 2 > s->pending_buf_size) + flush_pending(strm); + if (s->pending + 2 <= s->pending_buf_size) { + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + strm->adler = crc32(0L, Z_NULL, 0); + s->status = BUSY_STATE; + } + } + else + s->status = BUSY_STATE; + } +#endif + + /* Flush as much pending output as possible */ + if (s->pending != 0) { + flush_pending(strm); + if (strm->avail_out == 0) { + /* Since avail_out is 0, deflate will be called again with + * more output space, but possibly with both pending and + * avail_in equal to zero. There won't be anything to do, + * but this is not an error situation so make sure we + * return OK instead of BUF_ERROR at next call of deflate: + */ + s->last_flush = -1; + return Z_OK; + } + + /* Make sure there is something to do and avoid duplicate consecutive + * flushes. For repeated and useless calls with Z_FINISH, we keep + * returning Z_STREAM_END instead of Z_BUF_ERROR. + */ + } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) && + flush != Z_FINISH) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* User must not provide more input after the first FINISH: */ + if (s->status == FINISH_STATE && strm->avail_in != 0) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* Start a new block or continue the current one. + */ + if (strm->avail_in != 0 || s->lookahead != 0 || + (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { + block_state bstate; + + bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : + (s->strategy == Z_RLE ? deflate_rle(s, flush) : + (*(configuration_table[s->level].func))(s, flush)); + + if (bstate == finish_started || bstate == finish_done) { + s->status = FINISH_STATE; + } + if (bstate == need_more || bstate == finish_started) { + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ + } + return Z_OK; + /* If flush != Z_NO_FLUSH && avail_out == 0, the next call + * of deflate should use the same flush parameter to make sure + * that the flush is complete. So we don't have to output an + * empty block here, this will be done at next call. This also + * ensures that for a very small output buffer, we emit at most + * one empty block. + */ + } + if (bstate == block_done) { + if (flush == Z_PARTIAL_FLUSH) { + _tr_align(s); + } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ + _tr_stored_block(s, (char*)0, 0L, 0); + /* For a full flush, this empty block will be recognized + * as a special marker by inflate_sync(). + */ + if (flush == Z_FULL_FLUSH) { + CLEAR_HASH(s); /* forget history */ + if (s->lookahead == 0) { + s->strstart = 0; + s->block_start = 0L; + s->insert = 0; + } + } + } + flush_pending(strm); + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ + return Z_OK; + } + } + } + Assert(strm->avail_out > 0, "bug2"); + + if (flush != Z_FINISH) return Z_OK; + if (s->wrap <= 0) return Z_STREAM_END; + + /* Write the trailer */ +#ifdef GZIP + if (s->wrap == 2) { + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); + put_byte(s, (Byte)(strm->total_in & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); + } + else +#endif + { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + flush_pending(strm); + /* If avail_out is zero, the application will call deflate again + * to flush the rest. + */ + if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ + return s->pending != 0 ? Z_OK : Z_STREAM_END; +} + +/* ========================================================================= */ +int ZEXPORT deflateEnd (strm) + z_streamp strm; +{ + int status; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + + status = strm->state->status; + if (status != INIT_STATE && + status != EXTRA_STATE && + status != NAME_STATE && + status != COMMENT_STATE && + status != HCRC_STATE && + status != BUSY_STATE && + status != FINISH_STATE) { + return Z_STREAM_ERROR; + } + + /* Deallocate in reverse order of allocations: */ + TRY_FREE(strm, strm->state->pending_buf); + TRY_FREE(strm, strm->state->head); + TRY_FREE(strm, strm->state->prev); + TRY_FREE(strm, strm->state->window); + + ZFREE(strm, strm->state); + strm->state = Z_NULL; + + return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; +} + +/* ========================================================================= + * Copy the source state to the destination state. + * To simplify the source, this is not supported for 16-bit MSDOS (which + * doesn't have enough memory anyway to duplicate compression states). + */ +int ZEXPORT deflateCopy (dest, source) + z_streamp dest; + z_streamp source; +{ +#ifdef MAXSEG_64K + return Z_STREAM_ERROR; +#else + deflate_state *ds; + deflate_state *ss; + ushf *overlay; + + + if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { + return Z_STREAM_ERROR; + } + + ss = source->state; + + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); + + ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); + if (ds == Z_NULL) return Z_MEM_ERROR; + dest->state = (struct internal_state FAR *) ds; + zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state)); + ds->strm = dest; + + ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); + ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); + ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); + overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); + ds->pending_buf = (uchf *) overlay; + + if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || + ds->pending_buf == Z_NULL) { + deflateEnd (dest); + return Z_MEM_ERROR; + } + /* following zmemcpy do not work for 16-bit MSDOS */ + zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); + zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos)); + zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos)); + zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); + + ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); + ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); + ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; + + ds->l_desc.dyn_tree = ds->dyn_ltree; + ds->d_desc.dyn_tree = ds->dyn_dtree; + ds->bl_desc.dyn_tree = ds->bl_tree; + + return Z_OK; +#endif /* MAXSEG_64K */ +} + +/* =========================================================================== + * Read a new buffer from the current input stream, update the adler32 + * and total number of bytes read. All deflate() input goes through + * this function so some applications may wish to modify it to avoid + * allocating a large strm->next_in buffer and copying from it. + * (See also flush_pending()). + */ +local int read_buf(strm, buf, size) + z_streamp strm; + Bytef *buf; + unsigned size; +{ + unsigned len = strm->avail_in; + + if (len > size) len = size; + if (len == 0) return 0; + + strm->avail_in -= len; + + zmemcpy(buf, strm->next_in, len); + if (strm->state->wrap == 1) { + strm->adler = adler32(strm->adler, buf, len); + } +#ifdef GZIP + else if (strm->state->wrap == 2) { + strm->adler = crc32(strm->adler, buf, len); + } +#endif + strm->next_in += len; + strm->total_in += len; + + return (int)len; +} + +/* =========================================================================== + * Initialize the "longest match" routines for a new zlib stream + */ +local void lm_init (s) + deflate_state *s; +{ + s->window_size = (ulg)2L*s->w_size; + + CLEAR_HASH(s); + + /* Set the default configuration parameters: + */ + s->max_lazy_match = configuration_table[s->level].max_lazy; + s->good_match = configuration_table[s->level].good_length; + s->nice_match = configuration_table[s->level].nice_length; + s->max_chain_length = configuration_table[s->level].max_chain; + + s->strstart = 0; + s->block_start = 0L; + s->lookahead = 0; + s->insert = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + s->ins_h = 0; +#ifndef FASTEST +#ifdef ASMV + match_init(); /* initialize the asm code */ +#endif +#endif +} + +#ifndef FASTEST +/* =========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + * OUT assertion: the match length is not greater than s->lookahead. + */ +#ifndef ASMV +/* For 80x86 and 680x0, an optimized version will be provided in match.asm or + * match.S. The code will be functionally equivalent. + */ +local uInt longest_match(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + unsigned chain_length = s->max_chain_length;/* max hash chain length */ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + int best_len = s->prev_length; /* best match length so far */ + int nice_match = s->nice_match; /* stop if match long enough */ + IPos limit = s->strstart > (IPos)MAX_DIST(s) ? + s->strstart - (IPos)MAX_DIST(s) : NIL; + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ + Posf *prev = s->prev; + uInt wmask = s->w_mask; + +#ifdef UNALIGNED_OK + /* Compare two bytes at a time. Note: this is not always beneficial. + * Try with and without -DUNALIGNED_OK to check. + */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; + register ush scan_start = *(ushf*)scan; + register ush scan_end = *(ushf*)(scan+best_len-1); +#else + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + register Byte scan_end1 = scan[best_len-1]; + register Byte scan_end = scan[best_len]; +#endif + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + /* Do not waste too much time if we already have a good match: */ + if (s->prev_length >= s->good_match) { + chain_length >>= 2; + } + /* Do not look for matches beyond the end of the input. This is necessary + * to make deflate deterministic. + */ + if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + do { + Assert(cur_match < s->strstart, "no future"); + match = s->window + cur_match; + + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2. Note that the checks below + * for insufficient lookahead only occur occasionally for performance + * reasons. Therefore uninitialized memory will be accessed, and + * conditional jumps will be made that depend on those values. + * However the length of the match is limited to the lookahead, so + * the output of deflate is not affected by the uninitialized values. + */ +#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) + /* This code assumes sizeof(unsigned short) == 2. Do not use + * UNALIGNED_OK if your compiler uses a different size. + */ + if (*(ushf*)(match+best_len-1) != scan_end || + *(ushf*)match != scan_start) continue; + + /* It is not necessary to compare scan[2] and match[2] since they are + * always equal when the other bytes match, given that the hash keys + * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at + * strstart+3, +5, ... up to strstart+257. We check for insufficient + * lookahead only every 4th comparison; the 128th check will be made + * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is + * necessary to put more guard bytes at the end of the window, or + * to check more often for insufficient lookahead. + */ + Assert(scan[2] == match[2], "scan[2]?"); + scan++, match++; + do { + } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + scan < strend); + /* The funny "do {}" generates better code on most compilers */ + + /* Here, scan <= window+strstart+257 */ + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + if (*scan == *match) scan++; + + len = (MAX_MATCH - 1) - (int)(strend-scan); + scan = strend - (MAX_MATCH-1); + +#else /* UNALIGNED_OK */ + + if (match[best_len] != scan_end || + match[best_len-1] != scan_end1 || + *match != *scan || + *++match != scan[1]) continue; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match++; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + scan = strend - MAX_MATCH; + +#endif /* UNALIGNED_OK */ + + if (len > best_len) { + s->match_start = cur_match; + best_len = len; + if (len >= nice_match) break; +#ifdef UNALIGNED_OK + scan_end = *(ushf*)(scan+best_len-1); +#else + scan_end1 = scan[best_len-1]; + scan_end = scan[best_len]; +#endif + } + } while ((cur_match = prev[cur_match & wmask]) > limit + && --chain_length != 0); + + if ((uInt)best_len <= s->lookahead) return (uInt)best_len; + return s->lookahead; +} +#endif /* ASMV */ + +#else /* FASTEST */ + +/* --------------------------------------------------------------------------- + * Optimized version for FASTEST only + */ +local uInt longest_match(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + Assert(cur_match < s->strstart, "no future"); + + match = s->window + cur_match; + + /* Return failure if the match length is less than 2: + */ + if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match += 2; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + + if (len < MIN_MATCH) return MIN_MATCH - 1; + + s->match_start = cur_match; + return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; +} + +#endif /* FASTEST */ + +#ifdef DEBUG +/* =========================================================================== + * Check that the match at match_start is indeed a match. + */ +local void check_match(s, start, match, length) + deflate_state *s; + IPos start, match; + int length; +{ + /* check that the match is indeed a match */ + if (zmemcmp(s->window + match, + s->window + start, length) != EQUAL) { + fprintf(stderr, " start %u, match %u, length %d\n", + start, match, length); + do { + fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); + } while (--length != 0); + z_error("invalid match"); + } + if (z_verbose > 1) { + fprintf(stderr,"\\[%d,%d]", start-match, length); + do { putc(s->window[start++], stderr); } while (--length != 0); + } +} +#else +# define check_match(s, start, match, length) +#endif /* DEBUG */ + +/* =========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead. + * + * IN assertion: lookahead < MIN_LOOKAHEAD + * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + * At least one byte has been read, or avail_in == 0; reads are + * performed for at least two bytes (required for the zip translate_eol + * option -- not supported here). + */ +local void fill_window(s) + deflate_state *s; +{ + register unsigned n, m; + register Posf *p; + unsigned more; /* Amount of free space at the end of the window. */ + uInt wsize = s->w_size; + + Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); + + do { + more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); + + /* Deal with !@#$% 64K limit: */ + if (sizeof(int) <= 2) { + if (more == 0 && s->strstart == 0 && s->lookahead == 0) { + more = wsize; + + } else if (more == (unsigned)(-1)) { + /* Very unlikely, but possible on 16 bit machine if + * strstart == 0 && lookahead == 1 (input done a byte at time) + */ + more--; + } + } + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (s->strstart >= wsize+MAX_DIST(s)) { + + zmemcpy(s->window, s->window+wsize, (unsigned)wsize); + s->match_start -= wsize; + s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ + s->block_start -= (long) wsize; + + /* Slide the hash table (could be avoided with 32 bit values + at the expense of memory usage). We slide even when level == 0 + to keep the hash table consistent if we switch back to level > 0 + later. (Using level 0 permanently is not an optimal usage of + zlib, so we don't care about this pathological case.) + */ + n = s->hash_size; + p = &s->head[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m-wsize : NIL); + } while (--n); + + n = wsize; +#ifndef FASTEST + p = &s->prev[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m-wsize : NIL); + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + } while (--n); +#endif + more += wsize; + } + if (s->strm->avail_in == 0) break; + + /* If there was no sliding: + * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + * more == window_size - lookahead - strstart + * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + * => more >= window_size - 2*WSIZE + 2 + * In the BIG_MEM or MMAP case (not yet supported), + * window_size == input_size + MIN_LOOKAHEAD && + * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + * Otherwise, window_size == 2*WSIZE so more >= 2. + * If there was sliding, more >= WSIZE. So in all cases, more >= 2. + */ + Assert(more >= 2, "more < 2"); + + n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); + s->lookahead += n; + + /* Initialize the hash value now that we have some input: */ + if (s->lookahead + s->insert >= MIN_MATCH) { + uInt str = s->strstart - s->insert; + s->ins_h = s->window[str]; + UPDATE_HASH(s, s->ins_h, s->window[str + 1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + while (s->insert) { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + s->insert--; + if (s->lookahead + s->insert < MIN_MATCH) + break; + } + } + /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + * but this is not important since only literal bytes will be emitted. + */ + + } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); + + /* If the WIN_INIT bytes after the end of the current data have never been + * written, then zero those bytes in order to avoid memory check reports of + * the use of uninitialized (or uninitialised as Julian writes) bytes by + * the longest match routines. Update the high water mark for the next + * time through here. WIN_INIT is set to MAX_MATCH since the longest match + * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. + */ + if (s->high_water < s->window_size) { + ulg curr = s->strstart + (ulg)(s->lookahead); + ulg init; + + if (s->high_water < curr) { + /* Previous high water mark below current data -- zero WIN_INIT + * bytes or up to end of window, whichever is less. + */ + init = s->window_size - curr; + if (init > WIN_INIT) + init = WIN_INIT; + zmemzero(s->window + curr, (unsigned)init); + s->high_water = curr + init; + } + else if (s->high_water < (ulg)curr + WIN_INIT) { + /* High water mark at or above current data, but below current data + * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up + * to end of window, whichever is less. + */ + init = (ulg)curr + WIN_INIT - s->high_water; + if (init > s->window_size - s->high_water) + init = s->window_size - s->high_water; + zmemzero(s->window + s->high_water, (unsigned)init); + s->high_water += init; + } + } + + Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + "not enough room for search"); +} + +/* =========================================================================== + * Flush the current block, with given end-of-file flag. + * IN assertion: strstart is set to the end of the current match. + */ +#define FLUSH_BLOCK_ONLY(s, last) { \ + _tr_flush_block(s, (s->block_start >= 0L ? \ + (charf *)&s->window[(unsigned)s->block_start] : \ + (charf *)Z_NULL), \ + (ulg)((long)s->strstart - s->block_start), \ + (last)); \ + s->block_start = s->strstart; \ + flush_pending(s->strm); \ + Tracev((stderr,"[FLUSH]")); \ +} + +/* Same but force premature exit if necessary. */ +#define FLUSH_BLOCK(s, last) { \ + FLUSH_BLOCK_ONLY(s, last); \ + if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \ +} + +/* =========================================================================== + * Copy without compression as much as possible from the input stream, return + * the current block state. + * This function does not insert new strings in the dictionary since + * uncompressible data is probably not useful. This function is used + * only for the level=0 compression option. + * NOTE: this function should be optimized to avoid extra copying from + * window to pending_buf. + */ +local block_state deflate_stored(s, flush) + deflate_state *s; + int flush; +{ + /* Stored blocks are limited to 0xffff bytes, pending_buf is limited + * to pending_buf_size, and each stored block has a 5 byte header: + */ + ulg max_block_size = 0xffff; + ulg max_start; + + if (max_block_size > s->pending_buf_size - 5) { + max_block_size = s->pending_buf_size - 5; + } + + /* Copy as much as possible from input to output: */ + for (;;) { + /* Fill the window as much as possible: */ + if (s->lookahead <= 1) { + + Assert(s->strstart < s->w_size+MAX_DIST(s) || + s->block_start >= (long)s->w_size, "slide too late"); + + fill_window(s); + if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; + + if (s->lookahead == 0) break; /* flush the current block */ + } + Assert(s->block_start >= 0L, "block gone"); + + s->strstart += s->lookahead; + s->lookahead = 0; + + /* Emit a stored block if pending_buf will be full: */ + max_start = s->block_start + max_block_size; + if (s->strstart == 0 || (ulg)s->strstart >= max_start) { + /* strstart == 0 is possible when wraparound on 16-bit machine */ + s->lookahead = (uInt)(s->strstart - max_start); + s->strstart = (uInt)max_start; + FLUSH_BLOCK(s, 0); + } + /* Flush if we may have to slide, otherwise block_start may become + * negative and the data will be gone: + */ + if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { + FLUSH_BLOCK(s, 0); + } + } + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if ((long)s->strstart > s->block_start) + FLUSH_BLOCK(s, 0); + return block_done; +} + +/* =========================================================================== + * Compress as much as possible from the input stream, return the current + * block state. + * This function does not perform lazy evaluation of matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ +local block_state deflate_fast(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head; /* head of the hash chain */ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = NIL; + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s->match_length = longest_match (s, hash_head); + /* longest_match() sets match_start */ + } + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->match_start, s->match_length); + + _tr_tally_dist(s, s->strstart - s->match_start, + s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ +#ifndef FASTEST + if (s->match_length <= s->max_insert_length && + s->lookahead >= MIN_MATCH) { + s->match_length--; /* string at strstart already in table */ + do { + s->strstart++; + INSERT_STRING(s, s->strstart, hash_head); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. + */ + } while (--s->match_length != 0); + s->strstart++; + } else +#endif + { + s->strstart += s->match_length; + s->match_length = 0; + s->ins_h = s->window[s->strstart]; + UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not + * matter since it will be recomputed at next deflate call. + */ + } + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} + +#ifndef FASTEST +/* =========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ +local block_state deflate_slow(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head; /* head of hash chain */ + int bflush; /* set if current block must be flushed */ + + /* Process the input block. */ + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = NIL; + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + */ + s->prev_length = s->match_length, s->prev_match = s->match_start; + s->match_length = MIN_MATCH-1; + + if (hash_head != NIL && s->prev_length < s->max_lazy_match && + s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s->match_length = longest_match (s, hash_head); + /* longest_match() sets match_start */ + + if (s->match_length <= 5 && (s->strategy == Z_FILTERED +#if TOO_FAR <= 32767 + || (s->match_length == MIN_MATCH && + s->strstart - s->match_start > TOO_FAR) +#endif + )) { + + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + s->match_length = MIN_MATCH-1; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { + uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; + /* Do not insert strings in hash table beyond this. */ + + check_match(s, s->strstart-1, s->prev_match, s->prev_length); + + _tr_tally_dist(s, s->strstart -1 - s->prev_match, + s->prev_length - MIN_MATCH, bflush); + + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. If there is not + * enough lookahead, the last two strings are not inserted in + * the hash table. + */ + s->lookahead -= s->prev_length-1; + s->prev_length -= 2; + do { + if (++s->strstart <= max_insert) { + INSERT_STRING(s, s->strstart, hash_head); + } + } while (--s->prev_length != 0); + s->match_available = 0; + s->match_length = MIN_MATCH-1; + s->strstart++; + + if (bflush) FLUSH_BLOCK(s, 0); + + } else if (s->match_available) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + if (bflush) { + FLUSH_BLOCK_ONLY(s, 0); + } + s->strstart++; + s->lookahead--; + if (s->strm->avail_out == 0) return need_more; + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + s->match_available = 1; + s->strstart++; + s->lookahead--; + } + } + Assert (flush != Z_NO_FLUSH, "no flush?"); + if (s->match_available) { + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + s->match_available = 0; + } + s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} +#endif /* FASTEST */ + +/* =========================================================================== + * For Z_RLE, simply look for runs of bytes, generate matches only of distance + * one. Do not maintain a hash table. (It will be regenerated if this run of + * deflate switches away from Z_RLE.) + */ +local block_state deflate_rle(s, flush) + deflate_state *s; + int flush; +{ + int bflush; /* set if current block must be flushed */ + uInt prev; /* byte at distance one to match */ + Bytef *scan, *strend; /* scan goes up to strend for length of run */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the longest run, plus one for the unrolled loop. + */ + if (s->lookahead <= MAX_MATCH) { + fill_window(s); + if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* See how many times the previous byte repeats */ + s->match_length = 0; + if (s->lookahead >= MIN_MATCH && s->strstart > 0) { + scan = s->window + s->strstart - 1; + prev = *scan; + if (prev == *++scan && prev == *++scan && prev == *++scan) { + strend = s->window + s->strstart + MAX_MATCH; + do { + } while (prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + scan < strend); + s->match_length = MAX_MATCH - (int)(strend - scan); + if (s->match_length > s->lookahead) + s->match_length = s->lookahead; + } + Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); + } + + /* Emit match if have run of MIN_MATCH or longer, else emit literal */ + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->strstart - 1, s->match_length); + + _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + s->strstart += s->match_length; + s->match_length = 0; + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} + +/* =========================================================================== + * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. + * (It will be regenerated if this run of deflate switches away from Huffman.) + */ +local block_state deflate_huff(s, flush) + deflate_state *s; + int flush; +{ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we have a literal to write. */ + if (s->lookahead == 0) { + fill_window(s); + if (s->lookahead == 0) { + if (flush == Z_NO_FLUSH) + return need_more; + break; /* flush the current block */ + } + } + + /* Output a literal byte */ + s->match_length = 0; + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + if (bflush) FLUSH_BLOCK(s, 0); + } + s->insert = 0; + if (flush == Z_FINISH) { + FLUSH_BLOCK(s, 1); + return finish_done; + } + if (s->last_lit) + FLUSH_BLOCK(s, 0); + return block_done; +} diff --git a/Minecraft.Client/Common/zlib/deflate.h b/Minecraft.Client/Common/zlib/deflate.h new file mode 100644 index 00000000..ce0299ed --- /dev/null +++ b/Minecraft.Client/Common/zlib/deflate.h @@ -0,0 +1,346 @@ +/* deflate.h -- internal compression state + * Copyright (C) 1995-2012 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef DEFLATE_H +#define DEFLATE_H + +#include "zutil.h" + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer creation by deflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip encoding + should be left enabled. */ +#ifndef NO_GZIP +# define GZIP +#endif + +/* =========================================================================== + * Internal compression state. + */ + +#define LENGTH_CODES 29 +/* number of length codes, not counting the special END_BLOCK code */ + +#define LITERALS 256 +/* number of literal bytes 0..255 */ + +#define L_CODES (LITERALS+1+LENGTH_CODES) +/* number of Literal or Length codes, including the END_BLOCK code */ + +#define D_CODES 30 +/* number of distance codes */ + +#define BL_CODES 19 +/* number of codes used to transfer the bit lengths */ + +#define HEAP_SIZE (2*L_CODES+1) +/* maximum heap size */ + +#define MAX_BITS 15 +/* All codes must not exceed MAX_BITS bits */ + +#define Buf_size 16 +/* size of bit buffer in bi_buf */ + +#define INIT_STATE 42 +#define EXTRA_STATE 69 +#define NAME_STATE 73 +#define COMMENT_STATE 91 +#define HCRC_STATE 103 +#define BUSY_STATE 113 +#define FINISH_STATE 666 +/* Stream status */ + + +/* Data structure describing a single value and its code string. */ +typedef struct ct_data_s { + union { + ush freq; /* frequency count */ + ush code; /* bit string */ + } fc; + union { + ush dad; /* father node in Huffman tree */ + ush len; /* length of bit string */ + } dl; +} FAR ct_data; + +#define Freq fc.freq +#define Code fc.code +#define Dad dl.dad +#define Len dl.len + +typedef struct static_tree_desc_s static_tree_desc; + +typedef struct tree_desc_s { + ct_data *dyn_tree; /* the dynamic tree */ + int max_code; /* largest code with non zero frequency */ + static_tree_desc *stat_desc; /* the corresponding static tree */ +} FAR tree_desc; + +typedef ush Pos; +typedef Pos FAR Posf; +typedef unsigned IPos; + +/* A Pos is an index in the character window. We use short instead of int to + * save space in the various tables. IPos is used only for parameter passing. + */ + +typedef struct internal_state { + z_streamp strm; /* pointer back to this zlib stream */ + int status; /* as the name implies */ + Bytef *pending_buf; /* output still pending */ + ulg pending_buf_size; /* size of pending_buf */ + Bytef *pending_out; /* next pending byte to output to the stream */ + uInt pending; /* nb of bytes in the pending buffer */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + gz_headerp gzhead; /* gzip header information to write */ + uInt gzindex; /* where in extra, name, or comment */ + Byte method; /* can only be DEFLATED */ + int last_flush; /* value of flush param for previous deflate call */ + + /* used by deflate.c: */ + + uInt w_size; /* LZ77 window size (32K by default) */ + uInt w_bits; /* log2(w_size) (8..16) */ + uInt w_mask; /* w_size - 1 */ + + Bytef *window; + /* Sliding window. Input bytes are read into the second half of the window, + * and move to the first half later to keep a dictionary of at least wSize + * bytes. With this organization, matches are limited to a distance of + * wSize-MAX_MATCH bytes, but this ensures that IO is always + * performed with a length multiple of the block size. Also, it limits + * the window size to 64K, which is quite useful on MSDOS. + * To do: use the user input buffer as sliding window. + */ + + ulg window_size; + /* Actual size of window: 2*wSize, except when the user input buffer + * is directly used as sliding window. + */ + + Posf *prev; + /* Link to older string with same hash index. To limit the size of this + * array to 64K, this link is maintained only for the last 32K strings. + * An index in this array is thus a window index modulo 32K. + */ + + Posf *head; /* Heads of the hash chains or NIL. */ + + uInt ins_h; /* hash index of string to be inserted */ + uInt hash_size; /* number of elements in hash table */ + uInt hash_bits; /* log2(hash_size) */ + uInt hash_mask; /* hash_size-1 */ + + uInt hash_shift; + /* Number of bits by which ins_h must be shifted at each input + * step. It must be such that after MIN_MATCH steps, the oldest + * byte no longer takes part in the hash key, that is: + * hash_shift * MIN_MATCH >= hash_bits + */ + + long block_start; + /* Window position at the beginning of the current output block. Gets + * negative when the window is moved backwards. + */ + + uInt match_length; /* length of best match */ + IPos prev_match; /* previous match */ + int match_available; /* set if previous match exists */ + uInt strstart; /* start of string to insert */ + uInt match_start; /* start of matching string */ + uInt lookahead; /* number of valid bytes ahead in window */ + + uInt prev_length; + /* Length of the best match at previous step. Matches not greater than this + * are discarded. This is used in the lazy match evaluation. + */ + + uInt max_chain_length; + /* To speed up deflation, hash chains are never searched beyond this + * length. A higher limit improves compression ratio but degrades the + * speed. + */ + + uInt max_lazy_match; + /* Attempt to find a better match only when the current match is strictly + * smaller than this value. This mechanism is used only for compression + * levels >= 4. + */ +# define max_insert_length max_lazy_match + /* Insert new strings in the hash table only if the match length is not + * greater than this length. This saves time but degrades compression. + * max_insert_length is used only for compression levels <= 3. + */ + + int level; /* compression level (1..9) */ + int strategy; /* favor or force Huffman coding*/ + + uInt good_match; + /* Use a faster search when the previous match is longer than this */ + + int nice_match; /* Stop searching when current match exceeds this */ + + /* used by trees.c: */ + /* Didn't use ct_data typedef below to suppress compiler warning */ + struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ + struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ + struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ + + struct tree_desc_s l_desc; /* desc. for literal tree */ + struct tree_desc_s d_desc; /* desc. for distance tree */ + struct tree_desc_s bl_desc; /* desc. for bit length tree */ + + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ + int heap_len; /* number of elements in the heap */ + int heap_max; /* element of largest frequency */ + /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. + * The same heap array is used to build all trees. + */ + + uch depth[2*L_CODES+1]; + /* Depth of each subtree used as tie breaker for trees of equal frequency + */ + + uchf *l_buf; /* buffer for literals or lengths */ + + uInt lit_bufsize; + /* Size of match buffer for literals/lengths. There are 4 reasons for + * limiting lit_bufsize to 64K: + * - frequencies can be kept in 16 bit counters + * - if compression is not successful for the first block, all input + * data is still in the window so we can still emit a stored block even + * when input comes from standard input. (This can also be done for + * all blocks if lit_bufsize is not greater than 32K.) + * - if compression is not successful for a file smaller than 64K, we can + * even emit a stored file instead of a stored block (saving 5 bytes). + * This is applicable only for zip (not gzip or zlib). + * - creating new Huffman trees less frequently may not provide fast + * adaptation to changes in the input data statistics. (Take for + * example a binary file with poorly compressible code followed by + * a highly compressible string table.) Smaller buffer sizes give + * fast adaptation but have of course the overhead of transmitting + * trees more frequently. + * - I can't count above 4 + */ + + uInt last_lit; /* running index in l_buf */ + + ushf *d_buf; + /* Buffer for distances. To simplify the code, d_buf and l_buf have + * the same number of elements. To use different lengths, an extra flag + * array would be necessary. + */ + + ulg opt_len; /* bit length of current block with optimal trees */ + ulg static_len; /* bit length of current block with static trees */ + uInt matches; /* number of string matches in current block */ + uInt insert; /* bytes at end of window left to insert */ + +#ifdef DEBUG + ulg compressed_len; /* total bit length of compressed file mod 2^32 */ + ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ +#endif + + ush bi_buf; + /* Output buffer. bits are inserted starting at the bottom (least + * significant bits). + */ + int bi_valid; + /* Number of valid bits in bi_buf. All bits above the last valid bit + * are always zero. + */ + + ulg high_water; + /* High water mark offset in window for initialized bytes -- bytes above + * this are set to zero in order to avoid memory check warnings when + * longest match routines access bytes past the input. This is then + * updated to the new high water mark. + */ + +} FAR deflate_state; + +/* Output a byte on the stream. + * IN assertion: there is enough room in pending_buf. + */ +#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} + + +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +/* Minimum amount of lookahead, except at the end of the input file. + * See deflate.c for comments about the MIN_MATCH+1. + */ + +#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) +/* In order to simplify the code, particularly on 16 bit machines, match + * distances are limited to MAX_DIST instead of WSIZE. + */ + +#define WIN_INIT MAX_MATCH +/* Number of bytes after end of data in window to initialize in order to avoid + memory checker errors from longest match routines */ + + /* in trees.c */ +void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); +int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); +void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); +void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); +void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); +void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); + +#define d_code(dist) \ + ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) +/* Mapping from a distance to a distance code. dist is the distance - 1 and + * must not have side effects. _dist_code[256] and _dist_code[257] are never + * used. + */ + +#ifndef DEBUG +/* Inline versions of _tr_tally for speed: */ + +#if defined(GEN_TREES_H) || !defined(STDC) + extern uch ZLIB_INTERNAL _length_code[]; + extern uch ZLIB_INTERNAL _dist_code[]; +#else + extern const uch ZLIB_INTERNAL _length_code[]; + extern const uch ZLIB_INTERNAL _dist_code[]; +#endif + +# define _tr_tally_lit(s, c, flush) \ + { uch cc = (c); \ + s->d_buf[s->last_lit] = 0; \ + s->l_buf[s->last_lit++] = cc; \ + s->dyn_ltree[cc].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +# define _tr_tally_dist(s, distance, length, flush) \ + { uch len = (length); \ + ush dist = (distance); \ + s->d_buf[s->last_lit] = dist; \ + s->l_buf[s->last_lit++] = len; \ + dist--; \ + s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ + s->dyn_dtree[d_code(dist)].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +#else +# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) +# define _tr_tally_dist(s, distance, length, flush) \ + flush = _tr_tally(s, distance, length) +#endif + +#endif /* DEFLATE_H */ diff --git a/Minecraft.Client/Common/zlib/gzclose.c b/Minecraft.Client/Common/zlib/gzclose.c new file mode 100644 index 00000000..caeb99a3 --- /dev/null +++ b/Minecraft.Client/Common/zlib/gzclose.c @@ -0,0 +1,25 @@ +/* gzclose.c -- zlib gzclose() function + * Copyright (C) 2004, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* gzclose() is in a separate file so that it is linked in only if it is used. + That way the other gzclose functions can be used instead to avoid linking in + unneeded compression or decompression routines. */ +int ZEXPORT gzclose(file) + gzFile file; +{ +#ifndef NO_GZCOMPRESS + gz_statep state; + + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file); +#else + return gzclose_r(file); +#endif +} diff --git a/Minecraft.Client/Common/zlib/gzguts.h b/Minecraft.Client/Common/zlib/gzguts.h new file mode 100644 index 00000000..d87659d0 --- /dev/null +++ b/Minecraft.Client/Common/zlib/gzguts.h @@ -0,0 +1,209 @@ +/* gzguts.h -- zlib internal header definitions for gz* operations + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#ifdef _LARGEFILE64_SOURCE +# ifndef _LARGEFILE_SOURCE +# define _LARGEFILE_SOURCE 1 +# endif +# ifdef _FILE_OFFSET_BITS +# undef _FILE_OFFSET_BITS +# endif +#endif + +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include +#include "zlib.h" +#ifdef STDC +# include +# include +# include +#endif +#include + +#ifdef _WIN32 +# include +#endif + +#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32) +# include +#endif + +#ifdef WINAPI_FAMILY +# define open _open +# define read _read +# define write _write +# define close _close +#endif + +#ifdef NO_DEFLATE /* for compatibility with old definition */ +# define NO_GZCOMPRESS +#endif + +#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(__CYGWIN__) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif + +#ifndef HAVE_VSNPRINTF +# ifdef MSDOS +/* vsnprintf may exist on some MS-DOS compilers (DJGPP?), + but for now we just assume it doesn't. */ +# define NO_vsnprintf +# endif +# ifdef __TURBOC__ +# define NO_vsnprintf +# endif +# ifdef WIN32 +/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +# if !defined(vsnprintf) && !defined(NO_vsnprintf) +# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) +# define vsnprintf _vsnprintf +# endif +# endif +# endif +# ifdef __SASC +# define NO_vsnprintf +# endif +# ifdef VMS +# define NO_vsnprintf +# endif +# ifdef __OS400__ +# define NO_vsnprintf +# endif +# ifdef __MVS__ +# define NO_vsnprintf +# endif +#endif + +/* unlike snprintf (which is required in C99, yet still not supported by + Microsoft more than a decade later!), _snprintf does not guarantee null + termination of the result -- however this is only used in gzlib.c where + the result is assured to fit in the space provided */ +#ifdef _MSC_VER +# define snprintf _snprintf +#endif + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +/* gz* functions always use library allocation functions */ +#ifndef STDC + extern voidp malloc OF((uInt size)); + extern void free OF((voidpf ptr)); +#endif + +/* get errno and strerror definition */ +#if defined UNDER_CE +# include +# define zstrerror() gz_strwinerror((DWORD)GetLastError()) +#else +# ifndef NO_STRERROR +# include +# define zstrerror() strerror(errno) +# else +# define zstrerror() "stdio error (consult errno)" +# endif +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); +#endif + +/* default memLevel */ +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif + +/* default i/o buffer size -- double this for output when reading (this and + twice this must be able to fit in an unsigned type) */ +#define GZBUFSIZE 8192 + +/* gzip modes, also provide a little integrity check on the passed structure */ +#define GZ_NONE 0 +#define GZ_READ 7247 +#define GZ_WRITE 31153 +#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */ + +/* values for gz_state how */ +#define LOOK 0 /* look for a gzip header */ +#define COPY 1 /* copy input directly */ +#define GZIP 2 /* decompress a gzip stream */ + +/* internal gzip file state data structure */ +typedef struct { + /* exposed contents for gzgetc() macro */ + struct gzFile_s x; /* "x" for exposed */ + /* x.have: number of bytes available at x.next */ + /* x.next: next output data to deliver or write */ + /* x.pos: current position in uncompressed data */ + /* used for both reading and writing */ + int mode; /* see gzip modes above */ + int fd; /* file descriptor */ + char *path; /* path or fd for error messages */ + unsigned size; /* buffer size, zero if not allocated yet */ + unsigned want; /* requested buffer size, default is GZBUFSIZE */ + unsigned char *in; /* input buffer */ + unsigned char *out; /* output buffer (double-sized when reading) */ + int direct; /* 0 if processing gzip, 1 if transparent */ + /* just for reading */ + int how; /* 0: get header, 1: copy, 2: decompress */ + z_off64_t start; /* where the gzip data started, for rewinding */ + int eof; /* true if end of input file reached */ + int past; /* true if read requested past end */ + /* just for writing */ + int level; /* compression level */ + int strategy; /* compression strategy */ + /* seek request */ + z_off64_t skip; /* amount to skip (already rewound if backwards) */ + int seek; /* true if seek request pending */ + /* error information */ + int err; /* error code */ + char *msg; /* error message */ + /* zlib inflate or deflate stream */ + z_stream strm; /* stream structure in-place (not a pointer) */ +} gz_state; +typedef gz_state FAR *gz_statep; + +/* shared functions */ +void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); +#if defined UNDER_CE +char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); +#endif + +/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t + value -- needed when comparing unsigned to z_off64_t, which is signed + (possible z_off64_t types off_t, off64_t, and long are all signed) */ +#ifdef INT_MAX +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) +#else +unsigned ZLIB_INTERNAL gz_intmax OF((void)); +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) +#endif diff --git a/Minecraft.Client/Common/zlib/gzlib.c b/Minecraft.Client/Common/zlib/gzlib.c new file mode 100644 index 00000000..fae202ef --- /dev/null +++ b/Minecraft.Client/Common/zlib/gzlib.c @@ -0,0 +1,634 @@ +/* gzlib.c -- zlib functions common to reading and writing gzip files + * Copyright (C) 2004, 2010, 2011, 2012, 2013 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +#if defined(_WIN32) && !defined(__BORLANDC__) +# define LSEEK _lseeki64 +#else +#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +# define LSEEK lseek64 +#else +# define LSEEK lseek +#endif +#endif + +/* Local functions */ +local void gz_reset OF((gz_statep)); +local gzFile gz_open OF((const void *, int, const char *)); + +#if defined UNDER_CE + +/* Map the Windows error number in ERROR to a locale-dependent error message + string and return a pointer to it. Typically, the values for ERROR come + from GetLastError. + + The string pointed to shall not be modified by the application, but may be + overwritten by a subsequent call to gz_strwinerror + + The gz_strwinerror function does not change the current setting of + GetLastError. */ +char ZLIB_INTERNAL *gz_strwinerror (error) + DWORD error; +{ + static char buf[1024]; + + wchar_t *msgbuf; + DWORD lasterr = GetLastError(); + DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM + | FORMAT_MESSAGE_ALLOCATE_BUFFER, + NULL, + error, + 0, /* Default language */ + (LPVOID)&msgbuf, + 0, + NULL); + if (chars != 0) { + /* If there is an \r\n appended, zap it. */ + if (chars >= 2 + && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { + chars -= 2; + msgbuf[chars] = 0; + } + + if (chars > sizeof (buf) - 1) { + chars = sizeof (buf) - 1; + msgbuf[chars] = 0; + } + + wcstombs(buf, msgbuf, chars + 1); + LocalFree(msgbuf); + } + else { + sprintf(buf, "unknown win32 error (%ld)", error); + } + + SetLastError(lasterr); + return buf; +} + +#endif /* UNDER_CE */ + +/* Reset gzip file state */ +local void gz_reset(state) + gz_statep state; +{ + state->x.have = 0; /* no output data available */ + if (state->mode == GZ_READ) { /* for reading ... */ + state->eof = 0; /* not at end of file */ + state->past = 0; /* have not read past end yet */ + state->how = LOOK; /* look for gzip header */ + } + state->seek = 0; /* no seek request pending */ + gz_error(state, Z_OK, NULL); /* clear error */ + state->x.pos = 0; /* no uncompressed data yet */ + state->strm.avail_in = 0; /* no input data yet */ +} + +/* Open a gzip file either by name or file descriptor. */ +local gzFile gz_open(path, fd, mode) + const void *path; + int fd; + const char *mode; +{ + gz_statep state; + size_t len; + int oflag; +#ifdef O_CLOEXEC + int cloexec = 0; +#endif +#ifdef O_EXCL + int exclusive = 0; +#endif + + /* check input */ + if (path == NULL) + return NULL; + + /* allocate gzFile structure to return */ + state = (gz_statep)malloc(sizeof(gz_state)); + if (state == NULL) + return NULL; + state->size = 0; /* no buffers allocated yet */ + state->want = GZBUFSIZE; /* requested buffer size */ + state->msg = NULL; /* no error message yet */ + + /* interpret mode */ + state->mode = GZ_NONE; + state->level = Z_DEFAULT_COMPRESSION; + state->strategy = Z_DEFAULT_STRATEGY; + state->direct = 0; + while (*mode) { + if (*mode >= '0' && *mode <= '9') + state->level = *mode - '0'; + else + switch (*mode) { + case 'r': + state->mode = GZ_READ; + break; +#ifndef NO_GZCOMPRESS + case 'w': + state->mode = GZ_WRITE; + break; + case 'a': + state->mode = GZ_APPEND; + break; +#endif + case '+': /* can't read and write at the same time */ + free(state); + return NULL; + case 'b': /* ignore -- will request binary anyway */ + break; +#ifdef O_CLOEXEC + case 'e': + cloexec = 1; + break; +#endif +#ifdef O_EXCL + case 'x': + exclusive = 1; + break; +#endif + case 'f': + state->strategy = Z_FILTERED; + break; + case 'h': + state->strategy = Z_HUFFMAN_ONLY; + break; + case 'R': + state->strategy = Z_RLE; + break; + case 'F': + state->strategy = Z_FIXED; + break; + case 'T': + state->direct = 1; + break; + default: /* could consider as an error, but just ignore */ + ; + } + mode++; + } + + /* must provide an "r", "w", or "a" */ + if (state->mode == GZ_NONE) { + free(state); + return NULL; + } + + /* can't force transparent read */ + if (state->mode == GZ_READ) { + if (state->direct) { + free(state); + return NULL; + } + state->direct = 1; /* for empty file */ + } + + /* save the path name for error messages */ +#ifdef _WIN32 + if (fd == -2) { + len = wcstombs(NULL, path, 0); + if (len == (size_t)-1) + len = 0; + } + else +#endif + len = strlen((const char *)path); + state->path = (char *)malloc(len + 1); + if (state->path == NULL) { + free(state); + return NULL; + } +#ifdef _WIN32 + if (fd == -2) + if (len) + wcstombs(state->path, path, len + 1); + else + *(state->path) = 0; + else +#endif +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(state->path, len + 1, "%s", (const char *)path); +#else + strcpy(state->path, path); +#endif + + /* compute the flags for open() */ + oflag = +#ifdef O_LARGEFILE + O_LARGEFILE | +#endif +#ifdef O_BINARY + O_BINARY | +#endif +#ifdef O_CLOEXEC + (cloexec ? O_CLOEXEC : 0) | +#endif + (state->mode == GZ_READ ? + O_RDONLY : + (O_WRONLY | O_CREAT | +#ifdef O_EXCL + (exclusive ? O_EXCL : 0) | +#endif + (state->mode == GZ_WRITE ? + O_TRUNC : + O_APPEND))); + + /* open the file with the appropriate flags (or just use fd) */ + state->fd = fd > -1 ? fd : ( +#ifdef _WIN32 + fd == -2 ? _wopen(path, oflag, 0666) : +#endif + open((const char *)path, oflag, 0666)); + if (state->fd == -1) { + free(state->path); + free(state); + return NULL; + } + if (state->mode == GZ_APPEND) + state->mode = GZ_WRITE; /* simplify later checks */ + + /* save the current position for rewinding (only if reading) */ + if (state->mode == GZ_READ) { + state->start = LSEEK(state->fd, 0, SEEK_CUR); + if (state->start == -1) state->start = 0; + } + + /* initialize stream */ + gz_reset(state); + + /* return stream */ + return (gzFile)state; +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzopen(path, mode) + const char *path; + const char *mode; +{ + return gz_open(path, -1, mode); +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzopen64(path, mode) + const char *path; + const char *mode; +{ + return gz_open(path, -1, mode); +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzdopen(fd, mode) + int fd; + const char *mode; +{ + char *path; /* identifier for error messages */ + gzFile gz; + + if (fd == -1 || (path = (char *)malloc(7 + 3 * sizeof(int))) == NULL) + return NULL; +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(path, 7 + 3 * sizeof(int), "", fd); /* for debugging */ +#else + sprintf(path, "", fd); /* for debugging */ +#endif + gz = gz_open(path, fd, mode); + free(path); + return gz; +} + +/* -- see zlib.h -- */ +#ifdef _WIN32 +gzFile ZEXPORT gzopen_w(path, mode) + const wchar_t *path; + const char *mode; +{ + return gz_open(path, -2, mode); +} +#endif + +/* -- see zlib.h -- */ +int ZEXPORT gzbuffer(file, size) + gzFile file; + unsigned size; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* make sure we haven't already allocated memory */ + if (state->size != 0) + return -1; + + /* check and set requested size */ + if (size < 2) + size = 2; /* need two bytes to check magic header */ + state->want = size; + return 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzrewind(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* back up and start over */ + if (LSEEK(state->fd, state->start, SEEK_SET) == -1) + return -1; + gz_reset(state); + return 0; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gzseek64(file, offset, whence) + gzFile file; + z_off64_t offset; + int whence; +{ + unsigned n; + z_off64_t ret; + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* check that there's no error */ + if (state->err != Z_OK && state->err != Z_BUF_ERROR) + return -1; + + /* can only seek from start or relative to current position */ + if (whence != SEEK_SET && whence != SEEK_CUR) + return -1; + + /* normalize offset to a SEEK_CUR specification */ + if (whence == SEEK_SET) + offset -= state->x.pos; + else if (state->seek) + offset += state->skip; + state->seek = 0; + + /* if within raw area while reading, just go there */ + if (state->mode == GZ_READ && state->how == COPY && + state->x.pos + offset >= 0) { + ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR); + if (ret == -1) + return -1; + state->x.have = 0; + state->eof = 0; + state->past = 0; + state->seek = 0; + gz_error(state, Z_OK, NULL); + state->strm.avail_in = 0; + state->x.pos += offset; + return state->x.pos; + } + + /* calculate skip amount, rewinding if needed for back seek when reading */ + if (offset < 0) { + if (state->mode != GZ_READ) /* writing -- can't go backwards */ + return -1; + offset += state->x.pos; + if (offset < 0) /* before start of file! */ + return -1; + if (gzrewind(file) == -1) /* rewind, then skip to offset */ + return -1; + } + + /* if reading, skip what's in output buffer (one less gzgetc() check) */ + if (state->mode == GZ_READ) { + n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ? + (unsigned)offset : state->x.have; + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + offset -= n; + } + + /* request skip (if not zero) */ + if (offset) { + state->seek = 1; + state->skip = offset; + } + return state->x.pos + offset; +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gzseek(file, offset, whence) + gzFile file; + z_off_t offset; + int whence; +{ + z_off64_t ret; + + ret = gzseek64(file, (z_off64_t)offset, whence); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gztell64(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* return position */ + return state->x.pos + (state->seek ? state->skip : 0); +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gztell(file) + gzFile file; +{ + z_off64_t ret; + + ret = gztell64(file); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gzoffset64(file) + gzFile file; +{ + z_off64_t offset; + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* compute and return effective offset in file */ + offset = LSEEK(state->fd, 0, SEEK_CUR); + if (offset == -1) + return -1; + if (state->mode == GZ_READ) /* reading */ + offset -= state->strm.avail_in; /* don't count buffered input */ + return offset; +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gzoffset(file) + gzFile file; +{ + z_off64_t ret; + + ret = gzoffset64(file); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzeof(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return 0; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return 0; + + /* return end-of-file state */ + return state->mode == GZ_READ ? state->past : 0; +} + +/* -- see zlib.h -- */ +const char * ZEXPORT gzerror(file, errnum) + gzFile file; + int *errnum; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return NULL; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return NULL; + + /* return error information */ + if (errnum != NULL) + *errnum = state->err; + return state->err == Z_MEM_ERROR ? "out of memory" : + (state->msg == NULL ? "" : state->msg); +} + +/* -- see zlib.h -- */ +void ZEXPORT gzclearerr(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return; + + /* clear error and end-of-file */ + if (state->mode == GZ_READ) { + state->eof = 0; + state->past = 0; + } + gz_error(state, Z_OK, NULL); +} + +/* Create an error message in allocated memory and set state->err and + state->msg accordingly. Free any previous error message already there. Do + not try to free or allocate space if the error is Z_MEM_ERROR (out of + memory). Simply save the error message as a static string. If there is an + allocation failure constructing the error message, then convert the error to + out of memory. */ +void ZLIB_INTERNAL gz_error(state, err, msg) + gz_statep state; + int err; + const char *msg; +{ + /* free previously allocated message and clear */ + if (state->msg != NULL) { + if (state->err != Z_MEM_ERROR) + free(state->msg); + state->msg = NULL; + } + + /* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */ + if (err != Z_OK && err != Z_BUF_ERROR) + state->x.have = 0; + + /* set error code, and if no message, then done */ + state->err = err; + if (msg == NULL) + return; + + /* for an out of memory error, return literal string when requested */ + if (err == Z_MEM_ERROR) + return; + + /* construct error message with path */ + if ((state->msg = (char *)malloc(strlen(state->path) + strlen(msg) + 3)) == + NULL) { + state->err = Z_MEM_ERROR; + return; + } +#if !defined(NO_snprintf) && !defined(NO_vsnprintf) + snprintf(state->msg, strlen(state->path) + strlen(msg) + 3, + "%s%s%s", state->path, ": ", msg); +#else + strcpy(state->msg, state->path); + strcat(state->msg, ": "); + strcat(state->msg, msg); +#endif + return; +} + +#ifndef INT_MAX +/* portably return maximum value for an int (when limits.h presumed not + available) -- we need to do this to cover cases where 2's complement not + used, since C standard permits 1's complement and sign-bit representations, + otherwise we could just use ((unsigned)-1) >> 1 */ +unsigned ZLIB_INTERNAL gz_intmax() +{ + unsigned p, q; + + p = 1; + do { + q = p; + p <<= 1; + p++; + } while (p > q); + return q >> 1; +} +#endif diff --git a/Minecraft.Client/Common/zlib/gzread.c b/Minecraft.Client/Common/zlib/gzread.c new file mode 100644 index 00000000..bf4538eb --- /dev/null +++ b/Minecraft.Client/Common/zlib/gzread.c @@ -0,0 +1,594 @@ +/* gzread.c -- zlib functions for reading gzip files + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* Local functions */ +local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); +local int gz_avail OF((gz_statep)); +local int gz_look OF((gz_statep)); +local int gz_decomp OF((gz_statep)); +local int gz_fetch OF((gz_statep)); +local int gz_skip OF((gz_statep, z_off64_t)); + +/* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from + state->fd, and update state->eof, state->err, and state->msg as appropriate. + This function needs to loop on read(), since read() is not guaranteed to + read the number of bytes requested, depending on the type of descriptor. */ +local int gz_load(state, buf, len, have) + gz_statep state; + unsigned char *buf; + unsigned len; + unsigned *have; +{ + int ret; + + *have = 0; + do { + ret = read(state->fd, buf + *have, len - *have); + if (ret <= 0) + break; + *have += ret; + } while (*have < len); + if (ret < 0) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + if (ret == 0) + state->eof = 1; + return 0; +} + +/* Load up input buffer and set eof flag if last data loaded -- return -1 on + error, 0 otherwise. Note that the eof flag is set when the end of the input + file is reached, even though there may be unused data in the buffer. Once + that data has been used, no more attempts will be made to read the file. + If strm->avail_in != 0, then the current data is moved to the beginning of + the input buffer, and then the remainder of the buffer is loaded with the + available data from the input file. */ +local int gz_avail(state) + gz_statep state; +{ + unsigned got; + z_streamp strm = &(state->strm); + + if (state->err != Z_OK && state->err != Z_BUF_ERROR) + return -1; + if (state->eof == 0) { + if (strm->avail_in) { /* copy what's there to the start */ + unsigned char *p = state->in; + unsigned const char *q = strm->next_in; + unsigned n = strm->avail_in; + do { + *p++ = *q++; + } while (--n); + } + if (gz_load(state, state->in + strm->avail_in, + state->size - strm->avail_in, &got) == -1) + return -1; + strm->avail_in += got; + strm->next_in = state->in; + } + return 0; +} + +/* Look for gzip header, set up for inflate or copy. state->x.have must be 0. + If this is the first time in, allocate required memory. state->how will be + left unchanged if there is no more input data available, will be set to COPY + if there is no gzip header and direct copying will be performed, or it will + be set to GZIP for decompression. If direct copying, then leftover input + data from the input buffer will be copied to the output buffer. In that + case, all further file reads will be directly to either the output buffer or + a user buffer. If decompressing, the inflate state will be initialized. + gz_look() will return 0 on success or -1 on failure. */ +local int gz_look(state) + gz_statep state; +{ + z_streamp strm = &(state->strm); + + /* allocate read buffers and inflate memory */ + if (state->size == 0) { + /* allocate buffers */ + state->in = (unsigned char *)malloc(state->want); + state->out = (unsigned char *)malloc(state->want << 1); + if (state->in == NULL || state->out == NULL) { + if (state->out != NULL) + free(state->out); + if (state->in != NULL) + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + state->size = state->want; + + /* allocate inflate memory */ + state->strm.zalloc = Z_NULL; + state->strm.zfree = Z_NULL; + state->strm.opaque = Z_NULL; + state->strm.avail_in = 0; + state->strm.next_in = Z_NULL; + if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) { /* gunzip */ + free(state->out); + free(state->in); + state->size = 0; + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + } + + /* get at least the magic bytes in the input buffer */ + if (strm->avail_in < 2) { + if (gz_avail(state) == -1) + return -1; + if (strm->avail_in == 0) + return 0; + } + + /* look for gzip magic bytes -- if there, do gzip decoding (note: there is + a logical dilemma here when considering the case of a partially written + gzip file, to wit, if a single 31 byte is written, then we cannot tell + whether this is a single-byte file, or just a partially written gzip + file -- for here we assume that if a gzip file is being written, then + the header will be written in a single operation, so that reading a + single byte is sufficient indication that it is not a gzip file) */ + if (strm->avail_in > 1 && + strm->next_in[0] == 31 && strm->next_in[1] == 139) { + inflateReset(strm); + state->how = GZIP; + state->direct = 0; + return 0; + } + + /* no gzip header -- if we were decoding gzip before, then this is trailing + garbage. Ignore the trailing garbage and finish. */ + if (state->direct == 0) { + strm->avail_in = 0; + state->eof = 1; + state->x.have = 0; + return 0; + } + + /* doing raw i/o, copy any leftover input to output -- this assumes that + the output buffer is larger than the input buffer, which also assures + space for gzungetc() */ + state->x.next = state->out; + if (strm->avail_in) { + memcpy(state->x.next, strm->next_in, strm->avail_in); + state->x.have = strm->avail_in; + strm->avail_in = 0; + } + state->how = COPY; + state->direct = 1; + return 0; +} + +/* Decompress from input to the provided next_out and avail_out in the state. + On return, state->x.have and state->x.next point to the just decompressed + data. If the gzip stream completes, state->how is reset to LOOK to look for + the next gzip stream or raw data, once state->x.have is depleted. Returns 0 + on success, -1 on failure. */ +local int gz_decomp(state) + gz_statep state; +{ + int ret = Z_OK; + unsigned had; + z_streamp strm = &(state->strm); + + /* fill output buffer up to end of deflate stream */ + had = strm->avail_out; + do { + /* get more input for inflate() */ + if (strm->avail_in == 0 && gz_avail(state) == -1) + return -1; + if (strm->avail_in == 0) { + gz_error(state, Z_BUF_ERROR, "unexpected end of file"); + break; + } + + /* decompress and handle errors */ + ret = inflate(strm, Z_NO_FLUSH); + if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) { + gz_error(state, Z_STREAM_ERROR, + "internal error: inflate stream corrupt"); + return -1; + } + if (ret == Z_MEM_ERROR) { + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + if (ret == Z_DATA_ERROR) { /* deflate stream invalid */ + gz_error(state, Z_DATA_ERROR, + strm->msg == NULL ? "compressed data error" : strm->msg); + return -1; + } + } while (strm->avail_out && ret != Z_STREAM_END); + + /* update available output */ + state->x.have = had - strm->avail_out; + state->x.next = strm->next_out - state->x.have; + + /* if the gzip stream completed successfully, look for another */ + if (ret == Z_STREAM_END) + state->how = LOOK; + + /* good decompression */ + return 0; +} + +/* Fetch data and put it in the output buffer. Assumes state->x.have is 0. + Data is either copied from the input file or decompressed from the input + file depending on state->how. If state->how is LOOK, then a gzip header is + looked for to determine whether to copy or decompress. Returns -1 on error, + otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the + end of the input file has been reached and all data has been processed. */ +local int gz_fetch(state) + gz_statep state; +{ + z_streamp strm = &(state->strm); + + do { + switch(state->how) { + case LOOK: /* -> LOOK, COPY (only if never GZIP), or GZIP */ + if (gz_look(state) == -1) + return -1; + if (state->how == LOOK) + return 0; + break; + case COPY: /* -> COPY */ + if (gz_load(state, state->out, state->size << 1, &(state->x.have)) + == -1) + return -1; + state->x.next = state->out; + return 0; + case GZIP: /* -> GZIP or LOOK (if end of gzip stream) */ + strm->avail_out = state->size << 1; + strm->next_out = state->out; + if (gz_decomp(state) == -1) + return -1; + } + } while (state->x.have == 0 && (!state->eof || strm->avail_in)); + return 0; +} + +/* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */ +local int gz_skip(state, len) + gz_statep state; + z_off64_t len; +{ + unsigned n; + + /* skip over len bytes or reach end-of-file, whichever comes first */ + while (len) + /* skip over whatever is in output buffer */ + if (state->x.have) { + n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ? + (unsigned)len : state->x.have; + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + len -= n; + } + + /* output buffer empty -- return if we're at the end of the input */ + else if (state->eof && state->strm.avail_in == 0) + break; + + /* need more data to skip -- load up output buffer */ + else { + /* get more output, looking for header if required */ + if (gz_fetch(state) == -1) + return -1; + } + return 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzread(file, buf, len) + gzFile file; + voidp buf; + unsigned len; +{ + unsigned got, n; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* since an int is returned, make sure len fits in one, otherwise return + with an error (this avoids the flaw in the interface) */ + if ((int)len < 0) { + gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); + return -1; + } + + /* if len is zero, avoid unnecessary operations */ + if (len == 0) + return 0; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return -1; + } + + /* get len bytes to buf, or less than len if at the end */ + got = 0; + do { + /* first just try copying data from the output buffer */ + if (state->x.have) { + n = state->x.have > len ? len : state->x.have; + memcpy(buf, state->x.next, n); + state->x.next += n; + state->x.have -= n; + } + + /* output buffer empty -- return if we're at the end of the input */ + else if (state->eof && strm->avail_in == 0) { + state->past = 1; /* tried to read past end */ + break; + } + + /* need output data -- for small len or new stream load up our output + buffer */ + else if (state->how == LOOK || len < (state->size << 1)) { + /* get more output, looking for header if required */ + if (gz_fetch(state) == -1) + return -1; + continue; /* no progress yet -- go back to copy above */ + /* the copy above assures that we will leave with space in the + output buffer, allowing at least one gzungetc() to succeed */ + } + + /* large len -- read directly into user buffer */ + else if (state->how == COPY) { /* read directly */ + if (gz_load(state, (unsigned char *)buf, len, &n) == -1) + return -1; + } + + /* large len -- decompress directly into user buffer */ + else { /* state->how == GZIP */ + strm->avail_out = len; + strm->next_out = (unsigned char *)buf; + if (gz_decomp(state) == -1) + return -1; + n = state->x.have; + state->x.have = 0; + } + + /* update progress */ + len -= n; + buf = (char *)buf + n; + got += n; + state->x.pos += n; + } while (len); + + /* return number of bytes read into user buffer (will fit in int) */ + return (int)got; +} + +/* -- see zlib.h -- */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +#else +# undef gzgetc +#endif +int ZEXPORT gzgetc(file) + gzFile file; +{ + int ret; + unsigned char buf[1]; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* try output buffer (no need to check for skip request) */ + if (state->x.have) { + state->x.have--; + state->x.pos++; + return *(state->x.next)++; + } + + /* nothing there -- try gzread() */ + ret = gzread(file, buf, 1); + return ret < 1 ? -1 : buf[0]; +} + +int ZEXPORT gzgetc_(file) +gzFile file; +{ + return gzgetc(file); +} + +/* -- see zlib.h -- */ +int ZEXPORT gzungetc(c, file) + int c; + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return -1; + } + + /* can't push EOF */ + if (c < 0) + return -1; + + /* if output buffer empty, put byte at end (allows more pushing) */ + if (state->x.have == 0) { + state->x.have = 1; + state->x.next = state->out + (state->size << 1) - 1; + state->x.next[0] = c; + state->x.pos--; + state->past = 0; + return c; + } + + /* if no room, give up (must have already done a gzungetc()) */ + if (state->x.have == (state->size << 1)) { + gz_error(state, Z_DATA_ERROR, "out of room to push characters"); + return -1; + } + + /* slide output data if needed and insert byte before existing data */ + if (state->x.next == state->out) { + unsigned char *src = state->out + state->x.have; + unsigned char *dest = state->out + (state->size << 1); + while (src > state->out) + *--dest = *--src; + state->x.next = dest; + } + state->x.have++; + state->x.next--; + state->x.next[0] = c; + state->x.pos--; + state->past = 0; + return c; +} + +/* -- see zlib.h -- */ +char * ZEXPORT gzgets(file, buf, len) + gzFile file; + char *buf; + int len; +{ + unsigned left, n; + char *str; + unsigned char *eol; + gz_statep state; + + /* check parameters and get internal structure */ + if (file == NULL || buf == NULL || len < 1) + return NULL; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return NULL; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return NULL; + } + + /* copy output bytes up to new line or len - 1, whichever comes first -- + append a terminating zero to the string (we don't check for a zero in + the contents, let the user worry about that) */ + str = buf; + left = (unsigned)len - 1; + if (left) do { + /* assure that something is in the output buffer */ + if (state->x.have == 0 && gz_fetch(state) == -1) + return NULL; /* error */ + if (state->x.have == 0) { /* end of file */ + state->past = 1; /* read past end */ + break; /* return what we have */ + } + + /* look for end-of-line in current output buffer */ + n = state->x.have > left ? left : state->x.have; + eol = (unsigned char *)memchr(state->x.next, '\n', n); + if (eol != NULL) + n = (unsigned)(eol - state->x.next) + 1; + + /* copy through end-of-line, or remainder if not found */ + memcpy(buf, state->x.next, n); + state->x.have -= n; + state->x.next += n; + state->x.pos += n; + left -= n; + buf += n; + } while (left && eol == NULL); + + /* return terminated string, or if nothing, end of file */ + if (buf == str) + return NULL; + buf[0] = 0; + return str; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzdirect(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* if the state is not known, but we can find out, then do so (this is + mainly for right after a gzopen() or gzdopen()) */ + if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0) + (void)gz_look(state); + + /* return 1 if transparent, 0 if processing a gzip stream */ + return state->direct; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzclose_r(file) + gzFile file; +{ + int ret, err; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + /* check that we're reading */ + if (state->mode != GZ_READ) + return Z_STREAM_ERROR; + + /* free memory and close file */ + if (state->size) { + inflateEnd(&(state->strm)); + free(state->out); + free(state->in); + } + err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK; + gz_error(state, Z_OK, NULL); + free(state->path); + ret = close(state->fd); + free(state); + return ret ? Z_ERRNO : err; +} diff --git a/Minecraft.Client/Common/zlib/gzwrite.c b/Minecraft.Client/Common/zlib/gzwrite.c new file mode 100644 index 00000000..aa767fbf --- /dev/null +++ b/Minecraft.Client/Common/zlib/gzwrite.c @@ -0,0 +1,577 @@ +/* gzwrite.c -- zlib functions for writing gzip files + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* Local functions */ +local int gz_init OF((gz_statep)); +local int gz_comp OF((gz_statep, int)); +local int gz_zero OF((gz_statep, z_off64_t)); + +/* Initialize state for writing a gzip file. Mark initialization by setting + state->size to non-zero. Return -1 on failure or 0 on success. */ +local int gz_init(state) + gz_statep state; +{ + int ret; + z_streamp strm = &(state->strm); + + /* allocate input buffer */ + state->in = (unsigned char *)malloc(state->want); + if (state->in == NULL) { + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + + /* only need output buffer and deflate state if compressing */ + if (!state->direct) { + /* allocate output buffer */ + state->out = (unsigned char *)malloc(state->want); + if (state->out == NULL) { + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + + /* allocate deflate memory, set up for gzip compression */ + strm->zalloc = Z_NULL; + strm->zfree = Z_NULL; + strm->opaque = Z_NULL; + ret = deflateInit2(strm, state->level, Z_DEFLATED, + MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy); + if (ret != Z_OK) { + free(state->out); + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + } + + /* mark state as initialized */ + state->size = state->want; + + /* initialize write buffer if compressing */ + if (!state->direct) { + strm->avail_out = state->size; + strm->next_out = state->out; + state->x.next = strm->next_out; + } + return 0; +} + +/* Compress whatever is at avail_in and next_in and write to the output file. + Return -1 if there is an error writing to the output file, otherwise 0. + flush is assumed to be a valid deflate() flush value. If flush is Z_FINISH, + then the deflate() state is reset to start a new gzip stream. If gz->direct + is true, then simply write to the output file without compressing, and + ignore flush. */ +local int gz_comp(state, flush) + gz_statep state; + int flush; +{ + int ret, got; + unsigned have; + z_streamp strm = &(state->strm); + + /* allocate memory if this is the first time through */ + if (state->size == 0 && gz_init(state) == -1) + return -1; + + /* write directly if requested */ + if (state->direct) { + got = write(state->fd, strm->next_in, strm->avail_in); + if (got < 0 || (unsigned)got != strm->avail_in) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + strm->avail_in = 0; + return 0; + } + + /* run deflate() on provided input until it produces no more output */ + ret = Z_OK; + do { + /* write out current buffer contents if full, or if flushing, but if + doing Z_FINISH then don't write until we get to Z_STREAM_END */ + if (strm->avail_out == 0 || (flush != Z_NO_FLUSH && + (flush != Z_FINISH || ret == Z_STREAM_END))) { + have = (unsigned)(strm->next_out - state->x.next); + if (have && ((got = write(state->fd, state->x.next, have)) < 0 || + (unsigned)got != have)) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + if (strm->avail_out == 0) { + strm->avail_out = state->size; + strm->next_out = state->out; + } + state->x.next = strm->next_out; + } + + /* compress */ + have = strm->avail_out; + ret = deflate(strm, flush); + if (ret == Z_STREAM_ERROR) { + gz_error(state, Z_STREAM_ERROR, + "internal error: deflate stream corrupt"); + return -1; + } + have -= strm->avail_out; + } while (have); + + /* if that completed a deflate stream, allow another to start */ + if (flush == Z_FINISH) + deflateReset(strm); + + /* all done, no errors */ + return 0; +} + +/* Compress len zeros to output. Return -1 on error, 0 on success. */ +local int gz_zero(state, len) + gz_statep state; + z_off64_t len; +{ + int first; + unsigned n; + z_streamp strm = &(state->strm); + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return -1; + + /* compress len zeros (len guaranteed > 0) */ + first = 1; + while (len) { + n = GT_OFF(state->size) || (z_off64_t)state->size > len ? + (unsigned)len : state->size; + if (first) { + memset(state->in, 0, n); + first = 0; + } + strm->avail_in = n; + strm->next_in = state->in; + state->x.pos += n; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return -1; + len -= n; + } + return 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzwrite(file, buf, len) + gzFile file; + voidpc buf; + unsigned len; +{ + unsigned put = len; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* since an int is returned, make sure len fits in one, otherwise return + with an error (this avoids the flaw in the interface) */ + if ((int)len < 0) { + gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); + return 0; + } + + /* if len is zero, avoid unnecessary operations */ + if (len == 0) + return 0; + + /* allocate memory if this is the first time through */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* for small len, copy to input buffer, otherwise compress directly */ + if (len < state->size) { + /* copy to input buffer, compress when full */ + do { + unsigned have, copy; + + if (strm->avail_in == 0) + strm->next_in = state->in; + have = (unsigned)((strm->next_in + strm->avail_in) - state->in); + copy = state->size - have; + if (copy > len) + copy = len; + memcpy(state->in + have, buf, copy); + strm->avail_in += copy; + state->x.pos += copy; + buf = (const char *)buf + copy; + len -= copy; + if (len && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + } while (len); + } + else { + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* directly compress user buffer to file */ + strm->avail_in = len; + strm->next_in = (z_const Bytef *)buf; + state->x.pos += len; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + } + + /* input was all buffered or compressed (put will fit in int) */ + return (int)put; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzputc(file, c) + gzFile file; + int c; +{ + unsigned have; + unsigned char buf[1]; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return -1; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return -1; + } + + /* try writing to input buffer for speed (state->size == 0 if buffer not + initialized) */ + if (state->size) { + if (strm->avail_in == 0) + strm->next_in = state->in; + have = (unsigned)((strm->next_in + strm->avail_in) - state->in); + if (have < state->size) { + state->in[have] = c; + strm->avail_in++; + state->x.pos++; + return c & 0xff; + } + } + + /* no room in buffer or not initialized, use gz_write() */ + buf[0] = c; + if (gzwrite(file, buf, 1) != 1) + return -1; + return c & 0xff; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzputs(file, str) + gzFile file; + const char *str; +{ + int ret; + unsigned len; + + /* write string */ + len = (unsigned)strlen(str); + ret = gzwrite(file, str, len); + return ret == 0 && len != 0 ? -1 : ret; +} + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +#include + +/* -- see zlib.h -- */ +int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) +{ + int size, len; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* make sure we have some buffer space */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* do the printf() into the input buffer, put length in len */ + size = (int)(state->size); + state->in[size - 1] = 0; +#ifdef NO_vsnprintf +# ifdef HAS_vsprintf_void + (void)vsprintf((char *)(state->in), format, va); + for (len = 0; len < size; len++) + if (state->in[len] == 0) break; +# else + len = vsprintf((char *)(state->in), format, va); +# endif +#else +# ifdef HAS_vsnprintf_void + (void)vsnprintf((char *)(state->in), size, format, va); + len = strlen((char *)(state->in)); +# else + len = vsnprintf((char *)(state->in), size, format, va); +# endif +#endif + + /* check that printf() results fit in buffer */ + if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) + return 0; + + /* update buffer and position, defer compression until needed */ + strm->avail_in = (unsigned)len; + strm->next_in = state->in; + state->x.pos += len; + return len; +} + +int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) +{ + va_list va; + int ret; + + va_start(va, format); + ret = gzvprintf(file, format, va); + va_end(va); + return ret; +} + +#else /* !STDC && !Z_HAVE_STDARG_H */ + +/* -- see zlib.h -- */ +int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + gzFile file; + const char *format; + int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; +{ + int size, len; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that can really pass pointer in ints */ + if (sizeof(int) != sizeof(void *)) + return 0; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* make sure we have some buffer space */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* do the printf() into the input buffer, put length in len */ + size = (int)(state->size); + state->in[size - 1] = 0; +#ifdef NO_snprintf +# ifdef HAS_sprintf_void + sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + for (len = 0; len < size; len++) + if (state->in[len] == 0) break; +# else + len = sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#else +# ifdef HAS_snprintf_void + snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = strlen((char *)(state->in)); +# else + len = snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, + a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, + a19, a20); +# endif +#endif + + /* check that printf() results fit in buffer */ + if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) + return 0; + + /* update buffer and position, defer compression until needed */ + strm->avail_in = (unsigned)len; + strm->next_in = state->in; + state->x.pos += len; + return len; +} + +#endif + +/* -- see zlib.h -- */ +int ZEXPORT gzflush(file, flush) + gzFile file; + int flush; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* check flush parameter */ + if (flush < 0 || flush > Z_FINISH) + return Z_STREAM_ERROR; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return -1; + } + + /* compress remaining data with requested flush */ + gz_comp(state, flush); + return state->err; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzsetparams(file, level, strategy) + gzFile file; + int level; + int strategy; +{ + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* if no change is requested, then do nothing */ + if (level == state->level && strategy == state->strategy) + return Z_OK; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return -1; + } + + /* change compression parameters for subsequent input */ + if (state->size) { + /* flush previous input with previous parameters before changing */ + if (strm->avail_in && gz_comp(state, Z_PARTIAL_FLUSH) == -1) + return state->err; + deflateParams(strm, level, strategy); + } + state->level = level; + state->strategy = strategy; + return Z_OK; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzclose_w(file) + gzFile file; +{ + int ret = Z_OK; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + /* check that we're writing */ + if (state->mode != GZ_WRITE) + return Z_STREAM_ERROR; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + ret = state->err; + } + + /* flush, free memory, and close file */ + if (gz_comp(state, Z_FINISH) == -1) + ret = state->err; + if (state->size) { + if (!state->direct) { + (void)deflateEnd(&(state->strm)); + free(state->out); + } + free(state->in); + } + gz_error(state, Z_OK, NULL); + free(state->path); + if (close(state->fd) == -1) + ret = Z_ERRNO; + free(state); + return ret; +} diff --git a/Minecraft.Client/Common/zlib/infback.c b/Minecraft.Client/Common/zlib/infback.c new file mode 100644 index 00000000..f3833c2e --- /dev/null +++ b/Minecraft.Client/Common/zlib/infback.c @@ -0,0 +1,640 @@ +/* infback.c -- inflate using a call-back interface + * Copyright (C) 1995-2011 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + This code is largely copied from inflate.c. Normally either infback.o or + inflate.o would be linked into an application--not both. The interface + with inffast.c is retained so that optimized assembler-coded versions of + inflate_fast() can be used with either inflate.c or infback.c. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); + +/* + strm provides memory allocation functions in zalloc and zfree, or + Z_NULL to use the library memory allocation functions. + + windowBits is in the range 8..15, and window is a user-supplied + window and output buffer that is 2**windowBits bytes. + */ +int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size) +z_streamp strm; +int windowBits; +unsigned char FAR *window; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL || window == Z_NULL || + windowBits < 8 || windowBits > 15) + return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + state = (struct inflate_state FAR *)ZALLOC(strm, 1, + sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->dmax = 32768U; + state->wbits = windowBits; + state->wsize = 1U << windowBits; + state->window = window; + state->wnext = 0; + state->whave = 0; + return Z_OK; +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +/* Macros for inflateBack(): */ + +/* Load returned state from inflate_fast() */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Set state from registers for inflate_fast() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Assure that some input is available. If input is requested, but denied, + then return a Z_BUF_ERROR from inflateBack(). */ +#define PULL() \ + do { \ + if (have == 0) { \ + have = in(in_desc, &next); \ + if (have == 0) { \ + next = Z_NULL; \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflateBack() + with an error if there is no input available. */ +#define PULLBYTE() \ + do { \ + PULL(); \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflateBack() with + an error. */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Assure that some output space is available, by writing out the window + if it's full. If the write fails, return from inflateBack() with a + Z_BUF_ERROR. */ +#define ROOM() \ + do { \ + if (left == 0) { \ + put = state->window; \ + left = state->wsize; \ + state->whave = left; \ + if (out(out_desc, put, left)) { \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* + strm provides the memory allocation functions and window buffer on input, + and provides information on the unused input on return. For Z_DATA_ERROR + returns, strm will also provide an error message. + + in() and out() are the call-back input and output functions. When + inflateBack() needs more input, it calls in(). When inflateBack() has + filled the window with output, or when it completes with data in the + window, it calls out() to write out the data. The application must not + change the provided input until in() is called again or inflateBack() + returns. The application must not change the window/output buffer until + inflateBack() returns. + + in() and out() are called with a descriptor parameter provided in the + inflateBack() call. This parameter can be a structure that provides the + information required to do the read or write, as well as accumulated + information on the input and output such as totals and check values. + + in() should return zero on failure. out() should return non-zero on + failure. If either in() or out() fails, than inflateBack() returns a + Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it + was in() or out() that caused in the error. Otherwise, inflateBack() + returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format + error, or Z_MEM_ERROR if it could not allocate memory for the state. + inflateBack() can also return Z_STREAM_ERROR if the input parameters + are not correct, i.e. strm is Z_NULL or the state was not initialized. + */ +int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc) +z_streamp strm; +in_func in; +void FAR *in_desc; +out_func out; +void FAR *out_desc; +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + /* Check that the strm exists and that the state was initialized */ + if (strm == Z_NULL || strm->state == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* Reset the state */ + strm->msg = Z_NULL; + state->mode = TYPE; + state->last = 0; + state->whave = 0; + next = strm->next_in; + have = next != Z_NULL ? strm->avail_in : 0; + hold = 0; + bits = 0; + put = state->window; + left = state->wsize; + + /* Inflate until end of block marked as last */ + for (;;) + switch (state->mode) { + case TYPE: + /* determine and dispatch block type */ + if (state->last) { + BYTEBITS(); + state->mode = DONE; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + + case STORED: + /* get and verify stored block length */ + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + + /* copy stored block from input to output */ + while (state->length != 0) { + copy = state->length; + PULL(); + ROOM(); + if (copy > have) copy = have; + if (copy > left) copy = left; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + + case TABLE: + /* get dynamic table entries descriptor */ + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + + /* get code length code lengths (not a typo) */ + state->have = 0; + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + + /* get length and distance code code lengths */ + state->have = 0; + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = (unsigned)(state->lens[state->have - 1]); + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (code const FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN; + + case LEN: + /* use inflate_fast() if we have enough input and output */ + if (have >= 6 && left >= 258) { + RESTORE(); + if (state->whave < state->wsize) + state->whave = state->wsize - left; + inflate_fast(strm, state->wsize); + LOAD(); + break; + } + + /* get a literal, length, or end-of-block code */ + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + state->length = (unsigned)here.val; + + /* process literal */ + if (here.op == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + ROOM(); + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + } + + /* process end of block */ + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + + /* invalid code */ + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + + /* length code -- get extra bits, if any */ + state->extra = (unsigned)(here.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + + /* get distance code */ + for (;;) { + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)here.val; + + /* get distance extra bits, if any */ + state->extra = (unsigned)(here.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + } + if (state->offset > state->wsize - (state->whave < state->wsize ? + left : 0)) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + + /* copy match from window to output */ + do { + ROOM(); + copy = state->wsize - state->offset; + if (copy < left) { + from = put + copy; + copy = left - copy; + } + else { + from = put - state->offset; + copy = left; + } + if (copy > state->length) copy = state->length; + state->length -= copy; + left -= copy; + do { + *put++ = *from++; + } while (--copy); + } while (state->length != 0); + break; + + case DONE: + /* inflate stream terminated properly -- write leftover output */ + ret = Z_STREAM_END; + if (left < state->wsize) { + if (out(out_desc, state->window, state->wsize - left)) + ret = Z_BUF_ERROR; + } + goto inf_leave; + + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + + default: /* can't happen, but makes compilers happy */ + ret = Z_STREAM_ERROR; + goto inf_leave; + } + + /* Return unused input */ + inf_leave: + strm->next_in = next; + strm->avail_in = have; + return ret; +} + +int ZEXPORT inflateBackEnd(strm) +z_streamp strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} diff --git a/Minecraft.Client/Common/zlib/inffast.c b/Minecraft.Client/Common/zlib/inffast.c new file mode 100644 index 00000000..bda59ceb --- /dev/null +++ b/Minecraft.Client/Common/zlib/inffast.c @@ -0,0 +1,340 @@ +/* inffast.c -- fast decoding + * Copyright (C) 1995-2008, 2010, 2013 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifndef ASMINF + +/* Allow machine dependent optimization for post-increment or pre-increment. + Based on testing to date, + Pre-increment preferred for: + - PowerPC G3 (Adler) + - MIPS R5000 (Randers-Pehrson) + Post-increment preferred for: + - none + No measurable difference: + - Pentium III (Anderson) + - M68060 (Nikl) + */ +#ifdef POSTINC +# define OFF 0 +# define PUP(a) *(a)++ +#else +# define OFF 1 +# define PUP(a) *++(a) +#endif + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ +void ZLIB_INTERNAL inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *in; /* local strm->next_in */ + z_const unsigned char FAR *last; /* have enough input while in < last */ + unsigned char FAR *out; /* local strm->next_out */ + unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ + unsigned char FAR *end; /* while out < end, enough space available */ +#ifdef INFLATE_STRICT + unsigned dmax; /* maximum distance from zlib header */ +#endif + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned wnext; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ + unsigned long hold; /* local strm->hold */ + unsigned bits; /* local strm->bits */ + code const FAR *lcode; /* local strm->lencode */ + code const FAR *dcode; /* local strm->distcode */ + unsigned lmask; /* mask for first level of length codes */ + unsigned dmask; /* mask for first level of distance codes */ + code here; /* retrieved table entry */ + unsigned op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + unsigned len; /* match length, unused bytes */ + unsigned dist; /* match distance */ + unsigned char FAR *from; /* where to copy match from */ + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + in = strm->next_in - OFF; + last = in + (strm->avail_in - 5); + out = strm->next_out - OFF; + beg = out - (start - strm->avail_out); + end = out + (strm->avail_out - 257); +#ifdef INFLATE_STRICT + dmax = state->dmax; +#endif + wsize = state->wsize; + whave = state->whave; + wnext = state->wnext; + window = state->window; + hold = state->hold; + bits = state->bits; + lcode = state->lencode; + dcode = state->distcode; + lmask = (1U << state->lenbits) - 1; + dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + do { + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + here = lcode[hold & lmask]; + dolen: + op = (unsigned)(here.bits); + hold >>= op; + bits -= op; + op = (unsigned)(here.op); + if (op == 0) { /* literal */ + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + PUP(out) = (unsigned char)(here.val); + } + else if (op & 16) { /* length base */ + len = (unsigned)(here.val); + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + len += (unsigned)hold & ((1U << op) - 1); + hold >>= op; + bits -= op; + } + Tracevv((stderr, "inflate: length %u\n", len)); + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + here = dcode[hold & dmask]; + dodist: + op = (unsigned)(here.bits); + hold >>= op; + bits -= op; + op = (unsigned)(here.op); + if (op & 16) { /* distance base */ + dist = (unsigned)(here.val); + op &= 15; /* number of extra bits */ + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + } + dist += (unsigned)hold & ((1U << op) - 1); +#ifdef INFLATE_STRICT + if (dist > dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + hold >>= op; + bits -= op; + Tracevv((stderr, "inflate: distance %u\n", dist)); + op = (unsigned)(out - beg); /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + if (state->sane) { + strm->msg = + (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + if (len <= op - whave) { + do { + PUP(out) = 0; + } while (--len); + continue; + } + len -= op - whave; + do { + PUP(out) = 0; + } while (--op > whave); + if (op == 0) { + from = out - dist; + do { + PUP(out) = PUP(from); + } while (--len); + continue; + } +#endif + } + from = window - OFF; + if (wnext == 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + else if (wnext < op) { /* wrap around window */ + from += wsize + wnext - op; + op -= wnext; + if (op < len) { /* some from end of window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = window - OFF; + if (wnext < len) { /* some from start of window */ + op = wnext; + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + } + else { /* contiguous in window */ + from += wnext - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + while (len > 2) { + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + else { + from = out - dist; /* copy direct from output */ + do { /* minimum length is three */ + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } while (len > 2); + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + } + else if ((op & 64) == 0) { /* 2nd level distance code */ + here = dcode[here.val + (hold & ((1U << op) - 1))]; + goto dodist; + } + else { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + } + else if ((op & 64) == 0) { /* 2nd level length code */ + here = lcode[here.val + (hold & ((1U << op) - 1))]; + goto dolen; + } + else if (op & 32) { /* end-of-block */ + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + else { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + } while (in < last && out < end); + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + in -= len; + bits -= len << 3; + hold &= (1U << bits) - 1; + + /* update state and return */ + strm->next_in = in + OFF; + strm->next_out = out + OFF; + strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); + strm->avail_out = (unsigned)(out < end ? + 257 + (end - out) : 257 - (out - end)); + state->hold = hold; + state->bits = bits; + return; +} + +/* + inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): + - Using bit fields for code structure + - Different op definition to avoid & for extra bits (do & for table bits) + - Three separate decoding do-loops for direct, window, and wnext == 0 + - Special case for distance > 1 copies to do overlapped load and store copy + - Explicit branch predictions (based on measured branch probabilities) + - Deferring match copy and interspersed it with decoding subsequent codes + - Swapping literal/length else + - Swapping window/direct else + - Larger unrolled copy loops (three is about right) + - Moving len -= 3 statement into middle of loop + */ + +#endif /* !ASMINF */ diff --git a/Minecraft.Client/Common/zlib/inffast.h b/Minecraft.Client/Common/zlib/inffast.h new file mode 100644 index 00000000..e5c1aa4c --- /dev/null +++ b/Minecraft.Client/Common/zlib/inffast.h @@ -0,0 +1,11 @@ +/* inffast.h -- header to use inffast.c + * Copyright (C) 1995-2003, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/Minecraft.Client/Common/zlib/inffixed.h b/Minecraft.Client/Common/zlib/inffixed.h new file mode 100644 index 00000000..d6283277 --- /dev/null +++ b/Minecraft.Client/Common/zlib/inffixed.h @@ -0,0 +1,94 @@ + /* inffixed.h -- table for decoding fixed codes + * Generated automatically by makefixed(). + */ + + /* WARNING: this file should *not* be used by applications. + It is part of the implementation of this library and is + subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, + {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, + {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, + {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, + {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, + {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, + {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, + {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, + {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, + {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, + {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, + {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, + {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, + {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, + {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, + {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, + {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, + {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, + {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, + {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, + {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, + {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, + {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, + {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, + {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, + {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, + {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, + {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, + {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, + {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, + {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, + {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, + {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, + {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, + {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, + {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, + {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, + {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, + {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, + {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, + {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, + {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, + {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, + {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, + {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, + {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, + {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, + {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, + {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, + {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, + {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, + {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, + {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, + {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, + {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, + {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, + {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, + {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, + {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, + {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, + {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, + {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, + {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, + {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, + {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, + {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, + {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, + {0,9,255} + }; + + static const code distfix[32] = { + {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, + {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, + {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, + {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, + {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, + {22,5,193},{64,5,0} + }; diff --git a/Minecraft.Client/Common/zlib/inflate.c b/Minecraft.Client/Common/zlib/inflate.c new file mode 100644 index 00000000..870f89bb --- /dev/null +++ b/Minecraft.Client/Common/zlib/inflate.c @@ -0,0 +1,1512 @@ +/* inflate.c -- zlib decompression + * Copyright (C) 1995-2012 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * Change history: + * + * 1.2.beta0 24 Nov 2002 + * - First version -- complete rewrite of inflate to simplify code, avoid + * creation of window when not needed, minimize use of window when it is + * needed, make inffast.c even faster, implement gzip decoding, and to + * improve code readability and style over the previous zlib inflate code + * + * 1.2.beta1 25 Nov 2002 + * - Use pointers for available input and output checking in inffast.c + * - Remove input and output counters in inffast.c + * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 + * - Remove unnecessary second byte pull from length extra in inffast.c + * - Unroll direct copy to three copies per loop in inffast.c + * + * 1.2.beta2 4 Dec 2002 + * - Change external routine names to reduce potential conflicts + * - Correct filename to inffixed.h for fixed tables in inflate.c + * - Make hbuf[] unsigned char to match parameter type in inflate.c + * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) + * to avoid negation problem on Alphas (64 bit) in inflate.c + * + * 1.2.beta3 22 Dec 2002 + * - Add comments on state->bits assertion in inffast.c + * - Add comments on op field in inftrees.h + * - Fix bug in reuse of allocated window after inflateReset() + * - Remove bit fields--back to byte structure for speed + * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths + * - Change post-increments to pre-increments in inflate_fast(), PPC biased? + * - Add compile time option, POSTINC, to use post-increments instead (Intel?) + * - Make MATCH copy in inflate() much faster for when inflate_fast() not used + * - Use local copies of stream next and avail values, as well as local bit + * buffer and bit count in inflate()--for speed when inflate_fast() not used + * + * 1.2.beta4 1 Jan 2003 + * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings + * - Move a comment on output buffer sizes from inffast.c to inflate.c + * - Add comments in inffast.c to introduce the inflate_fast() routine + * - Rearrange window copies in inflate_fast() for speed and simplification + * - Unroll last copy for window match in inflate_fast() + * - Use local copies of window variables in inflate_fast() for speed + * - Pull out common wnext == 0 case for speed in inflate_fast() + * - Make op and len in inflate_fast() unsigned for consistency + * - Add FAR to lcode and dcode declarations in inflate_fast() + * - Simplified bad distance check in inflate_fast() + * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new + * source file infback.c to provide a call-back interface to inflate for + * programs like gzip and unzip -- uses window as output buffer to avoid + * window copying + * + * 1.2.beta5 1 Jan 2003 + * - Improved inflateBack() interface to allow the caller to provide initial + * input in strm. + * - Fixed stored blocks bug in inflateBack() + * + * 1.2.beta6 4 Jan 2003 + * - Added comments in inffast.c on effectiveness of POSTINC + * - Typecasting all around to reduce compiler warnings + * - Changed loops from while (1) or do {} while (1) to for (;;), again to + * make compilers happy + * - Changed type of window in inflateBackInit() to unsigned char * + * + * 1.2.beta7 27 Jan 2003 + * - Changed many types to unsigned or unsigned short to avoid warnings + * - Added inflateCopy() function + * + * 1.2.0 9 Mar 2003 + * - Changed inflateBack() interface to provide separate opaque descriptors + * for the in() and out() functions + * - Changed inflateBack() argument and in_func typedef to swap the length + * and buffer address return values for the input function + * - Check next_in and next_out for Z_NULL on entry to inflate() + * + * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifdef MAKEFIXED +# ifndef BUILDFIXED +# define BUILDFIXED +# endif +#endif + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); +local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, + unsigned copy)); +#ifdef BUILDFIXED + void makefixed OF((void)); +#endif +local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf, + unsigned len)); + +int ZEXPORT inflateResetKeep(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + strm->total_in = strm->total_out = state->total = 0; + strm->msg = Z_NULL; + if (state->wrap) /* to support ill-conceived Java test suite */ + strm->adler = state->wrap & 1; + state->mode = HEAD; + state->last = 0; + state->havedict = 0; + state->dmax = 32768U; + state->head = Z_NULL; + state->hold = 0; + state->bits = 0; + state->lencode = state->distcode = state->next = state->codes; + state->sane = 1; + state->back = -1; + Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} + +int ZEXPORT inflateReset(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + state->wsize = 0; + state->whave = 0; + state->wnext = 0; + return inflateResetKeep(strm); +} + +int ZEXPORT inflateReset2(strm, windowBits) +z_streamp strm; +int windowBits; +{ + int wrap; + struct inflate_state FAR *state; + + /* get the state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* extract wrap request from windowBits parameter */ + if (windowBits < 0) { + wrap = 0; + windowBits = -windowBits; + } + else { + wrap = (windowBits >> 4) + 1; +#ifdef GUNZIP + if (windowBits < 48) + windowBits &= 15; +#endif + } + + /* set number of window bits, free window if different */ + if (windowBits && (windowBits < 8 || windowBits > 15)) + return Z_STREAM_ERROR; + if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { + ZFREE(strm, state->window); + state->window = Z_NULL; + } + + /* update state and reset the rest of it */ + state->wrap = wrap; + state->wbits = (unsigned)windowBits; + return inflateReset(strm); +} + +int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) +z_streamp strm; +int windowBits; +const char *version; +int stream_size; +{ + int ret; + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL) return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; +#endif + } + if (strm->zfree == (free_func)0) +#ifdef Z_SOLO + return Z_STREAM_ERROR; +#else + strm->zfree = zcfree; +#endif + state = (struct inflate_state FAR *) + ZALLOC(strm, 1, sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->window = Z_NULL; + ret = inflateReset2(strm, windowBits); + if (ret != Z_OK) { + ZFREE(strm, state); + strm->state = Z_NULL; + } + return ret; +} + +int ZEXPORT inflateInit_(strm, version, stream_size) +z_streamp strm; +const char *version; +int stream_size; +{ + return inflateInit2_(strm, DEF_WBITS, version, stream_size); +} + +int ZEXPORT inflatePrime(strm, bits, value) +z_streamp strm; +int bits; +int value; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (bits < 0) { + state->hold = 0; + state->bits = 0; + return Z_OK; + } + if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; + value &= (1L << bits) - 1; + state->hold += value << state->bits; + state->bits += bits; + return Z_OK; +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +#ifdef MAKEFIXED +#include + +/* + Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also + defines BUILDFIXED, so the tables are built on the fly. makefixed() writes + those tables to stdout, which would be piped to inffixed.h. A small program + can simply call makefixed to do this: + + void makefixed(void); + + int main(void) + { + makefixed(); + return 0; + } + + Then that can be linked with zlib built with MAKEFIXED defined and run: + + a.out > inffixed.h + */ +void makefixed() +{ + unsigned low, size; + struct inflate_state state; + + fixedtables(&state); + puts(" /* inffixed.h -- table for decoding fixed codes"); + puts(" * Generated automatically by makefixed()."); + puts(" */"); + puts(""); + puts(" /* WARNING: this file should *not* be used by applications."); + puts(" It is part of the implementation of this library and is"); + puts(" subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf(" static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 7) == 0) printf("\n "); + printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op, + state.lencode[low].bits, state.lencode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); + size = 1U << 5; + printf("\n static const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) printf("\n "); + printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, + state.distcode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); +} +#endif /* MAKEFIXED */ + +/* + Update the window with the last wsize (normally 32K) bytes written before + returning. If window does not exist yet, create it. This is only called + when a window is already in use, or when output has been written during this + inflate call, but the end of the deflate stream has not been reached yet. + It is also called to create a window for dictionary data when a dictionary + is loaded. + + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ +local int updatewindow(strm, end, copy) +z_streamp strm; +const Bytef *end; +unsigned copy; +{ + struct inflate_state FAR *state; + unsigned dist; + + state = (struct inflate_state FAR *)strm->state; + + /* if it hasn't been done already, allocate space for the window */ + if (state->window == Z_NULL) { + state->window = (unsigned char FAR *) + ZALLOC(strm, 1U << state->wbits, + sizeof(unsigned char)); + if (state->window == Z_NULL) return 1; + } + + /* if window not in use yet, initialize */ + if (state->wsize == 0) { + state->wsize = 1U << state->wbits; + state->wnext = 0; + state->whave = 0; + } + + /* copy state->wsize or less output bytes into the circular window */ + if (copy >= state->wsize) { + zmemcpy(state->window, end - state->wsize, state->wsize); + state->wnext = 0; + state->whave = state->wsize; + } + else { + dist = state->wsize - state->wnext; + if (dist > copy) dist = copy; + zmemcpy(state->window + state->wnext, end - copy, dist); + copy -= dist; + if (copy) { + zmemcpy(state->window, end - copy, copy); + state->wnext = copy; + state->whave = state->wsize; + } + else { + state->wnext += dist; + if (state->wnext == state->wsize) state->wnext = 0; + if (state->whave < state->wsize) state->whave += dist; + } + } + return 0; +} + +/* Macros for inflate(): */ + +/* check function to use adler32() for zlib or crc32() for gzip */ +#ifdef GUNZIP +# define UPDATE(check, buf, len) \ + (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) +#else +# define UPDATE(check, buf, len) adler32(check, buf, len) +#endif + +/* check macros for header crc */ +#ifdef GUNZIP +# define CRC2(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + check = crc32(check, hbuf, 2); \ + } while (0) + +# define CRC4(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + hbuf[2] = (unsigned char)((word) >> 16); \ + hbuf[3] = (unsigned char)((word) >> 24); \ + check = crc32(check, hbuf, 4); \ + } while (0) +#endif + +/* Load registers with state in inflate() for speed */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Restore state from registers in inflate() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflate() + if there is no input available. */ +#define PULLBYTE() \ + do { \ + if (have == 0) goto inf_leave; \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflate(). */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* + inflate() uses a state machine to process as much input data and generate as + much output data as possible before returning. The state machine is + structured roughly as follows: + + for (;;) switch (state) { + ... + case STATEn: + if (not enough input data or output space to make progress) + return; + ... make progress ... + state = STATEm; + break; + ... + } + + so when inflate() is called again, the same case is attempted again, and + if the appropriate resources are provided, the machine proceeds to the + next state. The NEEDBITS() macro is usually the way the state evaluates + whether it can proceed or should return. NEEDBITS() does the return if + the requested bits are not available. The typical use of the BITS macros + is: + + NEEDBITS(n); + ... do something with BITS(n) ... + DROPBITS(n); + + where NEEDBITS(n) either returns from inflate() if there isn't enough + input left to load n bits into the accumulator, or it continues. BITS(n) + gives the low n bits in the accumulator. When done, DROPBITS(n) drops + the low n bits off the accumulator. INITBITS() clears the accumulator + and sets the number of available bits to zero. BYTEBITS() discards just + enough bits to put the accumulator on a byte boundary. After BYTEBITS() + and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. + + NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return + if there is no input available. The decoding of variable length codes uses + PULLBYTE() directly in order to pull just enough bytes to decode the next + code, and no more. + + Some states loop until they get enough input, making sure that enough + state information is maintained to continue the loop where it left off + if NEEDBITS() returns in the loop. For example, want, need, and keep + would all have to actually be part of the saved state in case NEEDBITS() + returns: + + case STATEw: + while (want < need) { + NEEDBITS(n); + keep[want++] = BITS(n); + DROPBITS(n); + } + state = STATEx; + case STATEx: + + As shown above, if the next state is also the next case, then the break + is omitted. + + A state may also return if there is not enough output space available to + complete that state. Those states are copying stored data, writing a + literal byte, and copying a matching string. + + When returning, a "goto inf_leave" is used to update the total counters, + update the check value, and determine whether any progress has been made + during that inflate() call in order to return the proper return code. + Progress is defined as a change in either strm->avail_in or strm->avail_out. + When there is a window, goto inf_leave will update the window with the last + output written. If a goto inf_leave occurs in the middle of decompression + and there is no window currently, goto inf_leave will create one and copy + output to the window for the next call of inflate(). + + In this implementation, the flush parameter of inflate() only affects the + return code (per zlib.h). inflate() always writes as much as possible to + strm->next_out, given the space available and the provided input--the effect + documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers + the allocation of and copying into a sliding window until necessary, which + provides the effect documented in zlib.h for Z_FINISH when the entire input + stream available. So the only thing the flush parameter actually does is: + when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it + will return Z_BUF_ERROR if it has not reached the end of the stream. + */ + +int ZEXPORT inflate(strm, flush) +z_streamp strm; +int flush; +{ + struct inflate_state FAR *state; + z_const unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned in, out; /* save starting available input and output */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ +#ifdef GUNZIP + unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ +#endif + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0)) + return Z_STREAM_ERROR; + + state = (struct inflate_state FAR *)strm->state; + if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ + LOAD(); + in = have; + out = left; + ret = Z_OK; + for (;;) + switch (state->mode) { + case HEAD: + if (state->wrap == 0) { + state->mode = TYPEDO; + break; + } + NEEDBITS(16); +#ifdef GUNZIP + if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ + state->check = crc32(0L, Z_NULL, 0); + CRC2(state->check, hold); + INITBITS(); + state->mode = FLAGS; + break; + } + state->flags = 0; /* expect zlib header */ + if (state->head != Z_NULL) + state->head->done = -1; + if (!(state->wrap & 1) || /* check if zlib header allowed */ +#else + if ( +#endif + ((BITS(8) << 8) + (hold >> 8)) % 31) { + strm->msg = (char *)"incorrect header check"; + state->mode = BAD; + break; + } + if (BITS(4) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + DROPBITS(4); + len = BITS(4) + 8; + if (state->wbits == 0) + state->wbits = len; + else if (len > state->wbits) { + strm->msg = (char *)"invalid window size"; + state->mode = BAD; + break; + } + state->dmax = 1U << len; + Tracev((stderr, "inflate: zlib header ok\n")); + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = hold & 0x200 ? DICTID : TYPE; + INITBITS(); + break; +#ifdef GUNZIP + case FLAGS: + NEEDBITS(16); + state->flags = (int)(hold); + if ((state->flags & 0xff) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + if (state->flags & 0xe000) { + strm->msg = (char *)"unknown header flags set"; + state->mode = BAD; + break; + } + if (state->head != Z_NULL) + state->head->text = (int)((hold >> 8) & 1); + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = TIME; + case TIME: + NEEDBITS(32); + if (state->head != Z_NULL) + state->head->time = hold; + if (state->flags & 0x0200) CRC4(state->check, hold); + INITBITS(); + state->mode = OS; + case OS: + NEEDBITS(16); + if (state->head != Z_NULL) { + state->head->xflags = (int)(hold & 0xff); + state->head->os = (int)(hold >> 8); + } + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = EXLEN; + case EXLEN: + if (state->flags & 0x0400) { + NEEDBITS(16); + state->length = (unsigned)(hold); + if (state->head != Z_NULL) + state->head->extra_len = (unsigned)hold; + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + } + else if (state->head != Z_NULL) + state->head->extra = Z_NULL; + state->mode = EXTRA; + case EXTRA: + if (state->flags & 0x0400) { + copy = state->length; + if (copy > have) copy = have; + if (copy) { + if (state->head != Z_NULL && + state->head->extra != Z_NULL) { + len = state->head->extra_len - state->length; + zmemcpy(state->head->extra + len, next, + len + copy > state->head->extra_max ? + state->head->extra_max - len : copy); + } + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + state->length -= copy; + } + if (state->length) goto inf_leave; + } + state->length = 0; + state->mode = NAME; + case NAME: + if (state->flags & 0x0800) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->name != Z_NULL && + state->length < state->head->name_max) + state->head->name[state->length++] = len; + } while (len && copy < have); + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->name = Z_NULL; + state->length = 0; + state->mode = COMMENT; + case COMMENT: + if (state->flags & 0x1000) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->comment != Z_NULL && + state->length < state->head->comm_max) + state->head->comment[state->length++] = len; + } while (len && copy < have); + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->comment = Z_NULL; + state->mode = HCRC; + case HCRC: + if (state->flags & 0x0200) { + NEEDBITS(16); + if (hold != (state->check & 0xffff)) { + strm->msg = (char *)"header crc mismatch"; + state->mode = BAD; + break; + } + INITBITS(); + } + if (state->head != Z_NULL) { + state->head->hcrc = (int)((state->flags >> 9) & 1); + state->head->done = 1; + } + strm->adler = state->check = crc32(0L, Z_NULL, 0); + state->mode = TYPE; + break; +#endif + case DICTID: + NEEDBITS(32); + strm->adler = state->check = ZSWAP32(hold); + INITBITS(); + state->mode = DICT; + case DICT: + if (state->havedict == 0) { + RESTORE(); + return Z_NEED_DICT; + } + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = TYPE; + case TYPE: + if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; + case TYPEDO: + if (state->last) { + BYTEBITS(); + state->mode = CHECK; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN_; /* decode codes */ + if (flush == Z_TREES) { + DROPBITS(2); + goto inf_leave; + } + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + case STORED: + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + state->mode = COPY_; + if (flush == Z_TREES) goto inf_leave; + case COPY_: + state->mode = COPY; + case COPY: + copy = state->length; + if (copy) { + if (copy > have) copy = have; + if (copy > left) copy = left; + if (copy == 0) goto inf_leave; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + break; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + case TABLE: + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + state->have = 0; + state->mode = LENLENS; + case LENLENS: + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (const code FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + state->have = 0; + state->mode = CODELENS; + case CODELENS: + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = state->lens[state->have - 1]; + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ + state->next = state->codes; + state->lencode = (const code FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (const code FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN_; + if (flush == Z_TREES) goto inf_leave; + case LEN_: + state->mode = LEN; + case LEN: + if (have >= 6 && left >= 258) { + RESTORE(); + inflate_fast(strm, out); + LOAD(); + if (state->mode == TYPE) + state->back = -1; + break; + } + state->back = 0; + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + state->back += last.bits; + } + DROPBITS(here.bits); + state->back += here.bits; + state->length = (unsigned)here.val; + if ((int)(here.op) == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + state->mode = LIT; + break; + } + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->back = -1; + state->mode = TYPE; + break; + } + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + state->extra = (unsigned)(here.op) & 15; + state->mode = LENEXT; + case LENEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + state->back += state->extra; + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + state->was = state->length; + state->mode = DIST; + case DIST: + for (;;) { + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + state->back += last.bits; + } + DROPBITS(here.bits); + state->back += here.bits; + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)here.val; + state->extra = (unsigned)(here.op) & 15; + state->mode = DISTEXT; + case DISTEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + state->back += state->extra; + } +#ifdef INFLATE_STRICT + if (state->offset > state->dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + state->mode = MATCH; + case MATCH: + if (left == 0) goto inf_leave; + copy = out - left; + if (state->offset > copy) { /* copy from window */ + copy = state->offset - copy; + if (copy > state->whave) { + if (state->sane) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + Trace((stderr, "inflate.c too far\n")); + copy -= state->whave; + if (copy > state->length) copy = state->length; + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = 0; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; +#endif + } + if (copy > state->wnext) { + copy -= state->wnext; + from = state->window + (state->wsize - copy); + } + else + from = state->window + (state->wnext - copy); + if (copy > state->length) copy = state->length; + } + else { /* copy from output */ + from = put - state->offset; + copy = state->length; + } + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = *from++; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; + case LIT: + if (left == 0) goto inf_leave; + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + case CHECK: + if (state->wrap) { + NEEDBITS(32); + out -= left; + strm->total_out += out; + state->total += out; + if (out) + strm->adler = state->check = + UPDATE(state->check, put - out, out); + out = left; + if (( +#ifdef GUNZIP + state->flags ? hold : +#endif + ZSWAP32(hold)) != state->check) { + strm->msg = (char *)"incorrect data check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: check matches trailer\n")); + } +#ifdef GUNZIP + state->mode = LENGTH; + case LENGTH: + if (state->wrap && state->flags) { + NEEDBITS(32); + if (hold != (state->total & 0xffffffffUL)) { + strm->msg = (char *)"incorrect length check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: length matches trailer\n")); + } +#endif + state->mode = DONE; + case DONE: + ret = Z_STREAM_END; + goto inf_leave; + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + case MEM: + return Z_MEM_ERROR; + case SYNC: + default: + return Z_STREAM_ERROR; + } + + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + inf_leave: + RESTORE(); + if (state->wsize || (out != strm->avail_out && state->mode < BAD && + (state->mode < CHECK || flush != Z_FINISH))) + if (updatewindow(strm, strm->next_out, out - strm->avail_out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + in -= strm->avail_in; + out -= strm->avail_out; + strm->total_in += in; + strm->total_out += out; + state->total += out; + if (state->wrap && out) + strm->adler = state->check = + UPDATE(state->check, strm->next_out - out, out); + strm->data_type = state->bits + (state->last ? 64 : 0) + + (state->mode == TYPE ? 128 : 0) + + (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); + if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) + ret = Z_BUF_ERROR; + return ret; +} + +int ZEXPORT inflateEnd(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->window != Z_NULL) ZFREE(strm, state->window); + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} + +int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength) +z_streamp strm; +Bytef *dictionary; +uInt *dictLength; +{ + struct inflate_state FAR *state; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* copy dictionary */ + if (state->whave && dictionary != Z_NULL) { + zmemcpy(dictionary, state->window + state->wnext, + state->whave - state->wnext); + zmemcpy(dictionary + state->whave - state->wnext, + state->window, state->wnext); + } + if (dictLength != Z_NULL) + *dictLength = state->whave; + return Z_OK; +} + +int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) +z_streamp strm; +const Bytef *dictionary; +uInt dictLength; +{ + struct inflate_state FAR *state; + unsigned long dictid; + int ret; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->wrap != 0 && state->mode != DICT) + return Z_STREAM_ERROR; + + /* check for correct dictionary identifier */ + if (state->mode == DICT) { + dictid = adler32(0L, Z_NULL, 0); + dictid = adler32(dictid, dictionary, dictLength); + if (dictid != state->check) + return Z_DATA_ERROR; + } + + /* copy dictionary to window using updatewindow(), which will amend the + existing dictionary if appropriate */ + ret = updatewindow(strm, dictionary + dictLength, dictLength); + if (ret) { + state->mode = MEM; + return Z_MEM_ERROR; + } + state->havedict = 1; + Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK; +} + +int ZEXPORT inflateGetHeader(strm, head) +z_streamp strm; +gz_headerp head; +{ + struct inflate_state FAR *state; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; + + /* save header structure */ + state->head = head; + head->done = 0; + return Z_OK; +} + +/* + Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found + or when out of input. When called, *have is the number of pattern bytes + found in order so far, in 0..3. On return *have is updated to the new + state. If on return *have equals four, then the pattern was found and the + return value is how many bytes were read including the last byte of the + pattern. If *have is less than four, then the pattern has not been found + yet and the return value is len. In the latter case, syncsearch() can be + called again with more data and the *have state. *have is initialized to + zero for the first call. + */ +local unsigned syncsearch(have, buf, len) +unsigned FAR *have; +const unsigned char FAR *buf; +unsigned len; +{ + unsigned got; + unsigned next; + + got = *have; + next = 0; + while (next < len && got < 4) { + if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) + got++; + else if (buf[next]) + got = 0; + else + got = 4 - got; + next++; + } + *have = got; + return next; +} + +int ZEXPORT inflateSync(strm) +z_streamp strm; +{ + unsigned len; /* number of bytes to look at or looked at */ + unsigned long in, out; /* temporary to save total_in and total_out */ + unsigned char buf[4]; /* to restore bit buffer to byte string */ + struct inflate_state FAR *state; + + /* check parameters */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; + + /* if first time, start search in bit buffer */ + if (state->mode != SYNC) { + state->mode = SYNC; + state->hold <<= state->bits & 7; + state->bits -= state->bits & 7; + len = 0; + while (state->bits >= 8) { + buf[len++] = (unsigned char)(state->hold); + state->hold >>= 8; + state->bits -= 8; + } + state->have = 0; + syncsearch(&(state->have), buf, len); + } + + /* search available input */ + len = syncsearch(&(state->have), strm->next_in, strm->avail_in); + strm->avail_in -= len; + strm->next_in += len; + strm->total_in += len; + + /* return no joy or set up to restart inflate() on a new block */ + if (state->have != 4) return Z_DATA_ERROR; + in = strm->total_in; out = strm->total_out; + inflateReset(strm); + strm->total_in = in; strm->total_out = out; + state->mode = TYPE; + return Z_OK; +} + +/* + Returns true if inflate is currently at the end of a block generated by + Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP + implementation to provide an additional safety check. PPP uses + Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored + block. When decompressing, PPP checks that at the end of input packet, + inflate is waiting for these length bytes. + */ +int ZEXPORT inflateSyncPoint(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + return state->mode == STORED && state->bits == 0; +} + +int ZEXPORT inflateCopy(dest, source) +z_streamp dest; +z_streamp source; +{ + struct inflate_state FAR *state; + struct inflate_state FAR *copy; + unsigned char FAR *window; + unsigned wsize; + + /* check input */ + if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || + source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)source->state; + + /* allocate space */ + copy = (struct inflate_state FAR *) + ZALLOC(source, 1, sizeof(struct inflate_state)); + if (copy == Z_NULL) return Z_MEM_ERROR; + window = Z_NULL; + if (state->window != Z_NULL) { + window = (unsigned char FAR *) + ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); + if (window == Z_NULL) { + ZFREE(source, copy); + return Z_MEM_ERROR; + } + } + + /* copy state */ + zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); + zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); + if (state->lencode >= state->codes && + state->lencode <= state->codes + ENOUGH - 1) { + copy->lencode = copy->codes + (state->lencode - state->codes); + copy->distcode = copy->codes + (state->distcode - state->codes); + } + copy->next = copy->codes + (state->next - state->codes); + if (window != Z_NULL) { + wsize = 1U << state->wbits; + zmemcpy(window, state->window, wsize); + } + copy->window = window; + dest->state = (struct internal_state FAR *)copy; + return Z_OK; +} + +int ZEXPORT inflateUndermine(strm, subvert) +z_streamp strm; +int subvert; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + state->sane = !subvert; +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + return Z_OK; +#else + state->sane = 1; + return Z_DATA_ERROR; +#endif +} + +long ZEXPORT inflateMark(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return -1L << 16; + state = (struct inflate_state FAR *)strm->state; + return ((long)(state->back) << 16) + + (state->mode == COPY ? state->length : + (state->mode == MATCH ? state->was - state->length : 0)); +} diff --git a/Minecraft.Client/Common/zlib/inflate.h b/Minecraft.Client/Common/zlib/inflate.h new file mode 100644 index 00000000..95f4986d --- /dev/null +++ b/Minecraft.Client/Common/zlib/inflate.h @@ -0,0 +1,122 @@ +/* inflate.h -- internal inflate state definition + * Copyright (C) 1995-2009 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer decoding by inflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip decoding + should be left enabled. */ +#ifndef NO_GZIP +# define GUNZIP +#endif + +/* Possible inflate modes between inflate() calls */ +typedef enum { + HEAD, /* i: waiting for magic header */ + FLAGS, /* i: waiting for method and flags (gzip) */ + TIME, /* i: waiting for modification time (gzip) */ + OS, /* i: waiting for extra flags and operating system (gzip) */ + EXLEN, /* i: waiting for extra length (gzip) */ + EXTRA, /* i: waiting for extra bytes (gzip) */ + NAME, /* i: waiting for end of file name (gzip) */ + COMMENT, /* i: waiting for end of comment (gzip) */ + HCRC, /* i: waiting for header crc (gzip) */ + DICTID, /* i: waiting for dictionary check value */ + DICT, /* waiting for inflateSetDictionary() call */ + TYPE, /* i: waiting for type bits, including last-flag bit */ + TYPEDO, /* i: same, but skip check to exit inflate on new block */ + STORED, /* i: waiting for stored size (length and complement) */ + COPY_, /* i/o: same as COPY below, but only first time in */ + COPY, /* i/o: waiting for input or output to copy stored block */ + TABLE, /* i: waiting for dynamic block table lengths */ + LENLENS, /* i: waiting for code length code lengths */ + CODELENS, /* i: waiting for length/lit and distance code lengths */ + LEN_, /* i: same as LEN below, but only first time in */ + LEN, /* i: waiting for length/lit/eob code */ + LENEXT, /* i: waiting for length extra bits */ + DIST, /* i: waiting for distance code */ + DISTEXT, /* i: waiting for distance extra bits */ + MATCH, /* o: waiting for output space to copy string */ + LIT, /* o: waiting for output space to write literal */ + CHECK, /* i: waiting for 32-bit check value */ + LENGTH, /* i: waiting for 32-bit length (gzip) */ + DONE, /* finished check, done -- remain here until reset */ + BAD, /* got a data error -- remain here until reset */ + MEM, /* got an inflate() memory error -- remain here until reset */ + SYNC /* looking for synchronization bytes to restart inflate() */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to BAD or MEM on error -- not shown for clarity) + + Process header: + HEAD -> (gzip) or (zlib) or (raw) + (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT -> + HCRC -> TYPE + (zlib) -> DICTID or TYPE + DICTID -> DICT -> TYPE + (raw) -> TYPEDO + Read deflate blocks: + TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK + STORED -> COPY_ -> COPY -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN_ + LEN_ -> LEN + Read deflate codes in fixed or dynamic block: + LEN -> LENEXT or LIT or TYPE + LENEXT -> DIST -> DISTEXT -> MATCH -> LEN + LIT -> LEN + Process trailer: + CHECK -> LENGTH -> DONE + */ + +/* state maintained between inflate() calls. Approximately 10K bytes. */ +struct inflate_state { + inflate_mode mode; /* current inflate mode */ + int last; /* true if processing last block */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + int havedict; /* true if dictionary provided */ + int flags; /* gzip header method and flags (0 if zlib) */ + unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ + unsigned long check; /* protected copy of check value */ + unsigned long total; /* protected copy of output count */ + gz_headerp head; /* where to save gzip header information */ + /* sliding window */ + unsigned wbits; /* log base 2 of requested window size */ + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned wnext; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* bit accumulator */ + unsigned long hold; /* input bit accumulator */ + unsigned bits; /* number of bits in "in" */ + /* for string and stored block copying */ + unsigned length; /* literal or length of data to copy */ + unsigned offset; /* distance back to copy string from */ + /* for table and code decoding */ + unsigned extra; /* extra bits needed */ + /* fixed and dynamic code tables */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ + int sane; /* if false, allow invalid distance too far */ + int back; /* bits back of last unprocessed length/lit */ + unsigned was; /* initial length of match */ +}; diff --git a/Minecraft.Client/Common/zlib/inftrees.c b/Minecraft.Client/Common/zlib/inftrees.c new file mode 100644 index 00000000..44d89cf2 --- /dev/null +++ b/Minecraft.Client/Common/zlib/inftrees.c @@ -0,0 +1,306 @@ +/* inftrees.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2013 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" + +#define MAXBITS 15 + +const char inflate_copyright[] = + " inflate 1.2.8 Copyright 1995-2013 Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. + */ +int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work) +codetype type; +unsigned short FAR *lens; +unsigned codes; +code FAR * FAR *table; +unsigned FAR *bits; +unsigned short FAR *work; +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code here; /* table entry for duplication */ + code FAR *next; /* next available space in table */ + const unsigned short FAR *base; /* base value table to use */ + const unsigned short FAR *extra; /* extra bits table to use */ + int end; /* use base and extra for symbol > end */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + static const unsigned short lext[31] = { /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78}; + static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577, 0, 0}; + static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) { /* no symbols to code at all */ + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)1; + here.val = (unsigned short)0; + *(*table)++ = here; /* make a table to force an error */ + *(*table)++ = here; + *bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min < max; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || max != 1)) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked for LENS and DIST tables against + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in + the initial root table size constants. See the comments in inftrees.h + for more information. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + end = 19; + break; + case LENS: + base = lbase; + base -= 257; + extra = lext; + extra -= 257; + end = 256; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + end = -1; + } + + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if ((type == LENS && used > ENOUGH_LENS) || + (type == DISTS && used > ENOUGH_DISTS)) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + here.bits = (unsigned char)(len - drop); + if ((int)(work[sym]) < end) { + here.op = (unsigned char)0; + here.val = work[sym]; + } + else if ((int)(work[sym]) > end) { + here.op = (unsigned char)(extra[work[sym]]); + here.val = base[work[sym]]; + } + else { + here.op = (unsigned char)(32 + 64); /* end of block */ + here.val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + next[(huff >> drop) + fill] = here; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += min; /* here min is 1 << curr */ + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1U << curr; + if ((type == LENS && used > ENOUGH_LENS) || + (type == DISTS && used > ENOUGH_DISTS)) + return 1; + + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } + } + + /* fill in remaining table entry if code is incomplete (guaranteed to have + at most one remaining entry, since if the code is incomplete, the + maximum code length that was allowed to get this far is one bit) */ + if (huff != 0) { + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)(len - drop); + here.val = (unsigned short)0; + next[huff] = here; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; +} diff --git a/Minecraft.Client/Common/zlib/inftrees.h b/Minecraft.Client/Common/zlib/inftrees.h new file mode 100644 index 00000000..baa53a0b --- /dev/null +++ b/Minecraft.Client/Common/zlib/inftrees.h @@ -0,0 +1,62 @@ +/* inftrees.h -- header to use inftrees.c + * Copyright (C) 1995-2005, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 0001eeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of the dynamic table. The maximum number of code structures is + 1444, which is the sum of 852 for literal/length codes and 592 for distance + codes. These values were found by exhaustive searches using the program + examples/enough.c found in the zlib distribtution. The arguments to that + program are the number of symbols, the initial root table size, and the + maximum bit length of a code. "enough 286 9 15" for literal/length codes + returns returns 852, and "enough 30 6 15" for distance codes returns 592. + The initial root table size (9 or 6) is found in the fifth argument of the + inflate_table() calls in inflate.c and infback.c. If the root table size is + changed, then these maximum sizes would be need to be recalculated and + updated. */ +#define ENOUGH_LENS 852 +#define ENOUGH_DISTS 592 +#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) + +/* Type of code to build for inflate_table() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); diff --git a/Minecraft.Client/Common/zlib/trees.c b/Minecraft.Client/Common/zlib/trees.c new file mode 100644 index 00000000..1fd7759e --- /dev/null +++ b/Minecraft.Client/Common/zlib/trees.c @@ -0,0 +1,1226 @@ +/* trees.c -- output deflated data using Huffman coding + * Copyright (C) 1995-2012 Jean-loup Gailly + * detect_data_type() function provided freely by Cosmin Truta, 2006 + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process uses several Huffman trees. The more + * common source values are represented by shorter bit sequences. + * + * Each code tree is stored in a compressed form which is itself + * a Huffman encoding of the lengths of all the code strings (in + * ascending order by source values). The actual code strings are + * reconstructed from the lengths in the inflate process, as described + * in the deflate specification. + * + * REFERENCES + * + * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". + * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc + * + * Storer, James A. + * Data Compression: Methods and Theory, pp. 49-50. + * Computer Science Press, 1988. ISBN 0-7167-8156-5. + * + * Sedgewick, R. + * Algorithms, p290. + * Addison-Wesley, 1983. ISBN 0-201-06672-6. + */ + +/* @(#) $Id$ */ + +/* #define GEN_TREES_H */ + +#include "deflate.h" + +#ifdef DEBUG +# include +#endif + +/* =========================================================================== + * Constants + */ + +#define MAX_BL_BITS 7 +/* Bit length codes must not exceed MAX_BL_BITS bits */ + +#define END_BLOCK 256 +/* end of block literal code */ + +#define REP_3_6 16 +/* repeat previous bit length 3-6 times (2 bits of repeat count) */ + +#define REPZ_3_10 17 +/* repeat a zero length 3-10 times (3 bits of repeat count) */ + +#define REPZ_11_138 18 +/* repeat a zero length 11-138 times (7 bits of repeat count) */ + +local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ + = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; + +local const int extra_dbits[D_CODES] /* extra bits for each distance code */ + = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ + = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; + +local const uch bl_order[BL_CODES] + = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; +/* The lengths of the bit length codes are sent in order of decreasing + * probability, to avoid transmitting the lengths for unused bit length codes. + */ + +/* =========================================================================== + * Local data. These are initialized only once. + */ + +#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ + +#if defined(GEN_TREES_H) || !defined(STDC) +/* non ANSI compilers may not accept trees.h */ + +local ct_data static_ltree[L_CODES+2]; +/* The static literal tree. Since the bit lengths are imposed, there is no + * need for the L_CODES extra codes used during heap construction. However + * The codes 286 and 287 are needed to build a canonical tree (see _tr_init + * below). + */ + +local ct_data static_dtree[D_CODES]; +/* The static distance tree. (Actually a trivial tree since all codes use + * 5 bits.) + */ + +uch _dist_code[DIST_CODE_LEN]; +/* Distance codes. The first 256 values correspond to the distances + * 3 .. 258, the last 256 values correspond to the top 8 bits of + * the 15 bit distances. + */ + +uch _length_code[MAX_MATCH-MIN_MATCH+1]; +/* length code for each normalized match length (0 == MIN_MATCH) */ + +local int base_length[LENGTH_CODES]; +/* First normalized length for each code (0 = MIN_MATCH) */ + +local int base_dist[D_CODES]; +/* First normalized distance for each code (0 = distance of 1) */ + +#else +# include "trees.h" +#endif /* GEN_TREES_H */ + +struct static_tree_desc_s { + const ct_data *static_tree; /* static tree or NULL */ + const intf *extra_bits; /* extra bits for each code or NULL */ + int extra_base; /* base index for extra_bits */ + int elems; /* max number of elements in the tree */ + int max_length; /* max bit length for the codes */ +}; + +local static_tree_desc static_l_desc = +{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; + +local static_tree_desc static_d_desc = +{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; + +local static_tree_desc static_bl_desc = +{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; + +/* =========================================================================== + * Local (static) routines in this file. + */ + +local void tr_static_init OF((void)); +local void init_block OF((deflate_state *s)); +local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); +local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); +local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); +local void build_tree OF((deflate_state *s, tree_desc *desc)); +local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local int build_bl_tree OF((deflate_state *s)); +local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, + int blcodes)); +local void compress_block OF((deflate_state *s, const ct_data *ltree, + const ct_data *dtree)); +local int detect_data_type OF((deflate_state *s)); +local unsigned bi_reverse OF((unsigned value, int length)); +local void bi_windup OF((deflate_state *s)); +local void bi_flush OF((deflate_state *s)); +local void copy_block OF((deflate_state *s, charf *buf, unsigned len, + int header)); + +#ifdef GEN_TREES_H +local void gen_trees_header OF((void)); +#endif + +#ifndef DEBUG +# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) + /* Send a code of the given tree. c and tree must not have side effects */ + +#else /* DEBUG */ +# define send_code(s, c, tree) \ + { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ + send_bits(s, tree[c].Code, tree[c].Len); } +#endif + +/* =========================================================================== + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ +#define put_short(s, w) { \ + put_byte(s, (uch)((w) & 0xff)); \ + put_byte(s, (uch)((ush)(w) >> 8)); \ +} + +/* =========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ +#ifdef DEBUG +local void send_bits OF((deflate_state *s, int value, int length)); + +local void send_bits(s, value, length) + deflate_state *s; + int value; /* value to send */ + int length; /* number of bits */ +{ + Tracevv((stderr," l %2d v %4x ", length, value)); + Assert(length > 0 && length <= 15, "invalid length"); + s->bits_sent += (ulg)length; + + /* If not enough room in bi_buf, use (valid) bits from bi_buf and + * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) + * unused bits in value. + */ + if (s->bi_valid > (int)Buf_size - length) { + s->bi_buf |= (ush)value << s->bi_valid; + put_short(s, s->bi_buf); + s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); + s->bi_valid += length - Buf_size; + } else { + s->bi_buf |= (ush)value << s->bi_valid; + s->bi_valid += length; + } +} +#else /* !DEBUG */ + +#define send_bits(s, value, length) \ +{ int len = length;\ + if (s->bi_valid > (int)Buf_size - len) {\ + int val = value;\ + s->bi_buf |= (ush)val << s->bi_valid;\ + put_short(s, s->bi_buf);\ + s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ + s->bi_valid += len - Buf_size;\ + } else {\ + s->bi_buf |= (ush)(value) << s->bi_valid;\ + s->bi_valid += len;\ + }\ +} +#endif /* DEBUG */ + + +/* the arguments must not have side effects */ + +/* =========================================================================== + * Initialize the various 'constant' tables. + */ +local void tr_static_init() +{ +#if defined(GEN_TREES_H) || !defined(STDC) + static int static_init_done = 0; + int n; /* iterates over tree elements */ + int bits; /* bit counter */ + int length; /* length value */ + int code; /* code value */ + int dist; /* distance index */ + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + if (static_init_done) return; + + /* For some embedded targets, global variables are not initialized: */ +#ifdef NO_INIT_GLOBAL_POINTERS + static_l_desc.static_tree = static_ltree; + static_l_desc.extra_bits = extra_lbits; + static_d_desc.static_tree = static_dtree; + static_d_desc.extra_bits = extra_dbits; + static_bl_desc.extra_bits = extra_blbits; +#endif + + /* Initialize the mapping length (0..255) -> length code (0..28) */ + length = 0; + for (code = 0; code < LENGTH_CODES-1; code++) { + base_length[code] = length; + for (n = 0; n < (1< dist code (0..29) */ + dist = 0; + for (code = 0 ; code < 16; code++) { + base_dist[code] = dist; + for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ + for ( ; code < D_CODES; code++) { + base_dist[code] = dist << 7; + for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { + _dist_code[256 + dist++] = (uch)code; + } + } + Assert (dist == 256, "tr_static_init: 256+dist != 512"); + + /* Construct the codes of the static literal tree */ + for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; + n = 0; + while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; + while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; + while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; + while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); + + /* The static distance tree is trivial: */ + for (n = 0; n < D_CODES; n++) { + static_dtree[n].Len = 5; + static_dtree[n].Code = bi_reverse((unsigned)n, 5); + } + static_init_done = 1; + +# ifdef GEN_TREES_H + gen_trees_header(); +# endif +#endif /* defined(GEN_TREES_H) || !defined(STDC) */ +} + +/* =========================================================================== + * Genererate the file trees.h describing the static trees. + */ +#ifdef GEN_TREES_H +# ifndef DEBUG +# include +# endif + +# define SEPARATOR(i, last, width) \ + ((i) == (last)? "\n};\n\n" : \ + ((i) % (width) == (width)-1 ? ",\n" : ", ")) + +void gen_trees_header() +{ + FILE *header = fopen("trees.h", "w"); + int i; + + Assert (header != NULL, "Can't open trees.h"); + fprintf(header, + "/* header created automatically with -DGEN_TREES_H */\n\n"); + + fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); + for (i = 0; i < L_CODES+2; i++) { + fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, + static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); + } + + fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, + static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); + } + + fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n"); + for (i = 0; i < DIST_CODE_LEN; i++) { + fprintf(header, "%2u%s", _dist_code[i], + SEPARATOR(i, DIST_CODE_LEN-1, 20)); + } + + fprintf(header, + "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); + for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { + fprintf(header, "%2u%s", _length_code[i], + SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); + } + + fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); + for (i = 0; i < LENGTH_CODES; i++) { + fprintf(header, "%1u%s", base_length[i], + SEPARATOR(i, LENGTH_CODES-1, 20)); + } + + fprintf(header, "local const int base_dist[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "%5u%s", base_dist[i], + SEPARATOR(i, D_CODES-1, 10)); + } + + fclose(header); +} +#endif /* GEN_TREES_H */ + +/* =========================================================================== + * Initialize the tree data structures for a new zlib stream. + */ +void ZLIB_INTERNAL _tr_init(s) + deflate_state *s; +{ + tr_static_init(); + + s->l_desc.dyn_tree = s->dyn_ltree; + s->l_desc.stat_desc = &static_l_desc; + + s->d_desc.dyn_tree = s->dyn_dtree; + s->d_desc.stat_desc = &static_d_desc; + + s->bl_desc.dyn_tree = s->bl_tree; + s->bl_desc.stat_desc = &static_bl_desc; + + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef DEBUG + s->compressed_len = 0L; + s->bits_sent = 0L; +#endif + + /* Initialize the first block of the first file: */ + init_block(s); +} + +/* =========================================================================== + * Initialize a new block. + */ +local void init_block(s) + deflate_state *s; +{ + int n; /* iterates over tree elements */ + + /* Initialize the trees. */ + for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; + for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; + for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; + + s->dyn_ltree[END_BLOCK].Freq = 1; + s->opt_len = s->static_len = 0L; + s->last_lit = s->matches = 0; +} + +#define SMALLEST 1 +/* Index within the heap array of least frequent node in the Huffman tree */ + + +/* =========================================================================== + * Remove the smallest element from the heap and recreate the heap with + * one less element. Updates heap and heap_len. + */ +#define pqremove(s, tree, top) \ +{\ + top = s->heap[SMALLEST]; \ + s->heap[SMALLEST] = s->heap[s->heap_len--]; \ + pqdownheap(s, tree, SMALLEST); \ +} + +/* =========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ +#define smaller(tree, n, m, depth) \ + (tree[n].Freq < tree[m].Freq || \ + (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) + +/* =========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ +local void pqdownheap(s, tree, k) + deflate_state *s; + ct_data *tree; /* the tree to restore */ + int k; /* node to move down */ +{ + int v = s->heap[k]; + int j = k << 1; /* left son of k */ + while (j <= s->heap_len) { + /* Set j to the smallest of the two sons: */ + if (j < s->heap_len && + smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { + j++; + } + /* Exit if v is smaller than both sons */ + if (smaller(tree, v, s->heap[j], s->depth)) break; + + /* Exchange v with the smallest son */ + s->heap[k] = s->heap[j]; k = j; + + /* And continue down the tree, setting j to the left son of k */ + j <<= 1; + } + s->heap[k] = v; +} + +/* =========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ +local void gen_bitlen(s, desc) + deflate_state *s; + tree_desc *desc; /* the tree descriptor */ +{ + ct_data *tree = desc->dyn_tree; + int max_code = desc->max_code; + const ct_data *stree = desc->stat_desc->static_tree; + const intf *extra = desc->stat_desc->extra_bits; + int base = desc->stat_desc->extra_base; + int max_length = desc->stat_desc->max_length; + int h; /* heap index */ + int n, m; /* iterate over the tree elements */ + int bits; /* bit length */ + int xbits; /* extra bits */ + ush f; /* frequency */ + int overflow = 0; /* number of elements with bit length too large */ + + for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ + + for (h = s->heap_max+1; h < HEAP_SIZE; h++) { + n = s->heap[h]; + bits = tree[tree[n].Dad].Len + 1; + if (bits > max_length) bits = max_length, overflow++; + tree[n].Len = (ush)bits; + /* We overwrite tree[n].Dad which is no longer needed */ + + if (n > max_code) continue; /* not a leaf node */ + + s->bl_count[bits]++; + xbits = 0; + if (n >= base) xbits = extra[n-base]; + f = tree[n].Freq; + s->opt_len += (ulg)f * (bits + xbits); + if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); + } + if (overflow == 0) return; + + Trace((stderr,"\nbit length overflow\n")); + /* This happens for example on obj2 and pic of the Calgary corpus */ + + /* Find the first bit length which could increase: */ + do { + bits = max_length-1; + while (s->bl_count[bits] == 0) bits--; + s->bl_count[bits]--; /* move one leaf down the tree */ + s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ + s->bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits != 0; bits--) { + n = s->bl_count[bits]; + while (n != 0) { + m = s->heap[--h]; + if (m > max_code) continue; + if ((unsigned) tree[m].Len != (unsigned) bits) { + Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); + s->opt_len += ((long)bits - (long)tree[m].Len) + *(long)tree[m].Freq; + tree[m].Len = (ush)bits; + } + n--; + } + } +} + +/* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ +local void gen_codes (tree, max_code, bl_count) + ct_data *tree; /* the tree to decorate */ + int max_code; /* largest code with non zero frequency */ + ushf *bl_count; /* number of codes at each bit length */ +{ + ush next_code[MAX_BITS+1]; /* next code value for each bit length */ + ush code = 0; /* running code value */ + int bits; /* bit index */ + int n; /* code index */ + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= MAX_BITS; bits++) { + next_code[bits] = code = (code + bl_count[bits-1]) << 1; + } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; + const ct_data *stree = desc->stat_desc->static_tree; + int elems = desc->stat_desc->elems; + int n, m; /* iterate over heap elements */ + int max_code = -1; /* largest code with non zero frequency */ + int node; /* new node being created */ + + /* Construct the initial heap, with least frequent element in + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[0] is not used. + */ + s->heap_len = 0, s->heap_max = HEAP_SIZE; + + for (n = 0; n < elems; n++) { + if (tree[n].Freq != 0) { + s->heap[++(s->heap_len)] = max_code = n; + s->depth[n] = 0; + } else { + tree[n].Len = 0; + } + } + + /* The pkzip format requires that at least one distance code exists, + * and that at least one bit should be sent even if there is only one + * possible code. So to avoid special checks later on we force at least + * two codes of non zero frequency. + */ + while (s->heap_len < 2) { + node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); + tree[node].Freq = 1; + s->depth[node] = 0; + s->opt_len--; if (stree) s->static_len -= stree[node].Len; + /* node is 0 or 1 so it does not have extra bits */ + } + desc->max_code = max_code; + + /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + * establish sub-heaps of increasing lengths: + */ + for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + node = elems; /* next internal node of the tree */ + do { + pqremove(s, tree, n); /* n = node of least frequency */ + m = s->heap[SMALLEST]; /* m = node of next least frequency */ + + s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ + s->heap[--(s->heap_max)] = m; + + /* Create a new node father of n and m */ + tree[node].Freq = tree[n].Freq + tree[m].Freq; + s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? + s->depth[n] : s->depth[m]) + 1); + tree[n].Dad = tree[m].Dad = (ush)node; +#ifdef DUMP_BL_TREE + if (tree == s->bl_tree) { + fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", + node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); + } +#endif + /* and insert the new node in the heap */ + s->heap[SMALLEST] = node++; + pqdownheap(s, tree, SMALLEST); + + } while (s->heap_len >= 2); + + s->heap[--(s->heap_max)] = s->heap[SMALLEST]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + gen_bitlen(s, (tree_desc *)desc); + + /* The field len is now set, we can generate the bit codes */ + gen_codes ((ct_data *)tree, max_code, s->bl_count); +} + +/* =========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. + */ +local void scan_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + if (nextlen == 0) max_count = 138, min_count = 3; + tree[max_code+1].Len = (ush)0xffff; /* guard */ + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + s->bl_tree[curlen].Freq += count; + } else if (curlen != 0) { + if (curlen != prevlen) s->bl_tree[curlen].Freq++; + s->bl_tree[REP_3_6].Freq++; + } else if (count <= 10) { + s->bl_tree[REPZ_3_10].Freq++; + } else { + s->bl_tree[REPZ_11_138].Freq++; + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ +local void send_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + /* tree[max_code+1].Len = -1; */ /* guard already set */ + if (nextlen == 0) max_count = 138, min_count = 3; + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + do { send_code(s, curlen, s->bl_tree); } while (--count != 0); + + } else if (curlen != 0) { + if (curlen != prevlen) { + send_code(s, curlen, s->bl_tree); count--; + } + Assert(count >= 3 && count <= 6, " 3_6?"); + send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); + + } else if (count <= 10) { + send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); + + } else { + send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ +local int build_bl_tree(s) + deflate_state *s; +{ + int max_blindex; /* index of last bit length code of non zero freq */ + + /* Determine the bit length frequencies for literal and distance trees */ + scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); + scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); + + /* Build the bit length tree: */ + build_tree(s, (tree_desc *)(&(s->bl_desc))); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { + if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; + } + /* Update opt_len to include the bit length tree and counts */ + s->opt_len += 3*(max_blindex+1) + 5+5+4; + Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + s->opt_len, s->static_len)); + + return max_blindex; +} + +/* =========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ +local void send_all_trees(s, lcodes, dcodes, blcodes) + deflate_state *s; + int lcodes, dcodes, blcodes; /* number of codes for each tree */ +{ + int rank; /* index in bl_order */ + + Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + "too many codes"); + Tracev((stderr, "\nbl counts: ")); + send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes-1, 5); + send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ + for (rank = 0; rank < blcodes; rank++) { + Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); + } + Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ + Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ + Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); +} + +/* =========================================================================== + * Send a stored block + */ +void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) + deflate_state *s; + charf *buf; /* input block */ + ulg stored_len; /* length of input block */ + int last; /* one if this is the last block for a file */ +{ + send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ +#ifdef DEBUG + s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; + s->compressed_len += (stored_len + 4) << 3; +#endif + copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ +} + +/* =========================================================================== + * Flush the bits in the bit buffer to pending output (leaves at most 7 bits) + */ +void ZLIB_INTERNAL _tr_flush_bits(s) + deflate_state *s; +{ + bi_flush(s); +} + +/* =========================================================================== + * Send one empty static block to give enough lookahead for inflate. + * This takes 10 bits, of which 7 may remain in the bit buffer. + */ +void ZLIB_INTERNAL _tr_align(s) + deflate_state *s; +{ + send_bits(s, STATIC_TREES<<1, 3); + send_code(s, END_BLOCK, static_ltree); +#ifdef DEBUG + s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ +#endif + bi_flush(s); +} + +/* =========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and output the encoded block to the zip file. + */ +void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) + deflate_state *s; + charf *buf; /* input block, or NULL if too old */ + ulg stored_len; /* length of input block */ + int last; /* one if this is the last block for a file */ +{ + ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ + int max_blindex = 0; /* index of last bit length code of non zero freq */ + + /* Build the Huffman trees unless a stored block is forced */ + if (s->level > 0) { + + /* Check if the file is binary or text */ + if (s->strm->data_type == Z_UNKNOWN) + s->strm->data_type = detect_data_type(s); + + /* Construct the literal and distance trees */ + build_tree(s, (tree_desc *)(&(s->l_desc))); + Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + + build_tree(s, (tree_desc *)(&(s->d_desc))); + Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = build_bl_tree(s); + + /* Determine the best encoding. Compute the block lengths in bytes. */ + opt_lenb = (s->opt_len+3+7)>>3; + static_lenb = (s->static_len+3+7)>>3; + + Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", + opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, + s->last_lit)); + + if (static_lenb <= opt_lenb) opt_lenb = static_lenb; + + } else { + Assert(buf != (char*)0, "lost buf"); + opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ + } + +#ifdef FORCE_STORED + if (buf != (char*)0) { /* force stored block */ +#else + if (stored_len+4 <= opt_lenb && buf != (char*)0) { + /* 4: two words for the lengths */ +#endif + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + _tr_stored_block(s, buf, stored_len, last); + +#ifdef FORCE_STATIC + } else if (static_lenb >= 0) { /* force static trees */ +#else + } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { +#endif + send_bits(s, (STATIC_TREES<<1)+last, 3); + compress_block(s, (const ct_data *)static_ltree, + (const ct_data *)static_dtree); +#ifdef DEBUG + s->compressed_len += 3 + s->static_len; +#endif + } else { + send_bits(s, (DYN_TREES<<1)+last, 3); + send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, + max_blindex+1); + compress_block(s, (const ct_data *)s->dyn_ltree, + (const ct_data *)s->dyn_dtree); +#ifdef DEBUG + s->compressed_len += 3 + s->opt_len; +#endif + } + Assert (s->compressed_len == s->bits_sent, "bad compressed size"); + /* The above check is made mod 2^32, for files larger than 512 MB + * and uLong implemented on 32 bits. + */ + init_block(s); + + if (last) { + bi_windup(s); +#ifdef DEBUG + s->compressed_len += 7; /* align on byte boundary */ +#endif + } + Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, + s->compressed_len-7*last)); +} + +/* =========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ +int ZLIB_INTERNAL _tr_tally (s, dist, lc) + deflate_state *s; + unsigned dist; /* distance of matched string */ + unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ +{ + s->d_buf[s->last_lit] = (ush)dist; + s->l_buf[s->last_lit++] = (uch)lc; + if (dist == 0) { + /* lc is the unmatched char */ + s->dyn_ltree[lc].Freq++; + } else { + s->matches++; + /* Here, lc is the match length - MIN_MATCH */ + dist--; /* dist = match distance - 1 */ + Assert((ush)dist < (ush)MAX_DIST(s) && + (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); + + s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; + s->dyn_dtree[d_code(dist)].Freq++; + } + +#ifdef TRUNCATE_BLOCK + /* Try to guess if it is profitable to stop the current block here */ + if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { + /* Compute an upper bound for the compressed length */ + ulg out_length = (ulg)s->last_lit*8L; + ulg in_length = (ulg)((long)s->strstart - s->block_start); + int dcode; + for (dcode = 0; dcode < D_CODES; dcode++) { + out_length += (ulg)s->dyn_dtree[dcode].Freq * + (5L+extra_dbits[dcode]); + } + out_length >>= 3; + Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", + s->last_lit, in_length, out_length, + 100L - out_length*100L/in_length)); + if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; + } +#endif + return (s->last_lit == s->lit_bufsize-1); + /* We avoid equality with lit_bufsize because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ +} + +/* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ +local void compress_block(s, ltree, dtree) + deflate_state *s; + const ct_data *ltree; /* literal tree */ + const ct_data *dtree; /* distance tree */ +{ + unsigned dist; /* distance of matched string */ + int lc; /* match length or unmatched char (if dist == 0) */ + unsigned lx = 0; /* running index in l_buf */ + unsigned code; /* the code to send */ + int extra; /* number of extra bits to send */ + + if (s->last_lit != 0) do { + dist = s->d_buf[lx]; + lc = s->l_buf[lx++]; + if (dist == 0) { + send_code(s, lc, ltree); /* send a literal byte */ + Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code[lc]; + send_code(s, code+LITERALS+1, ltree); /* send the length code */ + extra = extra_lbits[code]; + if (extra != 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + Assert (code < D_CODES, "bad d_code"); + + send_code(s, code, dtree); /* send the distance code */ + extra = extra_dbits[code]; + if (extra != 0) { + dist -= base_dist[code]; + send_bits(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ + + /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ + Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, + "pendingBuf overflow"); + + } while (lx < s->last_lit); + + send_code(s, END_BLOCK, ltree); +} + +/* =========================================================================== + * Check if the data type is TEXT or BINARY, using the following algorithm: + * - TEXT if the two conditions below are satisfied: + * a) There are no non-portable control characters belonging to the + * "black list" (0..6, 14..25, 28..31). + * b) There is at least one printable character belonging to the + * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). + * - BINARY otherwise. + * - The following partially-portable control characters form a + * "gray list" that is ignored in this detection algorithm: + * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). + * IN assertion: the fields Freq of dyn_ltree are set. + */ +local int detect_data_type(s) + deflate_state *s; +{ + /* black_mask is the bit mask of black-listed bytes + * set bits 0..6, 14..25, and 28..31 + * 0xf3ffc07f = binary 11110011111111111100000001111111 + */ + unsigned long black_mask = 0xf3ffc07fUL; + int n; + + /* Check for non-textual ("black-listed") bytes. */ + for (n = 0; n <= 31; n++, black_mask >>= 1) + if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0)) + return Z_BINARY; + + /* Check for textual ("white-listed") bytes. */ + if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 + || s->dyn_ltree[13].Freq != 0) + return Z_TEXT; + for (n = 32; n < LITERALS; n++) + if (s->dyn_ltree[n].Freq != 0) + return Z_TEXT; + + /* There are no "black-listed" or "white-listed" bytes: + * this stream either is empty or has tolerated ("gray-listed") bytes only. + */ + return Z_BINARY; +} + +/* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ +local unsigned bi_reverse(code, len) + unsigned code; /* the value to invert */ + int len; /* its bit length */ +{ + register unsigned res = 0; + do { + res |= code & 1; + code >>= 1, res <<= 1; + } while (--len > 0); + return res >> 1; +} + +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +local void bi_flush(s) + deflate_state *s; +{ + if (s->bi_valid == 16) { + put_short(s, s->bi_buf); + s->bi_buf = 0; + s->bi_valid = 0; + } else if (s->bi_valid >= 8) { + put_byte(s, (Byte)s->bi_buf); + s->bi_buf >>= 8; + s->bi_valid -= 8; + } +} + +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +local void bi_windup(s) + deflate_state *s; +{ + if (s->bi_valid > 8) { + put_short(s, s->bi_buf); + } else if (s->bi_valid > 0) { + put_byte(s, (Byte)s->bi_buf); + } + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef DEBUG + s->bits_sent = (s->bits_sent+7) & ~7; +#endif +} + +/* =========================================================================== + * Copy a stored block, storing first the length and its + * one's complement if requested. + */ +local void copy_block(s, buf, len, header) + deflate_state *s; + charf *buf; /* the input data */ + unsigned len; /* its length */ + int header; /* true if block header must be written */ +{ + bi_windup(s); /* align on byte boundary */ + + if (header) { + put_short(s, (ush)len); + put_short(s, (ush)~len); +#ifdef DEBUG + s->bits_sent += 2*16; +#endif + } +#ifdef DEBUG + s->bits_sent += (ulg)len<<3; +#endif + while (len--) { + put_byte(s, *buf++); + } +} diff --git a/Minecraft.Client/Common/zlib/trees.h b/Minecraft.Client/Common/zlib/trees.h new file mode 100644 index 00000000..d35639d8 --- /dev/null +++ b/Minecraft.Client/Common/zlib/trees.h @@ -0,0 +1,128 @@ +/* header created automatically with -DGEN_TREES_H */ + +local const ct_data static_ltree[L_CODES+2] = { +{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, +{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, +{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, +{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, +{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, +{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, +{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, +{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, +{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, +{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, +{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, +{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, +{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, +{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, +{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, +{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, +{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, +{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, +{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, +{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, +{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, +{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, +{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, +{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, +{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, +{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, +{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, +{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, +{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, +{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, +{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, +{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, +{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, +{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, +{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, +{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, +{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, +{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, +{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, +{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, +{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, +{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, +{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, +{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, +{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, +{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, +{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, +{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, +{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, +{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, +{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, +{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, +{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, +{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, +{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, +{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, +{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, +{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} +}; + +local const ct_data static_dtree[D_CODES] = { +{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, +{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, +{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, +{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, +{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, +{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} +}; + +const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = { + 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, +10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, +11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, +12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, +18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 +}; + +const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, +13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, +17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, +19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, +21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, +22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 +}; + +local const int base_length[LENGTH_CODES] = { +0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, +64, 80, 96, 112, 128, 160, 192, 224, 0 +}; + +local const int base_dist[D_CODES] = { + 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, + 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, + 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 +}; + diff --git a/Minecraft.Client/Common/zlib/uncompr.c b/Minecraft.Client/Common/zlib/uncompr.c new file mode 100644 index 00000000..242e9493 --- /dev/null +++ b/Minecraft.Client/Common/zlib/uncompr.c @@ -0,0 +1,59 @@ +/* uncompr.c -- decompress a memory buffer + * Copyright (C) 1995-2003, 2010 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +/* =========================================================================== + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted. +*/ +int ZEXPORT uncompress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + z_stream stream; + int err; + + stream.next_in = (z_const Bytef *)source; + stream.avail_in = (uInt)sourceLen; + /* Check for source > 64K on 16-bit machine: */ + if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; + + stream.next_out = dest; + stream.avail_out = (uInt)*destLen; + if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + + err = inflateInit(&stream); + if (err != Z_OK) return err; + + err = inflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + inflateEnd(&stream); + if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) + return Z_DATA_ERROR; + return err; + } + *destLen = stream.total_out; + + err = inflateEnd(&stream); + return err; +} diff --git a/Minecraft.Client/Common/zlib/zconf.h b/Minecraft.Client/Common/zlib/zconf.h new file mode 100644 index 00000000..9987a775 --- /dev/null +++ b/Minecraft.Client/Common/zlib/zconf.h @@ -0,0 +1,511 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2013 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET + +/* all linked symbols */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePending z_deflatePending +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzvprintf z_gzvprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# endif +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetHeader z_inflateGetHeader +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateSetDictionary z_inflateSetDictionary +# define inflateGetDictionary z_inflateGetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflateResetKeep z_inflateResetKeep +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# ifndef Z_SOLO +# define uncompress z_uncompress +# endif +# define zError z_zError +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + +#ifdef STDC +# ifndef Z_SOLO +# include /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include /* for wchar_t */ +# endif +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if !defined(_WIN32) && defined(Z_LARGE64) +# define z_off64_t off64_t +#else +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/Minecraft.Client/Common/zlib/zlib.h b/Minecraft.Client/Common/zlib/zlib.h new file mode 100644 index 00000000..3e0c7672 --- /dev/null +++ b/Minecraft.Client/Common/zlib/zlib.h @@ -0,0 +1,1768 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.8, April 28th, 2013 + + Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 + (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.8" +#define ZLIB_VERNUM 0x1280 +#define ZLIB_VER_MAJOR 1 +#define ZLIB_VER_MINOR 2 +#define ZLIB_VER_REVISION 8 +#define ZLIB_VER_SUBREVISION 0 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed data. + This version of the library supports only one compression method (deflation) + but other algorithms will be added later and will have the same stream + interface. + + Compression can be done in a single step if the buffers are large enough, + or can be done by repeated calls of the compression function. In the latter + case, the application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip streams in memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never crash + even in case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + z_const Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total number of input bytes read so far */ + + Bytef *next_out; /* next output byte should be put there */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total number of bytes output so far */ + + z_const char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text */ + uLong adler; /* adler32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +typedef struct gz_header_s { + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef *extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} gz_header; + +typedef gz_header FAR *gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has dropped + to zero. It must update next_out and avail_out when avail_out has dropped + to zero. The application must initialize zalloc, zfree and opaque before + calling the init function. All other fields are set by the compression + library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this if + the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers + returned by zalloc for objects of exactly 65536 bytes *must* have their + offset normalized to zero. The default allocation function provided by this + library ensures this (see zutil.c). To reduce memory requirements and avoid + any allocation of 64K objects, at the expense of compression ratio, compile + the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or progress + reports. After compression, total_in holds the total size of the + uncompressed data and may be saved for use in the decompressor (particularly + if the decompressor wants to decompress everything in a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +#define Z_TREES 6 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_FIXED 4 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_TEXT 1 +#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +#define Z_UNKNOWN 2 +/* Possible values of the data_type field (though see inflate()) */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + + /* basic functions */ + +ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is not + compatible with the zlib.h header file used by the application. This check + is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. If + zalloc and zfree are set to Z_NULL, deflateInit updates them to use default + allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at all + (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION + requests a default compromise between speed and compression (currently + equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if level is not a valid compression level, or + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). msg is set to null + if there is no error message. deflateInit does not perform any compression: + this will be done by deflate(). +*/ + + +ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). Some + output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating avail_in or avail_out accordingly; avail_out should + never be zero before the call. The application can consume the compressed + output when it wants, for example when the output buffer is full (avail_out + == 0), or after each call of deflate(). If deflate returns Z_OK and with + zero avail_out, it must be called again after making room in the output + buffer because there might be more output pending. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumulate before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In + particular avail_in is zero after the call if enough output space has been + provided before the call.) Flushing may degrade compression for some + compression algorithms and so it should be used only when necessary. This + completes the current deflate block and follows it with an empty stored block + that is three bits plus filler bits to the next byte, followed by four bytes + (00 00 ff ff). + + If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the + output buffer, but the output is not aligned to a byte boundary. All of the + input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. + This completes the current deflate block and follows it with an empty fixed + codes block that is 10 bits long. This assures that enough bytes are output + in order for the decompressor to finish the block before the empty fixed code + block. + + If flush is set to Z_BLOCK, a deflate block is completed and emitted, as + for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to + seven bits of the current block are held to be written as the next byte after + the next deflate block is completed. In this case, the decompressor may not + be provided enough bits at this point in order to complete decompression of + the data provided so far to the compressor. It may need to wait for the next + block to be emitted. This is for advanced applications that need to control + the emission of deflate blocks. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there was + enough output space; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the stream + are deflateReset or deflateEnd. + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least the + value returned by deflateBound (see below). Then deflate is guaranteed to + return Z_STREAM_END. If not enough output space is provided, deflate will + not return Z_STREAM_END, and it must be called again as described above. + + deflate() sets strm->adler to the adler32 checksum of all input read + so far (that is, total_in bytes). + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered + binary. This field is only for information purposes and does not affect the + compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not + fatal, and deflate() can be called again with more input and more output + space to continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, msg + may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the + exact value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit() does not process any header information -- that is deferred + until inflate() is called. +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing will + resume at this point for the next call of inflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there is + no more input data or no more space in the output buffer (see below about + the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating the next_* and avail_* values accordingly. The + application can consume the uncompressed output when it wants, for example + when the output buffer is full (avail_out == 0), or after each call of + inflate(). If inflate returns Z_OK and with zero avail_out, it must be + called again after making room in the output buffer because there might be + more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, + Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() + stop if and when it gets to the next deflate block boundary. When decoding + the zlib or gzip format, this will cause inflate() to return immediately + after the header and before the first block. When doing a raw inflate, + inflate() will go ahead and process the first block, and will return when it + gets to the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + Also to assist in this, on return inflate() will set strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 if + inflate() is currently decoding the last block in the deflate stream, plus + 128 if inflate() returned immediately after decoding an end-of-block code or + decoding the complete header up to just before the first byte of the deflate + stream. The end-of-block will not be indicated until all of the uncompressed + data from that block has been written to strm->next_out. The number of + unused bits may in general be greater than seven, except when bit 7 of + data_type is set, in which case the number of unused bits will be less than + eight. data_type is set as noted here every time inflate() returns for all + flush options, and so can be used to determine the amount of currently + consumed input in bits. + + The Z_TREES option behaves as Z_BLOCK does, but it also returns when the + end of each deflate block header is reached, before any actual data in that + block is decoded. This allows the caller to determine the length of the + deflate block header for later use in random access within a deflate block. + 256 is added to the value of strm->data_type when inflate() returns + immediately after reaching the end of the deflate block header. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step (a + single call of inflate), the parameter flush should be set to Z_FINISH. In + this case all pending input is processed and all pending output is flushed; + avail_out must be large enough to hold all of the uncompressed data for the + operation to complete. (The size of the uncompressed data may have been + saved by the compressor for this purpose.) The use of Z_FINISH is not + required to perform an inflation in one step. However it may be used to + inform inflate that a faster approach can be used for the single inflate() + call. Z_FINISH also informs inflate to not maintain a sliding window if the + stream completes, which reduces inflate's memory footprint. If the stream + does not complete, either because not all of the stream is provided or not + enough output space is provided, then a sliding window will be allocated and + inflate() can be called again to continue the operation as if Z_NO_FLUSH had + been used. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the effects of the flush parameter in this implementation are + on the return value of inflate() as noted below, when inflate() returns early + when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of + memory for a sliding window when Z_FINISH is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the Adler-32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the Adler-32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed adler32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() can decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically, if requested when + initializing with inflateInit2(). Any information contained in the gzip + header is not retained, so applications that need that information should + instead use raw inflate, see inflateInit2() below, or inflateBack() and + perform their own processing of the gzip header and trailer. When processing + gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output + producted so far. The CRC-32 is checked against the gzip trailer. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value), Z_STREAM_ERROR if the stream structure was inconsistent (for example + next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory, + Z_BUF_ERROR if no progress is possible or if there was not enough room in the + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may + then call inflateSync() to look for a good compression block if a partial + recovery of the data is desired. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +*/ + + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by the + caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute an adler32 check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), no + header crc, and the operating system will be set to 255 (unknown). If a + gzip stream is being written, strm->adler is a crc32 instead of an adler32. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but is + slow and reduces compression ratio; memLevel=9 uses maximum memory for + optimal speed. The default value is 8. See zconf.h for total memory usage + as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as + fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The + strategy parameter only affects the compression ratio but not the + correctness of the compressed output even if it is not set appropriately. + Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler + decoder for special applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid + method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is + incompatible with the version assumed by the caller (ZLIB_VERSION). msg is + set to null if there is no error message. deflateInit2 does not perform any + compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. When using the zlib format, this + function must be called immediately after deflateInit, deflateInit2 or + deflateReset, and before any call of deflate. When doing raw deflate, this + function must be called either before any call of deflate, or immediately + after the completion of a deflate block, i.e. after all input has been + consumed and all output has been delivered when using any of the flush + options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The + compressor and decompressor must use exactly the same dictionary (see + inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size + provided in deflateInit or deflateInit2. Thus the strings most likely to be + useful should be put at the end of the dictionary, not at the front. In + addition, the current implementation of deflate will use at most the window + size minus 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the adler32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + adler32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if not at a block boundary for raw deflate). deflateSetDictionary does + not perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and can + consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. The + stream will keep the same compression level and any other attributes that + may have been set by deflateInit2. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different strategy. + If the compression level is changed, the input available so far is + compressed with the old level (and may be flushed); the new level will take + effect only at the next call of deflate(). + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to be + compressed and flushed. In particular, strm->avail_out must be non-zero. + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if + strm->avail_out was zero. +*/ + +ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain)); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() or + deflateInit2(), and after deflateSetHeader(), if used. This would be used + to allocate an output buffer for deflation in a single pass, and so would be + called before deflate(). If that first deflate() call is provided the + sourceLen input bytes, an output buffer allocated to the size returned by + deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed + to return Z_STREAM_END. Note that it is possible for the compressed size to + be larger than the value returned by deflateBound() if flush options other + than Z_FINISH or Z_NO_FLUSH are used. +*/ + +ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, + unsigned *pending, + int *bits)); +/* + deflatePending() returns the number of bytes and bits of output that have + been generated, but not yet provided in the available output. The bytes not + provided would be due to the available output space having being consumed. + The number of bits of output not provided are between 0 and 7, where they + await more bits to join them in order to fill out a full byte. If pending + or bits are Z_NULL, then those values are not set. + + deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. + */ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the bits + leftover from a previous deflate stream when appending to it. As such, this + function can only be used for raw deflate, and must be used before the first + deflate() call after a deflateInit2() or deflateReset(). bits must be less + than or equal to 16, and that many of the least significant bits of value + will be inserted in the output. + + deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough + room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, + gz_headerp head)); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be zero to request that inflate use the window size in + the zlib header of the compressed stream. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an adler32 or a crc32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a + crc32 instead of an adler32. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit2 does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit2() does not process any header information -- that is + deferred until inflate() is called. +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the adler32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called at any + time to set the dictionary. If the provided dictionary is smaller than the + window and there is already data in the window, then the provided dictionary + will amend what's there. The application must insure that the dictionary + that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, + Bytef *dictionary, + uInt *dictLength)); +/* + Returns the sliding dictionary being maintained by inflate. dictLength is + set to the number of bytes in the dictionary, and that many bytes are copied + to dictionary. dictionary must have enough space, where 32768 bytes is + always enough. If inflateGetDictionary() is called with dictionary equal to + Z_NULL, then only the dictionary length is returned, and nothing is copied. + Similary, if dictLength is Z_NULL, then it is not set. + + inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the + stream state is inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a possible full flush point (see above + for the description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync searches for a 00 00 FF FF pattern in the compressed data. + All full flush points have this pattern, but not all occurrences of this + pattern are full flush points. + + inflateSync returns Z_OK if a possible full flush point has been found, + Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point + has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. + In the success case, the application may save the current current value of + total_in which indicates where valid compressed data was found. In the + error case, the application may repeatedly call inflateSync, providing more + input each time, until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. The + stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, + int windowBits)); +/* + This function is the same as inflateReset, but it also permits changing + the wrap and window size requests. The windowBits parameter is interpreted + the same as it is for inflateInit2. + + inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL), or if + the windowBits parameter is invalid. +*/ + +ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + If bits is negative, then the input stream bit buffer is emptied. Then + inflatePrime() can be called again to put bits in the buffer. This is used + to clear out bits leftover after feeding inflate a block description prior + to feeding inflate codes. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); +/* + This function returns two values, one in the lower 16 bits of the return + value, and the other in the remaining upper bits, obtained by shifting the + return value down 16 bits. If the upper value is -1 and the lower value is + zero, then inflate() is currently decoding information outside of a block. + If the upper value is -1 and the lower value is non-zero, then inflate is in + the middle of a stored block, with the lower value equaling the number of + bytes from the input remaining to copy. If the upper value is not -1, then + it is the number of bits back from the current bit position in the input of + the code (literal or length/distance pair) currently being processed. In + that case the lower value is the number of bytes already emitted for that + code. + + A code is being processed if inflate is waiting for more input to complete + decoding of the code, or if it has completed decoding but is waiting for + more output space to write the literal or match data. + + inflateMark() is used to mark locations in the input data for random + access, which may be at bit positions, and to note those cases where the + output of a code may span boundaries of random access blocks. The current + location in the input stream can be determined from avail_in and data_type + as noted in the description for the Z_BLOCK flush parameter for inflate. + + inflateMark returns the value noted above or -1 << 16 if the provided + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, + gz_headerp head)); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be + used to force inflate() to return immediately after header processing is + complete and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When any + of extra, name, or comment are not Z_NULL and the respective field is not + present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the parameters are invalid, Z_MEM_ERROR if the internal state could not be + allocated, or Z_VERSION_ERROR if the version of the library does not match + the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, + z_const unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is potentially more efficient than + inflate() for file i/o applications, in that it avoids copying between the + output and the sliding window by simply making the window itself the output + buffer. inflate() can be faster on modern CPUs when used with large + buffers. inflateBack() trusts the application to not change the output + buffer passed by the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free the + allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects only + the raw deflate stream to decompress. This is different from the normal + behavior of inflate(), which expects either a zlib or gzip header and + trailer around the deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero--buf is ignored in that + case--and inflateBack() will return a buffer error. inflateBack() will call + out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() + should return zero on success, or non-zero on failure. If out() returns + non-zero, inflateBack() will return with an error. Neither in() nor out() + are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format error + in the deflate stream (in which case strm->msg is set to indicate the nature + of the error), or Z_STREAM_ERROR if the stream was not properly initialized. + In the case of Z_BUF_ERROR, an input or output error can be distinguished + using strm->next_in which will be Z_NULL only if in() returned an error. If + strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning + non-zero. (in() will always be called before out(), so strm->next_in is + assured to be defined if out() returns non-zero.) Note that inflateBack() + cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + +#ifndef Z_SOLO + + /* utility functions */ + +/* + The following utility functions are implemented on top of the basic + stream-oriented functions. To simplify the interface, some default options + are assumed (compression level and memory usage, standard memory allocation + functions). The source code of these utility functions can be modified if + you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before a + compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be large enough to hold the entire + uncompressed data. (The size of the uncompressed data must have been saved + previously by the compressor and transmitted to the decompressor by some + mechanism outside the scope of this compression library.) Upon exit, destLen + is the actual size of the uncompressed buffer. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In + the case where there is not enough room, uncompress() will fill the output + buffer with the uncompressed data up to that point. +*/ + + /* gzip file access functions */ + +/* + This library supports reading and writing files in gzip (.gz) format with + an interface similar to that of stdio, using the functions that start with + "gz". The gzip format is different from the zlib format. gzip is a gzip + wrapper, documented in RFC 1952, wrapped around a deflate stream. +*/ + +typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ + +/* +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); + + Opens a gzip (.gz) file for reading or writing. The mode parameter is as + in fopen ("rb" or "wb") but can also include a compression level ("wb9") or + a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only + compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' + for fixed code compression as in "wb9F". (See the description of + deflateInit2 for more information about the strategy parameter.) 'T' will + request transparent writing or appending with no compression and not using + the gzip format. + + "a" can be used instead of "w" to request that the gzip stream that will + be written be appended to the file. "+" will result in an error, since + reading and writing to the same gzip file is not supported. The addition of + "x" when writing will create the file exclusively, which fails if the file + already exists. On systems that support it, the addition of "e" when + reading or writing will set the flag to close the file on an execve() call. + + These functions, as well as gzip, will read and decode a sequence of gzip + streams in a file. The append function of gzopen() can be used to create + such a file. (Also see gzflush() for another way to do this.) When + appending, gzopen does not test whether the file begins with a gzip stream, + nor does it look for the end of the gzip streams to begin appending. gzopen + will simply append a gzip stream to the existing file. + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. When + reading, this will be detected automatically by looking for the magic two- + byte gzip header. + + gzopen returns NULL if the file could not be opened, if there was + insufficient memory to allocate the gzFile state, or if an invalid mode was + specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). + errno can be checked to determine if the reason gzopen failed was that the + file could not be opened. +*/ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + gzdopen associates a gzFile with the file descriptor fd. File descriptors + are obtained from calls like open, dup, creat, pipe or fileno (if the file + has been previously opened with fopen). The mode parameter is as in gzopen. + + The next call of gzclose on the returned gzFile will also close the file + descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor + fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, + mode);. The duplicated descriptor should be saved to avoid a leak, since + gzdopen does not close fd if it fails. If you are using fileno() to get the + file descriptor from a FILE *, then you will have to use dup() to avoid + double-close()ing the file descriptor. Both gzclose() and fclose() will + close the associated file descriptor, so they need to have different file + descriptors. + + gzdopen returns NULL if there was insufficient memory to allocate the + gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not + provided, or '+' was provided), or if fd is -1. The file descriptor is not + used until the next gz* read, write, seek, or close operation, so gzdopen + will not detect if fd is invalid (unless fd is -1). +*/ + +ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); +/* + Set the internal buffer size used by this library's functions. The + default buffer size is 8192 bytes. This function must be called after + gzopen() or gzdopen(), and before any other calls that read or write the + file. The buffer memory allocation is always deferred to the first read or + write. Two buffers are allocated, either both of the specified size when + writing, or one of the specified size and the other twice that size when + reading. A larger buffer size of, for example, 64K or 128K bytes will + noticeably increase the speed of decompression (reading). + + The new buffer size also affects the maximum length for gzprintf(). + + gzbuffer() returns 0 on success, or -1 on failure, such as being called + too late. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. + + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Reads the given number of uncompressed bytes from the compressed file. If + the input file is not in gzip format, gzread copies the given number of + bytes into the buffer directly from the file. + + After reaching the end of a gzip stream in the input, gzread will continue + to read, looking for another gzip stream. Any number of gzip streams may be + concatenated in the input file, and will all be decompressed by gzread(). + If something other than a gzip stream is encountered after a gzip stream, + that remaining trailing garbage is ignored (and no error is returned). + + gzread can be used to read a gzip file that is being concurrently written. + Upon reaching the end of the input, gzread will return with the available + data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then + gzclearerr can be used to clear the end of file indicator in order to permit + gzread to be tried again. Z_OK indicates that a gzip stream was completed + on the last gzread. Z_BUF_ERROR indicates that the input file ended in the + middle of a gzip stream. Note that gzread does not return -1 in the event + of an incomplete gzip stream. This error is deferred until gzclose(), which + will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip + stream. Alternatively, gzerror can be used before gzclose to detect this + case. + + gzread returns the number of uncompressed bytes actually read, less than + len for end of file, or -1 for error. +*/ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes written or 0 in case of + error. +*/ + +ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the arguments to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written, or 0 in case of error. The number of + uncompressed bytes written is limited to 8191, or one less than the buffer + size given to gzbuffer(). The caller should assure that this limit is not + exceeded. If it is exceeded, then gzprintf() will return an error (0) with + nothing written. In this case, there may also be a buffer overflow with + unpredictable consequences, which is possible only if zlib was compiled with + the insecure functions sprintf() or vsprintf() because the secure snprintf() + or vsnprintf() functions were not available. This can be determined using + zlibCompileFlags(). +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Reads bytes from the compressed file until len-1 characters are read, or a + newline character is read and transferred to buf, or an end-of-file + condition is encountered. If any characters are read or if len == 1, the + string is terminated with a null character. If no characters are read due + to an end-of-file or len < 1, then the buffer is left untouched. + + gzgets returns buf which is a null-terminated string, or it returns NULL + for end-of-file or in case of error. If there was an error, the contents at + buf are indeterminate. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Writes c, converted to an unsigned char, into the compressed file. gzputc + returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Reads one byte from the compressed file. gzgetc returns this byte or -1 + in case of end of file or error. This is implemented as a macro for speed. + As such, it does not do all of the checking the other functions do. I.e. + it does not check to see if file is NULL, nor whether the structure file + points to has been clobbered or not. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push one character back onto the stream to be read as the first character + on the next read. At least one character of push-back is allowed. + gzungetc() returns the character pushed, or -1 on failure. gzungetc() will + fail if c is -1, and may fail if a character has been pushed but not read + yet. If gzungetc is used immediately after gzopen or gzdopen, at least the + output buffer size of pushed characters is allowed. (See gzbuffer above.) + The pushed character will be discarded if the stream is repositioned with + gzseek() or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flushes all pending output into the compressed file. The parameter flush + is as in the deflate() function. The return value is the zlib error number + (see function gzerror below). gzflush is only permitted when writing. + + If the flush parameter is Z_FINISH, the remaining data is written and the + gzip stream is completed in the output. If gzwrite() is called again, a new + gzip stream will be started in the output. gzread() is able to read such + concatented gzip streams. + + gzflush should be called only when strictly necessary because it will + degrade compression if called too often. +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); + + Sets the starting position for the next gzread or gzwrite on the given + compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); + + Returns the starting position for the next gzread or gzwrite on the given + compressed file. This position represents a number of bytes in the + uncompressed data stream, and is zero when starting, even if appending or + reading a gzip stream from the middle of a file using gzdopen(). + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); + + Returns the current offset in the file being read or written. This offset + includes the count of bytes that precede the gzip stream, for example when + appending or when using gzdopen() for reading. When reading, the offset + does not include as yet unused buffered input. This information can be used + for a progress indicator. On error, gzoffset() returns -1. +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Returns true (1) if the end-of-file indicator has been set while reading, + false (0) otherwise. Note that the end-of-file indicator is set only if the + read tried to go past the end of the input, but came up short. Therefore, + just like feof(), gzeof() may return false even if there is no more data to + read, in the event that the last read request was for the exact number of + bytes remaining in the input file. This will happen if the input file size + is an exact multiple of the buffer size. + + If gzeof() returns true, then the read functions will return no more data, + unless the end-of-file indicator is reset by gzclearerr() and the input file + has grown since the previous end of file was detected. +*/ + +ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +/* + Returns true (1) if file is being copied directly while reading, or false + (0) if file is a gzip stream being decompressed. + + If the input file is empty, gzdirect() will return true, since the input + does not contain a gzip stream. + + If gzdirect() is used immediately after gzopen() or gzdopen() it will + cause buffers to be allocated to allow reading the file to determine if it + is a gzip file. Therefore if gzbuffer() is used, it should be called before + gzdirect(). + + When writing, gzdirect() returns true (1) if transparent writing was + requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: + gzdirect() is not needed when writing. Transparent writing must be + explicitly requested, so the application already knows the answer. When + linking statically, using gzdirect() will include all of the zlib code for + gzip file reading and decompression, which may not be desired.) +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flushes all pending output if necessary, closes the compressed file and + deallocates the (de)compression state. Note that once file is closed, you + cannot call gzerror with file, since its structures have been deallocated. + gzclose must not be called more than once on the same file, just as free + must not be called more than once on the same allocation. + + gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a + file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the + last read ended in the middle of a gzip stream, or Z_OK on success. +*/ + +ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); +/* + Same as gzclose(), but gzclose_r() is only for use when reading, and + gzclose_w() is only for use when writing or appending. The advantage to + using these instead of gzclose() is that they avoid linking in zlib + compression or decompression code that is not used when only reading or only + writing respectively. If gzclose() is used, then both compression and + decompression code will be included the application when linking to a static + zlib library. +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Returns the error message for the last error which occurred on the given + compressed file. errnum is set to zlib error number. If an error occurred + in the file system and not in the compression library, errnum is set to + Z_ERRNO and the application may consult errno to get the exact error code. + + The application must not modify the returned string. Future calls to + this function may invalidate the previously returned string. If file is + closed, then the string previously returned by gzerror will no longer be + available. + + gzerror() should be used to distinguish errors from end-of-file for those + functions above that do not distinguish those cases in their return values. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + +#endif /* !Z_SOLO */ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the compression + library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is Z_NULL, this function returns the + required initial value for the checksum. + + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. + + Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +/* +ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, + z_off_t len2)); + + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note + that the z_off_t type (like off_t) is a signed integer. If len2 is + negative, the result has no meaning or utility. +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is Z_NULL, this function returns the required + initial value for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. + + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +/* +ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); + + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) +#define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) +#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) +#define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) +#define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, (int)sizeof(z_stream)) + +#ifndef Z_SOLO + +/* gzgetc() macro and its supporting function and exposed data structure. Note + * that the real internal state is much larger than the exposed structure. + * This abbreviated structure exposes just enough for the gzgetc() macro. The + * user should not mess with these exposed elements, since their names or + * behavior could change in the future, perhaps even capriciously. They can + * only be used by the gzgetc() macro. You have been warned. + */ +struct gzFile_s { + unsigned have; + unsigned char *next; + z_off64_t pos; +}; +ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +# define z_gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) +#else +# define gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) +#endif + +/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or + * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if + * both are true, the application gets the *64 functions, and the regular + * functions are changed to 64 bits) -- in case these are set on systems + * without large file support, _LFS64_LARGEFILE must also be true + */ +#ifdef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); +#endif + +#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) +# ifdef Z_PREFIX_SET +# define z_gzopen z_gzopen64 +# define z_gzseek z_gzseek64 +# define z_gztell z_gztell64 +# define z_gzoffset z_gzoffset64 +# define z_adler32_combine z_adler32_combine64 +# define z_crc32_combine z_crc32_combine64 +# else +# define gzopen gzopen64 +# define gzseek gzseek64 +# define gztell gztell64 +# define gzoffset gzoffset64 +# define adler32_combine adler32_combine64 +# define crc32_combine crc32_combine64 +# endif +# ifndef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +# endif +#else + ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); +#endif + +#else /* Z_SOLO */ + + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + +#endif /* !Z_SOLO */ + +/* hack for buggy compilers */ +#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) + struct internal_state {int dummy;}; +#endif + +/* undocumented functions */ +ZEXTERN const char * ZEXPORT zError OF((int)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); +ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); +ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); +ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); +ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); +#if defined(_WIN32) && !defined(Z_SOLO) +ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, + const char *mode)); +#endif +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, + const char *format, + va_list va)); +# endif +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/Minecraft.Client/Common/zlib/zutil.c b/Minecraft.Client/Common/zlib/zutil.c new file mode 100644 index 00000000..23d2ebef --- /dev/null +++ b/Minecraft.Client/Common/zlib/zutil.c @@ -0,0 +1,324 @@ +/* zutil.c -- target dependent utility functions for the compression library + * Copyright (C) 1995-2005, 2010, 2011, 2012 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zutil.h" +#ifndef Z_SOLO +# include "gzguts.h" +#endif + +#ifndef NO_DUMMY_DECL +struct internal_state {int dummy;}; /* for buggy compilers */ +#endif + +z_const char * const z_errmsg[10] = { +"need dictionary", /* Z_NEED_DICT 2 */ +"stream end", /* Z_STREAM_END 1 */ +"", /* Z_OK 0 */ +"file error", /* Z_ERRNO (-1) */ +"stream error", /* Z_STREAM_ERROR (-2) */ +"data error", /* Z_DATA_ERROR (-3) */ +"insufficient memory", /* Z_MEM_ERROR (-4) */ +"buffer error", /* Z_BUF_ERROR (-5) */ +"incompatible version",/* Z_VERSION_ERROR (-6) */ +""}; + + +const char * ZEXPORT zlibVersion() +{ + return ZLIB_VERSION; +} + +uLong ZEXPORT zlibCompileFlags() +{ + uLong flags; + + flags = 0; + switch ((int)(sizeof(uInt))) { + case 2: break; + case 4: flags += 1; break; + case 8: flags += 2; break; + default: flags += 3; + } + switch ((int)(sizeof(uLong))) { + case 2: break; + case 4: flags += 1 << 2; break; + case 8: flags += 2 << 2; break; + default: flags += 3 << 2; + } + switch ((int)(sizeof(voidpf))) { + case 2: break; + case 4: flags += 1 << 4; break; + case 8: flags += 2 << 4; break; + default: flags += 3 << 4; + } + switch ((int)(sizeof(z_off_t))) { + case 2: break; + case 4: flags += 1 << 6; break; + case 8: flags += 2 << 6; break; + default: flags += 3 << 6; + } +#ifdef DEBUG + flags += 1 << 8; +#endif +#if defined(ASMV) || defined(ASMINF) + flags += 1 << 9; +#endif +#ifdef ZLIB_WINAPI + flags += 1 << 10; +#endif +#ifdef BUILDFIXED + flags += 1 << 12; +#endif +#ifdef DYNAMIC_CRC_TABLE + flags += 1 << 13; +#endif +#ifdef NO_GZCOMPRESS + flags += 1L << 16; +#endif +#ifdef NO_GZIP + flags += 1L << 17; +#endif +#ifdef PKZIP_BUG_WORKAROUND + flags += 1L << 20; +#endif +#ifdef FASTEST + flags += 1L << 21; +#endif +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifdef NO_vsnprintf + flags += 1L << 25; +# ifdef HAS_vsprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_vsnprintf_void + flags += 1L << 26; +# endif +# endif +#else + flags += 1L << 24; +# ifdef NO_snprintf + flags += 1L << 25; +# ifdef HAS_sprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_snprintf_void + flags += 1L << 26; +# endif +# endif +#endif + return flags; +} + +#ifdef DEBUG + +# ifndef verbose +# define verbose 0 +# endif +int ZLIB_INTERNAL z_verbose = verbose; + +void ZLIB_INTERNAL z_error (m) + char *m; +{ + fprintf(stderr, "%s\n", m); + exit(1); +} +#endif + +/* exported to allow conversion of error code to string for compress() and + * uncompress() + */ +const char * ZEXPORT zError(err) + int err; +{ + return ERR_MSG(err); +} + +#if defined(_WIN32_WCE) + /* The Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. + */ + int errno = 0; +#endif + +#ifndef HAVE_MEMCPY + +void ZLIB_INTERNAL zmemcpy(dest, source, len) + Bytef* dest; + const Bytef* source; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = *source++; /* ??? to be unrolled */ + } while (--len != 0); +} + +int ZLIB_INTERNAL zmemcmp(s1, s2, len) + const Bytef* s1; + const Bytef* s2; + uInt len; +{ + uInt j; + + for (j = 0; j < len; j++) { + if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; + } + return 0; +} + +void ZLIB_INTERNAL zmemzero(dest, len) + Bytef* dest; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = 0; /* ??? to be unrolled */ + } while (--len != 0); +} +#endif + +#ifndef Z_SOLO + +#ifdef SYS16BIT + +#ifdef __TURBOC__ +/* Turbo C in 16-bit mode */ + +# define MY_ZCALLOC + +/* Turbo C malloc() does not allow dynamic allocation of 64K bytes + * and farmalloc(64K) returns a pointer with an offset of 8, so we + * must fix the pointer. Warning: the pointer must be put back to its + * original form in order to free it, use zcfree(). + */ + +#define MAX_PTR 10 +/* 10*64K = 640K */ + +local int next_ptr = 0; + +typedef struct ptr_table_s { + voidpf org_ptr; + voidpf new_ptr; +} ptr_table; + +local ptr_table table[MAX_PTR]; +/* This table is used to remember the original form of pointers + * to large buffers (64K). Such pointers are normalized with a zero offset. + * Since MSDOS is not a preemptive multitasking OS, this table is not + * protected from concurrent access. This hack doesn't work anyway on + * a protected system like OS/2. Use Microsoft C instead. + */ + +voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + voidpf buf = opaque; /* just to make some compilers happy */ + ulg bsize = (ulg)items*size; + + /* If we allocate less than 65520 bytes, we assume that farmalloc + * will return a usable pointer which doesn't have to be normalized. + */ + if (bsize < 65520L) { + buf = farmalloc(bsize); + if (*(ush*)&buf != 0) return buf; + } else { + buf = farmalloc(bsize + 16L); + } + if (buf == NULL || next_ptr >= MAX_PTR) return NULL; + table[next_ptr].org_ptr = buf; + + /* Normalize the pointer to seg:0 */ + *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; + *(ush*)&buf = 0; + table[next_ptr++].new_ptr = buf; + return buf; +} + +void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) +{ + int n; + if (*(ush*)&ptr != 0) { /* object < 64K */ + farfree(ptr); + return; + } + /* Find the original pointer */ + for (n = 0; n < next_ptr; n++) { + if (ptr != table[n].new_ptr) continue; + + farfree(table[n].org_ptr); + while (++n < next_ptr) { + table[n-1] = table[n]; + } + next_ptr--; + return; + } + ptr = opaque; /* just to make some compilers happy */ + Assert(0, "zcfree: ptr not found"); +} + +#endif /* __TURBOC__ */ + + +#ifdef M_I86 +/* Microsoft C in 16-bit mode */ + +# define MY_ZCALLOC + +#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) +# define _halloc halloc +# define _hfree hfree +#endif + +voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + return _halloc((long)items, size); +} + +void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + _hfree(ptr); +} + +#endif /* M_I86 */ + +#endif /* SYS16BIT */ + + +#ifndef MY_ZCALLOC /* Any system without a special alloc function */ + +#ifndef STDC +extern voidp malloc OF((uInt size)); +extern voidp calloc OF((uInt items, uInt size)); +extern void free OF((voidpf ptr)); +#endif + +voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) + voidpf opaque; + unsigned items; + unsigned size; +{ + if (opaque) items += size - size; /* make compiler happy */ + return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : + (voidpf)calloc(items, size); +} + +void ZLIB_INTERNAL zcfree (opaque, ptr) + voidpf opaque; + voidpf ptr; +{ + free(ptr); + if (opaque) return; /* make compiler happy */ +} + +#endif /* MY_ZCALLOC */ + +#endif /* !Z_SOLO */ diff --git a/Minecraft.Client/Common/zlib/zutil.h b/Minecraft.Client/Common/zlib/zutil.h new file mode 100644 index 00000000..24ab06b1 --- /dev/null +++ b/Minecraft.Client/Common/zlib/zutil.h @@ -0,0 +1,253 @@ +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-2013 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef ZUTIL_H +#define ZUTIL_H + +#ifdef HAVE_HIDDEN +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include "zlib.h" + +#if defined(STDC) && !defined(Z_SOLO) +# if !(defined(_WIN32_WCE) && defined(_MSC_VER)) +# include +# endif +# include +# include +#endif + +#ifdef Z_SOLO + typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ +#endif + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + +extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ +/* (size given to avoid silly warnings with Visual C++) */ + +#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] + +#define ERR_RETURN(strm,err) \ + return (strm->msg = ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) +# define OS_CODE 0x00 +# ifndef Z_SOLO +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include +# endif +# else /* MSC or DJGPP */ +# include +# endif +# endif +#endif + +#ifdef AMIGA +# define OS_CODE 0x01 +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 0x02 +# define F_OPEN(name, mode) \ + fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 0x05 +#endif + +#ifdef OS2 +# define OS_CODE 0x06 +# if defined(M_I86) && !defined(Z_SOLO) +# include +# endif +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 0x07 +# ifndef Z_SOLO +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif +# endif +# endif +#endif + +#ifdef TOPS20 +# define OS_CODE 0x0a +#endif + +#ifdef WIN32 +# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ +# define OS_CODE 0x0b +# endif +#endif + +#ifdef __50SERIES /* Prime/PRIMOS */ +# define OS_CODE 0x0f +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX +# if defined(_WIN32_WCE) +# define fdopen(fd,mode) NULL /* No fdopen() */ +# ifndef _PTRDIFF_T_DEFINED + typedef int ptrdiff_t; +# define _PTRDIFF_T_DEFINED +# endif +# else +# define fdopen(fd,type) _fdopen(fd,type) +# endif +#endif + +#if defined(__BORLANDC__) && !defined(MSDOS) + #pragma warn -8004 + #pragma warn -8008 + #pragma warn -8066 +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_WIN32) && \ + (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +#endif + + /* common defaults */ + +#ifndef OS_CODE +# define OS_CODE 0x03 /* assume Unix */ +#endif + +#ifndef F_OPEN +# define F_OPEN(name, mode) fopen((name), (mode)) +#endif + + /* functions */ + +#if defined(pyr) || defined(Z_SOLO) +# define NO_MEMCPY +#endif +#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + * The __SC__ check is for Symantec. + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy memcpy +# define zmemcmp memcmp +# define zmemzero(dest, len) memset(dest, 0, len) +# endif +#else + void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); +#endif + +/* Diagnostic functions */ +#ifdef DEBUG +# include + extern int ZLIB_INTERNAL z_verbose; + extern void ZLIB_INTERNAL z_error OF((char *m)); +# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Trace(x) {if (z_verbose>=0) fprintf x ;} +# define Tracev(x) {if (z_verbose>0) fprintf x ;} +# define Tracevv(x) {if (z_verbose>1) fprintf x ;} +# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} +# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + +#ifndef Z_SOLO + voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, + unsigned size)); + void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); +#endif + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + +/* Reverse the bytes in a 32-bit value */ +#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + +#endif /* ZUTIL_H */ -- cgit v1.2.3